spec: daemon 侧 provider 授权架构——订阅族(openai-codex 等)的真路径
来源:#284 裁决收口(2026-09-26)。票面「OAUTH_FAMILIES 加行」被证伪——openai-codex 的 PKCE 锁死 localhost:1455 回环,server-callback(本仓唯一握手形态)架构上收不到授权码;#34 正典维持单族。本票 = 唯一能真正打通订阅族的架构路径,触发线前不排期。
Problem
订阅类模型(OpenAI Codex / SuperGrok 等)的 OAuth 均为 PKCE + 本机回环 redirect(为本地 CLI 设计),与 pacman「server 可远端、机器可在他机」(BYOC)拓扑下的 server-callback 握手根本冲突。族表加行只会产出永远无法完成的死钮(#222 律)。
Solution 方向(spec 阶段钉死,此处仅轮廓)
授权发起方从 server 移到 daemon:执行机本地完成 PKCE 回环(pi 系 @earendil-works/pi-ai 已带 OpenAI OAuth 的 PKCE 回环实现,可考证复用面),凭据落 daemon 侧或加密回传 server。需要钉的决策点:
- 授权命令形态(
pacman auth <provider>?)与 UX(浏览器开在 daemon 机器上——headless 执行机怎么办:URL 转发给 web 面?)
- 凭据存放:daemon 本地(provider 调用也走 daemon?)vs 回传 server(secretBox 加密位已有)——决定 provider 调用拓扑
- per-family OAuth client 凭证位(现单对
PACMAN_GITHUB_OAUTH_CLIENT_ID/SECRET,config 四处消费单源)
- xai 端点考证(research 项):authorize/token/scope 三件公开记录极薄;「Sign in with SuperGrok or X Premium」双通道是否存在第三方可注册的 client 程序。无考证结论前 xai 不进任何族表
- github-copilot 现路径不动(server-callback 对 GitHub 成立),双形态并存的族表字段设计(如
authFlow: 'server-callback' | 'daemon-pkce')
可复用地基(#284 侦察成果)
触发线
订阅类模型接入的真实使用诉求涌现(自用即第一用户,06 册 D1),或产品负责人显式启动。触发后先走 grilling 钉上述 5 决策点,再拆 task 票。
Acceptance criteria(spec 票)
spec: daemon 侧 provider 授权架构——订阅族(openai-codex 等)的真路径
Problem
订阅类模型(OpenAI Codex / SuperGrok 等)的 OAuth 均为 PKCE + 本机回环 redirect(为本地 CLI 设计),与 pacman「server 可远端、机器可在他机」(BYOC)拓扑下的 server-callback 握手根本冲突。族表加行只会产出永远无法完成的死钮(#222 律)。
Solution 方向(spec 阶段钉死,此处仅轮廓)
授权发起方从 server 移到 daemon:执行机本地完成 PKCE 回环(pi 系
@earendil-works/pi-ai已带 OpenAI OAuth 的 PKCE 回环实现,可考证复用面),凭据落 daemon 侧或加密回传 server。需要钉的决策点:pacman auth <provider>?)与 UX(浏览器开在 daemon 机器上——headless 执行机怎么办:URL 转发给 web 面?)PACMAN_GITHUB_OAUTH_CLIENT_ID/SECRET,config 四处消费单源)authFlow: 'server-callback' | 'daemon-pkce')可复用地基(#284 侦察成果)
oauth.ts已族表驱动(familyOf = OAUTH_FAMILIES.find),加行零服务端路由改动PROVIDER_OAUTH_PRESET_IDS已含 openai-codex;xai preset(PROVIDER_XAI_PRESET)双通道 + oauthLabel 文案位在位触发线
订阅类模型接入的真实使用诉求涌现(自用即第一用户,06 册 D1),或产品负责人显式启动。触发后先走 grilling 钉上述 5 决策点,再拆 task 票。
Acceptance criteria(spec 票)