@mrrisega/dsh-remote 0.6.8 → 0.6.9-beta.2
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 +1 -1
- package/clients/dsh-remote/mobile-adapter.mjs +274 -21
- package/clients/dsh-remote/test/mobile-adapter-guards.test.mjs +682 -0
- package/docs/telemetry.md +5 -1
- package/dsh-setup.mjs +18 -18
- package/package.json +1 -1
- package/packages/dsh-remote-web/lib/client.js +1496 -232
- package/packages/dsh-remote-web/lib/index.js +329 -29
- package/packages/dsh-remote-web/package.json +1 -1
- package/packages/dsh-remote-web/test/update-stall.test.mjs +315 -0
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.
|
|
22
|
-
* 4. 登录/连接配置在 dsh web → 设置 →
|
|
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
|
|
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(" 所以「设置 →
|
|
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(`
|
|
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.
|
|
3
|
+
"version": "0.6.9-beta.2",
|
|
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",
|