mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-14 03:30:19 +00:00
dbf743cc12
* 🗃️ feat(database): add verify system tables for agent run delivery checker Implement the database layer for the Agent Run delivery checker (Verify System). Reuse / definition layer: - verify_criteria: a single reusable pass/fail standard (atomic unit), carrying its verifier config + onFail default and bound to a document for judging guidance (iteration history reuses document_history; no version columns) - verify_rubrics: a named group that aggregates criteria — the reusable unit - verify_rubric_criteria: junction, which criteria a rubric aggregates (criteria are reusable across rubrics) Mounted onto an agent via the existing agency config jsonb: - agencyConfig.verifyRubricId: a reusable rubric (criteria template) - agencyConfig.verifyCriteriaIds: ad-hoc one-off criteria A run's plan instantiates the union of both. No dedicated bindings table. Snapshot + result layer: - agent_operations.verify_plan (jsonb) + verify_plan_confirmed_at: the per-run immutable check-item snapshot lives ON the operation (1:1 — auto-repair spawns a new operation), instead of a separate plans table - agent_operations.verify_status: denormalized rollup for list-page badges - verify_check_results: per-criterion result with the Toulmin model (verdict/confidence as columns, narrative in a typed toulmin jsonb), N:1 verifier_tracing_id for batch judging, FP/FN flags for the data flywheel; relates to the plan via operation_id + stable check_item_id Ref: LOBE-10019 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * ✨ feat(verify): add Agent Run delivery checker backend + frontend module Implements the verify system on top of the schema (PR #15480): - models: verifyCriterion / verifyRubric (+junction) / verifyCheckResult; agentOperation verify plan/status methods - services/verify: AI plan generation (auto-create criteria), executor with LLM Toulmin judge (per-criterion + batch), program placeholder, agent & auto-repair spawner seams, rollup chokepoint, feedback fp/fn, completion lifecycle bridge - lambda verify router (criteria/rubric CRUD, plan, results, feedback) - frontend feature module: service, SWR hooks, CheckerDock state machine, RunArtifact, verify i18n namespace - tracing scenarios: VerifyPlanGen / VerifyJudge Live UI mount (dock/artifact into chat) pending server operationId source. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * 🐛 fix(verify): persist delivery-checker verdicts via async tracing backfill The LLM judge produced valid verdicts but they were never persisted, leaving every run stuck at `verifying`. Two root causes: 1. FK ordering: `writeVerdict` stamped `verifier_tracing_id` synchronously, but the `llm_generation_tracing` row is written asynchronously (best-effort, after the response) — so the hard FK was violated every time and the verdict write was rolled back. Now the verdict is written with a null link, and the tracing id is backfilled by an `onPersisted` callback that fires only after the tracing row commits (still non-blocking). If tracing is disabled the link simply stays null. 2. Verdict parse: the judge JSON schema is non-strict, so the provider returns optional Toulmin fields as explicit `null`. The Zod validator used `.optional()` (accepts undefined, not null), so any null failed the whole `safeParse` and discarded the batch. Switched to `.nullish()`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(cli): add `verify` command for the delivery checker Adds `lh verify` covering the full delivery-checker chain — criteria & rubric CRUD, per-run plan (generate/state/confirm/skip), execute (LLM judge), results, and feedback — calling the `verify` lambda router. Enables end-to-end backend testing of the verify system. Also adds the missing `tool-runtime` / `prompts` / `const` workspace entries to the CLI's `pnpm-workspace.yaml` so the standalone package installs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 💄 feat(verify): add verify message role + delivery-checker card UI Make the delivery-checker renderable in chat: - Fix the `features/Verify` components so they compile: flatten the `verify` locale to the repo's flat-dotted-key convention (keySeparator: false), import `Flexbox`/`TextArea` from `@lobehub/ui` (react-layout-kit is no longer a dep), and the token cast. - Add a `verify` UI message role + a `VerifyMessage` card that renders the Run Artifact + checker dock from `metadata.verifyOperationId`, wired into the message renderer switch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): add lobe-agent `generateVerifyPlan` tool (server runtime) Lets an agent set up the delivery checker for its run: the agent calls `generateVerifyPlan` early (per the new `<delivery_checker>` system-role guidance), which instantiates the rubric / ad-hoc criteria into a frozen plan on the current `agent_operations` row. Executed server-side only — the executor is dispatched via `runtime[apiName]` with `operationId` threaded through the tool execution context; the client `BaseExecutor` gracefully no-ops it. Also registers the metadata fields (`verifyOperationId`/`verifyRound`) on the message metadata zod schema so the role='verify' card can carry its operation id. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): surface role=verify card on run completion (LOBE-10051) Connect the delivery checker to the conversation: when an Agent Run with a verify plan completes, `CompletionLifecycle` inserts a persisted `role='verify'` message (parented to the assistant, carrying `metadata.verifyOperationId`) that renders the checker card. Self-guarded — no plan → no card, failures never affect the run. `role='verify'` behaves like a `user` leaf message everywhere it flows (persistence + conversation-flow pass it through unchanged); only the context-engine treats it specially: a new `VerifyMessageProcessor` drops it from the model context (UI-only card, not a valid model role). Adds `verify` to `CreateMessageRoleType`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 💄 feat(verify): merge run-artifact + checker into one card The role=verify message rendered two stacked cards (Run Artifact summary + Delivery Checker) that duplicated the check-item list. Merge into a single card: the `Run Artifact · Round N` header, then the checker results + actions, then the snapshot note. RunArtifact/CheckerDock gain an `embedded` prop (header-only / body-only, no card chrome) and VerifyMessage composes them under one border. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): derive generateVerifyPlan rubric from agencyConfig A real agent calls `generateVerifyPlan` with just a `goal` and doesn't know rubric ids. When `rubricId`/`criteriaIds` params are absent, derive the mounted rubric + ad-hoc criteria from the executing agent's `agencyConfig.verifyRubricId / verifyCriteriaIds`. Params still win when given. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(cli): surface agent gateway WebSocket close code + reason The `onclose` handler logged `String(event)` → the useless "[object CloseEvent]". Surface `event.code` (+ `event.reason` when present) so a gateway disconnect before completion is actually diagnosable. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 💄 fix(verify): rename "Run Artifact" → "Verification", drop failed red border - The kicker said "Run Artifact" — it's automated verification, not an artifact. Renamed to "Verification · Round N". - Removed the red error border on a failed check — a normal card reads better. - Fixes a render crash (`useVerifyState is not defined`): the border removal left a dangling reference after the import was dropped. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(cli): poll run status when the agent stream drops When the live stream (gateway WebSocket / SSE) closes before the run finishes, the run is still executing server-side — so instead of hard-exiting, fall back to polling `aiAgent.getOperationStatus` every 10s until the run reaches a terminal state (or is no longer tracked). Pairs with surfacing the WS close code/reason. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 💄 feat(verify): add Render for generateVerifyPlan tool call The generateVerifyPlan tool call rendered as the default param/result dump. Add a Render that lists the generated delivery checks (title + gate/auto-fill tag), and surface the items on the tool state so the Render can read them. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): auto-confirm generated plan so checks run on completion The agent generated a plan but it stayed `planned`/unconfirmed, so the completion hook (which gates on a confirmed plan) never ran the checks — the card was stuck at "awaiting confirmation" with no pass/fail. In the headless agent flow there's no one to click Confirm, so `generateVerifyPlan` now auto-confirms the plan it generates; the checks then run automatically on completion. (An interactive "review before run" gate is a future enhancement.) Also: the verify card header disappeared in the draft/planned phase (`phaseToArtifact.draft` was null). Give it a header so the card always shows its "Verification · Round N" heading. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(agent-tracing): only count opaque/presentational attrs as structural noise The first structuralNoiseRatio charged ALL markup (every <...> tag) as noise, which over-penalized legitimately structured results 3x. Grounding against real web-search output (`<item title="…" url="…">snippet</item>`) showed the tags and the title=/url= attributes ARE the signal the model reads. Now only opaque/presentational attribute names (id, class, style, data-*, aria-*, role, on*) count as noise; semantic element tags and content-bearing attributes (title, url, href, name…) are kept. On a 57-op user-interrupted sample this drops web-search noise 42%→0% and overall estimated waste 16%→5%, leaving large-payload (readDocument) and high error-rate tools as the real signal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): model-authored criteria with name/description/instruction-in-document + agent verifier Restructure the generateVerifyPlan tool to a createDocument-style full-create flow and wire up the agent verifier path: - criteria now = title + description (required one-liner) + instruction (required detailed rubric); instruction lives in a linked document (verify_criteria.documentId), description is a new verify_criteria column (migration 0111). verifierConfig no longer holds description/instruction. - generateVerifyPlan creates verify_criteria + a rubric, snapshots the plan onto the operation and confirms it; judge resolves the instruction from the document. - agent-type checks run as verifier sub-agents (execAgent + isolated thread) whose onComplete hook parses a VERDICT and writes it back to verify_check_results (renamed AgentVerifierSpawner → VerifierAgentRunner). - UI: custom Inspector for the tool header; check list shows per-verifier-type icons (llm/agent/program) + description + required/optional tag; i18n en/zh. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ⚡️ perf(verify): run program/llm/agent checks concurrently on completion The three verifier kinds are independent; previously the agent spawn waited for the batched LLM judge to finish. Run them via Promise.all so agent sub-agents start immediately alongside the LLM batch. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): dedicated builtin verify-agent + writeback tool, role=verify message, portal check editor - Add `@lobechat/builtin-tool-verify` (submitVerifyResult) + builtin `verify-agent`; agent-type checks now run as the dedicated verify agent (not the user's agent), which investigates and writes its verdict back via the tool during its run. - Verifier inherits the parent run's model/provider (builtin default may be unconfigured locally). - role=verify completion message no longer requires an assistantMessageId, so the delivery-checker card always surfaces when a plan exists. - Portal editor for verify checks (title/description/instruction/verifier/onFail). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(verify): restrict verify-agent to its writeback tool; fix running loader icon Root cause of stuck `running` agent checks: the verify-agent ran in agent mode and inherited all default tools (web-browsing, cloud-sandbox, skills, activator), so it went off web-searching/crawling to "investigate" and never called submitVerifyResult. - Run the verify-agent in chat mode (enableAgentMode: false, searchMode: off) — the strict whitelist — and whitelist `lobe-verify` for chat mode so the verifier gets ONLY its writeback tool. - Sharpen the verify systemRole: judge from the provided deliverable/instruction (no external tools), always reach a verdict, and always call submitVerifyResult. - CheckerDock: running check now uses the standard RingLoadingIcon (warning ring), matching the app's loader instead of a blue spinner. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): auto-repair loop — re-run the agent with failure feedback on failed checks When required checks fail with onFail=auto_repair, automatically run a second iteration instead of ending at `failed`: - createRepairRunner: re-runs the SAME agent in the same topic with the failure feedback as the prompt, re-snapshots the plan onto the repair operation and confirms it so it re-verifies on completion (the next round). Capped at MAX_REPAIR_ROUNDS via parent-chain depth to prevent runaway loops. - maybeAutoRepair: fires only once every required check has a terminal result, so it works for inline LLM checks (triggered from lifecycle) and async agent checks (triggered from the verify tool's writeback path). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): open check result detail in portal & rename artifact→result - add a VerifyResult portal view: clicking any check row opens that result's detail (verdict, confidence, Toulmin sections, suggestion) on the right; agent checks expose their execution trace from inside the panel - CheckerDock rows are all clickable now (chevron affordance), status shown by icon only; verify card uses colorBgElevated - rename the run-result surface from "artifact" to "result" everywhere: RunArtifact → RunResult, phaseToArtifact → phaseToResult, and all `artifact.*` i18n keys → `result.*` - ship verify namespace zh-CN / en-US locales Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): enrich check result portal — criterion stepper, richer detail view Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): rubric run-policy config + repair feedback on the verify card Auto-repair feedback now lives on the failed round's role=verify message (content), and the VerifyMessageProcessor surfaces it into the repair run's context as a tagged user turn — so the repair op runs off history via a new execAgent `suppressUserMessage` path instead of injecting a synthetic user message. createVerifyMessage is awaited before verification to avoid a race. maxRepairRounds becomes a rubric-level config: new `verify_rubrics.config` jsonb column, read live at repair time via the plan's sourceRubricId. Adds a RubricConfig portal panel (reachable from the plan card's settings affordance) to view/edit it, wired through the verify store + TRPC. Verify domain types/vocab/config are extracted from the DB schema into @lobechat/types as the single source of truth; schema and consumers import from there. Tests: VerifyMessageProcessor dual behavior; VerifyRubricModel config round-trip; MessageModel.findVerifyMessageByOperationId. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🗃️ refactor(verify): squash the 3 verify migrations into one Collapse 0110 (tables) + 0111 (criteria.description) + 0112 (rubrics.config) into a single regenerated 0110_add_verify_tables so the PR ships one clean, idempotent migration. No schema change vs the three combined. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(cli): verify rubric run-policy config commands + shrink judging-rule editor font CLI: `verify rubric create --max-repair-rounds`, `verify rubric view`, and `verify rubric update` exercise the rubric config endpoints end-to-end; adds a mocked command test. UI: judging-rule editor font 16px → 14px. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(verify): editable rubric name in the config panel + default 3 repair rounds Add a name (title) field to the RubricConfig portal, persisted via a new updateRubricTitle store action + service (optimistic + debounced, alongside the config write-back). Bump DEFAULT_MAX_REPAIR_ROUNDS 2 → 3. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ♻️ refactor(verify): extract generateVerifyPlan into installable lobe-delivery-checker tool Move the delivery-checker plan-creation flow out of the always-on lobe-agent tool into a new standalone, installable builtin tool `lobe-delivery-checker` (Skill Store, opt-in per agent — not loaded by default). lobe-agent no longer ships generateVerifyPlan. - new packages/builtin-tool-lobe-delivery-checker (manifest/types/systemRole + client Render/Inspector/Portal moved wholesale from lobe-agent) - new serverRuntimes/lobeDeliveryChecker.ts (generateVerifyPlan moved out of lobeAgent.ts), registered alongside verifyResult - registered installable in builtin-tools (no hidden/discoverable:false, not in defaultToolIds/alwaysOnToolIds/runtimeManagedToolIds); renders/inspectors/ portals/identifiers wired; lobe-agent portal entries removed - i18n keys moved builtins.lobe-agent.verifyPlan.* → builtins.lobe-delivery-checker.* Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ✨ feat(agent): add `custom` tool mode; verify agent uses it instead of chat-mode Chat mode's contract is to strip ALL user/agent plugins (strict KB/memory/web allow-list) — so the verify sub-agent couldn't get its writeback tool without a leaky blanket rule. Introduce a third tool mode `custom` where the toolset is EXACTLY the agent's declared plugins (no always-on, no defaults, no activator), for focused builtin sub-agents. - chatConfig.toolMode: 'agent' | 'chat' | 'custom' (overrides enableAgentMode) - AgentToolsEngine: custom branch (defaultToolIds = plugins, rules = plugins-on, allowExplicitActivation only in agent mode); chatModeRules restored to strict - verify agent → toolMode: 'custom'; lobe-verify dropped from chatModeAllowedToolIds - test: custom mode enables exactly the declared plugin, no always-on / defaults Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
586 lines
23 KiB
JSON
586 lines
23 KiB
JSON
{
|
|
"name": "@lobehub/lobehub",
|
|
"version": "2.2.1",
|
|
"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"
|
|
],
|
|
"workspaces": [
|
|
"packages/*",
|
|
"packages/business/*",
|
|
"e2e",
|
|
"apps/desktop/src/main"
|
|
],
|
|
"scripts": {
|
|
"build": "bun run build:spa && 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:copy && cross-env NODE_OPTIONS=--max-old-space-size=8192 DOCKER=true next build && pnpm run build-sitemap",
|
|
"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:copy && bun run build:next:raw",
|
|
"build:spa": "cross-env NODE_OPTIONS=--max-old-space-size=8192 pnpm run build:spa:raw",
|
|
"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: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",
|
|
"build-sitemap": "tsx ./scripts/buildSitemapIndex/index.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: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 --port 9876",
|
|
"dev:spa:mobile": "cross-env MOBILE=true vite --port 3012",
|
|
"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",
|
|
"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",
|
|
"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": {
|
|
"@types/react": "19.2.13",
|
|
"antd": "6.3.5",
|
|
"baseline-browser-mapping": "2.10.31",
|
|
"better-auth": "1.4.6",
|
|
"better-call": "1.1.8",
|
|
"drizzle-orm": "^0.45.1",
|
|
"fast-xml-parser": "5.4.2",
|
|
"lexical": "0.42.0",
|
|
"pdfjs-dist": "5.4.530",
|
|
"stylelint-config-clean-order": "7.0.0"
|
|
},
|
|
"dependencies": {
|
|
"@ant-design/icons": "^6.2.1",
|
|
"@ant-design/pro-components": "^2.8.10",
|
|
"@anthropic-ai/sdk": "^0.73.0",
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.7.7",
|
|
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0",
|
|
"@aws-sdk/client-bedrock-runtime": "^3.941.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.10.1",
|
|
"@better-auth/expo": "1.4.6",
|
|
"@better-auth/passkey": "1.4.6",
|
|
"@cfworker/json-schema": "^4.1.1",
|
|
"@chat-adapter/discord": "^4.23.0",
|
|
"@chat-adapter/slack": "^4.23.0",
|
|
"@chat-adapter/state-ioredis": "^4.23.0",
|
|
"@chat-adapter/telegram": "^4.23.0",
|
|
"@codesandbox/sandpack-react": "^2.20.0",
|
|
"@discordjs/rest": "^2.6.0",
|
|
"@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.8.4",
|
|
"@floating-ui/react": "^0.27.19",
|
|
"@formkit/auto-animate": "^0.9.0",
|
|
"@google/genai": "~1.50.1",
|
|
"@henrygd/queue": "^1.2.0",
|
|
"@huggingface/inference": "^4.13.10",
|
|
"@icons-pack/react-simple-icons": "^13.8.0",
|
|
"@khmyznikov/pwa-install": "0.3.9",
|
|
"@larksuiteoapi/node-sdk": "^1.60.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/builtin-agents": "workspace:*",
|
|
"@lobechat/builtin-skills": "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-brief": "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-group-agent-builder": "workspace:*",
|
|
"@lobechat/builtin-tool-group-management": "workspace:*",
|
|
"@lobechat/builtin-tool-knowledge-base": "workspace:*",
|
|
"@lobechat/builtin-tool-lobe-agent": "workspace:*",
|
|
"@lobechat/builtin-tool-lobe-delivery-checker": "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/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/llm-generation-tracing": "workspace:*",
|
|
"@lobechat/local-file-shell": "workspace:*",
|
|
"@lobechat/markdown-patch": "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.2",
|
|
"@lobehub/charts": "^5.0.0",
|
|
"@lobehub/desktop-ipc-typings": "workspace:*",
|
|
"@lobehub/editor": "^4.16.1",
|
|
"@lobehub/icons": "^5.0.0",
|
|
"@lobehub/market-sdk": "0.33.3",
|
|
"@lobehub/tts": "^5.1.2",
|
|
"@lobehub/ui": "^5.15.5",
|
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
"@napi-rs/canvas": "^0.1.88",
|
|
"@neondatabase/serverless": "^1.0.2",
|
|
"@next/third-parties": "^16.1.5",
|
|
"@opentelemetry/auto-instrumentations-node": "^0.67.0",
|
|
"@opentelemetry/exporter-jaeger": "^2.5.0",
|
|
"@opentelemetry/resources": "^2.2.0",
|
|
"@opentelemetry/sdk-metrics": "^2.2.0",
|
|
"@opentelemetry/winston-transport": "^0.19.0",
|
|
"@pierre/trees": "1.0.0-beta.3",
|
|
"@react-pdf/renderer": "4.4.1",
|
|
"@react-three/drei": "^10.7.7",
|
|
"@react-three/fiber": "^9.5.0",
|
|
"@saintno/comfyui-sdk": "^0.2.49",
|
|
"@t3-oss/env-core": "^0.13.10",
|
|
"@t3-oss/env-nextjs": "^0.13.10",
|
|
"@tanstack/react-query": "^5.90.20",
|
|
"@trpc/client": "^11.8.1",
|
|
"@trpc/next": "^11.8.1",
|
|
"@trpc/react-query": "^11.8.1",
|
|
"@trpc/server": "^11.8.1",
|
|
"@upstash/qstash": "^2.8.4",
|
|
"@upstash/workflow": "^0.2.23",
|
|
"@vercel/analytics": "^1.6.1",
|
|
"@vercel/edge-config": "^1.4.3",
|
|
"@vercel/functions": "^3.3.6",
|
|
"@vercel/speed-insights": "^1.3.1",
|
|
"@virtuoso.dev/masonry": "^1.4.0",
|
|
"@xterm/xterm": "^5.5.0",
|
|
"@zumer/snapdom": "^1.9.14",
|
|
"ahooks": "^3.9.6",
|
|
"antd": "6.3.5",
|
|
"antd-style": "4.1.0",
|
|
"async-retry": "^1.3.3",
|
|
"bcryptjs": "^3.0.3",
|
|
"better-auth": "1.4.6",
|
|
"better-auth-harmony": "^1.2.5",
|
|
"better-call": "1.1.8",
|
|
"brotli-wasm": "^3.0.1",
|
|
"buffer.js": "npm:buffer@^6.0.3",
|
|
"chat": "^4.23.0",
|
|
"chroma-js": "^3.2.0",
|
|
"class-variance-authority": "^0.7.1",
|
|
"cmdk": "^1.1.1",
|
|
"cookie": "^1.1.1",
|
|
"countries-and-timezones": "^3.8.0",
|
|
"d3-dsv": "^3.0.1",
|
|
"dayjs": "^1.11.19",
|
|
"debug": "^4.4.3",
|
|
"dexie": "^3.2.7",
|
|
"diff": "^8.0.3",
|
|
"discord-api-types": "^0.38.40",
|
|
"drizzle-orm": "^0.45.1",
|
|
"drizzle-zod": "^0.5.1",
|
|
"epub2": "^3.0.2",
|
|
"es-toolkit": "^1.44.0",
|
|
"expo-server-sdk": "^6.1.0",
|
|
"fast-deep-equal": "^3.1.3",
|
|
"fflate": "^0.8.2",
|
|
"ffmpeg-static": "^5.3.0",
|
|
"file-type": "^21.3.0",
|
|
"fuse.js": "^7.0.0",
|
|
"gray-matter": "^4.0.3",
|
|
"hono": "^4.11.1",
|
|
"html-to-text": "^9.0.5",
|
|
"i18next": "^25.8.0",
|
|
"i18next-browser-languagedetector": "^8.2.0",
|
|
"i18next-resources-to-backend": "^1.2.1",
|
|
"immer": "^11.1.3",
|
|
"ioredis": "^5.9.2",
|
|
"jose": "^6.1.3",
|
|
"js-sha256": "^0.11.1",
|
|
"jsondiffpatch": "^0.7.3",
|
|
"jsonl-parse-stringify": "^1.0.3",
|
|
"klavis": "^2.15.0",
|
|
"langfuse": "^3.38.6",
|
|
"langfuse-core": "^3.38.6",
|
|
"lexical": "0.42.0",
|
|
"lucide-react": "^1.8.0",
|
|
"mammoth": "^1.11.0",
|
|
"marked": "^17.0.1",
|
|
"mdast-util-to-markdown": "^2.1.2",
|
|
"model-bank": "workspace:*",
|
|
"motion": "^12.29.0",
|
|
"nanoid": "^5.1.6",
|
|
"next": "^16.1.5",
|
|
"next-mdx-remote": "^6.0.0",
|
|
"next-themes": "^0.4.6",
|
|
"nextjs-toploader": "^3.9.17",
|
|
"node-machine-id": "^1.1.12",
|
|
"nodemailer": "^8.0.4",
|
|
"numeral": "^2.0.6",
|
|
"nuqs": "^2.8.6",
|
|
"officeparser": "5.1.1",
|
|
"ogl": "^1.0.11",
|
|
"oidc-provider": "^9.6.0",
|
|
"ollama": "^0.6.3",
|
|
"openai": "^4.104.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.17.2",
|
|
"plaiceholder": "^3.0.0",
|
|
"polished": "^4.3.1",
|
|
"posthog-js": "~1.278.0",
|
|
"pure-rand": "^7.0.1",
|
|
"pwa-install-handler": "^2.6.3",
|
|
"query-string": "^9.3.1",
|
|
"random-words": "^2.0.1",
|
|
"rc-util": "^5.44.4",
|
|
"react": "19.2.5",
|
|
"react-confetti": "^6.4.0",
|
|
"react-dom": "19.2.5",
|
|
"react-fast-marquee": "^1.6.5",
|
|
"react-hotkeys-hook": "^5.2.3",
|
|
"react-i18next": "^16.5.3",
|
|
"react-lazy-load": "^4.0.1",
|
|
"react-markdown": "^10.1.0",
|
|
"react-pdf": "^10.3.0",
|
|
"react-responsive": "^10.0.1",
|
|
"react-rnd": "^10.5.2",
|
|
"react-router-dom": "^7.13.0",
|
|
"react-scan": "^0.5.3",
|
|
"react-virtuoso": "^4.18.1",
|
|
"react-wrap-balancer": "^1.1.1",
|
|
"remark": "^15.0.1",
|
|
"remark-gfm": "^4.0.1",
|
|
"remark-html": "^16.0.1",
|
|
"remove-markdown": "^0.6.3",
|
|
"resend": "6.8.0",
|
|
"resolve-accept-language": "^3.1.15",
|
|
"rtl-detect": "^1.1.2",
|
|
"semver": "^7.7.3",
|
|
"sharp": "^0.34.5",
|
|
"shiki": "^3.21.0",
|
|
"stripe": "^17.7.0",
|
|
"superjson": "^2.2.6",
|
|
"svix": "^1.84.1",
|
|
"swr": "^2.3.8",
|
|
"three": "^0.181.2",
|
|
"tokenx": "^1.3.0",
|
|
"ts-md5": "^2.0.1",
|
|
"ua-parser-js": "^1.0.41",
|
|
"undici": "^7.19.1",
|
|
"unist-builder": "^4.0.0",
|
|
"url-join": "^5.0.0",
|
|
"use-merge-value": "^1.2.0",
|
|
"uuid": "^14.0.0",
|
|
"virtua": "^0.48.3",
|
|
"word-extractor": "^1.0.4",
|
|
"ws": "^8.19.0",
|
|
"xast-util-to-xml": "^4.0.0",
|
|
"xastscript": "^4.0.0",
|
|
"yaml": "^2.8.2",
|
|
"zod": "^3.25.76",
|
|
"zod-to-json-schema": "^3.25.1",
|
|
"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.80",
|
|
"@inquirer/prompts": "^8.2.0",
|
|
"@lobechat/agent-tracing": "workspace:*",
|
|
"@lobechat/types": "workspace:*",
|
|
"@lobehub/i18n-cli": "^1.26.0",
|
|
"@lobehub/lint": "2.1.5",
|
|
"@lobehub/market-types": "^1.12.3",
|
|
"@lobehub/seo-cli": "^1.7.0",
|
|
"@peculiar/webcrypto": "^1.5.0",
|
|
"@playwright/test": "^1.58.0",
|
|
"@prettier/sync": "^0.6.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.1",
|
|
"@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.12",
|
|
"@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/node": "^24.10.9",
|
|
"@types/nodemailer": "^7.0.5",
|
|
"@types/numeral": "^2.0.5",
|
|
"@types/oidc-provider": "^9.5.0",
|
|
"@types/pdf-parse": "^1.1.4",
|
|
"@types/pdfkit": "^0.17.4",
|
|
"@types/pg": "^8.16.0",
|
|
"@types/react": "19.2.13",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@types/rtl-detect": "^1.0.3",
|
|
"@types/semver": "^7.7.1",
|
|
"@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.20260425.1",
|
|
"@vitejs/devtools": "0.2.0",
|
|
"@vitejs/plugin-react": "^6.0.2",
|
|
"@vitest/coverage-v8": "3.2.4",
|
|
"ajv": "^8.17.1",
|
|
"ajv-keywords": "^5.1.0",
|
|
"code-inspector-plugin": "1.3.3",
|
|
"commitlint": "^19.8.1",
|
|
"consola": "^3.4.2",
|
|
"cross-env": "^10.1.0",
|
|
"crypto-js": "^4.2.0",
|
|
"dbdocs": "^0.16.2",
|
|
"dotenv": "^17.2.3",
|
|
"dotenv-expand": "^12.0.3",
|
|
"dpdm-fast": "^1.0.14",
|
|
"drizzle-dbml-generator": "^0.10.0",
|
|
"drizzle-kit": "^0.31.8",
|
|
"eslint": "10.0.2",
|
|
"eslint-plugin-mdx": "^3.7.0",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"fs-extra": "^11.3.3",
|
|
"glob": "^13.0.0",
|
|
"happy-dom": "^20.3.7",
|
|
"import-in-the-middle": "^2.0.5",
|
|
"just-diff": "^6.0.2",
|
|
"knip": "^5.82.1",
|
|
"linkedom": "^0.18.12",
|
|
"lint-staged": "^16.2.7",
|
|
"markdown-table": "^3.0.4",
|
|
"mcp-hello-world": "^1.1.2",
|
|
"mime": "^4.1.0",
|
|
"node-fetch": "^3.3.2",
|
|
"node-gyp": "^11.5.0",
|
|
"openapi-typescript": "^7.10.1",
|
|
"p-map": "^7.0.4",
|
|
"prettier": "^3.8.1",
|
|
"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",
|
|
"semantic-release": "^21.1.2",
|
|
"stylelint": "^16.12.0",
|
|
"tsx": "^4.21.0",
|
|
"type-fest": "^5.4.1",
|
|
"typescript": "^6.0.3",
|
|
"unified": "^11.0.5",
|
|
"unist-util-visit": "^5.1.0",
|
|
"vite": "8.0.14",
|
|
"vite-plugin-pwa": "^1.2.0",
|
|
"vite-tsconfig-paths": "^6.1.1",
|
|
"vitest": "3.2.4"
|
|
},
|
|
"packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
|
|
"publishConfig": {
|
|
"access": "public",
|
|
"registry": "https://registry.npmjs.org"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"@lobehub/editor",
|
|
"ffmpeg-static"
|
|
],
|
|
"overrides": {
|
|
"@react-pdf/image": "3.0.4",
|
|
"@types/react": "19.2.13",
|
|
"@vitest/coverage-v8": "3.2.4",
|
|
"antd": "6.3.5",
|
|
"baseline-browser-mapping": "2.10.31",
|
|
"better-auth": "1.4.6",
|
|
"better-call": "1.1.8",
|
|
"drizzle-orm": "^0.45.1",
|
|
"fast-xml-parser": "5.4.2",
|
|
"lexical": "0.42.0",
|
|
"pdfjs-dist": "5.4.530",
|
|
"react": "19.2.5",
|
|
"react-dom": "19.2.5",
|
|
"stylelint-config-clean-order": "7.0.0",
|
|
"typescript": "6.0.3",
|
|
"vitest": "3.2.4"
|
|
},
|
|
"patchedDependencies": {
|
|
"@upstash/qstash": "patches/@upstash__qstash.patch"
|
|
}
|
|
}
|
|
}
|