@dsh-enhanced/dsh-rsi-cli 0.1.48 → 0.1.53

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 (53) hide show
  1. package/README.md +38 -13
  2. package/lib/diagnose.js +7 -7
  3. package/lib/diagnose.js.map +1 -1
  4. package/lib/home-lifecycle-lock.d.ts +4 -0
  5. package/lib/home-lifecycle-lock.d.ts.map +1 -0
  6. package/lib/home-lifecycle-lock.js +69 -0
  7. package/lib/home-lifecycle-lock.js.map +1 -0
  8. package/lib/host-runtime.d.ts +36 -0
  9. package/lib/host-runtime.d.ts.map +1 -0
  10. package/lib/host-runtime.js +400 -0
  11. package/lib/host-runtime.js.map +1 -0
  12. package/lib/index.d.ts +5 -1
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +179 -22
  15. package/lib/index.js.map +1 -1
  16. package/lib/install-host.d.ts +49 -0
  17. package/lib/install-host.d.ts.map +1 -0
  18. package/lib/install-host.js +326 -0
  19. package/lib/install-host.js.map +1 -0
  20. package/lib/install.d.ts +10 -2
  21. package/lib/install.d.ts.map +1 -1
  22. package/lib/install.js +187 -28
  23. package/lib/install.js.map +1 -1
  24. package/lib/launchd-lock.d.ts +3 -0
  25. package/lib/launchd-lock.d.ts.map +1 -0
  26. package/lib/launchd-lock.js +46 -0
  27. package/lib/launchd-lock.js.map +1 -0
  28. package/lib/launchd-service.d.ts +24 -0
  29. package/lib/launchd-service.d.ts.map +1 -0
  30. package/lib/launchd-service.js +146 -0
  31. package/lib/launchd-service.js.map +1 -0
  32. package/lib/process-guard.d.ts +4 -5
  33. package/lib/process-guard.d.ts.map +1 -1
  34. package/lib/process-guard.js +17 -8
  35. package/lib/process-guard.js.map +1 -1
  36. package/lib/purge.d.ts.map +1 -1
  37. package/lib/purge.js +30 -5
  38. package/lib/purge.js.map +1 -1
  39. package/lib/run.d.ts +2 -1
  40. package/lib/run.d.ts.map +1 -1
  41. package/lib/run.js +8 -10
  42. package/lib/run.js.map +1 -1
  43. package/lib/services.d.ts +10 -3
  44. package/lib/services.d.ts.map +1 -1
  45. package/lib/services.js +126 -42
  46. package/lib/services.js.map +1 -1
  47. package/lib/version.d.ts +1 -1
  48. package/lib/version.js +1 -1
  49. package/lib/weburl.d.ts +1 -1
  50. package/lib/weburl.d.ts.map +1 -1
  51. package/lib/weburl.js +17 -2
  52. package/lib/weburl.js.map +1 -1
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -8,6 +8,8 @@ npm install --global @dsh-enhanced/dsh-rsi-cli
8
8
 
9
9
  零运行时依赖(仅用 Node.js 内置模块),要求 Node.js `^22.19.0 || >=24.0.0`,支持 macOS 与 Linux。
10
10
 
11
+ macOS 服务管理使用系统的 `/usr/bin/perl`、`plutil` 和 `launchctl`。内核锁文件位于 `/tmp`,用于协调安装、服务操作和卸载;进程退出即释放锁。
12
+
11
13
  ## 命令
12
14
 
