@wizeworks/lens-cloud 0.3.0-alpha.3 → 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 (514) hide show
  1. package/README.md +3 -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 +59 -26
  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 +9 -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 +1 -1
  33. package/dist/auth/join-scope.d.ts.map +1 -1
  34. package/dist/auth/join-scope.js +8 -4
  35. package/dist/auth/join-scope.js.map +1 -1
  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/cli-args.d.ts +1 -1
  142. package/dist/cli-args.d.ts.map +1 -1
  143. package/dist/cli-args.js +33 -2
  144. package/dist/cli-args.js.map +1 -1
  145. package/dist/cli.js +6 -0
  146. package/dist/cli.js.map +1 -1
  147. package/dist/config.d.ts +15 -3
  148. package/dist/config.d.ts.map +1 -1
  149. package/dist/config.js +19 -1
  150. package/dist/config.js.map +1 -1
  151. package/dist/db/schema-alerts.d.ts +2 -0
  152. package/dist/db/schema-alerts.d.ts.map +1 -0
  153. package/dist/db/schema-alerts.js +15 -0
  154. package/dist/db/schema-alerts.js.map +1 -0
  155. package/dist/db/schema-billing.d.ts +2 -0
  156. package/dist/db/schema-billing.d.ts.map +1 -0
  157. package/dist/db/schema-billing.js +38 -0
  158. package/dist/db/schema-billing.js.map +1 -0
  159. package/dist/db/schema-issues.d.ts +2 -0
  160. package/dist/db/schema-issues.d.ts.map +1 -0
  161. package/dist/db/schema-issues.js +9 -0
  162. package/dist/db/schema-issues.js.map +1 -0
  163. package/dist/db/schema-logs.d.ts +2 -0
  164. package/dist/db/schema-logs.d.ts.map +1 -0
  165. package/dist/db/schema-logs.js +13 -0
  166. package/dist/db/schema-logs.js.map +1 -0
  167. package/dist/db/schema-oauth.d.ts +2 -0
  168. package/dist/db/schema-oauth.d.ts.map +1 -0
  169. package/dist/db/schema-oauth.js +69 -0
  170. package/dist/db/schema-oauth.js.map +1 -0
  171. package/dist/db/schema-saved-move.d.ts +2 -0
  172. package/dist/db/schema-saved-move.d.ts.map +1 -0
  173. package/dist/db/schema-saved-move.js +13 -0
  174. package/dist/db/schema-saved-move.js.map +1 -0
  175. package/dist/db/schema-saved.d.ts +2 -0
  176. package/dist/db/schema-saved.d.ts.map +1 -0
  177. package/dist/db/schema-saved.js +13 -0
  178. package/dist/db/schema-saved.js.map +1 -0
  179. package/dist/db/schema-scim.d.ts +2 -0
  180. package/dist/db/schema-scim.d.ts.map +1 -0
  181. package/dist/db/schema-scim.js +28 -0
  182. package/dist/db/schema-scim.js.map +1 -0
  183. package/dist/db/schema-slos.d.ts +2 -0
  184. package/dist/db/schema-slos.d.ts.map +1 -0
  185. package/dist/db/schema-slos.js +12 -0
  186. package/dist/db/schema-slos.js.map +1 -0
  187. package/dist/db/schema-sourcemaps.d.ts +2 -0
  188. package/dist/db/schema-sourcemaps.d.ts.map +1 -0
  189. package/dist/db/schema-sourcemaps.js +9 -0
  190. package/dist/db/schema-sourcemaps.js.map +1 -0
  191. package/dist/db/schema-tags.d.ts +2 -0
  192. package/dist/db/schema-tags.d.ts.map +1 -0
  193. package/dist/db/schema-tags.js +12 -0
  194. package/dist/db/schema-tags.js.map +1 -0
  195. package/dist/db/schema-team.d.ts +2 -0
  196. package/dist/db/schema-team.d.ts.map +1 -0
  197. package/dist/db/schema-team.js +15 -0
  198. package/dist/db/schema-team.js.map +1 -0
  199. package/dist/db/schema-uptime.d.ts +2 -0
  200. package/dist/db/schema-uptime.d.ts.map +1 -0
  201. package/dist/db/schema-uptime.js +22 -0
  202. package/dist/db/schema-uptime.js.map +1 -0
  203. package/dist/db/schema.d.ts.map +1 -1
  204. package/dist/db/schema.js +30 -0
  205. package/dist/db/schema.js.map +1 -1
  206. package/dist/http/http.d.ts +5 -1
  207. package/dist/http/http.d.ts.map +1 -1
  208. package/dist/http/http.js +5 -1
  209. package/dist/http/http.js.map +1 -1
  210. package/dist/jobs.d.ts +1 -1
  211. package/dist/jobs.d.ts.map +1 -1
  212. package/dist/jobs.js +15 -2
  213. package/dist/jobs.js.map +1 -1
  214. package/dist/mail/emails-billing.d.ts +17 -0
  215. package/dist/mail/emails-billing.d.ts.map +1 -0
  216. package/dist/mail/emails-billing.js +36 -0
  217. package/dist/mail/emails-billing.js.map +1 -0
  218. package/dist/mail/emails.d.ts +1 -1
  219. package/dist/mail/emails.d.ts.map +1 -1
  220. package/dist/mail/emails.js +7 -4
  221. package/dist/mail/emails.js.map +1 -1
  222. package/dist/mail/mailer.d.ts +1 -1
  223. package/dist/mail/mailer.d.ts.map +1 -1
  224. package/dist/mail/samples.d.ts.map +1 -1
  225. package/dist/mail/samples.js +17 -0
  226. package/dist/mail/samples.js.map +1 -1
  227. package/dist/mail/templates.d.ts +1 -1
  228. package/dist/mail/templates.d.ts.map +1 -1
  229. package/dist/notify/digest-data.d.ts.map +1 -1
  230. package/dist/notify/digest-data.js +2 -2
  231. package/dist/notify/digest-data.js.map +1 -1
  232. package/dist/notify/digest.d.ts.map +1 -1
  233. package/dist/notify/digest.js +4 -1
  234. package/dist/notify/digest.js.map +1 -1
  235. package/dist/notify/team-describe.d.ts.map +1 -1
  236. package/dist/notify/team-describe.js +14 -0
  237. package/dist/notify/team-describe.js.map +1 -1
  238. package/dist/repo/alert-events.d.ts +38 -0
  239. package/dist/repo/alert-events.d.ts.map +1 -0
  240. package/dist/repo/alert-events.js +29 -0
  241. package/dist/repo/alert-events.js.map +1 -0
  242. package/dist/repo/alerts.d.ts +14 -44
  243. package/dist/repo/alerts.d.ts.map +1 -1
  244. package/dist/repo/alerts.js +35 -13
  245. package/dist/repo/alerts.js.map +1 -1
  246. package/dist/repo/audit.d.ts +19 -1
  247. package/dist/repo/audit.d.ts.map +1 -1
  248. package/dist/repo/audit.js +24 -2
  249. package/dist/repo/audit.js.map +1 -1
  250. package/dist/repo/auth-prune.d.ts +1 -1
  251. package/dist/repo/auth-prune.d.ts.map +1 -1
  252. package/dist/repo/auth-prune.js +13 -1
  253. package/dist/repo/auth-prune.js.map +1 -1
  254. package/dist/repo/billing.d.ts +30 -0
  255. package/dist/repo/billing.d.ts.map +1 -0
  256. package/dist/repo/billing.js +47 -0
  257. package/dist/repo/billing.js.map +1 -0
  258. package/dist/repo/grants.d.ts +30 -0
  259. package/dist/repo/grants.d.ts.map +1 -0
  260. package/dist/repo/grants.js +57 -0
  261. package/dist/repo/grants.js.map +1 -0
  262. package/dist/repo/issues.d.ts +15 -0
  263. package/dist/repo/issues.d.ts.map +1 -0
  264. package/dist/repo/issues.js +31 -0
  265. package/dist/repo/issues.js.map +1 -0
  266. package/dist/repo/keys.d.ts +51 -0
  267. package/dist/repo/keys.d.ts.map +1 -0
  268. package/dist/repo/keys.js +58 -0
  269. package/dist/repo/keys.js.map +1 -0
  270. package/dist/repo/log-retention.d.ts +8 -0
  271. package/dist/repo/log-retention.d.ts.map +1 -0
  272. package/dist/repo/log-retention.js +20 -0
  273. package/dist/repo/log-retention.js.map +1 -0
  274. package/dist/repo/metric-read.d.ts +2 -0
  275. package/dist/repo/metric-read.d.ts.map +1 -1
  276. package/dist/repo/metric-read.js +5 -1
  277. package/dist/repo/metric-read.js.map +1 -1
  278. package/dist/repo/metric-write.d.ts.map +1 -1
  279. package/dist/repo/metric-write.js +3 -2
  280. package/dist/repo/metric-write.js.map +1 -1
  281. package/dist/repo/orgs.d.ts +2 -0
  282. package/dist/repo/orgs.d.ts.map +1 -1
  283. package/dist/repo/orgs.js +5 -1
  284. package/dist/repo/orgs.js.map +1 -1
  285. package/dist/repo/project-roles.d.ts +28 -0
  286. package/dist/repo/project-roles.d.ts.map +1 -0
  287. package/dist/repo/project-roles.js +39 -0
  288. package/dist/repo/project-roles.js.map +1 -0
  289. package/dist/repo/projects.d.ts +3 -22
  290. package/dist/repo/projects.d.ts.map +1 -1
  291. package/dist/repo/projects.js +4 -29
  292. package/dist/repo/projects.js.map +1 -1
  293. package/dist/repo/saved.d.ts +9 -0
  294. package/dist/repo/saved.d.ts.map +1 -0
  295. package/dist/repo/saved.js +29 -0
  296. package/dist/repo/saved.js.map +1 -0
  297. package/dist/repo/scim-tokens.d.ts +20 -0
  298. package/dist/repo/scim-tokens.d.ts.map +1 -0
  299. package/dist/repo/scim-tokens.js +32 -0
  300. package/dist/repo/scim-tokens.js.map +1 -0
  301. package/dist/repo/services.d.ts.map +1 -1
  302. package/dist/repo/services.js +2 -1
  303. package/dist/repo/services.js.map +1 -1
  304. package/dist/repo/settings.d.ts +30 -0
  305. package/dist/repo/settings.d.ts.map +1 -0
  306. package/dist/repo/settings.js +55 -0
  307. package/dist/repo/settings.js.map +1 -0
  308. package/dist/repo/slos.d.ts +10 -0
  309. package/dist/repo/slos.d.ts.map +1 -0
  310. package/dist/repo/slos.js +27 -0
  311. package/dist/repo/slos.js.map +1 -0
  312. package/dist/repo/sourcemaps.d.ts +9 -0
  313. package/dist/repo/sourcemaps.d.ts.map +1 -0
  314. package/dist/repo/sourcemaps.js +34 -0
  315. package/dist/repo/sourcemaps.js.map +1 -0
  316. package/dist/repo/tags.d.ts +11 -0
  317. package/dist/repo/tags.d.ts.map +1 -0
  318. package/dist/repo/tags.js +33 -0
  319. package/dist/repo/tags.js.map +1 -0
  320. package/dist/repo/trace-read.d.ts.map +1 -1
  321. package/dist/repo/trace-read.js +3 -1
  322. package/dist/repo/trace-read.js.map +1 -1
  323. package/dist/repo/trace-write.d.ts +1 -1
  324. package/dist/repo/trace-write.d.ts.map +1 -1
  325. package/dist/repo/trace-write.js +11 -5
  326. package/dist/repo/trace-write.js.map +1 -1
  327. package/dist/repo/uptime.d.ts +21 -0
  328. package/dist/repo/uptime.d.ts.map +1 -0
  329. package/dist/repo/uptime.js +53 -0
  330. package/dist/repo/uptime.js.map +1 -0
  331. package/dist/routes/alerts.d.ts.map +1 -1
  332. package/dist/routes/alerts.js +65 -66
  333. package/dist/routes/alerts.js.map +1 -1
  334. package/dist/routes/apps.d.ts +20 -0
  335. package/dist/routes/apps.d.ts.map +1 -0
  336. package/dist/routes/apps.js +53 -0
  337. package/dist/routes/apps.js.map +1 -0
  338. package/dist/routes/billing.d.ts +4 -0
  339. package/dist/routes/billing.d.ts.map +1 -0
  340. package/dist/routes/billing.js +51 -0
  341. package/dist/routes/billing.js.map +1 -0
  342. package/dist/routes/data.d.ts.map +1 -1
  343. package/dist/routes/data.js +16 -7
  344. package/dist/routes/data.js.map +1 -1
  345. package/dist/routes/index.d.ts.map +1 -1
  346. package/dist/routes/index.js +24 -0
  347. package/dist/routes/index.js.map +1 -1
  348. package/dist/routes/ingest.d.ts +3 -1
  349. package/dist/routes/ingest.d.ts.map +1 -1
  350. package/dist/routes/ingest.js +55 -14
  351. package/dist/routes/ingest.js.map +1 -1
  352. package/dist/routes/issues.d.ts +4 -0
  353. package/dist/routes/issues.d.ts.map +1 -0
  354. package/dist/routes/issues.js +34 -0
  355. package/dist/routes/issues.js.map +1 -0
  356. package/dist/routes/keys.d.ts +4 -0
  357. package/dist/routes/keys.d.ts.map +1 -0
  358. package/dist/routes/keys.js +70 -0
  359. package/dist/routes/keys.js.map +1 -0
  360. package/dist/routes/mcp.d.ts.map +1 -1
  361. package/dist/routes/mcp.js +60 -23
  362. package/dist/routes/mcp.js.map +1 -1
  363. package/dist/routes/me.d.ts.map +1 -1
  364. package/dist/routes/me.js +15 -5
  365. package/dist/routes/me.js.map +1 -1
  366. package/dist/routes/metrics.js +1 -1
  367. package/dist/routes/metrics.js.map +1 -1
  368. package/dist/routes/models.d.ts +7 -1
  369. package/dist/routes/models.d.ts.map +1 -1
  370. package/dist/routes/models.js +55 -19
  371. package/dist/routes/models.js.map +1 -1
  372. package/dist/routes/notify.d.ts.map +1 -1
  373. package/dist/routes/notify.js +3 -1
  374. package/dist/routes/notify.js.map +1 -1
  375. package/dist/routes/oauth-meta.d.ts +7 -0
  376. package/dist/routes/oauth-meta.d.ts.map +1 -0
  377. package/dist/routes/oauth-meta.js +52 -0
  378. package/dist/routes/oauth-meta.js.map +1 -0
  379. package/dist/routes/orgs.d.ts.map +1 -1
  380. package/dist/routes/orgs.js +23 -7
  381. package/dist/routes/orgs.js.map +1 -1
  382. package/dist/routes/projects.d.ts.map +1 -1
  383. package/dist/routes/projects.js +31 -22
  384. package/dist/routes/projects.js.map +1 -1
  385. package/dist/routes/saved.d.ts +4 -0
  386. package/dist/routes/saved.d.ts.map +1 -0
  387. package/dist/routes/saved.js +56 -0
  388. package/dist/routes/saved.js.map +1 -0
  389. package/dist/routes/scim.d.ts +4 -0
  390. package/dist/routes/scim.d.ts.map +1 -0
  391. package/dist/routes/scim.js +37 -0
  392. package/dist/routes/scim.js.map +1 -0
  393. package/dist/routes/search.d.ts.map +1 -1
  394. package/dist/routes/search.js +8 -5
  395. package/dist/routes/search.js.map +1 -1
  396. package/dist/routes/settings.d.ts +4 -0
  397. package/dist/routes/settings.d.ts.map +1 -0
  398. package/dist/routes/settings.js +39 -0
  399. package/dist/routes/settings.js.map +1 -0
  400. package/dist/routes/shares.d.ts +3 -0
  401. package/dist/routes/shares.d.ts.map +1 -1
  402. package/dist/routes/shares.js +28 -15
  403. package/dist/routes/shares.js.map +1 -1
  404. package/dist/routes/slos.d.ts +4 -0
  405. package/dist/routes/slos.d.ts.map +1 -0
  406. package/dist/routes/slos.js +76 -0
  407. package/dist/routes/slos.js.map +1 -0
  408. package/dist/routes/sourcemaps.d.ts +9 -0
  409. package/dist/routes/sourcemaps.d.ts.map +1 -0
  410. package/dist/routes/sourcemaps.js +54 -0
  411. package/dist/routes/sourcemaps.js.map +1 -0
  412. package/dist/routes/status.d.ts +4 -0
  413. package/dist/routes/status.d.ts.map +1 -0
  414. package/dist/routes/status.js +60 -0
  415. package/dist/routes/status.js.map +1 -0
  416. package/dist/routes/tags.d.ts +4 -0
  417. package/dist/routes/tags.d.ts.map +1 -0
  418. package/dist/routes/tags.js +81 -0
  419. package/dist/routes/tags.js.map +1 -0
  420. package/dist/routes/uptime.d.ts +4 -0
  421. package/dist/routes/uptime.d.ts.map +1 -0
  422. package/dist/routes/uptime.js +71 -0
  423. package/dist/routes/uptime.js.map +1 -0
  424. package/dist/scale-exec.d.ts +3 -2
  425. package/dist/scale-exec.d.ts.map +1 -1
  426. package/dist/scale-exec.js +5 -4
  427. package/dist/scale-exec.js.map +1 -1
  428. package/dist/server.d.ts.map +1 -1
  429. package/dist/server.js +30 -7
  430. package/dist/server.js.map +1 -1
  431. package/dist/settle.d.ts +6 -3
  432. package/dist/settle.d.ts.map +1 -1
  433. package/dist/settle.js +11 -8
  434. package/dist/settle.js.map +1 -1
  435. package/dist/telemetry/ch/admin.d.ts +8 -4
  436. package/dist/telemetry/ch/admin.d.ts.map +1 -1
  437. package/dist/telemetry/ch/admin.js +33 -16
  438. package/dist/telemetry/ch/admin.js.map +1 -1
  439. package/dist/telemetry/ch/queue.d.ts +6 -4
  440. package/dist/telemetry/ch/queue.d.ts.map +1 -1
  441. package/dist/telemetry/ch/queue.js +13 -9
  442. package/dist/telemetry/ch/queue.js.map +1 -1
  443. package/dist/telemetry/ch/read.d.ts.map +1 -1
  444. package/dist/telemetry/ch/read.js +3 -1
  445. package/dist/telemetry/ch/read.js.map +1 -1
  446. package/dist/telemetry/ch/rebuild.d.ts +23 -0
  447. package/dist/telemetry/ch/rebuild.d.ts.map +1 -0
  448. package/dist/telemetry/ch/rebuild.js +65 -0
  449. package/dist/telemetry/ch/rebuild.js.map +1 -0
  450. package/dist/telemetry/ch/schema-facts.d.ts +1 -1
  451. package/dist/telemetry/ch/schema-facts.d.ts.map +1 -1
  452. package/dist/telemetry/ch/schema-facts.js +8 -2
  453. package/dist/telemetry/ch/schema-facts.js.map +1 -1
  454. package/dist/telemetry/ch/schema-raw.d.ts +2 -0
  455. package/dist/telemetry/ch/schema-raw.d.ts.map +1 -1
  456. package/dist/telemetry/ch/schema-raw.js +2 -0
  457. package/dist/telemetry/ch/schema-raw.js.map +1 -1
  458. package/dist/telemetry/ch/schema.d.ts.map +1 -1
  459. package/dist/telemetry/ch/schema.js +2 -2
  460. package/dist/telemetry/ch/schema.js.map +1 -1
  461. package/dist/telemetry/ch/settle-pool.d.ts +24 -0
  462. package/dist/telemetry/ch/settle-pool.d.ts.map +1 -0
  463. package/dist/telemetry/ch/settle-pool.js +58 -0
  464. package/dist/telemetry/ch/settle-pool.js.map +1 -0
  465. package/dist/telemetry/ch/settle-rows.d.ts +7 -4
  466. package/dist/telemetry/ch/settle-rows.d.ts.map +1 -1
  467. package/dist/telemetry/ch/settle-rows.js +15 -8
  468. package/dist/telemetry/ch/settle-rows.js.map +1 -1
  469. package/dist/telemetry/ch/settle-work.d.ts +21 -0
  470. package/dist/telemetry/ch/settle-work.d.ts.map +1 -0
  471. package/dist/telemetry/ch/settle-work.js +52 -0
  472. package/dist/telemetry/ch/settle-work.js.map +1 -0
  473. package/dist/telemetry/ch/settle-worker.d.ts +2 -0
  474. package/dist/telemetry/ch/settle-worker.d.ts.map +1 -0
  475. package/dist/telemetry/ch/settle-worker.js +10 -0
  476. package/dist/telemetry/ch/settle-worker.js.map +1 -0
  477. package/dist/telemetry/ch/settle.d.ts +17 -3
  478. package/dist/telemetry/ch/settle.d.ts.map +1 -1
  479. package/dist/telemetry/ch/settle.js +15 -56
  480. package/dist/telemetry/ch/settle.js.map +1 -1
  481. package/dist/telemetry/ch/store.d.ts +12 -1
  482. package/dist/telemetry/ch/store.d.ts.map +1 -1
  483. package/dist/telemetry/ch/store.js +37 -8
  484. package/dist/telemetry/ch/store.js.map +1 -1
  485. package/dist/telemetry/ch/util.d.ts +7 -0
  486. package/dist/telemetry/ch/util.d.ts.map +1 -1
  487. package/dist/telemetry/ch/util.js +4 -0
  488. package/dist/telemetry/ch/util.js.map +1 -1
  489. package/dist/telemetry/ch/write.d.ts +2 -1
  490. package/dist/telemetry/ch/write.d.ts.map +1 -1
  491. package/dist/telemetry/ch/write.js +10 -10
  492. package/dist/telemetry/ch/write.js.map +1 -1
  493. package/dist/telemetry/index.d.ts +4 -1
  494. package/dist/telemetry/index.d.ts.map +1 -1
  495. package/dist/telemetry/index.js +8 -3
  496. package/dist/telemetry/index.js.map +1 -1
  497. package/dist/telemetry/pg-store.d.ts.map +1 -1
  498. package/dist/telemetry/pg-store.js +13 -8
  499. package/dist/telemetry/pg-store.js.map +1 -1
  500. package/dist/telemetry/store.d.ts +13 -2
  501. package/dist/telemetry/store.d.ts.map +1 -1
  502. package/dist/uptime/headers.d.ts +6 -0
  503. package/dist/uptime/headers.d.ts.map +1 -0
  504. package/dist/uptime/headers.js +25 -0
  505. package/dist/uptime/headers.js.map +1 -0
  506. package/dist/uptime/run.d.ts +9 -0
  507. package/dist/uptime/run.d.ts.map +1 -0
  508. package/dist/uptime/run.js +40 -0
  509. package/dist/uptime/run.js.map +1 -0
  510. package/package.json +9 -5
  511. package/dist/alerts/notify.d.ts +0 -28
  512. package/dist/alerts/notify.d.ts.map +0 -1
  513. package/dist/alerts/notify.js +0 -52
  514. package/dist/alerts/notify.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-roles.d.ts","sourceRoot":"","sources":["../../src/repo/project-roles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,aAAa,YAAI,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,eAAO,MAAM,aAAa,MAAO,OAAO,KAAG,CAAC,IAAI,WAAwF,CAAC;AAEzI,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,6JAC8H,CAAC;AAE7J,2CAA2C;AAC3C,eAAO,MAAM,WAAW,YAAa,IAAI,KAAG,OAAuD,CAAC;AAEpG,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAG9F;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAGrH;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,cAAc,EAAE,CAIpF,CAAC;AAEJ,0DAA0D;AAC1D,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7H;AAED,gGAAgG;AAChG,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElG;AAED,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;AAED,wDAAwD;AACxD,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAMtG"}
