@inventec/dsh-copilot-auth 1.2.18 → 1.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,13 +17,13 @@
17
17
  ## 特性
18
18
 
19
19
  - 🔐 **设备码登录**:网页 + user code,免 API Token;SSO 组织授权友好
20
- - 🛑 **诚实的授权语义(v2)**:登录进行中可「**请求撤回**」——请求发出后状态如实显示「结果待核实」,不再伪装成已取消;**「退出登录」在静止状态可用**(确认弹窗 → 清除凭据 → 删后核实;尝试进行中/风险锁存期拒绝);**「重新授权」按钮已移除**(v1.2.11:已登录只需退出登录,未登录入口本就是授权登录——独立按钮属逻辑冗余);同一实例只有一个授权尝试,409 时恢复展示共同进度
20
+ - 🛑 **诚实的授权语义(v3)**:**「请求撤回」已移除(Q38)**——它无法真正撤销 GitHub 侧设备流,其进程级风险锁存反而造成「登录成功却不能退出」死局;误启动的等待会由 15 分钟超时自然收敛;**「退出登录」在静止状态可用**(确认弹窗 → 清除凭据 → 删后核实;尝试进行中/风险锁存期拒绝);同一实例只有一个授权尝试,409 时恢复展示共同进度
21
21
  - 🧩 **预置提供方路由**:安装即出现在 Models 页,无需手动配置
22
- - 📦 **模型目录兜底填充**:登录成功时,若 GitHub Copilot 路由还没有模型目录,自动填入账号全部可用模型;你已精简/定制过的目录**永不覆盖**(重启、重新登录均不重置);已请求撤回后晚到的授权成功**不会**再写你的配置
23
- - ➕➖ **补充模型 / 重建模型列表(v2 双入口)**:「补充」默认非破坏——候选模型默认全不勾选,勾选后才加入,现有对象/顺序/modelOverrides 全部保留;「重建」显式确认后按「账号可用 ∩ 目录可解析」重建纯 ID 列表并清空本路由 modelOverrides(二次确认 + 空目标单独确认)。预览快照 10 分钟有效、绑定选择;同一操作幂等可查;配置并发编辑优先受保护
22
+ - 📦 **模型目录兜底填充**:登录成功时,若 GitHub Copilot 路由还没有模型目录,自动填入账号全部可用模型;你已精简/定制过的目录**永不覆盖**(重启、重新登录均不重置);授权等待超时/意图漂移后晚到的授权成功**不会**再写你的配置
23
+ - ➕➖➖ **管理模型列表(v3 目标状态编辑)**:一张分组全表(可新增/在列/待删除候选),**勾选集合即期望终态**——勾上候选即新增、取消勾选在列模型即移除(可挽留),被保留模型的对象/顺序/定制逐字保留,被移除模型的定制随模型消失;含「对齐账号与目录」「全选/取消全选」快捷动作与「同时清除全部定制」复选框。门控按实际 diff:纯新增可用 24h 缓存,**移除类变更强制实时账号证据+latest 目录并二次确认**(缓存下勾选删除会自动升级为实时预览);空目标需单独确认。预览快照 10 分钟有效、绑定选择;同一操作幂等可查;配置并发编辑优先受保护
24
24
  - 🌐 **中/英双语界面**:跟随 DSH 语言设置自动切换
25
25
  - 🔑 **凭据安全托管**:存入 DSH 内置凭据库(文件强制 0600 权限),Copilot 临时 token 到期自动刷新
26
- - 🧪 **测试与 CI**:181 条单元测试(ubuntu/windows/macos 三平台矩阵);GitHub Actions 构建测试 + tag 触发自动发布(provenance)
26
+ - 🧪 **测试与 CI**:211 条单元测试(ubuntu/windows/macos 三平台矩阵);GitHub Actions 构建测试 + tag 触发自动发布(provenance)
27
27
 
28
28
  ## 前置要求
29
29
 
@@ -33,6 +33,7 @@
33
33
 
34
34
  | 本插件 | DSH 实测版本 | authorization 服务 | 说明 |
