@mrrisega/dsh-remote 0.6.8 → 0.6.9-beta.1

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 CHANGED
@@ -60,7 +60,7 @@ dsh-remote 是一个轻量的**隧道模式**远程控制方案:电脑端运
60
60
 
61
61
  - **登录后 bridge 自动连上,全程零刷新**:面板自动补运行环境 → 拉起 bridge → 显示「正在连接中继…」,连上后自动变成「已连接 ✅」并刷新二维码与设备列表;失败有可读原因、自动重试倒计时和「复制诊断信息」。
62
62
  - **手机端自动等待电脑上线**:空设备列表不再让人干等或手动刷新,电脑一上线设备自己出现。
63
- - **安装引导改版**:有插件市场入口就搜索 `dsh-remote` 安装(不用敲命令);没有就复制一条命令;两条路都收敛到「登录后稍等,电脑会自己出现」。
63
+ - **安装引导改版**:有插件市场入口就在市场里搜索 **`dsh-remote-web`** 安装(不用敲命令;搜索词是包名 `dsh-remote-web`,不是 `dsh-remote`);没有就复制一条命令;两条路都收敛到「登录后稍等,电脑会自己出现」。
64
64
  - **安装输出更干净**:不再重复打印同一段引导,结尾只给一份汇总(地址 / 自启动服务 / 下一步);装完当下 dsh web 没开着也会如实说明「打开 dsh web 后 bridge 会自动启动」,不再像报错。
65
65
  - **macOS 26 自启动死角已修**:macOS 26 会把 `gui/<uid>` 会话域置为 on-demand-only,`RunAtLoad` / `KeepAlive` 失效(服务只登记不启动,`runs = 0`)。现在优先用 `user/<uid>` 域启动(该域仍支持开机自启与崩溃自愈),失败才回退 `gui/<uid>` + `kickstart`(只拉起这一次,会**明确告知**不支持崩溃自愈),再不行退化为后台进程(现在能用、无自启)。自启动服务的 PATH 也补了 `/usr/sbin`、`/sbin`(bridge 要调 `ioreg`)。
66
66
 
package/docs/telemetry.md CHANGED
@@ -63,7 +63,7 @@
63
63
  `node_missing` · `node_too_old` · `npm_unreachable` · `npm_eacces` · `platform_unsupported` ·
64
64
  `runtime_install_timeout` · `launchd_failed` · `bridge_exit` · `bind_conflict` · `bind_device_limit` ·
65
65
  `npx_cmd_unavailable` · `registry_timeout` · `install_script_missing` · `npx_exit_nonzero` ·
66
- `npx_output_encoding` · `unknown`
66
+ `npx_output_encoding` · `update_stalled`(更新进程长时间无输出、判定卡住)· `unknown`
67
67
 
68
68
  > 原始错误文本**绝不外发**(它可能含文件路径、用户名、主机名):只做白名单归类,
69
69
  > 归不进去的一律记 `unknown`。
@@ -72,6 +72,10 @@
72
72
  > `npx_output_encoding` 是 2026-09 为定位「Windows 上装不上运行环境」而拆细的形态
73
73
  > (命令调不起来 / 注册表超时 / 包或安装脚本缺失 / 退出码非零 / 输出乱码)——
74
74
  > 它们仍然只是**枚举值**,不包含任何原始文本。
75
+ >
76
+ > `update_stalled`(0.6.9 新增):更新进程**活着但长时间没有任何输出**(中国网络访问 npm 官方源的
77
+ > 典型失败形态是"挂起"而非快速失败)。它被单列出来,是为了让"卡死"这一类在统计里可见 ——
78
+ > 此前它只会落进 `unknown` 或干脆不产生事件,导致规模被持续低估。
75
79
 
76
80
  ## 3. 不采集什么(硬边界)
77
81
 
package/dsh-setup.mjs CHANGED
@@ -7,7 +7,7 @@
7
7
  * dsh-remote settings 提示如何登录(独立设置页已移除,见 dsh web 面板)
8
8
  * dsh-remote run 前台运行 bridge(调试/守护)
9
9
  * dsh-remote status 查看配置与服务状态
