Skip to content

CI 预检:额度监控 PR 冲突解决 - #1

Merged
ana52070 merged 543 commits into
mainfrom
feat/agent-quota-monitor
Oct 18, 2026
Merged

ana52070 merged 543 commits into
mainfrom
feat/agent-quota-monitor

Conversation

@ana52070

Copy link
Copy Markdown
Owner

用于在本 fork 内运行原有 GitHub Actions 流程,验证上游 PR spacering-net#845 的冲突解决提交。

待验证提交:25cc516b91ee390f9205850eef4fc330011b7e67。
保持原有测试及 CI 工作流不变。

sumanx and others added 30 commits October 9, 2026 21:03
The chat area's collapse/expand slides, tool and reply-fold motion,
pulse/typing dots, shimmer labels and smooth scrolling are fairly long
and touch a lot of the screen. Rather than retime them, add an opt-out
under Settings -> Appearance, on by default.

- The preference lives with the other appearance prefs (localStorage,
  cross-window sync) and is applied before hydration as
  `data-chat-animations="off"` on <html>.
- CSS drops every animation and transition inside `.chat-motion-scope`
  (the conversation view), except `animate-spin`, which stays as the
  last "still working" cue. instant-collapsible already unmounts
  synchronously when no exit animation is running.
- JS-driven motion reads the same setting: Shimmer renders static, and
  stick-to-bottom, send and scroll-to-bottom jump instantly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The conversation column was capped at max-w-3xl (48rem). Add drag
handles on its left and right edges, modeled on deepseek-harness's
ConversationWidthControls: dragging either handle outward widens the
column symmetrically, and double-click or Esc/Home resets it. The
handles are also keyboard-adjustable.

- The width is an appearance preference held by AppearanceProvider.
  Settings -> Appearance gets a matching slider and reset. It persists
  to localStorage, syncs across windows, and is applied before
  hydration as --chat-content-width on <html>.
- A new `chat-content-w` utility replaces max-w-3xl on the transcript
  rows, composer dock, banners and welcome page, so they stay aligned.
  Its cap is relative: the parent minus a fixed --chat-gutter on each
  side, not a fixed px ceiling.
- The conversation shell sets a 12px gutter, and the handles hang
  inward from the column edge over the rows' own padding. A handle
  therefore never lands on the window's resize border, where a later
  press would start a window resize instead.
- A press without movement stores nothing, and wheel events over a
  handle still scroll the transcript.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the aux panel or sidebar toggles, the top tab strip gains or loses
a blank reserve under the fixed corner chrome. That reserve popped in
or out at once while the column itself was still sliding over 240ms.
The tabs first jumped by the reserve's full width, then slid back, so
they squeezed and stretched on every toggle. It shows most on desktop
Windows/Linux, where the right reserve also covers the 138px caption
buttons (254px vs 116px on the web).

Replace the conditional reserve blocks in the conversation, file and
split-group strips with an always-mounted ChromeReserve sized by width.
Under .panel-slide-animating its width transitions with the panels'
own timing, so the tabs' share of the row changes in one monotonic
motion. Reduced motion still snaps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…esh-recovery

fix(terminal): restore panel sessions after refresh
Only the turn loop recorded into a custom agent's ACP transcript, so a
turn the agent ran on its own after a background job, and tool updates
read between turns, vanished once the conversation was rebuilt from
history.

- Record the idle loop's frames once a prompt has run on the session.
- A tool_call_update between turns completes the earlier turn's card
  instead of drawing a second one.
- A prompted turn starts from an empty live message, so a client
  attaching mid-turn does not render the agent's own turn twice.

Fixes spacering-net#903
A custom agent added from the ACP registry keeps the archive entry's
real file name as its `cmd`, and on Windows that already ends in `.exe`.
The binary cache appended `.exe` again at install and at lookup, so 13
of the registry's 19 Windows binary entries looked for `kilo.exe.exe`
and never installed.

- `binary_cache::executable_file_name` adds `.exe` on Windows only when
  the name lacks it. The install, the cache lookup, and the
  `~/.local/bin` and vendor directory fallbacks for a user-installed CLI
  all use it. Built-ins spell bare commands and still get the suffix.
- A raw executable download, which the registry format allows in place
  of an archive (sigit's Linux and Windows builds), is staged like a
  one-file archive instead of being refused as an unsupported format.

Fixes spacering-net#905
…lumn shows

- Store the width in px at 100% zoom and write it to CSS in rem, in the
  provider and the pre-hydration script alike. The app zoom rescales the
  root font size, so the width now grows and shrinks with the text like
  the 48rem default does. Before, a px width stayed put: a column set at
  100% held half as many characters at 200%, and at 80% the default
  (614px) sat under the 640px drag floor, so dragging it inward widened it.
- The handles convert what they measure, and the pointer travel, back to
  px at 100% zoom. The settings slider's ceiling follows the zoom and
  never drops below the default, and its hint says the values are at
  100% zoom.
- A drag or arrow key no longer stores a width the column cannot show.
  In a host narrower than the floor it stores nothing: the floor lift
  used to save 640 there, below the 768 default, with no visible change.
  Pushing outward at the cap keeps the stored width instead of
  overwriting it with the cap.
- Whenever a drag ends without storing (released back at its start,
  nothing the host can show, cancelled, or lost its pointer capture), the
  stored width is put back on <html>. Before, the last preview frame
  stayed applied while state and storage kept the old value.
- A wheel over a handle is replayed on the scrollport before it is
  scrolled, so the transcript's own wheel listeners hear it. Among them
  is the stick-to-bottom escape: without it, scrolling up there while a
  reply streams was pulled straight back to the bottom. On the welcome
  page, which has no transcript, the wheel scrolls its scroll area.
- The focused separator reports its width and range (aria-valuenow,
  aria-valuemin, aria-valuemax).
ConversationShell also renders inside canvas cards, which sit under the
board's zoom transform (0.1x to 2x). There the handles read layout boxes
and pointer positions in screen px and stored them as CSS px, so a drag
at 0.5x shrank the global width to the floor and one at 2x roughly
doubled it. The 12px gutter also narrowed every card's content with the
feature unused.

The handles and the gutter are now opt-in through `resizableWidth`, which
only the conversation tab passes. Canvas cards lay out as before and
still follow the stored width.
The message navigator and the "jump to previous user message" button
still asked the virtualizer for a smooth scroll with the switch off,
though the setting promises no smooth scrolling. Both now pass
`smooth: false` then.

The flag's readers (MessageListView, every Shimmer, each reply's stats
row, the navigator) now read it from its own ChatAnimationsContext. The
appearance context's value is rebuilt on every provider render, such as
each tick of a settings slider relayed from the settings window, and
reading it cut through the memo boundaries those components sit behind.
A bare boolean re-renders them only when the switch flips.
…ut switches

Follow-up to the corner reserve slide:

- The workbench-route band (Tasks, Automations, Forge, Token usage,
  Canvas) still popped its left reserve in and out on a sidebar toggle,
  so the page title jumped by the reserve and slid back. It now uses
  ChromeReserve too, without the strip hairline, since the band draws
  its own border; ChromeReserve takes a `line` prop for that.
- A reserve is mounted while its column holds the corner (the right one
  in conversation mode for the conversation column and in fusion for
  the file column, the file column's left one while files are
  maximized), and only its width follows the sidebar/aux panel. Picking
  a nested file in search opens the aux panel and the first file tab
  within one slide; the conversation strip's right reserve then kept
  shrinking beside the divider after its column had moved.
- The width transition is armed only from the horizontal (sidebar/aux)
  shell group, because the terminal's vertical group carries the same
  class. The reduced-motion opt-out repeats the full selector so it
  still wins on specificity.

Tests pin the shared slide timing (PANEL_SLIDE_MS and the panel and
reserve transitions), the scoping, the reduced-motion opt-out, and the
mount/width split in the layout and the split strips.
…pixel caps

- A drag that ends without storing (cancelled, lost capture, released at
  its start, or nothing the host can show) put back the width from the
  handle's last render. If another window stored a new width mid-drag,
  this window's provider had already put the new one on <html>, but its
  state update was still pending. The restore then wrote the old width
  over it, and nothing re-applied the new one when the update committed.
  The provider now keeps the width in a ref that every write updates at
  once, and the handles restore through `getChatContentWidth()`.
  Outside a provider the getter reads storage at call time.
- The "nothing changed" check now runs before rounding. A cap can fall
  on a half (a 1601px host at 200% zoom shows 788.5). Rounding that up to
  789 used to count as a change, so pushing outward at that cap replaced
  a wider stored width with no visible effect.
Pin claude-agent-acp 0.88.0 (Claude Code CLI 2.1.293) and follow what
the new CLI changed.