@@ -0,0 +1,39 @@
1
+ export const PROJECT_ROLES = ["none", "viewer", "member", "admin"];
2
+ export const isProjectRole = (v) => typeof v === "string" && PROJECT_ROLES.includes(v);
3
+ /** SQL with `m` (members) and `p` (projects): the member may see the project. */
4
+ export const VISIBLE_TO_MEMBER = "(m.role IN ('owner', 'admin') OR NOT EXISTS (SELECT 1 FROM project_roles pr WHERE pr.project_id = p.id AND pr.user_id = m.user_id AND pr.role = 'none'))";
5
+ /** Org roles a project role can change. */
6
+ export const overridable = (orgRole) => orgRole === "member" || orgRole === "viewer";
7
+ /** The role a person has on a project; null when they may not see it. */
8
+ export function effectiveRole(orgRole, projectRole) {
9
+ if (!projectRole || !overridable(orgRole))
10
+ return orgRole;
11
+ return projectRole === "none" ? null : projectRole;
12
+ }
13
+ export async function projectRoleOf(q, projectId, userId) {
14
+ const [row] = await q.query("SELECT role FROM project_roles WHERE project_id = $1 AND user_id = $2", [projectId, userId]);
15
+ return isProjectRole(row?.role) ? row.role : undefined;
16
+ }
17
+ /** Every project role in an organization. */
18
+ export const listProjectRoles = (q, orgId) => q.query(`SELECT r.project_id AS "projectId", r.user_id AS "userId", r.role FROM project_roles r JOIN projects p ON p.id = r.project_id WHERE p.org_id = $1`, [orgId]);
19
+ /** Set or clear (null) one person's role on a project. */
20
+ export async function setProjectRole(q, projectId, userId, role) {
21
+ if (role)
22
+ await q.query("INSERT INTO project_roles (project_id, user_id, role) VALUES ($1, $2, $3) ON CONFLICT (project_id, user_id) DO UPDATE SET role = $3", [projectId, userId, role]);
23
+ else
24
+ await q.query("DELETE FROM project_roles WHERE project_id = $1 AND user_id = $2", [projectId, userId]);
25
+ }
26
+ /** Drop a person's project roles in an organization: they left, or became an owner or admin. */
27
+ export async function clearProjectRoles(q, orgId, userId) {
28
+ await q.query("DELETE FROM project_roles r USING projects p WHERE p.id = r.project_id AND p.org_id = $1 AND r.user_id = $2", [orgId, userId]);
29
+ }
30
+ /** Drop project roles of people who are no longer members of the organization. */
31
+ export async function pruneProjectRoles(q, orgId) {
32
+ await q.query("DELETE FROM project_roles r USING projects p WHERE p.id = r.project_id AND p.org_id = $1 AND NOT EXISTS (SELECT 1 FROM members m WHERE m.org_id = $1 AND m.user_id = r.user_id)", [orgId]);
33
+ }
34
+ /** Projects of an organization a person may not see. */
35
+ export async function hiddenProjects(q, orgId, userId) {
36
+ const rows = await q.query(`SELECT p.id FROM projects p JOIN members m ON m.org_id = p.org_id AND m.user_id = $2 WHERE p.org_id = $1 AND NOT ${VISIBLE_TO_MEMBER}`, [orgId, userId]);
37
+ return new Set(rows.map((r) => r.id));
38
+ }
39
+ //# sourceMappingURL=project-roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-roles.js","sourceRoot":"","sources":["../../src/repo/project-roles.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAE5E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAU,EAAoB,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAK,aAAmC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEzI,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,0JAA0J,CAAC;AAE7J,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAa,EAAW,EAAE,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,CAAC;AAEpG,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,OAAa,EAAE,WAAoC;IAC/E,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1D,OAAO,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,SAAiB,EAAE,MAAc;IACjF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAmB,uEAAuE,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5I,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAQD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAY,EAAE,KAAa,EAA6B,EAAE,CACzF,CAAC,CAAC,KAAK,CACL,mJAAmJ,EACnJ,CAAC,KAAK,CAAC,CACR,CAAC;AAEJ,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAY,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAwB;IAC5G,IAAI,IAAI;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,qIAAqI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;;QACrL,MAAM,CAAC,CAAC,KAAK,CAAC,kEAAkE,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAY,EAAE,KAAa,EAAE,MAAc;IACjF,MAAM,CAAC,CAAC,KAAK,CAAC,6GAA6G,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAChJ,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAY,EAAE,KAAa;IACjE,MAAM,CAAC,CAAC,KAAK,CACX,iLAAiL,EACjL,CAAC,KAAK,CAAC,CACR,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,CAAY,EAAE,KAAa,EAAE,MAAc;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB,oHAAoH,iBAAiB,EAAE,EACvI,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -4,6 +4,8 @@ export interface Project {
4
4
  orgId: string;
5
5
  name: string;
6
6
  slug: string;
7
+ /** Days log lines are kept, or null for the organization's retention. */
8
+ logRetentionDays: number | null;
7
9
  }
8
10
  export declare function createProject(q: Queryable, orgId: string, name: string, now: number): Promise<Project>;
9
11
  export declare const listProjects: (q: Queryable, orgId: string) => Promise<Project[]>;
@@ -12,26 +14,5 @@ export declare function projectInOrg(q: Queryable, orgId: string, projectId: str
12
14
  export declare function deleteProject(q: Queryable, projectId: string): Promise<void>;
13
15
  /** Delete every trace, span, log, service, metric, and stat of a project. The project and its settings stay. */
14
16
  export declare function deleteProjectData(q: Queryable, projectId: string): Promise<void>;
15
- export type KeyKind = "ingest" | "read";
16
- export interface ApiKey {
17
- id: string;
18
- kind: KeyKind;
19
- name: string;
20
- prefix: string;
21
- /** Ingest keys: exactly one project. Read keys: the projects they may read. */
22
- projectIds: string[];
23
- createdMs: number;
24
- lastUsedMs: number | null;
25
- }
26
- /** A new key. Returns the secret once; only its hash is kept. */
27
- export declare function createKey(q: Queryable, orgId: string, kind: KeyKind, name: string, projectIds: string[], by: string, now: number): Promise<{
28
- id: string;
29
- token: string;
30
- }>;
31
- export declare function listKeys(q: Queryable, orgId: string): Promise<ApiKey[]>;
32
- export declare function revokeKey(q: Queryable, orgId: string, keyId: string, now: number): Promise<boolean>;
33
- /** The key for a secret, when it is valid. Marks it used (at most once a minute). */
34
- export declare function keyByToken(q: Queryable, token: string, now: number): Promise<(ApiKey & {
35
- orgId: string;
36
- }) | undefined>;
17
+ export * from "./keys.js";
37
18
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/repo/projects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5G;AAED,eAAO,MAAM,YAAY,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CACkB,CAAC;AAE/F,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAG/G;AAED,4CAA4C;AAC5C,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlF;AAED,gHAAgH;AAChH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExC,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,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAUD,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;;;GAQtI;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7E;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,qFAAqF;AACrF,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"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/repo/projects.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAID,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5G;AAED,eAAO,MAAM,YAAY,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CACkB,CAAC;AAE/F,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAG/G;AAED,4CAA4C;AAC5C,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlF;AAED,gHAAgH;AAChH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtF;AAED,cAAc,WAAW,CAAC"}
@@ -1,14 +1,14 @@
1
- import { hashToken, newId, newToken, slugOf } from "../auth/crypto.js";
1
+ import { newId, slugOf } from "../auth/crypto.js";
2
2
  import { METRIC_TABLES } from "./metric-write.js";
3
3
  import { STATS_TABLES } from "../settle.js";
4
- const COLUMNS = `id, org_id AS "orgId", name, slug`;
4
+ const COLUMNS = `id, org_id AS "orgId", name, slug, log_retention_days AS "logRetentionDays"`;
5
5
  export async function createProject(q, orgId, name, now) {
6
6
  const base = slugOf(name);
7
7
  const taken = new Set((await q.query("SELECT slug FROM projects WHERE org_id = $1", [orgId])).map((r) => r.slug));
8
8
  let slug = base;
9
9
  for (let i = 2; taken.has(slug); i++)
10
10
  slug = `${base}-${i}`;
11
- const p = { id: newId(), orgId, name: name.trim().slice(0, 100) || slug, slug };
11
+ const p = { id: newId(), orgId, name: name.trim().slice(0, 100) || slug, slug, logRetentionDays: null };
12
12
  await q.query("INSERT INTO projects (id, org_id, name, slug, created_ms) VALUES ($1, $2, $3, $4, $5)", [p.id, orgId, p.name, slug, now]);
13
13
  return p;
14
14
  }
@@ -28,30 +28,5 @@ export async function deleteProjectData(q, projectId) {
28
28
  for (const table of ["spans", "logs", "traces", "services", "metric_points", ...METRIC_TABLES, ...STATS_TABLES])
29
29
  await q.query(`DELETE FROM ${table} WHERE project_id = $1`, [projectId]);
30
30
  }
31
- const KEY_COLUMNS = `id, org_id, kind, name, prefix, project_ids, created_ms AS "createdMs", last_used_ms AS "lastUsedMs"`;
32
- const toKey = ({ project_ids, org_id: _org, ...k }) => ({ ...k, projectIds: JSON.parse(project_ids) });
33
- /** A new key. Returns the secret once; only its hash is kept. */
34
- export async function createKey(q, orgId, kind, name, projectIds, by, now) {
35
- const token = newToken(kind);
36
- const id = newId();
37
- await q.query(`INSERT INTO api_keys (id, org_id, kind, project_ids, name, prefix, token_hash, created_by, created_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [id, orgId, kind, JSON.stringify(projectIds), name.trim().slice(0, 100) || kind, token.slice(0, 12), hashToken(token), by, now]);
38
- return { id, token };
39
- }
40
- export async function listKeys(q, orgId) {
41
- 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]);
42
- return rows.map(toKey);
43
- }
44
- export async function revokeKey(q, orgId, keyId, now) {
45
- 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]);
46
- return rows.length > 0;
47
- }
48
- /** The key for a secret, when it is valid. Marks it used (at most once a minute). */
49
- export async function keyByToken(q, token, now) {
50
- const [row] = await q.query(`SELECT ${KEY_COLUMNS} FROM api_keys WHERE token_hash = $1 AND revoked_ms IS NULL`, [hashToken(token)]);
51
- if (!row)
52
- return undefined;
53
- if (!row.lastUsedMs || now - row.lastUsedMs > 60_000)
54
- await q.query("UPDATE api_keys SET last_used_ms = $1 WHERE id = $2", [now, row.id]);
55
- return { ...toKey(row), orgId: row.org_id };
56
- }
31
+ export * from "./keys.js";
57
32
  //# sourceMappingURL=projects.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/repo/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAS5C,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,KAAa,EAAE,IAAY,EAAE,GAAW;IACxF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAmB,6CAA6C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpI,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;IAChF,MAAM,CAAC,CAAC,KAAK,CAAC,uFAAuF,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzI,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAY,EAAE,KAAa,EAAsB,EAAE,CAC9E,CAAC,CAAC,KAAK,CAAU,UAAU,OAAO,gDAAgD,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAY,EAAE,KAAa,EAAE,SAAiB;IAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAU,UAAU,OAAO,8CAA8C,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1H,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,SAAiB;IACjE,MAAM,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,CAAC,CAAC,KAAK,CAAC,6CAA6C,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAY,EAAE,SAAiB;IACrE,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,wBAAwB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5L,CAAC;AAoBD,MAAM,WAAW,GAAG,sGAAsG,CAAC;AAC3H,MAAM,KAAK,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAa,EAAE,CAAC,CAAC;AAEnI,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,KAAa,EAAE,IAAa,EAAE,IAAY,EAAE,UAAoB,EAAE,EAAU,EAAE,GAAW;IACrI,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,CAAC,CAAC,KAAK,CACX,oJAAoJ,EACpJ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAChI,CAAC;IACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAY,EAAE,KAAa;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAS,UAAU,WAAW,kFAAkF,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACrJ,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,KAAa,EAAE,KAAa,EAAE,GAAW;IACrF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,uGAAuG,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACzJ,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAY,EAAE,KAAa,EAAE,GAAW;IACvE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAS,UAAU,WAAW,6DAA6D,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5I,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,GAAG,GAAG,CAAC,UAAU,GAAG,MAAM;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1I,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/repo/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAW5C,MAAM,OAAO,GAAG,6EAA6E,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,KAAa,EAAE,IAAY,EAAE,GAAW;IACxF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAmB,6CAA6C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpI,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IAC5D,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACxG,MAAM,CAAC,CAAC,KAAK,CAAC,uFAAuF,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzI,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAY,EAAE,KAAa,EAAsB,EAAE,CAC9E,CAAC,CAAC,KAAK,CAAU,UAAU,OAAO,gDAAgD,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,CAAY,EAAE,KAAa,EAAE,SAAiB;IAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAU,UAAU,OAAO,8CAA8C,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1H,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,SAAiB;IACjE,MAAM,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,CAAC,CAAC,KAAK,CAAC,6CAA6C,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,CAAC,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,CAAY,EAAE,SAAiB;IACrE,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,aAAa,EAAE,GAAG,YAAY,CAAC;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,wBAAwB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5L,CAAC;AAED,cAAc,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SavedInput, SavedItem } from "@wizeworks/lens-core";
2
+ import type { Queryable } from "../db/db.js";
3
+ /** Items a viewer sees: their own and the shared ones (`userId` null: shared only, for read keys). */
4
+ export declare function listSaved(q: Queryable, projectId: string, userId: string | null): Promise<SavedItem[]>;
5
+ export declare function savedById(q: Queryable, projectId: string, id: string): Promise<SavedItem | undefined>;
6
+ export declare function createSaved(q: Queryable, projectId: string, ownerId: string, i: SavedInput, now: number): Promise<string>;
7
+ export declare function updateSaved(q: Queryable, id: string, i: SavedInput, now: number): Promise<void>;
8
+ export declare function deleteSaved(q: Queryable, id: string): Promise<void>;
9
+ //# sourceMappingURL=saved.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saved.d.ts","sourceRoot":"","sources":["../../src/repo/saved.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAyB7C,sGAAsG;AACtG,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAG5G;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAG3G;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/H;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErG;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE"}
@@ -0,0 +1,29 @@
1
+ import { newId } from "../auth/crypto.js";
2
+ const SELECT = `SELECT s.id, s.project_id AS "projectId", s.kind, s.name, s.shared, s.body, s.owner_id AS "owner", u.name AS "ownerName",
3
+ s.created_ms AS "createdMs", s.updated_ms AS "updatedMs" FROM saved_items s LEFT JOIN users u ON u.id = s.owner_id`;
4
+ const itemOf = ({ body, ...r }) => {
5
+ const b = JSON.parse(body);
6
+ return { ...r, href: b.href ?? "", panels: b.panels ?? [], chart: b.chart === true, ownerName: r.ownerName ?? "", createdMs: Number(r.createdMs), updatedMs: Number(r.updatedMs) };
7
+ };
8
+ const bodyOf = (i) => JSON.stringify({ href: i.href, panels: i.panels, chart: i.chart });
9
+ /** Items a viewer sees: their own and the shared ones (`userId` null: shared only, for read keys). */
10
+ export async function listSaved(q, projectId, userId) {
11
+ const rows = await q.query(`${SELECT} WHERE s.project_id = $1 AND (s.shared OR s.owner_id = $2) ORDER BY s.created_ms`, [projectId, userId ?? ""]);
12
+ return rows.map(itemOf);
13
+ }
14
+ export async function savedById(q, projectId, id) {
15
+ const [row] = await q.query(`${SELECT} WHERE s.project_id = $1 AND s.id = $2`, [projectId, id]);
16
+ return row && itemOf(row);
17
+ }
18
+ export async function createSaved(q, projectId, ownerId, i, now) {
19
+ const id = newId();
20
+ await q.query("INSERT INTO saved_items (id, project_id, owner_id, kind, name, shared, body, created_ms, updated_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $8)", [id, projectId, ownerId, i.kind, i.name, i.shared, bodyOf(i), now]);
21
+ return id;
22
+ }
23
+ export async function updateSaved(q, id, i, now) {
24
+ await q.query("UPDATE saved_items SET name = $2, shared = $3, body = $4, updated_ms = $5 WHERE id = $1", [id, i.name, i.shared, bodyOf(i), now]);
25
+ }
26
+ export async function deleteSaved(q, id) {
27
+ await q.query("DELETE FROM saved_items WHERE id = $1", [id]);
28
+ }
29
+ //# sourceMappingURL=saved.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saved.js","sourceRoot":"","sources":["../../src/repo/saved.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAgB1C,MAAM,MAAM,GAAG;qHACsG,CAAC;AAEtH,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAO,EAAa,EAAE;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0D,CAAC;IACpF,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AACrL,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAErG,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,SAAiB,EAAE,MAAqB;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CAAM,GAAG,MAAM,kFAAkF,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IACxJ,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY,EAAE,SAAiB,EAAE,EAAU;IACzE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAM,GAAG,MAAM,wCAAwC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACrG,OAAO,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,SAAiB,EAAE,OAAe,EAAE,CAAa,EAAE,GAAW;IAC5G,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,CAAC,CAAC,KAAK,CACX,kJAAkJ,EAClJ,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CACnE,CAAC;IACF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,EAAU,EAAE,CAAa,EAAE,GAAW;IACpF,MAAM,CAAC,CAAC,KAAK,CAAC,yFAAyF,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACnJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,EAAU;IACxD,MAAM,CAAC,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Queryable } from "../db/db.js";
2
+ export interface ScimToken {
3
+ id: string;
4
+ name: string;
5
+ prefix: string;
6
+ createdMs: number;
7
+ lastUsedMs: number | null;
8
+ }
9
+ export declare function createScimToken(q: Queryable, orgId: string, name: string, userId: string, now: number): Promise<{
10
+ token: string;
11
+ item: ScimToken;
12
+ }>;
13
+ export declare const listScimTokens: (q: Queryable, orgId: string) => Promise<ScimToken[]>;
14
+ export declare function revokeScimToken(q: Queryable, orgId: string, id: string, now: number): Promise<boolean>;
15
+ /** The token's organization and id, or undefined. Marks it used at most once a minute. */
16
+ export declare function scimTokenOf(q: Queryable, token: string, now: number): Promise<{
17
+ id: string;
18
+ orgId: string;
19
+ } | undefined>;
20
+ //# sourceMappingURL=scim-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scim-tokens.d.ts","sourceRoot":"","sources":["../../src/repo/scim-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAsB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAazJ;AAED,eAAO,MAAM,cAAc,MAAO,SAAS,SAAS,MAAM,KAAG,OAAO,CAAC,SAAS,EAAE,CACqD,CAAC;AAEtI,wBAAsB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5G;AAED,0FAA0F;AAC1F,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAS9H"}
@@ -0,0 +1,32 @@
1
+ import { hashToken, newId, newToken } from "../auth/crypto.js";
2
+ const COLUMNS = `id, name, prefix, created_ms AS "createdMs", last_used_ms AS "lastUsedMs"`;
3
+ export async function createScimToken(q, orgId, name, userId, now) {
4
+ const token = newToken("scim");
5
+ const item = { id: newId(), name: name.trim().slice(0, 80) || "Identity provider", prefix: token.slice(0, 12), createdMs: now, lastUsedMs: null };
6
+ await q.query("INSERT INTO scim_tokens (id, org_id, name, prefix, token_hash, created_by, created_ms) VALUES ($1, $2, $3, $4, $5, $6, $7)", [
7
+ item.id,
8
+ orgId,
9
+ item.name,
10
+ item.prefix,
11
+ hashToken(token),
12
+ userId,
13
+ now,
14
+ ]);
15
+ return { token, item };
16
+ }
17
+ export const listScimTokens = (q, orgId) => q.query(`SELECT ${COLUMNS} FROM scim_tokens WHERE org_id = $1 AND revoked_ms IS NULL ORDER BY created_ms DESC`, [orgId]);
18
+ export async function revokeScimToken(q, orgId, id, now) {
19
+ return (await q.query("UPDATE scim_tokens SET revoked_ms = $1 WHERE id = $2 AND org_id = $3 AND revoked_ms IS NULL RETURNING id", [now, id, orgId])).length > 0;
20
+ }
21
+ /** The token's organization and id, or undefined. Marks it used at most once a minute. */
22
+ export async function scimTokenOf(q, token, now) {
23
+ if (!token.startsWith("wl_sc_"))
24
+ return undefined;
25
+ const [row] = await q.query("SELECT id, org_id, last_used_ms FROM scim_tokens WHERE token_hash = $1 AND revoked_ms IS NULL", [hashToken(token)]);
26
+ if (!row)
27
+ return undefined;
28
+ if (!row.last_used_ms || now - row.last_used_ms > 60_000)
29
+ await q.query("UPDATE scim_tokens SET last_used_ms = $1 WHERE id = $2", [now, row.id]);
30
+ return { id: row.id, orgId: row.org_id };
31
+ }
32
+ //# sourceMappingURL=scim-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scim-tokens.js","sourceRoot":"","sources":["../../src/repo/scim-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAa/D,MAAM,OAAO,GAAG,2EAA2E,CAAC;AAE5F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,CAAY,EAAE,KAAa,EAAE,IAAY,EAAE,MAAc,EAAE,GAAW;IAC1G,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC7J,MAAM,CAAC,CAAC,KAAK,CAAC,4HAA4H,EAAE;QAC1I,IAAI,CAAC,EAAE;QACP,KAAK;QACL,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,MAAM;QACX,SAAS,CAAC,KAAK,CAAC;QAChB,MAAM;QACN,GAAG;KACJ,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAY,EAAE,KAAa,EAAwB,EAAE,CAClF,CAAC,CAAC,KAAK,CAAY,UAAU,OAAO,qFAAqF,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEtI,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,CAAY,EAAE,KAAa,EAAE,EAAU,EAAE,GAAW;IACxF,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,0GAA0G,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAClK,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAY,EAAE,KAAa,EAAE,GAAW;IACxE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CACzB,+FAA+F,EAC/F,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnB,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC,YAAY,GAAG,MAAM;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,wDAAwD,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACjJ,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AAC3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/repo/services.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,0HAA0H;AAC1H,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AAED,4HAA4H;AAC5H,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASzG"}
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/repo/services.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,0HAA0H;AAC1H,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AAED,4HAA4H;AAC5H,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASzG"}
@@ -1,8 +1,9 @@
1
1
  import { HUB_ONLINE_MS } from "@wizeworks/lens-core";
2
+ import { KEEP_DAYS } from "./settings.js";
2
3
  /** Drop registry rows not heard from within the organization's retention, like the traces they sent. Returns how many. */
3
4
  export async function pruneServices(q, now) {
4
5
  const rows = await q.query(`DELETE FROM services s USING projects p, orgs o WHERE p.id = s.project_id AND o.id = p.org_id
5
- AND s.last_seen < $1 - o.retention_days * 86400000.0 RETURNING s.host`, [now]);
6
+ AND s.last_seen < $1 - ${KEEP_DAYS} * 86400000.0 RETURNING s.host`, [now]);
6
7
  return rows.length;
7
8
  }
