Commit Graph

357 Commits

Author SHA1 Message Date
xintaofei
2e8d05ae34 fix(settings): use --disable-gpu for hardware acceleration toggle to align with Tauri 2 ecosystem 2026-04-25 17:20:02 +08:00
xintaofei
560b3083f0 fix(settings): use --disable-gpu-compositing to keep webview renderable 2026-04-25 16:32:47 +08:00
xintaofei
acc0cb3f06 fix(settings): drop --disable-software-rasterizer to avoid white-screen webview 2026-04-25 16:04:00 +08:00
xintaofei
f264f560b1 fix(acp): bypass Windows file locks when clearing binary cache
clear_agent_cache falls back to renaming the agent cache directory
to <cache_dir>/.trash/<agent_id>-<nanos>-<counter>/ when
remove_dir_all fails — typically because a running <cmd>.exe or a
Defender scan holds the file. NTFS rename succeeds on directories
whose children are locked, so Upgrade and Uninstall no longer
surface ERROR_ACCESS_DENIED on Windows.

A detached OS thread sweeps .trash/ at startup with all errors
swallowed, panics caught, and no shared state — cannot block app
startup or leak threads. Still-locked entries are left for the
next launch.
2026-04-25 15:56:47 +08:00
xintaofei
f0bd2a28a2 feat(settings): add Windows toggle to disable WebView2 hardware acceleration 2026-04-25 11:57:35 +08:00
xintaofei
5ae081e87a fix(acp): uninstall before reinstall on npx agent upgrade
Plain `npm install -g <pkg>@<version>` over an existing install does not
reliably re-resolve platform-specific optionalDependencies, leaving the
native CLI binary missing or stale (e.g. 'Native CLI binary for darwin-x64
not found' after the claude-agent-sdk upgrade). The Upgrade button now
runs npm uninstall -g first as a best-effort step, forcing npm to rebuild
the dependency graph from scratch on the subsequent install. If the clean
upgrade fails midway, the DB and the Settings UI resync to the actual
on-disk state instead of showing a phantom version.
2026-04-25 10:45:49 +08:00
xintaofei
4f0684dd04 # Release version 0.10.3
- fix(chat-input): raise toolbar collapse threshold to 34rem so selectors stay visible at wider input widths.
- fix(acp): prevent Windows terminal hangs caused by orphaned pipes and .cmd shims.
- fix(acp): fix context loss when resuming a historical conversation by deferring auto-connect until the session id resolves.
- fix(sidebar): clarify empty state when completed conversations are hidden.
- chore(acp): bump claude-code to 0.31.0, codex to 0.12.0, opencode to 1.14.23, gemini to 0.39.1.

-----------------------------
# 发布版本 0.10.3

- 修复(聊天输入):将工具栏折叠阈值提升到 34rem,更宽的输入区仍能保留选择器;
- 修复(ACP):修复 Windows 下因管道残留与 .cmd shim 导致的终端挂起;
- 修复(ACP):修复在历史会话中继续对话时偶发的上下文丢失问题,自动连接会等待历史会话 id 解析完成后再发起;
- 修复(侧边栏):在隐藏已完成会话时显示更清晰的空态提示;
- 杂项(ACP):升级 claude-code 至 0.31.0、codex 至 0.12.0、opencode 至 1.14.23、gemini 至 0.39.1。
2026-04-25 00:26:50 +08:00
xintaofei
d0184c2548 fix(acp): drain terminal readers before exposing exit status 2026-04-25 00:21:24 +08:00
xintaofei
675f97af94 fix(acp): prevent Windows terminal hangs from pipe orphans and .cmd shims 2026-04-24 23:54:11 +08:00
xintaofei
8405aa5dc8 chore(acp): bump claude-code to 0.31.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 23:32:16 +08:00
xintaofei
6d1a87a1e5 chore(acp): bump codex to 0.12.0, opencode to 1.14.23, gemini to 0.39.1 2026-04-24 22:32:35 +08:00
xintaofei
8d5ec464d9 # Release version 0.10.2
- feat(settings): add quick messages management with drag-and-drop sorting and place nav below agents.
- feat(message-input): turn plus button into menu with attach files and quick messages entries.
- feat(codex-skills): surface built-in .system skills as read-only.
- feat(sidebar-conversation-list): show empty-state hint inside expanded folders with no visible conversations.
- fix(sidebar): restrict folder reorder drag to the folder header row.
- fix(message-input): persist draft across restarts by keying on conversation id.
- fix(acp): prevent memory blowup from streaming terminal tool output.
- fix(web-server): release port reliably on stop by awaiting graceful shutdown.
- fix(experts): recognize Windows junction links to central store.
- perf(workspace-state): compress delta history, cache gitignore lookups, and tighten debounce.

-----------------------------
# 发布版本 0.10.2

- 新增(设置):新增快捷消息管理,支持拖拽排序,并将入口置于智能体下方;
- 新增(消息输入):将加号按钮改为菜单,集成附加文件与快捷消息入口;
- 新增(Codex 技能):将内置 .system 技能以只读方式展示;
- 新增(侧边栏会话列表):在展开的空文件夹中显示空态提示;
- 修复(侧边栏):将文件夹重排拖拽限制在文件夹标题行;
- 修复(消息输入):按会话 id 持久化草稿,重启后保留未发送内容;
- 修复(ACP):避免流式终端工具输出导致的内存膨胀;
- 修复(Web 服务器):停止时等待优雅关闭,确保端口可靠释放;
- 修复(专家):识别指向中央仓库的 Windows 联接点(junction link);
- 性能(工作区状态):压缩增量历史、缓存 gitignore 查询并收紧防抖。
2026-04-24 19:56:18 +08:00
xintaofei
59f2fd3bbf Merge branch 'cv-main' 2026-04-24 16:02:30 +08:00
xintaofei
8385837640 perf(workspace-state): compress delta history, cache gitignore lookups, tighten debounce 2026-04-24 16:02:06 +08:00
xintaofei
6a0425239f fix(web-server): release port reliably on stop by awaiting graceful shutdown 2026-04-24 15:23:12 +08:00
xintaofei
b79f06f7ae fix(experts): recognize Windows junction links to central store
On Windows the expert enable-status check compared `fs::read_link` output
against the central path, which silently failed for junctions: the link
state fell back to Broken/LinkedElsewhere, so enabled experts kept
reappearing as disabled and disappeared from the message-input expert
list. Switch the link verification to canonicalize both sides (which
transparently follows junctions and symlinks) and add a case-insensitive
path comparison on Windows. Also prefer `junction::get_target` for the
displayed target path.
2026-04-24 14:59:14 +08:00
xintaofei
51598f3b12 Merge branch 'cv-main' 2026-04-24 14:29:44 +08:00
xintaofei
bcfaba10c7 fix(acp): prevent memory blowup from streaming terminal tool output
Large raw_output snapshots from tool_call_update notifications caused
O(N²) traffic through the event pipeline, multi-GB transient allocations
and WKWebView crashes. The fix turns cumulative snapshots into bounded
incremental deltas and removes redundant payload copies.

- Add ToolCallOutputCache keyed by tool_call_id with a 8KB tail
  fingerprint and total length. Detects cumulative extensions by
  matching the cached tail at the expected offset in the incoming
  snapshot, so it works even when the full output grows into the MB
  range. Emits suffix deltas with raw_output_append=true; falls back
  to a truncated replacement when content diverges.
- Cap any single emitted raw_output chunk at 64KB (MAX_SINGLE_EMIT_BYTES)
  with a UTF-8 char-boundary-safe tail and ANSI-sequence-safe trimming.
  Apply the same cap to emit_terminal_output_update.
- Bound the cache at 256 entries with FIFO eviction, and clear entries
  when the tool call reaches completed / failed / cancelled / error.
- Seed the cache via a dedicated seed() method on SessionUpdate::ToolCall
  so the initial event never emits an accidental append.
- Share emit payloads as Arc<serde_json::Value> across broadcast
  receivers and skip the Tauri-side clone: serialize once and hand the
  same Arc to both the webview emit and the WebSocket broadcaster.
- Add 14 unit tests covering boundary cases: identity, prefix extension
  past the cached tail, divergence, oversized deltas, multibyte UTF-8
  truncation, final-status cleanup, FIFO eviction, seed semantics, and
  ANSI-safe trimming.
2026-04-24 14:28:41 +08:00
xintaofei
0e09711e56 feat(codex-skills): surface built-in .system skills as read-only
Scan ~/.codex/skills/.system so Codex CLI's bundled skills (imagegen,
skill-creator, etc.) appear in the $ autocomplete and Skills settings.
Mark them read_only on the API; the save/delete handlers refuse writes
to that path, and the UI shows a system badge with a tooltip and
disables edit/delete/save for those entries.
2026-04-24 14:18:36 +08:00
xintaofei
61778f152b feat(settings): add quick messages management with drag-and-drop sorting
Adds a new "Quick Messages" settings page below Experts for managing reusable title/content snippets, backed by SQLite via SeaORM and exposed through both Tauri commands and the Axum web router. The list supports drag-to-reorder using the same motion/react Reorder pattern as the agent list, with translations provided across all 10 supported locales.
2026-04-24 10:46:33 +08:00
xintaofei
49aee458d2 feat(sidebar): default new folders to neutral foreground color 2026-04-24 09:50:49 +08:00
xintaofei
46764ee53c # Release version 0.10.1
- feat(sidebar): add per-folder color swatch with color picker and neutral conversation rail.
- feat(conversation-context-bar): unify selectors and attachments into a horizontal scrolling row.
- fix(conversation-context-bar): hide selectors divider when no attachments are present.
- fix(conversation-manage-dialog): sort conversations by created_at and display creation time.
- fix(icons): regenerate multi-resolution Windows ICO for crisp desktop icon.
- chore(acp-registry): bump opencode to 1.14.21 and gemini-cli to 0.39.0.

