Commit Graph

29 Commits

Author SHA1 Message Date
Rdmclin2 4471c7aafe ✨ feat: KB sidebar search/add button and comment image thumbnails (#19010)
* ✨ feat: KB sidebar search/add button and comment image thumbnails

* 🌐 style: update i18n

* 🐛 fix: gate the KB parent bypass on folder type and reveal after deferred upload

* ✨ feat: load sidebar search results incrementally and revalidate them with the tree

* 🐛 fix: hide stale sidebar search rows, reveal folder action on focus, localize Untitled
2026-09-02 11:56:23 +08:00
Rdmclin2 925ef8365c 🐛 fix: resource permission controls, chat-input hints & wechat push (#17468)
* 🐛 fix: resource/agent permission controls, use-only hints and wechat push improvements

* 🐛 fix: gate use-only notice on resolved access, not just !isAccessLoading

* ✅ test: align tests with model-profile exposure and post-rebase types

- update redaction tests: model identity is now part of the safe profile
  surface (use-only members see/switch the model in chat)
- complete upstream partial mocks broken by new hook/selector usages
- add missing acceptance.workspace.filters.empty.all locale key (type break
  from d1c8d3026c on canary)
- fix modelSelection policy test arg to match narrowed signature

* 🐛 fix: keep type-only hetero summary in redacted agent config

Use/view-only workspace members lost agencyConfig.heterogeneousProvider to
redaction, so the client rendered external-CLI agents (Claude Code / Codex)
as plain runtime agents with the LobeHub model selector and composer. Keep a
type-only heterogeneousProvider summary in the safe agency fields; args, env
and device bindings stay behind edit-level access.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ✅ test: fix ms-race flake in home agent list selector fixture

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 23:30:34 +08:00
YuTengjing 66303e12e1 💄 style: add Qwen3.8 Max Preview locale (#17352) 2026-07-19 22:43:31 +08:00
Rdmclin2 5d6453c798 ✨ feat: workspace-scoped API keys with RBAC & workspace data deletion (#17263)
* ✨ feat: workspace-scoped API keys with RBAC & workspace auth data deletion

Squashed from 6 commits:
- fix: workspace apikey rbac and workspace scope
- feat: support workspace auth delete data
- fix: apikey creator display and messenger back to lobe
- fix: api keys
- chore: optimize dropdown menus
- chore: update i18n files

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix: project topic row owner userId in TopicModel.query for client ownership filters

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix: gate owner select-all batch delete behind workspace acknowledge modal & drop stale provider footer test

- BatchActionsDropdown: workspace owners deleting a select-all query hit the
  server's workspace-wide delete (restrictToCreator=false); show the
  workspace-wide label and the elevated WorkspaceDeleteAllModal, mirroring the
  header trash button (Codex P1).
- The provider roadmap footer was removed in #17217 but the workspace provider
  test still asserted it renders; update the stale test (canary CI is red on
  the same test).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix: bind workspace API keys on the lambda TRPC surface

Mirror the OpenAPI resolveWorkspaceId contract in createLambdaContext:
a personal key is rejected when X-Workspace-Id is present, and a
workspace key is pinned to its own workspace (mismatched header
rejected, workspace applied even without the header).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix: enforce workspace API key entitlement on lambda auth & seed RBAC roles at workspace creation

- createLambdaContext: apply the same canUseWorkspaceApiKeys availability
  gate as the OpenAPI workspace middleware before accepting a
  workspace-scoped key (Codex P1).
- WorkspaceModel.create: seed the built-in RBAC roles and grant the creator
  workspace_owner inside the creation transaction, matching the documented
  assignWorkspaceRoleToUser contract; widen seed helpers to accept
  transactions.
- OpenAPI workspace middleware: fall back to the loaded membership role for
  the API-key owner check so pre-seeding workspaces are not rejected
  (Codex P2).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🐛 fix: re-check workspace API-key issuer owner status on lambda auth

Workspace API keys are owner-only: createLambdaContext now verifies the
issuer still holds owner status (RBAC role with membership fallback via the
new shared hasWorkspaceOwnerAccess helper) before accepting a
workspace-scoped key, matching the OpenAPI workspace middleware. A demoted
or removed owner's key stops authenticating.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* 🌐 chore: refill locales after rebase onto canary

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 11:39:28 +08:00
Rdmclin2 6add26c6bc ✨ feat: add workspace RBAC control and resources management (#17172)
* ✨ feat: add workspace RBAC control and resources management

* 🐛 fix: gate connector syncTools and recursive document deletes; type-safe workspaceRole access

* 🐛 fix: preserve teammate files in narrowed KB clear-all; keep shared-agent rename collaborative

* 🐛 fix: read-only connector bootstrap for non-creators, KB delete file scoping, api_key:read gate

* 🐛 fix: gate connector getForEdit credential read behind creator/owner check

* 🐛 fix: caller-scoped workspace clear-all for all roles; surface API key tab to members

* 🐛 fix: creator-only verify run lazy creation; adapt tests to RBAC error semantics

* 🐛 fix: viewer read-only connector bootstrap; keep shared topic co-edit ungated

* 🐛 fix: hide workspace API key tab from viewers via useIsWorkspaceViewer slot

* 🐛 fix: keep shared-topic metadata co-editable

* 🐛 fix: workspace-scoped provider vault merge for co-owners; gate custom connector sync in UI

* 🐛 fix: gate skill re-import overwrites and KB file membership behind creator/owner

* 🐛 fix: block non-owner transfers that rehome teammates' rows across all cascade paths

* 🐛 fix: include linked sessions in agent transfer foreign-row guard

* 🐛 fix: gate agent connector bind/copy/mount/unbind/unmount behind creator-owner check

* 🐛 fix: gate generateDraftPlan behind verify-run owner check

* 🐛 fix: role-aware skill importer for write chain; revalidate resources after select-all delete

* 🐛 fix: resolve viewer writability without injected role; creator-scoped notebook folder deletes

* 🐛 fix: member-gate connector getForEdit credential read

* 🐛 fix: block non-owner agent/group deletes that cascade teammates' conversations
2026-07-14 20:44:35 +08:00
René Wang 2a0541bf94 ✨ feat: redesign agent channel configuration (#17123) 2026-07-13 16:29:49 +08:00
Rdmclin2 f3c65ba7d5 feat: support locale notification (#16867)
* feat: support locale notification

* chore: update i18n files

* 🐛 fix: add email notification chrome keys to default locale namespace
2026-07-08 02:15:46 +08:00
Rdmclin2 335e4f5fbd feat: workspace private agents, viewer limit, onboarding (#16604)
* feat: workspace private agents, viewer limit, onboarding (squashed)

* fix: test case and private document

* fix: workspace private resource test case

* fix: test case

* chore: complement test case
2026-07-02 14:30:33 +08:00
Rdmclin2 e5adb393b3 ✨ feat: workspace device support (#16134)
* feat: workspace device support

Squashed commits:
- chore: update device constraint
- chore: local system support remote device workspace
- fix: reconnect time
- fix: workspace connect daemon parameter
- fix: device list refresh
- chore: device admin
- feat: support workspace device
- feat: device list support workspace
- feat: add workspaceId to device gateway

* chore: update i18n rc

* 🐛 fix(workspace): narrow wsOwnerProcedure ctx.workspaceId to string

The OSS stub left `wsOwnerProcedure = authedProcedure`, so consumers
saw `ctx.workspaceId: string | null | undefined` and broke type-check
in `lambda/device.ts` (signWorkspaceDeviceToken / DeviceModel).
Add a guard middleware that throws + narrows the type, matching the
cloud override semantics.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: update i18n files

* fix: remote device test case

* fix: device workspaceId request

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-21 00:41:06 +08:00
René Wang 1d7fc18cdb 🐛 fix: Interface copy consistency for desktop app (#15968)
* 🐛 fix(topic): correct "Copy Session ID" label to "Copy Topic ID"

The topic item dropdown action copies the topic id
(navigator.clipboard.writeText(id) — the same id the surrounding menu
passes to openTopicInNewWindow and SESSION_CHAT_TOPIC_URL), but it was
labeled "Copy Session ID" / "Session ID copied". Correct the English
source strings to "Copy Topic ID" / "Topic ID copied".

English source locale only; the i18n key actions.copySessionId is kept,
and the other locales regenerate from en-US.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* 🐛 fix(i18n): correct legacy "session" wording in English UI strings

Follow-up to #15942. Several English strings used "session" where the
code shows the referent is the live conversation, the agent, or where the
word is redundant. "session" is also legitimate elsewhere (auth/sign-in
session, AWS Session Token, Claude Code runtime session, natural English),
and many sessionGroup/defaultSession keys already have correct values, so
only code-verified mislabels are changed:

- chat: "Clear current session messages" / "…clear the current session
  messages…" / "Save current session as topic" → "conversation"
  (the Clear and Save-Topic actions operate on the current conversation)
- setting: "All session messages have been cleared" → "conversation";
  "…display in the session." → "…in conversations."
- setting: "Session Settings" (per-agent page, sibling of "Group
  Settings") → "Agent Settings" / "· {{name}}" / "Agent Profile and chat
  preferences"
- setting: workspace-delete warnings drop the redundant legacy "sessions"
  (agents have their own bucket; topics already listed)

English source locale only; i18n keys unchanged, other locales regenerate
from en-US.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* 🐛 fix(i18n): align "Discover Assistants" nav with "Agent" terminology

The desktop nav read "Discover Assistants" while the entire discover
feature uses "Agent" (Community Agents, Featured Agents, Add Agent,
Agent List…). Rename the lone outlier to "Discover Agents".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* 🐛 fix(cmdk): merge Image/AI Video into one "Generation" entry

The command palette's Navigate group listed separate "Image" (/image)
and "AI Video" (/video) entries, but the app sidebar combines both into
a single "Generation" item (useNavLayout's bottomMenuItems →
tab.generation → /image). Mirror that in getNavigableRoutes — its only
consumer is the CMDK navigate list — by dropping the separate video
entry and relabeling image to "Generation", merging both keyword sets so
image and video terms still match. Reuses the existing tab.generation key
so the label stays in sync with the sidebar across every locale.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 🐛 fix(i18n): apply terminology fixes to the default .ts source of truth

The earlier commits changed only locales/en-US/*.json, but those files are
generated from packages/locales/src/default/*.ts via the workflow:i18n step
(.i18nrc.js entry = locales/en-US), so a regeneration would revert them.
Apply the same English-source edits to the .ts defaults so the source of
truth and the en-US mirror agree:

- topic: copySessionId / copySessionIdSuccess → "Copy Topic ID" / "Topic ID copied"
- chat: clearCurrentMessages / confirmClearCurrentMessages / topic.saveCurrentMessages → "conversation"
- setting: danger.clear.success / llm.modelList.desc → "conversation(s)";
  header.session(+WithName/Desc) → "Agent Settings" / "chat preferences";
  workspace-delete strings drop the redundant legacy "sessions"
- electron: navigation.discoverAssistants → "Discover Agents"

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 🐛 fix(i18n): unify stray terminology (Focus Mode / Agent / Skill / Library)

Continue the English copy-consistency cleanup, aligning straggler strings
to the terms the app already standardizes on (zh-CN already uses these):

- zenMode label "Zen Mode" → "Focus Mode" (the toast; settings/hotkey
  already say Focus Mode, and zh-CN is 专注模式 everywhere)
- "assistant" → "agent": agent channel descriptions (×9), topic move
  actions (×4), labs agent self-iteration
- "Plugin" → "Skill": lobe-agent-management install labels, discover
  user.plugins / user.noPlugins
- "knowledge base" → "Library": file library-import strings, chat agent
  profile counts + search-library tool label
- "service provider" → "provider": new-provider id description

English source (.ts) + en-US mirror; canonical terms already match zh-CN.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 🐛 fix(i18n): apply confirmed naming decisions (Orchestrator / Group / Clear)

Resolve the remaining English terminology forks per product decision:
- group coordinator role → "Orchestrator" (was Supervisor / Group Host /
  "host" / "moderator"): chat profile + token labels; setting group-chat
  system-prompt strings and enable-orchestrator description
- cmdk search → "Group" / "Groups" (was "Agent Team(s)")
- data-wipe titles → "Clear Data" / "Clear Workspace Data" (was "Wipe…")
- model ability → "Tool Calling" / "tool calls" (was "Tool Usage" /
  "function calls")
- topic import → "Import Topics" / "Importing topics…" (match Export Topics)

English source (.ts) + en-US mirror.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 🐛 fix(i18n): standardize auth on "Sign in" + unify conversation wording

Per product decision (match the /signin route path):
- auth / authError / oauth / error / marketAuth / desktop-onboarding:
  "Log in" / "Login" / "Log Out" → "Sign in" / "Sign-in" / "Sign Out"
  across the auth flow (button, errors, guide titles, OAuth consent,
  unlock screen, session-expiry prompts)
- common "SSO Login" → "SSO Sign-in"; discover user menu "Logout" → "Sign out"
- memory analysis modal: unify "chats" / "topics" → "conversations"

English source (.ts) + en-US mirror (regenerated via workflow:i18n).
External-tool logins (GitHub CLI, WeChat) intentionally kept; non-English
locales left to the i18n CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* 🔥 chore(zen-mode): remove the Zen/Focus Mode feature

Zen Mode (hide all chrome to show only the current conversation) is no
longer needed. Remove it end to end:

- delete src/features/ZenModeToast
- drop status.zenMode state, the toggleZenMode action, and the inZenMode /
  showChatHeader selectors (the chat header now always renders)
- remove the ToggleZenMode hotkey (chat-scope hook, const registration,
  HotkeyId type)
- un-mask the panel-visibility selectors (drop the !zenMode guard)
- remove the zenMode / toggleZenMode locale keys (chat, hotkey)
- update the affected store/hook tests

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix: add translation

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:53:23 +08:00
Rdmclin2 2d897cea73 🐛 fix: workspace related problems (#15928)
* fix: page editor right panel loading

* feat: add page agent aquire lock

* feat: add hook self locker

* feat: add page copilot lock

* fix: session cope lock

* feat: add page draft and editor state fresh

* fix: multiple same person edit lock and recover

* fix: edit same tab

* chore: update i18n files

* fix: lint error

* fix: edit lock owner check

* chore: reuse owner id

* chore: viewer cannot see right panel
2026-06-17 00:01:42 +08:00
Rdmclin2 913ee4210d ✨ feat: page/agent/agentGroup/task edit lock (#15786)
* feat: support page editor lock

Squashed page-lock feature work:
- support page editor lock
- support agent group / agent / task edit
- add edit lock to agent/agentgroup/task
- refactor page lock
- fix workspaceId for edit objects
- align with agent/group/task

* fix: collaborative edit lock

* chore: update i18n

* fix: redis acquire

* fix: release lock

* fix: test case

* chore: complement page lock test cases
2026-06-14 01:40:36 +08:00
YuTengjing 7641cda958 💄 style: update i18n locales (#15630) 2026-06-10 14:02:02 +08:00
YuTengjing f042dd352e ✨ feat: support Claude Opus 4.8 (#15314) 2026-05-29 02:19:05 +08:00
Rdmclin2 0195f42daa 🐛 fix: onboarding im integration (#14988)
* feat: support onboarding messager

* chore: remove telegram CN screenshots

* feat: add feedback commands

* fix: bot feedback commands

* chore: optimize messenger intergration

* chore: update onboarding style

* feat: support wechat adapter attachments

* feat: support ai attachments

* chore: update i18n files

* fix: bot message image attachment
2026-05-19 22:51:38 +07:00
Rdmclin2 346812ab88 🔨 chore: update i18n files & fix title skeleton (#14301)
* chore: update i18n files & fix title skeleton

* chore: update taskTemplate json

* chore: update i18n files
2026-04-29 13:23:26 +07:00
Tsuki 70e7e441b2 🔨 chore: premerge Task detail page UI (#13653)
* ✨ feat: add AgentTaskList component on agent welcome page (LOBE-6597)

- AgentTaskList with TaskListHeader, TaskItem, and styles
- Embedded in AgentWelcome below ToolAuthAlert
- Each task rendered as independent rounded card with status badge
- Status: green filled circle (Done), blue circle (In progress)
- Card width matches chat input (960px)
- i18n keys for taskList.title and taskList.viewAll
- Fix updateReview type to use TRPC-inferred type

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add Tasks page at /agent/:aid/tasks with route, breadcrumb, and view toggle (LOBE-6597)

- Register tasks route in both desktopRouter.config.tsx and .desktop.tsx
- Thin route page at src/routes/(main)/agent/tasks/index.tsx
- Feature components in src/features/AgentTasks/: page, breadcrumb, header with list/kanban toggle, full task list
- Wire up "View All Tasks" navigation from AgentTaskList welcome card
- Add i18n keys (taskList.activeTasks, taskList.breadcrumb.task) and generate translations via pnpm i18n

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add Task detail page at /agent/:aid/tasks/:taskId (LOBE-6597)

- Register :taskId child route in both desktopRouter configs
- TaskDetailPage with auto-save hint, breadcrumb, and scrollable content
- TaskDetailHeader: editable title (borderless Input), Run/Pause button, status/priority tags, delete
- TaskInstruction: click-to-edit Markdown with debounced auto-save
- TaskSubtasks: sub-issues list with status badges
- TaskActivities: timeline with topic/brief/comment icons
- TaskItem now navigates to detail page instead of just setting activeTaskId
- Add taskDetail.* i18n keys with generated translations

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add TaskModelConfig, TaskScheduleConfig, and refine Task detail UI (LOBE-6597)

Add model/provider selector and periodic execution config to Task detail page.
Refine TaskDetailHeader, TaskInstruction with auto-save and i18n support.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: refine Task detail UI with Linear-style design (LOBE-6597)

- Redesign SubTasks with collapsible header, progress circle, hover + click navigation
- Redesign Activities with agent avatar, comment input box, and Linear-style layout
- Add TaskParentBar showing parent task relationship with sibling navigation popover
- Add delete confirmation modal using App.useApp().modal.confirm
- Move ModelSelect to separate row below action bar
- Fix zustand selector recreation in ActivityItem
- Replace hardcoded colors with cssVar tokens

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add Properties panel, parent link hover, activity icon, and lifecycle save status (LOBE-6597)

- Add TaskProperties sidebar with collapsible status/priority dropdowns
- Parent bar: clickable parent link with hover, sibling navigation popover on progress
- Activity title: add BotMessageSquare icon
- Fix lifecycle actions not updating taskSaveStatus (saving/saved indicator)
- Filter status dropdown to only user-selectable states (backlog/completed/canceled)
- Add test task creation script for dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add recursive tree view for subtasks with Linear-style connecting lines (LOBE-6597)

- Add buildTaskTree utility to convert flat getTaskTree API response into nested tree
- Implement SubtaskTreeItem recursive component with CSS connecting lines (├─ and └─)
- Fetch full task tree via taskService.getTaskTree for nested subtask display
- Show loading spinner during tree fetch, fallback to flat list on error
- Remove padding-inline from AgentTaskList container

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: address PR review — delete redirect, debounce cleanup, schedule resync (LOBE-6597)

- Redirect to task list after successful delete (P1)
- Clean up instruction debounce timer on unmount/task switch to prevent stale writes (P1)
- Resync TaskScheduleConfig local state when active task changes (P2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: use backend nested subtasks directly, remove buildTaskTree (LOBE-6597)

Backend now returns nested subtasks in task.detail (LOBE-6814).
Remove buildTaskTree utility, getTaskTree API call, and loading state.
Use TaskDetailSubtask from @lobechat/types instead of local interface.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ⚡ perf: add optimistic update and save status for model config change (LOBE-6597)

updateTaskModelConfig now immediately reflects new model/provider in UI
via optimistic store dispatch, and tracks taskSaveStatus (saving/saved).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ⚡ perf: skip redundant refreshTaskDetail on successful model config update (LOBE-6597)

Optimistic update is trusted on success — no need for full detail re-fetch.
Aligns with updateTask pattern. Refresh kept only in error path for revert.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: use backend author info for activities, fix AgentTaskList after AgentHome refactor (LOBE-6597)

- Activity: use act.author (TaskDetailActivityAuthor) from backend instead of agentMap lookup (LOBE-7013)
- AgentTaskList: fix agentId from useParams instead of useAgentStore.activeAgentId (was undefined)
- AgentHome: integrate AgentTaskList into new AgentHome layout (replaces old AgentWelcome)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: show participant avatars on task cards, use backend author for activities (LOBE-6597)

- TaskItem: display up to 3 participant avatars next to task title (LOBE-6805)
- Activity: use act.author from backend instead of agentMap lookup (LOBE-7013)
- AgentHome: integrate AgentTaskList into new AgentHome layout
- Revert AgentTaskList/TaskItem agentId back to useAgentStore (works correctly when mounted)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: fix type safety, memoize participants filter, extract avatar styles (LOBE-6597)

- Use TaskParticipant type instead of `any` in filter/map
- Compute displayParticipants once with useMemo (was filtering twice per render)
- Move avatar overlap styles to CSS classes (was inline objects per render)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🔇 chore: hide kanban view toggle until implemented (LOBE-6597)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: export TaskStatus/TaskPriority/TaskActivityType from @lobechat/types (LOBE-6597)

Replace hardcoded string/number types with shared type aliases:
- TaskStatus: 'backlog' | 'canceled' | 'completed' | 'failed' | 'paused' | 'running'
- TaskPriority: 0 | 1 | 2 | 3 | 4
- TaskActivityType: 'brief' | 'comment' | 'topic'

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: update

* style: update

* style: update

* style: update

* style: update

* style: update

* style: update

* style: update

* style: update

* style: update

* ✨ feat: add Daily Brief module to homepage (#13851)

* ✨ feat: add Daily Brief module to homepage

Add a Daily Brief section below the chat input on the homepage that
displays unresolved briefs from the Agent Tasks system. Users can
resolve, comment, and provide feedback directly from the brief cards.

- Service: BriefService with listUnresolved, resolve, markRead, addComment
- Store: Independent Zustand store (src/store/brief/) with SWR data fetching
- Components: BriefCard, BriefCardActions (dynamic action buttons),
  BriefCardSummary (Markdown with expand/collapse), CommentInput (@lobehub/editor)
- Three action types: resolve (closes brief), comment (resolve with text),
  link (safe URL navigation with protocol validation)
- Fixed feedback button: adds task comment without resolving the brief
- Inline success state ("Feedback sent") with 1.5s auto-restore
- i18n: zh-CN + en-US translations
- Tests: 21 tests across service, store selectors, and components
- CLI: Register task and brief commands for local development

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add agent avatars to Daily Brief cards

Display stacked agent avatars next to brief card titles using the
new `agents` data from Arvin's enriched listUnresolved API (#13489).

- Add AgentAvatarInfo type and agents field to BriefItem
- Render overlapping circular avatars (20px, -6px overlap)
- Use cssVar.colorBgContainer for border (dark mode compatible)
- Extract avatar style to function to avoid inline object creation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: clean up Daily Brief components

- Extract duplicate success state JSX into reusable SuccessTag component
- Remove redundant comments that describe what code does
- Use DEFAULT_AVATAR from @lobechat/const instead of hardcoded emoji

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: address PR review feedback for Daily Brief

- Use cssVar.colorBgBase instead of hardcoded #fff for primary button
  text color (dark mode contrast fix)
- Add submitting state to CommentInput to prevent duplicate submissions
  (disable buttons + show loading during async submit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🌐 chore: generate i18n translations for Daily Brief

Run pnpm i18n to generate translations for all 18 locales.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: use shared BriefType from @lobechat/types

Export BriefType union from packages/types and use it in
BRIEF_TYPE_COLOR and BRIEF_TYPE_ICON records for compile-time
key validation. Adding a new brief type now requires updating
the shared type, and TypeScript will flag missing mappings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: update

* style: update

* style: update

---------

Co-authored-by: Tsuki <976499226@qq.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: update

* style: update

* style: update

* style: update

* fix: stopPropagation

* fix: i18n

* 🐛 fix: wire comment inputs to editor instance so Send actually submits

CommentInput in AgentTasks and DailyBrief used antd TextArea inside
@lobehub/editor's ChatInput while reading content via
editor.getDocument('markdown'). The TextArea was never connected to the
editor instance, so getDocument always returned empty and handleSubmit
short-circuited silently — Send appeared to do nothing (no network
request fired).

Replace the TextArea with <Editor editor={editor} type="text"
variant="chat" /> so useEditor() actually drives the editable surface.
Keep plain-text behavior via markdownOption={false} +
enablePasteMarkdown={false}, and bind Cmd/Ctrl+Enter submit via
onPressEnter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: use participant.title after TaskParticipant schema rename (#13877)

PR #13877 renamed TaskParticipant.name → .title and added
.backgroundColor. Our branch's UI code (AgentAvatars, listViewOptions,
TaskList group header, Breadcrumb) was already written against the new
schema, but TaskProperties still read firstParticipant?.name — update
the last remaining call site so the type matches post-rebase.

backgroundColor is already plumbed through everywhere it applies within
#13877's scope; TaskActivities' TaskDetailActivityAuthor is a separate
type untouched by the PR and kept as-is.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: resolve type-check errors exposed after canary rebase

canary upgraded react-i18next to a version with typed i18n keys and
tightened @lobehub/editor's SendButton + IEditor APIs. Rebase pulled
these in, surfacing latent type errors in LOBE-6597 code.

- CommentInput: use editor.cleanDocument() (IEditor's actual API;
  clearContent never existed).
- TaskActivities / TaskLatestActivity / TaskTriggerTag: type t as
  TFunction<'chat'> so typed i18n accepts the known-literal keys used
  inside module-level helpers.
- TaskPriorityTag / TaskStatusTag / listViewOptions: add
  defaultValue: '' to dynamic-key t() calls (template literals and
  Record lookups) to match the broad-key i18n overload.
- BriefCardActions: swap unusable <SendButton> (no children, no
  iconPlacement) for <Button>; add defaultValue to the dynamic
  brief-action key lookup; drop stale @ts-ignore.
- DailyBrief/CommentInput: drop unsupported children on SendButton;
  keep label via title attribute.
- Recents/Item: type TYPE_ICON_MAP as Partial<Record<...>> so 'task'
  (rendered via TaskStatusIcon elsewhere) is a safe absent key.
- brief/slices/list/action: cast briefService.listUnresolved() result
  back to BriefItem[] (TRPC serialization widens BriefType to string).
- AgentTasks/TasksHeader: delete dead file — no importers and its
  ./style module was removed by an earlier refactor.

Also ran pnpm install to materialize the newly-extracted
@lobechat/agent-gateway-client workspace package (canary #13866),
clearing ~7 "cannot find module" errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor(builtin-tool-task): polish task tool paths (#13869)

* ✨ feat: navigate to task detail when clicking brief card header

Clicking the header row of a Daily Brief card (icon + title + time +
agent avatars) now jumps straight to the associated task, using the
brief's task-tree agent (with activeAgent / inbox as fallback).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: show parent task ids as clickable breadcrumb trail

Walk the cached parent chain from taskDetailMap and insert each ancestor's
identifier as a link between the "任务" entry and the current task name in
the task detail breadcrumb.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add cross-agent /tasks page with View All Tasks on Daily Brief

- Register `/tasks` route in desktop (web + Electron) and mobile router configs
- `useFetchTaskList` supports `allAgents` mode via options object API to fetch
  tasks without agent filter; backend already supports optional assigneeAgentId
- `Breadcrumb` accepts optional `agentId`, renders "All tasks" crumb when absent
- `AgentTaskItem` navigation uses `task.assigneeAgentId` so clicks work from
  the cross-agent page (falls back to `activeAgentId` for unassigned tasks)
- Extract `useScenarioEnabledTools` hook to share layout effect between
  `/tasks/_layout` and `/agent/:aid/tasks/_layout`

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ♻️ refactor: use assigneeAgentId for task avatar instead of participants array

Replace AgentAvatars (took participants[]) with AssigneeAvatar (takes agentId,
resolves meta from agent store). This correctly represents that a task is
assigned to a single agent via assigneeAgentId/detail.agentId.

- New AssigneeAvatar component reads agent meta from agent store by ID
- TaskProperties reads activeTaskAgentId from task detail store
- listViewOptions uses task.assigneeAgentId directly for groupBy/sort
- Extract shared isInboxAgentId helper to eliminate 4x inline duplication
- Group headers resolve agent title at render time via AssigneeLabel component

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: enable vertical scrolling on cross-agent tasks page

Add overflowY and flex to WideScreenContainer wrapper so the task list
can scroll when content exceeds viewport height.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add re-assign task agent with popover selector

- Add AssigneeAgentSelector component with Popover agent list
- Extract useAgentDisplayMeta hook for consistent agent name/avatar resolution
- Fix optimistic update mapping assigneeAgentId → agentId in task store
- Disable reassignment for running tasks with tooltip hint
- Integrate selector into task list and task detail property panel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: reuse BriefCard in task detail activities & fix raw-id navigation

Render brief-type activities as full BriefCard (same as homepage) instead of
plain tree rows. Decouple BriefCardActions from useBriefStore for actions
lookup so it can be reused across pages. Fix infinite loading when navigating
to task detail via raw DB id (task_xxx) by storing detail under both the
identifier and the raw id key in taskDetailMap.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add TopicCard component for task detail activities

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: allow re-running completed tasks with dedicated button

Completed tasks now show a "Re-run" button (with rotate icon) instead of
hiding the action. The backend already supported this — only the frontend
selector gate needed updating.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: add create task modal with markdown editor

Add a "+" button on the tasks list page that opens a Linear-style modal
for manually creating tasks. The modal features a title input, a markdown
editor (EditorCanvas), and a bottom toolbar with priority and assignee
selectors. Existing tag components (TaskStatusTag, TaskPriorityTag,
AssigneeAgentSelector) are extended with an `onChange` controlled mode
so they can be used in creation context where no task exists yet.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 🐛 fix: suppress spurious updateTask on Task Detail page load

EditorDataMode was missing the contentChangeLockRef pattern that
DocumentIdMode already uses, causing Lexical's registerUpdateListener
to treat programmatic content hydration as a user edit and fire
onContentChange → updateTask on every page visit.

- Add contentChangeLockRef + lockIdRef staleness guard
- Extract loadContentWithLock to deduplicate lock/load/unlock logic
- Pass contentChangeLockRef to InternalEditor
- Remove unreachable dead code in loadEditorContent

Closes LOBE-7362

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ✨ feat: task detail comment CRUD and various UX improvements

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 🐛 fix: move canceled status group to the end of task list

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 💄 style: polish task detail layout, title, and run button

- Title switched to auto-sizing TextArea so long names wrap (like Linear)
- Reduce title font-size from 32px to 24px and tighten paddings
- Make "运行任务" button small-sized to match the denser header
- Add 120px bottom padding for end-of-content scroll breathing room
- Default EditorCanvas paddingBottom trimmed from 64 to 32

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 💄 style: refine task assignee, priority, and comment input

- Assignee block uses filled variant in dark mode for better contrast
- Urgent priority (level 1) renders in orange for quick scanning
- Comment input keeps SendButton slot reserved to prevent layout shift

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ✨ feat: task detail — inline subtasks, automation mode, chronological activity

- Inline subtask creation under a task via CreateTaskInlineEntry
  (parentTaskId/autoFocus/onCollapse/placeholder), refreshes parent on create
- Track agent-created tasks via createdByAgentId through service, router,
  types, and the builtin task executor
- Replace scheduler Segmented-only UI with an Enable switch + heartbeat/
  schedule mode; persist via automationMode on the task
- Sort detail activities oldest → newest for a natural timeline reading
- Reducer patches nested subtask entries on updateTaskDetail so in-place
  edits reflect in the parent's subtask tree

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 💄 style: render activate-tool chips as rounded pills

Switch inspector tool chips from monospace code tags to filled rounded
pills with ellipsis overflow, making multi-tool rows scan better in tight
headers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 🐛 fix: keep finished tool call out of loading state while siblings run

The message-level isAssistantMessageBusy flag stays true while sibling
tool calls are still running. Without guarding on this tool's own
result, a finished tool would flip back to "loading". Now a tool that
has a real result or error is never shown as calling.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 💄 style: use small Segmented in schedule config popover

Keeps the automation mode switcher visually aligned with the denser
popover controls.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ✨ feat: agent profile hover card on task activity author

- Extract shared AgentProfileCard + unified AgentProfilePopup (click / hover)
  with lazy agent fetch; move out of group sidebar path.
- Wire activity author avatar + name to a hover card; brighten title on hover;
  keep a small "agent" tag on the author row.
- Show inline skeletons (description + footer stats) while loading.
- Enrich subtask payload with assignee agent info for cleaner UI.

* ✨ feat: open task topic chat in side drawer

Click a topic row in the task detail activities to open a right-side drawer
showing the topic's full chat history. Messages stream in live via the existing
agent gateway pipeline (gateway events land in chatStore.dbMessagesMap keyed by
the topic context), so a running topic refreshes its drawer in real time without
a dedicated subscription.

Reuses the Conversation feature (ConversationProvider + ChatList) with an
isolated context (agentId + topicId + isolatedTopic), so the drawer never
touches the global active topic and multiple panels coexist cleanly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 💄 style: outline activate-tool chip with subtle border

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* ✨ feat: show topic handoff summary on activity card

Pull `handoff.summary` through the task service into TaskDetailActivity and
render it under the title in TopicCard so completed topics surface what was
accomplished without opening the drawer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 🎸 chore: gate agent task feature behind agent_task flag

Hide every client-side entry point to the Agent Task feature when the
`agent_task` flag (default `isDev`, off in prod) is disabled:

- Sidebar: task tab in the agent sidebar nav
- Routes: `/agent/:aid/tasks/*` and `/tasks/*` layouts redirect to `/` when
  the flag is off (mobile router reuses the same layout)
- Home Recents: filter out `type='task'` items in both the list and the
  "all recents" drawer
- Daily Brief: skip fetch + hide the entire panel (all briefs link to tasks)

Backend TRPC / lifecycle stays on — the feature is already live for CLI
usage. Flag name mirrors `agent_onboarding` for consistency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* 🐛 fix: prioritize includeTriggers in topic queries

* 🐛 fix: normalize task detail activity payloads

* ✨ feat: add Kanban board view for task list with drag-and-drop

LOBE-7493

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* 💄 style: shorten schedule tag labels & fix time width in task cards

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* update i18n

* 💄 style: hide task tool from user selectors

* 💄 style: hide task skill from user selectors

---------

Co-authored-by: canisminor1990 <i@canisminor.cc>
Co-authored-by: YuTengjing <ytj2713151713@gmail.com>
Co-authored-by: Arvin Xu <arvinx@foxmail.com>
2026-04-23 02:10:45 +08:00
YuTengjing c5db823a69 💄 style: add Kimi K2.6 to LobeHub-hosted card (#14006) 2026-04-21 11:40:15 +08:00
René Wang a09316a474 feat: Simplify UI (#12961)
* style: Simplify the sidebar

* style: Simplify the sidebar

* style: Simplify the sidebar

* style: Simpliofy the model selct

* style: Simpliofy the model selct

* style: Simpliofy the model selct

* style: Simpliofy the agent profile

* style: Simplify the input bar

* style: Re-organize the settings

* style: Simplify the mode linfo pane

* style: Simplify agent profile

* style: Advanced settings

* style: Advanced settings

* feat: Update translation

* fix: type error

* fix: Add missing translation

* fix: Add missing translation

* fix: Remove Lite mode

* fix: Add model paramters

* style: Remove token tag

* fix: model order

* fix: model order

* fix: Add missing translation

* fix: Add missing translation

* fix: Hide the subtopic button

* fix: User plan badge

* feat: Add settings

* feat: Add cover to the lab

* style: Make the switch vertically centered

* style: Add divider

* feat: Add group by provider

* feat: Move Usage stats

* fix: Subscription badge

* fix: Rebase onto canary

* fix: Rebase onto canary

* fix: Drag to adjust width

* feat: Rebase onto canary

* feat: Regroup settings tab

* feat: Regroup settings tab

* feat: Regroup settings tab

* feat: Regroup settings tab
2026-03-13 16:48:14 +08:00
YuTengjing 15a95156f3 💄 style: update i18n locales (#12809) 2026-03-08 13:25:46 +08:00
YuTengjing db45907ab8 ✨ feat: add GPT-5.4 model support (#12744)
* ✨ feat: add GPT-5.4 model support and fix reasoning payload pruning

- Add GPT-5.4 model card to model-bank
- Update planCardModels to use gpt-5.4
- Add gpt-5.4 to responsesAPIModels
- Fix pruneReasoningPayload to strip logprobs/top_logprobs for reasoning models
- Add logprobs, top_logprobs to ChatStreamPayload type
- Extend reasoning_effort to include none and xhigh
- Add success log for non-fallback requests in RouterRuntime
- Fix log parameter mismatch in RouterRuntime

Fixes LOBE-5735

* 🐛 fix: match gpt-5.4 to gpt5_2ReasoningEffort in openrouter and vercelaigateway

* 🐛 fix: update OpenRouterReasoning effort type to include none and xhigh

* 🐛 fix: use tiered pricing for gpt-5.4 based on 272K token threshold

* 🌐 chore: update i18n translations

* 🐛 fix: update claude-sonnet model version to 4-6 in planCardModels

* ✨ feat: add GPT-5.4 Pro model support

* 🐛 fix: remove dated snapshot for gpt-5.4-pro in responsesAPIModels

* 🐛 fix: add tierBy support for cross-unit tiered pricing threshold

OpenAI charges output at 1.5x when INPUT exceeds 272K tokens.
The tiered strategy previously only checked the unit's own quantity
to select a tier. Added optional tierBy field to TieredPricingUnit
so output/cacheRead tiers can reference input quantity for selection.

* 🐛 fix: use totalInputTokens for tiered pricing tier selection

Tiered pricing tiers should be determined by total prompt size
(totalInputTokens), not each unit's own quantity. This fixes output
and cacheRead being charged at the wrong tier rate when the prompt
exceeds the threshold but the individual unit quantity does not.
2026-03-06 13:47:31 +08:00
arvinxx 80f511cd6e 🌐 style: rerun i18n 2025-12-31 15:20:11 +08:00
YuTengjing 8b67718158 docs: update subscription locale json 2025-12-29 16:48:39 +08:00
CanisMinor 024aeb2e4e 💄 style: Update i18n microcopy (#10905)
* chore: update i18n

* chore: update i18n

* chore: update i18n

* chore: update i18n

* chore: update i18n

* chore: update i18n

* chore: update i18n

* chore: update i18n translations and placeholders across multiple components

Signed-off-by: Innei <tukon479@gmail.com>

* chore: update i18n translations for consistency in terminology across chat, onboarding, and settings components

Signed-off-by: Innei <tukon479@gmail.com>

* chore: update i18n translations to replace 'assistant' with 'agent' and ensure consistency across all components

Signed-off-by: Innei <tukon479@gmail.com>

* chore: update model descriptions in locales for clarity and accuracy

Signed-off-by: Innei <tukon479@gmail.com>

* feat: extract hard code string

Signed-off-by: Innei <tukon479@gmail.com>

* feat: enhance Chinese localization with new proxy and sync settings, update dialog messages for version checks and OAuth authorization

Signed-off-by: Innei <tukon479@gmail.com>

* chore: flatten

* chore: standardize localization keys by flattening nested structures across multiple languages

Signed-off-by: Innei <tukon479@gmail.com>

* chore: refine i18n documentation by consolidating key naming conventions and workflow guidelines for translation management

Signed-off-by: Innei <tukon479@gmail.com>

* chore: update i18n

* feat: add chat title localization for improved user experience in Chinese

Signed-off-by: Innei <tukon479@gmail.com>

---------

Signed-off-by: Innei <tukon479@gmail.com>
Co-authored-by: Innei <tukon479@gmail.com>
2025-12-24 12:55:12 +08:00
canisminor1990 d9de7a547e style: fix some style issues 2025-12-24 12:54:46 +08:00
arvinxx 2e6fd07c19 🌐 style: update i18n 2025-12-24 12:54:42 +08:00
Shinji-Li b69c7ff83e 🐛 fix: update lost i18n files (#10179)
chore: update i18n
2025-11-13 15:22:32 +08:00
Arvin Xu f7d6021e4a ⚡️ perf: fix topic search performance (#6912)
* update

* fix lint

* fix tests

* fix tests

* update locale
2025-03-13 00:25:17 +08:00
Arvin Xu 6ff70895f9 ✨ feat: support group topics by time (#4603)
* ✨ feat: support change topic display mode

* ♻️ refactor: 重构 locales 实现

* 🧪 test: fix tests

* 💄 style: use byTime mode by default

* 🌐 chore: update locale

* 🔥 chore: clean code

* 🔥 chore: clean code

* ✅ test: add tests

* 💄 style: improve active state

* 💄 style: improve active state
2024-11-05 02:27:09 +08:00