Commit graph

370 commits

Author SHA1 Message Date
Shaojin Wen
2221ea0325
fix(web-shell): Refresh sidebar branch chip immediately after checkout (#8600)
The sidebar git chip only polls every 60s, so after switching branches
through the branch picker it kept showing the old branch for up to a
minute — making the checkout look like it silently failed. Wire the
picker's branch-changed callback to an immediate status refetch,
matching the composer chip's realtime behavior.
2026-08-06 13:53:27 +00:00
qwen-code-ci-bot
5173052e37
chore(release): v0.21.6 (#8598)
* chore(release): v0.21.6

* docs(changelog): sync for v0.21.6

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-05 16:11:17 +00:00
Shaojin Wen
6b4a6295a2
feat(web-shell): run read-only info commands immediately mid-turn (#8496)
Some checks failed
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 3/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 3/3 (push) Waiting to run
E2E Tests / E2E Test - macOS - shard 1/2 (push) Waiting to run
E2E Tests / E2E Test - macOS - shard 2/2 (push) Waiting to run
E2E Tests / channel-plugin E2E (nightly) (push) Waiting to run
E2E Tests / cron-interactive E2E (nightly) (push) Waiting to run
E2E Tests / web-shell Browser Regression (push) Waiting to run
SDK Java / ubuntu-latest / Java 11 (push) Waiting to run
SDK Java / ubuntu-latest / Java 17 (push) Waiting to run
SDK Java / macos-latest / Java 21 (push) Waiting to run
SDK Java / ubuntu-latest / Java 21 (push) Waiting to run
SDK Java / windows-latest / Java 21 (push) Waiting to run
SDK Java / Real daemon E2E / Java 11 (push) Waiting to run
Sync cua-driver to Aliyun OSS / Mirror cua-driver binaries to Aliyun OSS (push) Has been cancelled
* feat(web-shell): run read-only info commands immediately mid-turn

/stats, /about (/status) and /context were silently swallowed while a
turn was streaming, because their local user echo would act as a turn
boundary in applyTurnCollapse and split the active turn. Their output
is a status block, which is not a turn boundary and is not counted in
turn metrics, so only the echo needs to be skipped mid-turn.

Add appendLocalUserEchoIfIdle, which echoes when idle and skips the
echo while streaming without blocking the command, and switch these
three commands to it so their results render inline immediately even
during an active turn.

* fix(web-shell): keep streaming assistant block intact for mid-turn info commands

Address PR review. A status dispatch finalizes the active assistant
block by default, so running /stats, /about or /context mid-turn would
fragment the streaming answer around the status card and drop later
usage frames. Add an optional clearActiveText flag to the status event
and pass false from these three command dispatches, covered by
reducer-level tests.

Also collapse the echo gate into a single body (the new helper now
delegates to appendOrDeferLocalUserMessage), add App-level wiring tests
for the responding/idle behavior of /stats and /about, and surface
failed getStats via reportError instead of swallowing them.

* fix(web-shell): reset the echo user block when info output keeps streaming (#8496)

The clearActiveText: false opt-out skipped the whole clearActiveText call,
leaving the local command echo as the active user block indefinitely. A
peer client's prompt echo then merged into it, corrupting turn boundaries.
Keep the streaming assistant/thought block open on the opt-out path but
still drop the user pointer.

Also report /about load failures like /stats and /context already do, and
pin the new /context wiring plus the /stats failure path with tests.

* refactor(web-shell): centralize the mid-turn read-only status dispatch (#8496)

Address the round-3 review feedback on the mid-turn read-only commands:

- The read-only result dispatch (status block with clearActiveText:
  false plus the follow-resume) was copied verbatim at the /context,
  /stats, and /about sites, leaving the load-bearing flag enforced by
  convention at three places. Centralize it in one
  dispatchReadOnlyStatus callback next to echoLocalCommandIfIdle; the
  three .then bodies now call it with their serialized text.
- Pin the /about catch the way the sibling /stats catch is pinned:
  make collectSystemInfo throw once and assert the failure surfaces
  through console.error instead of becoming an unhandled rejection
  with zero user feedback.

* test: pin thought opt-out and serialized mid-turn status payloads (#8496)

* refactor(web-shell): consolidate read-only command echo into echoOrDeferLocalCommand (#8496)

* test(web-shell): cover /status routing and document the echo-suppression exception (#8496)

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-05 14:05:08 +00:00
Shaojin Wen
477859bb3f
feat(channels): support local gh authentication (#8461)
* feat(channels): support local gh authentication

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* test(channels): align registry catalog test and visuals with optional GitHub token (#8461)

* fix(channels): address review feedback for GitHub local gh auth (#8461)

Treat a blank replacement of an optional secret as a clear so an existing GitHub channel can no longer ship an empty or whitespace-only PAT to the daemon. Reuse the shared missing-field predicate in the editor's GitHub credential validation, wrap malformed baseUrl failures in an actionable channel error, and surface sanitized gh stderr in local authentication failures.

* fix(channels): address second-round review feedback for GitHub local gh auth (#8461)

Pin the whitespace-only token gate, the bounded gh stderr sanitization, and the required-secret blank-replacement guard with mutation-resistant tests. Log the authenticated account identity on channel connect so an out-of-band gh auth switch is visible to operators. Align test secret-source fixtures with the SDK union and complete the design doc's change footprint.

* fix(channels): address third-round review feedback for GitHub local gh auth (#8461)

* fix(channels): address fourth-round review feedback for GitHub local gh auth (#8461)

* fix(channels): address fifth-round review feedback for GitHub local gh auth (#8461)

* fix(channels): address sixth-round review feedback for GitHub local gh auth (#8461)

* fix(channels): address seventh-round review feedback for GitHub local gh auth (#8461)

* fix(channels): address eighth-round review feedback for GitHub local gh auth (#8461)

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-05 14:05:00 +00:00
顾盼
a5c637b749
feat(web-shell): add native Live Voice (#7859)
* feat(web-shell): add native Live Voice

* fix(web-shell): address review feedback for Live Voice PR (#7859)

- Quote all strings in electron-builder.yml to fix yamllint CI failure
- Gate discovery publish on liveVoiceEnabledAtBoot to avoid writing
  bearer token to disk when Live Voice is disabled (M1)
- Add child identity guard to CommandMonitor stdout/stderr handlers
  to prevent stale helper output from corrupting the new buffer (M4)
- Add exponential backoff to sent-completion delivery retry (M3)
- Skip broadcastState when setCallState/setTranscript value is
  unchanged to reduce per-audio-delta overhead (H1)
- Document sent-mode completion notification in module docstring (H2)
- Remove dead protocol/nonce aliases from readDiscoveryFile
- Fix single instance lock fall-through with process.exit(0)

* fix(cli): register realtime_voice in docs contract and env guard (#7859)

* fix(web-shell): address review feedback for Live Voice PR (#7859)

* fix(cli): discard orphaned isolated dir when parent restore fails (#7859)

* fix(web-shell): address review feedback for Live Voice PR (#7859)

* fix(serve): harden live turn recovery

* fix(desktop): restore Live Host native build

* fix(live): align native host and session isolation

* fix(acp): preserve live worker continuation lineage

* fix(live): classify provider close reasons

* fix(serve): discard unused recovered conversation dirs

* fix(live): isolate authorized realtime responses

* fix(live): preserve realtime response authority

* feat(web-shell): complete Live Voice onboarding

* fix(live): persist realtime-owned dialogue

* fix(live): preserve final speech while stopping

* Revert "fix(web-shell): address review feedback for Live Voice PR (#7859)"

This reverts commit 7110bec6b034c702bca6e28e35b93c7f70e729cd.

* Revert "fix(cli): discard orphaned isolated dir when parent restore fails (#7859)"

This reverts commit 85165f1b2ddfaa311b8be91acdd76a6f388f6204.

* Revert "fix(web-shell): address review feedback for Live Voice PR (#7859)"

This reverts commit 9199fa633e102bb8f24e4b216d322be4323eb3fc.

* Revert "fix(cli): register realtime_voice in docs contract and env guard (#7859)"

This reverts commit 6b6b1718352ef01a98a73976b5c7c4433fd14c35.

* Revert "fix(web-shell): address review feedback for Live Voice PR (#7859)"

This reverts commit e083779105199d26de3afd8ad00719a08efe3099.

* revert(live): remove remaining takeover behavior

* revert(live): restore pre-rollback implementation

* test(cli): align Live diagnostics env guard

* test(release): cover Live Host publication

* fix(ci): re-sign Live Host package before verification

* fix(serve): scope sent completion notifications to Live

* fix(web-shell): preserve live setup errors

* fix(live): align realtime backend speech lifecycle

* ci(live): publish Live Host independently

* test(cli): mock Live speech bridge handler

* test(release): align Live Host workflow contract

* fix(live): address release and lifecycle review findings

* fix(live): release completed call tracking

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-08-05 08:33:22 +00:00
易良
52e0d1b364
feat(web-shell): bind plan approval to its Todo revision (#8393)
* feat(web-shell): gate session workflow behind experimental setting

* feat(web-shell): bind plan approval to todo revision

* fix(cli): clear stale workflow revision on plan entry

* test(web-shell): pin revised workflow snapshot

* fix(cli): clear stale plan revisions on restore

* fix(cli): keep replayed history from rebinding plan revisions

History replay re-sends stale plan updates through Session.sendUpdate,
re-stamping activeTodoPlanRevision from finished plan cycles. Clear the
revision after every replay path (cold replayHistory and live non-bulk
loadSession) so a replayed snapshot can never bind a later exit_plan_mode
approval; reloaded sessions fall back to text-only approval until the next
live todo_write re-establishes the binding. Also drop the bulk-load restore
that could never be read before a plan-mode transition cleared it, and pin
the workflow gates and mode-entry clears with negative tests.

* test(web-shell): pin older plan revision in ChatPane approval test (#8393)

* test(cli): pin unbindable plan updates in approval revision test (#8393)

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(cli): clear Todo plan revision on history restore (#8393)

restoreHistory was the one history-resetting path that kept
activeTodoPlanRevision, so a restored snapshot could let a stale
revision bind the next exit_plan_mode approval. Clear it like the
sibling reset paths, pin the behavior with a test, and pin the
live-load clear ordering after the replayed updates.

* fix(cli): restore Todo stop guard clear on plan re-select (#8393)

The previous-mode guard added for the revision binding also skipped the
Todo Stop Guard trust clear on a redundant plan re-select; scope the
guard to the revision reset so every transition into plan clears the
stop guard as before. The replay-time revision clears now run in
finally blocks so a transport failure part-way through a replay cannot
leave a replayed binding on the live session, and the web-shell
exit-plan approval rule is unified in one predicate. Revision tests
assert through the observable qwenTodoApproval approval metadata
instead of the private field.

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-04 14:25:50 +00:00
C0d3N1nja97342
e7362d5d08
fix(web-shell): add explicit ::selection for message content in Firefox (#8417)
* fix(web-shell): add explicit ::selection for message content in Firefox

Firefox does not paint the default selection highlight for text whose
element chain passes through a display:contents element (the
data-user-selectable wrapper on MessageItem). The logical selection
(copy, selectionchange popup) works fine - only the visual highlight is
missing. An explicit ::selection background makes Firefox paint the
highlight where the default painting fails.

Fixes #8214

* fix: use fixed color instead of non-existent CSS variable

--selection-bg was never defined in the codebase (only
--chat-editor-selection-bg exists in App.module.css). Use a fixed
hsl(210 100% 50% / 30%) to avoid confusion.

* test(web-shell): pin ::selection rule and soften root-cause framing

Reframe the standalone.css comment and PR description as a defensive
workaround, not a confirmed root-cause fix: the data-user-selectable
wrapper is shared by user and assistant rows, and the reporter's
screenshot shows an embedding-page toolbar this package does not ship.

Add a getComputedStyle(..., '::selection') assertion to the smoke e2e so
a future cleanup cannot silently drop the rule.

* fix(web-shell): move ::selection rule to component-scoped globals.css

The defensive ::selection rule for [data-user-selectable] message content
was in standalone.css, which is only loaded by the standalone app entry
(client/main.tsx) and the e2e harness. The npm package entry
(client/index.tsx via vite.lib.config.ts) never loads standalone.css, so
embedded deployments of @qwen-code/web-shell - including the reporter of
#8214 - did not receive the rule and still saw no selection highlight.

Move it to globals.css, which is imported by App.tsx and
WebShellTranscript.tsx and therefore ships with the component-scoped
stylesheet. Verified against the lib build: the rule now appears in
dist/index.js correctly scoped under
[data-web-shell-root][data-web-shell-shadcn]. The standalone app also
loads globals.css, so the e2e smoke pin still passes.

Addresses the review finding on standalone.css:119.

* test(web-shell): pin ::selection across all rows and in the lib bundle

Address review findings on the round-3 move to globals.css:

- The smoke e2e only sampled the first [data-user-selectable] row (the
  user row in this fixture). Assert the rule on every selectable row so
  a future narrowing to user rows keeps assistant rows covered.
- Nothing asserted the rule survives in the npm lib bundle - the
  deployment this fix exists for. Add a build-artifact test that parses
  the injected component CSS in dist/index.js and pins the scoped
  [data-user-selectable] ::selection rule under [data-web-shell-root].

* test(web-shell): assert ::selection on selectable wrapper rows, not descendants

Per review: querySelectorAll('[data-user-selectable] *') counts element
descendants, not the wrapper rows themselves - a single user row renders
4+ descendants, so the >=2 invariant did not actually enforce that both
roles are present. Match the [data-user-selectable] wrappers directly and
sample one descendant per row.

* test(web-shell): match ::selection lib-bundle pin by effect, not notation

Per review (R6-1): the pin matched an exact selector substring
(including the space) and an exact prop name, coupling to the current
notation. A maintainer switching 'background' to 'background-color'
(the CSS Pseudo-Elements-4 name) would fail this test with a misleading
message while the e2e pin stayed green. Match the two selector halves
independently and accept either prop name.

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
2026-08-04 12:33:51 +00:00
carffuca
8b4994a134
fix(web-shell): keep pending background agents active (#8413)
* fix(web-shell): keep pending background agents active

* test(web-shell): cover pending agent activity edge cases

* fix(web-shell): preserve background agent elapsed time

* test(web-shell): require shared active tool status classification

* refactor(web-shell): centralize active tool status

* fix(web-shell): keep parallel agents clock monotonic

* refactor(web-shell): consolidate active tool checks and walkers (#8413)

Drop the duplicate hasActiveTool wrapper in favor of the adapters'
hasActiveAgents so the package keeps a single any-active predicate,
share one turn walker between turnOwnsCallId and turnHasActiveAgent so
the tool-carrying DisplayItem set is encoded once, and cover the
parallel-agents clock latch re-arm when a second wave of agents starts
after the group went fully terminal.
2026-08-04 06:46:14 +00:00
qwen-code-ci-bot
e946fdbd3b
chore(release): v0.21.5 (#8505)
* chore(release): v0.21.5

* docs(changelog): sync for v0.21.5

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-04 02:30:44 +00:00
Shaojin Wen
7dfc554dff
feat(review): Add structured Web Shell review results (#8402)
* feat(review): add Web Shell review artifacts

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* test(web-shell): add code review artifact visual scenario (#8402)

* fix(review): address Web Shell review artifact feedback (#8402)

* save-artifact: document why paths resolve against the daemon workspace
  root (QWEN_CODE_PROJECT_DIR) instead of cwd, and cover the relative-path
  form the skill documents with a test where the two roots differ.
* CLI/renderer contract: the renderer hand-duplicates the findings
  vocabulary and fails closed on unknown values, so name the renderer as a
  second consumer beside the CLI's lists and check in a contract fixture
  generated through the real pipeline (validateFindings -> buildReport ->
  save-artifact) that exercises every source, severity, confidence and
  outcome. Exporting the vocabulary through the SDK stays deferred: it is a
  public cross-package API change beyond this PR's seam.
* resolve-anchors now validates `line` exactly like `findings` does
  (positive safe integer); the two validators in one pipeline no longer
  disagree. Note: an in-flight `.qwen/tmp` findings file carrying `line: 0`
  fails where it previously did not.
* The renderer validates markdownReportPath (relative, no ".." segments,
  .md suffix) before it becomes a readWorkspaceFile call, resets the
  severity/confidence filters when switching artifacts, and surfaces
  heldByMeasurement so a nonzero Held count is attributable.
* save-artifact refuses low effort structurally (choices and library guard)
  instead of by prose, stats the Markdown report before reading it so a
  directory reports "not a file", and the component no longer shadows the
  DOM `document` global.
* The case-insensitive alias test now skips visibly on case-sensitive
  filesystems instead of passing vacuously.
* Comment the kept `turnOutputs.review` key and document the JSON
  companion in the user docs.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(review): address second Web Shell review artifact feedback round (#8402)

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-03 16:08:13 +00:00
carffuca
4e9e903b93
fix(web-shell): prevent table dialog close scroll jump (#8407) 2026-08-03 06:50:09 +00:00
qwen-code-ci-bot
0cbb6a1f1c
chore(release): v0.21.4 (#8424)
* chore(release): v0.21.4

* docs(changelog): sync for v0.21.4

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-03 04:52:58 +00:00
易良
fa938bdfac
feat(web-shell): gate session workflow behind experimental setting (#8391) 2026-08-03 03:14:45 +00:00
OrbitZore
41f0e3ca5d
feat(channels): add Web Shell management support for GitHub and GitLab (#8310)
Some checks failed
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 3/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 3/3 (push) Waiting to run
E2E Tests / E2E Test - macOS - shard 1/2 (push) Waiting to run
E2E Tests / E2E Test - macOS - shard 2/2 (push) Waiting to run
E2E Tests / channel-plugin E2E (nightly) (push) Waiting to run
E2E Tests / cron-interactive E2E (nightly) (push) Waiting to run
E2E Tests / web-shell Browser Regression (push) Waiting to run
SDK Java / ubuntu-latest / Java 17 (push) Waiting to run
SDK Java / windows-latest / Java 21 (push) Waiting to run
SDK Java / Real daemon E2E / Java 11 (push) Waiting to run
SDK Java / ubuntu-latest / Java 11 (push) Waiting to run
SDK Java / macos-latest / Java 21 (push) Waiting to run
SDK Java / ubuntu-latest / Java 21 (push) Waiting to run
Update ECS Runner Qwen / Update Qwen on ecs-update-64c (push) Has been cancelled
Update ECS Runner Qwen / Update Qwen on ecs-update-sg (push) Has been cancelled
* feat(channels): add Web Shell management support for GitHub and GitLab

* test(channels): update channel-registry manageable expectation for GitHub and GitLab

* test(web-shell): add gitlab manageable:false negative case for symmetry

* fix(web-shell): add GitHub/GitLab platform marks, i18n labels, and empty-state copy

* feat(web-shell): descriptor-driven groupPolicy, senderPolicy, allowedUsers for GitHub/GitLab channels

* feat(web-shell): render field descriptions below inputs in channel editor

* feat(web-shell): add reasonFilter and action_prompt_template fields with record kind support

* fix(cli): validate string-list and record kinds in assertDescriptorValue

The daemon-side store validation only accepted string, secret, boolean,
number, and enum field kinds. Channels declaring string-list or record
fields in their management descriptor (GitHub allowedUsers/reasonFilter,
GitLab action_prompt_template) could never be saved through the Web Shell.

Teach assertDescriptorValue the two new kinds and add store-level tests
covering both acceptance and rejection paths.

* fix(web-shell): prevent silent config rewrite and record crash in editor

- initialFieldValue: for existing instances with an absent enum field,
  return empty string instead of the first option. This forces the user
  to explicitly choose rather than silently writing a new value on save.
- isMissingField: guard Object.values().every() with typeof check so
  hand-edited configs with non-string record values show a validation
  error instead of throwing TypeError.

* refactor(web-shell): extract hasDescriptorSenderPolicy helper, hide empty Access section

- Extract repeated descriptor.fields.some(f => f.key === 'senderPolicy')
  into a shared hasDescriptorSenderPolicy() helper (was inline ×4).
- Conditionally render the Access section: for descriptor-driven types
  with a non-pairing policy the section would show only a bare heading
  with no content beneath it; now it is omitted entirely.

* fix(cli): accept undeclared record keys in assertDescriptorValue

record field options are UI hints for which rows to render, not a closed
set. The GitLab adapter resolves action_prompt_template by plain key
lookup and accepts any GitLab todo action_name, but the store rejected
keys outside the 9 declared options — silently bricking editing of
configs that use server-side actions the descriptor doesn't enumerate.

* fix(web-shell): harden channel editor parsing, defaults, and validation

- Guard the three record JSON.parse sites with an isRecord shape check
  so a non-object payload can't throw during render or upsert.
- Add an explicit descriptor `default` for enum fields and prefer it over
  option order when seeding a new channel, so an access-control default is
  declared intent rather than an emergent property of array order.
- Declare the GitHub reasonFilter reasons as options and validate
  string-list input against them in the form, surfacing typos before
  submission instead of failing at channel start.
- Fall back to an uppercased display-name initial (or '?') for the
  platform mark so an empty name can't render blank.

* fix(web-shell): use distinct validation message for string-list option errors

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-08-02 12:29:10 +00:00
易良
f760c15c7e
fix(todo): preserve compatibility outside active plans (#8334)
* fix(todo): preserve compatibility outside active plans

* fix(todo): distinguish completed plans with reused IDs
2026-08-02 02:28:57 +00:00
Shaojin Wen
06ead8f4ff
fix(core): unblock history pagination on oversized transcript turns (#8335)
* fix(core): ride indivisible transcript pages over the read budget

Backward history pagination dead-ended with HTTP 413 whenever a single
turn exceeded the 4 MiB page budget: a turn cannot be split across
pages, so the reader threw SessionTranscriptPageTooLargeError and the
Web Shell latched a permanent pagination error banner. Take at least
one indivisible unit per page (one aggregate record forward, one turn
backward) so pagination always makes progress; the 32 MiB response
serialization cap remains the hard ceiling.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* feat(web-shell): add retry button for history pagination error

A non-retryable transcript page failure (4xx, partial replay) latched
paginationError with no in-UI recovery short of reloading the session.
The banner now offers a retry that force-clears the latch and refetches
the same page, whose cursor was never advanced by the failed attempt.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-08-01 18:39:05 +00:00
qwen-code-ci-bot
893a97057b
chore(release): v0.21.3 (#8338)
* chore(release): v0.21.3

* docs(changelog): sync for v0.21.3

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-08-01 18:14:12 +00:00
destire-mio
1bb72091f7
fix(webui): make long tool output collapsible (#8251)
* fix(webui): make long tool output collapsible

* fix(webui): contain collapsible shell output

---------

Co-authored-by: destire-mio <248462155+destire-mio@users.noreply.github.com>
2026-08-01 14:57:55 +00:00
易良
5799b90a9c
test(web-shell): pass locale to approval renderer (#8314) 2026-08-01 13:04:45 +00:00
Dragon
e9db70a072
feat(cli): add TUI image display tool (#8217)
* feat(cli): add TUI image display tool

* fix(cli): report terminal image rendering failures

* fix(cli): disable Kitty placeholders in Warp

* fix(cli): constrain terminal image previews

* fix(core): preserve fork image tool cache prefix

* fix(cli): address display_image review feedback (#8217)

Add the missing DisplayImage zh/zh-TW locale entries (and en for parity)
that broke the i18n guard test, detect chafa via a PATH lookup instead of a
synchronous probe render during display_image execution, and reject
truncated PNGs by reading the full 24-byte header before reporting success.

* fix(web-shell): add display_image to tool display contract (#8217)

* test(cli): cover display image validation edges

* fix(cli): harden chafa executable lookup (#8217)

Resolve chafa through the mermaid renderer's hardened findExecutable and
spawn the resolved path, so a project-local node_modules/.bin/chafa is
never executed unless the user opted in. display_image is a
non-prompting Read tool, so the previous bare-name PATH resolution
allowed arbitrary code execution from a malicious repository.

Also add review-requested coverage: isTerminalImageDisplay routing, the
truncated-PNG rejection branch, the chafa stderr fallback, and the Kitty
re-emit dedup guard.

* fix(cli): address TUI image display review feedback (#8217)

- Cache rendered terminal images (bounded LRU keyed on path, mtime, size,
  shape, and renderer) so a terminal resize or a restored session no longer
  re-reads the file or re-spawns chafa for every visible image.
- Reject cmd.exe metacharacters in the model-supplied path before spawning
  chafa through a shell, closing a command-injection surface on Windows
  .cmd/.bat shims.
- Bound a failing chafa's stderr to a capped first line before rendering it
  into permanent scrollback.
- Enforce the main-agent-only display_image ban inside the tool execution
  (isInForkExecution) and fail resolveForkExecutionAllowedTools closed when
  display_image is advertised without a concrete allowlist.
- Move the fileName computation to its use site, drop misleading awaits on the
  synchronous renderer, and add Kitty/Ghostty detection plus renderer cache,
  truncation, and shell-metacharacter tests.

* fix(cli): preserve color in chafa image fallback

* feat(cli): render images directly in Warp

* fix(cli): disable native images in Warp

* test(cli): cover chafa shell path guard

* fix(cli): skip re-transmitting Kitty image payload on remount (#8217)

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
2026-08-01 12:39:52 +00:00
易良
bd85599139
feat: visualize ordinary-session plan execution (#7580)
* feat: visualize ordinary session plan execution

* fix(web-shell): complete plan workflow rendering

* fix: preserve authoritative plan state

* fix(core): isolate teammate todo state

* fix: reject ambiguous empty plan snapshots

* test(web-shell): cover workflow dialog wiring

* feat(web-shell): preview workflow before execution

* feat(web-shell): inspect workflow step details

* feat(web-shell): preserve session workflow history

* test: align failing CI tests with plan-isolation behavior

SubAgentTracker: the emitter now guards subagent TodoWrite results
(tool-call-emitter emitResult early-returns on subagentMeta), so a
subagent todo no longer promotes into a session-level plan. Flip the
stale assertion to expect no plan emission, mirroring the dedicated
guard test in tool-call-emitter.test.ts.

HistoricalPlanExecution: the pagination fixture's onLoadOlderHistory
returned Promise<void>, but PlanExecutionHistoryProvider requires
Promise<boolean> and throws 'Unable to load earlier session history'
on a falsy resolution. Production wires loadOlderHistory (resolves
true after layout); return true in the fixture to model a successful
load.

* refactor: simplify session plan execution workflow

* fix(web-shell): preserve split plan approval workflow

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
2026-08-01 10:48:30 +00:00
ytahdn
554c5e44ba
feat(web-shell): support mutable default mid-turn messages (#8229)
* feat(web-shell): support mutable default mid-turn messages

* fix(serve): register mid-turn removal telemetry route

* test(serve): update telemetry route totals

* fix(test): add session_mid_turn_message_mutation to expected features list

* fix(webui): forward clientId on cross-session mid-turn removal (#8229)

- Forward the session clientId in the cross-session removeMidTurnMessage
  branch so the bridge's exact-originator match can succeed; without it the
  removal resolved to an undefined originator and could never remove the
  message stamped at enqueue.
- Strip a misaligned/malformed messageIds from mid_turn_message_injected in
  asKnownDaemonEvent instead of rejecting the whole event, mirroring the
  sidechannel parser so a buggy daemon can't silently lose the injection
  signal.
- Log a mid-turn removal miss in the bridge like the enqueue/pending-removal
  siblings, to make removal races diagnosable from daemon logs.

* fix(web-shell): exclude annotations from mid-turn path and harden idle cleanup (#8229)

* fix(web-shell): add container-type to .queuedPrompts so @container query applies (#8229)

* fix(web-shell): harden mid-turn dedupe and capability gate per review (#8229)

- removeInjectedFromQueue now matches by id first (position-independent)
  and falls back to text only when no id match exists, so two same-text
  sends can't remove the wrong row and double-deliver.
- Thread canMutateMidTurn into useQueuedPrompts and gate the mid-turn
  delete/edit mutation on it, so the keyboard path can't hit a DELETE
  route the daemon doesn't advertise.
- asMidTurnMessageInjectedData omits a malformed messageIds key instead
  of leaving a present undefined, matching the sidechannel parser.
- Narrow MidTurnQueueItem.midTurnState, document the load-bearing effect
  order, and make clearQueuedPrompts return false on a no-op clear.

* fix: harden mid-turn removal per review (log escape, cross-session client id) (#8229)

- Escape the caller-controlled messageId (and sessionId) in the mid-turn
  removal-miss stderr line to prevent log injection (CWE-117).
- Forward the target session's persisted client id on cross-session mid-turn
  removal so the bridge's exact-originator match no longer rejects valid
  removals after a session switch with per-session client ids.
- Strengthen tests: distinct-id independence for two queued messages, deferred
  removal proving the composer waits for daemon removal, and the active-turn
  delete failed-action flag.

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
2026-08-01 10:41:29 +00:00
qwen-code-dev-bot
ca07ae469e
fix(web-shell): deduplicate permission options with same display label (#8250)
* fix(web-shell): deduplicate permission options with same display label

When the server sends duplicate permission options (e.g. two allow_once
entries with identical labels), the Web Shell renders duplicate buttons.
Add a deduplicateByLabel pass after ordering to collapse options that
resolve to the same i18n key or raw label, keeping the first occurrence.

Fixes #8248

* fix(web-shell): deduplicate permission options by id, not i18n category (#8250)

* fix(web-shell): prefer server-provided option labels over i18n override (#8250)

* fix(web-shell): use data-option-id for ordering test assertions (#8250)

* fix(web-shell): document server-label precedence and test empty-label fallback (#8250)

* fix(web-shell): reuse memoized display options for initial selection (#8250)

* fix(web-shell): localize permission options, using server label only on i18n-key collision (#8250)

* test(web-shell): re-add label assertions to option ordering test (#8250)

* fix(web-shell): localize plan-mode restore option, never render blank option (#8250)

Give restore_previous its own i18n key so plan mode stops colliding with proceed_once and renders fully localized in every language. The collision fallback now degrades an empty server label to the localized string instead of an unlabeled button, and the selection reset stays keyed to request identity so a mid-request option change cannot re-enable a second confirm.

* test(web-shell): cover collision guard server-label fallback (#8250)

* test(web-shell): guard reset-effect lifecycle and double-submit in ToolApproval (#8250)

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-08-01 08:04:21 +00:00
Shaojin Wen
baf9b76ae6
fix(web-shell): isolate automatic recap by session (#8262)
* fix(web-shell): isolate automatic recap by session

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(web-shell): cover all session-switch paths in auto-recap guard (#8262)

* fix(web-shell): add stale-recap diagnostic logging and clear-screen test (#8262)

* fix(web-shell): reset recap block count on clear and cover /resume guard (#8262)

* test(web-shell): cover connection.sessionId change in auto-recap guard (#8262)

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-08-01 05:56:57 +00:00
ytahdn
d213c8519a
fix(web-shell): stabilize mobile composer after resume (#8263)
* fix(web-shell): stabilize mobile composer effects

* fix(web-shell): tear down all specular listeners on WebGL context loss (#8263)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-01 05:08:13 +00:00
ytahdn
eb61dd062a
fix(web-shell): compact advanced tables in narrow messages (#8264)
* fix(web-shell): compact narrow markdown table toolbar

* fix(web-shell): keep accessible names in compact table toolbar (#8264)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
2026-08-01 05:07:37 +00:00
易良
eabf312a06
feat(autofix): unify local and CI flows in one skill (#8121)
* feat(core): add current PR autofix controls

* fix(core): align autofix ci status wording

* feat(core): add current PR Autofix watcher

* feat(cli): route Autofix watcher ticks

* fix(autofix): fail closed on invalid watchers

* fix(acp): reject malformed autofix ticks

* fix(autofix): stop malformed watcher jobs

* fix(autofix): preserve unrelated cron jobs

* fix(autofix): separate watcher command from workflow skill

* test(autofix): cover headless watcher delivery

* test(autofix): cover watcher safety edges

* test(autofix): cover watcher failure paths

* fix(autofix): preserve non-watcher cron jobs

* fix(cli): fail closed on malformed autofix ticks

* test(cli): type autofix child process mock

* test(autofix): align malformed watcher coverage

* test(autofix): assert detached head skips gh

* fix(autofix): close watcher control gaps

* fix(autofix): preserve ordinary cron queue semantics

* fix(autofix): extract shared constants, validate job id, broaden off filter

* test(autofix): cover malformed watcher cleanup

* refactor(autofix): keep current PR controls minimal

* feat(autofix): reuse project skill for local runs

* fix(autofix): harden local review boundaries

* fix(autofix): enforce nested review containment

* fix(autofix): require local repository trust
2026-08-01 02:40:25 +00:00
han
a822ee4bfb
fix(web-shell): quiet background task polling failures (#7923)
* fix(web-shell): quiet background task polling failures

* fix(webui): address task polling review suggestions

* test(webui): cover task polling error classification

---------

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-08-01 02:04:06 +00:00
ytahdn
1e2932a637
feat(web-shell): add artifact downloads (#8234)
* feat(web-shell): add artifact downloads

* fix(web-shell): scope review download state per file and cancel on unmount (#8234)

* fix(web-shell): restore mount ref under StrictMode and test review MIME mapping (#8234)

Reset mountedRef in the effect setup so React StrictMode's dev-time
double-mount no longer leaves it false and silently cancels artifact and
review downloads. Move getReviewDownloadMimeType into artifactUtils and
cover the extension-to-MIME mapping with a unit test.

* test(web-shell): cover ReviewChanges cancellation-on-unmount path (#8234)

* test(web-shell): assert artifact download MIME type (#8234)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-08-01 00:40:57 +00:00
ytahdn
6dcb73c1fa
fix(web-shell): keep pasted text visible (#8230)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-31 15:39:10 +00:00
Shaojin Wen
ab30330da8
fix(web-shell): adaptive dropdown width for long model names (#8220)
The toolbar popover used a fixed 18rem width, truncating long model
names in the dropdown list. Change to max-content so the popover
adapts to its content width (capped at the available viewport width).

Also add title attributes on dropdown items and the model trigger
button so the full name is accessible via hover and screen readers.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-07-31 11:59:08 +00:00
Shaojin Wen
a5e2703865
fix(web-shell): localize built-in agent type names in zh-CN (#8209)
SubAgent type identifiers (general-purpose, Explore, etc.) were rendered
verbatim in the UI. Add agentType.* i18n keys and a localizeAgentTypeName()
helper so Chinese users see 通用/探索/状态栏设置 instead of raw English
identifiers. User-defined agent names still display as-is.
2026-07-31 09:43:29 +00:00
ytahdn
7fab05a4a4
refactor(web-shell): simplify plugin page action button labels (#8174)
* refactor(web-shell): simplify plugin page action button labels

Shorten the create/add button text on the four plugin manager tabs:
- Extensions: 'Add Extension' / '添加扩展' → 'Add' / '添加'
- MCP Servers: 'Add MCP Server' / '添加 MCP 服务器' → 'Add' / '添加'
- Skills: 'Upload skill' / '上传技能' → 'Upload' / '上传'
- Agents: 'Create Agent' / '创建智能体' → 'Create' / '创建'

* fix(web-shell): give extension install dialog its own title key (#8174)

---------

Co-authored-by: ytahdn <ytahdn@users.noreply.github.com>
2026-07-31 07:41:59 +00:00
qwen-code-ci-bot
0d3473cb4d
chore(release): v0.21.2 (#8200)
* chore(release): v0.21.2

* docs(changelog): sync for v0.21.2

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-07-31 05:22:46 +00:00
dreamWB
a182bdf618
fix(web-shell): constrain session details and add copy action (#8127)
Some checks are pending
E2E Tests / E2E Test - macOS - shard 1/2 (push) Waiting to run
E2E Tests / E2E Test - macOS - shard 2/2 (push) Waiting to run
E2E Tests / channel-plugin E2E (nightly) (push) Waiting to run
E2E Tests / cron-interactive E2E (nightly) (push) Waiting to run
E2E Tests / web-shell Browser Regression (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:docker - shard 3/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 1/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 2/3 (push) Waiting to run
E2E Tests / E2E Test (Linux) - sandbox:none - shard 3/3 (push) Waiting to run
* fix(web-shell): constrain session details and add copy action

* fix(web-shell): harden constrained session details

* fix(web-shell): close session details review gaps

* fix(web-shell): address session details follow-up
2026-07-31 02:25:44 +00:00
ytahdn
e379ea4e53
feat(web-shell): enhance composer and empty-session animations (#8098)
* feat(web-shell): enhance composer animations

* fix(web-shell): refresh DPR on resize and cover animation a11y guards

Re-read devicePixelRatio inside each resize so the specular composer
effect and the new-session dot field keep a correctly sized backing
store when the page zoom or display scale factor changes. Add
component-level coverage for the prefers-reduced-motion guards and for
the typewriter replay after the empty editor loses focus.

* fix(web-shell): localise specular highlight, fix rotation direction, add idle bail-out (#8098)

* fix(web-shell): correct specular angle wrap and dot field pointer baseline (#8098)

* fix(web-shell): paint static dot grid and idle animation loops (#8098)

* fix(web-shell): reset specular proximity on pointer leave and test WebGL cleanup (#8098)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
2026-07-31 02:20:27 +00:00
qqqys
b0c0cc3338
feat(web-shell): manage pairing approvals (#8081)
* feat(web-shell): manage pairing approvals

* test(web-shell): cover pairing approval failures

* fix(web-shell): avoid stale pairing approval errors

* test(web-shell): cover pairing revoke cancellation

* fix(web-shell): prevent pairing approval races

* fix(web-shell): address review feedback on pairing approvals (#8081)

* fix(web-shell): keep revoke confirm title fallback type-safe (#8081)

---------

Co-authored-by: qwen-code-dev-bot <269191875+qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-07-30 15:58:23 +00:00
ytahdn
0a3098a279
feat(web-shell): add contextual task panels (#7929)
* feat(web-shell): add contextual task panels

* fix(web-shell): harden contextual task panels

* fix(web-shell): preserve side task titles

* fix(web-shell): address review feedback on context panels PR (#7929)

- Add POST /session/:id/side-task to telemetry route catalog (51 routes)
- Increase SDK browser bundle size limit to 184KB
- Fix duplicated data-testid="chat-pane" → "chat-pane-container" on container
- Gate sourceType behind session_source_metadata capability check
- Add removeSession cleanup after killSession in !res.writable path
- Add i18n key sideTask.renameFailed for error fallback
- Add unit tests for selectVisibleHistoryRecords invariant

* fix(cli): update telemetry-catalog route drift guard to 51 routes (#7929)

* fix(web-shell): address review feedback round 2 on context panels PR (#7929)

- Fix /fork sider discarding createSideTask() return value: show toast
  when side tasks are unavailable
- Fix layout feedback loop: availableWidth no longer depends on
  environmentPanelVisible since the CSS overlay does not change the
  chat pane DOM width
- Remove dead environmentPanelSuppressed state (never set to true)
- Restore setArtifactPanelOpen(false) in closeArtifactPanelTab when
  the last tab is closed
- Extract agentDisplayName(task) to a local variable to avoid triple
  invocation per render

* fix(web-shell): dedupe completed background agents in environment panel (#7929)

getEnvironmentAgentTasks correlated a transcript tool card with the live
/tasks snapshot only on toolUseId, the notification taskId, and a
<subagentType>-<callId> derived id. A completed background agent can lose
that linkage (its live task carries no usable toolUseId and its daemon id
is general-purpose-<internalId>), so the trailing loop appended the live
task as a second entry. Add a conservative content fallback (prompt, or
description+subagentType) mirroring the daemon's legacy resolver.

* feat(web-shell): support side tasks during active turns

* fix(web-shell): deduplicate completed subagents and gate sourceType on capability (#7929)

* fix(web-shell): restore background agent reconciliation and fix agent dedupe (#7929)

Restore the one-shot subagent reconciliation for inline background Agent tool
cards. Persisted notification records do not always retain a toolUseId, so the
SSE discrete-notification path alone can leave a card stuck in Running; the
documented fallback resolves pending cards through the subagent endpoint after
catch-up, reconnect, and terminal notifications.

Also stop the loose description content fallback in getEnvironmentAgentTasks
from claiming a live task that another transcript tool call already links
precisely (by toolUseId, message taskId, or derived id). Two agents sharing a
description previously collapsed into one: the fallback stole the linked task,
its owner re-matched the same task, and the orphan was dropped.

* fix(web-shell): address critical review feedback on context panels (#7929)

* fix(web-shell): reconcile side-task state across sessions and listings (#7929)

* fix(web-shell): preserve contextual panel fallbacks

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
2026-07-30 13:45:30 +00:00
ytahdn
84bb09bf20
fix(web-shell): preserve approved tool results (#8099)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-30 09:01:27 +00:00
ytahdn
81367b562c
fix(web-shell): make question submission retryable (#8096)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-30 08:58:12 +00:00
ytahdn
0c0bc5e92a
fix(web-shell): add prompt send retry feedback (#8106)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-30 08:49:43 +00:00
ytahdn
a95510cb7c
fix(web-shell): translate legacy skills invocations (#8103)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-30 07:42:00 +00:00
ytahdn
0ae7757b0b
fix(web-shell): improve artifact previews (#8078)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-30 05:07:24 +00:00
Shaojin Wen
cc2cddd418
fix(web-shell): show server queue status for pending messages (#8065)
* fix(web-shell): show server queue status for pending messages

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(web-shell): hide insert for server-queued prompts

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-07-30 04:26:48 +00:00
ytahdn
d328dd3299
fix(web-shell): stabilize enhanced table controls (#8041)
* fix(web-shell): stabilize enhanced table controls

* fix(web-shell): stabilize table detail scrolling

* fix(web-shell): preserve fixed table widths

* fix(web-shell): address review feedback on enhanced table controls (#8041)

* fix(web-shell): remove dead branch and cover mixed column sizing (#8041)

* test(web-shell): cover frozen-shadow resize fallback and pin column-width divisor (#8041)

* refactor(web-shell): remove cell widths ignored under fixed table layout (#8041)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-07-30 02:52:35 +00:00
samuelhsin
26600896d5
feat(web-shell): add split pane header action slot with overflow (#7808)
* feat(web-shell): add split pane header action slot with overflow

Let hosts render per-session actions in each split pane header, collapsing them into a … menu when the pane is too narrow.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(web-shell): add pane header actions PR screenshots

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web-shell): tighten pane header overflow measurement

Drop the per-render children effect dependency that rebuilt ResizeObserver during streaming, and reserve workspace-tag width when computing available header space.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web-shell): address pane header overflow review blockers

Mount host actions in only one tree, and wrap overflow entries as DropdownMenuItems so Radix selection and keyboard navigation work.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web-shell): keep pane header actions alive across overflow

Flatten Fragment host actions before building the overflow menu, and keep the same host instances mounted when collapsing so stateful actions are not reset.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web-shell): address pane header overflow review suggestions (#7808)

* fix(web-shell): proxy overflow clicks via action slots

Wrap host pane actions in stable slots so the overflow menu can activate interactive descendants without requiring opaque custom components to forward internal data attributes.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web-shell): address overflow menu review suggestions (#7808)

* fix(web-shell): harden pane header overflow actions (#7808)

Restore the 8px gap between the built-in maximize/close controls, ignore
aria-hidden glyphs when labelling overflow items, omit non-interactive
children from the overflow menu, and document the popover constraint on
renderHeaderActions. Refreshes the design doc to match the mount-once
implementation.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: Qwen Code Bot <qwen-code-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen Code Autofix <qwen-code-autofix@users.noreply.github.com>
2026-07-29 13:06:48 +00:00
ytahdn
6672573433
fix(web-shell): reduce composer input latency (#8015)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-29 08:06:53 +00:00
ytahdn
a1a03fd7e7
fix(web-shell): prefer artifact type metadata in cards (#7973)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-29 07:57:45 +00:00
ytahdn
f485970d61
feat(web-shell): refine advanced table controls (#7999)
Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
2026-07-29 07:37:30 +00:00
qqqys
7836c919bf
fix(web-shell): polish Channel pairing requests (#7997)
* fix(web-shell): polish Channel pairing requests

* fix(web-shell): localize pairing transport failures

---------

Co-authored-by: qwen-code-dev-bot <269191875+qwen-code-dev-bot@users.noreply.github.com>
2026-07-29 06:36:10 +00:00