13
15
  ```
@@ -17,12 +19,12 @@ dsh-rsi [全局选项] <命令>
17
19
  | 命令 | 说明 |
18
20
  | --- | --- |
19
21
  | `status`(默认) | 列出 DSH home、各 profile 与安装形态(npm 实体副本 / local 符号链接)、全局 host 版本、launchd / systemd 受管服务状态、外部凭据条目数、生命周期事务/锁残留。**只读**。 |
20
- | `doctor` | 在 `status` 基础上扫描各 profile 的 `*-host.error.log`,识别已知崩溃模式(如旧版 event-support oracle 拒绝注册)并给出升级/重建建议。**只读**。 |
22
+ | `doctor` | 在 `status` 基础上扫描各 profile 的 `*-host.error.log`,识别已知崩溃模式(如旧版 event-support oracle 拒绝注册)并给出升级/重建建议。**只读**;退出码 0 不代表构建、行为验证或学习授权已就绪。 |
21
23
  | `start` / `stop` / `restart` | 切换已注册受管常驻服务的运行状态。**只改运行状态**,不新建/改写/删除 launchd plist 或 systemd unit;未注册时报错并给出注册指引。 |
22
24
  | `logs` | 查看各 profile 的受管 `*-host.log` / `*-host.error.log` 尾部(默认末 200 行)。**只读**。 |
23
25
  | `web-url` | 从运行中受管服务的 journal(Linux)或 `*-host.log`(macOS)解析最近一次 `dsh web:` 行,输出带 token 的完整 Web 授权 URL。**只读**,不关闭或绕过 Web 认证;服务未运行时提示先 `dsh-rsi start`。 |
24
26
  | `update` | 升级全局 dsh-rsi 自身;加 `--all` 再把插件集合交给安装器 `--operation upgrade` **原地升级**(保留 patch、凭据、Session、Goal)。 |
25
- | `install` | 安装/修复插件集合:npm 形态下载与本 dsh-rsi 同版本的官方安装器执行,`--local <dir>` 执行 checkout 内安装器;其余参数原样透传。 |
27
+ | `install` | 安装/修复插件集合:默认选择 supervised 自迭代场景;npm 形态下载与本 dsh-rsi 同版本的官方安装器执行,`--local <dir>` 执行 checkout 内安装器。 |
26
28
  | `reinstall` | 先 `purge`(默认先备份、同样的安全门控)再立即 `install`,用于干净重装。 |
27
29
  | `purge` | 彻底卸载:进程静止检查 → 停服注销 → tar.gz 备份 → 删除 profile / DSH home / 生命周期残留 → 清理外部凭据。 |
28
30
  | `version` | 打印版本。 |
@@ -32,19 +34,32 @@ dsh-rsi [全局选项] <命令>
32
34
  - `--dsh-home <path>`:指定 DSH home(默认取 `$DSH_HOME`,否则 `~/.dsh`;install 经 `DSH_HOME` 环境变量传给安装器)
33
35
  - `--profile <name>`:仅操作单个 profile(`purge` 默认全量;install/reinstall 同时透传给安装器)
34
36
  - `--dry-run`:只打印将执行的动作,不做任何修改(install/reinstall 透传给安装器)
37
+ - `--capabilities`:供救机脚本精确探测 CLI 安全能力;单独使用时只输出一行 JSON,不读取 Home 或操作服务。当前标记为 `macos-launchd-ownership-v1`,不供日常交互使用。
35
38
  - `--yes`:`purge` / `reinstall` 时跳过交互确认(install/reinstall 透传给安装器)
36
39
  - `-h, --help`:无命令位置时显示 dsh-rsi 帮助;`dsh-rsi install --help` 透传展示**安装器**完整参数清单
37
40
 
38
41
  ## install / reinstall(薄委托)
39
42
 
40
- `dsh-rsi install` 不复制任何安装逻辑,只做统一入口与引导器版本固定:
43
+ `dsh-rsi install` 为全新 Home 选择 Host,再调用统一安装器:
44
+
45
+ `install` 和 `reinstall` 在未指定 `--scenario`、也未指定 `--mode` 时,向安装器显式传入 `--scenario supervised`;`--dry-run` 会展示这一默认场景。Linux 使用 systemd user services;原生 macOS 使用 launchd 管理 Node Host,候选构建与验证使用系统沙箱和私有固定 Node,无需 Docker。现有插件源码替换、发布与双 Host 交接仍限 Linux。显式 `--lark skip` 或 `--no-service` 不追加完整场景,交由统一安装器保留有限场景;它们不能覆盖用户显式选择的 `supervised`。显式 `--scenario` 或旧式 `--mode` 保持安装器原有语义,例如 `--scenario core` 选择 core,`--mode standard` 保留安装器的自动选择。`update --all` 等升级、卸载、恢复及 `install --help` 不采用此默认值。其余参数仍按原顺序透传。
46
+
47
+ 首次飞书身份授权须由平台的授权流程完成。全新 Home 尚无飞书 Bot 时,`supervised --yes` 或管道等非交互执行会在安装前停止;先在交互式终端运行 `dsh-rsi install` 完成 onboarding。安装器保留已有模型选择,并生成路径、签名身份及有期限的授权与有限预算;仍须有可用模型及隔离构建环境。已有 active/paused Automation 需要另行确认 `--ack-existing-automations`,`--yes` 不代替它。授权尚未就绪时,不能把 supervised 安装称为成功。
41
48
 
42
49
  - **npm 形态(默认)**:下载 `https://raw.githubusercontent.com/22-ai-00/dsh-enhanced/v<本包版本>/scripts/install/install-npm.sh` 到临时目录执行。引导脚本内部会按内嵌 SHA-256 自校验 `common.sh` 等资产,dsh-rsi 不重复 hash 逻辑。**锁定的只是引导脚本与同 tag 的安装器资产,不是插件 cohort 版本**:安装器默认把 `@dsh-enhanced/personal-assistant@latest` 解析为精确版本,再以该版本安装整套 `@dsh-enhanced/*` bundle;要锁定插件版本需透传 `--plugin-version <x.y.z|dist-tag>` 或预设 `DSH_ENHANCED_VERSION`。安装器尾部还会执行 `npm install --global @dsh-enhanced/dsh-rsi-cli@<cohort 版本>`,可能因此把全局 dsh-rsi 升降级到该 cohort 版本。
