Files
Keysat 0ae59f3550 Add multi-tenant cloud mode: self-serve purchase, credit metering, core-decoupling
Introduces RECAP_MODE=multi alongside single-mode self-host:
- Tenant auth + accounts (magic-link via System SMTP), per-tenant credit pool,
  anonymous trial minting with per-IP/-64 caps
- Self-serve Pro/Max purchase: inline Lightning (BTCPay) + card (Zaprite),
  prepaid 30-day periods, expiry-reminder emails
- Core-decoupling: relay owns cloud tier/expiry keyed by Recaps user-id
- SQLite (better-sqlite3) schema for multi-mode; filesystem unchanged for single
- StartOS actions/versions through 0.2.155
2026-06-13 14:25:05 -05:00

14 lines
1.5 KiB
TypeScript

import { VersionInfo } from '@start9labs/start-sdk'
export const v_0_2_69 = VersionInfo.of({
version: '0.2.69:0',
releaseNotes: {
en_US:
'Post-license-activation UX fixes. (1) Top-bar tier badge: explicit "PRO" (purple) or "MAX" (gold) pill appears next to the relay-credits count the moment a paid license activates, so the operator gets immediate visual confirmation instead of having to infer it from the Upgrade button disappearing. Reads from license entitlements directly (authoritative source) rather than the relay-side tier field (which can briefly lag during cache refresh). (2) Relay-credits pill now refreshes immediately after license activation instead of waiting for the next 60-second poll tick. loadAfterLicensed() — which runs after a successful /api/license/activate — now also calls loadRelayStatus(forceRefresh=true) which passes ?refresh=1 so the Recap server bypasses its 10-second relayState cache and pings the operator\'s relay /relay/balance right now. The relay\'s keysat-client validates the newly-saved license proof on its end and returns the new tier + monthly credit quota. Net effect: paid a BTCPay invoice for a Pro license → click "I have a key" + paste → see PRO badge + 50 (or whatever Pro\'s monthly cap is) relay credits within ~1 second, instead of seeing stale "core · 6 credits" for up to a minute. (3) Render call added after the forced refresh so the new badge + credit count surface without a page reload.',
},
migrations: {
up: async ({ effects }) => {},
down: async ({ effects }) => {},
},
})