Skip to content

chore: merge upstream/main (e2b4cb11) - #15

Merged
youxuanxue merged 279 commits into
mainfrom
merge/upstream-2026-11-03
Nov 3, 2026
Merged

youxuanxue merged 279 commits into
mainfrom
merge/upstream-2026-11-03

Conversation

@youxuanxue

Copy link
Copy Markdown
Owner

摘要

  • 将 upstream/main@e2b4cb11ab1ca05d1f138e4ff67556cb03abd675 合入 youxuanxue/codeg,保留上游历史。
  • 上游新增 278 个提交;共同祖先 bed8931,fork 独有 19 个提交。

风险

  • 常规到高:一次带入上游 278 个提交,产品面随之更新。文本冲突 4 个文件,已在合并提交里裁决。
  • src-tauri/Cargo.toml 保留 fork 的 dev debuginfo 配置。
  • commands/conversations.rs 同时保留磁盘会话清理和上游的自定义 agent 扫描测试。
  • commands/acp.rs 与设置页保留 cc-switch Claude 目录和 fork 的模型占位文案,并接上上游的模型列表 state 与系统提示测试。Codex 的 requires_openai_auth 默认值已由上游收到 acp/codex_catalog_commit,旧 cascade 测试不再重复。
  • 双方都改过、由 Git 自动合并的文件还有 acp/connection.rs、acp/mod.rs、acp/session_state.rs、import_service.rs、parsers/codex.rs、web/handlers/acp.rs、work_task/engine.rs、work_task/git.rs。
  • 合入主线时必须用 Create a merge commit,不能 squash 或 rebase。

验证

  • cargo check --features test-utils --all-targets 通过。为让 Tauri build script 找到 frontendDist,本地放了未提交的 out/index.html 占位,不是前端生产构建。
  • codeg_lib 单元测试:6539 passed,0 failed,5 ignored。
  • 未跑 pnpm lint / pnpm test / 前端 e2e。

提交