10
- * dsh-remote plugin [--uninstall] 手动安装/卸载 dsh web 远程控制插件
10
+ * dsh-remote plugin [--uninstall] 手动安装/卸载 dsh web 远程访问插件
11
11
  *
12
12
  * setup 选项(全部可选):
13
13
  * --server <wss://host:port> --key <访问密钥> 自建模式(不填则连默认云端服务)
@@ -18,8 +18,8 @@
18
18
  * 行为:
19
19
  * 1. 写入配置 <CONFIG_DIR>/.dsh-config.json(0600;npm 安装时为 ~/.dsh-remote/)
20
20
  * 2. 生成自启动服务(macOS launchd / Linux systemd),随 dsh web(3080) 存活自动保活
21
- * 3. 自动把远程控制插件装进 dsh web 设置页(若检测到 profile)
22
- * 4. 登录/连接配置在 dsh web → 设置 → 「远程控制」面板完成(SaaS 注册登录 / 自建切换)
21
+ * 3. 自动把远程访问插件装进 dsh web 设置页(若检测到 profile)
22
+ * 4. 登录/连接配置在 dsh web → 设置 → 「远程访问」面板完成(SaaS 注册登录 / 自建切换)
23
23
  * 自建 CLI 用户也可用 `dsh-remote setup --server … --key …`(无需再打开设置页)
24
24
  */
25
25
 
