@hs-x/cli 0.1.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 (302) hide show
  1. package/README.md +1001 -0
  2. package/dist/account-store.d.ts +51 -0
  3. package/dist/account-store.d.ts.map +1 -0
  4. package/dist/account-store.js +138 -0
  5. package/dist/account-store.js.map +1 -0
  6. package/dist/bin/hs-x.d.ts +3 -0
  7. package/dist/bin/hs-x.d.ts.map +1 -0
  8. package/dist/bin/hs-x.js +47 -0
  9. package/dist/bin/hs-x.js.map +1 -0
  10. package/dist/cli/index.d.ts +3 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +595 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli-error.d.ts +36 -0
  15. package/dist/cli-error.d.ts.map +1 -0
  16. package/dist/cli-error.js +40 -0
  17. package/dist/cli-error.js.map +1 -0
  18. package/dist/cloudflare-auth.d.ts +25 -0
  19. package/dist/cloudflare-auth.d.ts.map +1 -0
  20. package/dist/cloudflare-auth.js +251 -0
  21. package/dist/cloudflare-auth.js.map +1 -0
  22. package/dist/cloudflare-kv.d.ts +23 -0
  23. package/dist/cloudflare-kv.d.ts.map +1 -0
  24. package/dist/cloudflare-kv.js +101 -0
  25. package/dist/cloudflare-kv.js.map +1 -0
  26. package/dist/cloudflare-oauth-store.d.ts +16 -0
  27. package/dist/cloudflare-oauth-store.d.ts.map +1 -0
  28. package/dist/cloudflare-oauth-store.js +80 -0
  29. package/dist/cloudflare-oauth-store.js.map +1 -0
  30. package/dist/cloudflare-oauth.d.ts +82 -0
  31. package/dist/cloudflare-oauth.d.ts.map +1 -0
  32. package/dist/cloudflare-oauth.js +336 -0
  33. package/dist/cloudflare-oauth.js.map +1 -0
  34. package/dist/cloudflare-pointer.d.ts +13 -0
  35. package/dist/cloudflare-pointer.d.ts.map +1 -0
  36. package/dist/cloudflare-pointer.js +46 -0
  37. package/dist/cloudflare-pointer.js.map +1 -0
  38. package/dist/command-history.d.ts +7 -0
  39. package/dist/command-history.d.ts.map +1 -0
  40. package/dist/command-history.js +34 -0
  41. package/dist/command-history.js.map +1 -0
  42. package/dist/commands/account.d.ts +7 -0
  43. package/dist/commands/account.d.ts.map +1 -0
  44. package/dist/commands/account.js +315 -0
  45. package/dist/commands/account.js.map +1 -0
  46. package/dist/commands/api.d.ts +36 -0
  47. package/dist/commands/api.d.ts.map +1 -0
  48. package/dist/commands/api.js +521 -0
  49. package/dist/commands/api.js.map +1 -0
  50. package/dist/commands/completion.d.ts +7 -0
  51. package/dist/commands/completion.d.ts.map +1 -0
  52. package/dist/commands/completion.js +121 -0
  53. package/dist/commands/completion.js.map +1 -0
  54. package/dist/commands/connect.d.ts +7 -0
  55. package/dist/commands/connect.d.ts.map +1 -0
  56. package/dist/commands/connect.js +1123 -0
  57. package/dist/commands/connect.js.map +1 -0
  58. package/dist/commands/control-plane-read.d.ts +22 -0
  59. package/dist/commands/control-plane-read.d.ts.map +1 -0
  60. package/dist/commands/control-plane-read.js +350 -0
  61. package/dist/commands/control-plane-read.js.map +1 -0
  62. package/dist/commands/deploy-promote.d.ts +14 -0
  63. package/dist/commands/deploy-promote.d.ts.map +1 -0
  64. package/dist/commands/deploy-promote.js +105 -0
  65. package/dist/commands/deploy-promote.js.map +1 -0
  66. package/dist/commands/deploy.d.ts +18 -0
  67. package/dist/commands/deploy.d.ts.map +1 -0
  68. package/dist/commands/deploy.js +2764 -0
  69. package/dist/commands/deploy.js.map +1 -0
  70. package/dist/commands/dev.d.ts +7 -0
  71. package/dist/commands/dev.d.ts.map +1 -0
  72. package/dist/commands/dev.js +913 -0
  73. package/dist/commands/dev.js.map +1 -0
  74. package/dist/commands/doctor.d.ts +8 -0
  75. package/dist/commands/doctor.d.ts.map +1 -0
  76. package/dist/commands/doctor.js +258 -0
  77. package/dist/commands/doctor.js.map +1 -0
  78. package/dist/commands/flags.d.ts +22 -0
  79. package/dist/commands/flags.d.ts.map +1 -0
  80. package/dist/commands/flags.js +185 -0
  81. package/dist/commands/flags.js.map +1 -0
  82. package/dist/commands/help-command.d.ts +13 -0
  83. package/dist/commands/help-command.d.ts.map +1 -0
  84. package/dist/commands/help-command.js +482 -0
  85. package/dist/commands/help-command.js.map +1 -0
  86. package/dist/commands/history.d.ts +6 -0
  87. package/dist/commands/history.d.ts.map +1 -0
  88. package/dist/commands/history.js +42 -0
  89. package/dist/commands/history.js.map +1 -0
  90. package/dist/commands/init.d.ts +8 -0
  91. package/dist/commands/init.d.ts.map +1 -0
  92. package/dist/commands/init.js +233 -0
  93. package/dist/commands/init.js.map +1 -0
  94. package/dist/commands/link.d.ts +26 -0
  95. package/dist/commands/link.d.ts.map +1 -0
  96. package/dist/commands/link.js +441 -0
  97. package/dist/commands/link.js.map +1 -0
  98. package/dist/commands/login.d.ts +8 -0
  99. package/dist/commands/login.d.ts.map +1 -0
  100. package/dist/commands/login.js +381 -0
  101. package/dist/commands/login.js.map +1 -0
  102. package/dist/commands/migrate.d.ts +8 -0
  103. package/dist/commands/migrate.d.ts.map +1 -0
  104. package/dist/commands/migrate.js +258 -0
  105. package/dist/commands/migrate.js.map +1 -0
  106. package/dist/commands/rollback.d.ts +21 -0
  107. package/dist/commands/rollback.d.ts.map +1 -0
  108. package/dist/commands/rollback.js +301 -0
  109. package/dist/commands/rollback.js.map +1 -0
  110. package/dist/commands/secrets.d.ts +7 -0
  111. package/dist/commands/secrets.d.ts.map +1 -0
  112. package/dist/commands/secrets.js +230 -0
  113. package/dist/commands/secrets.js.map +1 -0
  114. package/dist/commands/status.d.ts +7 -0
  115. package/dist/commands/status.d.ts.map +1 -0
  116. package/dist/commands/status.js +241 -0
  117. package/dist/commands/status.js.map +1 -0
  118. package/dist/commands/unlink.d.ts +21 -0
  119. package/dist/commands/unlink.d.ts.map +1 -0
  120. package/dist/commands/unlink.js +83 -0
  121. package/dist/commands/unlink.js.map +1 -0
  122. package/dist/commands/update.d.ts +11 -0
  123. package/dist/commands/update.d.ts.map +1 -0
  124. package/dist/commands/update.js +154 -0
  125. package/dist/commands/update.js.map +1 -0
  126. package/dist/commands/validate.d.ts +9 -0
  127. package/dist/commands/validate.d.ts.map +1 -0
  128. package/dist/commands/validate.js +39 -0
  129. package/dist/commands/validate.js.map +1 -0
  130. package/dist/config.d.ts +12 -0
  131. package/dist/config.d.ts.map +1 -0
  132. package/dist/config.js +64 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/constants.d.ts +4 -0
  135. package/dist/constants.d.ts.map +1 -0
  136. package/dist/constants.js +4 -0
  137. package/dist/constants.js.map +1 -0
  138. package/dist/control-plane-fetch.d.ts +34 -0
  139. package/dist/control-plane-fetch.d.ts.map +1 -0
  140. package/dist/control-plane-fetch.js +73 -0
  141. package/dist/control-plane-fetch.js.map +1 -0
  142. package/dist/control-plane-loader.d.ts +16 -0
  143. package/dist/control-plane-loader.d.ts.map +1 -0
  144. package/dist/control-plane-loader.js +24 -0
  145. package/dist/control-plane-loader.js.map +1 -0
  146. package/dist/dev/compat-shim.d.ts +40 -0
  147. package/dist/dev/compat-shim.d.ts.map +1 -0
  148. package/dist/dev/compat-shim.js +65 -0
  149. package/dist/dev/compat-shim.js.map +1 -0
  150. package/dist/dev/event-bus.d.ts +27 -0
  151. package/dist/dev/event-bus.d.ts.map +1 -0
  152. package/dist/dev/event-bus.js +32 -0
  153. package/dist/dev/event-bus.js.map +1 -0
  154. package/dist/dev/log-server.d.ts +52 -0
  155. package/dist/dev/log-server.d.ts.map +1 -0
  156. package/dist/dev/log-server.js +216 -0
  157. package/dist/dev/log-server.js.map +1 -0
  158. package/dist/dev/session-manager.d.ts +33 -0
  159. package/dist/dev/session-manager.d.ts.map +1 -0
  160. package/dist/dev/session-manager.js +132 -0
  161. package/dist/dev/session-manager.js.map +1 -0
  162. package/dist/dev/stream-renderer.d.ts +22 -0
  163. package/dist/dev/stream-renderer.d.ts.map +1 -0
  164. package/dist/dev/stream-renderer.js +65 -0
  165. package/dist/dev/stream-renderer.js.map +1 -0
  166. package/dist/dev/tunnel.d.ts +40 -0
  167. package/dist/dev/tunnel.d.ts.map +1 -0
  168. package/dist/dev/tunnel.js +139 -0
  169. package/dist/dev/tunnel.js.map +1 -0
  170. package/dist/effect-http.d.ts +10 -0
  171. package/dist/effect-http.d.ts.map +1 -0
  172. package/dist/effect-http.js +38 -0
  173. package/dist/effect-http.js.map +1 -0
  174. package/dist/errors-registry.d.ts +11 -0
  175. package/dist/errors-registry.d.ts.map +1 -0
  176. package/dist/errors-registry.js +554 -0
  177. package/dist/errors-registry.js.map +1 -0
  178. package/dist/errors.d.ts +58 -0
  179. package/dist/errors.d.ts.map +1 -0
  180. package/dist/errors.js +30 -0
  181. package/dist/errors.js.map +1 -0
  182. package/dist/help.d.ts +6 -0
  183. package/dist/help.d.ts.map +1 -0
  184. package/dist/help.js +100 -0
  185. package/dist/help.js.map +1 -0
  186. package/dist/history.d.ts +15 -0
  187. package/dist/history.d.ts.map +1 -0
  188. package/dist/history.js +69 -0
  189. package/dist/history.js.map +1 -0
  190. package/dist/hubspot-auth.d.ts +53 -0
  191. package/dist/hubspot-auth.d.ts.map +1 -0
  192. package/dist/hubspot-auth.js +301 -0
  193. package/dist/hubspot-auth.js.map +1 -0
  194. package/dist/hubspot-developer-client.d.ts +10 -0
  195. package/dist/hubspot-developer-client.d.ts.map +1 -0
  196. package/dist/hubspot-developer-client.js +212 -0
  197. package/dist/hubspot-developer-client.js.map +1 -0
  198. package/dist/index.d.ts +5 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +4 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/init/templates.d.ts +18 -0
  203. package/dist/init/templates.d.ts.map +1 -0
  204. package/dist/init/templates.js +239 -0
  205. package/dist/init/templates.js.map +1 -0
  206. package/dist/load-env.d.ts +16 -0
  207. package/dist/load-env.d.ts.map +1 -0
  208. package/dist/load-env.js +69 -0
  209. package/dist/load-env.js.map +1 -0
  210. package/dist/machine-id.d.ts +3 -0
  211. package/dist/machine-id.d.ts.map +1 -0
  212. package/dist/machine-id.js +41 -0
  213. package/dist/machine-id.js.map +1 -0
  214. package/dist/paths.d.ts +4 -0
  215. package/dist/paths.d.ts.map +1 -0
  216. package/dist/paths.js +19 -0
  217. package/dist/paths.js.map +1 -0
  218. package/dist/prompt.d.ts +43 -0
  219. package/dist/prompt.d.ts.map +1 -0
  220. package/dist/prompt.js +379 -0
  221. package/dist/prompt.js.map +1 -0
  222. package/dist/reporter/human.d.ts +28 -0
  223. package/dist/reporter/human.d.ts.map +1 -0
  224. package/dist/reporter/human.js +126 -0
  225. package/dist/reporter/human.js.map +1 -0
  226. package/dist/reporter/index.d.ts +14 -0
  227. package/dist/reporter/index.d.ts.map +1 -0
  228. package/dist/reporter/index.js +37 -0
  229. package/dist/reporter/index.js.map +1 -0
  230. package/dist/reporter/json.d.ts +43 -0
  231. package/dist/reporter/json.d.ts.map +1 -0
  232. package/dist/reporter/json.js +146 -0
  233. package/dist/reporter/json.js.map +1 -0
  234. package/dist/reporter/style.d.ts +34 -0
  235. package/dist/reporter/style.d.ts.map +1 -0
  236. package/dist/reporter/style.js +97 -0
  237. package/dist/reporter/style.js.map +1 -0
  238. package/dist/reporter/types.d.ts +41 -0
  239. package/dist/reporter/types.d.ts.map +1 -0
  240. package/dist/reporter/types.js +2 -0
  241. package/dist/reporter/types.js.map +1 -0
  242. package/dist/result.d.ts +4 -0
  243. package/dist/result.d.ts.map +1 -0
  244. package/dist/result.js +2 -0
  245. package/dist/result.js.map +1 -0
  246. package/dist/services/account-store.d.ts +31 -0
  247. package/dist/services/account-store.d.ts.map +1 -0
  248. package/dist/services/account-store.js +135 -0
  249. package/dist/services/account-store.js.map +1 -0
  250. package/dist/services/app-paths.d.ts +25 -0
  251. package/dist/services/app-paths.d.ts.map +1 -0
  252. package/dist/services/app-paths.js +34 -0
  253. package/dist/services/app-paths.js.map +1 -0
  254. package/dist/services/cloudflare-auth.d.ts +83 -0
  255. package/dist/services/cloudflare-auth.d.ts.map +1 -0
  256. package/dist/services/cloudflare-auth.js +30 -0
  257. package/dist/services/cloudflare-auth.js.map +1 -0
  258. package/dist/services/cloudflare-kv.d.ts +45 -0
  259. package/dist/services/cloudflare-kv.d.ts.map +1 -0
  260. package/dist/services/cloudflare-kv.js +151 -0
  261. package/dist/services/cloudflare-kv.js.map +1 -0
  262. package/dist/services/command-history.d.ts +29 -0
  263. package/dist/services/command-history.d.ts.map +1 -0
  264. package/dist/services/command-history.js +62 -0
  265. package/dist/services/command-history.js.map +1 -0
  266. package/dist/services/control-plane.d.ts +32 -0
  267. package/dist/services/control-plane.d.ts.map +1 -0
  268. package/dist/services/control-plane.js +57 -0
  269. package/dist/services/control-plane.js.map +1 -0
  270. package/dist/services/env-loader.d.ts +18 -0
  271. package/dist/services/env-loader.d.ts.map +1 -0
  272. package/dist/services/env-loader.js +34 -0
  273. package/dist/services/env-loader.js.map +1 -0
  274. package/dist/services/http.d.ts +19 -0
  275. package/dist/services/http.d.ts.map +1 -0
  276. package/dist/services/http.js +9 -0
  277. package/dist/services/http.js.map +1 -0
  278. package/dist/services/live.d.ts +16 -0
  279. package/dist/services/live.d.ts.map +1 -0
  280. package/dist/services/live.js +26 -0
  281. package/dist/services/live.js.map +1 -0
  282. package/dist/services/machine-id.d.ts +18 -0
  283. package/dist/services/machine-id.d.ts.map +1 -0
  284. package/dist/services/machine-id.js +39 -0
  285. package/dist/services/machine-id.js.map +1 -0
  286. package/dist/services/reporter.d.ts +55 -0
  287. package/dist/services/reporter.d.ts.map +1 -0
  288. package/dist/services/reporter.js +49 -0
  289. package/dist/services/reporter.js.map +1 -0
  290. package/dist/state-store.d.ts +39 -0
  291. package/dist/state-store.d.ts.map +1 -0
  292. package/dist/state-store.js +89 -0
  293. package/dist/state-store.js.map +1 -0
  294. package/dist/telemetry.d.ts +13 -0
  295. package/dist/telemetry.d.ts.map +1 -0
  296. package/dist/telemetry.js +129 -0
  297. package/dist/telemetry.js.map +1 -0
  298. package/dist/tenant-state.d.ts +69 -0
  299. package/dist/tenant-state.d.ts.map +1 -0
  300. package/dist/tenant-state.js +161 -0
  301. package/dist/tenant-state.js.map +1 -0
  302. package/package.json +38 -0