- The Haiku model placeholders suggest claude-haiku-5-5, the CLI's
  latest Haiku.
- The history context gauge reads 1M for the natively 1M Claude models
  (Opus 4.7+, Sonnet 5+, Haiku 5.5, Fable, Mythos) and 200K for the
  older ones.
- A Grep call that names its search path `file_path`, which CLI 2.1.292
  accepts, shows that path live and from history.
- The Agent card shows the effort a sub-agent was asked to run at, and
  the WebFetch card the offset a continued read starts from.
- The registry notes record what 0.87.0 and 0.88.0 change for codeg:
  folded prompts now settle, a steer during a streamed tool call no
  longer fails the turn, and Monitor runs leave the background-task
  strip.
On macOS the driver vouches for typing by reading the field's value
back once every key has gone out. In web content — a page, or an
application built on Chromium or Electron — that value is not what the
page holds: a terminal built on xterm.js empties its input as it takes
each key, so text that arrived in full read back as none delivered, and
`submit` never pressed return after it.

Typing into an element the driver marks as web content, whose keys all
went out and none of which read back, is now unverifiable rather than a
failure, and return follows it. Part of the text read back, a native
field and every other refusal are read as before.

Typing such an application refuses in the background now says its keys
still go there, return included, rather than pointing the agent at a
submit button or the user. computer_type and computer_press_key say
that what they did there may not read back, and to look again before
typing or pressing return a second time.
Claude Code records a message sent while a turn runs, such as a steer
during a tool call or a prompt folded into a turn it started itself, as
a `queued_command` attachment rather than a user record. Background
tasks that finish mid-turn arrive the same way. The Claude history now
shows such a message as a user turn, and a task that finished mid-turn
shows its result instead of "result pending". The background watcher
matches folded messages against the prompts codeg sent, so a reply no
longer renders twice on the overlay, and settles those tasks, so the
connection no longer stays exempt from the idle sweeps.

A custom agent whose adapter reports itself as
`@agentclientprotocol/claude-agent-acp` now steers natively under the
Claude Code policy. Its steers are recorded in codeg's own transcript,
so a reopened conversation still shows them.

The desktop app now exports its data directory before logging starts,
so a launch from the Start menu or the Dock logs to the same directory
as a restart by codeg. Settings lists and opens the directory actually
being written and reports each file's current size.