35
35
  |---|---|---|---|
36
+ | v1.2.19 | `0.1.7-rc.2`+ | runtime 内置,插件不挂载 | **管理模型列表 v3:目标状态编辑**——「补充/重建」双入口合并为单一「管理模型列表」分组全表(可新增/在列/待删除候选,勾选即终态,支持挽留与「对齐账号与目录」);移除成为一等能力且定制随模型保留/消失(`removals-need-live` 门控:移除类强制实时证据+latest 目录,缓存下自动升级 live);单次确认(Q37,风险线常驻底栏前置告知);「请求撤回」移除(Q38)+退出后 attempt 残影清空(修复「退出没作用」循环)。协议 v3。其余同 v1.2.18 |
36
37
  | v1.2.18+ | `0.1.7-rc.2`+ | runtime 内置,插件不挂载 | **授权失败附网络失败码+人性化提示**:`fetch failed` 这类 Node undici 网络层异常的原话不含定位信息,现按 `cause.code` 映射为可操作的提示——超时/拒连→「检查网络或代理设置」、域名解析失败→「检查 DNS」、证书校验失败→「可能存在企业 TLS 检查拦截」;原始失败码弱化展示供诊断。其余同 v1.2.17 |
37
38
  | v1.2.17 | `0.1.7-rc.2`+ | runtime 内置,插件不挂载 | **保留模型逐项列出**(弱化色,与增/删同构)——「保留 (N)」自 v1.2.8 起只有计数没有清单,预览终态不可审计;数据服务端一直有,本版补上渲染。其余同 v1.2.16 |
38
39
  | v1.2.16 | `0.1.7-rc.2`+ | runtime 内置,插件不挂载 | **移除物化中指示浮层**:勾选为乐观即时反馈、物化通常亚秒完成,任何显隐指示都构成闪烁(主人裁决完全移除)。物化中「应用更改」点击由状态机安全忽略(防旧 previewId 提交),指示移除后卡片视觉零变化。其余同 v1.2.15 |
@@ -75,29 +76,31 @@ dsh plugin --profile web add @inventec/dsh-copilot-auth
75
76
  4. **SSO 用户必须对组织点 Authorize**(授权页会出现该步骤,跳过则登录不生效)
76
77
  5. 回到设置页看到「已登录」即成功;首次登录会自动填充模型目录(已定制过的目录不会被覆盖)
77
78
 
78
- > 等待有本地时限(约 15 分钟)。若超时,页面显示「等待授权超时,结果仍待核实」——**结果待核实时不能再直接发起新的授权尝试**,请点「查询状态」或人工核实;等待期间也可随时「请求撤回」(同样只承诺请求已发出,结果待核实)。
79
+ > 等待有本地时限(约 15 分钟)。若超时,页面显示「等待授权超时,结果仍待核实」——**结果待核实时不能再直接发起新的授权尝试**,请点「查询状态」或人工核实。
79
80
 
80
81
  ## 使用
81
82
 
82
83
  - Models 页选择 `GitHub Copilot` 路由,模型目录已在首次登录时自动填充账号全部可用模型,无需手动「添加模型」;之后可自由增删精简,重启 / 重新登录都不会重置你的列表
83
84
  - **配额说明**:base 模型(GPT-4o/4.1 一类)不耗 premium requests;premium 模型(Claude、Gemini、o 系列等)每次调用消耗月度配额。日常建议 base 档,premium 模型按需手动选
84
85
 
85
- ## 撤回、退出与卸载
86
+ ## 退出与卸载
86
87
 
