@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,547 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/builder.ts
4
+ import { existsSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, join, resolve } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { build } from "esbuild";
9
+ var getCorgeRootDir = () => {
10
+ const currentFile = fileURLToPath(import.meta.url);
11
+ const currentDir = dirname(currentFile);
12
+ for (const candidate of [
13
+ resolve(currentDir, "../.."),
14
+ resolve(currentDir, "..")
15
+ ]) {
16
+ if (existsSync(join(candidate, "package.json")) && existsSync(join(candidate, "tsconfig.base.json"))) {
17
+ return candidate;
18
+ }
19
+ }
20
+ return resolve(currentDir, "../..");
21
+ };
22
+ var resolveCorgeEntrypoint = (cwd = process.cwd()) => {
23
+ try {
24
+ const req = createRequire(join(cwd, "package.json"));
25
+ return req.resolve("@corgelabs/corge");
26
+ } catch {
27
+ const root = getCorgeRootDir();
28
+ const distEntry = join(root, "dist/index.js");
29
+ return existsSync(distEntry) ? distEntry : join(root, "src/index.ts");
30
+ }
31
+ };
32
+ var resolveWithExtensions = (basePath) => {
33
+ for (const candidate of [
34
+ basePath,
35
+ `${basePath}.ts`,
36
+ `${basePath}.js`,
37
+ join(basePath, "index.ts"),
38
+ join(basePath, "index.js")
39
+ ]) {
40
+ if (existsSync(candidate)) return candidate;
41
+ }
42
+ return void 0;
43
+ };
44
+ var corgeAliasPlugin = (cwd = process.cwd()) => ({
45
+ name: "corge-alias",
46
+ setup(b) {
47
+ b.onResolve({ filter: /^(@core|@corgelabs\/corge)$/ }, () => ({
48
+ path: resolveCorgeEntrypoint(cwd),
49
+ external: false
50
+ }));
51
+ b.onResolve({ filter: /^@(config|routes|services|utils)\/(.+)$/ }, (args) => {
52
+ const match = /^@(config|routes|services|utils)\/(.+)$/.exec(args.path);
53
+ if (!match) return void 0;
54
+ const [, folder, rest2] = match;
55
+ const target = resolveWithExtensions(join(cwd, "src", folder, rest2));
56
+ if (target) return { path: target, external: false };
57
+ return void 0;
58
+ });
59
+ b.onResolve({ filter: /^@app-entry$/ }, () => {
60
+ const target = resolveWithExtensions(join(cwd, "src/index"));
61
+ if (target) return { path: target, external: false };
62
+ return { path: "corge-fallback-app", namespace: "corge-virtual" };
63
+ });
64
+ b.onLoad({ filter: /.*/, namespace: "corge-virtual" }, () => ({
65
+ contents: [
66
+ "import { core } from '@core'",
67
+ "export const { devApp, app, functions } = core.createApp({})"
68
+ ].join("\n"),
69
+ loader: "ts",
70
+ resolveDir: cwd
71
+ }));
72
+ }
73
+ });
74
+ var buildConsumerApp = async (cwd = process.cwd()) => {
75
+ await build({
76
+ absWorkingDir: cwd,
77
+ entryPoints: ["src/index.ts"],
78
+ bundle: true,
79
+ platform: "node",
80
+ target: "node24",
81
+ format: "cjs",
82
+ packages: "external",
83
+ plugins: [corgeAliasPlugin(cwd)],
84
+ footer: { js: "module.exports = functions;" },
85
+ outfile: "dist/index.cjs",
86
+ sourcemap: true
87
+ });
88
+ };
89
+
90
+ // src/cli/deployer.ts
91
+ import { execSync, spawnSync } from "node:child_process";
92
+ import { existsSync as existsSync2, readFileSync, unlinkSync, writeFileSync } from "node:fs";
93
+ import { join as join2 } from "node:path";
94
+ var mergeFirestoreIndexes = (base, custom) => {
95
+ const seenIndexes = /* @__PURE__ */ new Set();
96
+ const mergedIndexes = [];
97
+ for (const item of [...base.indexes ?? [], ...custom.indexes ?? []]) {
98
+ const key = JSON.stringify(item);
99
+ if (!seenIndexes.has(key)) {
100
+ seenIndexes.add(key);
101
+ mergedIndexes.push(item);
102
+ }
103
+ }
104
+ const seenOverrides = /* @__PURE__ */ new Set();
105
+ const mergedOverrides = [];
106
+ for (const item of [...base.fieldOverrides ?? [], ...custom.fieldOverrides ?? []]) {
107
+ const key = JSON.stringify(item);
108
+ if (!seenOverrides.has(key)) {
109
+ seenOverrides.add(key);
110
+ mergedOverrides.push(item);
111
+ }
112
+ }
113
+ return {
114
+ indexes: mergedIndexes,
115
+ fieldOverrides: mergedOverrides
116
+ };
117
+ };
118
+ var deployConsumerApp = async (target, cwd = process.cwd()) => {
119
+ try {
120
+ process.loadEnvFile(join2(cwd, ".env"));
121
+ } catch {
122
+ }
123
+ if (target !== "prod" && target !== "dev") {
124
+ console.error("Usage: corge deploy <prod|dev>");
125
+ process.exit(1);
126
+ }
127
+ const requiredBranch = target === "prod" ? "main" : "dev";
128
+ const currentBranch = execSync("git rev-parse --abbrev-ref HEAD", { cwd, encoding: "utf8" }).trim();
129
+ if (currentBranch !== requiredBranch) {
130
+ console.error(
131
+ `Deploy blocked: "deploy ${target}" can only run on branch "${requiredBranch}" (current branch: "${currentBranch}").`
132
+ );
133
+ process.exit(1);
134
+ }
135
+ const project = process.env.GCP_PROJECT;
136
+ if (!project) {
137
+ console.error("Missing GCP_PROJECT in .env");
138
+ process.exit(1);
139
+ }
140
+ await buildConsumerApp(cwd);
141
+ const corgeRoot = getCorgeRootDir();
142
+ const firebaseJsonPath = join2(cwd, "firebase.json");
143
+ const pkgJsonPath = join2(cwd, "package.json");
144
+ const firestoreRulesPath = join2(cwd, "firestore.rules");
145
+ const firestoreIndexesPath = join2(cwd, "firestore.indexes.json");
146
+ const storageRulesPath = join2(cwd, "storage.rules");
147
+ const rawFirebaseJson = readFileSync(firebaseJsonPath, "utf8");
148
+ const rawPkgJson = readFileSync(pkgJsonPath, "utf8");
149
+ const hadFirestoreRules = existsSync2(firestoreRulesPath);
150
+ const rawFirestoreRules = hadFirestoreRules ? readFileSync(firestoreRulesPath, "utf8") : null;
151
+ const hadFirestoreIndexes = existsSync2(firestoreIndexesPath);
152
+ const rawFirestoreIndexes = hadFirestoreIndexes ? readFileSync(firestoreIndexesPath, "utf8") : null;
153
+ const hadStorageRules = existsSync2(storageRulesPath);
154
+ const rawStorageRules = hadStorageRules ? readFileSync(storageRulesPath, "utf8") : null;
155
+ const restoreFiles = () => {
156
+ try {
157
+ writeFileSync(firebaseJsonPath, rawFirebaseJson, "utf8");
158
+ } catch {
159
+ }
160
+ try {
161
+ writeFileSync(pkgJsonPath, rawPkgJson, "utf8");
162
+ } catch {
163
+ }
164
+ try {
165
+ if (hadFirestoreRules && rawFirestoreRules !== null) {
166
+ writeFileSync(firestoreRulesPath, rawFirestoreRules, "utf8");
167
+ } else if (!hadFirestoreRules && existsSync2(firestoreRulesPath)) {
168
+ unlinkSync(firestoreRulesPath);
169
+ }
170
+ } catch {
171
+ }
172
+ try {
173
+ if (hadFirestoreIndexes && rawFirestoreIndexes !== null) {
174
+ writeFileSync(firestoreIndexesPath, rawFirestoreIndexes, "utf8");
175
+ } else if (!hadFirestoreIndexes && existsSync2(firestoreIndexesPath)) {
176
+ unlinkSync(firestoreIndexesPath);
177
+ }
178
+ } catch {
179
+ }
180
+ try {
181
+ if (hadStorageRules && rawStorageRules !== null) {
182
+ writeFileSync(storageRulesPath, rawStorageRules, "utf8");
183
+ } else if (!hadStorageRules && existsSync2(storageRulesPath)) {
184
+ unlinkSync(storageRulesPath);
185
+ }
186
+ } catch {
187
+ }
188
+ };
189
+ process.once("SIGINT", () => {
190
+ restoreFiles();
191
+ process.exit(130);
192
+ });
193
+ process.once("SIGTERM", () => {
194
+ restoreFiles();
195
+ process.exit(143);
196
+ });
197
+ try {
198
+ const baseFirestoreRules = readFileSync(join2(corgeRoot, "infra/firestore.base.rules"), "utf8");
199
+ const baseStorageRules = readFileSync(join2(corgeRoot, "infra/storage.base.rules"), "utf8");
200
+ const baseIndexes = JSON.parse(
201
+ readFileSync(join2(corgeRoot, "infra/firestore.base.indexes.json"), "utf8")
202
+ );
203
+ if (!hadFirestoreRules) {
204
+ writeFileSync(firestoreRulesPath, baseFirestoreRules, "utf8");
205
+ }
206
+ if (!hadStorageRules) {
207
+ writeFileSync(storageRulesPath, baseStorageRules, "utf8");
208
+ }
209
+ const customIndexes = hadFirestoreIndexes && rawFirestoreIndexes ? JSON.parse(rawFirestoreIndexes) : {};
210
+ const mergedIndexes = mergeFirestoreIndexes(baseIndexes, customIndexes);
211
+ writeFileSync(firestoreIndexesPath, JSON.stringify(mergedIndexes, null, 2) + "\n", "utf8");
212
+ const cfg = JSON.parse(rawFirebaseJson);
213
+ const prodDb = { database: project, rules: "firestore.rules", indexes: "firestore.indexes.json" };
214
+ const devDb = { database: `${project}-dev`, rules: "firestore.rules", indexes: "firestore.indexes.json" };
215
+ const prodBucket = { bucket: `${project}.firebasestorage.app`, rules: "storage.rules" };
216
+ const devBucket = { bucket: `${project}-dev`, rules: "storage.rules" };
217
+ cfg.firestore = target === "prod" ? [prodDb] : [devDb];
218
+ cfg.storage = target === "prod" ? [prodBucket] : [devBucket];
219
+ writeFileSync(firebaseJsonPath, JSON.stringify(cfg, null, 2) + "\n", "utf8");
220
+ const corgePkg = JSON.parse(readFileSync(join2(corgeRoot, "package.json"), "utf8"));
221
+ const consumerPkg = JSON.parse(rawPkgJson);
222
+ const expandedDeps = { ...corgePkg.dependencies ?? {}, ...consumerPkg.dependencies ?? {} };
223
+ delete expandedDeps["@corgelabs/corge"];
224
+ delete expandedDeps.esbuild;
225
+ consumerPkg.dependencies = expandedDeps;
226
+ writeFileSync(pkgJsonPath, JSON.stringify(consumerPkg, null, 2) + "\n", "utf8");
227
+ const onlyTargets = target === "prod" ? `functions:${project},functions:${project}-tasks,firestore:${project},storage` : `functions:${project}-dev,functions:${project}-tasks-dev,firestore:${project}-dev,storage`;
228
+ const deployRes = spawnSync(
229
+ "npx",
230
+ ["-y", "firebase-tools@latest", "deploy", "-P", project, "--only", onlyTargets],
231
+ { cwd, stdio: "inherit" }
232
+ );
233
+ process.exitCode = deployRes.status ?? 1;
234
+ } finally {
235
+ restoreFiles();
236
+ }
237
+ };
238
+
239
+ // src/cli/dev-server.ts
240
+ import { spawn as spawn2 } from "node:child_process";
241
+ import { mkdirSync } from "node:fs";
242
+ import { join as join4 } from "node:path";
243
+ import { context } from "esbuild";
244
+
245
+ // src/cli/env.ts
246
+ import { spawn } from "node:child_process";
247
+ import { existsSync as existsSync3, readFileSync as readFileSync2 } from "node:fs";
248
+ import { join as join3 } from "node:path";
249
+ import { parseEnv } from "node:util";
250
+ import { applicationDefault } from "firebase-admin/app";
251
+ var hasValue = (value) => value != null && value.length > 0;
252
+ var readDotEnv = (cwd = process.cwd()) => {
253
+ const envPath = join3(cwd, ".env");
254
+ return existsSync3(envPath) ? parseEnv(readFileSync2(envPath, "utf8")) : {};
255
+ };
256
+ var getSecretText = async (projectId, accessToken, secretName) => {
257
+ const url = `https://secretmanager.googleapis.com/v1/projects/${projectId}/secrets/${secretName}/versions/latest:access`;
258
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${accessToken}` } });
259
+ const data = await res.json();
260
+ if (!res.ok || !data.payload?.data) {
261
+ throw new Error(`Secret is empty or not defined: ${secretName} (${data.error?.message ?? res.status})`);
262
+ }
263
+ return Buffer.from(data.payload.data, "base64").toString("utf8");
264
+ };
265
+ var getSecrets = async (secretNames, cwd = process.cwd()) => {
266
+ const dotEnv = readDotEnv(cwd);
267
+ const merged = {};
268
+ for (const [key, value] of Object.entries(dotEnv)) {
269
+ if (hasValue(process.env[key])) {
270
+ merged[key] = process.env[key];
271
+ } else if (hasValue(value)) {
272
+ merged[key] = value;
273
+ }
274
+ }
275
+ const projectId = merged.GCP_PROJECT || process.env.GCP_PROJECT;
276
+ const keysToResolve = secretNames && secretNames.length > 0 ? secretNames.filter((name) => !hasValue(merged[name]) && !hasValue(process.env[name])) : Object.entries(dotEnv).filter(([key, value]) => !hasValue(value) && !hasValue(process.env[key])).map(([key]) => key);
277
+ if (keysToResolve.length > 0 && projectId) {
278
+ const { access_token } = await applicationDefault().getAccessToken();
279
+ if (!access_token) throw new Error("Failed to obtain GCP Application Default Credentials access token");
280
+ const resolved = await Promise.all(
281
+ keysToResolve.map(
282
+ async (secretName) => [secretName, await getSecretText(projectId, access_token, secretName)]
283
+ )
284
+ );
285
+ for (const [key, value] of resolved) {
286
+ merged[key] = value;
287
+ }
288
+ }
289
+ return merged;
290
+ };
291
+ var loadGcpSecrets = async (secretNames, cwd = process.cwd()) => {
292
+ const env = await getSecrets(secretNames, cwd);
293
+ for (const [k, v] of Object.entries(env)) {
294
+ if (!hasValue(process.env[k])) process.env[k] = v;
295
+ }
296
+ return env;
297
+ };
298
+ var runWithGcpEnv = async (cmd, secretNames, cwd = process.cwd()) => {
299
+ const env = await getSecrets(secretNames, cwd);
300
+ return new Promise((resolve3, reject) => {
301
+ const child = spawn(cmd[0], cmd.slice(1), {
302
+ cwd,
303
+ env: { ...process.env, ...env },
304
+ stdio: "inherit"
305
+ });
306
+ child.on("error", reject);
307
+ child.on("close", (code) => resolve3(code ?? 1));
308
+ });
309
+ };
310
+
311
+ // src/cli/dev-server.ts
312
+ var devBootstrapPlugin = (cwd) => ({
313
+ name: "corge-dev-bootstrap",
314
+ setup(b) {
315
+ b.onResolve({ filter: /^virtual:corge-dev-entry$/ }, () => ({
316
+ path: "virtual:corge-dev-entry",
317
+ namespace: "corge-dev"
318
+ }));
319
+ b.onLoad({ filter: /^virtual:corge-dev-entry$/, namespace: "corge-dev" }, () => ({
320
+ contents: [
321
+ "import { EventEmitter } from 'node:events'",
322
+ "import { serve } from '@hono/node-server'",
323
+ "import { devApp } from './src/index'",
324
+ "EventEmitter.defaultMaxListeners = 100",
325
+ "const port = Number(process.env.PORT ?? 8080)",
326
+ "serve({ fetch: devApp.fetch, port })"
327
+ ].join("\n"),
328
+ loader: "ts",
329
+ resolveDir: cwd
330
+ }));
331
+ }
332
+ });
333
+ var runDevServer = async (cwd = process.cwd()) => {
334
+ await loadGcpSecrets(void 0, cwd);
335
+ const outDir = join4(cwd, ".corge");
336
+ mkdirSync(outDir, { recursive: true });
337
+ const outFile = join4(outDir, "dev.js");
338
+ const ctx = await context({
339
+ absWorkingDir: cwd,
340
+ entryPoints: ["virtual:corge-dev-entry"],
341
+ bundle: true,
342
+ platform: "node",
343
+ target: "node24",
344
+ format: "esm",
345
+ packages: "external",
346
+ plugins: [devBootstrapPlugin(cwd), corgeAliasPlugin(cwd)],
347
+ outfile: outFile,
348
+ sourcemap: true
349
+ });
350
+ await ctx.watch();
351
+ const child = spawn2(process.execPath, ["--watch", outFile], {
352
+ cwd,
353
+ env: process.env,
354
+ stdio: "inherit"
355
+ });
356
+ const cleanup = async (code) => {
357
+ try {
358
+ child.kill("SIGTERM");
359
+ await ctx.dispose();
360
+ } catch {
361
+ }
362
+ process.exit(code);
363
+ };
364
+ process.once("SIGINT", () => void cleanup(130));
365
+ process.once("SIGTERM", () => void cleanup(143));
366
+ await new Promise((resolve3, reject) => {
367
+ child.on("error", reject);
368
+ child.on("close", async (code) => {
369
+ await ctx.dispose();
370
+ process.exitCode = code ?? 0;
371
+ resolve3();
372
+ });
373
+ });
374
+ };
375
+
376
+ // src/cli/init.ts
377
+ import { spawnSync as spawnSync2 } from "node:child_process";
378
+ import { existsSync as existsSync4, mkdirSync as mkdirSync2, rmSync, symlinkSync, writeFileSync as writeFileSync2 } from "node:fs";
379
+ import { dirname as dirname2, join as join5, resolve as resolve2 } from "node:path";
380
+ import { build as build2 } from "esbuild";
381
+ var runTypeCheck = (cwd = process.cwd()) => {
382
+ const res = spawnSync2("npx", ["tsc", "--noEmit"], { cwd, stdio: "inherit" });
383
+ process.exitCode = res.status ?? 1;
384
+ };
385
+ var runTestSuite = async (testFile, cwd = process.cwd()) => {
386
+ await loadGcpSecrets(void 0, cwd);
387
+ const corgeRoot = getCorgeRootDir();
388
+ const outDir = join5(cwd, ".corge");
389
+ mkdirSync2(outDir, { recursive: true });
390
+ const outFile = join5(outDir, "test.js");
391
+ const resolvedEntry = (() => {
392
+ if (testFile) return resolve2(cwd, testFile);
393
+ const localTest = join5(cwd, "tests/e2e.test.ts");
394
+ if (existsSync4(localTest)) return localTest;
395
+ return join5(corgeRoot, "tests/e2e.test.ts");
396
+ })();
397
+ await build2({
398
+ absWorkingDir: cwd,
399
+ entryPoints: [resolvedEntry],
400
+ bundle: true,
401
+ platform: "node",
402
+ target: "node24",
403
+ format: "esm",
404
+ packages: "external",
405
+ plugins: [corgeAliasPlugin(cwd)],
406
+ outfile: outFile,
407
+ sourcemap: true
408
+ });
409
+ const res = spawnSync2(process.execPath, ["--test", outFile], {
410
+ cwd,
411
+ env: process.env,
412
+ stdio: "inherit"
413
+ });
414
+ process.exitCode = res.status ?? 1;
415
+ };
416
+ var linkCorge = (targetPath = "/Users/nikdelvin/corgelabs/corge", cwd = process.cwd()) => {
417
+ const resolvedTarget = resolve2(cwd, targetPath);
418
+ const linkDest = join5(cwd, "node_modules/@corgelabs/corge");
419
+ mkdirSync2(dirname2(linkDest), { recursive: true });
420
+ rmSync(linkDest, { recursive: true, force: true });
421
+ symlinkSync(resolvedTarget, linkDest, "dir");
422
+ console.log(`Linked ${linkDest} -> ${resolvedTarget}`);
423
+ };
424
+ var unlinkCorge = (cwd = process.cwd()) => {
425
+ const linkDest = join5(cwd, "node_modules/@corgelabs/corge");
426
+ rmSync(linkDest, { recursive: true, force: true });
427
+ const res = spawnSync2("npm", ["install", "@corgelabs/corge@latest"], { cwd, stdio: "inherit" });
428
+ process.exitCode = res.status ?? 1;
429
+ };
430
+ var initConsumerProject = (cwd = process.cwd()) => {
431
+ mkdirSync2(join5(cwd, "src/config"), { recursive: true });
432
+ mkdirSync2(join5(cwd, "src/routes"), { recursive: true });
433
+ mkdirSync2(join5(cwd, "src/services"), { recursive: true });
434
+ mkdirSync2(join5(cwd, "src/context"), { recursive: true });
435
+ const writeIfMissing = (relPath, content) => {
436
+ const full = join5(cwd, relPath);
437
+ if (!existsSync4(full)) {
438
+ writeFileSync2(full, content, "utf8");
439
+ console.log(`Created ${relPath}`);
440
+ }
441
+ };
442
+ writeIfMissing(
443
+ "tsconfig.json",
444
+ JSON.stringify(
445
+ {
446
+ extends: "@corgelabs/corge/tsconfig.base.json",
447
+ compilerOptions: {
448
+ paths: {
449
+ "@core": ["./node_modules/@corgelabs/corge/dist/index.d.ts"],
450
+ "@routes/*": ["./src/routes/*"],
451
+ "@services/*": ["./src/services/*"],
452
+ "@utils/*": ["./src/utils/*"],
453
+ "@config/*": ["./src/config/*"]
454
+ }
455
+ },
456
+ include: ["src/**/*.ts"]
457
+ },
458
+ null,
459
+ 2
460
+ ) + "\n"
461
+ );
462
+ writeIfMissing(
463
+ "src/index.ts",
464
+ [
465
+ "import { core } from '@core'",
466
+ "",
467
+ "export const coreApp = core.createApp({})",
468
+ "",
469
+ "export const {",
470
+ " createApp,",
471
+ " app,",
472
+ " devApp,",
473
+ " workflowRegistry,",
474
+ " httpHandler,",
475
+ " devHttpHandler,",
476
+ " tasksHandler,",
477
+ " devTasksHandler,",
478
+ " functions",
479
+ "} = coreApp",
480
+ ""
481
+ ].join("\n")
482
+ );
483
+ writeIfMissing(
484
+ ".gitignore",
485
+ ["node_modules/", "dist/", ".corge/", ".env", "*.local", "firebase-debug.log", ".DS_Store", ""].join("\n")
486
+ );
487
+ };
488
+
489
+ // bin/corge.ts
490
+ var [command, ...rest] = process.argv.slice(2);
491
+ switch (command) {
492
+ case "dev":
493
+ await runDevServer();
494
+ break;
495
+ case "build":
496
+ await buildConsumerApp();
497
+ break;
498
+ case "deploy":
499
+ await deployConsumerApp(rest[0]);
500
+ break;
501
+ case "test":
502
+ case "test:chaos":
503
+ await runTestSuite(rest[0]);
504
+ break;
505
+ case "check":
506
+ runTypeCheck();
507
+ break;
508
+ case "init":
509
+ initConsumerProject();
510
+ break;
511
+ case "link":
512
+ linkCorge(rest[0]);
513
+ break;
514
+ case "unlink":
515
+ unlinkCorge();
516
+ break;
517
+ case "env": {
518
+ const sep = rest.indexOf("--");
519
+ const secrets = sep === -1 ? [] : rest.slice(0, sep);
520
+ const cmd = sep === -1 ? rest : rest.slice(sep + 1);
521
+ if (cmd.length === 0) {
522
+ console.error("Usage: corge env [SECRET_NAMES...] -- <command...>");
523
+ process.exit(1);
524
+ }
525
+ process.exit(await runWithGcpEnv(cmd, secrets));
526
+ break;
527
+ }
528
+ default:
529
+ console.log(
530
+ [
531
+ "Corge CLI (@corgelabs/corge)",
532
+ "",
533
+ "Commands:",
534
+ " corge dev Start local Hono dev server with GCP Secret Manager + watch mode",
535
+ " corge build Bundle src/index.ts + @corgelabs/corge into dist/index.cjs",
536
+ " corge deploy <prod|dev> Build, merge base rules/indexes, and deploy to Firebase",
537
+ " corge test [file] Bundle and execute E2E contract test suite",
538
+ " corge check Run tsc --noEmit in workspace",
539
+ " corge init Scaffold consumer project structure",
540
+ " corge link [path] Link local corgelabs/corge checkout into node_modules",
541
+ " corge unlink Restore published @corgelabs/corge from npm"
542
+ ].join("\n")
543
+ );
544
+ if (command && command !== "--help" && command !== "-h") {
545
+ process.exit(1);
546
+ }
547
+ }
@@ -0,0 +1,10 @@
1
+ import { Core } from '../index';
2
+ import type { ContextEntry, ContextItemSpec, GetContextOptions, HybridRetrievalOptions, HybridRetrievalResult } from './schema';
3
+ export declare class ChatContextEngine {
4
+ #private;
5
+ constructor(coreClient: Core);
6
+ registerContextCatalog: (items?: readonly ContextItemSpec[], reset?: boolean) => void;
7
+ getContext: (prompt: string, catalog?: readonly ContextItemSpec[], options?: GetContextOptions) => Promise<ContextEntry[]>;
8
+ retrieveContext: (opts: HybridRetrievalOptions) => Promise<HybridRetrievalResult>;
9
+ }
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/chat/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,KAAK,EAIV,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EAItB,MAAM,UAAU,CAAA;AAajB,qBAAa,iBAAiB;;IAG5B,YAAY,UAAU,EAAE,IAAI,EAE3B;IAED,sBAAsB,WAAW,SAAS,eAAe,EAAE,sBAAuB,IAAI,CAMrF;IAqBD,UAAU,WACA,MAAM,YACL,SAAS,eAAe,EAAE,YACzB,iBAAiB,KAC1B,OAAO,CAAC,YAAY,EAAE,CAAC,CAsDzB;IA8GD,eAAe,SAAgB,sBAAsB,KAAG,OAAO,CAAC,qBAAqB,CAAC,CAyErF;CACF"}