@corgelabs/corge 0.0.1 → 1.0.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 (341) hide show
  1. package/dist/ai/index.d.ts +3 -0
  2. package/dist/ai/index.d.ts.map +1 -0
  3. package/dist/ai/index.js +3 -0
  4. package/dist/ai/index.js.map +1 -0
  5. package/dist/ai/schema.d.ts +83 -0
  6. package/dist/ai/schema.d.ts.map +1 -0
  7. package/dist/ai/schema.js +19 -0
  8. package/dist/ai/schema.js.map +1 -0
  9. package/dist/ai/service.d.ts +14 -0
  10. package/dist/ai/service.d.ts.map +1 -0
  11. package/dist/ai/service.js +266 -0
  12. package/dist/ai/service.js.map +1 -0
  13. package/dist/ai/utils.d.ts +10 -0
  14. package/dist/ai/utils.d.ts.map +1 -0
  15. package/dist/ai/utils.js +27 -0
  16. package/dist/ai/utils.js.map +1 -0
  17. package/dist/attachments/index.d.ts +4 -0
  18. package/dist/attachments/index.d.ts.map +1 -0
  19. package/dist/attachments/index.js +4 -0
  20. package/dist/attachments/index.js.map +1 -0
  21. package/dist/attachments/routes.d.ts +75 -0
  22. package/dist/attachments/routes.d.ts.map +1 -0
  23. package/dist/attachments/routes.js +18 -0
  24. package/dist/attachments/routes.js.map +1 -0
  25. package/dist/attachments/schema.d.ts +61 -0
  26. package/dist/attachments/schema.d.ts.map +1 -0
  27. package/dist/attachments/schema.js +30 -0
  28. package/dist/attachments/schema.js.map +1 -0
  29. package/dist/attachments/service.d.ts +27 -0
  30. package/dist/attachments/service.d.ts.map +1 -0
  31. package/dist/attachments/service.js +224 -0
  32. package/dist/attachments/service.js.map +1 -0
  33. package/dist/attachments/utils.d.ts +9 -0
  34. package/dist/attachments/utils.d.ts.map +1 -0
  35. package/dist/attachments/utils.js +80 -0
  36. package/dist/attachments/utils.js.map +1 -0
  37. package/dist/auth/index.d.ts +4 -0
  38. package/dist/auth/index.d.ts.map +1 -0
  39. package/dist/auth/index.js +4 -0
  40. package/dist/auth/index.js.map +1 -0
  41. package/dist/auth/oidc.d.ts +25 -0
  42. package/dist/auth/oidc.d.ts.map +1 -0
  43. package/dist/auth/oidc.js +298 -0
  44. package/dist/auth/oidc.js.map +1 -0
  45. package/dist/auth/recovery.d.ts +41 -0
  46. package/dist/auth/recovery.d.ts.map +1 -0
  47. package/dist/auth/recovery.js +250 -0
  48. package/dist/auth/recovery.js.map +1 -0
  49. package/dist/auth/routes.d.ts +226 -0
  50. package/dist/auth/routes.d.ts.map +1 -0
  51. package/dist/auth/routes.js +96 -0
  52. package/dist/auth/routes.js.map +1 -0
  53. package/dist/auth/schema.d.ts +158 -0
  54. package/dist/auth/schema.d.ts.map +1 -0
  55. package/dist/auth/schema.js +82 -0
  56. package/dist/auth/schema.js.map +1 -0
  57. package/dist/auth/service.d.ts +96 -0
  58. package/dist/auth/service.d.ts.map +1 -0
  59. package/dist/auth/service.js +129 -0
  60. package/dist/auth/service.js.map +1 -0
  61. package/dist/auth/session.d.ts +51 -0
  62. package/dist/auth/session.d.ts.map +1 -0
  63. package/dist/auth/session.js +344 -0
  64. package/dist/auth/session.js.map +1 -0
  65. package/dist/auth/utils.d.ts +17 -0
  66. package/dist/auth/utils.d.ts.map +1 -0
  67. package/dist/auth/utils.js +96 -0
  68. package/dist/auth/utils.js.map +1 -0
  69. package/dist/bin/corge.js +547 -0
  70. package/dist/chat/context.d.ts +10 -0
  71. package/dist/chat/context.d.ts.map +1 -0
  72. package/dist/chat/context.js +221 -0
  73. package/dist/chat/context.js.map +1 -0
  74. package/dist/chat/index.d.ts +4 -0
  75. package/dist/chat/index.d.ts.map +1 -0
  76. package/dist/chat/index.js +4 -0
  77. package/dist/chat/index.js.map +1 -0
  78. package/dist/chat/routes.d.ts +160 -0
  79. package/dist/chat/routes.d.ts.map +1 -0
  80. package/dist/chat/routes.js +210 -0
  81. package/dist/chat/routes.js.map +1 -0
  82. package/dist/chat/schema.d.ts +285 -0
  83. package/dist/chat/schema.d.ts.map +1 -0
  84. package/dist/chat/schema.js +74 -0
  85. package/dist/chat/schema.js.map +1 -0
  86. package/dist/chat/service.d.ts +64 -0
  87. package/dist/chat/service.d.ts.map +1 -0
  88. package/dist/chat/service.js +279 -0
  89. package/dist/chat/service.js.map +1 -0
  90. package/dist/chat/stream.d.ts +53 -0
  91. package/dist/chat/stream.d.ts.map +1 -0
  92. package/dist/chat/stream.js +339 -0
  93. package/dist/chat/stream.js.map +1 -0
  94. package/dist/chat/utils.d.ts +61 -0
  95. package/dist/chat/utils.d.ts.map +1 -0
  96. package/dist/chat/utils.js +285 -0
  97. package/dist/chat/utils.js.map +1 -0
  98. package/dist/cli/builder.d.ts +6 -0
  99. package/dist/cli/builder.d.ts.map +1 -0
  100. package/dist/cli/builder.js +91 -0
  101. package/dist/cli/builder.js.map +1 -0
  102. package/dist/cli/deployer.d.ts +2 -0
  103. package/dist/cli/deployer.d.ts.map +1 -0
  104. package/dist/cli/deployer.js +152 -0
  105. package/dist/cli/deployer.js.map +1 -0
  106. package/dist/cli/dev-server.d.ts +2 -0
  107. package/dist/cli/dev-server.d.ts.map +1 -0
  108. package/dist/cli/dev-server.js +70 -0
  109. package/dist/cli/dev-server.js.map +1 -0
  110. package/dist/cli/env.d.ts +4 -0
  111. package/dist/cli/env.d.ts.map +1 -0
  112. package/dist/cli/env.js +68 -0
  113. package/dist/cli/env.js.map +1 -0
  114. package/dist/cli/init.d.ts +6 -0
  115. package/dist/cli/init.d.ts.map +1 -0
  116. package/dist/cli/init.js +103 -0
  117. package/dist/cli/init.js.map +1 -0
  118. package/dist/config.d.ts +262 -0
  119. package/dist/config.d.ts.map +1 -0
  120. package/dist/config.js +212 -0
  121. package/dist/config.js.map +1 -0
  122. package/dist/db/index.d.ts +3 -0
  123. package/dist/db/index.d.ts.map +1 -0
  124. package/dist/db/index.js +3 -0
  125. package/dist/db/index.js.map +1 -0
  126. package/dist/db/schema.d.ts +410 -0
  127. package/dist/db/schema.d.ts.map +1 -0
  128. package/dist/db/schema.js +294 -0
  129. package/dist/db/schema.js.map +1 -0
  130. package/dist/db/service.d.ts +42 -0
  131. package/dist/db/service.d.ts.map +1 -0
  132. package/dist/db/service.js +372 -0
  133. package/dist/db/service.js.map +1 -0
  134. package/dist/db/utils.d.ts +25 -0
  135. package/dist/db/utils.d.ts.map +1 -0
  136. package/dist/db/utils.js +188 -0
  137. package/dist/db/utils.js.map +1 -0
  138. package/dist/emails/index.d.ts +4 -0
  139. package/dist/emails/index.d.ts.map +1 -0
  140. package/dist/emails/index.js +4 -0
  141. package/dist/emails/index.js.map +1 -0
  142. package/dist/emails/routes.d.ts +191 -0
  143. package/dist/emails/routes.d.ts.map +1 -0
  144. package/dist/emails/routes.js +39 -0
  145. package/dist/emails/routes.js.map +1 -0
  146. package/dist/emails/schema.d.ts +237 -0
  147. package/dist/emails/schema.d.ts.map +1 -0
  148. package/dist/emails/schema.js +98 -0
  149. package/dist/emails/schema.js.map +1 -0
  150. package/dist/emails/service.d.ts +22 -0
  151. package/dist/emails/service.d.ts.map +1 -0
  152. package/dist/emails/service.js +337 -0
  153. package/dist/emails/service.js.map +1 -0
  154. package/dist/emails/utils.d.ts +49 -0
  155. package/dist/emails/utils.d.ts.map +1 -0
  156. package/dist/emails/utils.js +341 -0
  157. package/dist/emails/utils.js.map +1 -0
  158. package/dist/files/index.d.ts +4 -0
  159. package/dist/files/index.d.ts.map +1 -0
  160. package/dist/files/index.js +4 -0
  161. package/dist/files/index.js.map +1 -0
  162. package/dist/files/routes.d.ts +72 -0
  163. package/dist/files/routes.d.ts.map +1 -0
  164. package/dist/files/routes.js +38 -0
  165. package/dist/files/routes.js.map +1 -0
  166. package/dist/files/schema.d.ts +57 -0
  167. package/dist/files/schema.d.ts.map +1 -0
  168. package/dist/files/schema.js +39 -0
  169. package/dist/files/schema.js.map +1 -0
  170. package/dist/files/service.d.ts +27 -0
  171. package/dist/files/service.d.ts.map +1 -0
  172. package/dist/files/service.js +175 -0
  173. package/dist/files/service.js.map +1 -0
  174. package/dist/files/utils.d.ts +3 -0
  175. package/dist/files/utils.d.ts.map +1 -0
  176. package/dist/files/utils.js +63 -0
  177. package/dist/files/utils.js.map +1 -0
  178. package/dist/index.d.ts +875 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +9919 -0
  181. package/dist/index.js.map +7 -0
  182. package/dist/payments/billing.d.ts +29 -0
  183. package/dist/payments/billing.d.ts.map +1 -0
  184. package/dist/payments/billing.js +378 -0
  185. package/dist/payments/billing.js.map +1 -0
  186. package/dist/payments/index.d.ts +4 -0
  187. package/dist/payments/index.d.ts.map +1 -0
  188. package/dist/payments/index.js +4 -0
  189. package/dist/payments/index.js.map +1 -0
  190. package/dist/payments/routes.d.ts +340 -0
  191. package/dist/payments/routes.d.ts.map +1 -0
  192. package/dist/payments/routes.js +56 -0
  193. package/dist/payments/routes.js.map +1 -0
  194. package/dist/payments/schema.d.ts +412 -0
  195. package/dist/payments/schema.d.ts.map +1 -0
  196. package/dist/payments/schema.js +260 -0
  197. package/dist/payments/schema.js.map +1 -0
  198. package/dist/payments/service.d.ts +31 -0
  199. package/dist/payments/service.d.ts.map +1 -0
  200. package/dist/payments/service.js +322 -0
  201. package/dist/payments/service.js.map +1 -0
  202. package/dist/payments/utils.d.ts +61 -0
  203. package/dist/payments/utils.d.ts.map +1 -0
  204. package/dist/payments/utils.js +369 -0
  205. package/dist/payments/utils.js.map +1 -0
  206. package/dist/router/guard.d.ts +19 -0
  207. package/dist/router/guard.d.ts.map +1 -0
  208. package/dist/router/guard.js +243 -0
  209. package/dist/router/guard.js.map +1 -0
  210. package/dist/router/index.d.ts +3 -0
  211. package/dist/router/index.d.ts.map +1 -0
  212. package/dist/router/index.js +3 -0
  213. package/dist/router/index.js.map +1 -0
  214. package/dist/router/schema.d.ts +103 -0
  215. package/dist/router/schema.d.ts.map +1 -0
  216. package/dist/router/schema.js +282 -0
  217. package/dist/router/schema.js.map +1 -0
  218. package/dist/router/service.d.ts +25 -0
  219. package/dist/router/service.d.ts.map +1 -0
  220. package/dist/router/service.js +339 -0
  221. package/dist/router/service.js.map +1 -0
  222. package/dist/tasks/index.d.ts +4 -0
  223. package/dist/tasks/index.d.ts.map +1 -0
  224. package/dist/tasks/index.js +4 -0
  225. package/dist/tasks/index.js.map +1 -0
  226. package/dist/tasks/routes.d.ts +54 -0
  227. package/dist/tasks/routes.d.ts.map +1 -0
  228. package/dist/tasks/routes.js +195 -0
  229. package/dist/tasks/routes.js.map +1 -0
  230. package/dist/tasks/schema.d.ts +261 -0
  231. package/dist/tasks/schema.d.ts.map +1 -0
  232. package/dist/tasks/schema.js +35 -0
  233. package/dist/tasks/schema.js.map +1 -0
  234. package/dist/tasks/service.d.ts +32 -0
  235. package/dist/tasks/service.d.ts.map +1 -0
  236. package/dist/tasks/service.js +201 -0
  237. package/dist/tasks/service.js.map +1 -0
  238. package/dist/tasks/steps.d.ts +18 -0
  239. package/dist/tasks/steps.d.ts.map +1 -0
  240. package/dist/tasks/steps.js +365 -0
  241. package/dist/tasks/steps.js.map +1 -0
  242. package/dist/tasks/utils.d.ts +75 -0
  243. package/dist/tasks/utils.d.ts.map +1 -0
  244. package/dist/tasks/utils.js +311 -0
  245. package/dist/tasks/utils.js.map +1 -0
  246. package/dist/tasks/watcher.d.ts +13 -0
  247. package/dist/tasks/watcher.d.ts.map +1 -0
  248. package/dist/tasks/watcher.js +255 -0
  249. package/dist/tasks/watcher.js.map +1 -0
  250. package/dist/tasks/worker.d.ts +28 -0
  251. package/dist/tasks/worker.d.ts.map +1 -0
  252. package/dist/tasks/worker.js +326 -0
  253. package/dist/tasks/worker.js.map +1 -0
  254. package/dist/utils/index.d.ts +3 -0
  255. package/dist/utils/index.d.ts.map +1 -0
  256. package/dist/utils/index.js +3 -0
  257. package/dist/utils/index.js.map +1 -0
  258. package/dist/utils/schema.d.ts +79 -0
  259. package/dist/utils/schema.d.ts.map +1 -0
  260. package/dist/utils/schema.js +41 -0
  261. package/dist/utils/schema.js.map +1 -0
  262. package/dist/utils/service.d.ts +32 -0
  263. package/dist/utils/service.d.ts.map +1 -0
  264. package/dist/utils/service.js +384 -0
  265. package/dist/utils/service.js.map +1 -0
  266. package/docs/SDK_SPEC.md +1645 -0
  267. package/infra/firestore.base.indexes.json +138 -0
  268. package/infra/firestore.base.rules +152 -0
  269. package/infra/storage.base.rules +8 -0
  270. package/package.json +59 -13
  271. package/src/ai/index.ts +2 -0
  272. package/src/ai/schema.ts +64 -0
  273. package/src/ai/service.ts +317 -0
  274. package/src/ai/utils.ts +38 -0
  275. package/src/attachments/index.ts +3 -0
  276. package/src/attachments/routes.ts +28 -0
  277. package/src/attachments/schema.ts +45 -0
  278. package/src/attachments/service.ts +315 -0
  279. package/src/attachments/utils.ts +115 -0
  280. package/src/auth/index.ts +3 -0
  281. package/src/auth/oidc.ts +419 -0
  282. package/src/auth/recovery.ts +365 -0
  283. package/src/auth/routes.ts +142 -0
  284. package/src/auth/schema.ts +181 -0
  285. package/src/auth/service.ts +183 -0
  286. package/src/auth/session.ts +414 -0
  287. package/src/auth/utils.ts +106 -0
  288. package/src/chat/context.ts +310 -0
  289. package/src/chat/index.ts +3 -0
  290. package/src/chat/routes.ts +264 -0
  291. package/src/chat/schema.ts +295 -0
  292. package/src/chat/service.ts +360 -0
  293. package/src/chat/stream.ts +481 -0
  294. package/src/chat/utils.ts +370 -0
  295. package/src/cli/builder.ts +93 -0
  296. package/src/cli/deployer.ts +184 -0
  297. package/src/cli/dev-server.ts +77 -0
  298. package/src/cli/env.ts +89 -0
  299. package/src/cli/init.ts +125 -0
  300. package/src/config.ts +447 -0
  301. package/src/db/index.ts +2 -0
  302. package/src/db/schema.ts +409 -0
  303. package/src/db/service.ts +477 -0
  304. package/src/db/utils.ts +250 -0
  305. package/src/emails/index.ts +3 -0
  306. package/src/emails/routes.ts +64 -0
  307. package/src/emails/schema.ts +239 -0
  308. package/src/emails/service.ts +488 -0
  309. package/src/emails/utils.ts +449 -0
  310. package/src/files/index.ts +3 -0
  311. package/src/files/routes.ts +44 -0
  312. package/src/files/schema.ts +76 -0
  313. package/src/files/service.ts +238 -0
  314. package/src/files/utils.ts +77 -0
  315. package/src/index.ts +425 -0
  316. package/src/payments/billing.ts +488 -0
  317. package/src/payments/index.ts +3 -0
  318. package/src/payments/routes.ts +92 -0
  319. package/src/payments/schema.ts +401 -0
  320. package/src/payments/service.ts +445 -0
  321. package/src/payments/utils.ts +472 -0
  322. package/src/router/guard.ts +319 -0
  323. package/src/router/index.ts +2 -0
  324. package/src/router/schema.ts +458 -0
  325. package/src/router/service.ts +453 -0
  326. package/src/tasks/index.ts +11 -0
  327. package/src/tasks/routes.ts +230 -0
  328. package/src/tasks/schema.ts +310 -0
  329. package/src/tasks/service.ts +254 -0
  330. package/src/tasks/steps.ts +472 -0
  331. package/src/tasks/utils.ts +445 -0
  332. package/src/tasks/watcher.ts +307 -0
  333. package/src/tasks/worker.ts +461 -0
  334. package/src/utils/index.ts +2 -0
  335. package/src/utils/schema.ts +69 -0
  336. package/src/utils/service.ts +461 -0
  337. package/tests/e2e.test.ts +2531 -0
  338. package/tsconfig.base.json +12 -0
  339. package/README.md +0 -2
  340. package/index.d.ts +0 -1
  341. package/index.js +0 -1