43
50
  - **local 形态**:`--local <checkout 目录>`,直接执行该目录下 `scripts/install/install-local.sh`,并从该 checkout 的 packages/dsh-rsi-cli 全局安装(本地开发 / 无网救机)。
44
- - 安装器 stdio 与终端直连(交互提示照常),退出码原样透传。
51
+ - 全新、空的 `DSH_HOME` 默认从官方 npm 解析一次 DSH `latest`,当前新安装接受已适配的 `0.2.0-rc.2`(官方 latest,尚非正式稳定版),安装到 `~/.local/share/dsh-enhanced/hosts/<精确版本>`。安装不执行依赖安装脚本;校验 registry integrity、lockfile、实际入口及全部安装文件后,写入 Home 内的私有 `.dsh-rsi-host.json`。不替换全局 DSH。安装器及其生成的常驻服务使用该私有入口,补装 pnpm 后仍保留这个入口的优先级。
52
+ - 重试安装按 Home 绑定读取原精确版本,并核对文件与收据;重试不重新解析 `latest`。受管 Home 的升级入口默认解析官方 `latest`,先核对兼容范围,再通过独立事务迁移 Host;同版本不创建 Host 事务。已有未绑定 Home 保留原 Host。`--dsh-version` 可在首次安装或受管 Home 升级时选择范围内精确版本,不能直接覆盖已有绑定。Linux 支持受管 Host 更新;macOS 私有 Host 新安装已在临时 Home 验证,但跨版本 Host 更新会在插件变更前拒绝。Windows 私有 Host 安装尚未实机验证。直接运行 shell 安装脚本仍使用原有 Host 选择方式。
53
+ - 同一 Home 不支持与旧版或外部安装器并发安装;绑定文件原子发布不等于整个安装流程具有跨程序排他锁。
54
+ - 私有缓存是多个 Home 可共享的安装资源;全量 purge/reinstall 删除 Home 绑定但保留缓存,`--remove-host` 仍只操作全局 npm Host。缓存只含运行程序及收据,不含飞书凭据。
55
+ - 安装器 stdio 与终端直连,退出码原样透传。`--help` / `--dry-run` 不准备私有 Host。
45
56
 