@@ -160,14 +160,14 @@ function printHelp() {
160
160
  dsh-remote settings 显示登录/连接配置指引(独立设置页已移除)
161
161
  dsh-remote run 前台运行 bridge(调试)
162
162
  dsh-remote status 查看配置与服务状态
163
- dsh-remote plugin 手动安装 dsh web 远程控制插件(--uninstall 卸载)
163
+ dsh-remote plugin 手动安装 dsh web 远程访问插件(--uninstall 卸载)
164
164
  dsh-remote repair 修复插件挂载(dsh web 起不来时用;只碰 profile,不联网)
165
165
  dsh-remote --help 显示本用法(等同 dsh-remote help)
166
166
 
167
167
  自建模式(可选):
168
168
  dsh-remote setup --server wss://你的域名:端口 --key 访问密钥
169
169
 
170
- 登录/连接配置: 打开 dsh web → 设置 → 「远程控制」→ 注册或登录手机号即可
170
+ 登录/连接配置: 打开 dsh web → 设置 → 「远程访问」→ 注册或登录手机号即可
171
171
  (自建用户切「自建服务」标签或直接用上方 setup 命令,无需另开页面)。
172
172
  文档: ${REPO_URL}
173
173
  `);
@@ -848,7 +848,7 @@ function installAutostart() {
848
848
  }
849
849
 
850
850
  // ---------- settings:旧独立设置页已移除(引导到 dsh web 插件面板) ----------
851
- // 云服务用户在 dsh web → 设置 → 「远程控制」面板即可注册/登录(自建切换也在此面板);
851
+ // 云服务用户在 dsh web → 设置 → 「远程访问」面板即可注册/登录(自建切换也在此面板);
852
852
  // 独立设置页(127.0.0.1:3499)与面板功能完全重复、且暴露自建表单给普通用户造成困惑,已移除。
853
853
  // 保留 `dsh-remote settings` 命令为“引导提示”,避免旧脚本/旧文档直接调它时报错。
854
854
  function settingsHint() {
@@ -856,7 +856,7 @@ function settingsHint() {
856
856
  dsh-remote:独立的本地设置页已移除。
857
857
 
858
858
  请直接在 dsh web 里完成登录/连接配置(无需任何命令):
859
- 打开 dsh web → 设置 → 「远程控制」→ 注册或登录手机号即可(自建模式切换也在该面板)。
859
+ 打开 dsh web → 设置 → 「远程访问」→ 注册或登录手机号即可(自建模式切换也在该面板)。
860
860
 
861
861
  自建用户若偏好命令行,可用:
862
862
  dsh-remote setup --server wss://你的域名:端口 --key 访问密钥
@@ -928,7 +928,7 @@ async function runBridge() {
928
928
  if (!saas && !local) {
929
929
  if (!warnedNoLogin) {
930
930
  warnedNoLogin = true;
931
- console.log("⚠️ 尚未登录:请打开 dsh web → 设置 → 「远程控制」,注册/登录手机号(或切到自建模式)后自动启动。");
931
+ console.log("⚠️ 尚未登录:请打开 dsh web → 设置 → 「远程访问」,注册/登录手机号(或切到自建模式)后自动启动。");
932
932
  }
933
933
  return;
934
934
  }
@@ -1095,7 +1095,7 @@ async function setup(argv) {
1095
1095
  }
1096
1096
 
1097
1097
  // 插件是**进程启动时**装载的:刚装进 profile 的插件,运行中的 dsh web 里并没有
1098
- // (既没有 /dsh-remote/* 路由,也没有「设置 → 远程控制」面板项)。
1098
+ // (既没有 /dsh-remote/* 路由,也没有「设置 → 远程访问」面板项)。
1099
1099
  // 这里做一个确定性判断:进程启动时间早于插件落盘时间 → 必须重启 dsh web 才生效。
1100
1100
  const pluginDir = path.join(resolveProfileDir(argv), PLUGIN_LOCAL_DIR);
1101
1101
  const pluginMtime = fs.existsSync(path.join(pluginDir, "lib", "index.js"))
@@ -1148,7 +1148,7 @@ async function setup(argv) {
1148
1148
  if (needRestart && !noRestart && webUp) {
1149
1149
  console.log("");
1150
1150
  console.log("ℹ 检测到运行中的 dsh web 早于本次插件安装 —— 插件只在进程启动时装载,");
1151
- console.log(" 所以「设置 → 远程控制」面板暂时还没出现。正在为你重启 dsh web(2 秒后执行,Ctrl-C 可跳过)…");
1151
+ console.log(" 所以「设置 → 远程访问」面板暂时还没出现。正在为你重启 dsh web(2 秒后执行,Ctrl-C 可跳过)…");
1152
1152
  sleepSync(2000);
1153
1153
  restartResult = restartDshWeb();
1154
1154
  if (restartResult.ok) {
@@ -1193,7 +1193,7 @@ async function setup(argv) {
1193
1193
  L.push(` 服务器: ${cfg.tunnel_url}`);
1194
1194
  L.push(` 手机端: 打开 ${cfg.tunnel_url.replace(/^ws/, "https")}/app/ ,用访问密钥登录`);
1195
1195
  } else {
1196
- L.push(` 远程控制地址: ${pub.app_url || DEFAULT_APP_URL}`);
1196
+ L.push(` 远程访问地址: ${pub.app_url || DEFAULT_APP_URL}`);
1197
1197
  }
1198
1198
  L.push(svcSkipped
1199
1199
  ? ` 自启动服务: ${svcState},可用 \`dsh-remote run\` 手动运行 bridge`
@@ -1239,10 +1239,10 @@ async function setup(argv) {
1239
1239
  } else if (hotMounted) {
1240
1240
  L.push("");
1241
1241
  L.push(" 下一步: 插件已热加载(无需重启 dsh web)——刷新一下浏览器页面,");
1242
- L.push(" 再打开 设置 → 「远程控制」→ 注册/登录手机号即可。");
1242
+ L.push(" 再打开 设置 → 「远程访问」→ 注册/登录手机号即可。");
1243
1243
  } else if (needRestart && restartResult && restartResult.ok) {
1244
1244
  L.push("");
1245
- L.push(" 下一步: dsh web 已重启,直接打开 http://127.0.0.1:3080 → 设置 → 「远程控制」→ 注册/登录手机号。");
1245
+ L.push(" 下一步: dsh web 已重启,直接打开 http://127.0.0.1:3080 → 设置 → 「远程访问」→ 注册/登录手机号。");
1246
1246
  } else if (needRestart && pluginResult && pluginResult.hotPatch && pluginResult.changed) {
1247
1247
  // patch 已写入但探测窗口内没等到面板接口:热加载很可能还在进行(插件节点半启动+注册路由)。
1248
1248
  // 这种情况**不能**直接让用户重启 —— 先让他等几秒刷新,再给兜底方案。
@@ -1251,7 +1251,7 @@ async function setup(argv) {
1251
1251
  L.push(`ℹ 插件已按热加载方式登记,但运行中的 dsh web 仍在用旧版本(${runningSeen} → 期望 ${pkgVersion()}):`);
1252
1252
  L.push(" 刷新页面即可(浏览器半会跟着更新);若刷新后功能仍不对,再重启一次 dsh web。");
1253
1253
  } else {
1254
- L.push("ℹ 插件已按热加载方式登记(patch 已写入),若「设置 → 远程控制」还没出现:");
1254
+ L.push("ℹ 插件已按热加载方式登记(patch 已写入),若「设置 → 远程访问」还没出现:");
1255
1255
  L.push(" 等几秒后刷新页面即可;仍未出现再重启一次 dsh web(命令见 README)。");
1256
1256
  }
1257
1257
  } else if (needRestart) {
@@ -1261,15 +1261,15 @@ async function setup(argv) {
1261
1261
  L.push(" 请手动执行(任选其一):");
1262
1262
  L.push(" launchctl kickstart -k gui/$(id -u)/com.dshweb.dev # 用 launchd 托管时");
1263
1263
  L.push(" kill $(lsof -ti tcp:3080 -sTCP:LISTEN) && dsh web --no-open # 手动启动时");
1264
- L.push(" 重启后:打开 http://127.0.0.1:3080 → 设置 → 「远程控制」→ 注册/登录手机号。");
1264
+ L.push(" 重启后:打开 http://127.0.0.1:3080 → 设置 → 「远程访问」→ 注册/登录手机号。");
1265
1265
  } else {
1266
1266
  L.push("");
1267
- L.push(" 下一步: 打开 dsh web → 设置 → 「远程控制」→ 注册/登录手机号即可(无需任何命令)。");
1267
+ L.push(" 下一步: 打开 dsh web → 设置 → 「远程访问」→ 注册/登录手机号即可(无需任何命令)。");
1268
1268
  }
1269
1269
  console.log("\n" + L.join("\n") + "\n");
1270
1270
  }
1271
1271
 
1272
- // ---------- plugin:安装/卸载 dsh web 远程控制插件 ----------
1272
+ // ---------- plugin:安装/卸载 dsh web 远程访问插件 ----------
1273
1273
  /** 当前插件名(2026-09 由 dsh-remote-ui 更名;dsh-remote-web = dsh-remote 的 dsh web 插件半)。 */
1274
1274
  const PLUGIN_ID = "dsh-remote-web";
1275
1275
  /** 更名前的历史插件名(≤0.4.9):升级安装/卸载时一并清理,避免旧 id 残留导致重复激活。 */
@@ -2113,7 +2113,7 @@ else if (cmd === "status") {
2113
2113
  console.log("配置文件:", CONFIG_PATH);
2114
2114
  console.log("连接模式:", local ? `自建服务(${cfg.tunnel_url || "未设置服务器地址"})` : `SaaS 云端服务(${cfg.phone || "未配置账号"})`);
2115
2115
  console.log("API:", cfg.api_url || (local ? "(自建模式无需账号 API)" : DEFAULT_API));
2116
- console.log("远程地址/登录: 打开 dsh web → 设置 → 「远程控制」查看与操作");
2116
+ console.log("远程地址/登录: 打开 dsh web → 设置 → 「远程访问」查看与操作");
2117
2117
  // 插件挂载诊断:报障时一眼看出是"链接坏了"还是"别的毛病"
2118
2118
  const profileDir = resolveProfileDir([]);
2119
2119
  if (fs.existsSync(path.join(profileDir, "package.json"))) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrrisega/dsh-remote",
3
- "version": "0.6.8",
3
+ "version": "0.6.9-beta.1",
4
4
  "description": "手机远程控制 DeepSeek Harness · Remote control DeepSeek Harness (dsh web) from any phone browser — 100% 全功能 App 级体验:发消息、看工具执行、审批权限、改设置、管凭据,含特权操作,免内网穿透。一条命令安装 npx @mrrisega/dsh-remote。Mobile remote control for DSH, self-host or SaaS, no server needed on LAN.",
5
5
  "keywords": [
6
6
  "deepseek-harness",