lobehub:๐Ÿคฏ LobeHub is your Chief Agent Operator, organizing your agents into 7ร—24 operations by hiring, scheduling, and reporting on your entire AI team.

๐Ÿคฏ LobeHub is your Chief Agent Operator, organizing your agents into 7ร—24 operations by hiring, scheduling, and reporting on your entire AI team.

ๅˆ†ๆ”ฏ554Tags2874
ๆ–‡ไปถๆœ€ๅŽๆไบค่ฎฐๅฝ•ๆœ€ๅŽๆ›ดๆ–ฐๆ—ถ้—ด
๐Ÿ› fix(agent-runtime): route context engine payload out of the events stream (#15151) * ๐Ÿ› fix(agent-runtime): route context engine payload out of the events stream `call_llm` previously pushed a `context_engine_result` event carrying the full `contextEngineInput` (agentDocuments, systemRole, knowledge, โ€ฆ) into the per-step events array. That array is the same one persisted into Redis `agent_runtime_events`, so every step shipped the heavy CE payload into the state pipeline even though the only consumer was the trace recorder, which extracted CE into the typed `contextEngine` snapshot field and immediately filtered the event back out. Wire a typed `recordContextEngine` callback through `RuntimeExecutorContext` instead. `AgentRuntimeService.executeStep` buffers the call per step and hands it to `OperationTraceRecorder.appendStep` via a new `contextEngine` param. Trace snapshots are byte-identical; the events stream โ€” and therefore the Redis state blob โ€” no longer carries CE. Step toward LOBE-9110 (split state vs trace pipeline). Viewer keeps the legacy `context_engine_result` reader for back-compat with older on-disk snapshots. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐ŸŽจ refactor(agent-runtime): rename recordContextEngine to tracingContextEngine The callback name now signals its role as the trace-pipeline channel, matching the `tracing` prefix used elsewhere for non-state observability wiring. Pure rename, no behavior change. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>6 ๅฐๆ—ถๅ‰
chore: streamline issue triage to core business labels (1-3 per issue) (#14962) * refactor: streamline issue triage labels --------- Co-authored-by: lobehubbot <i@lobehub.com>4 ๅคฉๅ‰
โ™ป๏ธ refactor: migrate AI Rules to Claude Code Skills (#11737) โ™ป๏ธ refactor: migrate AI Rules to Claude Code Skills system Migrate all AI Rules from .cursor/rules/ to .agents/skills/ directory: - Move 23 skills to .agents/skills/ (main directory) - Update symlinks: .claude/skills, .cursor/skills, .codex/skills - Create project-overview skill from project documentation - Add references/ subdirectories for complex skills - Remove LobeChat references from skill descriptions - Delete obsolete .cursor/rules/ and .claude/commands/prompts/ directories Skills structure enables better portability and maintainability across AI tools.3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
โ™ป๏ธ refactor: migrate AI Rules to Claude Code Skills (#11737) โ™ป๏ธ refactor: migrate AI Rules to Claude Code Skills system Migrate all AI Rules from .cursor/rules/ to .agents/skills/ directory: - Move 23 skills to .agents/skills/ (main directory) - Update symlinks: .claude/skills, .cursor/skills, .codex/skills - Create project-overview skill from project documentation - Add references/ subdirectories for complex skills - Remove LobeChat references from skill descriptions - Delete obsolete .cursor/rules/ and .claude/commands/prompts/ directories Skills structure enables better portability and maintainability across AI tools.3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
๐Ÿ”จ chore: replace husky with native git hooks (#14941)3 ๅคฉๅ‰
โœจ feat(agent-explorer): support multi-select delete in document tree (#15125) * โœจ feat(agent-explorer): support multi-select delete in document tree - Right-click on a multi-selected row deletes the whole selection; dedupe descendants when an ancestor folder is also selected - Reserve chevron slot in SkillsList rows so atomic and bundled skills align - Centralize EMPTY_ARRAY (typed `never[]`, frozen) in @lobechat/const * โ™ป๏ธ refactor: migrate delete confirm dialog from antd modal to confirmModal * โœ… test: stabilize bun vitest environment * ๐Ÿ”ง ci: avoid authenticated checkout for PR tests15 ๅฐๆ—ถๅ‰
๐Ÿ”จ chore: update .vscode/settings.json (#13894)1 ไธชๆœˆๅ‰
โœจ feat: support TTS & STT (#443) * โœจ feat(tts): Add tts and stt basic features * โœจ feat(tts): Handle error * ๐Ÿ’„ style(tts): Add alert to error handler * ๐Ÿ› fix(tts): Error display * โ™ป๏ธ refactor: refactor the openai initial code to the createBizOpenAI * โ™ป๏ธ refactor(tts): Refactor header config * โœจ feat: Add TTS voice preview * ๐Ÿ› fix(tts): Fix header * ๐Ÿ› fix: Fix api --------- Co-authored-by: Arvin Xu <arvinx@foxmail.com>2 ๅนดๅ‰
โœจ feat(review-panel): group review changes by submodule (#15148) * ๐Ÿ› fix(claude-code): show task subject in TaskUpdate inspector & header A TaskUpdate that only sets `subject` (no status flip) was falling through to the aggregate `Todos: x/y` chip and burying the per-call signal. Surface the new subject like the status branch already does: "Task updated: <subject>". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): group changes by submodule with per-group collapse Surface dirty submodules as their own groups in the agent Review panel so users working in a parent repo with submodules see each repo's changes clustered together (mirrors WebStorm's per-repo commit grouping). Both Unstaged and Branch modes apply the same grouping โ€” submodules with internal working-tree changes (unstaged) or branch diffs against their own origin/HEAD (branch) surface as separate groups, each tagged with its own branch label and file/diff totals. Backend (`GitCtr`): - `getGitWorkingTreePatches` and `getGitBranchDiff` extracted into private recursive helpers that detect submodules via `git submodule status`, partition pointer-bump entries out of the parent's flat patches, and recurse one level for each dirty submodule's own patches + branch info. - Nested submodules are not traversed (phase 1); revert routes through each group's absolute path so submodule files revert inside the submodule. Renderer: - New `GroupHeader` and `FileRow` subcomponents split out of `Review`. `GroupHeader` is sticky with a chevron + name + file count + diff totals + branch; clicking collapses the group's rows. A hover-revealed `ActionIcon` on the right expands/collapses all file diffs in that group (`e.stopPropagation` keeps it from also collapsing the surrounding header). - Fixed `block-size: 32px` on the header so toggling the fold button on/off doesn't jitter the sticky height. - Single-repo working trees keep the previous flat layout when no submodule groups exist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): scan all submodules in branch mode Previously branch mode only surfaced a submodule group when the parent's diff against base ref contained a `Subproject commit` pointer bump for it. This missed the common case where the user has committed work in a submodule on a feature branch but the parent's pointer hasn't yet moved relative to its base โ€” the submodule's own branch differences stayed invisible in the Review panel. `collectBranchDiff` now recurses into every registered submodule (single level, in parallel) and keeps a group when EITHER its pointer differs in the parent OR its own branch diverges from its own origin/HEAD. Clean-on- both-axes submodules are dropped so the panel stays quiet for repos where the submodule isn't actively being worked on. Submodule count is small in practice (single digits), so the extra per-submodule fetch + diff in parallel is an acceptable cost. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(agent-documents): hide .tool-results archive from user-facing lists Auto-created tool-result archive folder and its children are now filtered out of getAgentDocuments. Agents still discover them via the tool-oriented listDocuments paths. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ๐Ÿ’„ style(review-panel): drop "file not found in project index" toast Reveal-in-tree now silently no-ops when the path isn't indexed (e.g. submodule files) instead of nagging the user with a warning toast. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ› fix(review-panel): keep submodule groups visible on pointer-only bumps `isEmpty` was derived solely from `totalEntryCount`, which counts file patches across groups. A pointer-only submodule bump (parent patch filtered out, submodule group present but internally clean) produced `totalEntryCount === 0`, so the panel rendered the global empty state and silently skipped the submoduleClean group rendering โ€” even though git was dirty. Now `isEmpty` also requires zero submodule groups, so pointer-only bumps keep their GroupHeader + "submodule clean" line. The fold-all button visibility switches to `totalEntryCount > 0` so it stays hidden when there's nothing foldable. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>7 ๅฐๆ—ถๅ‰
chore: streamline issue triage to core business labels (1-3 per issue) (#14962) * refactor: streamline issue triage labels --------- Co-authored-by: lobehubbot <i@lobehub.com>4 ๅคฉๅ‰
๐Ÿ”จ chore(docker): replace dev/prod pgsql docker image with paradedb (#13373) ๐Ÿ› fix(docker): replace dev/prod pgsql docker image with paradedb Signed-off-by: WindSpiritSR <simon343riley@gmail.com>1 ไธชๆœˆๅ‰
๐Ÿ”จ feat(db): add `llm_generation_tracing` and `agent eval experiment` tables (#15126) ๐Ÿ”จ chore(db): combine llm_generation_tracing and agent eval experiment tables into 0103 Merges the schema work from #14990 with the new llm_generation_tracing table into a single idempotent 0103 migration so the two streams can land together without a migration-number conflict. Also adds user_id (FK + index) to agent_eval_experiment_benchmarks so the junction table is scoped per user, matching agent_eval_run_topics. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>1 ๅคฉๅ‰
๐Ÿ› fix: system bot error (#14784) * chore: add start link short cut * chore: update qq zh files * fix: add messenger block message alert * chore: update i18n files * fix: messenger router bridge * fix: dm thread create problem * chore: remove lab prefer for messenger * chore: update i18n files * fix: e2e test9 ๅคฉๅ‰
โœจ feat(review-panel): group review changes by submodule (#15148) * ๐Ÿ› fix(claude-code): show task subject in TaskUpdate inspector & header A TaskUpdate that only sets `subject` (no status flip) was falling through to the aggregate `Todos: x/y` chip and burying the per-call signal. Surface the new subject like the status branch already does: "Task updated: <subject>". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): group changes by submodule with per-group collapse Surface dirty submodules as their own groups in the agent Review panel so users working in a parent repo with submodules see each repo's changes clustered together (mirrors WebStorm's per-repo commit grouping). Both Unstaged and Branch modes apply the same grouping โ€” submodules with internal working-tree changes (unstaged) or branch diffs against their own origin/HEAD (branch) surface as separate groups, each tagged with its own branch label and file/diff totals. Backend (`GitCtr`): - `getGitWorkingTreePatches` and `getGitBranchDiff` extracted into private recursive helpers that detect submodules via `git submodule status`, partition pointer-bump entries out of the parent's flat patches, and recurse one level for each dirty submodule's own patches + branch info. - Nested submodules are not traversed (phase 1); revert routes through each group's absolute path so submodule files revert inside the submodule. Renderer: - New `GroupHeader` and `FileRow` subcomponents split out of `Review`. `GroupHeader` is sticky with a chevron + name + file count + diff totals + branch; clicking collapses the group's rows. A hover-revealed `ActionIcon` on the right expands/collapses all file diffs in that group (`e.stopPropagation` keeps it from also collapsing the surrounding header). - Fixed `block-size: 32px` on the header so toggling the fold button on/off doesn't jitter the sticky height. - Single-repo working trees keep the previous flat layout when no submodule groups exist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): scan all submodules in branch mode Previously branch mode only surfaced a submodule group when the parent's diff against base ref contained a `Subproject commit` pointer bump for it. This missed the common case where the user has committed work in a submodule on a feature branch but the parent's pointer hasn't yet moved relative to its base โ€” the submodule's own branch differences stayed invisible in the Review panel. `collectBranchDiff` now recurses into every registered submodule (single level, in parallel) and keeps a group when EITHER its pointer differs in the parent OR its own branch diverges from its own origin/HEAD. Clean-on- both-axes submodules are dropped so the panel stays quiet for repos where the submodule isn't actively being worked on. Submodule count is small in practice (single digits), so the extra per-submodule fetch + diff in parallel is an acceptable cost. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(agent-documents): hide .tool-results archive from user-facing lists Auto-created tool-result archive folder and its children are now filtered out of getAgentDocuments. Agents still discover them via the tool-oriented listDocuments paths. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ๐Ÿ’„ style(review-panel): drop "file not found in project index" toast Reveal-in-tree now silently no-ops when the path isn't indexed (e.g. submodule files) instead of nagging the user with a warning toast. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ› fix(review-panel): keep submodule groups visible on pointer-only bumps `isEmpty` was derived solely from `totalEntryCount`, which counts file patches across groups. A pointer-only submodule bump (parent patch filtered out, submodule group present but internally clean) produced `totalEntryCount === 0`, so the panel rendered the global empty state and silently skipped the submoduleClean group rendering โ€” even though git was dirty. Now `isEmpty` also requires zero submodule groups, so pointer-only bumps keep their GroupHeader + "submodule clean" line. The fold-all button visibility switches to `totalEntryCount > 0` so it stays hidden when there's nothing foldable. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>7 ๅฐๆ—ถๅ‰
โœจ feat(review-panel): group review changes by submodule (#15148) * ๐Ÿ› fix(claude-code): show task subject in TaskUpdate inspector & header A TaskUpdate that only sets `subject` (no status flip) was falling through to the aggregate `Todos: x/y` chip and burying the per-call signal. Surface the new subject like the status branch already does: "Task updated: <subject>". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): group changes by submodule with per-group collapse Surface dirty submodules as their own groups in the agent Review panel so users working in a parent repo with submodules see each repo's changes clustered together (mirrors WebStorm's per-repo commit grouping). Both Unstaged and Branch modes apply the same grouping โ€” submodules with internal working-tree changes (unstaged) or branch diffs against their own origin/HEAD (branch) surface as separate groups, each tagged with its own branch label and file/diff totals. Backend (`GitCtr`): - `getGitWorkingTreePatches` and `getGitBranchDiff` extracted into private recursive helpers that detect submodules via `git submodule status`, partition pointer-bump entries out of the parent's flat patches, and recurse one level for each dirty submodule's own patches + branch info. - Nested submodules are not traversed (phase 1); revert routes through each group's absolute path so submodule files revert inside the submodule. Renderer: - New `GroupHeader` and `FileRow` subcomponents split out of `Review`. `GroupHeader` is sticky with a chevron + name + file count + diff totals + branch; clicking collapses the group's rows. A hover-revealed `ActionIcon` on the right expands/collapses all file diffs in that group (`e.stopPropagation` keeps it from also collapsing the surrounding header). - Fixed `block-size: 32px` on the header so toggling the fold button on/off doesn't jitter the sticky height. - Single-repo working trees keep the previous flat layout when no submodule groups exist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(review-panel): scan all submodules in branch mode Previously branch mode only surfaced a submodule group when the parent's diff against base ref contained a `Subproject commit` pointer bump for it. This missed the common case where the user has committed work in a submodule on a feature branch but the parent's pointer hasn't yet moved relative to its base โ€” the submodule's own branch differences stayed invisible in the Review panel. `collectBranchDiff` now recurses into every registered submodule (single level, in parallel) and keeps a group when EITHER its pointer differs in the parent OR its own branch diverges from its own origin/HEAD. Clean-on- both-axes submodules are dropped so the panel stays quiet for repos where the submodule isn't actively being worked on. Submodule count is small in practice (single digits), so the extra per-submodule fetch + diff in parallel is an acceptable cost. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(agent-documents): hide .tool-results archive from user-facing lists Auto-created tool-result archive folder and its children are now filtered out of getAgentDocuments. Agents still discover them via the tool-oriented listDocuments paths. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ๐Ÿ’„ style(review-panel): drop "file not found in project index" toast Reveal-in-tree now silently no-ops when the path isn't indexed (e.g. submodule files) instead of nagging the user with a warning toast. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ› fix(review-panel): keep submodule groups visible on pointer-only bumps `isEmpty` was derived solely from `totalEntryCount`, which counts file patches across groups. A pointer-only submodule bump (parent patch filtered out, submodule group present but internally clean) produced `totalEntryCount === 0`, so the panel rendered the global empty state and silently skipped the submoduleClean group rendering โ€” even though git was dirty. Now `isEmpty` also requires zero submodule groups, so pointer-only bumps keep their GroupHeader + "submodule clean" line. The fold-all button visibility switches to `totalEntryCount > 0` so it stays hidden when there's nothing foldable. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>7 ๅฐๆ—ถๅ‰
โช revert: revert pnpm v11 migration (#14372) * Revert "๐Ÿ‘ท build: disable pnpm gvs for desktop ci (#14357)" This reverts commit 948ba5ec68e347a116f52e3599894d3002f0cb9a. * Revert "๐Ÿ‘ท build(repo): migrate to pnpm v11 and consolidate workspace config (#14316)" This reverts commit 1d9b6099bd7ce72d0b656d45936fc81cd8d0ee68.22 ๅคฉๅ‰
โšก๏ธ perf: warm route chunks after idle (#15109) * โšก๏ธ perf: warm route chunks after idle * ๐Ÿ› fix: normalize platform route chunk ids * โšก๏ธ perf: refine route chunk preloading * ๐Ÿ”ง chore: keep desktop renderer preload unchanged * โšก๏ธ perf: skip renderer chunks in route warmup * โšก๏ธ perf: preload agent route dynamic chunks * โšก๏ธ perf: align route preload deployment urls * โšก๏ธ perf: coalesce stable vendor chunks * โšก๏ธ perf: group shared data runtime chunks * โšก๏ธ perf: group model runtime chunks * โšก๏ธ perf: trim initial route preloads * โšก๏ธ perf: limit idle route micro preloads * โšก๏ธ perf: strip tiny html modulepreloads * โšก๏ธ perf: prune redundant route chunk imports * โšก๏ธ perf: enable rolldown devtools * โšก๏ธ perf: gate vite devtools output * โšก๏ธ perf: optimize react-scan integration and update global types Signed-off-by: Innei <tukon479@gmail.com> * โšก๏ธ perf: support cloud route chunk preload --------- Signed-off-by: Innei <tukon479@gmail.com>1 ๅคฉๅ‰
update og 1 ไธชๆœˆๅ‰
chore: clean up LOBE-XXX code annotations (#15135) * chore: clean up LOBE-XXX annotations from codebase comments - Remove ใ€LOBE-XXXใ€‘ bracket markers - Remove LOBE-XXXX references from inline comments - Clean up test descriptions containing LOBE identifiers - Preserve linear.app URLs and code-level regex patterns - Generated: 2026-05-23 02:30:09 * ๐Ÿ› fix(tests): restore () in arrow callbacks broken by annotation cleanup The LOBE-XXX annotation cleanup script over-matched `(LOBE-XXXX', () =>` and stripped the callback `()`, leaving invalid syntax like `describe(..., => {` and `it(..., async => {` across 24 test files. This caused parse failures in Test Packages, Test Desktop App, Test Database lint, and Test App shard runs. Restoring `()` / `async ()` unblocks the suites while keeping the ticket-text cleanup intact. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ๐Ÿ› fix(hintFormat-test): restore label + ellipsis in stripMarkdownLinks fixture The annotation cleanup stripped `LOBE-8516` from a markdown-link's *label* (`[LOBE-8516](/task/T-1)` โ†’ `[](/task/T-1)`), which then survived `stripMarkdownLinks` because the pattern requires non-empty link text โ€” the test expected the link to disappear and asserted equality on a LOBE-free output. The same line also lost a `.` from the trailing `...` indicator in both input and expected strings. Substitute a neutral Chinese label (`ๅ‘ๅธƒ่ฎกๅˆ’`) so the link continues to exercise the multi-link substitution path, and restore the full `...` ellipsis. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Arvin Xu <arvinxx@lobehub.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>14 ๅฐๆ—ถๅ‰
๐Ÿ› fix(agent-runtime): route context engine payload out of the events stream (#15151) * ๐Ÿ› fix(agent-runtime): route context engine payload out of the events stream `call_llm` previously pushed a `context_engine_result` event carrying the full `contextEngineInput` (agentDocuments, systemRole, knowledge, โ€ฆ) into the per-step events array. That array is the same one persisted into Redis `agent_runtime_events`, so every step shipped the heavy CE payload into the state pipeline even though the only consumer was the trace recorder, which extracted CE into the typed `contextEngine` snapshot field and immediately filtered the event back out. Wire a typed `recordContextEngine` callback through `RuntimeExecutorContext` instead. `AgentRuntimeService.executeStep` buffers the call per step and hands it to `OperationTraceRecorder.appendStep` via a new `contextEngine` param. Trace snapshots are byte-identical; the events stream โ€” and therefore the Redis state blob โ€” no longer carries CE. Step toward LOBE-9110 (split state vs trace pipeline). Viewer keeps the legacy `context_engine_result` reader for back-compat with older on-disk snapshots. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐ŸŽจ refactor(agent-runtime): rename recordContextEngine to tracingContextEngine The callback name now signals its role as the trace-pipeline channel, matching the `tracing` prefix used elsewhere for non-state observability wiring. Pure rename, no behavior change. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>6 ๅฐๆ—ถๅ‰
โœจ feat(agent-explorer): support multi-select delete in document tree (#15125) * โœจ feat(agent-explorer): support multi-select delete in document tree - Right-click on a multi-selected row deletes the whole selection; dedupe descendants when an ancestor folder is also selected - Reserve chevron slot in SkillsList rows so atomic and bundled skills align - Centralize EMPTY_ARRAY (typed `never[]`, frozen) in @lobechat/const * โ™ป๏ธ refactor: migrate delete confirm dialog from antd modal to confirmModal * โœ… test: stabilize bun vitest environment * ๐Ÿ”ง ci: avoid authenticated checkout for PR tests15 ๅฐๆ—ถๅ‰
chore: use bun in test CI and vercel CD (#192) * :wrench: chore: try bun test ci * :wrench: chore: update installCommand on vercel2 ๅนดๅ‰
๐Ÿ› fix: disable rich text in markdown editor (#9637) * clean * update * add labs * fix * improve * update * fix * hide lab * improve workflow7 ไธชๆœˆๅ‰
๐Ÿ”จ chore: Add CI to Check `console.log` (#10333) * lint: Clean breakpoints * build: Add CI to check * build: Add `next` branch * build: Remove markdown files * fix: CI hang out * fix: Show warning on GitHub * feat: Send comment * fix: CI error * fix: show file list5 ไธชๆœˆๅ‰
๐Ÿ“ docs: add some cursor rules & optimize codebase indexing (#7999) * ๐Ÿ“ docs: add some cursor rules & optimize codebase indexing * ๐Ÿ“ docs: some code reviews issue by greptile11 ไธชๆœˆๅ‰
๐Ÿ‘ท build: fix docker build (#4008) 1 ๅนดๅ‰
๐Ÿ”ง chore: Update setting This commit introduces new components, modules, and features related to chat, sessions, and settings. It includes modifications to configuration files, updates to dependencies, adjustments to styles and layouts, and additions of new components and modules. The changes also involve updates to functions, interfaces, selectors, actions, and reducers. Additionally, there are modifications to TypeScript interfaces and types, as well as changes to parameters and functions in certain files. 2 ๅนดๅ‰
โ™ป๏ธ refactor: migrate frontend from Next.js App Router to Vite SPA (#12404) * init plan * ๐Ÿ“ docs: update SPA plan for dev mode Worker cross-origin handling - Clarified the handling of Worker cross-origin issues in dev mode, emphasizing the need for `workerPatch` to wrap cross-origin URLs as blob URLs. - Enhanced the explanation of the dev mode's resource URL rewriting process for better understanding. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: Phase 1 - ็Žฏๅขƒๅ˜้‡ๆ•ดๆฒป - Fix Pyodide env var mismatch (NEXT_PUBLIC_PYPI_INDEX_URL โ†’ pythonEnv.NEXT_PUBLIC_PYODIDE_PIP_INDEX_URL) - Consolidate python.ts to use pythonEnv instead of direct process.env - Remove NEXT_PUBLIC_ prefix from server-side MARKET_BASE_URL (5 files) * ๐Ÿ—๏ธ chore: Phase 2 - Vite ๅทฅ็จ‹ๆญๅปบ - Add vite.config.ts with dual build (desktop/mobile via MOBILE env) - Add index.html SPA template with __SERVER_CONFIG__ placeholder - Add entry.desktop.tsx and entry.mobile.tsx SPA entry points - Add dev:spa, dev:spa:mobile, build:spa, build:spa:copy scripts - Install @vitejs/plugin-react and linkedom * โ™ป๏ธ refactor: Phase 3 - ็ฌฌไธ€ๆ–นๅŒ… Next.js ่งฃ่€ฆ - Replace next/link with <a> in builtin-tool-web-browsing (4 files, external links) - Replace next/image with <img> in builtin-tool-agent-builder/InstallPlugin.tsx - Add Vite import.meta.env compat for isDesktop in const/version.ts, builtin-tool-gtd, builtin-tool-group-management * โ™ป๏ธ refactor: Phase 4a - Auth ้กต้ขๆ”น็”จ็›ดๆŽฅ next/navigation ๅ’Œ next/link - 9 auth files: @/libs/next/navigation โ†’ next/navigation - 5 auth files: @/libs/next/Link โ†’ next/link - Auth pages remain in Next.js App Router, need direct Next.js imports * โ™ป๏ธ refactor: Phase 4b - Next.js ๆŠฝ่ฑกๅฑ‚ๆ›ฟๆขไธบ react-router-dom/vanilla React - navigation.ts: useRouter/usePathname/useSearchParams/useParams โ†’ react-router-dom - navigation.ts: redirect/notFound โ†’ custom error throws - navigation.ts: useServerInsertedHTML โ†’ no-op for SPA - Link.tsx: next/link โ†’ react-router-dom Link adapter (hrefโ†’to, externalโ†’<a>) - Image.tsx: next/image โ†’ <img> wrapper with fill/style support - dynamic.tsx: next/dynamic โ†’ React.lazy + Suspense wrapper * โœจ feat: Phase 5 - ๆ–ฐๅปบ SPAGlobalProvider - Create SPAServerConfig type (analyticsConfig, clientEnv, theme, featureFlags, locale) - Add window.__SERVER_CONFIG__ and __MOBILE__ to global.d.ts - Create SPAGlobalProvider (client-only Provider tree mirroring GlobalProvider) - Includes AuthProvider for user session support - Update entry.desktop.tsx and entry.mobile.tsx to wrap with SPAGlobalProvider * โ™ป๏ธ refactor: add SPA catch-all route handler with Vite dev proxy - Create (spa)/[[...path]]/route.ts for serving SPA HTML - Dev mode: proxy Vite dev server, rewrite asset URLs, inject Worker patch - Prod mode: read pre-built HTML templates - Build SPAServerConfig with analytics, theme, clientEnv, featureFlags - Update middleware to pass SPA routes through to catch-all * โ™ป๏ธ refactor: skip auth checks for SPA routes in middleware SPA pages are all public (no sensitive data in HTML). Auth is handled client-side by SPAGlobalProvider's AuthProvider. Only Next.js auth routes and API endpoints go through session checks. * โ™ป๏ธ refactor: replace Next.js-specific analytics with vanilla JS - Google.tsx: replace @next/third-parties/google with direct gtag script - ReactScan.tsx: replace react-scan/monitoring/next with generic script - Desktop.tsx: replace next/script with native script injection * โ™ป๏ธ refactor: migrate @t3-oss/env-nextjs to @t3-oss/env-core Replace framework-specific env validation with framework-agnostic version. Add clientPrefix where client schemas exist. * โ™ป๏ธ refactor: replace next-mdx-remote/rsc with react-markdown Use client-side react-markdown for MDX rendering instead of Next.js RSC-dependent next-mdx-remote. * ๐Ÿ”ง chore: update build scripts and Dockerfile for SPA integration - build:docker now includes SPA build + copy steps - dev defaults to Vite SPA, dev:next for Next.js backend - Dockerfile copies public/spa/ assets for production - Add public/spa/ to .gitignore (build artifact) * ๐Ÿ—‘๏ธ chore: remove old Next.js route segment files and serwist PWA - Delete [variants] page.tsx, error.tsx, not-found.tsx, loading.tsx - Delete root loading.tsx and empty [[...path]] directory - Delete unused loaders directory - Remove @serwist/next PWA wrapper from Next.js config * plan2 * โœจ feat: add locale detection script to index.html for SPA dev mode * โ™ป๏ธ refactor: remove locale and theme from SPAServerConfig * โœจ feat: add [locale] segment with force-static and SEO meta generation * โ™ป๏ธ refactor: remove theme/locale reads from SPAGlobalProvider * โœจ feat: set vite base to /spa/ for production builds * โœจ feat: auto-generate spaHtmlTemplates from vite build output * ๐Ÿ”ง chore: register dev:next task in turbo.json for parallel dev startup * โ™ป๏ธ refactor: rename (spa) route group to spa segment, rewrite SPA routes via middleware * โœจ feat: add Vite-compatible i18n/locale modules with import.meta.glob and resolve aliases * ๐Ÿ”ง fix: use custom Vite plugin for module redirects instead of resolve.alias * very important * build * ๐Ÿ”ง chore: update build scripts and clean up Vite configuration by removing unused plugin and code Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ—‘๏ธ refactor: remove all electron modifier scripts Modifiers are no longer needed with Vite SPA renderer build. * โœจ feat: add Vite renderer entry to electron-vite config Add renderer build configuration to electron-vite, replacing the old Next.js shadow workspace build flow. Delete buildNextApp.mts and moveNextExports.ts, update package.json scripts accordingly. * โœจ feat: add .desktop suffix files for eager i18n loading Create 4 .desktop files that use import.meta.glob({ eager: true }) for synchronous locale access in Electron desktop builds, replacing the async lazy-loading used in web SPA builds. * ๐Ÿ”ง refactor: adapt Electron main process for Vite renderer Replace nextExportDir with rendererDir, update protocol from app://next to app://renderer, simplify file resolution to SPA fallback pattern, update _next/ asset paths to /assets/. * ๐Ÿ”ง chore: update electron-builder files config for Vite renderer Replace dist/next references with dist/renderer, remove Next.js specific exclusion rules no longer applicable to Vite output. * ๐Ÿ—‘๏ธ chore: remove @ast-grep/napi dependency No longer needed after removing electron modifier scripts. * ๐Ÿ”ง refactor: unify isDesktop to __ELECTRON__ compile-time constant Remove NEXT_PUBLIC_IS_DESKTOP_APP and VITE_IS_DESKTOP_APP env vars. Unify isDesktop in @lobechat/const using __ELECTRON__ defined by Vite. Re-export from builtin-tool packages. Scripts use DESKTOP_BUILD. * update Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: use electron-vite ELECTRON_RENDERER_URL instead of hardcoded port 3015 Replace hardcoded http://localhost:3015 with process.env.ELECTRON_RENDERER_URL injected by electron-vite dev server. Clean up stale Next.js references. * ๐Ÿ› fix: use local renderer-entry shim to resolve Vite root path issue HTML entry ../../src/entry.desktop.tsx resolves to /src/entry.desktop.tsx in URL space, which Vite cannot find within apps/desktop/ root. Add a local shim that imports across root via module resolver instead. * ๐Ÿ”ง refactor: extract shared renderer Vite config into sharedRendererConfig Deduplicate plugins (nodeModuleStub, platformResolve, tsconfigPaths) and define (__MOBILE__, __ELECTRON__, process.env) between root vite.config.ts and electron.vite.config.ts renderer section. * ๐Ÿ”ง refactor: move all renderer plugins and optimizeDeps into shared config sharedRendererPlugins now includes react, codeInspectorPlugin alongside nodeModuleStub, platformResolve, tsconfigPaths. Add sharedOptimizeDeps for pre-bundling list. Both root and electron configs consume shared only. * ๐Ÿ› fix: set electron renderer root to monorepo root for correct glob resolution import.meta.glob with absolute paths (e.g. /node_modules/antd/...) resolved within apps/desktop/ instead of monorepo root. Change renderer root to ROOT_DIR, add electronDesktopHtmlPlugin middleware to rewrite / to /apps/desktop/index.html, and remove the now-unnecessary renderer-entry.ts shim. * desktop vite !! Signed-off-by: Innei <tukon479@gmail.com> * sync import !! Signed-off-by: Innei <tukon479@gmail.com> * clean ci!! Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: update SPA path structure and clean up dependencies - Changed the path in .gitignore and related files from [locale] to [variants] for SPA templates. - Updated index.html to set body height to 100%. - Cleaned up package.json by removing unused dependencies and reorganizing devDependencies. - Refactored RendererUrlManager to use a constant for SPA entry HTML path. - Removed obsolete route.ts file from the SPA structure. - Adjusted proxy configuration to reflect the new SPA path structure. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: update build script to include mobile SPA build - Modified the build script in package.json to add the mobile SPA build step. - Ensured the build process accommodates both desktop and mobile SPA versions. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: update build scripts and improve file encoding consistency - Modified the build script in package.json to ensure the SPA copy step runs after the build. - Updated file encoding in generateSpaTemplates.mts from 'utf-8' to 'utf8' for consistency. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง fix: correct Blob import syntax and update global server config type - Fixed the Blob import syntax in route.ts to ensure proper module loading. - Updated the global server configuration type in global.d.ts for improved type safety. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง test: update RendererUrlManager test to reflect new file path - Modified the mock implementation in RendererUrlManager.test.ts to check for the updated file path '/mock/export/out/apps/desktop/index.html'. - Adjusted the expected resolved path in the test to match the new structure. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: remove catch-all example file and update imports - Deleted the catch-all example file `catch-all.eg.ts` to streamline the codebase. - Updated import paths in `ClientResponsiveLayout.tsx` and `ClientResponsiveContent/index.tsx` to use the new dynamic import location. - Added type declarations for HTML templates in `spaHtmlTemplates.d.ts`. - Adjusted `tsconfig.json` to include the updated file structure. - Enhanced type definitions in `global.d.ts` and fixed locale loading in `locale.vite.ts`. Signed-off-by: Innei <tukon479@gmail.com> * e2e Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: remove unused build script for Vercel deployment - Deleted the `build:vercel` script from package.json to streamline the build process. - Ensured the remaining build scripts are organized and relevant. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง config: update Vite build input for mobile support - Changed the build input path in vite.config.ts to conditionally use 'index.mobile.html' for mobile builds, enhancing support for mobile SPA versions. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง feat: add compatibility checks for import maps and cascade layers - Implemented functions to check for browser support of import maps and CSS cascade layers. - Redirected users to a compatibility page if their browser does not support the required features. - Updated the build script in package.json to use the experimental analyze command for better performance. Signed-off-by: Innei <tukon479@gmail.com> * chore: rename Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง feat: refactor authentication layout and introduce global providers - Created a new `RootLayout` component to streamline the layout structure. - Removed the old layout file for variants and integrated necessary features into the new layout. - Added `AuthGlobalProvider` to manage authentication context and server configurations. - Introduced language and theme selection components for enhanced user experience. - Updated various components to utilize the new context and improve modularity. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง config: exclude build artifacts from serverless functions - Updated the `next.config.ts` to exclude SPA, desktop, and mobile build artifacts from serverless functions. - Added paths for `public/spa/**`, `dist/**`, `apps/desktop/build/**`, and `packages/database/migrations/**` to the exclusion list. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง config: refine exclusion of build artifacts from serverless functions - Updated `next.config.ts` to specify exclusion paths for desktop and mobile build artifacts. - Changed exclusions from `dist/**` and `apps/desktop/build/**` to `dist/desktop/**`, `dist/mobile/**`, and `apps/desktop/**` for better clarity and organization. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง fix: update BrowserRouter basename for local development - Modified the `ClientRouter` component to conditionally set the `basename` of `BrowserRouter` based on the `__DEBUG_PROXY__` variable, improving local development experience. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง feat: implement mobile SPA workflow and S3 asset management - Added a new workflow for building and uploading mobile SPA assets to S3, including environment variable configurations in `.env.example`. - Updated `package.json` to include a new script for the mobile SPA workflow. - Enhanced the Vite configuration to support dynamic CDN base paths. - Refactored the template generation script to handle mobile HTML templates more effectively. - Introduced new modules for uploading assets to S3 and generating mobile HTML templates. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ› fix: extract origin from MOBILE_S3_PUBLIC_DOMAIN to prevent double key prefix * ๐Ÿ”ง fix: update mobile HTML template to use the latest asset versions - Modified the mobile HTML template to reference the updated JavaScript asset version for improved functionality. - Ensured consistency in the template structure while maintaining existing styles and scripts. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: update dependencies and refine service worker integration - Removed outdated dependencies related to Serwist from package.json and tsconfig.json. - Added vite-plugin-pwa to enhance PWA capabilities in the Vite configuration. - Updated service worker registration logic in the PWA installation component. - Introduced a new local development proxy route for debugging purposes. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: refactor development scripts and remove Turbo configuration - Updated the `dev` script in `package.json` to use a new startup sequence script for improved development workflow. - Removed the outdated `turbo.json` configuration file as it is no longer needed. - Introduced `devStartupSequence.mts` to manage the startup of Next.js and Vite processes concurrently. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง feat: update entry points and introduce debug proxy for local development - Changed the main entry point in `index.html` from `entry.desktop.tsx` to `entry.web.tsx` for improved web compatibility. - Added an `initialize.ts` file to enable `immer`'s `enableMapSet` functionality. - Introduced a new `__DEBUG_PROXY__` variable in global types to support local development proxy features. - Implemented a debug proxy route to facilitate local development with dynamic HTML injection and script handling. - Removed outdated mobile routing components to streamline the codebase. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: replace BrowserRouter with RouterProvider for improved routing - Updated entry points for desktop, mobile, and web to utilize RouterProvider and createAppRouter for better routing management. - Removed the deprecated renderRoutes function in favor of a more streamlined router configuration. - Enhanced router setup to support error boundaries and dynamic routing. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: remove direct access handling for SPA routes in proxy configuration - Eliminated the handling of direct access to pre-rendered SPA pages in the proxy configuration. - Simplified the request processing logic by removing checks for SPA routes, streamlining the middleware response flow. Signed-off-by: Innei <tukon479@gmail.com> * update * ๐Ÿ”ง refactor: enhance Worker instantiation logic in mobile HTML template * ๐Ÿ› fix: remove duplicate waitForPageWorkspaceReady calls in page CRUD e2e steps * ๐Ÿ”ง refactor: simplify createTracePayload function by using btoa for base64 encoding * ๐Ÿ”ง refactor: specify locales in import.meta.glob for dayjs and antd * ๐Ÿ”ง refactor: replace Node.js Buffer with web-compatible btoa for base64 encoding in file upload * ๐Ÿ› fix: disable consistent-type-imports rule for mdx files to prevent eslint crash * ๐Ÿ”ง refactor: add height style to root div for consistent layout * ๐Ÿ”ง refactor: replace btoa with Buffer for base64 encoding in trace and file upload handling * ๐Ÿ”ง refactor: extract nextjsOnlyRoutes to a separate file for better organization * ๐Ÿ”ง refactor: enable Immer MapSet plugin in tests for better state management Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง refactor: integrate sharedRollupOutput configuration and increase cache size for better performance Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ—‘๏ธ chore: remove obsolete desktop.routes.test.ts file as it is no longer needed Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ› fix: use cross-env for env vars in npm scripts (Windows CI) Co-authored-by: Cursor <cursoragent@cursor.com> * ๐Ÿ”ง chore: update Dockerfile for web-only build and adjust npm scripts to use pnpm Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: enhance Dockerfile prebuild process with environment checks and add new dependencies - Updated Dockerfile to include environment checks before removing desktop-only code. - Added new dependencies in package.json: @aws-sdk/client-bedrock-runtime, @opentelemetry/auto-instrumentations-node, @opentelemetry/resources, @opentelemetry/sdk-metrics, and ajv. - Configured Rollup to exclude @aws-sdk/client-bedrock-runtime from the SPA bundle. - Introduced dockerPrebuild.mts script for environment variable validation and information logging. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: enhance Vite and Electron configurations with environment loading and trace encoding improvements - Updated Vite and Electron configurations to load environment variables using loadEnv. - Modified trace encoding in utils to use TextEncoder for better compatibility. - Adjusted sharedRendererConfig to expose only necessary public environment variables. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ—‘๏ธ chore: remove plans directory (migrated to discussion) * โ™ป๏ธ refactor: inject NEXT_PUBLIC_* env per key in Vite define Co-authored-by: Cursor <cursoragent@cursor.com> * โœจ feat: add loading screen with animation to enhance user experience - Introduced a loading screen with a brand logo and animations for better visual feedback during loading times. - Implemented CSS styles for the loading screen and animations in index.html. - Removed the loading screen from the DOM once the layout is ready using useLayoutEffect in SPAGlobalProvider. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ—‘๏ธ chore: remove unnecessary external dependency from Vite configuration - Eliminated the external dependency '@aws-sdk/client-bedrock-runtime' from the Vite configuration to streamline the build process for the SPA bundle. Signed-off-by: Innei <tukon479@gmail.com> * โœจ feat: add web app manifest link in index.html and enable PWA support in Vite configuration - Added a link to the web app manifest in index.html to enhance PWA capabilities. - Enabled manifest support in Vite configuration for improved service worker functionality. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ”ง chore: update link rel attributes for improved SEO and consistency - Modified link rel attributes in multiple components to remove 'noreferrer' and standardize to 'nofollow'. - Adjusted imports in PageContent components for better organization. Signed-off-by: Innei <tukon479@gmail.com> * update provider * โœจ feat: enhance loading experience and update package dependencies - Added a loading screen with animations and a brand logo in index.html for improved user feedback during loading times. - Introduced CSS styles for the loading screen and animations. - Updated package.json files across multiple packages to include "@lobechat/const" as a dependency. Signed-off-by: Innei <tukon479@gmail.com> * fix: update proxy Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ—‘๏ธ chore: remove GlobalLayout and Locale components - Deleted GlobalLayout and Locale components from the GlobalProvider directory to streamline the codebase. - This removal is part of a refactor to simplify the layout structure and improve maintainability. Signed-off-by: Innei <tukon479@gmail.com> * chore: clean up console logs and improve component structure - Removed unnecessary console log statements from AgentForkTag components in both agent and community directories to enhance code cleanliness. - Refactored UserAgentList component for better readability by restructuring the useUserDetailContext hook and adjusting the layout of Flexbox components. Signed-off-by: Innei <tukon479@gmail.com> * chore: remove console log from MemoryAnalysis component * chore: update mobile HTML template with new asset links - Replaced the previous asset links in the mobile HTML template with updated versions to ensure the latest resources are utilized. - Adjusted the link rel attributes for module preloading to enhance performance and loading efficiency. Signed-off-by: Innei <tukon479@gmail.com> * fix: correct variable assignment in createClientTaskThread integration test - Updated the assignment of the second parent message in the createClientTaskThread integration test to improve clarity and ensure proper data handling. - Changed the variable name from 'secondParentMsg' to 'inserted' for better context before extracting the first message from the inserted results. Signed-off-by: Innei <tukon479@gmail.com> * refactor: simplify authentication check in define-config - Removed the dependency on the isDesktop variable in the authentication check to streamline the logic. - Enhanced the clarity of the redirection process for protected routes by focusing solely on the isLoggedIn status. Signed-off-by: Innei <tukon479@gmail.com> * โœจ feat(dev): enhance local development setup with debug proxy instructions - Added detailed instructions for starting the development environment in CLAUDE.md, including commands for SPA and full-stack modes. - Updated README.md and README.zh-CN.md to reflect new commands and the debug proxy URL for local development. - Introduced a Vite plugin to print the debug proxy URL upon server start, facilitating easier local development against the production backend. - Corrected the debug proxy route in entry.web.tsx and define-config.ts for consistency. This improves the developer experience by providing clear guidance and tools for local development. Signed-off-by: Innei <tukon479@gmail.com> * optimize perf * optimize perf * optimize perf * remove speedy plugin * add dayjs vendor * Revert "remove speedy plugin" This reverts commit bf986afeb114939c2bddfa41ff24827ea8559183. --------- Signed-off-by: Innei <tukon479@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>2 ไธชๆœˆๅ‰
๐Ÿ› fix: configure anthropic client timeout (#15042)3 ๅคฉๅ‰
โ™ป๏ธ refactor(docker-compose): restructure dev environment (#12132) * ๐Ÿ”ฅ chore(docker-compose): remove Casdoor SSO dependency Casdoor is no longer needed since BetterAuth now supports email/password registration natively. LOBE-3907 * โ™ป๏ธ refactor(docker-compose): restructure directories - Rename local/ to dev/ for development dependencies - Remove logto/ and zitadel/ from production/ - Restore Casdoor config in production/grafana/ - Simplify dev/ to core services only (postgresql, redis, rustfs, searxng) - Update docker-compose.development.yml to use dev/ - Remove minio-bucket.config.json (switched to rustfs) * โ™ป๏ธ refactor(docker-compose): simplify dev environment setup - Remove docker-compose.development.yml, use dev/docker-compose.yml directly - Add npm scripts: dev:docker, dev:docker:down, dev:docker:reset - Simplify .env.example.development (remove variable refs, redundant vars) - Update docker-compose/dev/.env.example (consistent passwords) - Add docker-compose/dev/data/ to .gitignore - Update setup docs: use npm scripts, remove image generation section * ๐Ÿ”ง chore: add SSRF_ALLOW_PRIVATE_IP_ADDRESS to dev env example * ๐Ÿ”’ security: auto-generate KEY_VAULTS_SECRET and AUTH_SECRET in setup.sh - Remove hardcoded secrets from docker-compose.yml - Add placeholders to .env.example files - Generate secrets dynamically in setup.sh using openssl rand -base64 32 * ๐Ÿ”ง chore(docker-compose): expose SearXNG port and improve dev scripts - Add SearXNG port mapping (8180:8080) for host access - Use --wait flag in dev:docker to ensure services are healthy - Include db:migrate in dev:docker:reset for one-command reset - Update MinIO reference to RustFS in zh-CN docs - Add SearXNG to service URLs and port conflict docs3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
โœจ feat: per-call llm_generation_tracing observability (#15124) * โœจ feat(database): add llm_generation_tracing schema + tracing package (LOBE-9462) Foundation layer for per-call observability of `generateObject` calls. - New Drizzle table `llm_generation_tracing` with identity / context / model / result / usage / storage / feedback / audit columns and full single-column index coverage (Postgres bitmap-scan friendly). Migration 0103 is idempotent (CREATE TABLE/INDEX IF NOT EXISTS) for safe re-runs. - `LlmGenerationTracingModel` with `record` / `updateFeedback` / `findById` / `listRecent`, all userId-scoped to prevent cross-user leaks. - New package `@lobechat/llm-generation-tracing` mirroring agent-tracing's shape: `ITracingStore` interface, `FileTracingStore` (local/dev, scenario subfolders + latest.json symlink), `computePromptHash` (6-char sha256 of systemPrompt + schema), and `TRACING_SCENARIO_REGISTRY` + `resolveScenario` with explicit scenario override. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(model-runtime): wire llm_generation_tracing into ModelRuntime.generateObject (LOBE-9462) Per-call interception layer โ€” one hook covers all generateObject callers. - New `onGenerateObjectComplete` hook on `ModelRuntimeHooks`: always fires (success or failure) with latency, usage, output/error. Fixes the gap where `onGenerateObjectFinal` only fires when the runtime invokes `onUsage`. - `S3TracingStore` (zstd level 3, key `llm-generation-tracing/{scenario}/{v}-{hash}/{date}/{id}.json.zst`) and `LLMGenerationTracingService` that does DB insert โ†’ store.save โ†’ patch storage_key. Store failures preserve the row with `metadata.store_error`. - `createLLMGenerationTracingHook` + `mergeModelRuntimeHooks` wired into `initModelRuntimeFromDB`; tracing runs alongside business (billing) hooks via `next/server.after()` when available, microtask fallback otherwise. Unknown metadata keys (e.g. `parent_memory_trace_key`) pass through. - Memory extractor accepts `parentMemoryTraceKey` option for the job-level backlink. Follow-up-action caller given an explicit `scenario: 'follow_up'` metadata override โ€” it was the only OSS caller missing trigger metadata. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœ… test(llm-generation-tracing): type vi.fn mocks so tsgo accepts mock.calls indexing The hook + service tests destructured `mock.calls[0][0]` and accessed nested fields, which tsgo flagged as TS2493 / TS18046 because `vi.fn()` defaults to a zero-arg signature. Add explicit type parameters to the mocks so tsgo can infer the call tuple, and cast `call.payload` at the access point. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(model-runtime): move mergeModelRuntimeHooks into the package It's a generic utility for composing `ModelRuntimeHooks` instances โ€” same import surface as `ModelRuntime` and the hooks interface โ€” so it belongs alongside them rather than tucked under a server-side consumer. - New `packages/model-runtime/src/core/mergeHooks.ts` exports `mergeModelRuntimeHooks` and is re-exported from the package index. - Move the unit tests to `packages/model-runtime/src/core/mergeHooks.test.ts`, including a new case covering the "a throws โ†’ b is skipped" load-bearing semantics. - `src/server/services/llmGenerationTracing/hook.ts` drops the local copy and the consumer (`src/server/modules/ModelRuntime/index.ts`) imports from `@lobechat/model-runtime`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(llm-generation-tracing): version lives with the prompt, not in a central table `promptVersion` was baked into `TRACING_SCENARIO_REGISTRY`, far from any prompt definition โ€” editing a prompt + forgetting to bump the entry in a completely different file was an obvious foot-gun. - Registry is now `Record<string, string>` mapping trigger โ†’ scenario only; it's the stable concern that rarely changes. - `resolveScenario` always passes `promptVersion` through from the caller, defaulting to `UNKNOWN_PROMPT_VERSION` ('v0') when absent. - Each call site declares its own `*_PROMPT_VERSION` constant next to the prompt it describes. `followUpAction` ships the first one: `FOLLOW_UP_PROMPT_VERSION` in `prompts/index.ts`, threaded through `metadata.promptVersion` at the `generateObject` call. Other callers can add the same constant when they next touch their prompts. The 6-char prompt hash on the row still catches forgotten bumps. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(input-completion): wire prompt-version metadata at the auto-complete call site Aligns input auto-complete with the FOLLOW_UP_PROMPT_VERSION convention so each prompt iteration is recordable as the chat-side tracing lands. - `INPUT_COMPLETION_PROMPT_VERSION = 'v1.0'` declared next to `chainInputCompletion` โ€” bump together with the prompt body. - `fetchPresetTaskResult` accepts optional `metadata` and forwards it to `getChatCompletion`; the existing chat path already plumbs metadata to `ModelRuntime.chat` options. - `InputEditor` call site passes `{ scenario: 'input_completion', promptVersion }`. Note: `llm_generation_tracing` currently only fires from `onGenerateObjectComplete`. Input completion is a `chat` call, so this metadata is forward-looking until a chat-side tracing hook lands. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ› fix(llm-generation-tracing): collapse bucketDir path.join args to silence turbopack glob warning Turbopack's static analyzer treats `path.join(root, dyn1, dyn2)` as a multi-segment glob pattern and warned that it could match ~12k files in the project. Compose the relative subdir as a single string first, so `path.join` only sees one dynamic segment. Behavior unchanged โ€” the resulting path is identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(input-completion): route auto-complete through generateObject for tracing Auto-complete is the first preset-task caller migrated to the structured- output path so it lands in `llm_generation_tracing` via the existing `onGenerateObjectComplete` hook. No new server hook, no global chat-side tracing. - `chainInputCompletion` now returns `{ messages, schema }` with a minimal `{ completion: string }` schema and a stable `INPUT_COMPLETION_SCHEMA_NAME` constant. JSON wrapping costs ~15-30 tokens against a 100-token completion budget โ€” negligible for the observability win. - `StructureOutputSchema` / `StructureOutputParams` accept optional `metadata`; `aiChatRouter.outputJSON` merges caller metadata over the default trigger so `{ scenario, promptVersion, schemaName }` reach `ModelRuntime.generateObject` options unchanged. - `IStructureSchema.description` is now optional to match the zod schema โ€” previously the TS type was stricter than runtime validation accepted. - `InputEditor` switches from `chatService.fetchPresetTaskResult` to `aiChatService.generateJSON`, reading `response.completion`. Streaming is dropped because auto-complete already buffers the full result before inserting; no UX change. - Reverts the unused `metadata` field that was added to `fetchPresetTaskResult` in the previous commit โ€” no current caller needs it now that input completion uses the generateObject path. Bumps `INPUT_COMPLETION_PROMPT_VERSION` to v2.0 because the system prompt gained an "output the completion field" instruction. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(aiGeneration): extract the runtime-init + generateObject dance into a service Every server-side caller that produces structured output was repeating the same two-step ritual: `initModelRuntimeFromDB(...)` โ†’ `runtime.generateObject(payload, { metadata })`. `AiGenerationService` collapses it into one call so future cross-cutting concerns (default metadata, retry, observability hooks) have one place to land. - New `src/server/services/aiGeneration/index.ts` exposes `generateObject<T>(input, options)` and is unit-tested for provider resolution + payload/metadata pass-through. - `aiChatRouter.outputJSON` and `FollowUpActionService.extract` migrated to the service (other callers move organically when next touched). - Drops the unused `keyVaultsPayload` field from `StructureOutputParams` and the placeholder at the InputEditor call site โ€” key vaults are server-resolved from DB, the client never supplies them. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(tracing): centralize TRACING_SCENARIOS const + inject AiGenerationService via trpc ctx - New `packages/const/src/llmGenerationTracing.ts` exports `TRACING_SCENARIOS` + `TracingScenario` type โ€” the single directory where every known scenario name lives. Adds `@lobechat/const` as a workspace dep on llm-generation- tracing so `TRACING_SCENARIO_REGISTRY` can reference the same literals. - Callers (FollowUpActionService, InputEditor) replace `'follow_up'` / `'input_completion'` string literals with `TRACING_SCENARIOS.FollowUp` / `.InputCompletion`, so a typo or a rename fails the type-check instead of silently drifting on the row. - `AiGenerationService` is now injected into the `aiChatProcedure` ctx middleware alongside `aiChatService`; `outputJSON` consumes it via `ctx.aiGenerationService` instead of new-ing it inside the handler. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(llm-generation-tracing): add lt/llm-tracing CLI + drop local-only storage_key - Add `lt` / `llm-tracing` CLI under @lobechat/llm-generation-tracing with `list` (recent records, --scenario filter, --json) and `inspect` (by tracing_id prefix or latest, --full, --json). - `FileTracingStore.save` now returns `{ key: null }` so dev DB rows leave `storage_key` empty instead of recording a non-resolvable local path; S3 store remains the source of truth for the real key. Add helpers `findByTracingId` / `getLatest` used by the CLI. - Wire `agentId` and `topicId` into `input_completion` tracing metadata from the chat input auto-complete call site. - Default `FileTracingStore` whenever NODE_ENV=development (drop the ENABLE_LLM_GENERATION_TRACING_LOCAL opt-in env var). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ’„ style(llm-generation-tracing): prettier CLI output (tree + colors) Mirror the @lobechat/agent-tracing viewer style: - Inline ANSI color helpers (dim/bold/cyan/magenta/green/yellow/red). - Compact single-line header with id, scenario, version, model, status, time โ€” replaces the multi-line bullet list. - Tree structure with `โ”œโ”€`/`โ””โ”€` connectors instead of `โ”€โ”€ section โ”€โ”€` banners. - input arrays render per-message (role + char count + preview) rather than dumping raw JSON. - Small single-key outputs (e.g. `{ completion: "ๆ€Žไนˆๆ ท" }`) collapse to inline `key: "value"`. - `lt list` switches to a colored, properly padded table. Default view stays compact; --full expands system_prompt / input / schema bodies. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(llm-generation-tracing): split `tracing` config out of `metadata` `options.metadata` was overloaded โ€” half tracing-specific structured fields (scenario / promptVersion / schemaName / agentId / topicId / ...), half free-form jsonb passthrough. Callers couldn't tell which was which, and the inputHint was always auto-extracted (useless when the prompt wraps the user's text in a template). This commit introduces a dedicated `tracing` option: - Add `TracingOptions` to @lobechat/llm-generation-tracing โ€” the typed shape callers import (agentId / topicId / inputHint / scenario / promptVersion / schemaName / systemPrompt / parentTracingId / metadata). - Add loose `tracing?: Record<string, unknown>` to GenerateObjectOptions and StructureOutputParams / StructureOutputSchema so the field flows through the runtime + TRPC. - Tracing hook now reads `context.options.tracing` for structured fields; it still falls back to `metadata.trigger` for the cross-cutting trigger string (ModelRuntime itself uses metadata.trigger for timing logs, so trigger stays on metadata). - Service `record()` accepts an explicit `inputHint`; otherwise falls back to auto-extraction from the first user message. Always truncated. - Free-form jsonb fields move to `tracing.metadata` (was unknown-key passthrough on `metadata`). - Call sites updated: - FollowUpAction now passes `tracing: { scenario, promptVersion, schemaName, topicId }` (previously `metadata`). - InputCompletion now passes `tracing: { agentId, topicId, inputHint: input, scenario, promptVersion, schemaName }` โ€” `inputHint` is the user's actual typed text, not the wrapper prompt's first user message. - `aiChat.outputJSON` router forwards both metadata and tracing. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Update inputCompletion.ts * ๐Ÿ› fix(llm-generation-tracing): stop duplicating provider into the row's metadata jsonb `provider` is already a first-class column on the `llm_generation_tracing` row, so auto-stamping it into the `metadata` jsonb column on every call was pure noise. The hook now writes the caller-supplied `tracing.metadata` verbatim โ€” empty/undefined when the caller had nothing to add. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>13 ๅฐๆ—ถๅ‰
๐Ÿ”จ chore: update i18n files & fix title skeleton (#14301) * chore: update i18n files & fix title skeleton * chore: update taskTemplate json * chore: update i18n files24 ๅคฉๅ‰
โช revert: revert pnpm v11 migration (#14372) * Revert "๐Ÿ‘ท build: disable pnpm gvs for desktop ci (#14357)" This reverts commit 948ba5ec68e347a116f52e3599894d3002f0cb9a. * Revert "๐Ÿ‘ท build(repo): migrate to pnpm v11 and consolidate workspace config (#14316)" This reverts commit 1d9b6099bd7ce72d0b656d45936fc81cd8d0ee68.22 ๅคฉๅ‰
โœจ feat: betterauth username signin (#10607) 5 ไธชๆœˆๅ‰
๐Ÿ”จ chore: replace husky with native git hooks (#14941)3 ๅคฉๅ‰
๐Ÿ’ฅ feat: try 2.0 next BREAKING CHANGE: starting V2 6 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
:sparkles: feat: add `gpt-4o-mini` in OpenAI Provider and set it as the default model (#3256) * :sparkles: feat: gpt-4o-mini to openai provider * โ™ป๏ธ refactor: move gpt-4o-mini as default model * โœ… test: fix test * ๐Ÿ› fix: set gpt-4o-mini as default model * chore: improve code * chore: improve code --------- Co-authored-by: arvinxx <arvinx@foxmail.com>1 ๅนดๅ‰
๐Ÿ”จ chore: update lint and TypeScript configs to exclude temporary directories (#8856) - Add tmp, temp, .temp directories to .eslintignore - Add .local, .cache, .claude, .serena directories to .eslintignore - Create .stylelintignore with same ignore patterns - Update tsconfig.json to exclude temporary directories from type checking - Prevents linting and type checking of temporary and AI tool directories8 ไธชๆœˆๅ‰
๐Ÿ“ docs(skills): rename code-review to review-checklist (#14229)26 ๅคฉๅ‰
chore: streamline issue triage to core business labels (1-3 per issue) (#14962) * refactor: streamline issue triage labels --------- Co-authored-by: lobehubbot <i@lobehub.com>4 ๅคฉๅ‰
๐Ÿ“ docs: make AGENTS the source of truth (#14180)28 ๅคฉๅ‰
๐Ÿ“ docs: Add topics usage 2 ๅนดๅ‰
๐Ÿ“ docs: sync contributing guide branding (#13533)1 ไธชๆœˆๅ‰
๐Ÿ› fix: configure anthropic client timeout (#15042)3 ๅคฉๅ‰
โœจ feat(ci): add Claude PR auto-assign reviewer workflow (#13120)2 ไธชๆœˆๅ‰
๐Ÿ“ docs: renamed license to LobeHub Community License (#9355) update license7 ไธชๆœˆๅ‰
๐Ÿ“ docs: add ph #1 badge (#15007) * docs: add ph #1 badge * docs: add ph #1 badge * docs: add ph #1 badge3 ๅคฉๅ‰
๐Ÿ“ docs: add ph #1 badge (#15007) * docs: add ph #1 badge * docs: add ph #1 badge * docs: add ph #1 badge3 ๅคฉๅ‰
๐Ÿ“ docs: add `SECURITY.md` with vulnerability reporting policy (#13528) ๐Ÿ“ docs: add SECURITY.md with vulnerability reporting policy Define supported versions, reporting guidelines, response timeline, scope (in/out), and disclosure policy for security vulnerabilities. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 ไธชๆœˆๅ‰
๐Ÿ”จ chore: use percentage value for Codecov (#13121) build: use percentage value2 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
โœจ feat(desktop): add local update testing scripts and stable channel API version check (#11474) * chore: stable updater * โœจ feat: add local update testing scripts and configuration - Introduced scripts for local update testing, including setup, server management, and manifest generation. - Added `dev-app-update.local.yml` for local server configuration. - Implemented `generate-manifest.sh` to create update manifests. - Created `run-test.sh` for streamlined testing process. - Updated `README.md` with instructions for local testing setup and usage. - Enhanced `UpdaterManager` to allow forced use of dev update configuration in packaged apps. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ› fix(desktop): update UpdaterManager test mocks for new exports Add missing mock exports for @/modules/updater/configs: - isStableChannel - githubConfig - UPDATE_SERVER_URL Add mock for @/env with getDesktopEnv Add setFeedURL method to autoUpdater mock * โœจ feat: add Conductor setup scripts and configuration * โœจ feat: enhance update modal functionality and refactor modal hooks - Added `useUpdateModal` for managing update modal state and behavior. - Refactored `UpdateModal` to utilize new modal management approach. - Improved `useWatchBroadcast` integration for handling update events. - Removed deprecated `createModalHooks` and related components from `FunctionModal`. - Updated `AddFilesToKnowledgeBase` and `CreateNew` modals to use new modal context for closing behavior. This refactor streamlines modal management and enhances the user experience during update processes. Signed-off-by: Innei <tukon479@gmail.com> * update flow (#11513) * ci: simplify desktop release workflow and add renderer tarball * ๐Ÿ‘ท ci: fix s3 upload credentials for desktop release * ๐Ÿ› fix(ci): use compact jq output for GitHub Actions matrix Add -c flag to jq commands to produce single-line JSON output, fixing "Invalid format" error when setting GITHUB_OUTPUT. * ๐Ÿ› fix(ci): add administration permission to detect self-hosted runner The /actions/runners API requires administration:read permission to list repository runners. * ๐Ÿ”ง refactor(ci): use workflow input for self-hosted runner selection Replace API-based runner detection with workflow input parameter since GITHUB_TOKEN lacks permission to call /actions/runners API. - Add `use_self_hosted_mac` input (default: true) - Release events always use self-hosted runner - Manual dispatch can toggle via input * feat(updater): add stable channel support with fallback mechanism - Configure electron-builder to generate stable-mac.yml for stable channel - Update CI workflow to handle both stable and latest manifest files - Implement fallback to GitHub provider when primary S3 provider fails - Reset to primary provider after successful update check * ๐Ÿ› fix(updater): remove invalid channel config from electron-builder - Remove unsupported 'channel' property from electron-builder config - Create stable*.yml files from latest*.yml in workflow instead - This ensures electron-updater finds correct manifest for stable channel * ๐Ÿ› fix(updater): use correct channel based on provider type - S3 provider: channel='stable' โ†’ looks for stable-mac.yml - GitHub provider: channel='latest' โ†’ looks for latest-mac.yml This fixes the 404 error when falling back to GitHub releases, which only have latest-mac.yml files. * refactor(env): remove unused OFFICIAL_CLOUD_SERVER and update env defaults Update environment variable handling by removing unused OFFICIAL_CLOUD_SERVER and setting defaults for UPDATE_CHANNEL and UPDATE_SERVER_URL from process.env during build stage. * ๐Ÿ› fix(ci): add version prefix to stable manifest URLs for S3 S3 directory structure: stable/{version}/xxx.dmg So stable-mac.yml URLs need version prefix: url: LobeHub-2.1.0-arm64.dmg โ†’ url: 2.1.1/LobeHub-2.1.0-arm64.dmg * โœจ feat(ci): add renderer tar manifest for integrity verification Creates stable-renderer.yml with SHA512 checksum for lobehub-renderer.tar.gz This allows the desktop app to verify renderer tarball integrity before extraction. * ๐Ÿ› fix(ci): fix YAML syntax error in renderer manifest generation * โœจ feat(ci): archive manifest files in version directory * refactor(ci): update desktop release workflows to streamline build process - Removed unnecessary dependencies in the build job for the desktop beta workflow. - Introduced a new gate job to conditionally proceed with publishing based on the success of previous jobs. - Updated macOS file merging to depend on the new gate job instead of the build job. - Simplified macOS runner selection logic in the stable workflow by using GitHub-hosted runners exclusively. Signed-off-by: Innei <tukon479@gmail.com> * refactor(electron): reorganize titlebar components and update imports - Moved titlebar components to a new directory structure for better organization. - Updated import paths for `SimpleTitleBar`, `TitleBar`, and related constants. - Introduced new components for connection management and navigation within the titlebar. - Added constants for title bar height to maintain consistency across components. This refactor enhances the maintainability of the titlebar code and improves the overall structure of the Electron application. Signed-off-by: Innei <tukon479@gmail.com> * feat(ci): add release notes handling to desktop stable workflow - Enhanced the desktop stable release workflow to include release notes. - Updated output variables to capture release notes from the GitHub event. - Adjusted environment variables in subsequent jobs to utilize the new release notes data. This addition improves the clarity and documentation of releases by ensuring that release notes are included in the workflow process. Signed-off-by: Innei <tukon479@gmail.com> * ๐Ÿ› fix: call onClose after knowledge base modal closes * ๐Ÿงช test: fix UpdaterManager update channel mocks --------- Signed-off-by: Innei <tukon479@gmail.com>4 ไธชๆœˆๅ‰
โœจ feat: add work path for local system (#11128) * โœจ feat: support to show working dir * fix style * update docs * update topic * refactor to use chat config * inject working Directory * update i18n * fix tests4 ไธชๆœˆๅ‰
๐Ÿ’„ style: Update agent onboarding style (#13678) * ๐Ÿ’„ style: Update onboarding * style: update * ๐Ÿ’„ style: Update i18n * fix: test1 ไธชๆœˆๅ‰
๐Ÿ’„ style: mount DynamicFavicon for agent operation favicon switching (#13416) * โœจ feat: mount DynamicFavicon to enable favicon state switching during agent operations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ๐Ÿ› fix: add favicon link tags to SPA HTML templates and handle missing links in updateFaviconDOM Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 ไธชๆœˆๅ‰
๐Ÿ’„ style: mount DynamicFavicon for agent operation favicon switching (#13416) * โœจ feat: mount DynamicFavicon to enable favicon state switching during agent operations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ๐Ÿ› fix: add favicon link tags to SPA HTML templates and handle missing links in updateFaviconDOM Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update basic config 4 ไธชๆœˆๅ‰
ย ๐Ÿ› fix(auth): add AUTH_DISABLE_EMAIL_PASSWORD env to enable SSO-only mode (#12009) 3 ไธชๆœˆๅ‰
โ™ป๏ธ refactor: serve Vite SPA static assets under /_spa (#13409) Made-with: Cursor1 ไธชๆœˆๅ‰
โœจ feat: per-call llm_generation_tracing observability (#15124) * โœจ feat(database): add llm_generation_tracing schema + tracing package (LOBE-9462) Foundation layer for per-call observability of `generateObject` calls. - New Drizzle table `llm_generation_tracing` with identity / context / model / result / usage / storage / feedback / audit columns and full single-column index coverage (Postgres bitmap-scan friendly). Migration 0103 is idempotent (CREATE TABLE/INDEX IF NOT EXISTS) for safe re-runs. - `LlmGenerationTracingModel` with `record` / `updateFeedback` / `findById` / `listRecent`, all userId-scoped to prevent cross-user leaks. - New package `@lobechat/llm-generation-tracing` mirroring agent-tracing's shape: `ITracingStore` interface, `FileTracingStore` (local/dev, scenario subfolders + latest.json symlink), `computePromptHash` (6-char sha256 of systemPrompt + schema), and `TRACING_SCENARIO_REGISTRY` + `resolveScenario` with explicit scenario override. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(model-runtime): wire llm_generation_tracing into ModelRuntime.generateObject (LOBE-9462) Per-call interception layer โ€” one hook covers all generateObject callers. - New `onGenerateObjectComplete` hook on `ModelRuntimeHooks`: always fires (success or failure) with latency, usage, output/error. Fixes the gap where `onGenerateObjectFinal` only fires when the runtime invokes `onUsage`. - `S3TracingStore` (zstd level 3, key `llm-generation-tracing/{scenario}/{v}-{hash}/{date}/{id}.json.zst`) and `LLMGenerationTracingService` that does DB insert โ†’ store.save โ†’ patch storage_key. Store failures preserve the row with `metadata.store_error`. - `createLLMGenerationTracingHook` + `mergeModelRuntimeHooks` wired into `initModelRuntimeFromDB`; tracing runs alongside business (billing) hooks via `next/server.after()` when available, microtask fallback otherwise. Unknown metadata keys (e.g. `parent_memory_trace_key`) pass through. - Memory extractor accepts `parentMemoryTraceKey` option for the job-level backlink. Follow-up-action caller given an explicit `scenario: 'follow_up'` metadata override โ€” it was the only OSS caller missing trigger metadata. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœ… test(llm-generation-tracing): type vi.fn mocks so tsgo accepts mock.calls indexing The hook + service tests destructured `mock.calls[0][0]` and accessed nested fields, which tsgo flagged as TS2493 / TS18046 because `vi.fn()` defaults to a zero-arg signature. Add explicit type parameters to the mocks so tsgo can infer the call tuple, and cast `call.payload` at the access point. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(model-runtime): move mergeModelRuntimeHooks into the package It's a generic utility for composing `ModelRuntimeHooks` instances โ€” same import surface as `ModelRuntime` and the hooks interface โ€” so it belongs alongside them rather than tucked under a server-side consumer. - New `packages/model-runtime/src/core/mergeHooks.ts` exports `mergeModelRuntimeHooks` and is re-exported from the package index. - Move the unit tests to `packages/model-runtime/src/core/mergeHooks.test.ts`, including a new case covering the "a throws โ†’ b is skipped" load-bearing semantics. - `src/server/services/llmGenerationTracing/hook.ts` drops the local copy and the consumer (`src/server/modules/ModelRuntime/index.ts`) imports from `@lobechat/model-runtime`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(llm-generation-tracing): version lives with the prompt, not in a central table `promptVersion` was baked into `TRACING_SCENARIO_REGISTRY`, far from any prompt definition โ€” editing a prompt + forgetting to bump the entry in a completely different file was an obvious foot-gun. - Registry is now `Record<string, string>` mapping trigger โ†’ scenario only; it's the stable concern that rarely changes. - `resolveScenario` always passes `promptVersion` through from the caller, defaulting to `UNKNOWN_PROMPT_VERSION` ('v0') when absent. - Each call site declares its own `*_PROMPT_VERSION` constant next to the prompt it describes. `followUpAction` ships the first one: `FOLLOW_UP_PROMPT_VERSION` in `prompts/index.ts`, threaded through `metadata.promptVersion` at the `generateObject` call. Other callers can add the same constant when they next touch their prompts. The 6-char prompt hash on the row still catches forgotten bumps. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(input-completion): wire prompt-version metadata at the auto-complete call site Aligns input auto-complete with the FOLLOW_UP_PROMPT_VERSION convention so each prompt iteration is recordable as the chat-side tracing lands. - `INPUT_COMPLETION_PROMPT_VERSION = 'v1.0'` declared next to `chainInputCompletion` โ€” bump together with the prompt body. - `fetchPresetTaskResult` accepts optional `metadata` and forwards it to `getChatCompletion`; the existing chat path already plumbs metadata to `ModelRuntime.chat` options. - `InputEditor` call site passes `{ scenario: 'input_completion', promptVersion }`. Note: `llm_generation_tracing` currently only fires from `onGenerateObjectComplete`. Input completion is a `chat` call, so this metadata is forward-looking until a chat-side tracing hook lands. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ› fix(llm-generation-tracing): collapse bucketDir path.join args to silence turbopack glob warning Turbopack's static analyzer treats `path.join(root, dyn1, dyn2)` as a multi-segment glob pattern and warned that it could match ~12k files in the project. Compose the relative subdir as a single string first, so `path.join` only sees one dynamic segment. Behavior unchanged โ€” the resulting path is identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(input-completion): route auto-complete through generateObject for tracing Auto-complete is the first preset-task caller migrated to the structured- output path so it lands in `llm_generation_tracing` via the existing `onGenerateObjectComplete` hook. No new server hook, no global chat-side tracing. - `chainInputCompletion` now returns `{ messages, schema }` with a minimal `{ completion: string }` schema and a stable `INPUT_COMPLETION_SCHEMA_NAME` constant. JSON wrapping costs ~15-30 tokens against a 100-token completion budget โ€” negligible for the observability win. - `StructureOutputSchema` / `StructureOutputParams` accept optional `metadata`; `aiChatRouter.outputJSON` merges caller metadata over the default trigger so `{ scenario, promptVersion, schemaName }` reach `ModelRuntime.generateObject` options unchanged. - `IStructureSchema.description` is now optional to match the zod schema โ€” previously the TS type was stricter than runtime validation accepted. - `InputEditor` switches from `chatService.fetchPresetTaskResult` to `aiChatService.generateJSON`, reading `response.completion`. Streaming is dropped because auto-complete already buffers the full result before inserting; no UX change. - Reverts the unused `metadata` field that was added to `fetchPresetTaskResult` in the previous commit โ€” no current caller needs it now that input completion uses the generateObject path. Bumps `INPUT_COMPLETION_PROMPT_VERSION` to v2.0 because the system prompt gained an "output the completion field" instruction. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(aiGeneration): extract the runtime-init + generateObject dance into a service Every server-side caller that produces structured output was repeating the same two-step ritual: `initModelRuntimeFromDB(...)` โ†’ `runtime.generateObject(payload, { metadata })`. `AiGenerationService` collapses it into one call so future cross-cutting concerns (default metadata, retry, observability hooks) have one place to land. - New `src/server/services/aiGeneration/index.ts` exposes `generateObject<T>(input, options)` and is unit-tested for provider resolution + payload/metadata pass-through. - `aiChatRouter.outputJSON` and `FollowUpActionService.extract` migrated to the service (other callers move organically when next touched). - Drops the unused `keyVaultsPayload` field from `StructureOutputParams` and the placeholder at the InputEditor call site โ€” key vaults are server-resolved from DB, the client never supplies them. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(tracing): centralize TRACING_SCENARIOS const + inject AiGenerationService via trpc ctx - New `packages/const/src/llmGenerationTracing.ts` exports `TRACING_SCENARIOS` + `TracingScenario` type โ€” the single directory where every known scenario name lives. Adds `@lobechat/const` as a workspace dep on llm-generation- tracing so `TRACING_SCENARIO_REGISTRY` can reference the same literals. - Callers (FollowUpActionService, InputEditor) replace `'follow_up'` / `'input_completion'` string literals with `TRACING_SCENARIOS.FollowUp` / `.InputCompletion`, so a typo or a rename fails the type-check instead of silently drifting on the row. - `AiGenerationService` is now injected into the `aiChatProcedure` ctx middleware alongside `aiChatService`; `outputJSON` consumes it via `ctx.aiGenerationService` instead of new-ing it inside the handler. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โœจ feat(llm-generation-tracing): add lt/llm-tracing CLI + drop local-only storage_key - Add `lt` / `llm-tracing` CLI under @lobechat/llm-generation-tracing with `list` (recent records, --scenario filter, --json) and `inspect` (by tracing_id prefix or latest, --full, --json). - `FileTracingStore.save` now returns `{ key: null }` so dev DB rows leave `storage_key` empty instead of recording a non-resolvable local path; S3 store remains the source of truth for the real key. Add helpers `findByTracingId` / `getLatest` used by the CLI. - Wire `agentId` and `topicId` into `input_completion` tracing metadata from the chat input auto-complete call site. - Default `FileTracingStore` whenever NODE_ENV=development (drop the ENABLE_LLM_GENERATION_TRACING_LOCAL opt-in env var). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ๐Ÿ’„ style(llm-generation-tracing): prettier CLI output (tree + colors) Mirror the @lobechat/agent-tracing viewer style: - Inline ANSI color helpers (dim/bold/cyan/magenta/green/yellow/red). - Compact single-line header with id, scenario, version, model, status, time โ€” replaces the multi-line bullet list. - Tree structure with `โ”œโ”€`/`โ””โ”€` connectors instead of `โ”€โ”€ section โ”€โ”€` banners. - input arrays render per-message (role + char count + preview) rather than dumping raw JSON. - Small single-key outputs (e.g. `{ completion: "ๆ€Žไนˆๆ ท" }`) collapse to inline `key: "value"`. - `lt list` switches to a colored, properly padded table. Default view stays compact; --full expands system_prompt / input / schema bodies. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * โ™ป๏ธ refactor(llm-generation-tracing): split `tracing` config out of `metadata` `options.metadata` was overloaded โ€” half tracing-specific structured fields (scenario / promptVersion / schemaName / agentId / topicId / ...), half free-form jsonb passthrough. Callers couldn't tell which was which, and the inputHint was always auto-extracted (useless when the prompt wraps the user's text in a template). This commit introduces a dedicated `tracing` option: - Add `TracingOptions` to @lobechat/llm-generation-tracing โ€” the typed shape callers import (agentId / topicId / inputHint / scenario / promptVersion / schemaName / systemPrompt / parentTracingId / metadata). - Add loose `tracing?: Record<string, unknown>` to GenerateObjectOptions and StructureOutputParams / StructureOutputSchema so the field flows through the runtime + TRPC. - Tracing hook now reads `context.options.tracing` for structured fields; it still falls back to `metadata.trigger` for the cross-cutting trigger string (ModelRuntime itself uses metadata.trigger for timing logs, so trigger stays on metadata). - Service `record()` accepts an explicit `inputHint`; otherwise falls back to auto-extraction from the first user message. Always truncated. - Free-form jsonb fields move to `tracing.metadata` (was unknown-key passthrough on `metadata`). - Call sites updated: - FollowUpAction now passes `tracing: { scenario, promptVersion, schemaName, topicId }` (previously `metadata`). - InputCompletion now passes `tracing: { agentId, topicId, inputHint: input, scenario, promptVersion, schemaName }` โ€” `inputHint` is the user's actual typed text, not the wrapper prompt's first user message. - `aiChat.outputJSON` router forwards both metadata and tracing. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * Update inputCompletion.ts * ๐Ÿ› fix(llm-generation-tracing): stop duplicating provider into the row's metadata jsonb `provider` is already a first-class column on the `llm_generation_tracing` row, so auto-stamping it into the `metadata` jsonb column on every call was pure noise. The hook now writes the caller-supplied `tracing.metadata` verbatim โ€” empty/undefined when the caller had nothing to add. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>13 ๅฐๆ—ถๅ‰
โœจ feat(agent-mock): add agent mock devtools with playback & fixture viewer (#14436) * :package: feat(agent-mock): scaffold package skeleton * :wrench: chore(agent-mock): align deps + add vitest config * :sparkles: feat(agent-mock): add core types * :sparkles: feat(agent-mock): add chunkSplitter with code-point safety * :sparkles: feat(agent-mock): map ExecutionSnapshot โ†’ MockEvent[] * :sparkles: feat(agent-mock): add defineCase / llmStep / toolStep / errorStep DSL * :sparkles: feat(agent-mock): add snapshotToMockCase helper * :sparkles: feat(agent-mock): add todo-write-stress builtin case + registry * :sparkles: feat(agent-mock): add generator registry + tool-stress generator * :sparkles: feat(agent-mock): add 4 more builtin cases (long-reasoning, mixed, error, subagent) * :sparkles: feat(agent-mock): add subagent-tree + long-reasoning generators * :sparkles: feat(agent-mock): add MockPlayer state machine + step navigation * :sparkles: feat(agent-mock): add __agentMockSilent flag + signal bridge guard * :sparkles: feat(agent-mock): add executeMockStream with side-effect gating * :sparkles: feat(agent-mock): add dev-only devClearMockTopics TRPC procedure * :sparkles: feat(agent-mock): add dev API to list/read .agent-tracing snapshots * :sparkles: feat(agent-mock): add agentMockStore zustand * :sparkles: feat(agent-mock): add useMockCases hook * :sparkles: feat(agent-mock): add useAgentMockPlayer hook * :sparkles: feat(agent-mock): add useMockTopicCleanup hook * :sparkles: feat(agent-mock): add Fab entry component * :sparkles: feat(agent-mock): add Modal shell with tab bar * :sparkles: feat(agent-mock): add CaseList sidebar with search + groups * :sparkles: feat(agent-mock): add MiniBar floating playback controls * :sparkles: feat(agent-mock): add StatusGrid component * :sparkles: feat(agent-mock): add Controls (play/pause/step/speed) * :sparkles: feat(agent-mock): add ProgressBar * :sparkles: feat(agent-mock): add TargetPicker * :sparkles: feat(agent-mock): compose PlayerPanel * :sparkles: feat(agent-mock): add TimelinePanel + virtualized EventRow * :sparkles: feat(agent-mock): add read-only FixtureViewer with copy button * :sparkles: feat(agent-mock): add SettingsPanel with toggles + clear topics * :recycle: refactor(agent-mock): address quality review (stable itemContent, type-safe error handling, clipboard catch) * :sparkles: feat(agent-mock): wire entry component (FAB + Modal + MiniBar) * :sparkles: feat(agent-mock): mount AgentMockDevtools in SPAGlobalProvider * :recycle: refactor(agent-mock): switch Modal to imperative createModal API * :bug: fix(agent-mock): use close() + onOpenChangeComplete to preserve motion exit animation * work Signed-off-by: Innei <tukon479@gmail.com> * minify Signed-off-by: Innei <tukon479@gmail.com> * :lipstick: refactor(agent-mock): rebuild devtools UI/UX with mono palette and IA reorg Replace the in-modal sidebar + tab strip + MiniBar with a Fab-anchored draggable Popover (case picker, transport, replay/loop, scrubbable progress, stop, Open DevTools) and a token-driven Modal layout (two-row header, Segmented view tabs, StatsStrip, sticky TransportBar). Wire EventRow and the progress bars to seekToEventIndex (resolves the prior TODO), swap alert() for toast.warning, persist loop and popover position to localStorage. * work Signed-off-by: Innei <tukon479@gmail.com> * :broom: chore(agent-mock): remove replay debug logs * ๐Ÿ‘ท build: add @google/genai to pnpm allowBuilds Fixes ERR_PNPM_IGNORED_BUILDS in CI โ€” pnpm v11 blocks install when a dependency with install scripts is not in the allowBuilds list. * ๐Ÿ› fix: resolve TS type errors in useAgentMockPlayer - parentMessageId: coerce `undefined` to `null` to match `string | null` - threadId: coerce `null` to `undefined` for cancelOperations param * :recycle: refactor: revert ConversationArea & sync-import AgentMockDevtools - ConversationArea: restore messageMapKey(context), avoid needless field spread - SPAGlobalProvider: switch AgentMockDevtools to sync import (dev-only, no need to lazy) --------- Signed-off-by: Innei <tukon479@gmail.com>17 ๅคฉๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
๐Ÿ”ง chore: update eslint v2 configuration and suppressions (#12133) * v2 init * chore: update eslint suppressions and package dependencies - Removed several eslint suppressions related to array sorting and reversing from eslint-suppressions.json to clean up the configuration. - Updated @lobehub/lint package version from 2.0.0-beta.6 to 2.0.0-beta.7 in package.json for improvements and bug fixes. - Made minor formatting adjustments in vitest.config.mts and various SKILL.md files for better readability and consistency. Signed-off-by: Innei <tukon479@gmail.com> * fix: clean up import statements and formatting - Removed unnecessary whitespace in replaceComponentImports.ts for improved readability. - Standardized import statements in contextEngineering.ts and createAgentExecutors.ts by adding missing spaces for consistency. Signed-off-by: Innei <tukon479@gmail.com> * chore: update eslint suppressions and clean up code formatting * ๐Ÿ› fix: use vi.hoisted for mock variable initialization Fix TDZ error in persona service test by using vi.hoisted() to ensure mock variables are available when vi.mock factory runs. --------- Signed-off-by: Innei <tukon479@gmail.com> 3 ไธชๆœˆๅ‰
๐Ÿ”จ chore: exclude `apps/device-gateway` in type check (#12628) exclude apps/device-gateway route2 ไธชๆœˆๅ‰
โ™ป๏ธ refactor: serve Vite SPA static assets under /_spa (#13409) Made-with: Cursor1 ไธชๆœˆๅ‰
โšก๏ธ perf: warm route chunks after idle (#15109) * โšก๏ธ perf: warm route chunks after idle * ๐Ÿ› fix: normalize platform route chunk ids * โšก๏ธ perf: refine route chunk preloading * ๐Ÿ”ง chore: keep desktop renderer preload unchanged * โšก๏ธ perf: skip renderer chunks in route warmup * โšก๏ธ perf: preload agent route dynamic chunks * โšก๏ธ perf: align route preload deployment urls * โšก๏ธ perf: coalesce stable vendor chunks * โšก๏ธ perf: group shared data runtime chunks * โšก๏ธ perf: group model runtime chunks * โšก๏ธ perf: trim initial route preloads * โšก๏ธ perf: limit idle route micro preloads * โšก๏ธ perf: strip tiny html modulepreloads * โšก๏ธ perf: prune redundant route chunk imports * โšก๏ธ perf: enable rolldown devtools * โšก๏ธ perf: gate vite devtools output * โšก๏ธ perf: optimize react-scan integration and update global types Signed-off-by: Innei <tukon479@gmail.com> * โšก๏ธ perf: support cloud route chunk preload --------- Signed-off-by: Innei <tukon479@gmail.com>1 ๅคฉๅ‰
โœจ feat(agent-explorer): support multi-select delete in document tree (#15125) * โœจ feat(agent-explorer): support multi-select delete in document tree - Right-click on a multi-selected row deletes the whole selection; dedupe descendants when an ancestor folder is also selected - Reserve chevron slot in SkillsList rows so atomic and bundled skills align - Centralize EMPTY_ARRAY (typed `never[]`, frozen) in @lobechat/const * โ™ป๏ธ refactor: migrate delete confirm dialog from antd modal to confirmModal * โœ… test: stabilize bun vitest environment * ๐Ÿ”ง ci: avoid authenticated checkout for PR tests15 ๅฐๆ—ถๅ‰

LobeHub

LobeHub ๅฏๅฐ†ๆ‚จ็š„ๆ™บ่ƒฝไฝ“็ป„็ป‡ไธบๅ…จๅคฉๅ€™่ฟ่กŒๆจกๅผใ€‚

ๅฎƒ่ƒฝไธบๆ‚จ็š„ๆ•ดไธช AI ๅ›ข้˜ŸๅฎŒๆˆๆ™บ่ƒฝไฝ“ๆ‹›ๅ‹Ÿใ€ไปปๅŠก่ฐƒๅบฆๅ’Œๅทฅไฝœๆฑ‡ๆŠฅใ€‚

ๆ‚จๅง‹็ปˆๆŽŒๆŽงๅ…จๅฑ€๏ผŒๆ— ้œ€ๆ—ถๅˆปๅœจ็บฟใ€‚

English ยท ็ฎ€ไฝ“ไธญๆ–‡ ยท ๅฎ˜ๆ–น็ฝ‘็ซ™ ยท ๆ›ดๆ–ฐๆ—ฅๅฟ— ยท ๆ–‡ๆกฃไธญๅฟƒ ยท ๅšๅฎข ยท ๅ้ฆˆๅปบ่ฎฎ




ๅˆ†ไบซ LobeHub ไป“ๅบ“

ๆ‚จ็š„้ฆ–ๅธญๆ™บ่ƒฝไฝ“่ฟ่ฅๅฎ˜

LobeHub - Your Chief Agent Operator for multi-agent work | Product Hunt lobehub%2Flobehub | Trendshift

็›ฎๅฝ•

็›ฎๅฝ•



https://github.com/user-attachments/assets/0a33365f-b786-48b5-9ed6-f8af7927bccb

๐Ÿ‘‹๐Ÿป ๅฟซ้€Ÿๅผ€ๅง‹ & ๅŠ ๅ…ฅ็คพๅŒบ

ๆˆ‘ไปฌๆ˜ฏไธ€็พคๅด‡ๅฐš e/acc ็†ๅฟต็š„่ฎพ่ฎกๅทฅ็จ‹ๅธˆ๏ผŒ่‡ดๅŠ›ไบŽไธบ AIGC ้ข†ๅŸŸๆไพ›็ŽฐไปฃๅŒ–็š„่ฎพ่ฎก็ป„ไปถไธŽๅทฅๅ…ทใ€‚ ๆˆ‘ไปฌ้‡‡็”จ่‡ชไธพ๏ผˆBootstrapping๏ผ‰ๆจกๅผ๏ผŒๆ—จๅœจไธบๅผ€ๅ‘่€…ๅ’Œ็”จๆˆทๆ‰“้€ ไธ€ไธชๆ›ดๅผ€ๆ”พใ€้€ๆ˜Žไธ”ๆ˜“็”จ็š„ไบงๅ“็”Ÿๆ€็ณป็ปŸใ€‚

ๆ— ่ฎบๆ‚จๆ˜ฏๆ™ฎ้€š็”จๆˆท่ฟ˜ๆ˜ฏไธ“ไธšๅผ€ๅ‘่€…๏ผŒLobeHub ้ƒฝๅฐ†ๆˆไธบๆ‚จ็š„ AI ๆ™บ่ƒฝไฝ“๏ผˆAgent๏ผ‰ๆธธไนๅœบใ€‚่ฏทๆณจๆ„๏ผŒLobeHub ็›ฎๅ‰ไปๅœจ็งฏๆžๅผ€ๅ‘ไธญ๏ผŒๅฆ‚้‡ๅˆฐไปปไฝ•้—ฎ้ข˜๏ผŒๆฌข่ฟŽ้€š่ฟ‡ issues ๆไพ›ๅ้ฆˆใ€‚

ๆˆ‘ไปฌๅทฒๅœจ Product Hunt ไธŠ็บฟ๏ผ่ƒฝๅฐ† LobeHub ๅ‘ˆ็Žฐ็ป™ๅคงๅฎถ๏ผŒๆˆ‘ไปฌๆ„Ÿๅˆฐ้žๅธธๆฟ€ๅŠจใ€‚ๅฆ‚ๆžœๆ‚จ็›ธไฟกไบบ็ฑปไธŽๆ™บ่ƒฝไฝ“ๅ…ฑๅŒ่ฟ›ๅŒ–็š„ๆœชๆฅ๏ผŒๆฌข่ฟŽๆ”ฏๆŒๆˆ‘ไปฌ็š„ๆ—…็จ‹ใ€‚
ๅŠ ๅ…ฅๆˆ‘ไปฌ็š„ Discord ็คพๅŒบ๏ผๅœจ่ฟ™้‡Œ๏ผŒๆ‚จๅฏไปฅไธŽ LobeHub ็š„ๅผ€ๅ‘่€…ๅ’Œๅ…ถไป–็ƒญๅฟƒ็”จๆˆทไบคๆตไบ’ๅŠจใ€‚

Important

็‚นไบฎๆ˜Ÿๆ ‡๏ผŒๆ‚จๅฐ†ๅณๆ—ถๆ”ถๅˆฐ GitHub ไธŠ็š„ๆ‰€ๆœ‰็‰ˆๆœฌๆ›ดๆ–ฐ้€š็Ÿฅ ~ โญ๏ธ

ๆ˜Ÿๆ ‡ๅކๅฒ

โœจ ๆ ธๅฟƒๅŠŸ่ƒฝ

ๅฆ‚ไปŠ็š„ๆ™บ่ƒฝไฝ“ๅคงๅคšๆ˜ฏไธ€ๆฌกๆ€ง็š„ไปปๅŠก้ฉฑๅŠจๅทฅๅ…ทใ€‚ๅฎƒไปฌ็ผบไนไธŠไธ‹ๆ–‡ๆ„Ÿ็Ÿฅ่ƒฝๅŠ›๏ผŒๅฝผๆญคๅญค็ซ‹่ฟ่กŒ๏ผŒๅนถไธ”ๅœจไธๅŒ็ช—ๅฃๅ’Œๆจกๅž‹ไน‹้—ด้œ€่ฆๆ‰‹ๅŠจๅˆ‡ๆขใ€‚่™ฝ็„ถ้ƒจๅˆ†ๆ™บ่ƒฝไฝ“ๅ…ทๅค‡่ฎฐๅฟ†ๅŠŸ่ƒฝ๏ผŒไฝ†ๅ…ถ่ฎฐๅฟ†ๅพ€ๅพ€ๆ˜ฏๅ…จๅฑ€้€š็”จใ€ๆต…ๆ˜พ่กจ้ขไธ”็ผบไนไธชๆ€งๅŒ–็š„ใ€‚ๅœจ่ฟ™็งๆจกๅผไธ‹๏ผŒ็”จๆˆท่ขซ่ฟซๅœจ็ขŽ็‰‡ๅŒ–็š„ๅฏน่ฏไน‹้—ดๅๅคๅˆ‡ๆข๏ผŒ้šพไปฅๅฝขๆˆ็ป“ๆž„ๅŒ–็š„็”ŸไบงๅŠ›ใ€‚

LobeHub ๅฝปๅบ•ๆ”นๅ˜ไบ†่ฟ™ไธ€ๅˆ‡ใ€‚

LobeHub ๆ˜ฏไธ€ไธชๅทฅไฝœไธŽ็”Ÿๆดป็ฉบ้—ด๏ผŒไฝ ๅฏไปฅๅœจ่ฟ™้‡Œๆ‰พๅˆฐใ€ๅˆ›ๅปบๆ™บ่ƒฝไฝ“้˜Ÿๅ‹๏ผŒๅนถไธŽๅฎƒไปฌๅไฝœๆˆ้•ฟใ€‚ๅœจ LobeHub ไธญ๏ผŒๆˆ‘ไปฌๅฐ†ๆ™บ่ƒฝไฝ“่ง†ไธบๅทฅไฝœๅ•ๅ…ƒ๏ผŒๆไพ›ไธ€ไธช่ฎฉไบบ็ฑปไธŽๆ™บ่ƒฝไฝ“ๅ…ฑๅŒ่ฟ›ๅŒ–็š„ๅŸบ็ก€่ฎพๆ–ฝใ€‚

่ฟ่ฅไธญๅฟƒ๏ผšๆ™บ่ƒฝไฝ“ๅณๅทฅไฝœๅ•ๅ…ƒ

ๆ‹›ๅ‹Ÿใ€่ฐƒๅบฆๅนถ็ฎก็†ไฝ ็š„ๆ•ดไธช AI ๅ›ข้˜Ÿใ€‚

  • ๆ›ด้ซ˜็”ŸไบงๅŠ›๏ผŒๆ›ดๅฐ‘ๅทฅๅ…ท๏ผšๅฐ†ๆ‰€ๆœ‰ๆ™บ่ƒฝไฝ“้›†ไธญๅˆฐไธ€ไธชๅนณๅฐใ€‚
  • ๅณๆ—ถ้€š่ฎฏ็ฝ‘ๅ…ณ๏ผšๅœจไฝ ๆ—ฅๅธธไฝฟ็”จ็š„่Šๅคฉๅทฅๅ…ทไธญ็›ดๆŽฅๆŽฅๅ…ฅๆ™บ่ƒฝไฝ“ใ€‚

ๅˆ›ๅปบไธญๅฟƒ๏ผšๆ™บ่ƒฝไฝ“ๅณๅทฅไฝœๅ•ๅ…ƒ

ๆ‰“้€ ไธชๆ€งๅŒ– AI ๅ›ข้˜Ÿๅง‹ไบŽๆ™บ่ƒฝไฝ“ๆž„ๅปบๅ™จใ€‚ไฝ ๅช้œ€ๆ่ฟฐไธ€ๆฌก้œ€ๆฑ‚๏ผŒๆ™บ่ƒฝไฝ“่ฎพ็ฝฎไพฟไผš็ซ‹ๅณๅฏๅŠจ๏ผŒๅนถๅบ”็”จ่‡ชๅŠจ้…็ฝฎ๏ผŒ่ฎฉไฝ ๅฏไปฅๅณๆ—ถไฝฟ็”จใ€‚

  • ็ปŸไธ€ๆ™บ่ƒฝ๏ผšๆ— ็ผ่ฎฟ้—ฎไปปไฝ•ๆจกๅž‹ๅ’Œไปปไฝ•ๆจกๆ€โ€”โ€”ไธ€ๅˆ‡ๅฐฝๅœจไฝ ็š„ๆŽŒๆŽงไน‹ไธญใ€‚
  • 10,000+ ๆŠ€่ƒฝ๏ผš้€š่ฟ‡ๅŒ…ๅซ่ถ…่ฟ‡ 10,000 ็งๅทฅๅ…ทๅ’Œ MCP ๅ…ผๅฎนๆ’ไปถ็š„ๅบ“๏ผŒๅฐ†ไฝ ็š„ๆ™บ่ƒฝไฝ“่ฟžๆŽฅๅˆฐไฝ ๆ—ฅๅธธไฝฟ็”จ็š„ๆŠ€่ƒฝใ€‚

ๅไฝœ๏ผšๆ‹“ๅฑ•ๅ…จๆ–ฐๅไฝœ็ฝ‘็ปœๅฝขๆ€

LobeHub ๅผ•ๅ…ฅ ๆ™บ่ƒฝไฝ“็พค็ป„ ๅŠŸ่ƒฝ๏ผŒ่ฎฉไฝ ่ƒฝๅƒไธŽ็œŸๅฎž้˜Ÿๅ‹ๅไฝœไธ€ๆ ทไธŽๆ™บ่ƒฝไฝ“ๅ…ฑไบ‹ใ€‚็ณป็ปŸไผšไธบไปปๅŠก่‡ชๅŠจ่ฐƒ้…ๅˆ้€‚็š„ๆ™บ่ƒฝไฝ“๏ผŒๆ”ฏๆŒๅนถ่กŒๅไฝœไธŽ่ฟญไปฃไผ˜ๅŒ–ใ€‚

  • ้กต้ข๏ผˆPages๏ผ‰๏ผšๅœจๅŒไธ€็ฉบ้—ดๅ†…ไธŽๅคšๆ™บ่ƒฝไฝ“ๅ…ฑๅŒๆ’ฐๅ†™ๅ’Œไผ˜ๅŒ–ๅ†…ๅฎน๏ผŒๅ…ฑไบซไธŠไธ‹ๆ–‡็Žฏๅขƒใ€‚
  • ่ฐƒๅบฆ๏ผˆSchedule๏ผ‰๏ผš้ข„่ฎพไปปๅŠก่ฟ่กŒๆ—ถ้—ด๏ผŒๆ™บ่ƒฝไฝ“ๅฐ†ๅœจๆŒ‡ๅฎšๆ—ถๅˆป่‡ชๅŠจๆ‰ง่กŒๅทฅไฝœ๏ผŒๅณไฝฟไฝ ไธๅœจๅœบไนŸไธๅฝฑๅ“ใ€‚
  • ้กน็›ฎ๏ผˆProject๏ผ‰๏ผšๆŒ‰้กน็›ฎ็ปดๅบฆ็ป„็ป‡ๅทฅไฝœๅ†…ๅฎน๏ผŒ็กฎไฟไธ€ๅˆ‡ไบ•ไบ•ๆœ‰ๆกใ€ๆ˜“ไบŽ่ฟฝ่ธชใ€‚
  • ๅทฅไฝœๅŒบ๏ผˆWorkspace๏ผ‰๏ผšๅ›ข้˜ŸไธŽๆ™บ่ƒฝไฝ“ๅไฝœ็š„ๅ…ฑไบซ็ฉบ้—ด๏ผŒ็กฎไฟ็ป„็ป‡ๅ†…่Œ่ดฃๆธ…ๆ™ฐใ€ไฟกๆฏ้€ๆ˜Žใ€‚

่ฟ›ๅŒ–๏ผšไบบๆœบๅๅŒ่ฟ›ๅŒ–

ๆœ€ไผ˜็ง€็š„ AI ่ƒฝๅคŸๆทฑๅบฆ็†่งฃ็”จๆˆท้œ€ๆฑ‚ใ€‚LobeHub ๅ…ทๅค‡ ไธชไบบ่ฎฐๅฟ† ๅŠŸ่ƒฝ๏ผŒๅฏ้€ๆญฅๆž„ๅปบๅฏนไฝ ้œ€ๆฑ‚็š„ๆธ…ๆ™ฐ่ฎค็Ÿฅใ€‚

  • ๆŒ็ปญๅญฆไน ๏ผšๆ™บ่ƒฝไฝ“้€š่ฟ‡่ง‚ๅฏŸไฝ ็š„ๅทฅไฝœๆ–นๅผไธๆ–ญๅญฆไน ๏ผŒ่ฐƒๆ•ด่กŒไธบๆจกๅผไปฅๅœจๆฐๅฝ“็š„ๆ—ถๅˆปๆไพ›ๅๅŠฉใ€‚
  • ็™ฝ็›’่ฎฐๅฟ†๏ผšๆˆ‘ไปฌๅšไฟก้€ๆ˜ŽๅŒ–ๅŽŸๅˆ™ใ€‚ๆ™บ่ƒฝไฝ“้‡‡็”จ็ป“ๆž„ๅŒ–ใ€ๅฏ็ผ–่พ‘็š„่ฎฐๅฟ†ๆจกๅผ๏ผŒ่ฎฉไฝ ๅฎŒๅ…จๆŽŒๆŽงๅ…ถ่ฎฐๅฟ†ๅ†…ๅฎนใ€‚

โœจ ้š็€ LobeHub ็š„ไธๆ–ญ่ฟ›ๅŒ–๏ผŒๆ›ดๅคšๅŠŸ่ƒฝๅฐ†้€ๆญฅไธŠ็บฟใ€‚

๐Ÿ›ณ ่‡ช่กŒ้ƒจ็ฝฒ

LobeHub ๆไพ›ๅŸบไบŽ Vercelใ€้˜ฟ้‡Œไบ‘ไปฅๅŠ Docker ้•œๅƒ ็š„่‡ช่กŒ้ƒจ็ฝฒ็‰ˆๆœฌใ€‚ๆ— ้œ€ไธ“ไธš็Ÿฅ่ฏ†๏ผŒๅ‡ ๅˆ†้’Ÿๅ†…ๅณๅฏ้ƒจ็ฝฒๅฑžไบŽไฝ ็š„่Šๅคฉๆœบๅ™จไบบใ€‚

Tip

ๆƒณไบ†่งฃๆ›ดๅคš๏ผŸๆŸฅ็œ‹ ๐Ÿ“˜ ๆญๅปบไฝ ็š„ไธ“ๅฑž LobeHub ๆ–‡ๆกฃใ€‚

A ไฝฟ็”จ Vercelใ€Zeaburใ€Sealos ๆˆ–้˜ฟ้‡Œไบ‘้ƒจ็ฝฒ

"ๅฆ‚ๆžœๆ‚จๆƒณๅœจ Vercelใ€Zeabur ๆˆ–้˜ฟ้‡Œไบ‘ไธŠ่‡ช่กŒ้ƒจ็ฝฒๆญคๆœๅŠก๏ผŒๅฏๆŒ‰็…งไปฅไธ‹ๆญฅ้ชคๆ“ไฝœ๏ผš

  • ๅ‡†ๅค‡ๆ‚จ็š„ OpenAI API Keyใ€‚
  • ็‚นๅ‡ปไธ‹ๆ–นๆŒ‰้’ฎๅผ€ๅง‹้ƒจ็ฝฒ๏ผš็›ดๆŽฅไฝฟ็”จ GitHub ่ดฆๅท็™ปๅฝ•๏ผŒๅนถ่ฎฐๅพ—ๅœจ็Žฏๅขƒๅ˜้‡้ƒจๅˆ†ๅกซๅ†™ OPENAI_API_KEY๏ผˆๅฟ…ๅกซ้กน๏ผ‰ใ€‚
  • ้ƒจ็ฝฒๅฎŒๆˆๅŽ๏ผŒๅณๅฏๅผ€ๅง‹ไฝฟ็”จใ€‚
  • ็ป‘ๅฎš่‡ชๅฎšไน‰ๅŸŸๅ๏ผˆๅฏ้€‰๏ผ‰๏ผšVercel ๅˆ†้…็š„ๅŸŸๅ DNS ๅœจ้ƒจๅˆ†ๅœฐๅŒบๅญ˜ๅœจๆฑกๆŸ“้—ฎ้ข˜๏ผŒ็ป‘ๅฎš่‡ชๅฎšไน‰ๅŸŸๅๅฏๅฎž็Žฐ็›ดๆŽฅ่ฟžๆŽฅใ€‚
ไฝฟ็”จ Vercel ้ƒจ็ฝฒ ไฝฟ็”จ Zeabur ้ƒจ็ฝฒ ไฝฟ็”จ Sealos ้ƒจ็ฝฒ ไฝฟ็”จ RepoCloud ้ƒจ็ฝฒ ไฝฟ็”จ้˜ฟ้‡Œไบ‘้ƒจ็ฝฒ

Fork ไน‹ๅŽ

Fork ๅŽ๏ผŒๅœจ GitHub ไธŠไป…ไฟ็•™ไธŠๆธธๅŒๆญฅๅŠจไฝœ๏ผŒๅนถ็ฆ็”จไป“ๅบ“ไธญ็š„ๅ…ถไป–ๅŠจไฝœใ€‚

ไฟๆŒๆ›ดๆ–ฐ

ๅฆ‚ๆžœๆ‚จๆŒ‰็…ง README ไธญ็š„ไธ€้”ฎ้ƒจ็ฝฒๆญฅ้ชค้ƒจ็ฝฒไบ†่‡ชๅทฑ็š„้กน็›ฎ๏ผŒๅฏ่ƒฝไผšไธๆ–ญๆ”ถๅˆฐโ€œๆœ‰ๆ›ดๆ–ฐๅฏ็”จโ€็š„ๆ็คบใ€‚่ฟ™ๆ˜ฏๅ› ไธบ Vercel ้ป˜่ฎคไผšๅˆ›ๅปบๆ–ฐ้กน็›ฎ่€Œ้ž Fork ๆญค้กน็›ฎ๏ผŒๅฏผ่‡ดๆ— ๆณ•ๅ‡†็กฎๆฃ€ๆต‹ๆ›ดๆ–ฐใ€‚

Tip

ๅปบ่ฎฎๆ‚จๆŒ‰็…งไปฅไธ‹ๆญฅ้ชค้‡ๆ–ฐ้ƒจ็ฝฒ๏ผŒ๐Ÿ“˜ ่‡ชๅŠจๅŒๆญฅๆœ€ๆ–ฐ็‰ˆๆœฌ


B ไฝฟ็”จ Docker ้ƒจ็ฝฒ

ๆˆ‘ไปฌๆไพ›ไบ† Docker ้•œๅƒ๏ผŒไปฅไพฟๅœจๆ‚จ่‡ชๅทฑ็š„็งๆœ‰่ฎพๅค‡ไธŠ้ƒจ็ฝฒ LobeHub ๆœๅŠกใ€‚ไฝฟ็”จไปฅไธ‹ๅ‘ฝไปคๅฏๅŠจ LobeHub ๆœๅŠก๏ผš

  1. ๅˆ›ๅปบไธ€ไธช็”จไบŽๅญ˜ๅ‚จๆ–‡ไปถ็š„ๆ–‡ไปถๅคน
$ mkdir lobehub-db && cd lobehub-db
  1. ๅˆๅง‹ๅŒ– LobeHub ๅŸบ็ก€่ฎพๆ–ฝ
bash <(curl -fsSL https://lobe.li/setup.sh)
  1. ๅฏๅŠจ LobeHub ๆœๅŠก
docker compose up -d

Note

ๆœ‰ๅ…ณไฝฟ็”จ Docker ้ƒจ็ฝฒ็š„่ฏฆ็ป†่ฏดๆ˜Ž๏ผŒ่ฏทๅ‚่€ƒ ๐Ÿ“˜ Docker ้ƒจ็ฝฒๆŒ‡ๅ—


็Žฏๅขƒๅ˜้‡

ๆœฌ้กน็›ฎๆไพ›ไบ†ไธ€ไบ›้€š่ฟ‡็Žฏๅขƒๅ˜้‡่ฎพ็ฝฎ็š„้ขๅค–้…็ฝฎ้กน๏ผš

็Žฏๅขƒๅ˜้‡ ๆ˜ฏๅฆๅฟ…ๅกซ ๆ่ฟฐ ็คบไพ‹
OPENAI_API_KEY ๆ˜ฏ ่ฟ™ๆ˜ฏๆ‚จๅœจ OpenAI ่ดฆๆˆท้กต้ข็”ณ่ฏท็š„ API ๅฏ†้’ฅ sk-xxxxxx...xxxxxx
OPENAI_PROXY_URL ๅฆ ๅฆ‚ๆžœๆ‚จๆ‰‹ๅŠจ้…็ฝฎไบ† OpenAI ๆŽฅๅฃไปฃ็†๏ผŒๅฏ้€š่ฟ‡ๆญค้…็ฝฎ้กน่ฆ†็›–้ป˜่ฎค็š„ OpenAI API ่ฏทๆฑ‚ๅŸบ็ก€ URL https://api.chatanywhere.cn ๆˆ– https://aihubmix.com/v1
้ป˜่ฎคๅ€ผไธบ
https://api.openai.com/v1
OPENAI_MODEL_LIST ๅฆ ็”จไบŽๆŽงๅˆถๆจกๅž‹ๅˆ—่กจใ€‚ไฝฟ็”จ + ๆทปๅŠ ๆจกๅž‹๏ผŒ- ้š่—ๆจกๅž‹๏ผŒmodel_name=display_name ่‡ชๅฎšไน‰ๆจกๅž‹ๆ˜พ็คบๅ็งฐ๏ผŒๅ„้กนไน‹้—ด็”จ้€—ๅทๅˆ†้š”ใ€‚ qwen-7b-chat,+glm-6b,-gpt-3.5-turbo

Note

ๅฎŒๆ•ด็š„็Žฏๅขƒๅ˜้‡ๅˆ—่กจๅฏๅœจ ๐Ÿ“˜ ็Žฏๅขƒๅ˜้‡ ไธญๆ‰พๅˆฐ

๐Ÿ“ฆ ็”Ÿๆ€็ณป็ปŸ

NPM ๅŒ… ไปฃ็ ไป“ๅบ“ ๆ่ฟฐ ็‰ˆๆœฌ
@lobehub/ui lobehub/lobe-ui ไธ“ๆณจไบŽๆž„ๅปบ AIGC ็ฝ‘้กตๅบ”็”จ็š„ๅผ€ๆบ UI ็ป„ไปถๅบ“ใ€‚
@lobehub/icons lobehub/lobe-icons ็ƒญ้—จ AI / LLM ๆจกๅž‹ๅ“็‰Œ SVG ๆ ‡ๅฟ—ๅŠๅ›พๆ ‡้›†ๅˆใ€‚
@lobehub/tts lobehub/lobe-tts ้ซ˜่ดจ้‡ไธ”ๅฏ้ ็š„ TTS/STT React Hooks ๅบ“
@lobehub/lint lobehub/lobe-lint LobeHub ็š„ ESlintใ€Stylelintใ€Commitlintใ€Prettierใ€Remark ๅŠ Semantic Release ้…็ฝฎ้›†ๅˆใ€‚

๐Ÿงฉ ๆ’ไปถ

ๆ’ไปถๆไพ›ไบ†ๆ‰ฉๅฑ• LobeHub ๅ‡ฝๆ•ฐ่ฐƒ็”จ ่ƒฝๅŠ›็š„้€”ๅพ„ใ€‚ๅฎƒไปฌๅฏ็”จไบŽๅผ•ๅ…ฅๆ–ฐ็š„ๅ‡ฝๆ•ฐ่ฐƒ็”จ๏ผŒ็”š่‡ณๆ˜ฏๆ–ฐ็š„ๆถˆๆฏ็ป“ๆžœๆธฒๆŸ“ๆ–นๅผใ€‚ๅฆ‚ๆžœๆ‚จๅฏนๆ’ไปถๅผ€ๅ‘ๆ„Ÿๅ…ด่ถฃ๏ผŒ่ฏทๅ‚้˜…ๆˆ‘ไปฌ Wiki ไธญ็š„ ๐Ÿ“˜ ๆ’ไปถๅผ€ๅ‘ๆŒ‡ๅ—ใ€‚

  • lobe-chat-plugins๏ผš่ฟ™ๆ˜ฏ LobeHub ็š„ๆ’ไปถ็ดขๅผ•ใ€‚ๅฎƒ้€š่ฟ‡่ฎฟ้—ฎๆญคไป“ๅบ“ไธญ็š„ index.json๏ผŒๅ‘็”จๆˆทๅฑ•็คบ LobeHub ็š„ๅฏ็”จๆ’ไปถๅˆ—่กจใ€‚
  • chat-plugin-template๏ผš่ฟ™ๆ˜ฏ็”จไบŽ LobeHub ๆ’ไปถๅผ€ๅ‘็š„ๆ’ไปถๆจกๆฟใ€‚
  • @lobehub/chat-plugin-sdk๏ผšLobeHub ๆ’ไปถ SDK ๅŠฉๅŠ›ๆ‚จไธบ LobeHub ๅˆ›ๅปบๅ‡บ่‰ฒ็š„่Šๅคฉๆ’ไปถใ€‚
  • @lobehub/chat-plugins-gateway๏ผšLobeHub ๆ’ไปถ็ฝ‘ๅ…ณๆ˜ฏไธ€ไธชไธบ LobeHub ๆ’ไปถๆไพ›็ฝ‘ๅ…ณๆœๅŠก็š„ๅŽ็ซฏๆœๅŠกใ€‚ๆˆ‘ไปฌไฝฟ็”จ Vercel ้ƒจ็ฝฒๆญคๆœๅŠกใ€‚ไธป่ฆ API POST /api/v1/runner ้ƒจ็ฝฒไธบ Edge Functionใ€‚

Note

ๆ’ไปถ็ณป็ปŸ็›ฎๅ‰ๆญฃๅœจ่ฟ›่กŒ้‡ๅคงๅผ€ๅ‘ใ€‚ๆ‚จๅฏไปฅ้€š่ฟ‡ไปฅไธ‹่ฎฎ้ข˜ไบ†่งฃๆ›ดๅคšไฟกๆฏ๏ผš

  • Plugin Phase 1๏ผšๅฎž็Žฐๆ’ไปถไธŽไธปไฝ“ๅˆ†็ฆป๏ผŒๅฐ†ๆ’ไปถๆ‹†ๅˆ†ไธบ็‹ฌ็ซ‹ไป“ๅบ“่ฟ›่กŒ็ปดๆŠค๏ผŒๅนถๅฎž็Žฐๆ’ไปถ็š„ๅŠจๆ€ๅŠ ่ฝฝใ€‚
  • Plugin Phase 2๏ผšๆ’ไปถไฝฟ็”จ็š„ๅฎ‰ๅ…จๆ€งไธŽ็จณๅฎšๆ€ง๏ผŒๆ›ดๅ‡†็กฎๅœฐๅ‘ˆ็Žฐๅผ‚ๅธธ็Šถๆ€๏ผŒๆ’ไปถๆžถๆž„็š„ๅฏ็ปดๆŠคๆ€ง๏ผŒไปฅๅŠๅฏนๅผ€ๅ‘่€…ๅ‹ๅฅฝใ€‚
  • Plugin Phase 3๏ผšๆ›ด้ซ˜็บงใ€ๆ›ดๅ…จ้ข็š„่‡ชๅฎšไน‰่ƒฝๅŠ›๏ผŒๆ”ฏๆŒๆ’ไปถ่ฎค่ฏ๏ผŒไปฅๅŠ็คบไพ‹ใ€‚

โŒจ๏ธ ๆœฌๅœฐๅผ€ๅ‘

ๆ‚จๅฏไปฅไฝฟ็”จ GitHub Codespaces ่ฟ›่กŒๅœจ็บฟๅผ€ๅ‘๏ผš

ๆˆ–่€…ๅ…‹้š†้กน็›ฎ่ฟ›่กŒๆœฌๅœฐๅผ€ๅ‘๏ผš

$ git clone https://github.com/lobehub/lobehub.git
$ cd lobehub
$ pnpm install
$ pnpm dev          # Full-stack (Next.js + Vite SPA)
$ bun run dev:spa   # SPA frontend only (port 9876)

่ฐƒ่ฏ•ไปฃ็†๏ผš่ฟ่กŒ dev:spa ๅŽ๏ผŒ็ปˆ็ซฏไผšๆ‰“ๅฐ็ฑปไผผ https://app.lobehub.com/_dangerous_local_dev_proxy?debug-host=http%3A%2F%2Flocalhost%3A9876 ็š„ไปฃ็† URLใ€‚ ๆ‰“ๅผ€่ฏฅ URL ๅณๅฏ็ป“ๅˆ็ƒญๆจกๅ—ๆ›ฟๆข๏ผˆHMR๏ผ‰ๅŠŸ่ƒฝ๏ผŒๅŸบไบŽ็”Ÿไบง็ŽฏๅขƒๅŽ็ซฏ่ฟ›่กŒๆœฌๅœฐๅผ€ๅ‘ใ€‚

ๅฆ‚ๆžœๆ‚จๆƒณไบ†่งฃๆ›ดๅคš็ป†่Š‚๏ผŒๆฌข่ฟŽๆŸฅ้˜…ๆˆ‘ไปฌ็š„ ๐Ÿ“˜ ๅผ€ๅ‘ๆŒ‡ๅ—ใ€‚

๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

ๆˆ‘ไปฌ็ƒญ็ƒˆๆฌข่ฟŽๅ„็งๅฝขๅผ็š„่ดก็Œฎ๏ผ›ๅฆ‚ๆžœๆ‚จๆœ‰ๅ…ด่ถฃ่ดก็Œฎไปฃ็ ๏ผŒไธๅฆจๆŸฅ็œ‹ GitHub ไธŠ็š„ Issues ๅ’Œ Projects๏ผŒๆทฑๅ…ฅๅ‚ไธŽๅนถๅฑ•็คบๆ‚จ็š„่ƒฝๅŠ›ใ€‚

Tip

ๆˆ‘ไปฌๆญฃๅœจๆ‰“้€ ไธ€ไธชๆŠ€ๆœฏ้ฉฑๅŠจ็š„ไบคๆตๅนณๅฐ๏ผŒๆ—จๅœจไฟƒ่ฟ›็Ÿฅ่ฏ†ไบ’ๅŠจไธŽๆ€ๆƒณ็ขฐๆ’ž๏ผŒไปฅๆœŸๆฟ€ๅ‘็ตๆ„Ÿใ€ไฟƒๆˆๅไฝœๅˆ›ๆ–ฐใ€‚

ๅธฎๅŠฉๆˆ‘ไปฌ่ฎฉ LobeHub ๅ˜ๅพ—ๆ›ดๅฅฝใ€‚ๆฌข่ฟŽ็›ดๆŽฅๅ‘ๆˆ‘ไปฌๆไพ›ไบงๅ“่ฎพ่ฎกๅ้ฆˆๅ’Œ็”จๆˆทไฝ“้ชŒ่ฎจ่ฎบใ€‚

ๆ ธๅฟƒ็ปดๆŠค่€…๏ผš@arvinxx @canisminor1990




โค๏ธ ่ตžๅŠฉๆ”ฏๆŒ

ๆฏไธ€ไปฝๆ”ฏๆŒ้ƒฝๆ„ไน‰้žๅ‡ก๏ผŒๆ‚จ็š„ๅ•ๆฌกๆ่ต ๅฆ‚ๅŒๅคœ็ฉบไธญ็š„ๆ˜Ÿ่พฐ๏ผŒๅœจๆˆ‘ไปฌ็š„ๆ”ฏๆŒๆ˜Ÿ็ณปไธญ้—ช่€€๏ผๆ‚จๅฐฑๅƒไธ€้ข—ๆตๆ˜Ÿ๏ผŒไธบๆˆ‘ไปฌ็š„ๆ—…็จ‹ๅธฆๆฅ่ฟ…ๆท่€Œๆ˜Žไบฎ็š„ๅฝฑๅ“ใ€‚ๆ„Ÿ่ฐขๆ‚จๅฏนๆˆ‘ไปฌ็š„ไฟกไปปโ€”โ€”ๆ‚จ็š„ๆ…ทๆ…จๅฆ‚็ฏๅก”๏ผŒๆŒ‡ๅผ•ๆˆ‘ไปฌไธ€ๆญฅๆญฅๆŽฅ่ฟ‘ไฝฟๅ‘ฝ๏ผŒๆฏไธ€ๆฌก้—ช่€€้ƒฝ่ฎฉๆˆ‘ไปฌๅ‰่กŒ็š„่ทฏๆ›ดๅŠ ๆธ…ๆ™ฐใ€‚

๐Ÿ”— ๆ›ดๅคšไบงๅ“

  • ๐Ÿ…ฐ๏ธ Lobe SD Theme๏ผšStable Diffusion WebUI ็š„็Žฐไปฃไธป้ข˜๏ผŒๆ‹ฅๆœ‰็ฒพ่‡ด็š„็•Œ้ข่ฎพ่ฎกใ€้ซ˜ๅบฆๅฏๅฎšๅˆถ็š„็”จๆˆท็•Œ้ขไปฅๅŠๆๅ‡ๆ•ˆ็އ็š„ๅŠŸ่ƒฝใ€‚
  • โ›ต๏ธ Lobe Midjourney WebUI๏ผšMidjourney ็š„ WebUI ๅทฅๅ…ท๏ผŒๅ€ŸๅŠฉ AI ไปŽๆ–‡ๆœฌๆ็คบๅฟซ้€Ÿ็”ŸๆˆไธฐๅฏŒๅคšๆ ท็š„ๅ›พๅƒ๏ผŒๆฟ€ๅ‘ๅˆ›ๆ„ๅนถๅขžๅผบไบคๆตไฝ“้ชŒใ€‚
  • ๐ŸŒ Lobe i18n๏ผšLobe i18n ๆ˜ฏไธ€ๆฌพๅŸบไบŽ ChatGPT ็š„ๅ›ฝ้™…ๅŒ–็ฟป่ฏ‘ๆต็จ‹่‡ชๅŠจๅŒ–ๅทฅๅ…ทใ€‚ๅฎƒๆ”ฏๆŒๅคงๆ–‡ไปถ่‡ชๅŠจๆ‹†ๅˆ†ใ€ๅขž้‡ๆ›ดๆ–ฐไปฅๅŠ OpenAI ๆจกๅž‹ใ€API ไปฃ็†ๅ’Œๆธฉๅบฆๅ‚ๆ•ฐ็š„่‡ชๅฎšไน‰้…็ฝฎ็ญ‰ๅŠŸ่ƒฝใ€‚
  • ๐Ÿ’Œ Lobe Commit๏ผšLobe Commit ๆ˜ฏไธ€ๆฌพ CLI ๅทฅๅ…ท๏ผŒๅˆฉ็”จ Langchain/ChatGPT ็”ŸๆˆๅŸบไบŽ Gitmoji ็š„ๆไบคไฟกๆฏใ€‚


๐Ÿ“ ่ฎธๅฏ่ฏ

Copyright ยฉ 2026 LobeHubใ€‚
ๆœฌ้กน็›ฎๅŸบไบŽ LobeHub Community License ่ฎธๅฏใ€‚

้กน็›ฎไป‹็ป

ไธ€ๆฌพๅผ€ๆบใ€่ฎพ่ฎก็Žฐไปฃ็š„ ChatGPT/LLMs ็”จๆˆท็•Œ้ข/ๆก†ๆžถใ€‚ๅ…ทๅค‡่ฏญ้Ÿณๅˆๆˆใ€ๅคšๆจกๆ€ๅŠŸ่ƒฝ๏ผŒๅนถๆ‹ฅๆœ‰ไธ€ไธชๅฏๆ‰ฉๅฑ•็š„ๆ’ไปถ็ณป็ปŸใ€‚่ฝปๆพไธ€้”ฎๅ…่ดน้ƒจ็ฝฒๆ‚จ็š„ไธชไบบ ChatGPT/Gemini/Ollama ่Šๅคฉๅบ”็”จใ€‚ใ€ๆญค็ฎ€ไป‹็”ฑAI็”Ÿๆˆใ€‘

ๅฎšๅˆถๆˆ‘็š„้ข†ๅŸŸ
29077.6 K15.27 K่ฎฟ้—ฎ GitHub

ไธ‹่ฝฝไฝฟ็”จ้‡

0

้กน็›ฎๆ€ปไธ‹่ฝฝๆฌกๆ•ฐ๏ผˆๅซCloneใ€Pullใ€ zip ๅŒ…ๅŠ release ไธ‹่ฝฝ๏ผ‰๏ผŒๆฏๆ—ฅๅ‡Œๆ™จๆ›ดๆ–ฐ

่ฏญ่จ€็ฑปๅž‹

TypeScript80.42%
TSX18.04%
HTML0.51%
SQL0.48%
Shell0.22%