@wizeworks/lens-cloud 0.3.0-alpha.2 → 0.3.0-alpha.4

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 (597) hide show
  1. package/README.md +4 -0
  2. package/dist/alerts/evaluate.d.ts +6 -5
  3. package/dist/alerts/evaluate.d.ts.map +1 -1
  4. package/dist/alerts/evaluate.js +60 -28
  5. package/dist/alerts/evaluate.js.map +1 -1
  6. package/dist/alerts/problem-link.d.ts +12 -0
  7. package/dist/alerts/problem-link.d.ts.map +1 -0
  8. package/dist/alerts/problem-link.js +31 -0
  9. package/dist/alerts/problem-link.js.map +1 -0
  10. package/dist/app.d.ts +15 -0
  11. package/dist/app.d.ts.map +1 -1
  12. package/dist/auth/auth.d.ts +8 -2
  13. package/dist/auth/auth.d.ts.map +1 -1
  14. package/dist/auth/auth.js +25 -2
  15. package/dist/auth/auth.js.map +1 -1
  16. package/dist/auth/billing-hooks.d.ts +9 -0
  17. package/dist/auth/billing-hooks.d.ts.map +1 -0
  18. package/dist/auth/billing-hooks.js +49 -0
  19. package/dist/auth/billing-hooks.js.map +1 -0
  20. package/dist/auth/bridge.js +2 -2
  21. package/dist/auth/bridge.js.map +1 -1
  22. package/dist/auth/crypto.d.ts +2 -0
  23. package/dist/auth/crypto.d.ts.map +1 -1
  24. package/dist/auth/crypto.js +2 -2
  25. package/dist/auth/crypto.js.map +1 -1
  26. package/dist/auth/deps.d.ts +7 -0
  27. package/dist/auth/deps.d.ts.map +1 -1
  28. package/dist/auth/deps.js.map +1 -1
  29. package/dist/auth/hooks.d.ts.map +1 -1
  30. package/dist/auth/hooks.js +8 -1
  31. package/dist/auth/hooks.js.map +1 -1
  32. package/dist/auth/join-scope.d.ts +7 -0
  33. package/dist/auth/join-scope.d.ts.map +1 -0
  34. package/dist/auth/join-scope.js +21 -0
  35. package/dist/auth/join-scope.js.map +1 -0
  36. package/dist/auth/oauth-access.d.ts +8 -0
  37. package/dist/auth/oauth-access.d.ts.map +1 -0
  38. package/dist/auth/oauth-access.js +31 -0
  39. package/dist/auth/oauth-access.js.map +1 -0
  40. package/dist/auth/oauth-grant.d.ts +5 -0
  41. package/dist/auth/oauth-grant.d.ts.map +1 -0
  42. package/dist/auth/oauth-grant.js +79 -0
  43. package/dist/auth/oauth-grant.js.map +1 -0
  44. package/dist/auth/oauth-names.d.ts +104 -0
  45. package/dist/auth/oauth-names.d.ts.map +1 -0
  46. package/dist/auth/oauth-names.js +72 -0
  47. package/dist/auth/oauth-names.js.map +1 -0
  48. package/dist/auth/oauth.d.ts +17 -0
  49. package/dist/auth/oauth.d.ts.map +1 -0
  50. package/dist/auth/oauth.js +47 -0
  51. package/dist/auth/oauth.js.map +1 -0
  52. package/dist/auth/options.d.ts.map +1 -1
  53. package/dist/auth/options.js +2 -0
  54. package/dist/auth/options.js.map +1 -1
  55. package/dist/auth/plugins.d.ts.map +1 -1
  56. package/dist/auth/plugins.js +15 -1
  57. package/dist/auth/plugins.js.map +1 -1
  58. package/dist/auth/principal.d.ts +10 -1
  59. package/dist/auth/principal.d.ts.map +1 -1
  60. package/dist/auth/principal.js +8 -7
  61. package/dist/auth/principal.js.map +1 -1
  62. package/dist/auth/roles.d.ts +5 -2
  63. package/dist/auth/roles.d.ts.map +1 -1
  64. package/dist/auth/roles.js +1 -0
  65. package/dist/auth/roles.js.map +1 -1
  66. package/dist/auth/schema-names.d.ts +33 -0
  67. package/dist/auth/schema-names.d.ts.map +1 -1
  68. package/dist/auth/schema-names.js +23 -0
  69. package/dist/auth/schema-names.js.map +1 -1
  70. package/dist/auth/scim.d.ts +6 -0
  71. package/dist/auth/scim.d.ts.map +1 -0
  72. package/dist/auth/scim.js +56 -0
  73. package/dist/auth/scim.js.map +1 -0
  74. package/dist/auth/signup.d.ts.map +1 -1
  75. package/dist/auth/signup.js +5 -2
  76. package/dist/auth/signup.js.map +1 -1
  77. package/dist/auth/wire.d.ts +2 -1
  78. package/dist/auth/wire.d.ts.map +1 -1
  79. package/dist/auth/wire.js +4 -1
  80. package/dist/auth/wire.js.map +1 -1
  81. package/dist/billing/cli.d.ts +6 -0
  82. package/dist/billing/cli.d.ts.map +1 -0
  83. package/dist/billing/cli.js +54 -0
  84. package/dist/billing/cli.js.map +1 -0
  85. package/dist/billing/gate.d.ts +13 -0
  86. package/dist/billing/gate.d.ts.map +1 -0
  87. package/dist/billing/gate.js +27 -0
  88. package/dist/billing/gate.js.map +1 -0
  89. package/dist/billing/limits.d.ts +29 -0
  90. package/dist/billing/limits.d.ts.map +1 -0
  91. package/dist/billing/limits.js +69 -0
  92. package/dist/billing/limits.js.map +1 -0
  93. package/dist/billing/notices.d.ts +4 -0
  94. package/dist/billing/notices.d.ts.map +1 -0
  95. package/dist/billing/notices.js +40 -0
  96. package/dist/billing/notices.js.map +1 -0
  97. package/dist/billing/options.d.ts +37 -0
  98. package/dist/billing/options.d.ts.map +1 -0
  99. package/dist/billing/options.js +33 -0
  100. package/dist/billing/options.js.map +1 -0
  101. package/dist/billing/plans.d.ts +50 -0
  102. package/dist/billing/plans.d.ts.map +1 -0
  103. package/dist/billing/plans.js +47 -0
  104. package/dist/billing/plans.js.map +1 -0
  105. package/dist/billing/report.d.ts +26 -0
  106. package/dist/billing/report.d.ts.map +1 -0
  107. package/dist/billing/report.js +53 -0
  108. package/dist/billing/report.js.map +1 -0
  109. package/dist/billing/service.d.ts +20 -0
  110. package/dist/billing/service.d.ts.map +1 -0
  111. package/dist/billing/service.js +29 -0
  112. package/dist/billing/service.js.map +1 -0
  113. package/dist/billing/stripe-plugin.d.ts +14 -0
  114. package/dist/billing/stripe-plugin.d.ts.map +1 -0
  115. package/dist/billing/stripe-plugin.js +39 -0
  116. package/dist/billing/stripe-plugin.js.map +1 -0
  117. package/dist/billing/stripe-setup.d.ts +15 -0
  118. package/dist/billing/stripe-setup.d.ts.map +1 -0
  119. package/dist/billing/stripe-setup.js +73 -0
  120. package/dist/billing/stripe-setup.js.map +1 -0
  121. package/dist/billing/summary.d.ts +59 -0
  122. package/dist/billing/summary.d.ts.map +1 -0
  123. package/dist/billing/summary.js +50 -0
  124. package/dist/billing/summary.js.map +1 -0
  125. package/dist/billing/sync.d.ts +5 -0
  126. package/dist/billing/sync.d.ts.map +1 -0
  127. package/dist/billing/sync.js +35 -0
  128. package/dist/billing/sync.js.map +1 -0
  129. package/dist/billing/usage-sub.d.ts +17 -0
  130. package/dist/billing/usage-sub.d.ts.map +1 -0
  131. package/dist/billing/usage-sub.js +47 -0
  132. package/dist/billing/usage-sub.js.map +1 -0
  133. package/dist/billing/usage.d.ts +28 -0
  134. package/dist/billing/usage.d.ts.map +1 -0
  135. package/dist/billing/usage.js +80 -0
  136. package/dist/billing/usage.js.map +1 -0
  137. package/dist/billing/webhook.d.ts +6 -0
  138. package/dist/billing/webhook.d.ts.map +1 -0
  139. package/dist/billing/webhook.js +41 -0
  140. package/dist/billing/webhook.js.map +1 -0
  141. package/dist/changes.d.ts +15 -0
  142. package/dist/changes.d.ts.map +1 -0
  143. package/dist/changes.js +45 -0
  144. package/dist/changes.js.map +1 -0
  145. package/dist/cli-args.d.ts +1 -1
  146. package/dist/cli-args.d.ts.map +1 -1
  147. package/dist/cli-args.js +44 -2
  148. package/dist/cli-args.js.map +1 -1
  149. package/dist/cli.js +10 -0
  150. package/dist/cli.js.map +1 -1
  151. package/dist/config.d.ts +19 -3
  152. package/dist/config.d.ts.map +1 -1
  153. package/dist/config.js +21 -1
  154. package/dist/config.js.map +1 -1
  155. package/dist/copy-cli.d.ts +3 -0
  156. package/dist/copy-cli.d.ts.map +1 -0
  157. package/dist/copy-cli.js +24 -0
  158. package/dist/copy-cli.js.map +1 -0
  159. package/dist/db/db.d.ts +2 -0
  160. package/dist/db/db.d.ts.map +1 -1
  161. package/dist/db/db.js +15 -4
  162. package/dist/db/db.js.map +1 -1
  163. package/dist/db/schema-alerts.d.ts +2 -0
  164. package/dist/db/schema-alerts.d.ts.map +1 -0
  165. package/dist/db/schema-alerts.js +15 -0
  166. package/dist/db/schema-alerts.js.map +1 -0
  167. package/dist/db/schema-billing.d.ts +2 -0
  168. package/dist/db/schema-billing.d.ts.map +1 -0
  169. package/dist/db/schema-billing.js +38 -0
  170. package/dist/db/schema-billing.js.map +1 -0
  171. package/dist/db/schema-issues.d.ts +2 -0
  172. package/dist/db/schema-issues.d.ts.map +1 -0
  173. package/dist/db/schema-issues.js +9 -0
  174. package/dist/db/schema-issues.js.map +1 -0
  175. package/dist/db/schema-logs.d.ts +2 -0
  176. package/dist/db/schema-logs.d.ts.map +1 -0
  177. package/dist/db/schema-logs.js +13 -0
  178. package/dist/db/schema-logs.js.map +1 -0
  179. package/dist/db/schema-oauth.d.ts +2 -0
  180. package/dist/db/schema-oauth.d.ts.map +1 -0
  181. package/dist/db/schema-oauth.js +69 -0
  182. package/dist/db/schema-oauth.js.map +1 -0
  183. package/dist/db/schema-saved-move.d.ts +2 -0
  184. package/dist/db/schema-saved-move.d.ts.map +1 -0
  185. package/dist/db/schema-saved-move.js +13 -0
  186. package/dist/db/schema-saved-move.js.map +1 -0
  187. package/dist/db/schema-saved.d.ts +2 -0
  188. package/dist/db/schema-saved.d.ts.map +1 -0
  189. package/dist/db/schema-saved.js +13 -0
  190. package/dist/db/schema-saved.js.map +1 -0
  191. package/dist/db/schema-scim.d.ts +2 -0
  192. package/dist/db/schema-scim.d.ts.map +1 -0
  193. package/dist/db/schema-scim.js +28 -0
  194. package/dist/db/schema-scim.js.map +1 -0
  195. package/dist/db/schema-search.d.ts +2 -0
  196. package/dist/db/schema-search.d.ts.map +1 -0
  197. package/dist/db/schema-search.js +16 -0
  198. package/dist/db/schema-search.js.map +1 -0
  199. package/dist/db/schema-slos.d.ts +2 -0
  200. package/dist/db/schema-slos.d.ts.map +1 -0
  201. package/dist/db/schema-slos.js +12 -0
  202. package/dist/db/schema-slos.js.map +1 -0
  203. package/dist/db/schema-sourcemaps.d.ts +2 -0
  204. package/dist/db/schema-sourcemaps.d.ts.map +1 -0
  205. package/dist/db/schema-sourcemaps.js +9 -0
  206. package/dist/db/schema-sourcemaps.js.map +1 -0
  207. package/dist/db/schema-tags.d.ts +2 -0
  208. package/dist/db/schema-tags.d.ts.map +1 -0
  209. package/dist/db/schema-tags.js +12 -0
  210. package/dist/db/schema-tags.js.map +1 -0
  211. package/dist/db/schema-team.d.ts +2 -0
  212. package/dist/db/schema-team.d.ts.map +1 -0
  213. package/dist/db/schema-team.js +15 -0
  214. package/dist/db/schema-team.js.map +1 -0
  215. package/dist/db/schema-uptime.d.ts +2 -0
  216. package/dist/db/schema-uptime.d.ts.map +1 -0
  217. package/dist/db/schema-uptime.js +22 -0
  218. package/dist/db/schema-uptime.js.map +1 -0
  219. package/dist/db/schema.d.ts.map +1 -1
  220. package/dist/db/schema.js +32 -0
  221. package/dist/db/schema.js.map +1 -1
  222. package/dist/db/trigram.d.ts +4 -0
  223. package/dist/db/trigram.d.ts.map +1 -0
  224. package/dist/db/trigram.js +34 -0
  225. package/dist/db/trigram.js.map +1 -0
  226. package/dist/http/http.d.ts +5 -1
  227. package/dist/http/http.d.ts.map +1 -1
  228. package/dist/http/http.js +5 -1
  229. package/dist/http/http.js.map +1 -1
  230. package/dist/jobs.d.ts +1 -1
  231. package/dist/jobs.d.ts.map +1 -1
  232. package/dist/jobs.js +23 -9
  233. package/dist/jobs.js.map +1 -1
  234. package/dist/mail/blocks.d.ts +1 -1
  235. package/dist/mail/blocks.js +2 -2
  236. package/dist/mail/blocks.js.map +1 -1
  237. package/dist/mail/emails-billing.d.ts +17 -0
  238. package/dist/mail/emails-billing.d.ts.map +1 -0
  239. package/dist/mail/emails-billing.js +36 -0
  240. package/dist/mail/emails-billing.js.map +1 -0
  241. package/dist/mail/emails.d.ts +1 -1
  242. package/dist/mail/emails.d.ts.map +1 -1
  243. package/dist/mail/emails.js +7 -4
  244. package/dist/mail/emails.js.map +1 -1
  245. package/dist/mail/layout.d.ts +1 -1
  246. package/dist/mail/layout.d.ts.map +1 -1
  247. package/dist/mail/layout.js +2 -2
  248. package/dist/mail/layout.js.map +1 -1
  249. package/dist/mail/mailer.d.ts +1 -1
  250. package/dist/mail/mailer.d.ts.map +1 -1
  251. package/dist/mail/mailer.js +4 -3
  252. package/dist/mail/mailer.js.map +1 -1
  253. package/dist/mail/resend.d.ts +2 -0
  254. package/dist/mail/resend.d.ts.map +1 -1
  255. package/dist/mail/resend.js +1 -1
  256. package/dist/mail/resend.js.map +1 -1
  257. package/dist/mail/samples.d.ts.map +1 -1
  258. package/dist/mail/samples.js +17 -0
  259. package/dist/mail/samples.js.map +1 -1
  260. package/dist/mail/templates.d.ts +1 -1
  261. package/dist/mail/templates.d.ts.map +1 -1
  262. package/dist/mail/theme.d.ts +7 -1
  263. package/dist/mail/theme.d.ts.map +1 -1
  264. package/dist/mail/theme.js +7 -1
  265. package/dist/mail/theme.js.map +1 -1
  266. package/dist/notify/digest-data.d.ts +2 -1
  267. package/dist/notify/digest-data.d.ts.map +1 -1
  268. package/dist/notify/digest-data.js +5 -11
  269. package/dist/notify/digest-data.js.map +1 -1
  270. package/dist/notify/digest.d.ts.map +1 -1
  271. package/dist/notify/digest.js +5 -2
  272. package/dist/notify/digest.js.map +1 -1
  273. package/dist/notify/health.d.ts.map +1 -1
  274. package/dist/notify/health.js +4 -5
  275. package/dist/notify/health.js.map +1 -1
  276. package/dist/notify/team-describe.d.ts.map +1 -1
  277. package/dist/notify/team-describe.js +14 -0
  278. package/dist/notify/team-describe.js.map +1 -1
  279. package/dist/repo/alert-events.d.ts +38 -0
  280. package/dist/repo/alert-events.d.ts.map +1 -0
  281. package/dist/repo/alert-events.js +29 -0
  282. package/dist/repo/alert-events.js.map +1 -0
  283. package/dist/repo/alerts.d.ts +14 -44
  284. package/dist/repo/alerts.d.ts.map +1 -1
  285. package/dist/repo/alerts.js +35 -13
  286. package/dist/repo/alerts.js.map +1 -1
  287. package/dist/repo/audit.d.ts +19 -1
  288. package/dist/repo/audit.d.ts.map +1 -1
  289. package/dist/repo/audit.js +24 -2
  290. package/dist/repo/audit.js.map +1 -1
  291. package/dist/repo/auth-prune.d.ts +1 -1
  292. package/dist/repo/auth-prune.d.ts.map +1 -1
  293. package/dist/repo/auth-prune.js +13 -1
  294. package/dist/repo/auth-prune.js.map +1 -1
  295. package/dist/repo/billing.d.ts +30 -0
  296. package/dist/repo/billing.d.ts.map +1 -0
  297. package/dist/repo/billing.js +47 -0
  298. package/dist/repo/billing.js.map +1 -0
  299. package/dist/repo/grants.d.ts +30 -0
  300. package/dist/repo/grants.d.ts.map +1 -0
  301. package/dist/repo/grants.js +57 -0
  302. package/dist/repo/grants.js.map +1 -0
  303. package/dist/repo/issues.d.ts +15 -0
  304. package/dist/repo/issues.d.ts.map +1 -0
  305. package/dist/repo/issues.js +31 -0
  306. package/dist/repo/issues.js.map +1 -0
  307. package/dist/repo/keys.d.ts +51 -0
  308. package/dist/repo/keys.d.ts.map +1 -0
  309. package/dist/repo/keys.js +58 -0
  310. package/dist/repo/keys.js.map +1 -0
  311. package/dist/repo/log-retention.d.ts +8 -0
  312. package/dist/repo/log-retention.d.ts.map +1 -0
  313. package/dist/repo/log-retention.js +20 -0
  314. package/dist/repo/log-retention.js.map +1 -0
  315. package/dist/repo/metric-read.d.ts +2 -0
  316. package/dist/repo/metric-read.d.ts.map +1 -1
  317. package/dist/repo/metric-read.js +5 -1
  318. package/dist/repo/metric-read.js.map +1 -1
  319. package/dist/repo/metric-write.d.ts.map +1 -1
  320. package/dist/repo/metric-write.js +3 -2
  321. package/dist/repo/metric-write.js.map +1 -1
  322. package/dist/repo/orgs.d.ts +2 -0
  323. package/dist/repo/orgs.d.ts.map +1 -1
  324. package/dist/repo/orgs.js +5 -1
  325. package/dist/repo/orgs.js.map +1 -1
  326. package/dist/repo/project-roles.d.ts +28 -0
  327. package/dist/repo/project-roles.d.ts.map +1 -0
  328. package/dist/repo/project-roles.js +39 -0
  329. package/dist/repo/project-roles.js.map +1 -0
  330. package/dist/repo/projects.d.ts +3 -22
  331. package/dist/repo/projects.d.ts.map +1 -1
  332. package/dist/repo/projects.js +4 -29
  333. package/dist/repo/projects.js.map +1 -1
  334. package/dist/repo/saved.d.ts +9 -0
  335. package/dist/repo/saved.d.ts.map +1 -0
  336. package/dist/repo/saved.js +29 -0
  337. package/dist/repo/saved.js.map +1 -0
  338. package/dist/repo/scim-tokens.d.ts +20 -0
  339. package/dist/repo/scim-tokens.d.ts.map +1 -0
  340. package/dist/repo/scim-tokens.js +32 -0
  341. package/dist/repo/scim-tokens.js.map +1 -0
  342. package/dist/repo/services.d.ts +6 -0
  343. package/dist/repo/services.d.ts.map +1 -0
  344. package/dist/repo/services.js +17 -0
  345. package/dist/repo/services.js.map +1 -0
  346. package/dist/repo/settings.d.ts +30 -0
  347. package/dist/repo/settings.d.ts.map +1 -0
  348. package/dist/repo/settings.js +55 -0
  349. package/dist/repo/settings.js.map +1 -0
  350. package/dist/repo/slos.d.ts +10 -0
  351. package/dist/repo/slos.d.ts.map +1 -0
  352. package/dist/repo/slos.js +27 -0
  353. package/dist/repo/slos.js.map +1 -0
  354. package/dist/repo/sourcemaps.d.ts +9 -0
  355. package/dist/repo/sourcemaps.d.ts.map +1 -0
  356. package/dist/repo/sourcemaps.js +34 -0
  357. package/dist/repo/sourcemaps.js.map +1 -0
  358. package/dist/repo/tags.d.ts +11 -0
  359. package/dist/repo/tags.d.ts.map +1 -0
  360. package/dist/repo/tags.js +33 -0
  361. package/dist/repo/tags.js.map +1 -0
  362. package/dist/repo/trace-join.d.ts +9 -0
  363. package/dist/repo/trace-join.d.ts.map +1 -0
  364. package/dist/repo/trace-join.js +35 -0
  365. package/dist/repo/trace-join.js.map +1 -0
  366. package/dist/repo/trace-read.d.ts +6 -13
  367. package/dist/repo/trace-read.d.ts.map +1 -1
  368. package/dist/repo/trace-read.js +11 -4
  369. package/dist/repo/trace-read.js.map +1 -1
  370. package/dist/repo/trace-write.d.ts +6 -2
  371. package/dist/repo/trace-write.d.ts.map +1 -1
  372. package/dist/repo/trace-write.js +22 -7
  373. package/dist/repo/trace-write.js.map +1 -1
  374. package/dist/repo/uptime.d.ts +21 -0
  375. package/dist/repo/uptime.d.ts.map +1 -0
  376. package/dist/repo/uptime.js +53 -0
  377. package/dist/repo/uptime.js.map +1 -0
  378. package/dist/routes/alerts.d.ts.map +1 -1
  379. package/dist/routes/alerts.js +65 -66
  380. package/dist/routes/alerts.js.map +1 -1
  381. package/dist/routes/apps.d.ts +20 -0
  382. package/dist/routes/apps.d.ts.map +1 -0
  383. package/dist/routes/apps.js +53 -0
  384. package/dist/routes/apps.js.map +1 -0
  385. package/dist/routes/billing.d.ts +4 -0
  386. package/dist/routes/billing.d.ts.map +1 -0
  387. package/dist/routes/billing.js +51 -0
  388. package/dist/routes/billing.js.map +1 -0
  389. package/dist/routes/changes.d.ts +4 -0
  390. package/dist/routes/changes.d.ts.map +1 -0
  391. package/dist/routes/changes.js +19 -0
  392. package/dist/routes/changes.js.map +1 -0
  393. package/dist/routes/data.d.ts.map +1 -1
  394. package/dist/routes/data.js +38 -14
  395. package/dist/routes/data.js.map +1 -1
  396. package/dist/routes/index.d.ts.map +1 -1
  397. package/dist/routes/index.js +28 -0
  398. package/dist/routes/index.js.map +1 -1
  399. package/dist/routes/ingest.d.ts +3 -1
  400. package/dist/routes/ingest.d.ts.map +1 -1
  401. package/dist/routes/ingest.js +60 -14
  402. package/dist/routes/ingest.js.map +1 -1
  403. package/dist/routes/issues.d.ts +4 -0
  404. package/dist/routes/issues.d.ts.map +1 -0
  405. package/dist/routes/issues.js +34 -0
  406. package/dist/routes/issues.js.map +1 -0
  407. package/dist/routes/keys.d.ts +4 -0
  408. package/dist/routes/keys.d.ts.map +1 -0
  409. package/dist/routes/keys.js +70 -0
  410. package/dist/routes/keys.js.map +1 -0
  411. package/dist/routes/mcp.d.ts.map +1 -1
  412. package/dist/routes/mcp.js +85 -31
  413. package/dist/routes/mcp.js.map +1 -1
  414. package/dist/routes/me.d.ts.map +1 -1
  415. package/dist/routes/me.js +15 -5
  416. package/dist/routes/me.js.map +1 -1
  417. package/dist/routes/metrics.d.ts +2 -2
  418. package/dist/routes/metrics.d.ts.map +1 -1
  419. package/dist/routes/metrics.js +3 -4
  420. package/dist/routes/metrics.js.map +1 -1
  421. package/dist/routes/models.d.ts +9 -1
  422. package/dist/routes/models.d.ts.map +1 -1
  423. package/dist/routes/models.js +62 -21
  424. package/dist/routes/models.js.map +1 -1
  425. package/dist/routes/notify.d.ts.map +1 -1
  426. package/dist/routes/notify.js +3 -1
  427. package/dist/routes/notify.js.map +1 -1
  428. package/dist/routes/oauth-meta.d.ts +7 -0
  429. package/dist/routes/oauth-meta.d.ts.map +1 -0
  430. package/dist/routes/oauth-meta.js +52 -0
  431. package/dist/routes/oauth-meta.js.map +1 -0
  432. package/dist/routes/orgs.d.ts.map +1 -1
  433. package/dist/routes/orgs.js +27 -7
  434. package/dist/routes/orgs.js.map +1 -1
  435. package/dist/routes/projects.d.ts.map +1 -1
  436. package/dist/routes/projects.js +32 -22
  437. package/dist/routes/projects.js.map +1 -1
  438. package/dist/routes/saved.d.ts +4 -0
  439. package/dist/routes/saved.d.ts.map +1 -0
  440. package/dist/routes/saved.js +56 -0
  441. package/dist/routes/saved.js.map +1 -0
  442. package/dist/routes/scim.d.ts +4 -0
  443. package/dist/routes/scim.d.ts.map +1 -0
  444. package/dist/routes/scim.js +37 -0
  445. package/dist/routes/scim.js.map +1 -0
  446. package/dist/routes/search.d.ts +4 -0
  447. package/dist/routes/search.d.ts.map +1 -0
  448. package/dist/routes/search.js +36 -0
  449. package/dist/routes/search.js.map +1 -0
  450. package/dist/routes/settings.d.ts +4 -0
  451. package/dist/routes/settings.d.ts.map +1 -0
  452. package/dist/routes/settings.js +39 -0
  453. package/dist/routes/settings.js.map +1 -0
  454. package/dist/routes/shares.d.ts +3 -0
  455. package/dist/routes/shares.d.ts.map +1 -1
  456. package/dist/routes/shares.js +34 -18
  457. package/dist/routes/shares.js.map +1 -1
  458. package/dist/routes/slos.d.ts +4 -0
  459. package/dist/routes/slos.d.ts.map +1 -0
  460. package/dist/routes/slos.js +76 -0
  461. package/dist/routes/slos.js.map +1 -0
  462. package/dist/routes/sourcemaps.d.ts +9 -0
  463. package/dist/routes/sourcemaps.d.ts.map +1 -0
  464. package/dist/routes/sourcemaps.js +54 -0
  465. package/dist/routes/sourcemaps.js.map +1 -0
  466. package/dist/routes/status.d.ts +4 -0
  467. package/dist/routes/status.d.ts.map +1 -0
  468. package/dist/routes/status.js +60 -0
  469. package/dist/routes/status.js.map +1 -0
  470. package/dist/routes/tags.d.ts +4 -0
  471. package/dist/routes/tags.d.ts.map +1 -0
  472. package/dist/routes/tags.js +81 -0
  473. package/dist/routes/tags.js.map +1 -0
  474. package/dist/routes/uptime.d.ts +4 -0
  475. package/dist/routes/uptime.d.ts.map +1 -0
  476. package/dist/routes/uptime.js +71 -0
  477. package/dist/routes/uptime.js.map +1 -0
  478. package/dist/scale-exec.d.ts +3 -2
  479. package/dist/scale-exec.d.ts.map +1 -1
  480. package/dist/scale-exec.js +5 -4
  481. package/dist/scale-exec.js.map +1 -1
  482. package/dist/server.d.ts.map +1 -1
  483. package/dist/server.js +45 -10
  484. package/dist/server.js.map +1 -1
  485. package/dist/settle.d.ts +13 -9
  486. package/dist/settle.d.ts.map +1 -1
  487. package/dist/settle.js +40 -20
  488. package/dist/settle.js.map +1 -1
  489. package/dist/telemetry/cached.d.ts +11 -0
  490. package/dist/telemetry/cached.d.ts.map +1 -0
  491. package/dist/telemetry/cached.js +30 -0
  492. package/dist/telemetry/cached.js.map +1 -0
  493. package/dist/telemetry/ch/admin.d.ts +14 -0
  494. package/dist/telemetry/ch/admin.d.ts.map +1 -0
  495. package/dist/telemetry/ch/admin.js +82 -0
  496. package/dist/telemetry/ch/admin.js.map +1 -0
  497. package/dist/telemetry/ch/http.d.ts +19 -0
  498. package/dist/telemetry/ch/http.d.ts.map +1 -0
  499. package/dist/telemetry/ch/http.js +91 -0
  500. package/dist/telemetry/ch/http.js.map +1 -0
  501. package/dist/telemetry/ch/metrics.d.ts +10 -0
  502. package/dist/telemetry/ch/metrics.d.ts.map +1 -0
  503. package/dist/telemetry/ch/metrics.js +61 -0
  504. package/dist/telemetry/ch/metrics.js.map +1 -0
  505. package/dist/telemetry/ch/queries.d.ts +19 -0
  506. package/dist/telemetry/ch/queries.d.ts.map +1 -0
  507. package/dist/telemetry/ch/queries.js +30 -0
  508. package/dist/telemetry/ch/queries.js.map +1 -0
  509. package/dist/telemetry/ch/queue.d.ts +36 -0
  510. package/dist/telemetry/ch/queue.d.ts.map +1 -0
  511. package/dist/telemetry/ch/queue.js +83 -0
  512. package/dist/telemetry/ch/queue.js.map +1 -0
  513. package/dist/telemetry/ch/read.d.ts +12 -0
  514. package/dist/telemetry/ch/read.d.ts.map +1 -0
  515. package/dist/telemetry/ch/read.js +74 -0
  516. package/dist/telemetry/ch/read.js.map +1 -0
  517. package/dist/telemetry/ch/rebuild.d.ts +23 -0
  518. package/dist/telemetry/ch/rebuild.d.ts.map +1 -0
  519. package/dist/telemetry/ch/rebuild.js +65 -0
  520. package/dist/telemetry/ch/rebuild.js.map +1 -0
  521. package/dist/telemetry/ch/schema-facts.d.ts +6 -0
  522. package/dist/telemetry/ch/schema-facts.d.ts.map +1 -0
  523. package/dist/telemetry/ch/schema-facts.js +55 -0
  524. package/dist/telemetry/ch/schema-facts.js.map +1 -0
  525. package/dist/telemetry/ch/schema-raw.d.ts +10 -0
  526. package/dist/telemetry/ch/schema-raw.d.ts.map +1 -0
  527. package/dist/telemetry/ch/schema-raw.js +37 -0
  528. package/dist/telemetry/ch/schema-raw.js.map +1 -0
  529. package/dist/telemetry/ch/schema-rollups.d.ts +2 -0
  530. package/dist/telemetry/ch/schema-rollups.d.ts.map +1 -0
  531. package/dist/telemetry/ch/schema-rollups.js +61 -0
  532. package/dist/telemetry/ch/schema-rollups.js.map +1 -0
  533. package/dist/telemetry/ch/schema.d.ts +12 -0
  534. package/dist/telemetry/ch/schema.d.ts.map +1 -0
  535. package/dist/telemetry/ch/schema.js +25 -0
  536. package/dist/telemetry/ch/schema.js.map +1 -0
  537. package/dist/telemetry/ch/settle-pool.d.ts +24 -0
  538. package/dist/telemetry/ch/settle-pool.d.ts.map +1 -0
  539. package/dist/telemetry/ch/settle-pool.js +58 -0
  540. package/dist/telemetry/ch/settle-pool.js.map +1 -0
  541. package/dist/telemetry/ch/settle-rows.d.ts +16 -0
  542. package/dist/telemetry/ch/settle-rows.d.ts.map +1 -0
  543. package/dist/telemetry/ch/settle-rows.js +74 -0
  544. package/dist/telemetry/ch/settle-rows.js.map +1 -0
  545. package/dist/telemetry/ch/settle-work.d.ts +21 -0
  546. package/dist/telemetry/ch/settle-work.d.ts.map +1 -0
  547. package/dist/telemetry/ch/settle-work.js +52 -0
  548. package/dist/telemetry/ch/settle-work.js.map +1 -0
  549. package/dist/telemetry/ch/settle-worker.d.ts +2 -0
  550. package/dist/telemetry/ch/settle-worker.d.ts.map +1 -0
  551. package/dist/telemetry/ch/settle-worker.js +10 -0
  552. package/dist/telemetry/ch/settle-worker.js.map +1 -0
  553. package/dist/telemetry/ch/settle.d.ts +21 -0
  554. package/dist/telemetry/ch/settle.d.ts.map +1 -0
  555. package/dist/telemetry/ch/settle.js +55 -0
  556. package/dist/telemetry/ch/settle.js.map +1 -0
  557. package/dist/telemetry/ch/store.d.ts +27 -0
  558. package/dist/telemetry/ch/store.d.ts.map +1 -0
  559. package/dist/telemetry/ch/store.js +94 -0
  560. package/dist/telemetry/ch/store.js.map +1 -0
  561. package/dist/telemetry/ch/util.d.ts +27 -0
  562. package/dist/telemetry/ch/util.d.ts.map +1 -0
  563. package/dist/telemetry/ch/util.js +49 -0
  564. package/dist/telemetry/ch/util.js.map +1 -0
  565. package/dist/telemetry/ch/write.d.ts +12 -0
  566. package/dist/telemetry/ch/write.d.ts.map +1 -0
  567. package/dist/telemetry/ch/write.js +59 -0
  568. package/dist/telemetry/ch/write.js.map +1 -0
  569. package/dist/telemetry/copy.d.ts +9 -0
  570. package/dist/telemetry/copy.d.ts.map +1 -0
  571. package/dist/telemetry/copy.js +60 -0
  572. package/dist/telemetry/copy.js.map +1 -0
  573. package/dist/telemetry/index.d.ts +14 -0
  574. package/dist/telemetry/index.d.ts.map +1 -0
  575. package/dist/telemetry/index.js +26 -0
  576. package/dist/telemetry/index.js.map +1 -0
  577. package/dist/telemetry/pg-store.d.ts +5 -0
  578. package/dist/telemetry/pg-store.d.ts.map +1 -0
  579. package/dist/telemetry/pg-store.js +83 -0
  580. package/dist/telemetry/pg-store.js.map +1 -0
  581. package/dist/telemetry/store.d.ts +85 -0
  582. package/dist/telemetry/store.d.ts.map +1 -0
  583. package/dist/telemetry/store.js +2 -0
  584. package/dist/telemetry/store.js.map +1 -0
  585. package/dist/uptime/headers.d.ts +6 -0
  586. package/dist/uptime/headers.d.ts.map +1 -0
  587. package/dist/uptime/headers.js +25 -0
  588. package/dist/uptime/headers.js.map +1 -0
  589. package/dist/uptime/run.d.ts +9 -0
  590. package/dist/uptime/run.d.ts.map +1 -0
  591. package/dist/uptime/run.js +40 -0
  592. package/dist/uptime/run.js.map +1 -0
  593. package/package.json +10 -5
  594. package/dist/alerts/notify.d.ts +0 -28
  595. package/dist/alerts/notify.d.ts.map +0 -1
  596. package/dist/alerts/notify.js +0 -52
  597. package/dist/alerts/notify.js.map +0 -1
