@skylandnpm/octopus-proxy 0.1.70 → 0.1.71
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 +4 -4
- package/dist/{chunk-IKWSVBPJ.js → chunk-GOPKVIVH.js} +9 -7
- package/dist/cli.js +43 -28
- package/dist/main.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,11 +16,11 @@ octopus-proxy identity
|
|
|
16
16
|
|
|
17
17
|
向导默认使用 `https://octopus.wuyehao.com` 作为 Hub 地址;按需可输入其他地址,或用 `--hub-url` 指定。再次运行向导时会读取现有配置,直接回车即可保留各项设置;机器人 Secret 只提示已配置,不在终端显示原值。macOS 上选择编码工具时,向导优先显示已配置或探测到的命令路径,否则给出该工具的 macOS 路径示例;回车后会检查文件可执行性并运行版本命令,失败时要求重新输入。无交互环境可使用 `octopus-proxy onboard --non-interactive`,未提供 `--hub-url` 时也使用该默认地址;完整选项见 `octopus-proxy help`。安装服务后可运行 `octopus-proxy status` 和 `octopus-proxy doctor` 检查状态。
|
|
18
18
|
|
|
19
|
-
Proxy 主动连接 Hub 的 `/ws/proxy-chat`,无需开放入站端口或安装 sshd。Claw 经 `/ws/claw-chat` 建立到 Proxy 的内层 TLS 1.3 会话;Hub 只转发加密字节。首次打开工作区显示主机公钥指纹;核对后点击 Trust
|
|
19
|
+
Proxy 主动连接 Hub 的 `/ws/proxy-chat`,无需开放入站端口或安装 sshd。Claw 经 `/ws/claw-chat` 建立到 Proxy 的内层 TLS 1.3 会话;Hub 只转发加密字节。首次打开工作区显示主机公钥指纹;核对后点击 Trust,未授权设备还需输入主机终端生成的配对码。Proxy 校验设备签名、配对码及主机密码并持久化设备授权,Claw 在认证成功后按 Hub 地址和机器人 ID 固定指纹;之后指纹变化会拒绝连接。每次连接都要输入运行 Proxy 服务账号的主机密码,由主机上的 PAM(Linux)或 Open Directory(macOS)验证。断线或连续 60 分钟没有用户操作后需要重新认证。服务安装时生成主机身份,`octopus-proxy identity` 显示指纹并生成 3 天内有效、最多可成功配对 10 次的配对码。安装主机需提供 OpenSSL 和 C 编译器;Linux 还需 PAM 开发头文件。机器人 Secret 仅用于 Hub 路由,不能单独授权工作区。
|
|
20
20
|
|
|
21
21
|
macOS 12.3 及以上运行 `octopus-proxy onboard` 时,配置保存后、服务启动前会准备截屏辅助程序并申请系统屏幕录制权限;已授权时不会重复弹窗。交互模式和 `--non-interactive` 均执行此步骤,`--no-install-service` 也会申请。请在系统弹窗中允许访问;拒绝、超时或辅助程序编译失败时,向导提示原因与授权路径,并继续初始化。在“系统设置 → 隐私与安全性 → 屏幕录制(或屏幕与系统音频录制)”中应授权弹窗显示的实际程序,可能是 Terminal、iTerm、编辑器或 node,不保证出现 `octopus-desktop-capture`。onboard 和 doctor 会显示辅助程序路径,文件名不等于系统授权名称。终端授权不代表后台服务已授权,需在 Claw 点击截屏,让实际服务申请权限,按实际名称授权后重启 Proxy。Linux 没有通用的截屏授权弹窗,需使用桌面用户的图形会话环境;平台依赖与设置见[桌面快照说明](../../docs/claw-desktop-snapshots.md)。
|
|
22
22
|
|
|
23
|
-
基础设置完成后,向导会提示至少需要配置一个工作项目。新项目依次填写项目 ID、名称(默认使用项目 ID
|
|
23
|
+
基础设置完成后,向导会提示至少需要配置一个工作项目。新项目依次填写项目 ID、名称(默认使用项目 ID)和目录。新增或编辑项目时,若输入的目录不存在,向导会询问是否立即创建;输入 `y` 确认后会递归创建所需的多层目录,直接回车或输入 `n` 则重新输入路径。创建失败会提示原因并允许重新输入;路径必须指向目录。完成第一个项目后,可选择继续添加更多项目,或直接回车完成项目配置并继续保存。只有选择继续添加时,才会进入下一个项目 ID 的输入流程。
|
|
24
24
|
|
|
25
25
|
`octopus-proxy doctor` 会显示“桌面截屏支持”和“屏幕录制权限”:macOS 检查系统版本、辅助程序、活动显示器和当前授权状态;未授权时给出 onboard 申请及系统设置指引。Linux 检查图形会话、显示器和截屏依赖,缺少依赖、无桌面或不支持的 Wayland 环境会显示具体提示;Linux 无统一的授权查询接口,因此会明确显示权限尚无法确认,需在 Claw 实际截屏验证。诊断不触发授权弹窗、不截屏,`doctor --fix` 也不会自动申请截屏权限。这些检查使用运行 doctor 的用户与环境;服务以其他启动程序或图形会话运行时,其权限与环境需要单独确认。
|
|
26
26
|
|
|
@@ -70,9 +70,9 @@ Codex 和 ZCode 由 Proxy 按授权项目启动各自的 app-server,默认随
|
|
|
70
70
|
octopus-proxy identity
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
命令显示主机完整公钥指纹、6 位数字配对码及到期时间。请核对 Claw 显示的主机指纹,再输入配对码及服务账号密码。配对码 5
|
|
73
|
+
命令显示主机完整公钥指纹、6 位数字配对码及到期时间。请核对 Claw 显示的主机指纹,再输入配对码及服务账号密码。配对码 3 天内有效,最多可成功配对 10 次,次数用尽后失效。已授权设备重连不消耗配对次数,失败的配对不消耗成功次数;最多允许 5 次失败配对提交,跨设备和连接累计,达到上限会提前关闭配对窗口。每次运行 `identity` 都废止旧码并重置次数和有效期。`octopus-proxy identity --cancel` 可立即关闭窗口。Proxy 服务未运行时,命令显示指纹并报错,不生成不可使用的配对码。
|
|
74
74
|
|
|
75
|
-
一个 Proxy 支持多台 Claw 同时在线,最多 32
|
|
75
|
+
一个 Proxy 支持多台 Claw 同时在线,最多 32 条并发隧道。添加下一台设备时可复用有效且仍有剩余次数的配对码,或重新运行 `identity` 生成新码;已有授权和连接不受影响。已授权设备重连、Claw 重开、Proxy 重启或更新均无需再次配对,但每条新连接仍需主机密码认证。配对码只保存在服务内存中,重启即失效;设备授权单独保存在状态目录的 `authorized-devices.json`(权限 `0600`),按 Hub origin、机器人 ID 和设备公钥隔离。
|
|
76
76
|
|
|
77
77
|
```bash
|
|
78
78
|
octopus-proxy devices
|
|
@@ -8835,8 +8835,8 @@ var DeviceAuthorizations = class _DeviceAuthorizations {
|
|
|
8835
8835
|
do {
|
|
8836
8836
|
code = randomInt(0, 1e6).toString().padStart(6, "0");
|
|
8837
8837
|
} while (code === this.pairing?.code);
|
|
8838
|
-
const expiresAt = Date.now() +
|
|
8839
|
-
this.pairing = { code, expiresAt, failures: 0 };
|
|
8838
|
+
const expiresAt = Date.now() + 3 * 24 * 60 * 6e4;
|
|
8839
|
+
this.pairing = { code, expiresAt, failures: 0, uses: 0 };
|
|
8840
8840
|
return { code, expiresAt };
|
|
8841
8841
|
});
|
|
8842
8842
|
}
|
|
@@ -8876,9 +8876,9 @@ var DeviceAuthorizations = class _DeviceAuthorizations {
|
|
|
8876
8876
|
if (enrolling) {
|
|
8877
8877
|
if (!window || !this.pairingOpen()) throw new DeviceAuthError("pairing_closed");
|
|
8878
8878
|
if (typeof code !== "string" || !/^\d{6}$/.test(code)) throw new DeviceAuthError("pairing_required");
|
|
8879
|
-
window.failures++;
|
|
8880
8879
|
const matches = timingSafeEqual(Buffer.from(code), Buffer.from(window.code));
|
|
8881
8880
|
if (!matches) {
|
|
8881
|
+
window.failures++;
|
|
8882
8882
|
if (window.failures >= 5) this.pairing = void 0;
|
|
8883
8883
|
throw new DeviceAuthError("pairing_invalid");
|
|
8884
8884
|
}
|
|
@@ -8887,12 +8887,14 @@ var DeviceAuthorizations = class _DeviceAuthorizations {
|
|
|
8887
8887
|
if (!await authenticate()) throw new DeviceAuthError("password_invalid");
|
|
8888
8888
|
if (!alive()) throw new DeviceAuthError("session_closed");
|
|
8889
8889
|
if (enrolling) {
|
|
8890
|
-
if (this.pairing !== window || !this.pairingOpen()) throw new DeviceAuthError("pairing_closed");
|
|
8890
|
+
if (!window || this.pairing !== window || !this.pairingOpen()) throw new DeviceAuthError("pairing_closed");
|
|
8891
8891
|
await this.save([...this.devices, { id: deviceId(key), publicKey: key, hubOrigin: this.origin, botId: this.config.botId, createdAt: (/* @__PURE__ */ new Date()).toISOString() }]);
|
|
8892
|
-
|
|
8892
|
+
window.uses++;
|
|
8893
|
+
if (window.uses >= 10) this.pairing = void 0;
|
|
8893
8894
|
}
|
|
8894
|
-
}
|
|
8895
|
-
if (enrolling && window &&
|
|
8895
|
+
} catch (error) {
|
|
8896
|
+
if (enrolling && window && this.pairing === window && ++window.failures >= 5) this.pairing = void 0;
|
|
8897
|
+
throw error;
|
|
8896
8898
|
}
|
|
8897
8899
|
});
|
|
8898
8900
|
}
|
package/dist/cli.js
CHANGED
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
supportedPlatform,
|
|
36
36
|
systemdUnitPath,
|
|
37
37
|
toolSearchDirs
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-GOPKVIVH.js";
|
|
39
39
|
import {
|
|
40
40
|
DESKTOP_PERMISSION_GUIDANCE,
|
|
41
41
|
PlatformDesktop,
|
|
@@ -484,6 +484,44 @@ async function ask(rl, question, options = {}) {
|
|
|
484
484
|
return value;
|
|
485
485
|
}
|
|
486
486
|
}
|
|
487
|
+
async function askProjectDirectory(rl, name, defaultDirectory) {
|
|
488
|
+
for (; ; ) {
|
|
489
|
+
const directory = expandHome(await ask(rl, ` \u300C${name}\u300D\u76EE\u5F55\uFF08\u7EDD\u5BF9\u8DEF\u5F84\uFF09`, { default: defaultDirectory }));
|
|
490
|
+
if (!isAbsolute4(directory)) {
|
|
491
|
+
console.log(" \u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
try {
|
|
495
|
+
if (!(await stat3(directory)).isDirectory()) {
|
|
496
|
+
console.log(" \u8DEF\u5F84\u5FC5\u987B\u662F\u76EE\u5F55");
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
return directory;
|
|
500
|
+
} catch (error) {
|
|
501
|
+
if (error.code !== "ENOENT") {
|
|
502
|
+
console.log(` \u65E0\u6CD5\u8BBF\u95EE\u76EE\u5F55\uFF1A${error instanceof Error ? error.message : error}`);
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
const create = await ask(rl, ` \u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u662F\u5426\u7ACB\u5373\u521B\u5EFA\u300C${directory}\u300D\uFF1F(y/N)`, {
|
|
507
|
+
default: "n",
|
|
508
|
+
showDefault: false,
|
|
509
|
+
validate: (value) => /^(y|yes|n|no)$/i.test(value) ? void 0 : "\u8BF7\u8F93\u5165 y \u6216 n"
|
|
510
|
+
});
|
|
511
|
+
if (!/^(y|yes)$/i.test(create)) continue;
|
|
512
|
+
try {
|
|
513
|
+
await mkdir4(directory, { recursive: true });
|
|
514
|
+
if (!(await stat3(directory)).isDirectory()) {
|
|
515
|
+
console.log(" \u8DEF\u5F84\u5FC5\u987B\u662F\u76EE\u5F55");
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
console.log(` \u5DF2\u521B\u5EFA\u76EE\u5F55\uFF1A${directory}`);
|
|
519
|
+
return directory;
|
|
520
|
+
} catch (error) {
|
|
521
|
+
console.log(` \u521B\u5EFA\u76EE\u5F55\u5931\u8D25\uFF1A${error instanceof Error ? error.message : error}`);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
487
525
|
function slug(name) {
|
|
488
526
|
return name.replaceAll(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+/, "").replace(/-+$/, "");
|
|
489
527
|
}
|
|
@@ -566,18 +604,7 @@ async function runOnboard(opts) {
|
|
|
566
604
|
if (projects.length) console.log("\n\u5DF2\u6709\u6388\u6743\u9879\u76EE\uFF08\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\u5404\u9879\uFF09\uFF1A");
|
|
567
605
|
for (const [index, project] of projects.entries()) {
|
|
568
606
|
project.name = await ask(rl, " \u9879\u76EE\u540D\u79F0", { default: project.name });
|
|
569
|
-
|
|
570
|
-
project.directory = expandHome(await ask(rl, ` \u300C${project.name}\u300D\u76EE\u5F55\uFF08\u7EDD\u5BF9\u8DEF\u5F84\uFF09`, { default: project.directory }));
|
|
571
|
-
if (!isAbsolute4(project.directory)) {
|
|
572
|
-
console.log(" \u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");
|
|
573
|
-
continue;
|
|
574
|
-
}
|
|
575
|
-
if (!await stat3(project.directory).then(() => true, () => false)) {
|
|
576
|
-
console.log(" \u76EE\u5F55\u4E0D\u5B58\u5728");
|
|
577
|
-
continue;
|
|
578
|
-
}
|
|
579
|
-
break;
|
|
580
|
-
}
|
|
607
|
+
project.directory = await askProjectDirectory(rl, project.name, project.directory);
|
|
581
608
|
project.id = await ask(rl, " \u9879\u76EE ID", { default: project.id ?? slug(project.name), validate: (value) => validateProjectId(value, projects.slice(0, index)) });
|
|
582
609
|
}
|
|
583
610
|
for (; ; ) {
|
|
@@ -594,19 +621,7 @@ async function runOnboard(opts) {
|
|
|
594
621
|
console.log("\n\u6DFB\u52A0\u5DE5\u4F5C\u9879\u76EE\uFF1A");
|
|
595
622
|
const id = await ask(rl, " \u9879\u76EE ID", { validate: (value) => validateProjectId(value, projects) });
|
|
596
623
|
const name = await ask(rl, " \u9879\u76EE\u540D\u79F0", { default: id });
|
|
597
|
-
|
|
598
|
-
for (; ; ) {
|
|
599
|
-
directory = expandHome(await ask(rl, ` \u300C${name}\u300D\u76EE\u5F55\uFF08\u7EDD\u5BF9\u8DEF\u5F84\uFF09`));
|
|
600
|
-
if (!isAbsolute4(directory)) {
|
|
601
|
-
console.log(" \u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84");
|
|
602
|
-
continue;
|
|
603
|
-
}
|
|
604
|
-
if (!await stat3(directory).then(() => true, () => false)) {
|
|
605
|
-
console.log(" \u76EE\u5F55\u4E0D\u5B58\u5728");
|
|
606
|
-
continue;
|
|
607
|
-
}
|
|
608
|
-
break;
|
|
609
|
-
}
|
|
624
|
+
const directory = await askProjectDirectory(rl, name);
|
|
610
625
|
projects.push({ id, name, directory });
|
|
611
626
|
}
|
|
612
627
|
rl.close();
|
|
@@ -870,7 +885,7 @@ var USAGE = `octopus-proxy \u2014 Octopus \u4E3B\u673A\u4EE3\u7406
|
|
|
870
885
|
run \u524D\u53F0\u8FD0\u884C\u4EE3\u7406\uFF08\u8C03\u8BD5\u7528\uFF0CCtrl+C \u9000\u51FA\uFF09
|
|
871
886
|
logs \u67E5\u770B\u670D\u52A1\u65E5\u5FD7\uFF08-f \u6301\u7EED\u8DDF\u968F\uFF09
|
|
872
887
|
version \u663E\u793A\u7248\u672C\u53F7
|
|
873
|
-
identity \u663E\u793A\u4E3B\u673A\u6307\u7EB9\u5E76\
|
|
888
|
+
identity \u663E\u793A\u4E3B\u673A\u6307\u7EB9\u5E76\u751F\u6210 3 \u5929\u5185\u6709\u6548\u3001\u53EF\u4F7F\u7528 10 \u6B21\u7684\u8BBE\u5907\u914D\u5BF9\u7801
|
|
874
889
|
devices \u5217\u51FA\u5DF2\u6388\u6743 Claw \u8BBE\u5907\u53CA\u5728\u7EBF\u8FDE\u63A5\u6570
|
|
875
890
|
help \u663E\u793A\u672C\u5E2E\u52A9
|
|
876
891
|
|
|
@@ -1006,7 +1021,7 @@ try {
|
|
|
1006
1021
|
console.log("\u5DF2\u53D6\u6D88\u8BBE\u5907\u914D\u5BF9\u7A97\u53E3");
|
|
1007
1022
|
} else {
|
|
1008
1023
|
const pairing = await deviceControlRequest(config.stateDirectory, "pair", void 0, { hubOrigin: new URL(config.hubUrl).origin, botId: config.botId });
|
|
1009
|
-
console.log(`\u914D\u5BF9\u7801\uFF1A${pairing.code}\uFF1B\u5230\u671F\u65F6\u95F4\uFF1A${new Date(pairing.expiresAt).toLocaleString()}\
|
|
1024
|
+
console.log(`\u914D\u5BF9\u7801\uFF1A${pairing.code}\uFF1B\u5230\u671F\u65F6\u95F4\uFF1A${new Date(pairing.expiresAt).toLocaleString()}\uFF083 \u5929\u5185\u6709\u6548\uFF0C\u6700\u591A\u53EF\u6210\u529F\u914D\u5BF9 10 \u6B21\uFF09`);
|
|
1010
1025
|
console.log("\u5DF2\u5E9F\u6B62\u65E7\u914D\u5BF9\u7801\uFF1B\u5DF2\u6709\u8BBE\u5907\u6388\u6743\u548C\u5728\u7EBF\u8FDE\u63A5\u4E0D\u53D7\u5F71\u54CD");
|
|
1011
1026
|
}
|
|
1012
1027
|
} catch (error) {
|
package/dist/main.js
CHANGED