feat(orca): surface Worker permission attention safely - #3266
Conversation
Signed-off-by: Beautyl0ve <74452755+Beautyl0ve@users.noreply.github.com>
|
| 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
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
| 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 }, | ||
| }); | ||
| } |
There was a problem hiding this comment.
如果同一 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.There was a problem hiding this comment.
💡 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".
| 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; |
There was a problem hiding this comment.
清理权限解决后的 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 👍 / 👎.
|
@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。 |
|
@Beautyl0ve 👋 这个 PR 目前与 请在本地 merge 最新的 |
|
这个 PR 会改用户能看见的 Orca Worker 权限注意力提示,已按维护者确认门拦住,讨论 issue:#3304 请维护者在本 PR 上 Approve 放行;若要改,请 Request Changes。作者这边先不用再推来「催合并」——球在维护者手里。 |
|
命中 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 设计规范 |
Draft PR —
feat(orca): surface Worker permission attention safely这次改了什么
摘要
Orca Worker 在后台等待权限时,Lead 目前既没有可靠的 Worker attention,也会被
Agent Island 的 Worker 降噪策略整体过滤。本 PR 把
permission建模为独立、按requestId清理的 attention 原因,并只为这类阻塞交互开放一个 focus-onlyAgent Island 提醒。
提醒不会携带原始命令或暴露原生批准按钮;用户必须回到 Cindy 内已有的权限卡,
查看完整命令后再决定。普通 Worker 消息、工具事件和其他交互仍保持静默。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
done/permission多原因 attention、pending permission投影、侧栏聚合等待态、permission-only Agent Island 策略、focus-only 安全投影、
session-owner dismissal、文档与回归测试。
修改权限策略;修改已由
#3139 合入的
RolePillDropdown.tsx。显示不含命令内容/批准动作的提醒,点击后回到现有 in-app 权限卡。
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的代码树上执行:手工验证
未执行:当前环境为 Windows,未做 macOS Agent Island 通知、点击聚焦、VoiceOver,
也未做 renderer 侧栏的完整桌面 smoke test。
未执行的验证
和完整 desktop typecheck。
风险
风险分类
影响与回滚
traffic 仍被拒绝;普通会话的原生批准动作保持原样。
display、suggestions 与 metadata;snapshot 不发布 permission action,service 也拒绝
伪造 allow/always/deny。dismiss 必须匹配 expected session owner。
doneattention;无数据库、协议或用户数据迁移。
处理插件消息/任务切换,#2095
处理 Orca shutdown/send 竞态;两者均不实现 Worker permission attention,但 Ready
前仍需刷新并重审邻近路由语义。
8569fe836;该提交仅改 4 个
apps/mobile文件,与本 PR 的 desktop/docs 路径零交集。git merge-tree --write-tree生成6b5e7bf4,无冲突;因此没有为无关移动端增量改写本分支历史或重复运行 desktop 门禁。
a3d292a129(本分支)与99de412f0(Cindy feat: plan 模式执行确认弹窗支持选择模型 #2840)做了
git merge-tree --write-tree,合并树102b70d0成功;共同文件maker-ipc/register.ts同时保留 Worker permission 与 plan-model 两组语义。提交前检查
git commit -s,见 DCO)