Fixes spacering-net#892
Refs spacering-net#893
Every open tab keeps its ConversationTabView mounted (that is what preserves a
background session's stream and scroll state), so the ungated
useConversationDetail() call there fired one get_folder_conversation per open
tab the moment the workspace restored its tab set — each one a tail window of
up to TAIL_TURNS_DEFAULT (120) turns.

Measured on a workspace with 49 open tabs: 49 concurrent requests in a single
100 ms burst, 25.4 MB decoded (7.2 MB gzipped), issued before the active
conversation had painted. The cost grows with the number of open tabs AND with
the length of each conversation, which is why reopening the workspace gets
slower the longer it is used.

Gate the auto-fetch on visibility instead of on mount. A hidden tab keeps its
session, its scroll state and its position in the strip; it fetches on the
first frame it becomes visible (tab switch, group selection, tiling), which is
also the first moment its detail is actually needed.

While here, stop seeding a child tab's summary from the full transcript:
reconcileChildSummaries only reads detail.summary off the response, but it
asked for the legacy unwindowed detail, so a long child session transferred
and re-parsed megabytes of turns to read a title and a status. It now asks for
tailTurns: 1.
A new UI tab under Settings > Skill Packs turns generative UI on; it is
off by default. While it is on, Codeg links a built-in `json-render`
skill, generated from json-render's shadcn catalog, into an agent's
skill folder before the agent starts, so the agent can be asked for UI
with /json-render ($json-render in Codex). Turning it off takes back
only the links Codeg made, recorded beside its marked copy, and the tab
warns about any it could not remove. A user's own json-render skill is
never replaced.

With it on, a `spec` code fence of JSONL patches in an assistant reply
renders as a card built from json-render's official shadcn components,
loaded on first use and growing while the reply streams. Patch lines
whose path goes through __proto__ are skipped, and a spec whose
children form a cycle, or that fails to render, stays a code block.

The live-feedback switch now orders its reads too, so a stale read
after a reconnect no longer overrides a newer value.

Adds @json-render/core, react and shadcn 0.21.0 and zod 4, and moves
react, react-dom and lucide-react up so the shadcn package shares
Codeg's copies.
…toggle-and-width

feat(chat): chat-animation switch and an adjustable chat column width
…e-slide

fix(layout): stop the tab strip squeezing when a side panel toggles
… detail loads

A tab restored behind another one is mounted hidden with a runtime session
(its mount effects create one) but no detail, because its fetch now waits
until it is shown. The render that shows it reported that session as settled,
with no detail and nothing loading. It is also the render that makes the tab
active, so the auto-connect gate, which waits on detailLoading for the stored
session id, let the connect out with no session id. Depending on which
finished first, that either spawned an agent on session/new only to kill it
once the detail landed, or kept the tab on that new session, so the next
prompt re-pointed the conversation away from its history.

useConversationDetail now counts a fetch it is about to start as loading. It
uses the same admission rule as fetchDetail, shared as
sessionHoldsActiveTurns, so the gate stays closed from the first render until
the stored session id arrives.
Git on Windows, GitHub's runners included, checks text out with CRLF by
default (core.autocrlf), and include_str! compiles the bundled SKILL.md
in byte for byte. A Windows build therefore embedded a CRLF copy: the
skill's frontmatter test failed on the Windows server job, and Windows
releases would install bytes that differ from what skill.ts generates.

A root .gitattributes now checks out src-tauri/genui/ with LF on every
platform, and a test fails with a pointer to that rule if a CRLF copy
is ever compiled in again.
…t as it fails

A failed detail fetch leaves no detail and nothing in flight, which is exactly
what useConversationDetail's auto-fetch keys on, so the hook re-requested it on
the very next render. A transcript that will not parse was re-parsed in a hot
loop, a server that was down was hammered until it came back, and the error
flickered in and out instead of staying next to its Reload action.

A failure now waits for a retry schedule instead: 1, 2, 4, 8 and 16 seconds,
then the error stays on screen until the user reloads. A loaded detail or a
different conversation starts the schedule over, and a hidden view holds its
pending retry until it is shown again.
The retry schedule for a failed detail fetch used to end after its fifth
step, leaving the error up until the user pressed Reload. The loop it replaced
did recover on its own once the server was reachable again, so an outage
longer than half a minute now needed a manual Reload where it once did not.
The last step, 30 seconds, now repeats for as long as the failure lasts and
the view stays on screen. A view picks its conversation back up within half a
minute of the server returning, and the error stays readable in between.
Gating the auto-fetch on visibility also stopped a hidden tab from
refetching after its runtime session was dropped. Closing the sub-agent
viewer drops the session it shares with an open tab; if that tab is hidden
and holds a live connection, the next streamed batch recreates the session
with live data and no detail, which fetchDetail never fills in, so the tab
came back without its history.

Only the first load waits for the tab to be shown now: once a view has held
a detail it fetches the way every view did before. The gate also takes
isActive, so the loading signal the auto-connect gate reads no longer leans
on the tab store keeping the active tab its group's selected one.
…d read

Only a detail load's own result clears detailLoading, and two readers that
never set the flag could invalidate that load by bumping the fetch
generation: the cross-client viewer sync poll and the older-turns page. The
load's result was then dropped as stale, and if the poll never committed
(every read failing) or a page landed instead, the session stayed loading
for good: spinner, auto-connect held shut, overlay folds stopped. The poll
overlap is common, since a load's own read can backfill the title and that
upsert is a nudge.

The poll now waits for a load in flight to land, without spending an
attempt, and polls on from there, giving up after 30 seconds behind a load
that never settles. An older-turns page is not issued while a load is in
flight; the near-top trigger fires again the next time the list is scrolled
up into the top, and the loader row pages on click.
Pin claude-agent-acp 0.89.0 and codex-acp 2.2.2 (codex 0.160.1) and
follow what the new adapters changed.

- codex-acp needs Node.js 20.3.0, and the diagnostics page now compares
  the whole Node version as the launch preflight does. A session open
  that fails because the app-server died shows the restore banner
  instead of orphaning the history, and a codex catalog override that
  codex would refuse is dropped.
- Claude titles drop every JetBrains AIR archive marker, and codex
  thread names read as codex-acp publishes them, so live and history
  titles agree.
- Codex history counts cache writes apart from fresh input; existing
  codex sessions are counted again.
- A failed turn closes with one muted line in the agent's own words for
  codex, claude, cline and qoder, live and when reopened. It is a
  system turn, so it never shifts reply alignment or fork naming, and
  it reaches exports and get_session_info.
- The slash popup, the composer's add menu and the automation editor
  show a command's argument hint.
- Backups pack codex's session_index.jsonl, where its thread names
  live. Restore merges it, and kimi's session_index.jsonl, by appending
  the lines the live copy lacks instead of skipping or replacing them.
xintaofei and others added 28 commits October 17, 2026 14:23
The automation editor and the task editor and settings dialogs show the
agent's settings as the composer's chip and popover instead of a
dropdown per option. The chip shows what will be saved: the user's pick,
or else the agent's current value. A pick applies at once and the
popover stays open; a model pick closes it while the agent's options are
read again for that model. The stacked layout keeps its labeled selects.

The chip is a pill filled with the theme color chosen in Appearance
settings, deeper on hover and while open, and the loading placeholder
is the same pill. The agent icon is drawn at its full 14px, centered on
the values. The values show in any host and give way to the icon alone
only inside a container narrower than 16rem; values that do not fit even
at their shortest are cut off at the chevron instead of running under
it.

The popover and its shorter lists scroll with the app's own scrollbar,
like the side panel. AgentIcon centers its mark in its box, so a control
that resizes the mark, such as a select item, no longer pushes it off
center.
When the composer's settings popover opened on a long model list, such
as OpenCode's, the list showed only the selected model, alone in an
empty list, until it was scrolled. The list scrolls to the selected
model as it opens, and the scroll areas around it swallowed that
scroll's event: whenever an area's overflow changes, OverlayScrollbars
checks for a reversed text direction, then stops the next scroll event,
whether from the area itself or from anything scrolling inside it, if
its own position has not moved. The virtualized list never learned that
it had moved and kept drawing the rows at its top.

Scroll areas that only scroll vertically now skip that check, and so
does the page's own scrollbar outside the workspace. The check can only
find a reversed horizontal axis, in right-to-left layouts, so their
scrollbars work as before, right to left included. Areas that scroll
horizontally keep it.

Tests run the real library and check that a vertical area and the page
never arm the scroll block, while a horizontal area still does.
Hovering a folder group's heading now reveals the Folders heading's
"add a folder" pair after its ⋯ menu. A folder opened or cloned from
there is filed into that group (appended, like "Move to group"), and a
collapsed group opens to show it. The Folders heading, the list's
context menu and the empty-workspace buttons still land new folders at
the top level.

A folder stays where it is if the group was deleted meanwhile, if it is
a worktree whose repository is open, or if it is already in the group.
A clone that finishes after the dialog was reopened elsewhere still goes
to the group it was started from.
Clicking the tab the side panel is already showing now hides the panel,
and on a phone a tap on the drawer's selected tab closes the drawer. A
first click on another tab still only switches to it. Dragging the
selected tab to reorder it, a right or Control click, and Enter or
Space on a focused tab leave the panel open, so keyboard focus is not
dropped along with the rail. Radix reports nothing for a click on the
tab it already holds, so useTabReselect reads whether the tab was
selected at pointerdown and acts at the click.

Conversation rows in the left sidebar no longer show the mark for a
conversation whose source worktree was removed. The hover bubble still
names the original path.
…Control

claude-agent-acp 0.93.0 keeps Claude Code 2.1.300 and adds
`/remote-control [name | off]`, which the adapter answers itself. codeg
reads the adapter's reply into a Remote Control state that the session
snapshot carries. While it is on, a strip above the transcript shows the
session's claude.ai/code link, a QR code for the phone and a button that
turns it off, and both idle sweeps leave the connection alone, so the
remote session outlives a closed tab.

The turn loop takes a turn's queued updates before its response, for
every agent, so an answer written right before the response stays in its
turn instead of the turn ending as empty.
Command Code becomes the nineteenth built-in agent (spacering-net#951). It is an npm CLI
whose own `command-code acp` subcommand is its ACP server, so codeg pins
`command-code@1.84.0` and installs it the way the vendor documents
(`npm i -g command-code`), launching it as `command-code` rather than the
short `cmd`, which is the system shell on Windows. Its wire name is
`command_code` and its registry id `codeg-command-code`, so custom agents
hand-registered under the package or bin names keep working.

Sign-in is the CLI's own `command-code login`, which the ACP server reuses;
an API key saved in the agent's settings reaches it as COMMAND_CODE_API_KEY,
which takes precedence over that login. History is codeg's own ACP
transcript, as for TRAE CLI. MCP servers are managed in
~/.commandcode/mcp.json in Command Code's transport schema (stdio and http),
and skills are read from Command Code's four skill directories.

The agent gets a settings panel, Command Code's icon and strings in all ten
locales; the READMEs list nineteen agents.
A Markdown image in a reply whose path is outside the conversation's
folder, such as an agent's login QR code in /tmp, showed a broken-image
icon and its alt text (spacering-net#978). It now loads through the reader the file
panel uses when that path is clicked, with the same 8 MB limit. Images
inside the folder still load through the folder-confined reader.

A network share is read only when the workspace itself is on it:
opening `//host/...`, `file://host/...` or `\\host\...` would make this
machine contact, and on Windows sign in to, the host the reply names.
Under a drive or share root, which is matched regardless of case, a
path whose lowercase form differs in length (`İ`) is refused instead of
being cut at the wrong place and read as another file.
Cline now runs each session in the cline --acp process Codeg spawns
(CLINE_SESSION_BACKEND_MODE=local). By default a session lands on any
hub daemon an earlier cline --acp left running, and there a model
switch after the first prompt never reached the requests, nor did the
model Codeg re-applies to a reopened session. Cline's own updater is
off (CLINE_NO_AUTO_UPDATE=1): it moved the pinned install to the latest
release after a session ended.

Cline closes a finished session at the next launch and stamps its end
with that moment, so the Cline history keeps the transcript's last
write as the session's end.

CodeBuddy 2.168.2's TUI starts new sessions in PTC mode, where the
model's only tool is REPL; a test pins how the history shows such a
session, one REPL card per step.
…r in the side panel

The conversation page no longer stacks the message navigator, plan and
sub-agent chips over the top-left of its messages. Its transcript publishes
them to a transcript-insights store, and the Session Details tab of the right
side panel lists them as collapsible sections: plan, sub-agents (switchable
between the current message and the whole session, with a way to load the
history above the loaded window) and the message navigator. The tab no longer
shows token usage or created/updated times; the Session Details dialog still
does. Canvas cards and the read-only transcript drawers keep their inline plan
and sub-agent chips.
…ssage navigator

The Session Details tab opens with a compact card: the agent, the title
and the status, then one row per property: model, Git branch, session
and extension IDs (both copyable), and the parent session and assistant
when there are any. The Session Details dialog keeps its full view with
token usage and timestamps.

The plan shows its progress as one segment per step, then one line per
step with the step under way highlighted; folded, it still shows the
progress and the current step.

The message navigator lists every message with its number in a
fixed-width pill (up to three digits), its label, and how many
sub-agents and files its round had. It highlights the message the
transcript shows as it scrolls, keeps its header pinned, and offers a
button back to the current message when it is out of view. Clicking a
message jumps the transcript there and opens it, one at a time and the
latest by default, to show the sub-agents its round started or resumed,
as cards that open their conversations, and the files it changed. Each
file expands to an inline diff that can switch to side by side (the
panel keeps its own choice, inline by default), opens whole in a file
tab, and opens the file from its name. The separate sub-agent section
and its scope switch are gone.

Only the rows in view are rendered, unchanged messages keep their rows
across streaming updates, and the edits of the history above the loaded
window are parsed a slice at a time before it is listed, so long
conversations stay responsive while loading, scrolling and streaming.
…th chevrons

The Session Details card opens with the conversation's title across its
full width, still wrapping to at most two lines, with the agent's icon,
name and status on the line under it. The agent tile beside the title
is gone.

The plan and message navigator headers show the chevron that folds them
before their title. It sits in the rows' left column, above the step
icons and message numbers, so each title lines up with the text of the
rows under it. Message-number pills now keep that column's width up to
three digits, so rows past the 99th line up as well.
A "waiting for task result" row whose sub-agent waits on the user opens
by itself with the prompt inside: a permission, a question or a plan
approval, answered through the sub-agent's own connection (spacering-net#973). The
row looks the task up only after the backend has reported it running to
this conversation. Closed by the user, it stays closed until a decision
they have not seen arrives; once the prompt is answered, or the
delegation has ended, "awaiting approval" gives way to "checked". The
delegate card shows "awaiting approval" for questions and plan approvals
too.

On the desktop, a sub-agent re-seeded from its parent's snapshot, after
a webview reload or in a second window, attaches with a snapshot of its
own, so a decision it was already waiting on reaches that window. Each
hydrating attach keeps the events other surfaces receive meanwhile and
applies them once routed, without repeating notifications.
…":true}

Expanding a work task's progress or completion call in the transcript
shows the whole progress message or summary, rendered as Markdown like
the task drawer's summary, followed by a localized line saying whether
the report was recorded on the work task, with the reason when it was
not. Claude Code and Codex keep only the bare {"recorded":true} ack,
which the card used to print as is. The ack is now read from every
host's result shape, and text it cannot identify is still shown
verbatim.
…Cursor's MCP settings

Cursor's ACP retry patch is triaged for the new build: all six archives
ship the run options statement unchanged and the run closure under a new
name, and the patch applies to each of them as before.

codeg wrote a Cursor mcp.json entry with only command/args/env/cwd or
url/headers, so saving or reinstalling a server from the MCP settings
dropped the fields Cursor adds on top: envFile, startupTimeoutSec, auth,
tls, placement and enabledTools, and a `type: "sse"` entry came back as
HTTP. The reader now classifies an entry the way Cursor's schema union
does, and the writer emits those fields, each validated to the shape
Cursor accepts (one malformed field makes Cursor load none of the file's
servers), plus `type` for SSE. An editor save keeps Cursor's value for
every field the user left alone, and a marketplace reinstall keeps every
field its spec does not set.

The fields no longer reach other agents' configs, where Cursor's auth
object made OpenClaw reject its whole config and pi's MCP adapter skip
the server. Kimi keeps enabledTools, which it models itself.
This one adds TRAE CLI and Command Code as built-in agents, lets a Claude Code session continue on your phone with Remote Control, and has Claude Code suggest your next prompt. The side panel gains Automations, To-dos, Issues and Pull requests tabs and now holds Agent Plan and Message navigation, the model and option pickers under the message box merge into one button, and Claude Code moves up to 0.93.0 along with seven more bundled agents.
Alongside that: a sub-agent waiting on you can be answered right where it was delegated, images in replies show even when they are outside the conversation's folder, a reply that arrives just as a turn ends is no longer lost, switching Cline's model mid-conversation takes effect, saving a Cursor MCP server in codeg keeps Cursor's own settings, and computer use moves to cua-driver 0.36.0.

## New

- **ByteDance's TRAE CLI is now a built-in agent**: codeg runs the `traecli` you installed, with its mode, model and reasoning effort pickers in the message box, its MCP servers and skills managed from codeg's settings, delegation, and history for the conversations you run in codeg, while its settings page offers Upgrade and an optional personal access token for servers and Docker. (spacering-net#933 requested by @lwxk)
- **Command Code is now a built-in agent**: install it from Settings → Agents and sign in once with `command-code login` or save an API key, and codeg runs it with its mode, model and effort pickers in the message box, its MCP servers and skills managed from codeg's settings, delegation, and history for the conversations you run in codeg. (spacering-net#951 requested by @terranc)
- **Claude Code's Remote Control works in codeg**: send `/remote-control` in a Claude Code conversation, and a strip above it shows the session's claude.ai/code link and a QR code for picking it up in the Claude app or a browser, with a Turn off button, while the session stays connected even after you close its tab.
- **Claude Code suggests your next prompt**: after a turn, the empty message box shows in grey what Claude expects you to ask next, and Tab fills it in without sending.
- **The side panel gains Automations, To-dos, Issues and Pull requests tabs** for the project of the conversation you're in, where you can check its automations and their runs, work through its to-do board, and browse its issues and pull requests (merge requests on GitLab), with Open full page one click away.
- **Agent Plan and Message navigation move from the corner of the conversation into the side panel's Session Details tab**, which opens with a card showing the title, agent, status, model, Git branch and copyable session IDs, while the plan shows its progress step by step, even when folded.
- **Message navigation follows the message you're reading**, and clicking a message jumps there and opens it to show the sub-agents its round ran, as cards that open their conversations, and the files it changed, each with an inline or side-by-side diff.
- **A sub-agent that needs you can be answered in the conversation that delegated to it**: its "Waiting for task result" row opens by itself with the permission, question or plan approval inside, and its badge turns from awaiting approval to checked once you answer. (spacering-net#973 reported by @lwxk)
- **The model, mode and other options under the message box merge into one button** that lists the current settings separated by "/", leaving out options still on their default, and clicking it opens one panel where you change each setting in place, with search for long lists such as models.
- **The automation and to-do editors show an agent's settings with the same button and panel**, instead of a dropdown for each option.
- **A folder group in the sidebar can open or clone a folder straight into itself**: hover its heading for Clone Repository and Open Folder, and the new folder lands in that group, which expands to show it.

## Improved

- **Updated bundled agents:** Claude Code ACP 0.93.0 (Claude Code 2.1.300), OpenCode 1.19.3, Cline 3.0.73, CodeBuddy 2.168.2, Grok 1.0.62, Cursor 2026.10.16, Qoder 1.1.73, Antigravity 1.4.1.
- **Computer use moves to cua-driver 0.36.0**, which codeg downloads the next time it is needed, and on Linux taking a screenshot no longer forces an agent to read the window again before it can click.
- **The sidebar's tag filter moves into View options** as its first entry, in place of the funnel button at the top of the sidebar.
- **Clicking the side panel tab that is already showing hides the panel**, and on phones tapping the selected tab closes the drawer.
- **A new automation starts in the folder the Automations page is filtered to**, instead of always the first open folder.
- **The sidebar no longer marks conversations whose worktree was removed**, and hovering one still shows its original path.
- **The built-in model catalog is refreshed** with 8,897 models from 230 providers, up from 8,894.

## Fixed

- **Images in a reply show even when they are outside the conversation's folder**, such as a login QR code an agent saved in `/tmp`, instead of a broken-image icon. (spacering-net#978 reported by @wuzhaozhongguo)
- **In the desktop app, a sub-agent that is already waiting on you shows its request in a window that reloads or opens later**, instead of the request never reaching it. (spacering-net#973 reported by @lwxk)
- **A reply that arrives just as a turn ends stays in that turn**, instead of occasionally going missing with the turn reported as ending "without producing any response".
- **Expanding a to-do's progress or completion report in its conversation shows the full text**, formatted, with a line saying whether it was recorded on the to-do, instead of a bare `{"recorded":true}` from Claude Code and Codex.
- **Switching Cline's model after the first message now takes effect**, as does the model codeg reapplies when you reopen a Cline conversation, instead of requests staying on the old model while the picker showed the new one.
- **Cline stays on the version codeg installed**, instead of updating itself to its latest release once a conversation closes.
- **Cline conversations keep the time they actually ended**, instead of jumping to the top of the sidebar with the time Cline was next started.
- **Saving a Cursor MCP server in Settings → MCP, or installing it again from the MCP Marketplace, keeps the settings Cursor adds itself**, such as `envFile`, `auth` and `tls`, and an SSE server stays SSE instead of turning into HTTP.
- **Cursor-only MCP settings no longer spread to other agents** when codeg writes a server into their configs, where Cursor's `auth` made OpenClaw reject its whole config and pi skip the server.
- **Slash commands with a colon in their name now show as one command in the message box**, such as Qoder's new `sites:` commands, and reach the agent exactly as named.
- **On the Automations page, the detail pane follows the folder filter** instead of showing an automation from another folder, and a folder closed in the sidebar shows its name in the filter instead of a number.

## Note

- **TRAE CLI 2.0 is available only on TRAE Enterprise's flagship plan**, and codeg runs the `traecli` you install with TRAE's own installer, signed in with `traecli login`.
- **Command Code needs Node.js 22 or later**, and models you add to Command Code yourself can't be picked in the message box, as it lists only its own catalog there.
- **TRAE CLI's and Command Code's first integrations leave some things out**: conversations from their own terminals can't be imported yet, one you set up as a custom agent stays separate with its own history, and so far both have been tested on macOS only.
- **With Claude Code ACP 0.92.0 and later, Claude Code makes one more request after most turns to predict your next prompt**, mostly read from the prompt cache but still counted in your usage, while automations and chat channel bots skip it.
- **Remote Control needs Claude Code signed in with a claude.ai subscription and talking to api.anthropic.com**, so it isn't available through a gateway or a custom `ANTHROPIC_BASE_URL`.
- **The Session Details tab no longer shows token usage or the created and updated times**, which the Session Details dialog, opened from a conversation's menu, still shows.
- **Cline applies Plan or Act only when it starts working on a conversation**, so switching modes after the first message has no effect until Cline changes that.
- **CodeBuddy 2.168.2 runs every step of a conversation started in its own terminal through a single REPL tool**, so such a conversation shows one REPL card per step in codeg, while conversations you start in codeg aren't affected.
- **On macOS, a codeg that opens at login may not come back after an update started from 0.35.2 or earlier**, so click its Dock icon to open it, while updates started from 0.36.0 or later aren't affected.

Thanks to @wuzhaozhongguo, @lwxk and @terranc for the reports.

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

# 发布版本 0.37.0

这一版新增了 TRAE CLI 和 Command Code 两个内置智能体,可以用 Claude Code 的远程控制在手机上接着聊同一个会话,Claude Code 还会预测你的下一条提示词。右侧面板新增了自动化、待办任务、议题和拉取请求四个标签页,计划任务和消息导航也挪进了面板的「会话详情」,输入框下方的模型和各项选项合并成了一个按钮,Claude Code 升级到 0.93.0,另有七个内置智能体更新了版本。
同期还有:等你处理的子智能体可以直接在发起委派的会话里批准,回复里会话文件夹以外的图片也能显示了,回合结束瞬间到达的回复不会再丢失,Cline 会话中途切换模型能生效了,在 codeg 里保存 Cursor 的 MCP 服务器会保留 Cursor 自己的设置,电脑操作改用 cua-driver 0.36.0。

## 新增

- **字节跳动的 TRAE CLI 成为内置智能体**——codeg 直接运行你安装好的 `traecli`,输入框里可以选模式、模型和推理强度,MCP 服务器和技能可以在 codeg 的设置里管理,支持委派,在 codeg 里进行的会话也会留下历史记录;设置页里可以「升级」,还能填写可选的个人访问令牌,方便在服务器和 Docker 上使用。(spacering-net#933 由 @lwxk 提出)
- **Command Code 成为内置智能体**——在「设置 → 智能体」里安装,用 `command-code login` 登录一次或填上 API 密钥后,codeg 就能运行它:输入框里可以选模式、模型和推理强度,MCP 服务器和技能可以在 codeg 的设置里管理,支持委派,在 codeg 里进行的会话也会留下历史记录。(spacering-net#951 由 @terranc 提出)
- **Claude Code 的远程控制(Remote Control)可以在 codeg 里用了**——在 Claude Code 会话里发送 `/remote-control`,会话上方会出现一条提示栏,显示本会话的 claude.ai/code 链接和二维码,可以在 Claude App 或浏览器里接着聊,栏上还有「关闭」按钮;远程控制开着时,即使关掉标签页,会话也会保持连接。
- **Claude Code 会预测你的下一条提示词**——回合结束后,空着的输入框里会用灰字显示 Claude 猜你接下来要说的话,按 Tab 就能填入,不会直接发送。
- **右侧面板新增「自动化」「待办任务」「议题」「拉取请求」四个标签页**,内容跟随当前会话所在的项目:可以查看项目的自动化和运行记录、处理待办任务看板、浏览议题和拉取请求(GitLab 上是合并请求),每个标签页都能一键「在完整页面中打开」。
- **计划任务和消息导航从会话左上角挪进了右侧面板的「会话详情」**,面板顶部是一张信息卡,显示标题、智能体、状态、模型、Git 分支和可复制的会话 ID;计划任务会按步骤显示进度,折叠后也看得到。
- **消息导航会跟着你正在看的消息走**,点一条消息会跳过去并展开,列出这一轮跑过的子智能体和改过的文件——子智能体卡片可以打开它的会话,每个文件都能展开看内联或左右分栏的 diff。
- **子智能体等你处理时,可以直接在发起委派的会话里批准**——「等待任务执行结果」那一行会自动展开,里面就是权限请求、提问或计划审批,处理完后徽章会从「待批准」变成「已查询」。(spacering-net#973 由 @lwxk 反馈)
- **输入框下方的模型、模式和其他选项合并成了一个按钮**——按钮上用「/」分隔列出当前的各项设置,仍是默认值的选项不显示;点开后在同一个面板里逐项调整,模型这类较长的列表还能搜索。
- **自动化编辑器和待办任务的编辑、设置对话框也改用同样的按钮和面板来设置智能体**,不再每个选项一个下拉框。
- **侧栏的文件夹分组可以直接把文件夹打开或克隆到组里**——鼠标悬停在分组标题上会出现「克隆仓库」和「打开文件夹」,新文件夹会放进这个分组,分组折叠着也会自动展开。

## 改进

- **内置智能体版本更新:** Claude Code ACP 0.93.0(Claude Code 2.1.300)、OpenCode 1.19.3、Cline 3.0.73、CodeBuddy 2.168.2、Grok 1.0.62、Cursor 2026.10.16、Qoder 1.1.73、Antigravity 1.4.1。
- **电脑操作改用 cua-driver 0.36.0**,下次用到时会自动下载;在 Linux 上,智能体截图后不必再重新读取窗口就能接着点击。
- **侧栏的「按标签筛选」挪进了「显示选项」菜单**,排在第一项,侧栏顶部的漏斗按钮去掉了。
- **再点一次右侧面板当前选中的标签页会隐藏面板**,手机上点抽屉里已选中的标签页会关闭抽屉。
- **自动化页面按文件夹筛选时,新建的自动化默认放在该文件夹里**,不再总是第一个打开的文件夹。
- **侧栏不再给源 worktree 已删除的会话加标记**,鼠标悬停时仍会显示它原来的路径。
- **内置模型目录已更新**,共 230 家供应商的 8,897 个模型(此前 8,894 个)。

## 修复

- **回复里会话文件夹以外的图片也能显示了**,比如智能体保存在 `/tmp` 里的登录二维码,不再显示成破图图标。(spacering-net#978 由 @wuzhaozhongguo 反馈)
- **桌面版里,已经在等你处理的子智能体,在刷新后的窗口或之后打开的窗口里也会显示它的请求**,不会再一直收不到。(spacering-net#973 由 @lwxk 反馈)
- **回合结束瞬间到达的回复会留在这个回合里**,不会再偶尔丢失,并报「本轮没有产生任何回复就结束了」。
- **在待办任务的会话里展开进度或完成汇报,会显示完整内容**,按 Markdown 排版,并注明是否已记录到待办任务,Claude Code 和 Codex 的会话不再只显示 `{"recorded":true}`。
- **Cline 发出第一条消息后切换模型能生效了**,重新打开 Cline 会话时 codeg 重新应用的模型也会生效,不再出现选择器显示新模型、请求却还在用旧模型的情况。
- **Cline 会保持在 codeg 安装的版本**,不会再在会话关闭后自己升级到最新版。
- **Cline 会话会记下实际结束的时间**,不会再在下次启动 Cline 时被改写成那一刻、跳到侧栏最上面。
- **在「设置 → MCP」里保存 Cursor 的 MCP 服务器,或从「MCP 市场」重新安装,会保留 Cursor 自己加的设置**,比如 `envFile`、`auth` 和 `tls`,SSE 服务器也不会再变成 HTTP。
- **Cursor 专属的 MCP 设置不会再被写进其他智能体的配置**——以前 Cursor 的 `auth` 会让 OpenClaw 整份配置失效,pi 也会跳过这个服务器。
- **名称里带冒号的斜杠命令在输入框里会显示成一个完整的命令**,比如 Qoder 新增的 `sites:` 系列命令,发给智能体的也是原样的命令名。
- **自动化页面的详情会跟随文件夹筛选**,不再显示其他文件夹的自动化;侧栏里已关闭的文件夹在筛选里也会显示名称,而不是编号。

## 注意

- **TRAE CLI 2.0 仅向 TRAE 企业版旗舰版套餐客户开放**,codeg 运行的是你用 TRAE 官方安装程序装好、并用 `traecli login` 登录过的 `traecli`。
- **Command Code 需要 Node.js 22 或更高版本**;你自己给 Command Code 添加的模型没法在输入框里选,因为它在那里只列出自家目录里的模型。
- **TRAE CLI 和 Command Code 首期接入还有一些限制**——暂不支持导入在它们自己终端里进行的会话;你之前作为自定义智能体配置的版本保持不变,历史记录各自独立;目前两者都只在 macOS 上实测过。
- **从 Claude Code ACP 0.92.0 起,Claude Code 在大多数回合结束后会多发一次请求来预测你的下一条提示词**,这次请求主要读取提示词缓存,但仍会计入用量;自动化和消息渠道机器人的会话不发这次请求。
- **远程控制需要 Claude Code 用 claude.ai 订阅账号登录、直连 api.anthropic.com**,通过网关或自定义 `ANTHROPIC_BASE_URL` 使用时不可用。
- **「会话详情」标签页不再显示 Token 用量和创建、更新时间**,从会话菜单里的「会话详情」打开的弹窗仍会显示。
- **Cline 只在开始处理会话时应用 Plan 或 Act 模式**,发出第一条消息后再切换模式不会生效,要等 Cline 自己改进。
- **CodeBuddy 2.168.2 在它自己终端里新建的会话,每一步都通过同一个 REPL 工具执行**,这类会话在 codeg 里会每一步显示一张 REPL 卡片;在 codeg 里发起的会话不受影响。
- **在 macOS 上设置了开机自启的 codeg,从 0.35.2 或更早版本发起的更新完成后可能不会自动重新打开**,点一下程序坞图标即可打开;从 0.36.0 及之后版本发起的更新不受影响。

感谢 @wuzhaozhongguo、@lwxk 和 @terranc 的反馈。
`codeg-cli run` sends a prompt to an agent through a running desktop app
or codeg-server, or a server of its own with --standalone, and prints
the reply as text, JSON or a stream of JSON events, with documented exit
codes (spacering-net#694). --permissions answers the agent's tool requests with no
window to ask in. A run can be detached and collected later with
`result` or stopped with `cancel`, get a git worktree of its own with
--worktree, or go to several agents at once, and --output-schema hands
the result back as JSON matching a schema, through a new codeg-mcp tool,
submit_result. `agents` lists and installs agents, and `automations`
lists the saved automations and runs one.

Command-line access is a switch in Settings, and conversations a run
started are marked in the sidebar and found with the Recent filter. The
desktop app puts its own codeg-cli first for its terminals and agents
and can add it to PATH. codeg-cli ships in the desktop bundle, the
server packages and the image, is installed by install.sh and
install.ps1, and is carried through the server's in-place update. See
docs/cli.md.

Also fixed on the way: chat channels answer a permission request once,
by its option kind; a runtime that cannot lock its data directory does
not start; and a folder row made twice at once is one row.
The handshake agent reports a prompt before it answers it, and the test
disconnected as soon as the report arrived. If the agent's thread paused
in between, as it can on a loaded runner, codeg dropped the connection
first: the answer was written into the closed pipe, the agent's
connection ended on that failed write, and `closed` failed with
RecvError. The test now waits for the turn to complete before it
disconnects, and `HandshakeAgent::closed` notes that it needs an agent
with nothing left to send.
… in more places

A browser could go on running an earlier release after the server was
upgraded (spacering-net#980). Static files were sent without Cache-Control, so a
browser could reuse an old page from its cache; they now go out with
`no-cache`, except the content-hashed files under `/_next/static/`.

A tab left open across an upgrade keeps the code it loaded. When the
server reports a different version than the page was built from,
checked on load and after every reconnect, the page shows a lasting
notice with a Reload button. The desktop app, development builds and a
page that is not signed in never show it, nor does a page whose own
in-app upgrade or rollback is running, since that reloads by itself.

Local images in Markdown now also show in a conversation whose folder
is unknown, by absolute path only, and in permission requests, plan
approvals and a work task's result summary, which resolve them against
the conversation's or the task's folder.
claude-agent-acp 0.92.0 and later have Claude Code predict the next
prompt after most turns, one more model request each time. Codeg turns
that off for the owners nobody types into, automations and chat-channel
bots, but owner_composes_prompts did not know codeg-cli runs (owner
`cli`). A run lets its connection go as soon as its turn has ended, so
the prediction was never shown, only paid for: the fake gateway of the
end-to-end runs got one after each run whose turn used a tool.
The text output printed each state as its Debug name in lower case,
which made AccessDenied `accessdenied`, while `status --json` and
docs/cli.md say `access_denied`. A state now gives its own name, and a
test holds those names to the JSON's.
…ndows installs

On macOS, every restart now hands over at RunEvent::Exit to a detached
relauncher that waits until the old instance has left the process table
and LaunchServices before `open -n` starts the new one, so the Dock
reuses the app's tile instead of adding a second icon.

On Windows, the installer hook stops the codeg-mcp and
codeg-computer-helper processes running from the install folder, and
their children, through the Windows API instead of PowerShell and WMI,
whose query could block an update indefinitely. An update also waits for
the old codeg.exe to be released before Tauri's running-app check.
install.ps1's WMI process lookups get a 15 s limit and fall back to
Get-Process.
…rs in light mode

Streamdown 2.7 draws its table wrapper and its code block as padded
cards around a second bordered card, so tables and fenced code in
replies, reasoning and the Markdown preview showed two borders. A table
is one rounded card around its scroll container again, with its light
body tint back. A code block keeps only its outer border: a muted title
bar holds the language on the left and the download and copy buttons
centred on the right, and the code sits flush beneath it.

Code in light mode is highlighted again. Streamdown 2.7 hands each
token's colour over as `--sdm-c`, painted only by a utility class that
is never generated from node_modules; globals.css now applies it. The
dark-mode rule that gave the code body shiki's background is removed:
with two themes shiki reports that background as one compound value a
custom property cannot hold, so the rule only ever resolved to
transparent.

The fullscreen table keeps its toolbar on screen, where the inline
toolbar's float had lifted the exit button above the top edge, and its
card hugs the table, with the same line under the header as inline
tables.

A test renders real Streamdown output and checks that each of these
rules reaches the element it is written for.
This is the first release candidate for 0.38.0. It adds codeg-cli, a command that runs agents through codeg from a terminal, a script or a CI job and prints the reply as text or JSON, while each run stays a conversation you can open and carry on in codeg.
Alongside that: a browser picks up the server's new release after an upgrade, `/deny` in a chat channel no longer gives Claude Code a lasting permission, tables and code blocks have one border again with code highlighted in light mode, macOS restarts into the Dock icon you pinned, and installing or updating on Windows no longer hangs while stopping codeg-mcp.

## New

- **codeg-cli runs agents through codeg from a terminal, a script or a CI job**: `codeg-cli -a claude_code -p "Review the latest commit"` hands the prompt to the desktop app or codeg-server running on this computer, or with `--url` and a token to a codeg-server elsewhere, and prints the reply as text, JSON or a stream of JSON events with documented exit codes, while the run is a conversation in codeg like any other. (spacering-net#694 requested by @yasin1151)
- **`--permissions` decides how a run with no one watching answers the agent's permission requests**: refuse (the default), allow reads only, allow, end the run, or leave them for you in codeg, always just this once and never "always".
- **A run can go on in the background and be collected later** with `--detach`, `result` and `cancel`, work in a git worktree of its own with `--worktree`, or go to several agents or assistants at once, and `--output-schema` has the agent hand back JSON matching a schema you give.
- **codeg-cli also lists and installs agents, lists your assistants and runs saved automations**, and `--standalone` starts a codeg-server for a single command, in a CI job say, that goes away when the command ends.
- **Settings → System → Command-line access is the switch for codeg-cli on this computer** and shows a command to try, while in the desktop app Install command-line tool puts codeg-cli on your PATH, and the app's own terminals and agents find its codeg-cli first.
- **Conversations started from the command line carry a terminal mark in the sidebar**, and Show in Recent gains Command line to list only them.
- **codeg-cli comes with the desktop app, the server packages and the Docker image**, install.sh and install.ps1 put it next to codeg-server, and from this version on codeg-server's in-place update keeps it up to date. The [command-line guide](https://github.com/spacering-net/codeg/blob/main/docs/cli.md) covers every command and option.

## Improved

- **Local images also show in permission requests, plan approvals and a to-do's Result**, as they do in replies.

## Fixed

- **A browser picks up the server's new release after an upgrade**, instead of sometimes opening the previous one from its cache, and a tab left open through the upgrade offers to reload. (spacering-net#980 reported by @wuzhaozhongguo)
- **`/approve` and `/deny` in a chat channel answer just this once and pick the answer by what it does, not by where it sits in the list**: for a call Claude Code flags as risky, `/deny` could give it a lasting permission while `/approve` and automatic approval refused it. A request with no one-time answer now waits for you in codeg.
- **Tables and code blocks in replies, thinking and Markdown previews have a single border again**, with a code block's language, download and copy buttons in a bar above the code, and code in light mode is highlighted again.
- **A table opened full screen keeps its exit button on screen.**
- **On macOS, codeg comes back after an update or a restart in the Dock icon you pinned**, instead of as a second icon next to it.
- **Installing or updating codeg on Windows no longer hangs at "Stopping codeg-mcp and codeg-computer-helper processes…"** on a PC where Windows Management Instrumentation (WMI) doesn't answer, and install.ps1 waits at most 15 seconds for it.
- **Two sub-agents delegated at the same moment into a folder codeg hadn't seen yet both start**, instead of one of them failing.

## Note

- **This is a pre-release**: in-app updates and codeg-server's in-place update don't offer it, and Docker's `latest` stays on 0.37.0. Download it from this page, or install codeg-server or the Docker image with the commands below, and once 0.38.0 is out it is offered to an rc install like any update.

  ```bash
  curl -fsSL https://raw.githubusercontent.com/spacering-net/codeg/main/install.sh | bash -s -- --version v0.38.0-rc.1
  docker run -d -p 3080:3080 -v codeg-data:/data ghcr.io/spacering-net/codeg:0.38.0-rc.1
  ```

- **Once this version has run, 0.37.0 no longer starts on the same data**, because this version adds to codeg's database, so copy codeg's data folder before you install it if you may want to go back.
- **Command-line access is on by default**: any program running under your account can use codeg-cli to run agents through codeg, as it could already read codeg's data, so switch it off under Settings → System → Command-line access if you don't use codeg-cli.
- **On Windows, codeg-cli, like codeg-server, needs the [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist) to start.**
- **On Linux, codeg-cli, like codeg-server, needs glibc 2.34 or later and OpenSSL 3**, which Ubuntu 22.04, Debian 12, RHEL 9 and later have, and there's no build for Alpine.

Thanks to @yasin1151 and @wuzhaozhongguo for the reports.

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

# 发布版本 0.38.0-rc.1

这是 0.38.0 的第一个候选版本。这一版新增了 codeg-cli:在终端、脚本或 CI 任务里通过 codeg 运行智能体,以文本或 JSON 输出回复,每次运行都是一个可以在 codeg 里打开、接着聊的会话。
同期还有:服务器升级后浏览器会用上新版本,消息渠道里的 `/deny` 不会再给 Claude Code 永久放行,表格和代码块恢复成一层边框、浅色模式下的代码重新有了语法高亮,macOS 上重启后会回到你钉在程序坞上的图标,Windows 上安装或更新不会再卡在停止 codeg-mcp 那一步。

## 新增

- **新增 codeg-cli,可以在终端、脚本或 CI 任务里通过 codeg 运行智能体**——`codeg-cli -a claude_code -p "Review the latest commit"` 会把提示词交给本机正在运行的桌面版或 codeg-server,加上 `--url` 和令牌也能交给别处的 codeg-server;回复以文本、JSON 或 JSON 事件流输出,退出码都有文档说明,每次运行都是 codeg 里的一个普通会话。(spacering-net#694 由 @yasin1151 提出)
- **用 `--permissions` 决定无人值守的运行怎么回应智能体的权限请求**——拒绝(默认)、只允许读取、允许、结束运行,或者留给你在 codeg 里处理;每次都只回应这一次,从不选「始终」。
- **运行可以转到后台、稍后再取结果**(`--detach`、`result`、`cancel`),也可以用 `--worktree` 在单独的 git worktree 里进行,或者一次发给多个智能体或助手;`--output-schema` 能让智能体按你给的 JSON Schema 交回结果。
- **codeg-cli 还能列出和安装智能体、列出助手、运行已保存的自动化**;`--standalone` 会为单条命令(比如 CI 任务里的一条)启动一个专用的 codeg-server,命令结束就随之关闭。
- **「设置 → 系统 → 命令行访问」是本机 codeg-cli 的开关**,还会给出一条可以直接试的命令;桌面版在这里另有「安装命令行工具」按钮,把 codeg-cli 放到 PATH 上,桌面版自带的终端和智能体也会优先用它自己的 codeg-cli。
- **从命令行启动的会话在侧栏带有终端标记**,「最近显示」新增了「命令行」,可以只列出这些会话。
- **桌面版、服务器安装包和 Docker 镜像都自带 codeg-cli**,install.sh 和 install.ps1 会把它装在 codeg-server 旁边,从这一版起 codeg-server 的在线升级也会一并更新它;所有命令和选项见[命令行文档](https://github.com/spacering-net/codeg/blob/main/docs/cli.md)。

## 改进

- **权限请求、计划审批和待办任务「结果」里的本地图片也能显示了**,和回复里的一样。

## 修复

- **服务器升级后浏览器会用上新版本**,不会再有时从缓存里打开旧版本,升级时一直开着的页面也会提示你刷新。(spacering-net#980 由 @wuzhaozhongguo 反馈)
- **消息渠道里的 `/approve` 和 `/deny` 只回应这一次,并按选项的含义而不是在列表里的位置来选**——以前遇到 Claude Code 标为有风险的调用,`/deny` 可能反而永久放行,`/approve` 和自动批准却会拒绝。没有「仅这一次」选项的请求,现在会留给你在 codeg 里处理。
- **回复、思考和 Markdown 预览里的表格和代码块恢复成一层边框**,代码块的语言、下载和复制按钮放在代码上方的标题栏里,浅色模式下的代码也重新有了语法高亮。
- **全屏查看表格时,退出按钮不会再跑到屏幕外。**
- **在 macOS 上,更新或重启后 codeg 会回到你钉在程序坞上的那个图标**,不会再在旁边多出一个。
- **在 Windows 上安装或更新 codeg 不会再卡在「Stopping codeg-mcp and codeg-computer-helper processes…」**——以前在 WMI 服务无响应的电脑上会一直等下去;install.ps1 查询 WMI 也最多等 15 秒。
- **智能体同时把两个子任务委派到 codeg 还没记录过的同一个文件夹时,两个都能正常启动**,不会再有一个失败。

## 注意

- **这是预发布版本**——应用内更新和 codeg-server 的在线升级都不会推送它,Docker 的 `latest` 标签也仍是 0.37.0。可以从本页下载安装,codeg-server 和 Docker 镜像用下面的命令;0.38.0 正式发布后,装了候选版本的会像平常一样收到更新。

  ```bash
  curl -fsSL https://raw.githubusercontent.com/spacering-net/codeg/main/install.sh | bash -s -- --version v0.38.0-rc.1
  docker run -d -p 3080:3080 -v codeg-data:/data ghcr.io/spacering-net/codeg:0.38.0-rc.1
  ```

- **这一版运行过之后,0.37.0 就无法在同一份数据上启动了**,因为这一版给 codeg 的数据库加了内容;之后可能还要退回 0.37.0 的话,安装前请先复制一份 codeg 的数据目录。
- **命令行访问默认开启**——以你的账户运行的任何程序都能借 codeg-cli 通过 codeg 运行智能体,就像它们本来就能读取 codeg 的数据一样;用不到 codeg-cli 的话,可以在「设置 → 系统 → 命令行访问」里关掉。
- **在 Windows 上,codeg-cli 和 codeg-server 一样,要装了 [Microsoft Visual C++ 可再发行程序包](https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist)才能启动。**
- **在 Linux 上,codeg-cli 和 codeg-server 一样需要 glibc 2.34 及以上和 OpenSSL 3**,Ubuntu 22.04、Debian 12、RHEL 9 及更新的系统都满足,暂时没有适用于 Alpine 的版本。

感谢 @yasin1151 和 @wuzhaozhongguo 的反馈。
This one adds codeg-cli, a command that runs agents through codeg from a terminal, a script or a CI job and prints the reply as text or JSON, while each run stays a conversation you can open and carry on in codeg.
Alongside that: a browser picks up the server's new release after an upgrade, `/deny` in a chat channel no longer gives Claude Code a lasting permission, tables and code blocks have one border again with code highlighted in light mode, codeg restarts into the Dock icon you pinned on macOS, and installing or updating on Windows no longer hangs while stopping codeg-mcp.

## New

- **codeg-cli runs agents through codeg from a terminal, a script or a CI job**: `codeg-cli -a claude_code -p "Review the latest commit"` hands the prompt to the desktop app or codeg-server already running on this computer, or to a codeg-server elsewhere with `--url` and its token, and prints the reply as text, JSON or a stream of JSON events with documented exit codes, while the run is a conversation in codeg like any other. (spacering-net#694 requested by @yasin1151)
- **`--permissions` decides how a run with no one watching answers the agent's permission requests**: refuse (the default), allow reads only, allow, end the run, or leave them for you in codeg, and it only ever answers for this once, never with an "always" that would write a lasting rule into the agent's settings.
- **A run can go on in the background and be collected later** with `--detach`, `result` and `cancel`, work in a git worktree of its own with `--worktree`, or go to several agents or assistants at once, and `--output-schema` has the agent hand back JSON that matches a schema you give.
- **codeg-cli also lists and installs agents, lists your assistants and runs saved automations**, and `--standalone` gives a single command, in a CI job for example, a codeg-server of its own that goes away when the command ends.
- **Settings → System → Command-line access is the switch for codeg-cli on this computer** and shows a command to try, while in the desktop app Install command-line tool puts codeg-cli on your PATH, and the app's own terminals and agents find its codeg-cli first.
- **Conversations started from the command line carry a terminal mark in the sidebar**, and Show in Recent gains Command line to list only them.
- **codeg-cli comes with the desktop app, the server packages and the Docker image**, install.sh and install.ps1 put it next to codeg-server, and from now on codeg-server's in-place update keeps it up to date. The [command-line guide](https://github.com/spacering-net/codeg/blob/main/docs/cli.md) covers every command and option.

## Improved

- **Local images also show in permission requests, plan approvals and a to-do's Result**, as they do in replies.

## Fixed

- **A browser picks up the server's new release after an upgrade**, instead of sometimes opening the previous one from its cache, and a tab left open through the upgrade offers to reload. (spacering-net#980 reported by @wuzhaozhongguo)
- **`/approve` and `/deny` in a chat channel answer just this once and pick the answer by what it does, not by where it sits in the list**: for a call Claude Code flags as risky, `/deny` could give it a lasting permission while `/approve` and automatic approval refused it. A request with no one-time answer now waits for you in codeg.
- **Tables and code blocks in replies, thinking and Markdown previews have a single border again**, with a code block's language, download and copy buttons in a bar above the code, and code in light mode is highlighted again.
- **A table opened full screen keeps its exit button on screen.**
- **On macOS, codeg comes back after an update or a restart in the Dock icon you pinned**, instead of as a second icon next to it.
- **Installing or updating codeg on Windows no longer hangs at "Stopping codeg-mcp and codeg-computer-helper processes…"** on a PC where Windows Management Instrumentation (WMI) doesn't answer, and install.ps1 waits at most 15 seconds for it.
- **Two sub-agents delegated at the same moment into a folder codeg hadn't seen yet both start**, instead of one of them failing.

## Note

- **Once 0.38.0 has run, 0.37.0 no longer starts on the same data**, because this version adds to codeg's database: codeg-server's Roll back would restore a 0.37.0 that won't start, and so would reinstalling an older desktop app, so copy codeg's data folder before you update if you may want to go back.
- **codeg-server updated in place from 0.37.0 doesn't get codeg-cli**, since 0.37.0's updater knows nothing of it: take `codeg-cli` from the server package on this page and put it next to `codeg-server`. The desktop app's update, install.sh, install.ps1 and the Docker image all bring it.
- **Command-line access is on by default**: any program running under your account can use codeg-cli to run agents through codeg, as it could already read codeg's data, so switch it off under Settings → System → Command-line access if you don't use codeg-cli.
- **On macOS, the update to 0.38.0 may still leave a second codeg icon in the Dock if codeg is pinned there**, because the version you update from does that restart: quit codeg and open it from the pinned icon, and later updates aren't affected.
- **On Windows, codeg-cli, like codeg-server, needs the [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist) to start.**
- **On Linux, codeg-cli, like codeg-server, needs glibc 2.34 or later and OpenSSL 3**, which Ubuntu 22.04, Debian 12, RHEL 9 and later have, and there's no build for Alpine.

Thanks to @yasin1151 and @wuzhaozhongguo for the reports.

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

# 发布版本 0.38.0

这一版新增了命令行工具 codeg-cli:可以在终端、脚本或 CI 任务里通过 codeg 运行智能体,回复以文本或 JSON 输出,每次运行都是一个可以在 codeg 里打开、接着聊的会话。
同期还有:服务器升级后浏览器会用上新版本,消息渠道里的 `/deny` 不会再给 Claude Code 永久放行,表格和代码块恢复成一层边框、浅色模式下的代码重新有了语法高亮,macOS 上重启后会回到你钉在程序坞上的图标,Windows 上安装或更新不会再卡在停止 codeg-mcp 那一步。

## 新增

- **新增 codeg-cli,可以在终端、脚本或 CI 任务里通过 codeg 运行智能体**——`codeg-cli -a claude_code -p "Review the latest commit"` 会把提示词交给本机正在运行的桌面版或 codeg-server,加上 `--url` 和令牌也能交给别处的 codeg-server;回复以文本、JSON 或 JSON 事件流输出,退出码都有文档说明,每次运行都是 codeg 里的一个普通会话。(spacering-net#694 由 @yasin1151 提出)
- **用 `--permissions` 决定无人值守的运行怎么回应智能体的权限请求**——拒绝(默认)、只允许读取、允许、结束运行,或者留给你在 codeg 里处理;每次都只回应这一次,从不选会在智能体设置里写下永久规则的「始终」。
- **运行可以转到后台、稍后再取结果**(`--detach`、`result`、`cancel`),也可以用 `--worktree` 在单独的 git worktree 里进行,或者一次发给多个智能体或助手;`--output-schema` 能让智能体按你给的 JSON Schema 交回结果。
- **codeg-cli 还能列出和安装智能体、列出助手、运行已保存的自动化**;`--standalone` 会为单条命令(比如 CI 任务里的一条)启动一个专用的 codeg-server,命令结束就随之关闭。
- **「设置 → 系统 → 命令行访问」是本机 codeg-cli 的开关**,还会给出一条可以直接试的命令;桌面版在这里另有「安装命令行工具」按钮,把 codeg-cli 放到 PATH 上,桌面版自带的终端和智能体也会优先用它自己的 codeg-cli。
- **从命令行启动的会话在侧栏带有终端标记**,「最近显示」新增了「命令行」,可以只列出这些会话。
- **桌面版、服务器安装包和 Docker 镜像都自带 codeg-cli**,install.sh 和 install.ps1 会把它装在 codeg-server 旁边,以后 codeg-server 的在线升级也会一并更新它;所有命令和选项见[命令行文档](https://github.com/spacering-net/codeg/blob/main/docs/cli.md)。

## 改进

- **权限请求、计划审批和待办任务「结果」里的本地图片也能显示了**,和回复里的一样。

## 修复

- **服务器升级后浏览器会用上新版本**,不会再有时从缓存里打开旧版本,升级时一直开着的页面也会提示你刷新。(spacering-net#980 由 @wuzhaozhongguo 反馈)
- **消息渠道里的 `/approve` 和 `/deny` 只回应这一次,并按选项的含义而不是在列表里的位置来选**——以前遇到 Claude Code 标为有风险的调用,`/deny` 可能反而永久放行,`/approve` 和自动批准却会拒绝。没有「仅这一次」选项的请求,现在会留给你在 codeg 里处理。
- **回复、思考和 Markdown 预览里的表格和代码块恢复成一层边框**,代码块的语言、下载和复制按钮放在代码上方的标题栏里,浅色模式下的代码也重新有了语法高亮。
- **全屏查看表格时,退出按钮不会再跑到屏幕外。**
- **在 macOS 上,更新或重启后 codeg 会回到你钉在程序坞上的那个图标**,不会再在旁边多出一个。
- **在 Windows 上安装或更新 codeg 不会再卡在「Stopping codeg-mcp and codeg-computer-helper processes…」**——以前在 WMI 服务无响应的电脑上会一直等下去;install.ps1 查询 WMI 也最多等 15 秒。
- **智能体同时把两个子任务委派到 codeg 还没记录过的同一个文件夹时,两个都能正常启动**,不会再有一个失败。

## 注意

- **0.38.0 运行过之后,0.37.0 就无法在同一份数据上启动了**,因为这一版给 codeg 的数据库加了内容:codeg-server 的「回滚」恢复出来的 0.37.0 起不来,重新安装旧版桌面版也一样;之后可能还要退回 0.37.0 的话,更新前请先复制一份 codeg 的数据目录。
- **从 0.37.0 在线升级的 codeg-server 拿不到 codeg-cli**,因为 0.37.0 的升级程序还不认识它:请从本页的服务器安装包里取出 `codeg-cli`,放到 `codeg-server` 旁边。桌面版的更新、install.sh、install.ps1 和 Docker 镜像都会带上它。
- **命令行访问默认开启**——以你的账户运行的任何程序都能借 codeg-cli 通过 codeg 运行智能体,就像它们本来就能读取 codeg 的数据一样;用不到 codeg-cli 的话,可以在「设置 → 系统 → 命令行访问」里关掉。
- **在 macOS 上,如果把 codeg 钉在了程序坞,更新到 0.38.0 的这一次仍可能多出一个 codeg 图标**,因为这次重启由更新前的版本执行:退出 codeg 后从钉住的图标重新打开即可,之后的更新不受影响。
- **在 Windows 上,codeg-cli 和 codeg-server 一样,要装了 [Microsoft Visual C++ 可再发行程序包](https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist)才能启动。**
- **在 Linux 上,codeg-cli 和 codeg-server 一样需要 glibc 2.34 及以上和 OpenSSL 3**,Ubuntu 22.04、Debian 12、RHEL 9 及更新的系统都满足,暂时没有适用于 Alpine 的版本。

感谢 @yasin1151 和 @wuzhaozhongguo 的反馈。
@ana52070
ana52070 marked this pull request as ready for review October 18, 2026 15:44
@ana52070
ana52070 merged commit ca3bc39 into main Oct 18, 2026
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.