Skip to content

CloudCLI UI v1.38.0

Choose a tag to compare

@yaleh yaleh released this 29 Sep 16:15
· 2931 commits to develop since this release

1.38.0 (2026-09-29)

New Features

  • add Playwright MCP directory to .gitignore (5c11f44)
  • asr: land the inline-only multimodal adapter as the second recogniser (AC-132) (9a36a1c)
  • chat: a resident status bar, its marks, and the turns nobody typed (c10b834)
  • chat: decide the composer footer's tier from the box's own width (cb15da7)
  • chat: disclose the resident-mode tradeoff before it is enabled (e51569b)
  • chat: draw the running turn inline below md (b24128b)
  • chat: identifier fidelity metric + voice fill-back reading (AC-114) (a56e1a3)
  • chat: prototype a touch-scoped send key for the composer (bb787bc)
  • chat: render workspace image paths in markdown (#1307) (4b98d2e)
  • chat: route a busy resident session's send to the process instead of the local queue (df558ec)
  • chat: say a compaction out loud, as one row with its summary folded in (#1295) (d450ed8), closes #1292
  • chat: scope the composer send key to the device's input capabilities (7d842d4)
  • chat: 权限模式随发送落库,客户端不再持久化 (5b61e03)
  • claude-resident: intercept the three human-facing permission entries (4db6cae)
  • claude-resident: reconcile held-work reasons from the Stop hook and the stream (e64c0e3)
  • claude-resident: refuse a bypass launch when user settings enable Remote Control (b5f2575)
  • claude: busy input joins the CLI's own queue and stays withdrawable until it starts (AC-163) (35e9401)
  • claude: resident host driver — one CLI across turns (AC-161) (8436c6f)
  • cost: show the session's Claude-generated ai-title in the /cost modal (ad95447)
  • debug-agent: an output engine that writes the transcript it forwards (c05f4fd)
  • debug-agent: drive resident host states, turn origins and the run seam (003c009)
  • debug-agent: gate the debug agent so "off" means structurally absent (4b14dd8)
  • debug-agent: hold resident debug sessions on a multiplexed host (ecca928)
  • debug-agent: seed a scenario's lifecycle mode and keep the host writer across turns (5d9d1a1)
  • e2e: Playwright toolchain + launch-profiles real-browser spec; profile create/edit UI with baseUrl/auth/contextWindow (d882915)
  • goals: 激活 GOAL-007,并把激活记录改成实测的 (a204fff)
  • goals: 立 GOAL-007 调试 Agent + 六条红先行判据(据 ADR-003 评审通过) (acc1430)
  • i18n: add Indonesian language support (#1328) (b8e572b)
  • launch-profiles: Profiles settings tab + composer profile select sends launchProfileId (AC-010) (803c71d)
  • models: explain every env row kind, including unset (fe19d09)
  • plugins: recommend GLM Usage plugin (#1323) (f05ba1f)
  • projects: per-project session name filter (backend) (507d405)
  • providers: cap each Claude session in its own systemd scope (4e25271)
  • providers: give a resident process a stable SendMessage address (11b3370)
  • providers: make a resident process's unattended turn a run (3fd1ecb)
  • providers: pick the session watcher's mechanism per root, and back off when polling (a07e7ae)
  • quay: scripts/test.sh emits per-file results for the quay tests page (e776459)
  • resident-experiments: 控制协议清单 E9 取数并定稿 proposal (7d37fd6)
  • resident-smoke: land AC-170 API-面真模型冒烟脚本、护栏判据与人证记录 (e7ab6a4)
  • resident: collapse the status bar's per-kind lease chips into one count (917916c)
  • resident: move the enable switch under the model card and retire the consent gate (6814265)
  • scripts: add suite-concurrency-check.sh — AC-103 的并发判据读数 (64e46f0)
  • scripts: gate scripts/ with strict TS and run its tests (e320cd0)
  • scripts: restart the :3001 server unit on failure and cap its V8 heap (66755b7)
  • scripts: 新增 suite-scope-check 守卫(活跃任务的自测作用域),并在 test.sh 前置调用 (ce34887)
  • scripts: 给 test.sh 加 max-runtime / silence 两条活性看门狗,阈值由实测推出 (0fded85)
  • server: resident caps from config, and an OOM fact a host can read (5cbe85d)
  • session-hosts: bind sessions 1:N, refuse a second binding, supersede before start (5ea8711)
  • session-hosts: drive Claude per-run hosts from the session-host layer (05db7d4)
  • session-hosts: drive host lifecycle from leases, with two policies (b071ac9)
  • session-hosts: lifecycle-mode preference write path and host start/close API (30ce434)
  • session-hosts: make the resident idle ceiling configurable (AC-181) (4a3cf0b)
  • session-hosts: report dropped resident sessions and sweep restart residue (0e14412)
  • session-hosts: serve the host listing over GET /api/session-hosts (ac0feb8)
  • session-title: show the live session name on every display surface (6fd914b)
  • sessions: track where a session name came from and honour ai-title (9a80839)
  • settings: close settings modal with escape and backdrop click (#1164) (3ed3be5)
  • sidebar: a draggable splitter for the sidebar width (293eb56)
  • sidebar: group forked sessions by lineage and mark branches (ed1df4d)
  • sidebar: pin expanded project header while sessions scroll (#1312) (b028e0d)
  • sidebar: project session-name filter UI (hidden bar, rules editor, keepSessionIds, filtered mark) (f24c041)
  • sidebar: resizable sidebar width (prototype, verified in a browser) (6827804)
  • sidebar: split running view into turns in flight and held-open residents (8357e62)
  • static-assets: gzip/brotli the dist bundle and SPA entry (8437e54)
  • voice: an audio-file entry into the transcription chain, behind a debug switch (57e044f)
  • voice: answer health from the user's effective config, refuse unknown provider ids (187d98d)
  • voice: dispatch the proxy path to the selected provider's adapter (fd910f7)
  • voice: isolate a capture failure from the transcription (AC-147) (f35f2a9)
  • voice: let the recogniser's declared pause capability decide 裁不裁 (488218c)
  • voice: pure DSP silence trim module for voice input (c537d60)
  • voice: register the shipped recogniser as the first adapter (9c80995)
  • voice: store the per-user voice settings on the server (c16be88)
  • workspace: close the Shell tab for resident sessions (387d684)

Bug Fixes

  • allow zrok subdomains in dev, guard SW cache against transient failures (eafd765)
  • asr: align the multimodal adapter with the real Gemini wire (9a81fb5)
  • asr: 补 AC-132/AC-133 判据的薄委托入口(capability / mime-allowlist) (3c9de66)
  • chat: a small gesture owns the transcript, by direction not distance (90393b9)
  • chat: collapse a persisted echo that meets the row still streaming it (6a5901a)
  • chat: detach the transcript follow on an up scroll key, at the key (185b886)
  • chat: Enter that confirms an IME candidate must not send on Safari (#1332) (fd424f3)
  • chat: fold a background session's stream deltas into one row (411d903)
  • chat: hide the resident switch once a session is already resident (f8382b7)
  • chat: keep the resident status bar out of the transcript's scroll box (e0a601b)
  • chat: make in-chat file references land where they point (#1256) (580be52)
  • chat: portal the resident popover out of the transcript clip (AC-177) (7b0e553)
  • claude-resident: name the websocket leaf so the root stops closing an eval cycle (8b6e7d9)
  • claude: hold the CLI open for backgrounded agents and workflows (#1291) (208c715), closes #1113 #1268
  • claude: identify a resident round by its conversation, not its model name (6a4957b)
  • claude: show session titles instead of prompts in the sidebar (#1258) (7704a90)
  • codex: restore user prompts from canonical typed rollout rows (#1277) (5ce8ed4)
  • codex: support image-only prompts (#1346) (a6d50c8)
  • composer: 桌面档位允许工具组自身换行,768 双回放不再横向溢出 (74edd76)
  • composer: 触摸设备不再显示发送键提示行,任何宽度都不显示 (c954770)
  • criteria: 两条 ASR 判据重指到 registry 架构,解开 GOAL-008 的达成死锁 (beba8cc)
  • debug-agent: scope the AC10 providers/list assertion to its own branch (b5d6c66)
  • derive session last activity from transcript content, not file mtime (e7534bc)
  • e2e: bound the criterion run itself and make a crossed ceiling name its stage (5fb9888)
  • e2e: drop the dead node:os imports that red the repo lint stage (b429a07)
  • e2e: give each run its own scratch root, prepared under a budget (092857e)
  • e2e: reclaim the run directories an earlier run left behind (18c69a1)
  • e2e: scope the session-filter editor entry to the project under test (25dac48)
  • e2e: 每个 run 用自己的 Vite dep cache,切断共享 node_modules/.vite 的重预构建作废 (a7b4d41)
  • goals: AC-103 expect 要求冷路径在 60000ms 硬上限内判绿 (1d9ec1d)
  • goals: 修 AC-126 frontmatter 的 ASCII 冒号致 YAML 解析失败 (e17fc0d)
  • i18n: merge duplicate top-level resident keys in en/zh-CN chat.json (0f42f2b)
  • i18n: 补齐 7 个 locale 缺失的 input.queue.*(排队消息 6 键) (7418671)
  • launch-profiles: import provider and websocket helpers through module barrels (fa6e459)
  • launch-profiles: import websocket helpers through the module barrel (37ea91c)
  • launch-profiles: import websocket helpers through the module barrel (461ed77)
  • launch-profiles: untrack accidentally committed node_modules symlink (fa17a8f)
  • models: gateway template merges rows and is a reversible aria-pressed toggle (4fd2917)
  • opencode: compose the provider prefix into session model ids (#1333) (544baff)
  • opencode: hide child sessions (#1344) (ed3f0bf)
  • project-workspace: keep the selected session's title in step with session_upserted (6e5b6da)
  • projects: route session-filter test imports through module barrels (1266d45)
  • providers: export createProviderTokenUsageService via the module barrel (59832bf)
  • providers: finish the address contract at the type boundary (84b60df)
  • providers: scope AC6's driver-in-delta assertion to its own branch (d320ac5)
  • providers: strip ANSI escapes from OpenCode and Cursor stderr (#1303) (f362080)
  • quay: point worker-default at the claude-fjdac gateway launcher (79b4f52)
  • quay: test.sh handles --for-task/--allow-thin/--static-checks-doc from the scoped gate (b167e28)
  • resident-experiments: 补齐 resident-experiment.mjs 的 6 处 tsc 错误 (94bff35)
  • route Enter through the composer's single submit entry (75f1630)
  • scripts: attribute every test.sh failure as infra or assert (3fe400c)
  • scripts: normalise the client assertion tally before testing it (be80f1e)
  • scripts: type scripts/resident-smoke.mjs(+test) so npm run typecheck is green again (a05471a)
  • server/providers: widen sessions-watcher-mode's poll-window slack under fleet load (b0073b9)
  • server/tsconfig: exclude __criterion-falsify-* from the tsc program (7e6d074)
  • server/tsconfig: exclude ./modules/voice/tmp from the tsc program (cfd66ce)
  • server: keep throwaway servers and host-wide tests off the operator's scopes (49c2047)
  • sessions: keep the recent-sessions payload test in step with lineage (74f5fc1)
  • settings: empty env rows are reported before a model save drops them (5dc4a34)
  • shared/ui: close the late-arm window in ActionMenu's viewport dismissal (ac1cd4c)
  • sidebar-tests: stub useResidentProviders in the two capability-module mocks (9aa412f)
  • sidebar: arm ActionMenu viewport dismissal on the next frame (35cd475)
  • sidebar: let Running collapse project groups (#1166) (7090a5d)
  • sidebar: route cross-module import through project-workspace barrel (cd48d11)
  • suite: keep the per-file child logs when a run is red or aborted (45884ca)
  • test: cap the vitest client worker pool adaptively (e0ed491)
  • tests: move the resetModules cold compile out of the case budget (73cecff)
  • tests: scope the timeout-margin criterion to its invariant, not the mechanism (9dba1f9)
  • tests: size hookTimeout from the measurement, report it in the criterion (7b2d3f9)
  • tests: 服务端阶段的并发改为上限夹取(上限 16,由实测坡度表推出) (71bedc3)
  • transcript: attribute scroll intent to its input source, not to the offset's delta (16c1678)
  • upstream electron build bug (5e73a49)
  • voice-trim: let a harness import the shipping tree, not one named file (f53524d)
  • voice-trim: scope the uniqueness scan to the harness, not to one file (28daa7e)
  • voice: a provider with its own model field ignores the shared x-voice-stt-model header (87a2554)
  • voice: AC7 enumerates the asr contract spec instead of running a second vitest (ed5da1f)
  • voice: dashscope-omni resolves an unset model to its own default; repair AC-137/138 entry order (406b0c9)
  • voice: exempt quay's own runtime state from the AC-152 residue guard (ecab901)
  • voice: isolate capture failures at the call site, not in the capture module (ee1b5fb)
  • voice: proxy-only 闸的兄弟判据输入改白名单内主机;host-bearers 收窄为出货源 (9161b88)
  • voice: the trim asks the registry for 裁不裁, not a table of its own (0ae696c)
  • voice: 让 AC6 的红点名失败子命令、退出码与它自己说的那句话 (1fe9714)
  • workspace: stop showing the resident Shell notice as a persistent banner (3b50a13)

Performance

  • cap the transcript tail window at 512 KiB and widen by the delta (c4c843d)

Refactoring

  • launch-profiles: 拆除旧实体,AC-001 黄金基准移植到新入口 (b34a662)
  • launch-profiles: 清数据库残留结构,并收拾 GOAL-001 记录 (3ff33d4)
  • providers: keep the shared compile layer reachable without closing the eval cycle (a76f151)
  • providers: relocate the shared launch-spec compile layer out of launch-profiles (1d76cac)
  • voice: name the direct path's transcript parse (a87ba53)
  • voice: one implementation of the transcription wire protocol (9e7ee00)

Documentation

  • add Gemini voice input proposal (a867913)
  • add launch profile proposal (6c900ce)
  • adr-003: 现场验证记录拆成独立文件(评审裁决 E) (691c83f)
  • adr-003: 评审通过(附 A–E 裁决)落到 canonical checkout (dec53e4)
  • adr: ADR-003 可控制的调试 Agent —— 不跑真 CLI 也能产生输出 (1e6df28)
  • adr: 记入七条开放问题的裁定,并记下决策 9 的已执行 (62aea1b)
  • adr: 记入总判定「通过」,并保留两项不由通过消除的事项 (9f86bca)
  • adr: 语音识别 provider 缝的决策记录 第二版(评审修订) (483b2c5)
  • adr: 语音识别 provider 缝的决策记录(ADR-004) (dc568d2)
  • correct the scoped-gate reading — it starts and passes (a1fea4e)
  • experiments: a1 本地会话记录中口述目标与上下文竞争者的基础比例 (9ccb4aa)
  • experiments: a2 结果修正更正说明的排版 (4e04667)
  • experiments: a2 结果写明超时次数与离线重算的音频依赖 (ca5291c)
  • experiments: a2 结果更正与现有 goal-010 的命名冲突 (d0c5f48)
  • experiments: a2 结果未通过预注册规则,不进入 goal-010 (a73c5c0)
  • experiments: a2 结果补上去掉 c1、c7 的敏感性检查读数 (9675753)
  • experiments: a2 补充条件使用上下文的离线模拟,结论不变 (346c1a1)
  • experiments: a2 语义核验,规则一致率 93.8%,结论更强 (1280271)
  • experiments: a2 预注册判定规则与冻结的真实会话上下文 (5f4b7a9)
  • experiments: 保存 qwen3.8-omni-flash 书面化实验的原始读数与脚本 (a298761)
  • experiments: 扩展集 5 条 webm 音频入库并登记理由 (9f5910c)
  • experiments: 语音链路实验记录入库(实验协议 + 标点实验) (0faa2e0)
  • goals: add exit-conditions section to GOAL-001 (e5117b7)
  • mark launch profile proposal as partially superseded by ADR-002 (42809eb)
  • ops: measure the heap ceiling's channel boundary and record why the incident replay is unfaithful (cef20f4)
  • proposal for pre-ASR silence trimming (GOAL-006), and split P2 in the old one (20a3a9c)
  • proposal for unified session lifecycle and Claude resident sessions (e88175c)
  • proposals: record the measured cross-session arrival shape (2600a9d)
  • proposals: 语音输入接入 DashScope Qwen3.8-Omni-Flash,口述直接产出书面化指令 (8207f6d)
  • proposal: use control-protocol events for turns, leases and busy input; isolate remote control (41bd6ab)
  • resident-experiments: 记录 E2/E3 基准的人工确认行(AC4) (4438319)
  • resolve open questions in launch profile proposal (7da6f45)
  • voice: proposal for actionable speech-recognition error messages (GOAL-011) (9fe6309)
  • voice: proposal for server-side capture of speech-recognition attempts (GOAL-010) (51f5cb5)
  • 语音识别 provider 缝 proposal 第二版(与 ADR 第二版对齐) (566a445)
  • 语音识别 provider 缝 proposal(设计细节与实施顺序) (caa3b62)
  • 语音输入标识符修复与时间轴压缩 proposal (57b957f)

Maintenance

  • adr: 删除误建的 ADR-999 存根 (f47561d)
  • e2e: tighten the resident-ui-layout gate comment to one line (f1cf6d7)
  • lint: ignore the voice criteria's transient scratch files (5eb18a9)
  • ops: isolate tests and the :3001 server in their own cgroups (ade2dfb)
  • ops: put the quay fleet under one shared memory ceiling (8e49b82)
  • quay: supply plugin/scripts/runner-static-gate.ts so fan-in can classify its delta (f7604c6)
  • quay: track tasks/ and quay config; drop legacy tasks/ ignore (4aacbef)
  • scripts: make server-phase-concurrency-check.sh executable (scripts/*.sh 约定 100755) (362c9c0)
  • scripts: retire suite-concurrency-check.sh with AC-103 (f974268)
  • tasks: carry the ABI-written AC tick onto the task branch (30439b5)
  • tasks: gap-e2e-data-dir-has-no-reclaimer 勾选入任务分支 (83a8132)
  • tasks: record AC-169 satisfied via task_write (501c0f9)
  • tasks: record the load-induced false red in the round's notes (fc476a6)
  • tasks: space the Touches annotation so the scoped gate resolves the criterion (8e2d794)
  • tasks: sync the ABI-written body into the worktree copy (d76b9f6)
  • tasks: 立案 gap-launch-profiles-env-injection-closed-test(GOAL-001 AC-004 结构性缺口) (f9aff6d)
  • untrack accidentally committed node_modules symlink (1289220)

CI/CD

  • release: fork release pipeline to yaleh — GitHub Release + Windows + local-server only (5abf677)

Tests

  • chat-edit-send: await the turn instead of sleeping 30ms through it (54e83c2)
  • chat: read the running turn's stop entries across the composer and the pane (8bc3226)
  • claude-resident: criterion for the idle ceiling and its held work (624a536)
  • claude-resident: narrow the cron deadline before stepping the clock (7deac21)
  • claude-resident: print the tokens the criteria name (e44916e)
  • claude-resident: read loop liveness directly in the unread-subtype leg (1abc0c6)
  • composer: 钉住触摸提示行省下的 20px,并记下改动前的对照读数 (90f696d)
  • debug-agent: cover the external-write path end to end (e22e6ad)
  • debug-agent: make the closed arm carry the root it must not use (f04e44b)
  • debug-agent: read the load event's readiness from the observer itself (e356215)
  • debug-agent: the display-identity criterion AC-136 is judged by (325a89f)
  • debug-agent: the fixture-home isolation criterion AC-127 is judged by (c8bb1ed)
  • debug-agent: 短窗口试次并入臂内终态等待,收掉最重文件的叠死等 (a78b6db)
  • e2e: anchor post-onboarding waits on the app shell, not the empty state (eb128a0)
  • e2e: anchor the env-kind spec on the main UI, not the project empty state (a71596f)
  • e2e: bound session-filter's startup path with the family's warm-up and navigation probe (069c663)
  • e2e: make the close-reachability spec independent of the consent notice (d678f36)
  • e2e: pay the AC-115 preamble's client startup before the page, and bound it (9274519)
  • e2e: real-browser spec for the session name filter (0a64846)
  • e2e: state plainly what the close-reachability reading no longer proves (97bceba)
  • e2e: the resident busy-send criterion, and the debug-agent gate it needs (21a9586)
  • gate the oom-cap hog tests behind RUN_OOM_CAP_TESTS=1 (f5bd7d7)
  • give AC-176's out-of-harness fake arms their own migrated database (66d0271)
  • harden two fleet-concurrency flakes (voice AC8 probe, model-gateway teardown) (5accfa1)
  • launch-profiles: fix event typing (c96494e)
  • launch-profiles: model-library gateway end-to-end (AC-025) (ede1b40)
  • projects: real-data criterion for the session name filter (95112dc)
  • projects: take the real-data filter criterion off this machine's clock (196c249)
  • providers: AC-001 golden-baseline provenance banner on passthrough-parity (f8d5152)
  • providers: attribute session-scope reads to this process (421b66d)
  • providers: bound the unattended-turn criterion's waits below its budget (a330009)
  • providers: measure a resident session's address end to end (b7fa4d0)
  • providers: pin the AC-028 provenance header on the context-window criterion file (deacbf2)
  • providers: re-cover the compile-path allowlist re-validation on both final spawn envs (37f1fcf)
  • providers: 为 AC-025 网关端到端判据补溯源注释 (f6d883b)
  • resident-server-restart cleanup stops only its own servers' scopes (5d208d6)
  • resident-status-bar: the clock as printed, and the count that must fall (271eccc)
  • retry the SIGKILL-then-reboot legs when a foreign boot reaped the orphan (f2cd622)
  • seed the voice fixture before the repair, not after it (d688294)
  • server: read the over-limit reap before any control, and pin the literal slice (adf651d)
  • session-hosts: assert the binding cardinality before its proxies (384954b)
  • session-hosts: declare peerName in the listing's binding contract (8b1b02b)
  • session-hosts: name the frame that actually went missing (7cc6c66)
  • session-hosts: per-run frame parity criterion for AC-155 (d16f4a3)
  • transcript-follow: 整行追加的跟住判据(夹具 + 单测) (bc66462)
  • transcript: name the AC-111 instruments as the criterion names them (302fd36)
  • transcript: print the AC-111 readings from the run itself (795bf0e)
  • voice: drive the four fake shapes the parity criterion must go red on (5cd753b)
  • voice: judge the real service process's stdout for the capture line (AC-148) (145aa1b)
  • voice: list the seam in the two module doubles that drive the mic (2506f8d)
  • voice: name a commit the baseline can be reproduced from (c4ca434)
  • voice: read the four parity groups off the shipped code (f28578e)
  • voice: record the pre-extraction parity baseline (8bff677)
  • voice: spell the module type as the repo does (8dbe90b)
  • voice: the three capture modes, and the four secrets that must not survive them (c471f1a)
  • voice: the two mic doubles follow the seam the trim now reads (c828520)