Skip to content

feat: optimize chat markdown rendering#1894

Merged
zerob13 merged 7 commits into
devfrom
feat/markstream-chat-rendering
Jul 8, 2026
Merged

feat: optimize chat markdown rendering#1894
zerob13 merged 7 commits into
devfrom
feat/markstream-chat-rendering

Conversation

@zhangmo8

@zhangmo8 zhangmo8 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Closes #1897

What this PR optimizes

This PR keeps DeepChat's current chat DOM/scroll model and uses markstream-vue more deliberately inside each Markdown message. It optimizes both states:

  • Streaming / generating Markdown: smooth, low-frame-budget incremental rendering.
  • Completed / static Markdown: responsive long-document scrollback with MarkStream node virtualization.

It intentionally does not replace the outer MessageList with a virtual timeline in this slice, because DeepChat's current row-level behavior also owns search, capture, spotlight jump, artifacts, tool calls, and scroll anchoring.

Concrete rendering behavior

Streaming assistant Markdown

MarkdownRenderer now passes explicit chat streaming settings to markstream-vue:

  • mode="chat"
  • final=false
  • smooth-streaming="auto"
  • typewriter=true
  • code-block-stream=true
  • fade=false
  • small incremental batch settings:
    • initial batch: 10
    • render batch: 14
    • render delay: 8ms
    • render budget: 3ms
    • parse coalesce: 12ms

This favors smooth token flow and avoids large per-token DOM commits.

Completed/static Markdown

Completed chat Markdown now uses MarkStream's completed-content path:

  • final=true
  • smooth-streaming=false
  • typewriter=false
  • code-block-stream=false
  • node-virtual="auto"
  • max-live-nodes=260
  • live-node-buffer=80
  • viewport-priority + deferred offscreen nodes when virtualization is safe

This keeps long completed responses responsive without changing DeepChat's outer message windowing.

Compatibility guardrails

  • Chat search: disables Markdown node virtualization and deferral so DOM search/highlight can see mounted nodes.
  • Search-result messages: also disable Markdown virtualization.
  • Screenshot/capture: disables Markdown virtualization while capture is active to avoid missing deferred/virtualized content during stitched screenshots.
  • Streaming messages: never use node virtualization while actively generating.
  • Artifact Markdown preview / Workspace Markdown preview: explicitly render as completed, non-streaming, non-virtualized content so non-chat surfaces keep stable full DOM behavior.
  • Session switch: clears message height measurements before loading the next session to avoid stale row estimates.
  • Send-time jitter: estimates the empty pending assistant placeholder near its real spinner-row height to avoid a submit-time bottom-scroll correction jump.
  • Stream-start flicker: keeps the pending assistant row visible until the first real assistant chunk is mounted, then reuses the placeholder render key so Vue patches the row instead of remounting it.
  • Existing custom renderers preserved: Monaco-backed code blocks, artifact preview, Mermaid, references, and link navigation remain wired through scoped MarkStream custom components.

Key files

  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • src/renderer/src/components/message/MessageBlockContent.vue
  • src/renderer/src/components/chat/MessageList.vue
  • src/renderer/src/pages/ChatPage.vue
  • src/renderer/src/components/artifacts/MarkdownArtifact.vue
  • src/renderer/src/components/sidepanel/viewer/WorkspacePreviewPane.vue

Tests

  • pnpm exec vitest --config vitest.config.renderer.ts test/renderer/components/MarkdownRenderer.test.ts test/renderer/components/message/MessageBlockContent.test.ts test/renderer/components/MessageList.test.ts test/renderer/components/ChatPage.test.ts test/renderer/components/WorkspacePreviewPane.test.ts test/renderer/components/MarkdownArtifact.test.ts
  • pnpm run format
  • pnpm run i18n
  • pnpm run lint
  • pnpm run typecheck:web
  • pnpm exec vitest --config vitest.config.renderer.ts test/renderer/performance/chatRendering.perf.test.ts
  • pnpm exec vitest --config vitest.config.renderer.ts test/renderer/composables/useMessageWindow.test.ts test/renderer/components/MessageListRow.test.ts test/renderer/components/MessageList.test.ts test/renderer/components/ChatPage.test.ts

