Skip to content

feat: assistant loading placeholder docs - #1863

Merged
zerob13 merged 12 commits into
devfrom
codex/assistant-loading-placeholder-docs
Jul 1, 2026
Merged

feat: assistant loading placeholder docs#1863
zerob13 merged 12 commits into
devfrom
codex/assistant-loading-placeholder-docs

Conversation

@zerob13

@zerob13 zerob13 commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features

    • Shows an assistant loading placeholder immediately after message submission.
    • Adds a “reviewing” status indicator for auto-approved tool calls while approval is pending.
    • Updates Skills Library to a responsive card grid and refines the Skill Detail dialog action layout.
  • Bug Fixes

    • Reduces chat scroll jumps and improves session-restore scroll intent handling.
    • Stabilizes message and markdown rendering, and adds a confirmation step for message deletion.
  • Documentation

    • Refined specs and rollout plans for Skills Management, tool-call review UI, and chat loading/scroll behavior.

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

An error occurred during the review process. Please try again later.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/assistant-loading-placeholder-docs

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.

…g-placeholder-docs

# Conflicts:
#	docs/features/assistant-permission-review-mode/spec.md
#	src/main/presenter/agentRuntimePresenter/dispatch.ts
#	src/main/presenter/agentRuntimePresenter/index.ts
#	src/renderer/src/i18n/da-DK/chat.json
#	src/renderer/src/i18n/da-DK/dialog.json
#	src/renderer/src/i18n/de-DE/chat.json
#	src/renderer/src/i18n/de-DE/dialog.json
#	src/renderer/src/i18n/es-ES/chat.json
#	src/renderer/src/i18n/es-ES/dialog.json
#	src/renderer/src/i18n/fa-IR/chat.json
#	src/renderer/src/i18n/fa-IR/dialog.json
#	src/renderer/src/i18n/fr-FR/chat.json
#	src/renderer/src/i18n/fr-FR/dialog.json
#	src/renderer/src/i18n/he-IL/chat.json
#	src/renderer/src/i18n/he-IL/dialog.json
#	src/renderer/src/i18n/id-ID/chat.json
#	src/renderer/src/i18n/id-ID/dialog.json
#	src/renderer/src/i18n/it-IT/chat.json
#	src/renderer/src/i18n/it-IT/dialog.json
#	src/renderer/src/i18n/ja-JP/chat.json
#	src/renderer/src/i18n/ja-JP/dialog.json
#	src/renderer/src/i18n/ko-KR/chat.json
#	src/renderer/src/i18n/ko-KR/dialog.json
#	src/renderer/src/i18n/ms-MY/chat.json
#	src/renderer/src/i18n/ms-MY/dialog.json
#	src/renderer/src/i18n/pl-PL/chat.json
#	src/renderer/src/i18n/pl-PL/dialog.json
#	src/renderer/src/i18n/pt-BR/chat.json
#	src/renderer/src/i18n/pt-BR/dialog.json
#	src/renderer/src/i18n/ru-RU/chat.json
#	src/renderer/src/i18n/ru-RU/dialog.json
#	src/renderer/src/i18n/tr-TR/chat.json
#	src/renderer/src/i18n/tr-TR/dialog.json
#	src/renderer/src/i18n/vi-VN/chat.json
#	src/renderer/src/i18n/vi-VN/dialog.json
#	src/renderer/src/pages/ChatPage.vue
#	test/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.ts
#	test/main/presenter/agentRuntimePresenter/dispatch.test.ts
#	test/renderer/components/ChatPage.test.ts

@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

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

♻️ Duplicate comments (1)
src/renderer/src/i18n/es-ES/dialog.json (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated deleteMessage strings.

Same issue as other locale files — title, description, and confirm are left in English instead of Spanish.

🤖 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/i18n/es-ES/dialog.json` around lines 89 - 93, The
deleteMessage entries in the es-ES dialog locale are still in English. Update
the title, description, and confirm strings in the dialog.json translation block
to Spanish, matching the existing localization style used elsewhere in this
locale file. Use the deleteMessage key to locate and replace all three
untranslated fields.
🟡 Minor comments (28)
src/renderer/src/i18n/da-DK/chat.json-314-315 (1)

314-315: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated placeholder string for autoApprove.

Same issue as it-IT: the new key uses literal English "Approve for me" instead of a Danish translation.

🌐 Suggested fix
-    "fullAccess": "Fuld adgang",
-    "autoApprove": "Approve for me"
+    "fullAccess": "Fuld adgang",
+    "autoApprove": "Godkend for mig"
🤖 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/i18n/da-DK/chat.json` around lines 314 - 315, The new chat
translation entry for autoApprove is still using the English placeholder text.
Update the autoApprove value in the da-DK chat.json localization to a proper
Danish translation, matching the style of nearby keys like fullAccess, so the
i18n bundle contains no literal English for this label.
src/renderer/src/i18n/it-IT/chat.json-330-331 (1)

330-331: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated placeholder string for autoApprove.

The new key uses the literal English string "Approve for me" instead of an Italian translation, unlike zh-CN which shipped a properly localized value ("助手代审"). This will surface English text in the Italian UI.

🌐 Suggested fix
-    "fullAccess": "Accesso completo",
-    "autoApprove": "Approve for me"
+    "fullAccess": "Accesso completo",
+    "autoApprove": "Approva per me"
🤖 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/i18n/it-IT/chat.json` around lines 330 - 331, The
`autoApprove` entry in the Italian chat translation is still using the English
placeholder text, so update the `chat.json` locale value for `autoApprove` to a
proper Italian translation consistent with the other locale files. Locate the
`autoApprove` key in `src/renderer/src/i18n/it-IT/chat.json` and replace the
literal English phrase with the localized Italian string.
src/renderer/src/i18n/he-IL/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

New deleteMessage strings left untranslated (English) in Hebrew locale file.

The new keys title, description, confirm are in English rather than Hebrew, unlike every other string in this file.

🌐 Suggested Hebrew translations
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "למחוק את ההודעה הזו?",
+    "description": "פעולה זו תמחק את ההודעה הזו ואת ההקשר שיוחזר אחריה. לא ניתן לבטל פעולה זו.",
+    "confirm": "מחק הודעה"
   }
🤖 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/i18n/he-IL/dialog.json` around lines 89 - 93, The new
deleteMessage entries in the Hebrew locale are still in English; update the
title, description, and confirm values in dialog.json to proper Hebrew and keep
the wording consistent with the rest of the he-IL translations. Use the
deleteMessage object as the target to replace these three strings with localized
text.
src/renderer/src/i18n/he-IL/chat.json-314-315 (1)

314-315: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

New autoApprove string left untranslated in Hebrew locale file.

"Approve for me" is English text placed in a Hebrew locale file.

🌐 Suggested Hebrew translation
-    "autoApprove": "Approve for me"
+    "autoApprove": "אשר בשבילי"
🤖 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/i18n/he-IL/chat.json` around lines 314 - 315, The Hebrew
locale entry for autoApprove is still in English, so update the chat.json
translation to use Hebrew text consistent with the surrounding i18n strings.
Locate the autoApprove key in the he-IL locale file and replace the English
phrase with the proper Hebrew translation, keeping the existing key structure
unchanged.
src/renderer/src/i18n/vi-VN/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

New deleteMessage strings left untranslated (English) in Vietnamese locale file.

Same untranslated-string issue as the other locale files touched in this PR.

🌐 Suggested Vietnamese translations
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Xóa tin nhắn này?",
+    "description": "Hành động này sẽ xóa tin nhắn này và ngữ cảnh được tạo lại sau đó. Không thể hoàn tác.",
+    "confirm": "Xóa tin nhắn"
   }
🤖 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/i18n/vi-VN/dialog.json` around lines 89 - 93, The new
deleteMessage entries in the Vietnamese dialog.json are still in English, so
translate the title, description, and confirm strings to Vietnamese. Update the
deleteMessage block in the vi-VN locale file to match the existing localization
style used by other keys in this file and keep the same symbol names so the UI
reads localized text.
src/renderer/src/i18n/ru-RU/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

New deleteMessage strings left untranslated (English) in Russian locale file.

Same issue as other non-English locales — new keys should be translated to Russian.

🌐 Suggested Russian translations
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Удалить это сообщение?",
+    "description": "Это удалит сообщение и последующий воссозданный контекст. Это действие нельзя отменить.",
+    "confirm": "Удалить сообщение"
   }
