@plures/praxis 0.2.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 (263) hide show
  1. package/FRAMEWORK.md +420 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1310 -0
  4. package/dist/adapters/cli.d.ts +43 -0
  5. package/dist/adapters/cli.d.ts.map +1 -0
  6. package/dist/adapters/cli.js +126 -0
  7. package/dist/adapters/cli.js.map +1 -0
  8. package/dist/cli/commands/auth.d.ts +26 -0
  9. package/dist/cli/commands/auth.d.ts.map +1 -0
  10. package/dist/cli/commands/auth.js +233 -0
  11. package/dist/cli/commands/auth.js.map +1 -0
  12. package/dist/cli/commands/cloud.d.ts +27 -0
  13. package/dist/cli/commands/cloud.d.ts.map +1 -0
  14. package/dist/cli/commands/cloud.js +232 -0
  15. package/dist/cli/commands/cloud.js.map +1 -0
  16. package/dist/cli/commands/generate.d.ts +25 -0
  17. package/dist/cli/commands/generate.d.ts.map +1 -0
  18. package/dist/cli/commands/generate.js +168 -0
  19. package/dist/cli/commands/generate.js.map +1 -0
  20. package/dist/cli/index.d.ts +8 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +179 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cloud/auth.d.ts +51 -0
  25. package/dist/cloud/auth.d.ts.map +1 -0
  26. package/dist/cloud/auth.js +194 -0
  27. package/dist/cloud/auth.js.map +1 -0
  28. package/dist/cloud/billing.d.ts +184 -0
  29. package/dist/cloud/billing.d.ts.map +1 -0
  30. package/dist/cloud/billing.js +179 -0
  31. package/dist/cloud/billing.js.map +1 -0
  32. package/dist/cloud/client.d.ts +39 -0
  33. package/dist/cloud/client.d.ts.map +1 -0
  34. package/dist/cloud/client.js +176 -0
  35. package/dist/cloud/client.js.map +1 -0
  36. package/dist/cloud/index.d.ts +44 -0
  37. package/dist/cloud/index.d.ts.map +1 -0
  38. package/dist/cloud/index.js +44 -0
  39. package/dist/cloud/index.js.map +1 -0
  40. package/dist/cloud/marketplace.d.ts +166 -0
  41. package/dist/cloud/marketplace.d.ts.map +1 -0
  42. package/dist/cloud/marketplace.js +159 -0
  43. package/dist/cloud/marketplace.js.map +1 -0
  44. package/dist/cloud/provisioning.d.ts +110 -0
  45. package/dist/cloud/provisioning.d.ts.map +1 -0
  46. package/dist/cloud/provisioning.js +148 -0
  47. package/dist/cloud/provisioning.js.map +1 -0
  48. package/dist/cloud/relay/endpoints.d.ts +62 -0
  49. package/dist/cloud/relay/endpoints.d.ts.map +1 -0
  50. package/dist/cloud/relay/endpoints.js +217 -0
  51. package/dist/cloud/relay/endpoints.js.map +1 -0
  52. package/dist/cloud/relay/health/index.d.ts +5 -0
  53. package/dist/cloud/relay/health/index.d.ts.map +1 -0
  54. package/dist/cloud/relay/health/index.js +9 -0
  55. package/dist/cloud/relay/health/index.js.map +1 -0
  56. package/dist/cloud/relay/stats/index.d.ts +5 -0
  57. package/dist/cloud/relay/stats/index.d.ts.map +1 -0
  58. package/dist/cloud/relay/stats/index.js +9 -0
  59. package/dist/cloud/relay/stats/index.js.map +1 -0
  60. package/dist/cloud/relay/sync/index.d.ts +5 -0
  61. package/dist/cloud/relay/sync/index.d.ts.map +1 -0
  62. package/dist/cloud/relay/sync/index.js +9 -0
  63. package/dist/cloud/relay/sync/index.js.map +1 -0
  64. package/dist/cloud/relay/usage/index.d.ts +5 -0
  65. package/dist/cloud/relay/usage/index.d.ts.map +1 -0
  66. package/dist/cloud/relay/usage/index.js +9 -0
  67. package/dist/cloud/relay/usage/index.js.map +1 -0
  68. package/dist/cloud/sponsors.d.ts +81 -0
  69. package/dist/cloud/sponsors.d.ts.map +1 -0
  70. package/dist/cloud/sponsors.js +130 -0
  71. package/dist/cloud/sponsors.js.map +1 -0
  72. package/dist/cloud/types.d.ts +169 -0
  73. package/dist/cloud/types.d.ts.map +1 -0
  74. package/dist/cloud/types.js +7 -0
  75. package/dist/cloud/types.js.map +1 -0
  76. package/dist/components/index.d.ts +43 -0
  77. package/dist/components/index.d.ts.map +1 -0
  78. package/dist/components/index.js +17 -0
  79. package/dist/components/index.js.map +1 -0
  80. package/dist/core/actors.d.ts +95 -0
  81. package/dist/core/actors.d.ts.map +1 -0
  82. package/dist/core/actors.js +158 -0
  83. package/dist/core/actors.js.map +1 -0
  84. package/dist/core/component/generator.d.ts +122 -0
  85. package/dist/core/component/generator.d.ts.map +1 -0
  86. package/dist/core/component/generator.js +307 -0
  87. package/dist/core/component/generator.js.map +1 -0
  88. package/dist/core/engine.d.ts +92 -0
  89. package/dist/core/engine.d.ts.map +1 -0
  90. package/dist/core/engine.js +199 -0
  91. package/dist/core/engine.js.map +1 -0
  92. package/dist/core/introspection.d.ts +141 -0
  93. package/dist/core/introspection.d.ts.map +1 -0
  94. package/dist/core/introspection.js +208 -0
  95. package/dist/core/introspection.js.map +1 -0
  96. package/dist/core/logic/generator.d.ts +76 -0
  97. package/dist/core/logic/generator.d.ts.map +1 -0
  98. package/dist/core/logic/generator.js +339 -0
  99. package/dist/core/logic/generator.js.map +1 -0
  100. package/dist/core/pluresdb/generator.d.ts +58 -0
  101. package/dist/core/pluresdb/generator.d.ts.map +1 -0
  102. package/dist/core/pluresdb/generator.js +162 -0
  103. package/dist/core/pluresdb/generator.js.map +1 -0
  104. package/dist/core/protocol.d.ts +121 -0
  105. package/dist/core/protocol.d.ts.map +1 -0
  106. package/dist/core/protocol.js +46 -0
  107. package/dist/core/protocol.js.map +1 -0
  108. package/dist/core/rules.d.ts +120 -0
  109. package/dist/core/rules.d.ts.map +1 -0
  110. package/dist/core/rules.js +81 -0
  111. package/dist/core/rules.js.map +1 -0
  112. package/dist/core/schema/loader.d.ts +47 -0
  113. package/dist/core/schema/loader.d.ts.map +1 -0
  114. package/dist/core/schema/loader.js +189 -0
  115. package/dist/core/schema/loader.js.map +1 -0
  116. package/dist/core/schema/normalize.d.ts +72 -0
  117. package/dist/core/schema/normalize.d.ts.map +1 -0
  118. package/dist/core/schema/normalize.js +190 -0
  119. package/dist/core/schema/normalize.js.map +1 -0
  120. package/dist/core/schema/types.d.ts +370 -0
  121. package/dist/core/schema/types.d.ts.map +1 -0
  122. package/dist/core/schema/types.js +161 -0
  123. package/dist/core/schema/types.js.map +1 -0
  124. package/dist/dsl/index.d.ts +152 -0
  125. package/dist/dsl/index.d.ts.map +1 -0
  126. package/dist/dsl/index.js +132 -0
  127. package/dist/dsl/index.js.map +1 -0
  128. package/dist/dsl.d.ts +124 -0
  129. package/dist/dsl.d.ts.map +1 -0
  130. package/dist/dsl.js +130 -0
  131. package/dist/dsl.js.map +1 -0
  132. package/dist/examples/advanced-todo/index.d.ts +55 -0
  133. package/dist/examples/advanced-todo/index.d.ts.map +1 -0
  134. package/dist/examples/advanced-todo/index.js +222 -0
  135. package/dist/examples/advanced-todo/index.js.map +1 -0
  136. package/dist/examples/auth-basic/index.d.ts +17 -0
  137. package/dist/examples/auth-basic/index.d.ts.map +1 -0
  138. package/dist/examples/auth-basic/index.js +122 -0
  139. package/dist/examples/auth-basic/index.js.map +1 -0
  140. package/dist/examples/cart/index.d.ts +19 -0
  141. package/dist/examples/cart/index.d.ts.map +1 -0
  142. package/dist/examples/cart/index.js +202 -0
  143. package/dist/examples/cart/index.js.map +1 -0
  144. package/dist/examples/hero-ecommerce/index.d.ts +39 -0
  145. package/dist/examples/hero-ecommerce/index.d.ts.map +1 -0
  146. package/dist/examples/hero-ecommerce/index.js +506 -0
  147. package/dist/examples/hero-ecommerce/index.js.map +1 -0
  148. package/dist/examples/svelte-counter/index.d.ts +31 -0
  149. package/dist/examples/svelte-counter/index.d.ts.map +1 -0
  150. package/dist/examples/svelte-counter/index.js +123 -0
  151. package/dist/examples/svelte-counter/index.js.map +1 -0
  152. package/dist/flows.d.ts +125 -0
  153. package/dist/flows.d.ts.map +1 -0
  154. package/dist/flows.js +160 -0
  155. package/dist/flows.js.map +1 -0
  156. package/dist/index.d.ts +67 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +59 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/integrations/pluresdb.d.ts +56 -0
  161. package/dist/integrations/pluresdb.d.ts.map +1 -0
  162. package/dist/integrations/pluresdb.js +46 -0
  163. package/dist/integrations/pluresdb.js.map +1 -0
  164. package/dist/integrations/svelte.d.ts +306 -0
  165. package/dist/integrations/svelte.d.ts.map +1 -0
  166. package/dist/integrations/svelte.js +447 -0
  167. package/dist/integrations/svelte.js.map +1 -0
  168. package/dist/registry.d.ts +94 -0
  169. package/dist/registry.d.ts.map +1 -0
  170. package/dist/registry.js +181 -0
  171. package/dist/registry.js.map +1 -0
  172. package/dist/runtime/terminal-adapter.d.ts +105 -0
  173. package/dist/runtime/terminal-adapter.d.ts.map +1 -0
  174. package/dist/runtime/terminal-adapter.js +113 -0
  175. package/dist/runtime/terminal-adapter.js.map +1 -0
  176. package/dist/step.d.ts +34 -0
  177. package/dist/step.d.ts.map +1 -0
  178. package/dist/step.js +111 -0
  179. package/dist/step.js.map +1 -0
  180. package/dist/types.d.ts +63 -0
  181. package/dist/types.d.ts.map +1 -0
  182. package/dist/types.js +6 -0
  183. package/dist/types.js.map +1 -0
  184. package/docs/MONETIZATION.md +394 -0
  185. package/docs/TERMINAL_NODE.md +588 -0
  186. package/docs/guides/canvas.md +389 -0
  187. package/docs/guides/getting-started.md +347 -0
  188. package/docs/guides/history-state-pattern.md +618 -0
  189. package/docs/guides/orchestration.md +617 -0
  190. package/docs/guides/parallel-state-pattern.md +767 -0
  191. package/docs/guides/svelte-integration.md +691 -0
  192. package/package.json +96 -0
  193. package/src/__tests__/actors.test.ts +270 -0
  194. package/src/__tests__/billing.test.ts +175 -0
  195. package/src/__tests__/cloud.test.ts +247 -0
  196. package/src/__tests__/dsl.test.ts +154 -0
  197. package/src/__tests__/edge-cases.test.ts +475 -0
  198. package/src/__tests__/engine.test.ts +137 -0
  199. package/src/__tests__/generators.test.ts +270 -0
  200. package/src/__tests__/introspection.test.ts +321 -0
  201. package/src/__tests__/protocol.test.ts +40 -0
  202. package/src/__tests__/provisioning.test.ts +162 -0
  203. package/src/__tests__/schema.test.ts +241 -0
  204. package/src/__tests__/svelte-integration.test.ts +431 -0
  205. package/src/__tests__/terminal-node.test.ts +352 -0
  206. package/src/adapters/cli.ts +175 -0
  207. package/src/cli/commands/auth.ts +271 -0
  208. package/src/cli/commands/cloud.ts +281 -0
  209. package/src/cli/commands/generate.ts +225 -0
  210. package/src/cli/index.ts +190 -0
  211. package/src/cloud/README.md +383 -0
  212. package/src/cloud/auth.ts +245 -0
  213. package/src/cloud/billing.ts +336 -0
  214. package/src/cloud/client.ts +221 -0
  215. package/src/cloud/index.ts +121 -0
  216. package/src/cloud/marketplace.ts +303 -0
  217. package/src/cloud/provisioning.ts +254 -0
  218. package/src/cloud/relay/endpoints.ts +307 -0
  219. package/src/cloud/relay/health/function.json +17 -0
  220. package/src/cloud/relay/health/index.ts +10 -0
  221. package/src/cloud/relay/host.json +15 -0
  222. package/src/cloud/relay/local.settings.json +8 -0
  223. package/src/cloud/relay/stats/function.json +17 -0
  224. package/src/cloud/relay/stats/index.ts +10 -0
  225. package/src/cloud/relay/sync/function.json +17 -0
  226. package/src/cloud/relay/sync/index.ts +10 -0
  227. package/src/cloud/relay/usage/function.json +17 -0
  228. package/src/cloud/relay/usage/index.ts +10 -0
  229. package/src/cloud/sponsors.ts +213 -0
  230. package/src/cloud/types.ts +198 -0
  231. package/src/components/README.md +125 -0
  232. package/src/components/TerminalNode.svelte +457 -0
  233. package/src/components/index.ts +46 -0
  234. package/src/core/actors.ts +205 -0
  235. package/src/core/component/generator.ts +432 -0
  236. package/src/core/engine.ts +243 -0
  237. package/src/core/introspection.ts +329 -0
  238. package/src/core/logic/generator.ts +420 -0
  239. package/src/core/pluresdb/generator.ts +229 -0
  240. package/src/core/protocol.ts +132 -0
  241. package/src/core/rules.ts +167 -0
  242. package/src/core/schema/loader.ts +247 -0
  243. package/src/core/schema/normalize.ts +322 -0
  244. package/src/core/schema/types.ts +557 -0
  245. package/src/dsl/index.ts +218 -0
  246. package/src/dsl.ts +214 -0
  247. package/src/examples/advanced-todo/App.svelte +506 -0
  248. package/src/examples/advanced-todo/README.md +371 -0
  249. package/src/examples/advanced-todo/index.ts +309 -0
  250. package/src/examples/auth-basic/index.ts +163 -0
  251. package/src/examples/cart/index.ts +259 -0
  252. package/src/examples/hero-ecommerce/index.ts +657 -0
  253. package/src/examples/svelte-counter/index.ts +168 -0
  254. package/src/flows.ts +268 -0
  255. package/src/index.ts +154 -0
  256. package/src/integrations/pluresdb.ts +93 -0
  257. package/src/integrations/svelte.ts +617 -0
  258. package/src/registry.ts +223 -0
  259. package/src/runtime/terminal-adapter.ts +175 -0
  260. package/src/step.ts +151 -0
  261. package/src/types.ts +70 -0
  262. package/templates/basic-app/README.md +147 -0
  263. package/templates/fullstack-app/README.md +279 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Cloud Relay Client
