Commit Graph
237 Commits
Author SHA1 Message Date
chengyongruandXubin Ren 47d498bab0 fix(webui): disarm queued prompt for voice shortcut 2026-07-11 01:02:14 +08:00
chengyongruandXubin Ren 04328f8129 feat(webui): guide queued prompt with second Enter 2026-07-11 01:02:14 +08:00
chengyongruandXubin Ren 137fbf875e fix(webui): keep syntax highlighting chunks acyclic 2026-07-11 00:57:37 +08:00
chengyongruandXubin Ren 1ee4349a08 feat(webui): highlight file previews and diffs 2026-07-11 00:57:37 +08:00
sidandXubin Ren d32f8961b1 fix(webui): bind landing first message to created chat 2026-07-10 20:19:10 +08:00
chengyongruandXubin Ren 6851a6ebd4 fix(webui): sync file edit display preference 2026-07-09 10:42:43 +08:00
chengyongruandXubin Ren 7768672c5b feat: add file edit diff progress view
Capture file edit snapshots through runner tool lifecycle hooks and render unified diffs in the WebUI with folding and truncation controls.
2026-07-09 10:42:43 +08:00
chengyongruandXubin Ren 4ddd639e67 fix(webui): route missing API bootstrap tokens to auth
maintainer edit: handle review feedback by treating bootstrap responses without api_token as auth-required, and remove the obsolete issue_token(api_token=...) compatibility path now that API tokens are issued separately.
2026-07-08 21:01:48 +08:00
chengyongruandXubin Ren 88143a8bf0 fix(webui): gate bootstrap API token issuance 2026-07-08 21:01:48 +08:00
chengyongruandXubin Ren ea7f4679f1 fix(webui): keep prompt rail at original gutter offset 2026-07-08 12:16:47 +08:00
chengyongruandXubin Ren c188e96f4e refactor(webui): use container query for prompt rail layout 2026-07-08 12:16:47 +08:00
chengyongruandXubin Ren 815f15993c test(webui): dedupe prompt rail viewport setup 2026-07-08 12:16:47 +08:00
chengyongruandXubin Ren 4333d6f103 fix(webui): keep prompt rail out of narrow chat columns 2026-07-08 12:16:47 +08:00
chengyongruandXubin Ren a7b8a9ed46 fix(webui): clarify new chat command text 2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren 7e135b45f3 docs(webui): document slash command lifecycles 2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren fa73448f6f fix(webui): drive slash command routing from metadata 2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren 8a231b6e4d fix(webui): finalize turn-ending slash commands
maintainer edit: keep /new and manually submitted /stop from leaving stale WebUI streaming state after they cancel or reset the active turn.
2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren ef5318ebdc fix(webui): classify builtin slash commands without metadata
maintainer edit: keep builtin shortcut commands on the side-channel path before async command metadata loads, while preserving /goal task text as a normal agent turn.
2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren 8f68040f05 fix(webui): keep slash commands out of streaming state 2026-07-07 15:42:04 +08:00
chengyongruandXubin Ren 0f88927364 fix(webui): show generic tool arguments in activity 2026-07-07 15:41:45 +08:00
chengyongruandXubin Ren 3f33ff3143 chore: remove unused dead code 2026-07-07 15:41:27 +08:00
70505bd1fc fix(webui): finish mobile containment for inline code, tables, chips, user bubbles
57f9ec0 added a CSS containment safety net for .markdown-content, but
several rendering paths still overflowed or truncated on narrow viewports
because they bypass those rules or actively disable wrapping:

- Inline code longer than 120 chars renders as `block whitespace-pre`
  with no scroll container, so it bled past the viewport (white-space:pre
  defeats overflow-wrap). It now scrolls inside its own box via
  max-w-full overflow-x-auto.
- Wide markdown tables never actually scrolled: Tailwind Typography forces
  width:100% + table-layout:auto on .prose table, so they shrank to fit
  instead of overflowing. Switched to a wrapper-<div> pattern (a custom
  `table` component, the approach used by DeepSeek/others) with min-w-max
  so wide tables keep natural column widths and scroll inside the
  conversation column; the old display:block rule on .markdown-content
  table is removed.
- File-reference chips and inline link-preview cards used `truncate`, so
  long filenames/labels were ellipsized to one line. Now
  [overflow-wrap:anywhere] sm:truncate — wrap on mobile, truncate on
  desktop.
