@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.
- package/dist/api/admin.d.ts +8 -0
- package/dist/api/admin.d.ts.map +1 -0
- package/dist/api/admin.js +225 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/auth.d.ts +20 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +136 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/billing.d.ts +7 -0
- package/dist/api/billing.d.ts.map +1 -0
- package/dist/api/billing.js +564 -0
- package/dist/api/billing.js.map +1 -0
- package/dist/api/cli-pty-runner.d.ts +53 -0
- package/dist/api/cli-pty-runner.d.ts.map +1 -0
- package/dist/api/cli-pty-runner.js +193 -0
- package/dist/api/cli-pty-runner.js.map +1 -0
- package/dist/api/codex-auth-helper.d.ts +21 -0
- package/dist/api/codex-auth-helper.d.ts.map +1 -0
- package/dist/api/codex-auth-helper.js +327 -0
- package/dist/api/codex-auth-helper.js.map +1 -0
- package/dist/api/consensus.d.ts +13 -0
- package/dist/api/consensus.d.ts.map +1 -0
- package/dist/api/consensus.js +261 -0
- package/dist/api/consensus.js.map +1 -0
- package/dist/api/coordinators.d.ts +8 -0
- package/dist/api/coordinators.d.ts.map +1 -0
- package/dist/api/coordinators.js +750 -0
- package/dist/api/coordinators.js.map +1 -0
- package/dist/api/daemons.d.ts +12 -0
- package/dist/api/daemons.d.ts.map +1 -0
- package/dist/api/daemons.js +535 -0
- package/dist/api/daemons.js.map +1 -0
- package/dist/api/generic-webhooks.d.ts +8 -0
- package/dist/api/generic-webhooks.d.ts.map +1 -0
- package/dist/api/generic-webhooks.js +129 -0
- package/dist/api/generic-webhooks.js.map +1 -0
- package/dist/api/git.d.ts +8 -0
- package/dist/api/git.d.ts.map +1 -0
- package/dist/api/git.js +269 -0
- package/dist/api/git.js.map +1 -0
- package/dist/api/github-app.d.ts +11 -0
- package/dist/api/github-app.d.ts.map +1 -0
- package/dist/api/github-app.js +223 -0
- package/dist/api/github-app.js.map +1 -0
- package/dist/api/middleware/planLimits.d.ts +43 -0
- package/dist/api/middleware/planLimits.d.ts.map +1 -0
- package/dist/api/middleware/planLimits.js +202 -0
- package/dist/api/middleware/planLimits.js.map +1 -0
- package/dist/api/monitoring.d.ts +11 -0
- package/dist/api/monitoring.d.ts.map +1 -0
- package/dist/api/monitoring.js +578 -0
- package/dist/api/monitoring.js.map +1 -0
- package/dist/api/nango-auth.d.ts +9 -0
- package/dist/api/nango-auth.d.ts.map +1 -0
- package/dist/api/nango-auth.js +674 -0
- package/dist/api/nango-auth.js.map +1 -0
- package/dist/api/onboarding.d.ts +15 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +679 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/policy.d.ts +8 -0
- package/dist/api/policy.d.ts.map +1 -0
- package/dist/api/policy.js +229 -0
- package/dist/api/policy.js.map +1 -0
- package/dist/api/provider-env.d.ts +14 -0
- package/dist/api/provider-env.d.ts.map +1 -0
- package/dist/api/provider-env.js +75 -0
- package/dist/api/provider-env.js.map +1 -0
- package/dist/api/providers.d.ts +7 -0
- package/dist/api/providers.d.ts.map +1 -0
- package/dist/api/providers.js +564 -0
- package/dist/api/providers.js.map +1 -0
- package/dist/api/repos.d.ts +8 -0
- package/dist/api/repos.d.ts.map +1 -0
- package/dist/api/repos.js +577 -0
- package/dist/api/repos.js.map +1 -0
- package/dist/api/sessions.d.ts +11 -0
- package/dist/api/sessions.d.ts.map +1 -0
- package/dist/api/sessions.js +302 -0
- package/dist/api/sessions.js.map +1 -0
- package/dist/api/teams.d.ts +7 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +281 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/test-helpers.d.ts +10 -0
- package/dist/api/test-helpers.d.ts.map +1 -0
- package/dist/api/test-helpers.js +745 -0
- package/dist/api/test-helpers.js.map +1 -0
- package/dist/api/usage.d.ts +7 -0
- package/dist/api/usage.d.ts.map +1 -0
- package/dist/api/usage.js +111 -0
- package/dist/api/usage.js.map +1 -0
- package/dist/api/webhooks.d.ts +8 -0
- package/dist/api/webhooks.d.ts.map +1 -0
- package/dist/api/webhooks.js +645 -0
- package/dist/api/webhooks.js.map +1 -0
- package/dist/api/workspaces.d.ts +25 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +1799 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/billing/index.d.ts +9 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +9 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/plans.d.ts +39 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +245 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/billing/service.d.ts +80 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +388 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/billing/types.d.ts +141 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +7 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/db/bulk-ingest.d.ts +89 -0
- package/dist/db/bulk-ingest.d.ts.map +1 -0
- package/dist/db/bulk-ingest.js +268 -0
- package/dist/db/bulk-ingest.js.map +1 -0
- package/dist/db/drizzle.d.ts +256 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/drizzle.js +1286 -0
- package/dist/db/drizzle.js.map +1 -0
- package/dist/db/index.d.ts +55 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +68 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4873 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +620 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/provisioner/index.d.ts +207 -0
- package/dist/provisioner/index.d.ts.map +1 -0
- package/dist/provisioner/index.js +2114 -0
- package/dist/provisioner/index.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1924 -0
- package/dist/server.js.map +1 -0
- package/dist/services/auto-scaler.d.ts +152 -0
- package/dist/services/auto-scaler.d.ts.map +1 -0
- package/dist/services/auto-scaler.js +439 -0
- package/dist/services/auto-scaler.js.map +1 -0
- package/dist/services/capacity-manager.d.ts +148 -0
- package/dist/services/capacity-manager.d.ts.map +1 -0
- package/dist/services/capacity-manager.js +449 -0
- package/dist/services/capacity-manager.js.map +1 -0
- package/dist/services/ci-agent-spawner.d.ts +49 -0
- package/dist/services/ci-agent-spawner.d.ts.map +1 -0
- package/dist/services/ci-agent-spawner.js +373 -0
- package/dist/services/ci-agent-spawner.js.map +1 -0
- package/dist/services/cloud-message-bus.d.ts +28 -0
- package/dist/services/cloud-message-bus.d.ts.map +1 -0
- package/dist/services/cloud-message-bus.js +19 -0
- package/dist/services/cloud-message-bus.js.map +1 -0
- package/dist/services/compute-enforcement.d.ts +57 -0
- package/dist/services/compute-enforcement.d.ts.map +1 -0
- package/dist/services/compute-enforcement.js +175 -0
- package/dist/services/compute-enforcement.js.map +1 -0
- package/dist/services/coordinator.d.ts +62 -0
- package/dist/services/coordinator.d.ts.map +1 -0
- package/dist/services/coordinator.js +389 -0
- package/dist/services/coordinator.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +25 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/intro-expiration.d.ts +60 -0
- package/dist/services/intro-expiration.d.ts.map +1 -0
- package/dist/services/intro-expiration.js +252 -0
- package/dist/services/intro-expiration.js.map +1 -0
- package/dist/services/mention-handler.d.ts +65 -0
- package/dist/services/mention-handler.d.ts.map +1 -0
- package/dist/services/mention-handler.js +405 -0
- package/dist/services/mention-handler.js.map +1 -0
- package/dist/services/nango.d.ts +201 -0
- package/dist/services/nango.d.ts.map +1 -0
- package/dist/services/nango.js +392 -0
- package/dist/services/nango.js.map +1 -0
- package/dist/services/persistence.d.ts +131 -0
- package/dist/services/persistence.d.ts.map +1 -0
- package/dist/services/persistence.js +200 -0
- package/dist/services/persistence.js.map +1 -0
- package/dist/services/planLimits.d.ts +147 -0
- package/dist/services/planLimits.d.ts.map +1 -0
- package/dist/services/planLimits.js +335 -0
- package/dist/services/planLimits.js.map +1 -0
- package/dist/services/presence-registry.d.ts +56 -0
- package/dist/services/presence-registry.d.ts.map +1 -0
- package/dist/services/presence-registry.js +91 -0
- package/dist/services/presence-registry.js.map +1 -0
- package/dist/services/scaling-orchestrator.d.ts +159 -0
- package/dist/services/scaling-orchestrator.d.ts.map +1 -0
- package/dist/services/scaling-orchestrator.js +502 -0
- package/dist/services/scaling-orchestrator.js.map +1 -0
- package/dist/services/scaling-policy.d.ts +121 -0
- package/dist/services/scaling-policy.d.ts.map +1 -0
- package/dist/services/scaling-policy.js +415 -0
- package/dist/services/scaling-policy.js.map +1 -0
- package/dist/services/ssh-security.d.ts +31 -0
- package/dist/services/ssh-security.d.ts.map +1 -0
- package/dist/services/ssh-security.js +63 -0
- package/dist/services/ssh-security.js.map +1 -0
- package/dist/services/workspace-keepalive.d.ts +76 -0
- package/dist/services/workspace-keepalive.d.ts.map +1 -0
- package/dist/services/workspace-keepalive.js +234 -0
- package/dist/services/workspace-keepalive.js.map +1 -0
- package/dist/shims/consensus.d.ts +23 -0
- package/dist/shims/consensus.d.ts.map +1 -0
- package/dist/shims/consensus.js +5 -0
- package/dist/shims/consensus.js.map +1 -0
- package/dist/webhooks/index.d.ts +24 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +29 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/parsers/github.d.ts +8 -0
- package/dist/webhooks/parsers/github.d.ts.map +1 -0
- package/dist/webhooks/parsers/github.js +234 -0
- package/dist/webhooks/parsers/github.js.map +1 -0
- package/dist/webhooks/parsers/index.d.ts +23 -0
- package/dist/webhooks/parsers/index.d.ts.map +1 -0
- package/dist/webhooks/parsers/index.js +30 -0
- package/dist/webhooks/parsers/index.js.map +1 -0
- package/dist/webhooks/parsers/linear.d.ts +9 -0
- package/dist/webhooks/parsers/linear.d.ts.map +1 -0
- package/dist/webhooks/parsers/linear.js +258 -0
- package/dist/webhooks/parsers/linear.js.map +1 -0
- package/dist/webhooks/parsers/slack.d.ts +9 -0
- package/dist/webhooks/parsers/slack.d.ts.map +1 -0
- package/dist/webhooks/parsers/slack.js +214 -0
- package/dist/webhooks/parsers/slack.js.map +1 -0
- package/dist/webhooks/responders/github.d.ts +8 -0
- package/dist/webhooks/responders/github.d.ts.map +1 -0
- package/dist/webhooks/responders/github.js +73 -0
- package/dist/webhooks/responders/github.js.map +1 -0
- package/dist/webhooks/responders/index.d.ts +23 -0
- package/dist/webhooks/responders/index.d.ts.map +1 -0
- package/dist/webhooks/responders/index.js +30 -0
- package/dist/webhooks/responders/index.js.map +1 -0
- package/dist/webhooks/responders/linear.d.ts +9 -0
- package/dist/webhooks/responders/linear.d.ts.map +1 -0
- package/dist/webhooks/responders/linear.js +149 -0
- package/dist/webhooks/responders/linear.js.map +1 -0
- package/dist/webhooks/responders/slack.d.ts +20 -0
- package/dist/webhooks/responders/slack.d.ts.map +1 -0
- package/dist/webhooks/responders/slack.js +178 -0
- package/dist/webhooks/responders/slack.js.map +1 -0
- package/dist/webhooks/router.d.ts +25 -0
- package/dist/webhooks/router.d.ts.map +1 -0
- package/dist/webhooks/router.js +504 -0
- package/dist/webhooks/router.js.map +1 -0
- package/dist/webhooks/rules-engine.d.ts +24 -0
- package/dist/webhooks/rules-engine.d.ts.map +1 -0
- package/dist/webhooks/rules-engine.js +287 -0
- package/dist/webhooks/rules-engine.js.map +1 -0
- package/dist/webhooks/types.d.ts +186 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +8 -0
- package/dist/webhooks/types.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/billing/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/config.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|