Notes

No benchmark numbers are claimed here. The PR is based on MarkStream's documented chat/performance presets plus focused tests for the integration and compatibility guardrails.

Summary by CodeRabbit

  • New Features
    • Improved chat Markdown rendering with explicit streaming/final modes and more predictable node virtualization for long messages.
    • Added controls to disable Markdown virtualization during chat search and message capture.
    • Standardized preview/artifact Markdown rendering as non-streaming and non-virtualized.
  • Bug Fixes
    • Reduced chat send jitter by stabilizing pending assistant placeholder rendering.
    • Improved message height measurement across streaming and session switches (including render-key based reuse).
  • Documentation
    • Added plans/specs and a “chat send jitter” issue write-up for the rendering optimization.
  • Chores
    • Updated MarkStream and stream-monaco versions.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 511ef73f-3305-41fa-9870-ba504d8594ee

📥 Commits

Reviewing files that changed from the base of the PR and between 6be74a5 and 41737c9.

📒 Files selected for processing (8)
  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • src/renderer/src/components/message/MessageBlockContent.vue
  • src/renderer/src/composables/message/useMessageWindow.ts
  • src/renderer/src/pages/ChatPage.vue
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/MessageList.test.ts
  • test/renderer/components/message/MessageBlockContent.test.ts
  • test/renderer/components/message/MessageItemAssistant.test.ts
🚧 Files skipped from review as they are similar to previous changes (8)
  • src/renderer/src/composables/message/useMessageWindow.ts
  • test/renderer/components/message/MessageBlockContent.test.ts
  • src/renderer/src/components/message/MessageBlockContent.vue
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/message/MessageItemAssistant.test.ts
  • test/renderer/components/MessageList.test.ts
  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • src/renderer/src/pages/ChatPage.vue

📝 Walkthrough

Walkthrough

This PR adds MarkStream streaming/final markdown controls, propagates markdown virtualization flags through chat rendering, and updates pending-assistant placeholder sizing and render-key reuse. It also adds related docs, tests, and dependency bumps.

Changes

MarkStream Chat Rendering Optimization

