@landh93/web-codex-client 0.1.0-rc.3 → 0.1.0-rc.4
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/NPM_RELEASE.md +3 -3
- package/README.md +3 -1
- package/dist/cli.js +12 -3
- package/package.json +1 -1
package/NPM_RELEASE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# npm 客户端发布与安装
|
|
2
2
|
|
|
3
|
-
包名:`@landh93/web-codex-client`。当前候选版为 `0.1.0-rc.
|
|
3
|
+
包名:`@landh93/web-codex-client`。当前候选版为 `0.1.0-rc.4`,使用 `next` 标签。仅支持 Linux / Node.js 24;这是独立安装候选版,不代表公网、多人或真实模型执行已完成生产验收。`remote-wss-v1` 明确允许远端 WSS,继续使用固定 Noise 加密、TLS 校验及 Token 自动认证。项目尚未选定开源许可证,包暂保留 `UNLICENSED`;第三方代码许可见包内 `sdk/THIRD_PARTY_NOTICES.md`。
|
|
4
4
|
|
|
5
5
|
## 用户安装
|
|
6
6
|
|
|
@@ -28,7 +28,7 @@ Client 运行后,在网页输入同一个 Token 即可:自动选择设备、
|
|
|
28
28
|
|
|
29
29
|
默认授权本机 Codex 项目目录与活动/归档会话元数据识别出的已有项目读写,保留目录边界和 Codex 执行审批。授权在每次连接时重新读取,不持久保存临时浏览器身份。不同 token 对应不同设备,不能凭一个设备 Token 查看其他设备。
|
|
30
30
|
|
|
31
|
-
此版本需要同时更新 Server 网关、网页和 Client(SDK rc.4)。旧 Server 不支持新的 Token 登录;应先部署 Server 再升级并重启 Client。原有设备 Token 可继续使用,无需重新注册。新部署的 Server 可通过 `CONNECTION_TOKEN_FILE=/private/path/token` 直接配置同一个 Token,无需先创建管理员账号;文件权限为 0600,Token 至少 32
|
|
31
|
+
此版本需要同时更新 Server 网关、网页和 Client(SDK rc.4)。旧 Server 不支持新的 Token 登录;应先部署 Server 再升级并重启 Client。原有设备 Token 可继续使用,无需重新注册。新部署的 Server 可通过 `CONNECTION_TOKEN_FILE=/private/path/token` 直接配置同一个 Token,无需先创建管理员账号;文件权限为 0600,Token 至少 32 个无空白字符。管理员口令可登录并连接账号下所有在线设备;rc.4 通过管理员路由 v1 支持此流程。升级时保留配置和 Token,只重启 Client,无需重启 Codex。`pairingMode:"manual"` 仍是显式本机确认的兼容模式,不接受管理员自动授权。
|
|
32
32
|
|
|
33
33
|
后台常驻可使用 systemd 用户服务,将 `ExecStart` 设为实际安装的 `web-codex-client run --config /absolute/config.json`。npm 安装不会自动启用服务或打开配对窗口。
|
|
34
34
|
|
|
@@ -68,7 +68,7 @@ npm whoami --registry=https://registry.npmjs.org/ --userconfig="$HOME/.config/we
|
|
|
68
68
|
随后发布已通过验证的**具体 tgz**,不重新构建另一个包:
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
npm publish .test-output/landh93-web-codex-client-0.1.0-rc.
|
|
71
|
+
npm publish .test-output/landh93-web-codex-client-0.1.0-rc.4.tgz \
|
|
72
72
|
--access public --tag next --ignore-scripts \
|
|
73
73
|
--registry=https://registry.npmjs.org/ \
|
|
74
74
|
--userconfig="$HOME/.config/web-codex-npm/npmrc"
|
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ web-codex-client run
|
|
|
18
18
|
|
|
19
19
|
`configure` 只需服务端 HTTPS/WSS 地址和连接 Token。启动后,在网页输入同一个 Token,就能查看项目、session 并发送对话;无需配对命令、指纹核对或申请控制权。Codex socket 自动发现,`doctor` 仅用于故障诊断。
|
|
20
20
|
|
|
21
|
-
已有 Codex 项目自动允许读写,执行审批和目录边界仍保留。配置、Token 和身份与 npm 安装目录分开存放,升级保留。Client rc.
|
|
21
|
+
已有 Codex 项目自动允许读写,执行审批和目录边界仍保留。配置、Token 和身份与 npm 安装目录分开存放,升级保留。Client rc.4 增加管理员连接,需要支持管理员路由 v1 的 Server;SDK 保持 rc.4。请先更新 Server,再升级并重启 Client。完整安装和发布说明见 [NPM_RELEASE.md](./NPM_RELEASE.md)。
|
|
22
22
|
|
|
23
23
|
## 安装、构建、自测
|
|
24
24
|
|
|
@@ -49,6 +49,8 @@ Chromium 已装在其他位置时可设置 `CHROMIUM_EXECUTABLE=/absolute/path/t
|
|
|
49
49
|
|
|
50
50
|
只允许 WSS 并验证证书;私有 CA 使用 `NODE_EXTRA_CA_CERTS`。浏览器在当前标签页保存 Token 以支持刷新自动重连,退出登录清除。已识别项目每次连接重新扫描,根目录、用户主目录和 Client 私有状态的父目录不会自动授权。
|
|
51
51
|
|
|
52
|
+
管理员使用 Server 管理员口令登录后,可以连接该账号的所有在线设备,不需要逐台输入 Token。Client 信任配置的 Server 签发仅限当前路由的管理员凭据,并将其绑定到 Noise 握手验证;已识别项目范围、写租约及 Codex 审批仍生效。旧 Client rc.3 必须升级并重启才能接受管理员连接。
|
|
53
|
+
|
|
52
54
|
旧的人工配对仅在配置显式设置 `pairingMode:"manual"` 时启用,不再是默认流程。每个 stateDir 只运行一个 Client;`status` 和 `doctor` 可诊断连接,`deploy/web-codex-client.service` 提供后台运行模板。
|
|
53
55
|
|
|
54
56
|
## Codex 接入与只读诊断
|
package/dist/cli.js
CHANGED
|
@@ -2473,7 +2473,10 @@ var ClientDaemon = class {
|
|
|
2473
2473
|
connect() {
|
|
2474
2474
|
if (this.stopped) return;
|
|
2475
2475
|
this.ws = new WebSocket2(new URL("/ws/v1/client", this.config.relayUrl), {
|
|
2476
|
-
headers: {
|
|
2476
|
+
headers: {
|
|
2477
|
+
Authorization: this.config.pairingMode === "manual" ? "Bearer " + this.token : "TokenHash " + this.relayToken,
|
|
2478
|
+
...this.config.pairingMode !== "manual" ? { "X-Web-Codex-Admin-Routes": "v1" } : {}
|
|
2479
|
+
},
|
|
2477
2480
|
perMessageDeflate: false,
|
|
2478
2481
|
maxPayload: 128 * 1024,
|
|
2479
2482
|
handshakeTimeout: 1e4
|
|
@@ -2519,7 +2522,12 @@ var ClientDaemon = class {
|
|
|
2519
2522
|
this.control({ type: "route.close", routeId: m.routeId });
|
|
2520
2523
|
return;
|
|
2521
2524
|
}
|
|
2525
|
+
if (m.adminToken !== void 0 && (this.config.pairingMode === "manual" || typeof m.adminToken !== "string" || !/^[A-Za-z0-9_-]{43}$/.test(m.adminToken))) {
|
|
2526
|
+
this.control({ type: "route.close", routeId: m.routeId });
|
|
2527
|
+
return;
|
|
2528
|
+
}
|
|
2522
2529
|
this.routes.set(m.routeId, {
|
|
2530
|
+
proofToken: m.adminToken ?? this.token,
|
|
2523
2531
|
confirmed: false,
|
|
2524
2532
|
expires: Date.now() + PAIRING_MS,
|
|
2525
2533
|
queue: Promise.resolve(),
|
|
@@ -2568,7 +2576,7 @@ var ClientDaemon = class {
|
|
|
2568
2576
|
kind: "pairing",
|
|
2569
2577
|
status: "pending",
|
|
2570
2578
|
fingerprint: r.session.fingerprint,
|
|
2571
|
-
proof: await tokenProof(
|
|
2579
|
+
proof: await tokenProof(r.proofToken, r.session.fingerprint, "client")
|
|
2572
2580
|
});
|
|
2573
2581
|
} else if (grant) {
|
|
2574
2582
|
r.session.trust(r.session.fingerprint);
|
|
@@ -2594,7 +2602,7 @@ var ClientDaemon = class {
|
|
|
2594
2602
|
if (r.confirmed || message.fingerprint !== r.session.fingerprint || message.status !== "confirmed" || Date.now() > r.expires)
|
|
2595
2603
|
throw Error("PAIRING_MISMATCH");
|
|
2596
2604
|
if (this.config.pairingMode !== "manual") {
|
|
2597
|
-
if (!await verifyTokenProof(
|
|
2605
|
+
if (!await verifyTokenProof(r.proofToken, r.session.fingerprint, "browser", message.proof)) throw new BridgeError("TOKEN_AUTH_FAILED");
|
|
2598
2606
|
const roots = await this.discoverProjects();
|
|
2599
2607
|
if (this.routes.get(frame.routeId) !== r || Date.now() > r.expires) return;
|
|
2600
2608
|
const peer = r.session.peerPublicKey;
|
|
@@ -2605,6 +2613,7 @@ var ClientDaemon = class {
|
|
|
2605
2613
|
this.send(frame.routeId, { kind: "pairing", status: "ready", fingerprint: r.session.fingerprint });
|
|
2606
2614
|
}
|
|
2607
2615
|
r.confirmed = true;
|
|
2616
|
+
r.proofToken = "";
|
|
2608
2617
|
return;
|
|
2609
2618
|
}
|
|
2610
2619
|
if (!r.owner || !this.grants.has(r.owner))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@landh93/web-codex-client",
|
|
3
|
-
"version": "0.1.0-rc.
|
|
3
|
+
"version": "0.1.0-rc.4",
|
|
4
4
|
"description": "Encrypted local Codex bridge with automatic token authentication and workspace access",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"bin": { "web-codex-client": "dist/cli.js" },
|