87
- - **请求撤回**:授权等待期间可点「请求撤回」——插件先使本地旧意图失效,再尝试调用宿主撤销接口;无论请求是否送达,状态都如实显示「结果仍待核实」,在结果核实前不能发起新的授权尝试。
88
- - **退出登录(v1.2.10)**:无进行中授权尝试且无未核实风险时可退出——确认弹窗(将清除同一凭据库中所有实例共享的 Copilot 授权,不注销 GitHub 账号)→ 删除凭据 → **删除后立即复核**,凭据仍在则如实显示「退出未完成,授权凭据仍可能存在」;授权尝试进行中(设备码等待期,begin 晚写窗口)与撤回/超时未核实的风险锁存期一律拒绝退出。**「重新授权」独立按钮已移除(v1.2.11)**:需要换号/重授权时,先「退出登录」再「授权登录」即可。
88
+ - **「请求撤回」已移除(Q38,2026-10-05)**:真机验证发现其进程级风险锁存会造成「登录成功却不能退出」死局,且它本就无法真正撤销 GitHub 侧设备流;误启动的等待由 15 分钟超时自然收敛(超时后仍属「结果待核实」,锁存至进程重启)。
89
+ - **退出登录(v1.2.10)**:无进行中授权尝试且无未核实风险时可退出——确认弹窗(将清除同一凭据库中所有实例共享的 Copilot 授权,不注销 GitHub 账号)→ 删除凭据 → **删除后立即复核**,凭据仍在则如实显示「退出未完成,授权凭据仍可能存在」;授权尝试进行中(设备码等待期,begin 晚写窗口)与超时未核实的风险锁存期一律拒绝退出。**「重新授权」独立按钮已移除(v1.2.11)**:需要换号/重授权时,先「退出登录」再「授权登录」即可。
89
90
  - 卸载:`dsh plugin --profile web remove @inventec/dsh-copilot-auth` 后重启 dsh web
90
91
 
91
- ## 补充模型 / 重建模型列表
92
+ ## 管理模型列表
92
93
 
93
- pi-ai 的模型目录是打包时硬编码的 JSON:上游新增模型(如 gemini-3.8-flash)在本机无法解析。v2 把旧的单一「刷新」拆成两个明确入口(GHC 设置页,登录后可见),在不升级 pi-ai 的前提下解决目录过期问题。
94
+ pi-ai 的模型目录是打包时硬编码的 JSON:上游新增模型(如 gemini-3.8-flash)在本机无法解析。v3 把旧「补充/重建」双入口合并为单一「**管理模型列表**」(GHC 设置页,登录后可见),目标状态编辑——在不升级 pi-ai 的前提下解决目录过期问题,同时补上局部删除能力。
94
95
 
95
- - **补充模型(默认、非破坏)**:候选=「账号可用 ∩ 目录可解析 − 已配置」,**默认全不勾选**(缺失不等于你想加回来);勾选后从原预览快照重算(10 分钟内有效、不重新取数),确认时只追加勾选项——现有模型对象、顺序、参数与 modelOverrides 逐字保留。账号证据优先现场拉取;现场失败时 24 小时内同授权的缓存可用于补充,过期/无时间戳/授权已变化只作参考展示、**阻止应用**;重建永远要求现场拉取成功。
96
- - **重建模型列表(显式、破坏性)**:目标=「账号可用 ∩ 目录可解析」的纯 ID 列表,同一提交清空本路由 modelOverrides;需**二次确认**,空目标需**单独确认**。移除项按原因列出(不在账号列表 / 目录无法解析);base 继承的 modelOverrides 无法经用户层清除时明确阻止并解释。
96
+ - **勾选即终态**:弹窗是一张按状态分组的全表——**可新增**(账号可用 ∩ 目录可解析 − 在列,默认不勾)、**在列**(默认勾选)、**待删除候选**(在列但账号未报告/目录无法解析,默认不勾=删除提案,可重新勾选**挽留**)。应用时目标=勾选集合:新增按账号报告顺序追加末尾,被保留模型的对象、顺序、参数与 modelOverrides 逐字保留,被移除模型的定制随模型消失。
97
+ - **快捷动作与定制**:「全选/取消全选」作用于全表;「**对齐账号与目录**」仅在存在漂移时出现,一键把勾选态设为账号∩可解析;「**同时清除全部模型定制**」复选框仅在存在可清除定制时出现(仅继承覆盖时禁用并说明)。摘要行常驻显示「应用后共 N 个:保留 a · 新增 b · 移除 c」与目录新增条数。
98
+ - **证据与门控按实际 diff**:纯新增可用 24 小时内同授权的缓存;**移除类变更强制实时账号证据+latest 目录**——缓存证据下勾选删除会自动升级为实时预览(升级失败回退保留勾选),live 拉取失败软降级时禁用应用并提示;降级目录(local/overlay)与过期证据下待删除候选锁定保留。移除项按原因列出(账号未报告 / 目录无法解析),**二次确认**;空目标需**单独确认**,确认后落显式空列表(不会被登录首次填充静默回填)。
97
99
  - **生效时机按落地通道分叉**:可写安装树(web/服务)→ 先对 `github-copilot.json` 做原子只增补丁(pi-ai 代码版本不变),**重启后**插件在目录已加载、目标全部可解析且配置未被你改动的前提下按基线提交配置(改动过则报 conflict、保留你的值);只读安装树(desktop `app.asar`)→ 进程内注册表注入(ADR 0003),**当次生效、无需重启**,并以宿主 `listModels` 端到端自证,端不出来即回滚(仅当配置仍等于本操作写入值时;否则 rollback-conflict 保留你的新值)。