-----------------------------
# 发布版本 0.10.1

- 新增(侧边栏):为每个文件夹添加颜色色块与颜色选择器,会话轨道采用中性色;
- 新增(会话上下文栏):将选择器与附件统一为横向滚动行;
- 修复(会话上下文栏):无附件时隐藏选择器分隔线;
- 修复(会话管理对话框):按 created_at 排序会话并显示创建时间;
- 修复(图标):重新生成多分辨率 Windows ICO 以获得清晰的桌面图标;
- 依赖(ACP 注册表):升级 opencode 至 1.14.21、gemini-cli 至 0.39.0。
2026-04-24 00:38:33 +08:00
xintaofei
e80c9e69a9 chore(acp-registry): bump opencode to 1.14.21 and gemini-cli to 0.39.0 2026-04-23 23:12:52 +08:00
xintaofei
1eeb5041a8 feat(sidebar): add per-folder color swatch with picker and neutral conversation rail
- Add `color` column to folder table with migration backfill and hash-based assignment on folder creation
- Expose `update_folder_color` via Tauri command and `/update_folder_color` HTTP route
- Render a color swatch before each folder name in the sidebar header; offer a 10-color palette (9 hues plus a theme-aware foreground sentinel) through the folder context menu
- Show the folder header "new conversation" button only on hover
- Drop the expanded-state tint on folder name and count badge; use a fixed neutral rail color for conversation items
2026-04-23 23:02:58 +08:00
xintaofei
1d3dd0dcd4 fix(icons): regenerate multi-resolution Windows ICO for crisp desktop icon 2026-04-23 21:04:11 +08:00
xintaofei
7e243412e1 # Release version 0.10.0
- feat(workspace): migrate from per-folder windows to a unified single-window workspace.
- feat(sidebar): overhaul sidebar with draggable folder reorder, per-folder new/import actions, conversation sort toggle, completed filter, and bulk-action management dialog.
- feat(acp-agent-settings): expand OpenCode provider.npm options with additional AI SDK providers.
- fix(transport): replace Tauri listen() to avoid unlisten race crashing on WKWebView.

