@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,51 @@
1
+ /**
2
+ * GitHub OAuth Authentication
3
+ *
4
+ * GitHub OAuth integration for Praxis Cloud Relay identity.
5
+ */
6
+ import type { AuthResult, GitHubUser } from "./types.js";
7
+ /**
8
+ * GitHub OAuth configuration
9
+ */
10
+ export interface GitHubOAuthConfig {
11
+ clientId: string;
12
+ clientSecret?: string;
13
+ redirectUri?: string;
14
+ scope?: string;
15
+ }
16
+ /**
17
+ * GitHub OAuth client
18
+ */
19
+ export declare class GitHubOAuth {
20
+ private config;
21
+ constructor(config: GitHubOAuthConfig);
22
+ /**
23
+ * Get the OAuth authorization URL
24
+ */
25
+ getAuthorizationUrl(state?: string): string;
26
+ /**
27
+ * Exchange authorization code for access token
28
+ */
29
+ exchangeCode(code: string): Promise<AuthResult>;
30
+ /**
31
+ * Get user information from GitHub
32
+ */
33
+ getUserInfo(token: string): Promise<GitHubUser>;
34
+ /**
35
+ * Verify a token is valid
36
+ */
37
+ verifyToken(token: string): Promise<boolean>;
38
+ /**
39
+ * Generate a random state parameter for CSRF protection
40
+ */
41
+ private generateState;
42
+ }
43
+ /**
44
+ * Create a GitHub OAuth client
45
+ */
46
+ export declare function createGitHubOAuth(config: GitHubOAuthConfig): GitHubOAuth;
47
+ /**
48
+ * Authenticate with GitHub OAuth device flow (for CLI)
49
+ */
50
+ export declare function authenticateWithDeviceFlow(clientId: string): Promise<AuthResult>;
51
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAIrC;;OAEG;IACH,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAc3C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkDrD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBrD;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlD;;OAEG;IACH,OAAO,CAAC,aAAa;CActB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAExE;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CA6ErB"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * GitHub OAuth Authentication
3
+ *
4
+ * GitHub OAuth integration for Praxis Cloud Relay identity.
5
+ */
6
+ /**
7
+ * GitHub OAuth client
8
+ */
9
+ export class GitHubOAuth {
10
+ config;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Get the OAuth authorization URL
16
+ */
17
+ getAuthorizationUrl(state) {
18
+ const params = new URLSearchParams({
19
+ client_id: this.config.clientId,
20
+ scope: this.config.scope || "read:user user:email",
21
+ state: state || this.generateState(),
22
+ });
23
+ if (this.config.redirectUri) {
24
+ params.set("redirect_uri", this.config.redirectUri);
25
+ }
26
+ return `https://github.com/login/oauth/authorize?${params.toString()}`;
27
+ }
28
+ /**
29
+ * Exchange authorization code for access token
30
+ */
31
+ async exchangeCode(code) {
32
+ if (!this.config.clientSecret) {
33
+ throw new Error("Client secret is required for code exchange");
34
+ }
35
+ try {
36
+ const response = await fetch("https://github.com/login/oauth/access_token", {
37
+ method: "POST",
38
+ headers: {
39
+ "Content-Type": "application/json",
40
+ Accept: "application/json",
41
+ },
42
+ body: JSON.stringify({
43
+ client_id: this.config.clientId,
44
+ client_secret: this.config.clientSecret,
45
+ code,
46
+ }),
47
+ });
48
+ if (!response.ok) {
49
+ throw new Error(`Token exchange failed: ${response.statusText}`);
50
+ }
51
+ const data = await response.json();
52
+ if (data.error) {
53
+ throw new Error(`GitHub OAuth error: ${data.error_description || data.error}`);
54
+ }
55
+ // Get user info
56
+ const user = await this.getUserInfo(data.access_token);
57
+ return {
58
+ success: true,
59
+ token: data.access_token,
60
+ user,
61
+ expiresAt: data.expires_in
62
+ ? Date.now() + data.expires_in * 1000
63
+ : undefined,
64
+ };
65
+ }
66
+ catch (error) {
67
+ return {
68
+ success: false,
69
+ };
70
+ }
71
+ }
72
+ /**
73
+ * Get user information from GitHub
74
+ */
75
+ async getUserInfo(token) {
76
+ const response = await fetch("https://api.github.com/user", {
77
+ headers: {
78
+ Authorization: `Bearer ${token}`,
79
+ Accept: "application/vnd.github.v3+json",
80
+ },
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`Failed to get user info: ${response.statusText}`);
84
+ }
85
+ const data = await response.json();
86
+ return {
87
+ id: data.id,
88
+ login: data.login,
89
+ email: data.email,
90
+ name: data.name,
91
+ avatarUrl: data.avatar_url,
92
+ };
93
+ }
94
+ /**
95
+ * Verify a token is valid
96
+ */
97
+ async verifyToken(token) {
98
+ try {
99
+ await this.getUserInfo(token);
100
+ return true;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ /**
107
+ * Generate a random state parameter for CSRF protection
108
+ */
109
+ generateState() {
110
+ const array = new Uint8Array(16);
111
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
112
+ crypto.getRandomValues(array);
113
+ }
114
+ else {
115
+ // Fallback for Node.js
116
+ for (let i = 0; i < array.length; i++) {
117
+ array[i] = Math.floor(Math.random() * 256);
118
+ }
119
+ }
120
+ return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
121
+ }
122
+ }
123
+ /**
124
+ * Create a GitHub OAuth client
125
+ */
126
+ export function createGitHubOAuth(config) {
127
+ return new GitHubOAuth(config);
128
+ }
129
+ /**
130
+ * Authenticate with GitHub OAuth device flow (for CLI)
131
+ */
132
+ export async function authenticateWithDeviceFlow(clientId) {
133
+ try {
134
+ // Request device code
135
+ const deviceResponse = await fetch("https://github.com/login/device/code", {
136
+ method: "POST",
137
+ headers: {
138
+ "Content-Type": "application/json",
139
+ Accept: "application/json",
140
+ },
141
+ body: JSON.stringify({
142
+ client_id: clientId,
143
+ scope: "read:user user:email",
144
+ }),
145
+ });
146
+ if (!deviceResponse.ok) {
147
+ throw new Error(`Device flow initiation failed: ${deviceResponse.statusText}`);
148
+ }
149
+ const deviceData = await deviceResponse.json();
150
+ console.log("\nTo authenticate with GitHub:");
151
+ console.log(`1. Visit: ${deviceData.verification_uri}`);
152
+ console.log(`2. Enter code: ${deviceData.user_code}`);
153
+ console.log("\nWaiting for authentication...\n");
154
+ // Poll for access token
155
+ const interval = deviceData.interval * 1000 || 5000;
156
+ const expiresAt = Date.now() + deviceData.expires_in * 1000;
157
+ while (Date.now() < expiresAt) {
158
+ await new Promise((resolve) => setTimeout(resolve, interval));
159
+ const tokenResponse = await fetch("https://github.com/login/oauth/access_token", {
160
+ method: "POST",
161
+ headers: {
162
+ "Content-Type": "application/json",
163
+ Accept: "application/json",
164
+ },
165
+ body: JSON.stringify({
166
+ client_id: clientId,
167
+ device_code: deviceData.device_code,
168
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
169
+ }),
170
+ });
171
+ const tokenData = await tokenResponse.json();
172
+ if (tokenData.access_token) {
173
+ // Get user info
174
+ const oauth = new GitHubOAuth({ clientId });
175
+ const user = await oauth.getUserInfo(tokenData.access_token);
176
+ return {
177
+ success: true,
178
+ token: tokenData.access_token,
179
+ user,
180
+ };
181
+ }
182
+ if (tokenData.error && tokenData.error !== "authorization_pending") {
183
+ throw new Error(`Authentication failed: ${tokenData.error_description || tokenData.error}`);
184
+ }
185
+ }
186
+ throw new Error("Authentication timeout");
187
+ }
188
+ catch (error) {
189
+ return {
190
+ success: false,
191
+ };
192
+ }
193
+ }
194
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * GitHub Sponsors and Marketplace Billing
3
+ *
4
+ * Types and utilities for GitHub-based monetization.
5
+ */
6
+ /**
7
+ * Praxis Cloud subscription tiers
8
+ */
9
+ export declare enum SubscriptionTier {
10
+ /**
11
+ * Free tier - limited usage
12
+ */
13
+ FREE = "free",
14
+ /**
15
+ * Solo tier - individual developers via GitHub Sponsors
16
+ */
17
+ SOLO = "solo",
18
+ /**
19
+ * Team tier - small teams via GitHub Sponsors
20
+ */
21
+ TEAM = "team",
22
+ /**
23
+ * Enterprise tier - self-service enterprise via GitHub Sponsors/Marketplace
24
+ */
25
+ ENTERPRISE = "enterprise"
26
+ }
27
+ /**
28
+ * Billing provider type
29
+ */
30
+ export declare enum BillingProvider {
31
+ /**
32
+ * GitHub Sponsors
33
+ */
34
+ SPONSORS = "sponsors",
35
+ /**
36
+ * GitHub Marketplace (SaaS)
37
+ */
38
+ MARKETPLACE = "marketplace",
39
+ /**
40
+ * Free tier (no billing)
41
+ */
42
+ NONE = "none"
43
+ }
44
+ /**
45
+ * Subscription status
46
+ */
47
+ export declare enum SubscriptionStatus {
48
+ /**
49
+ * Active subscription
50
+ */
51
+ ACTIVE = "active",
52
+ /**
53
+ * Subscription cancelled, but still valid until period end
54
+ */
55
+ CANCELLED = "cancelled",
56
+ /**
57
+ * Subscription expired or payment failed
58
+ */
59
+ EXPIRED = "expired",
60
+ /**
61
+ * No subscription
62
+ */
63
+ NONE = "none"
64
+ }
65
+ /**
66
+ * Tier limits for different subscription levels
67
+ */
68
+ export interface TierLimits {
69
+ /**
70
+ * Maximum sync operations per month
71
+ */
72
+ maxSyncsPerMonth: number;
73
+ /**
74
+ * Maximum storage in bytes
75
+ */
76
+ maxStorageBytes: number;
77
+ /**
78
+ * Maximum number of team members (null = unlimited)
79
+ */
80
+ maxTeamMembers: number | null;
81
+ /**
82
+ * Maximum number of apps/projects
83
+ */
84
+ maxApps: number;
85
+ /**
86
+ * Support level
87
+ */
88
+ supportLevel: "community" | "standard" | "priority";
89
+ }
90
+ /**
91
+ * Subscription information
92
+ */
93
+ export interface Subscription {
94
+ /**
95
+ * Subscription tier
96
+ */
97
+ tier: SubscriptionTier;
98
+ /**
99
+ * Subscription status
100
+ */
101
+ status: SubscriptionStatus;
102
+ /**
103
+ * Billing provider
104
+ */
105
+ provider: BillingProvider;
106
+ /**
107
+ * GitHub sponsor tier ID (if applicable)
108
+ */
109
+ sponsorTierId?: string;
110
+ /**
111
+ * GitHub Marketplace plan ID (if applicable)
112
+ */
113
+ marketplacePlanId?: number;
114
+ /**
115
+ * Subscription start date
116
+ */
117
+ startDate: number;
118
+ /**
119
+ * Current period end date
120
+ */
121
+ periodEnd?: number;
122
+ /**
123
+ * Whether subscription auto-renews
124
+ */
125
+ autoRenew: boolean;
126
+ /**
127
+ * Usage limits for this tier
128
+ */
129
+ limits: TierLimits;
130
+ }
131
+ /**
132
+ * Billing event type
133
+ */
134
+ export interface BillingEvent {
135
+ /**
136
+ * Event type
137
+ */
138
+ type: "subscription_created" | "subscription_cancelled" | "subscription_renewed" | "tier_changed";
139
+ /**
140
+ * Timestamp
141
+ */
142
+ timestamp: number;
143
+ /**
144
+ * User/organization ID
145
+ */
146
+ userId: number;
147
+ /**
148
+ * Old subscription (for changes)
149
+ */
150
+ oldSubscription?: Subscription;
151
+ /**
152
+ * New subscription
153
+ */
154
+ newSubscription: Subscription;
155
+ }
156
+ /**
157
+ * Default tier limits
158
+ */
159
+ export declare const TIER_LIMITS: Record<SubscriptionTier, TierLimits>;
160
+ /**
161
+ * Check if a user has access to a specific tier
162
+ */
163
+ export declare function hasAccessToTier(subscription: Subscription, requiredTier: SubscriptionTier): boolean;
164
+ /**
165
+ * Check if usage is within tier limits
166
+ */
167
+ export declare function checkUsageLimits(subscription: Subscription, usage: {
168
+ syncCount: number;
169
+ storageBytes: number;
170
+ teamMembers: number;
171
+ appCount: number;
172
+ }): {
173
+ withinLimits: boolean;
174
+ violations: string[];
175
+ };
176
+ /**
177
+ * Create a free tier subscription
178
+ */
179
+ export declare function createFreeSubscription(): Subscription;
180
+ /**
181
+ * Create a subscription from GitHub Sponsors tier
182
+ */
183
+ export declare function createSponsorSubscription(tierName: string, monthlyPriceInCents: number): Subscription;
184
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/cloud/billing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,oBAAY,gBAAgB;IAC1B;;OAEG;IACH,IAAI,SAAS;IAEb;;OAEG;IACH,IAAI,SAAS;IAEb;;OAEG;IACH,IAAI,SAAS;IAEb;;OAEG;IACH,UAAU,eAAe;CAC1B;AAED;;GAEG;AACH,oBAAY,eAAe;IACzB;;OAEG;IACH,QAAQ,aAAa;IAErB;;OAEG;IACH,WAAW,gBAAgB;IAE3B;;OAEG;IACH,IAAI,SAAS;CACd;AAED;;GAEG;AACH,oBAAY,kBAAkB;IAC5B;;OAEG;IACH,MAAM,WAAW;IAEjB;;OAEG;IACH,SAAS,cAAc;IAEvB;;OAEG;IACH,OAAO,YAAY;IAEnB;;OAEG;IACH,IAAI,SAAS;CACd;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,YAAY,EAAE,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,gBAAgB,CAAC;IAEvB;;OAEG;IACH,MAAM,EAAE,kBAAkB,CAAC;IAE3B;;OAEG;IACH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,sBAAsB,GAAG,wBAAwB,GAAG,sBAAsB,GAAG,cAAc,CAAC;IAElG;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,eAAe,CAAC,EAAE,YAAY,CAAC;IAE/B;;OAEG;IACH,eAAe,EAAE,YAAY,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,gBAAgB,EAAE,UAAU,CA6B5D,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,gBAAgB,GAC7B,OAAO,CAgBT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GACA;IACD,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAkCA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CASrD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,GAC1B,YAAY,CAqBd"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * GitHub Sponsors and Marketplace Billing
3
+ *
4
+ * Types and utilities for GitHub-based monetization.
5
+ */
6
+ /**
7
+ * Praxis Cloud subscription tiers
8
+ */
9
+ export var SubscriptionTier;
10
+ (function (SubscriptionTier) {
11
+ /**
12
+ * Free tier - limited usage
13
+ */
14
+ SubscriptionTier["FREE"] = "free";
15
+ /**
16
+ * Solo tier - individual developers via GitHub Sponsors
17
+ */
18
+ SubscriptionTier["SOLO"] = "solo";
19
+ /**
20
+ * Team tier - small teams via GitHub Sponsors
21
+ */
22
+ SubscriptionTier["TEAM"] = "team";
23
+ /**
24
+ * Enterprise tier - self-service enterprise via GitHub Sponsors/Marketplace
25
+ */
26
+ SubscriptionTier["ENTERPRISE"] = "enterprise";
27
+ })(SubscriptionTier || (SubscriptionTier = {}));
28
+ /**
29
+ * Billing provider type
30
+ */
31
+ export var BillingProvider;
32
+ (function (BillingProvider) {
33
+ /**
34
+ * GitHub Sponsors
35
+ */
36
+ BillingProvider["SPONSORS"] = "sponsors";
37
+ /**
38
+ * GitHub Marketplace (SaaS)
39
+ */
40
+ BillingProvider["MARKETPLACE"] = "marketplace";
41
+ /**
42
+ * Free tier (no billing)
43
+ */
44
+ BillingProvider["NONE"] = "none";
45
+ })(BillingProvider || (BillingProvider = {}));
46
+ /**
47
+ * Subscription status
48
+ */
49
+ export var SubscriptionStatus;
50
+ (function (SubscriptionStatus) {
51
+ /**
52
+ * Active subscription
53
+ */
54
+ SubscriptionStatus["ACTIVE"] = "active";
55
+ /**
56
+ * Subscription cancelled, but still valid until period end
57
+ */
58
+ SubscriptionStatus["CANCELLED"] = "cancelled";
59
+ /**
60
+ * Subscription expired or payment failed
61
+ */
62
+ SubscriptionStatus["EXPIRED"] = "expired";
63
+ /**
64
+ * No subscription
65
+ */
66
+ SubscriptionStatus["NONE"] = "none";
67
+ })(SubscriptionStatus || (SubscriptionStatus = {}));
68
+ /**
69
+ * Default tier limits
70
+ */
71
+ export const TIER_LIMITS = {
72
+ [SubscriptionTier.FREE]: {
73
+ maxSyncsPerMonth: 1000,
74
+ maxStorageBytes: 10 * 1024 * 1024, // 10 MB
75
+ maxTeamMembers: 1,
76
+ maxApps: 1,
77
+ supportLevel: "community",
78
+ },
79
+ [SubscriptionTier.SOLO]: {
80
+ maxSyncsPerMonth: 50000,
81
+ maxStorageBytes: 1024 * 1024 * 1024, // 1 GB
82
+ maxTeamMembers: 1,
83
+ maxApps: 10,
84
+ supportLevel: "standard",
85
+ },
86
+ [SubscriptionTier.TEAM]: {
87
+ maxSyncsPerMonth: 500000,
88
+ maxStorageBytes: 10 * 1024 * 1024 * 1024, // 10 GB
89
+ maxTeamMembers: 10,
90
+ maxApps: 50,
91
+ supportLevel: "standard",
92
+ },
93
+ [SubscriptionTier.ENTERPRISE]: {
94
+ maxSyncsPerMonth: 5000000,
95
+ maxStorageBytes: 100 * 1024 * 1024 * 1024, // 100 GB
96
+ maxTeamMembers: null, // unlimited
97
+ maxApps: 1000,
98
+ supportLevel: "priority",
99
+ },
100
+ };
101
+ /**
102
+ * Check if a user has access to a specific tier
103
+ */
104
+ export function hasAccessToTier(subscription, requiredTier) {
105
+ if (subscription.status !== SubscriptionStatus.ACTIVE) {
106
+ return false;
107
+ }
108
+ const tierOrder = [
109
+ SubscriptionTier.FREE,
110
+ SubscriptionTier.SOLO,
111
+ SubscriptionTier.TEAM,
112
+ SubscriptionTier.ENTERPRISE,
113
+ ];
114
+ const currentTierIndex = tierOrder.indexOf(subscription.tier);
115
+ const requiredTierIndex = tierOrder.indexOf(requiredTier);
116
+ return currentTierIndex >= requiredTierIndex;
117
+ }
118
+ /**
119
+ * Check if usage is within tier limits
120
+ */
121
+ export function checkUsageLimits(subscription, usage) {
122
+ const violations = [];
123
+ if (usage.syncCount > subscription.limits.maxSyncsPerMonth) {
124
+ violations.push(`Sync limit exceeded: ${usage.syncCount}/${subscription.limits.maxSyncsPerMonth}`);
125
+ }
126
+ if (usage.storageBytes > subscription.limits.maxStorageBytes) {
127
+ violations.push(`Storage limit exceeded: ${(usage.storageBytes / 1024 / 1024).toFixed(2)}MB/${(subscription.limits.maxStorageBytes / 1024 / 1024).toFixed(2)}MB`);
128
+ }
129
+ if (subscription.limits.maxTeamMembers !== null &&
130
+ usage.teamMembers > subscription.limits.maxTeamMembers) {
131
+ violations.push(`Team member limit exceeded: ${usage.teamMembers}/${subscription.limits.maxTeamMembers}`);
132
+ }
133
+ if (usage.appCount > subscription.limits.maxApps) {
134
+ violations.push(`App limit exceeded: ${usage.appCount}/${subscription.limits.maxApps}`);
135
+ }
136
+ return {
137
+ withinLimits: violations.length === 0,
138
+ violations,
139
+ };
140
+ }
141
+ /**
142
+ * Create a free tier subscription
143
+ */
144
+ export function createFreeSubscription() {
145
+ return {
146
+ tier: SubscriptionTier.FREE,
147
+ status: SubscriptionStatus.ACTIVE,
148
+ provider: BillingProvider.NONE,
149
+ startDate: Date.now(),
150
+ autoRenew: true,
151
+ limits: TIER_LIMITS[SubscriptionTier.FREE],
152
+ };
153
+ }
154
+ /**
155
+ * Create a subscription from GitHub Sponsors tier
156
+ */
157
+ export function createSponsorSubscription(tierName, monthlyPriceInCents) {
158
+ let tier = SubscriptionTier.FREE;
159
+ // Map price to tier (example pricing)
160
+ if (monthlyPriceInCents >= 5000) { // $50/month
161
+ tier = SubscriptionTier.ENTERPRISE;
162
+ }
163
+ else if (monthlyPriceInCents >= 2000) { // $20/month
164
+ tier = SubscriptionTier.TEAM;
165
+ }
166
+ else if (monthlyPriceInCents >= 500) { // $5/month
167
+ tier = SubscriptionTier.SOLO;
168
+ }
169
+ return {
170
+ tier,
171
+ status: SubscriptionStatus.ACTIVE,
172
+ provider: BillingProvider.SPONSORS,
173
+ sponsorTierId: tierName,
174
+ startDate: Date.now(),
175
+ autoRenew: true,
176
+ limits: TIER_LIMITS[tier],
177
+ };
178
+ }
179
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/cloud/billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Cloud Relay Client
3
+ *
4
+ * Client for connecting to Praxis Cloud Relay service (Azure-based).
5
+ */
6
+ import type { CloudRelayConfig, CloudRelayClient } from "./types.js";
7
+ /**
8
+ * Create a cloud relay client
9
+ */
10
+ export declare function createCloudRelay(config: CloudRelayConfig): CloudRelayClient;
11
+ /**
12
+ * Connect to Praxis Cloud Relay
13
+ *
14
+ * @param endpoint - Azure Function App endpoint URL
15
+ * @param options - Additional configuration options
16
+ * @returns Cloud relay client instance
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { connectRelay } from "@plures/praxis/cloud";
21
+ *
22
+ * const relay = await connectRelay("https://my-app.azurewebsites.net", {
23
+ * appId: "my-app",
24
+ * authToken: "github-token",
25
+ * autoSync: true
26
+ * });
27
+ *
28
+ * // Sync data
29
+ * await relay.sync({
30
+ * type: "delta",
31
+ * appId: "my-app",
32
+ * clock: {},
33
+ * facts: [...],
34
+ * timestamp: Date.now()
35
+ * });
36
+ * ```
37
+ */
38
+ export declare function connectRelay(endpoint: string, options?: Omit<CloudRelayConfig, "endpoint">): Promise<CloudRelayClient>;
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAKjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAiK3E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAwB,GACjE,OAAO,CAAC,gBAAgB,CAAC,CAS3B"}