🤖 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/i18n/ru-RU/dialog.json` around lines 89 - 93, The new
deleteMessage strings in the Russian locale are still in English; update the
deleteMessage entry in dialog.json to use Russian translations for title,
description, and confirm. Keep the existing structure and translate the text
consistently with the rest of the ru-RU messages so the locale file is fully
localized.
src/renderer/src/i18n/ja-JP/dialog.json-88-93 (1)

88-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated strings in ja-JP locale.

The new deleteMessage.title, description, and confirm values are left in English while every other key in this file is localized to Japanese.

🌐 Suggested fix
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "このメッセージを削除しますか?",
+    "description": "このメッセージと、その後に再生成されたコンテキストが削除されます。この操作は取り消せません。",
+    "confirm": "メッセージを削除"
   }
🤖 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/i18n/ja-JP/dialog.json` around lines 88 - 93, The new
deleteMessage strings in the ja-JP dialog locale are still in English, so
localize deleteMessage.title, deleteMessage.description, and
deleteMessage.confirm to Japanese to match the rest of the file. Update the
values in the dialog.json entry for deleteMessage and keep the same keys so the
existing translations continue to resolve correctly.
src/renderer/src/i18n/ms-MY/chat.json-330-331 (1)

330-331: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string in ms-MY locale.

autoApprove is left in English ("Approve for me") while the sibling fullAccess key is properly localized ("akses penuh"). This will show English text to Malay-locale users.

🌐 Suggested fix
-    "autoApprove": "Approve for me"
+    "autoApprove": "Luluskan untuk saya"
🤖 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/i18n/ms-MY/chat.json` around lines 330 - 331, The ms-MY
locale entry for autoApprove is still untranslated and should match the
surrounding localized strings. Update the autoApprove value in chat.json to a
Malay translation, using the existing i18n keys in that section (such as
fullAccess) as a reference to keep tone and style consistent.
src/renderer/src/i18n/de-DE/chat.json-328-332 (1)

328-332: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string in de-DE locale.

autoApprove value "Approve for me" is left in English rather than German, unlike the surrounding default/fullAccess entries.

🤖 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/i18n/de-DE/chat.json` around lines 328 - 332, The de-DE
locale entry for permissionMode contains an untranslated English string in
autoApprove. Update the chat.json translation so autoApprove matches the
surrounding German entries, using the existing permissionMode key to locate it
and replacing the English text with a proper German translation.
src/renderer/src/i18n/vi-VN/chat.json-328-332 (1)

328-332: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string in vi-VN locale.

autoApprove value "Approve for me" is left in English inside the Vietnamese locale file, while the sibling fullAccess/default keys are properly translated.

🤖 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/i18n/vi-VN/chat.json` around lines 328 - 332, The vi-VN
locale entry for permissionMode contains an untranslated English string in the
autoApprove key. Update the autoApprove value in
src/renderer/src/i18n/vi-VN/chat.json to a Vietnamese translation consistent
with the neighboring default and fullAccess entries, and keep the existing
permissionMode key structure unchanged.
src/renderer/src/i18n/ms-MY/dialog.json-88-93 (1)

88-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated deleteMessage strings in ms-MY locale.

title, description, and confirm are all in English rather than Malay, inconsistent with the rest of this locale file.

🤖 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/i18n/ms-MY/dialog.json` around lines 88 - 93, The
deleteMessage entries in the ms-MY dialog locale are still in English; update
the title, description, and confirm strings in the deleteMessage object to
proper Malay so this locale stays consistent with the rest of the file. Use the
deleteMessage keys in dialog.json as the target for the translation fix and
leave the structure unchanged.
src/main/presenter/agentRuntimePresenter/index.ts-3852-3858 (1)

3852-3858: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Use the live tool-loop messages for auto-approve review
reviewToolPermission still slices the initial messages snapshot from runStreamForMessage, while processStream clones that array into conversationMessages and mutates the clone during tool execution. The reviewer never sees the live tool-loop context. src/main/presenter/agentRuntimePresenter/index.ts:3852-3858