100
+ - **清空的宿主语义(真机实测 2026-10-05)**:清空写入的是「显式空列表」——登录首次填充**不会**自动回填;但会话内该提供方会按「未过滤」提供**目录全量模型**(DSH 服务层语义:空列表=不过滤)。清空不是「在 picker 隐藏全部模型」的手段。
98
101
  - **幂等与并发保护**:每个操作带服务端签发的 operationId——重复提交/网络超时后重查同一 ID 都返回已知结果,绝不重复执行、绝不换 ID 重发;配置提交前复核 revision,任何漂移返回 409 要求重新预览;你的并发编辑永远优先。
99
102
  - **恢复与「结束旧配置意图」**:apply 前先持久操作意图,崩溃/重启后启动序列核实恢复;出现 conflict / rollback-conflict / recovery-needed 时,页面提供「结束旧配置意图」显式确认(只结束旧意图,不回滚已发生的更改),随后即可重新预览。
100
- - **profile 隔离与旧状态(v2)**:刷新状态存于 `<profile>/copilot-auth/refresh-state.json`,配置意图绝不跨 profile 消费;旧版全局状态文件只读检测并提示重新预览确认,不自动继承。
103
+ - **profile 隔离与旧状态**:刷新状态存于 `<profile>/copilot-auth/refresh-state.json`,配置意图绝不跨 profile 消费;旧版全局状态文件只读检测并提示重新预览确认,不自动继承。
101
104
  - **激活与自愈(保留)**:首次成功操作后激活;pi-ai 升级/重装冲掉目录后,同基线启动时按已确认条目**只增重放**(file 通道写盘后提示需再重启加载;registry 通道重放后复核端出);跨 pi-ai 基线且条目缺失时上报 `self-heal-incompatible`,不自动应用。
102
105
  - **数据源与供应链(不变)**:目录数据从 npm 拉取最新 pi-ai tarball(强制 `dist.integrity` 校验、超时与大小上限、tar 严格解析);npm 失败回退本地目录(`catalogSource: local`),可**显式**改用内置覆盖层(0.85.1 收割,integrity `sha512-+VgVIJDkDO2efYJKEEqvPTH4zmnIaXdAppGbO+vKFA9qy5PdhFiAenuFAkU+oiCSfOC4dMHDyrjdQeL4ZoC5CQ==`)生成新预览——绝不隐式降级。
103
106
  - **只增不更新**:合并只补充本机从未见过的模型条目;上游对已有 id 的元数据修正不会同步——这是「永不覆盖」语义的代价(ADR 0001)。