8
9
  /** Forget a project's offline hosts (old pods). The newest host of each service stays, so no service drops off the list. */
@@ -1 +1 @@
1
- {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/repo/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,0HAA0H;AAC1H,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,GAAW;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB;2EACuE,EACvE,CAAC,GAAG,CAAC,CACN,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,4HAA4H;AAC5H,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAW;IACtF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB;;;wBAGoB,EACpB,CAAC,SAAS,EAAE,GAAG,GAAG,aAAa,CAAC,CACjC,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/repo/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,0HAA0H;AAC1H,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,CAAY,EAAE,GAAW;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB;8BAC0B,SAAS,gCAAgC,EACnE,CAAC,GAAG,CAAC,CACN,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,4HAA4H;AAC5H,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,CAAY,EAAE,SAAiB,EAAE,GAAW;IACtF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,CACxB;;;wBAGoB,EACpB,CAAC,SAAS,EAAE,GAAG,GAAG,aAAa,CAAC,CACjC,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type FactOptions, type ProjectSettings, type SettingsDefaults } from "@wizeworks/lens-core";
2
+ import type { CloudConfig } from "../config.js";
3
+ import type { Queryable } from "../db/db.js";
4
+ /** Days a project keeps data, in SQL with `p` (projects) and `o` (orgs): its own retention, never past its organization's. */
5
+ export declare const KEEP_DAYS = "LEAST(COALESCE(p.retention_days, o.retention_days), o.retention_days)";
6
+ /** A project's own settings, and how long its organization keeps data. Undefined when the project is gone. */
7
+ export declare function projectSettingsOf(q: Queryable, projectId: string): Promise<{
8
+ settings: ProjectSettings;
9
+ orgDays: number;
10
+ } | undefined>;
11
+ /** Replace a project's own settings. Retention is a column, so prunes can read it in SQL. */
12
+ export declare function saveProjectSettings(q: Queryable, projectId: string, s: ProjectSettings): Promise<void>;
13
+ /** The cloud's own values for a project in an organization that keeps `orgDays`. */
14
+ export declare const cloudDefaults: (config: Pick<CloudConfig, "slowQueryMs" | "nPlusOneThreshold" | "redactKeys">, orgDays: number) => SettingsDefaults;
15
+ /** The fact options a project's traces settle with: the cloud's, then the project's. */
16
+ export declare const factsWith: (config: Pick<CloudConfig, "slowQueryMs" | "nPlusOneThreshold">, s: ProjectSettings | undefined) => Partial<FactOptions>;
17
+ /** The two thresholds in effect for a project, as numbers. */
18
+ export declare function thresholdsOf(config: Pick<CloudConfig, "slowQueryMs" | "nPlusOneThreshold">, s: ProjectSettings | undefined): {
19
+ slowQueryMs: number;
20
+ nPlusOneThreshold: number;
21
+ };
22
+ /** Project settings, read at most once a minute per project in this process; a save here drops the entry at once. */
23
+ export declare class SettingsCache {
24
+ private readonly q;
25
+ private readonly entries;
26
+ constructor(q: Queryable);
27
+ get(projectId: string): Promise<ProjectSettings>;
28
+ drop(projectId: string): void;
29
+ }
30
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/repo/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAiB,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAc,MAAM,sBAAsB,CAAC;AAChI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,8HAA8H;AAC9H,eAAO,MAAM,SAAS,0EAA0E,CAAC;AAQjG,8GAA8G;AAC9G,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAK5I;AAED,6FAA6F;AAC7F,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5G;AAED,oFAAoF;AACpF,eAAO,MAAM,aAAa,WAAY,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,mBAAmB,GAAG,YAAY,CAAC,WAAW,MAAM,KAAG,gBAK7H,CAAC;AAEH,wFAAwF;AACxF,eAAO,MAAM,SAAS,WAAY,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,mBAAmB,CAAC,KAAK,eAAe,GAAG,SAAS,KAAG,OAAO,CAAC,WAAW,CAI5I,CAAC;AAEH,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,mBAAmB,CAAC,EAAE,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAG/K;AAED,qHAAqH;AACrH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,CAAC;IAF9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2D;IAEnF,YAA6B,CAAC,EAAE,SAAS,EAAI;IAEvC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAMrD;IAED,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5B;CACF"}
@@ -0,0 +1,55 @@
1
+ import { factOptionsOf, settingsOf } from "@wizeworks/lens-core";
2
+ const CACHE_MS = 60_000;
3
+ /** Days a project keeps data, in SQL with `p` (projects) and `o` (orgs): its own retention, never past its organization's. */
4
+ export const KEEP_DAYS = "LEAST(COALESCE(p.retention_days, o.retention_days), o.retention_days)";
5
+ /** A project's own settings, and how long its organization keeps data. Undefined when the project is gone. */
6
+ export async function projectSettingsOf(q, projectId) {
7
+ const [row] = await q.query("SELECT p.settings, p.retention_days, o.retention_days AS org_days FROM projects p JOIN orgs o ON o.id = p.org_id WHERE p.id = $1", [projectId]);
8
+ if (!row)
9
+ return undefined;
10
+ const settings = { ...settingsOf(row.settings), ...(row.retention_days ? { retentionDays: row.retention_days } : {}) };
11
+ return { settings, orgDays: row.org_days };
12
+ }
13
+ /** Replace a project's own settings. Retention is a column, so prunes can read it in SQL. */
14
+ export async function saveProjectSettings(q, projectId, s) {
15
+ const { retentionDays, ...rest } = s;
16
+ await q.query("UPDATE projects SET settings = $1, retention_days = $2 WHERE id = $3", [JSON.stringify(rest), retentionDays ?? null, projectId]);
17
+ }
18
+ /** The cloud's own values for a project in an organization that keeps `orgDays`. */
19
+ export const cloudDefaults = (config, orgDays) => ({
20
+ slowQueryMs: config.slowQueryMs,
21
+ nPlusOneThreshold: config.nPlusOneThreshold,
22
+ redactKeys: config.redactKeys,
23
+ retentionDays: orgDays,
24
+ });
25
+ /** The fact options a project's traces settle with: the cloud's, then the project's. */
26
+ export const factsWith = (config, s) => ({
27
+ slowQueryMs: config.slowQueryMs,
28
+ nPlusOneThreshold: config.nPlusOneThreshold,
29
+ ...factOptionsOf(s),
30
+ });
31
+ /** The two thresholds in effect for a project, as numbers. */
32
+ export function thresholdsOf(config, s) {
33
+ const f = factsWith(config, s);
34
+ return { slowQueryMs: f.slowQueryMs, nPlusOneThreshold: f.nPlusOneThreshold };
35
+ }
36
+ /** Project settings, read at most once a minute per project in this process; a save here drops the entry at once. */
37
+ export class SettingsCache {
38
+ q;
39
+ entries = new Map();
40
+ constructor(q) {
41
+ this.q = q;
42
+ }
43
+ async get(projectId) {
44
+ const hit = this.entries.get(projectId);
45
+ if (hit && Date.now() - hit.atMs < CACHE_MS)
46
+ return hit.s;
47
+ const s = (await projectSettingsOf(this.q, projectId))?.settings ?? {};
48
+ this.entries.set(projectId, { s, atMs: Date.now() });
49
+ return s;
50
+ }
51
+ drop(projectId) {
52
+ this.entries.delete(projectId);
53
+ }
54
+ }
55
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/repo/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ApdexTargets, Slo, SloInput } from "@wizeworks/lens-core";
2
+ import type { Queryable } from "../db/db.js";
3
+ export declare const listSlos: (q: Queryable, projectId: string) => Promise<Slo[]>;
4
+ export declare function sloById(q: Queryable, projectId: string, id: string): Promise<Slo | undefined>;
5
+ export declare function createSlo(q: Queryable, projectId: string, s: SloInput, by: string, now: number): Promise<string>;
6
+ export declare function updateSlo(q: Queryable, projectId: string, id: string, s: SloInput): Promise<void>;
7
+ export declare function deleteSlo(q: Queryable, projectId: string, id: string): Promise<boolean>;
8
+ export declare function apdexTargets(q: Queryable, projectId: string): Promise<ApdexTargets>;
9
+ export declare function saveApdexTargets(q: Queryable, projectId: string, t: ApdexTargets): Promise<void>;
10
+ //# sourceMappingURL=slos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slos.d.ts","sourceRoot":"","sources":["../../src/repo/slos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C,eAAO,MAAM,QAAQ,MAAa,SAAS,aAAa,MAAM,KAAG,OAAO,CAAC,GAAG,EAAE,CACyC,CAAC;AAExH,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAGnG;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtH;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvG;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7F;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAGzF;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtG"}
@@ -0,0 +1,27 @@
1
+ import { newId } from "../auth/crypto.js";
2
+ const COLUMNS = `id, project_id AS "projectId", name, service, endpoint, kind, target, threshold_ms AS "thresholdMs", window_days AS "windowDays"`;
3
+ const toSlo = (r) => ({ ...r, target: Number(r.target), thresholdMs: Number(r.thresholdMs), windowDays: Number(r.windowDays) });
4
+ export const listSlos = async (q, projectId) => (await q.query(`SELECT ${COLUMNS} FROM slos WHERE project_id = $1 ORDER BY created_ms`, [projectId])).map(toSlo);
5
+ export async function sloById(q, projectId, id) {
6
+ const [row] = await q.query(`SELECT ${COLUMNS} FROM slos WHERE project_id = $1 AND id = $2`, [projectId, id]);
7
+ return row && toSlo(row);
8
+ }
9
+ export async function createSlo(q, projectId, s, by, now) {
10
+ const id = newId();
11
+ await q.query(`INSERT INTO slos (id, project_id, name, service, endpoint, kind, target, threshold_ms, window_days, created_by, created_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, [id, projectId, s.name, s.service, s.endpoint, s.kind, s.target, s.thresholdMs, s.windowDays, by, now]);
12
+ return id;
13
+ }
14
+ export async function updateSlo(q, projectId, id, s) {
15
+ await q.query(`UPDATE slos SET name = $3, service = $4, endpoint = $5, kind = $6, target = $7, threshold_ms = $8, window_days = $9 WHERE project_id = $1 AND id = $2`, [projectId, id, s.name, s.service, s.endpoint, s.kind, s.target, s.thresholdMs, s.windowDays]);
16
+ }
17
+ export async function deleteSlo(q, projectId, id) {
18
+ return (await q.query("DELETE FROM slos WHERE project_id = $1 AND id = $2 RETURNING id", [projectId, id])).length > 0;
19
+ }
20
+ export async function apdexTargets(q, projectId) {
21
+ const [row] = await q.query("SELECT targets FROM apdex_targets WHERE project_id = $1", [projectId]);
22
+ return row ? JSON.parse(row.targets) : {};
23
+ }
24
+ export async function saveApdexTargets(q, projectId, t) {
25
+ await q.query("INSERT INTO apdex_targets (project_id, targets) VALUES ($1, $2) ON CONFLICT (project_id) DO UPDATE SET targets = $2", [projectId, JSON.stringify(t)]);
26
+ }
27
+ //# sourceMappingURL=slos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slos.js","sourceRoot":"","sources":["../../src/repo/slos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type MapLoader, type SourceMapEntry } from "@wizeworks/lens-core";
2
+ import type { Queryable } from "../db/db.js";
3
+ /** Save one map (replacing the same release and file), then drop the project's oldest releases past the kept count. */
4
+ export declare function saveSourceMap(q: Queryable, projectId: string, release: string, file: string, map: string, now: number): Promise<void>;
5
+ /** A project's maps, newest first; only one release when given. */
6
+ export declare function listSourceMaps(q: Queryable, projectId: string, release?: string): Promise<SourceMapEntry[]>;
7
+ /** One cache of parsed maps for every project. The project rides in the release key, so projects never share a map. */
8
+ export declare function cloudMapLoaders(q: Queryable): (projectId: string) => MapLoader;
9
+ //# sourceMappingURL=sourcemaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcemaps.d.ts","sourceRoot":"","sources":["../../src/repo/sourcemaps.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,SAAS,EAAmF,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1K,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,uHAAuH;AACvH,wBAAsB,aAAa,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3I;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAI3G;AAeD,uHAAuH;AACvH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,CAU9E"}
@@ -0,0 +1,34 @@
1
+ import { gunzipSync, gzipSync } from "node:zlib";
2
+ import { cachedLoader, mapFileCandidates, MAX_SOURCEMAP_BYTES, parseSourceMap, SOURCEMAP_RELEASES_KEPT } from "@wizeworks/lens-core";
3
+ /** Save one map (replacing the same release and file), then drop the project's oldest releases past the kept count. */
4
+ export async function saveSourceMap(q, projectId, release, file, map, now) {
5
+ await q.query(`INSERT INTO sourcemaps (project_id, release, file, map, bytes, uploaded_ms) VALUES ($1, $2, $3, $4, $5, $6)
6
+ ON CONFLICT (project_id, release, file) DO UPDATE SET map = EXCLUDED.map, bytes = EXCLUDED.bytes, uploaded_ms = EXCLUDED.uploaded_ms`, [projectId, release, file, gzipSync(map), Buffer.byteLength(map), now]);
7
+ await q.query(`DELETE FROM sourcemaps WHERE project_id = $1 AND release NOT IN (
8
+ SELECT release FROM sourcemaps WHERE project_id = $1 GROUP BY release ORDER BY max(uploaded_ms) DESC, release DESC LIMIT $2)`, [projectId, SOURCEMAP_RELEASES_KEPT]);
9
+ }
10
+ /** A project's maps, newest first; only one release when given. */
11
+ export function listSourceMaps(q, projectId, release) {
12
+ const sql = `SELECT release, file, bytes, uploaded_ms AS "uploadedMs" FROM sourcemaps WHERE project_id = $1${release ? " AND release = $2" : ""}
13
+ ORDER BY uploaded_ms DESC, file LIMIT 1000`;
14
+ return q.query(sql, release ? [projectId, release] : [projectId]);
15
+ }
16
+ async function readMap(q, projectId, release, url) {
17
+ const files = mapFileCandidates(url);
18
+ if (files.length === 0)
19
+ return null;
20
+ const marks = files.map((_, i) => `$${i + 3}`).join(", ");
21
+ const [row] = await q.query(`SELECT map FROM sourcemaps WHERE project_id = $1 AND release = $2 AND file IN (${marks}) ORDER BY length(file) DESC LIMIT 1`, [projectId, release, ...files]);
22
+ return row ? gunzipSync(row.map, { maxOutputLength: MAX_SOURCEMAP_BYTES }).toString("utf8") : null;
23
+ }
24
+ const SEP = "\n";
25
+ /** One cache of parsed maps for every project. The project rides in the release key, so projects never share a map. */
26
+ export function cloudMapLoaders(q) {
27
+ const shared = cachedLoader(async (url, key) => {
28
+ const [projectId, release] = (key ?? "").split(SEP);
29
+ const text = projectId && release ? await readMap(q, projectId, release, url) : null;
30
+ return text ? parseSourceMap(text) : null;
31
+ }, { max: 30, missMs: 30_000 });
32
+ return (projectId) => (url, release) => (release ? shared(url, `${projectId}${SEP}${release}`) : Promise.resolve(null));
33
+ }
34
+ //# sourceMappingURL=sourcemaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourcemaps.js","sourceRoot":"","sources":["../../src/repo/sourcemaps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type TagInput, type TagRule } from "@wizeworks/lens-core";
2
+ import type { Queryable } from "../db/db.js";
3
+ /** Built-ins first (minus those the project turned off), then its rules by name. */
4
+ export declare function projectTags(q: Queryable, projectId: string): Promise<TagRule[]>;
5
+ export declare function createTag(q: Queryable, projectId: string, input: TagInput, actor: string, now: number): Promise<TagRule>;
6
+ export declare function updateTag(q: Queryable, projectId: string, id: string, input: TagInput, now: number): Promise<void>;
7
+ /** False when the project has no rule with this id. */
8
+ export declare function deleteTag(q: Queryable, projectId: string, id: string): Promise<boolean>;
9
+ /** Turn a built-in on or off for one project; false when `id` is not a built-in. */
10
+ export declare function setBuiltIn(q: Queryable, projectId: string, id: string, enabled: boolean): Promise<boolean>;
11
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/repo/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAW,MAAM,sBAAsB,CAAC;AAE3H,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAW7C,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAKrF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK9H;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxH;AAED,uDAAuD;AACvD,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7F;AAED,oFAAoF;AACpF,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhH"}
@@ -0,0 +1,33 @@
1
+ import { BUILT_IN_PREFIX, isBuiltInName, tagList } from "@wizeworks/lens-core";
2
+ import { newId } from "../auth/crypto.js";
3
+ /** Built-ins first (minus those the project turned off), then its rules by name. */
4
+ export async function projectTags(q, projectId) {
5
+ const rows = await q.query("SELECT id, name, color, query FROM tag_rules WHERE project_id = $1", [projectId]);
6
+ const off = await q.query("SELECT name FROM tag_builtins WHERE project_id = $1 AND NOT enabled", [projectId]);
7
+ const rules = rows.map((r) => ({ id: r.id, name: r.name, color: r.color, query: r.query, builtIn: false, enabled: true }));
8
+ return tagList(rules, new Set(off.map((r) => r.name)));
9
+ }
10
+ export async function createTag(q, projectId, input, actor, now) {
11
+ const id = newId();
12
+ const sql = "INSERT INTO tag_rules (project_id, id, name, color, query, created_by, created_ms, updated_ms) VALUES ($1, $2, $3, $4, $5, $6, $7, $7)";
13
+ await q.query(sql, [projectId, id, input.name, input.color, input.query, actor, now]);
14
+ return { id, ...input, builtIn: false, enabled: true };
15
+ }
16
+ export async function updateTag(q, projectId, id, input, now) {
17
+ const sql = "UPDATE tag_rules SET name = $3, color = $4, query = $5, updated_ms = $6 WHERE project_id = $1 AND id = $2";
18
+ await q.query(sql, [projectId, id, input.name, input.color, input.query, now]);
19
+ }
20
+ /** False when the project has no rule with this id. */
21
+ export async function deleteTag(q, projectId, id) {
22
+ return (await q.query("DELETE FROM tag_rules WHERE project_id = $1 AND id = $2 RETURNING id", [projectId, id])).length > 0;
23
+ }
24
+ /** Turn a built-in on or off for one project; false when `id` is not a built-in. */
25
+ export async function setBuiltIn(q, projectId, id, enabled) {
26
+ const name = id.startsWith(BUILT_IN_PREFIX) ? id.slice(BUILT_IN_PREFIX.length) : "";
27
+ if (!isBuiltInName(name))
28
+ return false;
29
+ const sql = "INSERT INTO tag_builtins (project_id, name, enabled) VALUES ($1, $2, $3) ON CONFLICT (project_id, name) DO UPDATE SET enabled = EXCLUDED.enabled";
30
+ await q.query(sql, [projectId, name, enabled]);
31
+ return true;
32
+ }
33
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/repo/tags.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"trace-read.d.ts","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,UAAU,EAA6B,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACzI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAejF;AAmBD,0CAA0C;AAC1C,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAS1G;AAED,eAAO,MAAM,WAAW,MAAa,SAAS,KAAK,UAAU,KAAG,OAAO,CAAC,KAAK,EAAE,CAAyD,CAAC;AAEzI,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAG3G;AAED,6CAA6C;AAC7C,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1H;AASD,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGtG;AAED,oGAAoG;AACpG,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrH;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3G"}
1
+ {"version":3,"file":"trace-read.d.ts","sourceRoot":"","sources":["../../src/repo/trace-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,UAAU,EAAiD,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7J,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBjF;AAmBD,0CAA0C;AAC1C,wBAAsB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAS1G;AAED,eAAO,MAAM,WAAW,MAAa,SAAS,KAAK,UAAU,KAAG,OAAO,CAAC,KAAK,EAAE,CAAyD,CAAC;AAEzI,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAG3G;AAED,6CAA6C;AAC7C,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1H;AASD,wBAAsB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGtG;AAED,oGAAoG;AACpG,wBAAsB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGrH;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEpF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3G"}