Skip to content

feat(desktop): add safe iOS Simulator deletion - #3726

Merged
GaoWeiLiuXD merged 1 commit into
makecindy:mainfrom
horizon554:codex/ios-simulator-delete-device
Sep 2, 2026
Merged

feat(desktop): add safe iOS Simulator deletion#3726
GaoWeiLiuXD merged 1 commit into
makecindy:mainfrom
horizon554:codex/ios-simulator-delete-device

Conversation

@horizon554

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

为 Desktop 内置 iOS 模拟器面板补充安全的设备删除能力,解决每个任务绑定一个 Cindy 模拟器后,设备列表可能持续累积的问题。

  • 仅对 creationProvenance === "cindy" 的设备显示删除入口;外部创建的模拟器继续禁止删除。
  • 删除由可信 Renderer IPC 发起,不注册为 Agent 可调用的 MCP tool。
  • 删除前依次清理构建、录制、Driver、Sidecar、Viewer 等 Host 运行期资源;运行中的设备会自动关机后再删除。
  • 删除使用精确的 session / instance / generation / lease 路由,并阻止删除期间排队的 Viewer 恢复重新启动资源。
  • 当物理设备已删除、但所有权记录持久化失败时,后续重试会释放残留绑定,不会形成无法清理的幽灵设备。
  • 确认按钮使用完整的“删除设备”文案,并在弹窗打开时聚焦主操作按钮;五种语言同步更新。
  • 为 Node 22 下 tsx 可能返回 CommonJS-shaped default namespace 的情况补充现有 doc-tools 子进程测试兼容,不改变 doc-tools 产品逻辑。

变更类型

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

范围

  • 关联 Issue / 需求:内置模拟器设备列表随任务累积,需要为已绑定的 Cindy 创建设备提供显式安全删除能力。
  • 本 PR 包含:Desktop 内置面板、可信 Renderer IPC、iOS Simulator Host/runtime 删除链、五语言文案与回归测试。
  • 明确不包含:删除外部创建的模拟器、向 Agent/MCP 暴露删除工具、修改任务归档自动清理策略、服务端或插件仓库改动。
  • 用户可见变化:Cindy 创建的模拟器在运行和停止状态都会显示“删除设备”;运行中删除会提示自动清理资源并关机。
  • 是否存在 breaking change:无。

UI 变化

  • 截图 / 录屏:本轮最终补丁未重新录制;交互状态由 Renderer jsdom 回归测试覆盖。
  • 引用的设计规范:
    • docs/design-rules/DESIGN.md §11.1:操作按钮使用“动词 + 对象”,确认按钮为“删除设备”,不使用裸“删除”。
    • docs/design-rules/DESIGN.md §14.2:确认框打开后焦点落到主操作按钮,并由焦点回归测试锁定。
    • 删除确认复用共享 ConfirmDialog 与其 destructive 语义 token,未新增单模式或硬编码颜色。

怎么验证的

自动验证

pnpm test:unit:related
结果:全部必跑 workspace 通过,包括 Desktop、Mobile、@cindy/ios-simulator-runtime 与 maker-core。

pnpm --filter @cindy/ios-simulator-runtime exec vitest run src/instance-actor.test.ts
结果:46/46 通过。

pnpm --filter desktop exec vitest run src/main/mcp-integrations/__tests__/ios-simulator.test.ts src/main/maker-ipc/__tests__/iosSimulatorHandlers.test.ts src/renderer/features/right-sidebar/plugins/ios-simulator/__tests__/IOSSimulatorTabBody.test.tsx
结果:213/213 通过。

pnpm --filter desktop run --if-present typecheck
结果:通过。

pnpm --filter @cindy/ios-simulator-runtime run --if-present typecheck
pnpm --filter @cindy/ios-simulator-runtime build
结果:通过(runtime 无 typecheck script,build 执行 tsc --noEmit)。

pnpm check:i18n
pnpm check:i18n-glossary
结果:通过;仅存量非阻塞告警。

pnpm check:dco
git diff --check
结果:通过。

手工验证

  • 最终补丁未重新执行可视化实机验证。

未执行的验证

  • 未重新启动隔离 CN Desktop 实例录制删除操作;删除顺序、失败保留、半成功重试、运行中自动关机、外部设备拒绝及 Viewer 恢复竞态均由自动化测试覆盖。
  • 未验证 Windows/Linux UI;iOS Simulator Host 仅在本地 macOS 可用,Renderer 复用跨平台共享组件。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:仅 Desktop 本地 macOS 的内置 iOS Simulator 面板,以及 Cindy 创建并由当前任务精确持有的模拟器。删除会永久移除该模拟器中的 App、账号和数据,操作前有明确确认。
  • 安全边界:外部设备在 UI 隐藏删除按钮,Host/runtime 仍做来源、所有权、generation、lease 和控制授权校验;Agent/MCP 无删除入口。
  • 回滚 / 降级方式:回滚本提交即可移除删除入口和 Host 调用;无 schema 或持久数据迁移。已经由用户确认删除的模拟器及其中数据无法通过代码回滚恢复。
  • 存量插件影响:无;未修改插件批准状态、指纹、manifest、安装布局或包格式。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(本次无需新增产品文档,行为与边界由 UI 文案及测试覆盖)
  • 已确认测试结果或说明未执行原因

