| feat(webui): Provider 排序/编辑按钮右对齐/自定义下拉 + /指令和@文件补全
- Provider 列表:默认排第一,其余按名称排序
- 编辑/删除按钮右对齐
- 自定义 Select 组件替换原生 select 下拉
- / 斜杠技能补全(懒加载、大小写不敏感过滤、键盘导航)
- @ 文件/目录补全(调用 /fs/list、目录切换后刷新)
- 新增 Select.tsx 组件
- 技能列表统一按名称排序
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
| 3 天前 |
| fix(webui): format tool-call names/args like the TUI (mcp · server · tool)
The webui showed raw mcp__open-meteo__geocoding {"count":3,…} (plus a CSS
capitalize that mangled it to Mcp__open-Meteo__…), while the TUI shows
mcp · open-meteo · geocoding(count: "3", …). Port the TUI helpers so both
match:
- displayToolName mirrors display_tool_name: mcp__server__tool →
mcp · server · tool; other names snake_case → PascalCase. Drop the
.tool-name text-transform: capitalize (the helper now cases correctly).
- formatToolDetail mirrors format_tool_detail: MCP args as
key: "value", …; builtin tools show their salient arg (bash command,
grep pattern, read basename, …); common-key fallback. Full raw args stay
available by expanding the row.
tsc + vite build pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 21 小时前 |
| feat(webui): Provider 列表支持编辑已有配置
模型配置弹窗每个 Provider 条目在「删除」左侧新增「编辑」按钮,点击在弹窗中
修改 type/model/base_url/api_key,走后端已有的 PATCH /providers/:name:
- name 为主键,编辑态只读不可改;
- API Key 留空表示保留现有,仅填写时才覆盖;
- 「设为默认」勾选后对非默认项单独调用 POST /providers/:name/default
(PATCH 不处理默认项)。
原「添加模型」弹窗泛化为 ProviderFormDialog,添加/编辑共用一套表单。
新增 api: updateProvider / setDefaultProvider;i18n 中英补齐 edit 相关文案。
附带落入此前工作区里已就绪、与本改动同文件交织的删除确认弹窗
(ConfirmDialog,替代系统 confirm/alert)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 4 天前 |
| feat(webui): 目录选择器支持新建文件夹(POST /fs/mkdir)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 5 天前 |
| feat(webui): 输入框附件菜单 + 文件选择器(AttachMenu/FilePicker)及相关改动
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 5 天前 |
| fix(webui): 用户头像用 avatar_url 显示(回退首字母)+ 设置按钮移到底栏最右;会话 URL 持久化
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 5 天前 |
| fix(webui): assistant 消息渲染 Markdown(marked + DOMPurify 净化)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 7 天前 |
| feat(webui): reasoning-effort selector (high/max) for DeepSeek V4
Add an effort selector beside the model picker in the input footer, shown
only for models that accept DeepSeek's reasoning_effort (the deepseek-v4
family). Options: default / high / max.
Backend:
- /models ModelInfo gains effort_applicable + reasoning_effort so the
webui can gate the selector and reflect the active value.
- New POST /live/reasoning_effort persists the chosen effort to the
target provider's config.reasoning_effort. build_turn_parts re-reads
config and rebuilds the provider each turn, so it applies on the next
turn for both /live and /chat — no new global, no message-body change.
Frontend:
- ModelSelector renders an independent effort dropdown next to the
(unchanged) model dropdown; calls /live/reasoning_effort on change,
reflects current.reasoning_effort, and hides for non-V4 models.
- api.ts: ModelInfo fields + postLiveReasoningEffort().
- i18n.ts: effort.{label,default,high,max} in zh + en.
- app.css: effort-selector / effort-prefix styles.
webui/dist is gitignored; shipping requires npm run build + a daemon
rebuild (rust-embed embeds dist at compile time). cargo check + tsc
--noEmit + vite build all pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 23 小时前 |
| feat(webui): add 'always allow this tool' button for MCP permission prompts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
| 1 天前 |
| feat(webui): 编辑/新建模型支持选择上下文窗口(AtomGit 锁定)
在模型表单新增「上下文窗口」下拉,预设 32K/64K/128K/256K/512K/1M;
AtomGit 托管 provider 的上下文由平台固定,下拉禁用并提示不可修改、
不下发该字段。旧配置若为非预设值,并入选项首位避免静默改写。
后端 POST/PATCH 已支持 context_window,本次为纯前端接入。
- SettingsDialogs: 新增 contextWindow 选择 + isAtomGit 锁定逻辑
- Select: 新增 disabled 支持
- api: CreateProviderBody/UpdateProviderBody 增加 context_window
- i18n: 新增 settings.contextWindowLocked(zh + en)
- dist: 重建 index.html 指向新 bundle
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 3 天前 |
| fix(webui): 全量修复输入法组字回车误触发(CwdPicker 跳转 / 重命名保存加 isComposing 守卫)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 5 天前 |
| fix(webui): hand the one-time token to an HttpOnly cookie instead of leaving it in the URL
The webui token was passed as /?token=<uuid> and read by the SPA from
location.search, so it lingered in the address bar / history where a
malicious browser extension could read it (CWE-598 / CWE-522), then drive
the local daemon API (read history, send prompts, burn model tokens).
Adopt the BFF-style cookie handoff for the local daemon:
- serve_webui_index (the / route): on a valid ?token=, set an
HttpOnly; SameSite=Strict cookie and 302 to a token-less URL (preserving
session/sync). The SPA then loads cookie-only and same-origin fetch/SSE
carry the cookie automatically — no token in the URL.
- require_webui_token accepts the token from the atomcode_webui cookie
OR the Authorization header (back-compat).
- get_tunnel_status reads the token from cookie-or-header too, so the
server-built remote share URL keeps working post-handoff.
- Front-end: drop the now-unreadable getToken() from the loopback share
fallback (functional remote links come from server remote_url).
Secure flag omitted (webui is plain HTTP on localhost/LAN); HttpOnly +
SameSite=Strict carry the protection. Note: the /webui TUI output and
the remote-access panel still show a token-bearing URL by necessity
(authorized terminal / remote-device bootstrap) — out of scope for the
location.search vector this closes.
Tests: cookie parsing + query-string helpers; existing daemon suite green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 1 天前 |
| fix(webui): 移动端设置菜单被抽屉裁剪
移动端侧边栏为 transform 抽屉(.session-list),其 transform 使其成为
fixed 后代的包含块,叠加 overflow:hidden 会裁剪菜单。将设置菜单、会话
kebab 菜单及重命名/删除弹窗通过 createPortal 挂到 document.body,使其相
对视口定位、不再被抽屉裁剪;桌面端无 transform 祖先,定位不变。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
| 3 天前 |