@vibes.diy/api-svc 4.5.5 → 5.2.2

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 (187) hide show
  1. package/autumn.config.d.ts +4 -2
  2. package/autumn.config.js +12 -7
  3. package/autumn.config.js.map +1 -1
  4. package/billing.d.ts +77 -1
  5. package/billing.js +264 -3
  6. package/billing.js.map +1 -1
  7. package/cf-serve.d.ts +4 -1
  8. package/cf-serve.js +23 -0
  9. package/cf-serve.js.map +1 -1
  10. package/create-handler.d.ts +9 -1
  11. package/create-handler.js +5 -0
  12. package/create-handler.js.map +1 -1
  13. package/evento-handler-manifest.js +36 -0
  14. package/evento-handler-manifest.js.map +1 -1
  15. package/index.d.ts +17 -0
  16. package/index.js +17 -0
  17. package/index.js.map +1 -1
  18. package/intern/backend-db-callback.js +56 -0
  19. package/intern/backend-db-callback.js.map +1 -1
  20. package/intern/backend-egress.d.ts +1 -1
  21. package/intern/backend-egress.js +74 -22
  22. package/intern/backend-egress.js.map +1 -1
  23. package/intern/backend-policy-version.d.ts +1 -1
  24. package/intern/backend-policy-version.js +1 -1
  25. package/intern/components/vibe-page.js +5 -1
  26. package/intern/components/vibe-page.js.map +1 -1
  27. package/intern/delete-access-gate.d.ts +4 -0
  28. package/intern/delete-access-gate.js +46 -5
  29. package/intern/delete-access-gate.js.map +1 -1
  30. package/intern/egress-platform-list.d.ts +1 -0
  31. package/intern/egress-platform-list.js +4 -0
  32. package/intern/egress-platform-list.js.map +1 -1
  33. package/intern/emit-notification.d.ts +21 -0
  34. package/intern/emit-notification.js +43 -0
  35. package/intern/emit-notification.js.map +1 -0
  36. package/intern/ensure-app-metadata.js +4 -0
  37. package/intern/ensure-app-metadata.js.map +1 -1
  38. package/intern/ensure-chat-id.js +13 -2
  39. package/intern/ensure-chat-id.js.map +1 -1
  40. package/intern/ensure-slug-binding.js +20 -2
  41. package/intern/ensure-slug-binding.js.map +1 -1
  42. package/intern/notify-comment-posted.d.ts +8 -0
  43. package/intern/notify-comment-posted.js +24 -0
  44. package/intern/notify-comment-posted.js.map +1 -0
  45. package/intern/notify-dm-received.d.ts +9 -0
  46. package/intern/notify-dm-received.js +25 -0
  47. package/intern/notify-dm-received.js.map +1 -0
  48. package/intern/notify-member-joined.d.ts +11 -0
  49. package/intern/notify-member-joined.js +16 -0
  50. package/intern/notify-member-joined.js.map +1 -0
  51. package/intern/notify-remix-clone.d.ts +6 -0
  52. package/intern/notify-remix-clone.js +21 -0
  53. package/intern/notify-remix-clone.js.map +1 -0
  54. package/intern/notify-remix.d.ts +8 -0
  55. package/intern/notify-remix.js +23 -0
  56. package/intern/notify-remix.js.map +1 -0
  57. package/intern/notify-request-grant.d.ts +9 -0
  58. package/intern/notify-request-grant.js +18 -0
  59. package/intern/notify-request-grant.js.map +1 -0
  60. package/intern/notify-social-edge.d.ts +9 -0
  61. package/intern/notify-social-edge.js +45 -0
  62. package/intern/notify-social-edge.js.map +1 -0
  63. package/intern/notify-vibe-published.d.ts +7 -0
  64. package/intern/notify-vibe-published.js +22 -0
  65. package/intern/notify-vibe-published.js.map +1 -0
  66. package/intern/pre-allocate.d.ts +1 -0
  67. package/intern/pre-allocate.js +1 -0
  68. package/intern/pre-allocate.js.map +1 -1
  69. package/intern/process-access-bindings.js +12 -2
  70. package/intern/process-access-bindings.js.map +1 -1
  71. package/intern/put-access-gate.js +25 -3
  72. package/intern/put-access-gate.js.map +1 -1
  73. package/intern/read-anonymous-seed-docs.js +1 -1
  74. package/intern/read-anonymous-seed-docs.js.map +1 -1
  75. package/intern/recovery.d.ts +7 -1
  76. package/intern/recovery.js +5 -5
  77. package/intern/recovery.js.map +1 -1
  78. package/intern/render-vibe.js +7 -3
  79. package/intern/render-vibe.js.map +1 -1
  80. package/intern/slot-assembler.d.ts +2 -0
  81. package/intern/slot-assembler.js +9 -3
  82. package/intern/slot-assembler.js.map +1 -1
  83. package/intern/vibe-curation-decision.d.ts +18 -0
  84. package/intern/vibe-curation-decision.js +46 -0
  85. package/intern/vibe-curation-decision.js.map +1 -0
  86. package/intern/write-apps.js +9 -2
  87. package/intern/write-apps.js.map +1 -1
  88. package/package.json +16 -15
  89. package/public/access-function.js +4 -1
  90. package/public/access-function.js.map +1 -1
  91. package/public/access-helpers.js +5 -0
  92. package/public/access-helpers.js.map +1 -1
  93. package/public/app-documents-broadcast.d.ts +8 -0
  94. package/public/app-documents-broadcast.js +15 -0
  95. package/public/app-documents-broadcast.js.map +1 -1
  96. package/public/app-documents-grant-delta.js +3 -2
  97. package/public/app-documents-grant-delta.js.map +1 -1
  98. package/public/app-documents-read-eventos.js +72 -13
  99. package/public/app-documents-read-eventos.js.map +1 -1
  100. package/public/app-documents-write-eventos.js +28 -11
  101. package/public/app-documents-write-eventos.js.map +1 -1
  102. package/public/app-settings-sql-upsert.js +4 -1
  103. package/public/app-settings-sql-upsert.js.map +1 -1
  104. package/public/audience-arms-store.d.ts +21 -0
  105. package/public/audience-arms-store.js +110 -0
  106. package/public/audience-arms-store.js.map +1 -0
  107. package/public/audience-channels.d.ts +14 -0
  108. package/public/audience-channels.js +71 -0
  109. package/public/audience-channels.js.map +1 -0
  110. package/public/audience-derived-trigger.d.ts +15 -0
  111. package/public/audience-derived-trigger.js +45 -0
  112. package/public/audience-derived-trigger.js.map +1 -0
  113. package/public/audience-key-patch.d.ts +16 -0
  114. package/public/audience-key-patch.js +38 -0
  115. package/public/audience-key-patch.js.map +1 -0
  116. package/public/billing-msg.d.ts +5 -0
  117. package/public/billing-msg.js +143 -0
  118. package/public/billing-msg.js.map +1 -0
  119. package/public/channel-read-filter.js +4 -2
  120. package/public/channel-read-filter.js.map +1 -1
  121. package/public/curated-new-vibes.d.ts +5 -0
  122. package/public/curated-new-vibes.js +64 -0
  123. package/public/curated-new-vibes.js.map +1 -0
  124. package/public/developer-grants-flow.d.ts +5 -0
  125. package/public/developer-grants-flow.js +218 -0
  126. package/public/developer-grants-flow.js.map +1 -0
  127. package/public/developer-grants.d.ts +12 -0
  128. package/public/developer-grants.js +40 -0
  129. package/public/developer-grants.js.map +1 -0
  130. package/public/email-unsubscribe.d.ts +7 -0
  131. package/public/email-unsubscribe.js +41 -0
  132. package/public/email-unsubscribe.js.map +1 -0
  133. package/public/ensure-app-settings.js +69 -3
  134. package/public/ensure-app-settings.js.map +1 -1
  135. package/public/ensure-user-settings.js +9 -1
  136. package/public/ensure-user-settings.js.map +1 -1
  137. package/public/fork-app.js +24 -1
  138. package/public/fork-app.js.map +1 -1
  139. package/public/grant-reduce.d.ts +4 -2
  140. package/public/grant-reduce.js +11 -3
  141. package/public/grant-reduce.js.map +1 -1
  142. package/public/home-feed-common.d.ts +18 -0
  143. package/public/home-feed-common.js +46 -0
  144. package/public/home-feed-common.js.map +1 -0
  145. package/public/home-leaderboard.d.ts +5 -0
  146. package/public/home-leaderboard.js +64 -0
  147. package/public/home-leaderboard.js.map +1 -0
  148. package/public/image-gen.js +9 -0
  149. package/public/image-gen.js.map +1 -1
  150. package/public/invite-unsubscribe.d.ts +3 -0
  151. package/public/invite-unsubscribe.js +31 -0
  152. package/public/invite-unsubscribe.js.map +1 -0
  153. package/public/list-notifications.d.ts +4 -0
  154. package/public/list-notifications.js +157 -0
  155. package/public/list-notifications.js.map +1 -0
  156. package/public/related-vibes.d.ts +3 -0
  157. package/public/related-vibes.js +134 -0
  158. package/public/related-vibes.js.map +1 -0
  159. package/public/serv-entry-point.js +2 -2
  160. package/public/serv-entry-point.js.map +1 -1
  161. package/public/social-flow.d.ts +21 -0
  162. package/public/social-flow.js +765 -0
  163. package/public/social-flow.js.map +1 -0
  164. package/public/social-invite-flow.d.ts +3 -0
  165. package/public/social-invite-flow.js +73 -0
  166. package/public/social-invite-flow.js.map +1 -0
  167. package/public/social-invite-signup-match.d.ts +6 -0
  168. package/public/social-invite-signup-match.js +38 -0
  169. package/public/social-invite-signup-match.js.map +1 -0
  170. package/public/social-invite-store.d.ts +70 -0
  171. package/public/social-invite-store.js +172 -0
  172. package/public/social-invite-store.js.map +1 -0
  173. package/public/social-store.d.ts +109 -0
  174. package/public/social-store.js +469 -0
  175. package/public/social-store.js.map +1 -0
  176. package/public/who-am-i.js +5 -3
  177. package/public/who-am-i.js.map +1 -1
  178. package/svc-ws-send-provider.d.ts +2 -0
  179. package/svc-ws-send-provider.js +2 -0
  180. package/svc-ws-send-provider.js.map +1 -1
  181. package/types.d.ts +20 -1
  182. package/types.js.map +1 -1
  183. package/usage-report/README.md +1 -0
  184. package/usage-report/billing-reconcile-util.d.ts +7 -5
  185. package/usage-report/billing-reconcile-util.js +32 -17
  186. package/usage-report/billing-reconcile-util.js.map +1 -1
  187. package/usage-report/vibe-usage.py +171 -0
@@ -12,7 +12,7 @@ interface AutumnItem {
12
12
  };
13
13
  price?: {
14
14
  amount: number;
15
- billingMethod: "usage_based";
15
+ billingMethod: "prepaid";
16
16
  billingUnits: number;
17
17
  };
18
18
  }
@@ -20,6 +20,7 @@ interface AutumnPlan {
20
20
  id: string;
21
21
  name: string;
22
22
  autoEnable?: boolean;
23
+ addOn?: boolean;
23
24
  price?: {
24
25
  amount: number;
25
26
  interval: "month";
@@ -28,5 +29,6 @@ interface AutumnPlan {
28
29
  }
29
30
  export declare const aiCredits: AutumnFeature;
30
31
  export declare const free: AutumnPlan;
31
- export declare const pro: AutumnPlan;
32
+ export declare const plus: AutumnPlan;
33
+ export declare const credits: AutumnPlan;
32
34
  export {};
package/autumn.config.js CHANGED
@@ -8,18 +8,23 @@ export const free = {
8
8
  id: "free",
9
9
  name: "Free",
10
10
  autoEnable: true,
11
- items: [{ featureId: aiCredits.id, included: 250, reset: { interval: "month" } }],
11
+ items: [{ featureId: aiCredits.id, included: 500, reset: { interval: "month" } }],
12
12
  };
13
- export const pro = {
14
- id: "pro",
15
- name: "Vibes Pro",
13
+ export const plus = {
14
+ id: "plus",
15
+ name: "Vibes Plus",
16
16
  price: { amount: 5, interval: "month" },
17
+ items: [{ featureId: aiCredits.id, included: 1000, reset: { interval: "month" } }],
18
+ };
19
+ export const credits = {
20
+ id: "credits",
21
+ name: "AI Credits Top-Up",
22
+ addOn: true,
17
23
  items: [
18
24
  {
19
25
  featureId: aiCredits.id,
20
- included: 1000,
21
- reset: { interval: "month" },
22
- price: { amount: 0.02, billingMethod: "usage_based", billingUnits: 1 },
26
+ included: 0,
27
+ price: { amount: 5, billingMethod: "prepaid", billingUnits: 500 },
23
28
  },
24
29
  ],
25
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"autumn.config.js","sourceRoot":"","sources":["../jsr/autumn.config.ts"],"names":[],"mappings":"AAkCA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAe;IAC7B,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;IACvC,KAAK,EAAE;QACL;YACE,SAAS,EAAE,SAAS,CAAC,EAAE;YACvB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;YAC5B,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE;SACvE;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"autumn.config.js","sourceRoot":"","sources":["../jsr/autumn.config.ts"],"names":[],"mappings":"AAqDA,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;CAClF,CAAC;AAGF,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;IAIvC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;CACnF,CAAC;AAMF,MAAM,CAAC,MAAM,OAAO,GAAe;IACjC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE;QACL;YACE,SAAS,EAAE,SAAS,CAAC,EAAE;YACvB,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE;SAClE;KACF;CACF,CAAC"}
package/billing.d.ts CHANGED
@@ -1,5 +1,21 @@
1
1
  import { Logger, Result } from "@adviser/cement";
2
2
  export declare const AI_CREDITS_FEATURE_ID = "ai_credits";
3
+ export declare const DISPLAY_CREDITS_PER_CENT = 2;
4
+ export declare const PLUS_PLAN_ID = "plus";
5
+ export declare const CREDITS_PLAN_ID = "credits";
6
+ export declare const FREE_INCLUDED_CREDITS = 500;
7
+ export declare const PLUS_INCLUDED_CREDITS = 1000;
8
+ export declare const CREDITS_PER_TOPUP_UNIT = 500;
9
+ export declare const MAX_TOPUP_UNITS = 20;
10
+ export declare const AUTO_REFILL_THRESHOLDS: readonly [100, 200, 500];
11
+ export declare const AUTO_REFILL_RELOADS_USD: readonly [5, 10, 25];
12
+ export declare const AUTO_REFILL_DEFAULTS: {
13
+ readonly enabled: false;
14
+ readonly threshold: 200;
15
+ readonly reloadUsd: 5;
16
+ readonly capUsd: 25;
17
+ };
18
+ export declare function autoRefillCapChoicesUsd(reloadUsd: number): number[];
3
19
  export declare function costCentsFromUsage(usage: {
4
20
  readonly given: readonly object[];
5
21
  readonly calculated: {
@@ -15,14 +31,74 @@ export interface BillingTrackArgs {
15
31
  }
16
32
  export interface BillingCheckResult {
17
33
  readonly allowed: boolean;
18
- readonly remainingCents?: number;
34
+ readonly remainingCredits?: number;
19
35
  }
36
+ export interface BillingCustomerData {
37
+ readonly name?: string;
38
+ readonly email?: string;
39
+ }
40
+ export interface BillingAutoRefillState {
41
+ readonly enabled: boolean;
42
+ readonly threshold: number;
43
+ readonly reloadUsd: number;
44
+ readonly capUsd: number;
45
+ }
46
+ export interface BillingCustomerSummary {
47
+ readonly enabled: boolean;
48
+ readonly plan?: "free" | "plus";
49
+ readonly remaining?: number;
50
+ readonly grantRemaining?: number;
51
+ readonly grantIncluded?: number;
52
+ readonly grantResetsAt?: number;
53
+ readonly purchasedRemaining?: number;
54
+ readonly autoRefill?: BillingAutoRefillState;
55
+ }
56
+ export interface BillingCheckoutArgs {
57
+ readonly userId: string;
58
+ readonly kind: "subscribe-plus" | "top-up";
59
+ readonly units?: number;
60
+ readonly successUrl: string;
61
+ readonly customerData?: BillingCustomerData;
62
+ }
63
+ export type BillingCheckoutResult = {
64
+ readonly status: "ok";
65
+ readonly checkoutUrl: string;
66
+ } | {
67
+ readonly status: "membership-required";
68
+ };
69
+ export type BillingConfigResult = {
70
+ readonly status: "ok";
71
+ readonly autoRefill: BillingAutoRefillState;
72
+ } | {
73
+ readonly status: "membership-required";
74
+ } | {
75
+ readonly status: "no-saved-card";
76
+ };
77
+ export interface BillingConfigArgs {
78
+ readonly userId: string;
79
+ readonly autoRefill: BillingAutoRefillState;
80
+ readonly customerData?: BillingCustomerData;
81
+ }
82
+ export declare function isAllowedSuccessUrl(raw: string): boolean;
83
+ export interface AutoRefillWire {
84
+ readonly enabled: boolean;
85
+ readonly threshold: number;
86
+ readonly quantityCredits: number;
87
+ readonly limit: number;
88
+ }
89
+ export declare function parseAutoRefillConfig(cfg: BillingAutoRefillState): Result<AutoRefillWire>;
20
90
  export interface BillingIf {
21
91
  readonly enforceEnabled: boolean;
22
92
  trackUsage(args: BillingTrackArgs): Promise<Result<void>>;
23
93
  checkCredits(args: {
24
94
  readonly userId: string;
25
95
  }): Promise<Result<BillingCheckResult>>;
96
+ customerSummary(args: {
97
+ readonly userId: string;
98
+ readonly customerData?: BillingCustomerData;
99
+ }): Promise<Result<BillingCustomerSummary>>;
100
+ createCheckout(args: BillingCheckoutArgs): Promise<Result<BillingCheckoutResult>>;
101
+ setAutoRefill(args: BillingConfigArgs): Promise<Result<BillingConfigResult>>;
26
102
  }
27
103
  export declare function disabledBilling(): BillingIf;
28
104
  export declare function defaultBilling(opts: {
package/billing.js CHANGED
@@ -1,5 +1,20 @@
1
- import { exception2Result, Result } from "@adviser/cement";
1
+ import { exception2Result, Result, URI } from "@adviser/cement";
2
2
  export const AI_CREDITS_FEATURE_ID = "ai_credits";
3
+ export const DISPLAY_CREDITS_PER_CENT = 2;
4
+ export const PLUS_PLAN_ID = "plus";
5
+ export const CREDITS_PLAN_ID = "credits";
6
+ export const FREE_INCLUDED_CREDITS = 500;
7
+ export const PLUS_INCLUDED_CREDITS = 1000;
8
+ export const CREDITS_PER_TOPUP_UNIT = 500;
9
+ const USD_PER_TOPUP_UNIT = 5;
10
+ export const MAX_TOPUP_UNITS = 20;
11
+ export const AUTO_REFILL_THRESHOLDS = [100, 200, 500];
12
+ export const AUTO_REFILL_RELOADS_USD = [5, 10, 25];
13
+ export const AUTO_REFILL_DEFAULTS = { enabled: false, threshold: 200, reloadUsd: 5, capUsd: 25 };
14
+ const AUTO_REFILL_CAP_MENU_USD = [10, 25, 50, 100];
15
+ export function autoRefillCapChoicesUsd(reloadUsd) {
16
+ return AUTO_REFILL_CAP_MENU_USD.filter((cap) => cap % reloadUsd === 0).slice(0, 3);
17
+ }
3
18
  const FALLBACK_USD_PER_MTOK = 5;
4
19
  export function costCentsFromUsage(usage) {
5
20
  let usd = 0;
@@ -16,14 +31,130 @@ export function costCentsFromUsage(usage) {
16
31
  }
17
32
  return Math.max(0, Math.round(usd * 100));
18
33
  }
34
+ export function isAllowedSuccessUrl(raw) {
35
+ const r = exception2Result(() => {
36
+ const uri = URI.from(raw);
37
+ return { protocol: uri.protocol, hostname: uri.hostname };
38
+ });
39
+ if (r.isErr()) {
40
+ return false;
41
+ }
42
+ const { protocol, hostname } = r.Ok();
43
+ const isLocalhost = hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".localhost.vibesdiy.net");
44
+ if (protocol !== "https:" && (protocol !== "http:" || isLocalhost === false)) {
45
+ return false;
46
+ }
47
+ return (isLocalhost ||
48
+ hostname === "vibes.diy" ||
49
+ hostname.endsWith(".vibes.diy") ||
50
+ hostname === "vibesdiy.net" ||
51
+ hostname.endsWith(".vibesdiy.net") ||
52
+ hostname === "vibespreview.dev" ||
53
+ hostname.endsWith(".vibespreview.dev") ||
54
+ hostname.endsWith(".jchris.workers.dev"));
55
+ }
56
+ export function parseAutoRefillConfig(cfg) {
57
+ if (AUTO_REFILL_THRESHOLDS.some((t) => t === cfg.threshold) === false) {
58
+ return Result.Err(`auto-refill threshold must be one of ${AUTO_REFILL_THRESHOLDS.join("/")}`);
59
+ }
60
+ if (AUTO_REFILL_RELOADS_USD.some((rl) => rl === cfg.reloadUsd) === false) {
61
+ return Result.Err(`auto-refill reload must be one of $${AUTO_REFILL_RELOADS_USD.join("/$")}`);
62
+ }
63
+ if (Number.isInteger(cfg.capUsd) === false || cfg.capUsd <= 0 || cfg.capUsd % cfg.reloadUsd !== 0) {
64
+ return Result.Err(`auto-refill cap must be a positive multiple of the $${cfg.reloadUsd} reload`);
65
+ }
66
+ return Result.Ok({
67
+ enabled: cfg.enabled,
68
+ threshold: cfg.threshold,
69
+ quantityCredits: (cfg.reloadUsd / USD_PER_TOPUP_UNIT) * CREDITS_PER_TOPUP_UNIT,
70
+ limit: cfg.capUsd / cfg.reloadUsd,
71
+ });
72
+ }
19
73
  export function disabledBilling() {
20
74
  return {
21
75
  enforceEnabled: false,
22
76
  trackUsage: () => Promise.resolve(Result.Ok(undefined)),
23
77
  checkCredits: () => Promise.resolve(Result.Ok({ allowed: true })),
78
+ customerSummary: () => Promise.resolve(Result.Ok({ enabled: false })),
79
+ createCheckout: () => Promise.resolve(Result.Err("billing is not enabled in this environment")),
80
+ setAutoRefill: () => Promise.resolve(Result.Err("billing is not enabled in this environment")),
24
81
  };
25
82
  }
26
83
  const AUTUMN_API_BASE = "https://api.useautumn.com/v1";
84
+ function parseBalancesJson(json) {
85
+ const balance = json.balance;
86
+ const remaining = balance !== undefined && balance !== null && typeof balance.remaining === "number" ? balance.remaining : undefined;
87
+ const breakdown = balance !== undefined && balance !== null && Array.isArray(balance.breakdown)
88
+ ? balance.breakdown
89
+ : [];
90
+ const resetOf = (e) => {
91
+ const reset = e.reset;
92
+ return reset !== undefined && reset !== null ? reset : undefined;
93
+ };
94
+ const intervalOf = (e) => {
95
+ if (typeof e.interval === "string")
96
+ return e.interval;
97
+ const reset = resetOf(e);
98
+ if (reset !== undefined && typeof reset.interval === "string")
99
+ return reset.interval;
100
+ return "one_off";
101
+ };
102
+ const isPurchased = (e) => {
103
+ if (e.plan_id === CREDITS_PLAN_ID)
104
+ return true;
105
+ const interval = intervalOf(e);
106
+ return interval === "one_off" || interval === "lifetime";
107
+ };
108
+ let grantRemaining = 0;
109
+ let purchasedRemaining = 0;
110
+ let grantResetsAt;
111
+ for (const e of breakdown) {
112
+ const rem = typeof e.remaining === "number" ? e.remaining : 0;
113
+ if (isPurchased(e)) {
114
+ purchasedRemaining += rem;
115
+ continue;
116
+ }
117
+ grantRemaining += rem;
118
+ const reset = resetOf(e);
119
+ if (reset !== undefined &&
120
+ typeof reset.resets_at === "number" &&
121
+ (grantResetsAt === undefined || reset.resets_at < grantResetsAt)) {
122
+ grantResetsAt = reset.resets_at;
123
+ }
124
+ }
125
+ const plan = breakdown.some((e) => e.plan_id === PLUS_PLAN_ID) ? "plus" : "free";
126
+ return {
127
+ ...(remaining !== undefined ? { remaining } : {}),
128
+ plan,
129
+ grantRemaining,
130
+ ...(grantResetsAt !== undefined ? { grantResetsAt } : {}),
131
+ purchasedRemaining,
132
+ hasBreakdown: breakdown.length > 0,
133
+ };
134
+ }
135
+ function parseAutoRefillJson(json) {
136
+ const controls = json.billing_controls;
137
+ const topups = controls !== undefined && controls !== null && Array.isArray(controls.auto_topups) ? controls.auto_topups : [];
138
+ const mine = topups.find((t) => t.feature_id === AI_CREDITS_FEATURE_ID);
139
+ if (mine === undefined || typeof mine.quantity !== "number" || mine.quantity <= 0) {
140
+ return AUTO_REFILL_DEFAULTS;
141
+ }
142
+ const reloadUsd = (mine.quantity / CREDITS_PER_TOPUP_UNIT) * USD_PER_TOPUP_UNIT;
143
+ const purchaseLimit = mine.purchase_limit;
144
+ const limit = purchaseLimit !== undefined && purchaseLimit !== null && typeof purchaseLimit.limit === "number"
145
+ ? purchaseLimit.limit
146
+ : undefined;
147
+ return {
148
+ enabled: mine.enabled === true,
149
+ threshold: typeof mine.threshold === "number" ? mine.threshold : AUTO_REFILL_DEFAULTS.threshold,
150
+ reloadUsd,
151
+ capUsd: limit !== undefined ? limit * reloadUsd : AUTO_REFILL_DEFAULTS.capUsd,
152
+ };
153
+ }
154
+ function hasSavedCard(json) {
155
+ const pm = json.payment_method;
156
+ return pm !== undefined && pm !== null;
157
+ }
27
158
  export function defaultBilling(opts) {
28
159
  const secretKey = opts.secretKey;
29
160
  if (secretKey === undefined || secretKey === "" || opts.track !== "on") {
@@ -58,13 +189,20 @@ export function defaultBilling(opts) {
58
189
  }
59
190
  return post(path, body);
60
191
  }
192
+ const getOrCreate = (userId, customerData, expand) => post("/customers.get_or_create", {
193
+ customer_id: userId,
194
+ ...(customerData?.name !== undefined && customerData.name !== "" ? { name: customerData.name } : {}),
195
+ ...(customerData?.email !== undefined && customerData.email !== "" ? { email: customerData.email } : {}),
196
+ ...(expand !== undefined ? { expand } : {}),
197
+ });
198
+ const checkBalances = (userId) => post("/balances.check", { customer_id: userId, feature_id: AI_CREDITS_FEATURE_ID });
61
199
  return {
62
200
  enforceEnabled: opts.enforce === "on",
63
201
  async trackUsage({ userId, costCents, promptId, model, mode }) {
64
202
  const r = await postWithCustomerRetry("/balances.track", {
65
203
  customer_id: userId,
66
204
  feature_id: AI_CREDITS_FEATURE_ID,
67
- value: costCents,
205
+ value: costCents * DISPLAY_CREDITS_PER_CENT,
68
206
  idempotency_key: promptId,
69
207
  properties: {
70
208
  ...(model !== undefined && model !== "" ? { model } : {}),
@@ -93,7 +231,130 @@ export function defaultBilling(opts) {
93
231
  }
94
232
  const balance = json.balance;
95
233
  const remaining = balance !== undefined && balance !== null && typeof balance.remaining === "number" ? balance.remaining : undefined;
96
- return Result.Ok({ allowed: json.allowed === true, ...(remaining !== undefined ? { remainingCents: remaining } : {}) });
234
+ return Result.Ok({ allowed: json.allowed === true, ...(remaining !== undefined ? { remainingCredits: remaining } : {}) });
235
+ },
236
+ async customerSummary({ userId, customerData }) {
237
+ const rCustomer = await getOrCreate(userId, customerData, ["payment_method", "billing_controls.auto_topups.purchase_limit"]);
238
+ if (rCustomer.isErr()) {
239
+ return Result.Err(rCustomer);
240
+ }
241
+ if (rCustomer.Ok().status >= 400) {
242
+ return Result.Err(`autumn get_or_create failed: ${rCustomer.Ok().status} ${JSON.stringify(rCustomer.Ok().json)}`);
243
+ }
244
+ const rCheck = await checkBalances(userId);
245
+ if (rCheck.isErr()) {
246
+ return Result.Err(rCheck);
247
+ }
248
+ if (rCheck.Ok().status >= 400) {
249
+ return Result.Err(`autumn balances failed: ${rCheck.Ok().status} ${JSON.stringify(rCheck.Ok().json)}`);
250
+ }
251
+ const parsed = parseBalancesJson(rCheck.Ok().json);
252
+ return Result.Ok({
253
+ enabled: true,
254
+ plan: parsed.plan,
255
+ ...(parsed.remaining !== undefined ? { remaining: parsed.remaining } : {}),
256
+ ...(parsed.hasBreakdown ? { grantRemaining: parsed.grantRemaining, purchasedRemaining: parsed.purchasedRemaining } : {}),
257
+ grantIncluded: parsed.plan === "plus" ? PLUS_INCLUDED_CREDITS : FREE_INCLUDED_CREDITS,
258
+ ...(parsed.grantResetsAt !== undefined ? { grantResetsAt: parsed.grantResetsAt } : {}),
259
+ autoRefill: parseAutoRefillJson(rCustomer.Ok().json),
260
+ });
261
+ },
262
+ async createCheckout({ userId, kind, units, successUrl, customerData }) {
263
+ if (isAllowedSuccessUrl(successUrl) === false) {
264
+ return Result.Err(`successUrl not allowed: ${successUrl}`);
265
+ }
266
+ const rCustomer = await getOrCreate(userId, customerData);
267
+ if (rCustomer.isErr()) {
268
+ return Result.Err(rCustomer);
269
+ }
270
+ let body;
271
+ if (kind === "subscribe-plus") {
272
+ body = { customer_id: userId, plan_id: PLUS_PLAN_ID, success_url: successUrl };
273
+ }
274
+ else {
275
+ const rCheck = await checkBalances(userId);
276
+ if (rCheck.isErr()) {
277
+ return Result.Err(rCheck);
278
+ }
279
+ if (rCheck.Ok().status >= 400) {
280
+ return Result.Err(`autumn balances failed: ${rCheck.Ok().status} ${JSON.stringify(rCheck.Ok().json)}`);
281
+ }
282
+ if (parseBalancesJson(rCheck.Ok().json).plan !== "plus") {
283
+ return Result.Ok({ status: "membership-required" });
284
+ }
285
+ const nUnits = Math.min(Math.max(Math.floor(units ?? 1), 1), MAX_TOPUP_UNITS);
286
+ body = {
287
+ customer_id: userId,
288
+ plan_id: CREDITS_PLAN_ID,
289
+ feature_quantities: [{ feature_id: AI_CREDITS_FEATURE_ID, quantity: nUnits * CREDITS_PER_TOPUP_UNIT }],
290
+ success_url: successUrl,
291
+ };
292
+ }
293
+ const r = await post("/billing.attach", body);
294
+ if (r.isErr()) {
295
+ return Result.Err(r);
296
+ }
297
+ const { status, json } = r.Ok();
298
+ if (status >= 400) {
299
+ return Result.Err(`autumn attach failed: ${status} ${JSON.stringify(json)}`);
300
+ }
301
+ const url = typeof json.checkout_url === "string"
302
+ ? json.checkout_url
303
+ : typeof json.payment_url === "string"
304
+ ? json.payment_url
305
+ : undefined;
306
+ if (url === undefined || url === "") {
307
+ return Result.Err(`autumn attach returned no checkout url: ${JSON.stringify(json)}`);
308
+ }
309
+ return Result.Ok({ status: "ok", checkoutUrl: url });
310
+ },
311
+ async setAutoRefill({ userId, autoRefill, customerData }) {
312
+ const rWire = parseAutoRefillConfig(autoRefill);
313
+ if (rWire.isErr()) {
314
+ return Result.Err(rWire);
315
+ }
316
+ const rCustomer = await getOrCreate(userId, customerData, ["payment_method"]);
317
+ if (rCustomer.isErr()) {
318
+ return Result.Err(rCustomer);
319
+ }
320
+ if (rCustomer.Ok().status >= 400) {
321
+ return Result.Err(`autumn get_or_create failed: ${rCustomer.Ok().status} ${JSON.stringify(rCustomer.Ok().json)}`);
322
+ }
323
+ const rCheck = await checkBalances(userId);
324
+ if (rCheck.isErr()) {
325
+ return Result.Err(rCheck);
326
+ }
327
+ if (rCheck.Ok().status >= 400) {
328
+ return Result.Err(`autumn balances failed: ${rCheck.Ok().status} ${JSON.stringify(rCheck.Ok().json)}`);
329
+ }
330
+ if (parseBalancesJson(rCheck.Ok().json).plan !== "plus") {
331
+ return Result.Ok({ status: "membership-required" });
332
+ }
333
+ if (autoRefill.enabled === true && hasSavedCard(rCustomer.Ok().json) === false) {
334
+ return Result.Ok({ status: "no-saved-card" });
335
+ }
336
+ const wire = rWire.Ok();
337
+ const r = await post("/customers.update", {
338
+ customer_id: userId,
339
+ billing_controls: {
340
+ auto_topups: [
341
+ {
342
+ feature_id: AI_CREDITS_FEATURE_ID,
343
+ enabled: wire.enabled,
344
+ threshold: wire.threshold,
345
+ quantity: wire.quantityCredits,
346
+ purchase_limit: { interval: "month", limit: wire.limit },
347
+ },
348
+ ],
349
+ },
350
+ });
351
+ if (r.isErr()) {
352
+ return Result.Err(r);
353
+ }
354
+ if (r.Ok().status >= 400) {
355
+ return Result.Err(`autumn customers.update failed: ${r.Ok().status} ${JSON.stringify(r.Ok().json)}`);
356
+ }
357
+ return Result.Ok({ status: "ok", autoRefill });
97
358
  },
98
359
  };
99
360
  }
package/billing.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"billing.js","sourceRoot":"","sources":["../jsr/billing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../jsr/billing.ts"],"names":[],"mappings":"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"}
package/cf-serve.d.ts CHANGED
@@ -5,7 +5,7 @@ import { LLMRequest } from "@vibes.diy/call-ai-v2";
5
5
  import { AppContext } from "@adviser/cement";
6
6
  import { SuperThis } from "@vibes.diy/identity";
7
7
  import { CfCacheIf, type VibesApiSQLCtx } from "./types.js";
8
- import { type AccessDescriptor, type UserContext, type EvtViewerGrantsChanged, CFEnv, type EvtRequestGrant } from "@vibes.diy/api-types";
8
+ import { type AccessDescriptor, type UserContext, type EvtViewerGrantsChanged, CFEnv, type EvtRequestGrant, type EvtSocialEdge } from "@vibes.diy/api-types";
9
9
  import { VibesSqlite } from "@vibes.diy/api-sql";
10
10
  import type { QuickJSWASMModule } from "@cf-wasm/quickjs";
11
11
  export interface CFInjectMutable {
@@ -48,6 +48,9 @@ export declare function localBroadcastCallbacks(connections: Set<WSSendProvider>
48
48
  notifyRequestGrantChanged: (evt: EvtRequestGrant, senderConnId: string) => Promise<void>;
49
49
  registerRequestGrantSubscription: (_subscriptionKey: string) => Promise<void>;
50
50
  deregisterRequestGrantSubscription: (_subscriptionKey: string) => Promise<void>;
51
+ notifySocialEdgeChanged: (evt: EvtSocialEdge, senderConnId: string) => Promise<void>;
52
+ registerSocialSubscription: (_subscriptionKey: string) => Promise<void>;
53
+ deregisterSocialSubscription: (_subscriptionKey: string) => Promise<void>;
51
54
  notifyViewerGrantsChanged: (evt: EvtViewerGrantsChanged, _senderConnId: string) => Promise<void>;
52
55
  registerViewerGrantsSubscription: (_subscriptionKey: string) => Promise<void>;
53
56
  deregisterViewerGrantsSubscription: (_subscriptionKey: string) => Promise<void>;
package/cf-serve.js CHANGED
@@ -136,6 +136,29 @@ export function localBroadcastCallbacks(connections, env) {
136
136
  },
137
137
  deregisterRequestGrantSubscription: async (_subscriptionKey) => {
138
138
  },
139
+ notifySocialEdgeChanged: async (evt, senderConnId) => {
140
+ const keys = [`social/${evt.edge.followerHandle}`, `social/${evt.edge.followeeHandle}`];
141
+ if (shouldLog) {
142
+ console.info("[Sessions] notifySocialEdgeChanged keys:", keys.join(","), "conn:", senderConnId.slice(0, 8));
143
+ }
144
+ for (const conn of connections) {
145
+ if (keys.some((key) => conn.subscribedSocialKeys.has(key)) === false)
146
+ continue;
147
+ if (conn.connId === senderConnId)
148
+ continue;
149
+ exception2Result(() => conn.ws.send(conn.ende.uint8ify({
150
+ tid: crypto.randomUUID(),
151
+ src: "vibes.diy.api",
152
+ dst: "vibes.diy.client",
153
+ ttl: 10,
154
+ payload: evt,
155
+ })));
156
+ }
157
+ },
158
+ registerSocialSubscription: async (_subscriptionKey) => {
159
+ },
160
+ deregisterSocialSubscription: async (_subscriptionKey) => {
161
+ },
139
162
  notifyViewerGrantsChanged: async (evt, _senderConnId) => {
140
163
  const key = `${evt.ownerHandle}/${evt.appSlug}`;
141
164
  if (shouldLog) {