dsh-zen-remote 2.3.10 → 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.
Files changed (244) hide show
  1. package/CHANGELOG.md +44 -72
  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 +573 -366
  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-store.js +65 -27
  70. package/lib/share-store.js.map +1 -1
  71. package/lib/state-store.js +400 -0
  72. package/lib/state-store.js.map +1 -0
  73. package/lib/types/adapters/dsh-better-sidebar/index.d.ts +3 -2
  74. package/lib/types/adapters/dsh-better-sidebar/index.d.ts.map +1 -1
  75. package/lib/types/admin-routes.d.ts.map +1 -1
  76. package/lib/types/cli/args.d.ts +78 -0
  77. package/lib/types/cli/args.d.ts.map +1 -0
  78. package/lib/types/cli/bootstrap.d.ts +170 -0
  79. package/lib/types/cli/bootstrap.d.ts.map +1 -0
  80. package/lib/types/cli/command-setup.d.ts +72 -0
  81. package/lib/types/cli/command-setup.d.ts.map +1 -0
  82. package/lib/types/cli/commands-client.d.ts +36 -0
  83. package/lib/types/cli/commands-client.d.ts.map +1 -0
  84. package/lib/types/cli/commands-host.d.ts +82 -0
  85. package/lib/types/cli/commands-host.d.ts.map +1 -0
  86. package/lib/types/cli/commands-status.d.ts +46 -0
  87. package/lib/types/cli/commands-status.d.ts.map +1 -0
  88. package/lib/types/cli/config-writer.d.ts +92 -0
  89. package/lib/types/cli/config-writer.d.ts.map +1 -0
  90. package/lib/types/cli/context.d.ts +39 -0
  91. package/lib/types/cli/context.d.ts.map +1 -0
  92. package/lib/types/cli/i18n.d.ts +32 -0
  93. package/lib/types/cli/i18n.d.ts.map +1 -0
  94. package/lib/types/cli/ipc-client.d.ts +83 -0
  95. package/lib/types/cli/ipc-client.d.ts.map +1 -0
  96. package/lib/types/cli/ipc-server.d.ts +113 -0
  97. package/lib/types/cli/ipc-server.d.ts.map +1 -0
  98. package/lib/types/cli/main.d.ts +57 -0
  99. package/lib/types/cli/main.d.ts.map +1 -0
  100. package/lib/types/cli/qr-terminal.d.ts +17 -0
  101. package/lib/types/cli/qr-terminal.d.ts.map +1 -0
  102. package/lib/types/client/RemoteStatusIcon.d.ts.map +1 -1
  103. package/lib/types/client/current-session-report.d.ts +4 -0
  104. package/lib/types/client/current-session-report.d.ts.map +1 -1
  105. package/lib/types/client/effects/model-group-side.d.ts.map +1 -1
  106. package/lib/types/client/effects/remote-session.d.ts.map +1 -1
  107. package/lib/types/client/locales.d.ts +47 -3
  108. package/lib/types/client/locales.d.ts.map +1 -1
  109. package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
  110. package/lib/types/client/settings/settings-css.d.ts +1 -1
  111. package/lib/types/client/settings/settings-css.d.ts.map +1 -1
  112. package/lib/types/client/styles/remote-session.css.d.ts +1 -1
  113. package/lib/types/client/styles/remote-session.css.d.ts.map +1 -1
  114. package/lib/types/client/wizard/GatewayWizard.d.ts.map +1 -1
  115. package/lib/types/client/wizard/cards/ProxyCard.d.ts.map +1 -1
  116. package/lib/types/client/wizard/wizard-css.d.ts +1 -1
  117. package/lib/types/client/wizard/wizard-css.d.ts.map +1 -1
  118. package/lib/types/client-data/model-group-side.d.ts +23 -2
  119. package/lib/types/client-data/model-group-side.d.ts.map +1 -1
  120. package/lib/types/client-data/remote-status.d.ts +47 -1
  121. package/lib/types/client-data/remote-status.d.ts.map +1 -1
  122. package/lib/types/client-data/settings-form.d.ts +85 -1
  123. package/lib/types/client-data/settings-form.d.ts.map +1 -1
  124. package/lib/types/client-data/wizard.d.ts +56 -1
  125. package/lib/types/client-data/wizard.d.ts.map +1 -1
  126. package/lib/types/client-routes.d.ts +25 -1
  127. package/lib/types/client-routes.d.ts.map +1 -1
  128. package/lib/types/config.d.ts +40 -14
  129. package/lib/types/config.d.ts.map +1 -1
  130. package/lib/types/debug-report.d.ts.map +1 -1
  131. package/lib/types/fetch-route-intercept.d.ts +66 -8
  132. package/lib/types/fetch-route-intercept.d.ts.map +1 -1
  133. package/lib/types/index.d.ts +9 -2
  134. package/lib/types/index.d.ts.map +1 -1
  135. package/lib/types/intercept.d.ts +72 -10
  136. package/lib/types/intercept.d.ts.map +1 -1
  137. package/lib/types/merge-streams.d.ts +79 -1
  138. package/lib/types/merge-streams.d.ts.map +1 -1
  139. package/lib/types/plugin-route-intercept.d.ts +25 -9
  140. package/lib/types/plugin-route-intercept.d.ts.map +1 -1
  141. package/lib/types/relay-access.d.ts +3 -1
  142. package/lib/types/relay-access.d.ts.map +1 -1
  143. package/lib/types/relay-client.d.ts +23 -2
  144. package/lib/types/relay-client.d.ts.map +1 -1
  145. package/lib/types/relay-pool.d.ts +148 -0
  146. package/lib/types/relay-pool.d.ts.map +1 -0
  147. package/lib/types/relay-server.d.ts +30 -3
  148. package/lib/types/relay-server.d.ts.map +1 -1
  149. package/lib/types/restart-fields.d.ts +5 -5
  150. package/lib/types/restart-fields.d.ts.map +1 -1
  151. package/lib/types/share-store.d.ts.map +1 -1
  152. package/lib/types/state-store.d.ts +179 -0
  153. package/lib/types/state-store.d.ts.map +1 -0
  154. package/lib/types/upload-limits.d.ts +15 -0
  155. package/lib/types/upload-limits.d.ts.map +1 -1
  156. package/lib/types/virtual-id.d.ts +21 -0
  157. package/lib/types/virtual-id.d.ts.map +1 -1
  158. package/lib/types/wizard/probe.d.ts.map +1 -1
  159. package/lib/types/wizard/proxy-snippets.d.ts +3 -0
  160. package/lib/types/wizard/proxy-snippets.d.ts.map +1 -1
  161. package/lib/types/wizard/routes.d.ts +1 -0
  162. package/lib/types/wizard/routes.d.ts.map +1 -1
  163. package/lib/types/wizard/status.d.ts +9 -0
  164. package/lib/types/wizard/status.d.ts.map +1 -1
  165. package/lib/types/wizard/verify.d.ts +3 -0
  166. package/lib/types/wizard/verify.d.ts.map +1 -1
  167. package/lib/upload-limits.js +15 -0
  168. package/lib/upload-limits.js.map +1 -1
  169. package/lib/virtual-id.js +60 -0
  170. package/lib/virtual-id.js.map +1 -1
  171. package/lib/wizard/probe.js +46 -1
  172. package/lib/wizard/probe.js.map +1 -1
  173. package/lib/wizard/proxy-snippets.js +14 -1
  174. package/lib/wizard/proxy-snippets.js.map +1 -1
  175. package/lib/wizard/routes.js +23 -4
  176. package/lib/wizard/routes.js.map +1 -1
  177. package/lib/wizard/status.js +21 -0
  178. package/lib/wizard/status.js.map +1 -1
  179. package/lib/wizard/verify.js +31 -8
  180. package/lib/wizard/verify.js.map +1 -1
  181. package/package.json +8 -4
  182. package/pwa/icons/badge-96.png +0 -0
  183. package/pwa/icons/badge.svg +1 -0
  184. package/pwa/manifest.json +2 -1
  185. package/pwa/sw.js +3 -1
  186. package/scripts/check-debug-report.mjs +41 -1
  187. package/scripts/check-settings-form.mjs +14 -3
  188. package/scripts/check-settings-view.mjs +247 -0
  189. package/scripts/check-wizard-ui.mjs +37 -0
  190. package/src/adapters/dsh-better-sidebar/index.ts +7 -3
  191. package/src/admin-routes.ts +10 -2
  192. package/src/cli/args.ts +289 -0
  193. package/src/cli/bootstrap.ts +569 -0
  194. package/src/cli/command-setup.ts +540 -0
  195. package/src/cli/commands-client.ts +369 -0
  196. package/src/cli/commands-host.ts +1127 -0
  197. package/src/cli/commands-status.ts +296 -0
  198. package/src/cli/config-writer.ts +354 -0
  199. package/src/cli/context.ts +38 -0
  200. package/src/cli/i18n.ts +645 -0
  201. package/src/cli/ipc-client.ts +216 -0
  202. package/src/cli/ipc-server.ts +531 -0
  203. package/src/cli/main.ts +285 -0
  204. package/src/cli/qr-terminal.ts +49 -0
  205. package/src/client/RemoteStatusIcon.tsx +4 -1
  206. package/src/client/current-session-report.ts +28 -4
  207. package/src/client/effects/model-group-side.ts +19 -5
  208. package/src/client/effects/remote-session.ts +26 -6
  209. package/src/client/locales.ts +96 -6
  210. package/src/client/settings/SettingsSection.tsx +287 -92
  211. package/src/client/settings/settings-css.ts +18 -0
  212. package/src/client/styles/remote-session.css.ts +15 -1
  213. package/src/client/wizard/GatewayWizard.tsx +470 -109
  214. package/src/client/wizard/cards/ProxyCard.tsx +2 -1
  215. package/src/client/wizard/wizard-css.ts +23 -0
  216. package/src/client-data/model-group-side.ts +37 -10
  217. package/src/client-data/remote-status.ts +112 -17
  218. package/src/client-data/settings-form.ts +164 -8
  219. package/src/client-data/wizard.ts +112 -2
  220. package/src/client-routes.ts +334 -26
  221. package/src/config.ts +62 -16
  222. package/src/debug-report.ts +27 -1
  223. package/src/fetch-route-intercept.ts +381 -32
  224. package/src/index.ts +575 -370
  225. package/src/intercept.ts +1866 -286
  226. package/src/merge-streams.ts +155 -10
  227. package/src/plugin-route-intercept.ts +120 -71
  228. package/src/relay-access.ts +14 -3
  229. package/src/relay-client.ts +163 -5
  230. package/src/relay-pool.ts +387 -0
  231. package/src/relay-server.ts +312 -16
  232. package/src/restart-fields.ts +6 -4
  233. package/src/share-store.ts +59 -26
  234. package/src/state-store.ts +428 -0
  235. package/src/upload-limits.ts +16 -0
  236. package/src/virtual-id.ts +57 -0
  237. package/src/wizard/probe.ts +54 -2
  238. package/src/wizard/proxy-snippets.ts +17 -2
  239. package/src/wizard/routes.ts +24 -5
  240. package/src/wizard/status.ts +28 -0
  241. package/src/wizard/verify.ts +33 -11
  242. package/AGENTS.md +0 -185
  243. package/docs/adr/0001-plugin-bridge-forwards-plugin-routes.md +0 -15
  244. package/docs/adr/0002-relay-emulates-websocket.md +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-server.js","sourceRoot":"","sources":["../../src/cli/ipc-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * CLI-5: the process entry point behind `bin/zen-remote.mjs`. `runCli` turns
