[ac#1336] 网络出网策略层:loopback CONNECT 代理 + 授权目的地注册表(单一权威) - #1338
Merged
Conversation
REQ-137 (#1073) AC2 全部 + AC1 的策略半场。只在 packages/ui-mac 内新增,不改 process-fence-*.ts、不改 sidecar 启动、不设任何代理 env(强制层接线归 #1337)。 - network-egress-registry.ts:授权目的地的唯一权威。初值照勘破 2026-08-25 §2.2, 逐条对着今日代码坐标复核:models.opencode.ai(models-dev.ts:160,不是 models.dev)、 平台四族从 shared/alpha-config 的 ALPHA_ENDPOINTS 派生(不自持第二份域名)、 LSP 静态枚举补 www.eclipse.org。精确 host:port 匹配,fail-closed。 - network-egress-proxy.ts:只认 CONNECT;解析 authority → 查注册表 → 才拨号 (未登记的名字零 DNS);DNS 在 main 进程侧由 net.connect 按名字解析(围栏刻意不 放行 mDNSResponder);403 unregistered / 400 bad-authority / 405 method-not-connect / 502 dial-failed 各带结构化记录,拒绝体带可识别前缀;隧道 TLS 端到端,不注入证书。 - 判据:registry.test(独立字面量锚 + 授权语义)、proxy.test(真代理 + 真 TCP 靶站: 正臂隧道;反向 —— 未登记目的地 403 + 记录 + 靶站 0 连接;控制臂 —— 恒答允许的替身 被同一判据当场判红)。两文件登记进 gate-files.tsv;模块体积棘轮基线人手抬到实测值。 - 文档:2026-08-25 勘破 §2.2 加落地记录(注册表是权威,表是快照),§5 指向模块。 Refs #1073 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HE3Jmp5ZDzEvnCNhgCDreN
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.
Fixes #1336
Refs #1073
REQ-137 的策略层:
packages/ui-mac内新增 授权目的地注册表(单一权威)+ loopback CONNECT 策略代理(咽喉点)。负责父票 AC2 全部 与 AC1 的策略半场。不改process-fence-*.ts、不改sidecar.ts启动、不设任何代理 env、不改可写集 —— 强制层接线全归#1337。注册表长什么样
packages/ui-mac/src/main/network-egress-registry.ts—— 一张readonly EgressDestination[],每行{ host, port, category, source },装载时自检(host 形状 / 端口范围 / 出处非空 / 无重复,坏了就抛)。唯一裁决函数isEgressAuthorized(host, port):精确lowercase(host):port,端口是键的一部分;不做通配 / 后缀 / 尾点归一 / IP↔名字等价。初值 = 勘破
2026-08-25-network-egress-seam.md§2.2 清单,逐条对着今日代码坐标复核后登记(与散文不同的三处,以代码为准,注册表抬头与 §2.2 落地记录都写明):models.opencode.ai:443packages/core/src/models-dev.ts:160(§2.2 写models.dev,今天代码是这个)codepuppy.cn:443/alpha-gateway.tidelabs.click:443/account.codepuppy.cn:443/alpha-cloud.tidelabs.click:443shared/alpha-config.ts的ALPHA_ENDPOINTS派生(§2.2 写的alphacodeone.com已迁域;注册表不自持第二份域名)registry.npmjs.org:443#1334Q1.3pypi.org:443/files.pythonhosted.org:443github.com:443/api.github.com:443lsp/server.ts:183,600download-cdn.jetbrains.com:443/api.releases.hashicorp.com:443/www.eclipse.org:443lsp/server.ts:1330,1632,1207(eclipse 是 §2.2 同一静态枚举漏列的)127.0.0.1:11434刻意不在:BYOK baseURL、远程 MCP URL(§2.2 的动态类别,静态表登记不了)、ssh
*:22、Q4 拍到的release-assets.githubusercontent.com、Q3 语料里的example.com—— 加不加归#1073裁,没自己编。代理怎么做 DNS 解析
network-egress-proxy.ts跑在 Electron main(不在围栏内)。顺序:解析 CONNECT authority → 查注册表 → 才net.connect({ host, port, autoSelectFamily: true })按名字拨号 —— getaddrinfo 在 main 进程侧跑(围栏刻意不放行 mDNSResponder,#1334Q3)。未登记的名字一次 DNS 都不发(测试用 dial spy 断言零调用)。隧道内 TLS 端到端,不看内容、不注入证书(老勘破 §4.2)。三种运行时(bun 1.3.14 / node 22 / Electron 42 内嵌 node 24)都用同一份探针验过http.Server的connect事件与按名拨号成立。失败形态各自可辨、各带结构化记录(
{event, id, at, method, authority, host, port, verdict, reason, status, detail}):403 unregistered(唯一的「闸门说不」)/400 bad-authority(不猜默认端口)/405 method-not-connect(不做明文转发)/502 dial-failed(ENOTFOUND / ECONNREFUSED / 10 s 超时 ETIMEDOUT)。拒绝体带前缀alpha egress policy:—— bun fetch 把代理 403 当目标响应返回(§4.2),正文是应用侧唯一的归因线索。AC2 判据与反向用例的实际输出
判据文件:
packages/ui-mac/src/main/network-egress-proxy.test.ts(12 条)+network-egress-registry.test.ts(4 条),两者登记进scripts/gate-files.tsv(精确条数 12 / 4)。bun test src/main/network-egress-registry.test.ts src/main/network-egress-proxy.test.ts⇒ 16 pass / 0 fail / 177 expect()。判据里两条反向用例打印的原文:反向一(生产注册表、默认接线,CONNECT 到未登记的 loopback 靶站):
「代理确实收到了请求」由那条
egress.connect记录自证(空输出 ≠ 拦住);靶站 0 连接。反向二(控制臂:注册表换成恒答「允许」的替身,同一个判据函数
judgeUnregisteredDenied必须当场判红):测试断言的就是
ok === false且 detail 点名「status 200」「target saw 1 connection(s)」「record verdict=allow」。另一条:未登记公网名ac1336-unregistered.invalid:443⇒ 403 且 dial spy 零调用。本地门(worktree
.worktrees/ac-1336,bootstrap 过;electron dist 软链自主 checkout只读)bash scripts/north-star-guard.sh✓ zero upstream package edits,rc 0cd packages/ui-mac && bun run typechecktsgo -brc 0(首版 4 条 TS2740/TS2339 —— bun/@types 把 connect 事件的 socket 标成 Duplex —— 已改)bun test src@origin/alpha@3197acf,改动前同一棵树bun test src@abea306bash scripts/assert-gate-files.sh✓ 200 个闸门文件全部在位且真的跑过,GATE_RC 0;其中network-egress-registry.test.ts实际 4 = 登记 4,network-egress-proxy.test.ts实际 12 = 登记 12python3 scripts/check-doc-links.py docs/architecture/2026-08-25-network-egress-seam.md✓ 2 relative link(s) resolve,rc 0bash scripts/assert-module-size.sh⚠ 55592 > 55006 (+586)(只响不拦);抬到实测值后✓ 55592 行(= 基线),rc 0worktree 缺 Electron 二进制那条陷阱:本树把主 checkout 的
electron/dist软链 +path.txt拷入后process-fence-apply.test.ts在 base 与 head 上都绿,不在 fail-set 里。文档影响
docs/architecture/2026-08-25-network-egress-seam.md:§2.2 表后加「落地记录」(注册表是权威、表是快照、三处按代码校正、哪些刻意不在),§5 策略层加模块指向。scripts/check-doc-links.py⇒ 2 links resolve。没有新文档、没有第二张清单。没做的(主动)
HTTP(S)_PROXY、main 侧起代理 ——#1337。本票单独合入后用户可观察行为零变化。alpha-endpoints.ts的 env/pin/discovery 解析结果也属此类:今天只登记了ALPHA_ENDPOINTS默认值),归#1073/ 后续票裁,没预留抽象。example.com与 AC3 的张力:#1334Q3 语料含curl https://example.com,choke 臂当时用的是全放行的取证代理。按本注册表它会 403 —— AC2 与 AC3 语料在这一格互相顶着,请在#1073裁决(加进表 / 从语料里换成注册表内目的地)。packages/ui-mac/src/main基线人手从 55,006 抬到 55,592(实测)。其中 +339 是本票两个模块;另外 +247 在origin/alpha@3197acf上就已超基线(前几张票没抬,棘轮只响不拦)—— 一并抬到实测值并在 TSV 里写明。🤖 Generated with Claude Code
https://claude.ai/code/session_01HE3Jmp5ZDzEvnCNhgCDreN