dsh-zen-remote 2.3.11 → 2.4.0
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/CHANGELOG.md +39 -78
- package/README.md +94 -84
- package/README.zh-CN.md +90 -81
- package/bin/zen-remote.mjs +5 -0
- package/docs/interface.md +6 -6
- package/docs/remote-access.en.md +6 -4
- package/docs/remote-access.md +6 -4
- package/dsh-push.mjs +96 -10
- package/lib/adapters/dsh-better-sidebar/index.js +7 -3
- package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
- package/lib/admin-routes.js +10 -2
- package/lib/admin-routes.js.map +1 -1
- package/lib/cli/args.js +251 -0
- package/lib/cli/args.js.map +1 -0
- package/lib/cli/bootstrap.js +449 -0
- package/lib/cli/bootstrap.js.map +1 -0
- package/lib/cli/command-setup.js +484 -0
- package/lib/cli/command-setup.js.map +1 -0
- package/lib/cli/commands-client.js +359 -0
- package/lib/cli/commands-client.js.map +1 -0
- package/lib/cli/commands-host.js +1108 -0
- package/lib/cli/commands-host.js.map +1 -0
- package/lib/cli/commands-status.js +279 -0
- package/lib/cli/commands-status.js.map +1 -0
- package/lib/cli/config-writer.js +334 -0
- package/lib/cli/config-writer.js.map +1 -0
- package/lib/cli/context.js +10 -0
- package/lib/cli/context.js.map +1 -0
- package/lib/cli/i18n.js +620 -0
- package/lib/cli/i18n.js.map +1 -0
- package/lib/cli/ipc-client.js +160 -0
- package/lib/cli/ipc-client.js.map +1 -0
- package/lib/cli/ipc-server.js +464 -0
- package/lib/cli/ipc-server.js.map +1 -0
- package/lib/cli/main.js +245 -0
- package/lib/cli/main.js.map +1 -0
- package/lib/cli/qr-terminal.js +48 -0
- package/lib/cli/qr-terminal.js.map +1 -0
- package/lib/client-data/qr.js +286 -0
- package/lib/client-data/qr.js.map +1 -0
- package/lib/client-routes.js +308 -25
- package/lib/client-routes.js.map +1 -1
- package/lib/client.js +1013 -229
- package/lib/config.js +50 -12
- package/lib/config.js.map +1 -1
- package/lib/debug-report.js +28 -1
- package/lib/debug-report.js.map +1 -1
- package/lib/fetch-route-intercept.js +334 -26
- package/lib/fetch-route-intercept.js.map +1 -1
- package/lib/index.js +564 -363
- package/lib/index.js.map +1 -1
- package/lib/intercept.js +1833 -280
- package/lib/intercept.js.map +1 -1
- package/lib/lan-gate-server.cjs +36 -10
- package/lib/merge-streams.js +103 -11
- package/lib/merge-streams.js.map +1 -1
- package/lib/plugin-route-intercept.js +93 -63
- package/lib/plugin-route-intercept.js.map +1 -1
- package/lib/relay-access.js +8 -1
- package/lib/relay-access.js.map +1 -1
- package/lib/relay-client.js +133 -4
- package/lib/relay-client.js.map +1 -1
- package/lib/relay-pool.js +275 -0
- package/lib/relay-pool.js.map +1 -0
- package/lib/relay-server.js +269 -17
- package/lib/relay-server.js.map +1 -1
- package/lib/restart-fields.js +6 -4
- package/lib/restart-fields.js.map +1 -1
- package/lib/share-store.js +65 -27
- package/lib/share-store.js.map +1 -1
- package/lib/state-store.js +400 -0
- package/lib/state-store.js.map +1 -0
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
- package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
- package/lib/types/admin-routes.d.ts.map +1 -1
- package/lib/types/cli/args.d.ts +78 -0
- package/lib/types/cli/args.d.ts.map +1 -0
- package/lib/types/cli/bootstrap.d.ts +170 -0
- package/lib/types/cli/bootstrap.d.ts.map +1 -0
- package/lib/types/cli/command-setup.d.ts +72 -0
- package/lib/types/cli/command-setup.d.ts.map +1 -0
- package/lib/types/cli/commands-client.d.ts +36 -0
- package/lib/types/cli/commands-client.d.ts.map +1 -0
- package/lib/types/cli/commands-host.d.ts +82 -0
- package/lib/types/cli/commands-host.d.ts.map +1 -0
- package/lib/types/cli/commands-status.d.ts +46 -0
- package/lib/types/cli/commands-status.d.ts.map +1 -0
- package/lib/types/cli/config-writer.d.ts +92 -0
- package/lib/types/cli/config-writer.d.ts.map +1 -0
- package/lib/types/cli/context.d.ts +39 -0
- package/lib/types/cli/context.d.ts.map +1 -0
- package/lib/types/cli/i18n.d.ts +32 -0
- package/lib/types/cli/i18n.d.ts.map +1 -0
- package/lib/types/cli/ipc-client.d.ts +83 -0
- package/lib/types/cli/ipc-client.d.ts.map +1 -0
- package/lib/types/cli/ipc-server.d.ts +113 -0
- package/lib/types/cli/ipc-server.d.ts.map +1 -0
- package/lib/types/cli/main.d.ts +57 -0
- package/lib/types/cli/main.d.ts.map +1 -0
- package/lib/types/cli/qr-terminal.d.ts +17 -0
- package/lib/types/cli/qr-terminal.d.ts.map +1 -0
- package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
- package/lib/types/client/current-session-report.d.ts +4 -0
- package/lib/types/client/current-session-report.d.ts.map +1 -1
- package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
- package/lib/types/client/effects/remote-session.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +47 -3
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
- package/lib/types/client/settings/settings-css.d.ts +1 -1
- package/lib/types/client/settings/settings-css.d.ts.map +1 -1
- package/lib/types/client/styles/remote-session.css.d.ts +1 -1
- package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
- package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
- package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
- package/lib/types/client/wizard/wizard-css.d.ts +1 -1
- package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
- package/lib/types/client-data/model-group-side.d.ts +23 -2
- package/lib/types/client-data/model-group-side.d.ts.map +1 -1
- package/lib/types/client-data/remote-status.d.ts +47 -1
- package/lib/types/client-data/remote-status.d.ts.map +1 -1
- package/lib/types/client-data/settings-form.d.ts +85 -1
- package/lib/types/client-data/settings-form.d.ts.map +1 -1
- package/lib/types/client-data/wizard.d.ts +56 -1
- package/lib/types/client-data/wizard.d.ts.map +1 -1
- package/lib/types/client-routes.d.ts +25 -1
- package/lib/types/client-routes.d.ts.map +1 -1
- package/lib/types/config.d.ts +40 -14
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/debug-report.d.ts.map +1 -1
- package/lib/types/fetch-route-intercept.d.ts +66 -8
- package/lib/types/fetch-route-intercept.d.ts.map +1 -1
- package/lib/types/index.d.ts +9 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/intercept.d.ts +72 -10
- package/lib/types/intercept.d.ts.map +1 -1
- package/lib/types/merge-streams.d.ts +79 -1
- package/lib/types/merge-streams.d.ts.map +1 -1
- package/lib/types/plugin-route-intercept.d.ts +25 -9
- package/lib/types/plugin-route-intercept.d.ts.map +1 -1
- package/lib/types/relay-access.d.ts +3 -1
- package/lib/types/relay-access.d.ts.map +1 -1
- package/lib/types/relay-client.d.ts +23 -2
- package/lib/types/relay-client.d.ts.map +1 -1
- package/lib/types/relay-pool.d.ts +148 -0
- package/lib/types/relay-pool.d.ts.map +1 -0
- package/lib/types/relay-server.d.ts +30 -3
- package/lib/types/relay-server.d.ts.map +1 -1
- package/lib/types/restart-fields.d.ts +5 -5
- package/lib/types/restart-fields.d.ts.map +1 -1
- package/lib/types/share-store.d.ts.map +1 -1
- package/lib/types/state-store.d.ts +179 -0
- package/lib/types/state-store.d.ts.map +1 -0
- package/lib/types/upload-limits.d.ts +15 -0
- package/lib/types/upload-limits.d.ts.map +1 -1
- package/lib/types/virtual-id.d.ts +21 -0
- package/lib/types/virtual-id.d.ts.map +1 -1
- package/lib/types/wizard/probe.d.ts.map +1 -1
- package/lib/types/wizard/proxy-snippets.d.ts +3 -0
- package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
- package/lib/types/wizard/routes.d.ts +1 -0
- package/lib/types/wizard/routes.d.ts.map +1 -1
- package/lib/types/wizard/status.d.ts +9 -0
- package/lib/types/wizard/status.d.ts.map +1 -1
- package/lib/types/wizard/verify.d.ts +3 -0
- package/lib/types/wizard/verify.d.ts.map +1 -1
- package/lib/upload-limits.js +15 -0
- package/lib/upload-limits.js.map +1 -1
- package/lib/virtual-id.js +60 -0
- package/lib/virtual-id.js.map +1 -1
- package/lib/wizard/probe.js +46 -1
- package/lib/wizard/probe.js.map +1 -1
- package/lib/wizard/proxy-snippets.js +14 -1
- package/lib/wizard/proxy-snippets.js.map +1 -1
- package/lib/wizard/routes.js +23 -4
- package/lib/wizard/routes.js.map +1 -1
- package/lib/wizard/status.js +21 -0
- package/lib/wizard/status.js.map +1 -1
- package/lib/wizard/verify.js +31 -8
- package/lib/wizard/verify.js.map +1 -1
- package/package.json +8 -4
- package/pwa/icons/badge-96.png +0 -0
- package/pwa/icons/badge.svg +1 -0
- package/pwa/manifest.json +2 -1
- package/pwa/sw.js +3 -1
- package/scripts/check-debug-report.mjs +41 -1
- package/scripts/check-settings-form.mjs +14 -3
- package/scripts/check-settings-view.mjs +247 -0
- package/scripts/check-wizard-ui.mjs +37 -0
- package/src/adapters/dsh-better-sidebar/index.ts +7 -3
- package/src/admin-routes.ts +10 -2
- package/src/cli/args.ts +289 -0
- package/src/cli/bootstrap.ts +569 -0
- package/src/cli/command-setup.ts +540 -0
- package/src/cli/commands-client.ts +369 -0
- package/src/cli/commands-host.ts +1127 -0
- package/src/cli/commands-status.ts +296 -0
- package/src/cli/config-writer.ts +354 -0
- package/src/cli/context.ts +38 -0
- package/src/cli/i18n.ts +645 -0
- package/src/cli/ipc-client.ts +216 -0
- package/src/cli/ipc-server.ts +531 -0
- package/src/cli/main.ts +285 -0
- package/src/cli/qr-terminal.ts +49 -0
- package/src/client/RemoteStatusIcon.tsx +4 -1
- package/src/client/current-session-report.ts +28 -4
- package/src/client/effects/model-group-side.ts +19 -5
- package/src/client/effects/remote-session.ts +26 -6
- package/src/client/locales.ts +96 -6
- package/src/client/settings/SettingsSection.tsx +287 -92
- package/src/client/settings/settings-css.ts +18 -0
- package/src/client/styles/remote-session.css.ts +15 -1
- package/src/client/wizard/GatewayWizard.tsx +470 -109
- package/src/client/wizard/cards/ProxyCard.tsx +2 -1
- package/src/client/wizard/wizard-css.ts +23 -0
- package/src/client-data/model-group-side.ts +37 -10
- package/src/client-data/remote-status.ts +112 -17
- package/src/client-data/settings-form.ts +164 -8
- package/src/client-data/wizard.ts +112 -2
- package/src/client-routes.ts +334 -26
- package/src/config.ts +62 -16
- package/src/debug-report.ts +27 -1
- package/src/fetch-route-intercept.ts +381 -32
- package/src/index.ts +566 -367
- package/src/intercept.ts +1866 -286
- package/src/merge-streams.ts +155 -10
- package/src/plugin-route-intercept.ts +120 -71
- package/src/relay-access.ts +14 -3
- package/src/relay-client.ts +163 -5
- package/src/relay-pool.ts +387 -0
- package/src/relay-server.ts +312 -16
- package/src/restart-fields.ts +6 -4
- package/src/share-store.ts +59 -26
- package/src/state-store.ts +428 -0
- package/src/upload-limits.ts +16 -0
- package/src/virtual-id.ts +57 -0
- package/src/wizard/probe.ts +54 -2
- package/src/wizard/proxy-snippets.ts +17 -2
- package/src/wizard/routes.ts +24 -5
- package/src/wizard/status.ts +28 -0
- package/src/wizard/verify.ts +33 -11
- package/AGENTS.md +0 -185
- package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
- package/docs/adr/0002-relay-emulates-websocket.md +0 -8
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-2 bootstrap: everything a CLI session needs BEFORE any subcommand
|
|
3
|
+
* logic runs — interactive prompting, candidate-profile scanning with the
|
|
4
|
+
* multi-select plugin install, and bringing a DSH instance up.
|
|
5
|
+
*
|
|
6
|
+
* Three injectable seams keep this testable without a real terminal or a
|
|
7
|
+
* real daemon (SPEC's test seam three): a `CliPrompter` the tests replace
|
|
8
|
+
* with fakes, a `spawnCommand` the tests record instead of running
|
|
9
|
+
* `dsh plugin add`, and an `execProbe` the tests substitute for systemctl /
|
|
10
|
+
* launchctl / open. The real implementations sit next to them in this file
|
|
11
|
+
* and exercise the very same code paths.
|
|
12
|
+
*
|
|
13
|
+
* The non-interactive iron rule lives here: with `!isTTY` or `--yes`, a
|
|
14
|
+
* question with no command-line answer throws `MissingRequiredOptionError`
|
|
15
|
+
* IMMEDIATELY — a headless run must fail fast and legibly, never hang on a
|
|
16
|
+
* stdin read nothing will ever answer.
|
|
17
|
+
*/
|
|
18
|
+
import { execFile } from 'node:child_process';
|
|
19
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { createInterface } from 'node:readline/promises';
|
|
22
|
+
import { createCliIpcClient, discoverCliSockets } from './ipc-client.js';
|
|
23
|
+
import { createTranslator, resolveCliLang } from './i18n.js';
|
|
24
|
+
/** Raised when a required value is missing in a run that must not prompt
|
|
25
|
+
* (`!isTTY` or `--yes`). Carries the option name so the top level can render
|
|
26
|
+
* one precise bilingual line instead of a stack trace. */
|
|
27
|
+
export class MissingRequiredOptionError extends Error {
|
|
28
|
+
optionName;
|
|
29
|
+
constructor(optionName) {
|
|
30
|
+
super(`missing required option: --${optionName}`);
|
|
31
|
+
this.name = 'MissingRequiredOptionError';
|
|
32
|
+
this.optionName = optionName;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** The interactivity verdict every prompt flows through: a TTY and no
|
|
36
|
+
* `--yes`. One function so the rule has exactly one home. */
|
|
37
|
+
export function isInteractiveSession(args, isTty) {
|
|
38
|
+
return isTty && !args.options.yes;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* One ask-everything funnel: a command-line-provided (or caller-default)
|
|
42
|
+
* value answers directly; otherwise interactive runs prompt, and
|
|
43
|
+
* non-interactive runs throw {@link MissingRequiredOptionError} naming the
|
|
44
|
+
* option — before any await that could hang.
|
|
45
|
+
*/
|
|
46
|
+
export async function promptOrFail(params) {
|
|
47
|
+
if (params.provided !== undefined)
|
|
48
|
+
return params.provided;
|
|
49
|
+
if (!params.interactive)
|
|
50
|
+
throw new MissingRequiredOptionError(params.optionName);
|
|
51
|
+
return params.ask();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The default `CliPrompter` over `node:readline/promises`. Scaffold strings
|
|
55
|
+
* (the "pick a number" hints) go through the translator like everything
|
|
56
|
+
* else; questions and choices arrive pre-translated from the callers.
|
|
57
|
+
*/
|
|
58
|
+
export function createReadlinePrompter(input, output, t) {
|
|
59
|
+
const translator = t ?? createTranslator(resolveCliLang(undefined));
|
|
60
|
+
const out = output ?? process.stdout;
|
|
61
|
+
const rl = createInterface({ input: input ?? process.stdin, output: out });
|
|
62
|
+
const write = (text) => { out.write(text); };
|
|
63
|
+
const ask = async (prompt) => (await rl.question(prompt)).trim();
|
|
64
|
+
return {
|
|
65
|
+
async selectOne(question, choices, defaultIndex) {
|
|
66
|
+
write(`\n? ${question}\n`);
|
|
67
|
+
choices.forEach((choice, i) => write(` ${i + 1}. ${choice}${i === defaultIndex ? `(${translator('prompt.defaultLabel')})` : ''}\n`));
|
|
68
|
+
while (true) {
|
|
69
|
+
const line = await ask(translator('prompt.selectOne', { max: choices.length, default: defaultIndex + 1 }));
|
|
70
|
+
if (line === '')
|
|
71
|
+
return defaultIndex;
|
|
72
|
+
const picked = Number.parseInt(line, 10);
|
|
73
|
+
if (Number.isInteger(picked) && picked >= 1 && picked <= choices.length)
|
|
74
|
+
return picked - 1;
|
|
75
|
+
write(`${translator('prompt.invalid', { value: line })}\n`);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
async selectMulti(question, choices, defaultIndices, allowCustomInput = false) {
|
|
79
|
+
write(`\n? ${question}\n`);
|
|
80
|
+
const defaults = new Set(defaultIndices);
|
|
81
|
+
choices.forEach((choice, i) => write(` ${defaults.has(i) ? '[x]' : '[ ]'} ${i + 1}. ${choice}\n`));
|
|
82
|
+
if (allowCustomInput)
|
|
83
|
+
write(`${translator('prompt.customEntryLine', { entry: translator('install.customEntry') })}\n`);
|
|
84
|
+
while (true) {
|
|
85
|
+
const line = await ask(allowCustomInput ? translator('prompt.multiInputCustom') : translator('prompt.multiInputPlain'));
|
|
86
|
+
if (line === '')
|
|
87
|
+
return { indices: [...defaultIndices], customNames: [] };
|
|
88
|
+
const indices = [];
|
|
89
|
+
let wantsCustom = false;
|
|
90
|
+
let valid = true;
|
|
91
|
+
for (const token of line.split(/[,\s]+/u).filter((part) => part !== '')) {
|
|
92
|
+
if (allowCustomInput && /^[aA]$/u.test(token)) {
|
|
93
|
+
wantsCustom = true;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const picked = Number.parseInt(token, 10);
|
|
97
|
+
if (!Number.isInteger(picked) || picked < 1 || picked > choices.length) {
|
|
98
|
+
valid = false;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (!indices.includes(picked - 1))
|
|
102
|
+
indices.push(picked - 1);
|
|
103
|
+
}
|
|
104
|
+
if (!valid) {
|
|
105
|
+
write(`${translator('prompt.invalid', { value: line })}\n`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const customNames = [];
|
|
109
|
+
if (wantsCustom) {
|
|
110
|
+
while (true) {
|
|
111
|
+
const name = await ask(translator('prompt.customName'));
|
|
112
|
+
if (name === '')
|
|
113
|
+
break;
|
|
114
|
+
if (!customNames.includes(name))
|
|
115
|
+
customNames.push(name);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { indices, customNames };
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
async inputText(question, defaultValue, validate) {
|
|
122
|
+
write('\n');
|
|
123
|
+
while (true) {
|
|
124
|
+
const suffix = defaultValue === undefined ? '' : `(${translator('prompt.defaultLabel')}:${defaultValue})`;
|
|
125
|
+
const line = await ask(`? ${question}${suffix} `);
|
|
126
|
+
const value = line === '' ? (defaultValue ?? '') : line;
|
|
127
|
+
const problem = validate?.(value);
|
|
128
|
+
if (problem !== undefined) {
|
|
129
|
+
write(`${problem}\n`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (value === '' && defaultValue === undefined) {
|
|
133
|
+
write(`${translator('prompt.requiredEmpty')}\n`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
async confirm(question, defaultYes = true) {
|
|
140
|
+
write('\n');
|
|
141
|
+
while (true) {
|
|
142
|
+
const line = await ask(`? ${question} ${defaultYes ? translator('prompt.confirmY') : translator('prompt.confirmN')} `);
|
|
143
|
+
if (line === '')
|
|
144
|
+
return defaultYes;
|
|
145
|
+
const lower = line.toLowerCase();
|
|
146
|
+
if (lower === 'y' || lower === 'yes')
|
|
147
|
+
return true;
|
|
148
|
+
if (lower === 'n' || lower === 'no')
|
|
149
|
+
return false;
|
|
150
|
+
write(`${translator('prompt.invalid', { value: line })}\n`);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
close() {
|
|
154
|
+
rl.close();
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Does this profile's package.json carry the plugin — either as a plain
|
|
159
|
+
* dependency or in `dsh.profile.bundles` (array or name-keyed map)? A
|
|
160
|
+
* missing or unparsable package.json is simply "not installed". */
|
|
161
|
+
function profileHasPlugin(profileDir) {
|
|
162
|
+
try {
|
|
163
|
+
const parsed = JSON.parse(readFileSync(join(profileDir, 'package.json'), 'utf8'));
|
|
164
|
+
if (parsed === null || typeof parsed !== 'object')
|
|
165
|
+
return false;
|
|
166
|
+
const pkg = parsed;
|
|
167
|
+
if (pkg.dependencies !== undefined && typeof pkg.dependencies === 'object' && 'dsh-zen-remote' in pkg.dependencies)
|
|
168
|
+
return true;
|
|
169
|
+
const bundles = pkg.dsh?.profile?.bundles;
|
|
170
|
+
if (Array.isArray(bundles) && bundles.includes('dsh-zen-remote'))
|
|
171
|
+
return true;
|
|
172
|
+
if (bundles !== null && typeof bundles === 'object' && !Array.isArray(bundles) && 'dsh-zen-remote' in bundles)
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
catch { /* no package.json or unreadable — not installed */ }
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The installable profiles under `<dshHome>/profiles/`: real directories,
|
|
180
|
+
* excluding `desktop` (the DSH app manages it and `dsh plugin` must not
|
|
181
|
+
* touch it), `node_modules`, and dot-hidden entries. `web` is ALWAYS at
|
|
182
|
+
* index 0 — synthesized when the directory does not exist yet — so both the
|
|
183
|
+
* prompt's default check and the preferred-profile rule can rely on it.
|
|
184
|
+
*/
|
|
185
|
+
export function scanCandidateProfiles(dshHome) {
|
|
186
|
+
const found = [];
|
|
187
|
+
let entries = [];
|
|
188
|
+
try {
|
|
189
|
+
entries = readdirSync(join(dshHome, 'profiles'), { withFileTypes: true });
|
|
190
|
+
}
|
|
191
|
+
catch { /* no profiles directory — only the synthesized web remains */ }
|
|
192
|
+
for (const entry of entries) {
|
|
193
|
+
if (!entry.isDirectory())
|
|
194
|
+
continue;
|
|
195
|
+
if (entry.name === 'desktop' || entry.name === 'node_modules' || entry.name.startsWith('.'))
|
|
196
|
+
continue;
|
|
197
|
+
found.push({ name: entry.name, installed: profileHasPlugin(join(dshHome, 'profiles', entry.name)) });
|
|
198
|
+
}
|
|
199
|
+
const webIndex = found.findIndex((profile) => profile.name === 'web');
|
|
200
|
+
if (webIndex > 0) {
|
|
201
|
+
const [web] = found.splice(webIndex, 1);
|
|
202
|
+
if (web !== undefined)
|
|
203
|
+
found.unshift(web);
|
|
204
|
+
}
|
|
205
|
+
else if (webIndex === -1) {
|
|
206
|
+
found.unshift({ name: 'web', installed: false });
|
|
207
|
+
}
|
|
208
|
+
return found;
|
|
209
|
+
}
|
|
210
|
+
function pickPreferredProfile(profiles) {
|
|
211
|
+
return profiles.includes('web') ? 'web' : profiles[0];
|
|
212
|
+
}
|
|
213
|
+
/** The real `dsh plugin add` runner: exit code as a number, spawn failures
|
|
214
|
+
* (ENOENT — no `dsh` on PATH) count as code 1. */
|
|
215
|
+
function spawnDshPluginAdd(command, args) {
|
|
216
|
+
return new Promise((resolve) => {
|
|
217
|
+
execFile(command, [...args], { timeout: 120_000 }, (error) => {
|
|
218
|
+
if (error === undefined) {
|
|
219
|
+
resolve(0);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const code = error.code;
|
|
223
|
+
resolve(typeof code === 'number' ? code : 1);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Make sure `dsh-zen-remote` is installed into at least one usable profile:
|
|
229
|
+
* explicit `--profile` wins; otherwise an already-installed profile ends the
|
|
230
|
+
* flow; otherwise an interactive TTY multi-selects from the candidate scan
|
|
231
|
+
* (default-checked `web`, manual names welcome) and a non-interactive run
|
|
232
|
+
* defaults to `web`. Each selected profile gets
|
|
233
|
+
* `dsh plugin --profile <name> add dsh-zen-remote`; a failure prints the
|
|
234
|
+
* verbatim manual command and reports `install-failed`. `desktop` is
|
|
235
|
+
* refused everywhere — the DeepSeek Harness app owns that profile.
|
|
236
|
+
*/
|
|
237
|
+
export async function ensurePluginInstalled(options) {
|
|
238
|
+
const t = options.t ?? createTranslator(resolveCliLang(undefined));
|
|
239
|
+
const out = options.stdout ?? process.stdout;
|
|
240
|
+
const spawn = options.spawnCommand ?? spawnDshPluginAdd;
|
|
241
|
+
const interactive = options.interactive ?? false;
|
|
242
|
+
const desktopIn = (names) => names.filter((name) => name === 'desktop');
|
|
243
|
+
const refused = (targets, selectedBy) => {
|
|
244
|
+
const offending = desktopIn(targets);
|
|
245
|
+
out.write(`${t('err.desktopProfile', { profiles: offending.join(', ') })}\n`);
|
|
246
|
+
return { ok: false, code: 'desktop-refused', targets, preferredProfile: pickPreferredProfile(targets), installedNow: [], selectedBy };
|
|
247
|
+
};
|
|
248
|
+
let targets;
|
|
249
|
+
let selectedBy;
|
|
250
|
+
if (options.profileFlag !== undefined) {
|
|
251
|
+
targets = options.profileFlag.map((name) => name.trim()).filter((name) => name !== '');
|
|
252
|
+
selectedBy = 'flag';
|
|
253
|
+
if (desktopIn(targets).length > 0)
|
|
254
|
+
return refused(targets, selectedBy);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const candidates = scanCandidateProfiles(options.dshHome);
|
|
258
|
+
const installed = candidates.filter((profile) => profile.installed).map((profile) => profile.name);
|
|
259
|
+
if (installed.length > 0) {
|
|
260
|
+
out.write(`${t('install.installed', { profiles: installed.join(', ') })}\n`);
|
|
261
|
+
return { ok: true, code: 'ok', targets: installed, preferredProfile: pickPreferredProfile(installed), installedNow: [], selectedBy: 'already-installed' };
|
|
262
|
+
}
|
|
263
|
+
out.write(`${t('install.noneInstalled')}\n`);
|
|
264
|
+
if (interactive && options.prompter !== undefined) {
|
|
265
|
+
const selection = await options.prompter.selectMulti(t('install.selectQuestion'), candidates.map((profile) => profile.name), [0], true);
|
|
266
|
+
const chosen = selection.indices
|
|
267
|
+
.map((index) => candidates[index]?.name)
|
|
268
|
+
.filter((name) => name !== undefined);
|
|
269
|
+
const custom = selection.customNames.map((name) => name.trim()).filter((name) => name !== '');
|
|
270
|
+
targets = [...chosen, ...custom];
|
|
271
|
+
selectedBy = 'prompt';
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
targets = ['web'];
|
|
275
|
+
selectedBy = 'default';
|
|
276
|
+
}
|
|
277
|
+
if (desktopIn(targets).length > 0)
|
|
278
|
+
return refused(targets, selectedBy);
|
|
279
|
+
if (targets.length === 0) {
|
|
280
|
+
return { ok: false, code: 'no-profiles', targets, preferredProfile: undefined, installedNow: [], selectedBy };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const installedNow = [];
|
|
284
|
+
for (const profile of targets) {
|
|
285
|
+
out.write(`${t('install.running', { profile })}\n`);
|
|
286
|
+
let code;
|
|
287
|
+
try {
|
|
288
|
+
code = await spawn('dsh', ['plugin', '--profile', profile, 'add', 'dsh-zen-remote']);
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
code = 1;
|
|
292
|
+
}
|
|
293
|
+
if (code !== 0) {
|
|
294
|
+
const manualCommand = `dsh plugin --profile ${profile} add dsh-zen-remote`;
|
|
295
|
+
out.write(`${t('install.failed', { profile, code, command: manualCommand })}\n`);
|
|
296
|
+
return { ok: false, code: 'install-failed', targets, preferredProfile: pickPreferredProfile(targets), installedNow, selectedBy, failedProfile: profile, manualCommand };
|
|
297
|
+
}
|
|
298
|
+
installedNow.push(profile);
|
|
299
|
+
}
|
|
300
|
+
out.write(`${t('install.done', { profiles: installedNow.join(', ') })}\n`);
|
|
301
|
+
return { ok: true, code: 'ok', targets, preferredProfile: pickPreferredProfile(targets), installedNow, selectedBy };
|
|
302
|
+
}
|
|
303
|
+
const DEFAULT_WAIT_SECONDS = 20;
|
|
304
|
+
const POLL_INTERVAL_MS = 300;
|
|
305
|
+
const DEFAULT_MACOS_APP_PATH = '/Applications/DeepSeek Harness.app';
|
|
306
|
+
const DEFAULT_SYSTEM_UNIT_DIR = '/etc/systemd/system';
|
|
307
|
+
const MACOS_LAUNCHD_LABEL = 'ai.deepseek.dsh.web';
|
|
308
|
+
function execProbeReal(command, args) {
|
|
309
|
+
return new Promise((resolve) => {
|
|
310
|
+
execFile(command, [...args], { timeout: 10_000 }, (error, stdout) => {
|
|
311
|
+
if (error === undefined) {
|
|
312
|
+
resolve({ code: 0, stdout: String(stdout ?? '') });
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const code = error.code;
|
|
316
|
+
resolve({ code: typeof code === 'number' ? code : 127, stdout: String(error.stdout ?? '') });
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
321
|
+
/** First `dsh*.service` name in a systemd unit directory, or `undefined`. */
|
|
322
|
+
function listSystemUnits(dir) {
|
|
323
|
+
try {
|
|
324
|
+
for (const name of readdirSync(dir)) {
|
|
325
|
+
if (/^dsh[\w@.-]*\.service$/u.test(name))
|
|
326
|
+
return name;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch { /* no system unit dir on this machine */ }
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Try to bring a daemon-managed DSH up, strictly by EXISTING service units —
|
|
334
|
+
* the CLI never daemonizes on its own (a second supervisor would fight the
|
|
335
|
+
* user's own setup). Returns whether a start command ran and succeeded.
|
|
336
|
+
* Linux: systemd user unit `dsh*.service`, else a system-level one.
|
|
337
|
+
* macOS: the launchd label, else the app bundle in /Applications.
|
|
338
|
+
* Windows (and everything unmatched): nothing to try — manual guidance.
|
|
339
|
+
*/
|
|
340
|
+
async function triggerDaemon(platform, ctx) {
|
|
341
|
+
if (platform === 'linux') {
|
|
342
|
+
const userUnits = await ctx.execProbe('systemctl', ['--user', 'list-unit-files', 'dsh*']);
|
|
343
|
+
const unit = userUnits.code === 0
|
|
344
|
+
? /(?:^|\s)(dsh[\w@.-]*\.service)\b/u.exec(userUnits.stdout)?.[1]
|
|
345
|
+
: undefined;
|
|
346
|
+
if (unit !== undefined) {
|
|
347
|
+
ctx.out.write(`${ctx.t('launch.linuxUserUnit', { unit })}\n`);
|
|
348
|
+
const started = await ctx.execProbe('systemctl', ['--user', 'start', unit]);
|
|
349
|
+
return started.code === 0;
|
|
350
|
+
}
|
|
351
|
+
const systemUnit = listSystemUnits(ctx.systemUnitDir);
|
|
352
|
+
if (systemUnit !== undefined) {
|
|
353
|
+
ctx.out.write(`${ctx.t('launch.linuxSystemUnit', { unit: systemUnit })}\n`);
|
|
354
|
+
const started = await ctx.execProbe('systemctl', ['start', systemUnit]);
|
|
355
|
+
return started.code === 0;
|
|
356
|
+
}
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
if (platform === 'darwin') {
|
|
360
|
+
const target = `gui/${ctx.uid}/${MACOS_LAUNCHD_LABEL}`;
|
|
361
|
+
const printed = await ctx.execProbe('launchctl', ['print', target]);
|
|
362
|
+
if (printed.code === 0) {
|
|
363
|
+
ctx.out.write(`${ctx.t('launch.macosService')}\n`);
|
|
364
|
+
const kicked = await ctx.execProbe('launchctl', ['kickstart', '-k', target]);
|
|
365
|
+
return kicked.code === 0;
|
|
366
|
+
}
|
|
367
|
+
if (existsSync(ctx.macosAppPath)) {
|
|
368
|
+
ctx.out.write(`${ctx.t('launch.macosApp')}\n`);
|
|
369
|
+
const opened = await ctx.execProbe('open', ['-a', ctx.macosAppPath]);
|
|
370
|
+
return opened.code === 0;
|
|
371
|
+
}
|
|
372
|
+
return false;
|
|
373
|
+
}
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Find (or launch) a DSH this CLI can drive: discovery first — a live
|
|
378
|
+
* version-matching socket answers immediately (preferring the target role
|
|
379
|
+
* among multiple instances); EACCES / EPERM reports the cross-user hint and
|
|
380
|
+
* stops; otherwise the platform's daemon triggers fire and discovery polls
|
|
381
|
+
* until a socket appears or `waitSeconds` run out. Windows and daemon-less
|
|
382
|
+
* machines get the manual-start guidance and a structured `no-daemon` result.
|
|
383
|
+
*/
|
|
384
|
+
export async function ensureDshRunning(options) {
|
|
385
|
+
const t = options.t ?? createTranslator(resolveCliLang(undefined));
|
|
386
|
+
const out = options.stdout ?? process.stdout;
|
|
387
|
+
const execProbe = options.execProbe ?? execProbeReal;
|
|
388
|
+
const discover = options.discover ?? discoverCliSockets;
|
|
389
|
+
const platform = options.platform ?? process.platform;
|
|
390
|
+
const waitSeconds = options.waitSeconds ?? DEFAULT_WAIT_SECONDS;
|
|
391
|
+
const discoverOptions = {
|
|
392
|
+
dshHome: options.dshHome,
|
|
393
|
+
...(options.explicitSocket === undefined ? {} : { explicitSocket: options.explicitSocket }),
|
|
394
|
+
platform,
|
|
395
|
+
};
|
|
396
|
+
const pickLive = (found) => {
|
|
397
|
+
if (options.targetRole !== undefined) {
|
|
398
|
+
const match = found.live.find((entry) => entry.role === options.targetRole);
|
|
399
|
+
if (match !== undefined)
|
|
400
|
+
return match;
|
|
401
|
+
}
|
|
402
|
+
return found.live[0];
|
|
403
|
+
};
|
|
404
|
+
const liveResult = (entry) => {
|
|
405
|
+
out.write(`${t('launch.found', { role: entry.role, socketPath: entry.socketPath })}\n`);
|
|
406
|
+
return { started: true, client: createCliIpcClient(entry.socketPath), socketPath: entry.socketPath, ping: entry };
|
|
407
|
+
};
|
|
408
|
+
const deniedResult = () => {
|
|
409
|
+
const message = t('err.crossUserSocket');
|
|
410
|
+
out.write(`${message}\n`);
|
|
411
|
+
return { started: false, outcome: 'permission-denied', message };
|
|
412
|
+
};
|
|
413
|
+
const first = await discover(discoverOptions);
|
|
414
|
+
const firstLive = pickLive(first);
|
|
415
|
+
if (firstLive !== undefined)
|
|
416
|
+
return liveResult(firstLive);
|
|
417
|
+
if (first.permissionDenied.length > 0)
|
|
418
|
+
return deniedResult();
|
|
419
|
+
out.write(`${t('launch.probing')}\n`);
|
|
420
|
+
const triggered = await triggerDaemon(platform, {
|
|
421
|
+
execProbe,
|
|
422
|
+
uid: options.uid ?? (typeof process.getuid === 'function' ? process.getuid() : 501),
|
|
423
|
+
preferredProfile: options.preferredProfile ?? 'web',
|
|
424
|
+
macosAppPath: options.macosAppPath ?? DEFAULT_MACOS_APP_PATH,
|
|
425
|
+
systemUnitDir: options.systemUnitDir ?? DEFAULT_SYSTEM_UNIT_DIR,
|
|
426
|
+
out,
|
|
427
|
+
t,
|
|
428
|
+
});
|
|
429
|
+
if (!triggered) {
|
|
430
|
+
const message = t('launch.manual', { profile: options.preferredProfile ?? 'web' });
|
|
431
|
+
out.write(`${message}\n`);
|
|
432
|
+
return { started: false, outcome: 'no-daemon', message };
|
|
433
|
+
}
|
|
434
|
+
out.write(`${t('launch.waiting', { seconds: waitSeconds })}\n`);
|
|
435
|
+
const deadline = Date.now() + waitSeconds * 1000;
|
|
436
|
+
while (Date.now() < deadline) {
|
|
437
|
+
await sleep(POLL_INTERVAL_MS);
|
|
438
|
+
const found = await discover(discoverOptions);
|
|
439
|
+
const live = pickLive(found);
|
|
440
|
+
if (live !== undefined)
|
|
441
|
+
return liveResult(live);
|
|
442
|
+
if (found.permissionDenied.length > 0)
|
|
443
|
+
return deniedResult();
|
|
444
|
+
}
|
|
445
|
+
const message = t('launch.timeout', { seconds: waitSeconds });
|
|
446
|
+
out.write(`${message}\n`);
|
|
447
|
+
return { started: false, outcome: 'timeout', message };
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"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"}
|