Skip to content

feat(chat): collapse turn activity#1727

Merged
zerob13 merged 2 commits into
devfrom
feat/auto-fold
Jun 2, 2026
Merged

feat(chat): collapse turn activity#1727
zerob13 merged 2 commits into
devfrom
feat/auto-fold

Conversation

@zerob13
Copy link
Copy Markdown
Collaborator

@zerob13 zerob13 commented Jun 2, 2026

Summary

  • Add renderer-only grouping for completed reasoning and tool-call activity blocks.
  • Add a collapsible activity title with worked duration and activity counts while keeping final answer text visible.
  • Document SDD plan and persistence decision for local-only collapse state.

Tests

  • pnpm run i18n
  • pnpm run format
  • pnpm run lint
  • pnpm run typecheck
  • pnpm exec vitest --config vitest.config.renderer.ts test/renderer/components/message/messageActivityGroups.test.ts test/renderer/components/message/MessageBlockActivityGroup.test.ts test/renderer/components/message/MessageItemAssistant.test.ts test/renderer/components/MessageList.test.ts

Summary by CodeRabbit

  • New Features

    • Assistant responses automatically group/collapse completed reasoning and tool interactions into expandable activity summaries showing duration and counts.
  • Documentation

    • Added plan, spec, and task docs describing UX, behavior, duration rules, accessibility, and tests.
  • Localization

    • Added activity-collapse UI strings for many locales.
  • Tests

    • Added unit and component tests for grouping, duration formatting, accessibility, and i18n.
  • Chores

    • Message objects now include an updated timestamp used by rendering logic.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

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: 4a9e719b-896e-4e9d-a5c7-1657f71a5381

📥 Commits

Reviewing files that changed from the base of the PR and between 713c3b9 and 092bc5a.

📒 Files selected for processing (27)
  • docs/features/automatic-turn-activity-collapse/plan.md
  • docs/features/automatic-turn-activity-collapse/spec.md
  • src/renderer/src/components/message/MessageBlockActivityGroup.vue
  • src/renderer/src/components/message/messageActivityGroups.ts
  • src/renderer/src/i18n/da-DK/chat.json
  • src/renderer/src/i18n/de-DE/chat.json
  • src/renderer/src/i18n/en-US/chat.json
  • src/renderer/src/i18n/es-ES/chat.json
  • src/renderer/src/i18n/fa-IR/chat.json
  • src/renderer/src/i18n/fr-FR/chat.json
  • src/renderer/src/i18n/he-IL/chat.json
  • src/renderer/src/i18n/id-ID/chat.json
  • src/renderer/src/i18n/it-IT/chat.json
  • src/renderer/src/i18n/ja-JP/chat.json
  • src/renderer/src/i18n/ko-KR/chat.json
  • src/renderer/src/i18n/ms-MY/chat.json
  • src/renderer/src/i18n/pl-PL/chat.json
  • src/renderer/src/i18n/pt-BR/chat.json
  • src/renderer/src/i18n/ru-RU/chat.json
  • src/renderer/src/i18n/tr-TR/chat.json
  • src/renderer/src/i18n/vi-VN/chat.json
  • src/renderer/src/i18n/zh-CN/chat.json
  • src/renderer/src/i18n/zh-HK/chat.json
  • src/renderer/src/i18n/zh-TW/chat.json
  • test/renderer/components/message/MessageBlockActivityGroup.test.ts
  • test/renderer/components/message/MessageItemAssistant.test.ts
  • test/renderer/components/message/messageActivityGroups.test.ts
✅ Files skipped from review due to trivial changes (8)
  • src/renderer/src/i18n/de-DE/chat.json
  • src/renderer/src/i18n/tr-TR/chat.json
  • src/renderer/src/i18n/fr-FR/chat.json
  • src/renderer/src/i18n/es-ES/chat.json
  • src/renderer/src/i18n/fa-IR/chat.json
  • src/renderer/src/i18n/ms-MY/chat.json
  • src/renderer/src/i18n/he-IL/chat.json
  • docs/features/automatic-turn-activity-collapse/plan.md
