qwen-code/docs
BaboBen 83da7233a8
fix(channels): preserve DingTalk rich-text multi-image messages (#9922)
* docs(channels): design DingTalk multi-image delivery

* docs(channels): plan DingTalk multi-image delivery

* fix(channels): retain all DingTalk rich-text images

* feat(channels): carry ordered prompt images

* feat(channels): send all prompt images over ACP

* feat(channels): persist all channel images in daemon sessions

* fix(channels): clean up failed daemon image uploads

* fix(channels): deliver channel images on older daemons and unknown MIME types

* fix(channels): harden channel image delivery against malformed and rejected turns

- Drop image entries missing data/mimeType in resolvePromptImages so one
  malformed attachment degrades to a prompt without the image instead of
  throwing a TypeError that kills the whole turn (restores the pre-diff
  legacy-guard behavior for out-of-contract extension adapters).
- Require the image/ MIME prefix in channelImageName so non-image types
  whose tail spells a known extension (audio/png) are skipped with a
  warning instead of tripping the daemon store's name/content-type check
  and failing the turn.
- Roll uploaded images back when the daemon definitively rejects prompt
  admission (DaemonHttpError on the admission request, local prompt-queue
  limit), matching the webui client; admitted-turn errors and transport
  failures keep the uploads because the daemon may already reference them.
- Upload prompt images concurrently like the webui path, preserving input
  order and the existing rollback contract.
- Log failed attachment removals during rollback via sanitizeLogText.
- Point CHANNEL_IMAGE_EXTENSIONS at the daemon store's set as source of
  truth; document the ordered images contract in the README.

* fix(channels): skip oversized channel images and pin review gaps (#9922)

* fix(channels): keep channel image delivery within daemon admission limits (#9922)

- Skip channel images whose base64 decodes to zero bytes before
  uploading: the daemon store rejects empty images with 400, which
  failed the whole turn instead of degrading by omission.
- Bound the inline fallback for daemons without session_attachments:
  apply the same per-item admission gate and keep the aggregate base64
  payload under the daemon's 10mb prompt-body limit, so multi-image
  turns against older daemons degrade by omission instead of failing
  with 413.
- Reject oversized images from the base64 length before allocating the
  decoded buffer, so several oversized images no longer allocate their
  full decoded payloads concurrently before being discarded.
- Tag the skip log lines with the session id so operators can correlate
  a skipped image to its channel session.

* fix(channels): close channel image size-gate padding undercount (#9922)

The pre-decode size estimate subtracted trailing '=' padding even when the input length does not complete a quantum; Node's lenient base64 decoder ignores such stray padding, so malformed input decoding to the 8 MiB limit plus one byte slipped past the gate and the daemon's 413 then failed the whole turn. Subtract padding only for multiple-of-4 input so the estimate is a strict upper bound.

Also give the skip reason a caller-supplied label so the inline fallback for daemons without session_attachments names the inline budget instead of an attachment-store limit those daemons do not have.

* fix(channels): roll back uploads on pre-admission cancel

* fix(channels): roll back channel images when cancelled before prompt admission (#9922)

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

* fix(channels): preserve daemon session client compatibility

---------

Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
2026-08-26 14:01:43 +00:00
..
assets feat: support workspace display names (#7179) 2026-07-20 15:16:44 +00:00
design fix(channels): preserve DingTalk rich-text multi-image messages (#9922) 2026-08-26 14:01:43 +00:00
developers fix(core): keep allowlist-uncovered tools registered as deferred instead of removing them (#10075) (#10082) 2026-08-26 11:58:31 +00:00
e2e-tests fix(cli): Recover sessions across archive races (#9513) 2026-08-22 14:01:59 +00:00
images fix(web-shell): render built-in tag icons (#7024) 2026-07-17 15:33:34 +00:00
plans fix(channels): preserve DingTalk rich-text multi-image messages (#9922) 2026-08-26 14:01:43 +00:00
superpowers feat(cli): reference prior sessions via @ and add completion tabs (#7302) 2026-07-24 06:11:48 +00:00
users feat(core): add a bundled goal-draft skill that writes verifier-judgeable Goals (#10002) 2026-08-26 12:21:25 +00:00
verification/abort-controller-refactor fix(core): stop AbortSignal listener leak in long sessions (MaxListenersExceededWarning) (#4366) 2026-05-26 14:21:49 +08:00
_meta.ts feat: refactor docs 2025-12-05 10:51:57 +08:00
index.md fix: lint issues 2025-12-19 15:52:11 +08:00