3
+ * a parsed argv into exactly one verdict: static answers (help, version,
4
+ * the SPEC's `--role peer` refusal, unknown commands) render here; every
5
+ * plugin-driving command first comes alive through `ensureDshRunning` and
6
+ * then dispatches into the CLI-3/CLI-4 command functions over the discovered
7
+ * IPC socket; `setup` owns its preflight (install + launch) and runs the
8
+ * three-step wizard.
9
+ *
10
+ * Two things belong ONLY here: the interactivity verdict for the whole run
11
+ * (TTY && !`--yes`, with the default readline prompter created lazily and —
12
+ * importantly — closed in the end, or an unanswered stdin handle would keep
13
+ * the process alive after the answer printed), and the structured error
14
+ * boundary that turns a MissingRequiredOptionError into one precise
15
+ * bilingual line instead of a stack trace. All dependencies are injectable
16
+ * so the tests drive the real entry function with fakes (SPEC's test seam
17
+ * three).
18
+ */
19
+ import { readFileSync } from 'node:fs';
20
+ import { homedir } from 'node:os';
21
+ import { dirname, join } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { parseCliArgs } from './args.js';
24
+ import { createReadlinePrompter, ensureDshRunning, isInteractiveSession, MissingRequiredOptionError } from './bootstrap.js';
25
+ import { discoverCliSockets } from './ipc-client.js';
26
+ import { CLI_PROTOCOL_VERSION } from './ipc-server.js';
27
+ import { createTranslator, resolveCliLang } from './i18n.js';
28
+ import { runStatusCommand } from './commands-status.js';
29
+ import { runClientListCommand, runClientPairCommand, runClientUnpairCommand } from './commands-client.js';
30
+ import { runHostDeviceListCommand, runHostDevicePairCommand, runHostDeviceRevokeCommand, runHostIngressSnippetCommand, runHostIngressStartCommand, runHostIngressStopCommand, runHostIngressVerifyCommand, } from './commands-host.js';
31
+ import { runSetupCommand } from './command-setup.js';
32
+ function readPackageVersion() {
33
+ try {
34
+ const parsed = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json'), 'utf8'));
35
+ if (parsed !== null && typeof parsed === 'object') {
36
+ const version = parsed.version;
37
+ if (typeof version === 'string')
38
+ return version;
39
+ }
40
+ }
41
+ catch { /* packaged oddities fall back to a visible placeholder */ }
42
+ return 'unknown';
43
+ }
44
+ /** The complete bilingual command tree — the `help.command.*` /
45
+ * `help.option.*` dictionary keys ARE the tree's source of truth. */
46
+ function printHelp(t, out) {
47
+ const lines = [
48
+ t('help.title'),
49
+ '',
50
+ t('help.usage'),
51
+ '',
52
+ t('help.description'),
53
+ '',
54
+ t('help.commands'),
55
+ ` ${t('help.command.setup')}`,
56
+ ` ${t('help.command.status')}`,
57
+ ` ${t('help.command.hostDevice')}`,
58
+ ` ${t('help.command.hostIngress')}`,
59
+ ` ${t('help.command.clientPair')}`,
60
+ ` ${t('help.command.clientUnpair')}`,
61
+ ` ${t('help.command.clientList')}`,
62
+ '',
63
+ t('help.options'),
64
+ ...[
65
+ 'lang', 'json', 'socket', 'wait', 'yes', 'noWait', 'debug', 'role', 'profile',
66
+ 'ingress', 'domain', 'cfToken', 'email', 'httpsPort', 'publicUrl', 'tunnelId',
67
+ 'proxy', 'deviceRole', 'hostUrl', 'code', 'name', 'all',
68
+ ].map((option) => ` ${t(`help.option.${option}`)}`),
69
+ '',
70
+ t('help.footer'),
71
+ ];
72
+ out.write(`${lines.join('\n')}\n`);
73
+ }
74
+ /** The static verdicts that need no plugin and no IPC, in priority order. */
75
+ function staticVerdict(parsed, t, out, packageVersion) {
76
+ if (parsed.command === 'help') {
77
+ printHelp(t, out);
78
+ return 0;
79
+ }
80
+ if (parsed.command === 'version') {
81
+ out.write(`${packageVersion}\n`);
82
+ return 0;
83
+ }
84
+ if (parsed.options.roleIssue === 'peer-not-enabled') {
85
+ out.write(`${t('err.role.peerNotEnabled')}\n`);
86
+ return 1;
87
+ }
88
+ if (parsed.options.roleIssue === 'invalid') {
89
+ out.write(`${t('err.role.invalid', { value: parsed.options.role ?? '' })}\n`);
90
+ return 1;
91
+ }
92
+ if (parsed.command === 'unknown') {
93
+ out.write(`${t('err.unknownCommand', { command: parsed.unknownCommand ?? '' })}\n`);
94
+ return 1;
95
+ }
96
+ return undefined;
97
+ }
98
+ /**
99
+ * Run one CLI invocation (argv WITHOUT the node binary and script path) and
100
+ * answer its exit code. The bin entry assigns it to `process.exitCode`.
101
+ */
102
+ export async function runCli(argv, deps) {
103
+ const d = deps ?? {};
104
+ const parsed = parseCliArgs(argv);
105
+ const env = d.env ?? process.env;
106
+ const t = createTranslator(resolveCliLang(parsed.options.lang, env));
107
+ const out = d.stdout ?? process.stdout;
108
+ const dshHome = d.dshHome ?? env.DSH_HOME ?? join(homedir(), '.dsh');
109
+ const interactive = isInteractiveSession(parsed, d.isTty ?? process.stdin.isTTY === true);
110
+ // The default readline prompter is created lazily and owned by this run —
111
+ // an unclosed one would hold stdin open after the answer is printed.
112
+ let ownedPrompter;
113
+ const prompterFor = () => {
114
+ if (!interactive)
115
+ return undefined;
116
+ if (d.prompter !== undefined)
117
+ return d.prompter;
118
+ if (ownedPrompter === undefined)
119
+ ownedPrompter = createReadlinePrompter(undefined, undefined, t);
120
+ return ownedPrompter;
121
+ };
122
+ // The real Ctrl-C seam (context.ts's contract): without an injected signal,
123
+ // the process's SIGINT drives a run-owned AbortController, so the verify
124
+ // wait can skip gracefully. A SECOND Ctrl-C force-quits — the listener must
125
+ // never swallow Ctrl-C for phases that cannot react to the signal. The
126
+ // listener is removed in the end; nothing leaks across runs (or into the
127
+ // tests' process).
128
+ const controller = new AbortController();
129
+ const onSigint = () => {
130
+ if (controller.signal.aborted) {
131
+ process.exit(130);
132
+ return;
133
+ }
134
+ controller.abort();
135
+ };
136
+ if (d.abortSignal === undefined)
137
+ process.on('SIGINT', onSigint);
138
+ const abortSignal = d.abortSignal ?? controller.signal;
139
+ try {
140
+ const verdict = staticVerdict(parsed, t, out, d.packageVersion ?? readPackageVersion());
141
+ if (verdict !== undefined)
142
+ return verdict;
143
+ if (parsed.command === 'setup') {
144
+ const setupCtx = {
145
+ args: parsed,
146
+ dshHome,
147
+ interactive,
148
+ t,
149
+ stdout: out,
150
+ ...(interactive ? { prompter: prompterFor() } : {}),
151
+ ...(d.pollIntervalMs === undefined ? {} : { pollIntervalMs: d.pollIntervalMs }),
152
+ abortSignal,
153
+ ...(d.now === undefined ? {} : { now: d.now }),
154
+ ...(d.cwd === undefined ? {} : { cwd: d.cwd }),
155
+ ...(d.discover === undefined ? {} : { discover: d.discover }),
156
+ ...(d.spawnCommand === undefined ? {} : { spawnCommand: d.spawnCommand }),
157
+ ...(d.execProbe === undefined ? {} : { execProbe: d.execProbe }),
158
+ ...(d.platform === undefined ? {} : { platform: d.platform }),
159
+ ...(d.uid === undefined ? {} : { uid: d.uid }),
160
+ ...(d.macosAppPath === undefined ? {} : { macosAppPath: d.macosAppPath }),
161
+ ...(d.systemUnitDir === undefined ? {} : { systemUnitDir: d.systemUnitDir }),
162
+ };
163
+ return await runSetupCommand(setupCtx);
164
+ }
165
+ // status / host.* / client.*: a live plugin is the precondition — find
166
+ // it (a version-mismatching socket is its own refusal) and bind.
167
+ const discover = d.discover ?? discoverCliSockets;
168
+ const platform = d.platform ?? process.platform;
169
+ const found = await discover({
170
+ dshHome,
171
+ ...(parsed.options.socket === undefined ? {} : { explicitSocket: parsed.options.socket }),
172
+ platform,
173
+ });
174
+ if (found.live.length === 0 && found.versionMismatch.length > 0) {
175
+ const mismatched = found.versionMismatch[0];
176
+ out.write(`${t('err.protocolVersion', {
177
+ found: String(mismatched?.cliProtocolVersion ?? '?'),
178
+ expected: CLI_PROTOCOL_VERSION,
179
+ })}\n`);
180
+ return 1;
181
+ }
182
+ const up = await ensureDshRunning({
183
+ dshHome,
184
+ waitSeconds: parsed.options.wait,
185
+ ...(parsed.options.socket === undefined ? {} : { explicitSocket: parsed.options.socket }),
186
+ ...(d.platform === undefined ? {} : { platform: d.platform }),
187
+ ...(d.uid === undefined ? {} : { uid: d.uid }),
188
+ ...(d.execProbe === undefined ? {} : { execProbe: d.execProbe }),
189
+ discover,
190
+ ...(d.macosAppPath === undefined ? {} : { macosAppPath: d.macosAppPath }),
191
+ ...(d.systemUnitDir === undefined ? {} : { systemUnitDir: d.systemUnitDir }),
192
+ stdout: out,
193
+ t,
194
+ });
195
+ if (!up.started)
196
+ return 1;
197
+ const ipc = up.client;
198
+ const prompter = prompterFor();
199
+ const ctx = {
200
+ args: parsed,
201
+ ipc,
202
+ t,
203
+ interactive,
204
+ ...(prompter === undefined ? {} : { prompter }),
205
+ stdout: out,
206
+ ...(d.now === undefined ? {} : { now: d.now }),
207
+ ...(d.cwd === undefined ? {} : { cwd: d.cwd }),
208
+ ...(d.pollIntervalMs === undefined ? {} : { pollIntervalMs: d.pollIntervalMs }),
209
+ abortSignal,
210
+ };
211
+ switch (parsed.command) {
212
+ case 'status': return await runStatusCommand(ctx);
213
+ case 'host.device.pair': return await runHostDevicePairCommand(ctx);
214
+ case 'host.device.list': return await runHostDeviceListCommand(ctx);
215
+ case 'host.device.revoke': return await runHostDeviceRevokeCommand(ctx);
216
+ case 'host.ingress.start': return await runHostIngressStartCommand(ctx);
217
+ case 'host.ingress.stop': return await runHostIngressStopCommand(ctx);
218
+ case 'host.ingress.verify': return await runHostIngressVerifyCommand(ctx);
219
+ case 'host.ingress.snippet': return await runHostIngressSnippetCommand(ctx);
220
+ case 'client.pair': return await runClientPairCommand(ctx);
221
+ case 'client.unpair': return await runClientUnpairCommand(ctx);
222
+ case 'client.list': return await runClientListCommand(ctx);
223
+ default: {
224
+ // staticVerdict already handled help / version / unknown / setup —
225
+ // the default arm is unreachable and only satisfies the exhaustiveness.
226
+ out.write(`${t('err.unknownCommand', { command: parsed.unknownCommand ?? '' })}\n`);
227
+ return 1;
228
+ }
229
+ }
230
+ }
231
+ catch (error) {
232
+ if (error instanceof MissingRequiredOptionError) {
233
+ out.write(`${t('err.missingOption', { option: error.optionName })}\n`);
234
+ return 1;
235
+ }
236
+ out.write(`${t('err.internal', { error: error instanceof Error ? error.message : String(error) })}\n`);
237
+ return 1;
238
+ }
239
+ finally {
240
+ if (d.abortSignal === undefined)
241
+ process.removeListener('SIGINT', onSigint);
242
+ ownedPrompter?.close();
243
+ }
244
+ }
245
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * CLI-2 terminal QR rendering, zero dependencies: reuse the repo's own
3
+ * minimal encoder (`src/client-data/qr.ts`) and draw the module matrix with
4
+ * Unicode half-block characters — two module ROWS per terminal line, so the
5
+ * symbol stays square on screen (terminal cells are roughly twice as tall as
6
+ * they are wide):
7
+ *
8
+ * dark top + dark bottom → `█` dark top + light bottom → `▀`
9
+ * light top + dark bottom → `▄` light top + light bottom → ` `
10
+ *
11
+ * A 2-module quiet zone of light modules surrounds the symbol on every side
12
+ * (ISO 18004 recommendance) — without it many scanners refuse to lock on.
13
+ * Text too long for the encoder (over 106 UTF-8 bytes, its version-5-L
14
+ * capacity) returns `null`; the caller shows the plain URL instead.
15
+ */
16
+ import { qrMatrix } from '../client-data/qr.js';
17
+ const QUIET_ZONE_MODULES = 2;
18
+ export function renderTerminalQr(text) {
19
+ const matrix = qrMatrix(text);
20
+ if (matrix === null)
21
+ return null;
22
+ const size = matrix.length;
23
+ const dim = size + QUIET_ZONE_MODULES * 2;
24
+ // Padded matrix: quiet zone (light) + the symbol itself.
25
+ const dark = Array.from({ length: dim }, () => new Array(dim).fill(false));
26
+ for (let row = 0; row < size; row += 1) {
27
+ const source = matrix[row];
28
+ const target = dark[row + QUIET_ZONE_MODULES];
29
+ if (source === undefined || target === undefined)
30
+ continue;
31
+ for (let col = 0; col < size; col += 1)
32
+ target[col + QUIET_ZONE_MODULES] = source[col] ?? false;
33
+ }
34
+ const lines = [];
35
+ for (let row = 0; row < dim; row += 2) {
36
+ const top = dark[row] ?? [];
37
+ const bottom = dark[row + 1] ?? [];
38
+ let line = '';
39
+ for (let col = 0; col < dim; col += 1) {
40
+ const topDark = top[col] ?? false;
41
+ const bottomDark = bottom[col] ?? false;
42
+ line += topDark && bottomDark ? '█' : topDark ? '▀' : bottomDark ? '▄' : ' ';
43
+ }
44
+ lines.push(line);
45
+ }
46
+ return lines.join('\n');
47
+ }
48
+ //# sourceMappingURL=qr-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-terminal.js","sourceRoot":"","sources":["../../src/cli/qr-terminal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAE5B,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,kBAAkB,GAAG,CAAC,CAAA;IAEzC,yDAAyD;IACzD,MAAM,IAAI,GAAgB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAU,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChG,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAA;QAC7C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,SAAQ;QAC1D,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAAE,MAAM,CAAC,GAAG,GAAG,kBAAkB,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAA;IACjG,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QAClC,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAA;YACjC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAA;YACvC,IAAI,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QAC9E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Minimal QR encoder (GW-10): byte mode, versions 1–5, ECC level L, fixed
3
+ * mask 0 — enough for any sane origin URL (106 bytes at v5) while keeping
4
+ * the whole implementation single-block (no interleave) and reviewable.
5
+ * Returns the module matrix (true = dark) or null when the text does not
6
+ * fit. Pure: the check script verifies it at decoder level (RS syndromes
7
+ * all-zero + data recovery + format-info BCH), which is stronger than any
8
+ * memorized reference vector.
9
+ *
10
+ * Standard QR constants only: sizes 21/25/29/33/37, data codewords
11
+ * 19/34/55/80/108, ECC codewords 7/10/15/20/26, alignment centers
12
+ * [6,18]/[6,22]/[6,26]/[6,30], Galois field 0x11d, format-info generator
13
+ * 0x537 XOR-mask 0x5412.
14
+ */
15
+ const VERSIONS = [
16
+ { size: 21, dataCodewords: 19, eccCodewords: 7, alignment: null, capacity: 17 },
17
+ { size: 25, dataCodewords: 34, eccCodewords: 10, alignment: [6, 18], capacity: 32 },
18
+ { size: 29, dataCodewords: 55, eccCodewords: 15, alignment: [6, 22], capacity: 53 },
19
+ { size: 33, dataCodewords: 80, eccCodewords: 20, alignment: [6, 26], capacity: 78 },
20
+ { size: 37, dataCodewords: 108, eccCodewords: 26, alignment: [6, 30], capacity: 106 },
21
+ ];
22
+ // --- Galois field GF(256), polynomial 0x11d -----------------------------------
23
+ const EXP = new Uint8Array(512);
24
+ const LOG = new Uint8Array(256);
25
+ {
26
+ let value = 1;
27
+ for (let exponent = 0; exponent < 255; exponent++) {
28
+ EXP[exponent] = value;
29
+ LOG[value] = exponent;
30
+ value <<= 1;
31
+ if (value & 0x100)
32
+ value ^= 0x11d;
33
+ }
34
+ for (let exponent = 255; exponent < 512; exponent++)
35
+ EXP[exponent] = EXP[exponent - 255] ?? 0;
36
+ }
37
+ function gfMul(a, b) {
38
+ if (a === 0 || b === 0)
39
+ return 0;
40
+ const la = LOG[a];
41
+ const lb = LOG[b];
42
+ if (la === undefined || lb === undefined)
43
+ return 0;
44
+ return EXP[la + lb] ?? 0;
45
+ }
46
+ /** Reed–Solomon remainder of `data` under the generator for `eccLen` check
47
+ * codewords (LFSR division). The generator is ∏(x − α^i), i = 0…eccLen−1,
48
+ * coefficients high-order first; g[j]·x lands at index j, g[j]·α^i at
49
+ * index j+1. */
50
+ function rsRemainder(data, eccLen) {
51
+ let generator = [1];
52
+ for (let i = 0; i < eccLen; i++) {
53
+ const next = new Array(generator.length + 1).fill(0);
54
+ for (let j = 0; j < generator.length; j++) {
55
+ const coefficient = generator[j];
56
+ if (coefficient === undefined)
57
+ continue;
58
+ const low = next[j] ?? 0;
59
+ const high = next[j + 1] ?? 0;
60
+ next[j] = low ^ coefficient;
61
+ next[j + 1] = high ^ gfMul(coefficient, EXP[i] ?? 0);
62
+ }
63
+ generator = next;
64
+ }
65
+ const remainder = new Uint8Array(eccLen);
66
+ for (const byte of data) {
67
+ const factor = byte ^ (remainder[0] ?? 0);
68
+ remainder.copyWithin(0, 1);
69
+ remainder[eccLen - 1] = 0;
70
+ if (factor !== 0) {
71
+ for (let i = 0; i < eccLen; i++) {
72
+ remainder[i] = (remainder[i] ?? 0) ^ gfMul(generator[i + 1] ?? 0, factor);
73
+ }
74
+ }
75
+ }
76
+ return remainder;
77
+ }
78
+ // --- bit assembly --------------------------------------------------------------
79
+ class BitBuffer {
80
+ bits = [];
81
+ push(value, length) {
82
+ for (let shift = length - 1; shift >= 0; shift--)
83
+ this.bits.push((value >>> shift) & 1);
84
+ }
85
+ }
86
+ function buildCodewords(text, version) {
87
+ const buffer = new BitBuffer();
88
+ buffer.push(0b0100, 4); // byte mode
89
+ buffer.push(text.length, 8);
90
+ for (const byte of text)
91
+ buffer.push(byte, 8);
92
+ // Terminator (up to 4 zero bits), then pad to a byte boundary.
93
+ buffer.push(0, Math.min(4, version.dataCodewords * 8 - buffer.bits.length));
94
+ while (buffer.bits.length % 8 !== 0)
95
+ buffer.push(0, 1);
96
+ const bytes = [];
97
+ for (let i = 0; i < buffer.bits.length; i += 8) {
98
+ let byte = 0;
99
+ for (let j = 0; j < 8; j++)
100
+ byte = (byte << 1) | (buffer.bits[i + j] ?? 0);
101
+ bytes.push(byte);
102
+ }
103
+ // Pad alternately 0xEC / 0x11 to the data capacity.
104
+ for (let pad = 0; bytes.length < version.dataCodewords; pad++)
105
+ bytes.push(pad % 2 === 0 ? 0xec : 0x11);
106
+ const remainder = rsRemainder(Uint8Array.from(bytes), version.eccCodewords);
107
+ return Uint8Array.from([...bytes, ...remainder]);
108
+ }
109
+ function blankGrid(size) {
110
+ return Array.from({ length: size }, () => new Array(size).fill(null));
111
+ }
112
+ function placeFinder(grid, row, col) {
113
+ const n = grid.length;
114
+ for (let dr = -1; dr <= 7; dr++) {
115
+ for (let dc = -1; dc <= 7; dc++) {
116
+ const r = row + dr;
117
+ const c = col + dc;
118
+ if (r < 0 || r >= n || c < 0 || c >= n)
119
+ continue;
120
+ const inRing = dr >= 0 && dr <= 6 && (dc === 0 || dc === 6);
121
+ const inRing2 = dc >= 0 && dc <= 6 && (dr === 0 || dr === 6);
122
+ const inCore = dr >= 2 && dr <= 4 && dc >= 2 && dc <= 4;
123
+ const target = grid[r];
124
+ if (target !== undefined)
125
+ target[c] = inRing || inRing2 || inCore;
126
+ }
127
+ }
128
+ }
129
+ function placeAlignment(grid, centers) {
130
+ for (const row of centers) {
131
+ for (const col of centers) {
132
+ // Skip the centers that sit inside a finder's 7×7 (only possible at
133
+ // the three corners; versions 2–5 have none).
134
+ let overlapsFinder = false;
135
+ for (const [fr, fc] of [[0, 0], [0, grid.length - 7], [grid.length - 7, 0]]) {
136
+ if (row >= fr - 1 && row <= fr + 7 && col >= fc - 1 && col <= fc + 7)
137
+ overlapsFinder = true;
138
+ }
139
+ if (overlapsFinder)
140
+ continue;
141
+ for (let dr = -2; dr <= 2; dr++) {
142
+ for (let dc = -2; dc <= 2; dc++) {
143
+ const target = grid[row + dr];
144
+ if (target !== undefined)
145
+ target[col + dc] = Math.max(Math.abs(dr), Math.abs(dc)) !== 1;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ function reserveFormatAreas(grid) {
152
+ const n = grid.length;
153
+ // `false` marks RESERVED (kept from the data placer, overwritten by the
154
+ // real format bits later); null stays "free for data".
155
+ const put = (row, col, value) => {
156
+ const target = grid[row];
157
+ if (target !== undefined)
158
+ target[col] = value;
159
+ };
160
+ for (let i = 0; i <= 8; i++) {
161
+ if (i !== 6)
162
+ put(8, i, false);
163
+ if (i !== 6)
164
+ put(i, 8, false);
165
+ }
166
+ for (let i = 0; i < 8; i++) {
167
+ put(n - 1 - i, 8, false);
168
+ // NOTE: unlike the first copy there is NO skip here — the second copy
169
+ // crosses no timing pattern, and leaving one cell unreserved (the
170
+ // first-copy rule pasted over) would let a data bit land inside it and
171
+ // desynchronize the whole stream (v2+).
172
+ put(8, n - 1 - i, false);
173
+ }
174
+ put(n - 8, 8, true); // the fixed dark module
175
+ }
176
+ function formatBits(mask) {
177
+ const data = (0b01 << 3) | mask; // ECC level L
178
+ let rem = data << 10;
179
+ for (let i = 4; i >= 0; i--) {
180
+ if ((rem >>> (i + 10)) & 1)
181
+ rem ^= 0x537 << i;
182
+ }
183
+ return ((data << 10) | rem) ^ 0x5412;
184
+ }
185
+ function placeFormat(grid, mask) {
186
+ const n = grid.length;
187
+ const bits = formatBits(mask);
188
+ // ISO/IEC 18004 Figure 25: bit 14 (MSB) sits at (8, 0) / (n - 1, 8) and
189
+ // bit 0 (LSB) sits at (0, 8) / (8, n - 1). Placing LSB-first reverses the
190
+ // 15-bit BCH codeword and makes every real scanner reject the symbol.
191
+ const bit = (index) => ((bits >>> index) & 1) === 1;
192
+ const put = (row, col, value) => {
193
+ const target = grid[row];
194
+ if (target !== undefined)
195
+ target[col] = value;
196
+ };
197
+ for (let i = 0; i <= 5; i++)
198
+ put(8, i, bit(14 - i));
199
+ put(8, 7, bit(8));
200
+ put(8, 8, bit(7));
201
+ put(7, 8, bit(6));
202
+ for (let i = 9; i <= 14; i++)
203
+ put(14 - i, 8, bit(14 - i));
204
+ for (let i = 0; i <= 6; i++)
205
+ put(n - 1 - i, 8, bit(14 - i));
206
+ for (let i = 7; i <= 14; i++)
207
+ put(8, n - 15 + i, bit(14 - i));
208
+ }
209
+ function placeData(grid, codewords) {
210
+ const n = grid.length;
211
+ // Fixed mask 0: (row + col) even flips. Any mask decodes; the penalty
212
+ // optimization is optional and this keeps the implementation small.
213
+ const maskFlips = (row, col) => (row + col) % 2 === 0;
214
+ let bitIndex = 7;
215
+ let byteIndex = 0;
216
+ let increment = -1;
217
+ let row = n - 1;
218
+ // The standard two-column zigzag: from the bottom-right corner upward,
219
+ // column PAIR by column PAIR, skipping the timing column pair (6).
220
+ for (let right = n - 1; right >= 0; right -= 2) {
221
+ if (right === 6)
222
+ right = 5;
223
+ // Fill the pair top-to-bottom or bottom-to-top until the edge.
224
+ while (true) {
225
+ const cells = grid[row];
226
+ // `row` is always in range here (the while loop flips before that can
227
+ // change); the guard only keeps a future invariant break non-fatal.
228
+ if (cells === undefined)
229
+ break;
230
+ for (let col = right; col >= right - 1; col--) {
231
+ const current = cells[col];
232
+ if (current !== true && current !== false) {
233
+ let dark = false;
234
+ const byte = codewords[byteIndex];
235
+ if (byte !== undefined && byteIndex < codewords.length)
236
+ dark = ((byte >>> bitIndex) & 1) === 1;
237
+ if (maskFlips(row, col))
238
+ dark = !dark;
239
+ cells[col] = dark;
240
+ bitIndex -= 1;
241
+ if (bitIndex === -1) {
242
+ byteIndex += 1;
243
+ bitIndex = 7;
244
+ }
245
+ }
246
+ }
247
+ row += increment;
248
+ if (row < 0 || row >= n) {
249
+ row -= increment;
250
+ increment = -increment;
251
+ break;
252
+ }
253
+ }
254
+ }
255
+ }
256
+ /**
257
+ * The QR matrix for `text` (UTF-8, byte mode), or null when it does not fit
258
+ * into a version-5-L symbol (106 bytes).
259
+ */
260
+ export function qrMatrix(text) {
261
+ const bytes = new TextEncoder().encode(text);
262
+ const version = VERSIONS.find((candidate) => candidate.capacity >= bytes.length);
263
+ if (version === undefined)
264
+ return null;
265
+ const grid = blankGrid(version.size);
266
+ placeFinder(grid, 0, 0);
267
+ placeFinder(grid, 0, version.size - 7);
268
+ placeFinder(grid, version.size - 7, 0);
269
+ if (version.alignment !== null)
270
+ placeAlignment(grid, version.alignment);
271
+ // Timing patterns.
272
+ for (let i = 8; i < version.size - 8; i++) {
273
+ const timingRow = grid[6];
274
+ const column = grid[i];
275
+ if (timingRow !== undefined && timingRow[i] === null)
276
+ timingRow[i] = i % 2 === 0;
277
+ if (column !== undefined && column[6] === null)
278
+ column[6] = i % 2 === 0;
279
+ }
280
+ reserveFormatAreas(grid);
281
+ const codewords = buildCodewords(bytes, version);
282
+ placeData(grid, codewords);
283
+ placeFormat(grid, 0);
284
+ return grid.map((row) => row.map((cell) => cell === true));
285
+ }
286
+ //# sourceMappingURL=qr.js.map