Skip to content

feat(orca): surface Worker permission attention safely - #3266

Open
Beautyl0ve wants to merge 1 commit into
makecindy:mainfrom
Beautyl0ve:feat/cindy-2532-worker-permission-attention
Open

feat(orca): surface Worker permission attention safely#3266
Beautyl0ve wants to merge 1 commit into
makecindy:mainfrom
Beautyl0ve:feat/cindy-2532-worker-permission-attention

Conversation

@Beautyl0ve

@Beautyl0ve Beautyl0ve commented Aug 22, 2026

Copy link
Copy Markdown

Draft PR — feat(orca): surface Worker permission attention safely

这次改了什么

摘要

Orca Worker 在后台等待权限时,Lead 目前既没有可靠的 Worker attention,也会被
Agent Island 的 Worker 降噪策略整体过滤。本 PR 把 permission 建模为独立、按
requestId 清理的 attention 原因,并只为这类阻塞交互开放一个 focus-only
Agent Island 提醒。

提醒不会携带原始命令或暴露原生批准按钮;用户必须回到 Cindy 内已有的权限卡,
查看完整命令后再决定。普通 Worker 消息、工具事件和其他交互仍保持静默。

变更类型

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

范围

  • 关联 Issue / 需求:Fixes feat: feature(orca): 协同 Worker 请求授权时没有提醒,希望对齐对话模式 #2532
  • 本 PR 包含:Worker done / permission 多原因 attention、pending permission
    投影、侧栏聚合等待态、permission-only Agent Island 策略、focus-only 安全投影、
    session-owner dismissal、文档与回归测试。
  • 明确不包含:开放其他 Worker 通知;在原生 Agent Island 直接批准 Worker 命令;
    修改权限策略;修改已由
    #3139 合入的 RolePillDropdown.tsx
  • 用户可见变化:后台 Worker 等待权限时,Workers 入口显示等待态;Agent Island
    显示不含命令内容/批准动作的提醒,点击后回到现有 in-app 权限卡。
  • 是否存在 breaking change:无。

UI 变化

无截图:本地 Windows 环境无法执行 macOS Agent Island 实机截图;自动化覆盖 native
snapshot/action policy。侧栏聚合图标复用现有 attention dot,只把 permission 优先级
映射为已有 awaiting tone。

  • 引用的设计规范:docs/design-rules/DESIGN.md §2「Semantic & Accent」及 §10
    「Theme System & Token Reference」:只复用已有 semantic tone/token,不引入硬编码
    颜色;§14.2「Focus Management」:原生提醒只负责聚焦可信的 in-app 权限卡;
    §14.6「Icon-only Controls and Tooltips」:聚合状态提供本地化可访问名称。

怎么验证的

自动验证

以下结果在 #3139 合入后的审计基线
c723fd3c 上 rebase 后、最终签署提交 a3d292a129 的代码树上执行:

cd apps/desktop
..\..\node_modules\.bin\vitest.CMD run src/main/agent-island/__tests__/notificationPolicy.test.ts src/main/agent-island/__tests__/service.test.ts src/main/agent-island/__tests__/state.test.ts src/main/__tests__/makerOrcaRoleMarking.test.ts src/renderer/__tests__/workerAttentionStore.test.ts src/renderer/__tests__/orcaWorkerAttentionWatcher.test.ts src/renderer/features/cc-agent/hooks/__tests__/workerAttentionProjection.test.ts src/renderer/__tests__/permissionSessionApproval.test.ts src/renderer/__tests__/orcaWorkersAttentionIcon.test.ts src/renderer/__tests__/useSessionRunningStatusSilence.test.ts src/renderer/__tests__/rolePillWorkerErrorIndicator.test.ts src/renderer/__tests__/rolePillWorkerCountSummary.test.ts src/renderer/__tests__/rolePillWorkerAttentionClear.test.ts src/renderer/features/cc-agent/__tests__/RolePillDropdown.settings.test.tsx src/renderer/features/cc-agent/__tests__/RolePillDropdown.layoutMenu.test.tsx src/renderer/features/cc-agent/__tests__/RolePillDropdown.anchorMenuResize.test.tsx src/renderer/features/cc-agent/hooks/__tests__/useWorkers.test.tsx src/renderer/features/cc-agent/hooks/__tests__/useOrcaWorkerSelection.test.tsx
结果:18 files / 355 tests passed

cd ../..
$env:NODE_OPTIONS='--max-old-space-size=8192'
.\node_modules\.bin\tsc.CMD --noEmit -p apps\desktop\tsconfig.json
结果:exit 0