-----------------------------
# 发布版本 0.10.0

- 新增(工作区):从每文件夹独立窗口迁移到统一的单窗口工作区;
- 新增(侧边栏):全面重构,支持拖拽排序文件夹组、按文件夹新建/导入会话、会话排序切换、已完成筛选,以及带批量操作的会话管理对话框;
- 新增(ACP 代理设置):扩展 OpenCode 的 provider.npm 选项,补全更多 AI SDK 提供商;
- 修复(传输层):替换 Tauri listen() 调用,避免 WKWebView 下 unlisten 竞态导致崩溃。
2026-04-23 16:05:46 +08:00
xintaofei
022172a9ea chore(lint): clean up frontend and Rust lint issues 2026-04-23 15:56:41 +08:00
xintaofei
50c5b12d53 refactor(branch-dropdown): drop worktree parent-branch merge shortcut
Remove the parent-branch button shown beside the branch selector along
with its supporting API, command, service, model, and i18n strings.
Add migration m20260423 to drop the now-unused folder.parent_branch
column.
2026-04-23 14:02:46 +08:00
xintaofei
f1ce7179ea feat(sidebar): reorder folder groups by drag and persist sort order 2026-04-23 00:42:58 +08:00
xintaofei
f0b3ec20a8 fix(folders): add open_folder Tauri command for path-based opens 2026-04-22 10:53:17 +08:00
xintaofei
14fb231dcc feat(sidebar): add conversation management dialog with filtering and bulk actions 2026-04-22 09:31:38 +08:00
xintaofei
f3bdf94723 feat(title-bar): add folder-actions menu and branch dropdown with git operations 2026-04-22 00:23:27 +08:00
xintaofei
08fb508736 refactor(branch-picker): fix popover corner radius, remove local branch delete, move new-branch to top 2026-04-21 23:14:57 +08:00
xintaofei
58b48e2bfe Merge branch 'main' into one-folder 2026-04-21 09:27:55 +08:00
xintaofei
a2333e6bb4 # Release version 0.9.5
- feat(message-input): add search box to slash-command popups.
- fix(file-tree): keep aux-panel tree in sync with filesystem changes.
- fix(file-tree): invalidate both cached target and ancestor, skip collapsed refetches.
- chore(acp): bump claude-agent-acp to 0.30.0 and opencode to 1.14.19.