@@ -1,8 +1,20 @@
1
- /** Remove expired sessions and links, and sign-in counters older than a day. Better Auth ignores them already; this keeps the tables small. */
1
+ /** Remove expired sessions, links, and OAuth rows, and sign-in counters older than a day. Better Auth ignores them already; this keeps the tables small. */
2
2
  export async function pruneAuthRows(q) {
3
3
  await q.query("DELETE FROM sessions WHERE expires_at < now()");
4
4
  await q.query("DELETE FROM verifications WHERE expires_at < now()");
5
5
  await q.query("DELETE FROM rate_limits WHERE last_request < $1", [Date.now() - 86_400_000]);
6
6
  await q.query("DELETE FROM invites WHERE status <> 'pending' AND created_at < now() - interval '90 days'");
7
+ await pruneOAuthRows(q, Date.now());
8
+ }
9
+ /** Expired OAuth tokens, grants ended 90 days ago or never consented to, and registered apps nobody connected within a day. */
10
+ async function pruneOAuthRows(q, now) {
11
+ await q.query("DELETE FROM oauth_access_tokens WHERE expires_at < now() - interval '1 day'");
12
+ await q.query("DELETE FROM oauth_refresh_tokens WHERE expires_at < now() - interval '1 day'");
13
+ await q.query("DELETE FROM oauth_client_assertions WHERE expires_at < now()");
14
+ await q.query("DELETE FROM oauth_grants WHERE revoked_ms < $1", [now - 90 * 86_400_000]);
15
+ await q.query("DELETE FROM oauth_grants g WHERE g.created_ms < $1 AND NOT EXISTS (SELECT 1 FROM oauth_consents k WHERE k.reference_id = g.id)", [now - 86_400_000]);
16
+ await q.query(`DELETE FROM oauth_clients c WHERE c.created_at < now() - interval '1 day'
17
+ AND NOT EXISTS (SELECT 1 FROM oauth_grants g WHERE g.client_id = c.client_id)
18
+ AND NOT EXISTS (SELECT 1 FROM oauth_refresh_tokens t WHERE t.client_id = c.client_id)`);
7
19
  }