🤖 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/main/presenter/agentRuntimePresenter/index.ts` around lines 3852 - 3858,
The auto-approve review is using the stale `messages` snapshot instead of the
live tool-loop state, so update `reviewToolPermission` in
`agentRuntimePresenter` to slice from `conversationMessages` (the array mutated
by `processStream`) when calling `reviewToolPermissionForAutoApprove`. Keep the
same recent-message limit and abort signal, but ensure the reviewer sees the
current tool-execution context rather than the initial `runStreamForMessage`
payload.
src/renderer/src/i18n/id-ID/chat.json-330-331 (1)

330-331: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated string in Indonesian locale.

autoApprove is set to the English phrase "Approve for me" while all sibling keys (e.g. fullAccess: "akses penuh") are translated into Indonesian. This is inconsistent with the rest of the locale file.

🌐 Suggested Indonesian translation
-    "autoApprove": "Approve for me"
+    "autoApprove": "Setujui untuk saya"
🤖 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/i18n/id-ID/chat.json` around lines 330 - 331, The Indonesian
locale entry for autoApprove is still in English while neighboring strings in
chat.json are translated, so update that key to an Indonesian phrase consistent
with the rest of the file. Locate the autoApprove field alongside fullAccess in
the Indonesian chat translations and replace the English text with the proper
Indonesian translation.
src/renderer/src/i18n/fa-IR/dialog.json-89-93 (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated strings in fa-IR locale.

deleteMessage.title, description, and confirm are in English instead of Persian, inconsistent with the rest of the file.

🤖 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/i18n/fa-IR/dialog.json` around lines 89 - 93, The fa-IR
locale entry for deleteMessage still contains English strings, so translate
deleteMessage.title, deleteMessage.description, and deleteMessage.confirm into
Persian to match the rest of the dialog.json file. Update the deleteMessage
object in the fa-IR translation JSON and keep the meaning consistent with the
existing keys.
src/renderer/src/i18n/pt-BR/dialog.json-89-93 (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated strings in pt-BR locale.

The new deleteMessage.title, description, and confirm values are in English instead of Portuguese.

🤖 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/i18n/pt-BR/dialog.json` around lines 89 - 93, The pt-BR
dialog locale has untranslated `deleteMessage` strings; update the
`deleteMessage.title`, `deleteMessage.description`, and `deleteMessage.confirm`
entries in `dialog.json` to Portuguese, keeping the existing key structure
intact so the UI uses localized copy instead of English.
src/renderer/src/i18n/ja-JP/chat.json-314-315 (1)

314-315: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated string in ja-JP locale.

autoApprove value is left in English ("Approve for me") instead of being translated to Japanese, unlike the adjacent fullAccess key.

🤖 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/i18n/ja-JP/chat.json` around lines 314 - 315, The ja-JP chat
locale has an untranslated value for autoApprove, which is still in English
while nearby keys are localized. Update the autoApprove entry in the Japanese
translation file to a proper Japanese phrase, keeping it consistent with the
surrounding localization in chat.json and the existing i18n key naming.
src/renderer/src/i18n/fr-FR/chat.json-314-315 (1)

314-315: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated string in fr-FR locale.

autoApprove value ("Approve for me") isn't translated to French, unlike the neighboring fullAccess key.

🤖 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/i18n/fr-FR/chat.json` around lines 314 - 315, The fr-FR
locale has an untranslated value for the autoApprove key, while nearby entries
are localized. Update the chat.json entry for autoApprove in the French
translation file so it uses a proper French phrase consistent with the
surrounding localization strings, keeping the key name unchanged.
src/renderer/src/i18n/tr-TR/chat.json-330-331 (1)

330-331: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string in Turkish locale file.

permissionMode.autoApprove is left in English ("Approve for me") instead of Turkish, unlike the sibling fullAccess key.

🤖 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/i18n/tr-TR/chat.json` around lines 330 - 331, The
permissionMode.autoApprove entry in the Turkish chat locale is still in English,
so update the translation in the chat.json locale object alongside
permissionMode.fullAccess to use the correct Turkish text. Locate the string
value for autoApprove and replace it with a Turkish translation consistent with
the surrounding locale entries.
src/renderer/src/i18n/de-DE/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated strings in German locale file.

deleteMessage.title, description, and confirm remain in English instead of German.

🤖 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/i18n/de-DE/dialog.json` around lines 89 - 93, The
deleteMessage strings in the German locale are still in English, so update the
deleteMessage.title, deleteMessage.description, and deleteMessage.confirm
entries in the dialog.json translation block to proper German text. Keep the
same keys and structure, and verify the localized wording matches the existing
dialog message context.
src/renderer/src/i18n/fa-IR/chat.json-314-315 (1)

314-315: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string in Persian locale file.

permissionMode.autoApprove is in English ("Approve for me") while fullAccess and default in the same object are properly translated to Farsi.

🤖 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/i18n/fa-IR/chat.json` around lines 314 - 315, The
permissionMode.autoApprove entry in the fa-IR locale is still in English, unlike
the surrounding translations in the same object. Update the autoApprove value in
the chat.json locale file to a proper Farsi translation, keeping it consistent
with fullAccess and default and using the same key path reference
permissionMode.autoApprove.
src/renderer/src/i18n/pl-PL/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated strings in Polish locale file.

deleteMessage.title, description, and confirm are left in English instead of Polish.

🤖 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/i18n/pl-PL/dialog.json` around lines 89 - 93, The
deleteMessage strings in the pl-PL dialog locale are still in English; update
deleteMessage.title, deleteMessage.description, and deleteMessage.confirm in the
dialog.json translation entry to Polish. Use the existing dialog JSON structure
and keep the same keys so the localized copy is applied where deleteMessage is
referenced.
src/renderer/src/i18n/it-IT/dialog.json-89-93 (1)

89-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated strings in Italian locale file.

deleteMessage.title, description, and confirm are in English rather than Italian, unlike every other key in this file.

🌐 Suggested Italian translation
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Eliminare questo messaggio?",
+    "description": "Questo eliminerà il messaggio e il contesto rigenerato successivo. Questa azione non può essere annullata.",
+    "confirm": "Elimina messaggio"
   }
🤖 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/i18n/it-IT/dialog.json` around lines 89 - 93, The
deleteMessage entries in the Italian locale file are still in English; update
deleteMessage.title, deleteMessage.description, and deleteMessage.confirm in
dialog.json to proper Italian so they match the rest of the it-IT translations.
Use the deleteMessage key group in the locale JSON to locate and replace these
three strings consistently.
src/renderer/src/i18n/pt-BR/chat.json-312-316 (1)

312-316: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Untranslated string: autoApprove value is in English, not Portuguese.

"autoApprove": "Approve for me" appears to be the raw English source string left untranslated in a pt-BR locale file, unlike the sibling fullAccess key which is properly localized ("Acesso total"). Compare with the zh-HK equivalent in this same PR, which is correctly localized ("助手代審").

🌐 Suggested fix
   "permissionMode": {
     "default": "Permissões padrão",
     "fullAccess": "Acesso total",
-    "autoApprove": "Approve for me"
+    "autoApprove": "Aprovar para mim"
   },
🤖 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/i18n/pt-BR/chat.json` around lines 312 - 316, The
permissionMode.autoApprove translation in the pt-BR chat locale is still in
English and should be localized consistently with the other keys in this object.
Update the autoApprove value in chat.json to a Portuguese equivalent, matching
the style used by default and fullAccess, and verify the same key remains
correctly translated across related locale files.
src/renderer/src/i18n/id-ID/dialog.json-88-93 (1)