Expose trusted-renderer deletion for Cindy-created simulators, clean up active runtime resources before removal, and keep retries idempotent after partial persistence failures. Update confirmation copy and focus behavior with regression coverage. Also make the existing doc-tools utility-process probe accept tsx CommonJS-shaped module namespaces so the required unit gate passes on Node 22.

Signed-off-by: JiangJiahao <jiangjiahao@xd.com>
@horizon554
horizon554 requested a review from a team as a code owner September 1, 2026 07:18
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 为 Desktop 内置 iOS Simulator 面板增加仅限 Cindy 创建设备的确认删除能力,并将删除请求限制在可信 Renderer IPC 路径。主要变更包括:

  • 删除前取消构建并释放录制、Driver、Sidecar、Viewer 等运行期资源,随后关机并执行精确设备删除。
  • 使用 session、instance、generation 和 lease 路由校验,并通过 teardown admission 阻止删除期间的 Viewer 恢复。
  • 处理物理设备已删除但所有权记录尚未释放的重试场景。
  • 增加确认弹窗、五种语言文案以及 Host、IPC、Renderer 和 actor 层回归测试。
  • 调整 doc-tools 子进程测试以兼容 Node 22 下 tsx 的 CommonJS-shaped namespace。

Confidence Score: 5/5

此 PR 看起来可以安全合并,删除路径具备可信 IPC、精确所有权路由、来源限制、确认交互和完整资源清理保护。

已检查的删除入口、Host 生命周期顺序、actor 持久化重试及并发准入机制形成了完整的防护链,未发现会导致误删、权限绕过、幽灵绑定或资源重新启动的具体缺陷。

Important Files Changed

Filename Overview
apps/desktop/src/main/mcp-integrations/ios-simulator.ts 新增 Renderer 专用删除分支、统一运行期资源清理以及 Viewer recovery teardown 准入检查,未发现可发布缺陷。
packages/ios-simulator-runtime/src/instance-actor.ts 删除前确认精确设备存在,并支持物理删除成功但持久化释放失败后的安全重试。
apps/desktop/src/shared/iosSimulatorIpc.ts 将 delete_instance 加入 Renderer 工具类型,同时保持其不属于 MCP 工具注册集合。
apps/desktop/src/renderer/features/right-sidebar/plugins/ios-simulator/IOSSimulatorTabBody.tsx 仅为 Cindy 创建设备展示删除入口,并通过 destructive ConfirmDialog 发起精确路由删除。
apps/desktop/src/main/maker-ipc/tests/iosSimulatorHandlers.test.ts 补充可信 Renderer 删除调用的 IPC 参数校验与 Host 转发覆盖。
apps/desktop/src/main/mcp-integrations/tests/ios-simulator.test.ts 覆盖停止与运行设备删除、资源清理顺序、外部设备拒绝、失败保留和 Viewer recovery 竞态。
packages/ios-simulator-runtime/src/instance-actor.test.ts 覆盖物理删除后所有权持久化失败并重试释放绑定的场景。

Sequence Diagram

sequenceDiagram
  participant U as 用户
  participant R as Trusted Renderer
  participant I as Main IPC
  participant H as Simulator Host
  participant A as Instance Actor
  participant S as CoreSimulator
  U->>R: 确认删除 Cindy 设备
  R->>I: delete_instance(session, instance, generation, lease)
  I->>I: 校验可信窗口与会话访问
  I->>H: 用户来源的精确路由调用
  H->>H: 阻止新启动并清理运行期资源
  H->>A: stop(route)
  A->>S: 必要时 shutdown
  H->>A: delete(updated route)
  A->>S: findExact / deleteExact
  A->>A: 释放所有权记录
  A-->>H: 删除结果
  H-->>R: 刷新设备与绑定状态
Loading

Reviews (1): Last reviewed commit: "feat(desktop): add safe simulator deleti..." | Re-trigger Greptile

@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 给内置 iOS 模拟器加了删除设备能力,属于新产品交互,也改到了模拟器 Host/runtime 删除链,先进入维护者确认,不自动合并。

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

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Sep 1, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/features/right-sidebar/plugins/ios-simulator/IOSSimulatorTabBody.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

@horizon554

Copy link
Copy Markdown
Contributor Author

补充UI截图,新增删除设备按钮
image
image

@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Sep 2, 2026
@GaoWeiLiuXD
GaoWeiLiuXD merged commit 2a03917 into makecindy:main Sep 2, 2026
11 checks passed
@horizon554
horizon554 deleted the codex/ios-simulator-delete-device branch September 2, 2026 03:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants