@happyvertical/smrt-subscriptions 0.60.15 → 0.60.16

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 (43) hide show
  1. package/AGENTS.md +78 -0
  2. package/README.md +195 -0
  3. package/dist/billing/apply.d.ts +52 -0
  4. package/dist/billing/apply.d.ts.map +1 -0
  5. package/dist/billing/checkout-sessions.d.ts +99 -0
  6. package/dist/billing/checkout-sessions.d.ts.map +1 -0
  7. package/dist/billing/config.d.ts +64 -0
  8. package/dist/billing/config.d.ts.map +1 -0
  9. package/dist/billing/events.d.ts +49 -0
  10. package/dist/billing/events.d.ts.map +1 -0
  11. package/dist/billing/host.d.ts +3 -0
  12. package/dist/billing/host.d.ts.map +1 -0
  13. package/dist/billing/index.d.ts +4 -0
  14. package/dist/billing/index.d.ts.map +1 -0
  15. package/dist/billing/plans.d.ts +45 -0
  16. package/dist/billing/plans.d.ts.map +1 -0
  17. package/dist/billing/signing.d.ts +24 -0
  18. package/dist/billing/signing.d.ts.map +1 -0
  19. package/dist/billing/types.d.ts +265 -0
  20. package/dist/billing/types.d.ts.map +1 -0
  21. package/dist/index.d.ts +3 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1648 -26
  24. package/dist/index.js.map +1 -1
  25. package/dist/manifest.json +313 -4
  26. package/dist/models/BillingCheckoutSession.d.ts +39 -0
  27. package/dist/models/BillingCheckoutSession.d.ts.map +1 -0
  28. package/dist/models/index.d.ts +1 -0
  29. package/dist/models/index.d.ts.map +1 -1
  30. package/dist/recipes.d.ts +1 -1
  31. package/dist/smrt-knowledge.json +101 -8
  32. package/dist/smrt-knowledge.okf.md +5 -2
  33. package/dist/vault-account/actions.d.ts +24 -0
  34. package/dist/vault-account/actions.d.ts.map +1 -0
  35. package/dist/vault-account/errors.d.ts +20 -0
  36. package/dist/vault-account/errors.d.ts.map +1 -0
  37. package/dist/vault-account/index.d.ts +5 -0
  38. package/dist/vault-account/index.d.ts.map +1 -0
  39. package/dist/vault-account/relay-admin-client.d.ts +10 -0
  40. package/dist/vault-account/relay-admin-client.d.ts.map +1 -0
  41. package/dist/vault-account/types.d.ts +115 -0
  42. package/dist/vault-account/types.d.ts.map +1 -0
  43. package/package.json +9 -7
@@ -5,10 +5,10 @@ description: "Tenant subscriptions, entitlement resolution, usage thresholds, an
5
5
  status: "stable"
6
6
  generated:
7
7
  by: "smrt/scripts/generate-knowledge-okf.ts"
8
- at: "2026-11-08T23:20:26Z"
8
+ at: "2026-11-09T23:09:38Z"
9
9
  audience: "internal"
10
10
  evidence_level: "source-inspected"
11
- source_revision: "sha256:7c2168e5c5217ff6f6d7073b39f02053dadab3070527ce4c41698152a0ed878b"
11
+ source_revision: "sha256:48d3599db9578e435280b3dd42751090babf37fc1f9fc84da681314f14dc5579"
12
12
  sources:
13
13
  - id: "manifest"
14
14
  resource: "https://github.com/happyvertical/smrt/blob/main/packages/subscriptions/package.json"
@@ -37,6 +37,7 @@ sources:
37
37
  - [smrt-features](/components/smrt-features.md)
38
38
  - [smrt-tenancy](/components/smrt-tenancy.md)
39
39
  - [smrt-ui](/components/smrt-ui.md)
40
+ - [smrt-users](/components/smrt-users.md)
40
41
  - [smrt-vitest](/components/smrt-vitest.md)
41
42
 
42
43
  ## SDK dependencies
@@ -54,6 +55,8 @@ sources:
54
55
 
55
56
  - `BillingAdjustment` (collection `billingadjustments`, extends `SmrtObject`)
56
57
  - `BillingAdjustmentCollection` (collection `billingadjustments`, extends `SmrtCollection`)