88-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

deleteMessage block is untranslated (still in English).

title, description, and confirm under deleteMessage are plain English strings while every other entry in this id-ID file is in Bahasa Indonesia (e.g. agentTransfer.deleteTitle). This will show English text to Indonesian-locale users.

🌐 Suggested fix
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Hapus pesan ini?",
+    "description": "Tindakan ini akan menghapus pesan ini dan konteks yang dibuat ulang setelahnya. Tindakan ini tidak dapat dibatalkan.",
+    "confirm": "Hapus pesan"
   }
🤖 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/i18n/id-ID/dialog.json` around lines 88 - 93, The
deleteMessage strings in the id-ID dialog translation are still in English and
should be localized to Bahasa Indonesia to match the rest of this file. Update
the title, description, and confirm values in the deleteMessage object in
dialog.json with Indonesian translations, keeping the same keys and structure
used by other translated entries like agentTransfer.deleteTitle.
src/renderer/src/i18n/tr-TR/dialog.json-89-93 (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated deleteMessage strings.

The new title, description, and confirm values are in English rather than Turkish, unlike every other string in this file.

🌐 Suggested fix (verify with a native speaker)
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Bu mesaj silinsin mi?",
+    "description": "Bu, mesajı ve sonrasında yeniden oluşturulan bağlamı silecektir. Bu işlem geri alınamaz.",
+    "confirm": "Mesajı sil"
   }
🤖 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/i18n/tr-TR/dialog.json` around lines 89 - 93, The new
deleteMessage copy in dialog.json is still in English, so localize the title,
description, and confirm values to Turkish to match the rest of the tr-TR file.
Update the strings under deleteMessage in the dialog translation object, keeping
the same keys and tone as nearby entries. Verify the wording is natural Turkish
and consistent with the existing translation style in this i18n file.
src/renderer/src/i18n/ru-RU/chat.json-314-315 (1)

314-315: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated autoApprove string.

"Approve for me" is English text left in the Russian locale file.

🌐 Suggested fix (verify with a native speaker)
   "permissionMode": {
     "default": "Разрешения по умолчанию",
     "fullAccess": "Полный доступ",
-    "autoApprove": "Approve for me"
+    "autoApprove": "Утверждать за меня"
   },
🤖 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/i18n/ru-RU/chat.json` around lines 314 - 315, The chat
locale entry for autoApprove is still in English in the Russian translation
file; update the autoApprove string in the ru-RU chat.json locale alongside
fullAccess so it uses a proper Russian translation instead of "Approve for me".
Keep the key name unchanged and ensure the translated text matches the
surrounding i18n values in this file.
src/renderer/src/i18n/fr-FR/dialog.json-89-93 (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated English strings in French locale file.

Same issue as the Danish locale: deleteMessage.title/description/confirm are copied verbatim in English rather than translated to French.

🌐 Suggested French translation (verify wording with a native speaker)
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Supprimer ce message ?",
+    "description": "Cela supprimera ce message ainsi que le contexte régénéré qui suit. Cette action est irréversible.",
+    "confirm": "Supprimer le message"
   }
🤖 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/i18n/fr-FR/dialog.json` around lines 89 - 93, The
deleteMessage strings in the French locale are still in English; translate the
title, description, and confirm copy in the fr-FR dialog.json entry. Update the
deleteMessage object so its text is proper French while keeping the same keys
and structure used by the locale file.
src/renderer/src/i18n/da-DK/dialog.json-89-93 (1)

89-93: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Untranslated English strings in Danish locale file.

The new deleteMessage.title/description/confirm strings are left in English instead of being translated to Danish, unlike every other key in this file (e.g. agentTransfer).

🌐 Suggested Danish translation (verify wording with a native speaker)
   "deleteMessage": {
-    "title": "Delete this message?",
-    "description": "This will delete this message and following regenerated context. This action cannot be undone.",
-    "confirm": "Delete message"
+    "title": "Slet denne besked?",
+    "description": "Dette vil slette denne besked og efterfølgende regenereret kontekst. Denne handling kan ikke fortrydes.",
+    "confirm": "Slet besked"
   }
🤖 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/i18n/da-DK/dialog.json` around lines 89 - 93, The new
deleteMessage strings in the Danish locale are still in English, so translate
the title, description, and confirm values in dialog.json to Danish to match the
rest of the file. Update the deleteMessage entry consistently with the existing
localized keys such as agentTransfer, keeping the same key structure and
replacing only the string values.
🧹 Nitpick comments (4)
docs/features/message-delete-confirmation/plan.md (1)

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

Hyphenate "keyboard-reachable".

Static analysis flags a missing hyphen: "keyboard reachable" should be "keyboard-reachable" when used as a compound modifier.

✏️ Suggested fix
-- Accessibility concerns: modal focus, Escape close, keyboard reachable cancel/confirm.
+- Accessibility concerns: modal focus, Escape close, keyboard-reachable cancel/confirm.
🤖 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 `@docs/features/message-delete-confirmation/plan.md` at line 29, The phrasing
in the plan note uses “keyboard reachable” as a compound modifier; update the
wording to “keyboard-reachable” in the accessibility concerns sentence. Make
this change in the relevant text around the message-delete-confirmation plan so
the description is hyphenated consistently and passes static analysis.

Source: Linters/SAST tools

src/main/presenter/agentSessionPresenter/index.ts (1)

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

Extract normalizePermissionMode to a shared helper

src/main/presenter/agentSessionPresenter/index.ts and src/main/presenter/agentRuntimePresenter/index.ts both implement the same permission-mode normalization. Move it to a shared helper so the rule stays single-sourced.

🤖 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/main/presenter/agentSessionPresenter/index.ts` around lines 120 - 123,
The permission-mode normalization logic is duplicated in both agent presenter
modules, so move normalizePermissionMode into a shared helper and have
agentSessionPresenter and agentRuntimePresenter import and use that single
implementation. Keep the existing behavior for PermissionMode values the same,
but centralize the logic in one reusable function so the rule is maintained in
one place.
src/renderer/src/pages/ChatPage.vue (1)