Layer / File(s) Summary
Design docs and checklist
docs/features/markstream-chat-rendering-optimization/*, docs/issues/chat-send-jitter/spec.md
Adds the feature plan, spec, tasks checklist, and a separate chat send jitter issue spec.
MarkdownRenderer mode and virtualization
package.json, src/renderer/src/components/markdown/MarkdownRenderer.vue, src/renderer/src/components/artifacts/MarkdownArtifact.vue, src/renderer/src/components/sidepanel/viewer/WorkspacePreviewPane.vue, test/renderer/components/MarkdownRenderer.test.ts, test/renderer/components/MarkdownArtifact.test.ts, test/renderer/components/WorkspacePreviewPane.test.ts
Adds streaming, final, and virtualization props and computed rendering controls, updates preview/artifact consumers, and refreshes renderer tests.
Message block streaming and virtualization gating
src/renderer/src/components/message/MessageBlockContent.vue, src/renderer/src/components/message/MessageItemAssistant.vue, test/renderer/components/message/MessageBlockContent.test.ts, test/renderer/components/message/MessageItemAssistant.test.ts
Derives per-part streaming and virtualization state, passes markdown virtualization flags through assistant content, and updates related tests.
ChatPage virtualization and render-key propagation
src/renderer/src/components/chat/MessageList.vue, src/renderer/src/components/chat/messageListItems.ts, src/renderer/src/pages/ChatPage.vue, test/renderer/components/ChatPage.test.ts, test/renderer/components/MessageList.test.ts
Adds markdown virtualization control through MessageList and ChatPage, tracks render keys in the display-message cache, and updates inline-search behavior and tests.
Pending assistant sizing and measurement reuse
src/renderer/src/composables/message/useMessageWindow.ts, src/renderer/src/components/chat/MessageListRow.vue, test/renderer/components/MessageListRow.test.ts, test/renderer/composables/useMessageWindow.test.ts, test/renderer/components/ChatPage.test.ts
Adds pending-assistant placeholder height estimation, rekeys height lookup to renderKey, and updates streaming placeholder tests and row measurement coverage.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • ThinkInAIXYZ/deepchat#1737: Both PRs touch the chat windowing and measurement flow, including MessageListRow and useMessageWindow.ts.
  • ThinkInAIXYZ/deepchat#1869: Both PRs modify src/renderer/src/pages/ChatPage.vue to stabilize pending assistant placeholder and streaming state.
  • ThinkInAIXYZ/deepchat#685: Both PRs change MarkdownRenderer.vue around MarkStream NodeRenderer streaming behavior.

Suggested reviewers: zerob13

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the main change: chat markdown rendering optimization.
Linked Issues check ✅ Passed The pending-assistant height fix, scoped estimate change, and regression tests match #1897's requirements.
Out of Scope Changes check ✅ Passed The changes stay within the broader chat markdown rendering optimization and related jitter/guardrail work.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/markstream-chat-rendering

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/renderer/src/components/markdown/MarkdownRenderer.vue (1)

111-127: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider naming constants for maxLiveNodes/liveNodeBuffer tuning values.

220 and 60 are magic numbers embedded directly in the computed logic with no explanation of the tuning rationale.

♻️ Proposed refactor
+const COMPLETED_MAX_LIVE_NODES = 220
+const COMPLETED_LIVE_NODE_BUFFER = 60
+
 const shouldVirtualizeNodes = computed(() => props.virtualizeNodes && !isStreaming.value)
 const resolvedNodeVirtual = computed(() =>
   shouldVirtualizeNodes.value ? ('auto' as const) : false
 )
-const maxLiveNodes = computed(() => (shouldVirtualizeNodes.value ? 220 : 0))
-const liveNodeBuffer = computed(() => (shouldVirtualizeNodes.value ? 60 : 0))
+const maxLiveNodes = computed(() => (shouldVirtualizeNodes.value ? COMPLETED_MAX_LIVE_NODES : 0))
+const liveNodeBuffer = computed(() =>
+  shouldVirtualizeNodes.value ? COMPLETED_LIVE_NODE_BUFFER : 0
+)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/components/markdown/MarkdownRenderer.vue` around lines 111 -
127, The computed tuning values in MarkdownRenderer are using magic numbers, so
extract the 220 and 60 thresholds into named constants near the existing
computed props. Update maxLiveNodes and liveNodeBuffer to reference those
constants, and use clear names that reflect the virtualization tuning intent so
the values are easier to understand and adjust later.
src/renderer/src/components/message/MessageItemAssistant.vue (1)

58-58: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider a small pass-through test for disableMarkdownVirtualization.

The prop-forwarding chain to MessageBlockContent isn't covered by a dedicated test in this cohort — ChatPage.test.ts/MessageList.test.ts stub out this component entirely, so a break in this specific hop (e.g. renamed prop) wouldn't be caught.

Also applies to: 252-252

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/components/message/MessageItemAssistant.vue` at line 58, Add
a focused pass-through test for MessageItemAssistant to verify it forwards
disableMarkdownVirtualization to MessageBlockContent. The current
ChatPage.test.ts and MessageList.test.ts stubs skip this component chain, so
create a dedicated test around MessageItemAssistant that mounts it with
disableMarkdownVirtualization set and asserts the prop reaches
MessageBlockContent. Use the MessageItemAssistant and MessageBlockContent
symbols to locate the forwarding path and protect against renamed or dropped
props.
src/renderer/src/pages/ChatPage.vue (1)

427-427: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Fragile forward-reference for clearMessageWindowMeasurements.

clearMessageWindowMeasurements starts as a no-op, is invoked from an immediate: true watcher (line 948) before messageWindow exists, and is only rebound to the real clearMeasurements at line 1276. This works today only because the watcher callback runs fully synchronously up to that call (no await beforehand), so the real function is bound before any subsequent session change fires. A future refactor (e.g., adding an early await, or reordering messageWindow creation) could silently reintroduce a no-op call on real session switches.

Consider adding a short comment documenting this ordering dependency to protect it from accidental breakage.

Also applies to: 948-948, 1276-1276

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/pages/ChatPage.vue` at line 427, Document the ordering
dependency around clearMessageWindowMeasurements in ChatPage.vue so the
forward-reference is intentional and protected from refactors. Add a brief
comment near the initial no-op declaration and/or the immediate watcher usage
explaining that the watcher runs before messageWindow exists and that
clearMessageWindowMeasurements is rebound to clearMeasurements later in setup,
so future changes must preserve this sequencing. Reference the
clearMessageWindowMeasurements variable, the immediate watcher, and the
clearMeasurements assignment to make the dependency easy to find.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/renderer/src/components/markdown/MarkdownRenderer.vue`:
- Line 9: MarkdownRenderer is hardcoding the MarkStream preset to chat, so all
preview surfaces inherit chat-specific behavior instead of using the appropriate
default/docs preset. Update the MarkdownRenderer component to accept a
configurable mode prop (or equivalent) and stop forcing mode="chat" in the
shared render path, then pass the desired mode from chat callers only while
leaving artifact, workspace, and skill-detail previews on the default behavior.

---

Nitpick comments:
In `@src/renderer/src/components/markdown/MarkdownRenderer.vue`:
- Around line 111-127: The computed tuning values in MarkdownRenderer are using
magic numbers, so extract the 220 and 60 thresholds into named constants near
the existing computed props. Update maxLiveNodes and liveNodeBuffer to reference
those constants, and use clear names that reflect the virtualization tuning
intent so the values are easier to understand and adjust later.

In `@src/renderer/src/components/message/MessageItemAssistant.vue`:
- Line 58: Add a focused pass-through test for MessageItemAssistant to verify it
forwards disableMarkdownVirtualization to MessageBlockContent. The current
ChatPage.test.ts and MessageList.test.ts stubs skip this component chain, so
create a dedicated test around MessageItemAssistant that mounts it with
disableMarkdownVirtualization set and asserts the prop reaches
MessageBlockContent. Use the MessageItemAssistant and MessageBlockContent
symbols to locate the forwarding path and protect against renamed or dropped
props.

In `@src/renderer/src/pages/ChatPage.vue`:
- Line 427: Document the ordering dependency around
clearMessageWindowMeasurements in ChatPage.vue so the forward-reference is
intentional and protected from refactors. Add a brief comment near the initial
no-op declaration and/or the immediate watcher usage explaining that the watcher
runs before messageWindow exists and that clearMessageWindowMeasurements is
rebound to clearMeasurements later in setup, so future changes must preserve
this sequencing. Reference the clearMessageWindowMeasurements variable, the
immediate watcher, and the clearMeasurements assignment to make the dependency
easy to find.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bfa4a344-9d73-487c-857c-4d7147319d3d

📥 Commits

Reviewing files that changed from the base of the PR and between 2684e96 and c4fa8cf.

📒 Files selected for processing (13)
  • docs/features/markstream-chat-rendering-optimization/plan.md
  • docs/features/markstream-chat-rendering-optimization/spec.md
  • docs/features/markstream-chat-rendering-optimization/tasks.md
  • src/renderer/src/components/chat/MessageList.vue
  • src/renderer/src/components/chat/MessageListRow.vue
  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • src/renderer/src/components/message/MessageBlockContent.vue
  • src/renderer/src/components/message/MessageItemAssistant.vue
  • src/renderer/src/pages/ChatPage.vue
  • test/renderer/components/ChatPage.test.ts
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/MessageList.test.ts
  • test/renderer/components/message/MessageBlockContent.test.ts

Comment thread src/renderer/src/components/markdown/MarkdownRenderer.vue Outdated
@zhangmo8 zhangmo8 marked this pull request as draft July 7, 2026 11:03
@zhangmo8 zhangmo8 force-pushed the feat/markstream-chat-rendering branch from 42370c2 to 39e6480 Compare July 7, 2026 11:41
@zhangmo8 zhangmo8 marked this pull request as ready for review July 8, 2026 06:07

@zerob13 zerob13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整体评价

这个 PR 质量很高,SDD 文档完整,实现思路清晰。MarkStream 的 streaming/final 状态控制和虚拟化逻辑都设计得很合理,chat-send-jitter 的修复也很精准。

但有一个严重问题需要修复:


🔴 Critical Issue

MarkdownRenderer 硬编码了 mode="chat"

位置: src/renderer/src/components/markdown/MarkdownRenderer.vue:9

<NodeRenderer
  mode="chat"  // 👈 这会影响所有使用 MarkdownRenderer 的场景
  ...
/>

问题:

  1. Artifact Markdown 预览Workspace Markdown 预览也会使用 chat mode 的渲染行为
  2. 这两个场景应该使用 MarkStream 的默认/docs preset,而不是 chat preset
  3. 虽然你在 MarkdownArtifact.vueWorkspacePreviewPane.vue 中传了 final=truesmooth-streaming=falsevirtualize-nodes=false,但 mode="chat" 仍会影响 MarkStream 的其他行为(比如 batch rendering 策略、node mounting 优先级等)

修复方案:

// MarkdownRenderer.vue
const props = withDefaults(
  defineProps<{
    // ...existing props
+   mode?: 'chat' | 'default'  // 或者用 'docs'
  }>(),
  {
+   mode: 'default',
    // ...
  }
)

<NodeRenderer
- mode="chat"
+ :mode="props.mode"
  ...
/>

然后在 MessageBlockContent.vue 中明确传 mode="chat":

<MarkdownRenderer
  :content="part.content"
+ mode="chat"
  :streaming="isStreamingPart(part)"
  ...
/>

这样 artifact/workspace 预览就会使用正确的默认行为。


🟡 Minor Issues

1. Magic numbers 应该提取为常量

位置: src/renderer/src/components/markdown/MarkdownRenderer.vue:141-142

const STATIC_MAX_LIVE_NODES = 260
const STATIC_LIVE_NODE_BUFFER = 80

这两个值已经在代码里了,但在 computed 中又出现了 220 和 60(虽然我看代码里用的是常量,可能是 CodeRabbit 看错了?)。如果确实存在硬编码的地方,统一使用常量。

2. clearMessageWindowMeasurements 的 forward-reference 模式

位置: src/renderer/src/pages/ChatPage.vue:429, 951, 1309

这个模式是对的,但建议加个注释说明为什么要这样做:

// Initialized as no-op, rebound after messageWindow is created (line 1309).
// The immediate watcher at line 940 runs before messageWindow exists, so this
// forward-reference pattern ensures session-switch cleanup always works.
let clearMessageWindowMeasurements = () => {}

✅ 做得好的地方

  1. SDD 流程完整: spec.md + plan.md + tasks.md 都很清晰
  2. 测试覆盖充分: 所有关键路径都有对应的测试
  3. 兼容性考虑周全:
    • 搜索时禁用虚拟化
    • session 切换清理 measurements
    • streaming/completed 状态分离
  4. 性能优化合理: streaming 用小 batch,completed 用大 batch + 虚拟化
  5. chat-send-jitter 修复精准: 用真实的 spinner 高度估算,避免了 submit 时的跳动

Action Items

  • 修复 mode="chat" 硬编码问题(critical)
  • 添加 clearMessageWindowMeasurements 注释(optional)
  • 确认是否有 magic number 未提取(如果 CodeRabbit 误报就忽略)

修复 critical issue 后这个 PR 就可以合并了。

@zerob13 zerob13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical: mode="chat" 被硬编码在 MarkdownRenderer.vue:9,这会让所有使用 MarkdownRenderer 的场景(包括 Artifact 预览、Workspace Markdown 预览)都使用 chat mode。

应该把 mode 改为可配置的 prop,默认值为 'default',然后在 MessageBlockContent.vue 中明确传 mode="chat"

      :mode="props.mode"

同时在 props 定义中添加:

mode?: 'chat' | 'default'

默认值设为 'default'

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/renderer/src/components/chat/MessageListRow.vue`:
- Line 109: The delta lookup in MessageListRow is inconsistent with the height
cache key: `setMeasuredHeight()` stores entries by `renderKey ?? id`, but
`getEntry()` in the same component still resolves only by `id`, so placeholder
or streaming rows can miss their first delta and skip scroll correction. Update
the lookup logic to use the same identifier priority as the cached measurement
(`renderKey` first, then `id`) in `getEntry()` and any related matching code so
it stays aligned with `messageId` and `setMeasuredHeight()`.

In `@test/renderer/components/MessageList.test.ts`:
- Around line 71-77: The `useMessageCapture` mock in `MessageList.test.ts` uses
a plain object for `isCapturingRef`, so `unref()` in `MessageList.vue` never
unwraps it and `shouldDisableMarkdownVirtualization` stays truthy for the wrong
reason. Update the mock to use a real Vue `ref` for `isCapturing` (inside the
`vi.hoisted`/mock setup) and make the tests mutate that ref rather than
replacing the object. Also adjust the reset logic in the affected
`beforeEach`/test cases so they work with the shared ref returned by
`useMessageCapture`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f61b1182-bed2-4e89-89dd-c4c81133cc9b

📥 Commits

Reviewing files that changed from the base of the PR and between c4fa8cf and 34f8ff8.

📒 Files selected for processing (23)
  • docs/features/markstream-chat-rendering-optimization/plan.md
  • docs/features/markstream-chat-rendering-optimization/spec.md
  • docs/features/markstream-chat-rendering-optimization/tasks.md
  • docs/issues/chat-send-jitter/spec.md
  • src/renderer/src/components/artifacts/MarkdownArtifact.vue
  • src/renderer/src/components/chat/MessageList.vue
  • src/renderer/src/components/chat/MessageListRow.vue
  • src/renderer/src/components/chat/messageListItems.ts
  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • src/renderer/src/components/message/MessageBlockContent.vue
  • src/renderer/src/components/message/MessageItemAssistant.vue
  • src/renderer/src/components/sidepanel/viewer/WorkspacePreviewPane.vue
  • src/renderer/src/composables/message/useMessageWindow.ts
  • src/renderer/src/pages/ChatPage.vue
  • test/renderer/components/ChatPage.test.ts
  • test/renderer/components/MarkdownArtifact.test.ts
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/MessageList.test.ts
  • test/renderer/components/MessageListRow.test.ts
  • test/renderer/components/WorkspacePreviewPane.test.ts
  • test/renderer/components/message/MessageBlockContent.test.ts
  • test/renderer/components/message/MessageItemAssistant.test.ts
  • test/renderer/composables/useMessageWindow.test.ts
✅ Files skipped from review due to trivial changes (5)
  • docs/issues/chat-send-jitter/spec.md
  • src/renderer/src/components/chat/messageListItems.ts
  • docs/features/markstream-chat-rendering-optimization/tasks.md
  • docs/features/markstream-chat-rendering-optimization/spec.md
  • docs/features/markstream-chat-rendering-optimization/plan.md
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/renderer/src/components/message/MessageBlockContent.vue
  • src/renderer/src/components/markdown/MarkdownRenderer.vue
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/message/MessageBlockContent.test.ts

Comment thread src/renderer/src/components/chat/MessageListRow.vue
Comment thread test/renderer/components/MessageList.test.ts Outdated
@zerob13 zerob13 merged commit bcd624f into dev Jul 8, 2026
3 checks passed
@zhangmo8 zhangmo8 deleted the feat/markstream-chat-rendering branch July 8, 2026 07:54
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.

[bug] Reduce chat send-time jitter

2 participants