58
+ - `BillingCheckoutSession` (collection `billingcheckoutsessions`, extends `SmrtObject`)
59
+ - `BillingCheckoutSessionCollection` (collection `billingcheckoutsessions`, extends `SmrtCollection`)
57
60
  - `ClientCharge` (collection `clientcharges`, extends `SmrtObject`)
58
61
  - `ClientChargeCollection` (collection `clientcharges`, extends `SmrtCollection`)
59
62
  - `CreditGrant` (collection `creditgrants`, extends `SmrtObject`)
@@ -0,0 +1,24 @@
1
+ import type { ProvisionRestartAccountInput, ProvisionRestartAccountResult, SupersedeVaultAccountInput, UnsupersedeVaultAccountInput } from './types.js';
2
+ /**
3
+ * Replace `oldAccount` by `newAccount` (relay admin `PUT
4
+ * .../superseded-by`). The new account must already hold an active device
5
+ * (see {@link provisionRestartAccount}); the relay enforces that, and no
6
+ * chains or loops. Idempotent for the same target.
7
+ */
8
+ export declare function supersedeVaultAccount(input: SupersedeVaultAccountInput): Promise<'superseded' | 'unchanged'>;
9
+ /**
10
+ * Undo a supersession (relay admin `DELETE .../superseded-by`), for an
11
+ * operator mistake or a restart that never reached the working device. Returns
12
+ * false when `oldAccount` was not superseded.
13
+ */
14
+ export declare function unsupersedeVaultAccount(input: UnsupersedeVaultAccountInput): Promise<boolean>;
15
+ /**
16
+ * Step 1 of the restart flow (app-runtime README, "Restarting when the
17
+ * recovery secret is lost"), before the supersede: allocate a fresh vault
18
+ * account id, link it to the caller's tenant (so `backup.vault` resolves for
19
+ * it), and register the working device's relay signing key in it (relay admin
20
+ * `PUT .../devices/:device`). The id is minted per call, so a retry after a
21
+ * crash makes another empty account unless `newAccountId` is pinned.
22
+ */
23
+ export declare function provisionRestartAccount(input: ProvisionRestartAccountInput): Promise<ProvisionRestartAccountResult>;
24
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/vault-account/actions.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAI7B,MAAM,YAAY,CAAC;AA2KpB;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC,CAYrC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,6BAA6B,CAAC,CA6CxC"}
@@ -0,0 +1,20 @@
1
+ import { StepUpRequiredError } from '@happyvertical/smrt-users/step-up';
2
+ export { StepUpRequiredError };
3
+ /** Stable machine code of {@link NotOwnerError}. */
4
+ export declare const NOT_OWNER_CODE = "not_owner";
5
+ /**
6
+ * The caller is not the owner of the tenant that holds the account: a member,
7
+ * a device-only or layered session, no session, or another tenant's account.
8
+ * One message and code for all of them, so nothing about the account or the
9
+ * tenant leaks.
10
+ */
11
+ export declare class NotOwnerError extends Error {
12
+ readonly code = "not_owner";
13
+ constructor(message?: string);
14
+ }
15
+ /** A refusal after both checks passed (the relay or directory said no). */
16
+ export declare class VaultAccountAdminError extends Error {
17
+ readonly code: string;
18
+ constructor(code: string, message?: string);
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/vault-account/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B,oDAAoD;AACpD,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,eAAkB;gBAEnB,OAAO,SAAwC;CAI5D;AAED,2EAA2E;AAC3E,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,SAAqC;CAKvE"}
@@ -0,0 +1,5 @@
1
+ export { provisionRestartAccount, supersedeVaultAccount, unsupersedeVaultAccount, } from './actions.js';
2
+ export { NOT_OWNER_CODE, NotOwnerError, StepUpRequiredError, VaultAccountAdminError, } from './errors.js';
3
+ export { createVaultRelayAdminClient, type VaultRelayAdminClientOptions, } from './relay-admin-client.js';
4
+ export type { ProvisionRestartAccountInput, ProvisionRestartAccountResult, SupersedeVaultAccountInput, UnsupersedeVaultAccountInput, VaultAccountAction, VaultAccountAdminDeps, VaultAccountAuditEntry, VaultAccountAuditSink, VaultAccountDenial, VaultAccountDirectory, VaultRelayAdminPort, } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vault-account/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,2BAA2B,EAC3B,KAAK,4BAA4B,GAClC,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,0BAA0B,EAC1B,4BAA4B,EAC5B,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { VaultRelayAdminPort } from './types.js';
2
+ export interface VaultRelayAdminClientOptions {
3
+ /** Admin listener origin, e.g. `http://vault-relay-admin:8081`. */
4
+ baseUrl: string;
5
+ /** `VAULT_RELAY_ADMIN_TOKEN`. */
6
+ adminToken: string;
7
+ fetch?: typeof fetch;
8
+ }
9
+ export declare function createVaultRelayAdminClient(options: VaultRelayAdminClientOptions): VaultRelayAdminPort;
10
+ //# sourceMappingURL=relay-admin-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-admin-client.d.ts","sourceRoot":"","sources":["../../src/vault-account/relay-admin-client.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IAC3C,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAWD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,mBAAmB,CA8ErB"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Types for the hosted vault-account admin surface (#4841).
3
+ *
4
+ * Everything the gated actions touch is an injected port, so no HTTP server or
5
+ * real relay is needed to run or test them. `VaultRelay` from
6
+ * `@happyvertical/smrt-vault-relay` satisfies {@link VaultRelayAdminPort}
7
+ * structurally (this package cannot depend on it: the relay depends on this
8
+ * package), and {@link createVaultRelayAdminClient} implements it over the
9
+ * relay's admin HTTP API.
10
+ */
11
+ import type { StepUpSession } from '@happyvertical/smrt-users/step-up';
12
+ /** The three gated actions. */
13
+ export type VaultAccountAction = 'supersede' | 'unsupersede' | 'provision_restart_account';
14
+ /** Why an attempt was refused. The caller sees only the error code. */
15
+ export type VaultAccountDenial = 'not_owner' | 'step_up_required';
16
+ /**
17
+ * The relay admin operations the actions use: the account-layer hooks of
18
+ * `VaultRelay` (`registerDevice`, `supersedeAccount`, `clearSupersession`).
19
+ */
20
+ export interface VaultRelayAdminPort {
21
+ /** Register a device's raw Ed25519 public key (base64url) in an account. */
22
+ registerDevice(accountId: string, deviceId: string, publicKey: string): Promise<'registered' | 'unchanged' | 'conflict'>;
23
+ /** Replace `accountId` by `supersededBy`. Idempotent for the same target. */
24
+ supersedeAccount(accountId: string, supersededBy: string): Promise<'superseded' | 'unchanged'>;
25
+ /** Undo a supersession; false when there was none. */
26
+ clearSupersession(accountId: string): Promise<boolean>;
27
+ }
28
+ /**
29
+ * The host's account directory: which tenant a vault account belongs to (the
30
+ * same mapping the relay's `tenantForAccount` entitlement lookup reads, so
31
+ * `backup.vault` resolves for a linked account).
32
+ */
33
+ export interface VaultAccountDirectory {
34
+ /** The tenant that owns `accountId`, or null when unknown. */
35
+ tenantForAccount(accountId: string): string | null | Promise<string | null>;
36
+ /** Record that `accountId` belongs to `tenantId`. Idempotent. */
37
+ linkAccount(tenantId: string, accountId: string): void | Promise<void>;
38
+ }
39
+ /**
40
+ * One audit record. Carries ids, codes and times only: never a password, a
41
+ * session id, a token, a key or a recovery secret.
42
+ */
43
+ export interface VaultAccountAuditEntry {
44
+ /** ISO time. */
45
+ at: string;
46
+ action: VaultAccountAction;
47
+ /**
48
+ * `denied`: refused before any relay call. `authorized`: both checks
49
+ * passed, written before the relay call. `succeeded` / `failed`: the relay
50
+ * call's outcome.
51
+ */
52
+ outcome: 'denied' | 'authorized' | 'succeeded' | 'failed';
53
+ /** The caller's user id; null when there was no usable session. */
54
+ actorUserId: string | null;
55
+ tenantId: string | null;
56
+ oldAccountId?: string;
57
+ newAccountId?: string;
58
+ deviceId?: string;
59
+ /** Set when `outcome` is `denied`. */
60
+ denial?: VaultAccountDenial;
61
+ /** Set when `outcome` is `failed`: an error name or code, never a message. */
62
+ errorCode?: string;
63
+ /** The relay's result word, when the call returned one. */
64
+ result?: string;
65
+ }
66
+ export interface VaultAccountAuditSink {
67
+ record(entry: VaultAccountAuditEntry): void | Promise<void>;
68
+ }
69
+ /** Collaborators and policy shared by every gated action. */
70
+ export interface VaultAccountAdminDeps {
71
+ relay: VaultRelayAdminPort;
72
+ directory: VaultAccountDirectory;
73
+ audit: VaultAccountAuditSink;
74
+ /**
75
+ * Longest age of the owner's last authentication, in seconds. Default 300
76
+ * (5 minutes); at most one hour.
77
+ */
78
+ stepUpMaxAgeSeconds?: number;
79
+ /**
80
+ * Replaces the default owner test (`isTenantOwnerSession`) for hosts with a
81
+ * custom owner role. It must still refuse device-only and layered sessions.
82
+ */
83
+ isOwner?: (session: StepUpSession) => boolean;
84
+ /** Clock, injectable for tests. */
85
+ now?: () => Date;
86
+ }
87
+ export interface SupersedeVaultAccountInput extends VaultAccountAdminDeps {
88
+ /** The caller's session context, from `SessionService.loadSessionContext`. */
89
+ session: StepUpSession | null | undefined;
90
+ oldAccount: string;
91
+ newAccount: string;
92
+ }
93
+ export interface UnsupersedeVaultAccountInput extends VaultAccountAdminDeps {
94
+ session: StepUpSession | null | undefined;
95
+ oldAccount: string;
96
+ }
97
+ export interface ProvisionRestartAccountInput extends VaultAccountAdminDeps {
98
+ session: StepUpSession | null | undefined;
99
+ /** The account being replaced; must belong to the caller's tenant. */
100
+ oldAccount: string;
101
+ /** The working device's relay signing key id. */
102
+ deviceId: string;
103
+ /** Its raw Ed25519 public key, base64url. */
104
+ devicePublicKey: string;
105
+ /** Mints the new account id. Default `crypto.randomUUID()`. */
106
+ newAccountId?: () => string | Promise<string>;
107
+ }
108
+ export interface ProvisionRestartAccountResult {
109
+ /** The new vault account, linked to the caller's tenant. */
110
+ accountId: string;
111
+ deviceId: string;
112
+ /** `registered` the first time, `unchanged` on a retry. */
113
+ device: 'registered' | 'unchanged';
114
+ }
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vault-account/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-subscriptions",
3
- "version": "0.60.15",
3
+ "version": "0.60.16",
4
4
  "description": "Tenant subscriptions, entitlement resolution, usage thresholds, and subscription UI for SMRT",
5
5
  "type": "module",
6
6
  "smrtRawPrimitives": "strict",
@@ -26,10 +26,11 @@
26
26
  }
