@dsh-enhanced/dsh-rsi-cli 0.1.48
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/LICENSE +21 -0
- package/README.md +231 -0
- package/bin/dsh-rsi.js +11 -0
- package/lib/backup.d.ts +16 -0
- package/lib/backup.d.ts.map +1 -0
- package/lib/backup.js +27 -0
- package/lib/backup.js.map +1 -0
- package/lib/diagnose.d.ts +33 -0
- package/lib/diagnose.d.ts.map +1 -0
- package/lib/diagnose.js +145 -0
- package/lib/diagnose.js.map +1 -0
- package/lib/index.d.ts +46 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +592 -0
- package/lib/index.js.map +1 -0
- package/lib/install.d.ts +33 -0
- package/lib/install.d.ts.map +1 -0
- package/lib/install.js +64 -0
- package/lib/install.js.map +1 -0
- package/lib/paths.d.ts +61 -0
- package/lib/paths.d.ts.map +1 -0
- package/lib/paths.js +168 -0
- package/lib/paths.js.map +1 -0
- package/lib/process-guard.d.ts +51 -0
- package/lib/process-guard.d.ts.map +1 -0
- package/lib/process-guard.js +143 -0
- package/lib/process-guard.js.map +1 -0
- package/lib/purge.d.ts +58 -0
- package/lib/purge.d.ts.map +1 -0
- package/lib/purge.js +204 -0
- package/lib/purge.js.map +1 -0
- package/lib/run.d.ts +27 -0
- package/lib/run.d.ts.map +1 -0
- package/lib/run.js +53 -0
- package/lib/run.js.map +1 -0
- package/lib/secrets.d.ts +22 -0
- package/lib/secrets.d.ts.map +1 -0
- package/lib/secrets.js +107 -0
- package/lib/secrets.js.map +1 -0
- package/lib/services.d.ts +89 -0
- package/lib/services.d.ts.map +1 -0
- package/lib/services.js +339 -0
- package/lib/services.js.map +1 -0
- package/lib/update.d.ts +59 -0
- package/lib/update.d.ts.map +1 -0
- package/lib/update.js +160 -0
- package/lib/update.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +2 -0
- package/lib/version.js.map +1 -0
- package/lib/weburl.d.ts +36 -0
- package/lib/weburl.d.ts.map +1 -0
- package/lib/weburl.js +106 -0
- package/lib/weburl.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weburl.d.ts","sourceRoot":"","sources":["../src/weburl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAK7C;;;;GAIG;AAEH;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAKD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,aAA6B,GACpC,OAAO,CAAC,aAAa,CAAC,CAuDxB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAW5E"}
|
package/lib/weburl.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { defaultRunner } from "./run.js";
|
|
2
|
+
import { inspectManagedService, tailLogFile } from "./services.js";
|
|
3
|
+
import { profileLogPaths, systemdUnitName, SYSTEMD_UNIT_PATTERN } from "./paths.js";
|
|
4
|
+
/**
|
|
5
|
+
* Web URL:从运行中受管服务的 journal / host 日志中解析最新一次 `dsh web:` 行,
|
|
6
|
+
* 返回带 token 的完整授权 URL。绝不关闭或绕过 Web 认证——这里只是把 DSH 已经打印
|
|
7
|
+
* 在日志里的同一行 URL 取出来,免去用户翻 journal / 猜 token。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 从一段文本中提取最新一次 `dsh web: http://host:PORT/?token=...` 完整 URL。
|
|
11
|
+
* DSH 每次启动都会打印这一行;取最后一个匹配是为了拿到最近一次重启后的 token
|
|
12
|
+
* (token 随重启变化)。没有匹配时返回 undefined。
|
|
13
|
+
*
|
|
14
|
+
* 纯函数、不读文件、不执行命令,便于单元测试覆盖正常 / 缺 token / 多行场景。
|
|
15
|
+
*/
|
|
16
|
+
export function extractWebUrlFromText(text) {
|
|
17
|
+
const matches = text.match(/dsh web:\s*https?:\/\/[^\s]+/g);
|
|
18
|
+
if (matches === null || matches.length === 0)
|
|
19
|
+
return undefined;
|
|
20
|
+
const last = matches[matches.length - 1];
|
|
21
|
+
const captured = /dsh web:\s*(https?:\/\/[^\s]+)/u.exec(last);
|
|
22
|
+
return captured?.[1];
|
|
23
|
+
}
|
|
24
|
+
/** 单次最多回看的日志行数,足够覆盖最近一次启动输出,又不会把整个 journal 读进来。 */
|
|
25
|
+
const WEB_URL_LOOKBACK_LINES = 400;
|
|
26
|
+
/**
|
|
27
|
+
* 解析一个 profile 受管服务当前有效的 Web 授权 URL。
|
|
28
|
+
*
|
|
29
|
+
* - Linux systemd --user:`journalctl --user -u dsh-profile-<profile>.service --output=cat -n N`
|
|
30
|
+
* - macOS launchd:读 `$DSH_HOME/logs/<profile>-host.log` 尾部
|
|
31
|
+
*
|
|
32
|
+
* 服务未注册时给出与 start/stop 一致的指引;服务未运行时明确提示先 start。
|
|
33
|
+
* 即使服务当前未运行,只要日志里还有历史 URL,也会返回并标注其可能已随重启失效。
|
|
34
|
+
*/
|
|
35
|
+
export async function resolveManagedWebUrl(platform, home, dshHome, profile, runner = defaultRunner) {
|
|
36
|
+
const result = { profile, errors: [] };
|
|
37
|
+
const presence = await inspectManagedService(platform, home, profile);
|
|
38
|
+
if (!presence.managed) {
|
|
39
|
+
result.notice = presence.foreign
|
|
40
|
+
? `${profile}:${presence.definitionPath} 存在但不是 dsh-enhanced 受管服务,拒绝读取。`
|
|
41
|
+
: `${profile}:尚未注册常驻服务(core/web 场景按需启动)。请运行 dsh --profile ${profile} 后使用其输出中带 token 的完整 URL;如需常驻服务,先安装 lark/supervised 场景。`;
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
let text = '';
|
|
45
|
+
if (platform === 'linux') {
|
|
46
|
+
const unit = systemdUnitName(profile);
|
|
47
|
+
if (!SYSTEMD_UNIT_PATTERN.test(unit)) {
|
|
48
|
+
result.errors.push(`${profile}:非法 profile 名。`);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
const active = runner('systemctl', ['--user', 'is-active', unit]);
|
|
52
|
+
const activeValue = active.stdout.trim();
|
|
53
|
+
const journal = runner('journalctl', ['--user', '-u', unit, '--output=cat', '-n', String(WEB_URL_LOOKBACK_LINES)]);
|
|
54
|
+
if (journal.status !== 0) {
|
|
55
|
+
result.errors.push(`${profile}:无法读取 journal:${journal.stderr.trim() || `journalctl 退出码 ${journal.status}`}`);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
text = journal.stdout;
|
|
59
|
+
result.source = `journalctl --user -u ${unit}`;
|
|
60
|
+
if (activeValue !== 'active') {
|
|
61
|
+
result.notice = `${profile}:受管服务当前状态为「${activeValue || 'unknown'}」,先运行 dsh-rsi start --profile ${profile};下面是日志中最近一次的 URL,重启后会变化。`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else if (platform === 'darwin') {
|
|
65
|
+
const [stdoutLog] = profileLogPaths(dshHome, profile);
|
|
66
|
+
if (stdoutLog === undefined) {
|
|
67
|
+
result.errors.push(`${profile}:无法解析 host 日志路径。`);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const tail = await tailLogFile(stdoutLog, WEB_URL_LOOKBACK_LINES);
|
|
71
|
+
text = tail.lines.join('\n');
|
|
72
|
+
result.source = stdoutLog;
|
|
73
|
+
if (tail.empty) {
|
|
74
|
+
result.notice = `${profile}:日志 ${stdoutLog} 为空;先运行 dsh-rsi start --profile ${profile} 或直接 dsh --profile ${profile}。`;
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
result.errors.push(`${profile}:当前平台 ${platform} 没有受管常驻服务。`);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
const url = extractWebUrlFromText(text);
|
|
83
|
+
if (url !== undefined) {
|
|
84
|
+
result.url = url;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
result.notice = (result.notice ? `${result.notice} ` : '')
|
|
88
|
+
+ `${profile}:在最近 ${WEB_URL_LOOKBACK_LINES} 行日志中未找到 \`dsh web:\` 行;服务可能仍在启动,稍后重试或运行 dsh-rsi logs --profile ${profile}。`;
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
export function formatWebUrlResult(entries) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (entry.url !== undefined) {
|
|
96
|
+
lines.push(`${entry.profile}:${entry.url}`);
|
|
97
|
+
lines.push(` 来源:${entry.source}`);
|
|
98
|
+
}
|
|
99
|
+
if (entry.notice !== undefined)
|
|
100
|
+
lines.push(`${entry.profile}:${entry.notice}`);
|
|
101
|
+
for (const error of entry.errors)
|
|
102
|
+
lines.push(`${entry.profile}:! ${error}`);
|
|
103
|
+
}
|
|
104
|
+
return lines.length > 0 ? lines.join('\n') : 'Web URL:未找到任何 profile。';
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=weburl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weburl.js","sourceRoot":"","sources":["../src/weburl.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dsh-enhanced/dsh-rsi-cli",
|
|
3
|
+
"version": "0.1.48",
|
|
4
|
+
"description": "Global dsh-rsi command: status, doctor, web-url, and full purge for DSH enhanced plugin installations.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./lib/index.js",
|
|
8
|
+
"types": "./lib/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"dsh-rsi": "./bin/dsh-rsi.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./lib/index.d.ts",
|
|
15
|
+
"default": "./lib/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./package.json": "./package.json"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"bin",
|
|
21
|
+
"lib",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/22-ai-00/dsh-enhanced.git",
|
|
34
|
+
"directory": "packages/dsh-rsi-cli"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"deepseek",
|
|
38
|
+
"deepseek-harness",
|
|
39
|
+
"purge",
|
|
40
|
+
"uninstall",
|
|
41
|
+
"diagnostics",
|
|
42
|
+
"cli"
|
|
43
|
+
],
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "22.20.0",
|
|
46
|
+
"typescript": "6.0.3",
|
|
47
|
+
"vitest": "4.1.8"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -p tsconfig.build.json",
|
|
51
|
+
"test": "vitest run",
|
|
52
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
53
|
+
}
|
|
54
|
+
}
|