@@ -108,11 +111,11 @@ pi-ai 的模型目录是打包时硬编码的 JSON:上游新增模型(如 ge
108
111
  ## 工作原理
109
112
 
110
113
  - 通过 `cordis.patch.yml` 两段生效:
111
- 1. 挂载本插件 entry(host 侧在 webserver 上开 8 条本地路由:`/copilot-auth/start|state|status|logout|cancel|refresh/preview|refresh/apply|refresh/retire`,跨站 Origin 拒绝;模型路由要求 `protocolVersion: 2`,`GET /status?operationId=` 返回 active/last/unknown 三态)
114
+ 1. 挂载本插件 entry(host 侧在 webserver 上开 7 条本地路由:`/copilot-auth/start|state|status|logout|refresh/preview|refresh/apply|refresh/retire`(Q38 起 /cancel 移除),跨站 Origin 拒绝;模型路由要求 `protocolVersion: 3`,`GET /status?operationId=` 返回 active/last/unknown 三态)
112
115
  2. 以 settings base 层预置 `github-copilot` 路由(用户 `settings.yaml` 可逐字段覆盖)
113
116
  - authorization 服务 **0.1.7+ 由 runtime 内置,无需也不得再挂载**(旧版 ≤0.1.5 请用 1.1.x,其依赖该 insert)
114
117
  - 登录走 GitHub 设备码流;凭据存 `~/.dsh/.credentials.yaml`(强制 600 权限)的 `llm-pi-ai/github-copilot` 记录,Copilot 临时 token 到期自动刷新
115
- - **授权状态(v2)**:授权生命周期在 `src/auth-host.mjs`——单实例 attemptId、软撤回(先持久 intentVersion+1 再调宿主撤销)、15 分钟本地等待上限(惰性判定)、进程级风险锁存(重挂不清);`<profile>/copilot-auth/auth-intent.json` 记录本 profile 显式操作代次,撤回/超时后晚到的授权成功只更新事实、不再生成配置意图
118
+ - **授权状态(v2)**:授权生命周期在 `src/auth-host.mjs`——单实例 attemptId、15 分钟本地等待上限(惰性判定)、进程级风险锁存(重挂不清);`<profile>/copilot-auth/auth-intent.json` 记录本 profile 显式操作代次,超时后晚到的授权成功只更新事实、不再生成配置意图
116
119
  - **模型目录兜底填充**:登录成功时,取「账号可用模型 ∩ pi-ai 内置目录」写入该路由的模型目录——仅当该路由尚未配置 `models` 且无 `modelOverrides`、且填充 handoff 仍完好时写入;目录已存在(含空列表)一律让路,插件启动/重启也绝不触碰用户 settings。同步失败经 `/copilot-auth/status` 的 `syncError` 字段暴露
117
120
  - **刷新状态(v2)**:`src/refresh-service.mjs`(预览快照/证据门禁/幂等查询)+ `src/refresh-transaction.mjs`(写前意图、两通道提交时点、条件回滚、boot 恢复与保守自愈),状态按 profile 隔离落盘
118
121
 
@@ -120,7 +123,7 @@ pi-ai 的模型目录是打包时硬编码的 JSON:上游新增模型(如 ge
120
123
 
121
124
  ```bash
122
125
  npm install
123
- npm test # node:test:patch 结构 + host/授权控制器/客户端状态机/模型策略/预览服务/事务内核/profile 隔离 共 181 条(CI 跑 ubuntu/windows/macos 三平台矩阵)
126
+ npm test # node:test:patch 结构 + host/授权控制器/客户端状态机/模型策略/预览服务/事务内核/profile 隔离 共 211 条(CI 跑 ubuntu/windows/macos 三平台矩阵)
124
127
  npm run build # esbuild 打包 client 到 lib/client.js(__ModuleLoader__ 信封)
125
128
  npm pack --dry-run
126
129
  ```
@@ -129,7 +132,7 @@ npm pack --dry-run
129
132
  |---|---|
130
133
  | `cordis.patch.yml` | 两段 patch(本插件 entry / 预置路由;authorization 服务 0.1.7+ 由 runtime 内置,不再挂载) |
131
134
  | `src/host.mjs` · `src/shared.mjs` | host 半区:路由接线、status 聚合、启动期能力探测 |
132
- | `src/auth-host.mjs` | 授权控制器:单实例尝试、软撤回+风险锁存、禁用退出、首次填充 handoff |
135
+ | `src/auth-host.mjs` | 授权控制器:单实例尝试、超时风险锁存、禁用退出、首次填充 handoff(Q38 起软撤回移除) |
133
136
  | `src/runtime-scope.mjs` | 稳定 profile 身份与私有 dataDir(`<profile>/copilot-auth/`) |
134
137
  | `src/refresh-service.mjs` · `src/refresh-transaction.mjs` · `src/model-update.mjs` | 预览快照/证据门禁/幂等 · 事务内核与恢复 · 纯变更策略 |
135
138
  | `src/client-http.mjs` · `src/auth-flow.mjs` · `src/refresh-flow.mjs` | client 半区:HTTP 脱敏、授权状态机、模型流状态机 |
@@ -152,9 +155,9 @@ npm pack --dry-run
152
155
  - `settings.yaml` 的 `llm-pi-ai:` 节只能稀疏覆盖字段,无法删除预置路由本身(移除须卸载本插件)
153
156
  - 路由前缀 `/copilot-auth` 两侧硬编码,不可配置
154
157
  - DSH rc 版本耦合:实测 `0.1.7-rc.2` 与 `0.2.0-rc.1`(v1.2.x;`0.1.2-rc.1` 由 v1.1.x 实测),peer 仅 `@deepseek-ai/cordis@^4.0.2`
155
- - 模型目录只在「尚不存在」时由登录成功兜底填充一次,填充后归用户所有:账号新增的模型不会自动出现——用 GHC 设置页的「**补充模型**」勾选加入(见上节),或在 Models 页手动添加
156
- - 模型目录只写入「可解析」的模型:目录快照外的新模型须先经「补充模型」补入——可写安装树补进目录文件、只读安装树(desktop)注入进程内注册表(ADR 0003),两条通道都保持 pi-ai 版本不变
157
- - 请求撤回/等待超时后,该 profile 的旧预览与待生效配置意图按 intentVersion 失效(auth-changed / recovery-needed),须重新预览或显式「结束旧配置意图」
158
+ - 模型目录只在「尚不存在」时由登录成功兜底填充一次,填充后归用户所有:账号新增的模型不会自动出现——用 GHC 设置页的「**管理模型列表**」勾选加入(见上节),或在 Models 页手动添加
159
+ - 模型目录只写入「可解析」的模型:目录快照外的新模型须先经「管理模型列表」补入——可写安装树补进目录文件、只读安装树(desktop)注入进程内注册表(ADR 0003),两条通道都保持 pi-ai 版本不变
160
+ - 等待超时后,该 profile 的旧预览与待生效配置意图按 intentVersion 失效(auth-changed / recovery-needed),须重新预览或显式「结束旧配置意图」
158
161
  - DSH 升级后自愈仅在 pi-ai 基线版本不变(0.84.4)时重放;跨版本且条目未原生存在时上报 `self-heal-incompatible`,不修改安装树(重新执行一次手动刷新即可在新基线上激活)
159
162
  - **dsh-desktop(Electron 桌面版)可刷新模型目录(v1.2.5 起)**:运行时树打包在只读的 `app.asar` 内,写盘通道物理不可用,但刷新改走进程内目录注册表注入(ADR 0003)——当次生效、无需重启、不碰官方产物;重启后由启动序列重放,并按 v1.2.6 的复核/同值触碰机制保证路由真的端出这些模型。前提是该进程的 pi-ai 目录注册表形态与实测一致(`MODELS[provider]` 未冻结、扁平、键=模型 id);上游改形状时注入守卫会拦下并报 `registry-*` 结构化错误,模型列表保持原样(不写 settings)。v1.2.4 及之前该形态只能置灰刷新入口(`catalog-not-writable`,另见 ADR 0002)
160
163
  - 并发保护为宿主单进程内 mutex,**不支持多实例/多进程并发刷新**