@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,441 @@
1
+ import { HttpClientRequest, Schema, schemas } from '@hs-x/types';
2
+ import { isLinked, loadStore } from '../account-store.js';
3
+ import { createCloudflareKvClient, resolveCloudflareCredentials } from '../cloudflare-kv.js';
4
+ import { loadCloudflarePointer, rewriteCloudflarePointerOwner } from '../cloudflare-pointer.js';
5
+ import { resolveControlPlaneUrl } from '../config.js';
6
+ import { executeCliHttp } from '../effect-http.js';
7
+ import { emitHelp } from '../help.js';
8
+ import { openInBrowser } from '../hubspot-auth.js';
9
+ import { getMachineId } from '../machine-id.js';
10
+ import { isInteractive, promptConfirm } from '../prompt.js';
11
+ import { createReporter } from '../reporter/index.js';
12
+ import { loadTenantStateStore, rewriteTenantOwnerPrefix } from '../tenant-state.js';
13
+ /**
14
+ * `hs-x link` attaches this project's tenant state (and the Cloudflare account
15
+ * it lives in) to an HS-X account.
16
+ *
17
+ * CLI-direct flow (no dashboard required):
18
+ * 1. Require a bearer session (`hs-x login` must have been run).
19
+ * 2. Require --account-id (which HS-X account to claim under).
20
+ * 3. Require `.hs-x/cloudflare.json` (the project must have been deployed
21
+ * at least once unlinked).
22
+ * 4. Preflight the control-plane notify endpoint to prove membership.
23
+ * 5. Idempotently rewrite `owners/local_xxx/**` → `owners/acct_<aid>/**` in
24
+ * tenant KV using the user's Cloudflare API token.
25
+ * 6. Rewrite `cloudflare.json` ownerId to `acct_<aid>`.
26
+ * 7. Best-effort POST /v1/accounts/{aid}/link/notify so the dashboard sees
27
+ * the claim event. A failed notify does not undo the local link.
28
+ *
29
+ * Per the migration design (Q3), this claims only the current project's owner.
30
+ * Multi-owner bulk claim (`--all`) is deferred until someone needs it.
31
+ */
32
+ export async function linkCommand({ argv, json, root, }) {
33
+ if (argv[1] === 'help' || argv.includes('--help')) {
34
+ emitHelp(linkHelpText(), json);
35
+ return { exitCode: 0 };
36
+ }
37
+ const projectRoot = root ?? process.cwd();
38
+ const reporter = createReporter({ command: 'link', argv });
39
+ // Session must exist.
40
+ if (!(await isLinked())) {
41
+ return errorResult({
42
+ argv,
43
+ json,
44
+ code: 'HSX_E_LINK_REQUIRED',
45
+ message: 'No active HS-X session. Run `hs-x login` first.',
46
+ hint: 'Magic-link login establishes the bearer session this command uses to POST the link/notify event.',
47
+ });
48
+ }
49
+ // Account selection.
50
+ const accountId = resolveFlag(argv, '--account-id') ?? process.env.HSX_ACCOUNT_ID;
51
+ // The project must have a `.hs-x/cloudflare.json` pointer to operate on.
52
+ const pointer = await loadCloudflarePointer(projectRoot);
53
+ if (!pointer) {
54
+ return errorResult({
55
+ argv,
56
+ json,
57
+ code: 'HSX_E_LINK_NO_POINTER',
58
+ message: '`.hs-x/cloudflare.json` not found in this project.',
59
+ hint: 'Deploy the project at least once before linking. `hs-x deploy` provisions the pointer on first run.',
60
+ });
61
+ }
62
+ if (!accountId) {
63
+ return linkViaDashboard({ argv, json, root: projectRoot, pointer });
64
+ }
65
+ // Already linked under the target account — idempotent no-op.
66
+ // HS-X account ids already carry the `acct_` prefix by convention; only
67
+ // synthesize one if a caller (or future-non-conformant id) lacks it.
68
+ const targetOwnerId = accountId.startsWith('acct_') ? accountId : `acct_${accountId}`;
69
+ if (pointer.ownerId === targetOwnerId) {
70
+ if (json) {
71
+ process.stdout.write(`${JSON.stringify({
72
+ ok: true,
73
+ command: 'link',
74
+ mode: 'noop',
75
+ accountId,
76
+ ownerId: pointer.ownerId,
77
+ cloudflareAccountId: pointer.cloudflareAccountId,
78
+ }, null, 2)}\n`);
79
+ }
80
+ else {
81
+ reporter.info(`Already linked to ${accountId} (owner ${pointer.ownerId}).`);
82
+ reporter.done('No change');
83
+ }
84
+ return { exitCode: 0 };
85
+ }
86
+ // Only `local_*` owners can be claimed via link. An `acct_*` owner is
87
+ // already attached to some other HS-X account; refuse rather than silently
88
+ // re-rewriting cross-account state.
89
+ if (!pointer.ownerId.startsWith('local_')) {
90
+ return errorResult({
91
+ argv,
92
+ json,
93
+ code: 'HSX_E_LINK_NOT_CLAIMABLE',
94
+ message: `Project owner ${pointer.ownerId} is already attached to a different HS-X account.`,
95
+ hint: 'Unlink and reset the local pointer first (see `hs-x unlink`), or contact support to transfer ownership.',
96
+ });
97
+ }
98
+ // Cloudflare API token is required to do the KV rewrite. Same precondition
99
+ // as a regular deploy, so users hitting `link` should already have it.
100
+ const { apiToken } = resolveCloudflareCredentials(argv);
101
+ if (!apiToken) {
102
+ return errorResult({
103
+ argv,
104
+ json,
105
+ code: 'HSX_E_INPUT_MISSING_API_TOKEN',
106
+ message: 'Missing Cloudflare API token.',
107
+ hint: 'Set CLOUDFLARE_API_TOKEN (or HSX_CLOUDFLARE_API_TOKEN) so the CLI can rewrite tenant KV keys.',
108
+ });
109
+ }
110
+ // Confirm with the user unless --yes is passed.
111
+ if (!json && isInteractive() && !argv.includes('--yes') && !argv.includes('-y')) {
112
+ const confirmed = await promptConfirm({
113
+ message: `Claim owner ${pointer.ownerId} under HS-X account ${accountId}? Tenant KV keys will be rewritten under owners/${targetOwnerId}/.`,
114
+ default: true,
115
+ });
116
+ if (confirmed === undefined || !confirmed) {
117
+ reporter.info('Cancelled.');
118
+ return { exitCode: 130 };
119
+ }
120
+ }
121
+ const claimedAt = new Date().toISOString();
122
+ const machineId = await getMachineId();
123
+ const notifyPayload = createLinkNotifyPayload({
124
+ machineId,
125
+ cloudflareAccountId: pointer.cloudflareAccountId,
126
+ claimedAt,
127
+ priorOwnerId: pointer.ownerId,
128
+ newOwnerId: targetOwnerId,
129
+ });
130
+ const preflightError = await postLinkNotify({
131
+ argv,
132
+ accountId,
133
+ payload: notifyPayload,
134
+ preflight: true,
135
+ });
136
+ if (preflightError) {
137
+ return errorResult({
138
+ argv,
139
+ json,
140
+ code: 'HSX_E_LINK_REQUIRED',
141
+ message: 'Control-plane refused the link claim.',
142
+ hint: preflightError,
143
+ });
144
+ }
145
+ const baseUrl = process.env.HSX_CLOUDFLARE_API_BASE_URL;
146
+ const kv = createCloudflareKvClient({
147
+ accountId: pointer.cloudflareAccountId,
148
+ apiToken,
149
+ namespaceId: pointer.stateKvNamespaceId,
150
+ ...(baseUrl ? { baseUrl } : {}),
151
+ });
152
+ const rewritten = await rewriteTenantOwnerPrefix({
153
+ kv,
154
+ from: pointer.ownerId,
155
+ to: targetOwnerId,
156
+ });
157
+ // Update the local pointer. If this fails after the KV rewrite succeeded the
158
+ // user's next deploy will see `owners/local_xxx/` empty (already deleted)
159
+ // and `owners/acct_<aid>/` populated; a re-run of `hs-x link` will be a
160
+ // pointer-only update because the KV side is idempotent.
161
+ await rewriteCloudflarePointerOwner({ root: projectRoot, ownerId: targetOwnerId });
162
+ // Best-effort second notify after the local commit. The preflight above
163
+ // already proved membership; failure here is only a dashboard freshness issue.
164
+ const notifyError = await postLinkNotify({ argv, accountId, payload: notifyPayload });
165
+ const result = {
166
+ ok: true,
167
+ command: 'link',
168
+ accountId,
169
+ cloudflareAccountId: pointer.cloudflareAccountId,
170
+ priorOwnerId: pointer.ownerId,
171
+ newOwnerId: targetOwnerId,
172
+ rewrittenKeyCount: rewritten.length,
173
+ claimedAt,
174
+ machineId,
175
+ ...(notifyError ? { notifyWarning: notifyError } : {}),
176
+ };
177
+ if (json) {
178
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
179
+ }
180
+ else {
181
+ reporter.header(accountId);
182
+ reporter.info(`Owner: ${pointer.ownerId} → ${targetOwnerId}`);
183
+ reporter.info(`Cloudflare account: ${pointer.cloudflareAccountId}`);
184
+ reporter.info(`Rewrote ${rewritten.length} tenant KV key${rewritten.length === 1 ? '' : 's'}.`);
185
+ reporter.info('Updated .hs-x/cloudflare.json. Commit the change so teammates inherit the link.');
186
+ if (notifyError) {
187
+ reporter.info(`Note: dashboard notify failed (${notifyError}). The link itself succeeded; retry by running \`hs-x link\` again (it is idempotent).`);
188
+ }
189
+ reporter.done('Linked');
190
+ }
191
+ return { exitCode: 0 };
192
+ }
193
+ async function postLinkNotify(input) {
194
+ const store = await loadStore();
195
+ const sessionToken = store.userSession?.sessionToken;
196
+ if (!sessionToken)
197
+ return 'no bearer session';
198
+ const url = new URL(`/v1/accounts/${encodeURIComponent(input.accountId)}/link/notify`, resolveControlPlaneUrl(input.argv));
199
+ if (input.preflight)
200
+ url.searchParams.set('preflight', '1');
201
+ try {
202
+ const response = await executeCliHttp(HttpClientRequest.post(url).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${sessionToken}`), HttpClientRequest.bodyText(JSON.stringify(input.payload), 'application/json')));
203
+ if (!response.ok) {
204
+ const body = await response.text().catch(() => '');
205
+ return `control-plane returned ${response.status}${body ? `: ${body.slice(0, 200)}` : ''}`;
206
+ }
207
+ return undefined;
208
+ }
209
+ catch (error) {
210
+ return error instanceof Error ? error.message : String(error);
211
+ }
212
+ }
213
+ async function linkViaDashboard(input) {
214
+ if (!input.pointer.ownerId.startsWith('local_')) {
215
+ return errorResult({
216
+ argv: input.argv,
217
+ json: input.json,
218
+ code: 'HSX_E_LINK_NOT_CLAIMABLE',
219
+ message: `Project owner ${input.pointer.ownerId} is already attached to an HS-X account.`,
220
+ hint: 'Unlink and reset the local pointer first (see `hs-x unlink`), or contact support to transfer ownership.',
221
+ });
222
+ }
223
+ const reporter = createReporter({ command: 'link', argv: input.argv });
224
+ const { apiToken } = resolveCloudflareCredentials(input.argv);
225
+ if (!apiToken) {
226
+ return errorResult({
227
+ argv: input.argv,
228
+ json: input.json,
229
+ code: 'HSX_E_INPUT_MISSING_API_TOKEN',
230
+ message: 'Missing Cloudflare API token.',
231
+ hint: 'Set CLOUDFLARE_API_TOKEN (or HSX_CLOUDFLARE_API_TOKEN) so the CLI can rewrite tenant KV keys.',
232
+ });
233
+ }
234
+ const machineId = await getMachineId();
235
+ const tenantState = await loadTenantStateStore({ argv: input.argv, root: input.root });
236
+ const ownerIds = tenantState
237
+ ? (await tenantState.stateStore.listOwners()).filter((ownerId) => ownerId.startsWith('local_'))
238
+ : [input.pointer.ownerId];
239
+ const pairing = await createLinkPairing({
240
+ argv: input.argv,
241
+ machineId,
242
+ cloudflareAccountId: input.pointer.cloudflareAccountId,
243
+ ownerIds: ownerIds.length > 0 ? ownerIds : [input.pointer.ownerId],
244
+ });
245
+ const dashboardUrl = linkDashboardUrl(pairing.dashboardUrl);
246
+ if (!input.json) {
247
+ reporter.header('dashboard claim');
248
+ reporter.info(`Machine: ${machineId}`);
249
+ reporter.info(`Owners: ${pairing.pairing.ownerIds.join(', ')}`);
250
+ reporter.info(`Open: ${dashboardUrl}`);
251
+ await openInBrowser(dashboardUrl);
252
+ reporter.info('Waiting for dashboard approval...');
253
+ }
254
+ let approved;
255
+ try {
256
+ approved = await pollLinkPairing({
257
+ argv: input.argv,
258
+ pairingId: pairing.pairing.pairingId,
259
+ });
260
+ }
261
+ catch (error) {
262
+ return errorResult({
263
+ argv: input.argv,
264
+ json: input.json,
265
+ code: 'HSX_E_LINK_REQUIRED',
266
+ message: 'Dashboard link approval timed out.',
267
+ hint: error instanceof Error ? error.message : String(error),
268
+ });
269
+ }
270
+ if (!approved.accountId || approved.status !== 'approved') {
271
+ return errorResult({
272
+ argv: input.argv,
273
+ json: input.json,
274
+ code: 'HSX_E_LINK_REQUIRED',
275
+ message: 'Dashboard link approval timed out.',
276
+ hint: `Open ${dashboardUrl} and approve the claim, then re-run hs-x link.`,
277
+ });
278
+ }
279
+ const targetOwnerId = approved.accountId.startsWith('acct_')
280
+ ? approved.accountId
281
+ : `acct_${approved.accountId}`;
282
+ const baseUrl = process.env.HSX_CLOUDFLARE_API_BASE_URL;
283
+ const kv = createCloudflareKvClient({
284
+ accountId: input.pointer.cloudflareAccountId,
285
+ apiToken,
286
+ namespaceId: input.pointer.stateKvNamespaceId,
287
+ ...(baseUrl ? { baseUrl } : {}),
288
+ });
289
+ const approvedOwnerIds = approved.approvedOwnerIds?.length
290
+ ? approved.approvedOwnerIds
291
+ : [input.pointer.ownerId];
292
+ let rewrittenKeyCount = 0;
293
+ for (const ownerId of approvedOwnerIds) {
294
+ rewrittenKeyCount += (await rewriteTenantOwnerPrefix({ kv, from: ownerId, to: targetOwnerId }))
295
+ .length;
296
+ }
297
+ if (approvedOwnerIds.includes(input.pointer.ownerId)) {
298
+ await rewriteCloudflarePointerOwner({ root: input.root, ownerId: targetOwnerId });
299
+ }
300
+ const claimedAt = approved.approvedAt ?? new Date().toISOString();
301
+ const notifyPayload = Schema.decodeUnknownSync(schemas.LinkNotifyRequest)({
302
+ machineId,
303
+ cloudflareAccountId: input.pointer.cloudflareAccountId,
304
+ claimedAt,
305
+ claimedOwners: approvedOwnerIds.map((priorOwnerId) => ({
306
+ priorOwnerId,
307
+ newOwnerId: targetOwnerId,
308
+ })),
309
+ });
310
+ const notifyError = await postLinkNotify({
311
+ argv: input.argv,
312
+ accountId: approved.accountId,
313
+ payload: notifyPayload,
314
+ });
315
+ const result = {
316
+ ok: true,
317
+ command: 'link',
318
+ mode: 'dashboard',
319
+ accountId: approved.accountId,
320
+ priorOwnerIds: approvedOwnerIds,
321
+ newOwnerId: targetOwnerId,
322
+ rewrittenKeyCount,
323
+ pairingId: approved.pairingId,
324
+ ...(notifyError ? { notifyWarning: notifyError } : {}),
325
+ };
326
+ if (input.json) {
327
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
328
+ }
329
+ else {
330
+ reporter.info(`Owner: ${approvedOwnerIds.join(', ')} → ${targetOwnerId}`);
331
+ reporter.info(`Rewrote ${rewrittenKeyCount} tenant KV key${rewrittenKeyCount === 1 ? '' : 's'}.`);
332
+ reporter.done('Linked');
333
+ }
334
+ return { exitCode: 0 };
335
+ }
336
+ async function createLinkPairing(input) {
337
+ const store = await loadStore();
338
+ const sessionToken = store.userSession?.sessionToken;
339
+ if (!sessionToken)
340
+ throw new Error('no bearer session');
341
+ const url = new URL('/v1/link/pairings', resolveControlPlaneUrl(input.argv));
342
+ const payload = Schema.decodeUnknownSync(schemas.LinkClaimPairingCreateRequest)({
343
+ machineId: input.machineId,
344
+ cloudflareAccountId: input.cloudflareAccountId,
345
+ ownerIds: input.ownerIds,
346
+ });
347
+ const response = await executeCliHttp(HttpClientRequest.post(url).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${sessionToken}`), HttpClientRequest.bodyText(JSON.stringify(payload), 'application/json')));
348
+ if (!response.ok) {
349
+ throw new Error(`control-plane returned ${response.status}: ${(await response.text()).slice(0, 200)}`);
350
+ }
351
+ return Schema.decodeUnknownSync(schemas.LinkClaimPairingCreateResponse)(await response.json());
352
+ }
353
+ async function pollLinkPairing(input) {
354
+ const store = await loadStore();
355
+ const sessionToken = store.userSession?.sessionToken;
356
+ if (!sessionToken)
357
+ throw new Error('no bearer session');
358
+ const url = new URL(`/v1/link/pairings/${encodeURIComponent(input.pairingId)}`, resolveControlPlaneUrl(input.argv));
359
+ for (let attempt = 0; attempt < 450; attempt += 1) {
360
+ const response = await executeCliHttp(HttpClientRequest.get(url).pipe(HttpClientRequest.setHeader('authorization', `Bearer ${sessionToken}`)));
361
+ if (response.ok) {
362
+ const body = Schema.decodeUnknownSync(schemas.LinkClaimPairingReadResponse)(await response.json());
363
+ if (body.pairing.status !== 'pending')
364
+ return body.pairing;
365
+ }
366
+ await new Promise((resolve) => setTimeout(resolve, 2000));
367
+ }
368
+ throw new Error('dashboard approval timed out');
369
+ }
370
+ function linkDashboardUrl(path) {
371
+ const base = process.env.HSX_DASHBOARD_URL ?? 'https://app.hs-x.dev';
372
+ return new URL(path, base).toString();
373
+ }
374
+ function createLinkNotifyPayload(input) {
375
+ return Schema.decodeUnknownSync(schemas.LinkNotifyRequest)({
376
+ machineId: input.machineId,
377
+ cloudflareAccountId: input.cloudflareAccountId,
378
+ claimedAt: input.claimedAt,
379
+ claimedOwners: [{ priorOwnerId: input.priorOwnerId, newOwnerId: input.newOwnerId }],
380
+ });
381
+ }
382
+ function errorResult(input) {
383
+ if (input.json) {
384
+ process.stdout.write(`${JSON.stringify({
385
+ ok: false,
386
+ command: 'link',
387
+ error: { code: input.code, message: input.message, hint: input.hint },
388
+ }, null, 2)}\n`);
389
+ }
390
+ else {
391
+ const reporter = createReporter({ command: 'link', argv: input.argv });
392
+ reporter.error(input.code, input.message, { hint: input.hint });
393
+ reporter.done(undefined, 10);
394
+ }
395
+ return { exitCode: 10 };
396
+ }
397
+ function linkHelpText() {
398
+ return `hs-x link
399
+
400
+ Attach this project's tenant Cloudflare KV state to an HS-X account.
401
+
402
+ Usage:
403
+ hs-x link [--cwd <dir>] [--json]
404
+ hs-x link --account-id <id> [--cwd <dir>] [--yes] [--json]
405
+
406
+ Preconditions:
407
+ - \`hs-x login\` has established a bearer session.
408
+ - The project has been deployed at least once (\`.hs-x/cloudflare.json\` exists).
409
+ - CLOUDFLARE_API_TOKEN is set so the CLI can rewrite tenant KV keys.
410
+
411
+ What it does:
412
+ 1. Idempotently rewrites \`owners/local_*/...\` → \`owners/acct_<id>/...\` in
413
+ the tenant \`hsx-state\` KV namespace.
414
+ 2. Updates \`.hs-x/cloudflare.json\` to point at the new ownerId. Commit
415
+ the one-line diff so teammates inherit the link.
416
+ 3. Without --account-id, opens the dashboard claim page and polls until the
417
+ browser approval chooses the target account.
418
+ 4. POSTs the link event to control-plane (best-effort dashboard freshness).
419
+
420
+ To unlink: \`hs-x unlink\` clears the local bearer session. The acct_<id>/
421
+ KV keys stay in place as a read-only archive.
422
+ `;
423
+ }
424
+ function isFlagValue(value) {
425
+ return value !== undefined && value.length > 0 && !value.startsWith('-');
426
+ }
427
+ function resolveFlag(argv, flag) {
428
+ const index = argv.indexOf(flag);
429
+ if (index !== -1) {
430
+ const next = argv[index + 1];
431
+ if (isFlagValue(next))
432
+ return next;
433
+ }
434
+ const prefix = `${flag}=`;
435
+ const found = argv.find((arg) => arg.startsWith(prefix));
436
+ if (!found)
437
+ return undefined;
438
+ const value = found.slice(prefix.length);
439
+ return value.length > 0 ? value : undefined;
440
+ }
441
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEpF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAChC,IAAI,EACJ,IAAI,EACJ,IAAI,GAKL;IACC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,QAAQ,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,sBAAsB;IACtB,IAAI,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,iDAAiD;YAC1D,IAAI,EAAE,kGAAkG;SACzG,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAClF,yEAAyE;IACzE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,WAAW,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,qGAAqG;SAC5G,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,8DAA8D;IAC9D,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC;IACtF,IAAI,OAAO,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CACf;gBACE,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,MAAM;gBACZ,SAAS;gBACT,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;aACjD,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,qBAAqB,SAAS,WAAW,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAC5E,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,sEAAsE;IACtE,2EAA2E;IAC3E,oCAAoC;IACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,iBAAiB,OAAO,CAAC,OAAO,mDAAmD;YAC5F,IAAI,EAAE,yGAAyG;SAChH,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,MAAM,EAAE,QAAQ,EAAE,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,WAAW,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,+BAA+B;YACrC,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,+FAA+F;SACtG,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,IAAI,IAAI,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;YACpC,OAAO,EAAE,eAAe,OAAO,CAAC,OAAO,uBAAuB,SAAS,mDAAmD,aAAa,IAAI;YAC3I,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,uBAAuB,CAAC;QAC5C,SAAS;QACT,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,SAAS;QACT,YAAY,EAAE,OAAO,CAAC,OAAO;QAC7B,UAAU,EAAE,aAAa;KAC1B,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC;QAC1C,IAAI;QACJ,SAAS;QACT,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC;YACjB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,uCAAuC;YAChD,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACxD,MAAM,EAAE,GAAG,wBAAwB,CAAC;QAClC,SAAS,EAAE,OAAO,CAAC,mBAAmB;QACtC,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,kBAAkB;QACvC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC;QAC/C,EAAE;QACF,IAAI,EAAE,OAAO,CAAC,OAAO;QACrB,EAAE,EAAE,aAAa;KAClB,CAAC,CAAC;IAEH,6EAA6E;IAC7E,0EAA0E;IAC1E,wEAAwE;IACxE,yDAAyD;IACzD,MAAM,6BAA6B,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEnF,wEAAwE;IACxE,+EAA+E;IAC/E,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAEtF,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM;QACf,SAAS;QACT,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,YAAY,EAAE,OAAO,CAAC,OAAO;QAC7B,UAAU,EAAE,aAAa;QACzB,iBAAiB,EAAE,SAAS,CAAC,MAAM;QACnC,SAAS;QACT,SAAS;QACT,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,OAAO,MAAM,aAAa,EAAE,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACpE,QAAQ,CAAC,IAAI,CAAC,WAAW,SAAS,CAAC,MAAM,iBAAiB,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAChG,QAAQ,CAAC,IAAI,CACX,iFAAiF,CAClF,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CACX,kCAAkC,WAAW,wFAAwF,CACtI,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAK7B;IACC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC;IACrD,IAAI,CAAC,YAAY;QAAE,OAAO,mBAAmB,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EACjE,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CACnC,CAAC;IACF,IAAI,KAAK,CAAC,SAAS;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAC9B,iBAAiB,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,YAAY,EAAE,CAAC,EACtE,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAC9E,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,OAAO,0BAA0B,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7F,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,KAK/B;IACC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,iBAAiB,KAAK,CAAC,OAAO,CAAC,OAAO,0CAA0C;YACzF,IAAI,EAAE,yGAAyG;SAChH,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,QAAQ,EAAE,GAAG,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,WAAW,CAAC;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,+BAA+B;YACrC,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,+FAA+F;SACtG,CAAC,CAAC;IACL,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/F,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACtC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS;QACT,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,mBAAmB;QACtD,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;KACnE,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;QACvC,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,QAA6D,CAAC;IAClE,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,eAAe,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;SACrC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1D,OAAO,WAAW,CAAC;YACjB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,QAAQ,YAAY,gDAAgD;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC;QAC1D,CAAC,CAAC,QAAQ,CAAC,SAAS;QACpB,CAAC,CAAC,QAAQ,QAAQ,CAAC,SAAS,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACxD,MAAM,EAAE,GAAG,wBAAwB,CAAC;QAClC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,mBAAmB;QAC5C,QAAQ;QACR,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,kBAAkB;QAC7C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,EAAE,MAAM;QACxD,CAAC,CAAC,QAAQ,CAAC,gBAAgB;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,iBAAiB,IAAI,CAAC,MAAM,wBAAwB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;aAC5F,MAAM,CAAC;IACZ,CAAC;IACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,6BAA6B,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClE,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxE,SAAS;QACT,mBAAmB,EAAE,KAAK,CAAC,OAAO,CAAC,mBAAmB;QACtD,SAAS;QACT,aAAa,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACrD,YAAY;YACZ,UAAU,EAAE,aAAa;SAC1B,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;QACvC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,aAAa;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,aAAa,EAAE,gBAAgB;QAC/B,UAAU,EAAE,aAAa;QACzB,iBAAiB;QACjB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,UAAU,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;QAC1E,QAAQ,CAAC,IAAI,CACX,WAAW,iBAAiB,iBAAiB,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CACnF,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,KAKhC;IACC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC;IACrD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC9E,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAC9B,iBAAiB,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,YAAY,EAAE,CAAC,EACtE,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CACxE,CACF,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,KAG9B;IACC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC;IACrD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAC1D,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CACnC,CAAC;IACF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAC7B,iBAAiB,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,YAAY,EAAE,CAAC,CACvE,CACF,CAAC;QACF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,4BAA4B,CAAC,CACzE,MAAM,QAAQ,CAAC,IAAI,EAAE,CACtB,CAAC;YACF,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,sBAAsB,CAAC;IACrE,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAMhC;IACC,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;KACpF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAMpB;IACC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CACf;YACE,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;SACtE,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,KAAyB;IAC5C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,IAAuB,EAAE,IAAY;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,IAAI,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACrC,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CliResult } from '../result.js';
2
+ export interface LoginCommandInput {
3
+ readonly argv: readonly string[];
4
+ readonly cwd?: string;
5
+ }
6
+ export declare function loginCommand(input: LoginCommandInput): Promise<CliResult>;
7
+ export declare function logoutCommand(input: LoginCommandInput): Promise<CliResult>;
8
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAgB/E;AAgWD,wBAAsB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAqBhF"}