cd apps/desktop
..\..\node_modules\.bin\eslint.CMD src/main/__tests__/makerOrcaRoleMarking.test.ts src/main/agent-island/__tests__/notificationPolicy.test.ts src/main/agent-island/__tests__/service.test.ts src/main/agent-island/__tests__/state.test.ts src/main/agent-island/notificationPolicy.ts src/renderer/__tests__/orcaWorkerAttentionWatcher.test.ts src/renderer/__tests__/permissionSessionApproval.test.ts src/renderer/__tests__/useSessionRunningStatusSilence.test.ts src/renderer/__tests__/workerAttentionStore.test.ts src/renderer/__tests__/orcaWorkersAttentionIcon.test.ts src/renderer/features/cc-agent/hooks/__tests__/workerAttentionProjection.test.ts src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts src/renderer/features/cc-agent/lib/workerAttentionStore.ts src/renderer/features/right-sidebar/plugins/orca-workers/OrcaWorkersAttentionIcon.tsx
结果:exit 0

git diff --check
结果:通过;相对最新 main,RolePillDropdown.tsx 保持零 diff

手工验证

未执行:当前环境为 Windows,未做 macOS Agent Island 通知、点击聚焦、VoiceOver,
也未做 renderer 侧栏的完整桌面 smoke test。

未执行的验证

  • macOS Agent Island 实机提醒、点击聚焦与 VoiceOver smoke test。
  • 最终安全修正后的全仓非 related 测试;最终代码树执行了上面的 355 项聚焦回归
    和完整 desktop typecheck。

风险

风险分类

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

