@agent-relay/cloud 0.1.0

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 (269) hide show
  1. package/dist/api/admin.d.ts +8 -0
  2. package/dist/api/admin.d.ts.map +1 -0
  3. package/dist/api/admin.js +225 -0
  4. package/dist/api/admin.js.map +1 -0
  5. package/dist/api/auth.d.ts +20 -0
  6. package/dist/api/auth.d.ts.map +1 -0
  7. package/dist/api/auth.js +136 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/billing.d.ts +7 -0
  10. package/dist/api/billing.d.ts.map +1 -0
  11. package/dist/api/billing.js +564 -0
  12. package/dist/api/billing.js.map +1 -0
  13. package/dist/api/cli-pty-runner.d.ts +53 -0
  14. package/dist/api/cli-pty-runner.d.ts.map +1 -0
  15. package/dist/api/cli-pty-runner.js +193 -0
  16. package/dist/api/cli-pty-runner.js.map +1 -0
  17. package/dist/api/codex-auth-helper.d.ts +21 -0
  18. package/dist/api/codex-auth-helper.d.ts.map +1 -0
  19. package/dist/api/codex-auth-helper.js +327 -0
  20. package/dist/api/codex-auth-helper.js.map +1 -0
  21. package/dist/api/consensus.d.ts +13 -0
  22. package/dist/api/consensus.d.ts.map +1 -0
  23. package/dist/api/consensus.js +261 -0
  24. package/dist/api/consensus.js.map +1 -0
  25. package/dist/api/coordinators.d.ts +8 -0
  26. package/dist/api/coordinators.d.ts.map +1 -0
  27. package/dist/api/coordinators.js +750 -0
  28. package/dist/api/coordinators.js.map +1 -0
  29. package/dist/api/daemons.d.ts +12 -0
  30. package/dist/api/daemons.d.ts.map +1 -0
  31. package/dist/api/daemons.js +535 -0
  32. package/dist/api/daemons.js.map +1 -0
  33. package/dist/api/generic-webhooks.d.ts +8 -0
  34. package/dist/api/generic-webhooks.d.ts.map +1 -0
  35. package/dist/api/generic-webhooks.js +129 -0
  36. package/dist/api/generic-webhooks.js.map +1 -0
  37. package/dist/api/git.d.ts +8 -0
  38. package/dist/api/git.d.ts.map +1 -0
  39. package/dist/api/git.js +269 -0
  40. package/dist/api/git.js.map +1 -0
  41. package/dist/api/github-app.d.ts +11 -0
  42. package/dist/api/github-app.d.ts.map +1 -0
  43. package/dist/api/github-app.js +223 -0
  44. package/dist/api/github-app.js.map +1 -0
  45. package/dist/api/middleware/planLimits.d.ts +43 -0
  46. package/dist/api/middleware/planLimits.d.ts.map +1 -0
  47. package/dist/api/middleware/planLimits.js +202 -0
  48. package/dist/api/middleware/planLimits.js.map +1 -0
  49. package/dist/api/monitoring.d.ts +11 -0
  50. package/dist/api/monitoring.d.ts.map +1 -0
  51. package/dist/api/monitoring.js +578 -0
  52. package/dist/api/monitoring.js.map +1 -0
  53. package/dist/api/nango-auth.d.ts +9 -0
  54. package/dist/api/nango-auth.d.ts.map +1 -0
  55. package/dist/api/nango-auth.js +674 -0
  56. package/dist/api/nango-auth.js.map +1 -0
  57. package/dist/api/onboarding.d.ts +15 -0
  58. package/dist/api/onboarding.d.ts.map +1 -0
  59. package/dist/api/onboarding.js +679 -0
  60. package/dist/api/onboarding.js.map +1 -0
  61. package/dist/api/policy.d.ts +8 -0
  62. package/dist/api/policy.d.ts.map +1 -0
  63. package/dist/api/policy.js +229 -0
  64. package/dist/api/policy.js.map +1 -0
  65. package/dist/api/provider-env.d.ts +14 -0
  66. package/dist/api/provider-env.d.ts.map +1 -0
  67. package/dist/api/provider-env.js +75 -0
  68. package/dist/api/provider-env.js.map +1 -0
  69. package/dist/api/providers.d.ts +7 -0
  70. package/dist/api/providers.d.ts.map +1 -0
  71. package/dist/api/providers.js +564 -0
  72. package/dist/api/providers.js.map +1 -0
  73. package/dist/api/repos.d.ts +8 -0
  74. package/dist/api/repos.d.ts.map +1 -0
  75. package/dist/api/repos.js +577 -0
  76. package/dist/api/repos.js.map +1 -0
  77. package/dist/api/sessions.d.ts +11 -0
  78. package/dist/api/sessions.d.ts.map +1 -0
  79. package/dist/api/sessions.js +302 -0
  80. package/dist/api/sessions.js.map +1 -0
  81. package/dist/api/teams.d.ts +7 -0
  82. package/dist/api/teams.d.ts.map +1 -0
  83. package/dist/api/teams.js +281 -0
  84. package/dist/api/teams.js.map +1 -0
  85. package/dist/api/test-helpers.d.ts +10 -0
  86. package/dist/api/test-helpers.d.ts.map +1 -0
  87. package/dist/api/test-helpers.js +745 -0
  88. package/dist/api/test-helpers.js.map +1 -0
  89. package/dist/api/usage.d.ts +7 -0
  90. package/dist/api/usage.d.ts.map +1 -0
  91. package/dist/api/usage.js +111 -0
  92. package/dist/api/usage.js.map +1 -0
  93. package/dist/api/webhooks.d.ts +8 -0
  94. package/dist/api/webhooks.d.ts.map +1 -0
  95. package/dist/api/webhooks.js +645 -0
  96. package/dist/api/webhooks.js.map +1 -0
  97. package/dist/api/workspaces.d.ts +25 -0
  98. package/dist/api/workspaces.d.ts.map +1 -0
  99. package/dist/api/workspaces.js +1799 -0
  100. package/dist/api/workspaces.js.map +1 -0
  101. package/dist/billing/index.d.ts +9 -0
  102. package/dist/billing/index.d.ts.map +1 -0
  103. package/dist/billing/index.js +9 -0
  104. package/dist/billing/index.js.map +1 -0
  105. package/dist/billing/plans.d.ts +39 -0
  106. package/dist/billing/plans.d.ts.map +1 -0
  107. package/dist/billing/plans.js +245 -0
  108. package/dist/billing/plans.js.map +1 -0
  109. package/dist/billing/service.d.ts +80 -0
  110. package/dist/billing/service.d.ts.map +1 -0
  111. package/dist/billing/service.js +388 -0
  112. package/dist/billing/service.js.map +1 -0
  113. package/dist/billing/types.d.ts +141 -0
  114. package/dist/billing/types.d.ts.map +1 -0
  115. package/dist/billing/types.js +7 -0
  116. package/dist/billing/types.js.map +1 -0
  117. package/dist/config.d.ts +5 -0
  118. package/dist/config.d.ts.map +1 -0
  119. package/dist/config.js +5 -0
  120. package/dist/config.js.map +1 -0
  121. package/dist/db/bulk-ingest.d.ts +89 -0
  122. package/dist/db/bulk-ingest.d.ts.map +1 -0
  123. package/dist/db/bulk-ingest.js +268 -0
  124. package/dist/db/bulk-ingest.js.map +1 -0
  125. package/dist/db/drizzle.d.ts +256 -0
  126. package/dist/db/drizzle.d.ts.map +1 -0
  127. package/dist/db/drizzle.js +1286 -0
  128. package/dist/db/drizzle.js.map +1 -0
  129. package/dist/db/index.d.ts +55 -0
  130. package/dist/db/index.d.ts.map +1 -0
  131. package/dist/db/index.js +68 -0
  132. package/dist/db/index.js.map +1 -0
  133. package/dist/db/schema.d.ts +4873 -0
  134. package/dist/db/schema.d.ts.map +1 -0
  135. package/dist/db/schema.js +620 -0
  136. package/dist/db/schema.js.map +1 -0
  137. package/dist/index.d.ts +11 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +38 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/provisioner/index.d.ts +207 -0
  142. package/dist/provisioner/index.d.ts.map +1 -0
  143. package/dist/provisioner/index.js +2114 -0
  144. package/dist/provisioner/index.js.map +1 -0
  145. package/dist/server.d.ts +17 -0
  146. package/dist/server.d.ts.map +1 -0
  147. package/dist/server.js +1924 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/services/auto-scaler.d.ts +152 -0
  150. package/dist/services/auto-scaler.d.ts.map +1 -0
  151. package/dist/services/auto-scaler.js +439 -0
  152. package/dist/services/auto-scaler.js.map +1 -0
  153. package/dist/services/capacity-manager.d.ts +148 -0
  154. package/dist/services/capacity-manager.d.ts.map +1 -0
  155. package/dist/services/capacity-manager.js +449 -0
  156. package/dist/services/capacity-manager.js.map +1 -0
  157. package/dist/services/ci-agent-spawner.d.ts +49 -0
  158. package/dist/services/ci-agent-spawner.d.ts.map +1 -0
  159. package/dist/services/ci-agent-spawner.js +373 -0
  160. package/dist/services/ci-agent-spawner.js.map +1 -0
  161. package/dist/services/cloud-message-bus.d.ts +28 -0
  162. package/dist/services/cloud-message-bus.d.ts.map +1 -0
  163. package/dist/services/cloud-message-bus.js +19 -0
  164. package/dist/services/cloud-message-bus.js.map +1 -0
  165. package/dist/services/compute-enforcement.d.ts +57 -0
  166. package/dist/services/compute-enforcement.d.ts.map +1 -0
  167. package/dist/services/compute-enforcement.js +175 -0
  168. package/dist/services/compute-enforcement.js.map +1 -0
  169. package/dist/services/coordinator.d.ts +62 -0
  170. package/dist/services/coordinator.d.ts.map +1 -0
  171. package/dist/services/coordinator.js +389 -0
  172. package/dist/services/coordinator.js.map +1 -0
  173. package/dist/services/index.d.ts +17 -0
  174. package/dist/services/index.d.ts.map +1 -0
  175. package/dist/services/index.js +25 -0
  176. package/dist/services/index.js.map +1 -0
  177. package/dist/services/intro-expiration.d.ts +60 -0
  178. package/dist/services/intro-expiration.d.ts.map +1 -0
  179. package/dist/services/intro-expiration.js +252 -0
  180. package/dist/services/intro-expiration.js.map +1 -0
  181. package/dist/services/mention-handler.d.ts +65 -0
  182. package/dist/services/mention-handler.d.ts.map +1 -0
  183. package/dist/services/mention-handler.js +405 -0
  184. package/dist/services/mention-handler.js.map +1 -0
  185. package/dist/services/nango.d.ts +201 -0
  186. package/dist/services/nango.d.ts.map +1 -0
  187. package/dist/services/nango.js +392 -0
  188. package/dist/services/nango.js.map +1 -0
  189. package/dist/services/persistence.d.ts +131 -0
  190. package/dist/services/persistence.d.ts.map +1 -0
  191. package/dist/services/persistence.js +200 -0
  192. package/dist/services/persistence.js.map +1 -0
  193. package/dist/services/planLimits.d.ts +147 -0
  194. package/dist/services/planLimits.d.ts.map +1 -0
  195. package/dist/services/planLimits.js +335 -0
  196. package/dist/services/planLimits.js.map +1 -0
  197. package/dist/services/presence-registry.d.ts +56 -0
  198. package/dist/services/presence-registry.d.ts.map +1 -0
  199. package/dist/services/presence-registry.js +91 -0
  200. package/dist/services/presence-registry.js.map +1 -0
  201. package/dist/services/scaling-orchestrator.d.ts +159 -0
  202. package/dist/services/scaling-orchestrator.d.ts.map +1 -0
  203. package/dist/services/scaling-orchestrator.js +502 -0
  204. package/dist/services/scaling-orchestrator.js.map +1 -0
  205. package/dist/services/scaling-policy.d.ts +121 -0
  206. package/dist/services/scaling-policy.d.ts.map +1 -0
  207. package/dist/services/scaling-policy.js +415 -0
  208. package/dist/services/scaling-policy.js.map +1 -0
  209. package/dist/services/ssh-security.d.ts +31 -0
  210. package/dist/services/ssh-security.d.ts.map +1 -0
  211. package/dist/services/ssh-security.js +63 -0
  212. package/dist/services/ssh-security.js.map +1 -0
  213. package/dist/services/workspace-keepalive.d.ts +76 -0
  214. package/dist/services/workspace-keepalive.d.ts.map +1 -0
  215. package/dist/services/workspace-keepalive.js +234 -0
  216. package/dist/services/workspace-keepalive.js.map +1 -0
  217. package/dist/shims/consensus.d.ts +23 -0
  218. package/dist/shims/consensus.d.ts.map +1 -0
  219. package/dist/shims/consensus.js +5 -0
  220. package/dist/shims/consensus.js.map +1 -0
  221. package/dist/webhooks/index.d.ts +24 -0
  222. package/dist/webhooks/index.d.ts.map +1 -0
  223. package/dist/webhooks/index.js +29 -0
  224. package/dist/webhooks/index.js.map +1 -0
  225. package/dist/webhooks/parsers/github.d.ts +8 -0
  226. package/dist/webhooks/parsers/github.d.ts.map +1 -0
  227. package/dist/webhooks/parsers/github.js +234 -0
  228. package/dist/webhooks/parsers/github.js.map +1 -0
  229. package/dist/webhooks/parsers/index.d.ts +23 -0
  230. package/dist/webhooks/parsers/index.d.ts.map +1 -0
  231. package/dist/webhooks/parsers/index.js +30 -0
  232. package/dist/webhooks/parsers/index.js.map +1 -0
  233. package/dist/webhooks/parsers/linear.d.ts +9 -0
  234. package/dist/webhooks/parsers/linear.d.ts.map +1 -0
  235. package/dist/webhooks/parsers/linear.js +258 -0
  236. package/dist/webhooks/parsers/linear.js.map +1 -0
  237. package/dist/webhooks/parsers/slack.d.ts +9 -0
  238. package/dist/webhooks/parsers/slack.d.ts.map +1 -0
  239. package/dist/webhooks/parsers/slack.js +214 -0
  240. package/dist/webhooks/parsers/slack.js.map +1 -0
  241. package/dist/webhooks/responders/github.d.ts +8 -0
  242. package/dist/webhooks/responders/github.d.ts.map +1 -0
  243. package/dist/webhooks/responders/github.js +73 -0
  244. package/dist/webhooks/responders/github.js.map +1 -0
  245. package/dist/webhooks/responders/index.d.ts +23 -0
  246. package/dist/webhooks/responders/index.d.ts.map +1 -0
  247. package/dist/webhooks/responders/index.js +30 -0
  248. package/dist/webhooks/responders/index.js.map +1 -0
  249. package/dist/webhooks/responders/linear.d.ts +9 -0
  250. package/dist/webhooks/responders/linear.d.ts.map +1 -0
  251. package/dist/webhooks/responders/linear.js +149 -0
  252. package/dist/webhooks/responders/linear.js.map +1 -0
  253. package/dist/webhooks/responders/slack.d.ts +20 -0
  254. package/dist/webhooks/responders/slack.d.ts.map +1 -0
  255. package/dist/webhooks/responders/slack.js +178 -0
  256. package/dist/webhooks/responders/slack.js.map +1 -0
  257. package/dist/webhooks/router.d.ts +25 -0
  258. package/dist/webhooks/router.d.ts.map +1 -0
  259. package/dist/webhooks/router.js +504 -0
  260. package/dist/webhooks/router.js.map +1 -0
  261. package/dist/webhooks/rules-engine.d.ts +24 -0
  262. package/dist/webhooks/rules-engine.d.ts.map +1 -0
  263. package/dist/webhooks/rules-engine.js +287 -0
  264. package/dist/webhooks/rules-engine.js.map +1 -0
  265. package/dist/webhooks/types.d.ts +186 -0
  266. package/dist/webhooks/types.d.ts.map +1 -0
  267. package/dist/webhooks/types.js +8 -0
  268. package/dist/webhooks/types.js.map +1 -0
  269. package/package.json +55 -0
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Agent Relay Cloud - Billing Service
3
+ *
4
+ * Stripe integration for subscription management, payments, and webhooks.
5
+ */
6
+ import Stripe from 'stripe';
7
+ import { getConfig } from '../config.js';
8
+ import { getPlan } from './plans.js';
9
+ let stripeClient = null;
10
+ /**
11
+ * Get or create Stripe client
12
+ */
13
+ function getStripe() {
14
+ if (!stripeClient) {
15
+ const config = getConfig();
16
+ stripeClient = new Stripe(config.stripe.secretKey);
17
+ }
18
+ return stripeClient;
19
+ }
20
+ /**
21
+ * Billing Service
22
+ */
23
+ export class BillingService {
24
+ stripe;
25
+ constructor() {
26
+ this.stripe = getStripe();
27
+ }
28
+ /**
29
+ * Create or get a Stripe customer for a user
30
+ */
31
+ async getOrCreateCustomer(userId, email, name) {
32
+ // Search for existing customer by metadata
33
+ const existing = await this.stripe.customers.search({
34
+ query: `metadata['user_id']:'${userId}'`,
35
+ limit: 1,
36
+ });
37
+ if (existing.data.length > 0) {
38
+ return existing.data[0].id;
39
+ }
40
+ // Create new customer
41
+ const customer = await this.stripe.customers.create({
42
+ email,
43
+ name,
44
+ metadata: {
45
+ user_id: userId,
46
+ },
47
+ });
48
+ return customer.id;
49
+ }
50
+ /**
51
+ * Get customer details including subscription
52
+ */
53
+ async getCustomer(stripeCustomerId) {
54
+ try {
55
+ const customer = await this.stripe.customers.retrieve(stripeCustomerId, {
56
+ expand: ['subscriptions', 'invoice_settings.default_payment_method'],
57
+ });
58
+ if (customer.deleted) {
59
+ return null;
60
+ }
61
+ // Get payment methods
62
+ const paymentMethods = await this.stripe.paymentMethods.list({
63
+ customer: stripeCustomerId,
64
+ type: 'card',
65
+ });
66
+ // Get recent invoices
67
+ const invoices = await this.stripe.invoices.list({
68
+ customer: stripeCustomerId,
69
+ limit: 10,
70
+ });
71
+ const subscription = customer.subscriptions?.data[0];
72
+ return {
73
+ id: customer.metadata?.user_id || '',
74
+ stripeCustomerId,
75
+ email: customer.email || '',
76
+ name: customer.name || undefined,
77
+ subscription: subscription ? this.mapSubscription(subscription) : undefined,
78
+ paymentMethods: paymentMethods.data.map((pm) => this.mapPaymentMethod(pm)),
79
+ invoices: invoices.data.map((inv) => this.mapInvoice(inv)),
80
+ createdAt: new Date(customer.created * 1000),
81
+ updatedAt: new Date(),
82
+ };
83
+ }
84
+ catch (error) {
85
+ if (error.code === 'resource_missing') {
86
+ return null;
87
+ }
88
+ throw error;
89
+ }
90
+ }
91
+ /**
92
+ * Create a checkout session for subscription
93
+ */
94
+ async createCheckoutSession(customerId, tier, billingInterval, successUrl, cancelUrl) {
95
+ const config = getConfig();
96
+ // Validate tier exists
97
+ getPlan(tier);
98
+ // Get the appropriate price ID
99
+ let priceId;
100
+ if (billingInterval === 'month') {
101
+ priceId = config.stripe.priceIds[`${tier}Monthly`];
102
+ }
103
+ else {
104
+ priceId = config.stripe.priceIds[`${tier}Yearly`];
105
+ }
106
+ if (!priceId) {
107
+ throw new Error(`No price configured for ${tier} ${billingInterval}ly plan`);
108
+ }
109
+ const session = await this.stripe.checkout.sessions.create({
110
+ customer: customerId,
111
+ payment_method_types: ['card'],
112
+ mode: 'subscription',
113
+ line_items: [
114
+ {
115
+ price: priceId,
116
+ quantity: 1,
117
+ },
118
+ ],
119
+ success_url: successUrl,
120
+ cancel_url: cancelUrl,
121
+ subscription_data: {
122
+ metadata: {
123
+ tier,
124
+ },
125
+ },
126
+ allow_promotion_codes: true,
127
+ });
128
+ return {
129
+ sessionId: session.id,
130
+ url: session.url,
131
+ };
132
+ }
133
+ /**
134
+ * Create a billing portal session for managing subscription
135
+ */
136
+ async createPortalSession(customerId, returnUrl) {
137
+ const session = await this.stripe.billingPortal.sessions.create({
138
+ customer: customerId,
139
+ return_url: returnUrl,
140
+ });
141
+ return {
142
+ url: session.url,
143
+ };
144
+ }
145
+ /**
146
+ * Change subscription tier
147
+ */
148
+ async changeSubscription(subscriptionId, newTier, billingInterval) {
149
+ const config = getConfig();
150
+ // Get new price ID
151
+ let priceId;
152
+ if (billingInterval === 'month') {
153
+ priceId = config.stripe.priceIds[`${newTier}Monthly`];
154
+ }
155
+ else {
156
+ priceId = config.stripe.priceIds[`${newTier}Yearly`];
157
+ }
158
+ if (!priceId) {
159
+ throw new Error(`No price configured for ${newTier} ${billingInterval}ly plan`);
160
+ }
161
+ // Get current subscription
162
+ const subscription = await this.stripe.subscriptions.retrieve(subscriptionId);
163
+ const currentItem = subscription.items.data[0];
164
+ // Update subscription
165
+ const updated = await this.stripe.subscriptions.update(subscriptionId, {
166
+ items: [
167
+ {
168
+ id: currentItem.id,
169
+ price: priceId,
170
+ },
171
+ ],
172
+ metadata: {
173
+ tier: newTier,
174
+ },
175
+ proration_behavior: 'create_prorations',
176
+ });
177
+ return this.mapSubscription(updated);
178
+ }
179
+ /**
180
+ * Cancel subscription at period end
181
+ */
182
+ async cancelSubscription(subscriptionId) {
183
+ const subscription = await this.stripe.subscriptions.update(subscriptionId, {
184
+ cancel_at_period_end: true,
185
+ });
186
+ return this.mapSubscription(subscription);
187
+ }
188
+ /**
189
+ * Resume a canceled subscription
190
+ */
191
+ async resumeSubscription(subscriptionId) {
192
+ const subscription = await this.stripe.subscriptions.update(subscriptionId, {
193
+ cancel_at_period_end: false,
194
+ });
195
+ return this.mapSubscription(subscription);
196
+ }
197
+ /**
198
+ * Add a payment method to customer
199
+ */
200
+ async addPaymentMethod(customerId, paymentMethodId, setAsDefault = false) {
201
+ // Attach payment method to customer
202
+ const pm = await this.stripe.paymentMethods.attach(paymentMethodId, {
203
+ customer: customerId,
204
+ });
205
+ // Set as default if requested
206
+ if (setAsDefault) {
207
+ await this.stripe.customers.update(customerId, {
208
+ invoice_settings: {
209
+ default_payment_method: paymentMethodId,
210
+ },
211
+ });
212
+ }
213
+ return this.mapPaymentMethod(pm, setAsDefault);
214
+ }
215
+ /**
216
+ * Remove a payment method
217
+ */
218
+ async removePaymentMethod(paymentMethodId) {
219
+ await this.stripe.paymentMethods.detach(paymentMethodId);
220
+ }
221
+ /**
222
+ * Set default payment method
223
+ */
224
+ async setDefaultPaymentMethod(customerId, paymentMethodId) {
225
+ await this.stripe.customers.update(customerId, {
226
+ invoice_settings: {
227
+ default_payment_method: paymentMethodId,
228
+ },
229
+ });
230
+ }
231
+ /**
232
+ * Get upcoming invoice preview
233
+ */
234
+ async getUpcomingInvoice(customerId) {
235
+ try {
236
+ const invoice = await this.stripe.invoices.retrieveUpcoming({
237
+ customer: customerId,
238
+ });
239
+ return this.mapInvoice(invoice);
240
+ }
241
+ catch (error) {
242
+ if (error.code === 'invoice_upcoming_none') {
243
+ return null;
244
+ }
245
+ throw error;
246
+ }
247
+ }
248
+ /**
249
+ * Record usage for metered billing
250
+ */
251
+ async recordUsage(subscriptionItemId, quantity, timestamp) {
252
+ await this.stripe.subscriptionItems.createUsageRecord(subscriptionItemId, {
253
+ quantity,
254
+ timestamp: timestamp ? Math.floor(timestamp.getTime() / 1000) : undefined,
255
+ action: 'increment',
256
+ });
257
+ }
258
+ /**
259
+ * Verify webhook signature
260
+ */
261
+ verifyWebhookSignature(payload, signature) {
262
+ const config = getConfig();
263
+ return this.stripe.webhooks.constructEvent(payload, signature, config.stripe.webhookSecret);
264
+ }
265
+ /**
266
+ * Process webhook event
267
+ */
268
+ async processWebhookEvent(event) {
269
+ const billingEvent = {
270
+ id: event.id,
271
+ type: this.mapEventType(event.type),
272
+ stripeEventId: event.id,
273
+ data: event.data.object,
274
+ createdAt: new Date(event.created * 1000),
275
+ };
276
+ // Extract user ID from customer metadata if available
277
+ if ('customer' in event.data.object) {
278
+ const customerId = event.data.object.customer;
279
+ if (customerId) {
280
+ try {
281
+ const customer = await this.stripe.customers.retrieve(customerId);
282
+ if (!customer.deleted && customer.metadata?.user_id) {
283
+ billingEvent.userId = customer.metadata.user_id;
284
+ }
285
+ }
286
+ catch {
287
+ // Customer not found, continue without user ID
288
+ }
289
+ }
290
+ }
291
+ billingEvent.processedAt = new Date();
292
+ return billingEvent;
293
+ }
294
+ /**
295
+ * Get subscription tier from Stripe subscription
296
+ */
297
+ getTierFromSubscription(subscription) {
298
+ // Check metadata first
299
+ if (subscription.metadata?.tier) {
300
+ return subscription.metadata.tier;
301
+ }
302
+ // Fallback: determine from price ID
303
+ const config = getConfig();
304
+ const priceId = subscription.items.data[0]?.price.id;
305
+ for (const [key, value] of Object.entries(config.stripe.priceIds)) {
306
+ if (value === priceId) {
307
+ // Extract tier from key (e.g., 'proMonthly' -> 'pro')
308
+ return key.replace(/(Monthly|Yearly)$/, '').toLowerCase();
309
+ }
310
+ }
311
+ return 'free'; // Default fallback
312
+ }
313
+ // Helper: Map Stripe subscription to our type
314
+ mapSubscription(subscription) {
315
+ const sub = subscription;
316
+ return {
317
+ id: subscription.id,
318
+ stripeSubscriptionId: subscription.id,
319
+ tier: this.getTierFromSubscription(subscription),
320
+ status: subscription.status,
321
+ currentPeriodStart: new Date((sub.current_period_start || sub.billing_cycle_anchor) * 1000),
322
+ currentPeriodEnd: new Date((sub.current_period_end || sub.current_period_start + 30 * 24 * 60 * 60) * 1000),
323
+ cancelAtPeriodEnd: subscription.cancel_at_period_end,
324
+ billingInterval: subscription.items.data[0]?.price.recurring?.interval === 'year'
325
+ ? 'year'
326
+ : 'month',
327
+ createdAt: new Date(subscription.created * 1000),
328
+ };
329
+ }
330
+ // Helper: Map Stripe payment method to our type
331
+ mapPaymentMethod(pm, isDefault = false) {
332
+ return {
333
+ id: pm.id,
334
+ stripePaymentMethodId: pm.id,
335
+ type: pm.type,
336
+ isDefault,
337
+ card: pm.card
338
+ ? {
339
+ brand: pm.card.brand,
340
+ last4: pm.card.last4,
341
+ expMonth: pm.card.exp_month,
342
+ expYear: pm.card.exp_year,
343
+ }
344
+ : undefined,
345
+ };
346
+ }
347
+ // Helper: Map Stripe invoice to our type
348
+ mapInvoice(invoice) {
349
+ const isUpcoming = !('id' in invoice) || invoice.id === null;
350
+ return {
351
+ id: isUpcoming ? 'upcoming' : invoice.id,
352
+ stripeInvoiceId: isUpcoming ? 'upcoming' : invoice.id,
353
+ amountDue: invoice.amount_due,
354
+ amountPaid: invoice.amount_paid,
355
+ status: isUpcoming ? 'draft' : invoice.status,
356
+ invoicePdf: 'invoice_pdf' in invoice ? invoice.invoice_pdf ?? undefined : undefined,
357
+ hostedInvoiceUrl: 'hosted_invoice_url' in invoice ? invoice.hosted_invoice_url ?? undefined : undefined,
358
+ periodStart: new Date(invoice.period_start * 1000),
359
+ periodEnd: new Date(invoice.period_end * 1000),
360
+ createdAt: new Date((invoice.created || Date.now() / 1000) * 1000),
361
+ };
362
+ }
363
+ // Helper: Map Stripe event type to our type
364
+ mapEventType(stripeType) {
365
+ const mapping = {
366
+ 'customer.subscription.created': 'subscription.created',
367
+ 'customer.subscription.updated': 'subscription.updated',
368
+ 'customer.subscription.deleted': 'subscription.canceled',
369
+ 'customer.subscription.trial_will_end': 'subscription.trial_ending',
370
+ 'invoice.paid': 'invoice.paid',
371
+ 'invoice.payment_failed': 'invoice.payment_failed',
372
+ 'payment_method.attached': 'payment_method.attached',
373
+ 'payment_method.detached': 'payment_method.detached',
374
+ 'customer.created': 'customer.created',
375
+ 'customer.updated': 'customer.updated',
376
+ };
377
+ return mapping[stripeType] || 'customer.updated';
378
+ }
379
+ }
380
+ // Export singleton instance
381
+ let billingService = null;
382
+ export function getBillingService() {
383
+ if (!billingService) {
384
+ billingService = new BillingService();
385
+ }
386
+ return billingService;
387
+ }
388
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/billing/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Agent Relay Cloud - Billing Types
3
+ *
4
+ * Defines subscription plans, customer data, and billing events.
5
+ */
6
+ /**
7
+ * Subscription tier levels
8
+ */
9
+ export type SubscriptionTier = 'free' | 'pro' | 'team' | 'enterprise';
10
+ /**
11
+ * Plan definitions with limits and pricing
12
+ */
13
+ export interface BillingPlan {
14
+ id: SubscriptionTier;
15
+ name: string;
16
+ description: string;
17
+ priceMonthly: number;
18
+ priceYearly: number;
19
+ stripePriceIdMonthly?: string;
20
+ stripePriceIdYearly?: string;
21
+ limits: BillingPlanLimits;
22
+ features: string[];
23
+ }
24
+ /**
25
+ * Resource limits per plan for billing/display purposes.
26
+ * These limits are shown to customers on pricing pages and in account settings.
27
+ *
28
+ * Note: For runtime limit checking (API enforcement), use PlanLimits from
29
+ * src/cloud/services/planLimits.ts which has a focused subset of limits.
30
+ */
31
+ export interface BillingPlanLimits {
32
+ maxWorkspaces: number;
33
+ maxAgentsPerWorkspace: number;
34
+ maxTeamMembers: number;
35
+ maxStorageGB: number;
36
+ maxComputeHoursPerMonth: number;
37
+ customDomains: boolean;
38
+ prioritySupport: boolean;
39
+ sla: boolean;
40
+ ssoEnabled: boolean;
41
+ auditLogs: boolean;
42
+ /** Cloud session persistence (summaries, session tracking) - Pro+ only */
43
+ sessionPersistence: boolean;
44
+ }
45
+ /**
46
+ * Customer billing information
47
+ */
48
+ export interface BillingCustomer {
49
+ id: string;
50
+ stripeCustomerId: string;
51
+ email: string;
52
+ name?: string;
53
+ subscription?: CustomerSubscription;
54
+ paymentMethods: PaymentMethod[];
55
+ invoices: Invoice[];
56
+ createdAt: Date;
57
+ updatedAt: Date;
58
+ }
59
+ /**
60
+ * Active subscription
61
+ */
62
+ export interface CustomerSubscription {
63
+ id: string;
64
+ stripeSubscriptionId: string;
65
+ tier: SubscriptionTier;
66
+ status: SubscriptionStatus;
67
+ currentPeriodStart: Date;
68
+ currentPeriodEnd: Date;
69
+ cancelAtPeriodEnd: boolean;
70
+ billingInterval: 'month' | 'year';
71
+ createdAt: Date;
72
+ }
73
+ export type SubscriptionStatus = 'active' | 'past_due' | 'canceled' | 'incomplete' | 'trialing' | 'unpaid';
74
+ /**
75
+ * Payment method
76
+ */
77
+ export interface PaymentMethod {
78
+ id: string;
79
+ stripePaymentMethodId: string;
80
+ type: 'card' | 'us_bank_account' | 'sepa_debit';
81
+ isDefault: boolean;
82
+ card?: {
83
+ brand: string;
84
+ last4: string;
85
+ expMonth: number;
86
+ expYear: number;
87
+ };
88
+ }
89
+ /**
90
+ * Invoice
91
+ */
92
+ export interface Invoice {
93
+ id: string;
94
+ stripeInvoiceId: string;
95
+ amountDue: number;
96
+ amountPaid: number;
97
+ status: 'draft' | 'open' | 'paid' | 'void' | 'uncollectible';
98
+ invoicePdf?: string;
99
+ hostedInvoiceUrl?: string;
100
+ periodStart: Date;
101
+ periodEnd: Date;
102
+ createdAt: Date;
103
+ }
104
+ /**
105
+ * Usage record for metered billing
106
+ */
107
+ export interface UsageRecord {
108
+ userId: string;
109
+ workspaceId: string;
110
+ metric: UsageMetric;
111
+ quantity: number;
112
+ timestamp: Date;
113
+ }
114
+ export type UsageMetric = 'compute_hours' | 'storage_gb' | 'api_calls' | 'agent_spawns';
115
+ /**
116
+ * Billing event for webhooks and audit
117
+ */
118
+ export interface BillingEvent {
119
+ id: string;
120
+ type: BillingEventType;
121
+ userId?: string;
122
+ stripeEventId?: string;
123
+ data: Record<string, unknown>;
124
+ processedAt?: Date;
125
+ createdAt: Date;
126
+ }
127
+ export type BillingEventType = 'subscription.created' | 'subscription.updated' | 'subscription.canceled' | 'subscription.trial_ending' | 'invoice.paid' | 'invoice.payment_failed' | 'payment_method.attached' | 'payment_method.detached' | 'customer.created' | 'customer.updated';
128
+ /**
129
+ * Checkout session result
130
+ */
131
+ export interface CheckoutSession {
132
+ sessionId: string;
133
+ url: string;
134
+ }
135
+ /**
136
+ * Portal session for managing subscription
137
+ */
138
+ export interface PortalSession {
139
+ url: string;
140
+ }
141
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Agent Relay Cloud - Billing Types
3
+ *
4
+ * Defines subscription plans, customer data, and billing events.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @deprecated Import from '@agent-relay/config/cloud-config' instead.
3
+ */
4
+ export * from '@agent-relay/config/cloud-config';
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,kCAAkC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @deprecated Import from '@agent-relay/config/cloud-config' instead.
3
+ */
4
+ export * from '@agent-relay/config/cloud-config';
5
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Bulk Ingest Utilities
3
+ *
4
+ * Optimized bulk insert operations for high-volume message sync.
5
+ * Uses raw SQL for performance instead of ORM-generated queries.
6
+ *
7
+ * Key optimizations:
8
+ * - Multi-row INSERT with VALUES for batches
9
+ * - Streaming COPY for very large batches (>1000 rows)
10
+ * - Proper JSONB serialization
11
+ * - Connection reuse via pool
12
+ * - Chunk processing for memory efficiency
13
+ */
14
+ import { Pool } from 'pg';
15
+ type NewAgentMessage = Record<string, unknown>;
16
+ export interface PoolConfig {
17
+ connectionString: string;
18
+ /** Maximum number of connections in pool (default: 20) */
19
+ max?: number;
20
+ /** How long a client can be idle before being closed (default: 30000) */
21
+ idleTimeoutMillis?: number;
22
+ /** Max time to wait for a connection (default: 10000) */
23
+ connectionTimeoutMillis?: number;
24
+ /** Enable SSL (default: based on connection string) */
25
+ ssl?: boolean | {
26
+ rejectUnauthorized: boolean;
27
+ };
28
+ }
29
+ export declare const DEFAULT_POOL_CONFIG: Partial<PoolConfig>;
30
+ /**
31
+ * Result of a bulk insert operation
32
+ */
33
+ export interface BulkInsertResult {
34
+ inserted: number;
35
+ duplicates: number;
36
+ errors: number;
37
+ durationMs: number;
38
+ }
39
+ /**
40
+ * Bulk insert messages using optimized multi-row INSERT.
41
+ *
42
+ * Uses ON CONFLICT DO NOTHING for deduplication.
43
+ * Much faster than individual inserts for batches.
44
+ *
45
+ * @param pool Database connection pool
46
+ * @param messages Messages to insert
47
+ * @param chunkSize Number of rows per INSERT statement (default: 100)
48
+ */
49
+ export declare function bulkInsertMessages(pool: Pool, messages: NewAgentMessage[], chunkSize?: number): Promise<BulkInsertResult>;
50
+ /**
51
+ * Streaming bulk insert using staging table for very large batches.
52
+ *
53
+ * Uses chunked multi-row INSERT into a temp staging table,
54
+ * then a single INSERT SELECT for deduplication.
55
+ * This avoids holding all data in memory and is efficient for large batches.
56
+ *
57
+ * @param pool Database connection pool
58
+ * @param messages Messages to insert
59
+ */
60
+ export declare function streamingBulkInsert(pool: Pool, messages: NewAgentMessage[]): Promise<BulkInsertResult>;
61
+ /**
62
+ * Optimized bulk insert that chooses strategy based on batch size.
63
+ *
64
+ * - Small batches (<100): Use regular ORM insert
65
+ * - Medium batches (100-1000): Use multi-row INSERT
66
+ * - Large batches (>1000): Use streaming COPY
67
+ *
68
+ * @param pool Database connection pool
69
+ * @param messages Messages to insert
70
+ */
71
+ export declare function optimizedBulkInsert(pool: Pool, messages: NewAgentMessage[]): Promise<BulkInsertResult>;
72
+ /**
73
+ * Get pool statistics for monitoring.
74
+ */
75
+ export declare function getPoolStats(pool: Pool): {
76
+ total: number;
77
+ idle: number;
78
+ waiting: number;
79
+ };
80
+ /**
81
+ * Health check for the connection pool.
82
+ */
83
+ export declare function checkPoolHealth(pool: Pool): Promise<{
84
+ healthy: boolean;
85
+ latencyMs: number;
86
+ error?: string;
87
+ }>;
88
+ export {};
89
+ //# sourceMappingURL=bulk-ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-ingest.d.ts","sourceRoot":"","sources":["../../src/db/bulk-ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAItC,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAG/C,MAAM,WAAW,UAAU;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uDAAuD;IACvD,GAAG,CAAC,EAAE,OAAO,GAAG;QAAE,kBAAkB,EAAE,OAAO,CAAA;KAAE,CAAC;CACjD;AAED,eAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,UAAU,CAInD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,SAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAuB3B;AA6ED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CA4E3B;AAiED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAc3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAMA;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAeD"}