mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-13 19:20:04 +00:00
bab3ff4a7a23dc06407db177b59fccf37f781708
30 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
bab3ff4a7a | 🐛 fix: reduce agent document context latency (#15436) | ||
|
|
46f884d5ed |
chore(llm-generation-tracing): pre-allocate tracingId + recordFeedback router (#15146)
* ✨ feat(llm-generation-tracing): pre-allocate tracingId + recordFeedback router Wire up the per-call feedback loop foundation. 1. **Pre-allocate tracingId (plan A2)** - `TracingOptions.tracingId?: string` — optional caller-supplied UUID. - `LLMGenerationTracingService.record` generates one via `randomUUID()` when the caller doesn't supply one, so the id is always known before DB insert. - `LlmGenerationTracingModel.record` accepts an optional `id` and forwards it to the insert (Drizzle still autogens when omitted). - `aiChat.outputJSON` allocates the id up-front, threads it through `tracing.tracingId`, and returns `{ data, tracingId }` so the client can wire feedback against the id even though `service.record` runs inside Next's `after()`. - `aiChatService.generateJSON` consumers (InputEditor, supervisor) unwrap the envelope. 2. **New `llmGenerationTracingRouter.recordFeedback`** - Scenario-agnostic feedback endpoint at `lambda.llmGenerationTracing`. - Validates `{ tracingId (uuid), signal (positive|negative|neutral), source, score?, data? }` and forwards to `LLMGenerationTracingService.recordFeedback`. Follow-up issues already filed: - LOBE-9488 — `@lobehub/editor` AutoCompletePlugin needs `onAccept`/`onReject`/`onCancel` callbacks before the client side can capture Tab/Esc/keep-typing signals against the returned tracingId. - LOBE-9489 — session-level signal modeling (multi-suggestion typing sessions) — deferred until per-row feedback data lands. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * 🐛 fix(llm-generation-tracing): surface feedback write failures instead of silent ok The recordFeedback mutation used to always return `{ ok: true }` even when the underlying write was silently dropped — `LLMGenerationTracingService` swallowed both DB-init/update throws and the no-op case where the WHERE clause (id + userId) matched zero rows. Callers couldn't tell "persisted" from "lost", which would skew tracing-feedback metrics and prevent reasoned retry/error handling. Fix: - `LlmGenerationTracingModel.updateFeedback` now returns `{ updated: boolean }` (via `.returning({ id })`), so the caller knows whether the WHERE clause actually matched a row. - `LLMGenerationTracingService.recordFeedback` throws a typed `LLMGenerationFeedbackError` with `kind: 'not_found' | 'db_failure'` instead of swallowing — stops logging-only behaviour for DB errors and promotes the 0-rows case to an explicit signal. - `llmGenerationTracingRouter.recordFeedback` catches that error and translates to `TRPCError({ code: 'NOT_FOUND' })` for stale-id and `INTERNAL_SERVER_ERROR` for DB outages — `{ ok: true }` only flows back when a row was actually patched. Tests: - Model: assert `{ updated: true/false }` for happy / cross-user / missing-id - Service: assert throws on both not_found scenarios - Router: assert TRPCError code translation for both error kinds Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ✨ feat(input-completion): wire Tab/Esc/typing feedback to recordFeedback - bump @lobehub/editor to ^4.12.0 for AutoComplete onSuggestion{Accepted,Rejected} - add llmGenerationTracingService wrapping lambda.llmGenerationTracing.recordFeedback - InputEditor: map suggestionId→tracingId, fire positive on accept, negative on esc, neutral on typing/cursor-move/blur/other; recode IME-driven escape as neutral/autocomplete_ime so CJK input doesn't poison the signal Closes LOBE-9488 * ♻️ refactor(input-completion): fold recordTracingFeedback into aiChatService Single trpc mutation didn't warrant a dedicated service file; aiChatService already owns the paired `outputJSON` call that mints the tracingId, so recordTracingFeedback belongs alongside it. * 💄 style(llm-generation-tracing): tag task-handoff scenario + prompt version (#15191) * 💄 style(QueueTray): use borderless variant for queued file preview Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(llm-generation-tracing): tag task-handoff scenario + prompt version Task topic handoff was tracing as scenario=unknown / promptVersion=v0 because the generateObject call only set metadata.trigger and that trigger isn't in the registry. Add a TaskHandoff scenario const, version the prompt next to its definition, and pass tracing options explicitly at the call site (mirroring followUpAction). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(llm-generation-tracing): validate caller-supplied tracingId as UUID The `outputJSON` route echoed `tracing.tracingId` back to clients without checking the shape. Because the surrounding `tracing` record is free-form, a malformed value passed request validation, then failed DB insertion on the uuid PK and was later rejected by `recordFeedback` (`z.string().uuid()`), so callers could receive a tracingId unusable for the feedback flow. Tighten `StructureOutputSchema.tracing` to a `z.object({ tracingId: uuid }).catchall(unknown)` so the validation happens at the request boundary; the route can then drop the redundant `typeof === 'string'` guard. --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |
||
|
|
cce14911d1 |
✨ 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> |
||
|
|
c056760414 |
✨ feat(tool): archive oversized tool results to VFS instead of truncating (#15074)
* 📝 docs: add tool result archive design * ✨ feat(tool): archive oversized tool results to VFS instead of truncating When tool execution results exceed the configured max length, the full content is now persisted to the agent's VFS under ./.tool-results/ and the LLM receives a truncated preview with an archive path pointer. Key changes: - Add archiveToolResultIfNeeded() to persist oversized results via VFS - Add skipResultTruncation flag to ToolExecutionContext so the runtime can receive full content for archival before truncation - Add line-range (loc) support to VFS reads for inspecting archived files - Extend AgentDocumentReadResult with line/char count and loc metadata - Wire archival into both single-tool and batch-tool executor paths * ✨ feat(tool-archive): cover webapi client tool path and bypass agent-documents reads Server-only AgentRuntime archive missed the main webapi chat loop where tool execution happens in the browser. Route oversized tool results from the client plugin executors through a new aiChat.archiveToolResult tRPC mutation that reuses archiveToolResultIfNeeded, so calculator/MCP/klavis/lobehub-skill calls all archive to the VFS instead of just being truncated. Flatten the archive layout to ./.tool-results/<topicId>_<toolCallId>.md to dodge a nested-folder edge case in the VFS resolver, surface the agent_documents.id in the model-facing hint so the LLM can call lobe-agent-documents.readDocument directly, and bypass archive entirely for lobe-agent-documents tool results so reading the archive does not loop back into another archive write. Also harden truncateToolResult against splitting a UTF-16 surrogate pair: when the cutoff lands on a high surrogate, step back one code unit so JSON.stringify no longer emits a lone \\uD83D escape that DeepSeek / Anthropic reject as 'unexpected end of hex escape'. Includes a small ApprovalMode dropdown placement + trigger styling tweak. * 🔨 chore: untrack docs/superpowers from git The path is already excluded by .gitignore line 149; the design spec was only in the index because an earlier commit forced it in. Remove it from tracking while keeping the local copy so the ignore rule actually takes effect. * 🧪 test(truncate-tool-result): exhaustive cutoff sweep over a ZWJ-composed emoji A single surrogate pair was easy to get right; the real-world worry is ZWJ sequences like 👨👩👧👦 where four surrogate pairs are stitched with ZWJs into one grapheme. Sweep every cutoff position across that family emoji and assert the result never leaves a lone high surrogate and always round-trips through JSON.stringify / JSON.parse. * 🐛 fix(thinking): drop stale loading when stream cancelled or ended Thinking accordion and assistant content loading dot kept spinning after the user aborted a stream or the run ended without closing the inline `<think>` tag. Gate the markdown thinking plugins on `isMessageGenerating(id)` and bail out of `ContentLoading` when no running operation exists for the message. |
||
|
|
391b16e082 | ⚡️ perf: optimize chat bootstrap persistence (#14934) | ||
|
|
7b6978271a |
✨ feat(chat): support local file mention snapshots (#14278)
* ✨ support local file mention snapshots * ✨ feat(local-file-mention): implement useLocalFileMention hook for local file search functionality Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix desktop project file index fallback --------- Signed-off-by: Innei <tukon479@gmail.com> |
||
|
|
bbf239705c |
🐛 fix(send-message): forward topic-list filter to server response (#14160)
* 🐛 fix(send-message): forward topic-list filter to server response Without this, sending a message refreshes `topicDataMap` with an unfiltered list, so completed/cron topics flash back into the sidebar until the next SWR revalidation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(topic): preserve filter fields in internal_updateTopics internal_updateTopics rewrote topicDataMap[key] from scratch and dropped excludeStatuses / excludeTriggers, so #getTopicFilter returned undefined on the second sendMessageInServer call and stopped forwarding the filter to the server — completed/cron topics could leak in until SWR revalidated. Carry the filter fields forward from currentData, matching loadMoreTopics. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
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> |
||
|
|
f38dcc4cfc |
🐛 fix(cc): persist workingDirectory when CC topic is created (#13956)
Hetero-agent topic creation went through `aiChat.sendMessageInServer`'s `newTopic` payload, which had no metadata field, so the topic row was inserted with `metadata.workingDirectory = NULL`. Today the only writer is the post-execution `updateTopicMetadata` in `heterogeneousAgentExecutor` — that never lands when CC is cancelled or errors before completion, and in the meantime the topic is missed by By-Project grouping and `--resume` cwd verification has nothing to compare against. Source the cwd at the start of the hetero branch and thread it through `newTopic.metadata`, so the binding is set at insert time. The post-exec update still runs to record `ccSessionId` (and is now a no-op for cwd). Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
97f4a370ab | ✨ feat: add request trigger tracking, embeddings billing hooks, and memory extraction userId fix (#13061) | ||
|
|
4438b559e6 |
✨ feat: add slash action tags, topic reference tool, and command bus system (#12860)
* ✨ feat: add slash action tags in chat input Made-with: Cursor * ✨ feat: enhance editor with new slash actions and localization updates - Added new slash actions: change tone, condense, expand, polish, rewrite, summarize, and translate. - Updated localization files for English and Chinese to include new action tags and slash commands. - Removed deprecated useSlashItems component and integrated its functionality directly into InputEditor. Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat: add slash placement configuration to chat input components - Introduced `slashPlacement` prop to `ChatInputProvider`, `StoreUpdater`, and `InputEditor` for customizable slash menu positioning. - Updated initial state to include `slashPlacement` with default value 'top'. - Adjusted `ChatInput` and `InputArea` components to utilize the new `slashPlacement` prop. This enhancement allows for better control over the user interface in chat input interactions. Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat: implement command bus for slash action tags processing Add command bus system to parse and execute slash commands (compact context, new topic). Refactor action tag categories from ai/prompt to command/skill. Add useEnabledSkills hook for dynamic skill registration. * feat: compress command Signed-off-by: Innei <tukon479@gmail.com> * refactor: compress Signed-off-by: Innei <tukon479@gmail.com> * fix: skill inject * ✨ feat: slash action tags with context engine integration Made-with: Cursor * ✨ feat: add topic reference builtin tool and server runtime Made-with: Cursor * ✨ feat: add topic mention items and update ReferTopic integration Made-with: Cursor * 🐛 fix: preserve editorData through assistant-group edit flow and update RichTextMessage reactively - EditState now forwards editorData from EditorModal to modifyMessageContent - modifyMessageContent accepts and passes editorData to updateMessageContent - RichTextMessage uses useEditor + effect to update document on content change instead of key-based remount - Refactored RichTextMessage plugins to use shared createChatInputRichPlugins() * ✨ feat(context-engine): add metadata types and update processors/providers Made-with: Cursor * ✨ feat(chat-input): add slash action tags and restore failed input state * 🔧 chore: update package dependencies and enhance Vite configuration - Changed @lobehub/ui dependency to a specific package URL. - Added multiple SPA entry points and layout files to the Vite warmup configuration. - Removed unused monorepo packages from sharedOptimizeDeps and added various dayjs locales for better localization support. Signed-off-by: Innei <tukon479@gmail.com> * 🔧 chore: update @lobehub/ui dependency to version 5.4.0 in package.json Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix: correct SkillsApiName.runSkill to activateSkill and update trimmed content assertions * 🐛 fix: resolve type errors in context-engine tests and InputEditor slashPlacement * 🐛 fix: update runSkill to activateSkill in conversationLifecycle test * 🐛 fix: avoid regex backtracking in placeholder parser * ✨ feat(localization): add action tags and tooltips for slash commands across multiple languages Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix: preserve file attachments when /newTopic has no text content * cleanup Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com> |
||
|
|
3112036b38 |
🔧 chore: resolve all ESLint suppressions and remove suppression file (#12518)
* 🔧 chore: upgrade ESLint deps and resolve all suppressions - Upgrade eslint 10.0.0→10.0.2, @lobehub/lint 2.1.3→2.1.5, eslint-plugin-mdx ^3.6.2→^3.7.0 - Remove eslint-suppressions.json and all suppression-related scripts/configs - Fix 197 ESLint errors: no-console, no-unused-private-class-members, no-useless-assignment, preserve-caught-error, prefer-const, regex issues, etc. - Remove dead rule references (sort-keys-fix, typescript-sort-keys, ban-types) - Disable project-convention-conflicting rules globally in eslint.config.mjs - Update test spies from console.log to console.info * 🔧 fix: update regex for unresolved model error handling - Modified the UNRESOLVED_MODEL_REGEXP to allow for additional valid characters in model names, enhancing error detection for missing models. Signed-off-by: Innei <tukon479@gmail.com> --------- Signed-off-by: Innei <tukon479@gmail.com> |
||
|
|
96627b9bb8 | chore: fix lint | ||
|
|
fcdaf9d814 |
🔧 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> |
||
|
|
7ae5f687f7 |
🐛 fix: fix page selection not display correctly (#11765)
* fix page selection * fix page selection * fix page selection * fix page selection * fix page context engine * fix page context engine |
||
|
|
8078cb9778 |
♻️ refactor: refactor and fix model runtime initialize (#11134)
* ♻️ refactor: refactor and fix model runtime initialize
* fix test for model runtime
* improve loading style
* fix tests
* fix error mode
* fix error display issue
* improve style
* try to fix issue
* improve style
* improve task Inspector style
* update i18n
* fix task error state
* update i18n
* fix error result
* fix error
|
||
|
|
0ca823fc56 | ♻️ refactor: use supervisor role for agent group supervisor | ||
|
|
e87bee6dd5 |
chore: update lint to use type imports (#10970)
* chore: update lint to use type imports 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * revert * chore: add workspaces and overrides to package.json * refactor: clean up imports in lobe-web-browsing executor --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
7dd30ebb98 | 🐛 fix: fix thread not working issue | ||
|
|
685a6cd5a5 | ✨ feat: server implement | ||
|
|
b95e741717 |
✨ feat: refactor to use agent runtime as the generation core and support branch mode (#10080)
* refactor * refactor * refactor message group * wip # Conflicts: # src/store/chat/slices/aiChat/actions/generateAIChatV2.ts * refactor * refactor agent mode * fix style * refactor agent executors * finish the refactor * remove gpt-tokenizer * add metadata api * add fix * support branch * fix branch render data * fix send issue * refactor style * refactor style * refactor tests * refactor chatStore * refactor from model to model * fix tests * refactor regenerate mode * update style * fix lint * refactor * refactor * refactor * fix delete * refactor thread mode * fix basic experience * fix * fix tests * fix manual add * fix tests * fix group |
||
|
|
d99a3a80f8 |
🐛 fix: pass threadId to messages in sendMessageInServer (#9808)
* fix dev hydration * 🐛 fix: pass threadId to messages in sendMessageInServer - Add threadId parameter to CreateMessageParams interface - Pass threadId when creating user and assistant messages in aiChat router - Add comprehensive tests for threadId handling and outputJSON method This ensures thread context is properly maintained across message creation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * ✅ test: add comprehensive tests for addUserMessage - Test early return when activeId is undefined - Test message creation with files - Test threadId propagation when activeThreadId is set - Test input message clearing after message creation - Test handling messages without fileList This ensures the addUserMessage action correctly handles all scenarios including thread context. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * fix thread fix * move * baseline * ✅ test: fix and improve message integration tests - Mock FileService to avoid S3 initialization issues - Mock getServerDB to use test database instance - Add test for threadId parameter in message creation - Fix pagination test to handle variable message counts - Fix batchCreate test to skip rowCount assertion (undefined in PGlite) - Skip topicId validation test (not currently enforced) All 15 integration tests now passing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * refactor * improve |
||
|
|
0596692e95 |
🐛 fix: fix response API tools calling issue (#9760)
* fix response tools calling * add log * fix * fix tests * fix all text and lint and types * refactor google context builder * add tests |
||
|
|
97a6c8e172 |
🔨 chore: refactor the prompt engineering (#9744)
refactor the prompt engineering |
||
|
|
a02b301904 |
🐛 fix: Automatic topic creation switch does not work (#9693)
* ✨ feat: 添加自动创建主题功能,支持根据消息数量和配置阈值决定是否创建新主题 * typo * fix test * 删除 GLM-4.6 模型的定义 * ✨ feat: 添加 Ring-1T 和 Ling-1T 模型定义,扩展聊天模型库 * ✨ feat: 添加 Qwen3 VL 模型,扩展聊天模型库并更新 Vercel AI Gateway 模型定价 * fix test |
||
|
|
1238d7fbd5 |
🔨 chore: output JSON support tools calling mode (#9696)
* support tools calling in generateObject method * fix tests |
||
|
|
2518d7eabf |
🐛 fix: fix input cannot send markdown (#9674)
* fix claude json output * refactor to remove langchain in file-loaders * support deepseek tools calling * use peer * use peer * move files * fix test * add local-system placeholder * fix markdown editing * fix markdown editing * refactor doc parse |
||
|
|
1a77d9f9c6 |
🔨 chore: add api for structure output (#9382)
* ✨ feat: 实现 structure output * add tests * ✨ feat: 实现 structure output * add support for structure output in chat completions * add support for structure output in router runtime * improve test * add google generateObject * add google generateObject tests * add Anthropic generateObject |
||
|
|
4099dfd955 |
🐛 fix: fix missing provider in server message (#9361)
fix |
||
|
|
4813b6df27 |
✨ feat: refactor to speed up send message in server mode (#9046)
* refactor send message * support message rag data * fix * fix tests * fix lint * add tests * fix bug |