3
+ *
4
+ * Client for connecting to Praxis Cloud Relay service (Azure-based).
5
+ */
6
+ /**
7
+ * Create a cloud relay client
8
+ */
9
+ export function createCloudRelay(config) {
10
+ let status = {
11
+ connected: false,
12
+ endpoint: config.endpoint,
13
+ appId: config.appId,
14
+ };
15
+ let syncTimer = null;
16
+ const vectorClock = {};
17
+ return {
18
+ async connect() {
19
+ // Validate endpoint
20
+ if (!config.endpoint) {
21
+ throw new Error("Cloud relay endpoint is required");
22
+ }
23
+ // Test connection
24
+ try {
25
+ const response = await fetch(`${config.endpoint}/health`, {
26
+ method: "GET",
27
+ headers: {
28
+ "Content-Type": "application/json",
29
+ ...(config.authToken && {
30
+ Authorization: `Bearer ${config.authToken}`,
31
+ }),
32
+ },
33
+ });
34
+ if (!response.ok) {
35
+ throw new Error(`Health check failed: ${response.statusText}`);
36
+ }
37
+ status.connected = true;
38
+ status.lastSync = Date.now();
39
+ // Start auto-sync if enabled
40
+ if (config.autoSync) {
41
+ const interval = config.syncInterval || 5000;
42
+ syncTimer = setInterval(() => {
43
+ // Auto-sync logic would go here
44
+ // For now, just update lastSync
45
+ status.lastSync = Date.now();
46
+ }, interval);
47
+ }
48
+ }
49
+ catch (error) {
50
+ status.connected = false;
51
+ throw new Error(`Failed to connect to cloud relay: ${error instanceof Error ? error.message : String(error)}`);
52
+ }
53
+ },
54
+ async disconnect() {
55
+ if (syncTimer) {
56
+ clearInterval(syncTimer);
57
+ syncTimer = null;
58
+ }
59
+ status.connected = false;
60
+ },
61
+ async sync(message) {
62
+ if (!status.connected) {
63
+ throw new Error("Not connected to cloud relay");
64
+ }
65
+ // Update vector clock
66
+ vectorClock[config.appId] = (vectorClock[config.appId] || 0) + 1;
67
+ message.clock = { ...vectorClock };
68
+ try {
69
+ const response = await fetch(`${config.endpoint}/sync`, {
70
+ method: "POST",
71
+ headers: {
72
+ "Content-Type": "application/json",
73
+ ...(config.authToken && {
74
+ Authorization: `Bearer ${config.authToken}`,
75
+ }),
76
+ },
77
+ body: JSON.stringify(message),
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`Sync failed: ${response.statusText}`);
81
+ }
82
+ status.lastSync = Date.now();
83
+ // Merge received vector clock
84
+ const result = await response.json();
85
+ if (result.clock) {
86
+ Object.entries(result.clock).forEach(([key, value]) => {
87
+ vectorClock[key] = Math.max(vectorClock[key] || 0, value);
88
+ });
89
+ }
90
+ }
91
+ catch (error) {
92
+ throw new Error(`Failed to sync: ${error instanceof Error ? error.message : String(error)}`);
93
+ }
94
+ },
95
+ async getUsage() {
96
+ if (!status.connected) {
97
+ throw new Error("Not connected to cloud relay");
98
+ }
99
+ try {
100
+ const response = await fetch(`${config.endpoint}/usage?appId=${config.appId}`, {
101
+ method: "GET",
102
+ headers: {
103
+ "Content-Type": "application/json",
104
+ ...(config.authToken && {
105
+ Authorization: `Bearer ${config.authToken}`,
106
+ }),
107
+ },
108
+ });
109
+ if (!response.ok) {
110
+ throw new Error(`Failed to get usage: ${response.statusText}`);
111
+ }
112
+ return await response.json();
113
+ }
114
+ catch (error) {
115
+ throw new Error(`Failed to get usage metrics: ${error instanceof Error ? error.message : String(error)}`);
116
+ }
117
+ },
118
+ async getHealth() {
119
+ try {
120
+ const response = await fetch(`${config.endpoint}/health`, {
121
+ method: "GET",
122
+ headers: {
123
+ "Content-Type": "application/json",
124
+ },
125
+ });
126
+ if (!response.ok) {
127
+ throw new Error(`Health check failed: ${response.statusText}`);
128
+ }
129
+ return await response.json();
130
+ }
131
+ catch (error) {
132
+ throw new Error(`Failed to get health status: ${error instanceof Error ? error.message : String(error)}`);
133
+ }
134
+ },
135
+ getStatus() {
136
+ return { ...status };
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * Connect to Praxis Cloud Relay
142
+ *
143
+ * @param endpoint - Azure Function App endpoint URL
144
+ * @param options - Additional configuration options
145
+ * @returns Cloud relay client instance
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * import { connectRelay } from "@plures/praxis/cloud";
150
+ *
151
+ * const relay = await connectRelay("https://my-app.azurewebsites.net", {
152
+ * appId: "my-app",
153
+ * authToken: "github-token",
154
+ * autoSync: true
155
+ * });
156
+ *
157
+ * // Sync data
158
+ * await relay.sync({
159
+ * type: "delta",
160
+ * appId: "my-app",
161
+ * clock: {},
162
+ * facts: [...],
163
+ * timestamp: Date.now()
164
+ * });
165
+ * ```
166
+ */
167
+ export async function connectRelay(endpoint, options = { appId: "default" }) {
168
+ const config = {
169
+ endpoint,
170
+ ...options,
171
+ };
172
+ const client = createCloudRelay(config);
173
+ await client.connect();
174
+ return client;
175
+ }
176
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Praxis Cloud
3
+ *
4
+ * Cloud relay and synchronization for Praxis applications.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { connectRelay } from "@plures/praxis/cloud";
9
+ *
10
+ * const relay = await connectRelay("https://my-app.azurewebsites.net", {
11
+ * appId: "my-app",
12
+ * authToken: "github-token",
13
+ * autoSync: true
14
+ * });
15
+ *
16
+ * // Sync data
17
+ * await relay.sync({
18
+ * type: "delta",
19
+ * appId: "my-app",
20
+ * clock: {},
21
+ * facts: [...],
22
+ * timestamp: Date.now()
23
+ * });
24
+ *
25
+ * // Get usage metrics
26
+ * const usage = await relay.getUsage();
27
+ * console.log(`Syncs: ${usage.syncCount}, Events: ${usage.eventCount}`);
28
+ * ```
29
+ */
30
+ export { createCloudRelay, connectRelay } from "./client.js";
31
+ export type { CloudRelayConfig, CloudRelayClient, RelayStatus, CRDTSyncMessage, UsageMetrics, HealthCheckResponse, GitHubUser, AuthResult, } from "./types.js";
32
+ export { GitHubOAuth, createGitHubOAuth, authenticateWithDeviceFlow, } from "./auth.js";
33
+ export type { GitHubOAuthConfig } from "./auth.js";
34
+ export { SubscriptionTier, BillingProvider, SubscriptionStatus, TIER_LIMITS, hasAccessToTier, checkUsageLimits, createFreeSubscription, createSponsorSubscription, } from "./billing.js";
35
+ export type { TierLimits, Subscription, BillingEvent, } from "./billing.js";
36
+ export { GitHubSponsorsClient, createSponsorsClient, } from "./sponsors.js";
37
+ export type { SponsorTier, Sponsorship, } from "./sponsors.js";
38
+ export { GitHubMarketplaceClient, createMarketplaceClient, MARKETPLACE_PLANS, } from "./marketplace.js";
39
+ export type { MarketplacePlan, MarketplaceAccount, MarketplaceWebhookEvent, } from "./marketplace.js";
40
+ export { generateStorageNamespace, generateTenantId, createTenant, validateStorageNamespace, getAppStorageContainer, provisionTenant, getOrCreateTenant, } from "./provisioning.js";
41
+ export type { Tenant, ProvisioningResult, } from "./provisioning.js";
42
+ export { healthEndpoint, syncEndpoint, usageEndpoint, statsEndpoint, eventsEndpoint, schemaEndpoint, } from "./relay/endpoints.js";
43
+ export type { AzureContext, AzureHttpRequest, AzureHttpResponse, } from "./relay/endpoints.js";
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,MAAM,EACN,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Praxis Cloud
3
+ *
4
+ * Cloud relay and synchronization for Praxis applications.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { connectRelay } from "@plures/praxis/cloud";
9
+ *
10
+ * const relay = await connectRelay("https://my-app.azurewebsites.net", {
11
+ * appId: "my-app",
12
+ * authToken: "github-token",
13
+ * autoSync: true
14
+ * });
15
+ *
16
+ * // Sync data
17
+ * await relay.sync({
18
+ * type: "delta",
19
+ * appId: "my-app",
20
+ * clock: {},
21
+ * facts: [...],
22
+ * timestamp: Date.now()
23
+ * });
24
+ *
25
+ * // Get usage metrics
26
+ * const usage = await relay.getUsage();
27
+ * console.log(`Syncs: ${usage.syncCount}, Events: ${usage.eventCount}`);
28
+ * ```
29
+ */
30
+ // Client
31
+ export { createCloudRelay, connectRelay } from "./client.js";
32
+ // Authentication
33
+ export { GitHubOAuth, createGitHubOAuth, authenticateWithDeviceFlow, } from "./auth.js";
34
+ // Billing and Subscriptions
35
+ export { SubscriptionTier, BillingProvider, SubscriptionStatus, TIER_LIMITS, hasAccessToTier, checkUsageLimits, createFreeSubscription, createSponsorSubscription, } from "./billing.js";
36
+ // GitHub Sponsors
37
+ export { GitHubSponsorsClient, createSponsorsClient, } from "./sponsors.js";
38
+ // GitHub Marketplace
39
+ export { GitHubMarketplaceClient, createMarketplaceClient, MARKETPLACE_PLANS, } from "./marketplace.js";
40
+ // Auto-Provisioning
41
+ export { generateStorageNamespace, generateTenantId, createTenant, validateStorageNamespace, getAppStorageContainer, provisionTenant, getOrCreateTenant, } from "./provisioning.js";
42
+ // Relay endpoints (for Azure Functions deployment)
43
+ export { healthEndpoint, syncEndpoint, usageEndpoint, statsEndpoint, eventsEndpoint, schemaEndpoint, } from "./relay/endpoints.js";
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloud/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc7D,iBAAiB;AACjB,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AAGnB,4BAA4B;AAC5B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAOtB,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAMvB,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAO1B,oBAAoB;AACpB,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAM3B,mDAAmD;AACnD,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * GitHub Marketplace API Client
3
+ *
4
+ * Client for GitHub Marketplace SaaS integration (preparatory).
5
+ */
6
+ import type { Subscription } from "./billing.js";
7
+ /**
8
+ * GitHub Marketplace plan
9
+ */
10
+ export interface MarketplacePlan {
11
+ /**
12
+ * Plan ID
13
+ */
14
+ id: number;
15
+ /**
16
+ * Plan name
17
+ */
18
+ name: string;
19
+ /**
20
+ * Plan description
21
+ */
22
+ description: string;
23
+ /**
24
+ * Monthly price in cents
25
+ */
26
+ monthlyPriceInCents: number;
27
+ /**
28
+ * Yearly price in cents
29
+ */
30
+ yearlyPriceInCents: number;
31
+ /**
32
+ * Price model
33
+ */
34
+ priceModel: "FLAT_RATE" | "PER_UNIT";
35
+ /**
36
+ * Whether this plan has a free trial
37
+ */
38
+ hasFreeTrial: boolean;
39
+ /**
40
+ * Unit name (for per-unit pricing)
41
+ */
42
+ unitName?: string;
43
+ /**
44
+ * Bullets (features list)
45
+ */
46
+ bullets: string[];
47
+ }
48
+ /**
49
+ * Marketplace account
50
+ */
51
+ export interface MarketplaceAccount {
52
+ /**
53
+ * Account ID
54
+ */
55
+ id: number;
56
+ /**
57
+ * Account login
58
+ */
59
+ login: string;
60
+ /**
61
+ * Account type
62
+ */
63
+ type: "User" | "Organization";
64
+ /**
65
+ * Plan
66
+ */
67
+ plan: MarketplacePlan;
68
+ /**
69
+ * Whether account is on free trial
70
+ */
71
+ onFreeTrial: boolean;
72
+ /**
73
+ * Free trial ends on (if applicable)
74
+ */
75
+ freeTrialEndsOn?: string;
76
+ /**
77
+ * Next billing date
78
+ */
79
+ nextBillingDate?: string;
80
+ }
81
+ /**
82
+ * Marketplace webhook event
83
+ */
84
+ export interface MarketplaceWebhookEvent {
85
+ /**
86
+ * Action type
87
+ */
88
+ action: "purchased" | "cancelled" | "changed" | "pending_change" | "pending_change_cancelled";
89
+ /**
90
+ * Effective date
91
+ */
92
+ effectiveDate?: string;
93
+ /**
94
+ * Marketplace purchase
95
+ */
96
+ marketplacePurchase: {
97
+ account: MarketplaceAccount;
98
+ billingCycle: "monthly" | "yearly";
99
+ unitCount?: number;
100
+ onFreeTrial: boolean;
101
+ freeTrialEndsOn?: string;
102
+ nextBillingDate?: string;
103
+ };
104
+ /**
105
+ * Previous plan (for changes)
106
+ */
107
+ previousMarketplacePurchase?: {
108
+ account: MarketplaceAccount;
109
+ billingCycle: "monthly" | "yearly";
110
+ unitCount?: number;
111
+ };
112
+ }
113
+ /**
114
+ * Praxis Cloud Marketplace plans configuration
115
+ */
116
+ export declare const MARKETPLACE_PLANS: {
117
+ solo: {
118
+ name: string;
119
+ description: string;
120
+ monthlyPriceInCents: number;
121
+ yearlyPriceInCents: number;
122
+ features: string[];
123
+ };
124
+ team: {
125
+ name: string;
126
+ description: string;
127
+ monthlyPriceInCents: number;
128
+ yearlyPriceInCents: number;
129
+ features: string[];
130
+ };
131
+ enterprise: {
132
+ name: string;
133
+ description: string;
134
+ monthlyPriceInCents: number;
135
+ yearlyPriceInCents: number;
136
+ features: string[];
137
+ };
138
+ };
139
+ /**
140
+ * GitHub Marketplace API client
141
+ */
142
+ export declare class GitHubMarketplaceClient {
143
+ private token;
144
+ constructor(token: string);
145
+ /**
146
+ * Get accounts for the authenticated user
147
+ */
148
+ getAccounts(): Promise<MarketplaceAccount[]>;
149
+ /**
150
+ * Get subscription from marketplace account
151
+ */
152
+ getSubscription(accountId: number): Promise<Subscription | null>;
153
+ /**
154
+ * Handle marketplace webhook event
155
+ */
156
+ handleWebhookEvent(event: MarketplaceWebhookEvent): {
157
+ userId: number;
158
+ userLogin: string;
159
+ subscription: Subscription;
160
+ } | null;
161
+ }
162
+ /**
163
+ * Create a GitHub Marketplace client
164
+ */
165
+ export declare function createMarketplaceClient(token: string): GitHubMarketplaceClient;
166
+ //# sourceMappingURL=marketplace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/cloud/marketplace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,UAAU,EAAE,WAAW,GAAG,UAAU,CAAC;IAErC;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;IAE9B;;OAEG;IACH,IAAI,EAAE,eAAe,CAAC;IAEtB;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,gBAAgB,GAAG,0BAA0B,CAAC;IAE9F;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,mBAAmB,EAAE;QACnB,OAAO,EAAE,kBAAkB,CAAC;QAC5B,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,OAAO,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAEF;;OAEG;IACH,2BAA2B,CAAC,EAAE;QAC5B,OAAO,EAAE,kBAAkB,CAAC;QAC5B,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;CAwC7B,CAAC;AAEF;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,EAAE,MAAM;IAIzB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuBlD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAkCtE;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG;QAClD,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,YAAY,CAAC;KAC5B,GAAG,IAAI;CAmCT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,CAE9E"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * GitHub Marketplace API Client
3
+ *
4
+ * Client for GitHub Marketplace SaaS integration (preparatory).
5
+ */
6
+ import { SubscriptionTier, SubscriptionStatus, BillingProvider, TIER_LIMITS } from "./billing.js";
7
+ /**
8
+ * Praxis Cloud Marketplace plans configuration
9
+ */
10
+ export const MARKETPLACE_PLANS = {
11
+ solo: {
12
+ name: "Praxis Cloud Solo",
13
+ description: "For individual developers",
14
+ monthlyPriceInCents: 500, // $5/month
15
+ yearlyPriceInCents: 5000, // $50/year (2 months free)
16
+ features: [
17
+ "50,000 syncs/month",
18
+ "1 GB storage",
19
+ "10 apps/projects",
20
+ "Standard support",
21
+ ],
22
+ },
23
+ team: {
24
+ name: "Praxis Cloud Team",
25
+ description: "For small teams",
26
+ monthlyPriceInCents: 2000, // $20/month
27
+ yearlyPriceInCents: 20000, // $200/year (2 months free)
28
+ features: [
29
+ "500,000 syncs/month",
30
+ "10 GB storage",
31
+ "50 apps/projects",
32
+ "Up to 10 team members",
33
+ "Standard support",
34
+ ],
35
+ },
36
+ enterprise: {
37
+ name: "Praxis Cloud Enterprise",
38
+ description: "For large teams and organizations",
39
+ monthlyPriceInCents: 5000, // $50/month
40
+ yearlyPriceInCents: 50000, // $500/year (2 months free)
41
+ features: [
42
+ "5,000,000 syncs/month",
43
+ "100 GB storage",
44
+ "1,000 apps/projects",
45
+ "Unlimited team members",
46
+ "Priority support",
47
+ "SLA guarantees",
48
+ ],
49
+ },
50
+ };
51
+ /**
52
+ * GitHub Marketplace API client
53
+ */
54
+ export class GitHubMarketplaceClient {
55
+ token;
56
+ constructor(token) {
57
+ this.token = token;
58
+ }
59
+ /**
60
+ * Get accounts for the authenticated user
61
+ */
62
+ async getAccounts() {
63
+ try {
64
+ const response = await fetch("https://api.github.com/marketplace_listing/accounts", {
65
+ headers: {
66
+ Authorization: `Bearer ${this.token}`,
67
+ Accept: "application/vnd.github.v3+json",
68
+ },
69
+ });
70
+ if (!response.ok) {
71
+ throw new Error(`GitHub API error: ${response.statusText}`);
72
+ }
73
+ return await response.json();
74
+ }
75
+ catch (error) {
76
+ console.error("Failed to get marketplace accounts:", error);
77
+ return [];
78
+ }
79
+ }
80
+ /**
81
+ * Get subscription from marketplace account
82
+ */
83
+ async getSubscription(accountId) {
84
+ const accounts = await this.getAccounts();
85
+ const account = accounts.find((a) => a.id === accountId);
86
+ if (!account) {
87
+ return null;
88
+ }
89
+ // Map plan to tier
90
+ let tier = SubscriptionTier.FREE;
91
+ if (account.plan.monthlyPriceInCents >= 5000) {
92
+ tier = SubscriptionTier.ENTERPRISE;
93
+ }
94
+ else if (account.plan.monthlyPriceInCents >= 2000) {
95
+ tier = SubscriptionTier.TEAM;
96
+ }
97
+ else if (account.plan.monthlyPriceInCents >= 500) {
98
+ tier = SubscriptionTier.SOLO;
99
+ }
100
+ return {
101
+ tier,
102
+ status: SubscriptionStatus.ACTIVE,
103
+ provider: BillingProvider.MARKETPLACE,
104
+ marketplacePlanId: account.plan.id,
105
+ startDate: account.onFreeTrial && account.freeTrialEndsOn
106
+ ? new Date(account.freeTrialEndsOn).getTime()
107
+ : Date.now(),
108
+ periodEnd: account.nextBillingDate
109
+ ? new Date(account.nextBillingDate).getTime()
110
+ : undefined,
111
+ autoRenew: true,
112
+ limits: TIER_LIMITS[tier],
113
+ };
114
+ }
115
+ /**
116
+ * Handle marketplace webhook event
117
+ */
118
+ handleWebhookEvent(event) {
119
+ const account = event.marketplacePurchase.account;
120
+ if (event.action === "cancelled") {
121
+ // Handle cancellation
122
+ return null;
123
+ }
124
+ // Map plan to tier
125
+ let tier = SubscriptionTier.FREE;
126
+ if (account.plan.monthlyPriceInCents >= 5000) {
127
+ tier = SubscriptionTier.ENTERPRISE;
128
+ }
129
+ else if (account.plan.monthlyPriceInCents >= 2000) {
130
+ tier = SubscriptionTier.TEAM;
131
+ }
132
+ else if (account.plan.monthlyPriceInCents >= 500) {
133
+ tier = SubscriptionTier.SOLO;
134
+ }
135
+ return {
136
+ userId: account.id,
137
+ userLogin: account.login,
138
+ subscription: {
139
+ tier,
140
+ status: SubscriptionStatus.ACTIVE,
141
+ provider: BillingProvider.MARKETPLACE,
142
+ marketplacePlanId: account.plan.id,
143
+ startDate: Date.now(),
144
+ periodEnd: event.marketplacePurchase.nextBillingDate
145
+ ? new Date(event.marketplacePurchase.nextBillingDate).getTime()
146
+ : undefined,
147
+ autoRenew: true,
148
+ limits: TIER_LIMITS[tier],
149
+ },
150
+ };
151
+ }
152
+ }
153
+ /**
154
+ * Create a GitHub Marketplace client
155
+ */
156
+ export function createMarketplaceClient(token) {
157
+ return new GitHubMarketplaceClient(token);
158
+ }
159
+ //# sourceMappingURL=marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/cloud/marketplace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgIlG;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,2BAA2B;QACxC,mBAAmB,EAAE,GAAG,EAAE,WAAW;QACrC,kBAAkB,EAAE,IAAI,EAAE,2BAA2B;QACrD,QAAQ,EAAE;YACR,oBAAoB;YACpB,cAAc;YACd,kBAAkB;YAClB,kBAAkB;SACnB;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,iBAAiB;QAC9B,mBAAmB,EAAE,IAAI,EAAE,YAAY;QACvC,kBAAkB,EAAE,KAAK,EAAE,4BAA4B;QACvD,QAAQ,EAAE;YACR,qBAAqB;YACrB,eAAe;YACf,kBAAkB;YAClB,uBAAuB;YACvB,kBAAkB;SACnB;KACF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,mCAAmC;QAChD,mBAAmB,EAAE,IAAI,EAAE,YAAY;QACvC,kBAAkB,EAAE,KAAK,EAAE,4BAA4B;QACvD,QAAQ,EAAE;YACR,uBAAuB;YACvB,gBAAgB;YAChB,qBAAqB;YACrB,wBAAwB;YACxB,kBAAkB;YAClB,gBAAgB;SACjB;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAC1B,KAAK,CAAS;IAEtB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,qDAAqD,EACrD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;oBACrC,MAAM,EAAE,gCAAgC;iBACzC;aACF,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAA0B,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YAC7C,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YACpD,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,GAAG,EAAE,CAAC;YACnD,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAC/B,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,kBAAkB,CAAC,MAAM;YACjC,QAAQ,EAAE,eAAe,CAAC,WAAW;YACrC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YAClC,SAAS,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,eAAe;gBACvD,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;gBAC7C,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,SAAS,EAAE,OAAO,CAAC,eAAe;gBAChC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;gBAC7C,CAAC,CAAC,SAAS;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,KAA8B;QAK/C,MAAM,OAAO,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC;QAElD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,sBAAsB;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YAC7C,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YACpD,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,GAAG,EAAE,CAAC;YACnD,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAC/B,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,SAAS,EAAE,OAAO,CAAC,KAAK;YACxB,YAAY,EAAE;gBACZ,IAAI;gBACJ,MAAM,EAAE,kBAAkB,CAAC,MAAM;gBACjC,QAAQ,EAAE,eAAe,CAAC,WAAW;gBACrC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;gBAClC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS,EAAE,KAAK,CAAC,mBAAmB,CAAC,eAAe;oBAClD,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;oBAC/D,CAAC,CAAC,SAAS;gBACb,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}