deskbuddy 0.2.0-beta.2 → 0.2.0-beta.21

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.
Files changed (55) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +15566 -4613
  3. package/dist/deskbuddy-dsh.mjs +706 -0
  4. package/dist/gate.cjs +411 -35
  5. package/dist/hook.cjs +1283 -44
  6. package/dist/launcher.cjs +229 -0
  7. package/dist/ocTranslate.mjs +144 -0
  8. package/dist/opencode.mjs +204 -53
  9. package/dist/wake.cjs +769 -0
  10. package/docs/INSTALL.md +24 -10
  11. package/hook/deskbuddy-dsh.d.mts +24 -0
  12. package/hook/deskbuddy-dsh.mjs +706 -0
  13. package/hook/gate.cjs +411 -35
  14. package/hook/hook-debug.log +68 -0
  15. package/hook/hook.cjs +1283 -44
  16. package/hook/launcher.cjs +229 -0
  17. package/hook/ocTranslate.d.mts +9 -0
  18. package/hook/ocTranslate.mjs +144 -0
  19. package/hook/opencode.d.mts +10 -1
  20. package/hook/opencode.mjs +204 -53
  21. package/hook/wake.cjs +769 -0
  22. package/package.json +3 -2
  23. package/vendor/node-pty/LICENSE +69 -0
  24. package/vendor/node-pty/lib/conpty_console_list_agent.js +16 -0
  25. package/vendor/node-pty/lib/eventEmitter2.js +47 -0
  26. package/vendor/node-pty/lib/index.js +52 -0
  27. package/vendor/node-pty/lib/interfaces.js +7 -0
  28. package/vendor/node-pty/lib/shared/conout.js +11 -0
  29. package/vendor/node-pty/lib/terminal.js +190 -0
  30. package/vendor/node-pty/lib/types.js +7 -0
  31. package/vendor/node-pty/lib/unixTerminal.js +346 -0
  32. package/vendor/node-pty/lib/utils.js +39 -0
  33. package/vendor/node-pty/lib/windowsConoutConnection.js +125 -0
  34. package/vendor/node-pty/lib/windowsPtyAgent.js +320 -0
  35. package/vendor/node-pty/lib/windowsTerminal.js +199 -0
  36. package/vendor/node-pty/lib/worker/conoutSocketWorker.js +22 -0
  37. package/vendor/node-pty/package.json +7 -0
  38. package/vendor/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
  39. package/vendor/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  40. package/vendor/node-pty/prebuilds/darwin-x64/pty.node +0 -0
  41. package/vendor/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
  42. package/vendor/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  43. package/vendor/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  44. package/vendor/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  45. package/vendor/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  46. package/vendor/node-pty/prebuilds/win32-arm64/pty.node +0 -0
  47. package/vendor/node-pty/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  48. package/vendor/node-pty/prebuilds/win32-arm64/winpty.dll +0 -0
  49. package/vendor/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  50. package/vendor/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  51. package/vendor/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  52. package/vendor/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  53. package/vendor/node-pty/prebuilds/win32-x64/pty.node +0 -0
  54. package/vendor/node-pty/prebuilds/win32-x64/winpty-agent.exe +0 -0
  55. package/vendor/node-pty/prebuilds/win32-x64/winpty.dll +0 -0
package/docs/INSTALL.md CHANGED
@@ -4,7 +4,7 @@
4
4
  > 你按顺序执行下面的步骤即可。每一步都给了**判定成功的依据**,不满足就按「排查」一节处理。
5
5
  > 需要用户本人动手的地方(扫码、Codex 授信)已经标出来了,到那一步要停下来告诉用户。
6
6
 
7
- DeskBuddy 让桌面硬件和电脑上的 AI 编码智能体(Claude Code、Codex、WorkBuddy、Qoder CN、opencode)配合:
7
+ DeskBuddy 让桌面硬件和电脑上的 AI 编码智能体(Claude Code、Codex、WorkBuddy、Qoder CN、Qoder、opencode)配合:
8
8
 
9
9
  - **状态上屏**:每个会话窗口在干活、在等你确认、还是做完了,抬头看一眼桌上的屏就知道
10
10
  - **远程下指令**:在设备上对某个任务说一句话,电脑上的智能体接着干;也能在设备上新建任务