🚧 Files skipped from review as they are similar to previous changes (16)
  • src/renderer/src/i18n/zh-HK/chat.json
  • src/renderer/src/i18n/id-ID/chat.json
  • src/renderer/src/i18n/ru-RU/chat.json
  • src/renderer/src/i18n/ko-KR/chat.json
  • src/renderer/src/i18n/vi-VN/chat.json
  • src/renderer/src/i18n/pl-PL/chat.json
  • src/renderer/src/i18n/en-US/chat.json
  • src/renderer/src/i18n/pt-BR/chat.json
  • src/renderer/src/i18n/da-DK/chat.json
  • test/renderer/components/message/MessageBlockActivityGroup.test.ts
  • src/renderer/src/i18n/zh-CN/chat.json
  • docs/features/automatic-turn-activity-collapse/spec.md
  • src/renderer/src/i18n/ja-JP/chat.json
  • src/renderer/src/i18n/it-IT/chat.json
  • test/renderer/components/message/messageActivityGroups.test.ts
  • src/renderer/src/components/message/MessageBlockActivityGroup.vue

📝 Walkthrough

Walkthrough

This PR implements automatic activity collapse for assistant message rendering: adds updatedAt timestamps, pure grouping and duration helpers, a new MessageBlockActivityGroup component, integration into MessageItemAssistant, i18n entries, and unit/component tests.

Changes

Automatic Turn Activity Collapse