8
20
  //# sourceMappingURL=auth-prune.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-prune.js","sourceRoot":"","sources":["../../src/repo/auth-prune.ts"],"names":[],"mappings":"AAEA,+IAA+I;AAC/I,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY;IAC9C,MAAM,CAAC,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,MAAM,CAAC,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,KAAK,CAAC,iDAAiD,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;AAC7G,CAAC"}
1
+ {"version":3,"file":"auth-prune.js","sourceRoot":"","sources":["../../src/repo/auth-prune.ts"],"names":[],"mappings":"AAEA,4JAA4J;AAC5J,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY;IAC9C,MAAM,CAAC,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC/D,MAAM,CAAC,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,KAAK,CAAC,iDAAiD,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC3G,MAAM,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,+HAA+H;AAC/H,KAAK,UAAU,cAAc,CAAC,CAAY,EAAE,GAAW;IACrD,MAAM,CAAC,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;IAC7F,MAAM,CAAC,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAC9F,MAAM,CAAC,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC9E,MAAM,CAAC,CAAC,KAAK,CAAC,gDAAgD,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IACzF,MAAM,CAAC,CAAC,KAAK,CAAC,gIAAgI,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;IACpK,MAAM,CAAC,CAAC,KAAK,CACX;;4FAEwF,CACzF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type Feature, type Limits, type OrgPlanRow, type PlanId } from "../billing/plans.js";
2
+ import type { Queryable } from "../db/db.js";
3
+ export interface OrgBilling extends OrgPlanRow {
4
+ /** The monthly overage limit in cents (Team and Business), or null for none. */
5
+ spendCapCents: number | null;
6
+ stripeCustomerId: string | null;
7
+ /** The separate monthly subscription that bills extra GB (billing/overage-sub.ts). */
8
+ overageSubscriptionId: string | null;
9
+ }
10
+ export declare function orgBilling(q: Queryable, orgId: string): Promise<OrgBilling | undefined>;
11
+ /** The limits that apply to an organization now; unlimited while billing is off. */
12
+ export declare function orgLimits(q: Queryable, orgId: string, billingOn: boolean): Promise<Limits>;
13
+ export declare function orgHas(q: Queryable, orgId: string, billingOn: boolean, feature: Feature): Promise<boolean>;
14
+ export interface PlanChange {
15
+ plan: PlanId;
16
+ /** Enterprise only. */
17
+ gb?: number | null;
18
+ retentionDays?: number | null;
19
+ }
20
+ /** Set the plan, lower retention to the plan's maximum, and write an audit line. Returns false when nothing changed. */
21
+ export declare function setPlan(q: Queryable, orgId: string, change: PlanChange, actor: string, now: number): Promise<boolean>;
22
+ export declare function setSpendCap(q: Queryable, orgId: string, cents: number | null, actor: string, now: number): Promise<void>;
23
+ /** Organizations by id or slug, for the `plan set` command. */
24
+ export declare function findOrg(q: Queryable, idOrSlug: string): Promise<{
25
+ id: string;
26
+ name: string;
27
+ } | undefined>;
28
+ /** True while a Stripe subscription still runs (or retries a payment) for the organization. */
29
+ export declare function hasLivePlan(q: Queryable, orgId: string): Promise<boolean>;
30
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/repo/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAY,KAAK,MAAM,EAAY,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,gFAAgF;IAChF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sFAAsF;IACtF,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAKD,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG7F;AAED,oFAAoF;AACpF,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhG;AAED,wBAAsB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhH;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wHAAwH;AACxH,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY3H;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9H;AAED,+DAA+D;AAC/D,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAG/G;AAED,+FAA+F;AAC/F,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG/E"}
@@ -0,0 +1,47 @@
1
+ import { isPlanId, limitsOf } from "../billing/plans.js";
2
+ import { audit } from "./audit.js";
3
+ const COLUMNS = `plan, plan_gb AS "planGb", plan_retention_days AS "planRetentionDays", spend_cap_cents AS "spendCapCents",
4
+ stripe_customer_id AS "stripeCustomerId", overage_subscription_id AS "overageSubscriptionId"`;
5
+ export async function orgBilling(q, orgId) {
6
+ const [row] = await q.query(`SELECT ${COLUMNS} FROM orgs WHERE id = $1`, [orgId]);
7
+ return row ? { ...row, plan: isPlanId(row.plan) ? row.plan : "free" } : undefined;
8
+ }
9
+ /** The limits that apply to an organization now; unlimited while billing is off. */
10
+ export async function orgLimits(q, orgId, billingOn) {
11
+ return limitsOf((await orgBilling(q, orgId)) ?? { plan: "free", planGb: null, planRetentionDays: null }, billingOn);
12
+ }
13
+ export async function orgHas(q, orgId, billingOn, feature) {
14
+ return !billingOn || (await orgLimits(q, orgId, billingOn)).plan.features[feature];
15
+ }
16
+ /** Set the plan, lower retention to the plan's maximum, and write an audit line. Returns false when nothing changed. */
17
+ export async function setPlan(q, orgId, change, actor, now) {
18
+ const before = await orgBilling(q, orgId);
19
+ if (!before)
20
+ throw new Error(`No organization ${orgId}.`);
21
+ const custom = change.plan === "enterprise";
22
+ const gb = custom ? (change.gb ?? before.planGb) : null;
23
+ const days = custom ? (change.retentionDays ?? before.planRetentionDays) : null;
24
+ if (before.plan === change.plan && before.planGb === gb && before.planRetentionDays === days)
25
+ return false;
26
+ const max = limitsOf({ plan: change.plan, planGb: gb, planRetentionDays: days }, true).maxRetentionDays;
27
+ await q.query("UPDATE orgs SET plan = $1, plan_gb = $2, plan_retention_days = $3, retention_days = LEAST(retention_days, $4) WHERE id = $5", [change.plan, gb, days, max, orgId]);
28
+ if (change.plan !== "team" && change.plan !== "business")
29
+ await q.query("UPDATE orgs SET spend_cap_cents = NULL WHERE id = $1", [orgId]);
30
+ await audit(q, orgId, actor, "plan.change", { from: before.plan, plan: change.plan, ...(custom ? { gb, retentionDays: days } : {}) }, now);
31
+ return true;
32
+ }
33
+ export async function setSpendCap(q, orgId, cents, actor, now) {
34
+ await q.query("UPDATE orgs SET spend_cap_cents = $1 WHERE id = $2", [cents, orgId]);
35
+ await audit(q, orgId, actor, "billing.cap", { capUsd: cents === null ? null : cents / 100 }, now);
36
+ }
37
+ /** Organizations by id or slug, for the `plan set` command. */
38
+ export async function findOrg(q, idOrSlug) {
39
+ const [row] = await q.query("SELECT id, name FROM orgs WHERE id = $1 OR slug = $1", [idOrSlug]);
40
+ return row;
41
+ }
42
+ /** True while a Stripe subscription still runs (or retries a payment) for the organization. */
43
+ export async function hasLivePlan(q, orgId) {
44
+ const [row] = await q.query("SELECT EXISTS (SELECT 1 FROM subscriptions WHERE reference_id = $1 AND status IN ('active', 'trialing', 'past_due')) AS live", [orgId]);
45
+ return row?.live === true;
46
+ }
47
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/repo/billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Queryable } from "../db/db.js";
2
+ /** What one person let one connected app (an OAuth client, such as Claude) read: one organization, all of it or some projects. */
3
+ export interface Grant {
4
+ id: string;
5
+ userId: string;
6
+ orgId: string;
7
+ clientId: string;
8
+ /** Every project of the organization, also ones made later. */
9
+ allProjects: boolean;
10
+ projectIds: string[];
11
+ createdMs: number;
12
+ usedMs: number | null;
13
+ }
14
+ /** A grant with the app's name and the organization's, for the connected apps lists. */
15
+ export interface GrantView extends Grant {
16
+ clientName: string | null;
17
+ orgName: string;
18
+ userEmail: string;
19
+ }
20
+ /** A new grant from the consent page. Older grants of this person to this app end, with their tokens: the app holds only the newest. */
21
+ export declare function createGrant(q: Queryable, g: Omit<Grant, "id" | "usedMs" | "createdMs">, sessionId: string, now: number): Promise<string>;
22
+ /** The grant this session just chose on the consent page, for Better Auth to tie the consent to. */
23
+ export declare function pendingGrantId(q: Queryable, sessionId: string, now: number): Promise<string | undefined>;
24
+ /** An open grant by id. Marks it used (at most once a minute). */
25
+ export declare function grantById(q: Queryable, id: string, now: number): Promise<Grant | undefined>;
26
+ /** End a grant: its tokens and consent go too, so the app must ask again. False when it was not open. */
27
+ export declare function endGrant(q: Queryable, id: string, now: number): Promise<boolean>;
28
+ export declare function grantsOfUser(q: Queryable, userId: string): Promise<GrantView[]>;
29
+ export declare function grantsOfOrg(q: Queryable, orgId: string): Promise<GrantView[]>;
30
+ //# sourceMappingURL=grants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/repo/grants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,kIAAkI;AAClI,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,wFAAwF;AACxF,MAAM,WAAW,SAAU,SAAQ,KAAK;IACtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AA0BD,wIAAwI;AACxI,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS9I;AAED,oGAAoG;AACpG,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM9G;AAED,kEAAkE;AAClE,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAKjG;AAED,yGAAyG;AACzG,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMtF;AAWD,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAErF;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAEnF"}
@@ -0,0 +1,57 @@
1
+ import { newId } from "../auth/crypto.js";
2
+ /** How long a choice on the consent page waits for its consent. */
3
+ const PENDING_MS = 10 * 60_000;
4
+ const COLUMNS = "g.id, g.user_id, g.org_id, g.client_id, g.all_projects, g.project_ids, g.created_ms, g.used_ms";
5
+ const toGrant = (r) => ({
6
+ id: r.id,
7
+ userId: r.user_id,
8
+ orgId: r.org_id,
9
+ clientId: r.client_id,
10
+ allProjects: r.all_projects,
11
+ projectIds: JSON.parse(r.project_ids),
12
+ createdMs: r.created_ms,
13
+ usedMs: r.used_ms,
14
+ });
15
+ /** A new grant from the consent page. Older grants of this person to this app end, with their tokens: the app holds only the newest. */
16
+ export async function createGrant(q, g, sessionId, now) {
17
+ const id = newId();
18
+ const old = await q.query("SELECT id FROM oauth_grants WHERE user_id = $1 AND client_id = $2 AND revoked_ms IS NULL", [g.userId, g.clientId]);
19
+ for (const o of old)
20
+ await endGrant(q, o.id, now);
21
+ await q.query("INSERT INTO oauth_grants (id, user_id, org_id, client_id, session_id, all_projects, project_ids, created_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)", [id, g.userId, g.orgId, g.clientId, sessionId, g.allProjects, JSON.stringify(g.allProjects ? [] : g.projectIds), now]);
22
+ return id;
23
+ }
24
+ /** The grant this session just chose on the consent page, for Better Auth to tie the consent to. */
25
+ export async function pendingGrantId(q, sessionId, now) {
26
+ const [row] = await q.query("SELECT id FROM oauth_grants WHERE session_id = $1 AND created_ms > $2 AND revoked_ms IS NULL ORDER BY created_ms DESC LIMIT 1", [sessionId, now - PENDING_MS]);
27
+ return row?.id;
28
+ }
29
+ /** An open grant by id. Marks it used (at most once a minute). */
30
+ export async function grantById(q, id, now) {
31
+ const [row] = await q.query(`SELECT ${COLUMNS} FROM oauth_grants g WHERE g.id = $1 AND g.revoked_ms IS NULL`, [id]);
32
+ if (!row)
33
+ return undefined;
34
+ if (!row.used_ms || now - row.used_ms > 60_000)
35
+ await q.query("UPDATE oauth_grants SET used_ms = $1 WHERE id = $2", [now, id]);
36
+ return toGrant(row);
37
+ }
38
+ /** End a grant: its tokens and consent go too, so the app must ask again. False when it was not open. */
39
+ export async function endGrant(q, id, now) {
40
+ const rows = await q.query("UPDATE oauth_grants SET revoked_ms = $1 WHERE id = $2 AND revoked_ms IS NULL RETURNING id", [now, id]);
41
+ await q.query("DELETE FROM oauth_access_tokens WHERE reference_id = $1", [id]);
42
+ await q.query("DELETE FROM oauth_refresh_tokens WHERE reference_id = $1", [id]);
43
+ await q.query("DELETE FROM oauth_consents WHERE reference_id = $1", [id]);
44
+ return rows.length > 0;
45
+ }
46
+ const VIEW = `SELECT ${COLUMNS}, c.name AS client_name, o.name AS org_name, u.email AS user_email
47
+ FROM oauth_grants g JOIN oauth_clients c ON c.client_id = g.client_id JOIN orgs o ON o.id = g.org_id JOIN users u ON u.id = g.user_id`;
48
+ const toView = (r) => ({ ...toGrant(r), clientName: r.client_name, orgName: r.org_name, userEmail: r.user_email });
49
+ /** Open grants the person gave consent for. */
50
+ const DONE = "g.revoked_ms IS NULL AND EXISTS (SELECT 1 FROM oauth_consents k WHERE k.reference_id = g.id)";
51
+ export async function grantsOfUser(q, userId) {
52
+ return (await q.query(`${VIEW} WHERE g.user_id = $1 AND ${DONE} ORDER BY g.created_ms DESC`, [userId])).map(toView);
53
+ }
54
+ export async function grantsOfOrg(q, orgId) {
55
+ return (await q.query(`${VIEW} WHERE g.org_id = $1 AND ${DONE} ORDER BY g.created_ms DESC`, [orgId])).map(toView);
56
+ }
57
+ //# sourceMappingURL=grants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/repo/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG1C,mEAAmE;AACnE,MAAM,UAAU,GAAG,EAAE,GAAG,MAAM,CAAC;AAiC/B,MAAM,OAAO,GAAG,gGAAgG,CAAC;AAEjH,MAAM,OAAO,GAAG,CAAC,CAAW,EAAS,EAAE,CAAC,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,EAAE;IACR,MAAM,EAAE,CAAC,CAAC,OAAO;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM;IACf,QAAQ,EAAE,CAAC,CAAC,SAAS;IACrB,WAAW,EAAE,CAAC,CAAC,YAAY;IAC3B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAa;IACjD,SAAS,EAAE,CAAC,CAAC,UAAU;IACvB,MAAM,EAAE,CAAC,CAAC,OAAO;CAClB,CAAC,CAAC;AAEH,wIAAwI;AACxI,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,CAA6C,EAAE,SAAiB,EAAE,GAAW;IAC3H,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,KAAK,CAAiB,0FAA0F,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9J,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,CAAC,CAAC,KAAK,CACX,sJAAsJ,EACtJ,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CACtH,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAW;IAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CACzB,+HAA+H,EAC/H,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,CAAC,CAC9B,CAAC;IACF,OAAO,GAAG,EAAE,EAAE,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,EAAU,EAAE,GAAW;IACnE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAW,UAAU,OAAO,+DAA+D,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9H,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,oDAAoD,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/H,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAY,EAAE,EAAU,EAAE,GAAW;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,2FAA2F,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACnI,MAAM,CAAC,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,CAAC,KAAK,CAAC,0DAA0D,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,CAAC,KAAK,CAAC,oDAAoD,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,IAAI,GAAG,UAAU,OAAO;wIAC0G,CAAC;AAGzI,MAAM,MAAM,GAAG,CAAC,CAAU,EAAa,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;AAEvI,+CAA+C;AAC/C,MAAM,IAAI,GAAG,8FAA8F,CAAC;AAE5G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAY,EAAE,MAAc;IAC7D,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAU,GAAG,IAAI,6BAA6B,IAAI,6BAA6B,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,KAAa;IAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAU,GAAG,IAAI,4BAA4B,IAAI,6BAA6B,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC7H,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { IssueKind, IssueState } from "@wizeworks/lens-core";
2
+ import type { Queryable } from "../db/db.js";
3
+ /** Every issue state of a project. */
4
+ export declare function listIssues(q: Queryable, projectId: string): Promise<IssueState[]>;
5
+ /** One issue's state, or undefined. */
6
+ export declare function issueOf(q: Queryable, projectId: string, kind: IssueKind, key: string): Promise<IssueState | undefined>;
7
+ /** Keep a state, or remove it (null: back to plain unresolved). */
8
+ export declare function saveIssue(q: Queryable, projectId: string, kind: IssueKind, key: string, state: IssueState | null, actor: string): Promise<void>;
9
+ /** Members of an organization a person can assign issues to. */
10
+ export declare function assignableMembers(q: Queryable, orgId: string): Promise<{
11
+ id: string;
12
+ name: string;
13
+ email: string;
14
+ }[]>;
15
+ //# sourceMappingURL=issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/repo/issues.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAsB7C,sCAAsC;AACtC,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvF;AAED,uCAAuC;AACvC,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG5H;AAED,mEAAmE;AACnE,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrJ;AAED,gEAAgE;AAChE,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAE3H"}
@@ -0,0 +1,31 @@
1
+ const stateOf = (r) => ({
2
+ kind: r.kind,
3
+ key: r.key,
4
+ status: r.status,
5
+ untilMs: r.until_ms === null ? null : Number(r.until_ms),
6
+ resolvedMs: r.resolved_ms === null ? null : Number(r.resolved_ms),
7
+ assignee: r.assignee,
8
+ updatedMs: Number(r.updated_ms),
9
+ });
10
+ /** Every issue state of a project. */
11
+ export async function listIssues(q, projectId) {
12
+ const rows = await q.query("SELECT kind, key, status, until_ms, resolved_ms, assignee, updated_ms FROM issues WHERE project_id = $1", [projectId]);
13
+ return rows.map(stateOf);
14
+ }
15
+ /** One issue's state, or undefined. */
16
+ export async function issueOf(q, projectId, kind, key) {
17
+ const [row] = await q.query("SELECT kind, key, status, until_ms, resolved_ms, assignee, updated_ms FROM issues WHERE project_id = $1 AND kind = $2 AND key = $3", [projectId, kind, key]);
18
+ return row ? stateOf(row) : undefined;
19
+ }
20
+ /** Keep a state, or remove it (null: back to plain unresolved). */
21
+ export async function saveIssue(q, projectId, kind, key, state, actor) {
22
+ if (!state)
23
+ return void (await q.query("DELETE FROM issues WHERE project_id = $1 AND kind = $2 AND key = $3", [projectId, kind, key]));
24
+ await q.query(`INSERT INTO issues (project_id, kind, key, status, until_ms, resolved_ms, assignee, updated_ms, updated_by) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
25
+ ON CONFLICT (project_id, kind, key) DO UPDATE SET status = $4, until_ms = $5, resolved_ms = $6, assignee = $7, updated_ms = $8, updated_by = $9`, [projectId, kind, key, state.status, state.untilMs, state.resolvedMs, state.assignee, state.updatedMs, actor]);
26
+ }
27
+ /** Members of an organization a person can assign issues to. */
28
+ export async function assignableMembers(q, orgId) {
29
+ return q.query("SELECT u.id, u.name, u.email FROM members m JOIN users u ON u.id = m.user_id WHERE m.org_id = $1 ORDER BY u.name, u.email", [orgId]);
30
+ }
31
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/repo/issues.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,GAAG,CAAC,CAAM,EAAc,EAAE,CAAC,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,IAAiB;IACzB,GAAG,EAAE,CAAC,CAAC,GAAG;IACV,MAAM,EAAE,CAAC,CAAC,MAA8B;IACxC,OAAO,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACjE,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;CAChC,CAAC,CAAC;AAEH,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAY,EAAE,SAAiB;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAM,yGAAyG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACxJ,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,CAAY,EAAE,SAAiB,EAAE,IAAe,EAAE,GAAW;IACzF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAM,oIAAoI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/L,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,SAAiB,EAAE,IAAe,EAAE,GAAW,EAAE,KAAwB,EAAE,KAAa;IACpI,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,qEAAqE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvI,MAAM,CAAC,CAAC,KAAK,CACX;qJACiJ,EACjJ,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAC9G,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAY,EAAE,KAAa;IACjE,OAAO,CAAC,CAAC,KAAK,CAA8C,2HAA2H,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACpM,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { Queryable } from "../db/db.js";
2
+ export type KeyKind = "ingest" | "read";
3
+ export declare const INGEST_SCOPES: readonly ["traces", "logs", "metrics"];
4
+ export declare const READ_SCOPES: readonly ["api", "mcp"];
5
+ export type IngestScope = (typeof INGEST_SCOPES)[number];
6
+ export type ReadScope = (typeof READ_SCOPES)[number];
7
+ export type KeyScope = IngestScope | ReadScope;
8
+ export interface ApiKey {
9
+ id: string;
10
+ kind: KeyKind;
11
+ name: string;
12
+ prefix: string;
13
+ /** Ingest keys: exactly one project. Read keys: the projects they may read. */
14
+ projectIds: string[];
15
+ /** What the key may do; null for everything its kind allows. */
16
+ scopes: KeyScope[] | null;
17
+ createdMs: number;
18
+ lastUsedMs: number | null;
19
+ /** The key stops working at this time; null for never. */
20
+ expiresMs: number | null;
21
+ /** The key this one replaced. */
22
+ rotatedFrom: string | null;
23
+ }
24
+ export declare const keyAllows: (key: Pick<ApiKey, "scopes">, scope: KeyScope) => boolean;
25
+ /** Checked scopes for a kind: null (all) when none or all are picked. Throws a message for people on a bad one. */
26
+ export declare function scopesFor(kind: KeyKind, raw: unknown): KeyScope[] | null;
27
+ export interface KeyExtras {
28
+ scopes?: KeyScope[] | null;
29
+ expiresMs?: number | null;
30
+ rotatedFrom?: string;
31
+ }
32
+ /** A new key. Returns the secret once; only its hash is kept. */
33
+ export declare function createKey(q: Queryable, orgId: string, kind: KeyKind, name: string, projectIds: string[], by: string, now: number, x?: KeyExtras): Promise<{
34
+ id: string;
35
+ token: string;
36
+ }>;
37
+ /** Keys not revoked, newest first; expired ones too, so people see them and clean up. */
38
+ export declare function listKeys(q: Queryable, orgId: string): Promise<ApiKey[]>;
39
+ export declare function keyInOrg(q: Queryable, orgId: string, keyId: string): Promise<ApiKey | undefined>;
40
+ export declare function revokeKey(q: Queryable, orgId: string, keyId: string, now: number): Promise<boolean>;
41
+ /** A new secret with the same name, kind, projects, scopes, and lifetime. The old one keeps working for `graceMs`, so apps can switch. */
42
+ export declare function rotateKey(q: Queryable, orgId: string, old: ApiKey, by: string, now: number, graceMs: number): Promise<{
43
+ id: string;
44
+ token: string;
45
+ oldExpiresMs: number;
46
+ }>;
47
+ /** The key for a secret, when it is valid and not expired. Marks it used (at most once a minute). */
48
+ export declare function keyByToken(q: Queryable, token: string, now: number): Promise<(ApiKey & {
49
+ orgId: string;
50
+ }) | undefined>;
51
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/repo/keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AACxC,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AACpE,eAAO,MAAM,WAAW,YAAI,KAAK,EAAE,KAAK,CAAU,CAAC;AACnD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gEAAgE;IAChE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iCAAiC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAWD,eAAO,MAAM,SAAS,QAAS,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,QAAQ,KAAG,OAAoD,CAAC;AAE9H,mHAAmH;AACnH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,IAAI,CAOxE;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iEAAiE;AACjE,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,GAAE,SAAc;;;GASzJ;AAED,yFAAyF;AACzF,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGtG;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzG;AAED,0IAA0I;AAC1I,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;GAMjH;AAED,qGAAqG;AACrG,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAAC,CAK5H"}
@@ -0,0 +1,58 @@
1
+ // API keys: ingest keys send one project's data, read keys read some projects. Optional expiry, scopes, and rotation with a grace period.
2
+ import { hashToken, newId, newToken } from "../auth/crypto.js";
3
+ export const INGEST_SCOPES = ["traces", "logs", "metrics"];
4
+ export const READ_SCOPES = ["api", "mcp"];
5
+ const KEY_COLUMNS = `id, org_id, kind, name, prefix, project_ids, scopes, created_ms AS "createdMs", last_used_ms AS "lastUsedMs", expires_ms AS "expiresMs", rotated_from AS "rotatedFrom"`;
6
+ const toKey = ({ project_ids, scopes, org_id: _org, ...k }) => ({ ...k, projectIds: JSON.parse(project_ids), scopes: scopes ? JSON.parse(scopes) : null });
7
+ export const keyAllows = (key, scope) => !key.scopes || key.scopes.includes(scope);
8
+ /** Checked scopes for a kind: null (all) when none or all are picked. Throws a message for people on a bad one. */
9
+ export function scopesFor(kind, raw) {
10
+ if (raw === undefined || raw === null)
11
+ return null;
12
+ const all = kind === "ingest" ? INGEST_SCOPES : READ_SCOPES;
13
+ if (!Array.isArray(raw) || raw.some((s) => !all.includes(s)))
14
+ throw new Error(`Scopes for a ${kind} key are: ${all.join(", ")}.`);
15
+ const picked = all.filter((s) => raw.includes(s));
16
+ if (!picked.length)
17
+ throw new Error("Pick at least one scope.");
18
+ return picked.length === all.length ? null : picked;
19
+ }
20
+ /** A new key. Returns the secret once; only its hash is kept. */
21
+ export async function createKey(q, orgId, kind, name, projectIds, by, now, x = {}) {
22
+ const token = newToken(kind);
23
+ const id = newId();
24
+ await q.query(`INSERT INTO api_keys (id, org_id, kind, project_ids, name, prefix, token_hash, created_by, created_ms, scopes, expires_ms, rotated_from)
25
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, [id, orgId, kind, JSON.stringify(projectIds), name.trim().slice(0, 100) || kind, token.slice(0, 12), hashToken(token), by, now, x.scopes ? JSON.stringify(x.scopes) : null, x.expiresMs ?? null, x.rotatedFrom ?? null]);
26
+ return { id, token };
27
+ }
28
+ /** Keys not revoked, newest first; expired ones too, so people see them and clean up. */
29
+ export async function listKeys(q, orgId) {
30
+ const rows = await q.query(`SELECT ${KEY_COLUMNS} FROM api_keys WHERE org_id = $1 AND revoked_ms IS NULL ORDER BY created_ms DESC`, [orgId]);
31
+ return rows.map(toKey);
32
+ }
33
+ export async function keyInOrg(q, orgId, keyId) {
34
+ const [row] = await q.query(`SELECT ${KEY_COLUMNS} FROM api_keys WHERE org_id = $1 AND id = $2 AND revoked_ms IS NULL`, [orgId, keyId]);
35
+ return row && toKey(row);
36
+ }
37
+ export async function revokeKey(q, orgId, keyId, now) {
38
+ const rows = await q.query("UPDATE api_keys SET revoked_ms = $1 WHERE org_id = $2 AND id = $3 AND revoked_ms IS NULL RETURNING id", [now, orgId, keyId]);
39
+ return rows.length > 0;
40
+ }
41
+ /** A new secret with the same name, kind, projects, scopes, and lifetime. The old one keeps working for `graceMs`, so apps can switch. */
42
+ export async function rotateKey(q, orgId, old, by, now, graceMs) {
43
+ const life = old.expiresMs === null ? null : old.expiresMs - old.createdMs;
44
+ const key = await createKey(q, orgId, old.kind, old.name, old.projectIds, by, now, { scopes: old.scopes, expiresMs: life === null ? null : now + life, rotatedFrom: old.id });
45
+ const until = Math.min(old.expiresMs ?? Infinity, now + graceMs);
46
+ await q.query("UPDATE api_keys SET expires_ms = $1 WHERE id = $2", [until, old.id]);
47
+ return { ...key, oldExpiresMs: until };
48
+ }
49
+ /** The key for a secret, when it is valid and not expired. Marks it used (at most once a minute). */
50
+ export async function keyByToken(q, token, now) {
51
+ const [row] = await q.query(`SELECT ${KEY_COLUMNS} FROM api_keys WHERE token_hash = $1 AND revoked_ms IS NULL AND (expires_ms IS NULL OR expires_ms > $2)`, [hashToken(token), now]);
52
+ if (!row)
53
+ return undefined;
54
+ if (!row.lastUsedMs || now - row.lastUsedMs > 60_000)
55
+ await q.query("UPDATE api_keys SET last_used_ms = $1 WHERE id = $2", [now, row.id]);
56
+ return { ...toKey(row), orgId: row.org_id };
57
+ }
58
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/repo/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Queryable } from "../db/db.js";
2
+ /** How long each project keeps log lines, in days: its own log retention, else what the project keeps traces for. */
3
+ export declare const LOG_DAYS_SQL = "COALESCE(p.log_retention_days, LEAST(COALESCE(p.retention_days, o.retention_days), o.retention_days))";
4
+ /** Log retention days per project; projects that no longer exist are left out. */
5
+ export declare function logDaysOf(q: Queryable, projectIds?: readonly string[]): Promise<Map<string, number>>;
6
+ /** Drop log lines past each project's log retention: raw lines, their facts and search rows, and the log rollups. Loose batches go with the traces (pruneByRetention). */
7
+ export declare function pruneLogsByRetention(q: Queryable, now: number): Promise<void>;
8
+ //# sourceMappingURL=log-retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-retention.d.ts","sourceRoot":"","sources":["../../src/repo/log-retention.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,qHAAqH;AACrH,eAAO,MAAM,YAAY,0GAAiD,CAAC;AAE3E,kFAAkF;AAClF,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAI1G;AAED,0KAA0K;AAC1K,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF"}
@@ -0,0 +1,20 @@
1
+ import { logPruneStatements, PG_DIALECT } from "@wizeworks/lens-core";
2
+ import { runStatements } from "../settle.js";
3
+ import { KEEP_DAYS } from "./settings.js";
4
+ const DAY_MS = 86_400_000;
5
+ /** How long each project keeps log lines, in days: its own log retention, else what the project keeps traces for. */
6
+ export const LOG_DAYS_SQL = `COALESCE(p.log_retention_days, ${KEEP_DAYS})`;
7
+ /** Log retention days per project; projects that no longer exist are left out. */
8
+ export async function logDaysOf(q, projectIds) {
9
+ const where = projectIds ? "WHERE p.id = ANY($1)" : "";
10
+ const rows = await q.query(`SELECT p.id, ${LOG_DAYS_SQL} AS d FROM projects p JOIN orgs o ON o.id = p.org_id ${where}`, projectIds ? [[...projectIds]] : []);
11
+ return new Map(rows.map((r) => [r.id, r.d]));
12
+ }
13
+ /** Drop log lines past each project's log retention: raw lines, their facts and search rows, and the log rollups. Loose batches go with the traces (pruneByRetention). */
14
+ export async function pruneLogsByRetention(q, now) {
15
+ for (const [project, days] of await logDaysOf(q)) {
16
+ await q.query("DELETE FROM logs WHERE project_id = $1 AND time_ms < $2", [project, now - days * DAY_MS]);
17
+ await runStatements(q, logPruneStatements(PG_DIALECT, project, now, days * DAY_MS));
18
+ }
19
+ }
20
+ //# sourceMappingURL=log-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-retention.js","sourceRoot":"","sources":["../../src/repo/log-retention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,qHAAqH;AACrH,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,SAAS,GAAG,CAAC;AAE3E,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,UAA8B;IAC1E,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAA4B,gBAAgB,YAAY,wDAAwD,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxL,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,0KAA0K;AAC1K,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,CAAY,EAAE,GAAW;IAClE,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;QACzG,MAAM,aAAa,CAAC,CAAC,EAAE,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtF,CAAC;AACH,CAAC"}
@@ -7,6 +7,8 @@ export interface MetricQuery {
7
7
  }
8
8
  /** The metrics page data for one project, from the metric rollup tiers. `now` is rounded down to 10 s. */
9
9
  export declare function loadMetricData(q: Queryable, m: MetricQuery, range: TimeRange, params: Readonly<Record<string, string>>, now: number): Promise<MetricData>;
10
+ /** Host and Kubernetes series for one project, from the metric rollup tiers. */
11
+ export declare function loadInfraData(q: Queryable, m: MetricQuery, range: TimeRange, params: Readonly<Record<string, string>>, now: number): Promise<MetricData>;
10
12
  /** One metric over an alert rule's window, from the metric rollup tiers. */
11
13
  export declare function loadMetricAlertData(q: Queryable, m: MetricQuery, name: string, w: TimeWindow, now: number): Promise<MetricAlertData>;
12
14
  //# sourceMappingURL=metric-read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metric-read.d.ts","sourceRoot":"","sources":["../../src/repo/metric-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,UAAU,EAKf,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEzJ;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpI"}
1
+ {"version":3,"file":"metric-read.d.ts","sourceRoot":"","sources":["../../src/repo/metric-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAEpB,KAAK,UAAU,EAKf,KAAK,SAAS,EACd,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEzJ;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAExJ;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpI"}
@@ -1,9 +1,13 @@
1
- import { alignNow, metricAlertSteps, metricPageSteps, runMetricAsync, } from "@wizeworks/lens-core";
1
+ import { alignNow, infraSteps, metricAlertSteps, metricPageSteps, runMetricAsync, } from "@wizeworks/lens-core";
2
2
  const run = (q) => (s) => q.query(s.sql, s.args);
3
3
  /** The metrics page data for one project, from the metric rollup tiers. `now` is rounded down to 10 s. */
4
4
  export function loadMetricData(q, m, range, params, now) {
5
5
  return runMetricAsync(metricPageSteps("pg", { project: m.projectId, env: m.env }, range, alignNow(now), params), run(q));
6
6
  }
7
+ /** Host and Kubernetes series for one project, from the metric rollup tiers. */
8
+ export function loadInfraData(q, m, range, params, now) {
9
+ return runMetricAsync(infraSteps("pg", { project: m.projectId, env: m.env }, range, alignNow(now), params), run(q));
10
+ }
7
11
  /** One metric over an alert rule's window, from the metric rollup tiers. */
8
12
  export function loadMetricAlertData(q, m, name, w, now) {
9
13
  return runMetricAsync(metricAlertSteps("pg", { project: m.projectId, env: m.env, service: m.service }, name, w, now), run(q));
@@ -1 +1 @@
1
- {"version":3,"file":"metric-read.js","sourceRoot":"","sources":["../../src/repo/metric-read.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAER,gBAAgB,EAEhB,eAAe,EAGf,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAS9B,MAAM,GAAG,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA0B,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAwB,CAAC;AAEvH,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,CAAY,EAAE,CAAc,EAAE,KAAgB,EAAE,MAAwC,EAAE,GAAW;IAClI,OAAO,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3H,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,CAAY,EAAE,CAAc,EAAE,IAAY,EAAE,CAAa,EAAE,GAAW;IACxG,OAAO,cAAc,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChI,CAAC"}
1
+ {"version":3,"file":"metric-read.js","sourceRoot":"","sources":["../../src/repo/metric-read.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,UAAU,EAEV,gBAAgB,EAEhB,eAAe,EAGf,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAS9B,MAAM,GAAG,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA0B,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAwB,CAAC;AAEvH,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,CAAY,EAAE,CAAc,EAAE,KAAgB,EAAE,MAAwC,EAAE,GAAW;IAClI,OAAO,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3H,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,CAAY,EAAE,CAAc,EAAE,KAAgB,EAAE,MAAwC,EAAE,GAAW;IACjI,OAAO,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,mBAAmB,CAAC,CAAY,EAAE,CAAc,EAAE,IAAY,EAAE,CAAa,EAAE,GAAW;IACxG,OAAO,cAAc,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChI,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"metric-write.d.ts","sourceRoot":"","sources":["../../src/repo/metric-write.ts"],"names":[],"mappings":"AACA,OAAO,EAQL,KAAK,WAAW,EAYjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,wDAAwD;AACxD,eAAO,MAAM,aAAa,UAA6D,CAAC;AAsBxF,+GAA+G;AAC/G,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjJ;AAED,4HAA4H;AAC5H,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF"}
1
+ {"version":3,"file":"metric-write.d.ts","sourceRoot":"","sources":["../../src/repo/metric-write.ts"],"names":[],"mappings":"AACA,OAAO,EAQL,KAAK,WAAW,EAYjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO7C,wDAAwD;AACxD,eAAO,MAAM,aAAa,UAA6D,CAAC;AAsBxF,+GAA+G;AAC/G,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjJ;AAED,4HAA4H;AAC5H,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF"}
@@ -1,5 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { groupMetricSeries, mergeStoredHists, metricBatchWrites, metricHistOfColumns, metricHistStateSql, metricPlaceholderValues, metricSeriesInsertSql, metricSeriesUpsertSql, metricSeriesValues, metricStateOfColumns, tierCutoff, metricStateSql, metricTierUpsertSql, metricTierValues, seriesKeyOf, TIERS, } from "@wizeworks/lens-core";
3
+ import { KEEP_DAYS } from "./settings.js";
3
4
  // Metric rollups at ingest (docs/CONTRACT.md, "Cloud storage"): written with the raw points, in the same transaction.
4
5
  const CHUNK = 200;
5
6
  const sha1 = (text) => createHash("sha1").update(text).digest("hex");
@@ -47,7 +48,7 @@ export async function pruneMetricRollups(q, now) {
47
48
  for (const t of TIERS.filter((x) => x.keepMs !== null))
48
49
  await q.query(`DELETE FROM metric_${t.name} WHERE bucket_ms <= $1`, [tierCutoff(t, now, t.keepMs)]);
49
50
  const scope = "USING projects p, orgs o WHERE p.id = m.project_id AND o.id = p.org_id";
50
- await q.query(`DELETE FROM metric_1h m ${scope} AND m.bucket_ms <= $1 - o.retention_days * 86400000.0`, [now - 3_600_000]);
51
- await q.query(`DELETE FROM metric_series m ${scope} AND m.last_ms < $1 - o.retention_days * 86400000.0`, [now]);
51
+ await q.query(`DELETE FROM metric_1h m ${scope} AND m.bucket_ms <= $1 - ${KEEP_DAYS} * 86400000.0`, [now - 3_600_000]);
52
+ await q.query(`DELETE FROM metric_series m ${scope} AND m.last_ms < $1 - ${KEEP_DAYS} * 86400000.0`, [now]);
52
53
  }
53
54
  //# sourceMappingURL=metric-write.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metric-write.js","sourceRoot":"","sources":["../../src/repo/metric-write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metric-write.js","sourceRoot":"","sources":["../../src/repo/metric-write.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ export interface Org {
5
5
  name: string;
6
6
  slug: string;
7
7
  retentionDays: number;
8
+ /** The plan column; "unlimited" is what applies while billing is off (routes/me.ts). */
9
+ plan: string;
8
10
  }
9
11
  export interface Membership extends Org {
10
12
  role: Role;
@@ -1 +1 @@
1
- {"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/repo/orgs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,GAAG;IACrC,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,MAAM;IACrB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,qDAAqD;AACrD,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1E;AAED,eAAO,MAAM,UAAU,MAAO,SAAS,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CACqE,CAAC;AAEpJ,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG7G;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,eAAO,MAAM,WAAW,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAKvE,CAAC;AAEJ,0FAA0F;AAC1F,eAAO,MAAM,cAAc,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAIjF,CAAC;AAEJ,0IAA0I;AAC1I,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpF"}
1
+ {"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/repo/orgs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,GAAG;IACrC,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,MAAM;IACrB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,qDAAqD;AACrD,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1E;AAED,eAAO,MAAM,UAAU,MAAO,SAAS,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CACqE,CAAC;AAEpJ,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAG7G;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpG;AAED,eAAO,MAAM,WAAW,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CAKvE,CAAC;AAEJ,0FAA0F;AAC1F,eAAO,MAAM,cAAc,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAIjF,CAAC;AAEJ,0IAA0I;AAC1I,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpF"}
package/dist/repo/orgs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { slugOf } from "../auth/crypto.js";
2
2
  import { deleteProjectData } from "./projects.js";
3
- const ORG_COLUMNS = `o.id, o.name, o.slug, o.retention_days AS "retentionDays"`;
3
+ const ORG_COLUMNS = `o.id, o.name, o.slug, o.retention_days AS "retentionDays", o.plan`;
4
4
  const ms = (column) => `(extract(epoch FROM ${column}) * 1000)::double precision`;
5
5
  /** A slug no organization has yet, from the name. */
6
6
  export async function freeSlug(q, name) {
@@ -28,6 +28,10 @@ export async function deleteOrgEverything(q, orgId) {
28
28
  for (const { id } of await q.query("SELECT id FROM projects WHERE org_id = $1", [orgId]))
29
29
  await deleteProjectData(q, id);
30
30
  await q.query("DELETE FROM audit WHERE org_id = $1", [orgId]);
31
+ await q.query("DELETE FROM subscriptions WHERE reference_id = $1", [orgId]);
32
+ // SCIM rows carry the organization as their provisioning domain (auth/scim.ts); group members and grants go with them.
33
+ for (const t of ["scim_groups", "scim_users", "scim_identity_tombstones", "scim_connection_bindings"])
34
+ await q.query(`DELETE FROM ${t} WHERE provisioning_domain_id = $1`, [orgId]);
31
35
  await q.query("DELETE FROM orgs WHERE id = $1", [orgId]);
32
36
  }
33
37
  //# sourceMappingURL=orgs.js.map