556-560: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Minor duplication: CSS.escape fallback repeated.

The same CSS.escape-with-regex-fallback pattern for building a [data-message-id="..."] selector also appears in focusPendingSpotlightMessageJump (lines 848-851). Consider extracting a small escapeMessageIdSelector(id) helper to avoid the two copies drifting apart.

♻️ Suggested helper
function escapeMessageIdSelector(id: string): string {
  return typeof CSS !== 'undefined' && typeof CSS.escape === 'function'
    ? CSS.escape(id)
    : id.replace(/["\\]/g, '\\$&')
}
🤖 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` around lines 556 - 560, The
selector-escaping logic for message IDs is duplicated in the message jump code
and in focusPendingSpotlightMessageJump, so extract it into a shared helper like
escapeMessageIdSelector(id) and use that in both places. Update the
currentAnchor.messageId selector building to call the helper, and reuse the same
helper anywhere else the [data-message-id="..."] selector is constructed so the
CSS.escape fallback stays consistent.
src/main/presenter/agentRuntimePresenter/dispatch.ts (1)

777-901: 🔒 Security & Privacy | 🔵 Trivial | 🏗️ Heavy lift

Heuristic-based tool classification for auto-review — confirm coverage is intentional.

isReviewableFullAccessToolCall and buildSyntheticPermissionForReview rely on substring matching against tool names ('file', 'search', 'settings', 'memory', 'skill', etc.) to decide whether an agent-sourced tool needs LLM review in auto_approve mode. This is broad by design (favoring more review over less), but it also means any agent tool whose name happens to contain one of these substrings (e.g., a hypothetical search_engine_status read-only tool) gets flagged as reviewable/full-access-worthy even if it's harmless, and conversely a tool with none of these substrings and no path/command in its args (e.g., a tool named run_task) will bypass review entirely. Given this heuristic is the security backbone of auto_approve mode for agent tools, consider driving classification off a declared capability/risk field on the tool definition rather than name substrings, going forward.

🤖 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/main/presenter/agentRuntimePresenter/dispatch.ts` around lines 777 - 901,
The auto-review classification in isReviewableFullAccessToolCall and
buildSyntheticPermissionForReview is overly dependent on tool-name substring
matching, which can both over-flag harmless tools and miss risky ones. Update
this logic to use an explicit capability/risk signal from the tool definition
instead of relying on names, and keep the existing argument-based checks in
collectStringValues, extractToolArgPaths, and extractToolArgCommand only as
secondary signals. Use the existing ToolExecutionContext and toolDef/toolContext
fields to locate the call sites and ensure the permission decision is driven by
declared metadata rather than heuristics.
🤖 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/main/presenter/agentRuntimePresenter/dispatch.ts`:
- Around line 903-944: In reviewAutoApproveAction, the decision handling is
fail-open because anything other than ask_user or block falls through to
auto_allow. Update the hooks.reviewToolPermission result handling to use an
explicit allow-list: only return auto_allow for a confirmed auto_allow decision,
keep ask_user for ask_user or missing/invalid results, and continue throwing on
block. Make the default path fail-closed so unexpected or malformed values from
reviewToolPermission do not auto-approve the tool call.

---

Minor comments:
In `@src/main/presenter/agentRuntimePresenter/index.ts`:
- Around line 3852-3858: The auto-approve review is using the stale `messages`
snapshot instead of the live tool-loop state, so update `reviewToolPermission`
in `agentRuntimePresenter` to slice from `conversationMessages` (the array
mutated by `processStream`) when calling `reviewToolPermissionForAutoApprove`.
Keep the same recent-message limit and abort signal, but ensure the reviewer
sees the current tool-execution context rather than the initial
`runStreamForMessage` payload.

In `@src/renderer/src/i18n/da-DK/chat.json`:
- Around line 314-315: The new chat translation entry for autoApprove is still
using the English placeholder text. Update the autoApprove value in the da-DK
chat.json localization to a proper Danish translation, matching the style of
nearby keys like fullAccess, so the i18n bundle contains no literal English for
this label.

In `@src/renderer/src/i18n/da-DK/dialog.json`:
- Around line 89-93: The new deleteMessage strings in the Danish locale are
still in English, so translate the title, description, and confirm values in
dialog.json to Danish to match the rest of the file. Update the deleteMessage
entry consistently with the existing localized keys such as agentTransfer,
keeping the same key structure and replacing only the string values.

In `@src/renderer/src/i18n/de-DE/chat.json`:
- Around line 328-332: The de-DE locale entry for permissionMode contains an
untranslated English string in autoApprove. Update the chat.json translation so
autoApprove matches the surrounding German entries, using the existing
permissionMode key to locate it and replacing the English text with a proper
German translation.

In `@src/renderer/src/i18n/de-DE/dialog.json`:
- Around line 89-93: The deleteMessage strings in the German locale are still in
English, so update the deleteMessage.title, deleteMessage.description, and
deleteMessage.confirm entries in the dialog.json translation block to proper
German text. Keep the same keys and structure, and verify the localized wording
matches the existing dialog message context.

In `@src/renderer/src/i18n/fa-IR/chat.json`:
- Around line 314-315: The permissionMode.autoApprove entry in the fa-IR locale
is still in English, unlike the surrounding translations in the same object.
Update the autoApprove value in the chat.json locale file to a proper Farsi
translation, keeping it consistent with fullAccess and default and using the
same key path reference permissionMode.autoApprove.

In `@src/renderer/src/i18n/fa-IR/dialog.json`:
- Around line 89-93: The fa-IR locale entry for deleteMessage still contains
English strings, so translate deleteMessage.title, deleteMessage.description,
and deleteMessage.confirm into Persian to match the rest of the dialog.json
file. Update the deleteMessage object in the fa-IR translation JSON and keep the
meaning consistent with the existing keys.

In `@src/renderer/src/i18n/fr-FR/chat.json`:
- Around line 314-315: The fr-FR locale has an untranslated value for the
autoApprove key, while nearby entries are localized. Update the chat.json entry
for autoApprove in the French translation file so it uses a proper French phrase
consistent with the surrounding localization strings, keeping the key name
unchanged.

In `@src/renderer/src/i18n/fr-FR/dialog.json`:
- Around line 89-93: The deleteMessage strings in the French locale are still in
English; translate the title, description, and confirm copy in the fr-FR
dialog.json entry. Update the deleteMessage object so its text is proper French
while keeping the same keys and structure used by the locale file.

In `@src/renderer/src/i18n/he-IL/chat.json`:
- Around line 314-315: The Hebrew locale entry for autoApprove is still in
English, so update the chat.json translation to use Hebrew text consistent with
the surrounding i18n strings. Locate the autoApprove key in the he-IL locale
file and replace the English phrase with the proper Hebrew translation, keeping
the existing key structure unchanged.

In `@src/renderer/src/i18n/he-IL/dialog.json`:
- Around line 89-93: The new deleteMessage entries in the Hebrew locale are
still in English; update the title, description, and confirm values in
dialog.json to proper Hebrew and keep the wording consistent with the rest of
the he-IL translations. Use the deleteMessage object as the target to replace
these three strings with localized text.

In `@src/renderer/src/i18n/id-ID/chat.json`:
- Around line 330-331: The Indonesian locale entry for autoApprove is still in
English while neighboring strings in chat.json are translated, so update that
key to an Indonesian phrase consistent with the rest of the file. Locate the
autoApprove field alongside fullAccess in the Indonesian chat translations and
replace the English text with the proper Indonesian translation.

In `@src/renderer/src/i18n/id-ID/dialog.json`:
- Around line 88-93: The deleteMessage strings in the id-ID dialog translation
are still in English and should be localized to Bahasa Indonesia to match the
rest of this file. Update the title, description, and confirm values in the
deleteMessage object in dialog.json with Indonesian translations, keeping the
same keys and structure used by other translated entries like
agentTransfer.deleteTitle.

In `@src/renderer/src/i18n/it-IT/chat.json`:
- Around line 330-331: The `autoApprove` entry in the Italian chat translation
is still using the English placeholder text, so update the `chat.json` locale
value for `autoApprove` to a proper Italian translation consistent with the
other locale files. Locate the `autoApprove` key in
`src/renderer/src/i18n/it-IT/chat.json` and replace the literal English phrase
with the localized Italian string.

In `@src/renderer/src/i18n/it-IT/dialog.json`:
- Around line 89-93: The deleteMessage entries in the Italian locale file are
still in English; update deleteMessage.title, deleteMessage.description, and
deleteMessage.confirm in dialog.json to proper Italian so they match the rest of
the it-IT translations. Use the deleteMessage key group in the locale JSON to
locate and replace these three strings consistently.

In `@src/renderer/src/i18n/ja-JP/chat.json`:
- Around line 314-315: The ja-JP chat locale has an untranslated value for
autoApprove, which is still in English while nearby keys are localized. Update
the autoApprove entry in the Japanese translation file to a proper Japanese
phrase, keeping it consistent with the surrounding localization in chat.json and
the existing i18n key naming.

In `@src/renderer/src/i18n/ja-JP/dialog.json`:
- Around line 88-93: The new deleteMessage strings in the ja-JP dialog locale
are still in English, so localize deleteMessage.title,
deleteMessage.description, and deleteMessage.confirm to Japanese to match the
rest of the file. Update the values in the dialog.json entry for deleteMessage
and keep the same keys so the existing translations continue to resolve
correctly.

In `@src/renderer/src/i18n/ms-MY/chat.json`:
- Around line 330-331: The ms-MY locale entry for autoApprove is still
untranslated and should match the surrounding localized strings. Update the
autoApprove value in chat.json to a Malay translation, using the existing i18n
keys in that section (such as fullAccess) as a reference to keep tone and style
consistent.

In `@src/renderer/src/i18n/ms-MY/dialog.json`:
- Around line 88-93: The deleteMessage entries in the ms-MY dialog locale are
still in English; update the title, description, and confirm strings in the
deleteMessage object to proper Malay so this locale stays consistent with the
rest of the file. Use the deleteMessage keys in dialog.json as the target for
the translation fix and leave the structure unchanged.

In `@src/renderer/src/i18n/pl-PL/dialog.json`:
- Around line 89-93: The deleteMessage strings in the pl-PL dialog locale are
still in English; update deleteMessage.title, deleteMessage.description, and
deleteMessage.confirm in the dialog.json translation entry to Polish. Use the
existing dialog JSON structure and keep the same keys so the localized copy is
applied where deleteMessage is referenced.

In `@src/renderer/src/i18n/pt-BR/chat.json`:
- Around line 312-316: The permissionMode.autoApprove translation in the pt-BR
chat locale is still in English and should be localized consistently with the
other keys in this object. Update the autoApprove value in chat.json to a
Portuguese equivalent, matching the style used by default and fullAccess, and
verify the same key remains correctly translated across related locale files.

In `@src/renderer/src/i18n/pt-BR/dialog.json`:
- Around line 89-93: The pt-BR dialog locale has untranslated `deleteMessage`
strings; update the `deleteMessage.title`, `deleteMessage.description`, and
`deleteMessage.confirm` entries in `dialog.json` to Portuguese, keeping the
existing key structure intact so the UI uses localized copy instead of English.

In `@src/renderer/src/i18n/ru-RU/chat.json`:
- Around line 314-315: The chat locale entry for autoApprove is still in English
in the Russian translation file; update the autoApprove string in the ru-RU
chat.json locale alongside fullAccess so it uses a proper Russian translation
instead of "Approve for me". Keep the key name unchanged and ensure the
translated text matches the surrounding i18n values in this file.

In `@src/renderer/src/i18n/ru-RU/dialog.json`:
- Around line 89-93: The new deleteMessage strings in the Russian locale are
still in English; update the deleteMessage entry in dialog.json to use Russian
translations for title, description, and confirm. Keep the existing structure
and translate the text consistently with the rest of the ru-RU messages so the
locale file is fully localized.

In `@src/renderer/src/i18n/tr-TR/chat.json`:
- Around line 330-331: The permissionMode.autoApprove entry in the Turkish chat
locale is still in English, so update the translation in the chat.json locale
object alongside permissionMode.fullAccess to use the correct Turkish text.
Locate the string value for autoApprove and replace it with a Turkish
translation consistent with the surrounding locale entries.

In `@src/renderer/src/i18n/tr-TR/dialog.json`:
- Around line 89-93: The new deleteMessage copy in dialog.json is still in
English, so localize the title, description, and confirm values to Turkish to
match the rest of the tr-TR file. Update the strings under deleteMessage in the
dialog translation object, keeping the same keys and tone as nearby entries.
Verify the wording is natural Turkish and consistent with the existing
translation style in this i18n file.

In `@src/renderer/src/i18n/vi-VN/chat.json`:
- Around line 328-332: The vi-VN locale entry for permissionMode contains an
untranslated English string in the autoApprove key. Update the autoApprove value
in src/renderer/src/i18n/vi-VN/chat.json to a Vietnamese translation consistent
with the neighboring default and fullAccess entries, and keep the existing
permissionMode key structure unchanged.

In `@src/renderer/src/i18n/vi-VN/dialog.json`:
- Around line 89-93: The new deleteMessage entries in the Vietnamese dialog.json
are still in English, so translate the title, description, and confirm strings
to Vietnamese. Update the deleteMessage block in the vi-VN locale file to match
the existing localization style used by other keys in this file and keep the
same symbol names so the UI reads localized text.

---

Duplicate comments:
In `@src/renderer/src/i18n/es-ES/dialog.json`:
- Around line 89-93: The deleteMessage entries in the es-ES dialog locale are
still in English. Update the title, description, and confirm strings in the
dialog.json translation block to Spanish, matching the existing localization
style used elsewhere in this locale file. Use the deleteMessage key to locate
and replace all three untranslated fields.

---

Nitpick comments:
In `@docs/features/message-delete-confirmation/plan.md`:
- Line 29: The phrasing in the plan note uses “keyboard reachable” as a compound
modifier; update the wording to “keyboard-reachable” in the accessibility
concerns sentence. Make this change in the relevant text around the
message-delete-confirmation plan so the description is hyphenated consistently
and passes static analysis.

In `@src/main/presenter/agentRuntimePresenter/dispatch.ts`:
- Around line 777-901: The auto-review classification in
isReviewableFullAccessToolCall and buildSyntheticPermissionForReview is overly
dependent on tool-name substring matching, which can both over-flag harmless
tools and miss risky ones. Update this logic to use an explicit capability/risk
signal from the tool definition instead of relying on names, and keep the
existing argument-based checks in collectStringValues, extractToolArgPaths, and
extractToolArgCommand only as secondary signals. Use the existing
ToolExecutionContext and toolDef/toolContext fields to locate the call sites and
ensure the permission decision is driven by declared metadata rather than
heuristics.

In `@src/main/presenter/agentSessionPresenter/index.ts`:
- Around line 120-123: The permission-mode normalization logic is duplicated in
both agent presenter modules, so move normalizePermissionMode into a shared
helper and have agentSessionPresenter and agentRuntimePresenter import and use
that single implementation. Keep the existing behavior for PermissionMode values
the same, but centralize the logic in one reusable function so the rule is
maintained in one place.

In `@src/renderer/src/pages/ChatPage.vue`:
- Around line 556-560: The selector-escaping logic for message IDs is duplicated
in the message jump code and in focusPendingSpotlightMessageJump, so extract it
into a shared helper like escapeMessageIdSelector(id) and use that in both
places. Update the currentAnchor.messageId selector building to call the helper,
and reuse the same helper anywhere else the [data-message-id="..."] selector is
constructed so the CSS.escape fallback stays consistent.
🪄 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: f7d043ca-aa92-4f66-aed7-78516a84169f

📥 Commits

Reviewing files that changed from the base of the PR and between 6bf2ba2 and 8b09e3c.

📒 Files selected for processing (107)
  • docs/features/assistant-permission-review-mode/plan.md
  • docs/features/assistant-permission-review-mode/spec.md
  • docs/features/assistant-permission-review-mode/tasks.md
  • docs/features/deepchat-skills-management/plan.md
  • docs/features/deepchat-skills-management/spec.md
  • docs/features/deepchat-skills-management/tasks.md
  • docs/features/message-delete-confirmation/plan.md
  • docs/features/message-delete-confirmation/spec.md
  • docs/features/message-delete-confirmation/tasks.md
  • docs/features/tool-call-review-status-indicator/plan.md
  • docs/features/tool-call-review-status-indicator/spec.md
  • docs/features/tool-call-review-status-indicator/tasks.md
  • docs/issues/assistant-loading-placeholder-delay/plan.md
  • docs/issues/assistant-loading-placeholder-delay/spec.md
  • docs/issues/assistant-loading-placeholder-delay/tasks.md
  • docs/issues/session-restore-scroll-intent/plan.md
  • docs/issues/session-restore-scroll-intent/spec.md
  • docs/issues/session-restore-scroll-intent/tasks.md
  • resources/acp-registry/registry.json
  • resources/model-db/providers.json
  • src/main/presenter/agentRuntimePresenter/dispatch.ts
  • src/main/presenter/agentRuntimePresenter/index.ts
  • src/main/presenter/agentRuntimePresenter/types.ts
  • src/main/presenter/agentSessionPresenter/index.ts
  • src/main/presenter/memoryPresenter/index.ts
  • src/main/presenter/memoryPresenter/lifecycle.ts
  • src/main/presenter/sqlitePresenter/tables/deepchatSessions.ts
  • src/main/presenter/toolPresenter/index.ts
  • src/main/routes/index.ts
  • src/renderer/api/MemoryClient.ts
  • src/renderer/api/SessionClient.ts
  • src/renderer/settings/components/MemoryManagerPanel.vue
  • src/renderer/settings/components/skills/SkillCard.vue
  • src/renderer/settings/components/skills/SkillDetailDialog.vue
  • src/renderer/settings/components/skills/SkillsSettings.vue
  • src/renderer/src/components/chat/ChatStatusBar.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/MessageBlockImage.vue
  • src/renderer/src/components/message/MessageBlockToolCall.vue
  • src/renderer/src/i18n/da-DK/chat.json
  • src/renderer/src/i18n/da-DK/dialog.json
  • src/renderer/src/i18n/de-DE/chat.json
  • src/renderer/src/i18n/de-DE/dialog.json
  • src/renderer/src/i18n/en-US/chat.json
  • src/renderer/src/i18n/en-US/dialog.json
  • src/renderer/src/i18n/es-ES/chat.json
  • src/renderer/src/i18n/es-ES/dialog.json
  • src/renderer/src/i18n/fa-IR/chat.json
  • src/renderer/src/i18n/fa-IR/dialog.json
  • src/renderer/src/i18n/fr-FR/chat.json
  • src/renderer/src/i18n/fr-FR/dialog.json
  • src/renderer/src/i18n/he-IL/chat.json
  • src/renderer/src/i18n/he-IL/dialog.json
  • src/renderer/src/i18n/id-ID/chat.json
  • src/renderer/src/i18n/id-ID/dialog.json
  • src/renderer/src/i18n/it-IT/chat.json
  • src/renderer/src/i18n/it-IT/dialog.json
  • src/renderer/src/i18n/ja-JP/chat.json
  • src/renderer/src/i18n/ja-JP/dialog.json
  • src/renderer/src/i18n/ko-KR/chat.json
  • src/renderer/src/i18n/ko-KR/dialog.json
  • src/renderer/src/i18n/ms-MY/chat.json
  • src/renderer/src/i18n/ms-MY/dialog.json
  • src/renderer/src/i18n/pl-PL/chat.json
  • src/renderer/src/i18n/pl-PL/dialog.json
  • src/renderer/src/i18n/pt-BR/chat.json
  • src/renderer/src/i18n/pt-BR/dialog.json
  • src/renderer/src/i18n/ru-RU/chat.json
  • src/renderer/src/i18n/ru-RU/dialog.json
  • src/renderer/src/i18n/tr-TR/chat.json
  • src/renderer/src/i18n/tr-TR/dialog.json
  • src/renderer/src/i18n/vi-VN/chat.json
  • src/renderer/src/i18n/vi-VN/dialog.json
  • src/renderer/src/i18n/zh-CN/chat.json
  • src/renderer/src/i18n/zh-CN/dialog.json
  • src/renderer/src/i18n/zh-HK/chat.json
  • src/renderer/src/i18n/zh-HK/dialog.json
  • src/renderer/src/i18n/zh-TW/chat.json
  • src/renderer/src/i18n/zh-TW/dialog.json
  • src/renderer/src/pages/ChatPage.vue
  • src/renderer/src/stores/ui/message.ts
  • src/shared/contracts/common.ts
  • src/shared/contracts/domainSchemas.ts
  • src/shared/contracts/routes/memory.routes.ts
  • src/shared/types/agent-interface.d.ts
  • test/main/presenter/agentRuntimePresenter/agentRuntimePresenter.test.ts
  • test/main/presenter/agentRuntimePresenter/dispatch.test.ts
  • test/main/presenter/agentSessionPresenter/integration.test.ts
  • test/main/presenter/memoryLifecycle.test.ts
  • test/main/routes/contracts.test.ts
  • test/main/routes/dispatcher.test.ts
  • test/main/routes/memoryDto.test.ts
  • test/renderer/api/clients.test.ts
  • test/renderer/components/ChatPage.test.ts
  • test/renderer/components/ChatStatusBar.test.ts
  • test/renderer/components/MarkdownRenderer.test.ts
  • test/renderer/components/MemoryManagerDialog.test.ts
  • test/renderer/components/MessageListRow.test.ts
  • test/renderer/components/NewThreadPage.onboarding.test.ts
  • test/renderer/components/NewThreadPage.test.ts
  • test/renderer/components/SkillSyncSettings.test.ts
  • test/renderer/components/SkillsSettingsAgentScope.test.ts
  • test/renderer/components/message/MessageBlockMedia.test.ts
  • test/renderer/components/message/MessageBlockToolCall.test.ts
  • test/renderer/stores/messageStore.test.ts

Comment thread src/main/presenter/agentRuntimePresenter/dispatch.ts

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/main/presenter/agentRuntimePresenter/dispatch.ts (1)

916-921: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Only show reviewing when a reviewer hook exists.

This toggles and flushes the reviewing state before checking whether hooks.reviewToolPermission is actually present. In the no-hook path the function immediately falls back to 'ask_user', so the UI can briefly show a review that never started.

Suggested fix
 }): Promise<'auto_allow' | 'ask_user'> {
   const { hooks, io, state, rendererFlushHandle, execution, permission, reason } = params
-  if (setToolCallAutoApproveReviewing(state.blocks, execution.completedToolCall.id, true)) {
+  const hasReviewer = Boolean(hooks?.reviewToolPermission)
+  if (hasReviewer && setToolCallAutoApproveReviewing(state.blocks, execution.completedToolCall.id, true)) {
     state.dirty = true
     rendererFlushHandle.flush()
   }
   try {
     const result = await hooks?.reviewToolPermission?.({
@@
   } finally {
-    if (setToolCallAutoApproveReviewing(state.blocks, execution.completedToolCall.id, false)) {
+    if (
+      hasReviewer &&
+      setToolCallAutoApproveReviewing(state.blocks, execution.completedToolCall.id, false)
+    ) {
       state.dirty = true
       rendererFlushHandle.flush()
     }
   }

Also applies to: 942-944

🤖 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/main/presenter/agentRuntimePresenter/dispatch.ts` around lines 916 - 921,
The reviewing state is being set and flushed before confirming that
hooks.reviewToolPermission exists, which can briefly show a review UI in the
no-hook path. Update the dispatch flow in the reviewToolPermission handling so
the setToolCallAutoApproveReviewing call and rendererFlushHandle.flush only
happen after verifying the reviewer hook is present, keeping the reviewing state
gated to the actual hook-driven path. Use the surrounding dispatch logic and
hooks.reviewToolPermission branch to locate the change.
🤖 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.

Outside diff comments:
In `@src/main/presenter/agentRuntimePresenter/dispatch.ts`:
- Around line 916-921: The reviewing state is being set and flushed before
confirming that hooks.reviewToolPermission exists, which can briefly show a
review UI in the no-hook path. Update the dispatch flow in the
reviewToolPermission handling so the setToolCallAutoApproveReviewing call and
rendererFlushHandle.flush only happen after verifying the reviewer hook is
present, keeping the reviewing state gated to the actual hook-driven path. Use
the surrounding dispatch logic and hooks.reviewToolPermission branch to locate
the change.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 10f1a278-f244-4f2e-9c7c-c0e690797a7e

📥 Commits

Reviewing files that changed from the base of the PR and between 8b09e3c and 565d9c4.

📒 Files selected for processing (4)
  • src/main/presenter/agentRuntimePresenter/dispatch.ts
  • src/renderer/src/pages/ChatPage.vue
  • test/main/presenter/agentRuntimePresenter/dispatch.test.ts
  • test/renderer/components/ChatPage.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/renderer/src/pages/ChatPage.vue
  • test/renderer/components/ChatPage.test.ts

@zerob13
zerob13 merged commit ec18d24 into dev Jul 1, 2026
3 checks passed
@zhangmo8
zhangmo8 deleted the codex/assistant-loading-placeholder-docs branch July 7, 2026 05:47
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.

2 participants