@hs-x/cli 0.2.7 → 0.3.6

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 (285) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +25 -8
  3. package/dist/audit-interactive.d.ts +29 -0
  4. package/dist/audit-interactive.d.ts.map +1 -0
  5. package/dist/audit-interactive.js +156 -0
  6. package/dist/audit-interactive.js.map +1 -0
  7. package/dist/bin/hs-x.js.map +1 -1
  8. package/dist/checkpoint-interactive.d.ts +24 -0
  9. package/dist/checkpoint-interactive.d.ts.map +1 -0
  10. package/dist/checkpoint-interactive.js +65 -0
  11. package/dist/checkpoint-interactive.js.map +1 -0
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +266 -39
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/kit.d.ts +1 -1
  16. package/dist/cli/kit.d.ts.map +1 -1
  17. package/dist/cli/kit.js +19 -3
  18. package/dist/cli/kit.js.map +1 -1
  19. package/dist/cloudflare-auth.d.ts +8 -0
  20. package/dist/cloudflare-auth.d.ts.map +1 -1
  21. package/dist/cloudflare-auth.js +12 -2
  22. package/dist/cloudflare-auth.js.map +1 -1
  23. package/dist/cloudflare-oauth-store.d.ts +9 -1
  24. package/dist/cloudflare-oauth-store.d.ts.map +1 -1
  25. package/dist/cloudflare-oauth-store.js +23 -4
  26. package/dist/cloudflare-oauth-store.js.map +1 -1
  27. package/dist/cloudflare-oauth.d.ts +1 -0
  28. package/dist/cloudflare-oauth.d.ts.map +1 -1
  29. package/dist/cloudflare-oauth.js +6 -2
  30. package/dist/cloudflare-oauth.js.map +1 -1
  31. package/dist/commands/account.d.ts +28 -13
  32. package/dist/commands/account.d.ts.map +1 -1
  33. package/dist/commands/account.js +219 -69
  34. package/dist/commands/account.js.map +1 -1
  35. package/dist/commands/api.d.ts.map +1 -1
  36. package/dist/commands/api.js +7 -11
  37. package/dist/commands/api.js.map +1 -1
  38. package/dist/commands/completion.d.ts.map +1 -1
  39. package/dist/commands/completion.js +13 -7
  40. package/dist/commands/completion.js.map +1 -1
  41. package/dist/commands/connect.d.ts.map +1 -1
  42. package/dist/commands/connect.js +239 -125
  43. package/dist/commands/connect.js.map +1 -1
  44. package/dist/commands/control-plane-read.d.ts +71 -10
  45. package/dist/commands/control-plane-read.d.ts.map +1 -1
  46. package/dist/commands/control-plane-read.js +1035 -58
  47. package/dist/commands/control-plane-read.js.map +1 -1
  48. package/dist/commands/deploy-promote.d.ts +25 -3
  49. package/dist/commands/deploy-promote.d.ts.map +1 -1
  50. package/dist/commands/deploy-promote.js +314 -38
  51. package/dist/commands/deploy-promote.js.map +1 -1
  52. package/dist/commands/deploy.d.ts +69 -4
  53. package/dist/commands/deploy.d.ts.map +1 -1
  54. package/dist/commands/deploy.js +1512 -276
  55. package/dist/commands/deploy.js.map +1 -1
  56. package/dist/commands/dev.d.ts +5 -1
  57. package/dist/commands/dev.d.ts.map +1 -1
  58. package/dist/commands/dev.js +502 -107
  59. package/dist/commands/dev.js.map +1 -1
  60. package/dist/commands/doctor.d.ts +14 -0
  61. package/dist/commands/doctor.d.ts.map +1 -1
  62. package/dist/commands/doctor.js +131 -20
  63. package/dist/commands/doctor.js.map +1 -1
  64. package/dist/commands/flags.d.ts +108 -6
  65. package/dist/commands/flags.d.ts.map +1 -1
  66. package/dist/commands/flags.js +996 -75
  67. package/dist/commands/flags.js.map +1 -1
  68. package/dist/commands/help-command.d.ts +14 -0
  69. package/dist/commands/help-command.d.ts.map +1 -1
  70. package/dist/commands/help-command.js +144 -44
  71. package/dist/commands/help-command.js.map +1 -1
  72. package/dist/commands/history.js +14 -10
  73. package/dist/commands/history.js.map +1 -1
  74. package/dist/commands/init.d.ts +4 -2
  75. package/dist/commands/init.d.ts.map +1 -1
  76. package/dist/commands/init.js +98 -17
  77. package/dist/commands/init.js.map +1 -1
  78. package/dist/commands/link.d.ts +2 -3
  79. package/dist/commands/link.d.ts.map +1 -1
  80. package/dist/commands/link.js +201 -101
  81. package/dist/commands/link.js.map +1 -1
  82. package/dist/commands/login.d.ts.map +1 -1
  83. package/dist/commands/login.js +22 -5
  84. package/dist/commands/login.js.map +1 -1
  85. package/dist/commands/migrate.d.ts +37 -17
  86. package/dist/commands/migrate.d.ts.map +1 -1
  87. package/dist/commands/migrate.js +500 -73
  88. package/dist/commands/migrate.js.map +1 -1
  89. package/dist/commands/rollback.d.ts +42 -2
  90. package/dist/commands/rollback.d.ts.map +1 -1
  91. package/dist/commands/rollback.js +422 -58
  92. package/dist/commands/rollback.js.map +1 -1
  93. package/dist/commands/secrets.d.ts +76 -3
  94. package/dist/commands/secrets.d.ts.map +1 -1
  95. package/dist/commands/secrets.js +328 -41
  96. package/dist/commands/secrets.js.map +1 -1
  97. package/dist/commands/status.d.ts +13 -2
  98. package/dist/commands/status.d.ts.map +1 -1
  99. package/dist/commands/status.js +154 -17
  100. package/dist/commands/status.js.map +1 -1
  101. package/dist/commands/unlink.d.ts +2 -2
  102. package/dist/commands/unlink.d.ts.map +1 -1
  103. package/dist/commands/unlink.js +2 -2
  104. package/dist/commands/unlink.js.map +1 -1
  105. package/dist/commands/update.d.ts.map +1 -1
  106. package/dist/commands/update.js +4 -3
  107. package/dist/commands/update.js.map +1 -1
  108. package/dist/commands/validate.d.ts +12 -3
  109. package/dist/commands/validate.d.ts.map +1 -1
  110. package/dist/commands/validate.js +70 -8
  111. package/dist/commands/validate.js.map +1 -1
  112. package/dist/constants.d.ts +1 -1
  113. package/dist/constants.js +1 -1
  114. package/dist/control-plane-fetch.d.ts.map +1 -1
  115. package/dist/control-plane-fetch.js +5 -4
  116. package/dist/control-plane-fetch.js.map +1 -1
  117. package/dist/deploy-revision-capture.d.ts +48 -0
  118. package/dist/deploy-revision-capture.d.ts.map +1 -0
  119. package/dist/deploy-revision-capture.js +125 -0
  120. package/dist/deploy-revision-capture.js.map +1 -0
  121. package/dist/dev/event-bus.d.ts +5 -2
  122. package/dist/dev/event-bus.d.ts.map +1 -1
  123. package/dist/dev/event-bus.js +4 -1
  124. package/dist/dev/event-bus.js.map +1 -1
  125. package/dist/dev/hubspot-logs-poller.d.ts +35 -0
  126. package/dist/dev/hubspot-logs-poller.d.ts.map +1 -0
  127. package/dist/dev/hubspot-logs-poller.js +94 -0
  128. package/dist/dev/hubspot-logs-poller.js.map +1 -0
  129. package/dist/dev/invoke.d.ts +9 -1
  130. package/dist/dev/invoke.d.ts.map +1 -1
  131. package/dist/dev/invoke.js +69 -20
  132. package/dist/dev/invoke.js.map +1 -1
  133. package/dist/dev/keyboard.d.ts +31 -0
  134. package/dist/dev/keyboard.d.ts.map +1 -0
  135. package/dist/dev/keyboard.js +143 -0
  136. package/dist/dev/keyboard.js.map +1 -0
  137. package/dist/dev/log-server.d.ts +7 -0
  138. package/dist/dev/log-server.d.ts.map +1 -1
  139. package/dist/dev/log-server.js +68 -31
  140. package/dist/dev/log-server.js.map +1 -1
  141. package/dist/dev/migrated-card.d.ts +17 -0
  142. package/dist/dev/migrated-card.d.ts.map +1 -0
  143. package/dist/dev/migrated-card.js +114 -0
  144. package/dist/dev/migrated-card.js.map +1 -0
  145. package/dist/dev/stream-filter.d.ts +40 -0
  146. package/dist/dev/stream-filter.d.ts.map +1 -0
  147. package/dist/dev/stream-filter.js +93 -0
  148. package/dist/dev/stream-filter.js.map +1 -0
  149. package/dist/dev/stream-renderer.d.ts +34 -0
  150. package/dist/dev/stream-renderer.d.ts.map +1 -1
  151. package/dist/dev/stream-renderer.js +222 -8
  152. package/dist/dev/stream-renderer.js.map +1 -1
  153. package/dist/errors-registry.d.ts.map +1 -1
  154. package/dist/errors-registry.js +280 -36
  155. package/dist/errors-registry.js.map +1 -1
  156. package/dist/errors.d.ts.map +1 -1
  157. package/dist/errors.js.map +1 -1
  158. package/dist/help.d.ts.map +1 -1
  159. package/dist/help.js +8 -0
  160. package/dist/help.js.map +1 -1
  161. package/dist/hubspot-app-logs.d.ts +76 -0
  162. package/dist/hubspot-app-logs.d.ts.map +1 -0
  163. package/dist/hubspot-app-logs.js +323 -0
  164. package/dist/hubspot-app-logs.js.map +1 -0
  165. package/dist/hubspot-auth.d.ts +8 -2
  166. package/dist/hubspot-auth.d.ts.map +1 -1
  167. package/dist/hubspot-auth.js +9 -9
  168. package/dist/hubspot-auth.js.map +1 -1
  169. package/dist/hubspot-developer-client.js +119 -11
  170. package/dist/hubspot-developer-client.js.map +1 -1
  171. package/dist/index.d.ts +1 -0
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +1 -0
  174. package/dist/index.js.map +1 -1
  175. package/dist/init/templates.d.ts +11 -1
  176. package/dist/init/templates.d.ts.map +1 -1
  177. package/dist/init/templates.js +228 -15
  178. package/dist/init/templates.js.map +1 -1
  179. package/dist/link-migration-journal.d.ts +131 -0
  180. package/dist/link-migration-journal.d.ts.map +1 -0
  181. package/dist/link-migration-journal.js +395 -0
  182. package/dist/link-migration-journal.js.map +1 -0
  183. package/dist/link-preflight.d.ts +78 -0
  184. package/dist/link-preflight.d.ts.map +1 -0
  185. package/dist/link-preflight.js +231 -0
  186. package/dist/link-preflight.js.map +1 -0
  187. package/dist/local-project-picker.d.ts +34 -0
  188. package/dist/local-project-picker.d.ts.map +1 -0
  189. package/dist/local-project-picker.js +121 -0
  190. package/dist/local-project-picker.js.map +1 -0
  191. package/dist/logs-interactive.d.ts +37 -0
  192. package/dist/logs-interactive.d.ts.map +1 -0
  193. package/dist/logs-interactive.js +110 -0
  194. package/dist/logs-interactive.js.map +1 -0
  195. package/dist/output-context.d.ts +13 -0
  196. package/dist/output-context.d.ts.map +1 -0
  197. package/dist/output-context.js +46 -0
  198. package/dist/output-context.js.map +1 -0
  199. package/dist/project-context.d.ts +55 -0
  200. package/dist/project-context.d.ts.map +1 -0
  201. package/dist/project-context.js +115 -0
  202. package/dist/project-context.js.map +1 -0
  203. package/dist/project-picker.d.ts +65 -0
  204. package/dist/project-picker.d.ts.map +1 -0
  205. package/dist/project-picker.js +227 -0
  206. package/dist/project-picker.js.map +1 -0
  207. package/dist/prompt.d.ts +8 -0
  208. package/dist/prompt.d.ts.map +1 -1
  209. package/dist/prompt.js +81 -13
  210. package/dist/prompt.js.map +1 -1
  211. package/dist/reporter/human.d.ts +10 -2
  212. package/dist/reporter/human.d.ts.map +1 -1
  213. package/dist/reporter/human.js +82 -14
  214. package/dist/reporter/human.js.map +1 -1
  215. package/dist/reporter/index.d.ts.map +1 -1
  216. package/dist/reporter/index.js +7 -5
  217. package/dist/reporter/index.js.map +1 -1
  218. package/dist/reporter/json.d.ts +2 -1
  219. package/dist/reporter/json.d.ts.map +1 -1
  220. package/dist/reporter/json.js +10 -7
  221. package/dist/reporter/json.js.map +1 -1
  222. package/dist/reporter/style.d.ts +19 -0
  223. package/dist/reporter/style.d.ts.map +1 -1
  224. package/dist/reporter/style.js +126 -6
  225. package/dist/reporter/style.js.map +1 -1
  226. package/dist/reporter/types.d.ts +34 -4
  227. package/dist/reporter/types.d.ts.map +1 -1
  228. package/dist/reporter/types.js.map +1 -1
  229. package/dist/services/account-store.d.ts +3 -1
  230. package/dist/services/account-store.d.ts.map +1 -1
  231. package/dist/services/account-store.js +2 -1
  232. package/dist/services/account-store.js.map +1 -1
  233. package/dist/services/app-paths.d.ts.map +1 -1
  234. package/dist/services/app-paths.js +3 -1
  235. package/dist/services/app-paths.js.map +1 -1
  236. package/dist/services/cloudflare-auth.d.ts +1 -1
  237. package/dist/services/cloudflare-auth.d.ts.map +1 -1
  238. package/dist/services/cloudflare-auth.js +2 -2
  239. package/dist/services/cloudflare-auth.js.map +1 -1
  240. package/dist/services/cloudflare-kv.d.ts.map +1 -1
  241. package/dist/services/cloudflare-kv.js.map +1 -1
  242. package/dist/services/command-history.d.ts.map +1 -1
  243. package/dist/services/command-history.js.map +1 -1
  244. package/dist/services/config.d.ts.map +1 -1
  245. package/dist/services/config.js +1 -1
  246. package/dist/services/config.js.map +1 -1
  247. package/dist/services/control-plane.d.ts.map +1 -1
  248. package/dist/services/control-plane.js +3 -3
  249. package/dist/services/control-plane.js.map +1 -1
  250. package/dist/services/env-loader.d.ts.map +1 -1
  251. package/dist/services/env-loader.js +1 -3
  252. package/dist/services/env-loader.js.map +1 -1
  253. package/dist/services/http.d.ts.map +1 -1
  254. package/dist/services/http.js.map +1 -1
  255. package/dist/services/hubspot-dev-client.d.ts.map +1 -1
  256. package/dist/services/hubspot-dev-client.js +30 -0
  257. package/dist/services/hubspot-dev-client.js.map +1 -1
  258. package/dist/services/live.d.ts +2 -2
  259. package/dist/services/live.d.ts.map +1 -1
  260. package/dist/services/live.js +1 -1
  261. package/dist/services/live.js.map +1 -1
  262. package/dist/services/machine-id.d.ts.map +1 -1
  263. package/dist/services/machine-id.js.map +1 -1
  264. package/dist/services/reporter.d.ts +8 -5
  265. package/dist/services/reporter.d.ts.map +1 -1
  266. package/dist/services/reporter.js +6 -4
  267. package/dist/services/reporter.js.map +1 -1
  268. package/dist/services/tenant-state.d.ts.map +1 -1
  269. package/dist/services/tenant-state.js.map +1 -1
  270. package/dist/state-store.d.ts +4 -0
  271. package/dist/state-store.d.ts.map +1 -1
  272. package/dist/state-store.js +15 -0
  273. package/dist/state-store.js.map +1 -1
  274. package/dist/status-drilldown.d.ts +24 -0
  275. package/dist/status-drilldown.d.ts.map +1 -0
  276. package/dist/status-drilldown.js +50 -0
  277. package/dist/status-drilldown.js.map +1 -0
  278. package/dist/tenant-state.d.ts.map +1 -1
  279. package/dist/tenant-state.js +3 -2
  280. package/dist/tenant-state.js.map +1 -1
  281. package/dist/token-key-custody.d.ts +91 -0
  282. package/dist/token-key-custody.d.ts.map +1 -0
  283. package/dist/token-key-custody.js +375 -0
  284. package/dist/token-key-custody.js.map +1 -0
  285. package/package.json +14 -15
@@ -0,0 +1,50 @@
1
+ import { Effect } from 'effect';
2
+ import { isInteractive, promptSelect } from './prompt.js';
3
+ const ACTION_OPTIONS = [
4
+ { value: 'logs', label: 'View logs', description: 'Recent Workers and HubSpot activity' },
5
+ { value: 'routes', label: 'View routes', description: 'Active deployed revisions' },
6
+ { value: 'drift', label: 'View drift', description: 'Recorded and observed state' },
7
+ { value: 'refresh', label: 'Refresh status', description: 'Read this project again' },
8
+ { value: 'done', label: 'Done' },
9
+ ];
10
+ /**
11
+ * Iterative (never recursive) status follow-up loop. Its prompt and actions are
12
+ * injected so dispatch behavior can be tested without a terminal or services.
13
+ */
14
+ export function statusDrilldown(deps) {
15
+ if (!(deps.interactive ?? isInteractive()))
16
+ return Effect.void;
17
+ const select = deps.select ?? promptSelect;
18
+ const maxRefreshes = Math.max(0, deps.maxRefreshes ?? 10);
19
+ return Effect.gen(function* () {
20
+ let refreshes = 0;
21
+ while (true) {
22
+ const options = refreshes < maxRefreshes
23
+ ? ACTION_OPTIONS
24
+ : ACTION_OPTIONS.filter((option) => option.value !== 'refresh');
25
+ const action = yield* Effect.promise(() => select({
26
+ message: 'What would you like to inspect?',
27
+ options,
28
+ default: 'done',
29
+ }));
30
+ if (!action || action === 'done')
31
+ return;
32
+ switch (action) {
33
+ case 'logs':
34
+ yield* deps.actions.logs();
35
+ break;
36
+ case 'routes':
37
+ yield* deps.actions.routes();
38
+ break;
39
+ case 'drift':
40
+ yield* deps.actions.drift();
41
+ break;
42
+ case 'refresh':
43
+ yield* deps.actions.refresh();
44
+ refreshes += 1;
45
+ break;
46
+ }
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=status-drilldown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-drilldown.js","sourceRoot":"","sources":["../src/status-drilldown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB1D,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,qCAAqC,EAAE;IACzF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACnF,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACnF,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,yBAAyB,EAAE;IACrF,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CACxB,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAoC;IAEpC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GACX,SAAS,GAAG,YAAY;gBACtB,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;YACpE,MAAM,MAAM,GAAsC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAC3E,MAAM,CAAC;gBACL,OAAO,EAAE,iCAAiC;gBAC1C,OAAO;gBACP,OAAO,EAAE,MAAM;aAChB,CAAC,CACH,CAAC;YACF,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO;YAEzC,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC3B,MAAM;gBACR,KAAK,QAAQ;oBACX,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC7B,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC5B,MAAM;gBACR,KAAK,SAAS;oBACZ,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC9B,SAAS,IAAI,CAAC,CAAC;oBACf,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-state.d.ts","sourceRoot":"","sources":["../src/tenant-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAID;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2D9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAwB1C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,QAAQ,CAAC,EAAE,EAAE,OAAO,oBAAoB,EAAE,kBAAkB,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAoB3E"}
1
+ {"version":3,"file":"tenant-state.d.ts","sourceRoot":"","sources":["../src/tenant-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAErE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CACjC;AAID;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2D9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAwB1C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,QAAQ,CAAC,EAAE,EAAE,OAAO,oBAAoB,EAAE,kBAAkB,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAoB3E"}
@@ -82,8 +82,9 @@ export async function preflightTenantStateCredentials(input) {
82
82
  const { apiToken, accountId } = resolveCloudflareCredentials(input.argv);
83
83
  const cloudflareAccountId = accountId ?? (await loadCloudflarePointer(input.root))?.cloudflareAccountId;
84
84
  if (!apiToken || !cloudflareAccountId) {
85
- throw new Error('A Cloudflare deploy needs an API token and account id. Set CLOUDFLARE_API_TOKEN and ' +
86
- 'CLOUDFLARE_ACCOUNT_ID, or pass --cloudflare-api-token / --cloudflare-account-id, before deploying.');
85
+ throw new Error('A Cloudflare deploy needs a Cloudflare connection. Easiest: run `hs-x connect cloudflare` ' +
86
+ 'to sign in via your browser (stored for every future deploy). Or set CLOUDFLARE_API_TOKEN ' +
87
+ 'and CLOUDFLARE_ACCOUNT_ID (or pass --cloudflare-api-token / --cloudflare-account-id).');
87
88
  }
88
89
  }
89
90
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tenant-state.js","sourceRoot":"","sources":["../src/tenant-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tenant-state.js","sourceRoot":"","sources":["../src/tenant-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { Schema, schemas } from '@hs-x/types';
2
+ import { CliError } from './cli-error.js';
3
+ export type TokenKeyCustodyMechanism = Schema.Schema.Type<typeof schemas.TokenKeyCustodyMechanism>;
4
+ export type TokenKeyCanary = Schema.Schema.Type<typeof schemas.TokenKeyCanary>;
5
+ export type EscrowedTokenKeyCustody = Schema.Schema.Type<typeof schemas.EscrowedTokenKeyCustody>;
6
+ declare const TOKEN_KEY_CUSTODY_CODES: readonly ["HSX_E_TOKEN_KEY_CUSTODY_MISSING", "HSX_E_TOKEN_KEY_CUSTODY_CORRUPT", "HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE"];
7
+ export type TokenKeyCustodyErrorCode = (typeof TOKEN_KEY_CUSTODY_CODES)[number];
8
+ /** Typed, actionable custody failure. `code` is an errors-registry code. */
9
+ export declare function tokenKeyCustodyError(code: TokenKeyCustodyErrorCode, detail: string): CliError;
10
+ export declare function isTokenKeyCustodyError(error: unknown): error is CliError;
11
+ /**
12
+ * Storage adapter for one custody mechanism.
13
+ *
14
+ * `retrieve` returns `undefined` for "no entry" and throws a typed
15
+ * `TokenKeyCustodyErrorCode` error for "entry exists but cannot be read".
16
+ */
17
+ export interface TokenKeyCustodyAdapter {
18
+ readonly mechanism: TokenKeyCustodyMechanism;
19
+ escrow(custodyId: string, tokenKeySecretValue: string): Promise<void>;
20
+ retrieve(custodyId: string): Promise<string | undefined>;
21
+ /**
22
+ * Remove a custody entry. Idempotent — a missing entry is a no-op. Used by
23
+ * the ADR-022 journaled link migration (T03) to drop the OLD custody id
24
+ * after the token key has been re-escrowed under the new owner's id and the
25
+ * control-plane commit has succeeded — never leaving a zero-entry window.
26
+ */
27
+ remove(custodyId: string): Promise<void>;
28
+ }
29
+ /** Deterministic custody reference for a runtime binding — never key bytes. */
30
+ export declare function tokenKeyCustodyIdFor(input: {
31
+ readonly ownerId: string;
32
+ readonly projectId: string;
33
+ readonly environment: string;
34
+ readonly hubSpotAppId: string | number;
35
+ }): string;
36
+ export declare function sealTokenKeyCanary(tokenKeySecretValue: string): Promise<TokenKeyCanary>;
37
+ /**
38
+ * Preflight-usable proof: does `tokenKeySecretValue` decrypt this canary?
39
+ * Read-only, mutation-free — safe to run against live custody any time.
40
+ */
41
+ export declare function verifyTokenKeyCanary(canary: TokenKeyCanary, tokenKeySecretValue: string): Promise<boolean>;
42
+ export declare function defaultTokenKeyCustodyStorePath(env?: NodeJS.ProcessEnv): string;
43
+ export declare function defaultTokenKeyCustodyKeyPath(env?: NodeJS.ProcessEnv): string;
44
+ export declare function createEncryptedFileTokenKeyCustodyAdapter(options?: {
45
+ readonly storePath?: string;
46
+ readonly keyPath?: string;
47
+ }): TokenKeyCustodyAdapter;
48
+ export interface KeychainCommandResult {
49
+ readonly exitCode: number;
50
+ readonly stdout: string;
51
+ readonly stderr: string;
52
+ }
53
+ export type KeychainCommandRunner = (args: readonly string[], stdin?: string) => Promise<KeychainCommandResult>;
54
+ export declare function createDarwinKeychainTokenKeyCustodyAdapter(options?: {
55
+ readonly run?: KeychainCommandRunner;
56
+ readonly service?: string;
57
+ }): TokenKeyCustodyAdapter;
58
+ /**
59
+ * The adapter used for NEW escrows. Encrypted file everywhere by default;
60
+ * `HSX_TOKEN_KEY_CUSTODY=keychain` opts into the macOS Keychain,
61
+ * `HSX_TOKEN_KEY_CUSTODY=file` pins the file store explicitly.
62
+ */
63
+ export declare function defaultTokenKeyCustodyAdapter(env?: NodeJS.ProcessEnv): TokenKeyCustodyAdapter;
64
+ /** Resolve the adapter a stored custody reference points at. */
65
+ export declare function tokenKeyCustodyAdapterFor(mechanism: TokenKeyCustodyMechanism, env?: NodeJS.ProcessEnv): TokenKeyCustodyAdapter;
66
+ /**
67
+ * Escrow a freshly generated token key and return the custody reference +
68
+ * sealed canary for the binding record. Reads the key back and verifies the
69
+ * canary before returning, so a binding never records custody that didn't
70
+ * stick — an escrow failure aborts BEFORE any Cloudflare mutation.
71
+ */
72
+ export declare function escrowTokenKey(input: {
73
+ readonly adapter: TokenKeyCustodyAdapter;
74
+ readonly custodyId: string;
75
+ readonly tokenKeySecretValue: string;
76
+ readonly now?: () => Date;
77
+ }): Promise<EscrowedTokenKeyCustody>;
78
+ /**
79
+ * Retrieve an escrowed token key and PROVE it by opening the sealed canary.
80
+ * Read-only — this is the primitive the ADR-022 no-mutation link preflight
81
+ * (T02) composes. Throws a typed, actionable `TokenKeyCustodyErrorCode`
82
+ * error on missing/corrupt custody; callers must not have mutated anything
83
+ * before calling it.
84
+ */
85
+ export declare function resolveEscrowedTokenKey(input: {
86
+ readonly custody: EscrowedTokenKeyCustody;
87
+ readonly adapter?: TokenKeyCustodyAdapter;
88
+ readonly env?: NodeJS.ProcessEnv;
89
+ }): Promise<string>;
90
+ export {};
91
+ //# sourceMappingURL=token-key-custody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-key-custody.d.ts","sourceRoot":"","sources":["../src/token-key-custody.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,375 @@
1
+ // ADR-022 — recoverable custody for the locally generated `HSX_TOKEN_KEY`.
2
+ //
3
+ // An unlinked deploy encrypts customer-portal OAuth blobs under a token key
4
+ // that historically existed in exactly one place: the deployed Worker's
5
+ // secret binding. Cloudflare secrets are write-only, so losing the binding
6
+ // (or the machine) meant the key was gone and every install's OAuth blob was
7
+ // unreadable. This module escrows the key AT CREATION in an approved
8
+ // encrypted local custody and seals a canary under it, so any later
9
+ // operation (redeploy, the ADR-022 link preflight) can retrieve the key and
10
+ // PROVE it decrypts real install data without touching an OAuth blob.
11
+ //
12
+ // Mechanisms:
13
+ // - `encrypted-file` (default on every platform): AES-256-GCM entries in
14
+ // `$XDG_STATE_HOME/hs-x/token-key-custody.json`, sealed with a random
15
+ // machine-scoped custody key at `token-key-custody.key` (0600, mirroring
16
+ // the machine-id and Cloudflare OAuth credential stores). Chosen as the
17
+ // default because the hs-x CLI must work headlessly — `security(1)` reads
18
+ // from a non-codesigned interpreter can raise GUI consent prompts, which
19
+ // would hang CI and agent runs.
20
+ // - `darwin-keychain` (opt-in, `HSX_TOKEN_KEY_CUSTODY=keychain`): macOS
21
+ // Keychain generic passwords via `security -i` (stdin, so key bytes never
22
+ // appear in an argv/process listing).
23
+ //
24
+ // Never write the key bytes to: the binding record, the control plane,
25
+ // stdout/stderr, logs, or deploy snapshots. The binding carries only a
26
+ // custody REFERENCE and the sealed canary.
27
+ import { spawn } from 'node:child_process';
28
+ import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
29
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
30
+ import { dirname } from 'node:path';
31
+ import { Schema, schemas } from '@hs-x/types';
32
+ import { CliError } from './cli-error.js';
33
+ import { statePath } from './paths.js';
34
+ const KEYCHAIN_SERVICE = 'dev.hs-x.token-key';
35
+ const CANARY_MARKER = 'hsx-token-key-canary';
36
+ /**
37
+ * How to recover when custody is gone. The deployed Worker still holds the
38
+ * key as a write-only secret, so there is no re-escrow path — this text is
39
+ * the honest recovery story and is embedded in every custody failure.
40
+ */
41
+ const CUSTODY_RECOVERY_HINT = 'The key cannot be read back from the deployed Worker (Cloudflare secrets are write-only). ' +
42
+ 'Restore the hs-x state directory (or macOS Keychain item) from a machine backup if you have one. ' +
43
+ 'Without the key, existing portal installs keep working on the already-deployed Worker but cannot ' +
44
+ 'be migrated or re-keyed — the only path forward is asking customers to reinstall, which re-encrypts ' +
45
+ 'their OAuth grants under a fresh key. See docs/token-key-custody.md.';
46
+ const TOKEN_KEY_CUSTODY_CODES = [
47
+ 'HSX_E_TOKEN_KEY_CUSTODY_MISSING',
48
+ 'HSX_E_TOKEN_KEY_CUSTODY_CORRUPT',
49
+ 'HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE',
50
+ ];
51
+ /** Typed, actionable custody failure. `code` is an errors-registry code. */
52
+ export function tokenKeyCustodyError(code, detail) {
53
+ // The deploy quarantine seam renders only `message`, so the code rides in
54
+ // the message text to stay visible (and greppable) in every output mode.
55
+ return new CliError({ code, message: `${code}: ${detail} ${CUSTODY_RECOVERY_HINT}` });
56
+ }
57
+ export function isTokenKeyCustodyError(error) {
58
+ return (error instanceof CliError && TOKEN_KEY_CUSTODY_CODES.includes(error.code));
59
+ }
60
+ /** Deterministic custody reference for a runtime binding — never key bytes. */
61
+ export function tokenKeyCustodyIdFor(input) {
62
+ return `hsx-token-key/${input.ownerId}/${input.projectId}/${input.environment}/${input.hubSpotAppId}`;
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Canary — seal/verify with EXACTLY the runtime's key derivation
66
+ // (AES-GCM under SHA-256 of the key string; ciphertext carries the GCM tag),
67
+ // so "the canary opens" ⇒ "the Worker's OAuth blobs open".
68
+ // ---------------------------------------------------------------------------
69
+ async function importAesKey(secret) {
70
+ const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(secret));
71
+ return crypto.subtle.importKey('raw', digest, 'AES-GCM', false, ['encrypt', 'decrypt']);
72
+ }
73
+ export async function sealTokenKeyCanary(tokenKeySecretValue) {
74
+ const key = await importAesKey(tokenKeySecretValue);
75
+ const iv = crypto.getRandomValues(new Uint8Array(12));
76
+ const plaintext = new TextEncoder().encode(JSON.stringify({ hsx: CANARY_MARKER, v: 1 }));
77
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext);
78
+ return Schema.decodeUnknownSync(schemas.TokenKeyCanary)({
79
+ v: 1,
80
+ alg: 'AES-GCM',
81
+ iv: Buffer.from(iv).toString('base64'),
82
+ ciphertext: Buffer.from(new Uint8Array(ciphertext)).toString('base64'),
83
+ });
84
+ }
85
+ /**
86
+ * Preflight-usable proof: does `tokenKeySecretValue` decrypt this canary?
87
+ * Read-only, mutation-free — safe to run against live custody any time.
88
+ */
89
+ export async function verifyTokenKeyCanary(canary, tokenKeySecretValue) {
90
+ try {
91
+ const key = await importAesKey(tokenKeySecretValue);
92
+ const plaintext = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: Buffer.from(canary.iv, 'base64') }, key, Buffer.from(canary.ciphertext, 'base64'));
93
+ const parsed = JSON.parse(new TextDecoder().decode(plaintext));
94
+ return (typeof parsed === 'object' &&
95
+ parsed !== null &&
96
+ parsed.hsx === CANARY_MARKER);
97
+ }
98
+ catch {
99
+ return false;
100
+ }
101
+ }
102
+ export function defaultTokenKeyCustodyStorePath(env = process.env) {
103
+ const override = env.HSX_TOKEN_KEY_CUSTODY_PATH;
104
+ if (override && override.length > 0)
105
+ return override;
106
+ return statePath('token-key-custody.json');
107
+ }
108
+ export function defaultTokenKeyCustodyKeyPath(env = process.env) {
109
+ const override = env.HSX_TOKEN_KEY_CUSTODY_KEY_PATH;
110
+ if (override && override.length > 0)
111
+ return override;
112
+ return statePath('token-key-custody.key');
113
+ }
114
+ async function loadOrCreateCustodyMasterKey(keyPath) {
115
+ try {
116
+ const raw = (await readFile(keyPath, 'utf8')).trim();
117
+ const key = Buffer.from(raw, 'base64');
118
+ if (key.length !== 32) {
119
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The custody master key at ${keyPath} is not a 32-byte base64 key.`);
120
+ }
121
+ return key;
122
+ }
123
+ catch (error) {
124
+ if (isTokenKeyCustodyError(error))
125
+ throw error;
126
+ const key = randomBytes(32);
127
+ await mkdir(dirname(keyPath), { recursive: true, mode: 0o700 });
128
+ await writeFile(keyPath, `${key.toString('base64')}\n`, { encoding: 'utf8', mode: 0o600 });
129
+ try {
130
+ await chmod(keyPath, 0o600);
131
+ }
132
+ catch {
133
+ // Best effort on platforms without POSIX permissions.
134
+ }
135
+ return key;
136
+ }
137
+ }
138
+ export function createEncryptedFileTokenKeyCustodyAdapter(options = {}) {
139
+ const storePath = options.storePath ?? defaultTokenKeyCustodyStorePath();
140
+ const keyPath = options.keyPath ?? defaultTokenKeyCustodyKeyPath();
141
+ const loadStore = async () => {
142
+ let raw;
143
+ try {
144
+ raw = await readFile(storePath, 'utf8');
145
+ }
146
+ catch {
147
+ return undefined; // no store yet — every entry is "missing", not corrupt
148
+ }
149
+ let parsed;
150
+ try {
151
+ parsed = JSON.parse(raw);
152
+ }
153
+ catch {
154
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The token-key custody store at ${storePath} is not valid JSON.`);
155
+ }
156
+ if (typeof parsed !== 'object' ||
157
+ parsed === null ||
158
+ parsed.schemaVersion !== 1 ||
159
+ typeof parsed.entries !== 'object') {
160
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The token-key custody store at ${storePath} has an unexpected shape.`);
161
+ }
162
+ return parsed;
163
+ };
164
+ return {
165
+ mechanism: 'encrypted-file',
166
+ async escrow(custodyId, tokenKeySecretValue) {
167
+ const masterKey = await loadOrCreateCustodyMasterKey(keyPath);
168
+ const store = (await loadStore()) ?? { schemaVersion: 1, entries: {} };
169
+ const iv = randomBytes(12);
170
+ const cipher = createCipheriv('aes-256-gcm', masterKey, iv);
171
+ const ciphertext = Buffer.concat([
172
+ cipher.update(tokenKeySecretValue, 'utf8'),
173
+ cipher.final(),
174
+ ]);
175
+ const next = {
176
+ schemaVersion: 1,
177
+ entries: {
178
+ ...store.entries,
179
+ [custodyId]: {
180
+ v: 1,
181
+ alg: 'aes-256-gcm',
182
+ iv: iv.toString('base64'),
183
+ ciphertext: ciphertext.toString('base64'),
184
+ tag: cipher.getAuthTag().toString('base64'),
185
+ updatedAt: new Date().toISOString(),
186
+ },
187
+ },
188
+ };
189
+ await mkdir(dirname(storePath), { recursive: true, mode: 0o700 });
190
+ await writeFile(storePath, `${JSON.stringify(next, null, 2)}\n`, {
191
+ encoding: 'utf8',
192
+ mode: 0o600,
193
+ });
194
+ try {
195
+ await chmod(storePath, 0o600);
196
+ }
197
+ catch {
198
+ // Best effort on platforms without POSIX permissions.
199
+ }
200
+ },
201
+ async retrieve(custodyId) {
202
+ const store = await loadStore();
203
+ const entry = store?.entries[custodyId];
204
+ if (!entry)
205
+ return undefined;
206
+ if (entry.v !== 1 ||
207
+ entry.alg !== 'aes-256-gcm' ||
208
+ typeof entry.iv !== 'string' ||
209
+ typeof entry.ciphertext !== 'string' ||
210
+ typeof entry.tag !== 'string') {
211
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The custody entry for ${custodyId} in ${storePath} has an unexpected shape.`);
212
+ }
213
+ const masterKey = await loadOrCreateCustodyMasterKey(keyPath);
214
+ try {
215
+ const decipher = createDecipheriv('aes-256-gcm', masterKey, Buffer.from(entry.iv, 'base64'));
216
+ decipher.setAuthTag(Buffer.from(entry.tag, 'base64'));
217
+ return Buffer.concat([
218
+ decipher.update(Buffer.from(entry.ciphertext, 'base64')),
219
+ decipher.final(),
220
+ ]).toString('utf8');
221
+ }
222
+ catch {
223
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The custody entry for ${custodyId} in ${storePath} does not decrypt with the custody master key at ${keyPath}.`);
224
+ }
225
+ },
226
+ async remove(custodyId) {
227
+ const store = await loadStore();
228
+ if (!store || !(custodyId in store.entries))
229
+ return; // idempotent
230
+ const { [custodyId]: _removed, ...entries } = store.entries;
231
+ const next = { schemaVersion: 1, entries };
232
+ await mkdir(dirname(storePath), { recursive: true, mode: 0o700 });
233
+ await writeFile(storePath, `${JSON.stringify(next, null, 2)}\n`, {
234
+ encoding: 'utf8',
235
+ mode: 0o600,
236
+ });
237
+ try {
238
+ await chmod(storePath, 0o600);
239
+ }
240
+ catch {
241
+ // Best effort on platforms without POSIX permissions.
242
+ }
243
+ },
244
+ };
245
+ }
246
+ function runSecurityCommand(args, stdin) {
247
+ return new Promise((resolve, reject) => {
248
+ const child = spawn('security', args, {
249
+ stdio: [stdin === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'],
250
+ });
251
+ let stdout = '';
252
+ let stderr = '';
253
+ child.stdout?.setEncoding('utf8');
254
+ child.stderr?.setEncoding('utf8');
255
+ child.stdout?.on('data', (chunk) => {
256
+ stdout += chunk;
257
+ });
258
+ child.stderr?.on('data', (chunk) => {
259
+ stderr += chunk;
260
+ });
261
+ if (stdin !== undefined)
262
+ child.stdin?.end(stdin);
263
+ child.on('error', reject);
264
+ child.on('exit', (code) => resolve({ exitCode: code ?? 1, stdout, stderr }));
265
+ });
266
+ }
267
+ /** errSecItemNotFound — `security find-generic-password` for a missing item. */
268
+ const SECURITY_ITEM_NOT_FOUND_EXIT = 44;
269
+ export function createDarwinKeychainTokenKeyCustodyAdapter(options = {}) {
270
+ const run = options.run ?? runSecurityCommand;
271
+ const service = options.service ?? KEYCHAIN_SERVICE;
272
+ return {
273
+ mechanism: 'darwin-keychain',
274
+ async escrow(custodyId, tokenKeySecretValue) {
275
+ // `security -i` reads commands from stdin, so the key never appears in
276
+ // an argv/process listing. -U updates an existing item in place.
277
+ const line = `add-generic-password -U -s ${quoteKeychainArg(service)} -a ${quoteKeychainArg(custodyId)} -w ${quoteKeychainArg(tokenKeySecretValue)}\n`;
278
+ const result = await run(['-i'], line);
279
+ if (result.exitCode !== 0) {
280
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE', `Escrowing the token key into the macOS Keychain failed (security exited ${result.exitCode}).`);
281
+ }
282
+ },
283
+ async retrieve(custodyId) {
284
+ const result = await run(['find-generic-password', '-s', service, '-a', custodyId, '-w']);
285
+ if (result.exitCode === SECURITY_ITEM_NOT_FOUND_EXIT)
286
+ return undefined;
287
+ if (result.exitCode !== 0) {
288
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE', `Reading the token key from the macOS Keychain failed (security exited ${result.exitCode}).`);
289
+ }
290
+ const value = result.stdout.replace(/\n$/, '');
291
+ if (value.length === 0) {
292
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The macOS Keychain item for ${custodyId} is empty.`);
293
+ }
294
+ return value;
295
+ },
296
+ async remove(custodyId) {
297
+ const result = await run(['delete-generic-password', '-s', service, '-a', custodyId]);
298
+ // errSecItemNotFound (44) means the item is already gone — idempotent.
299
+ if (result.exitCode !== 0 && result.exitCode !== SECURITY_ITEM_NOT_FOUND_EXIT) {
300
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE', `Removing the token key from the macOS Keychain failed (security exited ${result.exitCode}).`);
301
+ }
302
+ },
303
+ };
304
+ }
305
+ function quoteKeychainArg(value) {
306
+ return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // Selection + high-level escrow/resolve (what deploy and the ADR-022 link
310
+ // preflight call)
311
+ // ---------------------------------------------------------------------------
312
+ /**
313
+ * The adapter used for NEW escrows. Encrypted file everywhere by default;
314
+ * `HSX_TOKEN_KEY_CUSTODY=keychain` opts into the macOS Keychain,
315
+ * `HSX_TOKEN_KEY_CUSTODY=file` pins the file store explicitly.
316
+ */
317
+ export function defaultTokenKeyCustodyAdapter(env = process.env) {
318
+ if (env.HSX_TOKEN_KEY_CUSTODY === 'keychain') {
319
+ return createDarwinKeychainTokenKeyCustodyAdapter();
320
+ }
321
+ return createEncryptedFileTokenKeyCustodyAdapter({
322
+ storePath: defaultTokenKeyCustodyStorePath(env),
323
+ keyPath: defaultTokenKeyCustodyKeyPath(env),
324
+ });
325
+ }
326
+ /** Resolve the adapter a stored custody reference points at. */
327
+ export function tokenKeyCustodyAdapterFor(mechanism, env = process.env) {
328
+ return mechanism === 'darwin-keychain'
329
+ ? createDarwinKeychainTokenKeyCustodyAdapter()
330
+ : createEncryptedFileTokenKeyCustodyAdapter({
331
+ storePath: defaultTokenKeyCustodyStorePath(env),
332
+ keyPath: defaultTokenKeyCustodyKeyPath(env),
333
+ });
334
+ }
335
+ /**
336
+ * Escrow a freshly generated token key and return the custody reference +
337
+ * sealed canary for the binding record. Reads the key back and verifies the
338
+ * canary before returning, so a binding never records custody that didn't
339
+ * stick — an escrow failure aborts BEFORE any Cloudflare mutation.
340
+ */
341
+ export async function escrowTokenKey(input) {
342
+ await input.adapter.escrow(input.custodyId, input.tokenKeySecretValue);
343
+ const readBack = await input.adapter.retrieve(input.custodyId);
344
+ if (readBack !== input.tokenKeySecretValue) {
345
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_UNAVAILABLE', `Escrow read-back for ${input.custodyId} did not return the escrowed key (${input.adapter.mechanism}).`);
346
+ }
347
+ const canary = await sealTokenKeyCanary(input.tokenKeySecretValue);
348
+ return Schema.decodeUnknownSync(schemas.EscrowedTokenKeyCustody)({
349
+ kind: 'escrowed',
350
+ mechanism: input.adapter.mechanism,
351
+ custodyId: input.custodyId,
352
+ escrowedAt: (input.now ? input.now() : new Date()).toISOString(),
353
+ canary,
354
+ });
355
+ }
356
+ /**
357
+ * Retrieve an escrowed token key and PROVE it by opening the sealed canary.
358
+ * Read-only — this is the primitive the ADR-022 no-mutation link preflight
359
+ * (T02) composes. Throws a typed, actionable `TokenKeyCustodyErrorCode`
360
+ * error on missing/corrupt custody; callers must not have mutated anything
361
+ * before calling it.
362
+ */
363
+ export async function resolveEscrowedTokenKey(input) {
364
+ const adapter = input.adapter ?? tokenKeyCustodyAdapterFor(input.custody.mechanism, input.env);
365
+ const tokenKeySecretValue = await adapter.retrieve(input.custody.custodyId);
366
+ if (tokenKeySecretValue === undefined) {
367
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_MISSING', `The escrowed HSX_TOKEN_KEY for ${input.custody.custodyId} is missing from local custody (${input.custody.mechanism}).`);
368
+ }
369
+ const proven = await verifyTokenKeyCanary(input.custody.canary, tokenKeySecretValue);
370
+ if (!proven) {
371
+ throw tokenKeyCustodyError('HSX_E_TOKEN_KEY_CUSTODY_CORRUPT', `The key in custody for ${input.custody.custodyId} does not open the binding's sealed canary — it is not the key the deployed Worker encrypts with.`);
372
+ }
373
+ return tokenKeySecretValue;
374
+ }
375
+ //# sourceMappingURL=token-key-custody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-key-custody.js","sourceRoot":"","sources":["../src/token-key-custody.ts"],"names":[],"mappings":"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"}