mirror of
https://github.com/lobehub/lobehub.git
synced 2026-09-20 04:56:13 +08:00
feat/quick-note-db-migration
26 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
3905dd29de |
✅ test: pin the polling regression with a fixed-count case (#18997)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
84f749e7dc |
🐛 fix: raise tool-call repeat limit from 5 to 20 (#18989)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
f6e47529f3 |
🐛 fix(agent-runtime): stop repeated tool call loops (#18965)
* 🐛 fix(agent-runtime): stop repeated tool call loops * 🐛 fix(agent-runtime): preserve abort over loop guard |
||
|
|
f6ddb0675e |
🐛 fix: stop retrying Google content blocks and end client runs immediately (#17937)
Co-authored-by: YuTengjing <ytj2713151713@gmail.com> |
||
|
|
4e677af923 |
🐛 fix(agent): inject runtime todos into server context (#17671)
* 🐛 fix(agent): inject runtime todos into server context * 🧪 test(agent): keep server todo fixture canonical |
||
|
|
174b03976c |
🐛 fix(agent): stop retries for empty completions (#17418)
* 🐛 fix(agent): stop automatic retries for empty completions * 🐛 fix: address empty completion review feedback * 🐛 fix: address empty completion review feedback * 🐛 fix: surface empty completion cost |
||
|
|
3c3dcd608c |
🐛 fix(agent-runtime): restore activated tools across operations (#17076)
* 🐛 fix(agent-runtime): restore activated tools across operations * ✅ test(agent-runtime): cover cross-operation tool restoration * 🐛 fix(agent-runtime): gate restored tools by current run * 🐛 fix(agent-runtime): expose restoration eligibility in service types * ✅ test(agent-runtime): preserve existing tool generation contract |
||
|
|
5bb36b0fed |
♻️ refactor: move LLM error classifier into agent-runtime (#16871)
♻️ refactor: move llm error classifier to agent runtime
|
||
|
|
2f269ddaa4 | ♻️ refactor(agent-runtime): host resolve tools and retry helpers in package (#16862) | ||
|
|
25e5307d96 |
🐛 fix(skills): restore device execution branch for execScript in gateway mode (#16807)
* 🐛 fix(skills): restore device execution branch for execScript in gateway mode * 🐛 fix: derive device execScript success from exit status and forward observation timeout * ✨ feat: fall back to sandbox for legacy device clients without prepareSkillDirectory RPC * 🐛 fix: validate zipHash, resolve project skill cwd, and surface still-running device commands * 🐛 fix: surface device service failures reported inside a delivered envelope * 🐛 fix: gate tool-execution activeDeviceId on the resolved plan and access policy * 🐛 fix: block hidden sandbox APIs on device runs and surface saved-output paths * 🐛 fix: forward device skill context to batched tool calls * 🐛 fix: thread activatedSkills through server tool execution and handle grouped message shape * 🐛 fix: show running indicator for still-running execScript and parallelize device skill prepares * 🐛 fix: preserve filesystem/builtin skill activations without ids in step context * 🐛 fix: skip unresolvable activations when resolving desktop exec cwd * 🐛 fix: serialize same-hash skill preparation and publish via staging rename * 🐛 fix: move reactivated skills to the end of the activation order * 🔨 chore: broaden agent-tracing skill triggers for tool-call debugging |
||
|
|
42aa82127b |
♻️ refactor(agent-runtime): move empty-completion + reasoning-replay utils into the package (#16460)
* ♻️ refactor(agent-runtime): move empty-completion + reasoning-replay utils into the package Sink transport-independent runtime helpers from the server executor layer into @lobechat/agent-runtime so both client and server can share them (first slice of LOBE-10949 P2 — "下沉 runtime-pure 逻辑进包"): - ModelEmptyError + isEmptyModelCompletion -> core/modelCompletion.ts - stripAssistantReasoningForReplay -> utils/replay.ts The server executor layer re-imports them from the package; the local ModelEmptyError.ts shim is removed and all call sites (incl. tests) repointed. Only helpers whose deps are @lobechat/types-only were moved — retry budgets and LLM error classification stay server-side (they need model-runtime / business-const) and are tracked as a follow-up. Behavior unchanged: type-check clean, agent-runtime suite 266/266, RuntimeExecutors.test.ts 125/125. Part of LOBE-10949 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * 🐛 fix(agent-runtime): declare @lobechat/types as a runtime dependency modelCompletion.ts value-imports AgentRuntimeErrorType (an enum), so @lobechat/types is now a runtime — not just compile-time — dependency of @lobechat/agent-runtime. Move it from devDependencies to dependencies so the package resolves it when installed/consumed without devDependencies. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * ♻️ refactor(model-runtime): relocate empty-completion error/detector to model-runtime Move ModelEmptyError + isEmptyModelCompletion from @lobechat/agent-runtime to @lobechat/model-runtime, where the empty-completion concept already lives — its error-code spec (errors/specs.ts: category/attribution 'provider', httpStatus 471, retryable), taxonomy, and locale. "Did the model return an empty turn?" is a provider-response classification, not transport-agnostic agent-loop logic. - model-runtime: new errors/modelEmptyCompletion.ts, exported from the package. - agent-runtime: drop core/modelCompletion.ts and revert @lobechat/types back to devDependencies (no remaining runtime value-import of it; replay.ts is type-only). - server callLlm / executorHelpers + tests import the pair from @lobechat/model-runtime. - RuntimeExecutors.test.ts: its hand-stub of the cloud model-runtime package now pulls the real (pure) ModelEmptyError/isEmptyModelCompletion from source, so the executor and the tests share one class identity for instanceof checks. type-check clean; agent-runtime 266/266, model-runtime errors 103/103, RuntimeExecutors 125/125. Part of LOBE-10949 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
04700bed52 |
✨ feat(agent-runtime): server callSubAgent async suspend/resume (#15481)
* ✨ feat(agent-runtime): add waiting_for_async_tool parked state for deferred tools
Add a dedicated `waiting_for_async_tool` operation status that mirrors
`waiting_for_human` as a non-terminal, resumable pause, and migrate the
client-tool execution pause off `interrupted` onto it — so `interrupted`
once again means only user-initiated cancellation.
Also add the AgentOperationModel primitives the upcoming server sub-agent
bridge needs: queryByParentOperationId (reconcile child ops) and
tryResumeFromAsyncTool (atomic single-fire CAS).
Foundation for the server sub-agent suspend/resume mechanism (LOBE-9763).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* ♻️ refactor(agent-runtime): extract isParkedStatus / isBlockedStatus predicates
Replace the repeated `status === 'waiting_for_human' || ... === 'waiting_for_async_tool' || ... === 'interrupted'`
chains with named predicates so the parked/blocked semantics live in one place
(runtime step-loop break, completion lifecycle completedAt, executeSync pause,
operation isActive).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* ♻️ refactor(aiAgent): rename execSubAgentTask -> execSubAgent
Full rename of the service method, its `ExecSubAgentTaskParams`/`ExecSubAgentTaskResult`
types, the tRPC endpoint, the injected `RuntimeExecutorContext`/`AgentRuntimeServiceOptions`
callback, and tests. Group-mode `execGroupSubAgent*` identifiers are intentionally left
untouched. Prep for the server sub-agent suspend/resume work (LOBE-9763).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* Revert "♻️ refactor(aiAgent): rename execSubAgentTask -> execSubAgent"
This reverts commit
|
||
|
|
ddb5794826 |
chore: clean up LOBE-XXX code annotations (#15135)
* chore: clean up LOBE-XXX annotations from codebase comments - Remove 【LOBE-XXX】 bracket markers - Remove LOBE-XXXX references from inline comments - Clean up test descriptions containing LOBE identifiers - Preserve linear.app URLs and code-level regex patterns - Generated: 2026-05-23 02:30:09 * 🐛 fix(tests): restore () in arrow callbacks broken by annotation cleanup The LOBE-XXX annotation cleanup script over-matched `(LOBE-XXXX', () =>` and stripped the callback `()`, leaving invalid syntax like `describe(..., => {` and `it(..., async => {` across 24 test files. This caused parse failures in Test Packages, Test Desktop App, Test Database lint, and Test App shard runs. Restoring `()` / `async ()` unblocks the suites while keeping the ticket-text cleanup intact. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(hintFormat-test): restore label + ellipsis in stripMarkdownLinks fixture The annotation cleanup stripped `LOBE-8516` from a markdown-link's *label* (`[LOBE-8516](/task/T-1)` → `[](/task/T-1)`), which then survived `stripMarkdownLinks` because the pattern requires non-empty link text — the test expected the link to disappear and asserted equality on a LOBE-free output. The same line also lost a `.` from the trailing `...` indicator in both input and expected strings. Substitute a neutral Chinese label (`发布计划`) so the link continues to exercise the multi-link substitution path, and restore the full `...` ellipsis. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Arvin Xu <arvinxx@lobehub.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
8ca3f9a372 |
🐛 fix(agent-runtime): forward tools into compression budget on call_llm (#14837)
* 🐛 fix(agent-runtime): forward tools into compression budget on call_llm Tool definition tokens were already counted by `countContextTokens`, but `GeneralChatAgent` never passed `tools` into `compressionOptions`, so a large tool manifest (16-22K tokens observed on openrouter `:free` variants) could push the request past the model's context window without ever tripping the compression threshold. Forward `state.tools` (init/user_input) and `payload.tools` (toLLMCall) into `shouldCompress`. Fixes LOBE-8973 Bug B. * 🐛 fix(agent-runtime): skip tool budget on force-finish continuations When state.forceFinish is set, RuntimeExecutors.callLlm strips every tool via buildStepToolDelta (deactivatedToolIds: ['*']) before the model call. The compression check must mirror that stripping — otherwise the operation's tool schemas push the budget over threshold and the runner returns compress_context, spending an extra summarization pass on tokens that won't be sent. Threads state.forceFinish through the compression budget at both the init/user_input and the toLLMCall paths. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
6e6970f1b2 |
🐛 fix(context-engine): account for tool_calls + reasoning + tool defs in compression budget (#14813)
🐛 fix(context-engine): account for tool_calls + reasoning + tool defs in compression budget The pre-compression token check (`shouldCompress`) only counted `msg.content`, which under-counted typical agent conversations by ~58% — tool_calls (~33% of payload), reasoning traces (~17%), and top-level tool definitions (~2%) were all silently ignored. As a result, conversations that the provider tokenizer measured at ~656K passed the harness's 524K threshold without firing compression, and were rejected upstream as ExceededContextWindow. Verified empirically against 2 op snapshots in the same topic that hit the failure mode (LOBE-8964): harness counted 267K, deepseek measured 649K — a 380K (58.8%) gap. ~92% of that gap is fixable by accounting for the missing fields; the remaining ~8% is `tokenx` vs provider tokenizer drift, compensated by a 1.25× multiplier on the trigger path. Changes: - New `@lobechat/context-engine/tokenAccounting` module exporting `countContextTokens({messages, tools, options})`. Returns structured per-source + per-message + per-tool breakdown — usable both by the compression trigger and by UI panels showing "context by type". - `shouldCompress` in agent-runtime delegates to `countContextTokens`, applies the 1.25× drift multiplier on `adjustedTotal` for the trigger decision, exposes raw count via `currentTokenCount`. Signature now takes `UIChatMessage[]` directly. - Removed deprecated `calculateMessageTokens` / `estimateTokens` / `TokenCountMessage` from agent-runtime — the new module supersedes them. `createAgentExecutors.ts` updated to call `countContextTokens` directly for post-compression telemetry. - Added `raw-md` plugin to agent-runtime vitest config (needed once context-engine is imported transitively, since the import graph pulls in `@lobechat/agent-templates` `.md` files). What's intentionally NOT counted (DB-only fields not sent to provider): `plugin`, `pluginState`, `chunksList`, `extra`, `fileList`, etc. Counting these would over-estimate and trigger compression too early. Tests: - 19 new unit tests for `countContextTokens` covering content / tool_calls / reasoning / tool_call_id / tool definitions / fast-path / aggregation / DB-only field exclusion. - `tokenCounter.test.ts` updated for new drift semantics + UIChatMessage signature; one boundary case now triggers compression (intentional — the drift multiplier kicks in at the threshold). Refs: LOBE-8964 (ECW edge boundary), LOBE-8972 (ECW umbrella), LOBE-8973 (openrouter `:free` ctx), LOBE-8976 (compression diagnostics). Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
ccddbaa25d |
♻️ refactor(builtin-tool): move sub-agent dispatch from lobe-gtd to lobe-agent (#14715)
* ♻️ refactor(builtin-tool): move sub-agent dispatch from lobe-gtd to lobe-agent
Move the `execTask` / `execTasks` capability out of `packages/builtin-tool-gtd/`
and into `packages/builtin-tool-lobe-agent/`, renaming the public APIs to
`callSubAgent` / `callSubAgents`. The "subtask" naming inside GTD overlapped
with the new lobe-task tool's task model and conflated planning with
sub-agent dispatch.
- API names: `execTask` → `callSubAgent`, `execTasks` → `callSubAgents`
- TS types: `ExecTaskParams` → `CallSubAgentParams`, etc.; introduce
`SubAgentTask` to replace `ExecTaskItem`
- Client UI (Inspector / Render / Streaming) ported under
`packages/builtin-tool-lobe-agent/src/client/`
- Central registries (`packages/builtin-tools/src/{inspectors,renders,streamings}.ts`)
updated to register lobe-agent
- GTD `meta.description` and system role no longer mention async tasks;
they point to lobe-agent for sub-agent dispatch
- `isSubTask` filtering in `agentConfigResolver` now excludes `lobe-agent`
(new owner of sub-agent dispatch) instead of `lobe-gtd`
- i18n: new `builtins.lobe-agent.apiName.callSubAgent*` and
`workflow.toolDisplayName.callSubAgent*` keys in default/zh-CN/en-US
Kept the executor's emitted `state.type` values (`execTask` / `execTasks` /
`execClientTask` / `execClientTasks`) unchanged so the agent-runtime
instruction layer (`exec_task` / `exec_tasks` / `exec_client_task*`) and all
downstream tests / heterogeneous executors (`builtin-tool-agent-management`,
server `agentManagement` runtime) continue to work without modification.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ♻️ refactor(chat): rename isSubTask flag to isSubAgent
After moving sub-agent dispatch from lobe-gtd to lobe-agent, the flag name
no longer matches what it controls. Rename `isSubTask` → `isSubAgent` across
the chat / agent runtime layer and update related comments and test labels.
- `agentConfigResolver` context field + filter helper
- `streamingExecutor.internal_createAgentState` + `executeClientAgent`
signatures and call sites
- `createAgentExecutors` (exec_task / exec_client_task handlers) and
`GroupOrchestrationExecutors` (batch_exec_async_tasks)
- `chatService.createAssistantMessageStream` `resolvedAgentConfig` docs
- Test descriptions and assertions in `agentConfigResolver.test.ts` and
`streamingExecutor.test.ts`
No behavior change — the flag's filter target (`lobe-agent` identifier) is
unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ♻️ refactor(agent-runtime): rename exec_task wire identifiers to exec_sub_agent
Bring the agent-runtime "wire" naming in line with the lobe-agent
callSubAgent / callSubAgents API rename. Three layers are renamed in lockstep
to keep the bridge between tool executors and the runtime consistent:
1. Tool-emitted state.type discriminators
- 'execTask' → 'execSubAgent'
- 'execTasks' → 'execSubAgents'
- 'execClientTask' → 'execClientSubAgent'
- 'execClientTasks' → 'execClientSubAgents'
2. AgentInstruction.type and matching TS interfaces
- 'exec_task' / 'exec_tasks' / 'exec_client_task' / 'exec_client_tasks'
→ 'exec_sub_agent' / 'exec_sub_agents' / 'exec_client_sub_agent' /
'exec_client_sub_agents'
- AgentInstructionExecTask → AgentInstructionExecSubAgent (and the three
siblings)
- ExecTaskItem → SubAgentTask
3. AgentRuntimeContext.phase + matching payload types
- 'task_result' → 'sub_agent_result'
- 'tasks_batch_result' → 'sub_agents_batch_result'
- TaskResultPayload → SubAgentResultPayload
- TasksBatchResultPayload → SubAgentsBatchResultPayload
Also renames the operation-type discriminator 'execClientTask' /
'execClientTasks' to 'execClientSubAgent' / 'execClientSubAgents' and updates
its locale string in default / zh-CN / en-US.
Tests / fixtures / mocks updated in lockstep:
- packages/agent-runtime/src/agents/{GeneralChatAgent.ts,__tests__/...}
- packages/builtin-tool-{lobe-agent,agent-management}/src/...
- src/server/services/toolExecution/serverRuntimes/agentManagement.ts
- packages/agent-mock/src/cases/builtins/todo-write-stress.ts (helper renamed
to callSubAgent)
- src/store/chat/agents/createAgentExecutors.ts + exec-task / exec-tasks tests
+ fixtures/mockInstructions.ts (createExecSubAgent[s]Instruction)
- src/store/chat/slices/aiChat/actions/streamingExecutor.ts (phase check)
- packages/conversation-flow/src/__tests__/fixtures/**/*.json (8 fixtures
retargeted from lobe-gtd/execTask[s] to lobe-agent/callSubAgent[s] with the
new state.type wire values)
No behavior change — the agent runtime, executors and tests all go through
the same code paths; only the strings on the wire change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ♻️ refactor(builtin-tool): absorb GTD tool (plan + todo) into lobe-agent
Delete `packages/builtin-tool-gtd/` and fold its full surface — plan, todo,
ExecutionRuntime, all client UI (Inspector / Render / Streaming /
Intervention / SortableTodoList) and the system role — into
`packages/builtin-tool-lobe-agent/`. Single `lobe-agent` identifier now
owns: plan + todo management, sub-agent dispatch, and visual media analysis.
Also restructures the lobe-agent package so the executor lives under
`./client/` alongside the UI it ships with, and drops the dedicated
`./executor` export — consumers go through `./client` for everything
client-side.
Package-level changes:
- DELETE `packages/builtin-tool-gtd/` entirely.
- `packages/builtin-tool-lobe-agent/`
- Move `src/executor/` → `src/client/executor/`. Drop `./executor` from
`package.json` exports; expose `lobeAgentExecutor` via `./client` only.
- Rename `GTDExecutionRuntime` → `PlanExecutionRuntime` and place under
`src/client/executor/PlanRuntime/`. Re-export from package root so the
server runtime can consume it without pulling in client UI deps.
- Extend `LobeAgentExecutor` with `createPlan` / `updatePlan` /
`createTodos` / `updateTodos` / `clearTodos`, all delegated to the
shared runtime.
- Add Plan + Todo API entries to the manifest (with their original
descriptions, humanIntervention, renderDisplayControl).
- Move all GTD client UI verbatim:
`Inspector/{ClearTodos,CreatePlan,CreateTodos,UpdatePlan,UpdateTodos}`,
`Render/{CreatePlan,TodoList}`, `Streaming/CreatePlan`,
`Intervention/{AddTodo,ClearTodos,CreatePlan}`,
`components/SortableTodoList`. Register them in
`LobeAgentInspectors / Renders / Streamings`, add new
`LobeAgentInterventions`.
- Merge GTD system role into lobe-agent's (`<plan_and_todos>` plus the
existing `<sub_agents>` and `<run_in_client>` sections).
- `package.json`: pick up `@lobechat/prompts` dep and `@lobehub/editor` +
`antd` + `lucide-react` peer-deps inherited from GTD.
Central registries (`packages/builtin-tools/src/*`) and consumers:
- Remove every `GTDManifest / Inspectors / Renders / Streamings /
Interventions` import + registration; existing `LobeAgent*` registrations
now cover them.
- Replace `[GTDManifest.identifier]: GTDInterventions` with
`[LobeAgentManifest.identifier]: LobeAgentInterventions`.
- Drop `@lobechat/builtin-tool-gtd` workspace dep from
`packages/builtin-tools/package.json`, `packages/builtin-agents/package.json`
and root `package.json`.
- Remove `gtdExecutor` from `src/store/tool/slices/builtin/executors/index.ts`;
switch `lobeAgentExecutor` import to `/client`.
- Replace `serverRuntimes/gtd.ts` with a service factory
`serverRuntimes/lobeAgentPlan.ts` (`createServerPlanRuntimeService`).
`serverRuntimes/lobeAgent.ts` instantiates `PlanExecutionRuntime` with
that service so the registry exposes one runtime per `lobe-agent`
identifier covering both visual analysis and plan/todo.
- `services/chat/mecha/contextEngineering.ts`: gate plan/todo injection on
`LobeAgentIdentifier` instead of `GTDIdentifier`.
- `agentConfigResolver.test.ts`: switch fixture plugin IDs to
`LobeAgentIdentifier`.
- `packages/const/src/recommendedSkill.ts`: drop the standalone `lobe-gtd`
recommendation — `lobe-agent` already covers it via `defaultToolIds`.
i18n migration (default + zh-CN + en-US; other locales regenerate on
`pnpm i18n`):
- `builtins.lobe-gtd.*` → `builtins.lobe-agent.*` in `plugin.ts/json`.
- `lobe-gtd.*` (tool namespace) → `lobe-agent.*` in `tool.ts/json`.
- Remove `tools.builtins.lobe-gtd.{description,readme,title}` from
`setting.ts/json` (lobe-agent has its own meta now).
- Update all client component `t(...)` keys to the new namespace.
Mocks / fixtures / tests:
- `packages/agent-mock/src/cases/builtins/todo-write-stress.ts`: all
`identifier: 'lobe-gtd'` → `'lobe-agent'`; helper comments updated.
- `packages/types/src/stepContext.ts`: comment refers to
`builtin-tool-lobe-agent` (the only consumer of `StepContextTodoItem`).
- `packages/model-runtime/src/core/streams/google/google-ai.test.ts`:
function-call names from `lobe-gtd____createPlan` etc. → `lobe-agent____*`.
- `src/store/chat/slices/message/selectors/dbMessage.test.ts`: same.
- `src/features/DevPanel/RenderGallery/fixtures/lobe-gtd.ts` deleted; its
plan/todo fixtures are folded into `fixtures/lobe-agent.ts` alongside the
existing `callSubAgent[s]` ones.
- Replace `console.log` → `console.info` in moved client components to
satisfy lobe-agent's stricter ESLint rules (GTD package allowed
`console.log`; lobe-agent inherits the repo-wide `no-console` rule).
No behavior change for end users: `lobe-agent` now owns all the APIs,
identifiers, and UI that previously lived in `lobe-gtd`, but as a single
consolidated package under a single tool identifier.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ♻️ refactor(context-engine): drop residual GTD naming, rename to PlanInjector / TodoInjector
Follow-up to
|
||
|
|
d83f0a0f2f |
♻️ refactor(chat): introduce agentDispatcher.selectRuntimeType (#14428)
* 🔥 refactor: remove dead Search Summary chain Footer.tsx in web-browsing Search portal had near-zero usage. Removing it makes the entire chain dead: triggerAIMessage, summaryPluginContent, fillPluginMessageContent, saveSearchResult, plus the inSearchWorkflow param threaded through internal_execAgentRuntime. Part of LOBE-8519 — clears the path before introducing agentDispatcher. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat: add agentDispatcher.selectRuntimeType Centralizes the client / gateway / hetero routing decision so every entry point shares one source of truth. parentRuntime override lets sub-agent dispatches inherit their parent operation's runtime. Part of LOBE-8519 — call sites are migrated in following commits. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♻️ refactor: route sendMessage through selectRuntimeType Compute runtimeType once per sendMessage call and dispatch off it instead of re-deriving the hetero/gateway/client decision inline. Behavior is identical; this just centralizes the routing rule (LOBE-8519, A1). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♻️ refactor: route regenerate / continue through selectRuntimeType regenerateUserMessage and continueGenerationMessage in the conversation store now consult selectRuntimeType for routing. Hetero variants of both are not yet implemented (they currently fall through to client mode with a TODO + warning). Also drops chatStore.continueGenerationMessage — the conversation-store version is the only caller; the chat-store duplicate had zero production usage. Part of LOBE-8519 (A2, B4 deletion, B5). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♻️ refactor: route resume helpers through selectRuntimeType approveToolCalling / rejectToolCalling / rejectAndContinueToolCalling now consult selectRuntimeType (via #shouldUseGatewayResume) using the operation's own ConversationContext, instead of the bare isGatewayModeEnabled() check. Behavior is preserved (gateway resume vs. local resume); hetero resume is not yet implemented and falls through to the client local path. Part of LOBE-8519 (A3, A4, A5). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♻️ refactor: route sub-agent dispatch through selectRuntimeType directMentionRoute and callAgent now consult selectRuntimeType using the parent agent's config so sub-agent dispatches inherit the parent runtime. Only the client path is wired today; gateway / hetero variants warn + fall through with TODOs for follow-up. Part of LOBE-8519 (B3, B6). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ♻️ refactor: rename internal_execAgentRuntime to executeClientAgent Aligns the client runner's name with executeGatewayAgent and executeHeterogeneousAgent so the three runtimes share a consistent verb-noun pattern. Pure rename — no behavioral changes; log prefixes and test mock variables follow the new name. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
bc9ae6b4e5 |
✨ feat: support message queue (#13343)
* ✨ feat: add message queue for agent runtime (soft interrupt) Implement per-context message queue that allows users to send messages while the agent is executing. Messages are queued and consumed via two paths: injected at step boundaries during execution (Path A), or triggering a new sendMessage after completion (Path B). - Add QueuedMessage type and queuedMessages state in operation store - Add enqueue/drain/remove/clear actions and selectors - Modify sendMessage to enqueue when execAgentRuntime is running - Add queue checkpoint in step loop (streamingExecutor) - Add Path B: drain remaining queue after completion → new sendMessage - Keep input enabled during agent execution (remove isInputLoading guard) - Add QueueTray component showing "N Queued" above ChatInput - Add electron-testing skill for agent-browser CLI automation Fixes LOBE-6001 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: Path B deferred execution to avoid recursive internal_execAgentRuntime Use setTimeout(0) to break out of the current execution context when triggering a new agent runtime for queued messages after completion. Direct recursive calls caused issues with zustand state batching. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: remove premature Path A drain, fix Path B with fresh store ref Path A (step checkpoint injection) was draining the queue before the last LLM step, leaving nothing for Path B. For agents without tool calls, this meant queued messages were consumed but never acted upon. Fix: remove Path A for now (will be re-added for tool-call scenarios), and use useChatStore.getState() in Path B setTimeout to get a fresh store reference instead of a stale closure capture. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 📝 docs: update electron-testing skill with real-world patterns Based on lessons learned during message queue testing: - Must cd to apps/desktop before npx electron-vite dev - Use polling loop for startup detection - snapshot -i -C required for contenteditable (chat input) - Use sleep + screenshot instead of agent-browser wait for long ops - Access store via window.__LOBE_STORES.chat() - Add error interceptor and store inspection patterns - Document all gotchas (HMR, daemon blocking, fill vs type) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat: add Path A - early handoff to Path B at tool completion When tools finish and queue has messages, break the step loop early and let Path B create user message + start new operation. The new LLM call sees full context including tool results + new user message. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: Path B use sendMessage for proper message creation Use sendMessage instead of optimisticCreateMessage + internal_execAgentRuntime. sendMessage handles the full lifecycle correctly: creates user message on server, creates assistant message placeholder, and triggers internal_execAgentRuntime — ensuring both messages are visible in UI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 💄 style: redesign QueueTray to Codex-style card layout Each queued message shows as a card with icon, text preview, and delete button. Uses antd CSS variables for consistent theming. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 💄 style: connect QueueTray with ChatInput as unified container QueueTray and ChatInput now share a connected border: - QueueTray has top-rounded corners, no bottom border - ChatInput gets bottom-only rounded corners when queue has items - Uses cssVar for proper theme token styling - Zero gap between tray and input Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: move queue check logic into GeneralChatAgent Move the "finish early when queue has messages" decision from streamingExecutor into GeneralChatAgent.runner(). The agent now checks stepContext.hasQueuedMessages at tools_batch_result phase and returns finish instruction, which is architecturally cleaner. - Add hasQueuedMessages to RuntimeStepContext and computeStepContext - GeneralChatAgent returns finish when tools complete + queue non-empty - Remove Path A/B labels from comments - streamingExecutor just passes hasQueuedMessages via stepContext Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: forward queued files in sendMessage and drain only on success - Forward merged file attachments when replaying queued messages (sendMessage now receives files from merged queue) - Move drainQueuedMessages inside the status==='done' branch so queued messages are preserved on error/interrupted states - Add queued_message_interrupt to FinishReason enum - Add hasQueuedMessages check to tool_result and tasks_batch_result phases in GeneralChatAgent (not just tools_batch_result) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: use full operationContext for context key indexing - operationsByContext index now uses messageMapKey(context) with full context (including threadId, scope, etc.) instead of stripped key - Fixes key mismatch where thread/scoped contexts couldn't find running operations, causing overlapping generations - Move mergeQueuedMessages from services/messageQueue.ts into operation/types.ts alongside QueuedMessage type - Delete services/messageQueue.ts Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
b4862f2942 |
🐛 fix: manual tool disabled (#13218)
fix: manual tool disabled |
||
|
|
4065dc0565 |
🐛 fix: improve skill exec script way (#12926)
* fix: add the activatedSkills to improve the execScripte tools * feat: change the activePath into call market endpoint * fix: clean the code * feat: fixed the execScript in desktop ts error |
||
|
|
4363994945 |
✨ feat: support use remote device in IM integration (#12798)
* support timezone in system prompt refactor to improve user prompts refactor tool engine refactor tools map mode add bot callback service clean improve cli update agentic tracing refactor cli login refactor cli add device auth improve device gateway implement implement gateway pipeline support device Gateway connect support gateway * revert electron device * inject builtins agent prompts * update tracing * add testing * refactor the activeDeviceId * refactor BotCallbackService * fix test and lint * fix test and lint * add tests * fix tests * fix lint |
||
|
|
c5d41fd2be |
✨ feat: use lobe-tools to support progressive disclosure (#12489)
* activatedTool type * support active tools * fix explicitActivation tools issue * improve search ux * improve search result * improve search result * improve system prompts * fix types * fix tests * refactor a skills store tools * refactor a skills store tools * improve issue * fix some tests * fix tests * enable skills by default |
||
|
|
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> |
||
|
|
09a00df38e |
✨ feat: support history context auto compress (#11790)
* add compress implement * push * update * update * update * fix auto scroll * db schema update * fix compress * fix types * fix lint * update get compressedMessages * update content * update * fix tests * fix tests * fix tests |
||
|
|
a4b71e97cd |
💄 style: improve todo list (#11533)
* fix todo with wip * update * fix tests * fix url |
||
|
|
26e73cc438 | ♻️ refactor: add builtin tools |