@hexclave/shared 1.0.2 → 1.0.5

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 (353) hide show
  1. package/dist/ai/unified-prompts/reminders.js +4 -3
  2. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  3. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +3 -1
  4. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  5. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +217 -30
  6. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  7. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  8. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +1 -0
  9. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  10. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +18 -6
  11. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +23 -8
  12. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -1
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  15. package/dist/config/schema.d.ts +63 -63
  16. package/dist/config/schema.d.ts.map +1 -1
  17. package/dist/config/schema.js +5 -5
  18. package/dist/config/schema.js.map +1 -1
  19. package/dist/config-authoring.d.ts +4 -4
  20. package/dist/config-authoring.d.ts.map +1 -1
  21. package/dist/config-authoring.js +2 -2
  22. package/dist/config-authoring.js.map +1 -1
  23. package/dist/config-rendering.d.ts +4 -4
  24. package/dist/config-rendering.d.ts.map +1 -1
  25. package/dist/config-rendering.js +19 -18
  26. package/dist/config-rendering.js.map +1 -1
  27. package/dist/esm/ai/unified-prompts/reminders.js +4 -3
  28. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  29. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts +3 -1
  30. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  31. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +216 -31
  32. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  33. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  34. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +1 -0
  35. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  36. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.d.ts +18 -6
  37. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +23 -8
  38. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  39. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -1
  40. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  41. package/dist/esm/config/schema.d.ts +63 -63
  42. package/dist/esm/config/schema.d.ts.map +1 -1
  43. package/dist/esm/config/schema.js +5 -5
  44. package/dist/esm/config/schema.js.map +1 -1
  45. package/dist/esm/config-authoring.d.ts +4 -4
  46. package/dist/esm/config-authoring.d.ts.map +1 -1
  47. package/dist/esm/config-authoring.js +2 -2
  48. package/dist/esm/config-authoring.js.map +1 -1
  49. package/dist/esm/config-rendering.d.ts +4 -4
  50. package/dist/esm/config-rendering.d.ts.map +1 -1
  51. package/dist/esm/config-rendering.js +15 -14
  52. package/dist/esm/config-rendering.js.map +1 -1
  53. package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
  54. package/dist/esm/helpers/vault/client-side.js.map +1 -1
  55. package/dist/esm/helpers/vault/server-side.d.ts.map +1 -1
  56. package/dist/esm/helpers/vault/server-side.js.map +1 -1
  57. package/dist/esm/hexclave-config-file.d.ts +15 -0
  58. package/dist/esm/hexclave-config-file.d.ts.map +1 -0
  59. package/dist/esm/{stack-config-file.js → hexclave-config-file.js} +7 -7
  60. package/dist/esm/hexclave-config-file.js.map +1 -0
  61. package/dist/esm/hooks/use-async-callback.js +1 -1
  62. package/dist/esm/hooks/use-async-external-store.js +1 -1
  63. package/dist/esm/hooks/use-strict-memo.js +1 -1
  64. package/dist/esm/interface/admin-metrics.d.ts +8 -8
  65. package/dist/esm/interface/admin-metrics.js.map +1 -1
  66. package/dist/esm/interface/client-interface.js +2 -2
  67. package/dist/esm/interface/client-interface.js.map +1 -1
  68. package/dist/esm/interface/conversations.d.ts +32 -32
  69. package/dist/esm/interface/crud/current-user.d.ts +9 -9
  70. package/dist/esm/interface/crud/email-outbox.d.ts +200 -200
  71. package/dist/esm/interface/crud/products.d.ts +13 -13
  72. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  73. package/dist/esm/interface/crud/project-api-keys.d.ts +4 -4
  74. package/dist/esm/interface/crud/project-permissions.js +5 -5
  75. package/dist/esm/interface/crud/project-permissions.js.map +1 -1
  76. package/dist/esm/interface/crud/projects.d.ts +36 -36
  77. package/dist/esm/interface/crud/team-member-profiles.d.ts +18 -18
  78. package/dist/esm/interface/crud/team-permissions.js +5 -5
  79. package/dist/esm/interface/crud/team-permissions.js.map +1 -1
  80. package/dist/esm/interface/crud/transactions.d.ts +6 -6
  81. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  82. package/dist/esm/interface/crud/users.d.ts +12 -12
  83. package/dist/esm/interface/page-component-versions.js +107 -107
  84. package/dist/esm/interface/page-component-versions.js.map +1 -1
  85. package/dist/esm/interface/webhooks.d.ts +2 -2
  86. package/dist/esm/known-errors.d.ts +2 -2
  87. package/dist/esm/known-errors.js +4 -4
  88. package/dist/esm/known-errors.js.map +1 -1
  89. package/dist/esm/schema-fields.d.ts +17 -7
  90. package/dist/esm/schema-fields.d.ts.map +1 -1
  91. package/dist/esm/schema-fields.js +26 -16
  92. package/dist/esm/schema-fields.js.map +1 -1
  93. package/dist/esm/sessions.d.ts +7 -7
  94. package/dist/esm/utils/crypto.d.ts.map +1 -1
  95. package/dist/esm/utils/crypto.js.map +1 -1
  96. package/dist/esm/utils/currency-constants.d.ts +6 -0
  97. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  98. package/dist/esm/utils/currency-constants.js.map +1 -1
  99. package/dist/esm/utils/dev-env-state-path.d.ts +3 -3
  100. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  101. package/dist/esm/utils/dev-env-state-path.js +4 -4
  102. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  103. package/dist/esm/utils/errors.js +2 -2
  104. package/dist/esm/utils/errors.js.map +1 -1
  105. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  106. package/dist/esm/utils/esbuild.js +0 -1
  107. package/dist/esm/utils/esbuild.js.map +1 -1
  108. package/dist/esm/utils/featurebase.d.ts +3 -3
  109. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  110. package/dist/esm/utils/featurebase.js +15 -15
  111. package/dist/esm/utils/featurebase.js.map +1 -1
  112. package/dist/esm/utils/fs.js +6 -6
  113. package/dist/esm/utils/fs.js.map +1 -1
  114. package/dist/esm/utils/globals.d.ts.map +1 -1
  115. package/dist/esm/utils/globals.js +10 -10
  116. package/dist/esm/utils/globals.js.map +1 -1
  117. package/dist/esm/utils/jwt.d.ts.map +1 -1
  118. package/dist/esm/utils/jwt.js +3 -3
  119. package/dist/esm/utils/jwt.js.map +1 -1
  120. package/dist/esm/utils/redirect-urls.d.ts +3 -3
  121. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  122. package/dist/esm/utils/redirect-urls.js +5 -5
  123. package/dist/esm/utils/redirect-urls.js.map +1 -1
  124. package/dist/esm/utils/urls.js.map +1 -1
  125. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  126. package/dist/helpers/vault/client-side.js.map +1 -1
  127. package/dist/helpers/vault/server-side.d.ts.map +1 -1
  128. package/dist/helpers/vault/server-side.js.map +1 -1
  129. package/dist/hexclave-config-file.d.ts +15 -0
  130. package/dist/hexclave-config-file.d.ts.map +1 -0
  131. package/dist/{stack-config-file.js → hexclave-config-file.js} +8 -8
  132. package/dist/hexclave-config-file.js.map +1 -0
  133. package/dist/hooks/use-async-callback.js +1 -1
  134. package/dist/hooks/use-async-external-store.js +1 -1
  135. package/dist/hooks/use-strict-memo.js +1 -1
  136. package/dist/interface/admin-metrics.d.ts +8 -8
  137. package/dist/interface/admin-metrics.js.map +1 -1
  138. package/dist/interface/client-interface.js +2 -2
  139. package/dist/interface/client-interface.js.map +1 -1
  140. package/dist/interface/conversations.d.ts +32 -32
  141. package/dist/interface/crud/current-user.d.ts +9 -9
  142. package/dist/interface/crud/email-outbox.d.ts +200 -200
  143. package/dist/interface/crud/products.d.ts +13 -13
  144. package/dist/interface/crud/products.d.ts.map +1 -1
  145. package/dist/interface/crud/project-api-keys.d.ts +4 -4
  146. package/dist/interface/crud/project-permissions.js +5 -5
  147. package/dist/interface/crud/project-permissions.js.map +1 -1
  148. package/dist/interface/crud/projects.d.ts +36 -36
  149. package/dist/interface/crud/team-member-profiles.d.ts +18 -18
  150. package/dist/interface/crud/team-permissions.js +5 -5
  151. package/dist/interface/crud/team-permissions.js.map +1 -1
  152. package/dist/interface/crud/transactions.d.ts +6 -6
  153. package/dist/interface/crud/transactions.d.ts.map +1 -1
  154. package/dist/interface/crud/users.d.ts +12 -12
  155. package/dist/interface/page-component-versions.js +107 -107
  156. package/dist/interface/page-component-versions.js.map +1 -1
  157. package/dist/interface/webhooks.d.ts +2 -2
  158. package/dist/known-errors.d.ts +2 -2
  159. package/dist/known-errors.js +4 -4
  160. package/dist/known-errors.js.map +1 -1
  161. package/dist/schema-fields.d.ts +17 -7
  162. package/dist/schema-fields.d.ts.map +1 -1
  163. package/dist/schema-fields.js +26 -16
  164. package/dist/schema-fields.js.map +1 -1
  165. package/dist/sessions.d.ts +7 -7
  166. package/dist/utils/crypto.d.ts.map +1 -1
  167. package/dist/utils/crypto.js.map +1 -1
  168. package/dist/utils/currency-constants.d.ts +6 -0
  169. package/dist/utils/currency-constants.d.ts.map +1 -1
  170. package/dist/utils/currency-constants.js.map +1 -1
  171. package/dist/utils/dev-env-state-path.d.ts +3 -3
  172. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  173. package/dist/utils/dev-env-state-path.js +5 -5
  174. package/dist/utils/dev-env-state-path.js.map +1 -1
  175. package/dist/utils/errors.js +2 -2
  176. package/dist/utils/errors.js.map +1 -1
  177. package/dist/utils/esbuild.d.ts.map +1 -1
  178. package/dist/utils/esbuild.js +0 -1
  179. package/dist/utils/esbuild.js.map +1 -1
  180. package/dist/utils/featurebase.d.ts +3 -3
  181. package/dist/utils/featurebase.d.ts.map +1 -1
  182. package/dist/utils/featurebase.js +15 -15
  183. package/dist/utils/featurebase.js.map +1 -1
  184. package/dist/utils/fs.js.map +1 -1
  185. package/dist/utils/globals.d.ts.map +1 -1
  186. package/dist/utils/globals.js +10 -10
  187. package/dist/utils/globals.js.map +1 -1
  188. package/dist/utils/jwt.d.ts.map +1 -1
  189. package/dist/utils/jwt.js +3 -3
  190. package/dist/utils/jwt.js.map +1 -1
  191. package/dist/utils/redirect-urls.d.ts +3 -3
  192. package/dist/utils/redirect-urls.d.ts.map +1 -1
  193. package/dist/utils/redirect-urls.js +5 -5
  194. package/dist/utils/redirect-urls.js.map +1 -1
  195. package/dist/utils/urls.js.map +1 -1
  196. package/package.json +2 -1
  197. package/src/ai/image-limits.ts +62 -0
  198. package/src/ai/llms/llms.ts +36 -0
  199. package/src/ai/unified-prompts/reminders.ts +27 -0
  200. package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +1047 -0
  201. package/src/ai/unified-prompts/skill-site-prompt-parts/brain.ts +5 -0
  202. package/src/ai/unified-prompts/skill-site-prompt-parts/cli-help.ts +5 -0
  203. package/src/ai/unified-prompts/skill-site-prompt-parts/config-docs.ts +5 -0
  204. package/src/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.ts +5 -0
  205. package/src/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.ts +5 -0
  206. package/src/ai/unified-prompts/skill-site-prompt-parts/docs-index.ts +80 -0
  207. package/src/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.ts +322 -0
  208. package/src/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.ts +5 -0
  209. package/src/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.ts +5 -0
  210. package/src/ai/unified-prompts/skill-site-prompt.ts +72 -0
  211. package/src/apps/apps-config.ts +177 -0
  212. package/src/apps/apps-ui.tsx +112 -0
  213. package/src/config/README.md +154 -0
  214. package/src/config/db-sync-mappings.ts +2293 -0
  215. package/src/config/format.ts +388 -0
  216. package/src/config/migrate-catalogs-to-product-lines.ts +475 -0
  217. package/src/config/schema-fuzzer.test.ts +377 -0
  218. package/src/config/schema.ts +1507 -0
  219. package/src/config-authoring.test.ts +52 -0
  220. package/src/config-authoring.ts +37 -0
  221. package/src/config-rendering.ts +142 -0
  222. package/src/crud.tsx +275 -0
  223. package/src/global.d.ts +1 -0
  224. package/src/helpers/emails.ts +250 -0
  225. package/src/helpers/init-prompt.ts +39 -0
  226. package/src/helpers/password.ts +16 -0
  227. package/src/helpers/production-mode.ts +58 -0
  228. package/src/helpers/support-sla.test.ts +124 -0
  229. package/src/helpers/support-sla.ts +93 -0
  230. package/src/helpers/vault/client-side.ts +92 -0
  231. package/src/helpers/vault/server-side.ts +153 -0
  232. package/src/hexclave-config-file.ts +120 -0
  233. package/src/hooks/use-async-callback.tsx +43 -0
  234. package/src/hooks/use-async-external-store.tsx +24 -0
  235. package/src/hooks/use-hash.tsx +14 -0
  236. package/src/hooks/use-hover.tsx +88 -0
  237. package/src/hooks/use-strict-memo.tsx +157 -0
  238. package/src/index.ts +17 -0
  239. package/src/interface/admin-interface.ts +1043 -0
  240. package/src/interface/admin-metrics.ts +214 -0
  241. package/src/interface/client-interface.test.ts +765 -0
  242. package/src/interface/client-interface.ts +2586 -0
  243. package/src/interface/conversations.ts +109 -0
  244. package/src/interface/crud/analytics.ts +11 -0
  245. package/src/interface/crud/connected-accounts.ts +52 -0
  246. package/src/interface/crud/contact-channels.ts +74 -0
  247. package/src/interface/crud/current-user.ts +72 -0
  248. package/src/interface/crud/email-outbox.ts +263 -0
  249. package/src/interface/crud/email-templates.ts +50 -0
  250. package/src/interface/crud/emails.ts +22 -0
  251. package/src/interface/crud/internal-api-keys.ts +69 -0
  252. package/src/interface/crud/invoices.ts +36 -0
  253. package/src/interface/crud/items.ts +24 -0
  254. package/src/interface/crud/notification-preferences.ts +33 -0
  255. package/src/interface/crud/oauth-providers.ts +91 -0
  256. package/src/interface/crud/products.ts +42 -0
  257. package/src/interface/crud/project-api-keys.ts +100 -0
  258. package/src/interface/crud/project-permissions.ts +118 -0
  259. package/src/interface/crud/projects.ts +229 -0
  260. package/src/interface/crud/session-replays.ts +85 -0
  261. package/src/interface/crud/sessions.ts +66 -0
  262. package/src/interface/crud/sign-up-rules.ts +12 -0
  263. package/src/interface/crud/svix-token.ts +20 -0
  264. package/src/interface/crud/team-invitation-details.ts +22 -0
  265. package/src/interface/crud/team-invitation.ts +35 -0
  266. package/src/interface/crud/team-member-profiles.ts +61 -0
  267. package/src/interface/crud/team-memberships.ts +56 -0
  268. package/src/interface/crud/team-permissions.ts +119 -0
  269. package/src/interface/crud/teams.ts +142 -0
  270. package/src/interface/crud/transactions.ts +131 -0
  271. package/src/interface/crud/users.ts +185 -0
  272. package/src/interface/handler-urls.ts +74 -0
  273. package/src/interface/page-component-versions.ts +1702 -0
  274. package/src/interface/server-interface.ts +1146 -0
  275. package/src/interface/webhooks.ts +28 -0
  276. package/src/known-errors.tsx +2031 -0
  277. package/src/local-emulator.ts +5 -0
  278. package/src/payments/payment-methods.ts +167 -0
  279. package/src/payments/stripe-limits.ts +18 -0
  280. package/src/plans.ts +107 -0
  281. package/src/schema-fields.ts +944 -0
  282. package/src/sessions.ts +310 -0
  283. package/src/utils/api-keys.tsx +122 -0
  284. package/src/utils/arrays.tsx +248 -0
  285. package/src/utils/auth-methods.ts +8 -0
  286. package/src/utils/base64.tsx +24 -0
  287. package/src/utils/booleans.tsx +34 -0
  288. package/src/utils/browser-compat.tsx +17 -0
  289. package/src/utils/bytes.tsx +280 -0
  290. package/src/utils/caches.tsx +280 -0
  291. package/src/utils/cel-fields.ts +92 -0
  292. package/src/utils/cloud-hosts.tsx +92 -0
  293. package/src/utils/compile-time.tsx +11 -0
  294. package/src/utils/country-codes.ts +39 -0
  295. package/src/utils/crypto.tsx +174 -0
  296. package/src/utils/currencies.tsx +53 -0
  297. package/src/utils/currency-constants.tsx +51 -0
  298. package/src/utils/dates.tsx +246 -0
  299. package/src/utils/dev-env-state-path.ts +14 -0
  300. package/src/utils/dom.tsx +7 -0
  301. package/src/utils/env.tsx +117 -0
  302. package/src/utils/errors.tsx +284 -0
  303. package/src/utils/esbuild.tsx +235 -0
  304. package/src/utils/featurebase.tsx +247 -0
  305. package/src/utils/fs.tsx +33 -0
  306. package/src/utils/functions.tsx +22 -0
  307. package/src/utils/geo.tsx +16 -0
  308. package/src/utils/globals.tsx +48 -0
  309. package/src/utils/hashes.tsx +52 -0
  310. package/src/utils/html.tsx +60 -0
  311. package/src/utils/http.tsx +91 -0
  312. package/src/utils/ips.tsx +47 -0
  313. package/src/utils/json.tsx +200 -0
  314. package/src/utils/jsx-editable-transpiler.test.ts +156 -0
  315. package/src/utils/jsx-editable-transpiler.tsx +401 -0
  316. package/src/utils/jwt.tsx +170 -0
  317. package/src/utils/locks.tsx +71 -0
  318. package/src/utils/maps.tsx +407 -0
  319. package/src/utils/math.tsx +18 -0
  320. package/src/utils/monkey-patch.tsx +29 -0
  321. package/src/utils/node-http.tsx +47 -0
  322. package/src/utils/numbers.tsx +82 -0
  323. package/src/utils/oauth.tsx +9 -0
  324. package/src/utils/objects.tsx +581 -0
  325. package/src/utils/paginated-lists.test.ts +1039 -0
  326. package/src/utils/paginated-lists.tsx +479 -0
  327. package/src/utils/passkey.tsx +1 -0
  328. package/src/utils/promises.tsx +540 -0
  329. package/src/utils/proxies.tsx +212 -0
  330. package/src/utils/react.tsx +308 -0
  331. package/src/utils/redirect-urls.tsx +299 -0
  332. package/src/utils/regex.tsx +10 -0
  333. package/src/utils/results.tsx +411 -0
  334. package/src/utils/sentry.tsx +20 -0
  335. package/src/utils/stores.tsx +238 -0
  336. package/src/utils/strings.nicify.test.ts +253 -0
  337. package/src/utils/strings.tsx +723 -0
  338. package/src/utils/telemetry.tsx +37 -0
  339. package/src/utils/turnstile-browser.ts +106 -0
  340. package/src/utils/turnstile-flow.test.ts +101 -0
  341. package/src/utils/turnstile-flow.ts +266 -0
  342. package/src/utils/turnstile.ts +34 -0
  343. package/src/utils/typed-arrays.tsx +17 -0
  344. package/src/utils/types.tsx +208 -0
  345. package/src/utils/unicode.tsx +24 -0
  346. package/src/utils/urls.tsx +411 -0
  347. package/src/utils/uuids.tsx +47 -0
  348. package/dist/esm/stack-config-file.d.ts +0 -15
  349. package/dist/esm/stack-config-file.d.ts.map +0 -1
  350. package/dist/esm/stack-config-file.js.map +0 -1
  351. package/dist/stack-config-file.d.ts +0 -15
  352. package/dist/stack-config-file.d.ts.map +0 -1
  353. package/dist/stack-config-file.js.map +0 -1
