@dsh-sup/dsh-core-linux-x64 0.1.5-BETA.4 → 0.1.5-BETA.6
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/core.cjs +209 -331
- package/package.json +1 -1
- package/ui-react/assets/{InstancesPage-rigmvUH5.js → InstancesPage-B2OXFYf0.js} +1 -1
- package/ui-react/assets/{LanPage-BDx2kibu.js → LanPage-sgjnj_nP.js} +1 -1
- package/ui-react/assets/{OverviewPage-B5RH9NXk.js → OverviewPage-Dliy1IS_.js} +1 -1
- package/ui-react/assets/{PluginsPage-gAcmHjvU.js → PluginsPage-B9d78QnQ.js} +1 -1
- package/ui-react/assets/{RouterPage-C115y-B3.js → RouterPage-CwG-QYRs.js} +1 -1
- package/ui-react/assets/{SettingsPage-BNrwQlMy.js → SettingsPage-DNScdpR7.js} +4 -2
- package/ui-react/assets/{TasksPage-DvnGMoBB.js → TasksPage-3cctVYFY.js} +1 -1
- package/ui-react/assets/{external-link-SYs4QOvn.js → external-link-B3goz-0m.js} +1 -1
- package/ui-react/assets/{refresh-cw-CQuKs_Tk.js → refresh-cw-Cv-9galq.js} +1 -1
- package/ui-react/assets/{rocket-Dt6NGQXE.js → rocket-B9cBKQUY.js} +1 -1
- package/ui-react/assets/{shield-check-B-D3XDKa.js → shield-check-UgQY0o2B.js} +1 -1
- package/ui-react/assets/{supervisor-DwJMunGH.js → supervisor-4Q6BBx68.js} +3 -3
- package/ui-react/assets/{supervisor-BVac7io-.js → supervisor-DdCExALH.js} +1 -1
- package/ui-react/assets/{useSupervisorAction-B1Piyga4.js → useSupervisorAction-C0KJmCu7.js} +1 -1
- package/ui-react/assets/{widgets-DMpjcPY5.js → widgets-BXmNWJy5.js} +1 -1
- package/ui-react/supervisor.html +2 -2
package/core.cjs
CHANGED
|
@@ -80,6 +80,71 @@ var require_exec = __commonJS({
|
|
|
80
80
|
}
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
+
// src/platform/state-root.js
|
|
84
|
+
var require_state_root = __commonJS({
|
|
85
|
+
"src/platform/state-root.js"(exports2, module2) {
|
|
86
|
+
"use strict";
|
|
87
|
+
var fs2 = require("node:fs");
|
|
88
|
+
var os2 = require("node:os");
|
|
89
|
+
var path2 = require("node:path");
|
|
90
|
+
var SCHEMA = 1;
|
|
91
|
+
function root() {
|
|
92
|
+
const override = process.env.DSH_SUPERVISOR_HOME;
|
|
93
|
+
if (override && String(override).trim()) return path2.resolve(String(override).trim());
|
|
94
|
+
if (process.platform === "win32") {
|
|
95
|
+
const local = process.env.LOCALAPPDATA || path2.join(os2.homedir(), "AppData", "Local");
|
|
96
|
+
return path2.join(local, "dsh-supervisor");
|
|
97
|
+
}
|
|
98
|
+
if (process.platform === "darwin") {
|
|
99
|
+
return path2.join(os2.homedir(), "Library", "Application Support", "dsh-supervisor");
|
|
100
|
+
}
|
|
101
|
+
const xdg = process.env.XDG_STATE_HOME;
|
|
102
|
+
return xdg && String(xdg).trim() ? path2.join(String(xdg).trim(), "dsh-supervisor") : path2.join(os2.homedir(), ".local", "state", "dsh-supervisor");
|
|
103
|
+
}
|
|
104
|
+
function supervisorDir() {
|
|
105
|
+
return path2.join(root(), "supervisor");
|
|
106
|
+
}
|
|
107
|
+
function shellDir() {
|
|
108
|
+
return path2.join(root(), "shell");
|
|
109
|
+
}
|
|
110
|
+
function legacySupervisorDir() {
|
|
111
|
+
return path2.join(os2.homedir(), ".dsh", "supervisor");
|
|
112
|
+
}
|
|
113
|
+
function legacyShellDir() {
|
|
114
|
+
return path2.join(os2.homedir(), ".dsh", "shell");
|
|
115
|
+
}
|
|
116
|
+
function migrateLegacy() {
|
|
117
|
+
const moved = [];
|
|
118
|
+
for (const [from, to] of [
|
|
119
|
+
[legacySupervisorDir(), supervisorDir()],
|
|
120
|
+
[legacyShellDir(), shellDir()]
|
|
121
|
+
]) {
|
|
122
|
+
try {
|
|
123
|
+
if (!fs2.existsSync(from)) continue;
|
|
124
|
+
fs2.mkdirSync(to, { recursive: true });
|
|
125
|
+
for (const name of fs2.readdirSync(from)) {
|
|
126
|
+
const src = path2.join(from, name);
|
|
127
|
+
const dst = path2.join(to, name);
|
|
128
|
+
if (fs2.existsSync(dst)) continue;
|
|
129
|
+
try {
|
|
130
|
+
fs2.renameSync(src, dst);
|
|
131
|
+
moved.push(src + " -> " + dst);
|
|
132
|
+
} catch {
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
if (fs2.readdirSync(from).length === 0) fs2.rmdirSync(from);
|
|
137
|
+
} catch {
|
|
138
|
+
}
|
|
139
|
+
} catch {
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return moved;
|
|
143
|
+
}
|
|
144
|
+
module2.exports = { SCHEMA, root, supervisorDir, shellDir, legacySupervisorDir, legacyShellDir, migrateLegacy };
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
83
148
|
// src/platform/config.js
|
|
84
149
|
var require_config = __commonJS({
|
|
85
150
|
"src/platform/config.js"(exports2, module2) {
|
|
@@ -92,6 +157,7 @@ var require_config = __commonJS({
|
|
|
92
157
|
if (p.startsWith("~/")) return path2.join(os2.homedir(), p.slice(2));
|
|
93
158
|
return p;
|
|
94
159
|
}
|
|
160
|
+
var SUP = require_state_root().supervisorDir();
|
|
95
161
|
var DEFAULTS = {
|
|
96
162
|
probeIntervalMs: 5e3,
|
|
97
163
|
// 健康探测(三层):L0 进程存活 + L1 端口监听 + L2 HTTP GET healthUrl。
|
|
@@ -117,29 +183,27 @@ var require_config = __commonJS({
|
|
|
117
183
|
// managed = relay/proxyInstance/oauthCallback 共享池(K8s 单一范围思想,杜绝段碎片化);
|
|
118
184
|
// providerApi = 智能路由供应商独立端点池(按供应商规模调大)。null = 用内置默认池。
|
|
119
185
|
portPools: null,
|
|
120
|
-
stateFile: "
|
|
186
|
+
stateFile: path2.join(SUP, "state.json"),
|
|
121
187
|
// 系统日志框架目录布局:log/ 与 events/ 分目录;
|
|
122
188
|
// 守卫(guard) 事件在 events/guard.events.log、分级日志在 log/guard.log(daemon 用 router/lan 同构文件)。
|
|
123
189
|
// 显式配置(既有生产 config.json / 测试)仍尊重用户给定路径——不强行改写。
|
|
124
|
-
logFile: "
|
|
190
|
+
logFile: path2.join(SUP, "events", "guard.events.log"),
|
|
125
191
|
eventsMaxBytes: 5 * 1024 * 1024,
|
|
126
|
-
supervisorLogFile: "
|
|
127
|
-
dshLogFile: "
|
|
128
|
-
upgradeLogFile: "
|
|
192
|
+
supervisorLogFile: path2.join(SUP, "log", "guard.log"),
|
|
193
|
+
dshLogFile: path2.join(SUP, "log", "dsh.log"),
|
|
194
|
+
upgradeLogFile: path2.join(SUP, "log", "upgrade.log"),
|
|
129
195
|
logLevel: "info",
|
|
130
196
|
logMaxBytes: 5 * 1024 * 1024,
|
|
131
197
|
notifyEnabled: true,
|
|
132
198
|
routerAutostart: false,
|
|
133
199
|
// 智能路由启动开关(旧键 switcherAutoStart 已迁移)
|
|
134
|
-
//
|
|
135
|
-
//(形如 @dsh-sup/dsh-core-linux-x64
|
|
200
|
+
// 内核更新(单写入者 = 桌面壳):corePackageName = 内核自身 npm 子包名
|
|
201
|
+
//(形如 @dsh-sup/dsh-core-linux-x64,按平台/架构发布)。守卫**只读**它来查询版本状态;
|
|
202
|
+
//安装/升级由桌面壳执行(见 RELEASE-AND-UPDATE-MECHANISM.md §6)。
|
|
136
203
|
corePackageName: null,
|
|
137
|
-
// ⚠ `selfUpdateManifestUrl` / `selfUpdateDir`
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
// 新代码**不得**再依赖这两个键。
|
|
141
|
-
selfUpdateManifestUrl: null,
|
|
142
|
-
selfUpdateDir: null,
|
|
204
|
+
// ⚠ 2026-09-15:旧 manifest 模式的残留键 `selfUpdateManifestUrl` / `selfUpdateDir` **已删除**
|
|
205
|
+
// (全仓无赋值点;其唯一消费方曾改为按 corePackageName 判定)。既有用户 config.json 若仍含
|
|
206
|
+
// 这两键,加载时忽略即可(未知键不报错)。新代码**不得**再引入 manifest 更新通道。
|
|
143
207
|
pluginsProfileName: "web",
|
|
144
208
|
packageName: "@deepseek-ai/dsh",
|
|
145
209
|
// **最小兜底**镜像源(2026-09-11 契约化)。
|
|
@@ -225,7 +289,7 @@ var require_version = __commonJS({
|
|
|
225
289
|
var fs2 = require("node:fs");
|
|
226
290
|
var path2 = require("node:path");
|
|
227
291
|
function guardVersion() {
|
|
228
|
-
if (true) return String("0.1.5-BETA.
|
|
292
|
+
if (true) return String("0.1.5-BETA.6");
|
|
229
293
|
try {
|
|
230
294
|
return JSON.parse(fs2.readFileSync(path2.join(__dirname, "..", "..", "package.json"), "utf8")).version || "unknown";
|
|
231
295
|
} catch {
|
|
@@ -1553,7 +1617,7 @@ var require_autostart = __commonJS({
|
|
|
1553
1617
|
return String(s).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
1554
1618
|
}
|
|
1555
1619
|
function macGuiPlist(guiExe) {
|
|
1556
|
-
const log = path2.join(
|
|
1620
|
+
const log = path2.join(require_state_root().shellDir(), "gui-stdio.log");
|
|
1557
1621
|
return '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0"><dict>\n <key>Label</key><string>' + xmlEscape(GUI_LABEL) + "</string>\n <key>ProgramArguments</key>\n <array><string>" + xmlEscape(guiExe) + "</string></array>\n <key>RunAtLoad</key><true/>\n <key>LimitLoadToSessionType</key><string>Aqua</string>\n <key>ProcessType</key><string>Interactive</string>\n <key>StandardOutPath</key><string>" + xmlEscape(log) + "</string>\n <key>StandardErrorPath</key><string>" + xmlEscape(log) + "</string>\n</dict></plist>\n";
|
|
1558
1622
|
}
|
|
1559
1623
|
function guiFile() {
|
|
@@ -1607,54 +1671,14 @@ var require_autostart = __commonJS({
|
|
|
1607
1671
|
const errors = [];
|
|
1608
1672
|
if (isWindows) {
|
|
1609
1673
|
try {
|
|
1610
|
-
const watchdogPs1 = path2.join(os2.homedir(), ".dsh", "supervisor", "watchdog.ps1");
|
|
1611
1674
|
if (on) {
|
|
1612
|
-
const
|
|
1613
|
-
|
|
1614
|
-
const guiPath = guiCommand();
|
|
1615
|
-
const ps = [
|
|
1616
|
-
'$ErrorActionPreference = "SilentlyContinue"',
|
|
1617
|
-
"$port = " + JSON.stringify(String(apiPort)),
|
|
1618
|
-
"$daemon = " + JSON.stringify(String(daemon)),
|
|
1619
|
-
"$gui = " + JSON.stringify(String(guiPath)),
|
|
1620
|
-
"$up = Test-NetConnection -ComputerName 127.0.0.1 -Port $port -InformationLevel Quiet -WarningAction SilentlyContinue",
|
|
1621
|
-
"# \u2500\u2500 \u5B88\u536B\u4FDD\u6D3B\uFF08\u4EC5\u5728\u5B88\u536B\u4E0D\u53EF\u8FBE\u65F6\uFF09\u2500\u2500",
|
|
1622
|
-
"if (-not $up) {",
|
|
1623
|
-
" $p = @(Get-Process -Name dsh-supervisor -ErrorAction SilentlyContinue)",
|
|
1624
|
-
" if (-not $p) { Start-Process -FilePath $daemon -ArgumentList 'daemon' -WindowStyle Hidden }",
|
|
1625
|
-
"}",
|
|
1626
|
-
"# \u2500\u2500 \u58F3\u4FDD\u6D3B\uFF08\u26A0 \u5FC5\u987B**\u72EC\u7ACB\u4E8E\u5B88\u536B\u72B6\u6001**\uFF09\u2500\u2500",
|
|
1627
|
-
"# 2026-09-11 \u5BA1\u8BA1\u4FEE\u590D\uFF1A\u65E7\u5B9E\u73B0\u628A\u58F3\u68C0\u67E5\u5D4C\u5728\u4E0A\u9762\u7684 if (-not $up) \u5185\uFF0C",
|
|
1628
|
-
"# \u4E8E\u662F\u300C\u58F3\u5D29\u3001\u5B88\u536B\u6D3B\u300D\u65F6 $up \u4E3A\u771F \u2192 \u6574\u5757\u8DF3\u8FC7 \u2192 **\u58F3\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u62C9\u8D77**\u3002",
|
|
1629
|
-
"# \u800C\u90A3\u6070\u662F\u58F3\u81EA\u6108\u552F\u4E00\u9700\u8981\u751F\u6548\u7684\u573A\u666F\uFF08\u5B88\u536B\u7531\u670D\u52A1\u7BA1\u7406\u5668\u4FDD\u6D3B\uFF0C\u58F3\u65E0\u4EBA\u7BA1\uFF09\u3002",
|
|
1630
|
-
"$g = @(Get-Process -Name dsh-supervisor-gui -ErrorAction SilentlyContinue)",
|
|
1631
|
-
"if (-not $g -and (Test-Path $gui)) { Start-Process -FilePath $gui -WindowStyle Hidden }",
|
|
1632
|
-
"exit 0"
|
|
1633
|
-
].join(String.fromCharCode(13, 10));
|
|
1634
|
-
fs2.mkdirSync(path2.dirname(watchdogPs1), { recursive: true });
|
|
1635
|
-
const atmp = watchdogPs1 + ".tmp";
|
|
1636
|
-
fs2.writeFileSync(atmp, ps);
|
|
1637
|
-
fs2.renameSync(atmp, watchdogPs1);
|
|
1638
|
-
{
|
|
1639
|
-
const r = ex2.runDetail("schtasks", ["/Create", "/TN", "DSH-Supervisor-GUI", "/SC", "ONLOGON", "/RL", "HIGHEST", "/F", "/TR", '"' + guiCommand() + '"']);
|
|
1640
|
-
if (!r.ok) errors.push("schtasks gui: " + (r.error || "\u6267\u884C\u5931\u8D25"));
|
|
1641
|
-
}
|
|
1642
|
-
ex2.run("schtasks", ["/Change", "/TN", "DSH-Supervisor", "/ENABLE"]);
|
|
1643
|
-
{
|
|
1644
|
-
const r = ex2.runDetail("schtasks", ["/Create", "/TN", "DSH-Supervisor-Watchdog", "/SC", "MINUTE", "/MO", "5", "/RL", "HIGHEST", "/F", "/TR", 'powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "' + watchdogPs1 + '"']);
|
|
1645
|
-
if (!r.ok) errors.push("schtasks watchdog: " + (r.error || "\u6267\u884C\u5931\u8D25"));
|
|
1646
|
-
}
|
|
1675
|
+
const r = ex2.runDetail("schtasks", ["/Create", "/TN", "DSH-Supervisor-GUI", "/SC", "ONLOGON", "/RL", "HIGHEST", "/F", "/TR", '"' + guiCommand() + '"']);
|
|
1676
|
+
if (!r.ok) errors.push("schtasks gui: " + (r.error || "\u6267\u884C\u5931\u8D25"));
|
|
1647
1677
|
} else {
|
|
1648
|
-
ex2.run("schtasks", ["/Delete", "/TN", "DSH-Supervisor-Watchdog", "/F"]);
|
|
1649
1678
|
ex2.run("schtasks", ["/Delete", "/TN", "DSH-Supervisor-GUI", "/F"]);
|
|
1650
|
-
ex2.run("schtasks", ["/Change", "/TN", "DSH-Supervisor", "/DISABLE"]);
|
|
1651
|
-
try {
|
|
1652
|
-
fs2.unlinkSync(watchdogPs1);
|
|
1653
|
-
} catch {
|
|
1654
|
-
}
|
|
1655
1679
|
}
|
|
1656
1680
|
} catch (e) {
|
|
1657
|
-
errors.push("
|
|
1681
|
+
errors.push("gui autostart: " + e.message);
|
|
1658
1682
|
}
|
|
1659
1683
|
return { ok: errors.length === 0, errors, ...status() };
|
|
1660
1684
|
}
|
|
@@ -1836,7 +1860,7 @@ var require_os = __commonJS({
|
|
|
1836
1860
|
return path2.join(os2.homedir(), ".dsh");
|
|
1837
1861
|
}
|
|
1838
1862
|
function supervisorDir() {
|
|
1839
|
-
return
|
|
1863
|
+
return require_state_root().supervisorDir();
|
|
1840
1864
|
}
|
|
1841
1865
|
function capabilityProfile(platform, arch) {
|
|
1842
1866
|
const pl = platform || PLATFORM;
|
|
@@ -2069,7 +2093,7 @@ var require_ports = __commonJS({
|
|
|
2069
2093
|
};
|
|
2070
2094
|
var PortRegistry = class {
|
|
2071
2095
|
constructor(opts) {
|
|
2072
|
-
this._file = opts && opts.file || path2.join(
|
|
2096
|
+
this._file = opts && opts.file || path2.join(require_state_root().supervisorDir(), "ports.json");
|
|
2073
2097
|
this._records = /* @__PURE__ */ new Map();
|
|
2074
2098
|
this._allocLock = false;
|
|
2075
2099
|
this._pools = Object.assign({}, DEFAULT_POOLS, opts && opts.pools || {});
|
|
@@ -3393,6 +3417,7 @@ var require_proxy = __commonJS({
|
|
|
3393
3417
|
this.kind = "proxy";
|
|
3394
3418
|
this.proxyAppId = opts.proxyAppId;
|
|
3395
3419
|
this.app = opts.app || null;
|
|
3420
|
+
this.stateDir = opts.stateDir || null;
|
|
3396
3421
|
this.proxyRunning = false;
|
|
3397
3422
|
this.instances = [];
|
|
3398
3423
|
this.selectedAccountKeyId = null;
|
|
@@ -3626,7 +3651,8 @@ var require_proxy = __commonJS({
|
|
|
3626
3651
|
const logFilter = /error|streaming|idle|timeout|ECONN|abort|socket|finish|truncat/i;
|
|
3627
3652
|
let logStream = null;
|
|
3628
3653
|
try {
|
|
3629
|
-
const
|
|
3654
|
+
const baseDir = this.stateDir || require("../../platform/state-root").supervisorDir();
|
|
3655
|
+
const logDir = require("node:path").join(baseDir, "logs");
|
|
3630
3656
|
require("node:fs").mkdirSync(logDir, { recursive: true });
|
|
3631
3657
|
logStream = require("node:fs").createWriteStream(require("node:path").join(logDir, "proxy-instance-" + this.proxyAppId + "-" + port + ".log"), { flags: "a" });
|
|
3632
3658
|
} catch {
|
|
@@ -4721,6 +4747,60 @@ var require_proxy_apps = __commonJS({
|
|
|
4721
4747
|
}
|
|
4722
4748
|
});
|
|
4723
4749
|
|
|
4750
|
+
// src/platform/runtime-contract.js
|
|
4751
|
+
var require_runtime_contract = __commonJS({
|
|
4752
|
+
"src/platform/runtime-contract.js"(exports2, module2) {
|
|
4753
|
+
"use strict";
|
|
4754
|
+
var fs2 = require("node:fs");
|
|
4755
|
+
var os2 = require("node:os");
|
|
4756
|
+
var path2 = require("node:path");
|
|
4757
|
+
var SUPPORTED_SCHEMA = 2;
|
|
4758
|
+
function file() {
|
|
4759
|
+
return path2.join(require_state_root().supervisorDir(), "runtime.json");
|
|
4760
|
+
}
|
|
4761
|
+
function read() {
|
|
4762
|
+
let j;
|
|
4763
|
+
try {
|
|
4764
|
+
j = JSON.parse(fs2.readFileSync(file(), "utf8"));
|
|
4765
|
+
} catch {
|
|
4766
|
+
return null;
|
|
4767
|
+
}
|
|
4768
|
+
if (!j || typeof j !== "object" || Array.isArray(j)) return null;
|
|
4769
|
+
const node = j.node && typeof j.node === "object" ? j.node : {};
|
|
4770
|
+
const npm = j.npm && typeof j.npm === "object" ? j.npm : {};
|
|
4771
|
+
return {
|
|
4772
|
+
schema: Number(j.schema) || 1,
|
|
4773
|
+
nodePath: j.nodePath || node.path || null,
|
|
4774
|
+
nodeBinDir: j.nodeBinDir || node.binDir || null,
|
|
4775
|
+
npmPath: j.npmPath || npm.path || null,
|
|
4776
|
+
minNode: j.minNode || null,
|
|
4777
|
+
writtenBy: j.writtenBy || null,
|
|
4778
|
+
raw: j
|
|
4779
|
+
};
|
|
4780
|
+
}
|
|
4781
|
+
function npmBin(fallback) {
|
|
4782
|
+
const c = read();
|
|
4783
|
+
if (c && c.npmPath) {
|
|
4784
|
+
try {
|
|
4785
|
+
if (fs2.existsSync(c.npmPath)) return c.npmPath;
|
|
4786
|
+
} catch {
|
|
4787
|
+
}
|
|
4788
|
+
}
|
|
4789
|
+
return typeof fallback === "function" ? fallback() : fallback;
|
|
4790
|
+
}
|
|
4791
|
+
function withPath(env) {
|
|
4792
|
+
const e = Object.assign({}, env || {});
|
|
4793
|
+
const c = read();
|
|
4794
|
+
if (c && c.nodeBinDir) {
|
|
4795
|
+
const cur = e.PATH || e.Path || "";
|
|
4796
|
+
e.PATH = c.nodeBinDir + path2.delimiter + cur;
|
|
4797
|
+
}
|
|
4798
|
+
return e;
|
|
4799
|
+
}
|
|
4800
|
+
module2.exports = { SUPPORTED_SCHEMA, file, read, npmBin, withPath };
|
|
4801
|
+
}
|
|
4802
|
+
});
|
|
4803
|
+
|
|
4724
4804
|
// src/platform/registry-contract.js
|
|
4725
4805
|
var require_registry_contract = __commonJS({
|
|
4726
4806
|
"src/platform/registry-contract.js"(exports2, module2) {
|
|
@@ -4832,6 +4912,7 @@ var require_dist = __commonJS({
|
|
|
4832
4912
|
var matrix = require_matrix();
|
|
4833
4913
|
var { spawn } = require("node:child_process");
|
|
4834
4914
|
var { npmBin } = require_exec_path();
|
|
4915
|
+
var runtimeContract = require_runtime_contract();
|
|
4835
4916
|
var registryContract = require_registry_contract();
|
|
4836
4917
|
var CONTRACT_TTL_MS = 60 * 1e3;
|
|
4837
4918
|
var service = require_service().current();
|
|
@@ -5227,17 +5308,17 @@ var require_dist = __commonJS({
|
|
|
5227
5308
|
const pkg = o.pkg || "@deepseek-ai/dsh";
|
|
5228
5309
|
if (!o.version) return Promise.resolve({ ok: false, error: "runNpmInstall: \u7F3A\u5C11 version\uFF08\u5FC5\u987B\u663E\u5F0F\u643A\u5E26\uFF09", output: [] });
|
|
5229
5310
|
let argv;
|
|
5230
|
-
let bin = npmBin();
|
|
5311
|
+
let bin = runtimeContract.npmBin(npmBin);
|
|
5231
5312
|
if (Array.isArray(o.commandTemplate) && o.commandTemplate.length) {
|
|
5232
5313
|
argv = o.commandTemplate.map((s) => String(s).replace(/{pkg}/g, pkg).replace(/{version}/g, o.version).replace(/{prefix}/g, o.prefix || ""));
|
|
5233
|
-
bin = argv[0] === "npm" ? npmBin() : argv[0];
|
|
5314
|
+
bin = argv[0] === "npm" ? runtimeContract.npmBin(npmBin) : argv[0];
|
|
5234
5315
|
argv = argv.slice(1);
|
|
5235
5316
|
} else {
|
|
5236
5317
|
argv = ["install", "-g", "--no-audit", "--no-fund"];
|
|
5237
5318
|
if (o.prefix) argv.push("--prefix", o.prefix);
|
|
5238
5319
|
argv.push(pkg + "@" + o.version);
|
|
5239
5320
|
}
|
|
5240
|
-
const envVars =
|
|
5321
|
+
const envVars = runtimeContract.withPath(process.env);
|
|
5241
5322
|
if (o.registry) {
|
|
5242
5323
|
envVars.npm_config_registry = o.registry;
|
|
5243
5324
|
envVars.NPM_CONFIG_REGISTRY = o.registry;
|
|
@@ -6699,7 +6780,7 @@ var require_router = __commonJS({
|
|
|
6699
6780
|
}
|
|
6700
6781
|
}
|
|
6701
6782
|
_deserializeProvider(p) {
|
|
6702
|
-
const common = { id: p.id, name: p.name, logger: this.logger, events: this.events, dist: this.dist, onPersist: () => this._save(), apiPort: p.apiPort || null, activated: p.activated === true };
|
|
6783
|
+
const common = { id: p.id, name: p.name, logger: this.logger, events: this.events, dist: this.dist, onPersist: () => this._save(), stateDir: this.config && this.config.stateFile ? path2.dirname(this.config.stateFile) : null, apiPort: p.apiPort || null, activated: p.activated === true };
|
|
6703
6784
|
let prov;
|
|
6704
6785
|
if (p.kind === "proxy") {
|
|
6705
6786
|
prov = new ProxyProvider({ ...common, kind: "proxy", proxyAppId: p.proxyAppId, app: PROXY_APPS[p.proxyAppId] || null });
|
|
@@ -10387,60 +10468,6 @@ var require_fs_utils = __commonJS({
|
|
|
10387
10468
|
"use strict";
|
|
10388
10469
|
var fs2 = require("node:fs");
|
|
10389
10470
|
var path2 = require("node:path");
|
|
10390
|
-
var zlib = require("node:zlib");
|
|
10391
|
-
function extractTarGz(tgzBuf, destDir, opts) {
|
|
10392
|
-
const strip = opts && opts.stripComponents !== void 0 ? opts.stripComponents : 1;
|
|
10393
|
-
const tarData = zlib.gunzipSync(tgzBuf);
|
|
10394
|
-
fs2.mkdirSync(destDir, { recursive: true });
|
|
10395
|
-
const written = [];
|
|
10396
|
-
const stripName = (name) => {
|
|
10397
|
-
const parts = String(name).split("/").filter((p) => p !== "" && p !== ".");
|
|
10398
|
-
const cut = Math.min(strip, parts.length - 1);
|
|
10399
|
-
const rel = parts.slice(cut).join("/");
|
|
10400
|
-
if (!rel || rel.split("/").some((s) => s === "..") || rel.startsWith("/")) return null;
|
|
10401
|
-
return rel;
|
|
10402
|
-
};
|
|
10403
|
-
let offset = 0;
|
|
10404
|
-
let pendingLong = null;
|
|
10405
|
-
while (offset + 512 <= tarData.length) {
|
|
10406
|
-
const header = tarData.slice(offset, offset + 512);
|
|
10407
|
-
if (header.every((b) => b === 0)) break;
|
|
10408
|
-
let name = header.slice(0, 100).toString("utf8").split("\0")[0];
|
|
10409
|
-
const size = parseInt(header.slice(124, 136).toString("utf8").replace(/[\0 ]/g, ""), 8) || 0;
|
|
10410
|
-
const typeFlag = String.fromCharCode(header[156] || 48);
|
|
10411
|
-
const dataStart = offset + 512;
|
|
10412
|
-
const data = tarData.slice(dataStart, dataStart + size);
|
|
10413
|
-
offset = dataStart + Math.ceil(size / 512) * 512;
|
|
10414
|
-
if (pendingLong !== null) {
|
|
10415
|
-
name = pendingLong;
|
|
10416
|
-
pendingLong = null;
|
|
10417
|
-
}
|
|
10418
|
-
if (typeFlag === "L") {
|
|
10419
|
-
pendingLong = name;
|
|
10420
|
-
continue;
|
|
10421
|
-
}
|
|
10422
|
-
const rel = stripName(name);
|
|
10423
|
-
if (rel === null) continue;
|
|
10424
|
-
const target = path2.join(destDir, rel);
|
|
10425
|
-
if (typeFlag === "5") {
|
|
10426
|
-
fs2.mkdirSync(target, { recursive: true });
|
|
10427
|
-
continue;
|
|
10428
|
-
}
|
|
10429
|
-
if (typeFlag === "2") {
|
|
10430
|
-
const linkTo = header.slice(157, 157 + 100).toString("utf8").split("\0")[0];
|
|
10431
|
-
try {
|
|
10432
|
-
fs2.unlinkSync(target);
|
|
10433
|
-
} catch {
|
|
10434
|
-
}
|
|
10435
|
-
fs2.symlinkSync(linkTo, target);
|
|
10436
|
-
continue;
|
|
10437
|
-
}
|
|
10438
|
-
fs2.mkdirSync(path2.dirname(target), { recursive: true });
|
|
10439
|
-
fs2.writeFileSync(target, data);
|
|
10440
|
-
written.push(rel);
|
|
10441
|
-
}
|
|
10442
|
-
return written;
|
|
10443
|
-
}
|
|
10444
10471
|
function dirSizeBytes(root) {
|
|
10445
10472
|
let total = 0;
|
|
10446
10473
|
let seen = 0;
|
|
@@ -10474,7 +10501,7 @@ var require_fs_utils = __commonJS({
|
|
|
10474
10501
|
}
|
|
10475
10502
|
return total;
|
|
10476
10503
|
}
|
|
10477
|
-
module2.exports = { dirSizeBytes
|
|
10504
|
+
module2.exports = { dirSizeBytes };
|
|
10478
10505
|
}
|
|
10479
10506
|
});
|
|
10480
10507
|
|
|
@@ -11764,7 +11791,7 @@ var require_shell = __commonJS({
|
|
|
11764
11791
|
var path2 = require("node:path");
|
|
11765
11792
|
var { semverCompare } = require_dist();
|
|
11766
11793
|
function shellDir() {
|
|
11767
|
-
return
|
|
11794
|
+
return require_state_root().shellDir();
|
|
11768
11795
|
}
|
|
11769
11796
|
function readJson(p) {
|
|
11770
11797
|
try {
|
|
@@ -15624,20 +15651,22 @@ var require_guard = __commonJS({
|
|
|
15624
15651
|
return;
|
|
15625
15652
|
}
|
|
15626
15653
|
if (req.method === "POST" && pathname === "/self-update/apply") {
|
|
15627
|
-
|
|
15628
|
-
|
|
15629
|
-
|
|
15630
|
-
|
|
15631
|
-
|
|
15632
|
-
|
|
15654
|
+
req.resume();
|
|
15655
|
+
return send(410, {
|
|
15656
|
+
ok: false,
|
|
15657
|
+
code: "KERNEL_UPDATE_SINGLE_WRITER",
|
|
15658
|
+
owner: "desktop-shell",
|
|
15659
|
+
error: "\u5185\u6838\u66F4\u65B0\u7531\u684C\u9762\u58F3\u6267\u884C\uFF08\u5355\u5199\u5165\u8005\u5951\u7EA6\uFF09\uFF1A\u8BF7\u5728\u684C\u9762\u58F3\u7684\u9762\u677F\u4E2D\u70B9\u300C\u66F4\u65B0\u300D\uFF0C\u6216\u5347\u7EA7/\u91CD\u88C5\u684C\u9762\u58F3\u3002"
|
|
15660
|
+
});
|
|
15633
15661
|
}
|
|
15634
15662
|
if (req.method === "POST" && pathname === "/self-update/restart-guard") {
|
|
15635
|
-
|
|
15636
|
-
|
|
15637
|
-
|
|
15638
|
-
|
|
15639
|
-
|
|
15640
|
-
|
|
15663
|
+
req.resume();
|
|
15664
|
+
return send(410, {
|
|
15665
|
+
ok: false,
|
|
15666
|
+
code: "KERNEL_UPDATE_SINGLE_WRITER",
|
|
15667
|
+
owner: "desktop-shell",
|
|
15668
|
+
error: "\u5B88\u536B\u91CD\u542F\u7531\u684C\u9762\u58F3\u7ECF\u670D\u52A1\u7BA1\u7406\u5668\u6267\u884C\uFF08\u5B88\u536B\u4ECE\u4E0D\u91CD\u542F\u81EA\u5DF1\uFF09\uFF1A\u66F4\u65B0\u5185\u6838\u8BF7\u7528\u684C\u9762\u58F3\u3002"
|
|
15669
|
+
});
|
|
15641
15670
|
}
|
|
15642
15671
|
if (req.method === "GET" && pathname === "/env/dsh") {
|
|
15643
15672
|
if (!originAllowed(req, sup.config.apiPort)) {
|
|
@@ -17460,15 +17489,8 @@ var require_env_catalog = __commonJS({
|
|
|
17460
17489
|
function runtimeMeta() {
|
|
17461
17490
|
const now = Date.now();
|
|
17462
17491
|
if (_runtimeMetaCache && now - _runtimeMetaAt < 1e4) return _runtimeMetaCache;
|
|
17463
|
-
|
|
17464
|
-
|
|
17465
|
-
const os2 = require("node:os");
|
|
17466
|
-
const path2 = require("node:path");
|
|
17467
|
-
const f = path2.join(os2.homedir(), ".dsh", "supervisor", "runtime.json");
|
|
17468
|
-
meta = JSON.parse(fs2.readFileSync(f, "utf8")) || {};
|
|
17469
|
-
} catch {
|
|
17470
|
-
meta = {};
|
|
17471
|
-
}
|
|
17492
|
+
const c = require_runtime_contract().read();
|
|
17493
|
+
const meta = c && c.raw || {};
|
|
17472
17494
|
_runtimeMetaCache = meta;
|
|
17473
17495
|
_runtimeMetaAt = now;
|
|
17474
17496
|
return meta;
|
|
@@ -17535,27 +17557,24 @@ var require_env_catalog = __commonJS({
|
|
|
17535
17557
|
}
|
|
17536
17558
|
return out;
|
|
17537
17559
|
}
|
|
17538
|
-
/**
|
|
17560
|
+
/** 内核更新依赖条目(单写入者契约:安装/重启归桌面壳)。
|
|
17539
17561
|
*
|
|
17540
|
-
*
|
|
17541
|
-
*
|
|
17542
|
-
*
|
|
17543
|
-
*
|
|
17544
|
-
* 用户与排障者据此查 `selfUpdateManifestUrl`,而真正该看的是 `corePackageName`。
|
|
17545
|
-
*
|
|
17546
|
-
* 现改为按 npm 通道的真实开关(`corePackageName`)判定,detail 也给出该键。
|
|
17562
|
+
* 2026-09-15(A 方案):守卫**不再自更新**,`corePackageName` 只用于查询内核版本状态;
|
|
17563
|
+
* 安装/升级由桌面壳执行(见 RELEASE-AND-UPDATE-MECHANISM.md §6)。
|
|
17564
|
+
* 本条目因此只报告「壳执行内核更新所需的包名」是否就位 —— 不再暗示守卫能自己装。
|
|
17565
|
+
* id 仍为 `selfUpdate` 以兼容既有 `/env/status` 消费方。
|
|
17547
17566
|
*/
|
|
17548
17567
|
selfUpdateEntry() {
|
|
17549
17568
|
const pkg = this.config.corePackageName;
|
|
17550
17569
|
if (!pkg) {
|
|
17551
17570
|
return {
|
|
17552
|
-
label: "\
|
|
17571
|
+
label: "\u5185\u6838\u66F4\u65B0\uFF08\u684C\u9762\u58F3\u6267\u884C\uFF09",
|
|
17553
17572
|
required: false,
|
|
17554
17573
|
state: "unconfigured",
|
|
17555
|
-
detail: "\u672A\u914D\u7F6E corePackageName\
|
|
17574
|
+
detail: "\u672A\u914D\u7F6E corePackageName\uFF08\u5F62\u5982 @dsh-sup/dsh-core-<os>-<arch>\uFF09"
|
|
17556
17575
|
};
|
|
17557
17576
|
}
|
|
17558
|
-
return { label: "\
|
|
17577
|
+
return { label: "\u5185\u6838\u66F4\u65B0\uFF08\u684C\u9762\u58F3\u6267\u884C\uFF09", required: false, state: "configured", detail: pkg };
|
|
17559
17578
|
}
|
|
17560
17579
|
/** DSH 本体条目(外传判定:bin 可执行 + 已装版本)。 */
|
|
17561
17580
|
dshEntry(binOk, installed, bin) {
|
|
@@ -17723,7 +17742,6 @@ var require_settings_view = __commonJS({
|
|
|
17723
17742
|
"use strict";
|
|
17724
17743
|
var fs2 = require("node:fs");
|
|
17725
17744
|
var path2 = require("node:path");
|
|
17726
|
-
var os2 = require("node:os");
|
|
17727
17745
|
var { spawn } = require("node:child_process");
|
|
17728
17746
|
var { execFile } = require("node:child_process");
|
|
17729
17747
|
var ex2 = require_exec();
|
|
@@ -17826,54 +17844,24 @@ var require_settings_view = __commonJS({
|
|
|
17826
17844
|
return { ok: false, error: e.message };
|
|
17827
17845
|
}
|
|
17828
17846
|
}
|
|
17829
|
-
|
|
17830
|
-
* 否则返回明确指引(避免误杀/误起守卫)。 */
|
|
17831
|
-
/** 自更新后的守卫重启(A2):能力按部署形态自动判定(打包态=systemd 重启闭环;源码形态=拒绝),
|
|
17832
|
-
* 去掉 guardRestartAllowed 人工配置门槛。重启前落盘「预期版本」,重启后 /status 校验自报版本
|
|
17833
|
-
* 达标才算更新成功——闭环可观测,不再出现"装了没生效"的静默失败。 */
|
|
17834
|
-
guardSelfUpdateRestart() {
|
|
17835
|
-
const dep = deploy.detect();
|
|
17836
|
-
if (!dep.updatable) {
|
|
17837
|
-
return { ok: false, error: dep.reason || "\u5F53\u524D\u90E8\u7F72\u5F62\u6001\u4E0D\u652F\u6301\u81EA\u52A8\u91CD\u542F", form: dep.form };
|
|
17838
|
-
}
|
|
17839
|
-
const unit = path2.join(os2.homedir(), ".config", "systemd", "user", "dsh-supervisor.service");
|
|
17840
|
-
if (!fs2.existsSync(unit)) return { ok: false, error: "\u7CFB\u7EDF\u672A\u542F\u7528 systemd \u7528\u6237\u5355\u5143\uFF0C\u8BF7\u624B\u52A8\u91CD\u542F\u5B88\u536B" };
|
|
17841
|
-
const swDir = path2.dirname(this.config.stateFile);
|
|
17842
|
-
try {
|
|
17843
|
-
fs2.writeFileSync(path2.join(swDir, "self-update-expected.json"), JSON.stringify({ expectedVersion: this._selfUpdateExpectedVersion || null, at: Date.now() }), { mode: 384 });
|
|
17844
|
-
} catch {
|
|
17845
|
-
}
|
|
17846
|
-
if (this.events) this.events.append("guard_self_update_restart", { expectedVersion: this._selfUpdateExpectedVersion || null, via: "exit+systemd-restart" });
|
|
17847
|
-
this.logger && this.logger.info && this.logger.info("[self-update] \u5B88\u536B\u5C06\u9000\u51FA\uFF0C\u7531 systemd Restart=always \u62C9\u8D77\u65B0\u5185\u6838");
|
|
17848
|
-
setTimeout(() => {
|
|
17849
|
-
const bail = setTimeout(() => process.exit(0), 8e3);
|
|
17850
|
-
if (bail.unref) bail.unref();
|
|
17851
|
-
Promise.resolve().then(() => this.shutdown()).catch((e) => {
|
|
17852
|
-
this.logger && this.logger.warn && this.logger.warn("[self-update] shutdown \u5F02\u5E38: " + (e && e.message || e));
|
|
17853
|
-
}).then(() => {
|
|
17854
|
-
clearTimeout(bail);
|
|
17855
|
-
process.exit(0);
|
|
17856
|
-
});
|
|
17857
|
-
}, 500).unref();
|
|
17858
|
-
return { ok: true, restarted: true, via: "exit+systemd-restart" };
|
|
17859
|
-
}
|
|
17860
|
-
// ---- 守卫自更新(2026-09 收敛:npm 通道取代 manifest/目录翻转)----
|
|
17847
|
+
// ---- 内核更新(单写入者契约:安装/重启归桌面壳)----
|
|
17861
17848
|
//
|
|
17862
|
-
// ⚠
|
|
17863
|
-
//
|
|
17864
|
-
//
|
|
17865
|
-
//
|
|
17849
|
+
// ⚠ 2026-09-15(A 方案):`guardSelfUpdateApply` 与 `guardSelfUpdateRestart` **已删除** ——
|
|
17850
|
+
// 内核 npm 包的唯一写入者是桌面壳(见 RELEASE-AND-UPDATE-MECHANISM.md §6);
|
|
17851
|
+
// 守卫只保留只读的 `guardSelfUpdateStatus`,接口 `/self-update/apply|restart-guard` 返回 410。
|
|
17852
|
+
// (此前 2026-09-12 已删除零调用点的 `guardSelfUpdateDir()`。)
|
|
17866
17853
|
/** 内核 npm 子包名(按当前平台/架构)。corePackageName 可为显式常量或含 {os}/{arch} 占位的模板。 */
|
|
17867
17854
|
guardCorePkg() {
|
|
17868
17855
|
const raw = this.config.corePackageName;
|
|
17869
17856
|
if (!raw) return null;
|
|
17870
17857
|
return String(raw).replace(/{os}/g, matrix.osTag()).replace(/{arch}/g, matrix.current().arch) || null;
|
|
17871
17858
|
}
|
|
17872
|
-
/**
|
|
17873
|
-
* BETA/RC
|
|
17859
|
+
/** 内核更新状态(**只读**;安装/重启归桌面壳,单写入者契约)。
|
|
17860
|
+
* 查 @dsh-sup/dsh-core-<os>-<arch> 全 tag 最高版本(BETA/RC/正式都算更新),与本机 guardVersion 比较。
|
|
17861
|
+
* 本方法**不写任何东西**:面板据此显示「可更新」,实际安装由桌面壳 kernel_update_apply 执行。 */
|
|
17874
17862
|
async guardSelfUpdateStatus() {
|
|
17875
17863
|
const pkg = this.guardCorePkg();
|
|
17876
|
-
if (!pkg) return { ok: false, error: "\u672A\u914D\u7F6E\u5185\u6838\
|
|
17864
|
+
if (!pkg) return { ok: false, error: "\u672A\u914D\u7F6E\u5185\u6838\u5305\uFF08corePackageName\uFF09" };
|
|
17877
17865
|
if (!this.dist || typeof this.dist.fetchLatestVersion !== "function") return { ok: false, error: "\u53D1\u5E03\u670D\u52A1\u672A\u521D\u59CB\u5316" };
|
|
17878
17866
|
const dep = deploy.detect();
|
|
17879
17867
|
if (!dep.updatable) {
|
|
@@ -17890,82 +17878,6 @@ var require_settings_view = __commonJS({
|
|
|
17890
17878
|
return { ok: false, error: e.message };
|
|
17891
17879
|
}
|
|
17892
17880
|
}
|
|
17893
|
-
/** 应用内核更新(npm 通道,全更新强制语义):`npm i -g <pkg>@<latest>`。
|
|
17894
|
-
* 安装后由调用方(壳/面板)据 restartRequired 调 /self-update/restart-guard(或手动重启)生效。 */
|
|
17895
|
-
async guardSelfUpdateApply() {
|
|
17896
|
-
const pkg = this.guardCorePkg();
|
|
17897
|
-
if (!pkg) return { ok: false, error: "\u672A\u914D\u7F6E\u5185\u6838\u81EA\u66F4\u65B0\u5305\uFF08corePackageName\uFF09" };
|
|
17898
|
-
if (!this.dist || typeof this.dist.runNpmInstall !== "function") return { ok: false, error: "\u53D1\u5E03\u670D\u52A1\u672A\u521D\u59CB\u5316" };
|
|
17899
|
-
if (!this.config.installCommandTemplate || !Array.isArray(this.config.installCommandTemplate)) return { ok: false, error: "\u672A\u914D\u7F6E\u5B89\u88C5\u547D\u4EE4\u6A21\u677F\uFF08installCommandTemplate\uFF09" };
|
|
17900
|
-
const latest = await this.guardSelfUpdateStatus();
|
|
17901
|
-
if (!latest.ok || !latest.latest) return { ok: false, error: latest && latest.error || "\u7248\u672C\u67E5\u8BE2\u5931\u8D25" };
|
|
17902
|
-
if (latest.updatable === false) return { ok: false, error: latest.error || "\u5F53\u524D\u90E8\u7F72\u5F62\u6001\u4E0D\u652F\u6301\u81EA\u66F4\u65B0", form: latest.form };
|
|
17903
|
-
if (!latest.updateAvailable) return { ok: true, upToDate: true, version: this.guardVersion };
|
|
17904
|
-
const target = latest.latest;
|
|
17905
|
-
try {
|
|
17906
|
-
const registry = "https://registry.npmjs.org";
|
|
17907
|
-
const r = await this.dist.runNpmInstall({
|
|
17908
|
-
pkg,
|
|
17909
|
-
version: target,
|
|
17910
|
-
commandTemplate: this.config.installCommandTemplate,
|
|
17911
|
-
registry,
|
|
17912
|
-
onLine: (l) => {
|
|
17913
|
-
if (this.logger && this.logger.info) this.logger.info("[self-update] " + l);
|
|
17914
|
-
}
|
|
17915
|
-
});
|
|
17916
|
-
if (r && r.ok) {
|
|
17917
|
-
let diskVersion = null;
|
|
17918
|
-
try {
|
|
17919
|
-
diskVersion = deploy.detect().runningTarget ? this._readBinarySelfVersion() : null;
|
|
17920
|
-
} catch {
|
|
17921
|
-
}
|
|
17922
|
-
const verified = diskVersion === target;
|
|
17923
|
-
this._selfUpdateExpectedVersion = verified ? target : null;
|
|
17924
|
-
const restartRequired = true;
|
|
17925
|
-
if (this.events) {
|
|
17926
|
-
this.events.append("guard_self_update_applied", { from: this.guardVersion, version: target, pkg, diskVersion, verified });
|
|
17927
|
-
}
|
|
17928
|
-
if (!verified) {
|
|
17929
|
-
return {
|
|
17930
|
-
ok: true,
|
|
17931
|
-
from: this.guardVersion,
|
|
17932
|
-
version: target,
|
|
17933
|
-
diskVersion,
|
|
17934
|
-
verified: false,
|
|
17935
|
-
restartRequired,
|
|
17936
|
-
warn: "\u5DF2\u5B89\u88C5\u4F46\u78C1\u76D8\u7248\u672C\u6821\u9A8C\u672A\u901A\u8FC7\uFF08\u88C5\u5230\u975E\u8FD0\u884C\u4F4D/\u955C\u50CF stale\uFF09\uFF0C\u8BF7\u68C0\u67E5\u90E8\u7F72\u5F62\u6001"
|
|
17937
|
-
};
|
|
17938
|
-
}
|
|
17939
|
-
return { ok: true, from: this.guardVersion, version: target, diskVersion, verified: true, restartRequired };
|
|
17940
|
-
}
|
|
17941
|
-
return { ok: false, error: r && r.error || "npm \u5B89\u88C5\u5931\u8D25" };
|
|
17942
|
-
} catch (e) {
|
|
17943
|
-
return { ok: false, error: e.message };
|
|
17944
|
-
}
|
|
17945
|
-
}
|
|
17946
|
-
/** 自更新「已安装待重启生效」判定(A3):最近一次 apply 落盘的预期版本存在、
|
|
17947
|
-
* 且进程运行版本仍低于它 → updatePending=true(面板显示重启提示;重启达标后自动清除)。 */
|
|
17948
|
-
_selfUpdatePending() {
|
|
17949
|
-
try {
|
|
17950
|
-
const swDir = path2.dirname(this.config.stateFile);
|
|
17951
|
-
const f = path2.join(swDir, "self-update-expected.json");
|
|
17952
|
-
if (!fs2.existsSync(f)) return false;
|
|
17953
|
-
const j = JSON.parse(fs2.readFileSync(f, "utf8"));
|
|
17954
|
-
const expected = j && j.expectedVersion;
|
|
17955
|
-
if (!expected) return false;
|
|
17956
|
-
if (this.guardVersion === expected) {
|
|
17957
|
-
try {
|
|
17958
|
-
fs2.unlinkSync(f);
|
|
17959
|
-
} catch {
|
|
17960
|
-
}
|
|
17961
|
-
if (this.events) this.events.append("guard_self_update_verified", { version: expected });
|
|
17962
|
-
return false;
|
|
17963
|
-
}
|
|
17964
|
-
return semverCompare(expected, this.guardVersion) > 0;
|
|
17965
|
-
} catch {
|
|
17966
|
-
return false;
|
|
17967
|
-
}
|
|
17968
|
-
}
|
|
17969
17881
|
/** 读磁盘上**运行位**的自报版本(A1 校验用):spawn `--version`,解析 guardVersion= 行。
|
|
17970
17882
|
*
|
|
17971
17883
|
* ⚠ 2026-09-12(P0 配套):条件从 `form === 'sea-binary'` 放宽为「**可更新的标准形态**」
|
|
@@ -19642,7 +19554,6 @@ var require_supervisor = __commonJS({
|
|
|
19642
19554
|
this.manualRestart = false;
|
|
19643
19555
|
this._ticking = false;
|
|
19644
19556
|
this.intents = new IntentLedger();
|
|
19645
|
-
this._selfUpdateExpectedVersion = null;
|
|
19646
19557
|
this._stopping = false;
|
|
19647
19558
|
this._sessionState = "starting";
|
|
19648
19559
|
this._crashHalted = false;
|
|
@@ -19952,10 +19863,20 @@ var require_supervisor = __commonJS({
|
|
|
19952
19863
|
});
|
|
19953
19864
|
server.listen(port, this.config.apiHost, () => {
|
|
19954
19865
|
this.api = server;
|
|
19955
|
-
|
|
19866
|
+
const prev = this.config.apiPort;
|
|
19867
|
+
if (port !== prev) {
|
|
19868
|
+
try {
|
|
19869
|
+
ports.release(prev, "system:supervisor-api");
|
|
19870
|
+
} catch {
|
|
19871
|
+
}
|
|
19956
19872
|
this.config.apiPort = port;
|
|
19957
19873
|
if (this.configPath) this.persistConfigPatch({ apiPort: port });
|
|
19958
19874
|
}
|
|
19875
|
+
try {
|
|
19876
|
+
ports.register("supervisor-api", port);
|
|
19877
|
+
} catch (e) {
|
|
19878
|
+
this.logger.warn("ports.register(actual) \u5931\u8D25: " + e.message);
|
|
19879
|
+
}
|
|
19959
19880
|
this.events.append("api_listening", { host: this.config.apiHost, port });
|
|
19960
19881
|
this.logger.info("api listening on " + this.config.apiHost + ":" + port);
|
|
19961
19882
|
});
|
|
@@ -20210,8 +20131,6 @@ var require_supervisor = __commonJS({
|
|
|
20210
20131
|
backoffUntil: this._mBackoffUntil(),
|
|
20211
20132
|
lastFailure: this._mLastFailure(),
|
|
20212
20133
|
lastRestartAt: this._mLastRestartAt(),
|
|
20213
|
-
updatePending: this._selfUpdatePending(),
|
|
20214
|
-
// A3:更新已安装待重启生效
|
|
20215
20134
|
upgradeHold: this._upgradeHold,
|
|
20216
20135
|
commandMissing: !!(this._mSpawnBlockedUntil() && Date.now() < this._mSpawnBlockedUntil()),
|
|
20217
20136
|
dshTokenCaptured: !!(this.tokenService && this.tokenService.get("main")),
|
|
@@ -20459,6 +20378,10 @@ var require_supervisor = __commonJS({
|
|
|
20459
20378
|
server.listen(this.config.apiPort, this.config.apiHost, () => {
|
|
20460
20379
|
bind._tries = 0;
|
|
20461
20380
|
this.api = server;
|
|
20381
|
+
try {
|
|
20382
|
+
ports.register("supervisor-api", this.config.apiPort);
|
|
20383
|
+
} catch {
|
|
20384
|
+
}
|
|
20462
20385
|
this.events.append("api_listening", { host: this.config.apiHost, port: this.config.apiPort });
|
|
20463
20386
|
this.logger.info("api listening on " + this.config.apiHost + ":" + this.config.apiPort);
|
|
20464
20387
|
});
|
|
@@ -20839,7 +20762,8 @@ function findPackageRoot(start) {
|
|
|
20839
20762
|
return path.join(__dirname, "..");
|
|
20840
20763
|
}
|
|
20841
20764
|
var ROOT = findPackageRoot(__dirname);
|
|
20842
|
-
var
|
|
20765
|
+
var stateRoot = require_state_root();
|
|
20766
|
+
var SUPERVISOR_DIR = stateRoot.supervisorDir();
|
|
20843
20767
|
var USER_CONFIG = path.join(SUPERVISOR_DIR, "config.json");
|
|
20844
20768
|
var DEFAULT_CONFIG = Object.assign(
|
|
20845
20769
|
{},
|
|
@@ -20849,10 +20773,6 @@ var DEFAULT_CONFIG = Object.assign(
|
|
|
20849
20773
|
var STATE_FILE = path.join(SUPERVISOR_DIR, "state.json");
|
|
20850
20774
|
var EVENTS_FILE = path.join(SUPERVISOR_DIR, "events", "guard.events.log");
|
|
20851
20775
|
var UNIT_PATH = path.join(os.homedir(), ".config", "systemd", "user", "dsh-supervisor.service");
|
|
20852
|
-
var UNIT_TEMPLATE = path.join(ROOT, "systemd", "dsh-supervisor.service");
|
|
20853
|
-
var DESKTOP_DIR = path.join(os.homedir(), ".local", "share", "applications");
|
|
20854
|
-
var ICON_DIR = path.join(os.homedir(), ".local", "share", "icons");
|
|
20855
|
-
var DESKTOP_TEMPLATE = path.join(ROOT, "desktop", "dsh-supervisor.desktop");
|
|
20856
20776
|
var AUTOSTART_TEMPLATE = path.join(ROOT, "desktop", "dsh-supervisor-gui-autostart.desktop");
|
|
20857
20777
|
var AUTOSTART_FILE = path.join(os.homedir(), ".config", "autostart", "dsh-supervisor-gui-autostart.desktop");
|
|
20858
20778
|
var IS_WINDOWS = process.platform === "win32";
|
|
@@ -20985,6 +20905,8 @@ function releaseLock() {
|
|
|
20985
20905
|
}
|
|
20986
20906
|
}
|
|
20987
20907
|
function cmdDaemon() {
|
|
20908
|
+
const moved = stateRoot.migrateLegacy();
|
|
20909
|
+
for (const m of moved) console.log("[migrate] \u72B6\u6001\u76EE\u5F55\u8FC1\u79FB: " + m);
|
|
20988
20910
|
if (!acquireLock()) {
|
|
20989
20911
|
console.error("[supervisor] \u5DF2\u6709\u5B88\u536B\u5B9E\u4F8B\u5728\u8FD0\u884C\uFF08\u9501 " + LOCK_FILE + "\uFF09\uFF0C\u672C\u8FDB\u7A0B\u9000\u51FA\u3002");
|
|
20990
20912
|
process.exit(1);
|
|
@@ -21101,6 +21023,8 @@ function finishControl(r) {
|
|
|
21101
21023
|
}
|
|
21102
21024
|
}
|
|
21103
21025
|
function cmdInstall() {
|
|
21026
|
+
const moved = stateRoot.migrateLegacy();
|
|
21027
|
+
for (const m of moved) console.log("[migrate] \u72B6\u6001\u76EE\u5F55\u8FC1\u79FB: " + m);
|
|
21104
21028
|
fs.mkdirSync(SUPERVISOR_DIR, { recursive: true });
|
|
21105
21029
|
if (!fs.existsSync(USER_CONFIG)) {
|
|
21106
21030
|
fs.mkdirSync(SUPERVISOR_DIR, { recursive: true });
|
|
@@ -21123,50 +21047,8 @@ function cmdInstall() {
|
|
|
21123
21047
|
fs.symlinkSync(path.join(ROOT, "bin", "dsh-supervisor"), BIN_PATH);
|
|
21124
21048
|
console.log("[install] \u547D\u4EE4\u884C\u94FE\u63A5: " + BIN_PATH + " \u2192 " + __dirname + "/dsh-supervisor");
|
|
21125
21049
|
}
|
|
21126
|
-
|
|
21127
|
-
|
|
21128
|
-
console.warn("[install] \u5982\u9700 systemd \u5E38\u9A7B\uFF0C\u8BF7\u4ECE\u6E90\u7801\u4ED3\u5B89\u88C5\uFF08systemd/dsh-supervisor.service\uFF09\u6216\u624B\u52A8\u8FD0\u884C\uFF1Adsh-supervisor daemon");
|
|
21129
|
-
} else {
|
|
21130
|
-
let unit = fs.readFileSync(UNIT_TEMPLATE, "utf8");
|
|
21131
|
-
unit = unit.replace("@BIN@", BIN_PATH);
|
|
21132
|
-
const unitDir = path.dirname(UNIT_PATH);
|
|
21133
|
-
fs.mkdirSync(unitDir, { recursive: true });
|
|
21134
|
-
fs.writeFileSync(UNIT_PATH, unit);
|
|
21135
|
-
console.log("[install] systemd unit: " + UNIT_PATH);
|
|
21136
|
-
try {
|
|
21137
|
-
execInherit("systemctl", ["--user", "daemon-reload"]);
|
|
21138
|
-
execInherit("systemctl", ["--user", "enable", "dsh-supervisor.service"]);
|
|
21139
|
-
} catch (e) {
|
|
21140
|
-
console.warn("[install] systemctl \u6267\u884C\u5931\u8D25\uFF08\u53EF\u80FD\u4E0D\u5728 systemd \u4F1A\u8BDD\u4E2D\uFF09:", e.message);
|
|
21141
|
-
}
|
|
21142
|
-
try {
|
|
21143
|
-
execInherit("loginctl", ["enable-linger", os.userInfo().username]);
|
|
21144
|
-
console.log("[install] loginctl enable-linger \u5DF2\u542F\u7528");
|
|
21145
|
-
} catch {
|
|
21146
|
-
console.warn("[install] enable-linger \u5931\u8D25\uFF0C\u5F00\u673A\u81EA\u542F\u53EF\u80FD\u4E0D\u751F\u6548");
|
|
21147
|
-
}
|
|
21148
|
-
installDesktopEntry();
|
|
21149
|
-
console.log("\n\u5B89\u88C5\u5B8C\u6210\u3002\u542F\u52A8\u5B88\u536B\uFF1A\n systemctl --user start dsh-supervisor");
|
|
21150
|
-
console.log("\u67E5\u770B\u72B6\u6001\uFF1A\n dsh-supervisor status");
|
|
21151
|
-
}
|
|
21152
|
-
}
|
|
21153
|
-
function installDesktopEntry() {
|
|
21154
|
-
try {
|
|
21155
|
-
if (!fs.existsSync(DESKTOP_TEMPLATE)) return;
|
|
21156
|
-
fs.mkdirSync(ICON_DIR, { recursive: true });
|
|
21157
|
-
const shellDir = process.env.DSH_SHELL_DIR || null;
|
|
21158
|
-
const iconSrc = shellDir ? path.join(shellDir, "src-tauri", "icons", "128x128.png") : null;
|
|
21159
|
-
const iconDst = path.join(ICON_DIR, "dsh-supervisor.png");
|
|
21160
|
-
if (iconSrc && fs.existsSync(iconSrc)) fs.copyFileSync(iconSrc, iconDst);
|
|
21161
|
-
else console.warn("[install] \u672A\u627E\u5230\u58F3\u56FE\u6807\uFF08\u53EF\u8BBE DSH_SHELL_DIR \u6307\u5411\u58F3 checkout\uFF09\uFF0C\u684C\u9762\u56FE\u6807\u7F3A\u5931\uFF1B\u4E0D\u5F71\u54CD\u529F\u80FD\u3002");
|
|
21162
|
-
fs.mkdirSync(DESKTOP_DIR, { recursive: true });
|
|
21163
|
-
const entry = fs.readFileSync(DESKTOP_TEMPLATE, "utf8").replace(/@HOME@/g, os.homedir());
|
|
21164
|
-
const dst = path.join(DESKTOP_DIR, "dsh-supervisor.desktop");
|
|
21165
|
-
fs.writeFileSync(dst, entry);
|
|
21166
|
-
console.log("[install] \u684C\u9762\u83DC\u5355\u5165\u53E3: " + dst);
|
|
21167
|
-
} catch (e) {
|
|
21168
|
-
console.warn("[install] \u684C\u9762\u5165\u53E3\u90E8\u7F72\u5931\u8D25:", e.message);
|
|
21169
|
-
}
|
|
21050
|
+
console.log("[install] \u670D\u52A1\u5B9A\u4E49/\u5F00\u673A\u81EA\u542F/\u684C\u9762\u5165\u53E3\u7531\u684C\u9762\u58F3\u8D1F\u8D23\uFF08\u672C\u547D\u4EE4\u4E0D\u518D\u90E8\u7F72\uFF09\u3002");
|
|
21051
|
+
console.log("[install] \u5185\u6838\u672C\u4F53\u5DF2\u5C31\u7EEA\u3002\u542F\u52A8\u7531\u684C\u9762\u58F3\u6216\u670D\u52A1\u7BA1\u7406\u5668\u53D1\u8D77\uFF1Adsh-supervisor daemon");
|
|
21170
21052
|
}
|
|
21171
21053
|
function cmdGuiAutostart(onoff) {
|
|
21172
21054
|
if (onoff === "on") {
|
|
@@ -21276,20 +21158,16 @@ function cmdSelfUpdate(action) {
|
|
|
21276
21158
|
if (s.ok) {
|
|
21277
21159
|
console.log("\u5B88\u536B\u5F53\u524D\u7248\u672C: " + s.installed);
|
|
21278
21160
|
console.log("\u6700\u65B0\u7248\u672C: " + s.latest);
|
|
21279
|
-
console.log(s.updateAvailable ? "\u2192 \u6709\u53EF\u7528\u66F4\u65B0\
|
|
21161
|
+
console.log(s.updateAvailable ? "\u2192 \u6709\u53EF\u7528\u66F4\u65B0\uFF1A\u8BF7\u5728\u684C\u9762\u58F3\u9762\u677F\u300C\u5173\u4E8E\u300D\u4E2D\u70B9\u300C\u66F4\u65B0\u300D" : "\u5DF2\u662F\u6700\u65B0\u3002");
|
|
21280
21162
|
}
|
|
21281
21163
|
return;
|
|
21282
21164
|
}
|
|
21283
21165
|
if (action === "apply") {
|
|
21284
|
-
|
|
21285
|
-
|
|
21286
|
-
|
|
21287
|
-
console.log("\u5DF2\u66F4\u65B0\u5230 v" + r.version + (r.restartRequired ? "\uFF0C\u9700\u8981\u91CD\u542F\u5B88\u536B\u751F\u6548" : "\uFF08\u65E0\u53D8\u5316\uFF09"));
|
|
21288
|
-
console.log("\u91CD\u542F: systemctl --user restart dsh-supervisor");
|
|
21289
|
-
}
|
|
21290
|
-
return;
|
|
21166
|
+
console.error("\u5185\u6838\u66F4\u65B0\u7531\u684C\u9762\u58F3\u6267\u884C\uFF08\u5355\u5199\u5165\u8005\u5951\u7EA6\uFF09\uFF1A\u8BF7\u5728\u684C\u9762\u58F3\u9762\u677F\u300C\u5173\u4E8E\u300D\u4E2D\u70B9\u300C\u66F4\u65B0\u300D\u3002");
|
|
21167
|
+
console.error("\u672C\u547D\u4EE4\u4E0D\u518D\u5B89\u88C5\u5185\u6838\u3002");
|
|
21168
|
+
process.exit(2);
|
|
21291
21169
|
}
|
|
21292
|
-
console.log("\u7528\u6CD5: dsh-supervisor self-update [check
|
|
21170
|
+
console.log("\u7528\u6CD5: dsh-supervisor self-update [check]");
|
|
21293
21171
|
})();
|
|
21294
21172
|
}
|
|
21295
21173
|
function cmdUpgrade(requested) {
|