46
57
  ```bash
47
- # npm 形态安装 core 场景(其余安装器参数任意透传)
58
+ # npm 形态在交互式终端安装 supervised 场景
59
+ dsh-rsi install
60
+
61
+ # 已完成飞书 onboarding 后可非交互重试;显式选择 core 也无需飞书
62
+ dsh-rsi install --yes
48
63
  dsh-rsi install --scenario core --yes
49
64
 
50
65
  # local checkout 形态
@@ -53,9 +68,10 @@ dsh-rsi install --local ~/work/github/dsh-enhanced --scenario web
53
68
  # 查看安装器支持的全部参数
54
69
  dsh-rsi install --help
55
70
 
56
- # 干净重装:先备份+purge,再按相同形态重新安装
57
- dsh-rsi reinstall --yes
58
- dsh-rsi reinstall --profile web --yes
71
+ # 干净重装:先备份+purge,再交互式完成新的 supervised onboarding
72
+ dsh-rsi reinstall
73
+ # 若只需轻量场景,可非交互地重装 core
74
+ dsh-rsi reinstall --profile web --scenario core --yes
59
75
  ```
60
76
 
61
77
  `reinstall` 支持的 rsi 侧选项与 `purge` 一致(`--no-backup` / `--keep-keychain` / `--remove-host` / `--profile`);只有既未加 `--yes` 也未加 `--dry-run` 时才需输入 `purge` 确认——`reinstall --dry-run` 全程无交互、无修改:先打印 purge 计划,再以 `--dry-run` 透传演练安装器(`--dry-run` 同时作用于 purge 与安装两个阶段)。重装阶段默认走 npm 形态;local 重装加 `--local <dir>`。
@@ -75,15 +91,24 @@ dsh-rsi update --version next
75
91
 
76
92
  # 自身 + 整套插件集合原地升级;受管 Linux 服务由事务停服/恢复,额外 Host 会被拒绝
77
93
  dsh-rsi update --all --yes