@@ -52,7 +52,9 @@ npx deskbuddy@beta setup --api-base https://test-api.shifengintelli.com
52
52
  npx deskbuddy@beta enable claude_code,codex,opencode # 用户用哪几个写哪几个,逗号分隔
53
53
  ```
54
54
 
55
- 可选:`claude_code`、`codex`、`workbuddy`、`qoder`(Qoder CN 桌面端)、`opencode`。
55
+ 可选:`claude_code`、`codex`、`workbuddy`、`qoder_cn`(Qoder CN 国内版)、`qoder`(Qoder 国际版:Qoder.app / qodercli)、`opencode`。
56
+
57
+ > 0.2.0-beta.9 及以前的 `qoder` 指国内版;`deskbuddy update`(含自动升级)会把它迁成 `qoder_cn`,本机也装了国际版时一并启用 `qoder`。
56
58
 
57
59
  `enable` 做三件事:往各智能体配置里装 hook / 插件、把脚本同步到 `~/.deskbuddy/`、**设好守护进程开机自启并启动它**。
58
60
 
@@ -74,12 +76,14 @@ npx deskbuddy@beta enable claude_code,codex,opencode # 用户用哪几个写
74
76
 
75
77
  ### 各智能体的能力
76
78
 
77
- | 能力 | Claude Code | Codex | WorkBuddy | Qoder CN | opencode |
78
- |---|---|---|---|---|---|
79
- | 状态上屏 | ✅ | ✅ | ✅ | ✅ | ✅ |
80
- | 远程下指令 / 续会话 | ✅ | ✅ | ✅ | ✅ | ✅ |
81
- | 远程任务在设备上批准 | ✅ | ✅ | ✅ | ✅ | ✅ |
82
- | 窗口授权框同步到设备 | ✅ | 仅 `--remote` 常驻 app-server | ❌ | ✅ | ✅ |
79
+ | 能力 | Claude Code | Codex | WorkBuddy | Qoder CN | Qoder(国际版)⚠️ | opencode |
80
+ |---|---|---|---|---|---|---|
81
+ | 状态上屏 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
82
+ | 远程下指令 / 续会话 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
83
+ | 远程任务在设备上批准 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
84
+ | 窗口授权框同步到设备 | ✅ | 仅 `--remote` 常驻 app-server | ❌ | ✅ | ✅ | ✅ |
85
+
86
+ ⚠️ Qoder 国际版与 CN 同一套代码,按官方安装包核对了路径,桌面端未装机实测。
83
87
 
84
88
  WorkBuddy 的授权框由它自己的「安全中心」弹出、不经过任何 hook,所以做不了;Codex 的 hook 会先卡住授权框(等 hook 返回才弹),所以只能走 app-server。
85
89
 
@@ -115,6 +119,16 @@ npx deskbuddy@<新版本号> update
115
119
  - 版本号用 `npm view deskbuddy dist-tags` 查;写死版本号比写 `@beta` 稳:npx 有缓存,`@beta` 可能还拿到旧版
116
120
  - 只跑任意一个命令(如 `status`)也会把 `~/.deskbuddy/` 里的脚本同步到当前版本,但**不会**补装新 hook、也不会换掉守护进程——所以升级一律用 `update`
117
121
 
122
+ ### 【2026-10-01 新增】自动升级(0.2.0-beta.8 起)
123
+
124
+ 升到 beta.8 及以后,**不用再手动升级**:守护进程每小时问一次它所连的服务端「该用哪个版本」,有新版就在后台装好,等电脑空闲(没有正在执行的设备指令、没有待批准的授权)时自己切换过去,切换只停几秒。
125
+
126
+ - 升到哪一版由**所连服务端**指定(测试环境指定 beta 版,正式环境指定正式版),只升不降;
127
+ - 新版本 5 分钟内连续崩溃 3 次会自动退回上一版,并且以后不再自动升到它;
128
+ - 切换那几秒里设备发来的指令会提示「电脑上的 DeskBuddy 正在升级,请过一会儿再发」,重发即可;
129
+ - 不想自动升级:在 `~/.deskbuddy/config.json` 里加 `"autoUpdate": false`,之后照上面手动 `update`;
130
+ - beta.7 及更早的电脑要先手动 `update` 一次到 beta.8,才进入自动升级。
131
+
118
132
  ---
119
133
 
120
134
  ## 国内用户
@@ -133,10 +147,10 @@ npx --registry=https://registry.npmjs.org deskbuddy@beta setup --api-base https:
133
147
  |---|---|
134
148
  | `~/.claude/settings.json` | **幂等合并**上报 hook 与窗口授权 hook(你已有的 hook 一条都不动) |
135
149
  | `~/.codex/config.toml` | 在文件**末尾追加**一段带 `# >>> deskbuddy >>>` / `# <<< deskbuddy <<<` 标记的块;其余字节一个都不碰 |