e795ecc Merge upstream/main into merge/upstream-2026-11-03
e2b4cb1 Merge remote-tracking branch 'origin/main'
25c897e Merge pull request spacering-net#1066 from abigmiu/feat/cnb-forge
96a7a0e Merge pull request spacering-net#1060 from ana52070/feat/acp-system-prompts
8067c63 feat(tasks): lead awaiting-input tasks with Respond instead of Cancel
29c54f9 feat(chat-channel): top-level-only event pushes and session context in webhooks (spacering-net#1084)
70ee1db fix(pi): find sessions by filename uuid when the header id differs (spacering-net#1068)
0bb06c1 fix(acp): save system instructions to the file the editor showed
c5567d5 fix(acp): point system instructions at the files agents actually load
6ff9e53 feat(acp): adapt to claude-agent-acp 0.100.0
c6b1e61 fix(forge): sign in to CNB's git server as cnb, ask for a pushable token
109bfef fix(forge): give CNB issue tasks their description
c717cc5 # Release version 0.41.4
6cccdc0 Merge remote-tracking branch 'origin/main'
4015649 Merge pull request spacering-net#1085 from lesscodex/fix/remote-desktop-webview-events
0903bdd Merge pull request spacering-net#1081 from xy3xy3/fix/guarded-inline-dollar-math
6b14e28 feat(acp): bump OpenCode, CodeBuddy, Kimi Code, Antigravity and ZCode
77d3878 docs(remote): explain why the WS listener must be webview-scoped
ba07dfd fix(markdown): keep a closer that starts a shell expansion literal
1a8674c fix(markdown): gate the inline-math parse and keep two literal cases intact
a711888 feat(chat): draw resumed delegations as timeline delegation rows
2c70c33 style(chat): lay out explore group members like command rows
b15a58f fix(remote): scope desktop event listener to webview
7d5096c fix(markdown): render guarded single-dollar inline math
6e7e3c3 Merge pull request spacering-net#1074 from leehom0123/fix/date-picker-tests-fixed-today
5b6bcbc docs: refresh WeChat group QR codes for light and dark themes
c2db1d2 test(calendar): clarify pinned-date fixture rationale
5708b32 style(chat): improve non-text activity step readability
573e36c test(tasks): pin today so the pickers' cells stay in the window
026e750 feat(forge): support CNB (cnb.cool) as a forge provider
63988dc ci: retry checks after macOS runner capacity failure
ddd1f09 # Release version 0.41.3
09777a1 feat(acp): adapt to claude-agent-acp 0.99.1
54f07a1 feat(codex): adapt to codex-acp 2.5.0
f2e5b2f test(upload): expect stored attachment paths without the Windows verbatim prefix
febefc0 feat(acp): bump Antigravity, ZCode, Command Code and Qoder; hold CodeBuddy
37f0eda fix(i18n): complete system instruction translations for all locales
0822b3e feat(acp): support configuring global system instructions for all agents
47aeb14 feat(codex): adapt to codex-acp 2.4.0
24a18cf feat(background): raise the workspace background pixel cap to 100 Mpx
a8887bb feat(background): raise the workspace background image cap to 64 MiB
af23b44 feat(acp): pin claude-agent-acp 0.99.0 and attach pasted files by path
f681d97 chore(gallery): stream a reply that opens on words
66e95ac fix(chat): grow the rail down to a new reply's first rows
9c2c1aa feat(chat): put a reply's first words on the rail above its turning ring
b8a59a0 # Release version 0.41.2
9fe2519 fix(chat): keep the activity capsule's words out of text selection
7fe6221 feat(chat): run the rail from the header to a reply's first turning ring
5736186 feat(acp): bump four agent pins, fix Kimi plan mode and CodeBuddy Stop
8e8afcd chore(gallery): add a command group the reply has gone on past
bb54d7b fix(chat): end a group's turning once the reply moves past it
25fb0dc feat(chat): ease the turns a streaming reply takes
e18c849 fix(chat): keep a streaming reply's rows and spacing as it settles
faa5b82 chore(gallery): add the background-task strip over a reply
52b57bc feat(chat): cap the background-task strip and let it fold to one line
bca283e fix(chat): draw a live reply's newest prose on its rail, above the turning ring
eba6bb3 style(chat): fill the activity capsule like the user's bubble again
b56c6a9 test: wait for async loads before using what they fill in
6657687 docs(build): correct why the build leaves test files out
8a7565e # Release version 0.41.1
1034b6f ci(release): give macOS frontend builds a 4 GB Node heap
2ca8035 build: type-check the release build without test files
81929e0 # Release version 0.41.0
269c734 test(opencode): keep the unix-only fixture's PathBuf import off Windows
7770b90 feat(acp): pin claude-agent-acp 0.98.0 and draw Claude Code's monitors
0b526a8 chore(experts): sync Superpowers v7.0.1 and support standalone skills
567bf4f feat(opencode): adapt to OpenCode 2.2.0 and drop 1.x
5424b53 feat(acp): bump eight agent pins and adapt to what they change
f775cc3 feat(settings): gather Codex's model list into one section
47e7c58 feat(settings): list a provider's models from the model field itself
2129c10 style(chat): fill the activity capsule with the steps' grey and set step labels in it
c1addb2 fix(tabs): mark a repo's root row, not the container above it, as the folder on screen
00d5fea Merge remote-tracking branch 'origin/main'
fa13205 Merge pull request spacering-net#1039 from fengpanhe/workbench
ae59466 Merge pull request spacering-net#1043 from ana52070/fix/antigravity-native-ask-question
08fbdda Merge pull request spacering-net#1048 from Adam-Dalloul/fix/explicit-acp-turn-usage
8670ef5 fix(filters): include custom agents in usage and conversation lists (spacering-net#1029)
0a82f61 feat(acp): adapt to codex-acp 2.3.0
b674c42 fix(chat): count a context-menu paste from its first clipboard read
dc17bef fix(chat): count a file still being read or uploaded as draft content
ed9e941 fix(tabs): never tidy away a draft with unsaved content, or a folder's split before its tabs load
75c862a fix(tabs): give a folder with nothing open a screen and a selected mark
37352c0 fix(tabs): keep one draft per group when a draft moves between folders
b8de5b4 fix(tabs): give each folder its own split layout while tabs follow the folder
d6cb45b fix(import): skip a Claude session a custom agent already counts
dd8eecf fix(tabs): follow a tabs-follow-folder switch made in another window
da5ed7b fix(workspace): let the React Compiler lint check the workspace provider again
9f446ce refactor(tabs): call the mode "tabs follow folder" and switch it from View options
408f946 Merge branch 'main' into task/439
fa9b293 fix(workbench): register committed buffers and keep the file when leaving Workbench
e1b6531 fix(workbench): move the picker's own draft into chat mode
040b5dc fix(workbench): close and restore file tabs without store writes in state updaters
c831528 fix(workbench): leave the normal-mode folder header unchanged
6c4e71b fix(workbench): keep conversation tabs and the active folder consistent across worktrees
b2841d3 fix(usage): name a recorded turn by the one model its response reports
a4efe84 fix(usage): keep a turn's usage when a relayed message closes its reply
2d934da docs(usage): list fact schema 9 with the earlier versions
c0ba35d test(usage): recognize the official adapter from a saved manual definition
acaa060 fix(release): sign the macOS server with the Developer ID so updates keep its permissions
054b7a3 fix(acp): stop pointing Windows agents' TMP at a per-launch directory
db1bb91 docs: drop the AGENTS.md section unrelated to spacering-net#1024
735c470 fix(chat): map only the bare ask_question name to the question card
413eb6a fix(parsers): read Antigravity's skipped, multi-select and written-in answers
c8ba198 fix(acp): keep Antigravity's closing frame off the answered question card
d07f215 Merge pull request spacering-net#1028 from xy3xy3/feat/minimax-code-acp
207b290 Merge branch 'main' into feat/minimax-code-acp
9c53c17 Merge pull request spacering-net#1041 from ana52070/feat/html-codeblock-preview-657
669c8b0 Merge pull request spacering-net#1033 from lesscodex/fix/agent-reorder-scroll-jump
2565d6f Merge pull request spacering-net#1021 from jackie-cqz/fix/zcode-skills
009250a fix(usage): record only verified per-prompt adapter counters
d3bf532 fix(acp): remember MiniMax card matches for the turn
7e45109 fix(acp): skip calls already asked about when matching a MiniMax card
6e86c1e fix(acp): refuse binding a model provider to MiniMax Code
4fa562d docs: give MiniMax Code its icon in the README agent list
a7f1fd7 docs: record what was verified against MiniMax Code 0.7.0
10841f7 test(acp): pin CODEG_HOME in the MiniMax MCP overlay path test
6a2a3f3 fix(acp): treat the registry's minimax-code entry as the built-in
f946543 fix(acp): point MiniMax Code permission cards at the call they gate
827b38a fix(chat): keep streamed chat HTML output equal to processing it whole
8fc3376 fix(chat): keep the cache entries of previews on screen
73d1af6 fix(chat): make chat HTML rendering safe to turn on
bac5fb9 refactor(chat): keep the shared frame helpers' comments with them
aaf3b3d fix(chat): strip SVG link targets from chat HTML previews
92dc28b fix(settings): reveal the selected agent again after the list reloads
67f3e6d test(acp): let the cross-process numbering case wait out the other's run
7cc5186 Merge main into feat/minimax-code-acp and preserve environment-aware history
042a653 docs(zcode): say which duplicate project skill is listed, not that ZCode uses it
ff5d51e Merge pull request spacering-net#1022 from MaxFreedomPollard/fix/numstat-unquoted-paths
d40305b Merge pull request spacering-net#1020 from Liang-HZ/feat/opencode-codemode-delegation
4d0c30b Merge pull request spacering-net#1019 from fengpanhe/fix_traecli_tokens
b79385f fix(zcode): list parent-folder project skills and read the home Node uses
2acd5d1 feat(acp): pin claude-agent-acp 0.97.0 and show the turns Claude starts on its own
0db3d72 fix(git): find non-ASCII and renamed files by their real names
9562e4f fix(skills): preview the bundle path for every bundle-only agent
594b2c3 fix(zcode): manage the skill folders the ZCode runtime loads
6a0b29c fix(chat): list code-mode delegations above the loaded window in the navigator
dbd8822 fix(delegation): read a code-mode call's arguments only when they are what runs
9e27ae6 fix(delegation): recognize code-mode delegate calls only on opencode's execute tool
00b5c7e feat(tasks): write a task from a message over the conversation
9ff842c fix(acp): bridge Antigravity native ask_question and restore chosen options in history (spacering-net#1024)
82afd29 style(chat): drop the agent's pulsing mark from the live turn's figures
1ed42fc feat(chat): say what a command's non-zero exit means
e39b553 feat(chat): tie a row's figure to its label with a faint dashed line
cd3b77e style(chat): set a step's secondary words a shade lighter than its label
5f9b716 style(chat): draw running arcs, live labels and MCP chips in the theme colour
31135e6 fix(chat): centre the timeline's glyphs on their rings at any zoom
9ee9e97 style(chat): set a group's words as far past its rings as the timeline's
350ca0f feat: 增加可配置的聊天 HTML 静态混排与流式渲染
40c4cae fix(acp): keep duration-only session stats when there is no native usage
43bd7b0 fix(trae): count sub-agent spend in TRAE CLI token usage
7052ba4 feat(settings): take agents' model lists from their providers
56749ee feat(tasks): open a pull request for any reviewed task on a supported forge
a341f8e feat(chat): end an open timeline on a row that folds it
eb04256 style(chat): fill the activity capsule like the user's message bubble
6f05d30 fix(chat): keep a reply whole across a context compaction it ran mid-turn
c89d34d style(chat): drop the status word from the live turn's figures
9a74719 fix(chat): leave a failed command and its group folded
937a713 feat: 为 AI 回复中的 HTML 代码块添加预览
794c37d fix(acp): satisfy question_mark clippy lint in parse_antigravity_ask
f3ad5ad docs: add Windows MSVC rlib limitation and agent guidelines to AGENTS.md
41ce671 fix(acp): bridge Antigravity / Gemini native ask_question into interactive question card (spacering-net#1024)
7810754 Merge remote-tracking branch 'spacering/main' into feat/opencode-codemode-delegation
a9c743c fix(workbench): preserve file handoffs and mobile conversation runtimes
5d3f766 feat(workbench): switch conversation and editor tabs by worktree
f470b13 fix(settings): prevent agent reorder scroll jump
c81797f fix: register MiniMax Code in delegation tool schema
95fd81d # Release version 0.40.0
8bce9cc docs: refresh WeChat group QR codes for light and dark themes
7644295 fix(chat): keep the navigator's diff code left to right under RTL
f659f98 style(chat): draw the message navigator the way the transcript draws activity
5e46fae refactor(chat): share a delegation's status glyph and status word
87d4de7 style(chat): darken a message's hairlines over a background image
1149aa2 style(chat): set a codex script flush in its panel, above its own output
5562301 fix(chat): copy a codex script from its panel, not its first command
886fe18 style(chat): mark a code block that names no language with a code glyph
dd4eae2 style(chat): put the turn's time before the activity capsule's chevron
504cc97 style(chat): let a code block's body show the background image too
650013d fix(chat): run an inline diff row's tint under a line scrolled into view
da09abe fix(chat): keep a side-by-side diff's sideways scrollbars in view
2b643ee style(chat): heighten the activity capsule and end it with the turn's time
e190701 fix(chat): bring the failure into view from a reply that cannot fold
adea652 style(chat): hang the timeline from the activity capsule
2943115 style(chat): raise the activity capsule to a row's height
5fed427 test(chat): pin the end mark's centre and the chevron's own margin
9902ed2 style(chat): start the timeline's rings flush with the reply's left edge
20d2c31 style(chat): fit the activity capsule to its line, the time beside the steps
30941cd docs: consistently count twenty built-in agents
f127553 feat: add native MiniMax Code ACP agent support
dad0690 test(chat): pin the arc's weight, its spin and the ring's fade
2557dac style(chat): set the turn's activity header in a capsule
2b5dfde style(chat): give a running step a turning arc, and a finished one a faint ring
0148598 fix(chat): stop the transcript shaking just above the bottom
d0843ba fix(chat): remember whether a clamped block overflows across mounts
d84b019 feat(chat): fold a command group once the reply has moved past it
af21633 style(chat): draw the timeline's status rings with a hairline
73eb7bc style(chat): let a diff's rows meet its box, with no band above or below
a3ea064 style(chat): draw the paths of read and edit rows in the label's light ink
38ae021 chore(gallery): add a reply that streams in a step at a time
075a64b perf(sidebar): turn the running badge on a span, not its icon
8b55d99 feat(chat): grow the timeline's rail down to each new step
a141aa1 feat(chat): end a live reply on a turning mark while its agent works
e3177e1 style(chat): draw a command row's command line in the label's light ink
0629137 chore(gallery): add back-to-back commands and Markdown scenarios
6d0d368 fix(chat): number and bullet a thought's lists inside its column
a59e57c style(chat): bring Markdown lists a little closer to the edge
2f2ac1b style(chat): put Markdown tables and code blocks on the overlay scrollbars
b5389ad fix(chat): list a running command group's commands, one row each
e8c9992 perf(chat): keep a finishing reply's row instead of drawing it again
13ee9e2 style(chat): step a plan's headings down inside its card
85239fe style(chat): draw a task list's checkbox as its marker
3c8e4d4 style(chat): centre the dot between a delegation's id and its step count
ee65bab style(chat): write every duration in a reply the way its header does
735e3de fix(chat): settle a delegation by its later check when nothing live says
c83aab6 perf(chat): keep pointer events on while the conversation scrolls
d968412 perf(chat): stop re-parsing unchanged calls while a turn streams
dfdb946 perf(chat): slide a streaming reply's rows into the fold one at a time
0ad1eaa perf(chat): keep unchanged timeline rows when a streaming reply rebuilds
aa43ec4 style(chat): round a user's message into a capsule
1378c13 fix(chat): level the end mark with the last line beside it
d8f0375 style(chat): set the rows' verbs and the group titles in the light ink
8104c75 feat(chat): lead a command row with a fixed Command label
9e5a28d fix(i18n): keep a task id one token inside an Arabic sentence
5c79837 fix(chat): let the agent's words on a row take their own direction
7d524a6 feat(chat): scroll the halves of a side-by-side edit together
34134c5 style(chat): space a group's members like the rows around the group
6e0cf04 feat(chat): title a command with what it is for, and open on the command
b365086 fix(git): read numstat paths unquoted, as git status already does
37bc361 chore(chat): add a files scenario to the activity gallery
1d97e51 feat(chat): head file panels with the file, and switch an edit to side by side
9704fb8 style(chat): scroll expanded cards on the app's overlay scrollbars
f5a4d38 fix(chat): drop the search results' own scroll box inside the panel
c07894b fix(chat): keep a thought's line breaks in the built app
2466eaf style(chat): show a command on one line, whole in its panel when cut
6817733 fix(chat): end the rail with the last row's content, not under a folded one
1cce743 fix(ci): satisfy clippy 1.99 and prettier on the delegation branch
a7ac799 chore(chat): add sub-agent prose and running agents to the activity gallery
1805da4 feat(chat): hold a running agent's progress line with a skeleton
fc14129 fix(chat): keep a delegation's title line within its row at narrow widths
d2aa6b9 style(chat): say a sub-agent's prompt on its title line
07023a4 style(chat): keep the activity header's chevron in view
ab1928b style(chat): mark a step group with a group icon, its chevron after the label
3c5fd49 fix(chat): draw the rail beside the last row and end each list on a mark
7889bda style(chat): say a delegation's task on its title line
a7f5e1c fix(chat): draw a delegation's status checks as rows of their own
cb22b4d feat(chat): end the activity header with the reply's time, not Hide / Show
05e4f66 chore(chat): add delegation checks and a ranked plan to the activity gallery
d3c4f5c feat(chat): fold a reply from anywhere on its activity header
7d2619c fix(chat): point an open row's chevron down in right-to-left layouts
4b94595 style(chat): put a check's chevron after its label, its status at the end
f4e2109 fix(chat): keep the rail beside the last row while it is open
9bd3dd4 fix(chat): set timeline rows on the line their rail is drawn for
3b60ef8 style(chat): draw a plan as a quiet checklist in its row's columns
d5a9dd0 perf(chat): measure a clamped block once the browser has laid it out
6d53bcf feat(zcode): add unified Skills management
5d4a6c9 fix(chat): show a thought between two reads as its own row
433d677 perf(chat): skip the background-task parsers for output that is no envelope
f13850d fix(chat): keep a delegation row on its task's newest report
61bb0d9 fix(chat): say a delegation's task once when it fits in its two lines
5f7c6b9 fix(chat): read a failed command's exit code inside the adapter's fence
9008e85 fix(chat): read message text in the direction of its own content
c5681b8 fix(chat): bring the timeline's colours up to WCAG contrast
4e23ac3 fix(chat): keep the activity header still when it hides or shows steps
617650f refactor(chat): drop exports the removed cards were the last to read
a587da5 chore(i18n): drop the strings only the classic reply cards used
a548ea6 refactor(chat): stop wrapping tool runs in tool groups
5034776 fix(chat): keep a running context compaction on screen
3965fd7 refactor(chat): remove the classic reply cards
16472bb test(chat): cover the timeline rows with the classic cards' cases
5efa66a refactor(chat): drop the switch back to the classic reply cards
485b8b9 fix(delegation): recognize opencode 2.x code-mode delegate calls wrapped in execute
032c222 fix(chat): draw the prose inside a goal run on the timeline
6cc09b3 style(diff): draw diff previews with the shared diff tokens
a7feb94 feat(chat): show a delegated agent's steps as a step bar
7d0bcd8 feat(parsers): keep a command's exit code where the transcript records one
76779b6 feat: 为 TRAE CLI 会话添加原生 token 使用量的导入和统计
4b0691e feat(chat): keep tool approvals and mark them on the approved call's row
ce374de feat(chat): draw every step as a timeline row and turn the timeline on
70b3b38 feat(chat): draw replies as an activity timeline behind an internal switch
f332850 feat(chat): add the activity timeline model
最新提交:e795ecc9

xintaofei and others added 30 commits October 22, 2026 23:40
The rail is drawn as segments from one row's ring to the next, so the
last row had none: opened, its panel (a plan's steps, a command's
output, a group's members) hung off the timeline with no line beside
it. A row now marks itself open, and the open last row runs its
segment down to the panel's bottom edge; an open last member of a
group does the same on its dashed sub-rail. A delegation check reports
its panel's state to the row it sits in for the same purpose.
… end

A delegation check ("Waiting for task #… result") read label, time,
a status pill, then a chevron pinned to the far edge, unlike every
other row and unlike the delegation it checks, which ends on
"done · 42s". It is now laid out like the other rows: the chevron
follows the label (shown on hover or while open) and the status and
time sit at the end as one quiet word, red when it failed, amber while
the sub-agent waits on the user. Its running shimmer stops using the
primary colour, which reads as failure on the red and rose presets.

The answered-question and workbench rows ("Q&A: …", "Progress: …")
had the same far-edge chevron and get the same layout. The chevron and
the end column are shared from the row component.
A row's chevron is mirrored under RTL and turned a quarter clockwise
when the row opens, which pointed the mirrored chevron up: in Arabic
every open row and group read as closed-upward. Turn it the other way
there.
Only the Hide / Show word at the far end of a reply's activity header
folded it, a small target at the opposite edge from where the eye
starts. The whole header now folds and unfolds the reply; the word
stays the control for the keyboard and screen readers. A press on a
button inside it (that word, the red failure link) is the button's
own, and one that ends a text selection is not a toggle.
…gallery

A delegation whose status check comes after other prose (so the check
is a row of its own) and a plan with ranked steps as the last row, for
reviewing those rows and the rail beside an open last row.
… Show

The header read `Activity  3m 34s · 14 steps · …  ———— Hide`. It now
reads like a timeline row: the summary, the disclosure chevron after it
(shown on hover, turned down while the process shows), and the reply's
time at the end, where Hide / Show stood. The label is the control for
the keyboard and screen readers; a click anywhere on the header still
folds the reply. The Hide / Show strings leave every locale.
A `get_delegation_status` call right after its `delegate_to_agent` was
folded into the delegation's row, its "Waiting for task … result" row
only reachable in that row's panel. Every check is now a row of its own,
right where the agent made it; the delegation still reads its task's
newest report for its step bar and result, and a task that failed still
counts once in the header, on the delegation.

A check whose sub-agent waits on the user stays under a folded turn,
the way the delegation row itself does, so the decision is still there
to answer. The delegation row no longer opens by itself while it waits:
its panel only holds the task now.
A delegation's row gave the task it was handed two lines of its own under
the title, folded or not. The task now follows the agent and task id on
the title line, as one line cut short at the end, like a sub-agent's
description or a plan's current step; the row opens to the whole task
only when that line cuts it short, and keeps it open whatever the width.

`useTruncation` tells a one-line truncated node that cuts its text from
one that fits, measured by a ResizeObserver; its callback ref follows a
header that turns from a div into a button once the row can open.
The rail is drawn as segments between rows, so the last row had none
unless it was open: the closing paragraph of a sub-agent's steps hung
off the timeline with no line beside it. The last row's segment now
always runs down beside its body - prose, an open panel, a live tail -
and comes out zero tall on a one-line row.

Each list of steps - a reply's, a sub-agent's, an open group's members -
now ends on a small ringed dot once it is done (data-end="reached").
The room for the mark is kept from the first row on (data-end="pending"),
so the answer below does not move when a reply completes; the rows kept
under a folded reply are no list of steps and get no mark. The last row
keeps an open panel's bottom margin inside it, so its segment meets the
mark either way.

The open-row plumbing that only kept the rail beside an open last row
(data-open, a delegation check's onOpenChange) goes away.
…he label

A folded run of reads or commands drew its disclosure chevron inside the
ring and turned it there. The ring now carries a group icon (Layers; the
people icon is already the delegation's) and the chevron sits after the
label like every other row's: shown on hover or focus, turned down while
open.
The header's chevron only appeared on hover, like a row's, so a folded
reply did not say its header opens. It now shows folded too, pointing
right, and down while the process is open.
A sub-agent row showed its prompt as two lines under the title. Like a
delegation's task it is now one grey line after the title ("Explore
Find binding consumers  Find every consumer of..."), in whatever room the
title leaves. On its own it makes the row expandable only when that line
cuts it short; the panel still holds the whole prompt, with the
sub-agent's steps and result. The description takes the title's ink so
it stands apart from the prompt after it.
…dths

The agent's name, the task id and the step count never shrank, so on a
narrow chat column they ran into the status at the end of the row. The
task now takes only the room they leave, the step count gives way next,
and the line is clipped at its end instead of overlapping. A cut task
still opens the row to its full text.
While a delegation or a sub-agent had no step and no word to show yet,
the line under its title sat empty, or did not appear until the first
step did. A skeleton now holds the place of the step bar and the text
until something arrives; one waiting on the user, or done, gets none.
Both rows draw that line through one ProgressLine component instead of
two copies.
…allery

The sub-agent fixture interleaves prose with its calls and ends on a
paragraph, a running sub-agent gets a view of its own, and the
delegation view ends on a delegation still out - for the rail's last
segment, the end marks and the skeleton.
Collapse the empty line after the code-mode doc comment in lifecycle.rs
(clippy 1.99's empty_line_after_doc_comments fires under -D warnings and
fails every Rust job), and reformat the two delegation-card spots
prettier flags: single-quote the template-literal fixture string and
unwrap the workingDir ternary that now fits the print width.
…ed one

The end mark sat in room kept below every finished list, so it also
hung under a folded last row - after a one-line command, under a group
whose last member was closed - and below the content when the row was
open. The last row now draws its segment only beside a body under its
line (data-body: an open panel, prose, a card, an open delegation
check), and once the list is done the mark is drawn in that same
segment, at the foot of the body. A folded last row ends the rail at
its ring, with no mark, and nothing is reserved below the list.

The check rows report their open state again for this, counting only
the rows still drawn.
A long command wrapped onto up to three lines in its row. It now takes
one line and gives way first, with an ellipsis, while its notes (script
length, session, background) keep their room. When the line cuts it
short the row opens, and its panel shows the command whole.
Reasoning is written line by line, but an expanded thought ran its
lines together. Its Markdown now keeps a line break as one
(remark-breaks). The plugin carries an explicit name: Streamdown caches
a processor per plugin list keyed by the plugins' function names, which
a minified build shortens, so the reasoning list - as long as the
reply's - was served the reply's processor and lost its breaks.
A match or grep panel nested the results' own capped, bordered scroll
box inside the panel's, so it showed two scrollbars. The results now
sit edge to edge in the panel, which caps the height and scrolls.
A row's panel scrolled on the native scrollbar. It now scrolls through
the app's ScrollArea (OverlayScrollbars), with the edge fade moved onto
its viewport so the scrollbar is not faded with it. The code block's
and the JSON tree's sideways scrollers, a delegation check's result,
the workbench card's report and prompt, and a goal's error box do the
same, and the Markdown in those cards no longer caps its code blocks in
a second scroll box of their own.
…e by side

A read, a new file or an edit opened straight to its code. Its panel
now has a header naming the file - it opens the file in the file tabs,
at the first line read or changed when that is known - and an edit's
header adds its counts and the switch between the inline and the
side-by-side view, the app's one diff view preference. Side by side
sets the old text beside the new, each half scrolling sideways on its
own. It is offered only where there is a before: not for a new file,
nor for a write whose old text is not known.
A match of 19 files, a read from line 10, a new file, an edit, and a
thought written line by line - for the file headers, the side-by-side
view, the panel scrollbars and the end mark.
By default git prints a path with non-ASCII bytes C-quoted and
octal-escaped (`"docs/\351\234\200\346\261\202.md"`). `git_status`,
`git_log`, `git_commit_files`, `git_stash_show` and `detect_conflicts`
pass `-c core.quotePath=false` for that reason; the numstat readers did
not.

- Changes panel: `git_numstat_map` was keyed by that escaped name (with
  its backslashes turned into slashes), while `git status` reports
  `docs/需求.md`, so the lookup missed and the file showed no +/- counts.
- Task drawer: `diff_numstat_with_untracked` listed the escaped name, and
  clicking it asked `diff_patch_with_untracked` for
  `:(literal)"docs/\351..."`, which matches nothing, so the drawer said
  there were no changes. The patch headers came back quoted as well.

Pass `-c core.quotePath=false` to `git_numstat_map`, to the three numstat
readers that share `parse_numstat`, and to the drawer's patch.

A separate slip in `normalize_numstat_path`: git writes a move up a
directory as `docs/{sub => }/moved.txt`, and joining prefix, new side and
suffix gave `docs//moved.txt`, so a staged move with edits lost its
counts too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
A command row now says what the command is for, in the agent's own
description of it, where it showed `$ command`: words, so no prompt
sign and no count of the command's lines. The panel opens on the
command itself, whole, in the place the description held. A command
the agent did not describe keeps its `$ first line` as before. The
description follows its own direction under an RTL UI and shimmers
while the command runs.
The members of an open Explored or Ran-commands group sat 0.25rem apart
on a line with no room above or below it, packed tighter than the
timeline around them. They now take a main row's header padding and
the same gap between rows, so an open group keeps the timeline's
2.25rem rhythm. The child markers and the dashed sub-rail's segments
are re-derived for the line's new centre (0.875rem).
The two halves of an edit's side-by-side diff scrolled sideways on
their own, so reading the end of a long line on one side left its pair
behind on the other. They now move together through useSyncedScroll,
as the workspace's diff view does: each half still scrolls as far as
its own longest line, and where one runs out of line it stops there
instead of pulling the other back.
Under an Arabic UI, English the agent wrote on a row (a thought's
title, an MCP call's summary, a background task's line, a sub-agent's
description, a todo or completion text) inherited right to left and was
cut at its start: "...te audit report". Those spans take dir="auto", as
the delegation, prompt and plan lines already do, so each is cut at its
own end.
In Arabic, "#beecec7d" rendered as "beecec7d#": the neutral "#" joined
the right-to-left text around it. The background chip and the
delegation wait and cancel titles now wrap the id in directional
isolates (LRI...PDI), so it reads as the one left-to-right token it is.
A command row now starts with a fixed "Command", as a thought starts
with "Thought", and the agent's description after it is set in the
same light ink. With the label in front, the row drops its `$ ` before
a command the agent did not describe; the panel keeps it before the
full command.
xintaofei and others added 27 commits October 31, 2026 21:41
…-tests-fixed-today

test(tasks): pin today so the pickers' cells stay in the window
Read/search rows inside an explore group used a fixed-width monospace
verb column with a wide gap. Use the same words-label + target layout
as command rows, and drop the now-unused short verb strings.
A resume_delegation step still rendered the old bordered card. Draw it
as the delegation row with a resumed mark on its ring and the resume
reason in its panel; a refused resume keeps the workbench row. Later
status checks go to the resume that started the run, and a refused
resume leaves them with the delegation before it. Remove the old card.
…intact

- Skip the CommonMark parse unless an adjacent $…$ pair can be a formula;
  formula-free streamed replies with code no longer pay a full parse per batch.
- detectHeavyPlugins uses the parse-free candidate check instead of running
  the normalizer a second time on already-normalized text.
- Reject a formula ending in an escaped \$ (it merged into a $$$ closer and
  showed as broken literal text).
- Treat raw HTML blocks as literal, like code: remark-math never renders
  inside them, so rewriting only changed their visible text.
`echo "$prefix${suffix}"`, `echo $A$@` and `$(a)/$(b)` no longer pair
into inline math: a closing $ followed by {, ( or @ is a shell $.
Tauri routes emit_to(EventTarget::webview(label)) to every listener with
the Any target in every webview, so Rust-side targeting alone does not
isolate windows sharing one remote connection.
Pin OpenCode 2.2.5, CodeBuddy 2.179.2 (lifting the 2.177.1 hold), Kimi
Code 2.4.1, Antigravity 1.4.5 and zcode-acp-server 0.82.0, with the
fixes these releases need:
- OpenCode: read assistant content kept in session_part, and settle
  background command and image job cards in history
- OpenCode: accept a share of the window for compaction.buffer
- Kimi Code: read whole files up to the file size limit
…dollar-math

fix(markdown): render single-dollar inline LaTeX safely
…op-webview-events

fix(remote): scope desktop event listener to webview
This release renders inline math more reliably, fixes duplicated terminal output in remote workspaces, makes the execution timeline easier to read, and updates five agents.

## New

- **ZCode supports `/rename` to rename the current session**, and the conversation title in codeg updates to match unless you have already renamed the conversation yourself.
- **OpenCode's reserved space before automatic compaction can be set as a share of the context window**, such as `20%`, as well as a token count.

## Improved

- **Resumed delegations appear as delegation rows in the execution timeline**, marked as resumed and showing the reason for resuming.
- **Read and search steps inside explore groups use the same layout as command rows**, and the secondary text of non-text steps has higher contrast.
- **Updated OpenCode to 2.2.5, CodeBuddy to 2.179.2, Kimi Code to 2.4.1, Antigravity to 1.4.5 and the ZCode bridge to 0.82.0.**
- **Kimi Code can read text files up to 16 MiB**, so files larger than 2 MiB no longer fail to load.

## Fixed

- **Single-dollar inline formulas such as `$T$` now render as math**, while amounts, shell variables and code stay exactly as written. (spacering-net#1081, @xy3xy3)
- **Opening another window in a remote workspace no longer duplicates terminal output**, including the window for importing local conversations. (spacering-net#1085, @xyalter)
- **Background command and image generation cards in OpenCode history now show their final results** and no longer stay stuck as running.

## Note

- **OpenCode's `/goal`, `/init` and `/review` commands currently show no progress after you send them**, and the session can stop responding if a step needs your approval.
- **OpenCode's background command and image generation results appear after you reopen the conversation**, not while they are still running.

-----------------------------

# 发布版本 0.41.4

这一版改进了行内公式的渲染,修复了远程工作区终端输出重复的问题,让执行过程时间线更易阅读,并更新了五个智能体。

## 新增

- **ZCode 支持用 `/rename` 重命名当前会话**,codeg 中的会话标题会同步更新,你自己改过的标题不会被覆盖。
- **OpenCode 自动压缩前预留的空间可以按上下文窗口占比填写**,例如 `20%`,也可以继续填写 token 数。

## 改进

- **恢复后的委派在执行过程时间线中显示为委派行**,并带有已恢复标记和恢复原因。
- **探索分组里的读取和搜索步骤改用与命令行一致的布局**,非文字步骤的次要文字也更加清晰。
- **OpenCode 更新至 2.2.5,CodeBuddy 更新至 2.179.2,Kimi Code 更新至 2.4.1,Antigravity 更新至 1.4.5,ZCode 桥接更新至 0.82.0。**
- **Kimi Code 支持读取最大 16 MiB 的文本文件**,查看超过 2 MiB 的文件时不再失败。

## 修复

- **`$T$` 这类单美元符号行内公式现在可以正常渲染**,金额、Shell 变量和代码内容仍按原样显示。(spacering-net#1081, @xy3xy3)
- **在远程工作区打开其他窗口时,终端输出不再重复显示**,打开导入本地会话的窗口也是如此。(spacering-net#1085, @xyalter)
- **OpenCode 历史会话中的后台命令和图片生成卡片会显示最终结果**,不再一直停留在运行中。

## 注意

- **OpenCode 的 `/goal`、`/init`、`/review` 命令发出后暂时看不到执行进度**,如果中途需要授权,会话可能停止响应。
- **OpenCode 后台命令和图片生成的结果需要重新打开会话才会显示**,运行期间暂时无法实时看到。
CNB's issue list carries no body, and both places that mint a task (the
trigger dialog and an auto-processing scan) build the prompt's snapshot
from a list row, so every CNB issue task handed its agent a title and an
empty fence. Task creation now reads the issue body when the snapshot
has none, and the trigger dialog's preview reads it too, so what it shows
is what the envelope wraps. useIssueBody moves to its own module for the
two callers and no longer waits forever without a folder.

Also: an empty last_acted_at/created_at (CNB's spelling of no time) no
longer shadows updated_at or reaches the panel, and cnb.cool skips the
Gitea/GitLab probe its web host answers with HTML.
CNB's git server documents a FIXED username, cnb, with the access token
as the password. Delivery only used that placeholder when the stored
username was empty, and the app's own push/pull/clone credential path
always sent the account's login, so every authenticated git operation
against a CNB account sent the wrong name. Both now send cnb for a CNB
account.

The token hint asked for repo-code:r, which cannot push a delivery; it
now asks for repo-code:rw in every locale. useIssueBody's cache key also
carries the folder, so one repository's spacering-net#42 never answers for another's.
codeg pins claude-agent-acp 0.100.0, on Claude Agent SDK 0.3.316
(Claude Code 2.1.316). The model catalog is unchanged.

When Claude Code refuses to start, the adapter now answers with the
CLI's own message and a startupFailureReason code instead of the
"Claude Code process exited" text the session reopen path looked for.
Reopening such a session keeps the conversation rather than binding
it to a new, empty session: a session a Claude Code background job
holds shows that it is open elsewhere, and a session in a worktree
Claude Code won't re-enter shows that it can't be restored. A
machine-level refusal, such as a bad proxy, an organization policy or
an outdated CLI, ends the reopen with Claude Code's message instead
of starting a new session that fails the same way; refusals a sign-in
fixes keep the login path. Setup, fork and rejected-prompt errors no
longer end in the reason code as JSON.

Claude Code records an MCP prompt sent as /mcp:server:prompt under its
command name, /mcp__server__prompt. The transcript watcher now matches
that name, for command records only, so the turn is no longer drawn a
second time below the live one.
Checked each agent's global instructions file against its shipped code:
- CodeBuddy reads CODEBUDDY.md (AGENTS.md only from a workspace), Kiro its
  steering dir, Cline ~/.agents/AGENTS.md, Antigravity a hardcoded
  ~/.gemini (AGENTS.md keeps it apart from Gemini CLI's GEMINI.md);
- Claude follows CLAUDE_CONFIG_DIR, DeepSeek DSH_HOME;
- Codex/Trae edit a non-blank AGENTS.override.md, Pi the first candidate
  it loads;
- Hermes, Cursor, MiniMax Code, OpenClaw and custom agents have no file
  codeg can safely edit, so their card is hidden.

Saving no longer has side effects on other files: an instructions-only
save returns before the generic settings merge (which re-serialized
settings.json, or reset it to {} when unparseable); the shared save sends
the text only when it was edited, so an untouched draft can't write a
stale copy or create an empty file; unchanged text is not rewritten; the
write is atomic through symlinks; an unreadable file is refused. An
untouched editor follows the file on refresh.
Codex and Trae resolve to AGENTS.override.md only while it is non-blank,
so blanking it and saving flipped the next save to AGENTS.md, whose
content the editor had never shown. The panel now sends the path it
displayed; the backend writes there when it is one of the agent's own
candidate instruction files, and refuses any other path.
…pacering-net#1068)

A Pi session loaded before its first prompt keeps the file pi-acp named
after its ACP session id, but pi writes a fresh header id into it. codeg
stores the ACP id as external_id, so matching the header alone left the
reopened conversation's history empty. Fall back to the filename uuid
when no header matches; the requested id is returned unchanged.
…n webhooks (spacering-net#1084)

- New Events-tab setting "Top-level sessions only" (off by default): turn_complete
  and error from delegation sub-sessions are not pushed to IM channels or webhooks;
  permission requests and questions still notify.
- Webhook bodies now carry conversation_id/title, agent_type/name, assistant_name,
  session_kind (session | sub_session) and the parent conversation's id/title.
- Connection-to-conversation resolution covers chat-channel /resume sessions,
  including a session the relay removed before the subscriber caught up.
A task parked on a permission, question or plan approval now offers a
filled "Respond" that opens the session viewer where the prompt is
answered, on the board card, list row and detail sheet. Cancel becomes a
secondary "Cancel task"; the detail sheet's panel turns amber and
explains what the agent is waiting for.
…rompts

feat(acp): support configuring global system instructions for all agents
feat(forge): support CNB (cnb.cool) as a forge provider
Keep the fork debuginfo profile, Codex ghost-session prune, and cc-switch Claude catalog while taking upstream model fetch and system-instruction coverage. Codex auth defaults stay in codex_catalog_commit.

Co-authored-by: Cursor <[email protected]>
@youxuanxue
youxuanxue merged commit c2eb9fa into main Nov 3, 2026
13 checks passed
@youxuanxue
youxuanxue deleted the merge/upstream-2026-11-03 branch November 4, 2026 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants