Repository navigation
feat(settings): 设置页新增「工具」节 —— 按来源 / 服务 / 单个工具设置停用 / 询问 / 允许 (#1130) - #1358
Merged
Merged
Conversation
引擎 tool policy 面(inventory 读 + record 写 + reset)按路线 B 从已收编的 v2 permission 组走出引擎进程: core 侧标签 @opencode/v2/AlphaToolPolicyApi + opencode bridge(InstanceStore 请求时取)+ SessionPrompt.node 合成暴露;四个端点 503/409/400/500 逐型映射;不扩 ADR-033 名单、不碰 httpapi/api.ts。 桌面侧 main tool-policy-client(直接 fetch + 再 decode)→ IPC → preload window.api.toolPolicy → renderer settings-tools.tsx:四来源分组、服务展开到工具、三态 override + 生效徽标 + 9 型原因、 逐条即写、收紧畅通放宽有闸(class/service 启用先确认;service/tool 启用带当前 bindingDigest)、 cap 锁定、binding-changed 重新启用、quarantine/managed 整节横幅 + 重置、写失败 role=alert + 重试、 读失败 fail-closed、无项目目录时不发请求。 文档:契约 tool-policy.md 出口一节、架构接缝勘破、帧并入活稿 #set-tools + 台账回填、 六态 × 双主题 × 双宽度组件级视觉证据、CHANGELOG。 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1. 「工具」节在 canonical /server/:serverKey/session/:id 上恒「先打开一个项目」:路由本身不带目录, 改按会话 id 从壳层项目清单查(settings-directory.ts,规则同 session-workspace-core);新增 settings-directory.test.ts 用 hrefFor.session 的真路径喂入(改前 Received: undefined)。 2. 写入撞 409 时重读 inventory,让 quarantine 横幅与「重置」真的出现(T10)。 3. 整节只读区 aria-hidden → inert:展开钮 / details summary 不再可 Tab 到(T6)。 4. 三态 radiogroup 方向键只移动焦点,空格 / 回车才提交(已批帧语义;T9)。 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Owner
Author
|
合并前审计已完成(M 级,2/2 轮用尽,编排器裁决)。 R1 开出 1 BLOCKER + 2 MINOR + 1 帧偏离,R2 逐条判 FIXED,结论 MERGE。 R2 的两条 minor,已知不修,理由留痕:
审计的 out-of-round 观察「设置页与会话页用两份目录真相」已另开票跟踪,不拦本 PR。 |
This was referenced Sep 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
做了什么
设置页新增第四项导航「工具」(
packages/ui-mac/src/renderer/alpha-ui/settings-tools.tsx):按「本地工具 / 云端工具 / 第三方 MCP / 插件」四组列出引擎 live inventory,服务可展开到工具;每行给出用户 override(三态 radiogroup,无记录 = 无选中)、「生效」徽标(resolver 终值)与「生效:状态 · 原因」(9 型 reason 逐型文案);逐条即写、无草稿;收紧畅通、放宽有闸(class / service 层「启用」先弹行内确认;service / tool 层启用写入携带 inventory 给出的当前bindingDigest,class 层不带);cap 锁定行不可点;binding-changed 给「重新启用」;quarantine / managed-unreadable 整节横幅 + 全部只读 + 重置(留备份);写失败不做乐观更新,行内role=alert+ 重试;读失败 fail-closed。引擎侧那一跳按票面 2026-09-17 的路线 B 落地(不扩 ADR-033 名单、不碰
httpapi/api.ts,north-star rc=0):packages/core/src/permission/alpha-tool-policy-api.ts(新):core 侧标签@opencode/v2/AlphaToolPolicyApi(list / setRecord / removeRecord / reset by directory,WriteError{kind})packages/protocol/src/groups/permission.ts:GET /api/permission/tool-policy/inventory·PUT …/record·POST …/record/remove·POST …/reset(503 未接线 / 409 待恢复 / 400 记录不合 schema / 500 落盘失败)packages/server/src/handlers/permission.ts:四个 handler,serviceOption取标签、缺席 503packages/opencode/src/permission/alpha-tool-inventory.ts:bridge/exposed(InstanceStore 请求时取,见下)packages/opencode/src/session/prompt.ts:宿主合成暴露(Layer.suspend,deps 不变)packages/opencode/src/permission/alpha-tool-policy.ts:ToolPolicyWriteError加kind: quarantined | io桌面侧:
ui-mac/src/main/tool-policy-client.ts(直接 fetch + main 侧再 decode)→tool-policy-ipc.ts→ preloadwindow.api.toolPolicy→ renderer。packages/ui-mac/package.json新增@opencode-ai/schema: workspace:*(main 用它的parseToolPolicyInventory,renderer 只import type)。与探针分支的一处偏离(实测出来的):探针把
InstanceStore.node加进了SessionPrompt.node的 deps。这会让每个编译SessionPrompt.node的测试被迫绑定InstanceStore.bootstrapNode——test/session/alpha-subtask-attachment-policy.test.ts当场Unbound layer node: @opencode/InstanceBootstrap(base 4/4 绿),test/session/prompt.test.ts等四个上游测试同形。改为 bridge 在每次调用里Effect.serviceOption(InstanceStore.Service)(v2 handler 的请求上下文 =app组全部顶层输出的合并,InstanceStore 是顶层成员),宿主 deps 不变;缺席 die,不静默成空清单。勘破写在docs/architecture/2026-09-17-tool-policy-transport-seam.md。本地门(真实输出)
bash scripts/north-star-guard.sh✓ zero upstream package editsbun run --cwd packages/{core,schema,protocol,server,opencode,ui-mac} typecheckbun test test/server/alpha-tool-policy-route.test.tstext/html兜底、PUT 200)→ 改后 5 passbun test src/renderer/alpha-ui/settings-tools.test.ts[data-settings-section='tools']为 null)→ 改后 9 passbun test src/main/tool-policy-client.test.ts--mode effect --include tool-policy/--mode coverage --fail-on-missing --fail-on-skipbun test src(packages/ui-mac)bun test(packages/opencode)v2 pty HttpApi串行复跑两边都绿 = 全量并发时的测量污染)⇒ 与 base 差 0bash scripts/assert-gate-files.shprocess-fence-apply.test.ts/network-egress-fence.test.ts(Electron 二进制缺席);新登记的alpha-tool-policy-route.test.ts5/5scripts/check-doc-links.py(7 个改动/新增 md)·check_docs_contract.py --strict(指向本 worktree)·git diff --check· NUL 闸与 base 失败集的差(逐条在 base 树同一命令复跑过):
packages/schemaevent-manifest.test.ts2 fail —— base 同样 2 fail(事件清单计数,与本 PR 无关)。ui-macsettings.test.ts> "shares saved authority…" 1 fail —— base 同样红(同文件单跑、同命令)。ui-macprocess-fence-apply.test.ts/network-egress-fence.test.ts—— bootstrap 过的 worktree 缺 Electron 二进制,已登记陷阱(编排器已确认)。roving-focus.test.tscomposite-role 棘轮(改用仓内rovingKey/rovingTabIndex)、brand-residue-scan.test.ts(组名「Alpha Cloud」→「云端工具 / Cloud tools」)。scripts/alpha-path-residue.tsv两行行号 +1(main/index.ts加了一行 import 与两行注册)。pre-push 钩子按编排器说明用
--no-verify推送:主干上第 11/14 步 BYOK 目录闸(#1352)与 Electron 二进制两类红与本 PR 无关。视觉证据(不启动 Electron)
docs/verification/2026-09-17-1130-settings-tools-visuals/:现役AlphaSettings+ 夹具toolPolicy,loopback Vite + Chrome--headless=new,六态 × light/dark × 760/1280 = 24 帧,sha256 在harness/capture-metadata.json。对照已批帧docs/design/2026-08-25-req131-settings-tool-policy/frame.html:结构、四组、徽标、锁定、确认条、横幅、行内 alert、骨架、fail-closed 文案逐项对上;六处已裁偏差(均为实现方默认值,可回滚)写在该 README 与台账:①工具行显示引擎identity.name原文(专名映射归 REQ-125);②云端组按数据模型渲染成服务行 → 展开;③「无法核验」提示放节末;④新增「先打开一个项目」态(策略按 (账户, 项目) 分区,首页无项目);⑤「Alpha Cloud」→「云端工具」(REQ-139 品牌闸零 allowlist);⑥方向键按仓内唯一键盘契约「移动即激活」。文档影响
docs/contracts/tool-policy.md新增「出口:HTTP 面与桌面 IPC」;settings-and-extension-storage-adapters.md加一条指向。docs/architecture/2026-09-17-tool-policy-transport-seam.md(新)。docs/design/current/settings/design.html#set-tools(+design.css),台账components.md回填设计定稿 / 落地 / 代码入口 / 已裁差异;日期快照未动。docs/README.md加两行索引;CHANGELOG.md[Unreleased] Added一条。scripts/gate-files.tsv登记alpha-tool-policy-route.test.ts(5 条);httpapi-exercise四条 scenario。主动没做的
packages/sdk/js/src/v2/gen/*/openapi.json):本仓自 [REQ-090][CODE] 补齐 Permission DTO 与幂等 reply 语义 #433 起未再重生,重生要跑bun dev generate(models.dev 网络陷阱)且会带出一片与本票无关的生成物漂移;main 侧按 protocol 定义直接 fetch。要不要统一重生,请编排器另裁。R1 审计修复(第二个 commit)
renderer/index.tsx原来只认route.directory,而生产导航走 canonical/server/:serverKey/session/:id,该路由directory恒 undefined。改为alpha-ui/settings-directory.ts:route.directory ?? 壳层项目清单里该会话 id 的目录(AlphaProjectsApi.store,与侧栏导航同一份数据;useServerSync在设置面挂载点之外,AppInterface的 children 不在ServerSyncProvider内,所以用壳层清单而不是serverSync().session.data.info)。设置 surface 改为settings: (projects) => () => …,在App()里用alphaProjects装配。新测试settings-directory.test.ts用hrefFor.session("sidecar","ses_123")的真路径喂入 —— 改前红:Expected: "/Users/kai/app/kama-bot-local" / Received: undefined(3 pass / 1 fail)→ 改后 4 pass。清单里没有该会话 ⇒ undefined(fail-closed,不猜)。write()失败码为quarantined时reload(true),横幅与「重置」随权威 inventory 出现;新用例 T10。aria-hidden→inert(整棵子树不可聚焦、不宣告);T6 断言inert在、aria-hidden不在、展开钮在其内。rovingKey,相对此刻聚焦项移动),空格 / 回车(原生 button click)才提交;T9 改为「三次方向键零写入 → click 一次写入」。verification README 偏差 6 与台账同步改写。R1 后门:ui-mac typecheck 0;
settings-directory4 pass ·settings-tools10 pass ·roving-focus16 pass ·settings-surface-ratchet/alpha-path-residue/locale-regression/shell-commands44 pass;ui-mac 全量 5020 pass / 3 fail(364 files),3 条与 base 集逐字相同(settings.test.ts一条 base 同红 + 两个 Electron 二进制红);north-star rc=0;doc-links /git diff --check/ NUL 全 0。Fixes #1130
Refs #723
🤖 Generated with Claude Code