fix(feishu): stream plain replies as cards#88276
Conversation
|
Codex review: found issues before merge. Reviewed May 30, 2026, 1:07 PM ET / 17:07 UTC. Summary PR surface: Source +61, Tests +167. Total +228 across 3 files. Reproducibility: yes. at source/proof level: current main keeps plain final text on the normal message path, while the PR body shows a real Feishu p2p run where the same final text becomes a CardKit reply. Review metrics: 1 noteworthy metric.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Land only after maintainers either gate the plain-final CardKit behavior, compose it with a searchable fallback, or explicitly accept the Feishu searchability tradeoff. Do we have a high-confidence way to reproduce the issue? Yes at source/proof level: current main keeps plain final text on the normal message path, while the PR body shows a real Feishu p2p run where the same final text becomes a CardKit reply. Is this the best way to solve the issue? No as submitted: the dispatcher change and tests are focused, but changing default streaming users' plain replies into CardKit messages needs gating, fallback composition, or explicit maintainer acceptance. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 522da25932b3. Label changesLabel justifications:
Evidence reviewedPR surface: Source +61, Tests +167. Total +228 across 3 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
c090d80 to
f3bc7f7
Compare
|
@clawsweeper re-review Updated after your review:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
f3bc7f7 to
bf04b05
Compare
|
@clawsweeper re-review Addressed the active-streaming tool-summary feedback:
Verification rerun locally:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
bf04b05 to
42e997c
Compare
|
@clawsweeper re-review Addressed the assistant-start empty-card feedback:
Verification rerun locally:
|
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
c0ecfa0 to
a2aa9c1
Compare
1703261 to
1ba2023
Compare
|
Verification before merge for head Behavior addressed: Feishu Real environment tested: local repo validation plus GitHub PR CI. No fresh live Feishu tenant retest after the maintainer fix; the PR's supplied real-behavior proof covers the original plain streaming-card path, and the new unit coverage covers the voice/media preview-discard paths. Exact steps or command run after this patch: Evidence after fix: Observed result after fix: plain Feishu final replies enter the streaming card path; voice media finals discard stale text previews instead of leaving duplicate cards; regular media-only finals keep the active streamed card and send the media attachment. What was not tested: no new live Feishu tenant run after the maintainer fix. CI run 26689677607 had two repeated broad Vitest no-output timeouts on unrelated shards ( |
Summary
channels.feishu.streaming=trueas the documented streaming-card delivery path for ordinary final assistant text inrenderMode: "auto", instead of falling through to normal text bubbles.blockStreaming,streaming:falsestill sends plain messages, and tool-summary replies stay on the normal message path.Real behavior proof
channels.feishu.streaming=trueand defaultrenderMode:autoshould render ordinary final assistant text as an interactive streaming card from the first visible reply, not as an ordinary grey text bubble.codex/feishu-streaming-card-replies, headf3bc7f738c7820e53b813522e26a8a0fd97524c1) running as version2026.5.30on macOS against a real Feishu p2p bot conversation. Config hadchannels.feishu.streaming=true,channels.feishu.footer.elapsed=true,channels.feishu.footer.status=true, andmessages.visibleReplies=automatic.2026.5.27LaunchAgent gateway.openclaw gateway status --require-rpc --timeout 15000reported CLI version2026.5.27but running Gateway version2026.5.30, with Feishu enabled and connected.PR proof 88276-1621:请直接普通回复这一句,不要调用任何工具,不要发图片或附件,只回复:PATCHED_FEISHU_STREAMING_CARD_88276_1621.2026-05-30 16:48 Asia/Shanghaishows the reply under1 条回复as a white bordered card, containingPATCHED_FEISHU_STREAMING_CARD_88276_1621, with footer text已完成 · 耗时 14.5s. Redacted runtime log from the same run:streaming_mode=false, and the final Feishu UI showed the status/elapsed footer.lark-cli im +messages-searchwas not used because the local user token lackssearch:message; the live gateway/CardKit runtime log above is the API-side proof.Verification
npm exec --yes [email protected] -- pnpm exec node scripts/run-vitest.mjs run extensions/feishu/src/reply-dispatcher.test.ts— 59 tests passed.npm exec --yes [email protected] -- pnpm exec oxlint extensions/feishu/src/reply-dispatcher.ts extensions/feishu/src/reply-dispatcher.test.tsnpm exec --yes [email protected] -- pnpm exec oxfmt --check extensions/feishu/src/reply-dispatcher.ts extensions/feishu/src/reply-dispatcher.test.tsgit diff --checknpm exec --yes [email protected] -- pnpm exec node scripts/run-vitest.mjs run extensions/codex/src/app-server/event-projector.test.ts src/auto-reply/reply/agent-runner-execution.test.ts --testNamePattern "assistant message start|onPartialReply|bridges CLI assistant agent events"Risk Checklist
streaming:truenow applies to ordinary final assistant text in auto mode, matching the channel documentation.info.kind === "final"; a regression test proves plaintooltext still usessendMessageFeishuwhen streaming is enabled.Current Review State
streaming:truetool-summary delivery.