@agentlensai/server 0.9.0 → 0.11.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 (209) hide show
  1. package/dist/cloud/auth/api-key-middleware.d.ts +66 -0
  2. package/dist/cloud/auth/api-key-middleware.d.ts.map +1 -0
  3. package/dist/cloud/auth/api-key-middleware.js +147 -0
  4. package/dist/cloud/auth/api-key-middleware.js.map +1 -0
  5. package/dist/cloud/auth/api-keys.d.ts +90 -0
  6. package/dist/cloud/auth/api-keys.d.ts.map +1 -0
  7. package/dist/cloud/auth/api-keys.js +162 -0
  8. package/dist/cloud/auth/api-keys.js.map +1 -0
  9. package/dist/cloud/auth/audit-log.d.ts +66 -0
  10. package/dist/cloud/auth/audit-log.d.ts.map +1 -0
  11. package/dist/cloud/auth/audit-log.js +92 -0
  12. package/dist/cloud/auth/audit-log.js.map +1 -0
  13. package/dist/cloud/auth/auth-service.d.ts +77 -0
  14. package/dist/cloud/auth/auth-service.d.ts.map +1 -0
  15. package/dist/cloud/auth/auth-service.js +229 -0
  16. package/dist/cloud/auth/auth-service.js.map +1 -0
  17. package/dist/cloud/auth/brute-force.d.ts +36 -0
  18. package/dist/cloud/auth/brute-force.d.ts.map +1 -0
  19. package/dist/cloud/auth/brute-force.js +67 -0
  20. package/dist/cloud/auth/brute-force.js.map +1 -0
  21. package/dist/cloud/auth/index.d.ts +11 -0
  22. package/dist/cloud/auth/index.d.ts.map +1 -0
  23. package/dist/cloud/auth/index.js +11 -0
  24. package/dist/cloud/auth/index.js.map +1 -0
  25. package/dist/cloud/auth/jwt.d.ts +34 -0
  26. package/dist/cloud/auth/jwt.d.ts.map +1 -0
  27. package/dist/cloud/auth/jwt.js +68 -0
  28. package/dist/cloud/auth/jwt.js.map +1 -0
  29. package/dist/cloud/auth/oauth.d.ts +37 -0
  30. package/dist/cloud/auth/oauth.d.ts.map +1 -0
  31. package/dist/cloud/auth/oauth.js +120 -0
  32. package/dist/cloud/auth/oauth.js.map +1 -0
  33. package/dist/cloud/auth/passwords.d.ts +25 -0
  34. package/dist/cloud/auth/passwords.d.ts.map +1 -0
  35. package/dist/cloud/auth/passwords.js +50 -0
  36. package/dist/cloud/auth/passwords.js.map +1 -0
  37. package/dist/cloud/auth/rbac.d.ts +51 -0
  38. package/dist/cloud/auth/rbac.d.ts.map +1 -0
  39. package/dist/cloud/auth/rbac.js +89 -0
  40. package/dist/cloud/auth/rbac.js.map +1 -0
  41. package/dist/cloud/auth/tokens.d.ts +18 -0
  42. package/dist/cloud/auth/tokens.d.ts.map +1 -0
  43. package/dist/cloud/auth/tokens.js +29 -0
  44. package/dist/cloud/auth/tokens.js.map +1 -0
  45. package/dist/cloud/billing/billing-service.d.ts +44 -0
  46. package/dist/cloud/billing/billing-service.d.ts.map +1 -0
  47. package/dist/cloud/billing/billing-service.js +153 -0
  48. package/dist/cloud/billing/billing-service.js.map +1 -0
  49. package/dist/cloud/billing/index.d.ts +11 -0
  50. package/dist/cloud/billing/index.d.ts.map +1 -0
  51. package/dist/cloud/billing/index.js +11 -0
  52. package/dist/cloud/billing/index.js.map +1 -0
  53. package/dist/cloud/billing/invoice-service.d.ts +57 -0
  54. package/dist/cloud/billing/invoice-service.d.ts.map +1 -0
  55. package/dist/cloud/billing/invoice-service.js +123 -0
  56. package/dist/cloud/billing/invoice-service.js.map +1 -0
  57. package/dist/cloud/billing/plan-management.d.ts +46 -0
  58. package/dist/cloud/billing/plan-management.d.ts.map +1 -0
  59. package/dist/cloud/billing/plan-management.js +157 -0
  60. package/dist/cloud/billing/plan-management.js.map +1 -0
  61. package/dist/cloud/billing/quota-enforcement.d.ts +53 -0
  62. package/dist/cloud/billing/quota-enforcement.d.ts.map +1 -0
  63. package/dist/cloud/billing/quota-enforcement.js +143 -0
  64. package/dist/cloud/billing/quota-enforcement.js.map +1 -0
  65. package/dist/cloud/billing/stripe-client.d.ts +142 -0
  66. package/dist/cloud/billing/stripe-client.d.ts.map +1 -0
  67. package/dist/cloud/billing/stripe-client.js +169 -0
  68. package/dist/cloud/billing/stripe-client.js.map +1 -0
  69. package/dist/cloud/billing/trial-service.d.ts +47 -0
  70. package/dist/cloud/billing/trial-service.d.ts.map +1 -0
  71. package/dist/cloud/billing/trial-service.js +104 -0
  72. package/dist/cloud/billing/trial-service.js.map +1 -0
  73. package/dist/cloud/billing/usage-metering.d.ts +83 -0
  74. package/dist/cloud/billing/usage-metering.d.ts.map +1 -0
  75. package/dist/cloud/billing/usage-metering.js +174 -0
  76. package/dist/cloud/billing/usage-metering.js.map +1 -0
  77. package/dist/cloud/ingestion/backpressure.d.ts +107 -0
  78. package/dist/cloud/ingestion/backpressure.d.ts.map +1 -0
  79. package/dist/cloud/ingestion/backpressure.js +134 -0
  80. package/dist/cloud/ingestion/backpressure.js.map +1 -0
  81. package/dist/cloud/ingestion/batch-writer.d.ts +115 -0
  82. package/dist/cloud/ingestion/batch-writer.d.ts.map +1 -0
  83. package/dist/cloud/ingestion/batch-writer.js +319 -0
  84. package/dist/cloud/ingestion/batch-writer.js.map +1 -0
  85. package/dist/cloud/ingestion/dlq-manager.d.ts +116 -0
  86. package/dist/cloud/ingestion/dlq-manager.d.ts.map +1 -0
  87. package/dist/cloud/ingestion/dlq-manager.js +244 -0
  88. package/dist/cloud/ingestion/dlq-manager.js.map +1 -0
  89. package/dist/cloud/ingestion/event-queue.d.ts +105 -0
  90. package/dist/cloud/ingestion/event-queue.d.ts.map +1 -0
  91. package/dist/cloud/ingestion/event-queue.js +185 -0
  92. package/dist/cloud/ingestion/event-queue.js.map +1 -0
  93. package/dist/cloud/ingestion/gateway.d.ts +68 -0
  94. package/dist/cloud/ingestion/gateway.d.ts.map +1 -0
  95. package/dist/cloud/ingestion/gateway.js +198 -0
  96. package/dist/cloud/ingestion/gateway.js.map +1 -0
  97. package/dist/cloud/ingestion/index.d.ts +7 -0
  98. package/dist/cloud/ingestion/index.d.ts.map +1 -0
  99. package/dist/cloud/ingestion/index.js +7 -0
  100. package/dist/cloud/ingestion/index.js.map +1 -0
  101. package/dist/cloud/ingestion/rate-limiter.d.ts +73 -0
  102. package/dist/cloud/ingestion/rate-limiter.d.ts.map +1 -0
  103. package/dist/cloud/ingestion/rate-limiter.js +153 -0
  104. package/dist/cloud/ingestion/rate-limiter.js.map +1 -0
  105. package/dist/cloud/migrate.d.ts +45 -0
  106. package/dist/cloud/migrate.d.ts.map +1 -0
  107. package/dist/cloud/migrate.js +147 -0
  108. package/dist/cloud/migrate.js.map +1 -0
  109. package/dist/cloud/migration/export-import.d.ts +56 -0
  110. package/dist/cloud/migration/export-import.d.ts.map +1 -0
  111. package/dist/cloud/migration/export-import.js +289 -0
  112. package/dist/cloud/migration/export-import.js.map +1 -0
  113. package/dist/cloud/migration/index.d.ts +5 -0
  114. package/dist/cloud/migration/index.d.ts.map +1 -0
  115. package/dist/cloud/migration/index.js +5 -0
  116. package/dist/cloud/migration/index.js.map +1 -0
  117. package/dist/cloud/org-service.d.ts +68 -0
  118. package/dist/cloud/org-service.d.ts.map +1 -0
  119. package/dist/cloud/org-service.js +169 -0
  120. package/dist/cloud/org-service.js.map +1 -0
  121. package/dist/cloud/partition-maintenance.d.ts +29 -0
  122. package/dist/cloud/partition-maintenance.d.ts.map +1 -0
  123. package/dist/cloud/partition-maintenance.js +96 -0
  124. package/dist/cloud/partition-maintenance.js.map +1 -0
  125. package/dist/cloud/retention/index.d.ts +7 -0
  126. package/dist/cloud/retention/index.d.ts.map +1 -0
  127. package/dist/cloud/retention/index.js +7 -0
  128. package/dist/cloud/retention/index.js.map +1 -0
  129. package/dist/cloud/retention/partition-management.d.ts +61 -0
  130. package/dist/cloud/retention/partition-management.d.ts.map +1 -0
  131. package/dist/cloud/retention/partition-management.js +167 -0
  132. package/dist/cloud/retention/partition-management.js.map +1 -0
  133. package/dist/cloud/retention/retention-job.d.ts +70 -0
  134. package/dist/cloud/retention/retention-job.d.ts.map +1 -0
  135. package/dist/cloud/retention/retention-job.js +160 -0
  136. package/dist/cloud/retention/retention-job.js.map +1 -0
  137. package/dist/cloud/retention/retention-policy.d.ts +27 -0
  138. package/dist/cloud/retention/retention-policy.d.ts.map +1 -0
  139. package/dist/cloud/retention/retention-policy.js +36 -0
  140. package/dist/cloud/retention/retention-policy.js.map +1 -0
  141. package/dist/cloud/routes/api-key-routes.d.ts +38 -0
  142. package/dist/cloud/routes/api-key-routes.d.ts.map +1 -0
  143. package/dist/cloud/routes/api-key-routes.js +84 -0
  144. package/dist/cloud/routes/api-key-routes.js.map +1 -0
  145. package/dist/cloud/routes/audit-routes.d.ts +36 -0
  146. package/dist/cloud/routes/audit-routes.d.ts.map +1 -0
  147. package/dist/cloud/routes/audit-routes.js +47 -0
  148. package/dist/cloud/routes/audit-routes.js.map +1 -0
  149. package/dist/cloud/routes/billing-routes.d.ts +51 -0
  150. package/dist/cloud/routes/billing-routes.d.ts.map +1 -0
  151. package/dist/cloud/routes/billing-routes.js +114 -0
  152. package/dist/cloud/routes/billing-routes.js.map +1 -0
  153. package/dist/cloud/routes/onboarding-routes.d.ts +34 -0
  154. package/dist/cloud/routes/onboarding-routes.d.ts.map +1 -0
  155. package/dist/cloud/routes/onboarding-routes.js +58 -0
  156. package/dist/cloud/routes/onboarding-routes.js.map +1 -0
  157. package/dist/cloud/routes/org-routes.d.ts +80 -0
  158. package/dist/cloud/routes/org-routes.d.ts.map +1 -0
  159. package/dist/cloud/routes/org-routes.js +153 -0
  160. package/dist/cloud/routes/org-routes.js.map +1 -0
  161. package/dist/cloud/routes/usage-routes.d.ts +18 -0
  162. package/dist/cloud/routes/usage-routes.d.ts.map +1 -0
  163. package/dist/cloud/routes/usage-routes.js +66 -0
  164. package/dist/cloud/routes/usage-routes.js.map +1 -0
  165. package/dist/cloud/storage/adapter.d.ts +102 -0
  166. package/dist/cloud/storage/adapter.d.ts.map +1 -0
  167. package/dist/cloud/storage/adapter.js +21 -0
  168. package/dist/cloud/storage/adapter.js.map +1 -0
  169. package/dist/cloud/storage/index.d.ts +8 -0
  170. package/dist/cloud/storage/index.d.ts.map +1 -0
  171. package/dist/cloud/storage/index.js +7 -0
  172. package/dist/cloud/storage/index.js.map +1 -0
  173. package/dist/cloud/storage/postgres-adapter.d.ts +34 -0
  174. package/dist/cloud/storage/postgres-adapter.d.ts.map +1 -0
  175. package/dist/cloud/storage/postgres-adapter.js +544 -0
  176. package/dist/cloud/storage/postgres-adapter.js.map +1 -0
  177. package/dist/cloud/storage/sqlite-adapter.d.ts +29 -0
  178. package/dist/cloud/storage/sqlite-adapter.d.ts.map +1 -0
  179. package/dist/cloud/storage/sqlite-adapter.js +176 -0
  180. package/dist/cloud/storage/sqlite-adapter.js.map +1 -0
  181. package/dist/cloud/tenant-pool.d.ts +49 -0
  182. package/dist/cloud/tenant-pool.d.ts.map +1 -0
  183. package/dist/cloud/tenant-pool.js +61 -0
  184. package/dist/cloud/tenant-pool.js.map +1 -0
  185. package/dist/db/capability-store.d.ts +4 -0
  186. package/dist/db/capability-store.d.ts.map +1 -1
  187. package/dist/db/capability-store.js +20 -0
  188. package/dist/db/capability-store.js.map +1 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +16 -0
  191. package/dist/index.js.map +1 -1
  192. package/dist/routes/audit.js +3 -3
  193. package/dist/routes/audit.js.map +1 -1
  194. package/dist/routes/capabilities-top.d.ts +15 -0
  195. package/dist/routes/capabilities-top.d.ts.map +1 -0
  196. package/dist/routes/capabilities-top.js +77 -0
  197. package/dist/routes/capabilities-top.js.map +1 -0
  198. package/dist/routes/community.d.ts.map +1 -1
  199. package/dist/routes/community.js +85 -3
  200. package/dist/routes/community.js.map +1 -1
  201. package/dist/routes/delegations-top.d.ts +12 -0
  202. package/dist/routes/delegations-top.d.ts.map +1 -0
  203. package/dist/routes/delegations-top.js +43 -0
  204. package/dist/routes/delegations-top.js.map +1 -0
  205. package/dist/services/community-service.d.ts +6 -0
  206. package/dist/services/community-service.d.ts.map +1 -1
  207. package/dist/services/community-service.js +31 -0
  208. package/dist/services/community-service.js.map +1 -1
  209. package/package.json +1 -1
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Billing Routes (S-7.5)
3
+ *
4
+ * Express-compatible route handlers for billing page data:
5
+ * - Current plan & trial status
6
+ * - Invoice history
7
+ * - Plan upgrade/downgrade
8
+ * - Payment method management (Stripe portal)
9
+ */
10
+ import { TIER_CONFIG } from '../billing/stripe-client.js';
11
+ export function createBillingRouteHandlers(deps) {
12
+ return {
13
+ /** GET /api/cloud/orgs/:orgId/billing — billing overview */
14
+ async getBillingOverview(orgId, userId) {
15
+ const orgResult = await deps.db.query(`SELECT id, plan, stripe_customer_id, stripe_subscription_id, event_quota, settings
16
+ FROM orgs WHERE id = $1`, [orgId]);
17
+ const org = orgResult.rows[0];
18
+ if (!org)
19
+ return { status: 404, body: { error: 'Org not found' } };
20
+ const trialStatus = await deps.trialService.getTrialStatus(orgId);
21
+ const plan = org.plan;
22
+ const tierConfig = TIER_CONFIG[plan] ?? TIER_CONFIG.free;
23
+ // Get current period usage
24
+ const now = new Date();
25
+ const monthStart = new Date(now.getUTCFullYear(), now.getUTCMonth(), 1);
26
+ const usageResult = await deps.db.query(`SELECT COALESCE(SUM(event_count), 0)::int as total
27
+ FROM usage_records WHERE org_id = $1 AND hour >= $2`, [orgId, monthStart.toISOString()]);
28
+ const currentUsage = usageResult.rows[0]?.total ?? 0;
29
+ return {
30
+ status: 200,
31
+ body: {
32
+ plan,
33
+ plan_name: tierConfig.name,
34
+ base_price_cents: tierConfig.base_price_cents,
35
+ event_quota: org.event_quota ?? tierConfig.event_quota,
36
+ current_usage: currentUsage,
37
+ has_payment_method: !!org.stripe_customer_id,
38
+ stripe_subscription_id: org.stripe_subscription_id,
39
+ trial: trialStatus,
40
+ pending_downgrade: org.settings?.pending_downgrade ?? null,
41
+ payment_status: org.settings?.payment_status ?? 'active',
42
+ },
43
+ };
44
+ },
45
+ /** GET /api/cloud/orgs/:orgId/billing/invoices — invoice history */
46
+ async getInvoices(orgId, limit = 20, offset = 0) {
47
+ const invoices = await deps.invoiceService.listInvoices(orgId, limit, offset);
48
+ return { status: 200, body: invoices };
49
+ },
50
+ /** POST /api/cloud/orgs/:orgId/billing/upgrade — upgrade plan */
51
+ async upgradePlan(orgId, userId, body) {
52
+ const newPlan = body.plan;
53
+ if (!TIER_CONFIG[newPlan] || newPlan === 'free') {
54
+ return { status: 400, body: { error: 'Invalid plan' } };
55
+ }
56
+ try {
57
+ await deps.billingService.upgradePlan(orgId, newPlan);
58
+ if (deps.auditLog) {
59
+ await deps.auditLog.write({
60
+ org_id: orgId,
61
+ actor_type: 'user',
62
+ actor_id: userId,
63
+ action: 'billing.plan_changed',
64
+ resource_type: 'org',
65
+ resource_id: orgId,
66
+ details: { new_plan: newPlan, direction: 'upgrade' },
67
+ result: 'success',
68
+ });
69
+ }
70
+ return { status: 200, body: { ok: true, plan: newPlan } };
71
+ }
72
+ catch (err) {
73
+ return { status: 400, body: { error: String(err) } };
74
+ }
75
+ },
76
+ /** POST /api/cloud/orgs/:orgId/billing/downgrade — downgrade to free */
77
+ async downgradePlan(orgId, userId) {
78
+ try {
79
+ await deps.billingService.downgradePlan(orgId);
80
+ if (deps.auditLog) {
81
+ await deps.auditLog.write({
82
+ org_id: orgId,
83
+ actor_type: 'user',
84
+ actor_id: userId,
85
+ action: 'billing.plan_changed',
86
+ resource_type: 'org',
87
+ resource_id: orgId,
88
+ details: { new_plan: 'free', direction: 'downgrade' },
89
+ result: 'success',
90
+ });
91
+ }
92
+ return { status: 200, body: { ok: true, scheduled: 'end_of_period' } };
93
+ }
94
+ catch (err) {
95
+ return { status: 400, body: { error: String(err) } };
96
+ }
97
+ },
98
+ /** POST /api/cloud/orgs/:orgId/billing/portal — create Stripe portal session URL */
99
+ async createPortalSession(orgId) {
100
+ const orgResult = await deps.db.query(`SELECT stripe_customer_id FROM orgs WHERE id = $1`, [orgId]);
101
+ const org = orgResult.rows[0];
102
+ if (!org?.stripe_customer_id) {
103
+ return { status: 400, body: { error: 'No payment method on file' } };
104
+ }
105
+ // In real impl, create Stripe Billing Portal session
106
+ // For now, return a placeholder URL
107
+ return {
108
+ status: 200,
109
+ body: { url: `https://billing.stripe.com/p/session/${org.stripe_customer_id}` },
110
+ };
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=billing-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing-routes.js","sourceRoot":"","sources":["../../../src/cloud/routes/billing-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Onboarding Routes (S-7.7)
3
+ *
4
+ * Server-side support for the onboarding wizard:
5
+ * - Check onboarding status (has org, has key, has events)
6
+ * - Verify first event received
7
+ */
8
+ import type { MigrationClient } from '../migrate.js';
9
+ export interface OnboardingRoutesDeps {
10
+ db: MigrationClient;
11
+ }
12
+ export interface OnboardingStatus {
13
+ has_org: boolean;
14
+ has_api_key: boolean;
15
+ has_first_event: boolean;
16
+ org_id: string | null;
17
+ api_key_prefix: string | null;
18
+ }
19
+ export declare function createOnboardingRouteHandlers(deps: OnboardingRoutesDeps): {
20
+ /** GET /api/cloud/onboarding/status — check onboarding progress */
21
+ getOnboardingStatus(userId: string): Promise<{
22
+ status: number;
23
+ body: OnboardingStatus;
24
+ }>;
25
+ /** POST /api/cloud/onboarding/verify — poll for first event */
26
+ verifyFirstEvent(orgId: string): Promise<{
27
+ status: number;
28
+ body: {
29
+ received: boolean;
30
+ event_count: number;
31
+ };
32
+ }>;
33
+ };
34
+ //# sourceMappingURL=onboarding-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-routes.d.ts","sourceRoot":"","sources":["../../../src/cloud/routes/onboarding-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,eAAe,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB;IAEpE,mEAAmE;gCAEzD,MAAM,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAmDtD,+DAA+D;4BAEtD,MAAM,GACZ,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,QAAQ,EAAE,OAAO,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;EAYnF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Onboarding Routes (S-7.7)
3
+ *
4
+ * Server-side support for the onboarding wizard:
5
+ * - Check onboarding status (has org, has key, has events)
6
+ * - Verify first event received
7
+ */
8
+ export function createOnboardingRouteHandlers(deps) {
9
+ return {
10
+ /** GET /api/cloud/onboarding/status — check onboarding progress */
11
+ async getOnboardingStatus(userId) {
12
+ // Check if user has any orgs
13
+ const orgResult = await deps.db.query(`SELECT o.id FROM orgs o
14
+ JOIN org_members om ON om.org_id = o.id
15
+ WHERE om.user_id = $1
16
+ ORDER BY o.created_at ASC LIMIT 1`, [userId]);
17
+ const orgId = orgResult.rows[0]?.id ?? null;
18
+ if (!orgId) {
19
+ return {
20
+ status: 200,
21
+ body: { has_org: false, has_api_key: false, has_first_event: false, org_id: null, api_key_prefix: null },
22
+ };
23
+ }
24
+ // Check if org has API keys
25
+ const keyResult = await deps.db.query(`SELECT key_prefix FROM api_keys WHERE org_id = $1 AND revoked_at IS NULL LIMIT 1`, [orgId]);
26
+ const keyPrefix = keyResult.rows[0]?.key_prefix ?? null;
27
+ if (!keyPrefix) {
28
+ return {
29
+ status: 200,
30
+ body: { has_org: true, has_api_key: false, has_first_event: false, org_id: orgId, api_key_prefix: null },
31
+ };
32
+ }
33
+ // Check if org has received any events
34
+ const eventResult = await deps.db.query(`SELECT 1 FROM events WHERE org_id = $1 LIMIT 1`, [orgId]);
35
+ const hasEvent = eventResult.rows.length > 0;
36
+ return {
37
+ status: 200,
38
+ body: {
39
+ has_org: true,
40
+ has_api_key: true,
41
+ has_first_event: hasEvent,
42
+ org_id: orgId,
43
+ api_key_prefix: keyPrefix,
44
+ },
45
+ };
46
+ },
47
+ /** POST /api/cloud/onboarding/verify — poll for first event */
48
+ async verifyFirstEvent(orgId) {
49
+ const result = await deps.db.query(`SELECT COUNT(*)::int as count FROM events WHERE org_id = $1`, [orgId]);
50
+ const count = result.rows[0]?.count ?? 0;
51
+ return {
52
+ status: 200,
53
+ body: { received: count > 0, event_count: count },
54
+ };
55
+ },
56
+ };
57
+ }
58
+ //# sourceMappingURL=onboarding-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-routes.js","sourceRoot":"","sources":["../../../src/cloud/routes/onboarding-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,MAAM,UAAU,6BAA6B,CAAC,IAA0B;IACtE,OAAO;QACL,mEAAmE;QACnE,KAAK,CAAC,mBAAmB,CACvB,MAAc;YAEd,6BAA6B;YAC7B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACnC;;;2CAGmC,EACnC,CAAC,MAAM,CAAC,CACT,CAAC;YACF,MAAM,KAAK,GAAI,SAAS,CAAC,IAAc,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;YAEvD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE;iBACzG,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACnC,kFAAkF,EAClF,CAAC,KAAK,CAAC,CACR,CAAC;YACF,MAAM,SAAS,GAAI,SAAS,CAAC,IAAc,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;YAEnE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;iBACzG,CAAC;YACJ,CAAC;YAED,uCAAuC;YACvC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACrC,gDAAgD,EAChD,CAAC,KAAK,CAAC,CACR,CAAC;YACF,MAAM,QAAQ,GAAI,WAAW,CAAC,IAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAExD,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,IAAI;oBACjB,eAAe,EAAE,QAAQ;oBACzB,MAAM,EAAE,KAAK;oBACb,cAAc,EAAE,SAAS;iBAC1B;aACF,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,KAAK,CAAC,gBAAgB,CACpB,KAAa;YAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,6DAA6D,EAC7D,CAAC,KAAK,CAAC,CACR,CAAC;YACF,MAAM,KAAK,GAAI,MAAM,CAAC,IAAc,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACpD,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE;aAClD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Org & Team Routes (S-7.1, S-7.2)
3
+ *
4
+ * Express-compatible route handlers for org management and team management.
5
+ * These are designed to be mounted at /api/cloud/orgs.
6
+ */
7
+ import type { MigrationClient } from '../migrate.js';
8
+ import type { AuditLogService } from '../auth/audit-log.js';
9
+ export interface OrgRoutesDeps {
10
+ db: MigrationClient;
11
+ auditLog?: AuditLogService;
12
+ }
13
+ /**
14
+ * Creates a map of route handlers for org/team management.
15
+ * Can be wired into Express, Fastify, or any HTTP framework.
16
+ */
17
+ export declare function createOrgRouteHandlers(deps: OrgRoutesDeps): {
18
+ /** GET /api/cloud/orgs — list user's orgs */
19
+ listOrgs(userId: string): Promise<{
20
+ status: number;
21
+ body: unknown;
22
+ }>;
23
+ /** POST /api/cloud/orgs — create a new org */
24
+ createOrg(userId: string, body: {
25
+ name: string;
26
+ }): Promise<{
27
+ status: number;
28
+ body: unknown;
29
+ }>;
30
+ /** POST /api/cloud/orgs/switch — switch active org (returns new JWT context) */
31
+ switchOrg(userId: string, body: {
32
+ orgId: string;
33
+ }): Promise<{
34
+ status: number;
35
+ body: unknown;
36
+ }>;
37
+ /** GET /api/cloud/orgs/:orgId/members — list org members */
38
+ listMembers(orgId: string): Promise<{
39
+ status: number;
40
+ body: unknown;
41
+ }>;
42
+ /** GET /api/cloud/orgs/:orgId/invitations — list pending invitations */
43
+ listInvitations(orgId: string): Promise<{
44
+ status: number;
45
+ body: unknown;
46
+ }>;
47
+ /** POST /api/cloud/orgs/:orgId/invitations — invite a member */
48
+ inviteMember(orgId: string, invitedByUserId: string, body: {
49
+ email: string;
50
+ role: string;
51
+ }): Promise<{
52
+ status: number;
53
+ body: unknown;
54
+ }>;
55
+ /** DELETE /api/cloud/orgs/:orgId/invitations/:invId — cancel invitation */
56
+ cancelInvitation(orgId: string, invitationId: string): Promise<{
57
+ status: number;
58
+ body: unknown;
59
+ }>;
60
+ /** PUT /api/cloud/orgs/:orgId/members/:userId/role — change role */
61
+ changeMemberRole(orgId: string, targetUserId: string, actorRole: string, body: {
62
+ role: string;
63
+ }): Promise<{
64
+ status: number;
65
+ body: unknown;
66
+ }>;
67
+ /** DELETE /api/cloud/orgs/:orgId/members/:userId — remove member */
68
+ removeMember(orgId: string, targetUserId: string): Promise<{
69
+ status: number;
70
+ body: unknown;
71
+ }>;
72
+ /** POST /api/cloud/orgs/:orgId/transfer — transfer ownership */
73
+ transferOwnership(orgId: string, fromUserId: string, body: {
74
+ toUserId: string;
75
+ }): Promise<{
76
+ status: number;
77
+ body: unknown;
78
+ }>;
79
+ };
80
+ //# sourceMappingURL=org-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-routes.d.ts","sourceRoot":"","sources":["../../../src/cloud/routes/org-routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,eAAe,CAAC;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa;IAItD,6CAA6C;qBACtB,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAK1E,8CAA8C;sBAEpC,MAAM,QACR;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAyB7C,gFAAgF;sBAEtE,MAAM,QACR;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GACtB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAY7C,4DAA4D;uBAEnD,MAAM,GACZ,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAK7C,wEAAwE;2BAE/D,MAAM,GACZ,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAK7C,gEAAgE;wBAEvD,MAAM,mBACI,MAAM,QACjB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GACpC,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IA8B7C,2EAA2E;4BAElE,MAAM,gBACC,MAAM,GACnB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAK7C,oEAAoE;4BAE3D,MAAM,gBACC,MAAM,aACT,MAAM,QACX;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GACrB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAY7C,oEAAoE;wBAE3D,MAAM,gBACC,MAAM,GACnB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAY7C,gEAAgE;6BAEvD,MAAM,cACD,MAAM,QACZ;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;EAyBhD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Org & Team Routes (S-7.1, S-7.2)
3
+ *
4
+ * Express-compatible route handlers for org management and team management.
5
+ * These are designed to be mounted at /api/cloud/orgs.
6
+ */
7
+ import { OrgService, OrgServiceError } from '../org-service.js';
8
+ /**
9
+ * Creates a map of route handlers for org/team management.
10
+ * Can be wired into Express, Fastify, or any HTTP framework.
11
+ */
12
+ export function createOrgRouteHandlers(deps) {
13
+ const orgService = new OrgService(deps.db);
14
+ return {
15
+ /** GET /api/cloud/orgs — list user's orgs */
16
+ async listOrgs(userId) {
17
+ const orgs = await orgService.listUserOrgs(userId);
18
+ return { status: 200, body: orgs };
19
+ },
20
+ /** POST /api/cloud/orgs — create a new org */
21
+ async createOrg(userId, body) {
22
+ try {
23
+ const org = await orgService.createOrg(userId, body.name);
24
+ if (deps.auditLog) {
25
+ await deps.auditLog.write({
26
+ org_id: org.id,
27
+ actor_type: 'user',
28
+ actor_id: userId,
29
+ action: 'org.created',
30
+ resource_type: 'org',
31
+ resource_id: org.id,
32
+ details: { name: body.name },
33
+ ip_address: null,
34
+ result: 'success',
35
+ });
36
+ }
37
+ return { status: 201, body: org };
38
+ }
39
+ catch (err) {
40
+ if (err instanceof OrgServiceError) {
41
+ return { status: err.statusCode, body: { error: err.message } };
42
+ }
43
+ throw err;
44
+ }
45
+ },
46
+ /** POST /api/cloud/orgs/switch — switch active org (returns new JWT context) */
47
+ async switchOrg(userId, body) {
48
+ // Verify user belongs to this org
49
+ const orgs = await orgService.listUserOrgs(userId);
50
+ const target = orgs.find((o) => o.id === body.orgId);
51
+ if (!target) {
52
+ return { status: 403, body: { error: 'You are not a member of this organization' } };
53
+ }
54
+ // The actual JWT re-issuance would be done by the auth layer.
55
+ // This endpoint validates the switch is allowed.
56
+ return { status: 200, body: { token: 'refresh-required', orgId: body.orgId } };
57
+ },
58
+ /** GET /api/cloud/orgs/:orgId/members — list org members */
59
+ async listMembers(orgId) {
60
+ const members = await orgService.listMembers(orgId);
61
+ return { status: 200, body: members };
62
+ },
63
+ /** GET /api/cloud/orgs/:orgId/invitations — list pending invitations */
64
+ async listInvitations(orgId) {
65
+ const invitations = await orgService.listInvitations(orgId);
66
+ return { status: 200, body: invitations };
67
+ },
68
+ /** POST /api/cloud/orgs/:orgId/invitations — invite a member */
69
+ async inviteMember(orgId, invitedByUserId, body) {
70
+ try {
71
+ const { invitation } = await orgService.inviteMember(orgId, invitedByUserId, body.email, body.role);
72
+ if (deps.auditLog) {
73
+ await deps.auditLog.write({
74
+ org_id: orgId,
75
+ actor_type: 'user',
76
+ actor_id: invitedByUserId,
77
+ action: 'member.invited',
78
+ resource_type: 'invitation',
79
+ resource_id: invitation.id,
80
+ details: { email: body.email, role: body.role },
81
+ ip_address: null,
82
+ result: 'success',
83
+ });
84
+ }
85
+ return { status: 201, body: invitation };
86
+ }
87
+ catch (err) {
88
+ if (err instanceof OrgServiceError) {
89
+ return { status: err.statusCode, body: { error: err.message } };
90
+ }
91
+ throw err;
92
+ }
93
+ },
94
+ /** DELETE /api/cloud/orgs/:orgId/invitations/:invId — cancel invitation */
95
+ async cancelInvitation(orgId, invitationId) {
96
+ const ok = await orgService.cancelInvitation(orgId, invitationId);
97
+ return { status: ok ? 200 : 404, body: { ok } };
98
+ },
99
+ /** PUT /api/cloud/orgs/:orgId/members/:userId/role — change role */
100
+ async changeMemberRole(orgId, targetUserId, actorRole, body) {
101
+ try {
102
+ await orgService.changeMemberRole(orgId, targetUserId, body.role, actorRole);
103
+ return { status: 200, body: { ok: true } };
104
+ }
105
+ catch (err) {
106
+ if (err instanceof OrgServiceError) {
107
+ return { status: err.statusCode, body: { error: err.message } };
108
+ }
109
+ throw err;
110
+ }
111
+ },
112
+ /** DELETE /api/cloud/orgs/:orgId/members/:userId — remove member */
113
+ async removeMember(orgId, targetUserId) {
114
+ try {
115
+ await orgService.removeMember(orgId, targetUserId);
116
+ return { status: 200, body: { ok: true } };
117
+ }
118
+ catch (err) {
119
+ if (err instanceof OrgServiceError) {
120
+ return { status: err.statusCode, body: { error: err.message } };
121
+ }
122
+ throw err;
123
+ }
124
+ },
125
+ /** POST /api/cloud/orgs/:orgId/transfer — transfer ownership */
126
+ async transferOwnership(orgId, fromUserId, body) {
127
+ try {
128
+ await orgService.transferOwnership(orgId, fromUserId, body.toUserId);
129
+ if (deps.auditLog) {
130
+ await deps.auditLog.write({
131
+ org_id: orgId,
132
+ actor_type: 'user',
133
+ actor_id: fromUserId,
134
+ action: 'org.ownership_transferred',
135
+ resource_type: 'org',
136
+ resource_id: orgId,
137
+ details: { from: fromUserId, to: body.toUserId },
138
+ ip_address: null,
139
+ result: 'success',
140
+ });
141
+ }
142
+ return { status: 200, body: { ok: true } };
143
+ }
144
+ catch (err) {
145
+ if (err instanceof OrgServiceError) {
146
+ return { status: err.statusCode, body: { error: err.message } };
147
+ }
148
+ throw err;
149
+ }
150
+ },
151
+ };
152
+ }
153
+ //# sourceMappingURL=org-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-routes.js","sourceRoot":"","sources":["../../../src/cloud/routes/org-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Usage Dashboard Routes (S-7.4)
3
+ *
4
+ * Express-compatible route handlers for usage data.
5
+ * Mounted at /api/cloud/orgs/:orgId/usage
6
+ */
7
+ import type { MigrationClient } from '../migrate.js';
8
+ export interface UsageRoutesDeps {
9
+ db: MigrationClient;
10
+ }
11
+ export declare function createUsageRouteHandlers(deps: UsageRoutesDeps): {
12
+ /** GET /api/cloud/orgs/:orgId/usage?range=30d */
13
+ getUsage(orgId: string, range?: string): Promise<{
14
+ status: number;
15
+ body: unknown;
16
+ }>;
17
+ };
18
+ //# sourceMappingURL=usage-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-routes.d.ts","sourceRoot":"","sources":["../../../src/cloud/routes/usage-routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,eAAe,CAAC;CACrB;AAiBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe;IAE1D,iDAAiD;oBAExC,MAAM,UACN,MAAM,GACZ,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;EAwDhD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Usage Dashboard Routes (S-7.4)
3
+ *
4
+ * Express-compatible route handlers for usage data.
5
+ * Mounted at /api/cloud/orgs/:orgId/usage
6
+ */
7
+ const RANGE_DAYS = {
8
+ '7d': 7,
9
+ '30d': 30,
10
+ '90d': 90,
11
+ };
12
+ const TIER_QUOTAS = {
13
+ free: { events: 10_000, storage_bytes: 1_073_741_824 }, // 1GB
14
+ pro: { events: 1_000_000, storage_bytes: 107_374_182_400 }, // 100GB
15
+ team: { events: 10_000_000, storage_bytes: 1_099_511_627_776 }, // 1TB
16
+ enterprise: { events: 100_000_000, storage_bytes: 10_995_116_277_760 }, // 10TB
17
+ };
18
+ export function createUsageRouteHandlers(deps) {
19
+ return {
20
+ /** GET /api/cloud/orgs/:orgId/usage?range=30d */
21
+ async getUsage(orgId, range = '30d') {
22
+ const validRange = (RANGE_DAYS[range] ? range : '30d');
23
+ const days = RANGE_DAYS[validRange];
24
+ // Get org plan
25
+ const orgResult = await deps.db.query(`SELECT plan FROM orgs WHERE id = $1`, [orgId]);
26
+ const plan = orgResult.rows[0]?.plan ?? 'free';
27
+ const quota = TIER_QUOTAS[plan] ?? TIER_QUOTAS.free;
28
+ // Get aggregated usage for the period
29
+ const now = new Date();
30
+ const periodStart = new Date(now.getTime() - days * 86_400_000);
31
+ // Query usage_records for summary
32
+ const summaryResult = await deps.db.query(`SELECT
33
+ COALESCE(SUM(event_count), 0)::int as events_count
34
+ FROM usage_records
35
+ WHERE org_id = $1 AND hour >= $2`, [orgId, periodStart.toISOString()]);
36
+ const summary = summaryResult.rows[0] ?? {
37
+ events_count: 0,
38
+ };
39
+ // Query timeseries (daily buckets)
40
+ const timeseriesResult = await deps.db.query(`SELECT
41
+ date_trunc('day', hour) as timestamp,
42
+ COALESCE(SUM(event_count), 0)::int as events
43
+ FROM usage_records
44
+ WHERE org_id = $1 AND hour >= $2
45
+ GROUP BY date_trunc('day', hour)
46
+ ORDER BY timestamp`, [orgId, periodStart.toISOString()]);
47
+ return {
48
+ status: 200,
49
+ body: {
50
+ summary: {
51
+ events_count: Number(summary.events_count),
52
+ quota_events: quota.events,
53
+ plan,
54
+ period_start: periodStart.toISOString().slice(0, 10),
55
+ period_end: now.toISOString().slice(0, 10),
56
+ },
57
+ timeseries: timeseriesResult.rows.map((r) => ({
58
+ timestamp: r.timestamp,
59
+ events: Number(r.events),
60
+ })),
61
+ },
62
+ };
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=usage-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-routes.js","sourceRoot":"","sources":["../../../src/cloud/routes/usage-routes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,UAAU,GAA8B;IAC5C,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,WAAW,GAA8D;IAC7E,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,MAAM;IAC9D,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,QAAQ;IACpE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,EAAE,MAAM;IACtE,UAAU,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,OAAO;CAChF,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,IAAqB;IAC5D,OAAO;QACL,iDAAiD;QACjD,KAAK,CAAC,QAAQ,CACZ,KAAa,EACb,QAAgB,KAAK;YAErB,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAc,CAAC;YACjF,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAEpC,eAAe;YACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACtF,MAAM,IAAI,GAAI,SAAS,CAAC,IAAc,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;YAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC;YAEpD,sCAAsC;YACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC;YAEhE,kCAAkC;YAClC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACvC;;;0CAGkC,EAClC,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CACnC,CAAC;YAEF,MAAM,OAAO,GAAI,aAAa,CAAC,IAAc,CAAC,CAAC,CAAC,IAAI;gBAClD,YAAY,EAAE,CAAC;aAChB,CAAC;YAEF,mCAAmC;YACnC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAC1C;;;;;;4BAMoB,EACpB,CAAC,KAAK,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CACnC,CAAC;YAEF,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;wBAC1C,YAAY,EAAE,KAAK,CAAC,MAAM;wBAC1B,IAAI;wBACJ,YAAY,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;wBACpD,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;qBAC3C;oBACD,UAAU,EAAG,gBAAgB,CAAC,IAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACvD,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;qBACzB,CAAC,CAAC;iBACJ;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}