@inventec/dsh-copilot-auth 1.2.2 → 1.2.3
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 +7 -6
- package/package.json +1 -1
- package/src/atomic-json.mjs +16 -9
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@inventec/dsh-copilot-auth)
|
|
5
5
|
[](https://github.com/iasiv5/dsh-copilot-auth/actions/workflows/ci.yml)
|
|
6
6
|
[](https://github.com/iasiv5/dsh-copilot-auth/blob/main/LICENSE)
|
|
7
|
-
[](#前置要求)
|
|
7
|
+
[](#前置要求)
|
|
8
8
|
|
|
9
9
|
为 DSH(DeepSeek Harness)内置的 GitHub Copilot LLM provider 补上 Web 端设备码(device flow)登录/注销入口,并预置一条开箱即用的 GitHub Copilot 提供方路由。
|
|
10
10
|
|
|
@@ -22,17 +22,17 @@
|
|
|
22
22
|
- 🔄 **手动补充新模型目录条目**:GHC 设置页一键刷新——diff 预览 + 二次确认 + 数据级目录补丁(**pi-ai 版本不动**),新模型(如 gemini-3.8-flash)即可加入、失效模型镜像移除
|
|
23
23
|
- 🌐 **中/英双语界面**:跟随 DSH 语言设置自动切换
|
|
24
24
|
- 🔑 **凭据安全托管**:存入 DSH 内置凭据库(文件强制 0600 权限),Copilot 临时 token 到期自动刷新
|
|
25
|
-
- 🧪 **测试与 CI**:
|
|
25
|
+
- 🧪 **测试与 CI**:107 条单元测试;GitHub Actions 构建测试 + tag 触发自动发布(provenance)
|
|
26
26
|
|
|
27
27
|
## 前置要求
|
|
28
28
|
|
|
29
|
-
- DSH `0.1.7-rc.2`(实测版本,v1.2.0
|
|
29
|
+
- DSH `0.1.7-rc.2` / `0.2.0-rc.1`(实测版本,v1.2.x 的适配目标;0.2.0 起注意插件 peer 精确版本守卫,见下文版本矩阵)
|
|
30
30
|
- 版本矩阵:`0.1.2-rc.1` ~ `0.1.5-rc.2` 请用 **v1.1.x**(v1.2.0 移除了旧版必需的 authorization 挂载补丁,在旧版上无法激活)
|
|
31
31
|
- v1.2.0 适配了 0.1.7 的 settings API 重塑(`settings.get` 移除),目录保护逻辑改走 `describe()`:**`describe()` 读取在 value 层缺失时回退 user 层,兼容旧版 describe 行形状**;DSH 版本支持矩阵见下表
|
|
32
32
|
|
|
33
33
|
| 本插件 | DSH 实测版本 | authorization 服务 | 说明 |
|
|
34
34
|
|---|---|---|---|
|
|
35
|
-
| v1.2.x | `0.1.7-rc.2
|
|
35
|
+
| v1.2.x | `0.1.7-rc.2`+(`0.2.0-rc.1` 已实测通过) | runtime 内置,插件不挂载 | 适配 settings API 重塑后的 describe() 行形状 |
|
|
36
36
|
| v1.1.x | `0.1.2-rc.1` ~ `0.1.5-rc.2` | 由 cordis.patch.yml insert 挂载 | v1.2.0 起移除该补丁,旧版 DSH 上无法激活 |
|
|
37
37
|
|
|
38
38
|
- 有效的 GitHub Copilot 订阅(公司分配的 github.com 组织账号,SSO 登录)
|
|
@@ -95,7 +95,7 @@ pi-ai 的模型目录是打包时硬编码的 JSON:上游新增模型(如 ge
|
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
97
|
npm install
|
|
98
|
-
npm test # node:test:patch 结构 + host/目录/状态机/启动序列共
|
|
98
|
+
npm test # node:test:patch 结构 + host/目录/状态机/启动序列共 107 条
|
|
99
99
|
npm run build # esbuild 打包 client 到 lib/client.js(__ModuleLoader__ 信封)
|
|
100
100
|
npm pack --dry-run
|
|
101
101
|
```
|
|
@@ -121,11 +121,12 @@ npm pack --dry-run
|
|
|
121
121
|
- 自行在 `cordis.patch.yml` patch `llm-pi-ai` 整段 config 会覆盖预置路由
|
|
122
122
|
- `settings.yaml` 的 `llm-pi-ai:` 节只能稀疏覆盖字段,无法删除预置路由本身(移除须卸载本插件)
|
|
123
123
|
- 路由前缀 `/copilot-auth` 两侧硬编码,不可配置
|
|
124
|
-
- DSH rc 版本耦合:实测 `0.1.7-rc.2`(v1.2.
|
|
124
|
+
- 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`
|
|
125
125
|
- 模型目录只在「尚不存在」时由登录成功兜底填充一次,填充后归用户所有:账号新增的模型不会自动出现——用 GHC 设置页的「**刷新可用模型目录**」同步(见上节),或在 Models 页手动添加
|
|
126
126
|
- 模型目录只写入 pi-ai 内置目录已描述的模型:目录快照外的新模型需先经「刷新可用模型目录」补入目录条目(数据级补丁,pi-ai 版本不变)才会出现在可选列表
|
|
127
127
|
- DSH 升级后自愈仅在 pi-ai 基线版本不变(0.84.4)时重放;跨版本且条目未原生存在时上报 `self-heal-incompatible`,不修改安装树(重新执行一次手动刷新即可在新基线上激活)
|
|
128
128
|
- 并发保护为宿主单进程内 mutex,**不支持多实例/多进程并发刷新**
|
|
129
|
+
- 状态落盘后的目录 fsync 仅在 POSIX 执行:Windows 无目录 fsync 语义(对目录句柄 fsync 必然 `EPERM`),win32 直接跳过、不再刷告警,目录项一致性由 NTFS 元数据日志保证(v1.2.3 起,issue #1);POSIX 行为不变
|
|
129
130
|
|
|
130
131
|
## 维护者发布
|
|
131
132
|
|
package/package.json
CHANGED
package/src/atomic-json.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// atomic-json.mjs — 所有 JSON 写盘的唯一通道。
|
|
2
2
|
// writeJsonAtomic: 同目录 temp(wx 排他创建)→ writeAll → fsyncFile → 重读 parse 校验
|
|
3
|
-
// → rename → fsyncDirectory
|
|
3
|
+
// → rename → fsyncDirectory(win32 无目录 fsync 语义直接跳过,issue #1;其余失败仅此处降级 warn)。rename 前任何失败清理 temp 并抛错,
|
|
4
4
|
// 原文件不动。第三参为语义 adapter 的部分覆盖(未覆盖键回落默认实现),供故障注入测试。
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import {
|
|
@@ -31,20 +31,27 @@ export function writeAll(fd, buffer, writeChunk = writeSync) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
// 目录 fsync 是 POSIX 惯用法(open 目录句柄 + fsync,保目录项落盘)。
|
|
35
|
+
// Windows 无目录 fsync 语义:对目录句柄 fsyncSync 必然 EPERM(libuv FlushFileBuffers
|
|
36
|
+
// 对目录句柄拒绝,issue #1)——win32 直接跳过,NTFS 元数据日志已保证 rename 后
|
|
37
|
+
// 的目录项一致性;POSIX 平台行为不变。具名导出仅供测试观察平台分支。
|
|
38
|
+
export function fsyncDirectory(dir) {
|
|
39
|
+
if (process.platform === "win32") return;
|
|
40
|
+
const fd = openSync(dir, "r");
|
|
41
|
+
try {
|
|
42
|
+
fsyncSync(fd);
|
|
43
|
+
} finally {
|
|
44
|
+
closeSync(fd);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
34
48
|
const defaultFs = {
|
|
35
49
|
openTemp: (path) => openSync(path, "wx"),
|
|
36
50
|
writeAll: (fd, buf) => writeAll(fd, buf),
|
|
37
51
|
fsyncFile: (fd) => fsyncSync(fd),
|
|
38
52
|
closeFd: (fd) => closeSync(fd),
|
|
39
53
|
rename: (from, to) => renameSync(from, to),
|
|
40
|
-
fsyncDirectory
|
|
41
|
-
const fd = openSync(dir, "r");
|
|
42
|
-
try {
|
|
43
|
-
fsyncSync(fd);
|
|
44
|
-
} finally {
|
|
45
|
-
closeSync(fd);
|
|
46
|
-
}
|
|
47
|
-
},
|
|
54
|
+
fsyncDirectory,
|
|
48
55
|
remove: (path) => unlinkSync(path),
|
|
49
56
|
};
|
|
50
57
|
|