- User-authored message bubbles don't pass through .markdown-content, so
  a long URL in the user's own message still burst the screen: under flex
  min-width:auto, break-words cannot reduce the item's min-content width.
  Added max-w-full min-w-0 + [overflow-wrap:anywhere].

No JS/agent/provider behavior touched. Desktop layout is unchanged — the
new rules only engage when content would otherwise overflow.

Verified: bun run lint (clean), bun run test (438 passed), bun run build.

Refs #4693

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 12:11:43 +08:00
162b6ee5bd fix(webui): keep chat viewport and composer inside narrow viewports
On mobile-width browsers the conversation column and bottom composer could
be forced wider than 100vw: long markdown (URLs, branch names, file paths),
fenced code, and tables stretched the prose container, and the thread scroll
area let the overflow bleed horizontally (#4693).

Add a pure-CSS containment safety net in globals.css:
- .markdown-content gets min-width:0, max-width:100%, overflow-wrap:anywhere
  so long tokens wrap instead of stretching the column.
- long links and inline code break rather than overflow.
- fenced/pre blocks and markdown tables scroll inside their own box.
- the thread scroll column clips residual horizontal bleed (overflow-x:hidden)
  while vertical scroll and internal code-block scroll are unaffected.

No component, JS, or agent-loop behavior touched; desktop layout unchanged.

Fixes #4693

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-06 12:11:43 +08:00
5283ceae85 Add optional Nanobot plugin controls (#4396)
* feat: add optional nanobot features

* test: update azure install hint expectation

* fix: validate optional feature extras

maintainer edit: verify requested dependency extras before treating optional features as installed, propagate restart state from feature enablement, and align docs with the new plugins enable command.

* fix: bound optional feature installs

maintainer edit: make optional feature installs time out as a normal install failure instead of leaving the WebUI or CLI action waiting indefinitely.

* feat: slim optional channel dependencies

* fix: log optional install commands

* fix(webui): gate remote feature installs

* docs: clarify webhook plugin example

* fix(webui): harden optional feature installs

* fix: install optional deps without package fallback

* fix(cli): refine plugin feature controls

* fix(webui): count enabled nanobot features

* fix(webui): allow slow feature install routes

* fix(webui): allow disabling websocket channel

* fix(plugins): simplify optional feature controls

* fix(webui): polish apps catalog states

* fix(webui): confirm nanobot support installs

* fix(webui): polish nanobot install dialog

* fix(webui): suppress empty websocket handshakes

* fix(webui): clarify apps plugin summary

* fix(webui): localize workspace access copy

* fix(plugins): polish optional feature controls (#4691)

---------

Co-authored-by: Xubin Ren <52506698+Re-bin@users.noreply.github.com>
2026-07-03 18:17:52 +08:00
chengyongruandXubin Ren f38fd7d5d3 feat(memory): add workspace Dream prompt override 2026-07-03 00:41:51 +08:00
chengyongruandXubin Ren 09bde468eb fix(webui): narrow local trigger source label
maintainer edit: avoid optional source access after extracting automation source kind for TypeScript build.
2026-07-02 13:32:46 +08:00
chengyongruandXubin Ren 2ebf5c4972 refactor(trigger): name CLI trigger source as local
maintainer edit: cron is also a trigger source, so keep the new CLI-delivered source explicitly named as local trigger across backend, WebUI, docs, and tests.
2026-07-02 13:32:46 +08:00
chengyongruandXubin Ren 2a0cd19a74 feat(trigger): add session-bound local triggers 2026-07-02 13:32:46 +08:00
2ec4044217 feat(webui): add dollar skill shortcuts
Add a WebUI-only $<skill> completion shortcut without changing slash command behavior.

Keep slash autocomplete command-only and allow dollar skill shortcuts anywhere in the composer.

Co-authored-by: Alan Chen <zc2610@nyu.edu>
2026-07-01 19:51:01 +08:00
Xubin RenandGitHub 8df100203c feat(webui): refine prompt rail minimap 2026-06-30 10:01:53 +08:00
axelray-devandXubin Ren 194e9d5f5f fix(webui): clear stale run status on reconnect 2026-06-28 19:46:47 +08:00
chengyongruandXubin Ren 64901be67f test: harden webui and gateway checks 2026-06-27 11:04:11 +08:00
Xubin Ren 4636c78100 test(webui): cover xiaomi mimo wav recording path 2026-06-25 22:52:55 +08:00
zpljd258andXubin Ren 28c8c89a42 fix(webui): convert WebM to WAV for Xiaomi MiMo ASR transcription
MiMo ASR (mimo-v2.5-asr) only accepts audio/wav, audio/mp3, and
audio/mpeg formats. Web browsers record in WebM/Opus by default,
causing the API to reject the payload with a transcription error.

This change adds a frontend WebM→WAV converter using the Web Audio API
(DecodeAudioData + PCM encoding) that activates only when the
configured transcription provider is 'xiaomi_mimo'. Other providers
are unaffected — they continue to receive the original browser format.

Tested and confirmed working on WebUI.
2026-06-25 22:52:55 +08:00
chengyongruandXubin Ren 123384975e fix(webui): restore code block copy fallback 2026-06-25 16:10:23 +08:00
chengyongruandXubin Ren 943191f0c0 fix(webui): keep multi-file apply_patch edits 2026-06-24 20:04:39 +08:00
chengyongruandXubin Ren b14f82f408 fix(webui): prevent iOS Safari composer zoom 2026-06-24 10:26:14 +08:00
Xubin Ren 951fd73c8e fix(webui): keep new chat heading on one line 2026-06-22 23:30:29 +08:00
Xubin Ren f80a78d5a8 fix(webui): preserve fork replies during history refresh 2026-06-22 22:00:07 +08:00
Xubin Ren a9d1fdcee8 fix(webui): follow active turn output after send 2026-06-22 21:12:34 +08:00
Xubin Ren 83c29292d3 chore(release): prepare v0.2.2 2026-06-22 20:53:28 +08:00
Xubin Ren 7170761e47 fix(webui): anchor sent prompts during active turns 2026-06-22 20:43:27 +08:00
chengyongruandXubin Ren 0db9fbe250 chore: default context window to 200k 2026-06-22 18:33:49 +08:00
chengyongruandXubin Ren dd2cb4ca91 fix: refresh optional CLI Apps catalogs
maintainer edit: CLI Apps settings now treats optional catalog caches as refresh candidates without blocking the initial payload, and pending polling stops when refresh is throttled instead of running indefinitely.
2026-06-22 17:14:13 +08:00
chengyongruandXubin Ren 2216405821 fix: avoid stuck Apps loading during catalog refresh
maintainer edit: Empty cache-only CLI Apps payloads should still update the UI while the background catalog refresh is pending, otherwise cold catalog failures leave Settings stuck on the spinner.
2026-06-22 17:14:13 +08:00
chengyongruandXubin Ren b8abe5542c Avoid blocking settings on CLI Apps catalog refresh 2026-06-22 17:14:13 +08:00
chengyongruandXubin Ren 9713fe2a3b fix: avoid initial webui password error 2026-06-22 13:04:05 +08:00
Xubin Ren d30f3d466d fix(webui): allow optional Keenable search key 2026-06-21 15:22:13 +08:00
fa3e902ee8 feat(web): register Keenable provider in WebUI, docs, and tests
Bring the Keenable search provider in line with the established
multi-file provider pattern so it surfaces everywhere the others do:

- settings_api.py: register in the web-search provider options so it
  appears in the WebUI settings dropdown (credential: api_key, optional).
- WebUI provider-brand: add keenable brand entry + brand test.
- docs/configuration.md: provider table row + config example.
- Harden _search_keenable: honor config.timeout and return explicit
  messages on HTTP status errors (429 / other), matching peer providers.
- Add env-key and HTTP-error tests; add the websocket settings whitelist
  assertion.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 00:08:52 +08:00
d5f5eb43e5 feat(providers): first-class Mistral support
Mistral's API constrains reasoning_effort to "high"/"none", rejects the
kwarg entirely for Magistral (reasoning is implicit), returns assistant
content as a mixed array of {type:"thinking",...}/{type:"text",...}
blocks, and 400s on the reasoning_content key in history.

- Remap user-supplied reasoning_effort (low/medium/minimal) onto Mistral's
  two-tier vocabulary; strip the kwarg for Magistral models
- Lift thinking blocks into reasoning_content for both batch and streaming
  responses; pass only text through on_content_delta callbacks
- Drop reasoning_content from outbound history when the spec asks for it
- Expose per-preset reasoning_effort_values so the UI can render the
  provider-specific option set

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 00:08:47 +08:00