影响与回滚

  • 影响范围:仅 Orca Worker permission interaction。Worker 的其他 Agent Island
    traffic 仍被拒绝;普通会话的原生批准动作保持原样。
  • 安全边界:Worker 投影只保留 request/tool identity,清空 raw input、description、
    display、suggestions 与 metadata;snapshot 不发布 permission action,service 也拒绝
    伪造 allow/always/deny。dismiss 必须匹配 expected session owner。
  • 回滚 / 降级方式:回滚本 PR 即恢复原 Worker 全静默策略和单一 done attention;
    无数据库、协议或用户数据迁移。
  • 邻近并发风险:open PR #2504
    处理插件消息/任务切换,#2095
    处理 Orca shutdown/send 竞态;两者均不实现 Worker permission attention,但 Ready
    前仍需刷新并重审邻近路由语义。
  • 最新主线:Draft 创建时 target main 已通过 mobile-only fix(mobile): 只在消息 key 变化时续 mVCP 安静窗 #3264 前进到 8569fe836
    该提交仅改 4 个 apps/mobile 文件,与本 PR 的 desktop/docs 路径零交集。
    git merge-tree --write-tree 生成 6b5e7bf4,无冲突;因此没有为无关移动端
    增量改写本分支历史或重复运行 desktop 门禁。
  • 合并风险:最终本地 heads a3d292a129(本分支)与 99de412f0(Cindy feat: plan 模式执行确认弹窗支持选择模型 #2840
    做了 git merge-tree --write-tree,合并树 102b70d0 成功;共同文件
    maker-ipc/register.ts 同时保留 Worker permission 与 plan-model 两组语义。

提交前检查

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

Signed-off-by: Beautyl0ve <74452755+Beautyl0ve@users.noreply.github.com>
@Beautyl0ve
Beautyl0ve marked this pull request as ready for review August 23, 2026 14:38
@Beautyl0ve
Beautyl0ve requested a review from a team as a code owner August 23, 2026 14:38
@greptile-apps

greptile-apps Bot commented Aug 23, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为 Orca Worker 增加按原因区分的完成/权限 attention,并允许经过安全投影的 permission-only Agent Island 聚焦提醒。

  • 将 Worker 权限提醒限制为 focus-only,移除原始命令、provider 展示字段和原生批准动作
  • 在 renderer 中投影 pending permission requestId,并为侧栏聚合图标增加 awaiting 语义
  • 按 requestId 和 session owner 清理提醒,同时补充状态、策略与回归测试

Confidence Score: 4/5

合并前应修复并发 Worker 权限请求丢失 attention 的问题,否则仍在等待的请求可能变得不可见并持续阻塞 Worker。

新增 watcher 在 pendingPermissionRequestId 被后续并发请求替换时主动清除旧 reason,但 main 与 provider interaction 层允许同一 session 保留多个 pending 请求,因此仍存活的旧权限请求会失去提醒。

Files Needing Attention: apps/desktop/src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts, apps/desktop/src/renderer/lib/makerChatStore.ts

Important Files Changed

Filename Overview
apps/desktop/src/main/agent-island/notificationPolicy.ts 新增 permission-only Worker 通知策略与去敏后的 focus-only interaction 投影。
apps/desktop/src/main/agent-island/service.ts 为权限请求记录原生动作能力并加入 owner-scoped dismissal,避免 focus-only Worker 提醒执行批准动作。
apps/desktop/src/main/agent-island/state.ts 按 requestId 保存权限动作能力,使 focus-only 请求仍保持等待态但不生成原生批准 action。
apps/desktop/src/main/maker-ipc/register.ts 将 Worker permission 安全投影接入 Agent Island,并按 session owner 路由清理。
apps/desktop/src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts 新增 permission reason 投影,但单值 requestId 切换会清除仍未解决的并发旧请求 attention。
apps/desktop/src/renderer/features/cc-agent/lib/workerAttentionStore.ts 将 Worker attention 从布尔集合扩展为可独立清理的 done 与 permission(requestId) reason map。
apps/desktop/src/renderer/lib/makerChatStore.ts 向运行状态快照暴露单个 pendingPermissionRequestId;该单值模型无法表达并发权限请求。
apps/desktop/src/renderer/features/right-sidebar/plugins/orca-workers/OrcaWorkersAttentionIcon.tsx 聚合 Worker attention,并让 permission awaiting tone 优先于 done unread tone。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  W[Worker permission request] --> M[Main interaction broadcast]
  M --> A[Safe Agent Island projection]
  A --> F[Focus trusted in-app permission card]
  M --> S[makerChatStore pendingPermission]
  S --> T[Worker attention reason]
  T --> I[Sidebar awaiting indicator]
  R[Resolve or dismiss requestId] --> S
  R --> A
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts:73-88
**并发权限提醒被提前清除**

如果同一 Worker 同时存在多个权限请求,后一个请求覆盖 `makerChatStore` 中的单值 `pendingPermissionRequestId` 后,这里会立即清除前一个仍处于 pending 状态的 permission reason,仅保留新请求的提醒;当前请求解决后,用户将看不到仍阻塞 Worker 的旧权限请求。

---

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

Reviews (1): Last reviewed commit: "feat(orca): surface worker permission at..." | Re-trigger Greptile

Comment on lines +73 to +88
if (previousRequestId !== currentRequestId) {
if (previousRequestId) {
toClear.push({
workerId: worker.workerId,
reason: { kind: 'permission', requestId: previousRequestId },
});
}
if (currentRequestId) {
// Permission is live blocking state rather than unread state. Keep it
// projected even while focused; the selected Worker hides its own dot,
// and navigating away restores the signal until this request resolves.
toMark.push({
workerId: worker.workerId,
reason: { kind: 'permission', requestId: currentRequestId },
});
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 并发权限提醒被提前清除

如果同一 Worker 同时存在多个权限请求,后一个请求覆盖 makerChatStore 中的单值 pendingPermissionRequestId 后,这里会立即清除前一个仍处于 pending 状态的 permission reason,仅保留新请求的提醒;当前请求解决后,用户将看不到仍阻塞 Worker 的旧权限请求。

Context Used: 使用和PR描述相同的语言进行评论 (source)

Knowledge Base Used: Desktop renderer experience

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/desktop/src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts
Line: 73-88

Comment:
**并发权限提醒被提前清除**

如果同一 Worker 同时存在多个权限请求,后一个请求覆盖 `makerChatStore` 中的单值 `pendingPermissionRequestId` 后,这里会立即清除前一个仍处于 pending 状态的 permission reason,仅保留新请求的提醒;当前请求解决后,用户将看不到仍阻塞 Worker 的旧权限请求。

**Context Used:** 使用和PR描述相同的语言进行评论 ([source](https://app.greptile.com/review/custom-context?memory=instruction-0))

**Knowledge Base Used:** [Desktop renderer experience](https://app.greptile.com/xindong/-/custom-context/knowledge-base/makecindy/cindy/-/docs/desktop-renderer-experience.md)

---

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3d292a129

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +3184 to +3188
if (!shouldNotifyAgentIslandForSession(sessionId)) {
// Only Worker permission interactions enter Agent Island. Keep the cleanup
// owner-scoped so a suppressed interaction cannot dismiss another session.
handleAgentIslandInteractionDismissedByRequestId(requestId, sessionId);
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 清理权限解决后的 Worker Agent Island 会话

当 Orca Worker 的最后一个权限请求被解决、超时或取消时,这个分支只调用 handleInteractionDismissedByRequestId。权限请求进入 Agent Island 时,applyAgentIslandInteractionRequest 会把该会话标为 running;移除最后一个请求后,dismissPendingInteraction 又将其恢复为普通 running。由于 Worker 的后续 event/done 仍被通知策略过滤,这个合成会话再也没有事件能结束或移除,会让 Agent Island 及其 activity projection 持续显示该 Worker 正在运行。这里需要在最后一个 focus-only 请求消失时同时移除 Worker 的 Agent Island 会话,或避免为这种提醒建立持久 running 状态。

Useful? React with 👍 / 👎.

@MagicLizi

Copy link
Copy Markdown
Contributor

@Beautyl0ve 👋 这个 PR 还有 2 条 review conversation 没 resolve(apps/desktop/src/renderer/features/cc-agent/hooks/useOrcaWorkerAttentionWatcher.ts / apps/desktop/src/main/maker-ipc/register.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

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

@MagicLizi

Copy link
Copy Markdown
Contributor

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

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

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

Copy link
Copy Markdown
Contributor

这个 PR 会改用户能看见的 Orca Worker 权限注意力提示,已按维护者确认门拦住,讨论 issue:#3304

请维护者在本 PR 上 Approve 放行;若要改,请 Request Changes。作者这边先不用再推来「催合并」——球在维护者手里。

@MagicLizi

Copy link
Copy Markdown
Contributor

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

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

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: feature(orca): 协同 Worker 请求授权时没有提醒,希望对齐对话模式

2 participants