@corgelabs/corge 0.0.1 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/schema.d.ts +83 -0
- package/dist/ai/schema.d.ts.map +1 -0
- package/dist/ai/schema.js +19 -0
- package/dist/ai/schema.js.map +1 -0
- package/dist/ai/service.d.ts +14 -0
- package/dist/ai/service.d.ts.map +1 -0
- package/dist/ai/service.js +266 -0
- package/dist/ai/service.js.map +1 -0
- package/dist/ai/utils.d.ts +10 -0
- package/dist/ai/utils.d.ts.map +1 -0
- package/dist/ai/utils.js +27 -0
- package/dist/ai/utils.js.map +1 -0
- package/dist/attachments/index.d.ts +4 -0
- package/dist/attachments/index.d.ts.map +1 -0
- package/dist/attachments/index.js +4 -0
- package/dist/attachments/index.js.map +1 -0
- package/dist/attachments/routes.d.ts +75 -0
- package/dist/attachments/routes.d.ts.map +1 -0
- package/dist/attachments/routes.js +18 -0
- package/dist/attachments/routes.js.map +1 -0
- package/dist/attachments/schema.d.ts +61 -0
- package/dist/attachments/schema.d.ts.map +1 -0
- package/dist/attachments/schema.js +30 -0
- package/dist/attachments/schema.js.map +1 -0
- package/dist/attachments/service.d.ts +27 -0
- package/dist/attachments/service.d.ts.map +1 -0
- package/dist/attachments/service.js +224 -0
- package/dist/attachments/service.js.map +1 -0
- package/dist/attachments/utils.d.ts +9 -0
- package/dist/attachments/utils.d.ts.map +1 -0
- package/dist/attachments/utils.js +80 -0
- package/dist/attachments/utils.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oidc.d.ts +25 -0
- package/dist/auth/oidc.d.ts.map +1 -0
- package/dist/auth/oidc.js +298 -0
- package/dist/auth/oidc.js.map +1 -0
- package/dist/auth/recovery.d.ts +41 -0
- package/dist/auth/recovery.d.ts.map +1 -0
- package/dist/auth/recovery.js +250 -0
- package/dist/auth/recovery.js.map +1 -0
- package/dist/auth/routes.d.ts +226 -0
- package/dist/auth/routes.d.ts.map +1 -0
- package/dist/auth/routes.js +96 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/schema.d.ts +158 -0
- package/dist/auth/schema.d.ts.map +1 -0
- package/dist/auth/schema.js +82 -0
- package/dist/auth/schema.js.map +1 -0
- package/dist/auth/service.d.ts +96 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +129 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/auth/session.d.ts +51 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +344 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/utils.d.ts +17 -0
- package/dist/auth/utils.d.ts.map +1 -0
- package/dist/auth/utils.js +96 -0
- package/dist/auth/utils.js.map +1 -0
- package/dist/bin/corge.js +542 -0
- package/dist/chat/context.d.ts +10 -0
- package/dist/chat/context.d.ts.map +1 -0
- package/dist/chat/context.js +221 -0
- package/dist/chat/context.js.map +1 -0
- package/dist/chat/index.d.ts +4 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +4 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/routes.d.ts +160 -0
- package/dist/chat/routes.d.ts.map +1 -0
- package/dist/chat/routes.js +210 -0
- package/dist/chat/routes.js.map +1 -0
- package/dist/chat/schema.d.ts +285 -0
- package/dist/chat/schema.d.ts.map +1 -0
- package/dist/chat/schema.js +74 -0
- package/dist/chat/schema.js.map +1 -0
- package/dist/chat/service.d.ts +64 -0
- package/dist/chat/service.d.ts.map +1 -0
- package/dist/chat/service.js +279 -0
- package/dist/chat/service.js.map +1 -0
- package/dist/chat/stream.d.ts +53 -0
- package/dist/chat/stream.d.ts.map +1 -0
- package/dist/chat/stream.js +339 -0
- package/dist/chat/stream.js.map +1 -0
- package/dist/chat/utils.d.ts +61 -0
- package/dist/chat/utils.d.ts.map +1 -0
- package/dist/chat/utils.js +285 -0
- package/dist/chat/utils.js.map +1 -0
- package/dist/cli/builder.d.ts +6 -0
- package/dist/cli/builder.d.ts.map +1 -0
- package/dist/cli/builder.js +91 -0
- package/dist/cli/builder.js.map +1 -0
- package/dist/cli/deployer.d.ts +2 -0
- package/dist/cli/deployer.d.ts.map +1 -0
- package/dist/cli/deployer.js +152 -0
- package/dist/cli/deployer.js.map +1 -0
- package/dist/cli/dev-server.d.ts +2 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +70 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/env.d.ts +4 -0
- package/dist/cli/env.d.ts.map +1 -0
- package/dist/cli/env.js +68 -0
- package/dist/cli/env.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +97 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/config.d.ts +262 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +212 -0
- package/dist/config.js.map +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +3 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +410 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +294 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/service.d.ts +42 -0
- package/dist/db/service.d.ts.map +1 -0
- package/dist/db/service.js +372 -0
- package/dist/db/service.js.map +1 -0
- package/dist/db/utils.d.ts +25 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/db/utils.js +188 -0
- package/dist/db/utils.js.map +1 -0
- package/dist/emails/index.d.ts +4 -0
- package/dist/emails/index.d.ts.map +1 -0
- package/dist/emails/index.js +4 -0
- package/dist/emails/index.js.map +1 -0
- package/dist/emails/routes.d.ts +191 -0
- package/dist/emails/routes.d.ts.map +1 -0
- package/dist/emails/routes.js +39 -0
- package/dist/emails/routes.js.map +1 -0
- package/dist/emails/schema.d.ts +237 -0
- package/dist/emails/schema.d.ts.map +1 -0
- package/dist/emails/schema.js +98 -0
- package/dist/emails/schema.js.map +1 -0
- package/dist/emails/service.d.ts +22 -0
- package/dist/emails/service.d.ts.map +1 -0
- package/dist/emails/service.js +337 -0
- package/dist/emails/service.js.map +1 -0
- package/dist/emails/utils.d.ts +49 -0
- package/dist/emails/utils.d.ts.map +1 -0
- package/dist/emails/utils.js +341 -0
- package/dist/emails/utils.js.map +1 -0
- package/dist/files/index.d.ts +4 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +4 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/routes.d.ts +72 -0
- package/dist/files/routes.d.ts.map +1 -0
- package/dist/files/routes.js +38 -0
- package/dist/files/routes.js.map +1 -0
- package/dist/files/schema.d.ts +57 -0
- package/dist/files/schema.d.ts.map +1 -0
- package/dist/files/schema.js +39 -0
- package/dist/files/schema.js.map +1 -0
- package/dist/files/service.d.ts +27 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +175 -0
- package/dist/files/service.js.map +1 -0
- package/dist/files/utils.d.ts +3 -0
- package/dist/files/utils.d.ts.map +1 -0
- package/dist/files/utils.js +63 -0
- package/dist/files/utils.js.map +1 -0
- package/dist/index.d.ts +875 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9919 -0
- package/dist/index.js.map +7 -0
- package/dist/payments/billing.d.ts +29 -0
- package/dist/payments/billing.d.ts.map +1 -0
- package/dist/payments/billing.js +378 -0
- package/dist/payments/billing.js.map +1 -0
- package/dist/payments/index.d.ts +4 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +4 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/routes.d.ts +340 -0
- package/dist/payments/routes.d.ts.map +1 -0
- package/dist/payments/routes.js +56 -0
- package/dist/payments/routes.js.map +1 -0
- package/dist/payments/schema.d.ts +412 -0
- package/dist/payments/schema.d.ts.map +1 -0
- package/dist/payments/schema.js +260 -0
- package/dist/payments/schema.js.map +1 -0
- package/dist/payments/service.d.ts +31 -0
- package/dist/payments/service.d.ts.map +1 -0
- package/dist/payments/service.js +322 -0
- package/dist/payments/service.js.map +1 -0
- package/dist/payments/utils.d.ts +61 -0
- package/dist/payments/utils.d.ts.map +1 -0
- package/dist/payments/utils.js +369 -0
- package/dist/payments/utils.js.map +1 -0
- package/dist/router/guard.d.ts +19 -0
- package/dist/router/guard.d.ts.map +1 -0
- package/dist/router/guard.js +243 -0
- package/dist/router/guard.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +3 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/schema.d.ts +103 -0
- package/dist/router/schema.d.ts.map +1 -0
- package/dist/router/schema.js +282 -0
- package/dist/router/schema.js.map +1 -0
- package/dist/router/service.d.ts +25 -0
- package/dist/router/service.d.ts.map +1 -0
- package/dist/router/service.js +339 -0
- package/dist/router/service.js.map +1 -0
- package/dist/tasks/index.d.ts +4 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +4 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/routes.d.ts +54 -0
- package/dist/tasks/routes.d.ts.map +1 -0
- package/dist/tasks/routes.js +195 -0
- package/dist/tasks/routes.js.map +1 -0
- package/dist/tasks/schema.d.ts +261 -0
- package/dist/tasks/schema.d.ts.map +1 -0
- package/dist/tasks/schema.js +35 -0
- package/dist/tasks/schema.js.map +1 -0
- package/dist/tasks/service.d.ts +32 -0
- package/dist/tasks/service.d.ts.map +1 -0
- package/dist/tasks/service.js +201 -0
- package/dist/tasks/service.js.map +1 -0
- package/dist/tasks/steps.d.ts +18 -0
- package/dist/tasks/steps.d.ts.map +1 -0
- package/dist/tasks/steps.js +365 -0
- package/dist/tasks/steps.js.map +1 -0
- package/dist/tasks/utils.d.ts +75 -0
- package/dist/tasks/utils.d.ts.map +1 -0
- package/dist/tasks/utils.js +311 -0
- package/dist/tasks/utils.js.map +1 -0
- package/dist/tasks/watcher.d.ts +13 -0
- package/dist/tasks/watcher.d.ts.map +1 -0
- package/dist/tasks/watcher.js +255 -0
- package/dist/tasks/watcher.js.map +1 -0
- package/dist/tasks/worker.d.ts +28 -0
- package/dist/tasks/worker.d.ts.map +1 -0
- package/dist/tasks/worker.js +326 -0
- package/dist/tasks/worker.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/schema.d.ts +79 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +41 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/service.d.ts +32 -0
- package/dist/utils/service.d.ts.map +1 -0
- package/dist/utils/service.js +384 -0
- package/dist/utils/service.js.map +1 -0
- package/docs/SDK_SPEC.md +1645 -0
- package/infra/firestore.base.indexes.json +138 -0
- package/infra/firestore.base.rules +152 -0
- package/infra/storage.base.rules +8 -0
- package/package.json +58 -13
- package/src/ai/index.ts +2 -0
- package/src/ai/schema.ts +64 -0
- package/src/ai/service.ts +317 -0
- package/src/ai/utils.ts +38 -0
- package/src/attachments/index.ts +3 -0
- package/src/attachments/routes.ts +28 -0
- package/src/attachments/schema.ts +45 -0
- package/src/attachments/service.ts +315 -0
- package/src/attachments/utils.ts +115 -0
- package/src/auth/index.ts +3 -0
- package/src/auth/oidc.ts +419 -0
- package/src/auth/recovery.ts +365 -0
- package/src/auth/routes.ts +142 -0
- package/src/auth/schema.ts +181 -0
- package/src/auth/service.ts +183 -0
- package/src/auth/session.ts +414 -0
- package/src/auth/utils.ts +106 -0
- package/src/chat/context.ts +310 -0
- package/src/chat/index.ts +3 -0
- package/src/chat/routes.ts +264 -0
- package/src/chat/schema.ts +295 -0
- package/src/chat/service.ts +360 -0
- package/src/chat/stream.ts +481 -0
- package/src/chat/utils.ts +370 -0
- package/src/cli/builder.ts +93 -0
- package/src/cli/deployer.ts +184 -0
- package/src/cli/dev-server.ts +77 -0
- package/src/cli/env.ts +89 -0
- package/src/cli/init.ts +121 -0
- package/src/config.ts +447 -0
- package/src/db/index.ts +2 -0
- package/src/db/schema.ts +409 -0
- package/src/db/service.ts +477 -0
- package/src/db/utils.ts +250 -0
- package/src/emails/index.ts +3 -0
- package/src/emails/routes.ts +64 -0
- package/src/emails/schema.ts +239 -0
- package/src/emails/service.ts +488 -0
- package/src/emails/utils.ts +449 -0
- package/src/files/index.ts +3 -0
- package/src/files/routes.ts +44 -0
- package/src/files/schema.ts +76 -0
- package/src/files/service.ts +238 -0
- package/src/files/utils.ts +77 -0
- package/src/index.ts +425 -0
- package/src/payments/billing.ts +488 -0
- package/src/payments/index.ts +3 -0
- package/src/payments/routes.ts +92 -0
- package/src/payments/schema.ts +401 -0
- package/src/payments/service.ts +445 -0
- package/src/payments/utils.ts +472 -0
- package/src/router/guard.ts +319 -0
- package/src/router/index.ts +2 -0
- package/src/router/schema.ts +458 -0
- package/src/router/service.ts +453 -0
- package/src/tasks/index.ts +11 -0
- package/src/tasks/routes.ts +230 -0
- package/src/tasks/schema.ts +310 -0
- package/src/tasks/service.ts +254 -0
- package/src/tasks/steps.ts +472 -0
- package/src/tasks/utils.ts +445 -0
- package/src/tasks/watcher.ts +307 -0
- package/src/tasks/worker.ts +461 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/schema.ts +69 -0
- package/src/utils/service.ts +461 -0
- package/tests/e2e.test.ts +2531 -0
- package/tsconfig.base.json +12 -0
- package/README.md +0 -2
- package/index.d.ts +0 -1
- 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
|
+
}
|
package/package.json
CHANGED
|
@@ -1,18 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@corgelabs/corge",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Corge
|
|
3
|
+
"version": "1.0.1",
|
|
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
|
-
"
|
|
9
|
-
"corge"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
"
|
|
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
|
+
"prepublishOnly": "npm run check && npm run build"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@ai-sdk/google-vertex": "^5.0.121",
|
|
43
|
+
"@hono/node-server": "^1.19.17",
|
|
44
|
+
"@mistralai/mistralai": "^2.7.0",
|
|
45
|
+
"@modelcontextprotocol/server": "^2.3.1",
|
|
46
|
+
"@typesafe-ai/sdk": "^0.7.0",
|
|
47
|
+
"ai": "^7.0.150",
|
|
48
|
+
"esbuild": "^0.25.0",
|
|
49
|
+
"firebase-admin": "^14.5.0",
|
|
50
|
+
"firebase-functions": "^7.0.0",
|
|
51
|
+
"hono": "^4.13.13",
|
|
52
|
+
"zod": "^4.6.7"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^24.0.0",
|
|
56
|
+
"typescript": "7.0.2"
|
|
57
|
+
},
|
|
58
|
+
"overrides": {
|
|
59
|
+
"body-parser": "^2.4.0",
|
|
60
|
+
"uuid": "^11.1.1",
|
|
61
|
+
"zod": "^4.6.7"
|
|
62
|
+
}
|
|
18
63
|
}
|
package/src/ai/index.ts
ADDED
package/src/ai/schema.ts
ADDED
|
@@ -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.'
|