Files
lobehub__lobehub/package.json
Arvin Xu 1e8767eb2a ♻️ refactor(mecha): extract agent config resolution into a shared package (#19476)
There are two Mecha layers doing the same job against different data sources.
The browser assembles an agent's effective run config in
`src/services/chat/mecha` (~2300 lines including its context builder); the
server assembles the same thing in `apps/server/src/modules/Mecha` plus an
851-line `serverCallLlmContextBuilder` that inlines the resolution alongside
reads of six database models. Both wrap the same shared `MessagesEngine`, and
the primitives underneath (`getActivePluginIds`, `ToolResolver`,
`resolveTopicReferences`) were extracted long ago — only the orchestration
above them was left duplicated.

Spot-checked rather than inferred from size: both sides independently compute
`enabledToolIds`, `enabledManifests` and the merged `systemRole` from an agent
config, producing the same shape from different sources.

This moves the browser's resolution rules into `@lobechat/mecha` unchanged,
behind an `AgentConfigSnapshot` of everything they previously read from
Zustand. The browser now gathers that snapshot — 76 lines — and delegates.
Nothing else changes: the barrel re-exports the same names, so no call site
moved, and `getTargetAgentId` stays behind because it reads the active agent.

The package takes the name both hosts already use for this layer, because the
rest of it follows: context engineering, tool composition and model-parameter
resolution are duplicated the same way and belong in the same home. A resolver
is the first inhabitant, not the whole tenancy.

It is a package of its own rather than part of `@lobechat/agent-runtime`
because the runtime keeps exactly three runtime dependencies — everything
heavy is type-only — and that is what let the CLI adopt it. These rules need
`builtin-agents`, which alone pulls in eight builtin-tool packages. Folding
them in would invert the property that makes the runtime portable. The runtime
also never resolves config; it reads `state.metadata.agentConfig` as an opaque
cast for a single field, so resolution belongs to the host that starts it.

`canManage` is an input rather than something the rules compute. The browser
answers it from the cache its picker populates and the server from
`isResourceAuthorOrAdmin`, which is asynchronous — a seam that only works if
the decision arrives already made.

Behaviour is pinned by the existing suite: all 77 of
`agentConfigResolver.test.ts` pass untouched, and they mock the stores, so they
exercise the new gathering and the extracted rules end to end. The package also
has its own suite that builds the snapshot by hand and never mocks a store, so
a store read creeping back in fails there even while the client tests still
pass.

The server and a device adopt this in later PRs — one host at a time, so a
regression stays attributable. For the device the payoff is the point: its
context port stops being an 851-line problem and becomes a snapshot to fill.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 18:16:27 +08:00

593 lines
24 KiB
JSON

{
"name": "@lobehub/lobehub",
"version": "2.2.17",
"description": "LobeHub - an open-source,comprehensive AI Agent framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
"keywords": [
"framework",
"chatbot",
"chatgpt",
"nextjs",
"vercel-ai",
"openai",
"azure-openai",
"visual-model",
"tts",
"stt"
],
"homepage": "https://github.com/lobehub/lobehub",
"bugs": {
"url": "https://github.com/lobehub/lobehub/issues/new/choose"
},
"repository": {
"type": "git",
"url": "https://github.com/lobehub/lobehub.git"
},
"license": "MIT",
"author": "LobeHub <i@lobehub.com>",
"sideEffects": [
"./src/initialize.ts",
"./src/libs/providerIcon.ts",
"./src/spa/entry.auth.tsx",
"./src/spa/entry.desktop.tsx",
"./src/spa/entry.mobile.tsx",
"./src/spa/entry.popup.tsx",
"./src/spa/entry.web.tsx"
],
"workspaces": [
"packages/*",
"packages/business/*",
"e2e",
"apps/desktop/src/main",
"apps/share",
"apps/workbench"
],
"scripts": {
"build": "bun run build:spa && bun run build:spa:auth && bun run build:spa:workbench && bun run build:spa:share && bun run build:spa:copy && bun run build:next",
"build:analyze": "cross-env NODE_OPTIONS=--max-old-space-size=81920 next experimental-analyze",
"build:docker": "pnpm run build:spa && pnpm run build:spa:mobile && pnpm run build:spa:auth && pnpm run build:spa:workbench && pnpm run build:spa:share && cross-env WORKBENCH_REQUIRED=1 SHARE_REQUIRED=1 pnpm run build:spa:copy && cross-env NODE_OPTIONS=--max-old-space-size=8192 DOCKER=true next build",
"build:next": "cross-env NODE_OPTIONS=--max-old-space-size=7168 bun run build:next:raw",
"build:next:raw": "next build",
"build:raw": "bun run build:spa:raw && bun run build:spa:auth && bun run build:spa:workbench && bun run build:spa:share && bun run build:spa:copy && bun run build:next:raw",
"build:spa": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm run build:spa:raw",
"build:spa:auth": "rm -rf public/_spa public/_spa-auth && cross-env NODE_OPTIONS=--max-old-space-size=8192 AUTH=true vite build",
"build:spa:copy": "tsx scripts/copySpaBuild.mts && tsx scripts/generateSpaTemplates.mts",
"build:spa:mobile": "cross-env NODE_OPTIONS=--max-old-space-size=8192 MOBILE=true vite build",
"build:spa:raw": "rm -rf public/_spa && vite build",
"build:spa:share": "rm -rf dist/share public/_spa-share && cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm --filter @lobehub/share build",
"build:spa:workbench": "rm -rf dist/workbench public/_spa-workbench && cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm --filter @lobehub/workbench build",
"build:vercel": "cross-env-shell NODE_OPTIONS=--max-old-space-size=8192 \"bun run build:raw && bun run db:migrate\"",
"build-migrate-db": "bun run db:migrate",
"check": "bun run .agents/scripts/check/cli.ts",
"clean:node_modules": "bash -lc 'set -e; echo \"Removing all node_modules...\"; rm -rf node_modules; pnpm -r exec rm -rf node_modules; rm -rf apps/desktop/node_modules; echo \"All node_modules removed.\"'",
"db:generate": "drizzle-kit generate && npm run workflow:dbml",
"db:install-fts-search-capture": "cross-env MIGRATION_DB=1 tsx ./scripts/installFtsSearchSyncCapture/index.ts",
"db:migrate": "cross-env MIGRATION_DB=1 tsx ./scripts/migrateServerDB/index.ts",
"db:studio": "drizzle-kit studio",
"db:visualize": "dbdocs build docs/development/database-schema.dbml --project lobe-chat",
"desktop:build:all": "npm run desktop:build:main",
"desktop:build:main": "npm run build:main --prefix=./apps/desktop",
"desktop:build-channel": "tsx scripts/electronWorkflow/buildDesktopChannel.ts",
"desktop:main:build": "npm run desktop:main:build --prefix=./apps/desktop",
"desktop:package:app": "npm run desktop:build:all && npm run desktop:package:app:platform",
"desktop:package:app:platform": "tsx scripts/electronWorkflow/buildElectron.ts",
"desktop:package:local": "npm run desktop:build:all && npm run package:local --prefix=./apps/desktop",
"desktop:package:local:reuse": "npm run package:local:reuse --prefix=./apps/desktop",
"dev": "tsx scripts/devStartupSequence.mts",
"dev:bun": "bun --bun next dev -p 3010",
"dev:desktop": "cd apps/desktop && pnpm run dev",
"dev:docker": "docker compose -f docker-compose/dev/docker-compose.yml up -d --wait postgresql redis rustfs searxng",
"dev:docker:down": "docker compose -f docker-compose/dev/docker-compose.yml down",
"dev:docker:reset": "docker compose -f docker-compose/dev/docker-compose.yml down -v && rm -rf docker-compose/dev/data && npm run dev:docker && pnpm db:migrate",
"dev:next": "next dev -p 3010",
"dev:spa": "vite",
"dev:spa:auth": "cross-env AUTH=true vite",
"dev:spa:mobile": "cross-env MOBILE=true vite",
"dev:spa:share": "pnpm --filter @lobehub/share dev",
"dev:spa:workbench": "pnpm --filter @lobehub/workbench dev",
"docs:cdn": "npm run workflow:docs-cdn && npm run lint:mdx",
"docs:i18n": "lobe-i18n md && npm run lint:mdx",
"docs:seo": "lobe-seo && npm run lint:mdx",
"e2e": "cd e2e && npm run test",
"e2e:install": "playwright install",
"e2e:ui": "playwright test --ui",
"fts-search:reindex": "node scripts/elasticsearchReindex/runner.mjs",
"fts-search:sync": "cross-env MIGRATION_DB=1 bun run scripts/elasticsearchSync/cli.ts",
"hotfix:branch": "tsx ./scripts/hotfixWorkflow/index.ts",
"i18n": "npm run workflow:i18n && lobe-i18n && prettier -c --write \"locales/**\"",
"i18n:unused": "tsx ./scripts/i18nWorkflow/analyzeUnusedKeys.ts",
"i18n:unused-clean": "tsx ./scripts/i18nWorkflow/cleanUnusedKeys.ts",
"lint": "npm run lint:ts && npm run lint:style && npm run type-check && npm run lint:circular",
"lint:circular": "npm run lint:circular:main && npm run lint:circular:packages",
"lint:circular:main": "dpdm src/**/*.ts --no-warning --no-tree --exit-code circular:1 --no-progress -T true --skip-dynamic-imports circular",
"lint:circular:packages": "dpdm packages/**/src/**/*.ts --no-warning --no-tree --exit-code circular:1 --no-progress -T true --skip-dynamic-imports circular",
"lint:console": "tsx scripts/checkConsoleLog.mts",
"lint:md": "remark . --silent --output",
"lint:mdx": "npm run workflow:mdx && remark \"docs/**/*.mdx\" -r ./.remarkrc.mdx.mjs --silent --output && eslint \"docs/**/*.mdx\" --quiet --fix",
"lint:style": "stylelint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
"lint:ts": "eslint src/ tests/ --concurrency=auto",
"lint:unused": "knip --include files,exports,types,enumMembers,duplicates",
"prepare": "git rev-parse --git-dir > /dev/null 2>&1 && git config core.hooksPath .githooks || true",
"prettier": "prettier -c --write \"**/**\"",
"pull": "git pull",
"qstash": "pnpx @upstash/qstash-cli@latest dev",
"react-devtools": "cd apps/desktop && pnpm run react-devtools",
"reinstall": "rm -rf .next && rm -rf node_modules && rm -rf ./packages/*/node_modules && pnpm -r exec rm -rf node_modules && pnpm install",
"reinstall:desktop": "rm -rf pnpm-lock.yaml && rm -rf node_modules && pnpm -r exec rm -rf node_modules && pnpm install --node-linker=hoisted",
"release": "semantic-release",
"release:branch": "tsx ./scripts/releaseWorkflow/index.ts",
"self-hosting:docker": "docker build -t lobehub:local .",
"self-hosting:docker-cn": "docker build -t lobehub-local --build-arg USE_CN_MIRROR=true .",
"start": "next start -p 3210",
"stylelint": "stylelint \"src/**/*.{js,jsx,ts,tsx}\" --fix",
"test": "npm run test-app && npm run test-server",
"test:e2e": "pnpm --filter @lobechat/e2e-tests test",
"test:e2e:smoke": "pnpm --filter @lobechat/e2e-tests test:smoke",
"test:update": "vitest -u",
"test-app": "vitest run",
"test-app:coverage": "vitest --coverage --silent='passed-only'",
"tunnel:cloudflare": "cloudflared tunnel --url http://localhost:3010 --protocol http2",
"tunnel:ngrok": "ngrok http http://localhost:3010",
"type-check": "tsgo --noEmit",
"type-check:tsc": "tsc --noEmit",
"workflow:cdn": "tsx ./scripts/cdnWorkflow/index.ts",
"workflow:changelog": "tsx ./scripts/changelogWorkflow/index.ts",
"workflow:changelog:gen": "tsx ./scripts/changelogWorkflow/generateChangelog.ts",
"workflow:countCharters": "tsx scripts/countEnWord.ts",
"workflow:dbml": "tsx ./scripts/dbmlWorkflow/index.ts",
"workflow:docs": "tsx ./scripts/docsWorkflow/index.ts",
"workflow:docs-cdn": "tsx ./scripts/docsWorkflow/autoCDN.ts",
"workflow:i18n": "tsx ./scripts/i18nWorkflow/index.ts",
"workflow:mdx": "tsx ./scripts/mdxWorkflow/index.ts",
"workflow:mobile-spa": "tsx scripts/mobileSpaWorkflow/index.ts",
"workflow:readme": "tsx ./scripts/readmeWorkflow/index.ts",
"workflow:reset-onboarding": "tsx ./scripts/resetOnboarding/index.ts",
"workflow:seed-user-info": "tsx ./scripts/seedUserInfo/index.ts",
"workflow:set-desktop-version": "tsx ./scripts/electronWorkflow/setDesktopVersion.ts"
},
"lint-staged": {
"*.md": [
"remark --silent --output --",
"prettier --write --no-error-on-unmatched-pattern"
],
"*.mdx": [
"remark -r ./.remarkrc.mdx.mjs --silent --output --",
"eslint --quiet --fix"
],
"*.json": [
"prettier --write --no-error-on-unmatched-pattern"
],
"*.{mjs,cjs}": [
"eslint --fix",
"prettier --write"
],
"*.{js,jsx}": [
"eslint --fix",
"stylelint --fix",
"prettier --write"
],
"*.{ts,tsx}": [
"stylelint --fix",
"eslint --fix",
"prettier --parser=typescript --write"
],
"*.{yml,yaml}": [
"eslint --fix"
]
},
"overrides": {
"@ant-design/icons": "6.3.2",
"@types/react": "19.2.13",
"antd": "6.3.5",
"baseline-browser-mapping": "2.10.31",
"better-auth": "1.6.15",
"drizzle-orm": "^0.45.2",
"fast-xml-parser": "5.4.2",
"lexical": "0.42.0",
"pdfjs-dist": "5.4.530",
"stylelint-config-clean-order": "7.0.0"
},
"dependencies": {
"@aiden0z/pptx-renderer": "^1.2.4",
"@ant-design/icons": "6.3.2",
"@anthropic-ai/sdk": "^0.73.0",
"@atlaskit/pragmatic-drag-and-drop": "^1.8.1",
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.2.0",
"@aws-sdk/client-bedrock-runtime": "^3.1107.0",
"@aws-sdk/client-s3": "~3.932.0",
"@aws-sdk/s3-request-presigner": "~3.932.0",
"@azure-rest/ai-inference": "1.0.0-beta.5",
"@azure/core-auth": "^1.11.0",
"@better-auth/expo": "1.6.15",
"@better-auth/passkey": "1.6.15",
"@cfworker/json-schema": "^4.1.1",
"@chat-adapter/discord": "~4.38.0",
"@chat-adapter/slack": "~4.38.0",
"@chat-adapter/state-ioredis": "~4.38.0",
"@chat-adapter/telegram": "~4.38.0",
"@codesandbox/sandpack-react": "^2.20.0",
"@composio/core": "^0.10.0",
"@discordjs/rest": "^2.6.3",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@emotion/react": "^11.14.0",
"@fal-ai/client": "^1.10.1",
"@floating-ui/react": "^0.27.20",
"@formkit/auto-animate": "^0.9.0",
"@google/genai": "~1.50.1",
"@henrygd/queue": "^1.2.0",
"@huggingface/inference": "^4.13.25",
"@icons-pack/react-simple-icons": "^13.13.0",
"@khmyznikov/pwa-install": "0.3.9",
"@larksuiteoapi/node-sdk": "^1.73.0",
"@lexical/utils": "^0.42.0",
"@lobechat/agent-gateway-client": "workspace:*",
"@lobechat/agent-mock": "workspace:*",
"@lobechat/agent-runtime": "workspace:*",
"@lobechat/agent-signal": "workspace:*",
"@lobechat/agent-templates": "workspace:*",
"@lobechat/artifact-template": "workspace:*",
"@lobechat/builtin-agents": "workspace:*",
"@lobechat/builtin-skills": "workspace:*",
"@lobechat/builtin-tool-acceptance-evidence": "workspace:*",
"@lobechat/builtin-tool-activator": "workspace:*",
"@lobechat/builtin-tool-agent-builder": "workspace:*",
"@lobechat/builtin-tool-agent-documents": "workspace:*",
"@lobechat/builtin-tool-agent-management": "workspace:*",
"@lobechat/builtin-tool-agent-signal": "workspace:*",
"@lobechat/builtin-tool-auv": "workspace:*",
"@lobechat/builtin-tool-brief": "workspace:*",
"@lobechat/builtin-tool-browser": "workspace:*",
"@lobechat/builtin-tool-calculator": "workspace:*",
"@lobechat/builtin-tool-claude-code": "workspace:*",
"@lobechat/builtin-tool-cloud-sandbox": "workspace:*",
"@lobechat/builtin-tool-creds": "workspace:*",
"@lobechat/builtin-tool-goal": "workspace:*",
"@lobechat/builtin-tool-group-agent-builder": "workspace:*",
"@lobechat/builtin-tool-group-management": "workspace:*",
"@lobechat/builtin-tool-image-generation": "workspace:*",
"@lobechat/builtin-tool-knowledge-base": "workspace:*",
"@lobechat/builtin-tool-lobe-agent": "workspace:*",
"@lobechat/builtin-tool-local-system": "workspace:*",
"@lobechat/builtin-tool-memory": "workspace:*",
"@lobechat/builtin-tool-message": "workspace:*",
"@lobechat/builtin-tool-notebook": "workspace:*",
"@lobechat/builtin-tool-page-agent": "workspace:*",
"@lobechat/builtin-tool-remote-device": "workspace:*",
"@lobechat/builtin-tool-self-iteration": "workspace:*",
"@lobechat/builtin-tool-skill-maintainer": "workspace:*",
"@lobechat/builtin-tool-skill-store": "workspace:*",
"@lobechat/builtin-tool-skills": "workspace:*",
"@lobechat/builtin-tool-task": "workspace:*",
"@lobechat/builtin-tool-topic-reference": "workspace:*",
"@lobechat/builtin-tool-user-interaction": "workspace:*",
"@lobechat/builtin-tool-verify": "workspace:*",
"@lobechat/builtin-tool-web-browsing": "workspace:*",
"@lobechat/builtin-tool-web-onboarding": "workspace:*",
"@lobechat/builtin-tools": "workspace:*",
"@lobechat/business-config": "workspace:*",
"@lobechat/business-const": "workspace:*",
"@lobechat/business-model-bank": "workspace:*",
"@lobechat/business-model-runtime": "workspace:*",
"@lobechat/chat-adapter-feishu": "workspace:*",
"@lobechat/chat-adapter-imessage": "workspace:*",
"@lobechat/chat-adapter-line": "workspace:*",
"@lobechat/chat-adapter-qq": "workspace:*",
"@lobechat/chat-adapter-wechat": "workspace:*",
"@lobechat/config": "workspace:*",
"@lobechat/connector-data": "workspace:*",
"@lobechat/const": "workspace:*",
"@lobechat/context-engine": "workspace:*",
"@lobechat/conversation-flow": "workspace:*",
"@lobechat/database": "workspace:*",
"@lobechat/desktop-bridge": "workspace:*",
"@lobechat/device-gateway-client": "workspace:*",
"@lobechat/edge-config": "workspace:*",
"@lobechat/editor-runtime": "workspace:*",
"@lobechat/electron-client-ipc": "workspace:*",
"@lobechat/electron-server-ipc": "workspace:*",
"@lobechat/eval-dataset-parser": "workspace:*",
"@lobechat/eval-rubric": "workspace:*",
"@lobechat/fetch-sse": "workspace:*",
"@lobechat/file-loaders": "workspace:*",
"@lobechat/heterogeneous-agents": "workspace:*",
"@lobechat/html-artifact": "workspace:*",
"@lobechat/llm-generation-tracing": "workspace:*",
"@lobechat/local-file-shell": "workspace:*",
"@lobechat/markdown-patch": "workspace:*",
"@lobechat/mecha": "workspace:*",
"@lobechat/memory-user-memory": "workspace:*",
"@lobechat/model-runtime": "workspace:*",
"@lobechat/observability-otel": "workspace:*",
"@lobechat/openapi": "workspace:*",
"@lobechat/prompts": "workspace:*",
"@lobechat/python-interpreter": "workspace:*",
"@lobechat/shared-tool-ui": "workspace:*",
"@lobechat/ssrf-safe-fetch": "workspace:*",
"@lobechat/tool-runtime": "workspace:*",
"@lobechat/utils": "workspace:*",
"@lobechat/web-crawler": "workspace:*",
"@lobehub/analytics": "^1.6.4",
"@lobehub/charts": "^5.4.0",
"@lobehub/desktop-ipc-typings": "workspace:*",
"@lobehub/editor": "^4.27.3",
"@lobehub/icons": "^5.18.0",
"@lobehub/market-sdk": "0.41.0",
"@lobehub/tts": "^5.1.2",
"@lobehub/ui": "^5.43.0",
"@modelcontextprotocol/sdk": "^1.30.0",
"@neondatabase/serverless": "^1.1.0",
"@next/third-parties": "^16.3.0",
"@opentelemetry/auto-instrumentations-node": "^0.76.0",
"@opentelemetry/exporter-jaeger": "^2.10.0",
"@opentelemetry/resources": "^2.10.0",
"@opentelemetry/sdk-metrics": "^2.10.0",
"@opentelemetry/winston-transport": "^0.28.0",
"@pierre/trees": "1.0.0-beta.3",
"@react-pdf/renderer": "4.3.2",
"@react-three/drei": "^10.7.8",
"@react-three/fiber": "^9.7.0",
"@saintno/comfyui-sdk": "^0.2.53",
"@t3-oss/env-core": "^0.13.11",
"@t3-oss/env-nextjs": "^0.13.11",
"@tanstack/react-query": "^5.101.4",
"@trpc/client": "^11.18.0",
"@trpc/next": "^11.18.0",
"@trpc/react-query": "^11.18.0",
"@trpc/server": "^11.18.0",
"@upstash/qstash": "^2.11.3",
"@upstash/workflow": "^0.2.23",
"@vercel/analytics": "^1.6.1",
"@vercel/edge-config": "^1.5.1",
"@vercel/functions": "^3.9.2",
"@vercel/speed-insights": "^1.3.1",
"@virtuoso.dev/masonry": "^1.4.3",
"@xterm/addon-fit": "^0.11.0",
"@xterm/addon-web-links": "^0.12.0",
"@xterm/addon-webgl": "^0.18.0",
"@xterm/xterm": "^5.5.0",
"@xyflow/react": "^12.11.5",
"@zumer/snapdom": "^1.9.14",
"ahooks": "^3.9.7",
"antd": "6.3.5",
"antd-style": "4.1.0",
"async-retry": "^1.3.3",
"bcryptjs": "^3.0.3",
"better-auth": "1.6.15",
"brotli-wasm": "^3.0.1",
"buffer.js": "npm:buffer@^6.0.3",
"chat": "~4.38.0",
"chroma-js": "^3.2.0",
"class-variance-authority": "^0.7.1",
"cmdk": "^1.1.1",
"cookie": "^1.1.1",
"countries-and-timezones": "^3.10.0",
"d3-dsv": "^3.0.1",
"dayjs": "^1.11.21",
"debug": "^4.4.3",
"diff": "^8.0.4",
"discord-api-types": "^0.38.53",
"docx-preview": "^0.4.0",
"drizzle-orm": "^0.45.2",
"drizzle-zod": "^0.8.3",
"epub2": "^3.0.2",
"es-toolkit": "^1.50.0",
"exceljs": "^4.4.0",
"expo-server-sdk": "^6.1.0",
"fast-deep-equal": "^3.1.3",
"fflate": "^0.8.3",
"ffmpeg-static": "^5.3.0",
"file-type": "^21.3.4",
"fuse.js": "^7.5.0",
"gray-matter": "^4.0.3",
"hono": "^4.13.1",
"html-to-text": "^9.0.5",
"i18next": "^25.10.10",
"i18next-browser-languagedetector": "^8.2.1",
"i18next-resources-to-backend": "^1.2.3",
"immer": "^11.1.16",
"ioredis": "^5.11.1",
"jose": "^6.2.8",
"js-sha256": "^0.11.1",
"jsondiffpatch": "^0.7.6",
"jsonl-parse-stringify": "^1.0.3",
"keygrip": "^1.1.0",
"langfuse": "^3.38.20",
"langfuse-core": "^3.38.20",
"lexical": "0.42.0",
"lucide-react": "^1.31.0",
"mammoth": "^1.12.1",
"marked": "^17.0.6",
"mdast-util-to-markdown": "^2.1.2",
"mesurer": "^0.1.0",
"model-bank": "workspace:*",
"motion": "^12.43.0",
"nanoid": "^5.1.16",
"next": "^16.3.0",
"next-mdx-remote": "^6.0.0",
"next-themes": "^0.4.6",
"nextjs-toploader": "^3.9.17",
"node-machine-id": "^1.1.12",
"nodemailer": "^9.0.5",
"numeral": "^2.0.6",
"nuqs": "^2.9.5",
"octokit": "^5.0.5",
"officeparser": "5.1.1",
"ogl": "^1.0.11",
"oidc-provider": "^9.11.3",
"ollama": "^0.6.3",
"openai": "^6.49.0",
"openapi-fetch": "^0.14.1",
"partial-json": "^0.1.7",
"path-browserify-esm": "^1.0.6",
"pathe": "^2.0.3",
"pdf-parse": "^1.1.4",
"pdfjs-dist": "5.4.530",
"pdfkit": "^0.17.2",
"pg": "^8.23.0",
"pinyin-pro": "^3.28.2",
"plaiceholder": "^3.0.0",
"polished": "^4.3.1",
"pure-rand": "^7.0.1",
"pwa-install-handler": "^2.6.5",
"query-string": "^9.5.0",
"random-words": "^2.0.1",
"rc-util": "^5.44.4",
"react": "19.2.7",
"react-confetti": "^6.4.0",
"react-dom": "19.2.7",
"react-fast-marquee": "^1.6.5",
"react-hotkeys-hook": "^5.3.3",
"react-i18next": "^16.6.6",
"react-lazy-load": "^4.0.1",
"react-markdown": "^10.1.0",
"react-pdf": "^10.4.1",
"react-responsive": "^10.0.1",
"react-rnd": "^10.5.3",
"react-router": "^8.3.0",
"react-scan": "^0.5.7",
"react-virtuoso": "^4.18.11",
"react-wrap-balancer": "^1.1.1",
"remark": "^15.0.1",
"remark-gfm": "^4.0.1",
"remark-html": "^16.0.1",
"remove-markdown": "^0.6.4",
"resend": "6.8.0",
"resolve-accept-language": "^3.2.2",
"rtl-detect": "^1.1.2",
"semver": "^7.8.5",
"sharp": "^0.34.5",
"shiki": "^4.4.3",
"stripe": "^17.7.0",
"superjson": "^2.2.6",
"svix": "^1.99.1",
"swr": "^2.5.0",
"three": "^0.181.2",
"tokenx": "^1.6.0",
"ts-md5": "^2.0.1",
"ua-parser-js": "^1.0.41",
"undici": "^7.29.0",
"unist-builder": "^4.0.0",
"url-join": "^5.0.0",
"use-merge-value": "^1.2.0",
"uuid": "^14.0.1",
"virtua": "^0.48.8",
"word-extractor": "^1.0.4",
"ws": "^8.21.3",
"xast-util-to-xml": "^4.0.0",
"xastscript": "^4.0.0",
"yaml": "^2.9.0",
"zod": "^4.4.3",
"zustand": "5.0.4",
"zustand-utils": "^2.1.1"
},
"devDependencies": {
"@commitlint/cli": "^19.8.1",
"@edge-runtime/vm": "^5.0.0",
"@huggingface/tasks": "^0.19.90",
"@inquirer/prompts": "^8.5.2",
"@lobechat/agent-tracing": "workspace:*",
"@lobechat/types": "workspace:*",
"@lobehub/i18n-cli": "^1.27.0",
"@lobehub/lint": "2.1.5",
"@lobehub/market-types": "^1.17.1",
"@lobehub/seo-cli": "^1.7.0",
"@peculiar/webcrypto": "^1.7.1",
"@playwright/test": "^1.62.1",
"@prettier/sync": "^0.6.1",
"@rolldown/plugin-transform-imports": "0.1.1",
"@semantic-release/exec": "^6.0.3",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.3",
"@types/async-retry": "^1.4.9",
"@types/chroma-js": "^3.1.2",
"@types/crypto-js": "^4.2.2",
"@types/d3-dsv": "^3.0.7",
"@types/debug": "^4.1.13",
"@types/fs-extra": "^11.0.4",
"@types/html-to-text": "^9.0.4",
"@types/ip": "^1.1.3",
"@types/json-schema": "^7.0.15",
"@types/keygrip": "^1.0.6",
"@types/node": "^24.13.3",
"@types/nodemailer": "^7.0.12",
"@types/numeral": "^2.0.5",
"@types/oidc-provider": "^9.11.1",
"@types/pdf-parse": "^1.1.5",
"@types/pdfkit": "^0.17.6",
"@types/pg": "^8.21.0",
"@types/react": "19.2.13",
"@types/react-dom": "19.2.3",
"@types/rtl-detect": "^1.0.3",
"@types/semver": "^7.8.0",
"@types/three": "^0.181.0",
"@types/ua-parser-js": "^0.7.39",
"@types/unist": "^3.0.3",
"@types/ws": "^8.18.1",
"@types/xast": "^2.0.4",
"@typescript/native-preview": "7.0.0-dev.20260630.1",
"@vitejs/devtools": "0.2.0",
"@vitejs/plugin-react": "^6.0.5",
"@vitest/coverage-v8": "5.0.0",
"ajv": "^8.20.0",
"ajv-keywords": "^5.1.0",
"code-inspector-plugin": "1.3.6",
"commitlint": "^19.8.1",
"consola": "^3.4.2",
"cross-env": "^10.1.0",
"crypto-js": "^4.2.0",
"dbdocs": "^0.16.2",
"dotenv": "^17.4.2",
"dotenv-expand": "^12.0.3",
"dpdm-fast": "^1.0.14",
"drizzle-dbml-generator": "^0.10.0",
"drizzle-kit": "^0.31.10",
"esbuild": "^0.28.2",
"eslint": "10.0.2",
"eslint-plugin-mdx": "^3.8.1",
"fake-indexeddb": "^6.2.5",
"fs-extra": "^11.4.0",
"glob": "^13.0.6",
"happy-dom": "~20.11.15",
"import-in-the-middle": "^2.0.6",
"just-diff": "^6.0.2",
"knip": "^5.88.1",
"linkedom": "^0.18.13",
"lint-staged": "^16.4.0",
"markdown-table": "^3.0.4",
"mcp-hello-world": "^1.1.2",
"mime": "^4.1.0",
"node-fetch": "^3.3.2",
"node-gyp": "^12.4.0",
"openapi-typescript": "^7.13.0",
"p-map": "^7.0.6",
"prettier": "^3.9.6",
"raw-loader": "^4.0.2",
"remark-cli": "^12.0.1",
"remark-frontmatter": "^5.0.0",
"remark-mdx": "^3.1.1",
"remark-parse": "^11.0.0",
"require-in-the-middle": "^8.0.1",
"s3rver": "3.7.1",
"semantic-release": "^21.1.2",
"stylelint": "^16.26.1",
"tsx": "^4.23.12",
"type-fest": "^5.8.0",
"typescript": "6.0.3",
"unified": "^11.0.5",
"unist-util-visit": "^5.1.0",
"vite": "8.0.16",
"vite-plugin-pwa": "^1.3.0",
"vite-tsconfig-paths": "^6.1.1",
"vitest": "5.0.0"
},
"packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c",
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
}
}