Layer / File(s) Summary
Documentation & Feature Plan
docs/features/automatic-turn-activity-collapse/plan.md, spec.md, tasks.md
Spec, plan, tasks, persistence/stability rules, grouping/keying rules, duration formatting algorithm, styling targets, risks, and test strategy.
Message Type: add updatedAt
src/renderer/src/components/chat/messageListItems.ts, src/renderer/src/pages/ChatPage.vue, test/renderer/components/MessageList.test.ts
Adds updatedAt: number to DisplayMessageBase and populates it for persisted and streaming display messages and tests.
Activity Grouping & Duration Helpers
src/renderer/src/components/message/messageActivityGroups.ts
Exports AssistantRenderItem types, isCompletedActivityBlock, buildAssistantRenderItems (buffering, skipping internal tool calls, stable keys), and formatActivityDuration (clamped multi-unit formatting).
MessageBlockActivityGroup Vue Component
src/renderer/src/components/message/MessageBlockActivityGroup.vue
New SFC rendering collapsed/expandable activity groups with localized title (duration + counts), aria-expanded, local collapsed state, toggle emit, and child block rendering when expanded.
MessageItemAssistant Integration
src/renderer/src/components/message/MessageItemAssistant.vue
Refactors rendering to use buildAssistantRenderItems, adds shouldGroupActivity gate, and renders activity-group items or individual blocks with updated props and collapse handling.
Internationalization
src/renderer/src/i18n/*/chat.json (multiple locales)
Adds activityCollapse keys (workedFor/duration, reasoningCount, toolCallCount, expandLabel, collapseLabel, duration unit labels) across locale files.
Component & Helper Tests
test/renderer/components/message/MessageBlockActivityGroup.test.ts, MessageItemAssistant.test.ts, messageActivityGroups.test.ts
Tests for activity-group toggle/aria behavior, grouping rules (settled vs pending), internal-tool exclusion, and duration formatting across example locales.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Suggested reviewers:
    • deepinfect

Poem

🐰 I nibble through settled turns of chat,

I fold the thoughts and tool calls in a hat.
Timers tick and counts align,
Click to open, click to hide—it's fine.
A hop, a toggle, grouped just right.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(chat): collapse turn activity' concisely describes the main feature addition—automatic collapsing of assistant turn activity blocks—which is the primary change across all modified files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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/auto-fold

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 and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 10

🧹 Nitpick comments (3)
src/renderer/src/components/message/messageActivityGroups.ts (1)

157-187: 💤 Low value

Consider i18n for duration unit strings.

The duration formatting hardcodes unit strings ("天", "小时", "分钟", "秒", "d", "h", "m", "s") rather than sourcing them from i18n files. While duration abbreviations are commonly hardcoded as standard symbols, the coding guideline states all user-facing strings should use vue-i18n keys. Consider extracting these to i18n files for full consistency, though this is lower priority since abbreviated units rarely vary within a locale.

As per coding guidelines: "All user-facing strings must use vue-i18n keys from src/renderer/src/i18n instead of hardcoded text".

🤖 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/messageActivityGroups.ts` around lines
157 - 187, The formatActivityDuration function currently hardcodes unit strings
for Chinese and non-Chinese locales; replace those literals with vue-i18n keys
by using the i18n translation function (e.g. useI18n().t or a provided t) inside
formatActivityDuration so each unit ("day", "hour", "minute", "second" and their
short forms) is looked up from src/renderer/src/i18n; update the parts arrays in
formatActivityDuration to call t('duration.day_short') / t('duration.day_cn')
etc. (keep the existing logic for isChineseLocale and zero-second fallback) and
ensure the translation keys are added to the i18n resource files.
src/renderer/src/components/message/MessageBlockActivityGroup.vue (1)

21-37: 💤 Low value

Consider defensive validation for unrecognized block types.

The template silently skips blocks that don't match reasoning_content, artifact-thinking (with content), or tool_call. While this may be intentional filtering, consider adding a development-mode warning if an unexpected block type is encountered to catch upstream data issues earlier.

🛡️ Optional development guard
+import { isDevelopment } from '`@/lib/env`'
+
 const buildActivityBlockKey = (block: DisplayAssistantMessageBlock, index: number): string =>
   block.id ?? block.tool_call?.id ?? `${block.type}:${block.timestamp}:${index}`
+
+const isRecognizedBlockType = (block: DisplayAssistantMessageBlock): boolean => {
+  if (block.type === 'tool_call') return true
+  if ((block.type === 'reasoning_content' || block.type === 'artifact-thinking') && block.content) return true
+  if (isDevelopment) {
+    console.warn('[MessageBlockActivityGroup] Unrecognized or empty block:', block)
+  }
+  return false
+}

Then in template:

-      <template v-for="(block, index) in blocks" :key="buildActivityBlockKey(block, index)">
+      <template v-for="(block, index) in blocks" :key="buildActivityBlockKey(block, index)" v-if="isRecognizedBlockType(block)">
🤖 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/MessageBlockActivityGroup.vue` around
lines 21 - 37, Add a development-mode warning for unrecognized block types in
the template rendering loop over blocks in MessageBlockActivityGroup.vue. After
the existing v-if and v-else-if for known block types, add a v-else block that
triggers a console.warn during development to log any unexpected block types.
This will help catch upstream data issues early without affecting production
behavior. Ensure this check references the iterated variable 'block.type' within
the template's v-for scope.
test/renderer/components/message/MessageItemAssistant.test.ts (1)

263-277: ⚡ Quick win

Consider expanding test coverage for additional grouping scenarios.

The test correctly verifies the primary grouping behavior when both gating conditions are met. However, the test suite could benefit from covering additional edge cases:

  1. status='sent' + isInGeneratingThread=true → should NOT group (generating thread suppresses grouping)
  2. status='pending' + isInGeneratingThread=false → should NOT group (pending status suppresses grouping)
  3. Internal tool call filtering (tool with name='update_plan' and extra.internalTool=true should be excluded from the group, per the context snippet)

These additional test cases would provide stronger confidence that the grouping logic handles all combinations correctly.

🤖 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 `@test/renderer/components/message/MessageItemAssistant.test.ts` around lines
263 - 277, Add three unit tests for MessageItemAssistant to cover edge cases:
(1) mount with message status 'sent' and isInGeneratingThread=true and assert no
activity-group exists and individual blocks
(MessageBlockThink/MessageBlockToolCall) are present; (2) mount with status
'pending' and isInGeneratingThread=false and assert no grouping and blocks are
present; (3) mount with a tool call block whose tool has name 'update_plan' and
extra.internalTool=true and assert that the internal tool call is excluded from
the activity-group (i.e., group count reflects exclusion and the
MessageBlockToolCall for that internal tool is not rendered in the group). Use
the same helpers (createMessage, createThinkingBlock, createToolCallBlock) and
component name MessageItemAssistant to create the test props and assertions.
🤖 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/message/MessageBlockActivityGroup.vue`:
- Line 29: The forwarded `toggle-collapse` event is ambiguous; update
MessageBlockActivityGroup to include metadata so the parent can distinguish
source and state: change handleChildCollapseToggle to re-emit a payload like {
source: 'child-block', isCollapsed: boolean } (using the child's boolean), and
change the activity-group's own toggle emitter (the handler that flips
isExpanded) to emit { source: 'activity-group', isCollapsed: !isExpanded };
ensure MessageBlockThink events are treated as child-origin when re-emitting
from handleChildCollapseToggle and remove blind forwarding so every emitted
toggle-collapse includes the source and isCollapsed fields.

In `@src/renderer/src/i18n/da-DK/chat.json`:
- Around line 408-413: The strings in the activityCollapse section are currently
in English and must be translated into Danish. Replace the values for workedFor,
reasoningCount, toolCallCount, expandLabel, and collapseLabel with their
appropriate Danish translations, such as "Arbejdet i {duration}" for workedFor
and "Udvid {title}" for expandLabel, to ensure the section has correct Danish
text.

In `@src/renderer/src/i18n/de-DE/chat.json`:
- Around line 408-413: The activityCollapse translations are still in English;
update the values for the keys workedFor, reasoningCount, toolCallCount,
expandLabel, and collapseLabel in the activityCollapse object to proper German
strings while preserving placeholders (e.g., workedFor -> "Gearbeitet für
{duration}", reasoningCount -> "{count} Gedanke(n)", toolCallCount -> "{count}
Werkzeugaufruf(e)", expandLabel -> "Erweitern {title}", collapseLabel ->
"Einklappen {title}"); keep the exact placeholder names ({duration}, {count},
{title}) intact so existing interpolation in the code using
activityCollapse.workedFor, activityCollapse.reasoningCount,
activityCollapse.toolCallCount, activityCollapse.expandLabel, and
activityCollapse.collapseLabel continues to work.

In `@src/renderer/src/i18n/es-ES/chat.json`:
- Around line 408-413: The activityCollapse strings in the Spanish chat
translation file are still in English; update the entries in the
activityCollapse object to proper Spanish while preserving the existing
placeholders. Specifically, replace the text for workedFor, reasoningCount,
toolCallCount, expandLabel, and collapseLabel with Spanish equivalents, and keep
the same keys and interpolation tokens used by the i18n consumers.

In `@src/renderer/src/i18n/fa-IR/chat.json`:
- Around line 408-413: The `activityCollapse` section currently contains English
strings and requires proper Persian translations to support RTL text direction.
Replace the English text for the keys `workedFor`, `reasoningCount`,
`toolCallCount`, `expandLabel`, and `collapseLabel` with accurate Persian
translations, ensuring the placeholders `{duration}`, `{count}`, and `{title}`
remain intact for dynamic content substitution.

In `@src/renderer/src/i18n/fr-FR/chat.json`:
- Around line 408-413: The activityCollapse translations are still in English;
replace the English strings for the keys activityCollapse.workedFor,
activityCollapse.reasoningCount, activityCollapse.toolCallCount,
activityCollapse.expandLabel and activityCollapse.collapseLabel with proper
French equivalents (for example: "A travaillé pendant {duration}" for workedFor,
"{count} réflexion(s)" for reasoningCount, "{count} appel(s) d'outil)" for
toolCallCount, "Développer {title}" for expandLabel and "Réduire {title}" for
collapseLabel), ensuring placeholders {duration}, {count}, and {title} are
preserved exactly.

In `@src/renderer/src/i18n/he-IL/chat.json`:
- Around line 408-413: The activityCollapse strings in the he-IL chat.json
locale are still in English and need Hebrew translations. Update the entries for
workedFor, reasoningCount, toolCallCount, expandLabel, and collapseLabel in the
activityCollapse object to proper Hebrew, and ensure the translated text follows
RTL-friendly phrasing consistent with the rest of the he-IL locale file.

In `@src/renderer/src/i18n/ru-RU/chat.json`:
- Around line 408-414: The activityCollapse entries in the ru-RU locale still
contain English strings; update the "activityCollapse" object by replacing the
values for the keys workedFor, reasoningCount, toolCallCount, expandLabel, and
collapseLabel with proper Russian translations, preserving placeholders
({duration}, {count}, {title}) and implementing correct pluralization for
reasoningCount and toolCallCount (use Russian plural forms or the i18n plural
syntax your project uses) so UI shows fully translated labels.

In `@src/renderer/src/i18n/tr-TR/chat.json`:
- Around line 408-414: Replace the English strings under activityCollapse with
Turkish translations: set activityCollapse.workedFor to "{duration} boyunca
çalıştı", activityCollapse.reasoningCount to "{count} düşünce",
activityCollapse.toolCallCount to "{count} araç çağrısı",
activityCollapse.expandLabel to "{title} öğesini genişlet", and
activityCollapse.collapseLabel to "{title} öğesini daralt" so Turkish users see
localized labels.

In `@src/renderer/src/i18n/vi-VN/chat.json`:
- Around line 408-414: The activityCollapse entries are still in English; update
the Vietnamese translations for the keys inside the activityCollapse
object—specifically replace workedFor, reasoningCount, toolCallCount,
expandLabel, and collapseLabel with Vietnamese text while preserving the
{duration}, {count}, and {title} placeholders (suggestions: workedFor -> "Hoạt
động trong {duration}", reasoningCount -> "{count} suy nghĩ", toolCallCount ->
"{count} lần gọi công cụ", expandLabel -> "Mở rộng {title}", collapseLabel ->
"Thu gọn {title}").

---

Nitpick comments:
In `@src/renderer/src/components/message/messageActivityGroups.ts`:
- Around line 157-187: The formatActivityDuration function currently hardcodes
unit strings for Chinese and non-Chinese locales; replace those literals with
vue-i18n keys by using the i18n translation function (e.g. useI18n().t or a
provided t) inside formatActivityDuration so each unit ("day", "hour", "minute",
"second" and their short forms) is looked up from src/renderer/src/i18n; update
the parts arrays in formatActivityDuration to call t('duration.day_short') /
t('duration.day_cn') etc. (keep the existing logic for isChineseLocale and
zero-second fallback) and ensure the translation keys are added to the i18n
resource files.

In `@src/renderer/src/components/message/MessageBlockActivityGroup.vue`:
- Around line 21-37: Add a development-mode warning for unrecognized block types
in the template rendering loop over blocks in MessageBlockActivityGroup.vue.
After the existing v-if and v-else-if for known block types, add a v-else block
that triggers a console.warn during development to log any unexpected block
types. This will help catch upstream data issues early without affecting
production behavior. Ensure this check references the iterated variable
'block.type' within the template's v-for scope.

In `@test/renderer/components/message/MessageItemAssistant.test.ts`:
- Around line 263-277: Add three unit tests for MessageItemAssistant to cover
edge cases: (1) mount with message status 'sent' and isInGeneratingThread=true
and assert no activity-group exists and individual blocks
(MessageBlockThink/MessageBlockToolCall) are present; (2) mount with status
'pending' and isInGeneratingThread=false and assert no grouping and blocks are
present; (3) mount with a tool call block whose tool has name 'update_plan' and
extra.internalTool=true and assert that the internal tool call is excluded from
the activity-group (i.e., group count reflects exclusion and the
MessageBlockToolCall for that internal tool is not rendered in the group). Use
the same helpers (createMessage, createThinkingBlock, createToolCallBlock) and
component name MessageItemAssistant to create the test props and assertions.
🪄 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: 6ee0248c-c972-4980-8661-430640eb3aec

📥 Commits

Reviewing files that changed from the base of the PR and between 898f8fd and 713c3b9.

📒 Files selected for processing (32)
  • docs/features/automatic-turn-activity-collapse/plan.md
  • docs/features/automatic-turn-activity-collapse/spec.md
  • docs/features/automatic-turn-activity-collapse/tasks.md
  • src/renderer/src/components/chat/messageListItems.ts
  • src/renderer/src/components/message/MessageBlockActivityGroup.vue
  • src/renderer/src/components/message/MessageItemAssistant.vue
  • src/renderer/src/components/message/messageActivityGroups.ts
  • src/renderer/src/i18n/da-DK/chat.json
  • src/renderer/src/i18n/de-DE/chat.json
  • src/renderer/src/i18n/en-US/chat.json
  • src/renderer/src/i18n/es-ES/chat.json
  • src/renderer/src/i18n/fa-IR/chat.json
  • src/renderer/src/i18n/fr-FR/chat.json
  • src/renderer/src/i18n/he-IL/chat.json
  • src/renderer/src/i18n/id-ID/chat.json
  • src/renderer/src/i18n/it-IT/chat.json
  • src/renderer/src/i18n/ja-JP/chat.json
  • src/renderer/src/i18n/ko-KR/chat.json
  • src/renderer/src/i18n/ms-MY/chat.json
  • src/renderer/src/i18n/pl-PL/chat.json
  • src/renderer/src/i18n/pt-BR/chat.json
  • src/renderer/src/i18n/ru-RU/chat.json
  • src/renderer/src/i18n/tr-TR/chat.json
  • src/renderer/src/i18n/vi-VN/chat.json
  • src/renderer/src/i18n/zh-CN/chat.json
  • src/renderer/src/i18n/zh-HK/chat.json
  • src/renderer/src/i18n/zh-TW/chat.json
  • src/renderer/src/pages/ChatPage.vue
  • test/renderer/components/MessageList.test.ts
  • test/renderer/components/message/MessageBlockActivityGroup.test.ts
  • test/renderer/components/message/MessageItemAssistant.test.ts
  • test/renderer/components/message/messageActivityGroups.test.ts

Comment thread src/renderer/src/components/message/MessageBlockActivityGroup.vue
Comment thread src/renderer/src/i18n/da-DK/chat.json Outdated
Comment thread src/renderer/src/i18n/de-DE/chat.json Outdated
Comment thread src/renderer/src/i18n/es-ES/chat.json Outdated
Comment thread src/renderer/src/i18n/fa-IR/chat.json Outdated
Comment thread src/renderer/src/i18n/fr-FR/chat.json Outdated
Comment thread src/renderer/src/i18n/he-IL/chat.json Outdated
Comment thread src/renderer/src/i18n/ru-RU/chat.json
Comment thread src/renderer/src/i18n/tr-TR/chat.json
Comment thread src/renderer/src/i18n/vi-VN/chat.json
@zerob13 zerob13 merged commit 8003a56 into dev Jun 2, 2026
3 checks passed
@zhangmo8 zhangmo8 deleted the feat/auto-fold branch June 3, 2026 09:26
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.

1 participant