27
27
  },
28
28
  "dependencies": {
29
- "@happyvertical/smrt-core": "0.60.15",
30
- "@happyvertical/smrt-tenancy": "0.60.15",
31
- "@happyvertical/smrt-ui": "0.60.15",
32
- "@happyvertical/sql": "^0.111.6"
29
+ "@happyvertical/smrt-core": "0.60.16",
30
+ "@happyvertical/smrt-tenancy": "0.60.16",
31
+ "@happyvertical/smrt-ui": "0.60.16",
32
+ "@happyvertical/smrt-users": "0.60.16",
33
+ "@happyvertical/sql": "^0.111.8"
33
34
  },
34
35
  "peerDependencies": {
35
36
  "svelte": "^5.57.0"
@@ -40,8 +41,9 @@
40
41
  }
41
42
  },
42
43
  "devDependencies": {
43
- "@happyvertical/smrt-features": "0.60.15",
44
- "@happyvertical/smrt-vitest": "0.60.15",
44
+ "@happyvertical/accounting": "^0.111.8",
45
+ "@happyvertical/smrt-features": "0.60.16",
46
+ "@happyvertical/smrt-vitest": "0.60.16",
45
47
  "@sveltejs/package": "^2.5.8",
46
48
  "@types/node": "24.13.6",
47
49
  "svelte": "^5.57.1",