94
+
95
+ # macOS:先停止同一 DSH_HOME 的全部 Host,再显式确认;冻结的原生 owner/source Home 暂无普通升级路径
96
+ dsh-rsi update --all --confirm-dsh-home-stopped
78
97
  ```
79
98
 
80
99
  `update` 选项:
81
100
 
82
- - `--all`:自身升级成功后,自动确认目标 profile 没有运行中 Host,再把插件集合交给同一目标版本的安装器原地升级。用户无需传 `--confirm-dsh-home-stopped` 或重复声明 `--scenario`;安装器从 effective/composed profile 自动识别场景。
101
+ - `--all`:自身升级成功后,把插件集合交给同一目标版本的安装器原地升级;Linux 受管服务由事务停服并恢复,额外或手工启动的 Host 必须先停止。macOS 须先停止整个 Home 并显式传入 `--confirm-dsh-home-stopped`;CLI 在自更新前检查冻结资源与各 profile 的运行进程,安装器检查 launchd 和 Host,并在修改 profile 前复检,无法确认时拒绝插件变更。已有原生 owner/source/cohort 的冻结 Home 不能普通升级;保留数据的专用迁移目前尚未实现。未冻结且已停止的 Mac Home 仅升级插件集合,保留原 Host 与 LaunchAgent 定义;完成后用 `dsh-rsi start` 恢复运行。Mac 的检查没有覆盖整个升级过程的 Home 独占锁,操作者必须在升级全程保持 Host 停止。`0.1.49` 起,在已绑定的 Linux Home 继续执行受管 Host 更新;版本相同则跳过。Linux 用户无需传 `--confirm-dsh-home-stopped` 或重复声明 `--scenario`;安装器从 effective/composed profile 自动识别场景。
83
102
  - `--version <v|tag>`:dsh-rsi 自身的目标版本或 dist-tag(默认 `latest`)。只接受精确版本 `x.y.z`(可带预发布后缀)或纯字母 dist-tag;范围表达式如 `>=0.1.0` 会被拒绝。
84
103
  - `--dry-run`:解析出目标版本并打印将执行的命令,不做任何安装。
85
104
  - 其余参数在 `--all` 下原样透传给安装器;`--local <dir>` 走 local 形态。显式 `--scenario` 仍可作为一致性断言,但不再是必填项。
86
105
 
106
+ ### 受管 Host 更新
107
+
108
+ `0.1.49` 起,已绑定 Linux Home 的受管更新分两步:先完成目标与协调器的同批插件升级,使其具备新版状态读取能力;再在 Home 外准备精确 Host 与原生依赖,停止同一 Home 的受管服务,对完整副本迁移、验证并切换。旧 `0.1` Home 到 `0.2` 不支持普通自动升级,须使用安装指南中的显式联合迁移。Host 阶段失败可能保留已成功更新的插件和旧 Host;整个命令不提供跨两个阶段的原子回退。真实跨版本 Host 更新的验收状态见 [RSI 状态](../../docs/rsi-status.md)。
109
+
110
+ Host 事务覆盖同一 Home 的其它 profile,保留原配置、owner、历史记录、密钥、授权期限和已用额度。候选服务须重新通过启动与运行验收;中断重试先恢复已有事务,再规划更新。冻结本地源码/cohort 的升级仍不支持。兼容范围外的新 `latest` 会明确报错,须完成适配后才能更新;不会改用 `next` 或替换全局 Host。
111
+
87
112
  ### 三条语义边界
88
113
 
89
114
  - **自身先行,失败即止**。`--all` 下先升级 dsh-rsi 自身,失败就**不**继续升级 cohort —— 避免用旧版 rsi 的判断去驱动一轮新的 cohort 升级。
@@ -139,7 +164,7 @@ dsh-rsi logs --errors-only
139
164
  ### 安全门控
140
165
 
141
166
  - **不隐式注册服务**:服务定义文件不存在时**不会**顺手装一个(那会绕过安装器的归属、路径与凭据校验)。`core` / `web` 场景默认没有常驻服务,这是正常状态;命令会提供可直接复制的 `dsh-rsi install --profile <p> --scenario lark` / `--scenario supervised`,并以退出码 1 结束。`dsh-rsi-setup` 是插件包内的专用工具,不保证作为全局命令存在,因此不再把它作为用户修复入口。
142
- - **归属 fail-closed**:同名文件存在但内容不属受管(人工改写或被第三方占用)时拒绝操作、原样保留文件,并说明需人工确认归属。判定依据与 purge 一致 —— Linux 要求 unit 同时含 `DeepSeek Harness profile`、对应 `--profile <p>`、`--no-open`;macOS 要求 plist 的 `Label` 为 `ai.deepseek.dsh.profile.<p>` 且 `ProgramArguments` 含 `--profile <p>` 与 `--no-open`。
167
+ - **归属 fail-closed**:同名文件存在但内容不属受管(人工改写或被第三方占用)时拒绝操作、原样保留文件,并说明需人工确认归属。判定依据与 purge 一致 —— Linux 要求 unit 同时含 `DeepSeek Harness profile`、对应 `--profile <p>`、`--no-open`;macOS 解析 plist 结构,核对 Label、完整启动参数、工作目录、`DSH_HOME`、日志路径和执行设置,还核对已加载 launchd job 的路径、参数与 Home。无法查询时拒绝变更。
143
168
  - **dry-run 措辞与实际执行严格区分**:`--dry-run` 下不执行任何命令,结论行为「将启动/将停止/将重启」;只有真正执行过才输出「已…」。
144
169
  - **多 profile 部分失败即非零**:任一 profile 出错,命令整体以退出码 1 结束,便于脚本判定;其余 profile 的处理结果照常打印。
145
170
  - 仅支持 macOS(launchd)与 Linux(systemd --user),其它平台明确报错而非静默成功。
@@ -184,7 +209,7 @@ purge 选项:
184
209
 
185
210
  **删除:**
186
211
 
187
- - 全量:整个 DSH home(profiles、logs、uninstalled-profiles、home 内锁文件),以及 home 外的生命周期事务目录、失败诊断目录、home 锁与 `/tmp` rendezvous 锁
212
+ - 全量:整个 DSH home(profiles、logs、uninstalled-profiles、home 内锁文件),以及 home 外的生命周期事务目录、失败诊断目录和 home 锁。Linux 清理旧 `/tmp` rendezvous 锁;macOS 保留共享锁文件的稳定 inode,避免持锁期间被另一个进程重建同名锁文件。
188
213
  - 单 profile:`profiles/<name>`、对应的两份 host 日志、归属该 profile 的失败诊断目录
189
214
  - 受管常驻服务:macOS `launchctl bootout` + 删除 `~/Library/LaunchAgents/ai.deepseek.dsh.profile.<p>.plist`;Linux `systemctl --user disable --now` + `reset-failed` + 删除受管 unit 文件
190
215
  - 外部凭据:按各 profile 的 setup journal / cleanup 记录**权威反查** service 前缀为 `dsh/` 的条目,逐条从 Keychain(`security delete-generic-password`)或 Secret Service(`secret-tool clear`)删除;home 内的 protected-file 凭据随 home 一起删除
@@ -197,8 +222,8 @@ purge 选项:
197
222
 
198
223
  ### 安全门控
199
224
 
200
- - **进程静止检查**:Linux 已注册受管服务的精确 systemd MainPID 会交给 installer 的 service-aware 事务停服、屏蔽、升级和恢复;其它同 profile 的手工/测试 Host 仍会拒绝执行并列出 PID,不会被自动 kill。macOS 及无受管服务场景仍要求调用前保持整个目标 Home 静止。
201
- - **systemd unit 归属 fail-closed**:仅当 unit 文件内容同时包含受管标记(`DeepSeek Harness profile`、对应 `--profile <p>`、`--no-open`)才删除;归属不明的同名文件只报告、保留。
225
+ - **进程静止检查**:Linux 已注册受管服务的精确 systemd MainPID 会交给 installer 的 service-aware 事务停服、屏蔽、升级和恢复;其它同 profile 的手工/测试 Host 仍会拒绝执行并列出 PID,不会被自动 kill。macOS 及无受管服务场景仍要求调用前保持整个目标 Home 静止;macOS 无法从命令行确认手动 Host 所属 Home,发现同 profile 进程时会阻止 purge,须人工确认并先行停止。
226
+ - **服务归属 fail-closed**:Linux 仅当 unit 文件内容同时包含受管标记(`DeepSeek Harness profile`、对应 `--profile <p>`、`--no-open`)才删除。macOS 还要求本 Home 的 plist 与已加载 job 归属一致;`bootout` 失败、job 未注销或旧 PID 仍在时保留 plist 并中止数据删除。同一 GUI 用户下各 Home 共享 label;Mac purge 从枚举 profile 到停服、备份、删除和凭据清理始终按 Home 锁 → 所有目标 UID/profile 锁的顺序持有内核锁。
202
227
  - **locator 先扫描、文件先删除、凭据后清理**:删文件前先扫描各 profile 的 setup journal / cleanup 记录(journal 位于 DSH home 内,必须在删除前扫出凭据 locator);随后**先删除文件**,再按预扫描的 locator 逐条删除外部凭据。单条凭据删除失败不会回滚已删文件,而是以「文件已删除,但以下凭据条目清理失败,请手工删除:…」报错并以退出码 1 结束。默认的 tar.gz 备份内含完整 journal,可解包后据此复查、手工补删;`--no-backup` 下文件与 journal 均不可恢复,只剩错误消息中列出的 service/account 可供定位。
203
228
  - 单 profile 与 `--remove-host` 互斥;仅支持 macOS / Linux。
204
229
 
package/lib/diagnose.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { open, readdir, stat } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
- import { launchAgentTargets, listLifecycleResiduals, listProfiles, listProfilePlugins, logsDirectory, systemdUnitName, systemdUserDirectory, } from "./paths.js";
4
+ import { inspectLaunchdDefinition, inspectLoadedLaunchd } from "./launchd-service.js";
5
+ import { listLifecycleResiduals, listProfiles, listProfilePlugins, logsDirectory, systemdUnitName, systemdUserDirectory, } from "./paths.js";
5
6
  import { scanCredentialLocators } from "./secrets.js";
6
7
  import { defaultRunner } from "./run.js";
7
- async function serviceState(platform, home, profile, runner) {
8
+ async function serviceState(platform, home, dshHome, profile, runner) {
8
9
  if (platform === 'darwin') {
9
- const { label, plistPath } = launchAgentTargets(home, profile);
10
- const installed = existsSync(plistPath);
11
- const shown = runner('launchctl', ['print', `gui/${process.getuid?.() ?? process.env.UID}/${label}`]);
12
- return { installed, active: installed && shown.status === 0 };
10
+ const checked = await inspectLaunchdDefinition(home, dshHome, profile, runner);
11
+ const loaded = checked.definition ? inspectLoadedLaunchd(checked.definition, dshHome, runner) : undefined;
12
+ return { installed: !!checked.definition, active: !!loaded && !loaded.error && loaded.registered && loaded.running };
13
13
  }
14
14
  const unit = systemdUnitName(profile);
15
15
  const installed = existsSync(join(systemdUserDirectory(home), unit));
@@ -24,7 +24,7 @@ export async function collectStatus(dshHome, home, platform, runner = defaultRun
24
24
  const profileStatus = [];
25
25
  for (const name of profiles) {
26
26
  const plugins = await listProfilePlugins(dshHome, name);
27
- const service = await serviceState(platform, home, name, runner);
27
+ const service = await serviceState(platform, home, dshHome, name, runner);
28
28
  profileStatus.push({
29
29
  name,
30
30
  npmPlugins: plugins.filter(plugin => plugin.kind === 'npm').map(plugin => plugin.name),
@@ -1 +1 @@
1
- {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function dshHomeLifecycleRendezvousPath(dshHome: string, uid?: number | undefined): string;
2
+ /** Shared with lark-channel: kernel lock remains held while purge removes the Home. */
3
+ export declare function withDshHomeLifecycleLock<T>(dshHome: string, operation: () => Promise<T>): Promise<T>;
4
+ //# sourceMappingURL=home-lifecycle-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-lifecycle-lock.d.ts","sourceRoot":"","sources":["../src/home-lifecycle-lock.ts"],"names":[],"mappings":"AAeA,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,qBAAqB,GAAG,MAAM,CAKhG;AAED,uFAAuF;AACvF,wBAAsB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAkC1G"}
@@ -0,0 +1,69 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { constants, realpathSync } from 'node:fs';
4
+ import { lstat, open } from 'node:fs/promises';
5
+ import { basename, dirname, isAbsolute, join } from 'node:path';
6
+ /** Match lark-channel setup's canonicalMissingAllowed-style lock key, including a deleted Home. */
7
+ function canonicalMissingAllowed(path) {
8
+ try {
9
+ return realpathSync(path);
10
+ }
11
+ catch {
12
+ const parent = dirname(path);
13
+ if (parent === path)
14
+ return join(path);
15
+ return join(canonicalMissingAllowed(parent), basename(path));
16
+ }
17
+ }
18
+ export function dshHomeLifecycleRendezvousPath(dshHome, uid = process.getuid?.()) {
19
+ if (!isAbsolute(dshHome))
20
+ throw new Error('DSH_HOME 必须是绝对路径');
21
+ if (!Number.isSafeInteger(uid) || uid === undefined || uid < 0)
22
+ throw new Error('无法确定 Home 锁 UID');
23
+ const digest = createHash('sha256').update(canonicalMissingAllowed(dshHome)).digest('hex');
24
+ return `/tmp/.dsh-enhanced-lifecycle-${uid}-${digest}.lock`;
25
+ }
26
+ /** Shared with lark-channel: kernel lock remains held while purge removes the Home. */
27
+ export async function withDshHomeLifecycleLock(dshHome, operation) {
28
+ if (process.platform !== 'linux' && process.platform !== 'darwin')
29
+ return operation();
30
+ const uid = process.getuid?.();
31
+ if (!Number.isSafeInteger(uid) || uid === undefined || uid < 0)
32
+ throw new Error('无法确定 Home 锁 UID');
33
+ const physicalTmp = process.platform === 'darwin' ? realpathSync('/tmp') : '/tmp';
34
+ const temporary = await lstat(physicalTmp);
35
+ if (!temporary.isDirectory() || temporary.isSymbolicLink() || temporary.uid !== 0
36
+ || (temporary.mode & 0o7777) !== 0o1777)
37
+ throw new Error('Home 锁目录 /tmp 不安全');
38
+ const path = dshHomeLifecycleRendezvousPath(dshHome, uid);
39
+ const descriptor = await open(path, constants.O_RDWR | constants.O_CREAT | constants.O_NOFOLLOW, 0o600);
40
+ try {
41
+ const verify = async () => {
42
+ const [opened, linked] = await Promise.all([descriptor.stat(), lstat(path)]);
43
+ if (!opened.isFile() || !linked.isFile() || linked.isSymbolicLink()
44
+ || opened.uid !== uid || linked.uid !== uid || opened.nlink !== 1 || linked.nlink !== 1
45
+ || (opened.mode & 0o777) !== 0o600 || (linked.mode & 0o777) !== 0o600
46
+ || opened.dev !== linked.dev || opened.ino !== linked.ino)
47
+ throw new Error(`Home 锁文件不安全:${path}`);
48
+ };
49
+ await verify();
50
+ const mac = process.platform === 'darwin';
51
+ const acquired = spawnSync(mac ? '/usr/bin/perl' : '/usr/bin/flock', mac
52
+ ? ['-MFcntl=:flock', '-MErrno=EAGAIN,EWOULDBLOCK', '-e',
53
+ 'open(F, "<&", 3) or exit 74; flock(F, LOCK_EX|LOCK_NB) or exit(($! == EAGAIN || $! == EWOULDBLOCK) ? 75 : 74);']
54
+ : ['-n', '-E', '75', '3'], {
55
+ encoding: 'utf8', stdio: ['ignore', 'ignore', 'pipe', descriptor.fd],
56
+ env: { PATH: '/usr/bin:/bin', LANG: 'C' }, timeout: 10_000,
57
+ });
58
+ if (acquired.status === 75)
59
+ throw new Error(`DSH_HOME 正忙:${path}`);
60
+ if (acquired.status !== 0)
61
+ throw new Error(`无法获取 Home 锁:${acquired.stderr?.trim() || acquired.status}`);
62
+ await verify();
63
+ return await operation();
64
+ }
65
+ finally {
66
+ await descriptor.close();
67
+ }
68
+ }
69
+ //# sourceMappingURL=home-lifecycle-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-lifecycle-lock.js","sourceRoot":"","sources":["../src/home-lifecycle-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface ManagedHostRuntime {
2
+ version: string;
3
+ root: string;
4
+ dshPath: string;
5
+ binDirectory: string;
6
+ integrity: string;
7
+ receiptDigest: string;
8
+ }
9
+ export interface ManagedHostCommandResult {
10
+ exitCode: number;
11
+ stdout: string;
12
+ stderr: string;
13
+ }
14
+ export interface ManagedHostRuntimePorts {
15
+ /** Injectable npm transport for deterministic fixtures. The dsh executable is always run for real. */
16
+ runNpm?: (args: readonly string[], options: {
17
+ cwd: string;
18
+ signal: AbortSignal;
19
+ timeoutMs: number;
20
+ }) => Promise<ManagedHostCommandResult>;
21
+ }
22
+ export declare function isSupportedReceiptVersion(version: string): boolean;
23
+ export declare function isSupportedCandidateVersion(version: string): boolean;
24
+ /** Read and independently verify a previously prepared exact version without contacting npm. */
25
+ export declare function readManagedHostRuntime(input: {
26
+ root: string;
27
+ version: string;
28
+ signal?: AbortSignal;
29
+ }): Promise<ManagedHostRuntime>;
30
+ /** Resolve once from the official npm registry, then install exact DSH into an owner-private version directory. */
31
+ export declare function prepareManagedHostRuntime(input: {
32
+ root: string;
33
+ selector?: 'latest' | string;
34
+ signal?: AbortSignal;
35
+ }, ports?: ManagedHostRuntimePorts): Promise<ManagedHostRuntime>;
36
+ //# sourceMappingURL=host-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-runtime.d.ts","sourceRoot":"","sources":["../src/host-runtime.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,sGAAsG;IACtG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAA;CAC1I;AA0BD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGlE;AACD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpE;AAgQD,gGAAgG;AAChG,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAIxI;AAED,mHAAmH;AACnH,wBAAsB,yBAAyB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,EAAE,KAAK,GAAE,uBAA4B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkC7L"}