@wizeworks/lens-cloud 0.3.0-alpha.1 → 0.3.0-alpha.3

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 (423) hide show
  1. package/README.md +58 -5
  2. package/dist/alerts/evaluate.d.ts.map +1 -1
  3. package/dist/alerts/evaluate.js +20 -6
  4. package/dist/alerts/evaluate.js.map +1 -1
  5. package/dist/alerts/notify.d.ts +13 -2
  6. package/dist/alerts/notify.d.ts.map +1 -1
  7. package/dist/alerts/notify.js +22 -16
  8. package/dist/alerts/notify.js.map +1 -1
  9. package/dist/app.d.ts +16 -2
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/auth/auth.d.ts +51 -0
  12. package/dist/auth/auth.d.ts.map +1 -0
  13. package/dist/auth/auth.js +63 -0
  14. package/dist/auth/auth.js.map +1 -0
  15. package/dist/auth/bridge.d.ts +7 -0
  16. package/dist/auth/bridge.d.ts.map +1 -0
  17. package/dist/auth/bridge.js +39 -0
  18. package/dist/auth/bridge.js.map +1 -0
  19. package/dist/auth/crypto.d.ts +0 -5
  20. package/dist/auth/crypto.d.ts.map +1 -1
  21. package/dist/auth/crypto.js +3 -20
  22. package/dist/auth/crypto.js.map +1 -1
  23. package/dist/auth/delete-user.d.ts +16 -0
  24. package/dist/auth/delete-user.d.ts.map +1 -0
  25. package/dist/auth/delete-user.js +21 -0
  26. package/dist/auth/delete-user.js.map +1 -0
  27. package/dist/auth/deps.d.ts +27 -0
  28. package/dist/auth/deps.d.ts.map +1 -0
  29. package/dist/auth/deps.js +3 -0
  30. package/dist/auth/deps.js.map +1 -0
  31. package/dist/auth/email-token.d.ts +8 -0
  32. package/dist/auth/email-token.d.ts.map +1 -0
  33. package/dist/auth/email-token.js +15 -0
  34. package/dist/auth/email-token.js.map +1 -0
  35. package/dist/auth/hooks.d.ts +4 -0
  36. package/dist/auth/hooks.d.ts.map +1 -0
  37. package/dist/auth/hooks.js +143 -0
  38. package/dist/auth/hooks.js.map +1 -0
  39. package/dist/auth/join-scope.d.ts +7 -0
  40. package/dist/auth/join-scope.d.ts.map +1 -0
  41. package/dist/auth/join-scope.js +17 -0
  42. package/dist/auth/join-scope.js.map +1 -0
  43. package/dist/auth/options.d.ts +17 -0
  44. package/dist/auth/options.d.ts.map +1 -0
  45. package/dist/auth/options.js +98 -0
  46. package/dist/auth/options.js.map +1 -0
  47. package/dist/auth/password.d.ts +10 -0
  48. package/dist/auth/password.d.ts.map +1 -0
  49. package/dist/auth/password.js +22 -0
  50. package/dist/auth/password.js.map +1 -0
  51. package/dist/auth/plugins.d.ts +4 -0
  52. package/dist/auth/plugins.d.ts.map +1 -0
  53. package/dist/auth/plugins.js +45 -0
  54. package/dist/auth/plugins.js.map +1 -0
  55. package/dist/auth/principal.d.ts +8 -3
  56. package/dist/auth/principal.d.ts.map +1 -1
  57. package/dist/auth/principal.js +13 -8
  58. package/dist/auth/principal.js.map +1 -1
  59. package/dist/auth/roles.d.ts +43 -3
  60. package/dist/auth/roles.d.ts.map +1 -1
  61. package/dist/auth/roles.js +15 -6
  62. package/dist/auth/roles.js.map +1 -1
  63. package/dist/auth/schema-names.d.ts +130 -0
  64. package/dist/auth/schema-names.d.ts.map +1 -0
  65. package/dist/auth/schema-names.js +53 -0
  66. package/dist/auth/schema-names.js.map +1 -0
  67. package/dist/auth/secret.d.ts +12 -0
  68. package/dist/auth/secret.d.ts.map +1 -0
  69. package/dist/auth/secret.js +32 -0
  70. package/dist/auth/secret.js.map +1 -0
  71. package/dist/auth/security-notices.d.ts +34 -0
  72. package/dist/auth/security-notices.d.ts.map +1 -0
  73. package/dist/auth/security-notices.js +81 -0
  74. package/dist/auth/security-notices.js.map +1 -0
  75. package/dist/auth/signup.d.ts +23 -0
  76. package/dist/auth/signup.d.ts.map +1 -0
  77. package/dist/auth/signup.js +61 -0
  78. package/dist/auth/signup.js.map +1 -0
  79. package/dist/auth/sso.d.ts +21 -0
  80. package/dist/auth/sso.d.ts.map +1 -0
  81. package/dist/auth/sso.js +35 -0
  82. package/dist/auth/sso.js.map +1 -0
  83. package/dist/auth/wire.d.ts +16 -0
  84. package/dist/auth/wire.d.ts.map +1 -0
  85. package/dist/auth/wire.js +47 -0
  86. package/dist/auth/wire.js.map +1 -0
  87. package/dist/changes.d.ts +15 -0
  88. package/dist/changes.d.ts.map +1 -0
  89. package/dist/changes.js +45 -0
  90. package/dist/changes.js.map +1 -0
  91. package/dist/cli-args.d.ts +1 -1
  92. package/dist/cli-args.d.ts.map +1 -1
  93. package/dist/cli-args.js +66 -14
  94. package/dist/cli-args.js.map +1 -1
  95. package/dist/cli.js +22 -2
  96. package/dist/cli.js.map +1 -1
  97. package/dist/config.d.ts +30 -4
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +37 -0
  100. package/dist/config.js.map +1 -1
  101. package/dist/copy-cli.d.ts +3 -0
  102. package/dist/copy-cli.d.ts.map +1 -0
  103. package/dist/copy-cli.js +24 -0
  104. package/dist/copy-cli.js.map +1 -0
  105. package/dist/db/db.d.ts +7 -2
  106. package/dist/db/db.d.ts.map +1 -1
  107. package/dist/db/db.js +28 -10
  108. package/dist/db/db.js.map +1 -1
  109. package/dist/db/migrate.d.ts +2 -2
  110. package/dist/db/migrate.d.ts.map +1 -1
  111. package/dist/db/migrate.js +15 -5
  112. package/dist/db/migrate.js.map +1 -1
  113. package/dist/db/schema-auth.d.ts +2 -0
  114. package/dist/db/schema-auth.d.ts.map +1 -0
  115. package/dist/db/schema-auth.js +93 -0
  116. package/dist/db/schema-auth.js.map +1 -0
  117. package/dist/db/schema-mail.d.ts +2 -0
  118. package/dist/db/schema-mail.d.ts.map +1 -0
  119. package/dist/db/schema-mail.js +8 -0
  120. package/dist/db/schema-mail.js.map +1 -0
  121. package/dist/db/schema-notify.d.ts +2 -0
  122. package/dist/db/schema-notify.d.ts.map +1 -0
  123. package/dist/db/schema-notify.js +26 -0
  124. package/dist/db/schema-notify.js.map +1 -0
  125. package/dist/db/schema-search.d.ts +2 -0
  126. package/dist/db/schema-search.d.ts.map +1 -0
  127. package/dist/db/schema-search.js +16 -0
  128. package/dist/db/schema-search.js.map +1 -0
  129. package/dist/db/schema-sso.d.ts +2 -0
  130. package/dist/db/schema-sso.d.ts.map +1 -0
  131. package/dist/db/schema-sso.js +17 -0
  132. package/dist/db/schema-sso.js.map +1 -0
  133. package/dist/db/schema.d.ts.map +1 -1
  134. package/dist/db/schema.js +10 -0
  135. package/dist/db/schema.js.map +1 -1
  136. package/dist/db/trigram.d.ts +4 -0
  137. package/dist/db/trigram.d.ts.map +1 -0
  138. package/dist/db/trigram.js +34 -0
  139. package/dist/db/trigram.js.map +1 -0
  140. package/dist/http/http.d.ts +2 -0
  141. package/dist/http/http.d.ts.map +1 -1
  142. package/dist/http/http.js +7 -3
  143. package/dist/http/http.js.map +1 -1
  144. package/dist/jobs.d.ts +1 -1
  145. package/dist/jobs.d.ts.map +1 -1
  146. package/dist/jobs.js +23 -11
  147. package/dist/jobs.js.map +1 -1
  148. package/dist/mail/blocks.d.ts +14 -0
  149. package/dist/mail/blocks.d.ts.map +1 -0
  150. package/dist/mail/blocks.js +35 -0
  151. package/dist/mail/blocks.js.map +1 -0
  152. package/dist/mail/content.d.ts +68 -0
  153. package/dist/mail/content.d.ts.map +1 -0
  154. package/dist/mail/content.js +6 -0
  155. package/dist/mail/content.js.map +1 -0
  156. package/dist/mail/emails-digest.d.ts +10 -0
  157. package/dist/mail/emails-digest.d.ts.map +1 -0
  158. package/dist/mail/emails-digest.js +55 -0
  159. package/dist/mail/emails-digest.js.map +1 -0
  160. package/dist/mail/emails-health.d.ts +6 -0
  161. package/dist/mail/emails-health.d.ts.map +1 -0
  162. package/dist/mail/emails-health.js +36 -0
  163. package/dist/mail/emails-health.js.map +1 -0
  164. package/dist/mail/emails-security.d.ts +14 -0
  165. package/dist/mail/emails-security.d.ts.map +1 -0
  166. package/dist/mail/emails-security.js +27 -0
  167. package/dist/mail/emails-security.js.map +1 -0
  168. package/dist/mail/emails-team.d.ts +11 -0
  169. package/dist/mail/emails-team.d.ts.map +1 -0
  170. package/dist/mail/emails-team.js +45 -0
  171. package/dist/mail/emails-team.js.map +1 -0
  172. package/dist/mail/emails.d.ts +9 -0
  173. package/dist/mail/emails.d.ts.map +1 -0
  174. package/dist/mail/emails.js +49 -0
  175. package/dist/mail/emails.js.map +1 -0
  176. package/dist/mail/layout.d.ts +6 -0
  177. package/dist/mail/layout.d.ts.map +1 -0
  178. package/dist/mail/layout.js +10 -0
  179. package/dist/mail/layout.js.map +1 -0
  180. package/dist/mail/mailer.d.ts +25 -0
  181. package/dist/mail/mailer.d.ts.map +1 -0
  182. package/dist/mail/mailer.js +50 -0
  183. package/dist/mail/mailer.js.map +1 -0
  184. package/dist/mail/preview.d.ts +6 -0
  185. package/dist/mail/preview.d.ts.map +1 -0
  186. package/dist/mail/preview.js +26 -0
  187. package/dist/mail/preview.js.map +1 -0
  188. package/dist/mail/resend.d.ts +13 -0
  189. package/dist/mail/resend.d.ts.map +1 -0
  190. package/dist/mail/resend.js +34 -0
  191. package/dist/mail/resend.js.map +1 -0
  192. package/dist/mail/samples.d.ts +3 -0
  193. package/dist/mail/samples.d.ts.map +1 -0
  194. package/dist/mail/samples.js +63 -0
  195. package/dist/mail/samples.js.map +1 -0
  196. package/dist/mail/stop-route.d.ts +4 -0
  197. package/dist/mail/stop-route.d.ts.map +1 -0
  198. package/dist/mail/stop-route.js +41 -0
  199. package/dist/mail/stop-route.js.map +1 -0
  200. package/dist/mail/svix.d.ts +8 -0
  201. package/dist/mail/svix.d.ts.map +1 -0
  202. package/dist/mail/svix.js +17 -0
  203. package/dist/mail/svix.js.map +1 -0
  204. package/dist/mail/templates.d.ts +12 -0
  205. package/dist/mail/templates.d.ts.map +1 -0
  206. package/dist/mail/templates.js +18 -0
  207. package/dist/mail/templates.js.map +1 -0
  208. package/dist/mail/text.d.ts +4 -0
  209. package/dist/mail/text.d.ts.map +1 -0
  210. package/dist/mail/text.js +17 -0
  211. package/dist/mail/text.js.map +1 -0
  212. package/dist/mail/theme.d.ts +32 -0
  213. package/dist/mail/theme.d.ts.map +1 -0
  214. package/dist/mail/theme.js +27 -0
  215. package/dist/mail/theme.js.map +1 -0
  216. package/dist/mail/unsubscribe.d.ts +14 -0
  217. package/dist/mail/unsubscribe.d.ts.map +1 -0
  218. package/dist/mail/unsubscribe.js +39 -0
  219. package/dist/mail/unsubscribe.js.map +1 -0
  220. package/dist/mail/webhook.d.ts +5 -0
  221. package/dist/mail/webhook.d.ts.map +1 -0
  222. package/dist/mail/webhook.js +41 -0
  223. package/dist/mail/webhook.js.map +1 -0
  224. package/dist/notify/digest-data.d.ts +32 -0
  225. package/dist/notify/digest-data.d.ts.map +1 -0
  226. package/dist/notify/digest-data.js +31 -0
  227. package/dist/notify/digest-data.js.map +1 -0
  228. package/dist/notify/digest.d.ts +17 -0
  229. package/dist/notify/digest.d.ts.map +1 -0
  230. package/dist/notify/digest.js +76 -0
  231. package/dist/notify/digest.js.map +1 -0
  232. package/dist/notify/health.d.ts +6 -0
  233. package/dist/notify/health.d.ts.map +1 -0
  234. package/dist/notify/health.js +42 -0
  235. package/dist/notify/health.js.map +1 -0
  236. package/dist/notify/team-describe.d.ts +22 -0
  237. package/dist/notify/team-describe.d.ts.map +1 -0
  238. package/dist/notify/team-describe.js +67 -0
  239. package/dist/notify/team-describe.js.map +1 -0
  240. package/dist/notify/team.d.ts +6 -0
  241. package/dist/notify/team.d.ts.map +1 -0
  242. package/dist/notify/team.js +56 -0
  243. package/dist/notify/team.js.map +1 -0
  244. package/dist/repo/alerts.d.ts +6 -2
  245. package/dist/repo/alerts.d.ts.map +1 -1
  246. package/dist/repo/alerts.js.map +1 -1
  247. package/dist/repo/auth-prune.d.ts +4 -0
  248. package/dist/repo/auth-prune.d.ts.map +1 -0
  249. package/dist/repo/auth-prune.js +8 -0
  250. package/dist/repo/auth-prune.js.map +1 -0
  251. package/dist/repo/mail-prefs.d.ts +35 -0
  252. package/dist/repo/mail-prefs.d.ts.map +1 -0
  253. package/dist/repo/mail-prefs.js +34 -0
  254. package/dist/repo/mail-prefs.js.map +1 -0
  255. package/dist/repo/orgs.d.ts +15 -25
  256. package/dist/repo/orgs.d.ts.map +1 -1
  257. package/dist/repo/orgs.js +18 -60
  258. package/dist/repo/orgs.js.map +1 -1
  259. package/dist/repo/services.d.ts +6 -0
  260. package/dist/repo/services.d.ts.map +1 -0
  261. package/dist/repo/services.js +16 -0
  262. package/dist/repo/services.js.map +1 -0
  263. package/dist/repo/suppressions.d.ts +8 -0
  264. package/dist/repo/suppressions.d.ts.map +1 -0
  265. package/dist/repo/suppressions.js +16 -0
  266. package/dist/repo/suppressions.js.map +1 -0
  267. package/dist/repo/trace-join.d.ts +9 -0
  268. package/dist/repo/trace-join.d.ts.map +1 -0
  269. package/dist/repo/trace-join.js +35 -0
  270. package/dist/repo/trace-join.js.map +1 -0
  271. package/dist/repo/trace-read.d.ts +6 -13
  272. package/dist/repo/trace-read.d.ts.map +1 -1
  273. package/dist/repo/trace-read.js +8 -3
  274. package/dist/repo/trace-read.js.map +1 -1
  275. package/dist/repo/trace-write.d.ts +5 -1
  276. package/dist/repo/trace-write.d.ts.map +1 -1
  277. package/dist/repo/trace-write.js +11 -2
  278. package/dist/repo/trace-write.js.map +1 -1
  279. package/dist/repo/users.d.ts +5 -16
  280. package/dist/repo/users.d.ts.map +1 -1
  281. package/dist/repo/users.js +2 -60
  282. package/dist/repo/users.js.map +1 -1
  283. package/dist/routes/alerts.d.ts.map +1 -1
  284. package/dist/routes/alerts.js +23 -6
  285. package/dist/routes/alerts.js.map +1 -1
  286. package/dist/routes/changes.d.ts +4 -0
  287. package/dist/routes/changes.d.ts.map +1 -0
  288. package/dist/routes/changes.js +19 -0
  289. package/dist/routes/changes.js.map +1 -0
  290. package/dist/routes/data.d.ts.map +1 -1
  291. package/dist/routes/data.js +24 -9
  292. package/dist/routes/data.js.map +1 -1
  293. package/dist/routes/index.d.ts.map +1 -1
  294. package/dist/routes/index.js +8 -2
  295. package/dist/routes/index.js.map +1 -1
  296. package/dist/routes/ingest.d.ts.map +1 -1
  297. package/dist/routes/ingest.js +7 -2
  298. package/dist/routes/ingest.js.map +1 -1
  299. package/dist/routes/mcp.d.ts.map +1 -1
  300. package/dist/routes/mcp.js +42 -25
  301. package/dist/routes/mcp.js.map +1 -1
  302. package/dist/routes/me.d.ts +4 -0
  303. package/dist/routes/me.d.ts.map +1 -0
  304. package/dist/routes/me.js +37 -0
  305. package/dist/routes/me.js.map +1 -0
  306. package/dist/routes/metrics.d.ts +2 -2
  307. package/dist/routes/metrics.d.ts.map +1 -1
  308. package/dist/routes/metrics.js +2 -3
  309. package/dist/routes/metrics.js.map +1 -1
  310. package/dist/routes/models.d.ts +2 -0
  311. package/dist/routes/models.d.ts.map +1 -1
  312. package/dist/routes/models.js +10 -5
  313. package/dist/routes/models.js.map +1 -1
  314. package/dist/routes/notify.d.ts +4 -0
  315. package/dist/routes/notify.d.ts.map +1 -0
  316. package/dist/routes/notify.js +55 -0
  317. package/dist/routes/notify.js.map +1 -0
  318. package/dist/routes/orgs.d.ts.map +1 -1
  319. package/dist/routes/orgs.js +34 -53
  320. package/dist/routes/orgs.js.map +1 -1
  321. package/dist/routes/projects.d.ts.map +1 -1
  322. package/dist/routes/projects.js +5 -3
  323. package/dist/routes/projects.js.map +1 -1
  324. package/dist/routes/search.d.ts +4 -0
  325. package/dist/routes/search.d.ts.map +1 -0
  326. package/dist/routes/search.js +33 -0
  327. package/dist/routes/search.js.map +1 -0
  328. package/dist/routes/shares.d.ts.map +1 -1
  329. package/dist/routes/shares.js +8 -5
  330. package/dist/routes/shares.js.map +1 -1
  331. package/dist/server.d.ts +2 -0
  332. package/dist/server.d.ts.map +1 -1
  333. package/dist/server.js +59 -16
  334. package/dist/server.js.map +1 -1
  335. package/dist/settle.d.ts +7 -6
  336. package/dist/settle.d.ts.map +1 -1
  337. package/dist/settle.js +30 -13
  338. package/dist/settle.js.map +1 -1
  339. package/dist/telemetry/cached.d.ts +11 -0
  340. package/dist/telemetry/cached.d.ts.map +1 -0
  341. package/dist/telemetry/cached.js +30 -0
  342. package/dist/telemetry/cached.js.map +1 -0
  343. package/dist/telemetry/ch/admin.d.ts +10 -0
  344. package/dist/telemetry/ch/admin.d.ts.map +1 -0
  345. package/dist/telemetry/ch/admin.js +65 -0
  346. package/dist/telemetry/ch/admin.js.map +1 -0
  347. package/dist/telemetry/ch/http.d.ts +19 -0
  348. package/dist/telemetry/ch/http.d.ts.map +1 -0
  349. package/dist/telemetry/ch/http.js +91 -0
  350. package/dist/telemetry/ch/http.js.map +1 -0
  351. package/dist/telemetry/ch/metrics.d.ts +10 -0
  352. package/dist/telemetry/ch/metrics.d.ts.map +1 -0
  353. package/dist/telemetry/ch/metrics.js +61 -0
  354. package/dist/telemetry/ch/metrics.js.map +1 -0
  355. package/dist/telemetry/ch/queries.d.ts +19 -0
  356. package/dist/telemetry/ch/queries.d.ts.map +1 -0
  357. package/dist/telemetry/ch/queries.js +30 -0
  358. package/dist/telemetry/ch/queries.js.map +1 -0
  359. package/dist/telemetry/ch/queue.d.ts +34 -0
  360. package/dist/telemetry/ch/queue.d.ts.map +1 -0
  361. package/dist/telemetry/ch/queue.js +79 -0
  362. package/dist/telemetry/ch/queue.js.map +1 -0
  363. package/dist/telemetry/ch/read.d.ts +12 -0
  364. package/dist/telemetry/ch/read.d.ts.map +1 -0
  365. package/dist/telemetry/ch/read.js +72 -0
  366. package/dist/telemetry/ch/read.js.map +1 -0
  367. package/dist/telemetry/ch/schema-facts.d.ts +6 -0
  368. package/dist/telemetry/ch/schema-facts.d.ts.map +1 -0
  369. package/dist/telemetry/ch/schema-facts.js +49 -0
  370. package/dist/telemetry/ch/schema-facts.js.map +1 -0
  371. package/dist/telemetry/ch/schema-raw.d.ts +8 -0
  372. package/dist/telemetry/ch/schema-raw.d.ts.map +1 -0
  373. package/dist/telemetry/ch/schema-raw.js +35 -0
  374. package/dist/telemetry/ch/schema-raw.js.map +1 -0
  375. package/dist/telemetry/ch/schema-rollups.d.ts +2 -0
  376. package/dist/telemetry/ch/schema-rollups.d.ts.map +1 -0
  377. package/dist/telemetry/ch/schema-rollups.js +61 -0
  378. package/dist/telemetry/ch/schema-rollups.js.map +1 -0
  379. package/dist/telemetry/ch/schema.d.ts +12 -0
  380. package/dist/telemetry/ch/schema.d.ts.map +1 -0
  381. package/dist/telemetry/ch/schema.js +25 -0
  382. package/dist/telemetry/ch/schema.js.map +1 -0
  383. package/dist/telemetry/ch/settle-rows.d.ts +13 -0
  384. package/dist/telemetry/ch/settle-rows.d.ts.map +1 -0
  385. package/dist/telemetry/ch/settle-rows.js +67 -0
  386. package/dist/telemetry/ch/settle-rows.js.map +1 -0
  387. package/dist/telemetry/ch/settle.d.ts +7 -0
  388. package/dist/telemetry/ch/settle.d.ts.map +1 -0
  389. package/dist/telemetry/ch/settle.js +96 -0
  390. package/dist/telemetry/ch/settle.js.map +1 -0
  391. package/dist/telemetry/ch/store.d.ts +16 -0
  392. package/dist/telemetry/ch/store.d.ts.map +1 -0
  393. package/dist/telemetry/ch/store.js +65 -0
  394. package/dist/telemetry/ch/store.js.map +1 -0
  395. package/dist/telemetry/ch/util.d.ts +20 -0
  396. package/dist/telemetry/ch/util.d.ts.map +1 -0
  397. package/dist/telemetry/ch/util.js +45 -0
  398. package/dist/telemetry/ch/util.js.map +1 -0
  399. package/dist/telemetry/ch/write.d.ts +11 -0
  400. package/dist/telemetry/ch/write.d.ts.map +1 -0
  401. package/dist/telemetry/ch/write.js +59 -0
  402. package/dist/telemetry/ch/write.js.map +1 -0
  403. package/dist/telemetry/copy.d.ts +9 -0
  404. package/dist/telemetry/copy.d.ts.map +1 -0
  405. package/dist/telemetry/copy.js +60 -0
  406. package/dist/telemetry/copy.js.map +1 -0
  407. package/dist/telemetry/index.d.ts +11 -0
  408. package/dist/telemetry/index.d.ts.map +1 -0
  409. package/dist/telemetry/index.js +21 -0
  410. package/dist/telemetry/index.js.map +1 -0
  411. package/dist/telemetry/pg-store.d.ts +5 -0
  412. package/dist/telemetry/pg-store.d.ts.map +1 -0
  413. package/dist/telemetry/pg-store.js +78 -0
  414. package/dist/telemetry/pg-store.js.map +1 -0
  415. package/dist/telemetry/store.d.ts +74 -0
  416. package/dist/telemetry/store.d.ts.map +1 -0
  417. package/dist/telemetry/store.js +2 -0
  418. package/dist/telemetry/store.js.map +1 -0
  419. package/package.json +20 -6
  420. package/dist/routes/auth.d.ts +0 -4
  421. package/dist/routes/auth.d.ts.map +0 -1
  422. package/dist/routes/auth.js +0 -106
  423. package/dist/routes/auth.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ import type { BetterAuthPlugin } from "better-auth";
