Skip to content

feat(desktop): add default permission mode for new chats - #3429

Open
Tommy00748 wants to merge 2 commits into
makecindy:mainfrom
Tommy00748:feat/new-chat-default-permission
Open

feat(desktop): add default permission mode for new chats#3429
Tommy00748 wants to merge 2 commits into
makecindy:mainfrom
Tommy00748:feat/new-chat-default-permission

Conversation

@Tommy00748

Copy link
Copy Markdown

这次改了什么

摘要

新增「新建对话默认权限」设置项,让用户统一控制新对话的权限模式(自动审批 / 完全访问),避免每次新建对话手动切换。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:建议新增「新建对话的默认权限模式」设置,允许默认 Full Access #3428
  • 本 PR 包含:
    • newMakerDraft store 新增 newChatDefaultPermissionMode 全局 override + permissionModeChosenByVendor 显式选择标记
    • Settings → General 新增 NewChatDefaultPermissionSection(PermissionSelector + 恢复默认)
    • useCCSessions 新建会话时读全局默认而非硬编码 auto
    • i18n 五语言文案
  • 明确不包含:IM/worker 渠道的默认权限、服务端偏好存储
  • 用户可见变化:设置里多一个「新建对话默认权限」项
  • 是否存在 breaking change:无

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md(双模式 §、设置面板字段布局、语义 token);复用现有 PermissionSelector/DefaultOverrideControlssettings-section-* semantic tokens,末行 hint 用 settings-section-sublabel。仅实现 Light 模式实机验证,Dark 复用 themed token 未实机目检。

怎么验证的

自动验证

tsc --noEmit -p tsconfig.json       → 0 errors
eslint src/renderer/...(改动文件)  → 0 errors
vitest run newMakerDraft.test.ts + i18nCompleteness + deviceLinkDraftFlow  → 68 passed
node scripts/check-i18n-glossary.mjs → 无新增违规(4 处 lead 为存量 proposed)

手工验证

  • 平台:未实机启动桌面端验证(仅静态/类型/单测验证)。
  • 未执行:桌面端实机交互、Dark 模式目检。

未执行的验证

  • 实机启动(重 electron 环境):未执行。改动命中 UI 路径但仅做了类型/单测/规范检查,未做运行时视觉目检。

Add a "default permission mode for new chats" setting that lets users
choose between Auto-review and Full access for newly created chats.

- newMakerDraft: add newChatDefaultPermissionMode override + permissionModeChosenByVendor marker
- Settings -> General: NewChatDefaultPermissionSection with PermissionSelector + restore-default
- useCCSessions: read the global default instead of hardcoding auto on create
- i18n: en/zh-CN/zh-TW/ja/ko

Signed-off-by: Tommy00748 <Tommy00748@gmail.com>
@Tommy00748
Tommy00748 requested a review from a team as a code owner August 25, 2026 23:45
@greptile-apps

greptile-apps Bot commented Aug 25, 2026

Copy link
Copy Markdown

Greptile Summary

新增桌面端“新建对话默认权限”设置,并将其保存在按 owner 分区的 renderer 草稿状态中,用于初始化新会话权限。

  • 设置页新增权限选择器、恢复默认控制及五种语言文案
  • newMakerDraft 新增全局 override 和逐 vendor 显式选择标记
  • 会话创建的缺省权限改为读取全局 override
  • 当前旧版逐 vendor 权限数据缺少新标记,修改全局设置时可能被覆盖

Confidence Score: 4/5

合并前需要修复旧版逐 vendor 权限选择被新全局默认静默覆盖的问题。

新标记在旧持久化数据中不存在,而 setter 将所有缺少标记的 vendor 当成未显式选择并重写权限,因此升级用户修改全局默认后会丢失原有权限选择。

Files Needing Attention: apps/desktop/src/renderer/state/newMakerDraft.ts

Important Files Changed

Filename Overview
apps/desktop/src/renderer/state/newMakerDraft.ts 新增默认权限持久化及显式选择跟踪,但旧数据迁移会丢失显式选择语义,且新字段缺少枚举成员校验。
apps/desktop/src/renderer/hooks/useCCSessions.ts 会话创建增加全局权限缺省值;现有调用方均显式传值,因此当前路径不会被意外改变。
apps/desktop/src/renderer/components/settings/NewChatDefaultPermissionSection.tsx 新设置组件复用现有权限选择器和恢复默认控件,公开 auto 与 bypassPermissions 两档。
apps/desktop/src/renderer/components/settings/SettingsView.tsx 将新权限设置区块接入通用设置页。
apps/desktop/src/renderer/tests/newMakerDraft.test.ts 覆盖默认值、持久化、重置和非字符串脏值,但未覆盖升级前已有显式 vendor 权限再修改全局默认的迁移场景。
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/renderer/state/newMakerDraft.ts:697-701
**迁移后会覆盖旧权限选择**

当升级前的用户已为某个 vendor 显式选择非默认权限时,旧数据没有 `permissionModeChosenByVendor` 标记,因此这里会将其视为未显式选择并用全局默认值覆盖。用户修改全局默认后,原有逐 vendor 权限会被静默替换并持久化,例如 `acceptEdits` 会被放宽为 `bypassPermissions`,导致后续新对话使用错误权限。

### Issue 2
apps/desktop/src/renderer/state/newMakerDraft.ts:350-353
**权限值缺少枚举校验**

这里将 localStorage 中的任意字符串强转为 `PermissionMode`,专用 setter 也只验证字符串类型。未知值会继续写入 vendor 草稿并传给会话创建流程,而选择器只会将其归一化后展示,造成界面显示与实际持久化权限不一致,并把不受支持的权限值传给下游。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(desktop): add default permission mo..." | Re-trigger Greptile