-----------------------------
# 发布版本 0.9.5

- 新增(消息输入):在斜杠命令弹窗中增加搜索框,方便快速定位命令;
- 修复(文件树):辅助面板的文件树与文件系统变更保持同步;
- 修复(文件树):同时失效缓存目标及其祖先节点,跳过已折叠节点的重复拉取;
- 杂项(ACP):升级 claude-agent-acp 至 0.30.0、opencode 至 1.14.19。
2026-04-21 00:34:30 +08:00
xintaofei
baf3b6e89f fix(file-tree): keep aux-panel tree in sync with filesystem changes
Deep directories (beyond the workspace snapshot's depth limit) relied on
a lazy-loaded override cache that was never invalidated, so agent-created
files, in-app deletes / renames / rollbacks, and external changes inside
expanded deep folders stayed invisible until the folder was reopened.

Propagate watcher `changed_paths` through the delta envelope and fire a
Meta event whenever FS activity doesn't alter the tree/git snapshots, so
the frontend can surgically invalidate affected cache entries and
re-fetch. Manual refresh (Reload from disk) clears the cache and
re-hydrates still-expanded deep dirs through the same path. Replayed
deltas after reconnect are forwarded to the same listeners.

Also split the combined workspace-state effect into tree / git / status
slices so unrelated state transitions (e.g. the 'resyncing' flip during
a refresh) no longer rebuild the entire node tree and cause a flash.
2026-04-20 22:57:24 +08:00
xintaofei
c825291b1e chore(acp): bump claude-agent-acp to 0.30.0 and opencode to 1.14.19 2026-04-20 21:38:36 +08:00
xintaofei
d9323d7399 refactor(workspace): migrate from per-folder windows to single-window workspace
Replace the legacy folder + welcome routes with a unified /workspace route
that hosts all folders, conversations, tabs, and terminals in one window.

- Persist opened tabs to the database (opened_tabs entity + migration)
  so tab layout survives restarts and deep-link bootstrap restores state
- Replace FolderContext shim with AppWorkspaceProvider, ActiveFolderProvider,
  and TabProvider; expose both opened (folders) and full DB (allFolders)
  listings via list_all_folder_details
- Return conversations across all non-deleted folders from list_all when
  no folder filter is given, so the sidebar can show every folder's history
- Add ConversationContextBar above the chat input with folder picker
  (auto-opens unopened folders on select), branch picker, and commit /
  push / merge / stash entries to restore BranchDropdown functionality
- Rework sidebar with stats header, search, flat / folder-grouped view
  modes (localStorage-persisted), reveal-in-sidebar event subscriber,
  and per-folder context menu (focus, close tabs, remove from workspace);
  indent conversations under folder headers in grouped mode
- Gate terminal creation on active folder and show folder context
- Remove deprecated BranchDropdown, FolderNameDropdown, welcome route,
  and per-folder window commands
- Localize all new strings across 10 locales
2026-04-20 21:22:36 +08:00
xintaofei
10801bf393 # Release version 0.9.4
- feat(terminal): add word/line cursor shortcuts for shell line-editing.
- feat(appearance): apply UI zoom level to terminal and Monaco editors.
- fix(settings): move content padding inside scroll areas to keep inner borders visible.
- refactor(git-error): drop locale-specific not-a-repo patterns.
- fix(process): apply C.UTF-8 locale across platforms for child processes.

-----------------------------
# 发布版本 0.9.4

- 新增(终端):新增按词/按行光标移动的快捷键,优化 Shell 行编辑体验;
- 新增(外观):将界面缩放级别应用到终端和 Monaco 编辑器;
- 修复(设置):将内容内边距移入滚动区域内部,保证内部边框完整可见;
- 重构(Git 错误):移除特定语言区域的"非 Git 仓库"匹配模式;
- 修复(进程):在各平台子进程中统一使用 C.UTF-8 locale。
2026-04-19 09:32:26 +08:00
xintaofei
94ebfaabdc fix(process): apply C.UTF-8 locale across platforms for child processes
Previously LANG/LC_ALL were only set on Windows, so git stderr was
localized on macOS/Linux and substring checks for English messages
(e.g. 'unknown revision or path not in the working tree') silently
failed — empty-repo/missing-branch cases surfaced as red error
banners in the Git log panel instead of rendering as empty lists.
2026-04-19 06:49:24 +08:00
xintaofei
527dfc48d6 # Release version 0.9.3
- fix(git): restore non-repo fallback and refine repo preflight errors.
- perf(workspace-state): tighten watch debounce to 1s and max batch window to 3s.
- fix(git): surface non-git-repo as a typed error and align all panels via workspace state.
- fix(web-auth): url-decode token query param for websocket auth.
- fix(chat-channel): use session agent in responding indicator and localize command messages.

-----------------------------
# 发布版本 0.9.3

- 修复(Git):恢复非仓库目录的回退逻辑,并细化仓库预检错误提示;
- 性能(工作区状态):将监听去抖收紧至 1 秒,最大批处理窗口收紧至 3 秒;
- 修复(Git):将非 Git 仓库作为类型化错误上报,并让各面板统一通过工作区状态对齐;
- 修复(Web 认证):对 WebSocket 认证所用 token 查询参数进行 URL 解码;
- 修复(聊天频道):在响应中指示器里使用当前会话的 Agent,并对指令消息进行本地化。
2026-04-18 23:53:53 +08:00
xintaofei
95a0c527c4 fix(git): restore non-repo fallback and refine repo preflight errors
Reintroduce a local not-a-git-repo fallback state in the git log panel so non-repo errors still render the dedicated empty state when workspace state streaming is degraded.

Improve git repository preflight classification by distinguishing missing paths, permission issues, and non-directory targets before checking .git presence.

Add not_a_git_repository to the frontend AppErrorCode union for explicit typed handling.
2026-04-18 23:49:42 +08:00
xintaofei
b17328b0fc perf(workspace-state): tighten watch debounce to 1s and max batch window to 3s 2026-04-18 23:15:05 +08:00
xintaofei
cc79d62b27 fix(git): surface non-git-repo as a typed error and align all panels via workspace state
Consolidate `.git` presence detection into a shared `git_repo` module used by both the workspace state watcher and the command preflight helper, replacing duplicated local definitions.

Introduce `AppErrorCode::NotAGitRepository` (HTTP 422) and preflight eleven frontend-callable git commands (log, status, list-branches, diff, diff-with-branch, show-diff, show-file, push-info, list-remotes, list-all-branches, commit-branches) so non-git folders short-circuit with a structured error instead of leaking locale-dependent git stderr.

Frontend `isNotAGitRepoError` checks the error code first and falls back to a multi-language regex list centralized in `src/i18n/git-error-patterns.ts`, covering the nine languages git actually translates into.

Wire the git log panel to `workspaceState.isGitRepo` rather than a local cached flag, so running `git init` or deleting `.git` externally propagates through the watcher and refreshes the panel automatically.
2026-04-18 23:07:13 +08:00
xintaofei
cf9573c0ce fix(web-auth): url-decode token query param for websocket auth 2026-04-18 20:18:58 +08:00
xintaofei
ff9fbad50a fix(chat-channel): use session agent in responding indicator and localize command messages
- Replace hardcoded "Claude Code" in agent_responding with each session's actual AgentType label; store agent_type on ActiveSession and populate it in both task-start and resume paths
- Remove silent ClaudeCode fallback in resolve_agent_type; /task now prompts the user to pick an agent when none is selected and the folder has no default
- Move session command strings out of session_commands.rs into i18n.rs with full 10-language coverage (en/zh-CN/zh-TW/ja/ko/es/de/fr/pt/ar)
- Fix French accent and wrap Latin agent name with Arabic bidi isolates (FSI/PDI) for consistent rendering across Telegram/Lark/WeiXin clients
- Release the bridge lock before the get_lang DB lookup in the content_delta flush path to avoid cross-session contention
- Log unknown agent_type fallback in conversation_service::parse_agent_type for observability
2026-04-18 20:05:56 +08:00
xintaofei
dcaa4b4f5a # Release version 0.9.2
- feat(settings): render update release notes as markdown.
- refactor(message): shrink agent card max height and localize running indicator with spinner.
- fix(settings): use randomUUID helper with getRandomValues fallback for non-secure contexts.
- fix(workspace-state): keep git-presence flag and branch poll in sync with runtime state.
- fix(workspace-state): stop resync loop on non-git folders and allow retry for degraded watcher.

-----------------------------
# 发布版本 0.9.2

- 功能(设置):更新提示中的发布说明以 Markdown 格式渲染;
- 重构(消息):缩小 Agent 卡片最大高度,并本地化运行中指示器,配合 spinner 展示;
- 修复(设置):使用 randomUUID 助手函数,在非安全上下文中回退到 getRandomValues;
- 修复(工作区状态):保持 git 存在标识与分支轮询结果同步于运行时状态;
- 修复(工作区状态):在非 git 文件夹停止重复同步循环,并允许降级的 watcher 重试。
2026-04-18 18:55:26 +08:00
xintaofei
ff48810603 fix(workspace-state): keep git-presence flag and branch poll in sync with runtime state
Reconcile the cached is_git_repo flag against the filesystem on every watch flush so `git init` or deletion of .git is reflected immediately: sync the stored flag, drop stale git_snapshot data when the repo goes away, emit a meta delta when presence flips without any data change, and mark the event as requires_resync so the frontend re-fetches the snapshot to pick up the new flag.

Replace the title-bar branch polling interval with a self-adjusting setTimeout chain that backs off to 60s when get_git_branch returns null or throws and drops back to 10s once a branch is detected, so branches created externally recover within one slow tick without hammering the backend on non-git folders.
2026-04-18 17:44:45 +08:00
xintaofei
7ef8d84d44 fix(workspace-state): stop resync loop on non-git folders and allow retry for degraded watcher
Gate git refresh on .git presence so file churn in non-git workspaces no longer produces endless resync_hint events, and silently log tree/git refresh errors during watch flushing instead of flagging requires_resync, which turned transient failures into self-reinforcing loops.

Degrade gracefully when the filesystem watcher fails to attach (e.g. permission denied, inotify quota): keep the initial snapshot, surface a degraded flag, and expose a store-level restart that the banner uses to retry attachment after the root cause is fixed.

Propagate is_git_repo through the snapshot so the git log and changes tabs render a dedicated "Not a Git repository" empty state instead of raw git stderr with a useless retry button.

Stop polling get_git_branch from the title bar once it returns null and re-arm on visibility change.

Add translations for the new banner, empty-state, and retry keys across all ten locales.
2026-04-18 17:18:11 +08:00
xintaofei
c5c2bdd331 # Release version 0.9.1
- feat(web-service): allow custom access token with persisted port and localized start errors.
- feat(conversation): add copy text context menu action with preserved selection.
- feat(status-bar): compact large token counts with K/M units in usage popover.
- feat(chat-channel): annotate Weixin channel badge with iLink reconnect hint tooltip.
- fix(chat-channel): detect Weixin auth failure via errcode during connect verification.
- chore(acp): bump claude-agent-acp to 0.29.2, opencode to 1.4.11, gemini-cli to 0.38.2, openclaw to 2026.4.15 and cline to 2.15.0.

-----------------------------
# 发布版本 0.9.1

- 功能(Web 服务):支持自定义访问令牌,持久化端口配置并本地化启动错误提示;
- 功能(会话):新增复制文本右键菜单操作,复制时保留原有文本选区;
- 功能(状态栏):在用量弹窗中使用 K/M 单位紧凑显示较大的 token 数值;
- 功能(聊天频道):为微信频道徽标添加 iLink 重连提示 tooltip;
- 修复(聊天频道):通过 errcode 识别连接校验阶段的微信鉴权失败;
- 杂项(ACP):升级 claude-agent-acp 到 0.29.2,升级 opencode 到 1.4.11,升级 gemini-cli 到 0.38.2,升级 openclaw 到 2026.4.15,升级 cline 到 2.15.0。
2026-04-18 12:03:07 +08:00