2
+ import type { AuthDeps } from "./deps.js";
3
+ /** The DNS record that proves a domain: `_wizelens-sso-<providerId>.<domain>` TXT `<token>`. */
4
+ export declare const SSO_TOKEN_PREFIX = "wizelens-sso";
5
+ interface Finder {
6
+ findOne<T>(a: {
7
+ model: string;
8
+ where: {
9
+ field: string;
10
+ value: string;
11
+ }[];
12
+ }): Promise<T | null>;
13
+ }
14
+ /** The SSO provider behind a new account, when Better Auth makes it from a single sign-on. */
15
+ export declare function ssoProviderOf(source: unknown): string | undefined;
16
+ /** True when an organization's provider has a proven domain and the email is at exactly that domain. */
17
+ export declare function ssoTrusts(db: Finder, providerId: string, email: string): Promise<boolean>;
18
+ /** Organization SSO with OIDC or SAML. Sign-in works once the domain is proven in DNS; new people join that organization as members. */
19
+ export declare function ssoPlugin(deps: AuthDeps): BetterAuthPlugin;
20
+ export {};
21
+ //# sourceMappingURL=sso.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso.d.ts","sourceRoot":"","sources":["../../src/auth/sso.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,UAAU,MAAM;IACd,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAChG;AAQD,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED,wGAAwG;AACxG,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK/F;AAED,wIAAwI;AACxI,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAc1D"}
@@ -0,0 +1,35 @@
1
+ import { sso } from "@better-auth/sso";
2
+ import { audit } from "../repo/audit.js";
3
+ import { ssoSchema } from "./schema-names.js";
4
+ /** The DNS record that proves a domain: `_wizelens-sso-<providerId>.<domain>` TXT `<token>`. */
5
+ export const SSO_TOKEN_PREFIX = "wizelens-sso";
6
+ /** The SSO provider behind a new account, when Better Auth makes it from a single sign-on. */
7
+ export function ssoProviderOf(source) {
8
+ const s = source;
9
+ return s?.method?.startsWith("sso-") && typeof s.sso?.providerId === "string" ? s.sso.providerId : undefined;
10
+ }
11
+ /** True when an organization's provider has a proven domain and the email is at exactly that domain. */
12
+ export async function ssoTrusts(db, providerId, email) {
13
+ const p = await db.findOne({ model: "ssoProvider", where: [{ field: "providerId", value: providerId }] });
14
+ const at = email.trim().toLowerCase().split("@")[1] ?? "";
15
+ const domains = (p?.domain ?? "").toLowerCase().split(",").map((d) => d.trim());
16
+ return !!p?.organizationId && p.domainVerified === true && !!at && domains.includes(at);
17
+ }
18
+ /** Organization SSO with OIDC or SAML. Sign-in works once the domain is proven in DNS; new people join that organization as members. */
19
+ export function ssoPlugin(deps) {
20
+ return sso({
21
+ schema: ssoSchema,
22
+ providersLimit: 20,
23
+ domainVerification: { enabled: true, tokenPrefix: SSO_TOKEN_PREFIX },
24
+ organizationProvisioning: {
25
+ defaultRole: "member",
26
+ getRole: async ({ user, provider }) => {
27
+ if (provider.organizationId)
28
+ await audit(deps.db, provider.organizationId, `user:${user.id}`, "member.join", { via: "sso", providerId: provider.providerId }, Date.now());
29
+ return "member";
30
+ },
31
+ },
32
+ saml: { enableInResponseToValidation: true, allowIdpInitiated: false, requireTimestamps: true, clockSkew: 2 * 60_000, algorithms: { onDeprecated: "reject" } },
33
+ });
34
+ }
35
+ //# sourceMappingURL=sso.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso.js","sourceRoot":"","sources":["../../src/auth/sso.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,gGAAgG;AAChG,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAY/C,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,MAAM,CAAC,GAAG,MAAyE,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/G,CAAC;AAED,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,UAAkB,EAAE,KAAa;IAC3E,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACvH,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,wIAAwI;AACxI,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,OAAO,GAAG,CAAC;QACT,MAAM,EAAE,SAAS;QACjB,cAAc,EAAE,EAAE;QAClB,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE;QACpE,wBAAwB,EAAE;YACxB,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACpC,IAAI,QAAQ,CAAC,cAAc;oBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC1K,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF;QACD,IAAI,EAAE,EAAE,4BAA4B,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE;KAC/J,CAAgC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CloudConfig } from "../config.js";
2
+ import type { Db } from "../db/db.js";
3
+ import type { Mailer } from "../mail/mailer.js";
4
+ import { type WizeAuth } from "./auth.js";
5
+ import { type AuthSecret } from "./secret.js";
6
+ export interface AuthWiring {
7
+ /** Build Better Auth for the address the cloud listens on. */
8
+ start(listenUrl: string): WizeAuth;
9
+ /** The first account's link while no account exists, else null. */
10
+ setupLink(): string | null;
11
+ /** The auth secrets, newest first. Unsubscribe links are signed with them too. */
12
+ secrets: AuthSecret[];
13
+ }
14
+ /** Secrets, the setup gate, and the rest Better Auth needs; Better Auth itself starts once the address is known. */
15
+ export declare function wireAuth(db: Db, config: CloudConfig, mailer: Mailer): Promise<AuthWiring>;
16
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/auth/wire.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,aAAa,CAAC;AAE5E,MAAM,WAAW,UAAU;IACzB,8DAA8D;IAC9D,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,mEAAmE;IACnE,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;IAC3B,kFAAkF;IAClF,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAgBD,oHAAoH;AACpH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA2B/F"}
@@ -0,0 +1,47 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { userCount } from "../repo/users.js";
3
+ import { createAuth } from "./auth.js";
4
+ import { clearAuthEnv, resolveSecrets } from "./secret.js";
5
+ /** The one-time setup token: from the config, or new. Gone once the first account exists. */
6
+ async function setupGate(db, configured) {
7
+ let open = (await userCount(db)) === 0;
8
+ const token = configured ?? randomBytes(24).toString("base64url");
9
+ return { token: () => (open ? token : null), done: () => void (open = false) };
10
+ }
11
+ /** The public origin, plus 127.0.0.1 next to localhost (or the reverse) when the cloud runs on its default local address. */
12
+ function originsOf(publicUrl, local) {
13
+ const origin = new URL(publicUrl).origin;
14
+ if (!local)
15
+ return [origin];
16
+ return [origin, origin.includes("//localhost") ? origin.replace("//localhost", "//127.0.0.1") : origin.replace("//127.0.0.1", "//localhost")];
17
+ }
18
+ /** Secrets, the setup gate, and the rest Better Auth needs; Better Auth itself starts once the address is known. */
19
+ export async function wireAuth(db, config, mailer) {
20
+ clearAuthEnv();
21
+ const [secrets, setup] = await Promise.all([resolveSecrets(db, config.authSecret), setupGate(db, config.setupToken)]);
22
+ let base = config.publicUrl;
23
+ return {
24
+ secrets,
25
+ start: (listenUrl) => {
26
+ base = config.publicUrl ?? listenUrl.replace("//127.0.0.1", "//localhost");
27
+ const deps = {
28
+ db,
29
+ publicUrl: new URL(base).origin,
30
+ trustedOrigins: originsOf(base, !config.publicUrl),
31
+ ssoOrigins: config.ssoOrigins,
32
+ secrets,
33
+ signup: config.signup,
34
+ mailer,
35
+ setup,
36
+ checkPwned: config.checkPwnedPasswords ?? db.kind === "postgres",
37
+ retentionDays: config.retentionDays,
38
+ };
39
+ return createAuth(deps);
40
+ },
41
+ setupLink: () => {
42
+ const token = setup.token();
43
+ return token && base ? `${base}/_wizelens/#/setup?token=${token}` : null;
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/auth/wire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAmB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAW5E,6FAA6F;AAC7F,KAAK,UAAU,SAAS,CAAC,EAAM,EAAE,UAA8B;IAC7D,IAAI,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,6HAA6H;AAC7H,SAAS,SAAS,CAAC,SAAiB,EAAE,KAAc;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAChJ,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAM,EAAE,MAAmB,EAAE,MAAc;IACxE,YAAY,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACtH,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAC5B,OAAO;QACL,OAAO;QACP,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE;YACnB,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAa;gBACrB,EAAE;gBACF,SAAS,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM;gBAC/B,cAAc,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;gBAClD,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO;gBACP,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM;gBACN,KAAK;gBACL,UAAU,EAAE,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU;gBAChE,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAC;YACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ type Listener = () => void;
2
+ /** Who listens to which project, and the last time each project was announced. */
3
+ export declare class Changes {
4
+ #private;
5
+ /** Call `fn` when the project gets new data. Returns the function that stops it. */
6
+ subscribe(projectId: string, fn: Listener): () => void;
7
+ /** Call `fn` for every announced project (caches that drop the project's entries). */
8
+ onAny(fn: (projectId: string) => void): void;
9
+ /** The project has new data. Close calls merge into one, sent `GAP_MS` after the last. */
10
+ emit(projectId: string, now?: number): void;
11
+ /** How many dashboards listen to a project. */
12
+ count(projectId: string): number;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAIA,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC;AAE3B,kFAAkF;AAClF,qBAAa,OAAO;;IAMlB,oFAAoF;IACpF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,CAOrD;IAED,sFAAsF;IACtF,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAE3C;IAED,0FAA0F;IAC1F,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI,CAM9C;IAED,+CAA+C;IAC/C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/B;CAOF"}
@@ -0,0 +1,45 @@
1
+ // New data per project, for open dashboards: settling announces each project it wrote, at most every `GAP_MS`.
2
+ const GAP_MS = 2_000;
3
+ /** Who listens to which project, and the last time each project was announced. */
4
+ export class Changes {
5
+ #listeners = new Map();
6
+ #last = new Map();
7
+ #pending = new Set();
8
+ #any = [];
9
+ /** Call `fn` when the project gets new data. Returns the function that stops it. */
10
+ subscribe(projectId, fn) {
11
+ const set = this.#listeners.get(projectId) ?? new Set();
12
+ this.#listeners.set(projectId, set.add(fn));
13
+ return () => {
14
+ set.delete(fn);
15
+ if (!set.size)
16
+ this.#listeners.delete(projectId);
17
+ };
18
+ }
19
+ /** Call `fn` for every announced project (caches that drop the project's entries). */
20
+ onAny(fn) {
21
+ this.#any.push(fn);
22
+ }
23
+ /** The project has new data. Close calls merge into one, sent `GAP_MS` after the last. */
24
+ emit(projectId, now = Date.now()) {
25
+ const wait = (this.#last.get(projectId) ?? 0) + GAP_MS - now;
26
+ if (wait <= 0)
27
+ return this.#send(projectId, now);
28
+ if (this.#pending.has(projectId))
29
+ return;
30
+ this.#pending.add(projectId);
31
+ setTimeout(() => (this.#pending.delete(projectId), this.#send(projectId, Date.now())), wait).unref();
32
+ }
33
+ /** How many dashboards listen to a project. */
34
+ count(projectId) {
35
+ return this.#listeners.get(projectId)?.size ?? 0;
36
+ }
37
+ #send(projectId, now) {
38
+ this.#last.set(projectId, now);
39
+ for (const fn of this.#any)
40
+ fn(projectId);
41
+ for (const fn of this.#listeners.get(projectId) ?? [])
42
+ fn();
43
+ }
44
+ }
45
+ //# sourceMappingURL=changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAE/G,MAAM,MAAM,GAAG,KAAK,CAAC;AAIrB,kFAAkF;AAClF,MAAM,OAAO,OAAO;IACT,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC9C,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7B,IAAI,GAAoC,EAAE,CAAC;IAEpD,oFAAoF;IACpF,SAAS,CAAC,SAAiB,EAAE,EAAY;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,EAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IAED,0FAA0F;IAC1F,IAAI,CAAC,SAAiB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC;QAC7D,IAAI,IAAI,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACvG,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,GAAW;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI;YAAE,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;YAAE,EAAE,EAAE,CAAC;IAC9D,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { CloudOptions } from "./config.js";
2
- export declare const USAGE = "wizelens-cloud: the WizeLens service for many teams.\n\nUsage: wizelens-cloud [options]\n\n --database <url> postgres://..., pglite:<folder>, or memory.\n Default pglite:./.wizelens-cloud. (DATABASE_URL)\n --port <n> Default 5970. (PORT)\n --host <addr> Default 0.0.0.0. (WIZELENS_CLOUD_HOST)\n --public-url <url> The address people use, for links. (WIZELENS_CLOUD_PUBLIC_URL)\n --signup <invite|open> Who can make an account. Default invite. (WIZELENS_CLOUD_SIGNUP)\n --retention-days <n> Default for new organizations. Default 30. (WIZELENS_CLOUD_RETENTION_DAYS)\n --allow-private-webhooks Let alert webhooks reach private addresses. (WIZELENS_CLOUD_ALLOW_PRIVATE_WEBHOOKS=1)\n --help Show this help.\n";
2
+ export declare const USAGE = "wizelens-cloud: the WizeLens service for many teams.\n\nUsage: wizelens-cloud [options]\n\n --database <url> postgres://..., pglite:<folder>, or memory.\n Default pglite:./.wizelens-cloud. (DATABASE_URL)\n --clickhouse <url> Scale mode: telemetry in ClickHouse, (WIZELENS_CLOUD_CLICKHOUSE_URL)\n http://user:pass@host:8123/database.\n --port <n> Default 5970. (PORT)\n --host <addr> Default 0.0.0.0. (WIZELENS_CLOUD_HOST)\n --public-url <url> The address people use, for links. (WIZELENS_CLOUD_PUBLIC_URL)\n --signup <invite|open> Who can make an account. Default invite. (WIZELENS_CLOUD_SIGNUP)\n --retention-days <n> Default for new organizations. Default 30. (WIZELENS_CLOUD_RETENTION_DAYS)\n --ingest-per-minute <n> Ingest calls per key per minute. Default (WIZELENS_CLOUD_INGEST_PER_MINUTE)\n 1200.\n --allow-private-webhooks Let alert webhooks reach private addresses. (WIZELENS_CLOUD_ALLOW_PRIVATE_WEBHOOKS=1)\n --auth-secret <text> Signs sessions, encrypts 2FA secrets. 32+ (WIZELENS_CLOUD_AUTH_SECRET)\n characters; \"2:new,1:old\" rotates.\n Required with Postgres.\n --resend-api-key <key> Outgoing mail through Resend (re_...). (WIZELENS_CLOUD_RESEND_API_KEY)\n Needs --public-url.\n --resend-webhook-secret <s> The Resend webhook's whsec_ secret: (WIZELENS_CLOUD_RESEND_WEBHOOK_SECRET)\n bounces and complaints stop later mail.\n Webhook URL: <public-url>/_wizelens/api/mail/resend\n --smtp-url <url> Or mail over SMTP: smtp://user:pass@host:587 (WIZELENS_CLOUD_SMTP_URL)\n or smtps://...:465. Needs --public-url.\n --mail-from <address> Sender, e.g. \"WizeLens <a@b.com>\". (WIZELENS_CLOUD_MAIL_FROM)\n --mail-reply-to <address> Where replies go, e.g. \"hello@b.com\". (WIZELENS_CLOUD_MAIL_REPLY_TO)\n --trust-proxy Read the client address from the last (WIZELENS_CLOUD_TRUST_PROXY=1)\n X-Forwarded-For entry (your own proxy only).\n --setup-token <text> The first account's token. Default: random, (WIZELENS_CLOUD_SETUP_TOKEN)\n printed at start while no account exists.\n --check-pwned-passwords Refuse breached passwords. Default on with (WIZELENS_CLOUD_CHECK_PWNED=1|0)\n --no-check-pwned-passwords Postgres, off with PGlite.\n --sso-origins <list> Identity provider origins for OIDC single (WIZELENS_CLOUD_SSO_ORIGINS)\n sign-on, comma separated, for example\n https://acme.okta.com. SAML needs none.\n --help Show this help.\n";
3
3
  /** Options from the command line, then from the environment. */
4
4
  export declare function optionsFromArgs(argv: string[], env: NodeJS.ProcessEnv): CloudOptions | "help";
5
5
  //# sourceMappingURL=cli-args.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,KAAK,83BAajB,CAAC;AAKF,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,CAwB7F"}
1
+ {"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,KAAK,65FAsCjB,CAAC;AAmCF,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,CAwB7F"}
package/dist/cli-args.js CHANGED
@@ -5,41 +5,93 @@ Usage: wizelens-cloud [options]
5
5
 
6
6
  --database <url> postgres://..., pglite:<folder>, or memory.
7
7
  Default pglite:./.wizelens-cloud. (DATABASE_URL)
8
+ --clickhouse <url> Scale mode: telemetry in ClickHouse, (WIZELENS_CLOUD_CLICKHOUSE_URL)
9
+ http://user:pass@host:8123/database.
8
10
  --port <n> Default 5970. (PORT)
9
11
  --host <addr> Default 0.0.0.0. (WIZELENS_CLOUD_HOST)
10
12
  --public-url <url> The address people use, for links. (WIZELENS_CLOUD_PUBLIC_URL)
11
13
  --signup <invite|open> Who can make an account. Default invite. (WIZELENS_CLOUD_SIGNUP)
12
14
  --retention-days <n> Default for new organizations. Default 30. (WIZELENS_CLOUD_RETENTION_DAYS)
15
+ --ingest-per-minute <n> Ingest calls per key per minute. Default (WIZELENS_CLOUD_INGEST_PER_MINUTE)
16
+ 1200.
13
17
  --allow-private-webhooks Let alert webhooks reach private addresses. (WIZELENS_CLOUD_ALLOW_PRIVATE_WEBHOOKS=1)
18
+ --auth-secret <text> Signs sessions, encrypts 2FA secrets. 32+ (WIZELENS_CLOUD_AUTH_SECRET)
19
+ characters; "2:new,1:old" rotates.
20
+ Required with Postgres.
21
+ --resend-api-key <key> Outgoing mail through Resend (re_...). (WIZELENS_CLOUD_RESEND_API_KEY)
22
+ Needs --public-url.
23
+ --resend-webhook-secret <s> The Resend webhook's whsec_ secret: (WIZELENS_CLOUD_RESEND_WEBHOOK_SECRET)
24
+ bounces and complaints stop later mail.
25
+ Webhook URL: <public-url>/_wizelens/api/mail/resend
26
+ --smtp-url <url> Or mail over SMTP: smtp://user:pass@host:587 (WIZELENS_CLOUD_SMTP_URL)
27
+ or smtps://...:465. Needs --public-url.
28
+ --mail-from <address> Sender, e.g. "WizeLens <a@b.com>". (WIZELENS_CLOUD_MAIL_FROM)
29
+ --mail-reply-to <address> Where replies go, e.g. "hello@b.com". (WIZELENS_CLOUD_MAIL_REPLY_TO)
30
+ --trust-proxy Read the client address from the last (WIZELENS_CLOUD_TRUST_PROXY=1)
31
+ X-Forwarded-For entry (your own proxy only).
32
+ --setup-token <text> The first account's token. Default: random, (WIZELENS_CLOUD_SETUP_TOKEN)
33
+ printed at start while no account exists.
34
+ --check-pwned-passwords Refuse breached passwords. Default on with (WIZELENS_CLOUD_CHECK_PWNED=1|0)
35
+ --no-check-pwned-passwords Postgres, off with PGlite.
36
+ --sso-origins <list> Identity provider origins for OIDC single (WIZELENS_CLOUD_SSO_ORIGINS)
37
+ sign-on, comma separated, for example
38
+ https://acme.okta.com. SAML needs none.
14
39
  --help Show this help.
15
40
  `;
16
41
  const int = (v) => (v && /^\d+$/.test(v) ? Number(v) : undefined);
17
42
  const signupOf = (v) => (v === "open" || v === "invite" ? v : undefined);
43
+ const text = (...v) => v.find((x) => x !== undefined && x !== "");
44
+ const list = (v) => v?.split(",").map((s) => s.trim()).filter(Boolean);
45
+ const flag = (v) => (v === "1" || v === "true" ? true : v === "0" || v === "false" ? false : undefined);
46
+ const OPTIONS = {
47
+ database: { type: "string" },
48
+ clickhouse: { type: "string" },
49
+ port: { type: "string" },
50
+ host: { type: "string" },
51
+ "public-url": { type: "string" },
52
+ signup: { type: "string" },
53
+ "retention-days": { type: "string" },
54
+ "ingest-per-minute": { type: "string" },
55
+ "allow-private-webhooks": { type: "boolean" },
56
+ "auth-secret": { type: "string" },
57
+ "smtp-url": { type: "string" },
58
+ "resend-api-key": { type: "string" },
59
+ "resend-webhook-secret": { type: "string" },
60
+ "mail-from": { type: "string" },
61
+ "mail-reply-to": { type: "string" },
62
+ "trust-proxy": { type: "boolean" },
63
+ "setup-token": { type: "string" },
64
+ "check-pwned-passwords": { type: "boolean" },
65
+ "no-check-pwned-passwords": { type: "boolean" },
66
+ "sso-origins": { type: "string" },
67
+ help: { type: "boolean", short: "h" },
68
+ };
69
+ const pwnedOf = (a, env) => a["no-check-pwned-passwords"] ? false : (a["check-pwned-passwords"] ?? flag(env.WIZELENS_CLOUD_CHECK_PWNED));
18
70
  /** Options from the command line, then from the environment. */
19
71
  export function optionsFromArgs(argv, env) {
20
- const { values: a } = parseArgs({
21
- args: argv,
22
- options: {
23
- database: { type: "string" },
24
- port: { type: "string" },
25
- host: { type: "string" },
26
- "public-url": { type: "string" },
27
- signup: { type: "string" },
28
- "retention-days": { type: "string" },
29
- "allow-private-webhooks": { type: "boolean" },
30
- help: { type: "boolean", short: "h" },
31
- },
32
- });
72
+ const { values: a } = parseArgs({ args: argv, options: OPTIONS });
33
73
  if (a.help)
34
74
  return "help";
35
75
  return {
36
76
  database: a.database ?? env.DATABASE_URL,
77
+ clickhouseUrl: text(a.clickhouse, env.WIZELENS_CLOUD_CLICKHOUSE_URL),
37
78
  port: int(a.port ?? env.PORT),
38
79
  host: a.host ?? env.WIZELENS_CLOUD_HOST,
39
- publicUrl: a["public-url"] ?? env.WIZELENS_CLOUD_PUBLIC_URL,
80
+ publicUrl: text(a["public-url"], env.WIZELENS_CLOUD_PUBLIC_URL),
40
81
  signup: signupOf(a.signup ?? env.WIZELENS_CLOUD_SIGNUP),
41
82
  retentionDays: int(a["retention-days"] ?? env.WIZELENS_CLOUD_RETENTION_DAYS),
83
+ ingestPerMinute: int(a["ingest-per-minute"] ?? env.WIZELENS_CLOUD_INGEST_PER_MINUTE),
42
84
  allowPrivateWebhooks: a["allow-private-webhooks"] ?? env.WIZELENS_CLOUD_ALLOW_PRIVATE_WEBHOOKS === "1",
85
+ authSecret: text(a["auth-secret"], env.WIZELENS_CLOUD_AUTH_SECRET),
86
+ smtpUrl: text(a["smtp-url"], env.WIZELENS_CLOUD_SMTP_URL),
87
+ resendApiKey: text(a["resend-api-key"], env.WIZELENS_CLOUD_RESEND_API_KEY),
88
+ resendWebhookSecret: text(a["resend-webhook-secret"], env.WIZELENS_CLOUD_RESEND_WEBHOOK_SECRET),
89
+ mailFrom: text(a["mail-from"], env.WIZELENS_CLOUD_MAIL_FROM),
90
+ mailReplyTo: text(a["mail-reply-to"], env.WIZELENS_CLOUD_MAIL_REPLY_TO),
91
+ trustProxy: a["trust-proxy"] ?? env.WIZELENS_CLOUD_TRUST_PROXY === "1",
92
+ setupToken: text(a["setup-token"], env.WIZELENS_CLOUD_SETUP_TOKEN),
93
+ checkPwnedPasswords: pwnedOf(a, env),
94
+ ssoOrigins: list(text(a["sso-origins"], env.WIZELENS_CLOUD_SSO_ORIGINS)),
43
95
  };
44
96
  }
45
97
  //# sourceMappingURL=cli-args.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;CAapB,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACtF,MAAM,QAAQ,GAAG,CAAC,CAAqB,EAA0B,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAErH,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,IAAc,EAAE,GAAsB;IACpE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;QAC9B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACpC,wBAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC7C,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;KACF,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IAC1B,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,YAAY;QACxC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,mBAAmB;QACvC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,yBAAyB;QAC3D,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,qBAAqB,CAAC;QACvD,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC;QAC5E,oBAAoB,EAAE,CAAC,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,qCAAqC,KAAK,GAAG;KACvG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,7 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { optionsFromArgs, USAGE } from "./cli-args.js";
3
3
  import { CLOUD_VERSION, createCloud } from "./server.js";
4
+ import { copyMain } from "./copy-cli.js";
5
+ function notes(cloud) {
6
+ const { app } = cloud;
7
+ const out = [];
8
+ if (app.db.kind === "pglite")
9
+ out.push(" Note: PGlite is for trials and tests. Use Postgres for real teams.");
10
+ if (!app.mailer.live)
11
+ out.push(" Note: no --resend-api-key or --smtp-url, so emails are written to this log and email addresses are not confirmed.");
12
+ if (app.mailer.via === "resend" && !app.config.resendWebhookSecret)
13
+ out.push(" Note: no --resend-webhook-secret, so bounced addresses keep getting mail.");
14
+ if (app.db.kind === "postgres" && !app.config.publicUrl?.startsWith("https://"))
15
+ out.push(" Note: set --public-url to an https:// address, so sign-in cookies are Secure.");
16
+ const setup = cloud.setupLink();
17
+ if (setup)
18
+ out.push("", " No account yet. Open this link to make the first one (it works once):", ` ${setup}`);
19
+ return out;
20
+ }
4
21
  async function main() {
22
+ if (process.argv[2] === "copy-telemetry")
23
+ return copyMain(process.argv.slice(3));
5
24
  const options = optionsFromArgs(process.argv.slice(2), process.env);
6
25
  if (options === "help")
7
26
  return void process.stdout.write(USAGE);
@@ -14,9 +33,10 @@ async function main() {
14
33
  ` Add-ons WIZELENS_HUB=${url} WIZELENS_HUB_TOKEN=<ingest key>`,
15
34
  ` OTLP/HTTP OTEL_EXPORTER_OTLP_ENDPOINT=${url} (header Authorization=Bearer <ingest key>)`,
16
35
  ` Database ${db}`,
36
+ ` Telemetry ${cloud.app.telemetry.kind === "clickhouse" ? "ClickHouse" : "the database above"}`,
37
+ ` Mail ${{ resend: "Resend", smtp: "SMTP", test: "test sender", log: "log only" }[cloud.app.mailer.via]}`,
38
+ ...notes(cloud),
17
39
  ].join("\n"));
18
- if (cloud.app.db.kind === "pglite")
19
- console.info(" Note: PGlite is for trials and tests. Use Postgres for real teams.");
20
40
  const stop = () => void cloud.close().then(() => process.exit(0));
21
41
  process.once("SIGINT", stop);
22
42
  process.once("SIGTERM", stop);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;IACnG,OAAO,CAAC,IAAI,CACV;QACE,kBAAkB,aAAa,EAAE;QACjC,iBAAiB,GAAG,aAAa;QACjC,8BAA8B,GAAG,mCAAmC;QACpE,6CAA6C,GAAG,8CAA8C;QAC9F,iBAAiB,EAAE,EAAE;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACzH,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,7 +1,10 @@
1
+ import type { Mail } from "./mail/mailer.js";
1
2
  export type SignupMode = "open" | "invite";
2
3
  export interface CloudOptions {
3
4
  /** "postgres://...", "pglite:<folder>", or "memory". Default "pglite:./.wizelens-cloud". */
4
5
  database?: string;
6
+ /** Scale mode: telemetry in ClickHouse, `http(s)://user:password@host:8123/database`. Accounts stay in `database`. */
7
+ clickhouseUrl?: string;
5
8
  /** Default 5970. 0 picks a free port. */
6
9
  port?: number;
7
10
  /** Default "0.0.0.0". */
@@ -18,16 +21,39 @@ export interface CloudOptions {
18
21
  alertIntervalMs?: number;
19
22
  /** Let alert webhooks call private and local addresses, and plain http. For self-hosting on a private network. Default false. */
20
23
  allowPrivateWebhooks?: boolean;
24
+ /** Outgoing mail: "smtp://user:pass@host:587" (STARTTLS) or "smtps://user:pass@host:465". Without it, mail is written to the log. */
25
+ smtpUrl?: string;
26
+ /** Outgoing mail through the Resend API (a `re_` key). Used in place of `smtpUrl`. */
27
+ resendApiKey?: string;
28
+ /** The `whsec_` signing secret of the Resend webhook, so bounces and spam complaints reach the suppression list. */
29
+ resendWebhookSecret?: string;
30
+ /** The sender of every email, for example "WizeLens <alerts@example.com>". */
31
+ mailFrom?: string;
32
+ /** Where replies go, for example "hello@example.com", when the sender has no inbox. Default: none (replies go to the sender). */
33
+ mailReplyTo?: string;
34
+ /** Take the client address from X-Forwarded-For (behind a proxy you run). Default false. */
35
+ trustProxy?: boolean;
36
+ /** Signs sessions and encrypts 2FA secrets: 32+ random characters, or "2:new,1:old" to rotate. Required with Postgres. */
37
+ authSecret?: string;
38
+ /** The one-time token the first account needs. Default: a new random one, printed at start while no account exists. */
39
+ setupToken?: string;
40
+ /** Refuse passwords found in known breaches (sends a 5-character hash prefix to api.pwnedpasswords.com). Default: on with Postgres. */
41
+ checkPwnedPasswords?: boolean;
42
+ /** Identity provider origins for OIDC single sign-on, for example https://acme.okta.com. The cloud fetches OIDC settings only from these. */
43
+ ssoOrigins?: string[];
21
44
  redactKeys?: string[];
22
45
  uiDir?: string;
23
- /** For tests: the clock and the HTTP client alerts use. */
46
+ /** For tests: the clock, the HTTP client alerts use, and a mail sender in place of SMTP. */
24
47
  now?: () => number;
25
48
  fetch?: typeof fetch;
49
+ sendMail?: (mail: Mail) => Promise<void>;
50
+ /** For tests: false keeps background jobs off, so a test runs them itself. Default true. */
51
+ jobs?: boolean;
26
52
  }
27
- export type CloudConfig = Required<Omit<CloudOptions, "uiDir" | "publicUrl">> & {
28
- uiDir: string | undefined;
29
- publicUrl: string | undefined;
53
+ type Optional = "uiDir" | "clickhouseUrl" | "publicUrl" | "smtpUrl" | "resendApiKey" | "resendWebhookSecret" | "mailReplyTo" | "sendMail" | "authSecret" | "setupToken" | "checkPwnedPasswords";
54
+ export type CloudConfig = Required<Omit<CloudOptions, Optional>> & Pick<CloudOptions, Optional> & {
30
55
  secureCookies: boolean;
31
56
  };
32
57
  export declare function resolveConfig(o?: CloudOptions): CloudConfig;
58
+ export {};
33
59
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iIAAiI;IACjI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC;AAErK,wBAAgB,aAAa,CAAC,CAAC,GAAE,YAAiB,GAAG,WAAW,CAiB/D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sHAAsH;IACtH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iIAAiI;IACjI,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qIAAqI;IACrI,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oHAAoH;IACpH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iIAAiI;IACjI,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0HAA0H;IAC1H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uHAAuH;IACvH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uIAAuI;IACvI,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6IAA6I;IAC7I,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,4FAA4F;IAC5F,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,KAAK,QAAQ,GAAG,OAAO,GAAG,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,qBAAqB,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,qBAAqB,CAAC;AAChM,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,CAAC;AAqB7H,wBAAgB,aAAa,CAAC,CAAC,GAAE,YAAiB,GAAG,WAAW,CA+B/D"}
package/dist/config.js CHANGED
@@ -1,7 +1,32 @@
1
1
  import { DEFAULT_REDACT_KEYS } from "@wizeworks/lens-core";
2
+ /** Mail links must use the public address: a link built from the request's Host header could point anywhere. */
3
+ function checkMail(o) {
4
+ if ((o.smtpUrl || o.resendApiKey) && !o.publicUrl)
5
+ throw new Error("Sending mail needs --public-url, so links in emails point at this cloud.");
6
+ if (o.smtpUrl && o.resendApiKey)
7
+ throw new Error("Pick one mail service: --resend-api-key or --smtp-url, not both.");
8
+ if (o.smtpUrl && !/^smtps?:\/\//.test(o.smtpUrl))
9
+ throw new Error("--smtp-url must start with smtp:// or smtps://.");
10
+ if (o.resendApiKey && !o.resendApiKey.startsWith("re_"))
11
+ throw new Error("--resend-api-key must be a Resend API key (it starts with re_).");
12
+ if (o.resendWebhookSecret && !o.resendWebhookSecret.startsWith("whsec_"))
13
+ throw new Error("--resend-webhook-secret must start with whsec_.");
14
+ }
15
+ /** Each SSO origin as a bare origin: https, or http on this machine only. */
16
+ function ssoOriginsOf(list) {
17
+ return list.map((raw) => {
18
+ const url = URL.canParse(raw) ? new URL(raw) : null;
19
+ const local = url?.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
20
+ if (!url || (url.protocol !== "https:" && !local) || raw.includes("*"))
21
+ throw new Error(`--sso-origins: "${raw}" must be an https:// origin, like https://acme.okta.com.`);
22
+ return url.origin;
23
+ });
24
+ }
2
25
  export function resolveConfig(o = {}) {
26
+ checkMail(o);
3
27
  return {
4
28
  database: o.database ?? "pglite:./.wizelens-cloud",
29
+ clickhouseUrl: o.clickhouseUrl,
5
30
  port: o.port ?? 5970,
6
31
  host: o.host ?? "0.0.0.0",
7
32
  publicUrl: o.publicUrl?.replace(/\/+$/, ""),
@@ -10,6 +35,18 @@ export function resolveConfig(o = {}) {
10
35
  ingestPerMinute: o.ingestPerMinute ?? 1200,
11
36
  alertIntervalMs: o.alertIntervalMs ?? 60_000,
12
37
  allowPrivateWebhooks: o.allowPrivateWebhooks ?? false,
38
+ smtpUrl: o.smtpUrl,
39
+ resendApiKey: o.resendApiKey,
40
+ resendWebhookSecret: o.resendWebhookSecret,
41
+ mailFrom: o.mailFrom ?? `WizeLens <no-reply@${o.publicUrl ? new URL(o.publicUrl).hostname : "localhost"}>`,
42
+ mailReplyTo: o.mailReplyTo,
43
+ trustProxy: o.trustProxy ?? false,
44
+ sendMail: o.sendMail,
45
+ jobs: o.jobs ?? true,
46
+ authSecret: o.authSecret,
47
+ setupToken: o.setupToken,
48
+ checkPwnedPasswords: o.checkPwnedPasswords,
49
+ ssoOrigins: ssoOriginsOf(o.ssoOrigins ?? []),
13
50
  redactKeys: o.redactKeys ?? [...DEFAULT_REDACT_KEYS],
14
51
  uiDir: o.uiDir,
15
52
  now: o.now ?? Date.now,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAgC3D,MAAM,UAAU,aAAa,CAAC,CAAC,GAAiB,EAAE;IAChD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,0BAA0B;QAClD,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS;QACzB,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ;QAC5B,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;QACpC,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,MAAM;QAC5C,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,IAAI,KAAK;QACrD,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,mBAAmB,CAAC;QACpD,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QACtB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK;QACvB,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC;KACrD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** `wizelens-cloud copy-telemetry`: move existing telemetry into ClickHouse, once. `--force`: also into projects ClickHouse has, after the switch. */
2
+ export declare function copyMain(argv: string[]): Promise<void>;
3
+ //# sourceMappingURL=copy-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-cli.d.ts","sourceRoot":"","sources":["../src/copy-cli.ts"],"names":[],"mappings":"AASA,sJAAsJ;AACtJ,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5D"}
@@ -0,0 +1,24 @@
1
+ import { optionsFromArgs } from "./cli-args.js";
2
+ import { resolveConfig } from "./config.js";
3
+ import { openDb } from "./db/db.js";
4
+ import { migrate } from "./db/migrate.js";
5
+ import { copyTelemetry } from "./telemetry/copy.js";
6
+ import { openTelemetry } from "./telemetry/index.js";
7
+ const USAGE = "Usage: wizelens-cloud copy-telemetry --database <postgres url> --clickhouse <url> [--force]";
8
+ /** `wizelens-cloud copy-telemetry`: move existing telemetry into ClickHouse, once. `--force`: also into projects ClickHouse has, after the switch. */
9
+ export async function copyMain(argv) {
10
+ const force = argv.includes("--force");
11
+ const options = optionsFromArgs(argv.filter((a) => a !== "--force"), process.env);
12
+ if (options === "help" || !options.clickhouseUrl)
13
+ throw new Error(USAGE);
14
+ const config = resolveConfig({ ...options, jobs: false });
15
+ const db = await openDb(config.database);
16
+ await migrate(db);
17
+ const to = await openTelemetry(config, db);
18
+ console.info("Copying telemetry from the database into ClickHouse...");
19
+ const done = await copyTelemetry(db, to, config.now(), (line) => console.info(line), force);
20
+ console.info(`Done: ${done.traces} traces and ${done.points} metric points. Start the cloud with --clickhouse; it settles them.`);
21
+ await to.close();
22
+ await db.close();
23
+ }
24
+ //# sourceMappingURL=copy-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-cli.js","sourceRoot":"","sources":["../src/copy-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,KAAK,GAAG,6FAA6F,CAAC;AAE5G,sJAAsJ;AACtJ,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAClF,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;IAClB,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5F,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,MAAM,qEAAqE,CAAC,CAAC;IAClI,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACjB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
package/dist/db/db.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { BetterAuthOptions } from "better-auth";
1
2
  /** Something that runs SQL: the database, or one transaction. Postgres syntax, `$1` parameters. */
2
3
  export interface Queryable {
3
4
  query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
@@ -5,14 +6,18 @@ export interface Queryable {
5
6
  export interface Db extends Queryable {
6
7
  /** Run `fn` in one transaction. It rolls back when `fn` throws. */
7
8
  tx<T>(fn: (q: Queryable) => Promise<T>): Promise<T>;
8
- /** Run several statements without parameters (migrations). */
9
+ /** Run `fn` on one connection, outside a transaction (session settings, CREATE INDEX CONCURRENTLY). */
10
+ session<T>(fn: (q: Queryable) => Promise<T>): Promise<T>;
11
+ /** Run several statements without parameters (migrations, before anything else uses the database). */
9
12
  exec(sql: string): Promise<void>;
10
13
  close(): Promise<void>;
11
14
  readonly kind: "postgres" | "pglite";
15
+ /** The same database, for Better Auth. */
16
+ readonly authDatabase: NonNullable<BetterAuthOptions["database"]>;
12
17
  }
13
18
  /** A managed Postgres, from a `postgres://` URL. */
14
19
  export declare function openPostgres(url: string): Promise<Db>;
15
- /** Postgres in this process (PGlite): a folder on disk, or memory when `dir` is undefined. For tests and trials. */
20
+ /** PGlite (a folder, or memory), for tests and trials. All queries share one Kysely queue with Better Auth: PGlite has one connection. */
16
21
  export declare function openPglite(dir?: string): Promise<Db>;
17
22
  /** "postgres://..." opens Postgres; "pglite:<folder>" or "memory" opens PGlite. */
18
23
  export declare function openDb(url: string): Promise<Db>;