Comment thread apps/desktop/src/renderer/state/newMakerDraft.ts
Comment thread apps/desktop/src/renderer/state/newMakerDraft.ts Outdated
Address Greptile review:

Issue 1 - Migration: legacy data lacks permissionModeChosenByVendor, so
an explicit vendor permission (e.g. acceptEdits) could be silently
overwritten by the global default. In sanitize, tag any vendor whose
persisted permission is non-seed (non auto/plan) as explicitly chosen so
the global default never overrides it.

Issue 2 - Validation: only accept known permission-mode enum values in
sanitize and the setter; unknown strings normalize to the seed default
instead of leaking into the vendor draft and session creation.

Signed-off-by: Tommy00748 <Tommy00748@gmail.com>
@Tommy00748

Copy link
Copy Markdown
Author

Re-triggering Greptile review on the latest commit.

@Tommy00748

Copy link
Copy Markdown
Author

👋 Hi maintainers — first-time contributor here, and this PR is blocking on first-run CI approval.

Feature: adds a "default permission mode for new chats" setting (Auto-review / Full access), so users don't have to switch permissions manually on every new chat. Tracks issue #3428.

What changed:

  • newMakerDraft: new newChatDefaultPermissionMode global override + permissionModeChosenByVendor marker (opt-in, off by default — unchanged behavior unless a user sets it).
  • Settings → General: NewChatDefaultPermissionSection (reuses existing PermissionSelector + restore-default).
  • useCCSessions: read the global default instead of hardcoding auto.
  • i18n for en / zh-CN / zh-TW / ja / ko.

Greptile raised 2 points, both addressed in the latest commit d64c0f3:

  1. Migration would silently overwrite a vendor's explicit permission (e.g. acceptEdits) with the global default → now we tag any non-seed permission in sanitize, so the global default never overrides an explicit choice.
  2. Permission values lacked enum validation → now validated against the known mode set; unknown values normalize to the seed default.

Verification (all green locally):

  • tsc --noEmit -p tsconfig.json → 0 errors
  • eslint on changed files → 0 errors
  • vitest (newMakerDraft + i18nCompleteness + deviceLinkDraftFlow) → 63 passed
  • check-i18n-glossary → no new violations

The pr-design-basis / client-ci runs are showing action_required without logs — likely waiting on first-run approval for a fork PR. Could a maintainer approve so CI can run? Happy to make any adjustments. 🙏

@MagicLizi

Copy link
Copy Markdown
Contributor

@Tommy00748 👋 这个 PR 还有 2 条 review conversation 没 resolve(apps/desktop/src/renderer/state/newMakerDraft.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) awaiting-discussion 等待维护者讨论(review-pr) labels Aug 26, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 新增了「新建任务默认权限」设置,属于产品行为变化,需要维护者确认后再合。

请维护者在本 PR 上 Approve 放行;如果要改,请 Request Changes,作者改完后再 Approve。
讨论 issue:#3431

@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/settings/NewChatDefaultPermissionSection.tsx / apps/desktop/src/renderer/components/settings/SettingsView.tsx / apps/desktop/src/renderer/hooks/useCCSessions.ts 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。

@Tommy00748

Copy link
Copy Markdown
Author

补充 UI 依据(回应 review-pr 的 ui-evidence-notice):

设置的视觉与交互复用现有组件,没有自建样式:

  • 选择器:PermissionSelectortriggerVariant="field"(与现有设置页表单字段同 radius/同边框/同 token,注释见该组件)。
  • 恢复默认:DefaultOverrideControlsisCustomized + onReset,与 GitSafety / Subagent 等现有设置一致)。
  • 标题/描述/hint:text-[var(--settings-section-title)] / text-[var(--settings-section-desc)] / text-[var(--settings-section-sublabel)] semantic token,与 ImDefaultSettingsSection / SubagentModelSection 逐字一致。
  • 档位仅暴露 auto / bypassPermissions 两档(产品批准子集)。

未附实机截图的说明:我没有运行 Cindy 桌面端的实机环境,无法产出真实运行截图/录屏;上面列出的是可核对的代码级复用证据(同样的组件与 token 已在现有设置页使用)。若维护者需要,我可以把改动后的界面渲染成 HTML 示意,但真实像素效果仍以实机为准。

@Tommy00748

Copy link
Copy Markdown
Author

@MagicLizi 想请你帮忙看一下这个 PR 能否放行。

总结一下目前的进展和状态:

  • 功能:「新建任务默认权限」设置(自动审批 / 完全访问),只在新建任务草稿 / 会话创建路径生效,不碰 IM / worker 渠道。
  • 产品口径已确认:默认 auto(自动审批),完全访问需用户显式开启,不静默放宽任何权限(已同步到 issue 维护者确认:PR #3429 新增「新建任务默认权限」设置 #3431)。
  • Greptile 提的 2 条意见(迁移覆盖 / 枚举校验)已在 d64c0f3 修复,review conversation 也已 resolve。
  • 本地验证全通过:typecheck 0 错误、eslint 0 错误、63 个单测、i18n 完整性、glossary 无违规、DCO pass。

现在卡在产品 gate(issue #3431)需要维护者确认放行,以及首次贡献者的 CI 需要批准运行。如果方便的话,请在此 PR 上 Approve 放行,或告诉我还有什么需要调整的?谢谢 🙏

/cc @makecindy/maintainers

@MagicLizi

Copy link
Copy Markdown
Contributor

@Tommy00748 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants