{"owner":"danny-avila","repo":"LibreChat","hasSkills":true,"totalSkillsCount":51,"totalTokensCount":21184,"categories":["plugin-manifest","root-instruction","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["packages/data-schemas/README.md","AGENTS.md","packages/data-schemas/tsconfig.build.json","packages/data-schemas/package.json","packages/data-schemas/tsconfig.json","packages/data-provider/package.json","packages/data-provider/tsconfig.spec.json","packages/client/tsconfig.json","packages/client/package.json","packages/data-provider/tsconfig.json","packages/data-schemas/tsconfig.spec.json","packages/client/tsconfig.test.json","packages/api/package.json","packages/api/tsconfig.build.json","packages/api/tsconfig.json","packages/api/tsconfig.spec.json","packages/data-provider/react-query/package.json","packages/data-provider/react-query/package-lock.json","api/app/clients/tools/manifest.json","packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md","packages/data-schemas/misc/ferretdb/tsconfig.json","packages/client/src/theme/README.md","packages/client/src/locales/hu/translation.json","packages/client/src/locales/he/translation.json","packages/client/src/locales/fr/translation.json","packages/client/src/locales/fi/translation.json","packages/client/src/locales/fa/translation.json","packages/client/src/locales/et/translation.json","packages/client/src/locales/es/translation.json","packages/client/src/locales/en/translation.json","packages/client/src/locales/de/translation.json","packages/client/src/locales/da/translation.json","packages/client/src/locales/cs/translation.json","packages/client/src/locales/ca/translation.json","packages/client/src/locales/ar/translation.json","packages/client/src/locales/id/translation.json","packages/client/src/locales/it/translation.json","packages/client/src/locales/ja/translation.json","packages/client/src/locales/ka/translation.json","packages/client/src/locales/ko/translation.json","packages/client/src/locales/nl/translation.json","packages/client/src/locales/pl/translation.json","packages/client/src/locales/pt-BR/translation.json","packages/client/src/locales/pt-PT/translation.json","packages/client/src/locales/ru/translation.json","packages/client/src/locales/sv/translation.json","packages/client/src/locales/th/translation.json","packages/client/src/locales/tr/translation.json","packages/client/src/locales/vi/translation.json","packages/client/src/locales/zh-Hans/translation.json","packages/client/src/locales/zh-Hant/translation.json"],"skills":{"packages/data-schemas/README.md":"# LibreChat Data Schemas Package\n\nThis package provides the database schemas, models, types, and methods for LibreChat using Mongoose ODM.\n\n## 📁 Package Structure\n\n```\npackages/data-schemas/\n├── src/\n│   ├── schema/         # Mongoose schema definitions\n│   ├── models/         # Model factory functions\n│   ├── types/          # TypeScript type definitions\n│   ├── methods/        # Database operation methods\n│   ├── common/         # Shared constants and enums\n│   ├── config/         # Configuration files (winston, etc.)\n│   └── index.ts        # Main package exports\n```\n\n## 🏗️ Architecture Patterns\n\n### 1. Schema Files (`src/schema/`)\n\nSchema files define the Mongoose schema structure. They follow these conventions:\n\n- **Naming**: Use lowercase filenames (e.g., `user.ts`, `accessRole.ts`)\n- **Imports**: Import types from `~/types` for TypeScript support\n- **Exports**: Export only the schema as default\n\n**Example:**\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IUser } from '~/types';\n\nconst userSchema = new Schema<IUser>(\n  {\n    name: { type: String },\n    email: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default userSchema;\n```\n\n### 2. Type Definitions (`src/types/`)\n\nType files define TypeScript interfaces and types. They follow these conventions:\n\n- **Base Type**: Define a plain type without Mongoose Document properties\n- **Document Interface**: Extend the base type with Document and `_id`\n- **Enums/Constants**: Place related enums in the type file or `common/` if shared\n\n**Example:**\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type User = {\n  name?: string;\n  email: string;\n  // ... other fields\n};\n\nexport type IUser = User &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### 3. Model Factory Functions (`src/models/`)\n\nModel files create Mongoose models using factory functions. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Model`\n- **Singleton Pattern**: Check if model exists before creating\n- **Type Safety**: Use the corresponding interface from types\n\n**Example:**\n```typescript\nimport userSchema from '~/schema/user';\nimport type * as t from '~/types';\n\nexport function createUserModel(mongoose: typeof import('mongoose')) {\n  return mongoose.models.User || mongoose.model<t.IUser>('User', userSchema);\n}\n```\n\n### 4. Database Methods (`src/methods/`)\n\nMethod files contain database operations for each entity. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Methods`\n- **Return Type**: Export a type for the methods object\n- **Operations**: Include CRUD operations and entity-specific queries\n\n**Example:**\n```typescript\nimport type { Model } from 'mongoose';\nimport type { IUser } from '~/types';\n\nexport function createUserMethods(mongoose: typeof import('mongoose')) {\n  async function findUserById(userId: string): Promise<IUser | null> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.findById(userId).lean();\n  }\n\n  async function createUser(userData: Partial<IUser>): Promise<IUser> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.create(userData);\n  }\n\n  return {\n    findUserById,\n    createUser,\n    // ... other methods\n  };\n}\n\nexport type UserMethods = ReturnType<typeof createUserMethods>;\n```\n\n### 5. Main Exports (`src/index.ts`)\n\nThe main index file exports:\n- `createModels()` - Factory function for all models\n- `createMethods()` - Factory function for all methods\n- Type exports from `~/types`\n- Shared utilities and constants\n\n## 🚀 Adding a New Entity\n\nTo add a new entity to the data-schemas package, follow these steps:\n\n### Step 1: Create the Type Definition\n\nCreate `src/types/[entityName].ts`:\n\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type EntityName = {\n  /** Field description */\n  fieldName: string;\n  // ... other fields\n};\n\nexport type IEntityName = EntityName &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### Step 2: Update Types Index\n\nAdd to `src/types/index.ts`:\n\n```typescript\nexport * from './entityName';\n```\n\n### Step 3: Create the Schema\n\nCreate `src/schema/[entityName].ts`:\n\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nconst entityNameSchema = new Schema<IEntityName>(\n  {\n    fieldName: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default entityNameSchema;\n```\n\n### Step 4: Create the Model Factory\n\nCreate `src/models/[entityName].ts`:\n\n```typescript\nimport entityNameSchema from '~/schema/entityName';\nimport type * as t from '~/types';\n\nexport function createEntityNameModel(mongoose: typeof import('mongoose')) {\n  return (\n    mongoose.models.EntityName || \n    mongoose.model<t.IEntityName>('EntityName', entityNameSchema)\n  );\n}\n```\n\n### Step 5: Update Models Index\n\nAdd to `src/models/index.ts`:\n\n1. Import the factory function:\n```typescript\nimport { createEntityNameModel } from './entityName';\n```\n\n2. Add to the return object in `createModels()`:\n```typescript\nEntityName: createEntityNameModel(mongoose),\n```\n\n### Step 6: Create Database Methods\n\nCreate `src/methods/[entityName].ts`:\n\n```typescript\nimport type { Model, Types } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nexport function createEntityNameMethods(mongoose: typeof import('mongoose')) {\n  async function findEntityById(id: string | Types.ObjectId): Promise<IEntityName | null> {\n    const EntityName = mongoose.models.EntityName as Model<IEntityName>;\n    return await EntityName.findById(id).lean();\n  }\n\n  // ... other methods\n\n  return {\n    findEntityById,\n    // ... other methods\n  };\n}\n\nexport type EntityNameMethods = ReturnType<typeof createEntityNameMethods>;\n```\n\n### Step 7: Update Methods Index\n\nAdd to `src/methods/index.ts`:\n\n1. Import the methods:\n```typescript\nimport { createEntityNameMethods, type EntityNameMethods } from './entityName';\n```\n\n2. Add to the return object in `createMethods()`:\n```typescript\n...createEntityNameMethods(mongoose),\n```\n\n3. Add to the `AllMethods` type:\n```typescript\nexport type AllMethods = UserMethods &\n  // ... other methods\n  EntityNameMethods;\n```\n\n## 📝 Best Practices\n\n1. **Consistent Naming**: Use lowercase for filenames, PascalCase for types/interfaces\n2. **Type Safety**: Always use TypeScript types, avoid `any`\n3. **JSDoc Comments**: Document complex fields and methods\n4. **Indexes**: Define database indexes in schema files for query performance\n5. **Validation**: Use Mongoose schema validation for data integrity\n6. **Lean Queries**: Use `.lean()` for read operations when you don't need Mongoose document methods\n\n## 🔧 Common Patterns\n\n### Enums and Constants\n\nPlace shared enums in `src/common/`:\n\n```typescript\n// src/common/permissions.ts\nexport enum PermissionBits {\n  VIEW = 1,\n  EDIT = 2,\n  DELETE = 4,\n  SHARE = 8,\n}\n```\n\n### Compound Indexes\n\nFor complex queries, add compound indexes:\n\n```typescript\nschema.index({ field1: 1, field2: 1 });\nschema.index(\n  { uniqueField: 1 },\n  { \n    unique: true, \n    partialFilterExpression: { uniqueField: { $exists: true } }\n  }\n);\n```\n\n### Virtual Properties\n\nAdd computed properties using virtuals:\n\n```typescript\nschema.virtual('fullName').get(function() {\n  return `${this.firstName} ${this.lastName}`;\n});\n```\n\n## 🧪 Testing\n\nWhen adding new entities, ensure:\n- Types compile without errors\n- Models can be created successfully\n- Methods handle edge cases (null checks, validation)\n- Indexes are properly defined for query patterns\n\n## 📚 Resources\n\n- [Mongoose Documentation](https://mongoosejs.com/docs/)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [MongoDB Indexes](https://docs.mongodb.com/manual/indexes/) ","AGENTS.md":"# LibreChat contributor and agent guidance\n\n`AGENTS.md` is the repository's contributor guidance. Backend code lives in `packages/api`\n(TypeScript) and `packages/data-schemas` (database methods); `api` is legacy Express wiring.\nShared API types and services live in `packages/data-provider`, and the React app lives in\n`client` with shared primitives in `packages/client`. Chat state, transport and message components\nare moving into `packages/chat` (`@librechat/chat`), which never imports the app.\n\n## Branching and pull requests\n\nNormally branch off `dev` and target `dev`; `gh pr create` defaults to `main`, so pass `--base dev`\nexplicitly. `main` is the released branch, kept as a fast-forward of `dev` and synced as-is — never\nopen a backport pull request to `main`, because anything merged to `dev` reaches it at the next\nsync. Pull requests opened against `main` are retargeted automatically.\n\n**Maintainer-directed canary exception:** Experimental work, or a PR ready to merge after review but\nnot yet suitable for the next `main` sync, may instead target `canary`. The maintainer may choose\nthis before work starts or while reviewing a stale PR. For new canary work, branch from the current\n`origin/canary` and pass `--base canary` explicitly; do not silently retarget an existing PR or\npromote canary code to `dev`. If a stale PR is redirected to canary, first check its base, diff and\nreviewed head against current canary; coordinate any rebase or new PR with the maintainer. A PR\nexplicitly based on `canary` stays there; the main-to-dev retarget workflow does not move it.\n\nStill link related issues in the PR (for example, `Related to #N`) so the work remains\ntraceable. `Fixes #N` does not close an issue on a `dev` or `canary` merge — GitHub honors closing\nkeywords only on the default branch. Close resolved issues by hand after merging. Worktrees share\none stash stack, so never use a bare `git stash pop`. Prefer a WIP commit; if a stash is necessary,\napply the specific tagged entry. The `target: main` label and release-bound upstream branches are\nexempt from the main-to-dev retarget workflow; do not use either to backport ordinary work.\n\nWrite the description for a reader who has not followed the branch: what breaks, what triggers it,\nhow it behaves after the change, then one or two views of the mechanism — a focused diff, a call\ntree, a shallow file tree, or a Mermaid sequence. Keep only what the change carries, and describe\nthe code as it stands rather than narrating earlier commits or review rounds. Naming the merged\npull request that caused the bug is not the same thing; that is history the reader needs. The\nformats and examples live in `.github/pull_request_template.md`.\n\n## Review and completion\n\nRead the inline review threads themselves — a summary comment or notification list omits findings.\nAudit each one against the current code, fix what is valid, and reject what is obsolete in a reply\nthat says why. After each round: focused tests, `npx tsc --noEmit` in every workspace you changed,\npush, then request the next review naming the pull request's exact remote head — a clean review of\nan earlier head says nothing about what you just pushed, and CI runs on its own clock. Reply on\neach resolved thread with the resolving commit and evidence. After two actionable rounds, stop\npatching thread by thread and read the subsystem by invariant instead: identity, authorization,\npersistence, retry, cancellation, cleanup and mixed-version behavior where relevant. Which reviewer\nand what phrase triggers it will change; that the review must cover the exact pushed head will not.\n\nA clean review is one completion signal, not the definition of done. Ship the observable experience\n— loading, empty, success, failure, cancellation, retry, restored session — with strings localized,\naccessibility intact, defaults and stored data preserved, and no backend capability left without a\nfrontend entry point. Keep fixes small and test the missed behavior. Report the pushed head, what you\nran locally, CI state, the review result at that head, any finding you rejected with the reasoning,\nand checks you could not run.\n\n## Verification\n\nFor startup, auth, config, file, or message-loading changes, avoid serial database\nreads and reuse loaded request data. Run `npm run lighthouse` before completion:\nthe CI lane adds 250 ms per Mongo query and checks the visible conversation's LCP.\nSee [budgets, reproduction and failure diagnosis](e2e/lighthouse/README.md).\n\nA green build is not a typecheck: `packages/api`, `packages/client`, `packages/chat` and `packages/data-schemas` build\nwith `tsdown`, which emits without checking types. Run `npx tsc --noEmit` in the workspace you\nchanged. `packages/client` excludes `*.spec.ts(x)` and `*.test.ts(x)` from typechecking entirely.\n`npm run sort-imports` with no arguments rewrites every source root — pass the paths you touched.\nRun `npm run static-checks -- --against origin/dev` to reproduce the PR's static checks; use\n`npm run static-checks:full` for the slower gates. Fix all formatting, lint, and TypeScript\nwarnings/errors in the code you change.\n\n## Module boundaries and configuration\n\nAll new backend behavior belongs in TypeScript under `packages/api`; database-specific shared logic\nbelongs in `packages/data-schemas`, and frontend/backend shared API logic belongs in\n`packages/data-provider`. Build data-provider from the project root with `npm run build:data-provider`.\n\n`/api` holds wiring, not behavior. When a change would add logic to a CJS file there — a branch, a\nhelper, a validation step, a service call — the logic belongs in `packages/api`, and the JS file\nkeeps requires, route registration and the call into the TS module (`MCPRequestContext.js` is the\nshape, thirteen lines of re-export). \"Minimum\" means how much behavior `/api` gains, not how small\nthe diff is, and the rule applies to editing existing CJS, which is the common case.\n\nDatabase contracts belong to `packages/data-schemas`. Keep Mongoose types (`FilterQuery`,\n`Types.ObjectId`, `Document`) out of exported signatures in `packages/api`, `packages/data-provider`\nand `client`, because they make the storage engine part of that module's public API. Take and return\nplain typed objects and express the query behind a data-schemas method. The boundary already leaks\nacross `packages/api`, so stop widening it rather than rewriting what exists; the client carries none\nof it and must stay that way.\n\nNew levers ship configurable: a limit, timeout, toggle or capability introduced in code earns a field\non `configSchema` (`packages/data-provider/src/config.ts`) so it can be set in `librechat.yaml`, with\na default that reproduces today's behavior. Hard-coded constants and env-only switches need a reason.\nModules take their dependencies rather than reaching for them: code in `packages/api` receives its\nconfig, database methods and clients from the caller, the way `createModels(mongoose)` receives the\napp's connection, instead of importing app singletons or reading global state. Integrations (provider\nSDKs, storage backends, vector stores, OAuth servers) arrive through an interface the caller\nsupplies, so a second implementation is a new argument instead of a new branch. The static singletons\nunder `packages/api/src/mcp` are the shape to stop extending, not a pattern to copy. This is the\nbackend half of client state ownership: pass it in, do not reach for it.\n\n## Service failures and user-facing errors\n\nThis section applies to backend services (`packages/api`) and database methods/repositories\n(`packages/data-schemas`), not to React components. For new or substantially changed code in\nthose layers, choose failure behavior at the contract boundary instead of treating every\nunsuccessful outcome as an exception:\n\n- Return a plain value on success. Use `null` only for a documented absence (for example, a\n  successful lookup with no record), never to hide a query failure.\n- For an expected failure the caller can handle without aborting the operation, prefer a typed\n  discriminated result such as `{ ok: true; value: T } | { ok: false; error: { code: string;\nmessage?: string } }`. Keep an existing domain-specific result shape when changing it would\n  break callers; do not introduce interchangeable `ok`, `valid`, and bare `{ message }` contracts\n  in the same service. Codes should be stable, machine-readable identifiers when the caller\n  needs to distinguish failures. Internal validation helpers may use the existing local pattern.\n- Throw for unexpected operational failures (database, provider, network) and violated invariants.\n  Use a typed/coded error when a boundary must recognize a particular failure. Catch where you can\n  recover or translate it; otherwise let it reach the owning request or job boundary. Do not catch\n  an exception and return a truthy record, `null`, or `{ message }` in its place: callers can then\n  mistake an outage for data or send it as an HTTP 200. Keep separate migrations for existing\n  contracts, with their callers and tests, rather than changing wire shapes incidentally.\n- At the HTTP, stream, or job boundary, map failures to the existing status and response contract.\n  Only expose intentionally approved codes and helpful user-safe information. Error disclosure is\n  a security boundary: never forward raw exceptions, stacks, query text, credentials, request\n  bodies, headers, provider payloads, or arbitrary `error.message` to a client or persisted\n  user-visible status. Sanitize diagnostics and log only what the path can safely retain. For\n  errors that may echo submitted content, prefer `getSafeErrorMetadata` over error text;\n  `packages/api/src/utils/errors.ts` documents when redacted error text is appropriate.\n- Localization is a UI responsibility, not a database-method return shape. When a failure reaches\n  a user-facing surface, expose a safe, stable code the UI can map to localized, actionable copy\n  and a fallback. See `client/src/components/Messages/Content/Error/registry.ts` and\n  `client/src/components/Chat/Trace/Viewer.tsx`. Keep any intentionally disclosed provider detail\n  behind its existing protection policy rather than treating arbitrary upstream text as safe.\n\nExamples of local contracts, not a mandate to copy their shapes: `packages/api/src/admin/auditLog.ts`\nuses a parsing result, `packages/api/src/agents/openai/service.ts` validates before mapping to an\nOpenAI-compatible response, and `packages/api/src/skills/sync/errors.ts` names a sync failure by\nstable code. `packages/data-schemas/src/methods/prompt.ts` currently returns `{ message }` on query\nfailure; do not extend that pattern. Test absence versus failure, the boundary's non-success response,\nand that sensitive diagnostics cannot reach a user-visible surface.\n\n## Frontend theming and styling\n\nFor frontend work, compose existing `@librechat/client` primitives and variants before adding\nfeature-local styles. Use semantic theme/Tailwind roles for color and shared appearance; do not\nintroduce raw palette utilities, hard-coded colors, or arbitrary theme CSS. If the system cannot\nexpress a reusable design need, deepen the shared primitive or versioned theme-token registry\ninstead of copying classes into a feature. Theme definitions select semantic colors and appearance,\nnot selectors, app behavior, or alternate layouts. Keep genuine layout and behavior local, and\nexplain why any new custom CSS cannot use shared primitives. Support light/dark and reduced motion;\npreserve defaults and test a deliberately different reference theme for reusable new variants.\n\n## Backend auth cache\n\nWhen adding or changing code that mutates user documents, invalidate the auth user document cache\nfor affected users, including bulk role and user mutations. Otherwise burst-cached JWT requests can\nserve a stale `req.user` until the cache expires.\n\n## Client state ownership\n\nThe client is migrating from Recoil to Jotai. New state is always Jotai, even in a file that already\nimports Recoil; many files import both, so mixed imports say nothing about which to use. For existing\nstate the unit of conversion is one atom plus every file that reads or writes it, because an atom\ncannot be half converted — convert the areas you touch, not the whole store.\nSplit by ownership: state a feature both writes and reads is feature-owned, so convert it to Jotai\nand keep it inside the feature; app-global preferences and shell state a feature merely consumes\n(`maximizeChatSpace`, `showScrollButton`, `enterToSend`, artifact visibility) must be passed in\nthrough props or a small host-supplied context rather than reached for through `~/store`; when a\nconsumer sits outside the feature you are changing, leave that atom on Recoil and pass it in. Passing\nthem in is what lets a feature move to its own workspace later without a rewrite, and it keeps the\nJotai conversion scoped to the state a feature owns. For persisted atoms, use the helpers in\n`client/src/store/jotai-utils.ts`.\n\n## Code style and performance\n\nUse short, single-word file names when possible; group related modules in a single-word directory.\nPrefer flat early returns, pure functions, and explicit types. Avoid `any`, broad `unknown`/casts,\nduplicated types, and dynamic imports. Extract genuinely repeated logic instead of copying it;\nwrite comments only for non-obvious behavior or public API contracts.\n\nImports have three sections: package values (shortest line first, with `react` first), `import type`\n(longest line first, package types before local types), and local/project values (longest line first).\nUse standalone `import type { ... }`, not inline `type` within a value import. Run the scoped\nimport sorter on files you change.\n\nAvoid extra passes over shared message arrays and unnecessary allocations. For startup and\nrequest paths, reuse already-loaded user/config data, avoid serial database reads, and start\nindependent reads in parallel. Do not weaken authorization or tenant checks or write a response\nbefore those checks succeed.\n\n## Frontend rules\n\nUse the chat Share/Export action-menu pattern: `DropdownPopup` from `@librechat/client` with\n`Ariakit.MenuButton` (see `HeaderMenu.tsx` and `useExportShare.tsx`). Never introduce or reintroduce\nthe Radix `DropdownMenu` family for app action or sort menus. Preserve the Share/Export\ndialog-item contract (`hideOnClick: false`, item ref, button render, and dialog `triggerRef`)\nwhen a menu action opens a dialog.\n\nUse `useLocalize()` for all visible copy and update only English keys in\n`client/src/locales/en/translation.json`. Use semantic HTML, keyboard behavior, and ARIA labels.\nUse React Query for API interactions and invalidate related queries after mutations; define query\nand mutation keys in `packages/data-provider/src/keys.ts`. Put shared endpoint definitions, types,\nand data services in `packages/data-provider`, and encode dynamic URL parameters. Cover loading,\nsuccess, and failure states in focused component tests.\n\n## Testing\n\nRun focused Jest tests from the owning workspace, not the entire monorepo. Prefer real logic and\nspies over mocked internals; use `mongodb-memory-server` for database queries and the real MCP SDK\nfor MCP behavior. Mock only external HTTP APIs or uncontrollable services. For frontend tests use\nthe component's colocated `__tests__` and `test/layout-test-utils` where applicable.\n","packages/data-schemas/tsconfig.build.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": false,\n    \"declaration\": true,\n    \"declarationDir\": \"dist/types\",\n    \"outDir\": \"dist\"\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"**/*.spec.ts\"]\n}\n","packages/data-schemas/package.json":"{\n  \"name\": \"@librechat/data-schemas\",\n  \"version\": \"0.0.75\",\n  \"description\": \"Mongoose schemas and models for LibreChat\",\n  \"type\": \"module\",\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./capabilities\": {\n      \"import\": {\n        \"types\": \"./dist/capabilities.d.mts\",\n        \"default\": \"./dist/admin/capabilities.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/capabilities.d.cts\",\n        \"default\": \"./dist/admin/capabilities.cjs\"\n      }\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"mdast-util-directive\": \"^3.0.0\",\n    \"mdast-util-from-markdown\": \"^2.0.1\",\n    \"mdast-util-gfm\": \"^3.0.0\",\n    \"mdast-util-math\": \"^3.0.0\",\n    \"micromark-extension-directive\": \"^3.0.1\",\n    \"micromark-extension-gfm\": \"^3.0.0\",\n    \"micromark-extension-llm-math\": \"^3.1.0\",\n    \"micromark-util-decode-string\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/node\": \"^24.12.4\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"mongodb-memory-server\": \"^11.3.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"peerDependencies\": {\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"klona\": \"^2.0.6\",\n    \"librechat-data-provider\": \"*\",\n    \"lodash\": \"^4.17.23\",\n    \"meilisearch\": \"^0.38.0\",\n    \"mongoose\": \"^8.24.1\",\n    \"nanoid\": \"^3.3.18\",\n    \"winston\": \"^3.17.0\",\n    \"winston-daily-rotate-file\": \"^5.0.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"mongoose\",\n    \"schema\",\n    \"typescript\",\n    \"librechat\"\n  ]\n}\n","packages/data-schemas/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2019\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"declaration\": true,\n    \"isolatedDeclarations\": true,\n    \"noEmit\": true,\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\", \"jest\"],\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/data-provider/package.json":"{\n  \"name\": \"librechat-data-provider\",\n  \"version\": \"0.8.528\",\n  \"description\": \"data services for librechat apps\",\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/types/index.d.ts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\",\n      \"types\": \"./dist/types/index.d.ts\"\n    },\n    \"./react-query\": {\n      \"import\": \"./dist/react-query/index.mjs\",\n      \"require\": \"./dist/react-query/index.js\",\n      \"types\": \"./dist/types/react-query/index.d.ts\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown && tsc -p tsconfig.build.json\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci --logHeapUsage\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown && bun run tsc -p tsconfig.build.json\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"axios\": \"^1.20.0\",\n    \"croner\": \"^10.0.1\",\n    \"dayjs\": \"^1.11.13\",\n    \"js-yaml\": \"^4.3.2\",\n    \"re2js\": \"^2.8.6\",\n    \"zod\": \"^3.22.4\"\n  },\n  \"devDependencies\": {\n    \"@babel/preset-env\": \"^7.21.5\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@rollup/plugin-replace\": \"^5.0.5\",\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/node\": \"^24.12.4\",\n    \"@types/react\": \"^18.2.18\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"openapi-types\": \"^12.1.3\",\n    \"rimraf\": \"^6.1.3\",\n    \"rollup\": \"^4.34.9\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\",\n    \"winston\": \"^3.17.0\"\n  },\n  \"peerDependencies\": {\n    \"@tanstack/react-query\": \"^4.28.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\"\n  }\n}\n","packages/data-provider/tsconfig.spec.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/client/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"react\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"isolatedDeclarations\": true,\n    \"sourceMap\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    },\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"resolveJsonModule\": true,\n    \"types\": [\"node\", \"vite/client\"],\n    \"noUncheckedSideEffectImports\": false\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\n    \"dist\",\n    \"node_modules\",\n    \"**/*.test.ts\",\n    \"**/*.test.tsx\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.tsx\"\n  ]\n}\n","packages/client/package.json":"{\n  \"name\": \"@librechat/client\",\n  \"version\": \"0.4.83\",\n  \"description\": \"React components for LibreChat\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./tailwind-preset\": \"./tailwind.preset.cjs\",\n    \"./theme.css\": \"./dist/tokens.css\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./fonts/*\": \"./dist/fonts/*\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"tailwind.preset.cjs\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:dev\": \"npm run clean && NODE_ENV=development tsdown\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"dev\": \"tsdown --watch\",\n    \"test\": \"jest\",\n    \"test:ci\": \"jest --ci\"\n  },\n  \"peerDependencies\": {\n    \"@ariakit/react\": \"^0.4.29\",\n    \"@ariakit/react-components\": \"^0.1.2\",\n    \"@dicebear/collection\": \"^9.4.3\",\n    \"@dicebear/core\": \"^9.4.3\",\n    \"@headlessui/react\": \"^2.1.2\",\n    \"@radix-ui/react-accordion\": \"^1.2.20\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-checkbox\": \"^1.3.11\",\n    \"@radix-ui/react-collapsible\": \"^1.1.20\",\n    \"@radix-ui/react-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-direction\": \"^1.1.4\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.24\",\n    \"@radix-ui/react-hover-card\": \"^1.1.23\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@radix-ui/react-label\": \"^2.1.7\",\n    \"@radix-ui/react-popover\": \"^1.1.23\",\n    \"@radix-ui/react-progress\": \"^1.1.2\",\n    \"@radix-ui/react-radio-group\": \"^1.3.7\",\n    \"@radix-ui/react-select\": \"^2.3.7\",\n    \"@radix-ui/react-separator\": \"^1.1.7\",\n    \"@radix-ui/react-slider\": \"^1.3.5\",\n    \"@radix-ui/react-slot\": \"^1.0.0\",\n    \"@radix-ui/react-switch\": \"^1.2.5\",\n    \"@radix-ui/react-tabs\": \"^1.1.21\",\n    \"@radix-ui/react-toast\": \"^1.2.23\",\n    \"@rc-component/mini-decimal\": \"^1.0.1\",\n    \"@react-spring/web\": \"^10.0.1\",\n    \"@tanstack/react-query\": \"^4.28.0 || ^5.0.0\",\n    \"@tanstack/react-table\": \"^8.11.7\",\n    \"@tanstack/react-virtual\": \"^3.0.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"dompurify\": \"^3.4.17\",\n    \"framer-motion\": \"^12.40.0\",\n    \"i18next\": \"^24.2.2 || ^25.3.2\",\n    \"i18next-browser-languagedetector\": \"^8.2.0\",\n    \"input-otp\": \"^1.4.2\",\n    \"jotai\": \"^2.12.5\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.525.0 || ^0.528.0\",\n    \"lucide-react\": \"^0.525.0 || ^0.528.0\",\n    \"match-sorter\": \"^8.1.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"rc-input-number\": \"^7.4.2\",\n    \"react\": \"^18.2.0 || ^19.1.0\",\n    \"react-dom\": \"^18.2.0 || ^19.1.0\",\n    \"react-hook-form\": \"^7.56.4\",\n    \"react-i18next\": \"^15.4.0 || ^15.6.0\",\n    \"react-resizable-panels\": \"^4.7.4\",\n    \"react-textarea-autosize\": \"^8.4.0\",\n    \"tailwind-merge\": \"^3.7.0\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@babel/preset-env\": \"^7.29.5\",\n    \"@babel/preset-react\": \"^7.28.5\",\n    \"@babel/preset-typescript\": \"^7.28.5\",\n    \"@tanstack/react-query\": \"^4.28.0\",\n    \"@tanstack/react-table\": \"^8.21.3\",\n    \"@tanstack/react-virtual\": \"3.13.23\",\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@tsdown/css\": \"^0.22.2\",\n    \"@types/jest\": \"^29.5.14\",\n    \"@types/react\": \"^18.2.11\",\n    \"@types/react-dom\": \"^18.2.4\",\n    \"babel-jest\": \"^30.2.0\",\n    \"caniuse-lite\": \"^1.0.30001741\",\n    \"i18next\": \"^24.2.3\",\n    \"identity-obj-proxy\": \"^3.0.0\",\n    \"jest\": \"^30.2.0\",\n    \"jest-environment-jsdom\": \"^30.2.0\",\n    \"jotai\": \"^2.12.5\",\n    \"js-yaml\": \"^4.3.2\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.528.0\",\n    \"lucide-react\": \"^0.528.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-i18next\": \"^15.4.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n","packages/data-provider/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"module\": \"esnext\",\n    \"noImplicitAny\": true,\n    \"outDir\": \"./types\",\n    \"target\": \"es5\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\"es2017\", \"dom\", \"ES2021.String\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"sourceMap\": true,\n    \"paths\": {\n      \"librechat-data-provider/react-query\": [\"./src/react-query/index.ts\"],\n      \"src/*\": [\"./src/*\"]\n    }\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"types\"],\n  \"include\": [\"src/**/*\", \"types/index.d.ts\", \"types/react-query/index.d.ts\"]\n}\n","packages/data-schemas/tsconfig.spec.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/client/tsconfig.test.json":"# Client Skill\n\nPath: `packages/client/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/tsconfig.test.json)","packages/api/package.json":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/package.json)","packages/api/tsconfig.build.json":"# Api Skill\n\nPath: `packages/api/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.build.json)","packages/api/tsconfig.json":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.json)","packages/api/tsconfig.spec.json":"# Api Skill\n\nPath: `packages/api/tsconfig.spec.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.spec.json)","packages/data-provider/react-query/package.json":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package.json)","packages/data-provider/react-query/package-lock.json":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package-lock.json)","api/app/clients/tools/manifest.json":"# Tools Skill\n\nPath: `api/app/clients/tools/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/api/app/clients/tools/manifest.json)","packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md)","packages/data-schemas/misc/ferretdb/tsconfig.json":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/tsconfig.json)","packages/client/src/theme/README.md":"# theme Documentation\n\nPath: `packages/client/src/theme/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/theme/README.md)","packages/client/src/locales/hu/translation.json":"# Hu Skill\n\nPath: `packages/client/src/locales/hu/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/hu/translation.json)","packages/client/src/locales/he/translation.json":"# He Skill\n\nPath: `packages/client/src/locales/he/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/he/translation.json)","packages/client/src/locales/fr/translation.json":"# Fr Skill\n\nPath: `packages/client/src/locales/fr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fr/translation.json)","packages/client/src/locales/fi/translation.json":"# Fi Skill\n\nPath: `packages/client/src/locales/fi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fi/translation.json)","packages/client/src/locales/fa/translation.json":"# Fa Skill\n\nPath: `packages/client/src/locales/fa/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fa/translation.json)","packages/client/src/locales/et/translation.json":"# Et Skill\n\nPath: `packages/client/src/locales/et/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/et/translation.json)","packages/client/src/locales/es/translation.json":"# Es Skill\n\nPath: `packages/client/src/locales/es/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/es/translation.json)","packages/client/src/locales/en/translation.json":"# En Skill\n\nPath: `packages/client/src/locales/en/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/en/translation.json)","packages/client/src/locales/de/translation.json":"# De Skill\n\nPath: `packages/client/src/locales/de/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/de/translation.json)","packages/client/src/locales/da/translation.json":"# Da Skill\n\nPath: `packages/client/src/locales/da/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/da/translation.json)","packages/client/src/locales/cs/translation.json":"# Cs Skill\n\nPath: `packages/client/src/locales/cs/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/cs/translation.json)","packages/client/src/locales/ca/translation.json":"# Ca Skill\n\nPath: `packages/client/src/locales/ca/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ca/translation.json)","packages/client/src/locales/ar/translation.json":"# Ar Skill\n\nPath: `packages/client/src/locales/ar/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ar/translation.json)","packages/client/src/locales/id/translation.json":"# Id Skill\n\nPath: `packages/client/src/locales/id/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/id/translation.json)","packages/client/src/locales/it/translation.json":"# It Skill\n\nPath: `packages/client/src/locales/it/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/it/translation.json)","packages/client/src/locales/ja/translation.json":"# Ja Skill\n\nPath: `packages/client/src/locales/ja/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ja/translation.json)","packages/client/src/locales/ka/translation.json":"# Ka Skill\n\nPath: `packages/client/src/locales/ka/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ka/translation.json)","packages/client/src/locales/ko/translation.json":"# Ko Skill\n\nPath: `packages/client/src/locales/ko/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ko/translation.json)","packages/client/src/locales/nl/translation.json":"# Nl Skill\n\nPath: `packages/client/src/locales/nl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/nl/translation.json)","packages/client/src/locales/pl/translation.json":"# Pl Skill\n\nPath: `packages/client/src/locales/pl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pl/translation.json)","packages/client/src/locales/pt-BR/translation.json":"# Pt-BR Skill\n\nPath: `packages/client/src/locales/pt-BR/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-BR/translation.json)","packages/client/src/locales/pt-PT/translation.json":"# Pt-PT Skill\n\nPath: `packages/client/src/locales/pt-PT/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-PT/translation.json)","packages/client/src/locales/ru/translation.json":"# Ru Skill\n\nPath: `packages/client/src/locales/ru/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ru/translation.json)","packages/client/src/locales/sv/translation.json":"# Sv Skill\n\nPath: `packages/client/src/locales/sv/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/sv/translation.json)","packages/client/src/locales/th/translation.json":"# Th Skill\n\nPath: `packages/client/src/locales/th/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/th/translation.json)","packages/client/src/locales/tr/translation.json":"# Tr Skill\n\nPath: `packages/client/src/locales/tr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/tr/translation.json)","packages/client/src/locales/vi/translation.json":"# Vi Skill\n\nPath: `packages/client/src/locales/vi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/vi/translation.json)","packages/client/src/locales/zh-Hans/translation.json":"# Zh-Hans Skill\n\nPath: `packages/client/src/locales/zh-Hans/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hans/translation.json)","packages/client/src/locales/zh-Hant/translation.json":"# Zh-Hant Skill\n\nPath: `packages/client/src/locales/zh-Hant/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hant/translation.json)"},"files":{"packages/data-schemas/README.md":"# LibreChat Data Schemas Package\n\nThis package provides the database schemas, models, types, and methods for LibreChat using Mongoose ODM.\n\n## 📁 Package Structure\n\n```\npackages/data-schemas/\n├── src/\n│   ├── schema/         # Mongoose schema definitions\n│   ├── models/         # Model factory functions\n│   ├── types/          # TypeScript type definitions\n│   ├── methods/        # Database operation methods\n│   ├── common/         # Shared constants and enums\n│   ├── config/         # Configuration files (winston, etc.)\n│   └── index.ts        # Main package exports\n```\n\n## 🏗️ Architecture Patterns\n\n### 1. Schema Files (`src/schema/`)\n\nSchema files define the Mongoose schema structure. They follow these conventions:\n\n- **Naming**: Use lowercase filenames (e.g., `user.ts`, `accessRole.ts`)\n- **Imports**: Import types from `~/types` for TypeScript support\n- **Exports**: Export only the schema as default\n\n**Example:**\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IUser } from '~/types';\n\nconst userSchema = new Schema<IUser>(\n  {\n    name: { type: String },\n    email: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default userSchema;\n```\n\n### 2. Type Definitions (`src/types/`)\n\nType files define TypeScript interfaces and types. They follow these conventions:\n\n- **Base Type**: Define a plain type without Mongoose Document properties\n- **Document Interface**: Extend the base type with Document and `_id`\n- **Enums/Constants**: Place related enums in the type file or `common/` if shared\n\n**Example:**\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type User = {\n  name?: string;\n  email: string;\n  // ... other fields\n};\n\nexport type IUser = User &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### 3. Model Factory Functions (`src/models/`)\n\nModel files create Mongoose models using factory functions. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Model`\n- **Singleton Pattern**: Check if model exists before creating\n- **Type Safety**: Use the corresponding interface from types\n\n**Example:**\n```typescript\nimport userSchema from '~/schema/user';\nimport type * as t from '~/types';\n\nexport function createUserModel(mongoose: typeof import('mongoose')) {\n  return mongoose.models.User || mongoose.model<t.IUser>('User', userSchema);\n}\n```\n\n### 4. Database Methods (`src/methods/`)\n\nMethod files contain database operations for each entity. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Methods`\n- **Return Type**: Export a type for the methods object\n- **Operations**: Include CRUD operations and entity-specific queries\n\n**Example:**\n```typescript\nimport type { Model } from 'mongoose';\nimport type { IUser } from '~/types';\n\nexport function createUserMethods(mongoose: typeof import('mongoose')) {\n  async function findUserById(userId: string): Promise<IUser | null> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.findById(userId).lean();\n  }\n\n  async function createUser(userData: Partial<IUser>): Promise<IUser> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.create(userData);\n  }\n\n  return {\n    findUserById,\n    createUser,\n    // ... other methods\n  };\n}\n\nexport type UserMethods = ReturnType<typeof createUserMethods>;\n```\n\n### 5. Main Exports (`src/index.ts`)\n\nThe main index file exports:\n- `createModels()` - Factory function for all models\n- `createMethods()` - Factory function for all methods\n- Type exports from `~/types`\n- Shared utilities and constants\n\n## 🚀 Adding a New Entity\n\nTo add a new entity to the data-schemas package, follow these steps:\n\n### Step 1: Create the Type Definition\n\nCreate `src/types/[entityName].ts`:\n\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type EntityName = {\n  /** Field description */\n  fieldName: string;\n  // ... other fields\n};\n\nexport type IEntityName = EntityName &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### Step 2: Update Types Index\n\nAdd to `src/types/index.ts`:\n\n```typescript\nexport * from './entityName';\n```\n\n### Step 3: Create the Schema\n\nCreate `src/schema/[entityName].ts`:\n\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nconst entityNameSchema = new Schema<IEntityName>(\n  {\n    fieldName: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default entityNameSchema;\n```\n\n### Step 4: Create the Model Factory\n\nCreate `src/models/[entityName].ts`:\n\n```typescript\nimport entityNameSchema from '~/schema/entityName';\nimport type * as t from '~/types';\n\nexport function createEntityNameModel(mongoose: typeof import('mongoose')) {\n  return (\n    mongoose.models.EntityName || \n    mongoose.model<t.IEntityName>('EntityName', entityNameSchema)\n  );\n}\n```\n\n### Step 5: Update Models Index\n\nAdd to `src/models/index.ts`:\n\n1. Import the factory function:\n```typescript\nimport { createEntityNameModel } from './entityName';\n```\n\n2. Add to the return object in `createModels()`:\n```typescript\nEntityName: createEntityNameModel(mongoose),\n```\n\n### Step 6: Create Database Methods\n\nCreate `src/methods/[entityName].ts`:\n\n```typescript\nimport type { Model, Types } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nexport function createEntityNameMethods(mongoose: typeof import('mongoose')) {\n  async function findEntityById(id: string | Types.ObjectId): Promise<IEntityName | null> {\n    const EntityName = mongoose.models.EntityName as Model<IEntityName>;\n    return await EntityName.findById(id).lean();\n  }\n\n  // ... other methods\n\n  return {\n    findEntityById,\n    // ... other methods\n  };\n}\n\nexport type EntityNameMethods = ReturnType<typeof createEntityNameMethods>;\n```\n\n### Step 7: Update Methods Index\n\nAdd to `src/methods/index.ts`:\n\n1. Import the methods:\n```typescript\nimport { createEntityNameMethods, type EntityNameMethods } from './entityName';\n```\n\n2. Add to the return object in `createMethods()`:\n```typescript\n...createEntityNameMethods(mongoose),\n```\n\n3. Add to the `AllMethods` type:\n```typescript\nexport type AllMethods = UserMethods &\n  // ... other methods\n  EntityNameMethods;\n```\n\n## 📝 Best Practices\n\n1. **Consistent Naming**: Use lowercase for filenames, PascalCase for types/interfaces\n2. **Type Safety**: Always use TypeScript types, avoid `any`\n3. **JSDoc Comments**: Document complex fields and methods\n4. **Indexes**: Define database indexes in schema files for query performance\n5. **Validation**: Use Mongoose schema validation for data integrity\n6. **Lean Queries**: Use `.lean()` for read operations when you don't need Mongoose document methods\n\n## 🔧 Common Patterns\n\n### Enums and Constants\n\nPlace shared enums in `src/common/`:\n\n```typescript\n// src/common/permissions.ts\nexport enum PermissionBits {\n  VIEW = 1,\n  EDIT = 2,\n  DELETE = 4,\n  SHARE = 8,\n}\n```\n\n### Compound Indexes\n\nFor complex queries, add compound indexes:\n\n```typescript\nschema.index({ field1: 1, field2: 1 });\nschema.index(\n  { uniqueField: 1 },\n  { \n    unique: true, \n    partialFilterExpression: { uniqueField: { $exists: true } }\n  }\n);\n```\n\n### Virtual Properties\n\nAdd computed properties using virtuals:\n\n```typescript\nschema.virtual('fullName').get(function() {\n  return `${this.firstName} ${this.lastName}`;\n});\n```\n\n## 🧪 Testing\n\nWhen adding new entities, ensure:\n- Types compile without errors\n- Models can be created successfully\n- Methods handle edge cases (null checks, validation)\n- Indexes are properly defined for query patterns\n\n## 📚 Resources\n\n- [Mongoose Documentation](https://mongoosejs.com/docs/)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [MongoDB Indexes](https://docs.mongodb.com/manual/indexes/) ","AGENTS.md":"# LibreChat contributor and agent guidance\n\n`AGENTS.md` is the repository's contributor guidance. Backend code lives in `packages/api`\n(TypeScript) and `packages/data-schemas` (database methods); `api` is legacy Express wiring.\nShared API types and services live in `packages/data-provider`, and the React app lives in\n`client` with shared primitives in `packages/client`. Chat state, transport and message components\nare moving into `packages/chat` (`@librechat/chat`), which never imports the app.\n\n## Branching and pull requests\n\nNormally branch off `dev` and target `dev`; `gh pr create` defaults to `main`, so pass `--base dev`\nexplicitly. `main` is the released branch, kept as a fast-forward of `dev` and synced as-is — never\nopen a backport pull request to `main`, because anything merged to `dev` reaches it at the next\nsync. Pull requests opened against `main` are retargeted automatically.\n\n**Maintainer-directed canary exception:** Experimental work, or a PR ready to merge after review but\nnot yet suitable for the next `main` sync, may instead target `canary`. The maintainer may choose\nthis before work starts or while reviewing a stale PR. For new canary work, branch from the current\n`origin/canary` and pass `--base canary` explicitly; do not silently retarget an existing PR or\npromote canary code to `dev`. If a stale PR is redirected to canary, first check its base, diff and\nreviewed head against current canary; coordinate any rebase or new PR with the maintainer. A PR\nexplicitly based on `canary` stays there; the main-to-dev retarget workflow does not move it.\n\nStill link related issues in the PR (for example, `Related to #N`) so the work remains\ntraceable. `Fixes #N` does not close an issue on a `dev` or `canary` merge — GitHub honors closing\nkeywords only on the default branch. Close resolved issues by hand after merging. Worktrees share\none stash stack, so never use a bare `git stash pop`. Prefer a WIP commit; if a stash is necessary,\napply the specific tagged entry. The `target: main` label and release-bound upstream branches are\nexempt from the main-to-dev retarget workflow; do not use either to backport ordinary work.\n\nWrite the description for a reader who has not followed the branch: what breaks, what triggers it,\nhow it behaves after the change, then one or two views of the mechanism — a focused diff, a call\ntree, a shallow file tree, or a Mermaid sequence. Keep only what the change carries, and describe\nthe code as it stands rather than narrating earlier commits or review rounds. Naming the merged\npull request that caused the bug is not the same thing; that is history the reader needs. The\nformats and examples live in `.github/pull_request_template.md`.\n\n## Review and completion\n\nRead the inline review threads themselves — a summary comment or notification list omits findings.\nAudit each one against the current code, fix what is valid, and reject what is obsolete in a reply\nthat says why. After each round: focused tests, `npx tsc --noEmit` in every workspace you changed,\npush, then request the next review naming the pull request's exact remote head — a clean review of\nan earlier head says nothing about what you just pushed, and CI runs on its own clock. Reply on\neach resolved thread with the resolving commit and evidence. After two actionable rounds, stop\npatching thread by thread and read the subsystem by invariant instead: identity, authorization,\npersistence, retry, cancellation, cleanup and mixed-version behavior where relevant. Which reviewer\nand what phrase triggers it will change; that the review must cover the exact pushed head will not.\n\nA clean review is one completion signal, not the definition of done. Ship the observable experience\n— loading, empty, success, failure, cancellation, retry, restored session — with strings localized,\naccessibility intact, defaults and stored data preserved, and no backend capability left without a\nfrontend entry point. Keep fixes small and test the missed behavior. Report the pushed head, what you\nran locally, CI state, the review result at that head, any finding you rejected with the reasoning,\nand checks you could not run.\n\n## Verification\n\nFor startup, auth, config, file, or message-loading changes, avoid serial database\nreads and reuse loaded request data. Run `npm run lighthouse` before completion:\nthe CI lane adds 250 ms per Mongo query and checks the visible conversation's LCP.\nSee [budgets, reproduction and failure diagnosis](e2e/lighthouse/README.md).\n\nA green build is not a typecheck: `packages/api`, `packages/client`, `packages/chat` and `packages/data-schemas` build\nwith `tsdown`, which emits without checking types. Run `npx tsc --noEmit` in the workspace you\nchanged. `packages/client` excludes `*.spec.ts(x)` and `*.test.ts(x)` from typechecking entirely.\n`npm run sort-imports` with no arguments rewrites every source root — pass the paths you touched.\nRun `npm run static-checks -- --against origin/dev` to reproduce the PR's static checks; use\n`npm run static-checks:full` for the slower gates. Fix all formatting, lint, and TypeScript\nwarnings/errors in the code you change.\n\n## Module boundaries and configuration\n\nAll new backend behavior belongs in TypeScript under `packages/api`; database-specific shared logic\nbelongs in `packages/data-schemas`, and frontend/backend shared API logic belongs in\n`packages/data-provider`. Build data-provider from the project root with `npm run build:data-provider`.\n\n`/api` holds wiring, not behavior. When a change would add logic to a CJS file there — a branch, a\nhelper, a validation step, a service call — the logic belongs in `packages/api`, and the JS file\nkeeps requires, route registration and the call into the TS module (`MCPRequestContext.js` is the\nshape, thirteen lines of re-export). \"Minimum\" means how much behavior `/api` gains, not how small\nthe diff is, and the rule applies to editing existing CJS, which is the common case.\n\nDatabase contracts belong to `packages/data-schemas`. Keep Mongoose types (`FilterQuery`,\n`Types.ObjectId`, `Document`) out of exported signatures in `packages/api`, `packages/data-provider`\nand `client`, because they make the storage engine part of that module's public API. Take and return\nplain typed objects and express the query behind a data-schemas method. The boundary already leaks\nacross `packages/api`, so stop widening it rather than rewriting what exists; the client carries none\nof it and must stay that way.\n\nNew levers ship configurable: a limit, timeout, toggle or capability introduced in code earns a field\non `configSchema` (`packages/data-provider/src/config.ts`) so it can be set in `librechat.yaml`, with\na default that reproduces today's behavior. Hard-coded constants and env-only switches need a reason.\nModules take their dependencies rather than reaching for them: code in `packages/api` receives its\nconfig, database methods and clients from the caller, the way `createModels(mongoose)` receives the\napp's connection, instead of importing app singletons or reading global state. Integrations (provider\nSDKs, storage backends, vector stores, OAuth servers) arrive through an interface the caller\nsupplies, so a second implementation is a new argument instead of a new branch. The static singletons\nunder `packages/api/src/mcp` are the shape to stop extending, not a pattern to copy. This is the\nbackend half of client state ownership: pass it in, do not reach for it.\n\n## Service failures and user-facing errors\n\nThis section applies to backend services (`packages/api`) and database methods/repositories\n(`packages/data-schemas`), not to React components. For new or substantially changed code in\nthose layers, choose failure behavior at the contract boundary instead of treating every\nunsuccessful outcome as an exception:\n\n- Return a plain value on success. Use `null` only for a documented absence (for example, a\n  successful lookup with no record), never to hide a query failure.\n- For an expected failure the caller can handle without aborting the operation, prefer a typed\n  discriminated result such as `{ ok: true; value: T } | { ok: false; error: { code: string;\nmessage?: string } }`. Keep an existing domain-specific result shape when changing it would\n  break callers; do not introduce interchangeable `ok`, `valid`, and bare `{ message }` contracts\n  in the same service. Codes should be stable, machine-readable identifiers when the caller\n  needs to distinguish failures. Internal validation helpers may use the existing local pattern.\n- Throw for unexpected operational failures (database, provider, network) and violated invariants.\n  Use a typed/coded error when a boundary must recognize a particular failure. Catch where you can\n  recover or translate it; otherwise let it reach the owning request or job boundary. Do not catch\n  an exception and return a truthy record, `null`, or `{ message }` in its place: callers can then\n  mistake an outage for data or send it as an HTTP 200. Keep separate migrations for existing\n  contracts, with their callers and tests, rather than changing wire shapes incidentally.\n- At the HTTP, stream, or job boundary, map failures to the existing status and response contract.\n  Only expose intentionally approved codes and helpful user-safe information. Error disclosure is\n  a security boundary: never forward raw exceptions, stacks, query text, credentials, request\n  bodies, headers, provider payloads, or arbitrary `error.message` to a client or persisted\n  user-visible status. Sanitize diagnostics and log only what the path can safely retain. For\n  errors that may echo submitted content, prefer `getSafeErrorMetadata` over error text;\n  `packages/api/src/utils/errors.ts` documents when redacted error text is appropriate.\n- Localization is a UI responsibility, not a database-method return shape. When a failure reaches\n  a user-facing surface, expose a safe, stable code the UI can map to localized, actionable copy\n  and a fallback. See `client/src/components/Messages/Content/Error/registry.ts` and\n  `client/src/components/Chat/Trace/Viewer.tsx`. Keep any intentionally disclosed provider detail\n  behind its existing protection policy rather than treating arbitrary upstream text as safe.\n\nExamples of local contracts, not a mandate to copy their shapes: `packages/api/src/admin/auditLog.ts`\nuses a parsing result, `packages/api/src/agents/openai/service.ts` validates before mapping to an\nOpenAI-compatible response, and `packages/api/src/skills/sync/errors.ts` names a sync failure by\nstable code. `packages/data-schemas/src/methods/prompt.ts` currently returns `{ message }` on query\nfailure; do not extend that pattern. Test absence versus failure, the boundary's non-success response,\nand that sensitive diagnostics cannot reach a user-visible surface.\n\n## Frontend theming and styling\n\nFor frontend work, compose existing `@librechat/client` primitives and variants before adding\nfeature-local styles. Use semantic theme/Tailwind roles for color and shared appearance; do not\nintroduce raw palette utilities, hard-coded colors, or arbitrary theme CSS. If the system cannot\nexpress a reusable design need, deepen the shared primitive or versioned theme-token registry\ninstead of copying classes into a feature. Theme definitions select semantic colors and appearance,\nnot selectors, app behavior, or alternate layouts. Keep genuine layout and behavior local, and\nexplain why any new custom CSS cannot use shared primitives. Support light/dark and reduced motion;\npreserve defaults and test a deliberately different reference theme for reusable new variants.\n\n## Backend auth cache\n\nWhen adding or changing code that mutates user documents, invalidate the auth user document cache\nfor affected users, including bulk role and user mutations. Otherwise burst-cached JWT requests can\nserve a stale `req.user` until the cache expires.\n\n## Client state ownership\n\nThe client is migrating from Recoil to Jotai. New state is always Jotai, even in a file that already\nimports Recoil; many files import both, so mixed imports say nothing about which to use. For existing\nstate the unit of conversion is one atom plus every file that reads or writes it, because an atom\ncannot be half converted — convert the areas you touch, not the whole store.\nSplit by ownership: state a feature both writes and reads is feature-owned, so convert it to Jotai\nand keep it inside the feature; app-global preferences and shell state a feature merely consumes\n(`maximizeChatSpace`, `showScrollButton`, `enterToSend`, artifact visibility) must be passed in\nthrough props or a small host-supplied context rather than reached for through `~/store`; when a\nconsumer sits outside the feature you are changing, leave that atom on Recoil and pass it in. Passing\nthem in is what lets a feature move to its own workspace later without a rewrite, and it keeps the\nJotai conversion scoped to the state a feature owns. For persisted atoms, use the helpers in\n`client/src/store/jotai-utils.ts`.\n\n## Code style and performance\n\nUse short, single-word file names when possible; group related modules in a single-word directory.\nPrefer flat early returns, pure functions, and explicit types. Avoid `any`, broad `unknown`/casts,\nduplicated types, and dynamic imports. Extract genuinely repeated logic instead of copying it;\nwrite comments only for non-obvious behavior or public API contracts.\n\nImports have three sections: package values (shortest line first, with `react` first), `import type`\n(longest line first, package types before local types), and local/project values (longest line first).\nUse standalone `import type { ... }`, not inline `type` within a value import. Run the scoped\nimport sorter on files you change.\n\nAvoid extra passes over shared message arrays and unnecessary allocations. For startup and\nrequest paths, reuse already-loaded user/config data, avoid serial database reads, and start\nindependent reads in parallel. Do not weaken authorization or tenant checks or write a response\nbefore those checks succeed.\n\n## Frontend rules\n\nUse the chat Share/Export action-menu pattern: `DropdownPopup` from `@librechat/client` with\n`Ariakit.MenuButton` (see `HeaderMenu.tsx` and `useExportShare.tsx`). Never introduce or reintroduce\nthe Radix `DropdownMenu` family for app action or sort menus. Preserve the Share/Export\ndialog-item contract (`hideOnClick: false`, item ref, button render, and dialog `triggerRef`)\nwhen a menu action opens a dialog.\n\nUse `useLocalize()` for all visible copy and update only English keys in\n`client/src/locales/en/translation.json`. Use semantic HTML, keyboard behavior, and ARIA labels.\nUse React Query for API interactions and invalidate related queries after mutations; define query\nand mutation keys in `packages/data-provider/src/keys.ts`. Put shared endpoint definitions, types,\nand data services in `packages/data-provider`, and encode dynamic URL parameters. Cover loading,\nsuccess, and failure states in focused component tests.\n\n## Testing\n\nRun focused Jest tests from the owning workspace, not the entire monorepo. Prefer real logic and\nspies over mocked internals; use `mongodb-memory-server` for database queries and the real MCP SDK\nfor MCP behavior. Mock only external HTTP APIs or uncontrollable services. For frontend tests use\nthe component's colocated `__tests__` and `test/layout-test-utils` where applicable.\n","packages/data-schemas/tsconfig.build.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": false,\n    \"declaration\": true,\n    \"declarationDir\": \"dist/types\",\n    \"outDir\": \"dist\"\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"**/*.spec.ts\"]\n}\n","packages/data-schemas/package.json":"{\n  \"name\": \"@librechat/data-schemas\",\n  \"version\": \"0.0.75\",\n  \"description\": \"Mongoose schemas and models for LibreChat\",\n  \"type\": \"module\",\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./capabilities\": {\n      \"import\": {\n        \"types\": \"./dist/capabilities.d.mts\",\n        \"default\": \"./dist/admin/capabilities.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/capabilities.d.cts\",\n        \"default\": \"./dist/admin/capabilities.cjs\"\n      }\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"mdast-util-directive\": \"^3.0.0\",\n    \"mdast-util-from-markdown\": \"^2.0.1\",\n    \"mdast-util-gfm\": \"^3.0.0\",\n    \"mdast-util-math\": \"^3.0.0\",\n    \"micromark-extension-directive\": \"^3.0.1\",\n    \"micromark-extension-gfm\": \"^3.0.0\",\n    \"micromark-extension-llm-math\": \"^3.1.0\",\n    \"micromark-util-decode-string\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/node\": \"^24.12.4\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"mongodb-memory-server\": \"^11.3.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"peerDependencies\": {\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"klona\": \"^2.0.6\",\n    \"librechat-data-provider\": \"*\",\n    \"lodash\": \"^4.17.23\",\n    \"meilisearch\": \"^0.38.0\",\n    \"mongoose\": \"^8.24.1\",\n    \"nanoid\": \"^3.3.18\",\n    \"winston\": \"^3.17.0\",\n    \"winston-daily-rotate-file\": \"^5.0.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"mongoose\",\n    \"schema\",\n    \"typescript\",\n    \"librechat\"\n  ]\n}\n","packages/data-schemas/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2019\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"declaration\": true,\n    \"isolatedDeclarations\": true,\n    \"noEmit\": true,\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\", \"jest\"],\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/data-provider/package.json":"{\n  \"name\": \"librechat-data-provider\",\n  \"version\": \"0.8.528\",\n  \"description\": \"data services for librechat apps\",\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/types/index.d.ts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\",\n      \"types\": \"./dist/types/index.d.ts\"\n    },\n    \"./react-query\": {\n      \"import\": \"./dist/react-query/index.mjs\",\n      \"require\": \"./dist/react-query/index.js\",\n      \"types\": \"./dist/types/react-query/index.d.ts\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown && tsc -p tsconfig.build.json\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci --logHeapUsage\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown && bun run tsc -p tsconfig.build.json\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"axios\": \"^1.20.0\",\n    \"croner\": \"^10.0.1\",\n    \"dayjs\": \"^1.11.13\",\n    \"js-yaml\": \"^4.3.2\",\n    \"re2js\": \"^2.8.6\",\n    \"zod\": \"^3.22.4\"\n  },\n  \"devDependencies\": {\n    \"@babel/preset-env\": \"^7.21.5\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@rollup/plugin-replace\": \"^5.0.5\",\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/node\": \"^24.12.4\",\n    \"@types/react\": \"^18.2.18\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"openapi-types\": \"^12.1.3\",\n    \"rimraf\": \"^6.1.3\",\n    \"rollup\": \"^4.34.9\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\",\n    \"winston\": \"^3.17.0\"\n  },\n  \"peerDependencies\": {\n    \"@tanstack/react-query\": \"^4.28.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\"\n  }\n}\n","packages/data-provider/tsconfig.spec.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/client/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"react\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"isolatedDeclarations\": true,\n    \"sourceMap\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    },\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"resolveJsonModule\": true,\n    \"types\": [\"node\", \"vite/client\"],\n    \"noUncheckedSideEffectImports\": false\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\n    \"dist\",\n    \"node_modules\",\n    \"**/*.test.ts\",\n    \"**/*.test.tsx\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.tsx\"\n  ]\n}\n","packages/client/package.json":"{\n  \"name\": \"@librechat/client\",\n  \"version\": \"0.4.83\",\n  \"description\": \"React components for LibreChat\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./tailwind-preset\": \"./tailwind.preset.cjs\",\n    \"./theme.css\": \"./dist/tokens.css\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./fonts/*\": \"./dist/fonts/*\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"tailwind.preset.cjs\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:dev\": \"npm run clean && NODE_ENV=development tsdown\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"dev\": \"tsdown --watch\",\n    \"test\": \"jest\",\n    \"test:ci\": \"jest --ci\"\n  },\n  \"peerDependencies\": {\n    \"@ariakit/react\": \"^0.4.29\",\n    \"@ariakit/react-components\": \"^0.1.2\",\n    \"@dicebear/collection\": \"^9.4.3\",\n    \"@dicebear/core\": \"^9.4.3\",\n    \"@headlessui/react\": \"^2.1.2\",\n    \"@radix-ui/react-accordion\": \"^1.2.20\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-checkbox\": \"^1.3.11\",\n    \"@radix-ui/react-collapsible\": \"^1.1.20\",\n    \"@radix-ui/react-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-direction\": \"^1.1.4\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.24\",\n    \"@radix-ui/react-hover-card\": \"^1.1.23\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@radix-ui/react-label\": \"^2.1.7\",\n    \"@radix-ui/react-popover\": \"^1.1.23\",\n    \"@radix-ui/react-progress\": \"^1.1.2\",\n    \"@radix-ui/react-radio-group\": \"^1.3.7\",\n    \"@radix-ui/react-select\": \"^2.3.7\",\n    \"@radix-ui/react-separator\": \"^1.1.7\",\n    \"@radix-ui/react-slider\": \"^1.3.5\",\n    \"@radix-ui/react-slot\": \"^1.0.0\",\n    \"@radix-ui/react-switch\": \"^1.2.5\",\n    \"@radix-ui/react-tabs\": \"^1.1.21\",\n    \"@radix-ui/react-toast\": \"^1.2.23\",\n    \"@rc-component/mini-decimal\": \"^1.0.1\",\n    \"@react-spring/web\": \"^10.0.1\",\n    \"@tanstack/react-query\": \"^4.28.0 || ^5.0.0\",\n    \"@tanstack/react-table\": \"^8.11.7\",\n    \"@tanstack/react-virtual\": \"^3.0.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"dompurify\": \"^3.4.17\",\n    \"framer-motion\": \"^12.40.0\",\n    \"i18next\": \"^24.2.2 || ^25.3.2\",\n    \"i18next-browser-languagedetector\": \"^8.2.0\",\n    \"input-otp\": \"^1.4.2\",\n    \"jotai\": \"^2.12.5\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.525.0 || ^0.528.0\",\n    \"lucide-react\": \"^0.525.0 || ^0.528.0\",\n    \"match-sorter\": \"^8.1.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"rc-input-number\": \"^7.4.2\",\n    \"react\": \"^18.2.0 || ^19.1.0\",\n    \"react-dom\": \"^18.2.0 || ^19.1.0\",\n    \"react-hook-form\": \"^7.56.4\",\n    \"react-i18next\": \"^15.4.0 || ^15.6.0\",\n    \"react-resizable-panels\": \"^4.7.4\",\n    \"react-textarea-autosize\": \"^8.4.0\",\n    \"tailwind-merge\": \"^3.7.0\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@babel/preset-env\": \"^7.29.5\",\n    \"@babel/preset-react\": \"^7.28.5\",\n    \"@babel/preset-typescript\": \"^7.28.5\",\n    \"@tanstack/react-query\": \"^4.28.0\",\n    \"@tanstack/react-table\": \"^8.21.3\",\n    \"@tanstack/react-virtual\": \"3.13.23\",\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@tsdown/css\": \"^0.22.2\",\n    \"@types/jest\": \"^29.5.14\",\n    \"@types/react\": \"^18.2.11\",\n    \"@types/react-dom\": \"^18.2.4\",\n    \"babel-jest\": \"^30.2.0\",\n    \"caniuse-lite\": \"^1.0.30001741\",\n    \"i18next\": \"^24.2.3\",\n    \"identity-obj-proxy\": \"^3.0.0\",\n    \"jest\": \"^30.2.0\",\n    \"jest-environment-jsdom\": \"^30.2.0\",\n    \"jotai\": \"^2.12.5\",\n    \"js-yaml\": \"^4.3.2\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.528.0\",\n    \"lucide-react\": \"^0.528.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-i18next\": \"^15.4.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n","packages/data-provider/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"module\": \"esnext\",\n    \"noImplicitAny\": true,\n    \"outDir\": \"./types\",\n    \"target\": \"es5\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\"es2017\", \"dom\", \"ES2021.String\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"sourceMap\": true,\n    \"paths\": {\n      \"librechat-data-provider/react-query\": [\"./src/react-query/index.ts\"],\n      \"src/*\": [\"./src/*\"]\n    }\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"types\"],\n  \"include\": [\"src/**/*\", \"types/index.d.ts\", \"types/react-query/index.d.ts\"]\n}\n","packages/data-schemas/tsconfig.spec.json":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/client/tsconfig.test.json":"# Client Skill\n\nPath: `packages/client/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/tsconfig.test.json)","packages/api/package.json":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/package.json)","packages/api/tsconfig.build.json":"# Api Skill\n\nPath: `packages/api/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.build.json)","packages/api/tsconfig.json":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.json)","packages/api/tsconfig.spec.json":"# Api Skill\n\nPath: `packages/api/tsconfig.spec.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.spec.json)","packages/data-provider/react-query/package.json":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package.json)","packages/data-provider/react-query/package-lock.json":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package-lock.json)","api/app/clients/tools/manifest.json":"# Tools Skill\n\nPath: `api/app/clients/tools/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/api/app/clients/tools/manifest.json)","packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md)","packages/data-schemas/misc/ferretdb/tsconfig.json":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/tsconfig.json)","packages/client/src/theme/README.md":"# theme Documentation\n\nPath: `packages/client/src/theme/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/theme/README.md)","packages/client/src/locales/hu/translation.json":"# Hu Skill\n\nPath: `packages/client/src/locales/hu/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/hu/translation.json)","packages/client/src/locales/he/translation.json":"# He Skill\n\nPath: `packages/client/src/locales/he/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/he/translation.json)","packages/client/src/locales/fr/translation.json":"# Fr Skill\n\nPath: `packages/client/src/locales/fr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fr/translation.json)","packages/client/src/locales/fi/translation.json":"# Fi Skill\n\nPath: `packages/client/src/locales/fi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fi/translation.json)","packages/client/src/locales/fa/translation.json":"# Fa Skill\n\nPath: `packages/client/src/locales/fa/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fa/translation.json)","packages/client/src/locales/et/translation.json":"# Et Skill\n\nPath: `packages/client/src/locales/et/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/et/translation.json)","packages/client/src/locales/es/translation.json":"# Es Skill\n\nPath: `packages/client/src/locales/es/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/es/translation.json)","packages/client/src/locales/en/translation.json":"# En Skill\n\nPath: `packages/client/src/locales/en/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/en/translation.json)","packages/client/src/locales/de/translation.json":"# De Skill\n\nPath: `packages/client/src/locales/de/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/de/translation.json)","packages/client/src/locales/da/translation.json":"# Da Skill\n\nPath: `packages/client/src/locales/da/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/da/translation.json)","packages/client/src/locales/cs/translation.json":"# Cs Skill\n\nPath: `packages/client/src/locales/cs/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/cs/translation.json)","packages/client/src/locales/ca/translation.json":"# Ca Skill\n\nPath: `packages/client/src/locales/ca/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ca/translation.json)","packages/client/src/locales/ar/translation.json":"# Ar Skill\n\nPath: `packages/client/src/locales/ar/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ar/translation.json)","packages/client/src/locales/id/translation.json":"# Id Skill\n\nPath: `packages/client/src/locales/id/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/id/translation.json)","packages/client/src/locales/it/translation.json":"# It Skill\n\nPath: `packages/client/src/locales/it/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/it/translation.json)","packages/client/src/locales/ja/translation.json":"# Ja Skill\n\nPath: `packages/client/src/locales/ja/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ja/translation.json)","packages/client/src/locales/ka/translation.json":"# Ka Skill\n\nPath: `packages/client/src/locales/ka/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ka/translation.json)","packages/client/src/locales/ko/translation.json":"# Ko Skill\n\nPath: `packages/client/src/locales/ko/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ko/translation.json)","packages/client/src/locales/nl/translation.json":"# Nl Skill\n\nPath: `packages/client/src/locales/nl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/nl/translation.json)","packages/client/src/locales/pl/translation.json":"# Pl Skill\n\nPath: `packages/client/src/locales/pl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pl/translation.json)","packages/client/src/locales/pt-BR/translation.json":"# Pt-BR Skill\n\nPath: `packages/client/src/locales/pt-BR/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-BR/translation.json)","packages/client/src/locales/pt-PT/translation.json":"# Pt-PT Skill\n\nPath: `packages/client/src/locales/pt-PT/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-PT/translation.json)","packages/client/src/locales/ru/translation.json":"# Ru Skill\n\nPath: `packages/client/src/locales/ru/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ru/translation.json)","packages/client/src/locales/sv/translation.json":"# Sv Skill\n\nPath: `packages/client/src/locales/sv/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/sv/translation.json)","packages/client/src/locales/th/translation.json":"# Th Skill\n\nPath: `packages/client/src/locales/th/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/th/translation.json)","packages/client/src/locales/tr/translation.json":"# Tr Skill\n\nPath: `packages/client/src/locales/tr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/tr/translation.json)","packages/client/src/locales/vi/translation.json":"# Vi Skill\n\nPath: `packages/client/src/locales/vi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/vi/translation.json)","packages/client/src/locales/zh-Hans/translation.json":"# Zh-Hans Skill\n\nPath: `packages/client/src/locales/zh-Hans/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hans/translation.json)","packages/client/src/locales/zh-Hant/translation.json":"# Zh-Hant Skill\n\nPath: `packages/client/src/locales/zh-Hant/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hant/translation.json)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# LibreChat contributor and agent guidance\n\n`AGENTS.md` is the repository's contributor guidance. Backend code lives in `packages/api`\n(TypeScript) and `packages/data-schemas` (database methods); `api` is legacy Express wiring.\nShared API types and services live in `packages/data-provider`, and the React app lives in\n`client` with shared primitives in `packages/client`. Chat state, transport and message components\nare moving into `packages/chat` (`@librechat/chat`), which never imports the app.\n\n## Branching and pull requests\n\nNormally branch off `dev` and target `dev`; `gh pr create` defaults to `main`, so pass `--base dev`\nexplicitly. `main` is the released branch, kept as a fast-forward of `dev` and synced as-is — never\nopen a backport pull request to `main`, because anything merged to `dev` reaches it at the next\nsync. Pull requests opened against `main` are retargeted automatically.\n\n**Maintainer-directed canary exception:** Experimental work, or a PR ready to merge after review but\nnot yet suitable for the next `main` sync, may instead target `canary`. The maintainer may choose\nthis before work starts or while reviewing a stale PR. For new canary work, branch from the current\n`origin/canary` and pass `--base canary` explicitly; do not silently retarget an existing PR or\npromote canary code to `dev`. If a stale PR is redirected to canary, first check its base, diff and\nreviewed head against current canary; coordinate any rebase or new PR with the maintainer. A PR\nexplicitly based on `canary` stays there; the main-to-dev retarget workflow does not move it.\n\nStill link related issues in the PR (for example, `Related to #N`) so the work remains\ntraceable. `Fixes #N` does not close an issue on a `dev` or `canary` merge — GitHub honors closing\nkeywords only on the default branch. Close resolved issues by hand after merging. Worktrees share\none stash stack, so never use a bare `git stash pop`. Prefer a WIP commit; if a stash is necessary,\napply the specific tagged entry. The `target: main` label and release-bound upstream branches are\nexempt from the main-to-dev retarget workflow; do not use either to backport ordinary work.\n\nWrite the description for a reader who has not followed the branch: what breaks, what triggers it,\nhow it behaves after the change, then one or two views of the mechanism — a focused diff, a call\ntree, a shallow file tree, or a Mermaid sequence. Keep only what the change carries, and describe\nthe code as it stands rather than narrating earlier commits or review rounds. Naming the merged\npull request that caused the bug is not the same thing; that is history the reader needs. The\nformats and examples live in `.github/pull_request_template.md`.\n\n## Review and completion\n\nRead the inline review threads themselves — a summary comment or notification list omits findings.\nAudit each one against the current code, fix what is valid, and reject what is obsolete in a reply\nthat says why. After each round: focused tests, `npx tsc --noEmit` in every workspace you changed,\npush, then request the next review naming the pull request's exact remote head — a clean review of\nan earlier head says nothing about what you just pushed, and CI runs on its own clock. Reply on\neach resolved thread with the resolving commit and evidence. After two actionable rounds, stop\npatching thread by thread and read the subsystem by invariant instead: identity, authorization,\npersistence, retry, cancellation, cleanup and mixed-version behavior where relevant. Which reviewer\nand what phrase triggers it will change; that the review must cover the exact pushed head will not.\n\nA clean review is one completion signal, not the definition of done. Ship the observable experience\n— loading, empty, success, failure, cancellation, retry, restored session — with strings localized,\naccessibility intact, defaults and stored data preserved, and no backend capability left without a\nfrontend entry point. Keep fixes small and test the missed behavior. Report the pushed head, what you\nran locally, CI state, the review result at that head, any finding you rejected with the reasoning,\nand checks you could not run.\n\n## Verification\n\nFor startup, auth, config, file, or message-loading changes, avoid serial database\nreads and reuse loaded request data. Run `npm run lighthouse` before completion:\nthe CI lane adds 250 ms per Mongo query and checks the visible conversation's LCP.\nSee [budgets, reproduction and failure diagnosis](e2e/lighthouse/README.md).\n\nA green build is not a typecheck: `packages/api`, `packages/client`, `packages/chat` and `packages/data-schemas` build\nwith `tsdown`, which emits without checking types. Run `npx tsc --noEmit` in the workspace you\nchanged. `packages/client` excludes `*.spec.ts(x)` and `*.test.ts(x)` from typechecking entirely.\n`npm run sort-imports` with no arguments rewrites every source root — pass the paths you touched.\nRun `npm run static-checks -- --against origin/dev` to reproduce the PR's static checks; use\n`npm run static-checks:full` for the slower gates. Fix all formatting, lint, and TypeScript\nwarnings/errors in the code you change.\n\n## Module boundaries and configuration\n\nAll new backend behavior belongs in TypeScript under `packages/api`; database-specific shared logic\nbelongs in `packages/data-schemas`, and frontend/backend shared API logic belongs in\n`packages/data-provider`. Build data-provider from the project root with `npm run build:data-provider`.\n\n`/api` holds wiring, not behavior. When a change would add logic to a CJS file there — a branch, a\nhelper, a validation step, a service call — the logic belongs in `packages/api`, and the JS file\nkeeps requires, route registration and the call into the TS module (`MCPRequestContext.js` is the\nshape, thirteen lines of re-export). \"Minimum\" means how much behavior `/api` gains, not how small\nthe diff is, and the rule applies to editing existing CJS, which is the common case.\n\nDatabase contracts belong to `packages/data-schemas`. Keep Mongoose types (`FilterQuery`,\n`Types.ObjectId`, `Document`) out of exported signatures in `packages/api`, `packages/data-provider`\nand `client`, because they make the storage engine part of that module's public API. Take and return\nplain typed objects and express the query behind a data-schemas method. The boundary already leaks\nacross `packages/api`, so stop widening it rather than rewriting what exists; the client carries none\nof it and must stay that way.\n\nNew levers ship configurable: a limit, timeout, toggle or capability introduced in code earns a field\non `configSchema` (`packages/data-provider/src/config.ts`) so it can be set in `librechat.yaml`, with\na default that reproduces today's behavior. Hard-coded constants and env-only switches need a reason.\nModules take their dependencies rather than reaching for them: code in `packages/api` receives its\nconfig, database methods and clients from the caller, the way `createModels(mongoose)` receives the\napp's connection, instead of importing app singletons or reading global state. Integrations (provider\nSDKs, storage backends, vector stores, OAuth servers) arrive through an interface the caller\nsupplies, so a second implementation is a new argument instead of a new branch. The static singletons\nunder `packages/api/src/mcp` are the shape to stop extending, not a pattern to copy. This is the\nbackend half of client state ownership: pass it in, do not reach for it.\n\n## Service failures and user-facing errors\n\nThis section applies to backend services (`packages/api`) and database methods/repositories\n(`packages/data-schemas`), not to React components. For new or substantially changed code in\nthose layers, choose failure behavior at the contract boundary instead of treating every\nunsuccessful outcome as an exception:\n\n- Return a plain value on success. Use `null` only for a documented absence (for example, a\n  successful lookup with no record), never to hide a query failure.\n- For an expected failure the caller can handle without aborting the operation, prefer a typed\n  discriminated result such as `{ ok: true; value: T } | { ok: false; error: { code: string;\nmessage?: string } }`. Keep an existing domain-specific result shape when changing it would\n  break callers; do not introduce interchangeable `ok`, `valid`, and bare `{ message }` contracts\n  in the same service. Codes should be stable, machine-readable identifiers when the caller\n  needs to distinguish failures. Internal validation helpers may use the existing local pattern.\n- Throw for unexpected operational failures (database, provider, network) and violated invariants.\n  Use a typed/coded error when a boundary must recognize a particular failure. Catch where you can\n  recover or translate it; otherwise let it reach the owning request or job boundary. Do not catch\n  an exception and return a truthy record, `null`, or `{ message }` in its place: callers can then\n  mistake an outage for data or send it as an HTTP 200. Keep separate migrations for existing\n  contracts, with their callers and tests, rather than changing wire shapes incidentally.\n- At the HTTP, stream, or job boundary, map failures to the existing status and response contract.\n  Only expose intentionally approved codes and helpful user-safe information. Error disclosure is\n  a security boundary: never forward raw exceptions, stacks, query text, credentials, request\n  bodies, headers, provider payloads, or arbitrary `error.message` to a client or persisted\n  user-visible status. Sanitize diagnostics and log only what the path can safely retain. For\n  errors that may echo submitted content, prefer `getSafeErrorMetadata` over error text;\n  `packages/api/src/utils/errors.ts` documents when redacted error text is appropriate.\n- Localization is a UI responsibility, not a database-method return shape. When a failure reaches\n  a user-facing surface, expose a safe, stable code the UI can map to localized, actionable copy\n  and a fallback. See `client/src/components/Messages/Content/Error/registry.ts` and\n  `client/src/components/Chat/Trace/Viewer.tsx`. Keep any intentionally disclosed provider detail\n  behind its existing protection policy rather than treating arbitrary upstream text as safe.\n\nExamples of local contracts, not a mandate to copy their shapes: `packages/api/src/admin/auditLog.ts`\nuses a parsing result, `packages/api/src/agents/openai/service.ts` validates before mapping to an\nOpenAI-compatible response, and `packages/api/src/skills/sync/errors.ts` names a sync failure by\nstable code. `packages/data-schemas/src/methods/prompt.ts` currently returns `{ message }` on query\nfailure; do not extend that pattern. Test absence versus failure, the boundary's non-success response,\nand that sensitive diagnostics cannot reach a user-visible surface.\n\n## Frontend theming and styling\n\nFor frontend work, compose existing `@librechat/client` primitives and variants before adding\nfeature-local styles. Use semantic theme/Tailwind roles for color and shared appearance; do not\nintroduce raw palette utilities, hard-coded colors, or arbitrary theme CSS. If the system cannot\nexpress a reusable design need, deepen the shared primitive or versioned theme-token registry\ninstead of copying classes into a feature. Theme definitions select semantic colors and appearance,\nnot selectors, app behavior, or alternate layouts. Keep genuine layout and behavior local, and\nexplain why any new custom CSS cannot use shared primitives. Support light/dark and reduced motion;\npreserve defaults and test a deliberately different reference theme for reusable new variants.\n\n## Backend auth cache\n\nWhen adding or changing code that mutates user documents, invalidate the auth user document cache\nfor affected users, including bulk role and user mutations. Otherwise burst-cached JWT requests can\nserve a stale `req.user` until the cache expires.\n\n## Client state ownership\n\nThe client is migrating from Recoil to Jotai. New state is always Jotai, even in a file that already\nimports Recoil; many files import both, so mixed imports say nothing about which to use. For existing\nstate the unit of conversion is one atom plus every file that reads or writes it, because an atom\ncannot be half converted — convert the areas you touch, not the whole store.\nSplit by ownership: state a feature both writes and reads is feature-owned, so convert it to Jotai\nand keep it inside the feature; app-global preferences and shell state a feature merely consumes\n(`maximizeChatSpace`, `showScrollButton`, `enterToSend`, artifact visibility) must be passed in\nthrough props or a small host-supplied context rather than reached for through `~/store`; when a\nconsumer sits outside the feature you are changing, leave that atom on Recoil and pass it in. Passing\nthem in is what lets a feature move to its own workspace later without a rewrite, and it keeps the\nJotai conversion scoped to the state a feature owns. For persisted atoms, use the helpers in\n`client/src/store/jotai-utils.ts`.\n\n## Code style and performance\n\nUse short, single-word file names when possible; group related modules in a single-word directory.\nPrefer flat early returns, pure functions, and explicit types. Avoid `any`, broad `unknown`/casts,\nduplicated types, and dynamic imports. Extract genuinely repeated logic instead of copying it;\nwrite comments only for non-obvious behavior or public API contracts.\n\nImports have three sections: package values (shortest line first, with `react` first), `import type`\n(longest line first, package types before local types), and local/project values (longest line first).\nUse standalone `import type { ... }`, not inline `type` within a value import. Run the scoped\nimport sorter on files you change.\n\nAvoid extra passes over shared message arrays and unnecessary allocations. For startup and\nrequest paths, reuse already-loaded user/config data, avoid serial database reads, and start\nindependent reads in parallel. Do not weaken authorization or tenant checks or write a response\nbefore those checks succeed.\n\n## Frontend rules\n\nUse the chat Share/Export action-menu pattern: `DropdownPopup` from `@librechat/client` with\n`Ariakit.MenuButton` (see `HeaderMenu.tsx` and `useExportShare.tsx`). Never introduce or reintroduce\nthe Radix `DropdownMenu` family for app action or sort menus. Preserve the Share/Export\ndialog-item contract (`hideOnClick: false`, item ref, button render, and dialog `triggerRef`)\nwhen a menu action opens a dialog.\n\nUse `useLocalize()` for all visible copy and update only English keys in\n`client/src/locales/en/translation.json`. Use semantic HTML, keyboard behavior, and ARIA labels.\nUse React Query for API interactions and invalidate related queries after mutations; define query\nand mutation keys in `packages/data-provider/src/keys.ts`. Put shared endpoint definitions, types,\nand data services in `packages/data-provider`, and encode dynamic URL parameters. Cover loading,\nsuccess, and failure states in focused component tests.\n\n## Testing\n\nRun focused Jest tests from the owning workspace, not the entire monorepo. Prefer real logic and\nspies over mocked internals; use `mongodb-memory-server` for database queries and the real MCP SDK\nfor MCP behavior. Mock only external HTTP APIs or uncontrollable services. For frontend tests use\nthe component's colocated `__tests__` and `test/layout-test-utils` where applicable.\n","isInternal":false,"tokens":3320,"sizeBytes":15404},{"name":"manifest.json","path":"api/app/clients/tools/manifest.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/api/app/clients/tools/manifest.json","title":"Tools Skill","category":"anthropic-skill","format":"json","content":"# Tools Skill\n\nPath: `api/app/clients/tools/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/api/app/clients/tools/manifest.json)","tokens":300,"sizeBytes":186},{"name":"package.json","path":"packages/api/package.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/package.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/package.json)","tokens":300,"sizeBytes":164},{"name":"tsconfig.build.json","path":"packages/api/tsconfig.build.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.build.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.build.json)","tokens":300,"sizeBytes":178},{"name":"tsconfig.json","path":"packages/api/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.json)","tokens":300,"sizeBytes":166},{"name":"tsconfig.spec.json","path":"packages/api/tsconfig.spec.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.spec.json","title":"Api Skill","category":"anthropic-skill","format":"json","content":"# Api Skill\n\nPath: `packages/api/tsconfig.spec.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.spec.json)","tokens":300,"sizeBytes":176},{"name":"package.json","path":"packages/client/package.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/package.json","title":"@librechat/client","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"@librechat/client\",\n  \"version\": \"0.4.83\",\n  \"description\": \"React components for LibreChat\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./tailwind-preset\": \"./tailwind.preset.cjs\",\n    \"./theme.css\": \"./dist/tokens.css\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./fonts/*\": \"./dist/fonts/*\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"tailwind.preset.cjs\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:dev\": \"npm run clean && NODE_ENV=development tsdown\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"dev\": \"tsdown --watch\",\n    \"test\": \"jest\",\n    \"test:ci\": \"jest --ci\"\n  },\n  \"peerDependencies\": {\n    \"@ariakit/react\": \"^0.4.29\",\n    \"@ariakit/react-components\": \"^0.1.2\",\n    \"@dicebear/collection\": \"^9.4.3\",\n    \"@dicebear/core\": \"^9.4.3\",\n    \"@headlessui/react\": \"^2.1.2\",\n    \"@radix-ui/react-accordion\": \"^1.2.20\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-checkbox\": \"^1.3.11\",\n    \"@radix-ui/react-collapsible\": \"^1.1.20\",\n    \"@radix-ui/react-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-direction\": \"^1.1.4\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.24\",\n    \"@radix-ui/react-hover-card\": \"^1.1.23\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@radix-ui/react-label\": \"^2.1.7\",\n    \"@radix-ui/react-popover\": \"^1.1.23\",\n    \"@radix-ui/react-progress\": \"^1.1.2\",\n    \"@radix-ui/react-radio-group\": \"^1.3.7\",\n    \"@radix-ui/react-select\": \"^2.3.7\",\n    \"@radix-ui/react-separator\": \"^1.1.7\",\n    \"@radix-ui/react-slider\": \"^1.3.5\",\n    \"@radix-ui/react-slot\": \"^1.0.0\",\n    \"@radix-ui/react-switch\": \"^1.2.5\",\n    \"@radix-ui/react-tabs\": \"^1.1.21\",\n    \"@radix-ui/react-toast\": \"^1.2.23\",\n    \"@rc-component/mini-decimal\": \"^1.0.1\",\n    \"@react-spring/web\": \"^10.0.1\",\n    \"@tanstack/react-query\": \"^4.28.0 || ^5.0.0\",\n    \"@tanstack/react-table\": \"^8.11.7\",\n    \"@tanstack/react-virtual\": \"^3.0.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"dompurify\": \"^3.4.17\",\n    \"framer-motion\": \"^12.40.0\",\n    \"i18next\": \"^24.2.2 || ^25.3.2\",\n    \"i18next-browser-languagedetector\": \"^8.2.0\",\n    \"input-otp\": \"^1.4.2\",\n    \"jotai\": \"^2.12.5\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.525.0 || ^0.528.0\",\n    \"lucide-react\": \"^0.525.0 || ^0.528.0\",\n    \"match-sorter\": \"^8.1.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"rc-input-number\": \"^7.4.2\",\n    \"react\": \"^18.2.0 || ^19.1.0\",\n    \"react-dom\": \"^18.2.0 || ^19.1.0\",\n    \"react-hook-form\": \"^7.56.4\",\n    \"react-i18next\": \"^15.4.0 || ^15.6.0\",\n    \"react-resizable-panels\": \"^4.7.4\",\n    \"react-textarea-autosize\": \"^8.4.0\",\n    \"tailwind-merge\": \"^3.7.0\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@babel/preset-env\": \"^7.29.5\",\n    \"@babel/preset-react\": \"^7.28.5\",\n    \"@babel/preset-typescript\": \"^7.28.5\",\n    \"@tanstack/react-query\": \"^4.28.0\",\n    \"@tanstack/react-table\": \"^8.21.3\",\n    \"@tanstack/react-virtual\": \"3.13.23\",\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@tsdown/css\": \"^0.22.2\",\n    \"@types/jest\": \"^29.5.14\",\n    \"@types/react\": \"^18.2.11\",\n    \"@types/react-dom\": \"^18.2.4\",\n    \"babel-jest\": \"^30.2.0\",\n    \"caniuse-lite\": \"^1.0.30001741\",\n    \"i18next\": \"^24.2.3\",\n    \"identity-obj-proxy\": \"^3.0.0\",\n    \"jest\": \"^30.2.0\",\n    \"jest-environment-jsdom\": \"^30.2.0\",\n    \"jotai\": \"^2.12.5\",\n    \"js-yaml\": \"^4.3.2\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.528.0\",\n    \"lucide-react\": \"^0.528.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-i18next\": \"^15.4.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n","frontmatter":{"name":"@librechat/client","version":"0.4.83","description":"React components for LibreChat","repository":{"type":"git","url":"https://github.com/LibreChat-AI/LibreChat"},"main":"dist/index.cjs","module":"dist/index.mjs","types":"./dist/index.d.cts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tailwind-preset":"./tailwind.preset.cjs","./theme.css":"./dist/tokens.css","./style.css":"./dist/style.css","./fonts/*":"./dist/fonts/*","./package.json":"./package.json"},"files":["dist","tailwind.preset.cjs"],"scripts":{"clean":"rimraf dist","b:clean":"bun run rimraf dist","build":"npm run clean && tsdown","build:dev":"npm run clean && NODE_ENV=development tsdown","b:build":"bun run b:clean && bun run tsdown","build:watch":"tsdown --watch","dev":"tsdown --watch","test":"jest","test:ci":"jest --ci"},"peerDependencies":{"@ariakit/react":"^0.4.29","@ariakit/react-components":"^0.1.2","@dicebear/collection":"^9.4.3","@dicebear/core":"^9.4.3","@headlessui/react":"^2.1.2","@radix-ui/react-accordion":"^1.2.20","@radix-ui/react-alert-dialog":"^1.1.23","@radix-ui/react-checkbox":"^1.3.11","@radix-ui/react-collapsible":"^1.1.20","@radix-ui/react-dialog":"^1.1.23","@radix-ui/react-direction":"^1.1.4","@radix-ui/react-dropdown-menu":"^2.1.24","@radix-ui/react-hover-card":"^1.1.23","@radix-ui/react-icons":"^1.3.0","@radix-ui/react-label":"^2.1.7","@radix-ui/react-popover":"^1.1.23","@radix-ui/react-progress":"^1.1.2","@radix-ui/react-radio-group":"^1.3.7","@radix-ui/react-select":"^2.3.7","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-slider":"^1.3.5","@radix-ui/react-slot":"^1.0.0","@radix-ui/react-switch":"^1.2.5","@radix-ui/react-tabs":"^1.1.21","@radix-ui/react-toast":"^1.2.23","@rc-component/mini-decimal":"^1.0.1","@react-spring/web":"^10.0.1","@tanstack/react-query":"^4.28.0 || ^5.0.0","@tanstack/react-table":"^8.11.7","@tanstack/react-virtual":"^3.0.0","class-variance-authority":"^0.7.1","clsx":"^2.1.1","dompurify":"^3.4.17","framer-motion":"^12.40.0","i18next":"^24.2.2 || ^25.3.2","i18next-browser-languagedetector":"^8.2.0","input-otp":"^1.4.2","jotai":"^2.12.5","librechat-data-provider":"*","lucide":"^0.525.0 || ^0.528.0","lucide-react":"^0.525.0 || ^0.528.0","match-sorter":"^8.1.0","morphicons":"^1.4.1","rc-input-number":"^7.4.2","react":"^18.2.0 || ^19.1.0","react-dom":"^18.2.0 || ^19.1.0","react-hook-form":"^7.56.4","react-i18next":"^15.4.0 || ^15.6.0","react-resizable-panels":"^4.7.4","react-textarea-autosize":"^8.4.0","tailwind-merge":"^3.7.0","tailwindcss":"^4.3.3","tailwindcss-animate":"^1.0.5"},"devDependencies":{"@babel/core":"^7.28.5","@babel/preset-env":"^7.29.5","@babel/preset-react":"^7.28.5","@babel/preset-typescript":"^7.28.5","@tanstack/react-query":"^4.28.0","@tanstack/react-table":"^8.21.3","@tanstack/react-virtual":"3.13.23","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^14.0.0","@tsdown/css":"^0.22.2","@types/jest":"^29.5.14","@types/react":"^18.2.11","@types/react-dom":"^18.2.4","babel-jest":"^30.2.0","caniuse-lite":"^1.0.30001741","i18next":"^24.2.3","identity-obj-proxy":"^3.0.0","jest":"^30.2.0","jest-environment-jsdom":"^30.2.0","jotai":"^2.12.5","js-yaml":"^4.3.2","librechat-data-provider":"*","lucide":"^0.528.0","lucide-react":"^0.528.0","morphicons":"^1.4.1","react":"^18.2.0","react-dom":"^18.2.0","react-i18next":"^15.4.0","rimraf":"^6.1.3","tailwindcss":"^4.3.3","tailwindcss-animate":"^1.0.5","tsdown":"^0.22.2","typescript":"^5.9.3"}},"isInternal":false,"tokens":1616,"sizeBytes":4321},{"name":"translation.json","path":"packages/client/src/locales/ar/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ar/translation.json","title":"Ar Skill","category":"anthropic-skill","format":"json","content":"# Ar Skill\n\nPath: `packages/client/src/locales/ar/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ar/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/ca/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ca/translation.json","title":"Ca Skill","category":"anthropic-skill","format":"json","content":"# Ca Skill\n\nPath: `packages/client/src/locales/ca/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ca/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/cs/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/cs/translation.json","title":"Cs Skill","category":"anthropic-skill","format":"json","content":"# Cs Skill\n\nPath: `packages/client/src/locales/cs/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/cs/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/da/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/da/translation.json","title":"Da Skill","category":"anthropic-skill","format":"json","content":"# Da Skill\n\nPath: `packages/client/src/locales/da/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/da/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/de/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/de/translation.json","title":"De Skill","category":"anthropic-skill","format":"json","content":"# De Skill\n\nPath: `packages/client/src/locales/de/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/de/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/en/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/en/translation.json","title":"En Skill","category":"anthropic-skill","format":"json","content":"# En Skill\n\nPath: `packages/client/src/locales/en/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/en/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/es/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/es/translation.json","title":"Es Skill","category":"anthropic-skill","format":"json","content":"# Es Skill\n\nPath: `packages/client/src/locales/es/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/es/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/et/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/et/translation.json","title":"Et Skill","category":"anthropic-skill","format":"json","content":"# Et Skill\n\nPath: `packages/client/src/locales/et/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/et/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/fa/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fa/translation.json","title":"Fa Skill","category":"anthropic-skill","format":"json","content":"# Fa Skill\n\nPath: `packages/client/src/locales/fa/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fa/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/fi/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fi/translation.json","title":"Fi Skill","category":"anthropic-skill","format":"json","content":"# Fi Skill\n\nPath: `packages/client/src/locales/fi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fi/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/fr/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fr/translation.json","title":"Fr Skill","category":"anthropic-skill","format":"json","content":"# Fr Skill\n\nPath: `packages/client/src/locales/fr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fr/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/he/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/he/translation.json","title":"He Skill","category":"anthropic-skill","format":"json","content":"# He Skill\n\nPath: `packages/client/src/locales/he/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/he/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/hu/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/hu/translation.json","title":"Hu Skill","category":"anthropic-skill","format":"json","content":"# Hu Skill\n\nPath: `packages/client/src/locales/hu/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/hu/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/id/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/id/translation.json","title":"Id Skill","category":"anthropic-skill","format":"json","content":"# Id Skill\n\nPath: `packages/client/src/locales/id/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/id/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/it/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/it/translation.json","title":"It Skill","category":"anthropic-skill","format":"json","content":"# It Skill\n\nPath: `packages/client/src/locales/it/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/it/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/ja/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ja/translation.json","title":"Ja Skill","category":"anthropic-skill","format":"json","content":"# Ja Skill\n\nPath: `packages/client/src/locales/ja/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ja/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/ka/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ka/translation.json","title":"Ka Skill","category":"anthropic-skill","format":"json","content":"# Ka Skill\n\nPath: `packages/client/src/locales/ka/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ka/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/ko/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ko/translation.json","title":"Ko Skill","category":"anthropic-skill","format":"json","content":"# Ko Skill\n\nPath: `packages/client/src/locales/ko/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ko/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/nl/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/nl/translation.json","title":"Nl Skill","category":"anthropic-skill","format":"json","content":"# Nl Skill\n\nPath: `packages/client/src/locales/nl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/nl/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/pl/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pl/translation.json","title":"Pl Skill","category":"anthropic-skill","format":"json","content":"# Pl Skill\n\nPath: `packages/client/src/locales/pl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pl/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/pt-BR/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-BR/translation.json","title":"Pt-BR Skill","category":"anthropic-skill","format":"json","content":"# Pt-BR Skill\n\nPath: `packages/client/src/locales/pt-BR/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-BR/translation.json)","tokens":300,"sizeBytes":216},{"name":"translation.json","path":"packages/client/src/locales/pt-PT/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-PT/translation.json","title":"Pt-PT Skill","category":"anthropic-skill","format":"json","content":"# Pt-PT Skill\n\nPath: `packages/client/src/locales/pt-PT/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-PT/translation.json)","tokens":300,"sizeBytes":216},{"name":"translation.json","path":"packages/client/src/locales/ru/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ru/translation.json","title":"Ru Skill","category":"anthropic-skill","format":"json","content":"# Ru Skill\n\nPath: `packages/client/src/locales/ru/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ru/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/sv/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/sv/translation.json","title":"Sv Skill","category":"anthropic-skill","format":"json","content":"# Sv Skill\n\nPath: `packages/client/src/locales/sv/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/sv/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/th/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/th/translation.json","title":"Th Skill","category":"anthropic-skill","format":"json","content":"# Th Skill\n\nPath: `packages/client/src/locales/th/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/th/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/tr/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/tr/translation.json","title":"Tr Skill","category":"anthropic-skill","format":"json","content":"# Tr Skill\n\nPath: `packages/client/src/locales/tr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/tr/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/vi/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/vi/translation.json","title":"Vi Skill","category":"anthropic-skill","format":"json","content":"# Vi Skill\n\nPath: `packages/client/src/locales/vi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/vi/translation.json)","tokens":300,"sizeBytes":207},{"name":"translation.json","path":"packages/client/src/locales/zh-Hans/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hans/translation.json","title":"Zh-Hans Skill","category":"anthropic-skill","format":"json","content":"# Zh-Hans Skill\n\nPath: `packages/client/src/locales/zh-Hans/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hans/translation.json)","tokens":300,"sizeBytes":222},{"name":"translation.json","path":"packages/client/src/locales/zh-Hant/translation.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hant/translation.json","title":"Zh-Hant Skill","category":"anthropic-skill","format":"json","content":"# Zh-Hant Skill\n\nPath: `packages/client/src/locales/zh-Hant/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/zh-Hant/translation.json)","tokens":300,"sizeBytes":222},{"name":"tsconfig.json","path":"packages/client/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/tsconfig.json","title":"Client Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"jsx\": \"react-jsx\",\n    \"jsxImportSource\": \"react\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"isolatedDeclarations\": true,\n    \"sourceMap\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"./dist\",\n    \"rootDir\": \"./src\",\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    },\n    \"lib\": [\"ES2020\", \"DOM\", \"DOM.Iterable\"],\n    \"resolveJsonModule\": true,\n    \"types\": [\"node\", \"vite/client\"],\n    \"noUncheckedSideEffectImports\": false\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\n    \"dist\",\n    \"node_modules\",\n    \"**/*.test.ts\",\n    \"**/*.test.tsx\",\n    \"**/*.spec.ts\",\n    \"**/*.spec.tsx\"\n  ]\n}\n","frontmatter":{"compilerOptions":{"target":"ES2020","module":"ESNext","moduleResolution":"bundler","jsx":"react-jsx","jsxImportSource":"react","declaration":true,"declarationMap":true,"declarationDir":"./dist/types","isolatedDeclarations":true,"sourceMap":true,"esModuleInterop":true,"allowSyntheticDefaultImports":true,"strict":true,"skipLibCheck":true,"forceConsistentCasingInFileNames":true,"outDir":"./dist","rootDir":"./src","paths":{"~/*":["./src/*"]},"lib":["ES2020","DOM","DOM.Iterable"],"resolveJsonModule":true,"types":["node","vite/client"],"noUncheckedSideEffectImports":false},"include":["src/**/*"],"exclude":["dist","node_modules","**/*.test.ts","**/*.test.tsx","**/*.spec.ts","**/*.spec.tsx"]},"isInternal":false,"tokens":266,"sizeBytes":893},{"name":"tsconfig.test.json","path":"packages/client/tsconfig.test.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/tsconfig.test.json","title":"Client Skill","category":"anthropic-skill","format":"json","content":"# Client Skill\n\nPath: `packages/client/tsconfig.test.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/tsconfig.test.json)","tokens":300,"sizeBytes":185},{"name":"package.json","path":"packages/data-provider/package.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/package.json","title":"librechat-data-provider","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"librechat-data-provider\",\n  \"version\": \"0.8.528\",\n  \"description\": \"data services for librechat apps\",\n  \"main\": \"dist/index.js\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/types/index.d.ts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\",\n      \"types\": \"./dist/types/index.d.ts\"\n    },\n    \"./react-query\": {\n      \"import\": \"./dist/react-query/index.mjs\",\n      \"require\": \"./dist/react-query/index.js\",\n      \"types\": \"./dist/types/react-query/index.d.ts\"\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown && tsc -p tsconfig.build.json\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci --logHeapUsage\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown && bun run tsc -p tsconfig.build.json\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"axios\": \"^1.20.0\",\n    \"croner\": \"^10.0.1\",\n    \"dayjs\": \"^1.11.13\",\n    \"js-yaml\": \"^4.3.2\",\n    \"re2js\": \"^2.8.6\",\n    \"zod\": \"^3.22.4\"\n  },\n  \"devDependencies\": {\n    \"@babel/preset-env\": \"^7.21.5\",\n    \"@babel/preset-react\": \"^7.18.6\",\n    \"@babel/preset-typescript\": \"^7.21.0\",\n    \"@rollup/plugin-replace\": \"^5.0.5\",\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/node\": \"^24.12.4\",\n    \"@types/react\": \"^18.2.18\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"openapi-types\": \"^12.1.3\",\n    \"rimraf\": \"^6.1.3\",\n    \"rollup\": \"^4.34.9\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\",\n    \"winston\": \"^3.17.0\"\n  },\n  \"peerDependencies\": {\n    \"@tanstack/react-query\": \"^4.28.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\"\n  }\n}\n","frontmatter":{"name":"librechat-data-provider","version":"0.8.528","description":"data services for librechat apps","main":"dist/index.js","module":"dist/index.mjs","types":"./dist/types/index.d.ts","sideEffects":false,"exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/types/index.d.ts"},"./react-query":{"import":"./dist/react-query/index.mjs","require":"./dist/react-query/index.js","types":"./dist/types/react-query/index.d.ts"}},"files":["dist"],"scripts":{"clean":"rimraf dist","build":"npm run clean && tsdown && tsc -p tsconfig.build.json","build:watch":"tsdown --watch","test":"jest --coverage --watch","test:ci":"jest --coverage --ci --logHeapUsage","verify":"npm run test:ci","b:clean":"bun run rimraf dist","b:build":"bun run b:clean && bun run tsdown && bun run tsc -p tsconfig.build.json"},"repository":{"type":"git","url":"https://github.com/LibreChat-AI/LibreChat"},"author":"","license":"ISC","bugs":{"url":"https://github.com/LibreChat-AI/LibreChat/issues"},"homepage":"https://librechat.ai","dependencies":{"axios":"^1.20.0","croner":"^10.0.1","dayjs":"^1.11.13","js-yaml":"^4.3.2","re2js":"^2.8.6","zod":"^3.22.4"},"devDependencies":{"@babel/preset-env":"^7.21.5","@babel/preset-react":"^7.18.6","@babel/preset-typescript":"^7.21.0","@rollup/plugin-replace":"^5.0.5","@types/jest":"^29.5.2","@types/js-yaml":"^4.0.9","@types/node":"^24.12.4","@types/react":"^18.2.18","jest":"^30.2.0","jest-junit":"^17.0.0","openapi-types":"^12.1.3","rimraf":"^6.1.3","rollup":"^4.34.9","tsdown":"^0.22.2","typescript":"^5.9.3","winston":"^3.17.0"},"peerDependencies":{"@tanstack/react-query":"^4.28.0"},"publishConfig":{"registry":"https://registry.npmjs.org/"}},"isInternal":false,"tokens":721,"sizeBytes":2081},{"name":"package-lock.json","path":"packages/data-provider/react-query/package-lock.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package-lock.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package-lock.json)","tokens":300,"sizeBytes":226},{"name":"package.json","path":"packages/data-provider/react-query/package.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package.json","title":"React-query Skill","category":"anthropic-skill","format":"json","content":"# React-query Skill\n\nPath: `packages/data-provider/react-query/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/react-query/package.json)","tokens":300,"sizeBytes":216},{"name":"tsconfig.json","path":"packages/data-provider/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/tsconfig.json","title":"Data-provider Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"declaration\": true,\n    \"declarationDir\": \"./dist/types\",\n    \"module\": \"esnext\",\n    \"noImplicitAny\": true,\n    \"outDir\": \"./types\",\n    \"target\": \"es5\",\n    \"moduleResolution\": \"bundler\",\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\"es2017\", \"dom\", \"ES2021.String\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"sourceMap\": true,\n    \"paths\": {\n      \"librechat-data-provider/react-query\": [\"./src/react-query/index.ts\"],\n      \"src/*\": [\"./src/*\"]\n    }\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"types\"],\n  \"include\": [\"src/**/*\", \"types/index.d.ts\", \"types/react-query/index.d.ts\"]\n}\n","frontmatter":{"compilerOptions":{"declaration":true,"declarationDir":"./dist/types","module":"esnext","noImplicitAny":true,"outDir":"./types","target":"es5","moduleResolution":"bundler","allowSyntheticDefaultImports":true,"lib":["es2017","dom","ES2021.String"],"allowJs":true,"skipLibCheck":true,"esModuleInterop":true,"strict":true,"forceConsistentCasingInFileNames":true,"resolveJsonModule":true,"isolatedModules":true,"noEmit":true,"sourceMap":true,"paths":{"librechat-data-provider/react-query":["./src/react-query/index.ts"],"src/*":["./src/*"]}},"exclude":["node_modules","dist","types"],"include":["src/**/*","types/index.d.ts","types/react-query/index.d.ts"]},"isInternal":false,"tokens":238,"sizeBytes":812},{"name":"tsconfig.spec.json","path":"packages/data-provider/tsconfig.spec.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-provider/tsconfig.spec.json","title":"Data-provider Skill","category":"anthropic-skill","format":"json","content":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","frontmatter":{"extends":"./tsconfig.json","compilerOptions":{"noEmit":true,"outDir":"./dist/tests"},"include":["specs/**/*","src/**/*"],"exclude":["node_modules","dist"]},"isInternal":false,"tokens":61,"sizeBytes":192},{"name":"ferretdb-multitenancy-plan.md","path":"packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md","title":"Ferretdb Skill","category":"anthropic-skill","format":"markdown","content":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/ferretdb-multitenancy-plan.md)","tokens":300,"sizeBytes":249},{"name":"tsconfig.json","path":"packages/data-schemas/misc/ferretdb/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/tsconfig.json","title":"Ferretdb Skill","category":"anthropic-skill","format":"json","content":"# Ferretdb Skill\n\nPath: `packages/data-schemas/misc/ferretdb/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/misc/ferretdb/tsconfig.json)","tokens":300,"sizeBytes":217},{"name":"package.json","path":"packages/data-schemas/package.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/package.json","title":"@librechat/data-schemas","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"@librechat/data-schemas\",\n  \"version\": \"0.0.75\",\n  \"description\": \"Mongoose schemas and models for LibreChat\",\n  \"type\": \"module\",\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"sideEffects\": false,\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./capabilities\": {\n      \"import\": {\n        \"types\": \"./dist/capabilities.d.mts\",\n        \"default\": \"./dist/admin/capabilities.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/capabilities.d.cts\",\n        \"default\": \"./dist/admin/capabilities.cjs\"\n      }\n    }\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"test\": \"jest --coverage --watch\",\n    \"test:ci\": \"jest --coverage --ci\",\n    \"verify\": \"npm run test:ci\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat/issues\"\n  },\n  \"homepage\": \"https://librechat.ai\",\n  \"dependencies\": {\n    \"mdast-util-directive\": \"^3.0.0\",\n    \"mdast-util-from-markdown\": \"^2.0.1\",\n    \"mdast-util-gfm\": \"^3.0.0\",\n    \"mdast-util-math\": \"^3.0.0\",\n    \"micromark-extension-directive\": \"^3.0.1\",\n    \"micromark-extension-gfm\": \"^3.0.0\",\n    \"micromark-extension-llm-math\": \"^3.1.0\",\n    \"micromark-util-decode-string\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^29.5.2\",\n    \"@types/node\": \"^24.12.4\",\n    \"jest\": \"^30.2.0\",\n    \"jest-junit\": \"^17.0.0\",\n    \"mongodb-memory-server\": \"^11.3.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"peerDependencies\": {\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"klona\": \"^2.0.6\",\n    \"librechat-data-provider\": \"*\",\n    \"lodash\": \"^4.17.23\",\n    \"meilisearch\": \"^0.38.0\",\n    \"mongoose\": \"^8.24.1\",\n    \"nanoid\": \"^3.3.18\",\n    \"winston\": \"^3.17.0\",\n    \"winston-daily-rotate-file\": \"^5.0.0\"\n  },\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\",\n    \"access\": \"public\"\n  },\n  \"keywords\": [\n    \"mongoose\",\n    \"schema\",\n    \"typescript\",\n    \"librechat\"\n  ]\n}\n","frontmatter":{"name":"@librechat/data-schemas","version":"0.0.75","description":"Mongoose schemas and models for LibreChat","type":"module","main":"dist/index.cjs","module":"dist/index.mjs","types":"./dist/index.d.cts","sideEffects":false,"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./capabilities":{"import":{"types":"./dist/capabilities.d.mts","default":"./dist/admin/capabilities.mjs"},"require":{"types":"./dist/capabilities.d.cts","default":"./dist/admin/capabilities.cjs"}}},"files":["dist"],"scripts":{"clean":"rimraf dist","build":"npm run clean && tsdown","build:watch":"tsdown --watch","test":"jest --coverage --watch","test:ci":"jest --coverage --ci","verify":"npm run test:ci","b:clean":"bun run rimraf dist","b:build":"bun run b:clean && bun run tsdown"},"repository":{"type":"git","url":"https://github.com/LibreChat-AI/LibreChat"},"author":"","license":"MIT","bugs":{"url":"https://github.com/LibreChat-AI/LibreChat/issues"},"homepage":"https://librechat.ai","dependencies":{"mdast-util-directive":"^3.0.0","mdast-util-from-markdown":"^2.0.1","mdast-util-gfm":"^3.0.0","mdast-util-math":"^3.0.0","micromark-extension-directive":"^3.0.1","micromark-extension-gfm":"^3.0.0","micromark-extension-llm-math":"^3.1.0","micromark-util-decode-string":"^2.0.0"},"devDependencies":{"@types/jest":"^29.5.2","@types/node":"^24.12.4","jest":"^30.2.0","jest-junit":"^17.0.0","mongodb-memory-server":"^11.3.0","rimraf":"^6.1.3","tsdown":"^0.22.2","typescript":"^5.9.3"},"peerDependencies":{"jsonwebtoken":"^9.0.2","klona":"^2.0.6","librechat-data-provider":"*","lodash":"^4.17.23","meilisearch":"^0.38.0","mongoose":"^8.24.1","nanoid":"^3.3.18","winston":"^3.17.0","winston-daily-rotate-file":"^5.0.0"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"keywords":["mongoose","schema","typescript","librechat"]},"isInternal":false,"tokens":839,"sizeBytes":2469},{"name":"tsconfig.build.json","path":"packages/data-schemas/tsconfig.build.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/tsconfig.build.json","title":"Data-schemas Skill","category":"anthropic-skill","format":"json","content":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": false,\n    \"declaration\": true,\n    \"declarationDir\": \"dist/types\",\n    \"outDir\": \"dist\"\n  },\n  \"exclude\": [\"node_modules\", \"dist\", \"**/*.spec.ts\"]\n}\n","frontmatter":{"extends":"./tsconfig.json","compilerOptions":{"noEmit":false,"declaration":true,"declarationDir":"dist/types","outDir":"dist"},"exclude":["node_modules","dist","**/*.spec.ts"]},"isInternal":false,"tokens":66,"sizeBytes":221},{"name":"tsconfig.json","path":"packages/data-schemas/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/tsconfig.json","title":"Data-schemas Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2019\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"bundler\",\n    \"declaration\": true,\n    \"isolatedDeclarations\": true,\n    \"noEmit\": true,\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"sourceMap\": true,\n    \"types\": [\"node\", \"jest\"],\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    }\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","frontmatter":{"compilerOptions":{"target":"ES2019","module":"ESNext","moduleResolution":"bundler","declaration":true,"isolatedDeclarations":true,"noEmit":true,"strict":true,"esModuleInterop":true,"allowSyntheticDefaultImports":true,"skipLibCheck":true,"forceConsistentCasingInFileNames":true,"resolveJsonModule":true,"sourceMap":true,"types":["node","jest"],"paths":{"~/*":["./src/*"]}},"include":["src/**/*"],"exclude":["node_modules","dist"]},"isInternal":false,"tokens":164,"sizeBytes":553},{"name":"tsconfig.spec.json","path":"packages/data-schemas/tsconfig.spec.json","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/tsconfig.spec.json","title":"Data-schemas Skill","category":"anthropic-skill","format":"json","content":"{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"noEmit\": true,\n    \"outDir\": \"./dist/tests\"\n  },\n  \"include\": [\"specs/**/*\", \"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","frontmatter":{"extends":"./tsconfig.json","compilerOptions":{"noEmit":true,"outDir":"./dist/tests"},"include":["specs/**/*","src/**/*"],"exclude":["node_modules","dist"]},"isInternal":false,"tokens":61,"sizeBytes":192},{"name":"README.md","path":"packages/client/src/theme/README.md","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/theme/README.md","title":"theme Documentation","category":"plugin-manifest","format":"markdown","content":"# theme Documentation\n\nPath: `packages/client/src/theme/README.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/theme/README.md)","tokens":300,"sizeBytes":194},{"name":"README.md","path":"packages/data-schemas/README.md","rawUrl":"https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/data-schemas/README.md","title":"data-schemas Documentation","category":"plugin-manifest","format":"markdown","content":"# LibreChat Data Schemas Package\n\nThis package provides the database schemas, models, types, and methods for LibreChat using Mongoose ODM.\n\n## 📁 Package Structure\n\n```\npackages/data-schemas/\n├── src/\n│   ├── schema/         # Mongoose schema definitions\n│   ├── models/         # Model factory functions\n│   ├── types/          # TypeScript type definitions\n│   ├── methods/        # Database operation methods\n│   ├── common/         # Shared constants and enums\n│   ├── config/         # Configuration files (winston, etc.)\n│   └── index.ts        # Main package exports\n```\n\n## 🏗️ Architecture Patterns\n\n### 1. Schema Files (`src/schema/`)\n\nSchema files define the Mongoose schema structure. They follow these conventions:\n\n- **Naming**: Use lowercase filenames (e.g., `user.ts`, `accessRole.ts`)\n- **Imports**: Import types from `~/types` for TypeScript support\n- **Exports**: Export only the schema as default\n\n**Example:**\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IUser } from '~/types';\n\nconst userSchema = new Schema<IUser>(\n  {\n    name: { type: String },\n    email: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default userSchema;\n```\n\n### 2. Type Definitions (`src/types/`)\n\nType files define TypeScript interfaces and types. They follow these conventions:\n\n- **Base Type**: Define a plain type without Mongoose Document properties\n- **Document Interface**: Extend the base type with Document and `_id`\n- **Enums/Constants**: Place related enums in the type file or `common/` if shared\n\n**Example:**\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type User = {\n  name?: string;\n  email: string;\n  // ... other fields\n};\n\nexport type IUser = User &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### 3. Model Factory Functions (`src/models/`)\n\nModel files create Mongoose models using factory functions. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Model`\n- **Singleton Pattern**: Check if model exists before creating\n- **Type Safety**: Use the corresponding interface from types\n\n**Example:**\n```typescript\nimport userSchema from '~/schema/user';\nimport type * as t from '~/types';\n\nexport function createUserModel(mongoose: typeof import('mongoose')) {\n  return mongoose.models.User || mongoose.model<t.IUser>('User', userSchema);\n}\n```\n\n### 4. Database Methods (`src/methods/`)\n\nMethod files contain database operations for each entity. They follow these conventions:\n\n- **Function Name**: `create[EntityName]Methods`\n- **Return Type**: Export a type for the methods object\n- **Operations**: Include CRUD operations and entity-specific queries\n\n**Example:**\n```typescript\nimport type { Model } from 'mongoose';\nimport type { IUser } from '~/types';\n\nexport function createUserMethods(mongoose: typeof import('mongoose')) {\n  async function findUserById(userId: string): Promise<IUser | null> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.findById(userId).lean();\n  }\n\n  async function createUser(userData: Partial<IUser>): Promise<IUser> {\n    const User = mongoose.models.User as Model<IUser>;\n    return await User.create(userData);\n  }\n\n  return {\n    findUserById,\n    createUser,\n    // ... other methods\n  };\n}\n\nexport type UserMethods = ReturnType<typeof createUserMethods>;\n```\n\n### 5. Main Exports (`src/index.ts`)\n\nThe main index file exports:\n- `createModels()` - Factory function for all models\n- `createMethods()` - Factory function for all methods\n- Type exports from `~/types`\n- Shared utilities and constants\n\n## 🚀 Adding a New Entity\n\nTo add a new entity to the data-schemas package, follow these steps:\n\n### Step 1: Create the Type Definition\n\nCreate `src/types/[entityName].ts`:\n\n```typescript\nimport type { Document, Types } from 'mongoose';\n\nexport type EntityName = {\n  /** Field description */\n  fieldName: string;\n  // ... other fields\n};\n\nexport type IEntityName = EntityName &\n  Document & {\n    _id: Types.ObjectId;\n  };\n```\n\n### Step 2: Update Types Index\n\nAdd to `src/types/index.ts`:\n\n```typescript\nexport * from './entityName';\n```\n\n### Step 3: Create the Schema\n\nCreate `src/schema/[entityName].ts`:\n\n```typescript\nimport { Schema } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nconst entityNameSchema = new Schema<IEntityName>(\n  {\n    fieldName: { type: String, required: true },\n    // ... other fields\n  },\n  { timestamps: true }\n);\n\nexport default entityNameSchema;\n```\n\n### Step 4: Create the Model Factory\n\nCreate `src/models/[entityName].ts`:\n\n```typescript\nimport entityNameSchema from '~/schema/entityName';\nimport type * as t from '~/types';\n\nexport function createEntityNameModel(mongoose: typeof import('mongoose')) {\n  return (\n    mongoose.models.EntityName || \n    mongoose.model<t.IEntityName>('EntityName', entityNameSchema)\n  );\n}\n```\n\n### Step 5: Update Models Index\n\nAdd to `src/models/index.ts`:\n\n1. Import the factory function:\n```typescript\nimport { createEntityNameModel } from './entityName';\n```\n\n2. Add to the return object in `createModels()`:\n```typescript\nEntityName: createEntityNameModel(mongoose),\n```\n\n### Step 6: Create Database Methods\n\nCreate `src/methods/[entityName].ts`:\n\n```typescript\nimport type { Model, Types } from 'mongoose';\nimport type { IEntityName } from '~/types';\n\nexport function createEntityNameMethods(mongoose: typeof import('mongoose')) {\n  async function findEntityById(id: string | Types.ObjectId): Promise<IEntityName | null> {\n    const EntityName = mongoose.models.EntityName as Model<IEntityName>;\n    return await EntityName.findById(id).lean();\n  }\n\n  // ... other methods\n\n  return {\n    findEntityById,\n    // ... other methods\n  };\n}\n\nexport type EntityNameMethods = ReturnType<typeof createEntityNameMethods>;\n```\n\n### Step 7: Update Methods Index\n\nAdd to `src/methods/index.ts`:\n\n1. Import the methods:\n```typescript\nimport { createEntityNameMethods, type EntityNameMethods } from './entityName';\n```\n\n2. Add to the return object in `createMethods()`:\n```typescript\n...createEntityNameMethods(mongoose),\n```\n\n3. Add to the `AllMethods` type:\n```typescript\nexport type AllMethods = UserMethods &\n  // ... other methods\n  EntityNameMethods;\n```\n\n## 📝 Best Practices\n\n1. **Consistent Naming**: Use lowercase for filenames, PascalCase for types/interfaces\n2. **Type Safety**: Always use TypeScript types, avoid `any`\n3. **JSDoc Comments**: Document complex fields and methods\n4. **Indexes**: Define database indexes in schema files for query performance\n5. **Validation**: Use Mongoose schema validation for data integrity\n6. **Lean Queries**: Use `.lean()` for read operations when you don't need Mongoose document methods\n\n## 🔧 Common Patterns\n\n### Enums and Constants\n\nPlace shared enums in `src/common/`:\n\n```typescript\n// src/common/permissions.ts\nexport enum PermissionBits {\n  VIEW = 1,\n  EDIT = 2,\n  DELETE = 4,\n  SHARE = 8,\n}\n```\n\n### Compound Indexes\n\nFor complex queries, add compound indexes:\n\n```typescript\nschema.index({ field1: 1, field2: 1 });\nschema.index(\n  { uniqueField: 1 },\n  { \n    unique: true, \n    partialFilterExpression: { uniqueField: { $exists: true } }\n  }\n);\n```\n\n### Virtual Properties\n\nAdd computed properties using virtuals:\n\n```typescript\nschema.virtual('fullName').get(function() {\n  return `${this.firstName} ${this.lastName}`;\n});\n```\n\n## 🧪 Testing\n\nWhen adding new entities, ensure:\n- Types compile without errors\n- Models can be created successfully\n- Methods handle edge cases (null checks, validation)\n- Indexes are properly defined for query patterns\n\n## 📚 Resources\n\n- [Mongoose Documentation](https://mongoosejs.com/docs/)\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/)\n- [MongoDB Indexes](https://docs.mongodb.com/manual/indexes/) ","isInternal":false,"tokens":1832,"sizeBytes":7868}],"systemPromptSnippet":"<yakaai_skills repo=\"danny-avila/LibreChat\">\n<!-- File: AGENTS.md (Tokens: ~3320 | Category: root-instruction) -->\n# LibreChat contributor and agent guidance\n\n`AGENTS.md` is the repository's contributor guidance. Backend code lives in `packages/api`\n(TypeScript) and `packages/data-schemas` (database methods); `api` is legacy Express wiring.\nShared API types and services live in `packages/data-provider`, and the React app lives in\n`client` with shared primitives in `packages/client`. Chat state, transport and message components\nare moving into `packages/chat` (`@librechat/chat`), which never imports the app.\n\n## Branching and pull requests\n\nNormally branch off `dev` and target `dev`; `gh pr create` defaults to `main`, so pass `--base dev`\nexplicitly. `main` is the released branch, kept as a fast-forward of `dev` and synced as-is — never\nopen a backport pull request to `main`, because anything merged to `dev` reaches it at the next\nsync. Pull requests opened against `main` are retargeted automatically.\n\n**Maintainer-directed canary exception:** Experimental work, or a PR ready to merge after review but\nnot yet suitable for the next `main` sync, may instead target `canary`. The maintainer may choose\nthis before work starts or while reviewing a stale PR. For new canary work, branch from the current\n`origin/canary` and pass `--base canary` explicitly; do not silently retarget an existing PR or\npromote canary code to `dev`. If a stale PR is redirected to canary, first check its base, diff and\nreviewed head against current canary; coordinate any rebase or new PR with the maintainer. A PR\nexplicitly based on `canary` stays there; the main-to-dev retarget workflow does not move it.\n\nStill link related issues in the PR (for example, `Related to #N`) so the work remains\ntraceable. `Fixes #N` does not close an issue on a `dev` or `canary` merge — GitHub honors closing\nkeywords only on the default branch. Close resolved issues by hand after merging. Worktrees share\none stash stack, so never use a bare `git stash pop`. Prefer a WIP commit; if a stash is necessary,\napply the specific tagged entry. The `target: main` label and release-bound upstream branches are\nexempt from the main-to-dev retarget workflow; do not use either to backport ordinary work.\n\nWrite the description for a reader who has not followed the branch: what breaks, what triggers it,\nhow it behaves after the change, then one or two views of the mechanism — a focused diff, a call\ntree, a shallow file tree, or a Mermaid sequence. Keep only what the change carries, and describe\nthe code as it stands rather than narrating earlier commits or review rounds. Naming the merged\npull request that caused the bug is not the same thing; that is history the reader needs. The\nformats and examples live in `.github/pull_request_template.md`.\n\n## Review and completion\n\nRead the inline review threads themselves — a summary comment or notification list omits findings.\nAudit each one against the current code, fix what is valid, and reject what is obsolete in a reply\nthat says why. After each round: focused tests, `npx tsc --noEmit` in every workspace you changed,\npush, then request the next review naming the pull request's exact remote head — a clean review of\nan earlier head says nothing about what you just pushed, and CI runs on its own clock. Reply on\neach resolved thread with the resolving commit and evidence. After two actionable rounds, stop\npatching thread by thread and read the subsystem by invariant instead: identity, authorization,\npersistence, retry, cancellation, cleanup and mixed-version behavior where relevant. Which reviewer\nand what phrase triggers it will change; that the review must cover the exact pushed head will not.\n\nA clean review is one completion signal, not the definition of done. Ship the observable experience\n— loading, empty, success, failure, cancellation, retry, restored session — with strings localized,\naccessibility intact, defaults and stored data preserved, and no backend capability left without a\nfrontend entry point. Keep fixes small and test the missed behavior. Report the pushed head, what you\nran locally, CI state, the review result at that head, any finding you rejected with the reasoning,\nand checks you could not run.\n\n## Verification\n\nFor startup, auth, config, file, or message-loading changes, avoid serial database\nreads and reuse loaded request data. Run `npm run lighthouse` before completion:\nthe CI lane adds 250 ms per Mongo query and checks the visible conversation's LCP.\nSee [budgets, reproduction and failure diagnosis](e2e/lighthouse/README.md).\n\nA green build is not a typecheck: `packages/api`, `packages/client`, `packages/chat` and `packages/data-schemas` build\nwith `tsdown`, which emits without checking types. Run `npx tsc --noEmit` in the workspace you\nchanged. `packages/client` excludes `*.spec.ts(x)` and `*.test.ts(x)` from typechecking entirely.\n`npm run sort-imports` with no arguments rewrites every source root — pass the paths you touched.\nRun `npm run static-checks -- --against origin/dev` to reproduce the PR's static checks; use\n`npm run static-checks:full` for the slower gates. Fix all formatting, lint, and TypeScript\nwarnings/errors in the code you change.\n\n## Module boundaries and configuration\n\nAll new backend behavior belongs in TypeScript under `packages/api`; database-specific shared logic\nbelongs in `packages/data-schemas`, and frontend/backend shared API logic belongs in\n`packages/data-provider`. Build data-provider from the project root with `npm run build:data-provider`.\n\n`/api` holds wiring, not behavior. When a change would add logic to a CJS file there — a branch, a\nhelper, a validation step, a service call — the logic belongs in `packages/api`, and the JS file\nkeeps requires, route registration and the call into the TS module (`MCPRequestContext.js` is the\nshape, thirteen lines of re-export). \"Minimum\" means how much behavior `/api` gains, not how small\nthe diff is, and the rule applies to editing existing CJS, which is the common case.\n\nDatabase contracts belong to `packages/data-schemas`. Keep Mongoose types (`FilterQuery`,\n`Types.ObjectId`, `Document`) out of exported signatures in `packages/api`, `packages/data-provider`\nand `client`, because they make the storage engine part of that module's public API. Take and return\nplain typed objects and express the query behind a data-schemas method. The boundary already leaks\nacross `packages/api`, so stop widening it rather than rewriting what exists; the client carries none\nof it and must stay that way.\n\nNew levers ship configurable: a limit, timeout, toggle or capability introduced in code earns a field\non `configSchema` (`packages/data-provider/src/config.ts`) so it can be set in `librechat.yaml`, with\na default that reproduces today's behavior. Hard-coded constants and env-only switches need a reason.\nModules take their dependencies rather than reaching for them: code in `packages/api` receives its\nconfig, database methods and clients from the caller, the way `createModels(mongoose)` receives the\napp's connection, instead of importing app singletons or reading global state. Integrations (provider\nSDKs, storage backends, vector stores, OAuth servers) arrive through an interface the caller\nsupplies, so a second implementation is a new argument instead of a new branch. The static singletons\nunder `packages/api/src/mcp` are the shape to stop extending, not a pattern to copy. This is the\nbackend half of client state ownership: pass it in, do not reach for it.\n\n## Service failures and user-facing errors\n\nThis section applies to backend services (`packages/api`) and database methods/repositories\n(`packages/data-schemas`), not to React components. For new or substantially changed code in\nthose layers, choose failure behavior at the contract boundary instead of treating every\nunsuccessful outcome as an exception:\n\n- Return a plain value on success. Use `null` only for a documented absence (for example, a\n  successful lookup with no record), never to hide a query failure.\n- For an expected failure the caller can handle without aborting the operation, prefer a typed\n  discriminated result such as `{ ok: true; value: T } | { ok: false; error: { code: string;\nmessage?: string } }`. Keep an existing domain-specific result shape when changing it would\n  break callers; do not introduce interchangeable `ok`, `valid`, and bare `{ message }` contracts\n  in the same service. Codes should be stable, machine-readable identifiers when the caller\n  needs to distinguish failures. Internal validation helpers may use the existing local pattern.\n- Throw for unexpected operational failures (database, provider, network) and violated invariants.\n  Use a typed/coded error when a boundary must recognize a particular failure. Catch where you can\n  recover or translate it; otherwise let it reach the owning request or job boundary. Do not catch\n  an exception and return a truthy record, `null`, or `{ message }` in its place: callers can then\n  mistake an outage for data or send it as an HTTP 200. Keep separate migrations for existing\n  contracts, with their callers and tests, rather than changing wire shapes incidentally.\n- At the HTTP, stream, or job boundary, map failures to the existing status and response contract.\n  Only expose intentionally approved codes and helpful user-safe information. Error disclosure is\n  a security boundary: never forward raw exceptions, stacks, query text, credentials, request\n  bodies, headers, provider payloads, or arbitrary `error.message` to a client or persisted\n  user-visible status. Sanitize diagnostics and log only what the path can safely retain. For\n  errors that may echo submitted content, prefer `getSafeErrorMetadata` over error text;\n  `packages/api/src/utils/errors.ts` documents when redacted error text is appropriate.\n- Localization is a UI responsibility, not a database-method return shape. When a failure reaches\n  a user-facing surface, expose a safe, stable code the UI can map to localized, actionable copy\n  and a fallback. See `client/src/components/Messages/Content/Error/registry.ts` and\n  `client/src/components/Chat/Trace/Viewer.tsx`. Keep any intentionally disclosed provider detail\n  behind its existing protection policy rather than treating arbitrary upstream text as safe.\n\nExamples of local contracts, not a mandate to copy their shapes: `packages/api/src/admin/auditLog.ts`\nuses a parsing result, `packages/api/src/agents/openai/service.ts` validates before mapping to an\nOpenAI-compatible response, and `packages/api/src/skills/sync/errors.ts` names a sync failure by\nstable code. `packages/data-schemas/src/methods/prompt.ts` currently returns `{ message }` on query\nfailure; do not extend that pattern. Test absence versus failure, the boundary's non-success response,\nand that sensitive diagnostics cannot reach a user-visible surface.\n\n## Frontend theming and styling\n\nFor frontend work, compose existing `@librechat/client` primitives and variants before adding\nfeature-local styles. Use semantic theme/Tailwind roles for color and shared appearance; do not\nintroduce raw palette utilities, hard-coded colors, or arbitrary theme CSS. If the system cannot\nexpress a reusable design need, deepen the shared primitive or versioned theme-token registry\ninstead of copying classes into a feature. Theme definitions select semantic colors and appearance,\nnot selectors, app behavior, or alternate layouts. Keep genuine layout and behavior local, and\nexplain why any new custom CSS cannot use shared primitives. Support light/dark and reduced motion;\npreserve defaults and test a deliberately different reference theme for reusable new variants.\n\n## Backend auth cache\n\nWhen adding or changing code that mutates user documents, invalidate the auth user document cache\nfor affected users, including bulk role and user mutations. Otherwise burst-cached JWT requests can\nserve a stale `req.user` until the cache expires.\n\n## Client state ownership\n\nThe client is migrating from Recoil to Jotai. New state is always Jotai, even in a file that already\nimports Recoil; many files import both, so mixed imports say nothing about which to use. For existing\nstate the unit of conversion is one atom plus every file that reads or writes it, because an atom\ncannot be half converted — convert the areas you touch, not the whole store.\nSplit by ownership: state a feature both writes and reads is feature-owned, so convert it to Jotai\nand keep it inside the feature; app-global preferences and shell state a feature merely consumes\n(`maximizeChatSpace`, `showScrollButton`, `enterToSend`, artifact visibility) must be passed in\nthrough props or a small host-supplied context rather than reached for through `~/store`; when a\nconsumer sits outside the feature you are changing, leave that atom on Recoil and pass it in. Passing\nthem in is what lets a feature move to its own workspace later without a rewrite, and it keeps the\nJotai conversion scoped to the state a feature owns. For persisted atoms, use the helpers in\n`client/src/store/jotai-utils.ts`.\n\n## Code style and performance\n\nUse short, single-word file names when possible; group related modules in a single-word directory.\nPrefer flat early returns, pure functions, and explicit types. Avoid `any`, broad `unknown`/casts,\nduplicated types, and dynamic imports. Extract genuinely repeated logic instead of copying it;\nwrite comments only for non-obvious behavior or public API contracts.\n\nImports have three sections: package values (shortest line first, with `react` first), `import type`\n(longest line first, package types before local types), and local/project values (longest line first).\nUse standalone `import type { ... }`, not inline `type` within a value import. Run the scoped\nimport sorter on files you change.\n\nAvoid extra passes over shared message arrays and unnecessary allocations. For startup and\nrequest paths, reuse already-loaded user/config data, avoid serial database reads, and start\nindependent reads in parallel. Do not weaken authorization or tenant checks or write a response\nbefore those checks succeed.\n\n## Frontend rules\n\nUse the chat Share/Export action-menu pattern: `DropdownPopup` from `@librechat/client` with\n`Ariakit.MenuButton` (see `HeaderMenu.tsx` and `useExportShare.tsx`). Never introduce or reintroduce\nthe Radix `DropdownMenu` family for app action or sort menus. Preserve the Share/Export\ndialog-item contract (`hideOnClick: false`, item ref, button render, and dialog `triggerRef`)\nwhen a menu action opens a dialog.\n\nUse `useLocalize()` for all visible copy and update only English keys in\n`client/src/locales/en/translation.json`. Use semantic HTML, keyboard behavior, and ARIA labels.\nUse React Query for API interactions and invalidate related queries after mutations; define query\nand mutation keys in `packages/data-provider/src/keys.ts`. Put shared endpoint definitions, types,\nand data services in `packages/data-provider`, and encode dynamic URL parameters. Cover loading,\nsuccess, and failure states in focused component tests.\n\n## Testing\n\nRun focused Jest tests from the owning workspace, not the entire monorepo. Prefer real logic and\nspies over mocked internals; use `mongodb-memory-server` for database queries and the real MCP SDK\nfor MCP behavior. Mock only external HTTP APIs or uncontrollable services. For frontend tests use\nthe component's colocated `__tests__` and `test/layout-test-utils` where applicable.\n\n<!-- File: api/app/clients/tools/manifest.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Tools Skill\n\nPath: `api/app/clients/tools/manifest.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/api/app/clients/tools/manifest.json)\n\n<!-- File: packages/api/package.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/package.json)\n\n<!-- File: packages/api/tsconfig.build.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/tsconfig.build.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.build.json)\n\n<!-- File: packages/api/tsconfig.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/tsconfig.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.json)\n\n<!-- File: packages/api/tsconfig.spec.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Api Skill\n\nPath: `packages/api/tsconfig.spec.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/api/tsconfig.spec.json)\n\n<!-- File: packages/client/package.json (Tokens: ~1616 | Category: anthropic-skill) -->\n{\n  \"name\": \"@librechat/client\",\n  \"version\": \"0.4.83\",\n  \"description\": \"React components for LibreChat\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/LibreChat-AI/LibreChat\"\n  },\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"./dist/index.d.cts\",\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.cts\",\n        \"default\": \"./dist/index.cjs\"\n      }\n    },\n    \"./tailwind-preset\": \"./tailwind.preset.cjs\",\n    \"./theme.css\": \"./dist/tokens.css\",\n    \"./style.css\": \"./dist/style.css\",\n    \"./fonts/*\": \"./dist/fonts/*\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"tailwind.preset.cjs\"\n  ],\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"b:clean\": \"bun run rimraf dist\",\n    \"build\": \"npm run clean && tsdown\",\n    \"build:dev\": \"npm run clean && NODE_ENV=development tsdown\",\n    \"b:build\": \"bun run b:clean && bun run tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"dev\": \"tsdown --watch\",\n    \"test\": \"jest\",\n    \"test:ci\": \"jest --ci\"\n  },\n  \"peerDependencies\": {\n    \"@ariakit/react\": \"^0.4.29\",\n    \"@ariakit/react-components\": \"^0.1.2\",\n    \"@dicebear/collection\": \"^9.4.3\",\n    \"@dicebear/core\": \"^9.4.3\",\n    \"@headlessui/react\": \"^2.1.2\",\n    \"@radix-ui/react-accordion\": \"^1.2.20\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-checkbox\": \"^1.3.11\",\n    \"@radix-ui/react-collapsible\": \"^1.1.20\",\n    \"@radix-ui/react-dialog\": \"^1.1.23\",\n    \"@radix-ui/react-direction\": \"^1.1.4\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.24\",\n    \"@radix-ui/react-hover-card\": \"^1.1.23\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@radix-ui/react-label\": \"^2.1.7\",\n    \"@radix-ui/react-popover\": \"^1.1.23\",\n    \"@radix-ui/react-progress\": \"^1.1.2\",\n    \"@radix-ui/react-radio-group\": \"^1.3.7\",\n    \"@radix-ui/react-select\": \"^2.3.7\",\n    \"@radix-ui/react-separator\": \"^1.1.7\",\n    \"@radix-ui/react-slider\": \"^1.3.5\",\n    \"@radix-ui/react-slot\": \"^1.0.0\",\n    \"@radix-ui/react-switch\": \"^1.2.5\",\n    \"@radix-ui/react-tabs\": \"^1.1.21\",\n    \"@radix-ui/react-toast\": \"^1.2.23\",\n    \"@rc-component/mini-decimal\": \"^1.0.1\",\n    \"@react-spring/web\": \"^10.0.1\",\n    \"@tanstack/react-query\": \"^4.28.0 || ^5.0.0\",\n    \"@tanstack/react-table\": \"^8.11.7\",\n    \"@tanstack/react-virtual\": \"^3.0.0\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"dompurify\": \"^3.4.17\",\n    \"framer-motion\": \"^12.40.0\",\n    \"i18next\": \"^24.2.2 || ^25.3.2\",\n    \"i18next-browser-languagedetector\": \"^8.2.0\",\n    \"input-otp\": \"^1.4.2\",\n    \"jotai\": \"^2.12.5\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.525.0 || ^0.528.0\",\n    \"lucide-react\": \"^0.525.0 || ^0.528.0\",\n    \"match-sorter\": \"^8.1.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"rc-input-number\": \"^7.4.2\",\n    \"react\": \"^18.2.0 || ^19.1.0\",\n    \"react-dom\": \"^18.2.0 || ^19.1.0\",\n    \"react-hook-form\": \"^7.56.4\",\n    \"react-i18next\": \"^15.4.0 || ^15.6.0\",\n    \"react-resizable-panels\": \"^4.7.4\",\n    \"react-textarea-autosize\": \"^8.4.0\",\n    \"tailwind-merge\": \"^3.7.0\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.28.5\",\n    \"@babel/preset-env\": \"^7.29.5\",\n    \"@babel/preset-react\": \"^7.28.5\",\n    \"@babel/preset-typescript\": \"^7.28.5\",\n    \"@tanstack/react-query\": \"^4.28.0\",\n    \"@tanstack/react-table\": \"^8.21.3\",\n    \"@tanstack/react-virtual\": \"3.13.23\",\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@tsdown/css\": \"^0.22.2\",\n    \"@types/jest\": \"^29.5.14\",\n    \"@types/react\": \"^18.2.11\",\n    \"@types/react-dom\": \"^18.2.4\",\n    \"babel-jest\": \"^30.2.0\",\n    \"caniuse-lite\": \"^1.0.30001741\",\n    \"i18next\": \"^24.2.3\",\n    \"identity-obj-proxy\": \"^3.0.0\",\n    \"jest\": \"^30.2.0\",\n    \"jest-environment-jsdom\": \"^30.2.0\",\n    \"jotai\": \"^2.12.5\",\n    \"js-yaml\": \"^4.3.2\",\n    \"librechat-data-provider\": \"*\",\n    \"lucide\": \"^0.528.0\",\n    \"lucide-react\": \"^0.528.0\",\n    \"morphicons\": \"^1.4.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-i18next\": \"^15.4.0\",\n    \"rimraf\": \"^6.1.3\",\n    \"tailwindcss\": \"^4.3.3\",\n    \"tailwindcss-animate\": \"^1.0.5\",\n    \"tsdown\": \"^0.22.2\",\n    \"typescript\": \"^5.9.3\"\n  }\n}\n\n<!-- File: packages/client/src/locales/ar/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ar Skill\n\nPath: `packages/client/src/locales/ar/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ar/translation.json)\n\n<!-- File: packages/client/src/locales/ca/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ca Skill\n\nPath: `packages/client/src/locales/ca/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ca/translation.json)\n\n<!-- File: packages/client/src/locales/cs/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Cs Skill\n\nPath: `packages/client/src/locales/cs/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/cs/translation.json)\n\n<!-- File: packages/client/src/locales/da/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Da Skill\n\nPath: `packages/client/src/locales/da/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/da/translation.json)\n\n<!-- File: packages/client/src/locales/de/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# De Skill\n\nPath: `packages/client/src/locales/de/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/de/translation.json)\n\n<!-- File: packages/client/src/locales/en/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# En Skill\n\nPath: `packages/client/src/locales/en/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/en/translation.json)\n\n<!-- File: packages/client/src/locales/es/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Es Skill\n\nPath: `packages/client/src/locales/es/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/es/translation.json)\n\n<!-- File: packages/client/src/locales/et/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Et Skill\n\nPath: `packages/client/src/locales/et/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/et/translation.json)\n\n<!-- File: packages/client/src/locales/fa/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Fa Skill\n\nPath: `packages/client/src/locales/fa/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fa/translation.json)\n\n<!-- File: packages/client/src/locales/fi/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Fi Skill\n\nPath: `packages/client/src/locales/fi/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fi/translation.json)\n\n<!-- File: packages/client/src/locales/fr/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Fr Skill\n\nPath: `packages/client/src/locales/fr/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/fr/translation.json)\n\n<!-- File: packages/client/src/locales/he/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# He Skill\n\nPath: `packages/client/src/locales/he/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/he/translation.json)\n\n<!-- File: packages/client/src/locales/hu/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Hu Skill\n\nPath: `packages/client/src/locales/hu/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/hu/translation.json)\n\n<!-- File: packages/client/src/locales/id/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Id Skill\n\nPath: `packages/client/src/locales/id/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/id/translation.json)\n\n<!-- File: packages/client/src/locales/it/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# It Skill\n\nPath: `packages/client/src/locales/it/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/it/translation.json)\n\n<!-- File: packages/client/src/locales/ja/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ja Skill\n\nPath: `packages/client/src/locales/ja/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ja/translation.json)\n\n<!-- File: packages/client/src/locales/ka/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ka Skill\n\nPath: `packages/client/src/locales/ka/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ka/translation.json)\n\n<!-- File: packages/client/src/locales/ko/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ko Skill\n\nPath: `packages/client/src/locales/ko/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ko/translation.json)\n\n<!-- File: packages/client/src/locales/nl/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Nl Skill\n\nPath: `packages/client/src/locales/nl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/nl/translation.json)\n\n<!-- File: packages/client/src/locales/pl/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Pl Skill\n\nPath: `packages/client/src/locales/pl/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pl/translation.json)\n\n<!-- File: packages/client/src/locales/pt-BR/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Pt-BR Skill\n\nPath: `packages/client/src/locales/pt-BR/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-BR/translation.json)\n\n<!-- File: packages/client/src/locales/pt-PT/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Pt-PT Skill\n\nPath: `packages/client/src/locales/pt-PT/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/pt-PT/translation.json)\n\n<!-- File: packages/client/src/locales/ru/translation.json (Tokens: ~300 | Category: anthropic-skill) -->\n# Ru Skill\n\nPath: `packages/client/src/locales/ru/translation.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/danny-avila/LibreChat/HEAD/packages/client/src/locales/ru/translation.json)\n\n<!-- ... +21 more modular skills available via /api/skills/danny-avila/LibreChat?path={path} -->\n</yakaai_skills>"}