@hs-x/cli 0.2.6 → 0.3.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 (298) 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/cloudflare-worker-versions.d.ts +184 -0
  32. package/dist/cloudflare-worker-versions.d.ts.map +1 -0
  33. package/dist/cloudflare-worker-versions.js +360 -0
  34. package/dist/cloudflare-worker-versions.js.map +1 -0
  35. package/dist/commands/account.d.ts +28 -13
  36. package/dist/commands/account.d.ts.map +1 -1
  37. package/dist/commands/account.js +219 -69
  38. package/dist/commands/account.js.map +1 -1
  39. package/dist/commands/api.d.ts +1 -1
  40. package/dist/commands/api.d.ts.map +1 -1
  41. package/dist/commands/api.js +6 -10
  42. package/dist/commands/api.js.map +1 -1
  43. package/dist/commands/completion.d.ts.map +1 -1
  44. package/dist/commands/completion.js +13 -7
  45. package/dist/commands/completion.js.map +1 -1
  46. package/dist/commands/connect.d.ts.map +1 -1
  47. package/dist/commands/connect.js +239 -125
  48. package/dist/commands/connect.js.map +1 -1
  49. package/dist/commands/control-plane-read.d.ts +72 -11
  50. package/dist/commands/control-plane-read.d.ts.map +1 -1
  51. package/dist/commands/control-plane-read.js +1035 -58
  52. package/dist/commands/control-plane-read.js.map +1 -1
  53. package/dist/commands/deploy-promote.d.ts +25 -3
  54. package/dist/commands/deploy-promote.d.ts.map +1 -1
  55. package/dist/commands/deploy-promote.js +314 -38
  56. package/dist/commands/deploy-promote.js.map +1 -1
  57. package/dist/commands/deploy.d.ts +67 -4
  58. package/dist/commands/deploy.d.ts.map +1 -1
  59. package/dist/commands/deploy.js +1333 -255
  60. package/dist/commands/deploy.js.map +1 -1
  61. package/dist/commands/dev.d.ts +5 -1
  62. package/dist/commands/dev.d.ts.map +1 -1
  63. package/dist/commands/dev.js +502 -107
  64. package/dist/commands/dev.js.map +1 -1
  65. package/dist/commands/doctor.d.ts +15 -1
  66. package/dist/commands/doctor.d.ts.map +1 -1
  67. package/dist/commands/doctor.js +131 -20
  68. package/dist/commands/doctor.js.map +1 -1
  69. package/dist/commands/flags.d.ts +108 -6
  70. package/dist/commands/flags.d.ts.map +1 -1
  71. package/dist/commands/flags.js +996 -75
  72. package/dist/commands/flags.js.map +1 -1
  73. package/dist/commands/help-command.d.ts +14 -0
  74. package/dist/commands/help-command.d.ts.map +1 -1
  75. package/dist/commands/help-command.js +144 -44
  76. package/dist/commands/help-command.js.map +1 -1
  77. package/dist/commands/history.js +14 -10
  78. package/dist/commands/history.js.map +1 -1
  79. package/dist/commands/init.d.ts +4 -2
  80. package/dist/commands/init.d.ts.map +1 -1
  81. package/dist/commands/init.js +69 -12
  82. package/dist/commands/init.js.map +1 -1
  83. package/dist/commands/link.d.ts +2 -3
  84. package/dist/commands/link.d.ts.map +1 -1
  85. package/dist/commands/link.js +201 -101
  86. package/dist/commands/link.js.map +1 -1
  87. package/dist/commands/login.d.ts +2 -2
  88. package/dist/commands/login.d.ts.map +1 -1
  89. package/dist/commands/login.js +22 -5
  90. package/dist/commands/login.js.map +1 -1
  91. package/dist/commands/migrate.d.ts +23 -3
  92. package/dist/commands/migrate.d.ts.map +1 -1
  93. package/dist/commands/migrate.js +500 -73
  94. package/dist/commands/migrate.js.map +1 -1
  95. package/dist/commands/rollback.d.ts +42 -2
  96. package/dist/commands/rollback.d.ts.map +1 -1
  97. package/dist/commands/rollback.js +422 -58
  98. package/dist/commands/rollback.js.map +1 -1
  99. package/dist/commands/secrets.d.ts +76 -3
  100. package/dist/commands/secrets.d.ts.map +1 -1
  101. package/dist/commands/secrets.js +328 -41
  102. package/dist/commands/secrets.js.map +1 -1
  103. package/dist/commands/status.d.ts +13 -2
  104. package/dist/commands/status.d.ts.map +1 -1
  105. package/dist/commands/status.js +154 -17
  106. package/dist/commands/status.js.map +1 -1
  107. package/dist/commands/unlink.d.ts +2 -2
  108. package/dist/commands/unlink.d.ts.map +1 -1
  109. package/dist/commands/unlink.js +2 -2
  110. package/dist/commands/unlink.js.map +1 -1
  111. package/dist/commands/update.d.ts.map +1 -1
  112. package/dist/commands/update.js +4 -3
  113. package/dist/commands/update.js.map +1 -1
  114. package/dist/commands/validate.d.ts +12 -3
  115. package/dist/commands/validate.d.ts.map +1 -1
  116. package/dist/commands/validate.js +70 -8
  117. package/dist/commands/validate.js.map +1 -1
  118. package/dist/constants.d.ts +1 -1
  119. package/dist/constants.js +1 -1
  120. package/dist/control-plane-fetch.d.ts.map +1 -1
  121. package/dist/control-plane-fetch.js +5 -4
  122. package/dist/control-plane-fetch.js.map +1 -1
  123. package/dist/deploy-revision-capture.d.ts +48 -0
  124. package/dist/deploy-revision-capture.d.ts.map +1 -0
  125. package/dist/deploy-revision-capture.js +125 -0
  126. package/dist/deploy-revision-capture.js.map +1 -0
  127. package/dist/dev/compat-shim.d.ts.map +1 -1
  128. package/dist/dev/compat-shim.js +10 -35
  129. package/dist/dev/compat-shim.js.map +1 -1
  130. package/dist/dev/event-bus.d.ts +5 -2
  131. package/dist/dev/event-bus.d.ts.map +1 -1
  132. package/dist/dev/event-bus.js +4 -1
  133. package/dist/dev/event-bus.js.map +1 -1
  134. package/dist/dev/hubspot-logs-poller.d.ts +35 -0
  135. package/dist/dev/hubspot-logs-poller.d.ts.map +1 -0
  136. package/dist/dev/hubspot-logs-poller.js +94 -0
  137. package/dist/dev/hubspot-logs-poller.js.map +1 -0
  138. package/dist/dev/invoke.d.ts +9 -1
  139. package/dist/dev/invoke.d.ts.map +1 -1
  140. package/dist/dev/invoke.js +69 -20
  141. package/dist/dev/invoke.js.map +1 -1
  142. package/dist/dev/keyboard.d.ts +31 -0
  143. package/dist/dev/keyboard.d.ts.map +1 -0
  144. package/dist/dev/keyboard.js +143 -0
  145. package/dist/dev/keyboard.js.map +1 -0
  146. package/dist/dev/log-server.d.ts +7 -0
  147. package/dist/dev/log-server.d.ts.map +1 -1
  148. package/dist/dev/log-server.js +68 -31
  149. package/dist/dev/log-server.js.map +1 -1
  150. package/dist/dev/migrated-card.d.ts +17 -0
  151. package/dist/dev/migrated-card.d.ts.map +1 -0
  152. package/dist/dev/migrated-card.js +114 -0
  153. package/dist/dev/migrated-card.js.map +1 -0
  154. package/dist/dev/stream-filter.d.ts +40 -0
  155. package/dist/dev/stream-filter.d.ts.map +1 -0
  156. package/dist/dev/stream-filter.js +93 -0
  157. package/dist/dev/stream-filter.js.map +1 -0
  158. package/dist/dev/stream-renderer.d.ts +34 -0
  159. package/dist/dev/stream-renderer.d.ts.map +1 -1
  160. package/dist/dev/stream-renderer.js +222 -8
  161. package/dist/dev/stream-renderer.js.map +1 -1
  162. package/dist/errors-registry.d.ts.map +1 -1
  163. package/dist/errors-registry.js +280 -36
  164. package/dist/errors-registry.js.map +1 -1
  165. package/dist/errors.d.ts.map +1 -1
  166. package/dist/errors.js.map +1 -1
  167. package/dist/help.d.ts.map +1 -1
  168. package/dist/help.js +8 -0
  169. package/dist/help.js.map +1 -1
  170. package/dist/hubspot-app-logs.d.ts +76 -0
  171. package/dist/hubspot-app-logs.d.ts.map +1 -0
  172. package/dist/hubspot-app-logs.js +323 -0
  173. package/dist/hubspot-app-logs.js.map +1 -0
  174. package/dist/hubspot-auth.d.ts +8 -2
  175. package/dist/hubspot-auth.d.ts.map +1 -1
  176. package/dist/hubspot-auth.js +36 -12
  177. package/dist/hubspot-auth.js.map +1 -1
  178. package/dist/hubspot-developer-client.js +119 -11
  179. package/dist/hubspot-developer-client.js.map +1 -1
  180. package/dist/index.d.ts +1 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +1 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/init/templates.d.ts +10 -0
  185. package/dist/init/templates.d.ts.map +1 -1
  186. package/dist/init/templates.js +157 -14
  187. package/dist/init/templates.js.map +1 -1
  188. package/dist/link-migration-journal.d.ts +131 -0
  189. package/dist/link-migration-journal.d.ts.map +1 -0
  190. package/dist/link-migration-journal.js +395 -0
  191. package/dist/link-migration-journal.js.map +1 -0
  192. package/dist/link-preflight.d.ts +78 -0
  193. package/dist/link-preflight.d.ts.map +1 -0
  194. package/dist/link-preflight.js +231 -0
  195. package/dist/link-preflight.js.map +1 -0
  196. package/dist/local-project-picker.d.ts +34 -0
  197. package/dist/local-project-picker.d.ts.map +1 -0
  198. package/dist/local-project-picker.js +121 -0
  199. package/dist/local-project-picker.js.map +1 -0
  200. package/dist/logs-interactive.d.ts +37 -0
  201. package/dist/logs-interactive.d.ts.map +1 -0
  202. package/dist/logs-interactive.js +110 -0
  203. package/dist/logs-interactive.js.map +1 -0
  204. package/dist/output-context.d.ts +13 -0
  205. package/dist/output-context.d.ts.map +1 -0
  206. package/dist/output-context.js +46 -0
  207. package/dist/output-context.js.map +1 -0
  208. package/dist/project-context.d.ts +55 -0
  209. package/dist/project-context.d.ts.map +1 -0
  210. package/dist/project-context.js +115 -0
  211. package/dist/project-context.js.map +1 -0
  212. package/dist/project-picker.d.ts +65 -0
  213. package/dist/project-picker.d.ts.map +1 -0
  214. package/dist/project-picker.js +227 -0
  215. package/dist/project-picker.js.map +1 -0
  216. package/dist/prompt.d.ts +8 -0
  217. package/dist/prompt.d.ts.map +1 -1
  218. package/dist/prompt.js +81 -13
  219. package/dist/prompt.js.map +1 -1
  220. package/dist/reporter/human.d.ts +10 -2
  221. package/dist/reporter/human.d.ts.map +1 -1
  222. package/dist/reporter/human.js +82 -14
  223. package/dist/reporter/human.js.map +1 -1
  224. package/dist/reporter/index.d.ts.map +1 -1
  225. package/dist/reporter/index.js +7 -5
  226. package/dist/reporter/index.js.map +1 -1
  227. package/dist/reporter/json.d.ts +2 -1
  228. package/dist/reporter/json.d.ts.map +1 -1
  229. package/dist/reporter/json.js +10 -7
  230. package/dist/reporter/json.js.map +1 -1
  231. package/dist/reporter/style.d.ts +19 -0
  232. package/dist/reporter/style.d.ts.map +1 -1
  233. package/dist/reporter/style.js +126 -6
  234. package/dist/reporter/style.js.map +1 -1
  235. package/dist/reporter/types.d.ts +34 -4
  236. package/dist/reporter/types.d.ts.map +1 -1
  237. package/dist/reporter/types.js.map +1 -1
  238. package/dist/rollback-traffic.d.ts +85 -0
  239. package/dist/rollback-traffic.d.ts.map +1 -0
  240. package/dist/rollback-traffic.js +204 -0
  241. package/dist/rollback-traffic.js.map +1 -0
  242. package/dist/services/account-store.d.ts +3 -1
  243. package/dist/services/account-store.d.ts.map +1 -1
  244. package/dist/services/account-store.js +2 -1
  245. package/dist/services/account-store.js.map +1 -1
  246. package/dist/services/app-paths.d.ts.map +1 -1
  247. package/dist/services/app-paths.js +3 -1
  248. package/dist/services/app-paths.js.map +1 -1
  249. package/dist/services/cloudflare-auth.d.ts +1 -1
  250. package/dist/services/cloudflare-auth.d.ts.map +1 -1
  251. package/dist/services/cloudflare-auth.js +2 -2
  252. package/dist/services/cloudflare-auth.js.map +1 -1
  253. package/dist/services/cloudflare-kv.d.ts.map +1 -1
  254. package/dist/services/cloudflare-kv.js.map +1 -1
  255. package/dist/services/command-history.d.ts.map +1 -1
  256. package/dist/services/command-history.js.map +1 -1
  257. package/dist/services/config.d.ts.map +1 -1
  258. package/dist/services/config.js +1 -1
  259. package/dist/services/config.js.map +1 -1
  260. package/dist/services/control-plane.d.ts.map +1 -1
  261. package/dist/services/control-plane.js +3 -3
  262. package/dist/services/control-plane.js.map +1 -1
  263. package/dist/services/env-loader.d.ts.map +1 -1
  264. package/dist/services/env-loader.js +1 -3
  265. package/dist/services/env-loader.js.map +1 -1
  266. package/dist/services/http.d.ts.map +1 -1
  267. package/dist/services/http.js.map +1 -1
  268. package/dist/services/hubspot-dev-client.d.ts.map +1 -1
  269. package/dist/services/hubspot-dev-client.js +30 -0
  270. package/dist/services/hubspot-dev-client.js.map +1 -1
  271. package/dist/services/live.d.ts +2 -2
  272. package/dist/services/live.d.ts.map +1 -1
  273. package/dist/services/live.js +1 -1
  274. package/dist/services/live.js.map +1 -1
  275. package/dist/services/machine-id.d.ts.map +1 -1
  276. package/dist/services/machine-id.js.map +1 -1
  277. package/dist/services/reporter.d.ts +8 -5
  278. package/dist/services/reporter.d.ts.map +1 -1
  279. package/dist/services/reporter.js +6 -4
  280. package/dist/services/reporter.js.map +1 -1
  281. package/dist/services/tenant-state.d.ts.map +1 -1
  282. package/dist/services/tenant-state.js.map +1 -1
  283. package/dist/state-store.d.ts +4 -0
  284. package/dist/state-store.d.ts.map +1 -1
  285. package/dist/state-store.js +15 -0
  286. package/dist/state-store.js.map +1 -1
  287. package/dist/status-drilldown.d.ts +24 -0
  288. package/dist/status-drilldown.d.ts.map +1 -0
  289. package/dist/status-drilldown.js +50 -0
  290. package/dist/status-drilldown.js.map +1 -0
  291. package/dist/tenant-state.d.ts.map +1 -1
  292. package/dist/tenant-state.js +3 -2
  293. package/dist/tenant-state.js.map +1 -1
  294. package/dist/token-key-custody.d.ts +91 -0
  295. package/dist/token-key-custody.d.ts.map +1 -0
  296. package/dist/token-key-custody.js +375 -0
  297. package/dist/token-key-custody.js.map +1 -0
  298. package/package.json +13 -14