136
- | `~/.workbuddy/settings.json`、`~/.qoder-cn/settings.json` | 同 Claude Code,幂等合并 |
150
+ | `~/.workbuddy/settings.json`、`~/.qoder-cn/settings.json`、`~/.qoder/settings.json` | 同 Claude Code,幂等合并 |
137
151
  | `~/.config/opencode/plugin/deskbuddy.js` | 新建一个几行的插件入口(同名文件不是我们生成的就拒绝覆盖) |
138
152
  | `~/Library/LaunchAgents/com.deskbuddy.daemon.plist`(macOS)/ systemd 用户单元(Linux)/ 「启动」文件夹里的 `DeskBuddyDaemon.vbs`(Windows,不需要管理员权限) | 守护进程开机自启 |
139
- | `~/.deskbuddy/` | 我们自己的目录:授权配置、hook 与授权关卡脚本、opencode 插件本体、每个会话的状态、待批准记录、守护进程日志 |
153
+ | `~/.deskbuddy/` | 我们自己的目录:授权配置、hook 与授权关卡脚本、opencode 插件本体、每个会话的状态、待批准记录、守护进程日志;【2026-10-01】起还有 `versions/`(当前与上一版 CLI,自动升级用)和固定启动入口 `launcher.cjs`(开机自启指向它) |
140
154
 
141
155
  写用户配置文件时都是**原子写并保留原权限位**(`config.toml` 通常是 `0600`,不会被放宽)。
142
156
 
@@ -0,0 +1,24 @@
1
+ // hook/deskbuddy-dsh.mjs 的类型声明(只给测试用;插件本体是零依赖 JS,跑在 dsh 进程里)
2
+ type Cc = { tool_name: string; tool_input: Record<string, unknown> }
3
+ export const TOOL: string
4
+ export const SUPPORTED_VERSION_RE: RegExp
5
+ export function toCcTool(tool: unknown, args: unknown): Cc
6
+ export function parseArgs(raw: unknown): Record<string, unknown>
7
+ export function questionsToCc(questions: unknown): { tool_name: string; tool_input: { questions: Array<Record<string, unknown>> } } | null
8
+ export function answersFromLists(questions: unknown, lists: unknown): { answers: Array<{ id: string; selected: string[]; custom?: string }> } | null
9
+ export function skippedAnswers(questions: unknown): { answers: Array<{ id: string; selected: string[] }> } | null
10
+ export function profileName(ctxProfile: unknown, argv?: string[]): string
11
+ export function isWindowProfile(name: unknown): boolean
12
+ export function gatingAllowed(version: string): boolean
13
+ export function dshVersion(argv?: string[]): string
14
+ export function parseGateOut(r: unknown): { decision: 'allow' | 'deny'; answers: string[][] | null } | null
15
+ export function race<T>(next: () => Promise<T> | T, device: Promise<T | null>, cancelDevice: () => void, abortNative: () => void): Promise<T>
16
+ export function spliceSignal(req: { signal?: AbortSignal }, ac: AbortController): boolean
17
+ export const name: string
18
+ export function apply(ctx: unknown, config?: { node?: string }): void
19
+ export function runIdFromEnv(env?: Record<string, string | undefined>): string
20
+ export function mailboxHome(env?: Record<string, string | undefined>): string
21
+ export function runGateAllowed(r: unknown): boolean
22
+ export function rootSession(parents: Map<string, string>, sid: string): string
23
+ export const STALE_LETTER_MS: number
24
+ export const LETTER_RE: RegExp