@@ -0,0 +1,381 @@
1
+ import { defaultStorePath, loadStore, setUserSession, clearUserSession, } from '../account-store.js';
2
+ import { HttpClientRequest, Schema, schemas } from '@hs-x/types';
3
+ import { DEFAULT_CONTROL_PLANE_URL, resolveControlPlaneUrl } from '../config.js';
4
+ import { executeCliHttp } from '../effect-http.js';
5
+ import { emitHelp } from '../help.js';
6
+ import { openInBrowser } from '../hubspot-auth.js';
7
+ import { getMachineId } from '../machine-id.js';
8
+ import { promptText } from '../prompt.js';
9
+ import { createReporter } from '../reporter/index.js';
10
+ import os from 'node:os';
11
+ const SESSION_COOKIE_NAME = '__Secure-hsx_session';
12
+ const THIRTY_DAYS_MS = 30 * 24 * 3_600_000;
13
+ export async function loginCommand(input) {
14
+ const argv = input.argv;
15
+ const sub = argv[0];
16
+ const json = argv.includes('--json');
17
+ if (sub === 'help' || sub === '--help' || sub === '-h') {
18
+ emitHelp(loginHelpText(), json);
19
+ return { exitCode: 0 };
20
+ }
21
+ // Default is the device-authorization flow; magic-link is the browserless /
22
+ // CI fallback kept behind --magic-link.
23
+ if (argv.includes('--magic-link')) {
24
+ return magicLinkLogin(input);
25
+ }
26
+ return deviceFlowLogin(input);
27
+ }
28
+ /* -------------------------------------------------------------------------- */
29
+ /* Device-authorization flow (default) */
30
+ /* -------------------------------------------------------------------------- */
31
+ async function deviceFlowLogin(input) {
32
+ const argv = input.argv;
33
+ const json = argv.includes('--json');
34
+ const reporter = createReporter({ command: 'login', argv, entry: true });
35
+ if (!json)
36
+ reporter.banner();
37
+ const controlPlaneUrl = resolveControlPlaneUrl(argv);
38
+ if (!json)
39
+ reporter.header(`device login → ${controlPlaneUrl}`);
40
+ const machineId = await getMachineId();
41
+ const deviceName = os.hostname() || 'unknown-device';
42
+ const cwd = input.cwd ?? process.cwd();
43
+ // Step 1: create the pairing (unauthenticated — the CLI has no session yet).
44
+ let created;
45
+ try {
46
+ const payload = Schema.decodeUnknownSync(schemas.CliLoginPairingCreateRequest)({
47
+ machineId,
48
+ deviceName,
49
+ cwd,
50
+ });
51
+ const response = await executeCliHttp(HttpClientRequest.post(new URL('/v1/cli/login/pairings', controlPlaneUrl)).pipe(HttpClientRequest.bodyText(JSON.stringify(payload), 'application/json')));
52
+ if (!response.ok) {
53
+ const body = await response.text().catch(() => '');
54
+ reporter.error('HSX_E_API_UNEXPECTED', `Control plane refused to start a login pairing (${response.status}).`, { hint: body.slice(0, 200) || 'Check your network and try again.' });
55
+ reporter.done(undefined, 1);
56
+ return { exitCode: 1 };
57
+ }
58
+ created = Schema.decodeUnknownSync(schemas.CliLoginPairingCreateResponse)(await response.json());
59
+ }
60
+ catch (error) {
61
+ reporter.error('HSX_E_API_UNEXPECTED', 'Could not start a login pairing.', {
62
+ hint: error instanceof Error ? error.message : String(error),
63
+ });
64
+ reporter.done(undefined, 1);
65
+ return { exitCode: 1 };
66
+ }
67
+ // Step 2/3: show the code and open the dashboard approval page. The
68
+ // pairingId is not a secret — the dashboard needs it to call /approve.
69
+ const authorizeUrl = cliAuthorizeUrl(created.userCode, created.pairingId);
70
+ if (json) {
71
+ process.stdout.write(`${JSON.stringify({
72
+ ok: true,
73
+ command: 'login',
74
+ mode: 'device',
75
+ status: 'pending',
76
+ userCode: created.userCode,
77
+ pairingId: created.pairingId,
78
+ verificationUri: authorizeUrl,
79
+ })}\n`);
80
+ }
81
+ else {
82
+ reporter.block([
83
+ `Code ${created.userCode}`,
84
+ `Approve ${authorizeUrl}`,
85
+ `Device ${deviceName}`,
86
+ ].join('\n'));
87
+ await openInBrowser(authorizeUrl);
88
+ reporter.info('Waiting for approval in your browser…');
89
+ }
90
+ // Step 4: poll until approved / expired / timeout. The deviceCode is the
91
+ // poll bearer; it is held only by this CLI process.
92
+ let result;
93
+ try {
94
+ result = await pollCliLoginPairing({
95
+ controlPlaneUrl,
96
+ pairingId: created.pairingId,
97
+ deviceCode: created.deviceCode,
98
+ intervalSeconds: created.interval,
99
+ expiresInSeconds: created.expiresIn,
100
+ });
101
+ }
102
+ catch (error) {
103
+ reporter.error('HSX_E_API_UNEXPECTED', 'Login polling failed.', {
104
+ hint: error instanceof Error ? error.message : String(error),
105
+ });
106
+ reporter.done(undefined, 1);
107
+ return { exitCode: 1 };
108
+ }
109
+ if (result.status === 'expired') {
110
+ reporter.error('HSX_E_API_UNAUTHORIZED', 'Login request expired before approval.', {
111
+ hint: 'Re-run `hs-x login` and approve the code in the dashboard within the time limit.',
112
+ });
113
+ reporter.done(undefined, 1);
114
+ return { exitCode: 1 };
115
+ }
116
+ if (result.status !== 'approved' || !result.token) {
117
+ reporter.error('HSX_E_API_UNEXPECTED', 'Login was not approved in time.', {
118
+ hint: `Open ${authorizeUrl} to approve, then re-run \`hs-x login\`.`,
119
+ });
120
+ reporter.done(undefined, 1);
121
+ return { exitCode: 1 };
122
+ }
123
+ // Step 5: persist the PAT as the bearer session.
124
+ const session = {
125
+ sessionToken: result.token,
126
+ expiresAt: result.expiresAt ?? new Date(Date.now() + THIRTY_DAYS_MS).toISOString(),
127
+ email: result.email ?? '',
128
+ userId: result.userId ?? '',
129
+ ...(result.accountId ? { accountId: result.accountId } : {}),
130
+ };
131
+ await setUserSession(session, defaultStorePath());
132
+ if (json) {
133
+ process.stdout.write(`${JSON.stringify({
134
+ ok: true,
135
+ command: 'login',
136
+ mode: 'device',
137
+ status: 'approved',
138
+ userId: session.userId,
139
+ email: session.email,
140
+ ...(session.accountId ? { accountId: session.accountId } : {}),
141
+ })}\n`);
142
+ }
143
+ else {
144
+ const who = session.email || session.userId || 'your account';
145
+ reporter.block(`Session stored in ${defaultStorePath()} · \`hs-x logout\` to revoke`);
146
+ reporter.done(`Logged in as ${who}${session.accountId ? ` (account ${session.accountId})` : ''}`, 0);
147
+ }
148
+ return { exitCode: 0 };
149
+ }
150
+ async function pollCliLoginPairing(input) {
151
+ const intervalMs = Math.max(1, input.intervalSeconds) * 1000;
152
+ const deadline = Date.now() + Math.max(1, input.expiresInSeconds) * 1000;
153
+ const url = new URL(`/v1/cli/login/pairings/${encodeURIComponent(input.pairingId)}`, input.controlPlaneUrl);
154
+ let last = { status: 'pending' };
155
+ while (Date.now() < deadline) {
156
+ const response = await executeCliHttp(HttpClientRequest.get(url).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${input.deviceCode}`)));
157
+ if (response.ok) {
158
+ last = Schema.decodeUnknownSync(schemas.CliLoginPairingReadResponse)(await response.json());
159
+ if (last.status === 'approved' && last.token)
160
+ return last;
161
+ if (last.status === 'expired')
162
+ return last;
163
+ }
164
+ else if (response.status === 404) {
165
+ throw new Error('Login pairing not found (it may have expired or been revoked).');
166
+ }
167
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
168
+ }
169
+ return last;
170
+ }
171
+ function cliAuthorizeUrl(userCode, pairingId) {
172
+ const base = process.env.HSX_DASHBOARD_URL ?? 'https://app.hs-x.dev';
173
+ const url = new URL('/cli/authorize', base);
174
+ url.searchParams.set('code', userCode);
175
+ url.searchParams.set('pairing', pairingId);
176
+ return url.toString();
177
+ }
178
+ /* -------------------------------------------------------------------------- */
179
+ /* Magic-link flow (--magic-link fallback) */
180
+ /* -------------------------------------------------------------------------- */
181
+ async function magicLinkLogin(input) {
182
+ const argv = input.argv;
183
+ const json = argv.includes('--json');
184
+ const reporter = createReporter({ command: 'login', argv, entry: true });
185
+ if (!json)
186
+ reporter.banner();
187
+ const controlPlaneUrl = resolveControlPlaneUrl(argv);
188
+ reporter.header(`magic-link → ${controlPlaneUrl}`);
189
+ const email = resolveFlag(argv, '--email') ??
190
+ process.env.HSX_LOGIN_EMAIL ??
191
+ (await promptText({
192
+ message: 'Email address',
193
+ validate: (value) => /.+@.+\..+/.test(value) ? undefined : 'Enter a valid email address.',
194
+ }));
195
+ if (!email || email.length === 0) {
196
+ reporter.error('HSX_E_INPUT_MISSING_VALUE', 'Email is required for login.', {
197
+ hint: 'Re-run with --email <you@example.com> or HSX_LOGIN_EMAIL=...',
198
+ docs_url: 'https://hs-x.dev/errors/HSX_E_INPUT_MISSING_VALUE',
199
+ });
200
+ reporter.done(undefined, 10);
201
+ return { exitCode: 10 };
202
+ }
203
+ // Step 1: ask the control plane to mint and email a magic link.
204
+ const start = await executeCliHttp(HttpClientRequest.post(new URL('/v1/auth/magic-link/start', controlPlaneUrl)).pipe(HttpClientRequest.bodyText(JSON.stringify({ email, redirectTo: '/' }), 'application/json')));
205
+ if (!start.ok) {
206
+ const body = await start.text();
207
+ reporter.error('HSX_E_API_UNEXPECTED', `Control plane refused to send a magic link (${start.status}).`, { hint: body.slice(0, 200) || 'Check your network and try again.' });
208
+ reporter.done(undefined, 1);
209
+ return { exitCode: 1 };
210
+ }
211
+ reporter.info(`Magic link sent to ${email}. Check your inbox.`);
212
+ // Step 2: ask the user to paste the link from their email. The email links to
213
+ // the dashboard callback (`/auth/callback?token=…`), so accept any URL that
214
+ // carries a `token` param — we only need the token, and we re-derive the
215
+ // control-plane consume URL ourselves below.
216
+ const linkUrl = await promptText({
217
+ message: 'Paste the magic link URL from the email',
218
+ validate: (value) => {
219
+ try {
220
+ return new URL(value.trim()).searchParams.get('token')
221
+ ? undefined
222
+ : 'That URL has no ?token=… parameter. Paste the full link from the email.';
223
+ }
224
+ catch {
225
+ return 'Enter the full URL from the email (it should start with https://).';
226
+ }
227
+ },
228
+ });
229
+ if (!linkUrl) {
230
+ reporter.error('HSX_E_INPUT_MISSING_VALUE', 'No magic-link URL provided.', {
231
+ hint: 'Click the link in your email and paste the URL, or re-run `hs-x login`.',
232
+ });
233
+ reporter.done(undefined, 10);
234
+ return { exitCode: 10 };
235
+ }
236
+ let consumeUrl;
237
+ try {
238
+ consumeUrl = new URL(linkUrl);
239
+ }
240
+ catch {
241
+ reporter.error('HSX_E_INPUT_BAD_FIELD', 'Pasted value is not a valid URL.', {});
242
+ reporter.done(undefined, 10);
243
+ return { exitCode: 10 };
244
+ }
245
+ const token = consumeUrl.searchParams.get('token');
246
+ if (!token) {
247
+ reporter.error('HSX_E_INPUT_BAD_FIELD', 'Pasted URL has no `token` query param.', {});
248
+ reporter.done(undefined, 10);
249
+ return { exitCode: 10 };
250
+ }
251
+ // Step 3: consume the token ourselves. The CP responds 302 + Set-Cookie;
252
+ // we intercept (manual redirect) and parse the cookie value, which is the
253
+ // bearer the runtime auth.ts validates via `getWebSessionByToken`.
254
+ const consume = await executeCliHttp(HttpClientRequest.get(new URL(`/v1/auth/magic-link/consume?token=${encodeURIComponent(token)}`, controlPlaneUrl)), { redirect: 'manual' });
255
+ if (consume.status !== 302) {
256
+ const body = await consume.text();
257
+ reporter.error('HSX_E_API_UNEXPECTED', `Magic-link consume failed (${consume.status}).`, { hint: body.slice(0, 200) });
258
+ reporter.done(undefined, 1);
259
+ return { exitCode: 1 };
260
+ }
261
+ const setCookie = consume.headers.get('set-cookie');
262
+ if (!setCookie) {
263
+ reporter.error('HSX_E_API_UNEXPECTED', 'Magic-link consume did not set a session cookie.', {});
264
+ reporter.done(undefined, 1);
265
+ return { exitCode: 1 };
266
+ }
267
+ const sessionToken = extractCookieValue(setCookie, SESSION_COOKIE_NAME);
268
+ if (!sessionToken) {
269
+ reporter.error('HSX_E_API_UNEXPECTED', `Magic-link consume Set-Cookie did not contain ${SESSION_COOKIE_NAME}.`, { hint: 'Server may be misconfigured; try again or contact support.' });
270
+ reporter.done(undefined, 1);
271
+ return { exitCode: 1 };
272
+ }
273
+ const expiresAt = extractCookieExpires(setCookie) ?? new Date(Date.now() + THIRTY_DAYS_MS).toISOString();
274
+ // Step 4: confirm with /v1/sessions/me so we know who we are.
275
+ const me = await executeCliHttp(HttpClientRequest.get(new URL('/v1/sessions/me', controlPlaneUrl)).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${sessionToken}`)));
276
+ if (!me.ok) {
277
+ reporter.error('HSX_E_API_UNAUTHORIZED', `Session token works for the cookie path but Bearer auth failed (${me.status}).`, { hint: 'The control-plane worker may not yet accept Bearer tokens on /v1/sessions/me.' });
278
+ reporter.done(undefined, 1);
279
+ return { exitCode: 1 };
280
+ }
281
+ const meBody = (await me.json());
282
+ if (!meBody.user) {
283
+ reporter.error('HSX_E_API_UNEXPECTED', '/v1/sessions/me returned an unexpected shape.', {});
284
+ reporter.done(undefined, 1);
285
+ return { exitCode: 1 };
286
+ }
287
+ const session = {
288
+ sessionToken,
289
+ expiresAt,
290
+ email: meBody.user.email,
291
+ userId: meBody.user.id,
292
+ };
293
+ await setUserSession(session, defaultStorePath());
294
+ reporter.info(`Logged in as ${meBody.user.email} (user_id=${meBody.user.id}).`);
295
+ reporter.info(`Session stored in ${defaultStorePath()}. Use \`hs-x logout\` to revoke.`);
296
+ reporter.done(undefined, 0);
297
+ return { exitCode: 0 };
298
+ }
299
+ export async function logoutCommand(input) {
300
+ const argv = input.argv;
301
+ const json = argv.includes('--json');
302
+ const reporter = createReporter({ command: 'logout', argv, entry: true });
303
+ const store = await loadStore();
304
+ if (!store.userSession) {
305
+ reporter.info('Not logged in.');
306
+ reporter.done(undefined, 0);
307
+ return { exitCode: 0 };
308
+ }
309
+ const controlPlaneUrl = resolveControlPlaneUrl(argv);
310
+ await executeCliHttp(HttpClientRequest.post(new URL('/v1/sessions/logout', controlPlaneUrl)).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${store.userSession.sessionToken}`))).catch(() => undefined);
311
+ await clearUserSession(defaultStorePath());
312
+ if (!json)
313
+ reporter.info('Logged out. Local session cleared.');
314
+ else
315
+ process.stdout.write(`${JSON.stringify({ ok: true })}\n`);
316
+ reporter.done(undefined, 0);
317
+ return { exitCode: 0 };
318
+ }
319
+ function extractCookieValue(setCookie, name) {
320
+ // wrangler / undici may concatenate multiple Set-Cookie headers with commas.
321
+ // Cookie values themselves never contain commas in our case (token is base64url).
322
+ for (const segment of setCookie.split(/,\s*(?=[\w-]+=)/)) {
323
+ const [pair] = segment.split(';', 1);
324
+ if (!pair)
325
+ continue;
326
+ const eq = pair.indexOf('=');
327
+ if (eq <= 0)
328
+ continue;
329
+ if (pair.slice(0, eq).trim() === name) {
330
+ return pair.slice(eq + 1).trim();
331
+ }
332
+ }
333
+ return undefined;
334
+ }
335
+ function extractCookieExpires(setCookie) {
336
+ const match = /Expires=([^;]+)/i.exec(setCookie);
337
+ if (!match || !match[1])
338
+ return undefined;
339
+ const parsed = new Date(match[1]);
340
+ return Number.isFinite(parsed.getTime()) ? parsed.toISOString() : undefined;
341
+ }
342
+ function resolveFlag(argv, name) {
343
+ for (let i = 0; i < argv.length; i += 1) {
344
+ if (argv[i] === name)
345
+ return argv[i + 1];
346
+ if (argv[i]?.startsWith(`${name}=`))
347
+ return argv[i].slice(name.length + 1);
348
+ }
349
+ return undefined;
350
+ }
351
+ function loginHelpText() {
352
+ return `hs-x login
353
+
354
+ Log the current shell into the HS-X control plane.
355
+
356
+ Usage:
357
+ hs-x login [--control-plane-url <url>]
358
+ hs-x login --magic-link [--email <you@example.com>] [--control-plane-url <url>]
359
+
360
+ Default (device authorization):
361
+ 1. We create a login pairing on the control plane and show you a short
362
+ code (e.g. ABCD-1234), then open the dashboard approval page.
363
+ 2. Approve the code in your browser (you choose which account the CLI
364
+ token is scoped to). The control plane mints a Personal Access Token.
365
+ 3. We poll until approval, then store the PAT in
366
+ $XDG_CONFIG_HOME/hs-x/config.json and send it as
367
+ Authorization: Bearer <token> on later commands.
368
+
369
+ Fallback (--magic-link, for browserless / CI):
370
+ 1. We POST your email to the control plane; it sends you a magic-link.
371
+ 2. Paste the URL from that email here. We extract the token, call the
372
+ consume endpoint ourselves, and store the captured session cookie.
373
+
374
+ To leave: \`hs-x logout\` revokes the session on the control plane and
375
+ clears the local copy. The default control-plane URL is
376
+ ${DEFAULT_CONTROL_PLANE_URL}; override with --control-plane-url or
377
+ HSX_CONTROL_PLANE_URL. The dashboard URL defaults to https://app.hs-x.dev;
378
+ override with HSX_DASHBOARD_URL.
379
+ `;
380
+ }
381
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CliResult } from '../result.js';
2
+ export declare function migrateCommand({ argv, cwd, json, }: {
3
+ readonly argv: readonly string[];
4
+ readonly cwd: string;
5
+ readonly json: boolean;
6
+ }): Promise<CliResult>;
7
+ export declare function migrateHelpText(): string;
8
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,cAAc,CAAC,EACnC,IAAI,EACJ,GAAG,EACH,IAAI,GACL,EAAE;IACD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,CAAC,CAyGrB;AA2LD,wBAAgB,eAAe,IAAI,MAAM,CASxC"}