@@ -9,13 +9,14 @@
9
9
  * POST /__hsx/log — single log or batched array. CORS open for localhost callers.
10
10
  * GET /__hsx/health
11
11
  */
12
+ import { timingSafeEqual } from 'node:crypto';
12
13
  import { createServer } from 'node:http';
13
14
  const DEFAULT_MAX_BODY_BYTES = 256 * 1024;
14
15
  const ALLOWED_LEVELS = new Set(['debug', 'info', 'warn', 'error']);
15
16
  export async function startDevLogServer(opts) {
16
- const { bus, host = '127.0.0.1', port = 0, maxBodyBytes = DEFAULT_MAX_BODY_BYTES } = opts;
17
+ const { bus, host = '127.0.0.1', port = 0, maxBodyBytes = DEFAULT_MAX_BODY_BYTES, authToken, } = opts;
17
18
  const server = createServer((req, res) => {
18
- handle(req, res, { bus, maxBodyBytes });
19
+ handle(req, res, { bus, maxBodyBytes, authToken });
19
20
  });
20
21
  await new Promise((resolve, reject) => {
21
22
  server.once('error', reject);
@@ -34,18 +35,24 @@ export async function startDevLogServer(opts) {
34
35
  }
35
36
  function handle(req, res, ctx) {
36
37
  applyCors(req, res);
38
+ const url = requestUrl(req);
37
39
  if (req.method === 'OPTIONS') {
38
40
  res.statusCode = 204;
39
41
  res.end();
40
42
  return;
41
43
  }
42
- if (req.method === 'GET' && req.url === '/__hsx/health') {
44
+ if (req.method === 'GET' && url.pathname === '/__hsx/health') {
43
45
  res.statusCode = 200;
44
46
  res.setHeader('Content-Type', 'application/json');
45
47
  res.end('{"ok":true}');
46
48
  return;
47
49
  }
48
- if (req.method === 'POST' && req.url === '/__hsx/log') {
50
+ if (req.method === 'POST' && url.pathname === '/__hsx/log') {
51
+ if (!isAuthorizedDevLog(req, url, ctx.authToken)) {
52
+ res.writeHead(401, { 'Content-Type': 'application/json' });
53
+ res.end('{"error":"unauthorized"}');
54
+ return;
55
+ }
49
56
  void readJsonBody(req, ctx.maxBodyBytes).then((result) => {
50
57
  if (result.kind === 'error') {
51
58
  const status = result.reason === 'BODY_TOO_LARGE' ? 413 : 400;
@@ -62,31 +69,12 @@ function handle(req, res, ctx) {
62
69
  });
63
70
  return;
64
71
  }
65
- if (req.method === 'POST' && req.url === '/__hsx/event') {
66
- // Telemetry ingest from the deployed Cloudflare Worker. The Worker POSTs
67
- // `{request:{...}, logs:[...]}` after each handled request. Today this is
68
- // unauthenticated; the threat model is "anyone who guesses the random
69
- // trycloudflare URL within the dev session's TTL can inject log lines into
70
- // the developer's terminal." Mitigated by: 127.0.0.1 bind for the
71
- // origin server, fresh tunnel URL per session, short TTL, capped body
72
- // size. Not safe against an attacker who can observe the tunnel URL.
73
- //
74
- // To harden: distribute a per-session HMAC key. The runtime's existing
75
- // `signRuntimeDevProxyRequest` primitive is the right signing scheme, but
76
- // the key-distribution channel is unresolved — schema docs in
77
- // packages/types/src/schemas/index.ts explicitly exclude signing secrets
78
- // from `DevOverrideRegistration` (the public read model). Options:
79
- // (a) extend `DevOverrideRegisterRequest` with `telemetryHmacKey` and
80
- // have the control plane stash it on the runtime-internal record
81
- // only (never echo on the public registration shape);
82
- // (b) encode the key in the `telemetryUrl` (fragment or query param)
83
- // so it travels with the existing field and never needs to be
84
- // stored on the control-plane side;
85
- // (c) tie telemetry signing to the existing runtime `signingSecret`
86
- // (currently only used inbound, and itself not yet wired through
87
- // deployment config — would need that plumbing first).
88
- // Pick one before shipping public dev sessions or running on shared
89
- // tunnels.
72
+ if (req.method === 'POST' && url.pathname === '/__hsx/event') {
73
+ if (!isAuthorizedDevTelemetry(req, url, ctx.authToken)) {
74
+ res.writeHead(401, { 'Content-Type': 'application/json' });
75
+ res.end('{"error":"unauthorized"}');
76
+ return;
77
+ }
90
78
  void readJsonBody(req, ctx.maxBodyBytes).then((result) => {
91
79
  if (result.kind === 'error') {
92
80
  const status = result.reason === 'BODY_TOO_LARGE' ? 413 : 400;
@@ -112,7 +100,52 @@ function applyCors(req, res) {
112
100
  res.setHeader('Access-Control-Allow-Origin', origin);
113
101
  res.setHeader('Vary', 'Origin');
114
102
  res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
115
- res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
103
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-HSX-Dev-Token');
104
+ }
105
+ function requestUrl(req) {
106
+ try {
107
+ return new URL(req.url ?? '/', 'http://127.0.0.1');
108
+ }
109
+ catch {
110
+ return new URL('/', 'http://127.0.0.1');
111
+ }
112
+ }
113
+ function isAuthorizedDevTelemetry(req, url, expected) {
114
+ if (!expected)
115
+ return true;
116
+ const presented = url.searchParams.get('hsx_dev_token') ??
117
+ bearerToken(req.headers.authorization) ??
118
+ singleHeader(req.headers['x-hsx-dev-token']);
119
+ return presented ? timingSafeEqualString(presented, expected) : false;
120
+ }
121
+ function isAuthorizedDevLog(req, url, expected) {
122
+ if (!expected)
123
+ return true;
124
+ if (isLoopbackHost(singleHeader(req.headers.host)))
125
+ return true;
126
+ return isAuthorizedDevTelemetry(req, url, expected);
127
+ }
128
+ function bearerToken(value) {
129
+ if (!value)
130
+ return undefined;
131
+ const match = /^Bearer\s+(.+)$/i.exec(value.trim());
132
+ return match?.[1];
133
+ }
134
+ function singleHeader(value) {
135
+ if (Array.isArray(value))
136
+ return value[0];
137
+ return typeof value === 'string' ? value : undefined;
138
+ }
139
+ function timingSafeEqualString(left, right) {
140
+ const leftBuffer = Buffer.from(left);
141
+ const rightBuffer = Buffer.from(right);
142
+ return leftBuffer.length === rightBuffer.length && timingSafeEqual(leftBuffer, rightBuffer);
143
+ }
144
+ function isLoopbackHost(hostHeader) {
145
+ if (!hostHeader)
146
+ return false;
147
+ const host = hostHeader.replace(/:\d+$/, '').toLowerCase();
148
+ return host === 'localhost' || host === '127.0.0.1' || host === '[::1]' || host === '::1';
116
149
  }
117
150
  async function readJsonBody(req, maxBytes) {
118
151
  // Drain the body fully before deciding — throwing mid-iteration on some
@@ -150,6 +183,7 @@ function normalizeBody(body) {
150
183
  }
151
184
  function ingestEnvelope(bus, envelope) {
152
185
  const req = envelope.request;
186
+ const traceId = typeof req?.traceId === 'string' && req.traceId.length > 0 ? req.traceId : undefined;
153
187
  if (req) {
154
188
  const path = req.path ?? (req.url ? safePath(req.url) : '/');
155
189
  const method = req.method ?? 'GET';
@@ -163,6 +197,7 @@ function ingestEnvelope(bus, envelope) {
163
197
  ts: Date.now(),
164
198
  msg: summary,
165
199
  ...(req.capabilityId ? { source: req.capabilityId } : {}),
200
+ ...(traceId ? { fields: { traceId } } : {}),
166
201
  });
167
202
  }
168
203
  if (envelope.logs) {
@@ -173,7 +208,9 @@ function ingestEnvelope(bus, envelope) {
173
208
  ts: typeof log.ts === 'number' ? log.ts : Date.now(),
174
209
  msg: typeof log.msg === 'string' ? log.msg : '',
175
210
  ...(typeof log.source === 'string' ? { source: log.source } : {}),
176
- ...(log.fields ? { fields: log.fields } : {}),
211
+ ...(traceId || log.fields
212
+ ? { fields: { ...(log.fields ?? {}), ...(traceId ? { traceId } : {}) } }
213
+ : {}),
177
214
  };
178
215
  if (event.msg)
179
216
  bus.emit(event);
@@ -1 +1 @@
1
- {"version":3,"file":"log-server.js","sourceRoot":"","sources":["../../src/dev/log-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log-server.js","sourceRoot":"","sources":["../../src/dev/log-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface MigratedCardDevArtifacts {
2
+ readonly runtimeOrigin: string;
3
+ restoreSync(): void;
4
+ restore(): Promise<void>;
5
+ }
6
+ export declare function hasMigratedCardServerlessShim(root: string): Promise<boolean>;
7
+ /**
8
+ * Temporarily point a generated migration shim and its fetch allow-list at the
9
+ * public hs-x dev tunnel. The HubSpot UI-extension dev server reads these files
10
+ * after this step, so its bundle can call the local card-backend route. Cleanup
11
+ * restores every byte, including a previously deployed workers.dev origin.
12
+ */
13
+ export declare function prepareMigratedCardDevArtifacts(input: {
14
+ readonly root: string;
15
+ readonly runtimeOrigin: string;
16
+ }): Promise<MigratedCardDevArtifacts | undefined>;
17
+ //# sourceMappingURL=migrated-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrated-card.d.ts","sourceRoot":"","sources":["../../src/dev/migrated-card.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAsB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAElF;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CA6EhD"}
@@ -0,0 +1,114 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import { readFile, stat, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { stampMigratedRunServerlessShimOrigin } from '@hs-x/codegen';
5
+ const SHIM_RELATIVE_PATH = join('src', 'app', 'cards', '_hsx-migration-run-serverless.ts');
6
+ const APP_METADATA_RELATIVE_PATH = join('src', 'app', 'app-hsmeta.json');
7
+ const APP_CONFIG_RELATIVE_PATH = 'hsx.config.ts';
8
+ export async function hasMigratedCardServerlessShim(root) {
9
+ return Boolean(await stat(join(root, SHIM_RELATIVE_PATH)).catch(() => undefined));
10
+ }
11
+ /**
12
+ * Temporarily point a generated migration shim and its fetch allow-list at the
13
+ * public hs-x dev tunnel. The HubSpot UI-extension dev server reads these files
14
+ * after this step, so its bundle can call the local card-backend route. Cleanup
15
+ * restores every byte, including a previously deployed workers.dev origin.
16
+ */
17
+ export async function prepareMigratedCardDevArtifacts(input) {
18
+ const shimPath = join(input.root, SHIM_RELATIVE_PATH);
19
+ if (!(await stat(shimPath).catch(() => undefined)))
20
+ return undefined;
21
+ const paths = [
22
+ shimPath,
23
+ join(input.root, APP_METADATA_RELATIVE_PATH),
24
+ join(input.root, APP_CONFIG_RELATIVE_PATH),
25
+ ];
26
+ const originals = new Map();
27
+ for (const path of paths) {
28
+ const contents = await readFile(path, 'utf8').catch(() => undefined);
29
+ if (contents !== undefined)
30
+ originals.set(path, contents);
31
+ }
32
+ const shim = originals.get(shimPath);
33
+ if (shim === undefined)
34
+ return undefined;
35
+ const previousOrigin = /const RUNTIME_ORIGIN = ["']([^"']+)["'];/.exec(shim)?.[1] ?? 'https://runtime-origin.invalid';
36
+ const runtimeOrigin = input.runtimeOrigin.replace(/\/+$/, '');
37
+ const staged = new Map();
38
+ staged.set(shimPath, stampMigratedRunServerlessShimOrigin(shim, runtimeOrigin));
39
+ const metadataPath = join(input.root, APP_METADATA_RELATIVE_PATH);
40
+ const metadata = originals.get(metadataPath);
41
+ if (metadata !== undefined) {
42
+ staged.set(metadataPath, stampMetadataAllowlist(metadata, previousOrigin, runtimeOrigin));
43
+ }
44
+ const configPath = join(input.root, APP_CONFIG_RELATIVE_PATH);
45
+ const config = originals.get(configPath);
46
+ if (config !== undefined) {
47
+ staged.set(configPath, config.split(previousOrigin).join(runtimeOrigin));
48
+ }
49
+ const written = [];
50
+ try {
51
+ for (const [path, contents] of staged) {
52
+ await writeFile(path, contents);
53
+ written.push(path);
54
+ }
55
+ }
56
+ catch (error) {
57
+ for (const path of written.reverse()) {
58
+ const original = originals.get(path);
59
+ if (original !== undefined)
60
+ await writeFile(path, original);
61
+ }
62
+ throw error;
63
+ }
64
+ let restored = false;
65
+ const restoreSync = () => {
66
+ if (restored)
67
+ return;
68
+ restored = true;
69
+ process.removeListener('exit', restoreSync);
70
+ for (const [path, contents] of originals) {
71
+ writeFileSync(path, contents);
72
+ }
73
+ };
74
+ // Signals are best-effort in a process tree: a tunnel child can fail first,
75
+ // or startup can throw before the command installs its long-lived handlers.
76
+ // The synchronous exit hook is the final guard against leaving generated
77
+ // sources pointed at a dead quick-tunnel URL.
78
+ process.once('exit', restoreSync);
79
+ return {
80
+ runtimeOrigin,
81
+ restoreSync,
82
+ async restore() {
83
+ if (restored)
84
+ return;
85
+ restored = true;
86
+ process.removeListener('exit', restoreSync);
87
+ for (const [path, contents] of originals) {
88
+ await writeFile(path, contents);
89
+ }
90
+ },
91
+ };
92
+ }
93
+ function stampMetadataAllowlist(source, previousOrigin, runtimeOrigin) {
94
+ try {
95
+ const metadata = JSON.parse(source);
96
+ const config = metadata.config ?? {};
97
+ metadata.config = config;
98
+ const permittedUrls = config.permittedUrls ?? {};
99
+ config.permittedUrls = permittedUrls;
100
+ const current = Array.isArray(permittedUrls.fetch)
101
+ ? permittedUrls.fetch.filter((value) => typeof value === 'string')
102
+ : [];
103
+ permittedUrls.fetch = [
104
+ ...new Set(current.map((origin) => (origin === previousOrigin ? runtimeOrigin : origin))),
105
+ ];
106
+ if (!permittedUrls.fetch.includes(runtimeOrigin))
107
+ permittedUrls.fetch.push(runtimeOrigin);
108
+ return `${JSON.stringify(metadata, null, 2)}\n`;
109
+ }
110
+ catch {
111
+ return source.split(previousOrigin).join(runtimeOrigin);
112
+ }
113
+ }
114
+ //# sourceMappingURL=migrated-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrated-card.js","sourceRoot":"","sources":["../../src/dev/migrated-card.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Selector grammar + filter engine for the `hs-x dev` output stream, shared by
3
+ * the `--only` flag and the interactive keyboard so the two can never drift.
4
+ *
5
+ * Selectors (each `--only` adds one; lanes union, the rest AND):
6
+ * frontend | backend | request | hubspot lane — show only these surfaces
7
+ * errors level threshold: error rows only
8
+ * warnings level threshold: warn and error rows
9
+ * cap:<text> | <text> substring match on capability/source or message
10
+ *
11
+ * `hs-x dev --only frontend --only backend` shows both lanes;
12
+ * `hs-x dev --only errors --only cap:deal-health` shows deal-health errors.
13
+ */
14
+ import type { DevEvent, DevLane } from './event-bus.js';
15
+ export declare const DEV_LANES: readonly DevLane[];
16
+ export type DevLevelThreshold = 'all' | 'warn' | 'error';
17
+ export interface DevStreamFilter {
18
+ /** Lanes to show; undefined means every lane. */
19
+ readonly lanes: ReadonlySet<DevLane> | undefined;
20
+ /** Minimum level a row must reach to show. */
21
+ readonly level: DevLevelThreshold;
22
+ /** Case-insensitive substrings; a row must match at least one when present. */
23
+ readonly texts: readonly string[];
24
+ }
25
+ export declare const EMPTY_FILTER: DevStreamFilter;
26
+ export declare function isEmptyFilter(filter: DevStreamFilter): boolean;
27
+ export type ParseOnlyResult = {
28
+ readonly ok: true;
29
+ readonly filter: DevStreamFilter;
30
+ } | {
31
+ readonly ok: false;
32
+ readonly message: string;
33
+ };
34
+ export declare function parseOnlySelectors(values: readonly string[]): ParseOnlyResult;
35
+ export declare function matchesFilter(filter: DevStreamFilter, event: DevEvent): boolean;
36
+ /** Human summary for the status line: `frontend · errors · “deal-health”`. */
37
+ export declare function describeFilter(filter: DevStreamFilter): string;
38
+ /** Cycle for the `f` key: all → frontend → backend → request → hubspot → all. */
39
+ export declare function cycleLane(filter: DevStreamFilter): DevStreamFilter;
40
+ //# sourceMappingURL=stream-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-filter.d.ts","sourceRoot":"","sources":["../../src/dev/stream-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AAElE,eAAO,MAAM,SAAS,EAAE,SAAS,OAAO,EAAkD,CAAC;AAE3F,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,YAAY,EAAE,eAA+D,CAAC;AAE3F,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAE9D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAsC7E;AAKD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAQ/E;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAQ9D;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAKlE"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Selector grammar + filter engine for the `hs-x dev` output stream, shared by
3
+ * the `--only` flag and the interactive keyboard so the two can never drift.
4
+ *
5
+ * Selectors (each `--only` adds one; lanes union, the rest AND):
6
+ * frontend | backend | request | hubspot lane — show only these surfaces
7
+ * errors level threshold: error rows only
8
+ * warnings level threshold: warn and error rows
9
+ * cap:<text> | <text> substring match on capability/source or message
10
+ *
11
+ * `hs-x dev --only frontend --only backend` shows both lanes;
12
+ * `hs-x dev --only errors --only cap:deal-health` shows deal-health errors.
13
+ */
14
+ export const DEV_LANES = ['frontend', 'backend', 'request', 'hubspot'];
15
+ export const EMPTY_FILTER = { lanes: undefined, level: 'all', texts: [] };
16
+ export function isEmptyFilter(filter) {
17
+ return filter.lanes === undefined && filter.level === 'all' && filter.texts.length === 0;
18
+ }
19
+ export function parseOnlySelectors(values) {
20
+ const lanes = new Set();
21
+ let level = 'all';
22
+ const texts = [];
23
+ for (const raw of values) {
24
+ const value = raw.trim();
25
+ if (value === '') {
26
+ return { ok: false, message: 'Empty --only selector.' };
27
+ }
28
+ const lower = value.toLowerCase();
29
+ if (DEV_LANES.includes(lower)) {
30
+ lanes.add(lower);
31
+ continue;
32
+ }
33
+ if (lower === 'errors' || lower === 'error') {
34
+ level = 'error';
35
+ continue;
36
+ }
37
+ if (lower === 'warnings' || lower === 'warning' || lower === 'warn') {
38
+ if (level !== 'error')
39
+ level = 'warn';
40
+ continue;
41
+ }
42
+ if (lower.startsWith('cap:')) {
43
+ const text = value.slice('cap:'.length).trim();
44
+ if (text === '') {
45
+ return { ok: false, message: 'Empty capability in `--only cap:<id>`.' };
46
+ }
47
+ texts.push(text);
48
+ continue;
49
+ }
50
+ texts.push(value);
51
+ }
52
+ return {
53
+ ok: true,
54
+ filter: { lanes: lanes.size > 0 ? lanes : undefined, level, texts },
55
+ };
56
+ }
57
+ const LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 };
58
+ const THRESHOLD_RANK = { all: 0, warn: 2, error: 3 };
59
+ export function matchesFilter(filter, event) {
60
+ if (filter.lanes && !filter.lanes.has(event.lane))
61
+ return false;
62
+ if (LEVEL_RANK[event.level] < THRESHOLD_RANK[filter.level])
63
+ return false;
64
+ if (filter.texts.length > 0) {
65
+ const haystack = `${event.source ?? ''}\n${event.msg}`.toLowerCase();
66
+ if (!filter.texts.some((text) => haystack.includes(text.toLowerCase())))
67
+ return false;
68
+ }
69
+ return true;
70
+ }
71
+ /** Human summary for the status line: `frontend · errors · “deal-health”`. */
72
+ export function describeFilter(filter) {
73
+ if (isEmptyFilter(filter))
74
+ return 'all';
75
+ const parts = [];
76
+ if (filter.lanes)
77
+ parts.push([...filter.lanes].join('+'));
78
+ if (filter.level === 'error')
79
+ parts.push('errors');
80
+ if (filter.level === 'warn')
81
+ parts.push('warnings');
82
+ if (filter.texts.length > 0)
83
+ parts.push(filter.texts.map((t) => `“${t}”`).join(' '));
84
+ return parts.join(' · ');
85
+ }
86
+ /** Cycle for the `f` key: all → frontend → backend → request → hubspot → all. */
87
+ export function cycleLane(filter) {
88
+ const current = filter.lanes && filter.lanes.size === 1 ? [...filter.lanes][0] : undefined;
89
+ const index = current === undefined ? -1 : DEV_LANES.indexOf(current);
90
+ const next = index + 1 >= DEV_LANES.length ? undefined : DEV_LANES[index + 1];
91
+ return { ...filter, lanes: next === undefined ? undefined : new Set([next]) };
92
+ }
93
+ //# sourceMappingURL=stream-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-filter.js","sourceRoot":"","sources":["../../src/dev/stream-filter.ts"],"names":[],"mappings":"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"}
@@ -7,15 +7,49 @@
7
7
  *
8
8
  * The lane prefix tells the developer which surface emitted the line; the
9
9
  * level color matches conventions used elsewhere in the reporter.
10
+ *
11
+ * On a TTY the renderer also owns a status line pinned under the stream —
12
+ * active filter, hidden-row count, and key hints — and exposes a control
13
+ * surface (`setFilter` / `pause` / `setPrompt`) that the keyboard controller
14
+ * in keyboard.ts drives. Non-TTY output is untouched: no status line, no
15
+ * escape codes, every event printed.
10
16
  */
11
17
  import type { DevEventBus } from './event-bus.js';
18
+ import { type DevStreamFilter } from './stream-filter.js';
12
19
  export interface DevStreamRendererOptions {
13
20
  readonly bus: DevEventBus;
14
21
  readonly stderr?: NodeJS.WritableStream;
15
22
  readonly env?: NodeJS.ProcessEnv;
16
23
  readonly isTTY?: boolean;
24
+ /** Initial filter, from `--only` selectors. */
25
+ readonly filter?: DevStreamFilter;
26
+ /**
27
+ * Hold the pinned status line until `ready()` is called, so it cannot
28
+ * interleave with startup output the caller is still printing.
29
+ */
30
+ readonly deferStatus?: boolean;
17
31
  }
18
32
  export interface DevStreamRenderer {
33
+ /** Enable the status line (no-op unless constructed with deferStatus). */
34
+ ready(): void;
35
+ /** Whether this session renders the pinned status line (TTY + color). */
36
+ hasStatusLine(): boolean;
37
+ getFilter(): DevStreamFilter;
38
+ setFilter(filter: DevStreamFilter): void;
39
+ /** Restore the launch filter (the `--only` selectors, or empty). */
40
+ resetFilter(): void;
41
+ /** Pause buffers matching events; resume flushes them in order. */
42
+ setPaused(paused: boolean): void;
43
+ isPaused(): boolean;
44
+ /**
45
+ * Replace the status line with an input prompt (the `/` search box) or
46
+ * restore the default status line when undefined.
47
+ */
48
+ setPrompt(prompt: string | undefined): void;
49
+ /** Rows suppressed by the active filter since it was last changed. */
50
+ hiddenCount(): number;
51
+ /** Print lines above the status line (help text, announcements). */
52
+ announce(text: string): void;
19
53
  stop(): void;
20
54
  }
21
55
  export declare function startDevStreamRenderer(opts: DevStreamRendererOptions): DevStreamRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"stream-renderer.d.ts","sourceRoot":"","sources":["../../src/dev/stream-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAY,WAAW,EAAY,MAAM,gBAAgB,CAAC;AAEtE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,IAAI,IAAI,CAAC;CACd;AAQD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CAaxF"}
1
+ {"version":3,"file":"stream-renderer.d.ts","sourceRoot":"","sources":["../../src/dev/stream-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,KAAK,EAAY,WAAW,EAAY,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,KAAK,eAAe,EAKrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,IAAI,IAAI,CAAC;IACd,yEAAyE;IACzE,aAAa,IAAI,OAAO,CAAC;IACzB,SAAS,IAAI,eAAe,CAAC;IAC7B,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,oEAAoE;IACpE,WAAW,IAAI,IAAI,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,IAAI,OAAO,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC5C,sEAAsE;IACtE,WAAW,IAAI,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,IAAI,IAAI,CAAC;CACd;AAWD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CA0MxF"}