@@ -0,0 +1,138 @@
1
+ {
2
+ "indexes": [
3
+ {
4
+ "collectionGroup": "chat",
5
+ "queryScope": "COLLECTION",
6
+ "fields": [
7
+ { "fieldPath": "userId", "order": "ASCENDING" },
8
+ { "fieldPath": "deleted", "order": "ASCENDING" },
9
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
10
+ ]
11
+ },
12
+ {
13
+ "collectionGroup": "chat",
14
+ "queryScope": "COLLECTION",
15
+ "fields": [
16
+ { "fieldPath": "userId", "order": "ASCENDING" },
17
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
18
+ ]
19
+ },
20
+ {
21
+ "collectionGroup": "file",
22
+ "queryScope": "COLLECTION",
23
+ "fields": [
24
+ { "fieldPath": "userId", "order": "ASCENDING" },
25
+ { "fieldPath": "deleted", "order": "ASCENDING" }
26
+ ]
27
+ },
28
+ {
29
+ "collectionGroup": "messages",
30
+ "queryScope": "COLLECTION",
31
+ "fields": [
32
+ { "fieldPath": "createdAt", "order": "DESCENDING" }
33
+ ]
34
+ },
35
+ {
36
+ "collectionGroup": "messages",
37
+ "queryScope": "COLLECTION",
38
+ "fields": [
39
+ {
40
+ "fieldPath": "embedding",
41
+ "vectorConfig": { "dimension": 768, "flat": {} }
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ "collectionGroup": "messages",
47
+ "queryScope": "COLLECTION_GROUP",
48
+ "fields": [
49
+ { "fieldPath": "userId", "order": "ASCENDING" },
50
+ {
51
+ "fieldPath": "embedding",
52
+ "vectorConfig": { "dimension": 768, "flat": {} }
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ "collectionGroup": "email_log",
58
+ "queryScope": "COLLECTION",
59
+ "fields": [
60
+ { "fieldPath": "externalMessageId", "order": "ASCENDING" },
61
+ { "fieldPath": "deleted", "order": "ASCENDING" },
62
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
63
+ ]
64
+ },
65
+ {
66
+ "collectionGroup": "email_log",
67
+ "queryScope": "COLLECTION",
68
+ "fields": [
69
+ { "fieldPath": "to", "order": "ASCENDING" },
70
+ { "fieldPath": "deleted", "order": "ASCENDING" },
71
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
72
+ ]
73
+ },
74
+ {
75
+ "collectionGroup": "email_log",
76
+ "queryScope": "COLLECTION",
77
+ "fields": [
78
+ { "fieldPath": "userId", "order": "ASCENDING" },
79
+ { "fieldPath": "deleted", "order": "ASCENDING" },
80
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
81
+ ]
82
+ },
83
+ {
84
+ "collectionGroup": "payment_usage",
85
+ "queryScope": "COLLECTION",
86
+ "fields": [
87
+ { "fieldPath": "userId", "order": "ASCENDING" },
88
+ { "fieldPath": "deleted", "order": "ASCENDING" },
89
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
90
+ ]
91
+ },
92
+ {
93
+ "collectionGroup": "payment_transaction",
94
+ "queryScope": "COLLECTION",
95
+ "fields": [
96
+ { "fieldPath": "userId", "order": "ASCENDING" },
97
+ { "fieldPath": "deleted", "order": "ASCENDING" },
98
+ { "fieldPath": "updatedAt", "order": "DESCENDING" }
99
+ ]
100
+ },
101
+ {
102
+ "collectionGroup": "payment_customer",
103
+ "queryScope": "COLLECTION",
104
+ "fields": [
105
+ { "fieldPath": "stripeCustomerId", "order": "ASCENDING" },
106
+ { "fieldPath": "deleted", "order": "ASCENDING" }
107
+ ]
108
+ },
109
+ {
110
+ "collectionGroup": "payment_customer",
111
+ "queryScope": "COLLECTION",
112
+ "fields": [
113
+ { "fieldPath": "dodoCustomerId", "order": "ASCENDING" },
114
+ { "fieldPath": "deleted", "order": "ASCENDING" }
115
+ ]
116
+ }
117
+ ],
118
+ "fieldOverrides": [
119
+ {
120
+ "collectionGroup": "_tasks",
121
+ "fieldPath": "expiresAt",
122
+ "ttl": true,
123
+ "indexes": []
124
+ },
125
+ {
126
+ "collectionGroup": "auth_tokens",
127
+ "fieldPath": "expiresAt",
128
+ "ttl": true,
129
+ "indexes": []
130
+ },
131
+ {
132
+ "collectionGroup": "_idempotency",
133
+ "fieldPath": "expiresAt",
134
+ "ttl": true,
135
+ "indexes": []
136
+ }
137
+ ]
138
+ }
@@ -0,0 +1,152 @@
1
+ rules_version = '2';
2
+
3
+ // ===============================================================
4
+ // Assumed Data Model
5
+ // ===============================================================
6
+ //
7
+ // All mutations and schema enforcement happen server-side through the
8
+ // Firebase Functions 2nd Gen backend (firebase-admin/firestore with
9
+ // defineCollection, z.strictObject(), and mandatory FirestoreDataConverter<T>)
10
+ // in me-central1. Direct client SDK writes are denied across all collections.
11
+ //
12
+ // Collection: user/{userId}
13
+ // Document ID: Firebase Auth UID
14
+ // Fields (enforced server-side):
15
+ // - id: string (required, immutable)
16
+ // - email: string (required, valid email)
17
+ // - displayName: string (optional)
18
+ // - role: string ('user' | 'admin')
19
+ // - createdAt: timestamp (required, immutable)
20
+ // - updatedAt: timestamp (required)
21
+ //
22
+ // Collection: chat/{chatId}
23
+ // Document ID: Auto-generated ID (entryId: ^[A-Za-z0-9_-]{1,128}$)
24
+ // Fields (enforced server-side via coreCollections.chat):
25
+ // - id: string (required, immutable, entryId)
26
+ // - userId: string (required, immutable, owner UID)
27
+ // - agentId: string | null (optional, agent identifier)
28
+ // - title: string | null (optional)
29
+ // - model: string | null (optional, model identifier)
30
+ // - messageCount: int (required, defaults to 0, non-negative)
31
+ // - summary: string | null (optional, rolling conversation summary)
32
+ // - activeGenerationId: string | null (optional, active stream generation ID)
33
+ // - deleted: bool (required, defaults to false, soft-delete flag)
34
+ // - createdAt: timestamp (required, immutable)
35
+ // - updatedAt: timestamp (required)
36
+ //
37
+ // Subcollection: chat/{chatId}/messages/{messageId}
38
+ // Document ID: Auto-generated ID (entryId: ^[A-Za-z0-9_-]{1,128}$)
39
+ // Fields (enforced server-side):
40
+ // - id: string (required, immutable, entryId)
41
+ // - chatId: string (required, immutable, parent chat entryId)
42
+ // - userId: string (required, immutable, owner UID)
43
+ // - role: string (required, 'system' | 'user' | 'assistant' | 'tool')
44
+ // - content: string (required, message text)
45
+ // - parts: list | null (optional, structured message parts)
46
+ // - toolInvocations: list | null (optional, tool call/result metadata)
47
+ // - attachments: list<string> | null (optional, attached fileRef IDs)
48
+ // - tokenCount: int | null (optional, non-negative)
49
+ // - cancelled: bool (optional, defaults to false)
50
+ // - createdAt: timestamp (required, immutable)
51
+ // - embedding: vector | list<float> | null (optional, 768-dim vector embedding)
52
+ //
53
+ // Collection: file/{fileId}
54
+ // Document ID: Auto-generated ID (fileRef: ^[A-Za-z0-9_-]{1,128}_[a-f0-9]{24}$)
55
+ // Fields (enforced server-side via coreCollections.file):
56
+ // - id: string (required, immutable, fileRef)
57
+ // - userId: string (required, immutable, owner UID)
58
+ // - shaSum: string (required, SHA-256 hex digest)
59
+ // - fileName: string (required)
60
+ // - contentType: string (required, MIME type)
61
+ // - size: int (required, non-negative)
62
+ // - scan: map | null (optional, fileScan metadata)
63
+ // - scanError: map | null (optional, fileScanError negative cache metadata)
64
+ // - deleted: bool (required, defaults to false, soft-delete flag)
65
+ // - createdAt: timestamp (required, immutable)
66
+ // - updatedAt: timestamp (required)
67
+ //
68
+ // Server-Only Admin SDK Collections (zero direct client read/write access;
69
+ // denied by the default `match /{document=**} { allow read, write: if false; }` fallback rule):
70
+ // - email_log/{emailId}: Transactional email delivery & webhook audit log (coreCollections.email_log)
71
+ // - email_suppression/{emailHash}: Hard-bounce, spam-complaint & manual suppression list (coreCollections.email_suppression)
72
+ // - user_auth_meta/{userId}: Internal authentication & linked OAuth provider metadata (coreCollections.user_auth_meta)
73
+ // - auth_tokens/{tokenId}: Hashed verification, password-reset & recovery tokens (coreCollections.auth_tokens)
74
+ // - payment_customer/{userId}: 1:1 customer billing state, active subscription tier & bonus token balances (coreCollections.payment_customer)
75
+ // - payment_usage/{usageId}: Per-period AI token & custom metric consumption ledger (coreCollections.payment_usage)
76
+ // - payment_transaction/{txId}: Immutable payment & webhook event audit ledger (coreCollections.payment_transaction)
77
+ // - _tasks/{taskId}: Durable task queue state & execution leases
78
+ // - _idempotency/{key}: Request & webhook idempotency locks
79
+ // - _system/{docId}: Internal system state, rate limits & circuit-breaker metadata
80
+ //
81
+ // ===============================================================
82
+
83
+ service cloud.firestore {
84
+ match /databases/{database}/documents {
85
+
86
+ // ===============================================================
87
+ // Helper Functions
88
+ // ===============================================================
89
+
90
+ function isAuthenticated() {
91
+ return request.auth != null;
92
+ }
93
+
94
+ function isOwner(userId) {
95
+ return isAuthenticated() && request.auth.uid == userId;
96
+ }
97
+
98
+ function isAdmin() {
99
+ return isAuthenticated() && (request.auth.token.admin == true || request.auth.token.role == 'admin');
100
+ }
101
+
102
+ function isResourceOwner() {
103
+ return isAuthenticated() && resource.data.userId == request.auth.uid;
104
+ }
105
+
106
+ function isNotDeleted() {
107
+ return resource.data.deleted != true;
108
+ }
109
+
110
+ // ===============================================================
111
+ // Collection Rules
112
+ // ===============================================================
113
+
114
+ // User profiles: owners can read their own profile, admins can read any profile.
115
+ // All writes are server-side only via Firebase Admin SDK.
116
+ match /user/{userId} {
117
+ allow read: if isOwner(userId) || isAdmin();
118
+ allow write: if false;
119
+ }
120
+
121
+ // Chats: authenticated users can read non-deleted chats they own.
122
+ // All writes are server-side only via Firebase Admin SDK.
123
+ match /chat/{chatId} {
124
+ allow read: if request.auth != null && resource.data.userId == request.auth.uid && resource.data.deleted != true;
125
+ allow write: if false;
126
+ }
127
+
128
+ // Chat messages: authenticated users can read messages they own (including collectionGroup('messages') queries).
129
+ // All writes are server-side only via Firebase Admin SDK.
130
+ match /chat/{chatId}/messages/{messageId} {
131
+ allow read: if request.auth != null && resource.data.userId == request.auth.uid;
132
+ allow write: if false;
133
+ }
134
+
135
+ match /{path=**}/messages/{messageId} {
136
+ allow read: if request.auth != null && resource.data.userId == request.auth.uid;
137
+ allow write: if false;
138
+ }
139
+
140
+ // File metadata: authenticated users can read non-deleted file metadata they own.
141
+ // All writes are server-side only via Firebase Admin SDK.
142
+ match /file/{fileId} {
143
+ allow read: if request.auth != null && resource.data.userId == request.auth.uid && resource.data.deleted != true;
144
+ allow write: if false;
145
+ }
146
+
147
+ // Default fallback: deny all direct client reads and writes across all other paths.
148
+ match /{document=**} {
149
+ allow read, write: if false;
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,8 @@
1
+ rules_version = '2';
2
+ service firebase.storage {
3
+ match /b/{bucket}/o {
4
+ match /{allPaths=**} {
5
+ allow read, write: if false;
6
+ }
7
+ }
8
+ }
package/package.json CHANGED
@@ -1,18 +1,64 @@
1
1
  {
2
2
  "name": "@corgelabs/corge",
3
- "version": "0.0.1",
4
- "description": "Corge (Core + Forge) — All-in-one Serverless AI, MCP & Durable Workflow SDK for modern Agentic SaaS.",
3
+ "version": "1.0.0",
4
+ "description": "Corge: High-load serverless AI, durable workflow, payments & auth SDK for GCP Cloud Functions v2",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/corgelabs/corge.git"
9
+ },
5
10
  "type": "module",
6
- "main": "index.js",
7
- "types": "index.d.ts",
8
- "keywords": [
9
- "corge",
10
- "ai",
11
- "mcp",
12
- "agentic",
13
- "saas",
14
- "workflow",
15
- "sdk"
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "bin": {
14
+ "corge": "./dist/bin/corge.js"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./tsconfig.base.json": "./tsconfig.base.json",
22
+ "./spec": "./docs/SDK_SPEC.md"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "src",
27
+ "infra",
28
+ "tests",
29
+ "docs/SDK_SPEC.md",
30
+ "tsconfig.base.json"
16
31
  ],
17
- "license": "MIT"
32
+ "engines": {
33
+ "node": ">=24"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -p tsconfig.build.json && esbuild src/index.ts --bundle --platform=node --target=node24 --format=esm --packages=external --sourcemap --outfile=dist/index.js && esbuild bin/corge.ts --bundle --platform=node --target=node24 --format=esm --packages=external --banner:js=\"#!/usr/bin/env node\" --outfile=dist/bin/corge.js && chmod +x dist/bin/corge.js",
37
+ "check": "tsc --noEmit",
38
+ "test": "node dist/bin/corge.js test",
39
+ "test:chaos": "node dist/bin/corge.js test:chaos",
40
+ "prepublishOnly": "npm run check && npm run build"
41
+ },
42
+ "dependencies": {
43
+ "@ai-sdk/google-vertex": "^5.0.121",
44
+ "@hono/node-server": "^1.19.17",
45
+ "@mistralai/mistralai": "^2.7.0",
46
+ "@modelcontextprotocol/server": "^2.3.1",
47
+ "@typesafe-ai/sdk": "^0.7.0",
48
+ "ai": "^7.0.150",
49
+ "esbuild": "^0.25.0",
50
+ "firebase-admin": "^14.5.0",
51
+ "firebase-functions": "^7.0.0",
52
+ "hono": "^4.13.13",
53
+ "zod": "^4.6.7"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^24.0.0",
57
+ "typescript": "7.0.2"
58
+ },
59
+ "overrides": {
60
+ "body-parser": "^2.4.0",
61
+ "uuid": "^11.1.1",
62
+ "zod": "^4.6.7"
63
+ }
18
64
  }
@@ -0,0 +1,2 @@
1
+ export * from './schema'
2
+ export { AiService } from './service'
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod'
2
+
3
+ export type JevQuestion =
4
+ | { type: 'noul'; instructions: string; criteria?: { true: string; false: string } }
5
+ | { type: 'choice'; instructions: string; criteria: Record<string, string> }
6
+ | { type: 'score'; instructions: string; criteria: string[] }
7
+
8
+ export const answerSchema = z.discriminatedUnion('type', [
9
+ z.object({ type: z.literal('noul'), noul: z.number().min(0).max(1) }),
10
+ z.object({
11
+ type: z.literal('choice'),
12
+ choice: z.string(),
13
+ probabilities: z.record(z.string(), z.number()),
14
+ confidence: z.number()
15
+ }),
16
+ z.object({
17
+ type: z.literal('score'),
18
+ score: z.number(),
19
+ probabilities: z.record(z.string(), z.number()),
20
+ confidence: z.number()
21
+ })
22
+ ])
23
+
24
+ export const envelopeSchema = z.object({ model: z.string(), answers: z.record(z.string(), answerSchema) })
25
+
26
+ export interface AiUsageSummary {
27
+ model: string
28
+ inputTokens: number
29
+ outputTokens: number
30
+ totalTokens: number
31
+ pages?: number
32
+ }
33
+
34
+ export type JevAnswer = z.infer<typeof answerSchema>
35
+ export type DecideResult = z.infer<typeof envelopeSchema> & { usage?: AiUsageSummary }
36
+
37
+ export interface VisionOptions {
38
+ schema?: Record<string, unknown>
39
+ prompt?: string
40
+ fallbackVision?: boolean
41
+ signal?: AbortSignal
42
+ }
43
+
44
+ export interface VisionResult {
45
+ markdown: string
46
+ annotation: Record<string, unknown>
47
+ usage?: AiUsageSummary
48
+ }
49
+
50
+ export interface AiGenerateOptions<O = string> {
51
+ model?: string
52
+ system?: string
53
+ schema?: z.ZodType<O>
54
+ signal?: AbortSignal
55
+ }
56
+
57
+ export interface AiGenerateResult<O = string> {
58
+ text: string
59
+ output: O
60
+ usage: unknown
61
+ }
62
+
63
+ export const DEFAULT_EXTRACTION_PROMPT =
64
+ 'Extract the document fields as JSON matching the schema. Transcribe values exactly as printed, translate non-English into English, transliterate names, use Western digits. Empty string if not visible.'