@@ -0,0 +1,214 @@
1
+ import yup from "yup";
2
+ import { yupArray, yupMixed, yupNumber, yupObject, yupRecord, yupString } from "../schema-fields";
3
+
4
+ // Single source of truth for the `/internal/metrics` endpoint shape.
5
+ //
6
+ // Both the backend route handler (`apps/backend/src/app/api/latest/internal/metrics/route.tsx`)
7
+ // and the dashboard hook (`apps/dashboard/src/lib/hexclave-app-internals.ts`) import
8
+ // these schemas. The runtime validation lives in the schemas; the static types
9
+ // are derived via `yup.InferType` so we never have to keep parallel copies in
10
+ // sync.
11
+
12
+ export const MetricsDataPointSchema = yupObject({
13
+ date: yupString().defined(),
14
+ activity: yupNumber().defined(),
15
+ }).defined();
16
+
17
+ export const MetricsDataPointsSchema = yupArray(MetricsDataPointSchema).defined();
18
+
19
+ export const MetricsActivitySplitSchema = yupObject({
20
+ total: MetricsDataPointsSchema,
21
+ new: MetricsDataPointsSchema,
22
+ retained: MetricsDataPointsSchema,
23
+ reactivated: MetricsDataPointsSchema,
24
+ }).defined();
25
+
26
+ export const MetricsAuthOverviewSchema = yupObject({
27
+ verified_users: yupNumber().integer().defined(),
28
+ unverified_users: yupNumber().integer().defined(),
29
+ anonymous_users: yupNumber().integer().defined(),
30
+ total_teams: yupNumber().integer().defined(),
31
+ mau: yupNumber().integer().defined(),
32
+ daily_active_users_split: MetricsActivitySplitSchema,
33
+ daily_active_teams_split: MetricsActivitySplitSchema,
34
+ total_users_filtered: yupNumber().integer().defined(),
35
+ }).defined();
36
+
37
+ export const MetricsPaymentsOverviewSchema = yupObject({
38
+ subscriptions_by_status: yupRecord(yupString().defined(), yupNumber().defined()).defined(),
39
+ active_subscription_count: yupNumber().integer().defined(),
40
+ total_one_time_purchases: yupNumber().integer().defined(),
41
+ daily_subscriptions: MetricsDataPointsSchema,
42
+ revenue_cents: yupNumber().integer().defined(),
43
+ mrr_cents: yupNumber().integer().defined(),
44
+ total_orders: yupNumber().integer().defined(),
45
+ checkout_conversion_rate: yupNumber().defined(),
46
+ }).defined();
47
+
48
+ export const MetricsRecentEmailSchema = yupObject({
49
+ id: yupString().defined(),
50
+ status: yupString().defined(),
51
+ subject: yupString().defined(),
52
+ created_at_millis: yupNumber().defined(),
53
+ }).defined();
54
+
55
+ export const MetricsDailyEmailStatusBreakdownSchema = yupObject({
56
+ date: yupString().defined(),
57
+ ok: yupNumber().integer().defined(),
58
+ error: yupNumber().integer().defined(),
59
+ in_progress: yupNumber().integer().defined(),
60
+ }).defined();
61
+
62
+ export const MetricsEmailOverviewSchema = yupObject({
63
+ emails_by_status: yupRecord(yupString().defined(), yupNumber().defined()).defined(),
64
+ total_emails: yupNumber().integer().defined(),
65
+ daily_emails: MetricsDataPointsSchema,
66
+ daily_emails_by_status: yupArray(MetricsDailyEmailStatusBreakdownSchema).defined(),
67
+ emails_sent: yupNumber().integer().defined(),
68
+ recent_emails: yupArray(MetricsRecentEmailSchema).defined(),
69
+ deliverability_status: yupObject({
70
+ delivered: yupNumber().integer().defined(),
71
+ bounced: yupNumber().integer().defined(),
72
+ error: yupNumber().integer().defined(),
73
+ in_progress: yupNumber().integer().defined(),
74
+ }).defined(),
75
+ deliverability_rate: yupNumber().defined(),
76
+ bounce_rate: yupNumber().defined(),
77
+ click_rate: yupNumber().defined(),
78
+ }).defined();
79
+
80
+ export const MetricsDailyRevenuePointSchema = yupObject({
81
+ date: yupString().defined(),
82
+ new_cents: yupNumber().integer().defined(),
83
+ refund_cents: yupNumber().integer().defined(),
84
+ }).defined();
85
+
86
+ export const MetricsTopReferrerSchema = yupObject({
87
+ referrer: yupString().defined(),
88
+ visitors: yupNumber().integer().defined(),
89
+ }).defined();
90
+
91
+ export const MetricsTopRegionSchema = yupObject({
92
+ country_code: yupString().nullable().defined(),
93
+ region_code: yupString().nullable().defined(),
94
+ count: yupNumber().integer().defined(),
95
+ }).defined();
96
+
97
+ export const MetricsAnalyticsOverviewSchema = yupObject({
98
+ daily_page_views: MetricsDataPointsSchema,
99
+ daily_clicks: MetricsDataPointsSchema,
100
+ daily_visitors: MetricsDataPointsSchema,
101
+ // Token-refresh-derived anonymous-visitor fallback. Populated only when the
102
+ // analytics app isn't installed (no `$page-view` events) — counts DISTINCT
103
+ // anonymous users per day from the events table. See
104
+ // `loadAnonymousVisitorsFromTokenRefresh` in the backend metrics route.
105
+ //
106
+ // Optional for one release cycle so older clients/servers don't hard-fail
107
+ // validation during a staged rollout. Tighten to `.defined()` after.
108
+ daily_anonymous_visitors_fallback: yupArray(MetricsDataPointSchema).optional().default([]),
109
+ daily_revenue: yupArray(MetricsDailyRevenuePointSchema).defined(),
110
+ total_revenue_cents: yupNumber().integer().defined(),
111
+ total_replays: yupNumber().integer().defined(),
112
+ recent_replays: yupNumber().integer().defined(),
113
+ visitors: yupNumber().integer().defined(),
114
+ anonymous_visitors_fallback: yupNumber().integer().optional().default(0),
115
+ avg_session_seconds: yupNumber().defined(),
116
+ online_live: yupNumber().integer().defined(),
117
+ revenue_per_visitor: yupNumber().defined(),
118
+ top_referrers: yupArray(MetricsTopReferrerSchema).defined(),
119
+ top_region: MetricsTopRegionSchema.nullable().defined(),
120
+ // dev-fallback fields (only present in non-production environments)
121
+ bounce_rate: yupNumber().optional(),
122
+ conversion_rate: yupNumber().optional(),
123
+ deltas: yupMixed().optional(),
124
+ }).defined();
125
+
126
+ export const MetricsLoginMethodEntrySchema = yupObject({
127
+ method: yupString().defined(),
128
+ count: yupNumber().integer().defined(),
129
+ }).defined();
130
+
131
+ // Recent user summary — a slim projection of UsersCrud["Admin"]["Read"] with
132
+ // just the fields the overview list views actually read. Defined here so the
133
+ // metrics response stays self-contained and doesn't pull in users-crud.
134
+ //
135
+ // `.noUnknown(false)` tells our strict object validator to allow the extra
136
+ // fields that the backend returns as part of the full users-crud payload —
137
+ // `is_anonymous`, `has_password`, `oauth_providers`, etc. — without rejecting
138
+ // them. Only the keys explicitly listed here are validated; extras pass through.
139
+ export const MetricsRecentUserSchema = yupObject({
140
+ id: yupString().defined(),
141
+ display_name: yupString().nullable().defined(),
142
+ primary_email: yupString().nullable().defined(),
143
+ profile_image_url: yupString().nullable().defined(),
144
+ signed_up_at_millis: yupNumber().defined(),
145
+ last_active_at_millis: yupNumber().nullable().defined(),
146
+ }).noUnknown(false).defined();
147
+
148
+ // Per-user activity heatmap — a simple list of daily event counts for a single
149
+ // user. Backed by ClickHouse `analytics_internal.events` filtered by user_id,
150
+ // project_id, and branch_id. See `/internal/user-activity` on the backend.
151
+ export const UserActivityResponseBodySchema = yupObject({
152
+ data_points: MetricsDataPointsSchema,
153
+ }).defined();
154
+
155
+ // Recent "currently live" users keyed by ISO country code. Populated by
156
+ // joining a bounded ClickHouse selection from the live `$token-refresh` window
157
+ // with the corresponding Prisma profile rows, so the overview globe can render
158
+ // real avatars of real users from each country. Optional for one release cycle
159
+ // so clients talking to older servers don't fail validation on the returned
160
+ // body.
161
+ export const MetricsActiveUsersByCountrySchema = yupRecord(
162
+ yupString().defined(),
163
+ yupArray(MetricsRecentUserSchema).defined(),
164
+ ).optional().default({});
165
+
166
+ export const MetricsResponseBodySchema = yupObject({
167
+ total_users: yupNumber().integer().defined(),
168
+ // Count of distinct users seen refreshing a token in the last ~2 minutes —
169
+ // the "who's online right now" number rendered on the overview globe. Derived
170
+ // from the same `$token-refresh` window that powers `active_users_by_country`,
171
+ // so it works for every project regardless of whether the analytics app
172
+ // (page-view-based `analytics_overview.online_live`) is installed.
173
+ //
174
+ // Optional for one release cycle so older servers don't fail schema
175
+ // validation on the returned body. Tighten to `.defined()` after.
176
+ live_users: yupNumber().integer().optional().default(0),
177
+ daily_users: MetricsDataPointsSchema,
178
+ daily_active_users: MetricsDataPointsSchema,
179
+ users_by_country: yupRecord(yupString().defined(), yupNumber().defined()).defined(),
180
+ active_users_by_country: MetricsActiveUsersByCountrySchema,
181
+ // recently_registered/active are CRUD User objects passed through from the
182
+ // backend. The schema only validates the fields the dashboard actually
183
+ // reads — extra fields from UsersCrud["Admin"]["Read"] are allowed through.
184
+ recently_registered: yupArray(MetricsRecentUserSchema).defined(),
185
+ recently_active: yupArray(MetricsRecentUserSchema).defined(),
186
+ login_methods: yupArray(MetricsLoginMethodEntrySchema).defined(),
187
+ auth_overview: MetricsAuthOverviewSchema,
188
+ payments_overview: MetricsPaymentsOverviewSchema,
189
+ email_overview: MetricsEmailOverviewSchema,
190
+ analytics_overview: MetricsAnalyticsOverviewSchema,
191
+ }).defined();
192
+
193
+ export const MetricsUserCountsSchema = yupObject({
194
+ total_users: yupNumber().integer().defined(),
195
+ anonymous_users: yupNumber().integer().defined(),
196
+ }).defined();
197
+
198
+ // Derived static types — single source of truth lives in the schemas above.
199
+ export type MetricsDataPoint = yup.InferType<typeof MetricsDataPointSchema>;
200
+ export type MetricsActivitySplit = yup.InferType<typeof MetricsActivitySplitSchema>;
201
+ export type MetricsAuthOverview = yup.InferType<typeof MetricsAuthOverviewSchema>;
202
+ export type MetricsPaymentsOverview = yup.InferType<typeof MetricsPaymentsOverviewSchema>;
203
+ export type MetricsRecentEmail = yup.InferType<typeof MetricsRecentEmailSchema>;
204
+ export type MetricsDailyEmailStatusBreakdown = yup.InferType<typeof MetricsDailyEmailStatusBreakdownSchema>;
205
+ export type MetricsEmailOverview = yup.InferType<typeof MetricsEmailOverviewSchema>;
206
+ export type MetricsDailyRevenuePoint = yup.InferType<typeof MetricsDailyRevenuePointSchema>;
207
+ export type MetricsTopReferrer = yup.InferType<typeof MetricsTopReferrerSchema>;
208
+ export type MetricsTopRegion = yup.InferType<typeof MetricsTopRegionSchema>;
209
+ export type MetricsAnalyticsOverview = yup.InferType<typeof MetricsAnalyticsOverviewSchema>;
210
+ export type MetricsLoginMethodEntry = yup.InferType<typeof MetricsLoginMethodEntrySchema>;
211
+ export type MetricsRecentUser = yup.InferType<typeof MetricsRecentUserSchema>;
212
+ export type MetricsResponse = yup.InferType<typeof MetricsResponseBodySchema>;
213
+ export type MetricsUserCounts = yup.InferType<typeof MetricsUserCountsSchema>;
214
+ export type UserActivityResponse = yup.InferType<typeof UserActivityResponseBodySchema>;