dsh-zen-remote 2.3.11 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/CHANGELOG.md +45 -78
  2. package/README.md +94 -84
  3. package/README.zh-CN.md +90 -81
  4. package/bin/zen-remote.mjs +5 -0
  5. package/docs/interface.md +6 -6
  6. package/docs/remote-access.en.md +6 -4
  7. package/docs/remote-access.md +6 -4
  8. package/dsh-push.mjs +96 -10
  9. package/lib/adapters/dsh-better-sidebar/index.js +7 -3
  10. package/lib/adapters/dsh-better-sidebar/index.js.map +1 -1
  11. package/lib/admin-routes.js +10 -2
  12. package/lib/admin-routes.js.map +1 -1
  13. package/lib/cli/args.js +251 -0
  14. package/lib/cli/args.js.map +1 -0
  15. package/lib/cli/bootstrap.js +449 -0
  16. package/lib/cli/bootstrap.js.map +1 -0
  17. package/lib/cli/command-setup.js +484 -0
  18. package/lib/cli/command-setup.js.map +1 -0
  19. package/lib/cli/commands-client.js +359 -0
  20. package/lib/cli/commands-client.js.map +1 -0
  21. package/lib/cli/commands-host.js +1108 -0
  22. package/lib/cli/commands-host.js.map +1 -0
  23. package/lib/cli/commands-status.js +279 -0
  24. package/lib/cli/commands-status.js.map +1 -0
  25. package/lib/cli/config-writer.js +334 -0
  26. package/lib/cli/config-writer.js.map +1 -0
  27. package/lib/cli/context.js +10 -0
  28. package/lib/cli/context.js.map +1 -0
  29. package/lib/cli/i18n.js +620 -0
  30. package/lib/cli/i18n.js.map +1 -0
  31. package/lib/cli/ipc-client.js +160 -0
  32. package/lib/cli/ipc-client.js.map +1 -0
  33. package/lib/cli/ipc-server.js +464 -0
  34. package/lib/cli/ipc-server.js.map +1 -0
  35. package/lib/cli/main.js +245 -0
  36. package/lib/cli/main.js.map +1 -0
  37. package/lib/cli/qr-terminal.js +48 -0
  38. package/lib/cli/qr-terminal.js.map +1 -0
  39. package/lib/client-data/qr.js +286 -0
  40. package/lib/client-data/qr.js.map +1 -0
  41. package/lib/client-routes.js +308 -25
  42. package/lib/client-routes.js.map +1 -1
  43. package/lib/client.js +1013 -229
  44. package/lib/config.js +50 -12
  45. package/lib/config.js.map +1 -1
  46. package/lib/debug-report.js +28 -1
  47. package/lib/debug-report.js.map +1 -1
  48. package/lib/fetch-route-intercept.js +334 -26
  49. package/lib/fetch-route-intercept.js.map +1 -1
  50. package/lib/index.js +608 -375
  51. package/lib/index.js.map +1 -1
  52. package/lib/intercept.js +1833 -280
  53. package/lib/intercept.js.map +1 -1
  54. package/lib/lan-gate-server.cjs +36 -10
  55. package/lib/merge-streams.js +103 -11
  56. package/lib/merge-streams.js.map +1 -1
  57. package/lib/plugin-route-intercept.js +93 -63
  58. package/lib/plugin-route-intercept.js.map +1 -1
  59. package/lib/relay-access.js +8 -1
  60. package/lib/relay-access.js.map +1 -1
  61. package/lib/relay-client.js +133 -4
  62. package/lib/relay-client.js.map +1 -1
  63. package/lib/relay-pool.js +275 -0
  64. package/lib/relay-pool.js.map +1 -0
  65. package/lib/relay-server.js +269 -17
  66. package/lib/relay-server.js.map +1 -1
  67. package/lib/restart-fields.js +6 -4
  68. package/lib/restart-fields.js.map +1 -1
  69. package/lib/share-ops.js +68 -0
  70. package/lib/share-ops.js.map +1 -1
  71. package/lib/share-store.js +65 -27
  72. package/lib/share-store.js.map +1 -1
  73. package/lib/state-store.js +400 -0
  74. package/lib/state-store.js.map +1 -0
  75. package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
  76. package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
  77. package/lib/types/admin-routes.d.ts.map +1 -1
  78. package/lib/types/cli/args.d.ts +78 -0
  79. package/lib/types/cli/args.d.ts.map +1 -0
  80. package/lib/types/cli/bootstrap.d.ts +170 -0
  81. package/lib/types/cli/bootstrap.d.ts.map +1 -0
  82. package/lib/types/cli/command-setup.d.ts +72 -0
  83. package/lib/types/cli/command-setup.d.ts.map +1 -0
  84. package/lib/types/cli/commands-client.d.ts +36 -0
  85. package/lib/types/cli/commands-client.d.ts.map +1 -0
  86. package/lib/types/cli/commands-host.d.ts +82 -0
  87. package/lib/types/cli/commands-host.d.ts.map +1 -0
  88. package/lib/types/cli/commands-status.d.ts +46 -0
  89. package/lib/types/cli/commands-status.d.ts.map +1 -0
  90. package/lib/types/cli/config-writer.d.ts +92 -0
  91. package/lib/types/cli/config-writer.d.ts.map +1 -0
  92. package/lib/types/cli/context.d.ts +39 -0
  93. package/lib/types/cli/context.d.ts.map +1 -0
  94. package/lib/types/cli/i18n.d.ts +32 -0
  95. package/lib/types/cli/i18n.d.ts.map +1 -0
  96. package/lib/types/cli/ipc-client.d.ts +83 -0
  97. package/lib/types/cli/ipc-client.d.ts.map +1 -0
  98. package/lib/types/cli/ipc-server.d.ts +113 -0
  99. package/lib/types/cli/ipc-server.d.ts.map +1 -0
  100. package/lib/types/cli/main.d.ts +57 -0
  101. package/lib/types/cli/main.d.ts.map +1 -0
  102. package/lib/types/cli/qr-terminal.d.ts +17 -0
  103. package/lib/types/cli/qr-terminal.d.ts.map +1 -0
  104. package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
  105. package/lib/types/client/current-session-report.d.ts +4 -0
  106. package/lib/types/client/current-session-report.d.ts.map +1 -1
  107. package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
  108. package/lib/types/client/effects/remote-session.d.ts.map +1 -1
  109. package/lib/types/client/locales.d.ts +47 -3
  110. package/lib/types/client/locales.d.ts.map +1 -1
  111. package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
  112. package/lib/types/client/settings/settings-css.d.ts +1 -1
  113. package/lib/types/client/settings/settings-css.d.ts.map +1 -1
  114. package/lib/types/client/styles/remote-session.css.d.ts +1 -1
  115. package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
  116. package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
  117. package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
  118. package/lib/types/client/wizard/wizard-css.d.ts +1 -1
  119. package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
  120. package/lib/types/client-data/model-group-side.d.ts +23 -2
  121. package/lib/types/client-data/model-group-side.d.ts.map +1 -1
  122. package/lib/types/client-data/remote-status.d.ts +47 -1
  123. package/lib/types/client-data/remote-status.d.ts.map +1 -1
  124. package/lib/types/client-data/settings-form.d.ts +85 -1
  125. package/lib/types/client-data/settings-form.d.ts.map +1 -1
  126. package/lib/types/client-data/wizard.d.ts +56 -1
  127. package/lib/types/client-data/wizard.d.ts.map +1 -1
  128. package/lib/types/client-routes.d.ts +25 -1
  129. package/lib/types/client-routes.d.ts.map +1 -1
  130. package/lib/types/config.d.ts +40 -14
  131. package/lib/types/config.d.ts.map +1 -1
  132. package/lib/types/debug-report.d.ts.map +1 -1
  133. package/lib/types/fetch-route-intercept.d.ts +66 -8
  134. package/lib/types/fetch-route-intercept.d.ts.map +1 -1
  135. package/lib/types/index.d.ts +9 -2
  136. package/lib/types/index.d.ts.map +1 -1
  137. package/lib/types/intercept.d.ts +72 -10
  138. package/lib/types/intercept.d.ts.map +1 -1
  139. package/lib/types/merge-streams.d.ts +79 -1
  140. package/lib/types/merge-streams.d.ts.map +1 -1
  141. package/lib/types/plugin-route-intercept.d.ts +25 -9
  142. package/lib/types/plugin-route-intercept.d.ts.map +1 -1
  143. package/lib/types/relay-access.d.ts +3 -1
  144. package/lib/types/relay-access.d.ts.map +1 -1
  145. package/lib/types/relay-client.d.ts +23 -2
  146. package/lib/types/relay-client.d.ts.map +1 -1
  147. package/lib/types/relay-pool.d.ts +148 -0
  148. package/lib/types/relay-pool.d.ts.map +1 -0
  149. package/lib/types/relay-server.d.ts +30 -3
  150. package/lib/types/relay-server.d.ts.map +1 -1
  151. package/lib/types/restart-fields.d.ts +5 -5
  152. package/lib/types/restart-fields.d.ts.map +1 -1
  153. package/lib/types/share-ops.d.ts +47 -1
  154. package/lib/types/share-ops.d.ts.map +1 -1
  155. package/lib/types/share-store.d.ts.map +1 -1
  156. package/lib/types/state-store.d.ts +179 -0
  157. package/lib/types/state-store.d.ts.map +1 -0
  158. package/lib/types/upload-limits.d.ts +15 -0
  159. package/lib/types/upload-limits.d.ts.map +1 -1
  160. package/lib/types/virtual-id.d.ts +21 -0
  161. package/lib/types/virtual-id.d.ts.map +1 -1
  162. package/lib/types/wizard/probe.d.ts.map +1 -1
  163. package/lib/types/wizard/proxy-snippets.d.ts +3 -0
  164. package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
  165. package/lib/types/wizard/routes.d.ts +1 -0
  166. package/lib/types/wizard/routes.d.ts.map +1 -1
  167. package/lib/types/wizard/status.d.ts +9 -0
  168. package/lib/types/wizard/status.d.ts.map +1 -1
  169. package/lib/types/wizard/verify.d.ts +3 -0
  170. package/lib/types/wizard/verify.d.ts.map +1 -1
  171. package/lib/upload-limits.js +15 -0
  172. package/lib/upload-limits.js.map +1 -1
  173. package/lib/virtual-id.js +60 -0
  174. package/lib/virtual-id.js.map +1 -1
  175. package/lib/wizard/probe.js +46 -1
  176. package/lib/wizard/probe.js.map +1 -1
  177. package/lib/wizard/proxy-snippets.js +14 -1
  178. package/lib/wizard/proxy-snippets.js.map +1 -1
  179. package/lib/wizard/routes.js +23 -4
  180. package/lib/wizard/routes.js.map +1 -1
  181. package/lib/wizard/status.js +21 -0
  182. package/lib/wizard/status.js.map +1 -1
  183. package/lib/wizard/verify.js +31 -8
  184. package/lib/wizard/verify.js.map +1 -1
  185. package/package.json +8 -4
  186. package/pwa/icons/badge-96.png +0 -0
  187. package/pwa/icons/badge.svg +1 -0
  188. package/pwa/manifest.json +2 -1
  189. package/pwa/sw.js +3 -1
  190. package/scripts/check-debug-report.mjs +41 -1
  191. package/scripts/check-settings-form.mjs +14 -3
  192. package/scripts/check-settings-view.mjs +247 -0
  193. package/scripts/check-wizard-ui.mjs +37 -0
  194. package/src/adapters/dsh-better-sidebar/index.ts +7 -3
  195. package/src/admin-routes.ts +10 -2
  196. package/src/cli/args.ts +289 -0
  197. package/src/cli/bootstrap.ts +569 -0
  198. package/src/cli/command-setup.ts +540 -0
  199. package/src/cli/commands-client.ts +369 -0
  200. package/src/cli/commands-host.ts +1127 -0
  201. package/src/cli/commands-status.ts +296 -0
  202. package/src/cli/config-writer.ts +354 -0
  203. package/src/cli/context.ts +38 -0
  204. package/src/cli/i18n.ts +645 -0
  205. package/src/cli/ipc-client.ts +216 -0
  206. package/src/cli/ipc-server.ts +531 -0
  207. package/src/cli/main.ts +285 -0
  208. package/src/cli/qr-terminal.ts +49 -0
  209. package/src/client/RemoteStatusIcon.tsx +4 -1
  210. package/src/client/current-session-report.ts +28 -4
  211. package/src/client/effects/model-group-side.ts +19 -5
  212. package/src/client/effects/remote-session.ts +26 -6
  213. package/src/client/locales.ts +96 -6
  214. package/src/client/settings/SettingsSection.tsx +287 -92
  215. package/src/client/settings/settings-css.ts +18 -0
  216. package/src/client/styles/remote-session.css.ts +15 -1
  217. package/src/client/wizard/GatewayWizard.tsx +470 -109
  218. package/src/client/wizard/cards/ProxyCard.tsx +2 -1
  219. package/src/client/wizard/wizard-css.ts +23 -0
  220. package/src/client-data/model-group-side.ts +37 -10
  221. package/src/client-data/remote-status.ts +112 -17
  222. package/src/client-data/settings-form.ts +164 -8
  223. package/src/client-data/wizard.ts +112 -2
  224. package/src/client-routes.ts +334 -26
  225. package/src/config.ts +62 -16
  226. package/src/debug-report.ts +27 -1
  227. package/src/fetch-route-intercept.ts +381 -32
  228. package/src/index.ts +608 -380
  229. package/src/intercept.ts +1866 -286
  230. package/src/merge-streams.ts +155 -10
  231. package/src/plugin-route-intercept.ts +120 -71
  232. package/src/relay-access.ts +14 -3
  233. package/src/relay-client.ts +163 -5
  234. package/src/relay-pool.ts +387 -0
  235. package/src/relay-server.ts +312 -16
  236. package/src/restart-fields.ts +6 -4
  237. package/src/share-ops.ts +82 -1
  238. package/src/share-store.ts +59 -26
  239. package/src/state-store.ts +428 -0
  240. package/src/upload-limits.ts +16 -0
  241. package/src/virtual-id.ts +57 -0
  242. package/src/wizard/probe.ts +54 -2
  243. package/src/wizard/proxy-snippets.ts +17 -2
  244. package/src/wizard/routes.ts +24 -5
  245. package/src/wizard/status.ts +28 -0
  246. package/src/wizard/verify.ts +33 -11
  247. package/AGENTS.md +0 -185
  248. package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
  249. 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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"}