@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.
- package/README.md +3 -0
- package/dist/alerts/evaluate.d.ts +6 -5
- package/dist/alerts/evaluate.d.ts.map +1 -1
- package/dist/alerts/evaluate.js +59 -26
- package/dist/alerts/evaluate.js.map +1 -1
- package/dist/alerts/problem-link.d.ts +12 -0
- package/dist/alerts/problem-link.d.ts.map +1 -0
- package/dist/alerts/problem-link.js +31 -0
- package/dist/alerts/problem-link.js.map +1 -0
- package/dist/app.d.ts +9 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/auth/auth.d.ts +8 -2
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +25 -2
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/billing-hooks.d.ts +9 -0
- package/dist/auth/billing-hooks.d.ts.map +1 -0
- package/dist/auth/billing-hooks.js +49 -0
- package/dist/auth/billing-hooks.js.map +1 -0
- package/dist/auth/bridge.js +2 -2
- package/dist/auth/bridge.js.map +1 -1
- package/dist/auth/crypto.d.ts +2 -0
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +2 -2
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/deps.d.ts +7 -0
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/deps.js.map +1 -1
- package/dist/auth/hooks.d.ts.map +1 -1
- package/dist/auth/hooks.js +8 -1
- package/dist/auth/hooks.js.map +1 -1
- package/dist/auth/join-scope.d.ts +1 -1
- package/dist/auth/join-scope.d.ts.map +1 -1
- package/dist/auth/join-scope.js +8 -4
- package/dist/auth/join-scope.js.map +1 -1
- package/dist/auth/oauth-access.d.ts +8 -0
- package/dist/auth/oauth-access.d.ts.map +1 -0
- package/dist/auth/oauth-access.js +31 -0
- package/dist/auth/oauth-access.js.map +1 -0
- package/dist/auth/oauth-grant.d.ts +5 -0
- package/dist/auth/oauth-grant.d.ts.map +1 -0
- package/dist/auth/oauth-grant.js +79 -0
- package/dist/auth/oauth-grant.js.map +1 -0
- package/dist/auth/oauth-names.d.ts +104 -0
- package/dist/auth/oauth-names.d.ts.map +1 -0
- package/dist/auth/oauth-names.js +72 -0
- package/dist/auth/oauth-names.js.map +1 -0
- package/dist/auth/oauth.d.ts +17 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +47 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/options.d.ts.map +1 -1
- package/dist/auth/options.js +2 -0
- package/dist/auth/options.js.map +1 -1
- package/dist/auth/plugins.d.ts.map +1 -1
- package/dist/auth/plugins.js +15 -1
- package/dist/auth/plugins.js.map +1 -1
- package/dist/auth/principal.d.ts +10 -1
- package/dist/auth/principal.d.ts.map +1 -1
- package/dist/auth/principal.js +8 -7
- package/dist/auth/principal.js.map +1 -1
- package/dist/auth/roles.d.ts +5 -2
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +1 -0
- package/dist/auth/roles.js.map +1 -1
- package/dist/auth/schema-names.d.ts +33 -0
- package/dist/auth/schema-names.d.ts.map +1 -1
- package/dist/auth/schema-names.js +23 -0
- package/dist/auth/schema-names.js.map +1 -1
- package/dist/auth/scim.d.ts +6 -0
- package/dist/auth/scim.d.ts.map +1 -0
- package/dist/auth/scim.js +56 -0
- package/dist/auth/scim.js.map +1 -0
- package/dist/auth/signup.d.ts.map +1 -1
- package/dist/auth/signup.js +5 -2
- package/dist/auth/signup.js.map +1 -1
- package/dist/auth/wire.d.ts +2 -1
- package/dist/auth/wire.d.ts.map +1 -1
- package/dist/auth/wire.js +4 -1
- package/dist/auth/wire.js.map +1 -1
- package/dist/billing/cli.d.ts +6 -0
- package/dist/billing/cli.d.ts.map +1 -0
- package/dist/billing/cli.js +54 -0
- package/dist/billing/cli.js.map +1 -0
- package/dist/billing/gate.d.ts +13 -0
- package/dist/billing/gate.d.ts.map +1 -0
- package/dist/billing/gate.js +27 -0
- package/dist/billing/gate.js.map +1 -0
- package/dist/billing/limits.d.ts +29 -0
- package/dist/billing/limits.d.ts.map +1 -0
- package/dist/billing/limits.js +69 -0
- package/dist/billing/limits.js.map +1 -0
- package/dist/billing/notices.d.ts +4 -0
- package/dist/billing/notices.d.ts.map +1 -0
- package/dist/billing/notices.js +40 -0
- package/dist/billing/notices.js.map +1 -0
- package/dist/billing/options.d.ts +37 -0
- package/dist/billing/options.d.ts.map +1 -0
- package/dist/billing/options.js +33 -0
- package/dist/billing/options.js.map +1 -0
- package/dist/billing/plans.d.ts +50 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +47 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/billing/report.d.ts +26 -0
- package/dist/billing/report.d.ts.map +1 -0
- package/dist/billing/report.js +53 -0
- package/dist/billing/report.js.map +1 -0
- package/dist/billing/service.d.ts +20 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +29 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/billing/stripe-plugin.d.ts +14 -0
- package/dist/billing/stripe-plugin.d.ts.map +1 -0
- package/dist/billing/stripe-plugin.js +39 -0
- package/dist/billing/stripe-plugin.js.map +1 -0
- package/dist/billing/stripe-setup.d.ts +15 -0
- package/dist/billing/stripe-setup.d.ts.map +1 -0
- package/dist/billing/stripe-setup.js +73 -0
- package/dist/billing/stripe-setup.js.map +1 -0
- package/dist/billing/summary.d.ts +59 -0
- package/dist/billing/summary.d.ts.map +1 -0
- package/dist/billing/summary.js +50 -0
- package/dist/billing/summary.js.map +1 -0
- package/dist/billing/sync.d.ts +5 -0
- package/dist/billing/sync.d.ts.map +1 -0
- package/dist/billing/sync.js +35 -0
- package/dist/billing/sync.js.map +1 -0
- package/dist/billing/usage-sub.d.ts +17 -0
- package/dist/billing/usage-sub.d.ts.map +1 -0
- package/dist/billing/usage-sub.js +47 -0
- package/dist/billing/usage-sub.js.map +1 -0
- package/dist/billing/usage.d.ts +28 -0
- package/dist/billing/usage.d.ts.map +1 -0
- package/dist/billing/usage.js +80 -0
- package/dist/billing/usage.js.map +1 -0
- package/dist/billing/webhook.d.ts +6 -0
- package/dist/billing/webhook.d.ts.map +1 -0
- package/dist/billing/webhook.js +41 -0
- package/dist/billing/webhook.js.map +1 -0
- package/dist/cli-args.d.ts +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +33 -2
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -1
- package/dist/config.js.map +1 -1
- package/dist/db/schema-alerts.d.ts +2 -0
- package/dist/db/schema-alerts.d.ts.map +1 -0
- package/dist/db/schema-alerts.js +15 -0
- package/dist/db/schema-alerts.js.map +1 -0
- package/dist/db/schema-billing.d.ts +2 -0
- package/dist/db/schema-billing.d.ts.map +1 -0
- package/dist/db/schema-billing.js +38 -0
- package/dist/db/schema-billing.js.map +1 -0
- package/dist/db/schema-issues.d.ts +2 -0
- package/dist/db/schema-issues.d.ts.map +1 -0
- package/dist/db/schema-issues.js +9 -0
- package/dist/db/schema-issues.js.map +1 -0
- package/dist/db/schema-logs.d.ts +2 -0
- package/dist/db/schema-logs.d.ts.map +1 -0
- package/dist/db/schema-logs.js +13 -0
- package/dist/db/schema-logs.js.map +1 -0
- package/dist/db/schema-oauth.d.ts +2 -0
- package/dist/db/schema-oauth.d.ts.map +1 -0
- package/dist/db/schema-oauth.js +69 -0
- package/dist/db/schema-oauth.js.map +1 -0
- package/dist/db/schema-saved-move.d.ts +2 -0
- package/dist/db/schema-saved-move.d.ts.map +1 -0
- package/dist/db/schema-saved-move.js +13 -0
- package/dist/db/schema-saved-move.js.map +1 -0
- package/dist/db/schema-saved.d.ts +2 -0
- package/dist/db/schema-saved.d.ts.map +1 -0
- package/dist/db/schema-saved.js +13 -0
- package/dist/db/schema-saved.js.map +1 -0
- package/dist/db/schema-scim.d.ts +2 -0
- package/dist/db/schema-scim.d.ts.map +1 -0
- package/dist/db/schema-scim.js +28 -0
- package/dist/db/schema-scim.js.map +1 -0
- package/dist/db/schema-slos.d.ts +2 -0
- package/dist/db/schema-slos.d.ts.map +1 -0
- package/dist/db/schema-slos.js +12 -0
- package/dist/db/schema-slos.js.map +1 -0
- package/dist/db/schema-sourcemaps.d.ts +2 -0
- package/dist/db/schema-sourcemaps.d.ts.map +1 -0
- package/dist/db/schema-sourcemaps.js +9 -0
- package/dist/db/schema-sourcemaps.js.map +1 -0
- package/dist/db/schema-tags.d.ts +2 -0
- package/dist/db/schema-tags.d.ts.map +1 -0
- package/dist/db/schema-tags.js +12 -0
- package/dist/db/schema-tags.js.map +1 -0
- package/dist/db/schema-team.d.ts +2 -0
- package/dist/db/schema-team.d.ts.map +1 -0
- package/dist/db/schema-team.js +15 -0
- package/dist/db/schema-team.js.map +1 -0
- package/dist/db/schema-uptime.d.ts +2 -0
- package/dist/db/schema-uptime.d.ts.map +1 -0
- package/dist/db/schema-uptime.js +22 -0
- package/dist/db/schema-uptime.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +30 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/http/http.d.ts +5 -1
- package/dist/http/http.d.ts.map +1 -1
- package/dist/http/http.js +5 -1
- package/dist/http/http.js.map +1 -1
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +15 -2
- package/dist/jobs.js.map +1 -1
- package/dist/mail/emails-billing.d.ts +17 -0
- package/dist/mail/emails-billing.d.ts.map +1 -0
- package/dist/mail/emails-billing.js +36 -0
- package/dist/mail/emails-billing.js.map +1 -0
- package/dist/mail/emails.d.ts +1 -1
- package/dist/mail/emails.d.ts.map +1 -1
- package/dist/mail/emails.js +7 -4
- package/dist/mail/emails.js.map +1 -1
- package/dist/mail/mailer.d.ts +1 -1
- package/dist/mail/mailer.d.ts.map +1 -1
- package/dist/mail/samples.d.ts.map +1 -1
- package/dist/mail/samples.js +17 -0
- package/dist/mail/samples.js.map +1 -1
- package/dist/mail/templates.d.ts +1 -1
- package/dist/mail/templates.d.ts.map +1 -1
- package/dist/notify/digest-data.d.ts.map +1 -1
- package/dist/notify/digest-data.js +2 -2
- package/dist/notify/digest-data.js.map +1 -1
- package/dist/notify/digest.d.ts.map +1 -1
- package/dist/notify/digest.js +4 -1
- package/dist/notify/digest.js.map +1 -1
- package/dist/notify/team-describe.d.ts.map +1 -1
- package/dist/notify/team-describe.js +14 -0
- package/dist/notify/team-describe.js.map +1 -1
- package/dist/repo/alert-events.d.ts +38 -0
- package/dist/repo/alert-events.d.ts.map +1 -0
- package/dist/repo/alert-events.js +29 -0
- package/dist/repo/alert-events.js.map +1 -0
- package/dist/repo/alerts.d.ts +14 -44
- package/dist/repo/alerts.d.ts.map +1 -1
- package/dist/repo/alerts.js +35 -13
- package/dist/repo/alerts.js.map +1 -1
- package/dist/repo/audit.d.ts +19 -1
- package/dist/repo/audit.d.ts.map +1 -1
- package/dist/repo/audit.js +24 -2
- package/dist/repo/audit.js.map +1 -1
- package/dist/repo/auth-prune.d.ts +1 -1
- package/dist/repo/auth-prune.d.ts.map +1 -1
- package/dist/repo/auth-prune.js +13 -1
- package/dist/repo/auth-prune.js.map +1 -1
- package/dist/repo/billing.d.ts +30 -0
- package/dist/repo/billing.d.ts.map +1 -0
- package/dist/repo/billing.js +47 -0
- package/dist/repo/billing.js.map +1 -0
- package/dist/repo/grants.d.ts +30 -0
- package/dist/repo/grants.d.ts.map +1 -0
- package/dist/repo/grants.js +57 -0
- package/dist/repo/grants.js.map +1 -0
- package/dist/repo/issues.d.ts +15 -0
- package/dist/repo/issues.d.ts.map +1 -0
- package/dist/repo/issues.js +31 -0
- package/dist/repo/issues.js.map +1 -0
- package/dist/repo/keys.d.ts +51 -0
- package/dist/repo/keys.d.ts.map +1 -0
- package/dist/repo/keys.js +58 -0
- package/dist/repo/keys.js.map +1 -0
- package/dist/repo/log-retention.d.ts +8 -0
- package/dist/repo/log-retention.d.ts.map +1 -0
- package/dist/repo/log-retention.js +20 -0
- package/dist/repo/log-retention.js.map +1 -0
- package/dist/repo/metric-read.d.ts +2 -0
- package/dist/repo/metric-read.d.ts.map +1 -1
- package/dist/repo/metric-read.js +5 -1
- package/dist/repo/metric-read.js.map +1 -1
- package/dist/repo/metric-write.d.ts.map +1 -1
- package/dist/repo/metric-write.js +3 -2
- package/dist/repo/metric-write.js.map +1 -1
- package/dist/repo/orgs.d.ts +2 -0
- package/dist/repo/orgs.d.ts.map +1 -1
- package/dist/repo/orgs.js +5 -1
- package/dist/repo/orgs.js.map +1 -1
- package/dist/repo/project-roles.d.ts +28 -0
- package/dist/repo/project-roles.d.ts.map +1 -0
- package/dist/repo/project-roles.js +39 -0
- package/dist/repo/project-roles.js.map +1 -0
- package/dist/repo/projects.d.ts +3 -22
- package/dist/repo/projects.d.ts.map +1 -1
- package/dist/repo/projects.js +4 -29
- package/dist/repo/projects.js.map +1 -1
- package/dist/repo/saved.d.ts +9 -0
- package/dist/repo/saved.d.ts.map +1 -0
- package/dist/repo/saved.js +29 -0
- package/dist/repo/saved.js.map +1 -0
- package/dist/repo/scim-tokens.d.ts +20 -0
- package/dist/repo/scim-tokens.d.ts.map +1 -0
- package/dist/repo/scim-tokens.js +32 -0
- package/dist/repo/scim-tokens.js.map +1 -0
- package/dist/repo/services.d.ts.map +1 -1
- package/dist/repo/services.js +2 -1
- package/dist/repo/services.js.map +1 -1
- package/dist/repo/settings.d.ts +30 -0
- package/dist/repo/settings.d.ts.map +1 -0
- package/dist/repo/settings.js +55 -0
- package/dist/repo/settings.js.map +1 -0
- package/dist/repo/slos.d.ts +10 -0
- package/dist/repo/slos.d.ts.map +1 -0
- package/dist/repo/slos.js +27 -0
- package/dist/repo/slos.js.map +1 -0
- package/dist/repo/sourcemaps.d.ts +9 -0
- package/dist/repo/sourcemaps.d.ts.map +1 -0
- package/dist/repo/sourcemaps.js +34 -0
- package/dist/repo/sourcemaps.js.map +1 -0
- package/dist/repo/tags.d.ts +11 -0
- package/dist/repo/tags.d.ts.map +1 -0
- package/dist/repo/tags.js +33 -0
- package/dist/repo/tags.js.map +1 -0
- package/dist/repo/trace-read.d.ts.map +1 -1
- package/dist/repo/trace-read.js +3 -1
- package/dist/repo/trace-read.js.map +1 -1
- package/dist/repo/trace-write.d.ts +1 -1
- package/dist/repo/trace-write.d.ts.map +1 -1
- package/dist/repo/trace-write.js +11 -5
- package/dist/repo/trace-write.js.map +1 -1
- package/dist/repo/uptime.d.ts +21 -0
- package/dist/repo/uptime.d.ts.map +1 -0
- package/dist/repo/uptime.js +53 -0
- package/dist/repo/uptime.js.map +1 -0
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +65 -66
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/apps.d.ts +20 -0
- package/dist/routes/apps.d.ts.map +1 -0
- package/dist/routes/apps.js +53 -0
- package/dist/routes/apps.js.map +1 -0
- package/dist/routes/billing.d.ts +4 -0
- package/dist/routes/billing.d.ts.map +1 -0
- package/dist/routes/billing.js +51 -0
- package/dist/routes/billing.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +16 -7
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +24 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/ingest.d.ts +3 -1
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +55 -14
- package/dist/routes/ingest.js.map +1 -1
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +34 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/keys.d.ts +4 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +70 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +60 -23
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/me.d.ts.map +1 -1
- package/dist/routes/me.js +15 -5
- package/dist/routes/me.js.map +1 -1
- package/dist/routes/metrics.js +1 -1
- package/dist/routes/metrics.js.map +1 -1
- package/dist/routes/models.d.ts +7 -1
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +55 -19
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/notify.d.ts.map +1 -1
- package/dist/routes/notify.js +3 -1
- package/dist/routes/notify.js.map +1 -1
- package/dist/routes/oauth-meta.d.ts +7 -0
- package/dist/routes/oauth-meta.d.ts.map +1 -0
- package/dist/routes/oauth-meta.js +52 -0
- package/dist/routes/oauth-meta.js.map +1 -0
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +23 -7
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +31 -22
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/saved.d.ts +4 -0
- package/dist/routes/saved.d.ts.map +1 -0
- package/dist/routes/saved.js +56 -0
- package/dist/routes/saved.js.map +1 -0
- package/dist/routes/scim.d.ts +4 -0
- package/dist/routes/scim.d.ts.map +1 -0
- package/dist/routes/scim.js +37 -0
- package/dist/routes/scim.js.map +1 -0
- package/dist/routes/search.d.ts.map +1 -1
- package/dist/routes/search.js +8 -5
- package/dist/routes/search.js.map +1 -1
- package/dist/routes/settings.d.ts +4 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +39 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/shares.d.ts +3 -0
- package/dist/routes/shares.d.ts.map +1 -1
- package/dist/routes/shares.js +28 -15
- package/dist/routes/shares.js.map +1 -1
- package/dist/routes/slos.d.ts +4 -0
- package/dist/routes/slos.d.ts.map +1 -0
- package/dist/routes/slos.js +76 -0
- package/dist/routes/slos.js.map +1 -0
- package/dist/routes/sourcemaps.d.ts +9 -0
- package/dist/routes/sourcemaps.d.ts.map +1 -0
- package/dist/routes/sourcemaps.js +54 -0
- package/dist/routes/sourcemaps.js.map +1 -0
- package/dist/routes/status.d.ts +4 -0
- package/dist/routes/status.d.ts.map +1 -0
- package/dist/routes/status.js +60 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/tags.d.ts +4 -0
- package/dist/routes/tags.d.ts.map +1 -0
- package/dist/routes/tags.js +81 -0
- package/dist/routes/tags.js.map +1 -0
- package/dist/routes/uptime.d.ts +4 -0
- package/dist/routes/uptime.d.ts.map +1 -0
- package/dist/routes/uptime.js +71 -0
- package/dist/routes/uptime.js.map +1 -0
- package/dist/scale-exec.d.ts +3 -2
- package/dist/scale-exec.d.ts.map +1 -1
- package/dist/scale-exec.js +5 -4
- package/dist/scale-exec.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +30 -7
- package/dist/server.js.map +1 -1
- package/dist/settle.d.ts +6 -3
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +11 -8
- package/dist/settle.js.map +1 -1
- package/dist/telemetry/ch/admin.d.ts +8 -4
- package/dist/telemetry/ch/admin.d.ts.map +1 -1
- package/dist/telemetry/ch/admin.js +33 -16
- package/dist/telemetry/ch/admin.js.map +1 -1
- package/dist/telemetry/ch/queue.d.ts +6 -4
- package/dist/telemetry/ch/queue.d.ts.map +1 -1
- package/dist/telemetry/ch/queue.js +13 -9
- package/dist/telemetry/ch/queue.js.map +1 -1
- package/dist/telemetry/ch/read.d.ts.map +1 -1
- package/dist/telemetry/ch/read.js +3 -1
- package/dist/telemetry/ch/read.js.map +1 -1
- package/dist/telemetry/ch/rebuild.d.ts +23 -0
- package/dist/telemetry/ch/rebuild.d.ts.map +1 -0
- package/dist/telemetry/ch/rebuild.js +65 -0
- package/dist/telemetry/ch/rebuild.js.map +1 -0
- package/dist/telemetry/ch/schema-facts.d.ts +1 -1
- package/dist/telemetry/ch/schema-facts.d.ts.map +1 -1
- package/dist/telemetry/ch/schema-facts.js +8 -2
- package/dist/telemetry/ch/schema-facts.js.map +1 -1
- package/dist/telemetry/ch/schema-raw.d.ts +2 -0
- package/dist/telemetry/ch/schema-raw.d.ts.map +1 -1
- package/dist/telemetry/ch/schema-raw.js +2 -0
- package/dist/telemetry/ch/schema-raw.js.map +1 -1
- package/dist/telemetry/ch/schema.d.ts.map +1 -1
- package/dist/telemetry/ch/schema.js +2 -2
- package/dist/telemetry/ch/schema.js.map +1 -1
- package/dist/telemetry/ch/settle-pool.d.ts +24 -0
- package/dist/telemetry/ch/settle-pool.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-pool.js +58 -0
- package/dist/telemetry/ch/settle-pool.js.map +1 -0
- package/dist/telemetry/ch/settle-rows.d.ts +7 -4
- package/dist/telemetry/ch/settle-rows.d.ts.map +1 -1
- package/dist/telemetry/ch/settle-rows.js +15 -8
- package/dist/telemetry/ch/settle-rows.js.map +1 -1
- package/dist/telemetry/ch/settle-work.d.ts +21 -0
- package/dist/telemetry/ch/settle-work.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-work.js +52 -0
- package/dist/telemetry/ch/settle-work.js.map +1 -0
- package/dist/telemetry/ch/settle-worker.d.ts +2 -0
- package/dist/telemetry/ch/settle-worker.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-worker.js +10 -0
- package/dist/telemetry/ch/settle-worker.js.map +1 -0
- package/dist/telemetry/ch/settle.d.ts +17 -3
- package/dist/telemetry/ch/settle.d.ts.map +1 -1
- package/dist/telemetry/ch/settle.js +15 -56
- package/dist/telemetry/ch/settle.js.map +1 -1
- package/dist/telemetry/ch/store.d.ts +12 -1
- package/dist/telemetry/ch/store.d.ts.map +1 -1
- package/dist/telemetry/ch/store.js +37 -8
- package/dist/telemetry/ch/store.js.map +1 -1
- package/dist/telemetry/ch/util.d.ts +7 -0
- package/dist/telemetry/ch/util.d.ts.map +1 -1
- package/dist/telemetry/ch/util.js +4 -0
- package/dist/telemetry/ch/util.js.map +1 -1
- package/dist/telemetry/ch/write.d.ts +2 -1
- package/dist/telemetry/ch/write.d.ts.map +1 -1
- package/dist/telemetry/ch/write.js +10 -10
- package/dist/telemetry/ch/write.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +8 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/pg-store.d.ts.map +1 -1
- package/dist/telemetry/pg-store.js +13 -8
- package/dist/telemetry/pg-store.js.map +1 -1
- package/dist/telemetry/store.d.ts +13 -2
- package/dist/telemetry/store.d.ts.map +1 -1
- package/dist/uptime/headers.d.ts +6 -0
- package/dist/uptime/headers.d.ts.map +1 -0
- package/dist/uptime/headers.js +25 -0
- package/dist/uptime/headers.js.map +1 -0
- package/dist/uptime/run.d.ts +9 -0
- package/dist/uptime/run.d.ts.map +1 -0
- package/dist/uptime/run.js +40 -0
- package/dist/uptime/run.js.map +1 -0
- package/package.json +9 -5
- package/dist/alerts/notify.d.ts +0 -28
- package/dist/alerts/notify.d.ts.map +0 -1
- package/dist/alerts/notify.js +0 -52
- package/dist/alerts/notify.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-plugin.js","sourceRoot":"","sources":["../../src/billing/stripe-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAY7C,kFAAkF;AAClF,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,MAAc,EAAE,KAAa;IAClE,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAe,EAAE,EAAE,CAAC;IACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC,UAAU,EAAE;IAC7E,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,EAAE,qBAAqB,EAAE,CAAC,CAAC,cAAc,EAAE;CAC1F,CAAC;AAEF,+HAA+H;AAC/H,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,CAAa;IACxD,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,YAAY,EAA6C,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACrH,OAAO,MAAM,CAAC;QACZ,YAAY,EAAE,CAAC,CAAC,MAAM;QACtB,mBAAmB,EAAE,CAAC,CAAC,aAAa;QACpC,sBAAsB,EAAE,KAAK;QAC7B,MAAM,EAAE,YAAY;QACpB,YAAY,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;SAC/H;QACD,YAAY,EAAE;YACZ,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACxB,wBAAwB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YAC1C,kBAAkB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;YACxF,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,0BAA0B,EAAE,MAAM,EAAE,EAAE,CAAC;YACjH,sBAAsB,EAAE,IAAI;YAC5B,qBAAqB,EAAE,IAAI;YAC3B,oBAAoB,EAAE,IAAI;YAC1B,qBAAqB,EAAE,IAAI;SAC5B;KACF,CAAgC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Stripe } from "stripe";
|
|
2
|
+
import type { StripeClient, StripePrices } from "./options.js";
|
|
3
|
+
export declare const METER_EVENT = "wizelens_gb";
|
|
4
|
+
export declare const WEBHOOK_EVENTS: Stripe.WebhookEndpointCreateParams.EnabledEvent[];
|
|
5
|
+
export interface SetupResult {
|
|
6
|
+
prices: StripePrices;
|
|
7
|
+
/** Made by this run: products, prices, the meter, the webhook. */
|
|
8
|
+
made: string[];
|
|
9
|
+
webhookUrl?: string;
|
|
10
|
+
/** Only when this run made the webhook: Stripe shows the secret once. */
|
|
11
|
+
webhookSecret?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Make (or find) everything, and return the ids to deploy with. `publicUrl` also makes the webhook. */
|
|
14
|
+
export declare function stripeSetup(client: StripeClient, publicUrl?: string): Promise<SetupResult>;
|
|
15
|
+
//# sourceMappingURL=stripe-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-setup.d.ts","sourceRoot":"","sources":["../../src/billing/stripe-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAK/D,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,2BAA2B,CAAC,YAAY,EAAsI,CAAC;AASnN,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAwCD,wGAAwG;AACxG,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBhG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { OVERAGE_TIERS, PLANS } from "./plans.js";
|
|
2
|
+
// `wizelens-cloud stripe-setup`: products, prices, meter, and webhook, made once; reruns reuse them (lookup key, event name, URL).
|
|
3
|
+
export const METER_EVENT = "wizelens_gb";
|
|
4
|
+
export const WEBHOOK_EVENTS = ["checkout.session.completed", "customer.subscription.created", "customer.subscription.updated", "customer.subscription.deleted"];
|
|
5
|
+
const LOOKUP = {
|
|
6
|
+
teamMonthly: "wizelens_team_monthly",
|
|
7
|
+
teamAnnual: "wizelens_team_annual",
|
|
8
|
+
businessMonthly: "wizelens_business_monthly",
|
|
9
|
+
businessAnnual: "wizelens_business_annual",
|
|
10
|
+
overage: "wizelens_gb_overage",
|
|
11
|
+
};
|
|
12
|
+
async function meterOf(client, made) {
|
|
13
|
+
for await (const m of client.billing.meters.list({ status: "active", limit: 100 }))
|
|
14
|
+
if (m.event_name === METER_EVENT)
|
|
15
|
+
return m;
|
|
16
|
+
made.push(`meter ${METER_EVENT}`);
|
|
17
|
+
return client.billing.meters.create({
|
|
18
|
+
display_name: "WizeLens extra data (GB)",
|
|
19
|
+
event_name: METER_EVENT,
|
|
20
|
+
default_aggregation: { formula: "sum" },
|
|
21
|
+
customer_mapping: { type: "by_id", event_payload_key: "stripe_customer_id" },
|
|
22
|
+
value_settings: { event_payload_key: "value" },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function productOf(client, key, name, made) {
|
|
26
|
+
const found = await client.products.search({ query: `metadata['wizelens']:'${key}' AND active:'true'` });
|
|
27
|
+
if (found.data[0])
|
|
28
|
+
return found.data[0].id;
|
|
29
|
+
made.push(`product ${name}`);
|
|
30
|
+
return (await client.products.create({ name, metadata: { wizelens: key } })).id;
|
|
31
|
+
}
|
|
32
|
+
/** The price for each lookup key: the one that exists, or a new one. */
|
|
33
|
+
function priceParams(meterId, products) {
|
|
34
|
+
const flat = (product, usd, interval) => ({ product, currency: "usd", unit_amount: Math.round(usd * 100), recurring: { interval } });
|
|
35
|
+
const tiers = OVERAGE_TIERS.map((t) => ({ up_to: t.upToGb ?? "inf", unit_amount: t.centsPerGb }));
|
|
36
|
+
return {
|
|
37
|
+
teamMonthly: flat(products.team, PLANS.team.monthlyUsd, "month"),
|
|
38
|
+
teamAnnual: flat(products.team, PLANS.team.annualUsd, "year"),
|
|
39
|
+
businessMonthly: flat(products.business, PLANS.business.monthlyUsd, "month"),
|
|
40
|
+
businessAnnual: flat(products.business, PLANS.business.annualUsd, "year"),
|
|
41
|
+
overage: { product: products.data, currency: "usd", billing_scheme: "tiered", tiers_mode: "graduated", tiers, recurring: { interval: "month", usage_type: "metered", meter: meterId } },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function webhookOf(client, url, made) {
|
|
45
|
+
for await (const w of client.webhookEndpoints.list({ limit: 100 }))
|
|
46
|
+
if (w.url === url)
|
|
47
|
+
return undefined;
|
|
48
|
+
made.push(`webhook ${url}`);
|
|
49
|
+
return (await client.webhookEndpoints.create({ url, enabled_events: WEBHOOK_EVENTS, description: "WizeLens Cloud billing" })).secret;
|
|
50
|
+
}
|
|
51
|
+
/** Make (or find) everything, and return the ids to deploy with. `publicUrl` also makes the webhook. */
|
|
52
|
+
export async function stripeSetup(client, publicUrl) {
|
|
53
|
+
const made = [];
|
|
54
|
+
const meter = await meterOf(client, made);
|
|
55
|
+
const products = {
|
|
56
|
+
team: await productOf(client, "team", "WizeLens Team", made),
|
|
57
|
+
business: await productOf(client, "business", "WizeLens Business", made),
|
|
58
|
+
data: await productOf(client, "data", "WizeLens extra data", made),
|
|
59
|
+
};
|
|
60
|
+
const existing = await client.prices.list({ lookup_keys: Object.values(LOOKUP), active: true, limit: 100 });
|
|
61
|
+
const params = priceParams(meter.id, products);
|
|
62
|
+
const ids = {};
|
|
63
|
+
for (const [k, lookup] of Object.entries(LOOKUP)) {
|
|
64
|
+
const hit = existing.data.find((p) => p.lookup_key === lookup);
|
|
65
|
+
if (!hit)
|
|
66
|
+
made.push(`price ${lookup}`);
|
|
67
|
+
ids[k] = hit?.id ?? (await client.prices.create({ ...params[k], lookup_key: lookup })).id;
|
|
68
|
+
}
|
|
69
|
+
const webhookUrl = publicUrl ? `${publicUrl.replace(/\/+$/, "")}/_wizelens/api/auth/stripe/webhook` : undefined;
|
|
70
|
+
const webhookSecret = webhookUrl ? await webhookOf(client, webhookUrl, made) : undefined;
|
|
71
|
+
return { prices: { ...ids, meter: METER_EVENT }, made, webhookUrl, webhookSecret };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=stripe-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripe-setup.js","sourceRoot":"","sources":["../../src/billing/stripe-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CloudApp } from "../app.js";
|
|
2
|
+
import { type PlanId } from "./plans.js";
|
|
3
|
+
export interface SubscriptionInfo {
|
|
4
|
+
plan: string;
|
|
5
|
+
status: string;
|
|
6
|
+
interval: string | null;
|
|
7
|
+
periodEndMs: number | null;
|
|
8
|
+
cancelAtPeriodEnd: boolean;
|
|
9
|
+
cancelAtMs: number | null;
|
|
10
|
+
}
|
|
11
|
+
/** Days gone this month (at least one) and days in it, in UTC. */
|
|
12
|
+
export declare function monthProgress(nowMs: number): {
|
|
13
|
+
elapsed: number;
|
|
14
|
+
total: number;
|
|
15
|
+
};
|
|
16
|
+
/** Everything the Billing page and the usage banner show. */
|
|
17
|
+
export declare function usageSummary(app: CloudApp, orgId: string): Promise<{
|
|
18
|
+
billing: boolean;
|
|
19
|
+
plan: {
|
|
20
|
+
id: PlanId;
|
|
21
|
+
name: string;
|
|
22
|
+
monthlyUsd: number | null;
|
|
23
|
+
annualUsd: number | null;
|
|
24
|
+
includedGb: number | null;
|
|
25
|
+
maxRetentionDays: number;
|
|
26
|
+
overage: boolean;
|
|
27
|
+
features: Record<import("./plans.js").Feature, boolean>;
|
|
28
|
+
};
|
|
29
|
+
includedGb: number | null;
|
|
30
|
+
maxRetentionDays: number;
|
|
31
|
+
month: string;
|
|
32
|
+
monthGb: number;
|
|
33
|
+
days: {
|
|
34
|
+
bytes: number;
|
|
35
|
+
spans: number;
|
|
36
|
+
logs: number;
|
|
37
|
+
points: number;
|
|
38
|
+
day: string;
|
|
39
|
+
gb: number;
|
|
40
|
+
}[];
|
|
41
|
+
overageUsd: number;
|
|
42
|
+
projectedGb: number;
|
|
43
|
+
projectedOverageUsd: number;
|
|
44
|
+
spendCapUsd: number | null;
|
|
45
|
+
blocked: string | null;
|
|
46
|
+
reason: "cap" | "free" | null;
|
|
47
|
+
subscription: SubscriptionInfo | null;
|
|
48
|
+
plans: {
|
|
49
|
+
id: PlanId;
|
|
50
|
+
name: string;
|
|
51
|
+
monthlyUsd: number | null;
|
|
52
|
+
annualUsd: number | null;
|
|
53
|
+
includedGb: number | null;
|
|
54
|
+
maxRetentionDays: number;
|
|
55
|
+
overage: boolean;
|
|
56
|
+
features: Record<import("./plans.js").Feature, boolean>;
|
|
57
|
+
}[];
|
|
58
|
+
} | null>;
|
|
59
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/billing/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAgD,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAQvF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/E;AAcD,6DAA6D;AAC7D,wBAAsB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2B9D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BYTES_PER_GB, overageCents, PLANS } from "./plans.js";
|
|
2
|
+
import { monthOf, usageDays } from "./usage.js";
|
|
3
|
+
// `GET api/orgs/:org/usage`: this month's GB, the days, the plan's included GB, overage so far, and a month-end projection.
|
|
4
|
+
const DAY_MS = 86_400_000;
|
|
5
|
+
const round = (n, digits = 3) => Math.round(n * 10 ** digits) / 10 ** digits;
|
|
6
|
+
/** Days gone this month (at least one) and days in it, in UTC. */
|
|
7
|
+
export function monthProgress(nowMs) {
|
|
8
|
+
const d = new Date(nowMs);
|
|
9
|
+
const start = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1);
|
|
10
|
+
const end = Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1);
|
|
11
|
+
return { elapsed: Math.max(1, (nowMs - start) / DAY_MS), total: (end - start) / DAY_MS };
|
|
12
|
+
}
|
|
13
|
+
async function subscriptionOf(app, orgId) {
|
|
14
|
+
const [row] = await app.db.query(`SELECT plan, status, billing_interval, (extract(epoch FROM period_end) * 1000)::double precision AS end_ms, cancel_at_period_end AS cape,
|
|
15
|
+
(extract(epoch FROM cancel_at) * 1000)::double precision AS cancel_ms FROM subscriptions
|
|
16
|
+
WHERE reference_id = $1 AND status IN ('active', 'trialing', 'past_due') ORDER BY period_end DESC NULLS LAST LIMIT 1`, [orgId]);
|
|
17
|
+
return row ? { plan: row.plan, status: row.status, interval: row.billing_interval, periodEndMs: row.end_ms, cancelAtPeriodEnd: !!row.cape, cancelAtMs: row.cancel_ms } : null;
|
|
18
|
+
}
|
|
19
|
+
const planView = (p) => ({ id: p.id, name: p.name, monthlyUsd: p.monthlyUsd, annualUsd: p.annualUsd, includedGb: p.includedGb, maxRetentionDays: p.maxRetentionDays, overage: p.overage, features: p.features });
|
|
20
|
+
/** Everything the Billing page and the usage banner show. */
|
|
21
|
+
export async function usageSummary(app, orgId) {
|
|
22
|
+
const now = app.config.now();
|
|
23
|
+
const state = await app.billing.limits.state(orgId);
|
|
24
|
+
if (!state)
|
|
25
|
+
return null;
|
|
26
|
+
const { limits } = state;
|
|
27
|
+
const included = limits.includedGb;
|
|
28
|
+
const days = (await usageDays(app.db, orgId, monthOf(now))).map((d) => ({ ...d, gb: round(d.bytes / BYTES_PER_GB, 4) }));
|
|
29
|
+
const { elapsed, total } = monthProgress(now);
|
|
30
|
+
const projectedGb = (state.monthGb / elapsed) * total;
|
|
31
|
+
const cost = (gb) => (limits.plan.overage && included !== null ? overageCents(gb - included) / 100 : 0);
|
|
32
|
+
return {
|
|
33
|
+
billing: app.billing.on,
|
|
34
|
+
plan: planView(limits.plan),
|
|
35
|
+
includedGb: included,
|
|
36
|
+
maxRetentionDays: limits.maxRetentionDays,
|
|
37
|
+
month: monthOf(now),
|
|
38
|
+
monthGb: round(state.monthGb),
|
|
39
|
+
days,
|
|
40
|
+
overageUsd: round(cost(state.monthGb), 2),
|
|
41
|
+
projectedGb: round(projectedGb, 1),
|
|
42
|
+
projectedOverageUsd: round(cost(projectedGb), 2),
|
|
43
|
+
spendCapUsd: state.billing.spendCapCents === null ? null : state.billing.spendCapCents / 100,
|
|
44
|
+
blocked: state.blocked,
|
|
45
|
+
reason: state.reason,
|
|
46
|
+
subscription: app.billing.on ? await subscriptionOf(app, orgId) : null,
|
|
47
|
+
plans: app.billing.on ? ["free", "team", "business", "enterprise"].map((id) => planView(PLANS[id])) : [],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/billing/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type PlanId } from "./plans.js";
|
|
2
|
+
import { type UsageSubDeps } from "./usage-sub.js";
|
|
3
|
+
/** Set the plan from Stripe: a live subscription's plan, else Free. Plans set by hand (Enterprise, Unlimited) stay without one. */
|
|
4
|
+
export declare function syncOrgPlan(d: UsageSubDeps, orgId: string, forget: (orgId: string) => void): Promise<PlanId | undefined>;
|
|
5
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/billing/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtE,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAsBhF,mIAAmI;AACnI,wBAAsB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB9H"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { orgBilling, setPlan } from "../repo/billing.js";
|
|
2
|
+
import { isPaidPlan } from "./plans.js";
|
|
3
|
+
import { reportBeforeEnd } from "./report.js";
|
|
4
|
+
import { endUsageSub, ensureUsageSub } from "./usage-sub.js";
|
|
5
|
+
// orgs.plan follows the organization's Stripe subscription (Better Auth's `subscriptions` rows, written by its webhook).
|
|
6
|
+
/** A failed payment keeps the plan while Stripe retries (past_due); after the last retry Stripe cancels or marks it unpaid. */
|
|
7
|
+
const KEEPS_PLAN = new Set(["active", "trialing", "past_due"]);
|
|
8
|
+
const RANK = { team: 1, business: 2 };
|
|
9
|
+
/** The best live paid subscription of an organization, if any. */
|
|
10
|
+
async function liveSub(d, orgId) {
|
|
11
|
+
const rows = await d.db.query("SELECT plan, status, stripe_subscription_id, stripe_customer_id FROM subscriptions WHERE reference_id = $1", [orgId]);
|
|
12
|
+
const live = rows.filter((r) => isPaidPlan(r.plan) && KEEPS_PLAN.has(r.status) && !!r.stripe_subscription_id);
|
|
13
|
+
return live.sort((a, b) => RANK[b.plan] - RANK[a.plan])[0];
|
|
14
|
+
}
|
|
15
|
+
/** Set the plan from Stripe: a live subscription's plan, else Free. Plans set by hand (Enterprise, Unlimited) stay without one. */
|
|
16
|
+
export async function syncOrgPlan(d, orgId, forget) {
|
|
17
|
+
const before = await orgBilling(d.db, orgId);
|
|
18
|
+
if (!before)
|
|
19
|
+
return undefined;
|
|
20
|
+
const live = await liveSub(d, orgId);
|
|
21
|
+
const manual = before.plan === "enterprise" || before.plan === "unlimited";
|
|
22
|
+
const next = live ? live.plan : manual ? before.plan : "free";
|
|
23
|
+
await setPlan(d.db, orgId, { plan: next }, "stripe", d.now());
|
|
24
|
+
forget(orgId);
|
|
25
|
+
const customer = live?.stripe_customer_id ?? before.stripeCustomerId;
|
|
26
|
+
if (live && customer)
|
|
27
|
+
await ensureUsageSub(d, orgId, customer, live.stripe_subscription_id);
|
|
28
|
+
else if (!live && before.overageSubscriptionId) {
|
|
29
|
+
// Bill the finished days at the old plan's included GB before the usage subscription ends.
|
|
30
|
+
await reportBeforeEnd(d, orgId, before.plan);
|
|
31
|
+
await endUsageSub(d, orgId);
|
|
32
|
+
}
|
|
33
|
+
return next;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/billing/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAgC,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAC;AAEhF,yHAAyH;AAEzH,+HAA+H;AAC/H,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/D,MAAM,IAAI,GAA+B,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AASlE,kEAAkE;AAClE,KAAK,UAAU,OAAO,CAAC,CAAe,EAAE,KAAa;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAS,4GAA4G,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7J,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAClJ,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,mIAAmI;AACnI,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAe,EAAE,KAAa,EAAE,MAA+B;IAC/F,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC;IAC3E,MAAM,IAAI,GAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,CAAC;IACd,MAAM,QAAQ,GAAG,IAAI,EAAE,kBAAkB,IAAI,MAAM,CAAC,gBAAgB,CAAC;IACrE,IAAI,IAAI,IAAI,QAAQ;QAAE,MAAM,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,sBAAuB,CAAC,CAAC;SACxF,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC/C,2FAA2F;QAC3F,MAAM,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Queryable } from "../db/db.js";
|
|
2
|
+
import type { StripeClient, StripePrices } from "./options.js";
|
|
3
|
+
/** Marks the usage subscription in Stripe, so the webhook keeps it away from the plan sync (billing/webhook.ts). */
|
|
4
|
+
export declare const USAGE_ROLE = "usage";
|
|
5
|
+
/** The next 1st of a month, 00:00 UTC, in seconds. */
|
|
6
|
+
export declare function nextMonthStartS(nowMs: number): number;
|
|
7
|
+
export interface UsageSubDeps {
|
|
8
|
+
db: Queryable;
|
|
9
|
+
client: StripeClient;
|
|
10
|
+
prices: StripePrices;
|
|
11
|
+
now: () => number;
|
|
12
|
+
}
|
|
13
|
+
/** Make sure a paid organization has its usage subscription. `planSubId` makes the create idempotent. */
|
|
14
|
+
export declare function ensureUsageSub(d: UsageSubDeps, orgId: string, customerId: string, planSubId: string): Promise<void>;
|
|
15
|
+
/** End the usage subscription when the plan ends. Stripe sends the last usage invoice at once. */
|
|
16
|
+
export declare function endUsageSub(d: UsageSubDeps, orgId: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=usage-sub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-sub.d.ts","sourceRoot":"","sources":["../../src/billing/usage-sub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI/D,oHAAoH;AACpH,eAAO,MAAM,UAAU,UAAU,CAAC;AAGlC,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAOD,yGAAyG;AACzG,wBAAsB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzH;AAED,kGAAkG;AAClG,wBAAsB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Extra GB bill on a separate monthly subscription with only the metered price, from the 1st (UTC): tiers count calendar months.
|
|
2
|
+
/** Marks the usage subscription in Stripe, so the webhook keeps it away from the plan sync (billing/webhook.ts). */
|
|
3
|
+
export const USAGE_ROLE = "usage";
|
|
4
|
+
const LIVE = new Set(["active", "trialing", "past_due"]);
|
|
5
|
+
/** The next 1st of a month, 00:00 UTC, in seconds. */
|
|
6
|
+
export function nextMonthStartS(nowMs) {
|
|
7
|
+
const d = new Date(nowMs);
|
|
8
|
+
return Math.floor(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 1) / 1000);
|
|
9
|
+
}
|
|
10
|
+
async function current(d, orgId) {
|
|
11
|
+
const [row] = await d.db.query("SELECT overage_subscription_id AS id FROM orgs WHERE id = $1", [orgId]);
|
|
12
|
+
return row?.id ?? null;
|
|
13
|
+
}
|
|
14
|
+
/** Make sure a paid organization has its usage subscription. `planSubId` makes the create idempotent. */
|
|
15
|
+
export async function ensureUsageSub(d, orgId, customerId, planSubId) {
|
|
16
|
+
const id = await current(d, orgId);
|
|
17
|
+
if (id) {
|
|
18
|
+
const sub = await d.client.subscriptions.retrieve(id).catch(() => null);
|
|
19
|
+
if (sub && LIVE.has(sub.status))
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Checkout saves the card on the plan subscription, not the customer, so the usage subscription takes the same one.
|
|
23
|
+
const plan = await d.client.subscriptions.retrieve(planSubId);
|
|
24
|
+
const pm = typeof plan.default_payment_method === "string" ? plan.default_payment_method : plan.default_payment_method?.id;
|
|
25
|
+
const sub = await d.client.subscriptions.create({
|
|
26
|
+
customer: customerId,
|
|
27
|
+
...(pm ? { default_payment_method: pm } : {}),
|
|
28
|
+
items: [{ price: d.prices.overage }],
|
|
29
|
+
billing_cycle_anchor: nextMonthStartS(d.now()),
|
|
30
|
+
proration_behavior: "none",
|
|
31
|
+
description: "WizeLens extra data (GB above the plan's included GB)",
|
|
32
|
+
metadata: { wizelensOrgId: orgId, wizelensRole: USAGE_ROLE },
|
|
33
|
+
}, { idempotencyKey: `wl-usage-${orgId}-${planSubId}${id ? `-${id}` : ""}` });
|
|
34
|
+
await d.db.query("UPDATE orgs SET overage_subscription_id = $1 WHERE id = $2", [sub.id, orgId]);
|
|
35
|
+
}
|
|
36
|
+
/** End the usage subscription when the plan ends. Stripe sends the last usage invoice at once. */
|
|
37
|
+
export async function endUsageSub(d, orgId) {
|
|
38
|
+
const id = await current(d, orgId);
|
|
39
|
+
if (!id)
|
|
40
|
+
return;
|
|
41
|
+
await d.client.subscriptions.cancel(id, { invoice_now: true, prorate: false }).catch((err) => {
|
|
42
|
+
if (err.code !== "resource_missing")
|
|
43
|
+
throw err;
|
|
44
|
+
});
|
|
45
|
+
await d.db.query("UPDATE orgs SET overage_subscription_id = NULL WHERE id = $1", [orgId]);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=usage-sub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-sub.js","sourceRoot":"","sources":["../../src/billing/usage-sub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Queryable } from "../db/db.js";
|
|
2
|
+
export interface UsageCounts {
|
|
3
|
+
bytes: number;
|
|
4
|
+
spans: number;
|
|
5
|
+
logs: number;
|
|
6
|
+
points: number;
|
|
7
|
+
}
|
|
8
|
+
/** "2026-10-19" for a time in ms, in UTC. */
|
|
9
|
+
export declare const dayOf: (ms: number) => string;
|
|
10
|
+
/** "2026-10" for a time in ms, in UTC. */
|
|
11
|
+
export declare const monthOf: (ms: number) => string;
|
|
12
|
+
export declare class UsageMeter {
|
|
13
|
+
#private;
|
|
14
|
+
private readonly db;
|
|
15
|
+
private readonly now;
|
|
16
|
+
constructor(db: Queryable, now: () => number);
|
|
17
|
+
add(orgId: string, c: Partial<UsageCounts>): void;
|
|
18
|
+
/** Bytes this month: saved plus not yet saved. */
|
|
19
|
+
monthBytes(orgId: string): Promise<number>;
|
|
20
|
+
/** Save the counters (added to the day's row), then reread this month's totals. A failed save keeps them for the next try. */
|
|
21
|
+
flush(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface UsageDay extends UsageCounts {
|
|
24
|
+
day: string;
|
|
25
|
+
}
|
|
26
|
+
/** One organization's days in a month ("2026-10"), oldest first. */
|
|
27
|
+
export declare const usageDays: (q: Queryable, orgId: string, month: string) => Promise<UsageDay[]>;
|
|
28
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/billing/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6CAA6C;AAC7C,eAAO,MAAM,KAAK,OAAQ,MAAM,KAAG,MAAiD,CAAC;AACrF,0CAA0C;AAC1C,eAAO,MAAM,OAAO,OAAQ,MAAM,KAAG,MAAgD,CAAC;AAqBtF,qBAAa,UAAU;;IAQnB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFtB,YACmB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,MAAM,MAAM,EAChC;IAEJ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAKhD;IAED,kDAAkD;IAC5C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/C;IAED,8HAA8H;IACxH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAa3B;CAWF;AAED,MAAM,WAAW,QAAS,SAAQ,WAAW;IAC3C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oEAAoE;AACpE,eAAO,MAAM,SAAS,MAAO,SAAS,SAAS,MAAM,SAAS,MAAM,KAAG,OAAO,CAAC,QAAQ,EAAE,CAKtF,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** "2026-10-19" for a time in ms, in UTC. */
|
|
2
|
+
export const dayOf = (ms) => new Date(ms).toISOString().slice(0, 10);
|
|
3
|
+
/** "2026-10" for a time in ms, in UTC. */
|
|
4
|
+
export const monthOf = (ms) => new Date(ms).toISOString().slice(0, 7);
|
|
5
|
+
const empty = () => ({ bytes: 0, spans: 0, logs: 0, points: 0 });
|
|
6
|
+
function addInto(into, c) {
|
|
7
|
+
into.bytes += c.bytes ?? 0;
|
|
8
|
+
into.spans += c.spans ?? 0;
|
|
9
|
+
into.logs += c.logs ?? 0;
|
|
10
|
+
into.points += c.points ?? 0;
|
|
11
|
+
}
|
|
12
|
+
/** Bytes this month per organization, as saved: the sum of its usage_daily rows. */
|
|
13
|
+
async function savedMonthBytes(q, month, orgIds) {
|
|
14
|
+
if (!orgIds.length)
|
|
15
|
+
return new Map();
|
|
16
|
+
const rows = await q.query(`SELECT org_id, SUM(bytes)::double precision AS bytes FROM usage_daily WHERE day LIKE $1 AND org_id IN (${orgIds.map((_, i) => `$${i + 2}`).join(", ")}) GROUP BY org_id`, [`${month}-%`, ...orgIds]);
|
|
17
|
+
return new Map(rows.map((r) => [r.org_id, Number(r.bytes)]));
|
|
18
|
+
}
|
|
19
|
+
export class UsageMeter {
|
|
20
|
+
db;
|
|
21
|
+
now;
|
|
22
|
+
/** Not yet saved, by "orgId|day". */
|
|
23
|
+
#pending = new Map();
|
|
24
|
+
/** Saved bytes this month, by organization, refreshed at every flush (other instances add to the same rows). */
|
|
25
|
+
#saved = new Map();
|
|
26
|
+
#savedMonth = "";
|
|
27
|
+
constructor(db, now) {
|
|
28
|
+
this.db = db;
|
|
29
|
+
this.now = now;
|
|
30
|
+
}
|
|
31
|
+
add(orgId, c) {
|
|
32
|
+
const key = `${orgId}|${dayOf(this.now())}`;
|
|
33
|
+
const row = this.#pending.get(key) ?? empty();
|
|
34
|
+
addInto(row, c);
|
|
35
|
+
this.#pending.set(key, row);
|
|
36
|
+
}
|
|
37
|
+
/** Bytes this month: saved plus not yet saved. */
|
|
38
|
+
async monthBytes(orgId) {
|
|
39
|
+
const month = monthOf(this.now());
|
|
40
|
+
if (month !== this.#savedMonth)
|
|
41
|
+
(this.#saved.clear(), (this.#savedMonth = month));
|
|
42
|
+
if (!this.#saved.has(orgId))
|
|
43
|
+
this.#saved.set(orgId, (await savedMonthBytes(this.db, month, [orgId])).get(orgId) ?? 0);
|
|
44
|
+
let pending = 0;
|
|
45
|
+
for (const [key, c] of this.#pending)
|
|
46
|
+
if (key.startsWith(`${orgId}|${month}`))
|
|
47
|
+
pending += c.bytes;
|
|
48
|
+
return this.#saved.get(orgId) + pending;
|
|
49
|
+
}
|
|
50
|
+
/** Save the counters (added to the day's row), then reread this month's totals. A failed save keeps them for the next try. */
|
|
51
|
+
async flush() {
|
|
52
|
+
const batch = this.#pending;
|
|
53
|
+
this.#pending = new Map();
|
|
54
|
+
try {
|
|
55
|
+
for (const [key, c] of batch)
|
|
56
|
+
await this.#save(key, c);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
for (const [key, c] of batch)
|
|
60
|
+
addInto(this.#pending.get(key) ?? (this.#pending.set(key, empty()), this.#pending.get(key)), c);
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
const month = monthOf(this.now());
|
|
64
|
+
if (month !== this.#savedMonth)
|
|
65
|
+
(this.#saved.clear(), (this.#savedMonth = month));
|
|
66
|
+
const fresh = await savedMonthBytes(this.db, month, [...this.#saved.keys()]);
|
|
67
|
+
for (const id of this.#saved.keys())
|
|
68
|
+
this.#saved.set(id, fresh.get(id) ?? 0);
|
|
69
|
+
}
|
|
70
|
+
async #save(key, c) {
|
|
71
|
+
const [orgId, day] = key.split("|");
|
|
72
|
+
await this.db.query(`INSERT INTO usage_daily (org_id, day, bytes, spans, logs, points) SELECT $1, $2, $3, $4, $5, $6 WHERE EXISTS (SELECT 1 FROM orgs WHERE id = $1)
|
|
73
|
+
ON CONFLICT (org_id, day) DO UPDATE SET bytes = usage_daily.bytes + EXCLUDED.bytes, spans = usage_daily.spans + EXCLUDED.spans,
|
|
74
|
+
logs = usage_daily.logs + EXCLUDED.logs, points = usage_daily.points + EXCLUDED.points`, [orgId, day, c.bytes, c.spans, c.logs, c.points]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** One organization's days in a month ("2026-10"), oldest first. */
|
|
78
|
+
export const usageDays = (q, orgId, month) => q.query(`SELECT day, bytes::double precision AS bytes, spans::double precision AS spans, logs::double precision AS logs, points::double precision AS points
|
|
79
|
+
FROM usage_daily WHERE org_id = $1 AND day LIKE $2 ORDER BY day`, [orgId, `${month}-%`]);
|
|
80
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/billing/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { CloudApp } from "../app.js";
|
|
3
|
+
export declare const STRIPE_WEBHOOK_PATH = "/_wizelens/api/auth/stripe/webhook";
|
|
4
|
+
/** `POST /_wizelens/api/auth/stripe/webhook`. 404 while billing is off. */
|
|
5
|
+
export declare function stripeWebhook(app: CloudApp, req: IncomingMessage, res: ServerResponse): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/billing/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAO1C,eAAO,MAAM,mBAAmB,uCAAqC,CAAC;AAsBtE,2EAA2E;AAC3E,wBAAsB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3G"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AUTH_BASE_PATH } from "../auth/options.js";
|
|
2
|
+
import { readRawBody, sendJson } from "../http/http.js";
|
|
3
|
+
import { USAGE_ROLE } from "./usage-sub.js";
|
|
4
|
+
// Stripe's webhook before Better Auth's: usage subscription events are ours (the plugin would mistake them for the plan's).
|
|
5
|
+
export const STRIPE_WEBHOOK_PATH = `${AUTH_BASE_PATH}/stripe/webhook`;
|
|
6
|
+
const usageSubOf = (e) => (e.type.startsWith("customer.subscription.") && e.data.object.metadata?.wizelensRole === USAGE_ROLE ? e.data.object : null);
|
|
7
|
+
/** A usage subscription that ended while the plan still runs (for example, canceled in the portal) is made again. */
|
|
8
|
+
async function onUsageSub(app, e) {
|
|
9
|
+
const sub = usageSubOf(e);
|
|
10
|
+
const orgId = sub.metadata?.wizelensOrgId;
|
|
11
|
+
if (!orgId || e.type !== "customer.subscription.deleted")
|
|
12
|
+
return;
|
|
13
|
+
await app.db.query("UPDATE orgs SET overage_subscription_id = NULL WHERE id = $1 AND overage_subscription_id = $2", [orgId, sub.id]);
|
|
14
|
+
await app.billing.stripe.sync(orgId);
|
|
15
|
+
}
|
|
16
|
+
async function forward(app, req, raw, res) {
|
|
17
|
+
const headers = { "content-type": String(req.headers["content-type"] ?? "application/json"), "stripe-signature": String(req.headers["stripe-signature"] ?? "") };
|
|
18
|
+
const answer = await app.auth.handler(new Request(`${app.baseUrl()}${STRIPE_WEBHOOK_PATH}`, { method: "POST", headers, body: raw }));
|
|
19
|
+
res.writeHead(answer.status, { "Content-Type": answer.headers.get("content-type") ?? "application/json", "Cache-Control": "no-store" });
|
|
20
|
+
res.end(await answer.text());
|
|
21
|
+
}
|
|
22
|
+
/** `POST /_wizelens/api/auth/stripe/webhook`. 404 while billing is off. */
|
|
23
|
+
export async function stripeWebhook(app, req, res) {
|
|
24
|
+
const stripe = app.billing.stripe;
|
|
25
|
+
if (!stripe)
|
|
26
|
+
return sendJson(res, 404, { error: "Billing is off." });
|
|
27
|
+
const raw = await readRawBody(req);
|
|
28
|
+
const sig = String(req.headers["stripe-signature"] ?? "");
|
|
29
|
+
let event;
|
|
30
|
+
try {
|
|
31
|
+
event = await stripe.client.webhooks.constructEventAsync(raw, sig, stripe.webhookSecret);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return sendJson(res, 400, { error: "The Stripe signature is not valid." });
|
|
35
|
+
}
|
|
36
|
+
if (!usageSubOf(event))
|
|
37
|
+
return forward(app, req, raw, res);
|
|
38
|
+
await onUsageSub(app, event);
|
|
39
|
+
sendJson(res, 200, { received: true });
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/billing/webhook.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-args.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CloudOptions } from "./config.js";
|
|
2
|
-
export declare const USAGE = "wizelens-cloud: the WizeLens service for many teams.\n\nUsage: wizelens-cloud [options]\n\n --database <url> postgres://..., pglite:<folder>, or memory.\n Default pglite:./.wizelens-cloud. (DATABASE_URL)\n --clickhouse <url> Scale mode: telemetry in ClickHouse, (WIZELENS_CLOUD_CLICKHOUSE_URL)\n http://user:pass@host:8123/database.\n --port <n> Default 5970. (PORT)\n --host <addr> Default 0.0.0.0. (WIZELENS_CLOUD_HOST)\n --public-url <url> The address people use, for links. (WIZELENS_CLOUD_PUBLIC_URL)\n --signup <invite|open> Who can make an account. Default invite. (WIZELENS_CLOUD_SIGNUP)\n --retention-days <n> Default for new organizations. Default 30. (WIZELENS_CLOUD_RETENTION_DAYS)\n --ingest-per-minute <n> Ingest calls per key per minute. Default (WIZELENS_CLOUD_INGEST_PER_MINUTE)\n 1200.\n --allow-private-webhooks Let alert webhooks
|
|
2
|
+
export declare const USAGE = "wizelens-cloud: the WizeLens service for many teams.\n\nUsage: wizelens-cloud [options]\n wizelens-cloud plan set <org> <plan> [--gb <n>] [--retention-days <n>]\n wizelens-cloud stripe-setup --stripe-secret-key <key>\n\n --database <url> postgres://..., pglite:<folder>, or memory.\n Default pglite:./.wizelens-cloud. (DATABASE_URL)\n --clickhouse <url> Scale mode: telemetry in ClickHouse, (WIZELENS_CLOUD_CLICKHOUSE_URL)\n http://user:pass@host:8123/database.\n --settle-workers <n> Threads that settle new traces. 0 uses the (WIZELENS_CLOUD_SETTLE_WORKERS)\n main thread. Default CPUs - 1, at most 4.\n --port <n> Default 5970. (PORT)\n --host <addr> Default 0.0.0.0. (WIZELENS_CLOUD_HOST)\n --public-url <url> The address people use, for links. (WIZELENS_CLOUD_PUBLIC_URL)\n --mcp-url <url> Another origin your proxy sends to MCP, (WIZELENS_CLOUD_MCP_URL)\n e.g. https://mcp.example.com.\n --signup <invite|open> Who can make an account. Default invite. (WIZELENS_CLOUD_SIGNUP)\n --retention-days <n> Default for new organizations. Default 30. (WIZELENS_CLOUD_RETENTION_DAYS)\n --ingest-per-minute <n> Ingest calls per key per minute. Default (WIZELENS_CLOUD_INGEST_PER_MINUTE)\n 1200.\n --slow-query-ms <n> A database call this slow is slow. Default (WIZELENS_CLOUD_SLOW_QUERY_MS)\n 100. Projects can set their own.\n --n-plus-one <n> Similar calls in a request that make an (WIZELENS_CLOUD_N_PLUS_ONE)\n N+1. Default 5.\n --allow-private-webhooks Let alert webhooks and uptime checks reach (WIZELENS_CLOUD_ALLOW_PRIVATE_WEBHOOKS=1)\n private addresses.\n --auth-secret <text> Signs sessions, encrypts 2FA secrets. 32+ (WIZELENS_CLOUD_AUTH_SECRET)\n characters; \"2:new,1:old\" rotates.\n Required with Postgres.\n --resend-api-key <key> Outgoing mail through Resend (re_...). (WIZELENS_CLOUD_RESEND_API_KEY)\n Needs --public-url.\n --resend-webhook-secret <s> The Resend webhook's whsec_ secret: (WIZELENS_CLOUD_RESEND_WEBHOOK_SECRET)\n bounces and complaints stop later mail.\n Webhook URL: <public-url>/_wizelens/api/mail/resend\n --smtp-url <url> Or mail over SMTP: smtp://user:pass@host:587 (WIZELENS_CLOUD_SMTP_URL)\n or smtps://...:465. Needs --public-url.\n --mail-from <address> Sender, e.g. \"WizeLens <a@b.com>\". (WIZELENS_CLOUD_MAIL_FROM)\n --mail-reply-to <address> Where replies go, e.g. \"hello@b.com\". (WIZELENS_CLOUD_MAIL_REPLY_TO)\n --trust-proxy Read the client address from the last (WIZELENS_CLOUD_TRUST_PROXY=1)\n X-Forwarded-For entry (your own proxy only).\n --setup-token <text> The first account's token. Default: random, (WIZELENS_CLOUD_SETUP_TOKEN)\n printed at start while no account exists.\n --check-pwned-passwords Refuse breached passwords. Default on with (WIZELENS_CLOUD_CHECK_PWNED=1|0)\n --no-check-pwned-passwords Postgres, off with PGlite.\n --sso-origins <list> Identity provider origins for OIDC single (WIZELENS_CLOUD_SSO_ORIGINS)\n sign-on, comma separated, for example\n https://acme.okta.com. SAML needs none.\n --stripe-secret-key <key> Turns billing on (sk_... or rk_...). (WIZELENS_CLOUD_STRIPE_SECRET_KEY)\n Without it, every organization is unlimited.\n --stripe-webhook-secret <s> The Stripe webhook's whsec_ secret. (WIZELENS_CLOUD_STRIPE_WEBHOOK_SECRET)\n Webhook URL: <public-url>/_wizelens/api/auth/stripe/webhook\n --stripe-prices <json> Price and meter ids, as stripe-setup (WIZELENS_CLOUD_STRIPE_PRICES)\n prints them.\n --help Show this help.\n";
|
|
3
3
|
/** Options from the command line, then from the environment. */
|
|
4
4
|
export declare function optionsFromArgs(argv: string[], env: NodeJS.ProcessEnv): CloudOptions | "help";
|
|
5
5
|
//# sourceMappingURL=cli-args.d.ts.map
|
package/dist/cli-args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,KAAK,4uIAuDjB,CAAC;AA0CF,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,CA+B7F"}
|