gemi 0.157.0 → 0.160.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.
Files changed (251) hide show
  1. package/dist/ai/Agent.d.ts +231 -55
  2. package/dist/ai/Agent.d.ts.map +1 -1
  3. package/dist/ai/AgentController.d.ts +45 -11
  4. package/dist/ai/AgentController.d.ts.map +1 -1
  5. package/dist/ai/eval/Eval.d.ts +15 -14
  6. package/dist/ai/eval/Eval.d.ts.map +1 -1
  7. package/dist/ai/generate.d.ts +165 -7
  8. package/dist/ai/generate.d.ts.map +1 -1
  9. package/dist/ai/index.d.ts +5 -5
  10. package/dist/ai/index.d.ts.map +1 -1
  11. package/dist/ai/index.js +11 -11
  12. package/dist/ai/index.js.map +4 -4
  13. package/dist/ai/usageMeter.d.ts +149 -6
  14. package/dist/ai/usageMeter.d.ts.map +1 -1
  15. package/dist/app/index.js +1 -1
  16. package/dist/bin/gemi.js +178 -121
  17. package/dist/bin/gemi.js.map +5 -4
  18. package/dist/bun/plugin.js +1 -1
  19. package/dist/bun/preload.js +1 -1
  20. package/dist/{chunk-0v3bca8k.js → chunk-0b8m1f07.js} +3 -3
  21. package/dist/{chunk-0v3bca8k.js.map → chunk-0b8m1f07.js.map} +1 -1
  22. package/dist/{chunk-zv9d6jkj.js → chunk-0gazmssx.js} +2 -2
  23. package/dist/{chunk-zv9d6jkj.js.map → chunk-0gazmssx.js.map} +1 -1
  24. package/dist/{chunk-xff7tkde.js → chunk-0qernzn1.js} +2 -2
  25. package/dist/{chunk-xff7tkde.js.map → chunk-0qernzn1.js.map} +1 -1
  26. package/dist/chunk-0qrbspbe.js +5 -0
  27. package/dist/{chunk-6np1r9gk.js.map → chunk-0qrbspbe.js.map} +1 -1
  28. package/dist/{chunk-517fjfme.js → chunk-0vb4j7cx.js} +3 -3
  29. package/dist/{chunk-517fjfme.js.map → chunk-0vb4j7cx.js.map} +1 -1
  30. package/dist/{chunk-0yjm936b.js → chunk-191gkynh.js} +3 -3
  31. package/dist/{chunk-0yjm936b.js.map → chunk-191gkynh.js.map} +1 -1
  32. package/dist/chunk-1xxh48bd.js +4 -0
  33. package/dist/{chunk-cmt3jw6j.js.map → chunk-1xxh48bd.js.map} +2 -2
  34. package/dist/chunk-27habdva.js +4 -0
  35. package/dist/{chunk-3ndc8adc.js.map → chunk-27habdva.js.map} +2 -2
  36. package/dist/{chunk-qvngsa1c.js → chunk-2ednvght.js} +2 -2
  37. package/dist/{chunk-qvngsa1c.js.map → chunk-2ednvght.js.map} +1 -1
  38. package/dist/chunk-3cvza61a.js +4 -0
  39. package/dist/{chunk-pw5h5935.js.map → chunk-3cvza61a.js.map} +2 -2
  40. package/dist/{chunk-1de3awrh.js → chunk-3d8jxky6.js} +3 -3
  41. package/dist/{chunk-1de3awrh.js.map → chunk-3d8jxky6.js.map} +1 -1
  42. package/dist/chunk-3vmc6adw.js +4 -0
  43. package/dist/{chunk-z7224rhm.js.map → chunk-3vmc6adw.js.map} +2 -2
  44. package/dist/chunk-44ensgdq.js +10 -0
  45. package/dist/{chunk-set6qmjw.js.map → chunk-44ensgdq.js.map} +3 -3
  46. package/dist/{chunk-7yww9aq7.js → chunk-4670xxae.js} +2 -2
  47. package/dist/{chunk-7yww9aq7.js.map → chunk-4670xxae.js.map} +1 -1
  48. package/dist/{chunk-xtqd9vpp.js → chunk-4vqnv41y.js} +2 -2
  49. package/dist/{chunk-xtqd9vpp.js.map → chunk-4vqnv41y.js.map} +1 -1
  50. package/dist/{chunk-exb35whf.js → chunk-4ye6p5yk.js} +2 -2
  51. package/dist/{chunk-exb35whf.js.map → chunk-4ye6p5yk.js.map} +1 -1
  52. package/dist/{chunk-9md6acv2.js → chunk-57qnqcrp.js} +1 -1
  53. package/dist/{chunk-zcg6m7gf.js → chunk-5c6dfy75.js} +2 -2
  54. package/dist/{chunk-zcg6m7gf.js.map → chunk-5c6dfy75.js.map} +1 -1
  55. package/dist/{chunk-t7yt8egz.js → chunk-5pc21syf.js} +3 -3
  56. package/dist/{chunk-t7yt8egz.js.map → chunk-5pc21syf.js.map} +1 -1
  57. package/dist/{chunk-5zxxd7qp.js → chunk-5qzxyj68.js} +1 -1
  58. package/dist/{chunk-pgdxqrjv.js → chunk-664ewdjv.js} +4 -4
  59. package/dist/{chunk-pgdxqrjv.js.map → chunk-664ewdjv.js.map} +2 -2
  60. package/dist/chunk-6d6p0q3p.js +5 -0
  61. package/dist/{chunk-7zy6nq9e.js.map → chunk-6d6p0q3p.js.map} +2 -2
  62. package/dist/{chunk-k1aw97dm.js → chunk-6ytezxzj.js} +2 -2
  63. package/dist/{chunk-78wht1ph.js.map → chunk-6ytezxzj.js.map} +1 -1
  64. package/dist/{chunk-00z7s34q.js → chunk-79nypedr.js} +2 -2
  65. package/dist/{chunk-00z7s34q.js.map → chunk-79nypedr.js.map} +1 -1
  66. package/dist/{chunk-4vnrnbn3.js → chunk-7bc9ypbk.js} +3 -3
  67. package/dist/{chunk-4vnrnbn3.js.map → chunk-7bc9ypbk.js.map} +1 -1
  68. package/dist/{chunk-wg0ttent.js → chunk-7rfw4h2x.js} +3 -3
  69. package/dist/{chunk-wg0ttent.js.map → chunk-7rfw4h2x.js.map} +1 -1
  70. package/dist/{chunk-rrz2ry81.js → chunk-8m3m5hcf.js} +2 -2
  71. package/dist/{chunk-rrz2ry81.js.map → chunk-8m3m5hcf.js.map} +1 -1
  72. package/dist/{chunk-aq5zx3vg.js → chunk-8tyw6faf.js} +2 -2
  73. package/dist/{chunk-aq5zx3vg.js.map → chunk-8tyw6faf.js.map} +1 -1
  74. package/dist/{chunk-p83cjehh.js → chunk-8z29qvvm.js} +3 -3
  75. package/dist/{chunk-p83cjehh.js.map → chunk-8z29qvvm.js.map} +1 -1
  76. package/dist/{chunk-dhq7zv0t.js → chunk-982x8jps.js} +2 -2
  77. package/dist/{chunk-dhq7zv0t.js.map → chunk-982x8jps.js.map} +1 -1
  78. package/dist/{chunk-38kjpa6q.js → chunk-98byy5m4.js} +1 -1
  79. package/dist/{chunk-986eh0n3.js → chunk-9983zmhx.js} +2 -2
  80. package/dist/{chunk-986eh0n3.js.map → chunk-9983zmhx.js.map} +1 -1
  81. package/dist/{chunk-r5y2khw4.js → chunk-9f2ps5v2.js} +2 -2
  82. package/dist/{chunk-r5y2khw4.js.map → chunk-9f2ps5v2.js.map} +1 -1
  83. package/dist/{chunk-q3e1bqrs.js → chunk-bfj2jafb.js} +3 -3
  84. package/dist/{chunk-q3e1bqrs.js.map → chunk-bfj2jafb.js.map} +1 -1
  85. package/dist/{chunk-0vc2akg0.js → chunk-bqxt1she.js} +1 -1
  86. package/dist/{chunk-159j20yr.js → chunk-bzcfw8qd.js} +2 -2
  87. package/dist/{chunk-159j20yr.js.map → chunk-bzcfw8qd.js.map} +1 -1
  88. package/dist/{chunk-jr9qerbr.js → chunk-cb873vjm.js} +2 -2
  89. package/dist/{chunk-jr9qerbr.js.map → chunk-cb873vjm.js.map} +1 -1
  90. package/dist/{chunk-x82f3q6a.js → chunk-cq16azbw.js} +4 -4
  91. package/dist/{chunk-x82f3q6a.js.map → chunk-cq16azbw.js.map} +1 -1
  92. package/dist/{chunk-72f6pbap.js → chunk-csvffxjh.js} +2 -2
  93. package/dist/{chunk-72f6pbap.js.map → chunk-csvffxjh.js.map} +1 -1
  94. package/dist/chunk-ctrmztan.js +4 -0
  95. package/dist/{chunk-42646nt7.js.map → chunk-ctrmztan.js.map} +2 -2
  96. package/dist/{chunk-4t2j3zcg.js → chunk-d249m2ct.js} +2 -2
  97. package/dist/{chunk-4t2j3zcg.js.map → chunk-d249m2ct.js.map} +2 -2
  98. package/dist/{chunk-h3gcxf2k.js → chunk-day21sfa.js} +3 -3
  99. package/dist/{chunk-h3gcxf2k.js.map → chunk-day21sfa.js.map} +1 -1
  100. package/dist/chunk-dvwfhc5n.js +117 -0
  101. package/dist/{chunk-t66ex43f.js.map → chunk-dvwfhc5n.js.map} +10 -9
  102. package/dist/{chunk-78wht1ph.js → chunk-egwz89ze.js} +2 -2
  103. package/dist/{chunk-k1aw97dm.js.map → chunk-egwz89ze.js.map} +1 -1
  104. package/dist/chunk-fcjjd162.js +4 -0
  105. package/dist/{chunk-jrv31jp9.js.map → chunk-fcjjd162.js.map} +2 -2
  106. package/dist/{chunk-rtv4ax8z.js → chunk-g71ppv6x.js} +2 -2
  107. package/dist/{chunk-rtv4ax8z.js.map → chunk-g71ppv6x.js.map} +1 -1
  108. package/dist/{chunk-56a3vnrj.js → chunk-gmeeyg19.js} +3 -3
  109. package/dist/{chunk-56a3vnrj.js.map → chunk-gmeeyg19.js.map} +1 -1
  110. package/dist/{chunk-yzsyg1f7.js → chunk-j144nwvh.js} +3 -3
  111. package/dist/{chunk-yzsyg1f7.js.map → chunk-j144nwvh.js.map} +1 -1
  112. package/dist/{chunk-q7k2hc45.js → chunk-jarsydtr.js} +3 -3
  113. package/dist/{chunk-q7k2hc45.js.map → chunk-jarsydtr.js.map} +1 -1
  114. package/dist/chunk-k43m5dvs.js +4 -0
  115. package/dist/{chunk-69c2s43a.js.map → chunk-k43m5dvs.js.map} +2 -2
  116. package/dist/chunk-kan3yz82.js +5 -0
  117. package/dist/{chunk-3t4nw1n2.js.map → chunk-kan3yz82.js.map} +2 -2
  118. package/dist/{chunk-ah2jy1vx.js → chunk-m4pkbndk.js} +2 -2
  119. package/dist/{chunk-ah2jy1vx.js.map → chunk-m4pkbndk.js.map} +1 -1
  120. package/dist/{chunk-fe12f946.js → chunk-m73mjzeh.js} +2 -2
  121. package/dist/{chunk-fe12f946.js.map → chunk-m73mjzeh.js.map} +1 -1
  122. package/dist/{chunk-9gt9qdge.js → chunk-m8a80sgn.js} +1 -1
  123. package/dist/chunk-mn9v157z.js +6 -0
  124. package/dist/{chunk-ks9t82g0.js.map → chunk-mn9v157z.js.map} +2 -2
  125. package/dist/{chunk-px3ctjxh.js → chunk-msxhf3m6.js} +2 -2
  126. package/dist/{chunk-px3ctjxh.js.map → chunk-msxhf3m6.js.map} +1 -1
  127. package/dist/chunk-p6nkfcn1.js +5 -0
  128. package/dist/{chunk-kwc68y45.js.map → chunk-p6nkfcn1.js.map} +2 -2
  129. package/dist/{chunk-ss3yn4g2.js → chunk-p9syxzxh.js} +3 -3
  130. package/dist/{chunk-ss3yn4g2.js.map → chunk-p9syxzxh.js.map} +1 -1
  131. package/dist/{chunk-yewj83ez.js → chunk-pyyhmeg1.js} +3 -3
  132. package/dist/{chunk-yewj83ez.js.map → chunk-pyyhmeg1.js.map} +1 -1
  133. package/dist/{chunk-nvhbkqmd.js → chunk-qbsk0jr8.js} +2 -2
  134. package/dist/{chunk-nvhbkqmd.js.map → chunk-qbsk0jr8.js.map} +1 -1
  135. package/dist/{chunk-g5d62d1n.js → chunk-qsbtqh47.js} +2 -2
  136. package/dist/{chunk-g5d62d1n.js.map → chunk-qsbtqh47.js.map} +1 -1
  137. package/dist/{chunk-wnjvfmqc.js → chunk-qz9n2e59.js} +3 -3
  138. package/dist/{chunk-wnjvfmqc.js.map → chunk-qz9n2e59.js.map} +1 -1
  139. package/dist/{chunk-qbvm5q1g.js → chunk-rq3wrwfa.js} +1 -1
  140. package/dist/{chunk-8eyxj78g.js → chunk-ryq2ezgt.js} +3 -3
  141. package/dist/{chunk-8eyxj78g.js.map → chunk-ryq2ezgt.js.map} +1 -1
  142. package/dist/{chunk-v10xzpqs.js → chunk-s0xwqcrf.js} +2 -2
  143. package/dist/{chunk-v10xzpqs.js.map → chunk-s0xwqcrf.js.map} +1 -1
  144. package/dist/{chunk-kbdt84xg.js → chunk-szdbsmq7.js} +2 -2
  145. package/dist/{chunk-kbdt84xg.js.map → chunk-szdbsmq7.js.map} +1 -1
  146. package/dist/{chunk-n95dppzm.js → chunk-tsbxdz4h.js} +2 -2
  147. package/dist/{chunk-n95dppzm.js.map → chunk-tsbxdz4h.js.map} +1 -1
  148. package/dist/chunk-ttvzfwqw.js +41 -0
  149. package/dist/chunk-ttvzfwqw.js.map +28 -0
  150. package/dist/chunk-v0gjdknx.js +4 -0
  151. package/dist/{chunk-7426gfgw.js.map → chunk-v0gjdknx.js.map} +2 -2
  152. package/dist/chunk-v8fx4vgq.js +4 -0
  153. package/dist/{chunk-zfbqgzwa.js.map → chunk-v8fx4vgq.js.map} +2 -2
  154. package/dist/{chunk-dce3w52r.js → chunk-vb73ddwz.js} +3 -3
  155. package/dist/{chunk-dce3w52r.js.map → chunk-vb73ddwz.js.map} +1 -1
  156. package/dist/{chunk-xyyq577r.js → chunk-w0rfypzx.js} +2 -2
  157. package/dist/{chunk-xyyq577r.js.map → chunk-w0rfypzx.js.map} +1 -1
  158. package/dist/{chunk-tr8se94g.js → chunk-weyv3zrt.js} +3 -3
  159. package/dist/{chunk-tr8se94g.js.map → chunk-weyv3zrt.js.map} +1 -1
  160. package/dist/{chunk-9kyfaeey.js → chunk-wtddr3vs.js} +2 -2
  161. package/dist/{chunk-9kyfaeey.js.map → chunk-wtddr3vs.js.map} +1 -1
  162. package/dist/{chunk-tzheb6ak.js → chunk-xp7x27n8.js} +3 -3
  163. package/dist/{chunk-tzheb6ak.js.map → chunk-xp7x27n8.js.map} +1 -1
  164. package/dist/{chunk-ycn7w2e9.js → chunk-yzw2tvqq.js} +2 -2
  165. package/dist/{chunk-ycn7w2e9.js.map → chunk-yzw2tvqq.js.map} +1 -1
  166. package/dist/{chunk-wbv6218d.js → chunk-zz2n9pa5.js} +3 -3
  167. package/dist/{chunk-wbv6218d.js.map → chunk-zz2n9pa5.js.map} +1 -1
  168. package/dist/client/index.js +1 -1
  169. package/dist/client/index.js.map +1 -1
  170. package/dist/config/index.js +1 -1
  171. package/dist/console/run.js +2 -2
  172. package/dist/console/run.js.map +1 -1
  173. package/dist/container/index.js +2 -2
  174. package/dist/container/index.js.map +1 -1
  175. package/dist/database/index.js +2 -2
  176. package/dist/database/index.js.map +1 -1
  177. package/dist/email/index.js +2 -2
  178. package/dist/email/index.js.map +1 -1
  179. package/dist/facades/index.js +2 -2
  180. package/dist/facades/index.js.map +1 -1
  181. package/dist/foundation/index.js +2 -2
  182. package/dist/foundation/index.js.map +1 -1
  183. package/dist/http/ApiRouter.d.ts.map +1 -1
  184. package/dist/http/McpRouter.d.ts +203 -6
  185. package/dist/http/McpRouter.d.ts.map +1 -1
  186. package/dist/http/index.d.ts +1 -1
  187. package/dist/http/index.d.ts.map +1 -1
  188. package/dist/http/index.js +2 -2
  189. package/dist/http/index.js.map +1 -1
  190. package/dist/i18n/dictionaryRuntime.js +2 -2
  191. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  192. package/dist/i18n/index.js +2 -2
  193. package/dist/i18n/index.js.map +1 -1
  194. package/dist/kernel/index.js +2 -2
  195. package/dist/kernel/index.js.map +1 -1
  196. package/dist/orm/index.js +2 -2
  197. package/dist/orm/index.js.map +1 -1
  198. package/dist/probe/index.d.ts +79 -0
  199. package/dist/probe/index.d.ts.map +1 -0
  200. package/dist/probe/index.js +8 -0
  201. package/dist/probe/index.js.map +10 -0
  202. package/dist/server/index.js +2 -2
  203. package/dist/server/index.js.map +1 -1
  204. package/dist/services/image-optimization/ImageManager.d.ts +3 -0
  205. package/dist/services/image-optimization/ImageManager.d.ts.map +1 -1
  206. package/dist/services/image-optimization/config.d.ts +12 -0
  207. package/dist/services/image-optimization/config.d.ts.map +1 -1
  208. package/dist/services/image-optimization/fetchSourceImage.d.ts +37 -0
  209. package/dist/services/image-optimization/fetchSourceImage.d.ts.map +1 -0
  210. package/dist/services/index.d.ts +1 -1
  211. package/dist/services/index.d.ts.map +1 -1
  212. package/dist/services/index.js +9 -9
  213. package/dist/services/index.js.map +3 -3
  214. package/dist/services/mcp/McpRegistry.d.ts.map +1 -1
  215. package/dist/services/queue/work.js +2 -2
  216. package/dist/services/queue/work.js.map +1 -1
  217. package/dist/services/rate-limiter/drivers/RedisRateLimiterDriver.d.ts +95 -13
  218. package/dist/services/rate-limiter/drivers/RedisRateLimiterDriver.d.ts.map +1 -1
  219. package/dist/services/router/ApiRouteDispatcher.d.ts +12 -0
  220. package/dist/services/router/ApiRouteDispatcher.d.ts.map +1 -1
  221. package/dist/services/router/createFlatApiRoutes.d.ts +10 -0
  222. package/dist/services/router/createFlatApiRoutes.d.ts.map +1 -1
  223. package/dist/stats/route-table.js +1 -1
  224. package/dist/support/index.js +2 -2
  225. package/dist/support/index.js.map +1 -1
  226. package/dist/vitest/index.js +1 -1
  227. package/package.json +2 -1
  228. package/dist/chunk-3ndc8adc.js +0 -4
  229. package/dist/chunk-3t4nw1n2.js +0 -5
  230. package/dist/chunk-42646nt7.js +0 -4
  231. package/dist/chunk-69c2s43a.js +0 -4
  232. package/dist/chunk-6np1r9gk.js +0 -5
  233. package/dist/chunk-7426gfgw.js +0 -4
  234. package/dist/chunk-7zy6nq9e.js +0 -5
  235. package/dist/chunk-cmt3jw6j.js +0 -4
  236. package/dist/chunk-jrv31jp9.js +0 -4
  237. package/dist/chunk-ks9t82g0.js +0 -6
  238. package/dist/chunk-kwc68y45.js +0 -5
  239. package/dist/chunk-pw5h5935.js +0 -4
  240. package/dist/chunk-set6qmjw.js +0 -10
  241. package/dist/chunk-t66ex43f.js +0 -117
  242. package/dist/chunk-xp5axyb5.js +0 -30
  243. package/dist/chunk-xp5axyb5.js.map +0 -28
  244. package/dist/chunk-z7224rhm.js +0 -4
  245. package/dist/chunk-zfbqgzwa.js +0 -4
  246. /package/dist/{chunk-9md6acv2.js.map → chunk-57qnqcrp.js.map} +0 -0
  247. /package/dist/{chunk-5zxxd7qp.js.map → chunk-5qzxyj68.js.map} +0 -0
  248. /package/dist/{chunk-38kjpa6q.js.map → chunk-98byy5m4.js.map} +0 -0
  249. /package/dist/{chunk-0vc2akg0.js.map → chunk-bqxt1she.js.map} +0 -0
  250. /package/dist/{chunk-9gt9qdge.js.map → chunk-m8a80sgn.js.map} +0 -0
  251. /package/dist/{chunk-qbvm5q1g.js.map → chunk-rq3wrwfa.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  // @bun
2
2
  function E(z){return z}function f(){return{url:process.env.DATABASE_URL,dialect:void 0,options:void 0,slowTransactionThreshold:b,connections:void 0}}var b=2000;class Q extends Error{constructor(z){super(`Could not infer a database dialect from "${z}". Expected a URL starting with postgres://, postgresql://, mysql://, mariadb://, `+"sqlite://, or file: \u2014 or a SQLite path such as ./dev.db or :memory:.");this.name="UnknownDatabaseUrlError"}}class j extends Error{constructor(z){super(z===void 0||z==="default"?"No database URL configured. Set the DATABASE_URL environment variable, or set `url` in app/config/database.ts.":`The "${z}" database connection has no \`url\`. Set one under \`connections.${z}\` in app/config/database.ts.`);this.name="MissingDatabaseUrlError"}}var L={"postgres:":"postgres","postgresql:":"postgres","mysql:":"mysql","mariadb:":"mariadb","sqlite:":"sqlite","file:":"sqlite"},D=[".db",".sqlite",".sqlite3"];function F(z){let B=z.trim();if(B==="")throw new Q(z);if(B===":memory:")return"sqlite";let G=B.indexOf(":");if(G!==-1){let J=B.slice(0,G+1).toLowerCase(),K=L[J];if(K)return K}if(S(B))return"sqlite";throw new Q(z)}function S(z){if(z.startsWith("./")||z.startsWith("../")||z.startsWith("/"))return!0;let B=z.toLowerCase();return D.some((G)=>B.endsWith(G))}function p(z){return z==="sqlite"}function m(z){return z==="mysql"||z==="mariadb"}import{existsSync as g,readFileSync as y,realpathSync as I,statSync as U}from"fs";import{isAbsolute as w,join as H,resolve as q}from"path";var O=H("prisma","schema.prisma");class R extends Error{constructor(z,B,G){super(`"${z}" now resolves to ${B}, which is where Prisma migrates it. gemi used to open ${G} instead, and that file holds data \u2014 so `+`opening the resolved one would quietly leave it behind. gemi will not choose. Move ${G} onto ${B} if it is the database you want, or point DATABASE_URL at an absolute path to say so explicitly.`);this.name="AmbiguousSqlitePathError"}}function C(z){let B=z.trim(),G="",J=B;for(let K of["file://","file:","sqlite://","sqlite:"])if(B.slice(0,K.length).toLowerCase()===K){G=B.slice(0,K.length),J=B.slice(K.length);break}if(J===":memory:"||J.startsWith(":memory:?"))return null;return{prefix:G,file:J}}function _(z,B,G=process.cwd()){if(B!=="sqlite")return{url:z};let J=C(z);if(!J||J.file==="")return{url:z};if(w(J.file))return{url:z};let K=J.file.indexOf("?"),Z=K===-1?J.file:J.file.slice(0,K),$=K===-1?"":J.file.slice(K),X=H(G,"prisma");if(!T(G,z))return{url:z};let W=q(G,Z),Y=q(X,Z);if(W===Y)return{url:z};return{url:`${J.prefix}${Y}${$}`,moved:{from:W,to:Y}}}function T(z,B){let G=H(z,O);if(!g(G))return!1;let J;try{J=y(G,"utf8")}catch{return!1}let Z=J.replace(/^\s*\/\/.*$/gm,"").match(/datasource\s+\w+\s*\{([\s\S]*?)\}/);if(!Z)return!1;let $=Z[1];if(!/provider\s*=\s*["']sqlite["']/.test($))return!1;let X=$.match(/url\s*=\s*env\(\s*["']([^"']+)["']\s*\)/);if(X){let Y=process.env[X[1]];return typeof Y==="string"&&Y.trim()===B.trim()}let W=$.match(/url\s*=\s*["']([^"']+)["']/);return W?W[1].trim()===B.trim():!1}function k(z){try{if(I(z.from)===I(z.to))return null}catch{}try{let B=U(z.from);return B.isFile()&&B.size>0?z.from:null}catch{return null}}var{SQL:A}=globalThis.Bun;var V="default";class P extends Error{constructor(z,B){super(`No database connection named "${z}". Configured: ${B.map((G)=>`"${G}"`).join(", ")}. Declare it under \`connections\` in app/config/database.ts.`);this.name="UnknownConnectionError"}}class x extends Error{constructor(z){super(`"${z}" is the name of the connection declared by the top-level \`url\` and \`options\`, so it cannot also appear under \`connections\`. Rename it, or move its settings up to the top level.`);this.name="ReservedConnectionNameError"}}class N extends Error{open;requested;constructor(z,B){super(`A transaction is open on the "${z}" connection, and this statement names "${B}". A transaction cannot span two connections: the statement would run outside it and stay committed when the transaction rolls back. Move this query outside the transaction, or run the whole unit on one connection.`);this.open=z;this.requested=B;this.name="CrossConnectionTransactionError"}}class M{name;config;sql;dialect;url;ready;constructor(z,B={}){this.name=z;this.config=B;let G=B.url;if(!G)throw new j(z);this.dialect=B.dialect??F(G);let J=_(G,this.dialect);if(J.moved){let K=k(J.moved);if(K)throw new R(G,J.moved.to,K)}this.url=J.url,this.sql=B.options?new A(this.url,B.options):new A(this.url),this.ready=this.configure()}async configure(){if(this.dialect!=="sqlite")return;await this.sql.unsafe("pragma foreign_keys = ON")}get query(){return this.sql}async close(){this.ready.catch(()=>{}),await this.sql.close()}}class h{config;static token="database";name=V;pools=new Map;ready;constructor(z={}){this.config=z;let{connections:B={},...G}=z;this.pools.set(V,new M(V,G));try{this.build(B,G.slowTransactionThreshold)}catch(J){for(let K of this.pools.values())K.ready.catch(()=>{}),K.close().catch(()=>{});throw J}this.ready=Promise.all([...this.pools.values()].map((J)=>J.ready)).then(()=>{return})}build(z,B){for(let[G,J]of Object.entries(z)){if(G===V)throw new x(G);this.pools.set(G,new M(G,{slowTransactionThreshold:B,...J}))}}connection(z=V){if(z===V)return this;let B=this.pools.get(z);if(!B)throw new P(z,this.connectionNames);return B}get connectionNames(){return[...this.pools.keys()]}get sql(){return this.default.sql}get dialect(){return this.default.dialect}get url(){return this.default.url}get query(){return this.sql}async close(){this.ready.catch(()=>{}),await Promise.all([...this.pools.values()].map((z)=>z.close()))}get default(){return this.pools.get(V)}}
3
- export{E as mk,f as nk,b as ok,Q as pk,j as qk,F as rk,p as sk,m as tk,R as uk,V as vk,P as wk,x as xk,N as yk,M as zk,h as Ak};
3
+ export{E as pk,f as qk,b as rk,Q as sk,j as tk,F as uk,p as vk,m as wk,R as xk,V as yk,P as zk,x as Ak,N as Bk,M as Ck,h as Dk};
4
4
 
5
- //# debugId=09B34B95A95F925C64756E2164756E21
5
+ //# debugId=50B2FB51A1A56CB764756E2164756E21
@@ -9,6 +9,6 @@
9
9
  "import type { SQL } from \"bun\";\nimport type { ConnectionConfig, DatabaseConfig } from \"./config\";\nimport {\n Connection,\n DEFAULT_CONNECTION,\n ReservedConnectionNameError,\n UnknownConnectionError,\n type DatabaseConnection,\n} from \"./Connection\";\nimport type { Dialect } from \"./dialect\";\n\n// Wraps Bun's `SQL` client. Bun ships one client that speaks SQLite, Postgres,\n// MySQL and MariaDB, so gemi does not need a driver per database — it needs to\n// know *which* one is in use, which is what `dialect` carries.\n//\n// Safe to build eagerly: Bun's client connects on the first query, not at\n// construction. (`RedisManager` used to be cited here as the parallel case. As\n// of #403 it builds its client in a memoizing getter instead — not because\n// eager construction was unsafe, but because naming Bun's `RedisClient` at\n// module scope is what made `gemi/services` unloadable off Bun. `Connection`\n// still imports `SQL` as a value for the same reason, which is the remaining\n// half of #396.) It is still bound as a lazy singleton,\n// so an app that never touches the database never resolves it and never has to\n// have DATABASE_URL set.\n//\n// Since #327 it holds *connections*, plural: the top-level `url` and `options`\n// build the one called `\"default\"`, and each key under `connections` builds\n// another. What it does not do is decide which one a query uses — that is the\n// ORM's ambient scope and the `DB` facade, because the choice is per query\n// rather than per application. See `connection` below.\nexport class DatabaseManager implements DatabaseConnection {\n static token = \"database\";\n\n /**\n * This object *is* the default connection, so it answers to the name.\n *\n * Not a formality: `connection(\"default\")` returns `this` rather than the\n * `Connection` in the map, which is what keeps every existing reader —\n * `DB.sql`, `db.dialect`, and the test harnesses that wrap the manager in a\n * Proxy to count statements — looking at the same object the ORM executes\n * through. A second object for the default pool would have quietly bypassed\n * all of them while every test still passed.\n */\n public readonly name = DEFAULT_CONNECTION;\n\n /**\n * Every pool this manager owns, keyed by name and including the default one.\n *\n * Private because the map is the manager's bookkeeping — `connection()` is\n * the way in, and it is the only path that knows the default is `this`.\n */\n private readonly pools = new Map<string, Connection>();\n\n /**\n * Resolves once **every** connection has been configured, or rejects if one\n * could not be. Only SQLite has anything to do; elsewhere it is already\n * resolved.\n *\n * All of them rather than the default alone, because the thing a caller waits\n * on this for — SQLite's `pragma foreign_keys` — is per client, so a second\n * SQLite connection has its own and a caller awaiting one manager-level\n * promise means all of them.\n */\n public readonly ready: Promise<void>;\n\n constructor(public config: DatabaseConfig = {}) {\n const { connections = {}, ...primary } = config;\n\n // The default first, so a `MissingDatabaseUrlError` from a missing\n // `DATABASE_URL` still comes out of construction the way it always has,\n // rather than after a named connection has already opened a client.\n this.pools.set(\n DEFAULT_CONNECTION,\n new Connection(DEFAULT_CONNECTION, primary),\n );\n\n // A connection that is built before the one whose config is wrong is still\n // a live client with an open handle, and on the throwing path nothing else\n // will ever hold it: the manager never becomes a value, so nobody can call\n // `close`. Left alone, the pragma this constructor issues for a SQLite\n // connection settles against a client being torn down and surfaces as an\n // unhandled rejection with no configuration error anywhere near it.\n try {\n this.build(connections, primary.slowTransactionThreshold);\n } catch (error) {\n for (const pool of this.pools.values()) {\n // The in-flight configuration first: it is what rejects when the client\n // under it goes away, and this is the only place that can say the\n // rejection was expected.\n pool.ready.catch(() => {});\n pool.close().catch(() => {});\n }\n throw error;\n }\n\n // Built once here rather than derived per read, so that a connection whose\n // configuration rejects produces one unhandled rejection at most instead of\n // a fresh one per access.\n this.ready = Promise.all(\n [...this.pools.values()].map((pool) => pool.ready),\n ).then(() => undefined);\n }\n\n private build(\n connections: Record<string, ConnectionConfig>,\n slowTransactionThreshold: number | false | undefined,\n ): void {\n for (const [name, connection] of Object.entries(connections)) {\n if (name === DEFAULT_CONNECTION)\n throw new ReservedConnectionNameError(name);\n\n this.pools.set(\n name,\n new Connection(name, {\n // The threshold is the one setting a named connection is likely to\n // want *unchanged*: it is a development diagnostic about holding a\n // pooled connection, and that concern does not stop applying because\n // the pool has a name. `url`, `options` and `dialect` are deliberately\n // not inherited — a connection that borrowed the default's URL by\n // omission would be a second pool onto the same database created by a\n // typo in a key.\n slowTransactionThreshold,\n ...connection,\n }),\n );\n }\n }\n\n /**\n * The connection called `name`, or the default one when called with nothing.\n *\n * Throws rather than falling back to the default for an unknown name, and\n * that is the important half. A fallback would make `Model.on(\"analitycs\")`\n * run on the hot path — the exact pool the caller was trying to stay off —\n * and the only symptom would be the incident it was meant to prevent,\n * arriving weeks later with nothing pointing back at the typo.\n */\n connection(name: string = DEFAULT_CONNECTION): DatabaseConnection {\n // `this`, not `pools.get(DEFAULT_CONNECTION)` — see `name` above.\n if (name === DEFAULT_CONNECTION) return this;\n\n const found = this.pools.get(name);\n if (!found) throw new UnknownConnectionError(name, this.connectionNames);\n return found;\n }\n\n /** Every configured name, default first. For error messages and diagnostics. */\n get connectionNames(): string[] {\n return [...this.pools.keys()];\n }\n\n /**\n * The default connection's client. Unchanged in meaning: an application that\n * never names a connection sees exactly what it saw before #327.\n */\n get sql(): SQL {\n return this.default.sql;\n }\n\n get dialect(): Dialect {\n return this.default.dialect;\n }\n\n get url(): string {\n return this.default.url;\n }\n\n // Escape hatch matching Bun's own API, so `db.query` reads like `sql` does in\n // Bun's docs: db.query`select * from users where id = ${id}`\n get query(): SQL {\n return this.sql;\n }\n\n /** Closes every connection, not only the default one. */\n async close(): Promise<void> {\n // The aggregate promise needs the same treatment each connection's own\n // `ready` gets in `Connection.close` — it is derived from them, so a\n // rejection there arrives here as a second, separately unhandled one.\n this.ready.catch(() => {});\n await Promise.all([...this.pools.values()].map((pool) => pool.close()));\n }\n\n private get default(): Connection {\n return this.pools.get(DEFAULT_CONNECTION)!;\n }\n}\n"
10
10
  ],
11
11
  "mappings": "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",
12
- "debugId": "09B34B95A95F925C64756E2164756E21",
12
+ "debugId": "50B2FB51A1A56CB764756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{oa as w,pa as P,qa as R,ra as b}from"./chunk-a22h5cby.js";import{ua as K,va as _,wa as L,xa as A}from"./chunk-epvpmakp.js";import{ya as I}from"./chunk-r3v2cnrj.js";import{Aa as E,za as T}from"./chunk-986eh0n3.js";var i=["gemi","gemi/client","gemi/http","gemi/app","gemi/facades","gemi/email","gemi/kernel","gemi/services","gemi/i18n","gemi/dictionary"];function O(q){return q==="gemi"||q.startsWith("gemi/")}import{parseAstAsync as h}from"vite";var V="virtual:gemi-dict/",x="\x00virtual:gemi-dict/",f=new Set(["gemi/dictionary","gemi/client","gemi/i18n"]),y="gemi/dictionary";function B(){let q=new Map;return{name:"gemi-plugin-dictionary",enforce:"post",resolveId(H){if(H.startsWith(V))return`\x00${H}`;return null},async load(H){if(!H.startsWith(x))return null;let Q=H.slice(x.length),W=Q.lastIndexOf("/"),J=Q.slice(0,W),Y=Q.slice(W+1),$=q.get(J);if(!$){let M=g(J);if(M){try{await this.load({id:M})}catch{}$=q.get(J)}}if(!$)return this.error(`No dictionary registered for "${J}". If this persists, restart the dev server.`),null;let G=_($.translations,Y,$.locales);return`export default ${JSON.stringify(G)};
2
+ import{oa as w,pa as P,qa as R,ra as b}from"./chunk-a22h5cby.js";import{ua as K,va as _,wa as L,xa as A}from"./chunk-epvpmakp.js";import{ya as I}from"./chunk-r3v2cnrj.js";import{Aa as E,za as T}from"./chunk-9983zmhx.js";var i=["gemi","gemi/client","gemi/http","gemi/app","gemi/facades","gemi/email","gemi/kernel","gemi/services","gemi/i18n","gemi/dictionary"];function O(q){return q==="gemi"||q.startsWith("gemi/")}import{parseAstAsync as h}from"vite";var V="virtual:gemi-dict/",x="\x00virtual:gemi-dict/",f=new Set(["gemi/dictionary","gemi/client","gemi/i18n"]),y="gemi/dictionary";function B(){let q=new Map;return{name:"gemi-plugin-dictionary",enforce:"post",resolveId(H){if(H.startsWith(V))return`\x00${H}`;return null},async load(H){if(!H.startsWith(x))return null;let Q=H.slice(x.length),W=Q.lastIndexOf("/"),J=Q.slice(0,W),Y=Q.slice(W+1),$=q.get(J);if(!$){let M=g(J);if(M){try{await this.load({id:M})}catch{}$=q.get(J)}}if(!$)return this.error(`No dictionary registered for "${J}". If this persists, restart the dev server.`),null;let G=_($.translations,Y,$.locales);return`export default ${JSON.stringify(G)};
3
3
  `},async transform(H,Q){if(!H.includes("defineDictionary"))return null;if(Q.startsWith("\x00")||Q.includes("/node_modules/"))return null;let W=await h(H),J=new Set;for(let Z of W.body){if(Z.type!=="ImportDeclaration")continue;if(!f.has(Z.source?.value))continue;for(let z of Z.specifiers??[])if(z.type==="ImportSpecifier"&&z.imported?.name==="defineDictionary")J.add(z.local.name)}let Y=[],$=0;if(X(W,(Z)=>{if(Z.type!=="CallExpression")return;let z=Z.callee;if(z?.type==="Identifier"&&J.has(z.name)){Y.push(Z);return}if((z?.type==="Identifier"?z.name:z?.type==="MemberExpression"&&!z.computed?z.property?.name:void 0)==="defineDictionary")$++}),$>0&&p(W,"defineDictionary"))$=0;if($>0)this.warn(`${Q}: ${$} defineDictionary() call(s) could not be traced to an import of "gemi/dictionary", "gemi/client" or "gemi/i18n", so their locales were left inline and will all ship to the browser. Import defineDictionary directly by name rather than through a namespace import or a local re-export.`);if(Y.length===0)return null;let G=new T(H),M=!1;for(let Z of Y){if(Z.arguments?.length<1||Z.arguments?.length>2)this.error({message:"defineDictionary() takes an object literal and an optional options object.",pos:Z.start});let z=m(Z.arguments[0],(j)=>this.error({message:j,pos:Z.arguments[0]?.start??Z.start})),F=v(Z.arguments[1],(j)=>this.error({message:j,pos:Z.arguments[1]?.start??Z.start})),D=A(z),C=`${Buffer.from(Q).toString("base64url")}/${D}`,N=K(z,F);if(N.length===0)this.error({message:'defineDictionary() declares no locales \u2014 every key needs at least one "<locale>": "<string>" entry.',pos:Z.start});if(!F){let j=L(z);if(j)this.error({message:`defineDictionary() cannot infer a source language. Key "${j.againstKey}" lists "${j.againstFirst}" first but "${j.key}" lists "${j.first}" first, so the locale every key falls back to depends on the order `+"they are written in \u2014 moving one key would change what language a reader sees. "+'Pass { sourceLocale: "<locale>" } as the second argument to pin it.',pos:Z.start})}q.set(C,{id:D,locales:N,translations:z});let S=N.map((j)=>`${JSON.stringify(j)}:()=>import(${JSON.stringify(`${V}${C}/${j}`)})`).join(",");G.overwrite(Z.start,Z.end,`__gemi_dict__(${JSON.stringify(D)},{${S}})`),M=!0}if(!M)return null;return G.append(`
4
4
  import { __gemi_dict__ } from ${JSON.stringify(y)};
5
5
  `),{code:G.toString(),map:G.generateMap({hires:!0})}}}}function g(q){let H=q.indexOf("/");if(H===-1)return null;try{return Buffer.from(q.slice(0,H),"base64url").toString("utf8")}catch{return null}}function m(q,H){if(q?.type!=="ObjectExpression")H("defineDictionary() needs an inline object literal \u2014 it is read at build time, so a variable or spread cannot be resolved.");let Q={};for(let W of q.properties){let J=U(W);if(J===null)H("defineDictionary() keys must be plain string keys \u2014 computed keys and spreads cannot be read at build time.");if(W.value?.type!=="ObjectExpression")H(`defineDictionary() entry "${J}" must be an object of "<locale>": "<string>" pairs.`);let Y={};for(let $ of W.value.properties){let G=U($);if(G===null)H(`defineDictionary() entry "${J}" has a locale key that cannot be read at build time.`);let M=$.value;if(M?.type!=="Literal"||typeof M.value!=="string")H(`defineDictionary() entry "${J}" locale "${G}" must be a string literal. Use {{param}} interpolation instead of a template literal or a function.`);Y[G]=M.value}Q[J]=Y}return Q}function v(q,H){if(q===void 0)return;if(q.type!=="ObjectExpression")H("defineDictionary() options must be an inline object literal \u2014 it is read at build time.");for(let Q of q.properties){if(U(Q)!=="sourceLocale")continue;let W=Q.value;if(W?.type!=="Literal"||typeof W.value!=="string")H("defineDictionary() sourceLocale must be a string literal.");return W.value}return}function p(q,H){let Q=!1;return X(q,(W)=>{if(Q)return;if(W.type==="FunctionDeclaration"&&W.id?.name===H)Q=!0;if(W.type==="VariableDeclarator"&&W.id?.name===H)Q=!0}),Q}function U(q){if(q?.type!=="Property"||q.computed)return null;if(q.key?.type==="Identifier")return q.key.name;if(q.key?.type==="Literal"&&typeof q.key.value==="string")return q.key.value;return null}function X(q,H){if(q===null||typeof q!=="object")return;if(Array.isArray(q)){for(let Q of q)X(Q,H);return}if(typeof q.type==="string")H(q);for(let Q of Object.keys(q)){if(Q==="parent")continue;let W=q[Q];if(W&&typeof W==="object")X(W,H)}}import{mkdir as u,writeFile as c}from"fs/promises";import{dirname as r,join as t}from"path";function k(q){let H;return{name:"gemi-plugin-asset-base",config:(Q,W)=>W.command==="build"&&q?{base:q}:void 0,configResolved(Q){H=Q},async writeBundle(Q){if(!H||H.command!=="build"||H.build.ssr||!Q.dir)return;let W=t(Q.dir,P);await u(r(W),{recursive:!0}),await c(W,`${JSON.stringify({assetBase:d(H.base)})}
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import{Ba as y}from"./chunk-kk18xqgc.js";import{createElement as k}from"react";function z(i,n){let p=Object.keys(n).sort((s,e)=>e.length-s.length).map((s)=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),b=new RegExp(p.join("|"),"g");return i.replace(b,(s)=>n[s])}async function L(i,n,p=[],b){let s=[...p.map((t)=>`${i}/views/${t}.tsx`),b?`${i}/views/${b}.tsx`:`${i}/views/RootLayout.tsx`],e=new Set;for(let t of s){let u=n.moduleGraph.getModulesByFile(t);if(u)for(let l of u)e.add(l)}let g=[],x=[],r={};for(let t of e)if(t)for(let u of t.importedModules){if(u.file.includes("module.css"))r[u.file]=u.ssrTransformResult.map.sourcesContent.join("");if(u.file.includes(".css"))x.push(u.file)}for(let t of x){let u=await n.transformRequest(t+"?direct"),l=t.includes("module.css"),v="";if(l)v=z(r[t],u.default);g.push({isDev:!0,id:t,content:l?v:u.code})}return g.map((t,u)=>{return k("style",{key:u,type:"text/css","data-vite-dev-id":t.id,dangerouslySetInnerHTML:{__html:t.content}})})}async function _(i=[]){return i.map((n,p)=>{return k("style",{key:p,id:n?.id,type:"text/css",dangerouslySetInnerHTML:{__html:n.content}})})}import{existsSync as J}from"fs";import{basename as N}from"path";import{networkInterfaces as O}from"os";var q={name:"gemi",version:"0.160.1",private:!1,license:"MIT",author:"Enes Tufekci <enes@gemijs.dev>",repository:{type:"git",url:"git+https://github.com/nstfkc/gemi.git",directory:"packages/gemi"},bin:{gemi:"./dist/bin/gemi.js","gemi-orm-generator":"./dist/bin/orm-generator.js"},files:["dist/**/*","ide/typescript-plugin/package.json","skills/**/*"],module:!0,exports:{"./http":"./http/index.ts","./client":"./client/index.ts","./ai":"./ai/index.ts","./ai/client":"./ai/client/index.ts","./ai/voice":"./ai/voice/index.ts","./testing":"./testing/index.ts","./app":"./app/index.ts","./facades":"./facades/index.ts","./email":"./email/index.ts","./vite":"./dist/vite/index.mjs","./kernel":"./kernel/index.ts","./services":"./services/index.ts","./i18n":"./i18n/index.ts","./dictionary":"./i18n/dictionaryRuntime.ts","./server":"./server/index.ts","./config":"./config/index.ts","./container":"./container/index.ts","./foundation":"./foundation/index.ts","./database":"./database/index.ts","./orm":"./orm/index.ts","./support":"./support/index.ts","./probe":"./probe/index.ts","./console/run":"./console/run.ts","./queue/work":"./services/queue/work.ts","./stats/route-table":"./stats/route-table.ts","./ide/typescript-plugin":"./ide/typescript-plugin/index.ts","./bun/preload":"./bun/preload.ts","./bun/plugin":"./bun/plugin.ts","./vitest":"./vitest/index.ts"},scripts:{lint:"oxlint",typecheck:"tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.browser.json && tsc --noEmit -p ide/typescript-plugin/tsconfig.json",build:"NODE_ENV=production bun run build:core && bun run build:bin && bun run build:types && bun run build:client && bun run build:plugin && bun run build:ts-plugin && bun run build:client-types && bun run build:augmentation","build:core":"bun ./scripts/build.ts","build:bin":"bun build --outdir=./dist/bin --target=bun --external=vite --external=react-dom --external=react/jsx-runtime --external=bun --external=sharp --external=@azure/storage-blob --external=typescript --sourcemap ./bin/gemi.ts ./bin/orm-generator.ts && bun ./scripts/prepare-bin.ts","build:client":"rm -rf dist/client dist/testing dist/ai/client dist/ai/voice dist/chunks && vite build -c vite.client.config.mts","build:plugin":"vite build -c vite.plugin.config.mts","build:ts-plugin":"bun ./scripts/build-ts-plugin.ts","build:types":"tsc -p tsconfig.build.json","build:client-types":"tsc -p tsconfig.browser.json",test:"bun --bun x vitest","test:types":"vitest run --typecheck.only","test:live":"bun --bun x vitest run ai/live","test:packaging":"bun --bun x vitest run --config vitest.packaging.config.ts","build:publish":"bun scripts/build-publish.ts",prepublishOnly:"echo 'Do not publish from this directory \u2014 its exports point at TS source. Run: bun run build:publish, then publish from .publish/' && exit 1","build:augmentation":"bun ./scripts/wire-augmentation.ts"},dependencies:{"@aws-sdk/client-s3":"^3.629.0","@aws-sdk/s3-request-presigner":"^3.629.0","ast-types":"^0.14.2",commander:"^12.1.0",history:"^5.3.0","jsx-email":"2.0.0-rc2.1","magic-string":"^0.30.17",open:"^10.1.0","react-error-boundary":"^6.0.0",recast:"^0.23.9",resend:"^6.12.3",satori:"^0.12.2","temporal-polyfill":"^0.2.5","twitter-api-v2":"^1.20.2","urlpattern-polyfill":"^10.0.0",uuid:"^9.0.1"},devDependencies:{"@babel/parser":"^7.25.4","@prisma/generator-helper":"^6.5.0","@repo/typescript-config":"*","@testing-library/react":"^16.3.2","@types/bun":"^1.3.14","@types/eslint":"^8.56.5","@types/node":"^20.11.24","@types/react":"^19.0.2","@types/react-dom":"^19.0.2",eslint:"^8.57.0",jsdom:"^30.0.1",oxlint:"^1.39.0",postgres:"^3.4.5",react:"19.2.3","react-dom":"19.2.3",typescript:"^5.7.3",vitest:"^4.0.0"},peerDependencies:{"@azure/storage-blob":"^12.28.0",react:">=19","react-dom":">=19",sharp:"^0.34.2",typescript:">=5",vite:"^8.0.0",postgres:"^3.4.0"},peerDependenciesMeta:{"@azure/storage-blob":{optional:!0},typescript:{optional:!0},postgres:{optional:!0}}};var Q=[" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557\u2588\u2588\u2557","\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551","\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551"," \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D"],W=Boolean(process.stdout.isTTY)&&!process.env.NO_COLOR,c=(i,n)=>W?`\x1B[${i}m${n}\x1B[0m`:n,X=(i)=>c("1",i),d=(i)=>c("2",i),j=(i)=>c("36",i),Y=(i)=>c("32",i),Z=(i)=>c("35",i);function $(){return q.version??"?"}function f(i){for(let n of Object.values(O()))for(let p of n??[])if((p.family==="IPv4"||p.family===4)&&!p.internal)return`http://${p.address}:${i}`;return null}function H(i){return y(i).filter((n)=>J(n)).map((n)=>N(n))}function V(i){let{port:n,rootDir:p}=i,b=`http://localhost:${n}`,s=f(n),e=H(p),g=(r,t)=>` ${Y("\u279C")} ${X(r.padEnd(9))}${t}`,x=["",...Q.map((r)=>Z(r)),"",` ${d("gemi")} ${j(`v${$()}`)}`,"",g("Local:",j(b)),g("Network:",s?j(s):d("unavailable")),g("Env:",e.length?e.join(", "):d("none")),""];console.log(x.join(`
3
+ `))}function D(i=process.env.SERVER_IDLE_TIMEOUT){if(i===void 0||i.trim()==="")return 10;let n=Number(i.trim());if(!Number.isInteger(n)||n<0||n>255)throw Error(`SERVER_IDLE_TIMEOUT must be a whole number of seconds from 0 to 255 (0 disables the timeout), got ${JSON.stringify(i)}.`);return n}
4
+ export{L as W,_ as X,V as Y,D as Z};
5
+
6
+ //# debugId=E2D8080A4D588C3B64756E2164756E21
@@ -6,7 +6,7 @@
6
6
  "import { existsSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { networkInterfaces } from \"node:os\";\nimport { envFiles } from \"./watchEnv\";\nimport pkg from \"../package.json\";\n\n// \"GEMI\" — ANSI Shadow figlet font.\nconst ART = [\n \" ██████╗ ███████╗███╗ ███╗██╗\",\n \"██╔════╝ ██╔════╝████╗ ████║██║\",\n \"██║ ███╗█████╗ ██╔████╔██║██║\",\n \"██║ ██║██╔══╝ ██║╚██╔╝██║██║\",\n \"╚██████╔╝███████╗██║ ╚═╝ ██║██║\",\n \" ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝\",\n];\n\nconst useColor = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\nconst paint = (code: string, text: string) =>\n useColor ? `\\x1b[${code}m${text}\\x1b[0m` : text;\nconst bold = (t: string) => paint(\"1\", t);\nconst dim = (t: string) => paint(\"2\", t);\nconst cyan = (t: string) => paint(\"36\", t);\nconst green = (t: string) => paint(\"32\", t);\nconst magenta = (t: string) => paint(\"35\", t);\n\nfunction gemiVersion(): string {\n return (pkg as { version?: string }).version ?? \"?\";\n}\n\nfunction networkUrl(port: number | string): string | null {\n for (const ifaces of Object.values(networkInterfaces())) {\n for (const iface of ifaces ?? []) {\n // Node <18 reported `family` as the number 4; newer Bun/Node use \"IPv4\".\n const isV4 = iface.family === \"IPv4\" || (iface.family as unknown) === 4;\n if (isV4 && !iface.internal) return `http://${iface.address}:${port}`;\n }\n }\n return null;\n}\n\nfunction loadedEnvFiles(rootDir: string): string[] {\n return envFiles(rootDir)\n .filter((file) => existsSync(file))\n .map((file) => basename(file));\n}\n\nexport function printStartupBanner(params: {\n port: number | string;\n rootDir: string;\n}) {\n const { port, rootDir } = params;\n const local = `http://localhost:${port}`;\n const network = networkUrl(port);\n const env = loadedEnvFiles(rootDir);\n\n const row = (label: string, value: string) =>\n ` ${green(\"➜\")} ${bold(label.padEnd(9))}${value}`;\n\n const out = [\n \"\",\n ...ART.map((line) => magenta(line)),\n \"\",\n ` ${dim(\"gemi\")} ${cyan(`v${gemiVersion()}`)}`,\n \"\",\n row(\"Local:\", cyan(local)),\n row(\"Network:\", network ? cyan(network) : dim(\"unavailable\")),\n row(\"Env:\", env.length ? env.join(\", \") : dim(\"none\")),\n \"\",\n ];\n\n console.log(out.join(\"\\n\"));\n}\n",
7
7
  "/**\n * Bun's default, and what both servers use when `SERVER_IDLE_TIMEOUT` is unset.\n */\nexport const DEFAULT_SERVER_IDLE_TIMEOUT = 10;\n\n/**\n * The `idleTimeout` (seconds) both `gemi dev` and `gemi start` pass to\n * `Bun.serve`, from `SERVER_IDLE_TIMEOUT` (#787).\n *\n * One reader for both servers, so a long-poll that works under `gemi start`\n * also works under `gemi dev`. Before this, only `httpProd` read the variable\n * and the dev server always ran at Bun's 10 seconds.\n *\n * It is the time a connection may stay silent, a response that has not started\n * included, before Bun closes it; `0` disables it. It does not apply to an\n * upgraded websocket (the HMR relay included), which has its own\n * `websocket.idleTimeout`.\n *\n * Unset or blank means the default. Anything that is not a whole number from 0\n * to 255 (Bun's own limits) fails the boot with the variable's name, instead\n * of Bun's \"expects idleTimeout to be an integer\", which does not say where the\n * value came from.\n */\nexport function serverIdleTimeout(raw: string | undefined = process.env.SERVER_IDLE_TIMEOUT): number {\n if (raw === undefined || raw.trim() === \"\") return DEFAULT_SERVER_IDLE_TIMEOUT;\n\n const seconds = Number(raw.trim());\n if (!Number.isInteger(seconds) || seconds < 0 || seconds > 255) {\n throw new Error(\n `SERVER_IDLE_TIMEOUT must be a whole number of seconds from 0 to 255 ` +\n `(0 disables the timeout), got ${JSON.stringify(raw)}.`,\n );\n }\n return seconds;\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "474E9610DDEA24D564756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "E2D8080A4D588C3B64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{ua as B,va as C,xa as E}from"./chunk-epvpmakp.js";import{Bk as x,Dk as z,Ek as A}from"./chunk-xtqd9vpp.js";function M(b,f={}){let j=B(b,f.sourceLocale);return G(E(b),j,(q)=>C(b,q,j))}function N(b,f){let j=Object.keys(f);return G(b,j,(q)=>{let v=f[q]??f[j[0]];if(!v)return{};return v().then((k)=>k.default)})}function G(b,f,j){let q={id:b,locales:f,load:j};x(q);let v=()=>x(q);return{id:b,locales:f,load:(k)=>{return v(),z(b,k)},loadForRender:(k)=>{return v(),A(b,k)},get:(k)=>{v();let w=z(b,k);if(w instanceof Promise){w.catch(()=>{});return}return w}}}
2
+ import{ua as B,va as C,xa as E}from"./chunk-epvpmakp.js";import{Ek as x,Gk as z,Hk as A}from"./chunk-4vqnv41y.js";function M(b,f={}){let j=B(b,f.sourceLocale);return G(E(b),j,(q)=>C(b,q,j))}function N(b,f){let j=Object.keys(f);return G(b,j,(q)=>{let v=f[q]??f[j[0]];if(!v)return{};return v().then((k)=>k.default)})}function G(b,f,j){let q={id:b,locales:f,load:j};x(q);let v=()=>x(q);return{id:b,locales:f,load:(k)=>{return v(),z(b,k)},loadForRender:(k)=>{return v(),A(b,k)},get:(k)=>{v();let w=z(b,k);if(w instanceof Promise){w.catch(()=>{});return}return w}}}
3
3
  export{M as ca,N as da};
4
4
 
5
- //# debugId=57025499D232183C64756E2164756E21
5
+ //# debugId=BD2F2ED2B4F0325E64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import {\n dictionaryId,\n dictionaryLocales,\n localeStrings,\n type DictionaryTranslations,\n type LocaleStrings,\n} from \"./dictionaryShape\";\nimport {\n loadDictionary,\n loadDictionaryForRender,\n registerDictionary,\n type RenderThenable,\n} from \"./dictionaryRegistry\";\n\ndeclare const brand: unique symbol;\n\nexport interface DictionaryHandle<\n T extends DictionaryTranslations = DictionaryTranslations,\n> {\n readonly id: string;\n /** Locales this dictionary declares, source language first. */\n readonly locales: readonly string[];\n /**\n * Strings for `locale`. Synchronous when they are already in memory —\n * always, for an unbundled dictionary; after a preload or the SSR seed, for a\n * bundled one.\n */\n load(locale: string): LocaleStrings | Promise<LocaleStrings>;\n /**\n * `load`, but as the exact thing React's `use()` wants: never rejecting, so\n * a failed locale chunk degrades the component to rendering keys instead of\n * unmounting it into an error boundary; and always a thenable, even when the\n * strings are already in memory. The caller skips `use()` only for a\n * thenable built from strings already in hand, which carries them as\n * `inHand`; every thenable a render could have suspended on still goes\n * through it. `loadDictionaryForRender` has the whole reasoning.\n */\n loadForRender(locale: string): RenderThenable;\n get(locale: string): LocaleStrings | undefined;\n /** Type-only: carries the literal's shape through to `useDictionary`. */\n readonly [brand]?: T;\n}\n\n/**\n * Declare the strings a component needs, next to the component.\n *\n * ```ts\n * export const homeDict = defineDictionary({\n * title: { \"en-US\": \"Welcome {{name}}\", \"tr-TR\": \"Hoş geldin {{name}}\" },\n * });\n * ```\n *\n * As written this holds every locale. Under gemi's Vite plugin the call is\n * rewritten so each locale becomes its own chunk and a page downloads only the\n * one it renders in — but the plugin is strictly an optimization, and the\n * behaviour is identical without it (in `bun test`, and in server code that\n * does not go through the bundler).\n *\n * The first locale in the literal is the source language: a key missing from\n * another locale falls back to it rather than rendering as its own key.\n */\nexport interface DefineDictionaryOptions {\n /**\n * The locale this dictionary is authored in. Keys missing from another locale\n * fall back to it, and it is what renders when the app has no locale\n * configured.\n *\n * Optional, but worth setting on any dictionary that is not uniformly\n * translated: without it the source language is whichever locale appears\n * first in the literal, so adding a key at the top can re-point every\n * fallback in the dictionary.\n */\n sourceLocale?: string;\n}\n\nexport function defineDictionary<const T extends DictionaryTranslations>(\n translations: T,\n options: DefineDictionaryOptions = {},\n): DictionaryHandle<T> {\n const locales = dictionaryLocales(translations, options.sourceLocale);\n return createHandle(dictionaryId(translations), locales, (locale) =>\n localeStrings(translations, locale, locales),\n );\n}\n\n/**\n * The rewritten form of a `defineDictionary` call — emitted by\n * `packages/gemi/vite/dictionaryPlugin.ts`, never written by hand. `loaders`\n * holds one dynamic import per locale so the bundler emits one chunk per\n * locale and the untaken ones never reach the browser.\n */\nexport function __gemi_dict__<\n const T extends DictionaryTranslations = DictionaryTranslations,\n>(\n id: string,\n loaders: Record<string, () => Promise<{ default: LocaleStrings }>>,\n): DictionaryHandle<T> {\n const locales = Object.keys(loaders);\n return createHandle(id, locales, (locale) => {\n // An unknown locale falls back to the source language, matching what\n // `localeStrings` does per key on the unbundled path.\n const load = loaders[locale] ?? loaders[locales[0]];\n if (!load) {\n return {};\n }\n return load().then((mod) => mod.default);\n });\n}\n\nfunction createHandle<T extends DictionaryTranslations>(\n id: string,\n locales: string[],\n load: (locale: string) => LocaleStrings | Promise<LocaleStrings>,\n): DictionaryHandle<T> {\n const entry = { id, locales, load };\n registerDictionary(entry);\n\n // Re-asserted on every read rather than only at construction. A handle is\n // created once, at module scope, but the registry it delegates to can be\n // emptied under it — a test's `afterEach` reset, an HMR boundary — and the\n // handle would then be permanently orphaned, throwing \"Unknown dictionary\"\n // for a dictionary the caller is holding. `registerDictionary` is a no-op\n // when the id is already there, so this costs one Map lookup.\n const ensure = () => registerDictionary(entry);\n\n return {\n id,\n locales,\n // Routed through the registry rather than calling `load` directly so\n // concurrent readers share one in-flight import and results are cached.\n load: (locale: string) => {\n ensure();\n return loadDictionary(id, locale);\n },\n loadForRender: (locale: string) => {\n ensure();\n return loadDictionaryForRender(id, locale);\n },\n get: (locale: string) => {\n ensure();\n const strings = loadDictionary(id, locale);\n if (strings instanceof Promise) {\n // Nothing downstream awaits this one — `get` is the synchronous peek,\n // and the caller is about to discard it. An unattached rejection (a\n // locale chunk that 404s mid-deploy) would surface as an\n // `unhandledRejection`, which under Node's default handler takes the\n // process down over one missing translation file. The load itself is\n // still cached and still retried through `loadDictionary`.\n strings.catch(() => {});\n return undefined;\n }\n return strings;\n },\n };\n}\n\n"
6
6
  ],
7
7
  "mappings": ";wHA2EO,GAAS,CAAwD,CACtE,EACA,EAAmC,CAAC,EACf,CACrB,IAAM,EAAU,EAAkB,EAAc,EAAQ,YAAY,EACpE,OAAO,EAAa,EAAa,CAAY,EAAG,EAAS,CAAC,IACxD,EAAc,EAAc,EAAQ,CAAO,CAC7C,EASK,SAAS,CAEf,CACC,EACA,EACqB,CACrB,IAAM,EAAU,OAAO,KAAK,CAAO,EACnC,OAAO,EAAa,EAAI,EAAS,CAAC,IAAW,CAG3C,IAAM,EAAO,EAAQ,IAAW,EAAQ,EAAQ,IAChD,GAAI,CAAC,EACH,MAAO,CAAC,EAEV,OAAO,EAAK,EAAE,KAAK,CAAC,IAAQ,EAAI,OAAO,EACxC,EAGH,SAAS,CAA8C,CACrD,EACA,EACA,EACqB,CACrB,IAAM,EAAQ,CAAE,KAAI,UAAS,MAAK,EAClC,EAAmB,CAAK,EAQxB,IAAM,EAAS,IAAM,EAAmB,CAAK,EAE7C,MAAO,CACL,KACA,UAGA,KAAM,CAAC,IAAmB,CAExB,OADA,EAAO,EACA,EAAe,EAAI,CAAM,GAElC,cAAe,CAAC,IAAmB,CAEjC,OADA,EAAO,EACA,EAAwB,EAAI,CAAM,GAE3C,IAAK,CAAC,IAAmB,CACvB,EAAO,EACP,IAAM,EAAU,EAAe,EAAI,CAAM,EACzC,GAAI,aAAmB,QAAS,CAO9B,EAAQ,MAAM,IAAM,EAAE,EACtB,OAEF,OAAO,EAEX",
8
- "debugId": "57025499D232183C64756E2164756E21",
8
+ "debugId": "BD2F2ED2B4F0325E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{D as r}from"./chunk-6d6p0q3p.js";import{R as mc}from"./chunk-qz9n2e59.js";import"./chunk-vb73ddwz.js";import"./chunk-8z29qvvm.js";import{V as _}from"./chunk-gmeeyg19.js";import{Bl as O,yl as u}from"./chunk-egwz89ze.js";import{Buffer as hc}from"buffer";import{request as Yc}from"http";function E(c){return new Promise((I,x)=>{let N=Yc({method:"GET",...c,hostname:c.hostname?.replace(/^\[(.+)\]$/,"$1")});N.on("error",(T)=>{x(Object.assign(new K.ProviderError("Unable to connect to instance metadata service"),T)),N.destroy()}),N.on("timeout",()=>{x(new K.ProviderError("TimeoutError from instance metadata service")),N.destroy()}),N.on("response",(T)=>{let{statusCode:y=400}=T;if(y<200||300<=y)x(Object.assign(new K.ProviderError("Error response received from instance metadata service"),{statusCode:y})),N.destroy();let $=[];T.on("data",(w)=>{$.push(w)}),T.on("end",()=>{I(hc.concat($)),N.destroy()})}),N.end()})}var K;var D=O(()=>{K=u(_(),1)});var G=(c)=>Boolean(c)&&typeof c==="object"&&typeof c.AccessKeyId==="string"&&typeof c.SecretAccessKey==="string"&&typeof c.Token==="string"&&typeof c.Expiration==="string",L=(c)=>({accessKeyId:c.AccessKeyId,secretAccessKey:c.SecretAccessKey,sessionToken:c.Token,expiration:new Date(c.Expiration),...c.AccountId&&{accountId:c.AccountId}});var W=()=>{};var Hc=1000,qc=0,Q=({maxRetries:c=0,timeout:I=1000})=>({maxRetries:c,timeout:I});var X=()=>{};var v=(c,I)=>{let x=c();for(let N=0;N<I;N++)x=x.catch(c);return x};var b=()=>{};import{parse as Sc}from"url";var z,H="AWS_CONTAINER_CREDENTIALS_FULL_URI",q="AWS_CONTAINER_CREDENTIALS_RELATIVE_URI",M="AWS_CONTAINER_AUTHORIZATION_TOKEN",kc=(c={})=>{let{timeout:I,maxRetries:x}=Q(c);return()=>v(async()=>{let N=await jc({logger:c.logger}),T=JSON.parse(await fc(I,N));if(!G(T))throw new z.CredentialsProviderError("Invalid response received from instance metadata service.",{logger:c.logger});return L(T)},x)},fc=async(c,I)=>{if(process.env[M])I.headers={...I.headers,Authorization:process.env[M]};return(await E({...I,timeout:c})).toString()},uc="169.254.170.2",Ec,$c,jc=async({logger:c})=>{if(process.env[q])return{hostname:uc,path:process.env[q]};if(process.env[H]){let I=Sc(process.env[H]);if(!I.hostname||!(I.hostname in Ec))throw new z.CredentialsProviderError(`${I.hostname} is not a valid container metadata service hostname`,{tryNextLink:!1,logger:c});if(!I.protocol||!(I.protocol in $c))throw new z.CredentialsProviderError(`${I.protocol} is not a valid container metadata service protocol`,{tryNextLink:!1,logger:c});return{...I,port:I.port?parseInt(I.port,10):void 0}}throw new z.CredentialsProviderError(`The container metadata credential provider cannot be used unless the ${q} or ${H} environment variable is set`,{tryNextLink:!1,logger:c})};var p=O(()=>{D();W();X();b();z=u(_(),1),Ec={localhost:!0,"127.0.0.1":!0},$c={"http:":!0,"https:":!0}});var C,Z;var a=O(()=>{C=u(_(),1);Z=class Z extends C.CredentialsProviderError{tryNextLink;name="InstanceMetadataV1FallbackError";constructor(c,I=!0){super(c,I);this.tryNextLink=I,Object.setPrototypeOf(this,Z.prototype)}}});var J;var B=O(()=>{(function(c){c.IPv4="http://169.254.169.254",c.IPv6="http://[fd00:ec2::254]"})(J||(J={}))});var n;var o=O(()=>{n={environmentVariableSelector:(c)=>c.AWS_EC2_METADATA_SERVICE_ENDPOINT,configFileSelector:(c)=>c.ec2_metadata_service_endpoint,default:void 0}});var f;var t=O(()=>{(function(c){c.IPv4="IPv4",c.IPv6="IPv6"})(f||(f={}))});var Ac="AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE",Jc="ec2_metadata_service_endpoint_mode",s;var g=O(()=>{t();s={environmentVariableSelector:(c)=>c[Ac],configFileSelector:(c)=>c[Jc],default:f.IPv4}});var U,l,F=async()=>l.parseUrl(await vc()||await zc()),vc=async()=>U.loadConfig(n)(),zc=async()=>{let c=await U.loadConfig(s)();switch(c){case f.IPv4:return J.IPv4;case f.IPv6:return J.IPv6;default:throw Error(`Unsupported endpoint mode: ${c}. Select from ${Object.values(f)}`)}};var P=O(()=>{B();o();t();g();U=u(r(),1),l=u(mc(),1)});var V=(c,I)=>{let x=300+Math.floor(Math.random()*300),N=new Date(Date.now()+x*1000);I.warn(`Attempting credential expiration extension due to a credential service availability issue. A refresh of these credentials will be attempted after ${new Date(N)}.
3
+ For more information, please visit: https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html`);let T=c.originalExpiration??c.expiration;return{...c,...T?{originalExpiration:T}:{},expiration:N}};var d=()=>{};var e=(c,I={})=>{let x=I?.logger||console,N;return async()=>{let T;try{if(T=await c(),T.expiration&&T.expiration.getTime()<Date.now())T=V(T,x)}catch(y){if(N)x.warn("Credential renew failed: ",y),T=V(N,x);else throw y}return N=T,T}};var i=O(()=>{d()});var Nc,k,Tc="/latest/meta-data/iam/security-credentials/",Kc="/latest/api/token",R="AWS_EC2_METADATA_V1_DISABLED",cc="ec2_metadata_v1_disabled",Ic="x-aws-ec2-metadata-token",YI=(c={})=>e(_c(c),{logger:c.logger}),_c=(c={})=>{let I=!1,{logger:x,profile:N}=c,{timeout:T,maxRetries:y}=Q(c),$=async(w,j)=>{if(I||j.headers?.[Ic]==null){let h=!1,Y=!1,wc=await Nc.loadConfig({environmentVariableSelector:(S)=>{let A=S[R];if(Y=!!A&&A!=="false",A===void 0)throw new k.CredentialsProviderError(`${R} not set in env, checking config file next.`,{logger:c.logger});return Y},configFileSelector:(S)=>{let A=S[cc];return h=!!A&&A!=="false",h},default:!1},{profile:N})();if(c.ec2MetadataV1Disabled||wc){let S=[];if(c.ec2MetadataV1Disabled)S.push("credential provider initialization (runtime option ec2MetadataV1Disabled)");if(h)S.push(`config file profile (${cc})`);if(Y)S.push(`process environment variable (${R})`);throw new Z(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${S.join(", ")}].`)}}let yc=(await v(async()=>{let h;try{h=await Gc(j)}catch(Y){if(Y.statusCode===401)I=!1;throw Y}return h},w)).trim();return v(async()=>{let h;try{h=await Lc(yc,j,c)}catch(Y){if(Y.statusCode===401)I=!1;throw Y}return h},w)};return async()=>{let w=await F();if(I)return x?.debug("AWS SDK Instance Metadata","using v1 fallback (no token fetch)"),$(y,{...w,timeout:T});else{let j;try{j=(await Dc({...w,timeout:T})).toString()}catch(m){if(m?.statusCode===400)throw Object.assign(m,{message:"EC2 Metadata token request returned error"});else if(m.message==="TimeoutError"||[403,404,405].includes(m.statusCode))I=!0;return x?.debug("AWS SDK Instance Metadata","using v1 fallback (initial)"),$(y,{...w,timeout:T})}return $(y,{...w,headers:{[Ic]:j},timeout:T})}}},Dc=async(c)=>E({...c,path:Kc,method:"PUT",headers:{"x-aws-ec2-metadata-token-ttl-seconds":"21600"}}),Gc=async(c)=>(await E({...c,path:Tc})).toString(),Lc=async(c,I,x)=>{let N=JSON.parse((await E({...I,path:Tc+c})).toString());if(!G(N))throw new k.CredentialsProviderError("Invalid response received from instance metadata service.",{logger:x.logger});return L(N)};var xc=O(()=>{a();D();W();X();b();P();i();Nc=u(r(),1),k=u(_(),1)});var Oc=()=>{};var Qc=O(()=>{D();P();B();p();xc();X();Oc()});Qc();export{Q as providerConfigFromInit,E as httpRequest,F as getInstanceMetadataEndpoint,YI as fromInstanceMetadata,kc as fromContainerMetadata,J as Endpoint,q as ENV_CMDS_RELATIVE_URI,H as ENV_CMDS_FULL_URI,M as ENV_CMDS_AUTH_TOKEN,Hc as DEFAULT_TIMEOUT,qc as DEFAULT_MAX_RETRIES};
4
+
5
+ //# debugId=FBCDE9E25D8B9DCE64756E2164756E21
@@ -18,7 +18,7 @@
18
18
  "import { loadConfig } from \"@smithy/node-config-provider\";\nimport { CredentialsProviderError } from \"@smithy/property-provider\";\nimport { InstanceMetadataV1FallbackError } from \"./error/InstanceMetadataV1FallbackError\";\nimport { httpRequest } from \"./remoteProvider/httpRequest\";\nimport { fromImdsCredentials, isImdsCredentials } from \"./remoteProvider/ImdsCredentials\";\nimport { providerConfigFromInit } from \"./remoteProvider/RemoteProviderInit\";\nimport { retry } from \"./remoteProvider/retry\";\nimport { getInstanceMetadataEndpoint } from \"./utils/getInstanceMetadataEndpoint\";\nimport { staticStabilityProvider } from \"./utils/staticStabilityProvider\";\nconst IMDS_PATH = \"/latest/meta-data/iam/security-credentials/\";\nconst IMDS_TOKEN_PATH = \"/latest/api/token\";\nconst AWS_EC2_METADATA_V1_DISABLED = \"AWS_EC2_METADATA_V1_DISABLED\";\nconst PROFILE_AWS_EC2_METADATA_V1_DISABLED = \"ec2_metadata_v1_disabled\";\nconst X_AWS_EC2_METADATA_TOKEN = \"x-aws-ec2-metadata-token\";\nexport const fromInstanceMetadata = (init = {}) => staticStabilityProvider(getInstanceMetadataProvider(init), { logger: init.logger });\nconst getInstanceMetadataProvider = (init = {}) => {\n let disableFetchToken = false;\n const { logger, profile } = init;\n const { timeout, maxRetries } = providerConfigFromInit(init);\n const getCredentials = async (maxRetries, options) => {\n const isImdsV1Fallback = disableFetchToken || options.headers?.[X_AWS_EC2_METADATA_TOKEN] == null;\n if (isImdsV1Fallback) {\n let fallbackBlockedFromProfile = false;\n let fallbackBlockedFromProcessEnv = false;\n const configValue = await loadConfig({\n environmentVariableSelector: (env) => {\n const envValue = env[AWS_EC2_METADATA_V1_DISABLED];\n fallbackBlockedFromProcessEnv = !!envValue && envValue !== \"false\";\n if (envValue === undefined) {\n throw new CredentialsProviderError(`${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`, { logger: init.logger });\n }\n return fallbackBlockedFromProcessEnv;\n },\n configFileSelector: (profile) => {\n const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED];\n fallbackBlockedFromProfile = !!profileValue && profileValue !== \"false\";\n return fallbackBlockedFromProfile;\n },\n default: false,\n }, {\n profile,\n })();\n if (init.ec2MetadataV1Disabled || configValue) {\n const causes = [];\n if (init.ec2MetadataV1Disabled)\n causes.push(\"credential provider initialization (runtime option ec2MetadataV1Disabled)\");\n if (fallbackBlockedFromProfile)\n causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`);\n if (fallbackBlockedFromProcessEnv)\n causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`);\n throw new InstanceMetadataV1FallbackError(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join(\", \")}].`);\n }\n }\n const imdsProfile = (await retry(async () => {\n let profile;\n try {\n profile = await getProfile(options);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return profile;\n }, maxRetries)).trim();\n return retry(async () => {\n let creds;\n try {\n creds = await getCredentialsFromProfile(imdsProfile, options, init);\n }\n catch (err) {\n if (err.statusCode === 401) {\n disableFetchToken = false;\n }\n throw err;\n }\n return creds;\n }, maxRetries);\n };\n return async () => {\n const endpoint = await getInstanceMetadataEndpoint();\n if (disableFetchToken) {\n logger?.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (no token fetch)\");\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n else {\n let token;\n try {\n token = (await getMetadataToken({ ...endpoint, timeout })).toString();\n }\n catch (error) {\n if (error?.statusCode === 400) {\n throw Object.assign(error, {\n message: \"EC2 Metadata token request returned error\",\n });\n }\n else if (error.message === \"TimeoutError\" || [403, 404, 405].includes(error.statusCode)) {\n disableFetchToken = true;\n }\n logger?.debug(\"AWS SDK Instance Metadata\", \"using v1 fallback (initial)\");\n return getCredentials(maxRetries, { ...endpoint, timeout });\n }\n return getCredentials(maxRetries, {\n ...endpoint,\n headers: {\n [X_AWS_EC2_METADATA_TOKEN]: token,\n },\n timeout,\n });\n }\n };\n};\nconst getMetadataToken = async (options) => httpRequest({\n ...options,\n path: IMDS_TOKEN_PATH,\n method: \"PUT\",\n headers: {\n \"x-aws-ec2-metadata-token-ttl-seconds\": \"21600\",\n },\n});\nconst getProfile = async (options) => (await httpRequest({ ...options, path: IMDS_PATH })).toString();\nconst getCredentialsFromProfile = async (profile, options, init) => {\n const credentialsResponse = JSON.parse((await httpRequest({\n ...options,\n path: IMDS_PATH + profile,\n })).toString());\n if (!isImdsCredentials(credentialsResponse)) {\n throw new CredentialsProviderError(\"Invalid response received from instance metadata service.\", {\n logger: init.logger,\n });\n }\n return fromImdsCredentials(credentialsResponse);\n};\n",
19
19
  "export * from \"./fromContainerMetadata\";\nexport * from \"./fromInstanceMetadata\";\nexport * from \"./remoteProvider/RemoteProviderInit\";\nexport * from \"./types\";\nexport { httpRequest } from \"./remoteProvider/httpRequest\";\nexport { getInstanceMetadataEndpoint } from \"./utils/getInstanceMetadataEndpoint\";\nexport { Endpoint } from \"./config/Endpoint\";\n"
20
20
  ],
21
- "mappings": "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",
22
- "debugId": "2C63566B767D7F6764756E2164756E21",
21
+ "mappings": "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",
22
+ "debugId": "FBCDE9E25D8B9DCE64756E2164756E21",
23
23
  "names": []
24
24
  }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Oj as k,tj as g,uj as m}from"./chunk-aq5zx3vg.js";import{_k as p}from"./chunk-tzheb6ak.js";import{xl as n}from"./chunk-78wht1ph.js";var b={};n(b,{registeredNames:()=>x,register:()=>i,has:()=>S,get:()=>_,clearRegistry:()=>a});var M=new Map;function i(q,z){M.set(q,z)}function S(q){return M.has(q)}function _(q){let z=M.get(q);if(z===void 0)throw new k(q,[...M.keys()]);return z}function x(){return[...M.keys()]}function a(){M.clear()}import{createCipheriv as r,createDecipheriv as e,randomBytes as qq}from"crypto";class Y{static token="encrypter";keys=new Map;currentId;constructor(q={}){for(let[z,J]of Object.entries(q.keys??{})){if(!u.test(z))throw new U(`Encryption key id "${z}" is not valid. Use 1-32 letters, digits, "_" or "-": the id is written into every encrypted value.`);this.keys.set(z,zq(z,J))}if(q.current!==void 0){if(!this.keys.has(q.current))throw new U(`encryption.current is "${q.current}", but encryption.keys has no key by that id (${I(this.keys)}).`);this.currentId=q.current}else if(this.keys.size===1)this.currentId=[...this.keys.keys()][0];else if(this.keys.size>1)throw new U(`encryption.keys has ${this.keys.size} keys (${I(this.keys)}) and no encryption.current to say which one encrypts new values.`)}get configured(){return this.currentId!==void 0}get currentKeyId(){return this.requireCurrent()}encrypt(q){if(typeof q!=="string")throw TypeError(`Encrypter.encrypt takes a string, got ${Jq(q)}. Serialise other values first (JSON.stringify).`);let z=this.requireCurrent(),J=this.keys.get(z),Q=`${j}:${z}`,Z=qq(y),$=r(E,J,Z);$.setAAD(Buffer.from(Q));let X=Buffer.concat([$.update(q,"utf8"),$.final(),$.getAuthTag()]);return`${Q}:${Z.toString("base64url")}:${X.toString("base64url")}`}decrypt(q){let z=D(q);if(!z)throw new N("malformed","The value is not an encrypted envelope.");if(!this.configured)this.requireCurrent();let J=this.keys.get(z.keyId);if(!J)throw new N("unknown_key",`The value was encrypted with key "${z.keyId}", which is not in encryption.keys (${I(this.keys)}). Keep a key configured until encryption:rotate has re-encrypted the values written with it.`);try{let Q=e(E,J,z.iv);return Q.setAAD(Buffer.from(`${j}:${z.keyId}`)),Q.setAuthTag(z.tag),Buffer.concat([Q.update(z.ciphertext),Q.final()]).toString("utf8")}catch{throw new N("invalid",`The value did not authenticate under key "${z.keyId}": it was altered, or encrypted with a different key under the same id.`)}}isEncrypted(q){return D(q)!==null}keyIdOf(q){return D(q)?.keyId??null}needsReencryption(q){return this.keyIdOf(q)!==this.requireCurrent()}requireCurrent(){if(this.currentId===void 0)throw new U("No encryption key is configured. Add app/config/encryption.ts (defineEncryptionConfig({ keys: { k1: process.env.APP_ENCRYPTION_KEY } })) and list it as `encryption` in your Kernel's config. Generate a key with `openssl rand -base64 32`.");return this.currentId}}class U extends Error{constructor(q){super(q);this.name="EncryptionKeyError"}}class N extends Error{reason;column;constructor(q,z){super(z);this.reason=q;this.name="DecryptionError"}}var j="v1",E="aes-256-gcm",f=32,y=12,A=16,u=/^[A-Za-z0-9_-]{1,32}$/,v=/^[A-Za-z0-9_-]+$/;function zq(q,z){if(typeof z!=="string"||z.trim()==="")throw new U(`Encryption key "${q}" is empty. Is the environment variable it reads set?`);let J=z.trim().replace(/^base64:/,""),Q=/^[A-Za-z0-9+/=_-]+$/.test(J)?Buffer.from(J,"base64"):Buffer.alloc(0);if(Q.length!==f)throw new U(`Encryption key "${q}" is not ${f} bytes of base64 (it decodes to ${Q.length}). Generate one with \`openssl rand -base64 32\`.`);return Q}function D(q){if(typeof q!=="string")return null;let z=q.split(":");if(z.length!==4||z[0]!==j)return null;let[,J,Q,Z]=z;if(!u.test(J)||!v.test(Q)||!v.test(Z))return null;let $=Buffer.from(Q,"base64url"),X=Buffer.from(Z,"base64url");if($.length!==y||X.length<A)return null;return{keyId:J,iv:$,ciphertext:X.subarray(0,X.length-A),tag:X.subarray(X.length-A)}}function I(q){return q.size===0?"none configured":[...q.keys()].map((z)=>`"${z}"`).join(", ")}function Jq(q){return q===null?"null":Array.isArray(q)?"an array":`a ${typeof q}`}var h=new WeakMap;function T(q){let z=h.get(q);if(z===void 0)z=Object.values(q.fields).filter((J)=>J.encrypted===!0).map((J)=>J.name),h.set(q,z);return z}function Mq(){let q=new Set,z=[];for(let J of x()){let Q=O(J);if(!Q||q.has(Q.name))continue;q.add(Q.name);for(let Z of T(Q))z.push(`${Q.name}.${Z}`)}return z}function c(){let q=p();if(!q.bound(Y))throw new U("Encrypted columns need an Encrypter, and none is bound in this application. A booted Kernel binds one from the `encryption` config slice; a hand-built Application can bind its own: `application.instance(Encrypter, new Encrypter({ keys: { k1: key } }))`.");return q.make(Y)}var l=Symbol("gemi.orm.encryptedColumnsRaw");function Nq(q){return{...q,[l]:!0}}function Vq(q){return typeof q==="object"&&q!==null&&q[l]===!0}function Lq(q,z,J){if(!P(J))return;let Q={model:q.name,operation:z};d(q,J,Q,0);for(let Z of["by","_min","_max","_avg","_sum"])if(J[Z]!==void 0)o(q,J[Z],Z,Q);if(J.having!==void 0)B(q,J.having,Q)}var w=64;function d(q,z,J,Q){if(Q>w)return;if(z.where!==void 0)W(q,z.where,"where",J,Q);if(z.cursor!==void 0)W(q,z.cursor,"cursor",J,Q);if(z.orderBy!==void 0)K(q,z.orderBy,J,Q);if(z.distinct!==void 0)o(q,z.distinct,"distinct",J);for(let Z of[z.include,z.select]){if(!P(Z))continue;for(let[$,X]of Object.entries(Z)){if(!P(X))continue;if($==="_count"){if(!P(X.select))continue;for(let[G,F]of Object.entries(X.select)){let H=R(q,G);if(H&&P(F)&&F.where!==void 0)W(H,F.where,"where",J,Q+1)}continue}let C=R(q,$);if(C)d(C,X,J,Q+1)}}}var Qq=["some","every","none","is","isNot"];function W(q,z,J,Q,Z){if(Z>w)return;if(Array.isArray(z)){for(let $ of z)W(q,$,J,Q,Z);return}if(!P(z))return;for(let[$,X]of Object.entries(z)){if(X===void 0)continue;if($==="AND"||$==="OR"||$==="NOT"){W(q,X,J,Q,Z);continue}let C=q.fields[$];if(C){if(C.encrypted===!0&&!t(X))L(q,$,J,Q);continue}let G=R(q,$);if(G){if(!P(X))continue;let F=Object.keys(X).filter((H)=>Qq.includes(H));if(F.length>0)for(let H of F)W(G,X[H],J,Q,Z+1);else W(G,X,J,Q,Z+1);continue}if(P(X)){for(let F of Object.keys(X))if(q.fields[F]?.encrypted===!0)L(q,F,J,Q)}}}function K(q,z,J,Q){if(Q>w)return;if(Array.isArray(z)){for(let Z of z)K(q,Z,J,Q);return}if(!P(z))return;for(let[Z,$]of Object.entries(z)){if(q.fields[Z]?.encrypted===!0)L(q,Z,"orderBy",J);let X=R(q,Z);if(X&&P($)&&!("_count"in $))K(X,$,J,Q+1)}}function o(q,z,J,Q){let Z=typeof z==="string"?[z]:Array.isArray(z)?z.filter(($)=>typeof $==="string"):P(z)?Object.keys(z).filter(($)=>z[$]):[];for(let $ of Z)if(q.fields[$]?.encrypted===!0)L(q,$,J,Q)}function B(q,z,J){if(Array.isArray(z)){for(let Q of z)B(q,Q,J);return}if(!P(z))return;for(let[Q,Z]of Object.entries(z)){if(Q==="AND"||Q==="OR"||Q==="NOT"){B(q,Z,J);continue}if(q.fields[Q]?.encrypted===!0&&!t(Z))L(q,Q,"having",J)}}function t(q){if(q===null)return!0;if(!P(q))return!1;let z=Object.entries(q).filter(([,J])=>J!==void 0);return z.length>0&&z.every(([J,Q])=>(J==="equals"||J==="not")&&Q===null)}function L(q,z,J,Q){throw new m(J,Q.model,Q.operation,`${q.name}.${z} is an encrypted column: each write stores a different random ciphertext, so the database cannot compare, sort or group by it. Only null checks work on it ({ ${z}: null } or { ${z}: { not: null } }). To look a row up by a secret, store a keyed hash of it in a separate column and filter on that.`)}function Yq(q,z,J){let Q=T(q);if(Q.length===0||!P(J))return J;let Z={model:q.name,operation:z},$,X=(F)=>($??=c()).encrypt(F),C=J,G=(F,H)=>{if(H===C[F])return;if(C===J)C={...J};C[F]=H};switch(z){case"create":case"update":case"updateMany":G("data",V(Q,J.data,X,Z));break;case"createMany":G("data",Array.isArray(J.data)?Zq(J.data,(F)=>V(Q,F,X,Z)):V(Q,J.data,X,Z));break;case"upsert":G("create",V(Q,J.create,X,Z)),G("update",V(Q,J.update,X,Z));break}return C}function V(q,z,J,Q){if(!P(z))return z;let Z;for(let $ of q){if(!($ in z))continue;let X=z[$],C=s($,X,J,Q);if(C!==X)(Z??={...z})[$]=C}return Z??z}function s(q,z,J,Q){if(z===void 0||z===null)return z;if(typeof z==="string")return J(z);if(P(z)&&Object.keys(z).length===1&&"set"in z){let Z=z.set;return Z===null||Z===void 0?z:{set:s(q,Z,J,Q)}}throw new g("data",Q.model,Q.operation,`${Q.model}.${q} is an encrypted column and takes a string or null (or { set: string | null }); got ${Cq(z)}.`)}function Zq(q,z){let J;return q.forEach((Q,Z)=>{let $=z(Q);if($!==Q)(J??=[...q])[Z]=$}),J??q}function $q(q,z){let J=T(q);if(J.length===0||z.length===0)return;let Q;for(let Z of z){if(!P(Z))continue;for(let $ of J){let X=Z[$];if(typeof X!=="string")continue;Q??=c();try{Z[$]=Q.decrypt(X)}catch(C){if(C instanceof N)C.column={model:q.name,field:$},C.message=`Could not decrypt ${q.name}.${$}: ${C.message}`;throw C}}}}function Xq(q,z){let J=O(q.model),Q=[];for(let Z of z){if(!P(Z))continue;let $=Z[q.as];if(Array.isArray($))Q.push(...$);else if(P($))Q.push($)}if(Q.length===0)return;if(J)$q(J,Q);for(let Z of q.folded??[])Xq(Z,Q)}function O(q){if(!S(q))return;return _(q).$schema}function R(q,z){let J=q.relations[z];return J?O(J.model):void 0}function P(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)&&!(q instanceof Date)}function Cq(q){if(Array.isArray(q))return"an array";if(q instanceof Date)return"a Date";return`a ${typeof q}`}
3
- export{i as bj,S as cj,_ as dj,x as ej,b as fj,Y as gj,U as hj,N as ij,T as jj,Mq as kj,c as lj,Nq as mj,Vq as nj,Lq as oj,Yq as pj,$q as qj,Xq as rj};
2
+ import{Rj as k,wj as g,xj as m}from"./chunk-8tyw6faf.js";import{bl as p}from"./chunk-xp7x27n8.js";import{Al as n}from"./chunk-egwz89ze.js";var b={};n(b,{registeredNames:()=>x,register:()=>i,has:()=>S,get:()=>_,clearRegistry:()=>a});var M=new Map;function i(q,z){M.set(q,z)}function S(q){return M.has(q)}function _(q){let z=M.get(q);if(z===void 0)throw new k(q,[...M.keys()]);return z}function x(){return[...M.keys()]}function a(){M.clear()}import{createCipheriv as r,createDecipheriv as e,randomBytes as qq}from"crypto";class Y{static token="encrypter";keys=new Map;currentId;constructor(q={}){for(let[z,J]of Object.entries(q.keys??{})){if(!u.test(z))throw new U(`Encryption key id "${z}" is not valid. Use 1-32 letters, digits, "_" or "-": the id is written into every encrypted value.`);this.keys.set(z,zq(z,J))}if(q.current!==void 0){if(!this.keys.has(q.current))throw new U(`encryption.current is "${q.current}", but encryption.keys has no key by that id (${I(this.keys)}).`);this.currentId=q.current}else if(this.keys.size===1)this.currentId=[...this.keys.keys()][0];else if(this.keys.size>1)throw new U(`encryption.keys has ${this.keys.size} keys (${I(this.keys)}) and no encryption.current to say which one encrypts new values.`)}get configured(){return this.currentId!==void 0}get currentKeyId(){return this.requireCurrent()}encrypt(q){if(typeof q!=="string")throw TypeError(`Encrypter.encrypt takes a string, got ${Jq(q)}. Serialise other values first (JSON.stringify).`);let z=this.requireCurrent(),J=this.keys.get(z),Q=`${j}:${z}`,Z=qq(y),$=r(E,J,Z);$.setAAD(Buffer.from(Q));let X=Buffer.concat([$.update(q,"utf8"),$.final(),$.getAuthTag()]);return`${Q}:${Z.toString("base64url")}:${X.toString("base64url")}`}decrypt(q){let z=D(q);if(!z)throw new N("malformed","The value is not an encrypted envelope.");if(!this.configured)this.requireCurrent();let J=this.keys.get(z.keyId);if(!J)throw new N("unknown_key",`The value was encrypted with key "${z.keyId}", which is not in encryption.keys (${I(this.keys)}). Keep a key configured until encryption:rotate has re-encrypted the values written with it.`);try{let Q=e(E,J,z.iv);return Q.setAAD(Buffer.from(`${j}:${z.keyId}`)),Q.setAuthTag(z.tag),Buffer.concat([Q.update(z.ciphertext),Q.final()]).toString("utf8")}catch{throw new N("invalid",`The value did not authenticate under key "${z.keyId}": it was altered, or encrypted with a different key under the same id.`)}}isEncrypted(q){return D(q)!==null}keyIdOf(q){return D(q)?.keyId??null}needsReencryption(q){return this.keyIdOf(q)!==this.requireCurrent()}requireCurrent(){if(this.currentId===void 0)throw new U("No encryption key is configured. Add app/config/encryption.ts (defineEncryptionConfig({ keys: { k1: process.env.APP_ENCRYPTION_KEY } })) and list it as `encryption` in your Kernel's config. Generate a key with `openssl rand -base64 32`.");return this.currentId}}class U extends Error{constructor(q){super(q);this.name="EncryptionKeyError"}}class N extends Error{reason;column;constructor(q,z){super(z);this.reason=q;this.name="DecryptionError"}}var j="v1",E="aes-256-gcm",f=32,y=12,A=16,u=/^[A-Za-z0-9_-]{1,32}$/,v=/^[A-Za-z0-9_-]+$/;function zq(q,z){if(typeof z!=="string"||z.trim()==="")throw new U(`Encryption key "${q}" is empty. Is the environment variable it reads set?`);let J=z.trim().replace(/^base64:/,""),Q=/^[A-Za-z0-9+/=_-]+$/.test(J)?Buffer.from(J,"base64"):Buffer.alloc(0);if(Q.length!==f)throw new U(`Encryption key "${q}" is not ${f} bytes of base64 (it decodes to ${Q.length}). Generate one with \`openssl rand -base64 32\`.`);return Q}function D(q){if(typeof q!=="string")return null;let z=q.split(":");if(z.length!==4||z[0]!==j)return null;let[,J,Q,Z]=z;if(!u.test(J)||!v.test(Q)||!v.test(Z))return null;let $=Buffer.from(Q,"base64url"),X=Buffer.from(Z,"base64url");if($.length!==y||X.length<A)return null;return{keyId:J,iv:$,ciphertext:X.subarray(0,X.length-A),tag:X.subarray(X.length-A)}}function I(q){return q.size===0?"none configured":[...q.keys()].map((z)=>`"${z}"`).join(", ")}function Jq(q){return q===null?"null":Array.isArray(q)?"an array":`a ${typeof q}`}var h=new WeakMap;function T(q){let z=h.get(q);if(z===void 0)z=Object.values(q.fields).filter((J)=>J.encrypted===!0).map((J)=>J.name),h.set(q,z);return z}function Mq(){let q=new Set,z=[];for(let J of x()){let Q=O(J);if(!Q||q.has(Q.name))continue;q.add(Q.name);for(let Z of T(Q))z.push(`${Q.name}.${Z}`)}return z}function c(){let q=p();if(!q.bound(Y))throw new U("Encrypted columns need an Encrypter, and none is bound in this application. A booted Kernel binds one from the `encryption` config slice; a hand-built Application can bind its own: `application.instance(Encrypter, new Encrypter({ keys: { k1: key } }))`.");return q.make(Y)}var l=Symbol("gemi.orm.encryptedColumnsRaw");function Nq(q){return{...q,[l]:!0}}function Vq(q){return typeof q==="object"&&q!==null&&q[l]===!0}function Lq(q,z,J){if(!P(J))return;let Q={model:q.name,operation:z};d(q,J,Q,0);for(let Z of["by","_min","_max","_avg","_sum"])if(J[Z]!==void 0)o(q,J[Z],Z,Q);if(J.having!==void 0)B(q,J.having,Q)}var w=64;function d(q,z,J,Q){if(Q>w)return;if(z.where!==void 0)W(q,z.where,"where",J,Q);if(z.cursor!==void 0)W(q,z.cursor,"cursor",J,Q);if(z.orderBy!==void 0)K(q,z.orderBy,J,Q);if(z.distinct!==void 0)o(q,z.distinct,"distinct",J);for(let Z of[z.include,z.select]){if(!P(Z))continue;for(let[$,X]of Object.entries(Z)){if(!P(X))continue;if($==="_count"){if(!P(X.select))continue;for(let[G,F]of Object.entries(X.select)){let H=R(q,G);if(H&&P(F)&&F.where!==void 0)W(H,F.where,"where",J,Q+1)}continue}let C=R(q,$);if(C)d(C,X,J,Q+1)}}}var Qq=["some","every","none","is","isNot"];function W(q,z,J,Q,Z){if(Z>w)return;if(Array.isArray(z)){for(let $ of z)W(q,$,J,Q,Z);return}if(!P(z))return;for(let[$,X]of Object.entries(z)){if(X===void 0)continue;if($==="AND"||$==="OR"||$==="NOT"){W(q,X,J,Q,Z);continue}let C=q.fields[$];if(C){if(C.encrypted===!0&&!t(X))L(q,$,J,Q);continue}let G=R(q,$);if(G){if(!P(X))continue;let F=Object.keys(X).filter((H)=>Qq.includes(H));if(F.length>0)for(let H of F)W(G,X[H],J,Q,Z+1);else W(G,X,J,Q,Z+1);continue}if(P(X)){for(let F of Object.keys(X))if(q.fields[F]?.encrypted===!0)L(q,F,J,Q)}}}function K(q,z,J,Q){if(Q>w)return;if(Array.isArray(z)){for(let Z of z)K(q,Z,J,Q);return}if(!P(z))return;for(let[Z,$]of Object.entries(z)){if(q.fields[Z]?.encrypted===!0)L(q,Z,"orderBy",J);let X=R(q,Z);if(X&&P($)&&!("_count"in $))K(X,$,J,Q+1)}}function o(q,z,J,Q){let Z=typeof z==="string"?[z]:Array.isArray(z)?z.filter(($)=>typeof $==="string"):P(z)?Object.keys(z).filter(($)=>z[$]):[];for(let $ of Z)if(q.fields[$]?.encrypted===!0)L(q,$,J,Q)}function B(q,z,J){if(Array.isArray(z)){for(let Q of z)B(q,Q,J);return}if(!P(z))return;for(let[Q,Z]of Object.entries(z)){if(Q==="AND"||Q==="OR"||Q==="NOT"){B(q,Z,J);continue}if(q.fields[Q]?.encrypted===!0&&!t(Z))L(q,Q,"having",J)}}function t(q){if(q===null)return!0;if(!P(q))return!1;let z=Object.entries(q).filter(([,J])=>J!==void 0);return z.length>0&&z.every(([J,Q])=>(J==="equals"||J==="not")&&Q===null)}function L(q,z,J,Q){throw new m(J,Q.model,Q.operation,`${q.name}.${z} is an encrypted column: each write stores a different random ciphertext, so the database cannot compare, sort or group by it. Only null checks work on it ({ ${z}: null } or { ${z}: { not: null } }). To look a row up by a secret, store a keyed hash of it in a separate column and filter on that.`)}function Yq(q,z,J){let Q=T(q);if(Q.length===0||!P(J))return J;let Z={model:q.name,operation:z},$,X=(F)=>($??=c()).encrypt(F),C=J,G=(F,H)=>{if(H===C[F])return;if(C===J)C={...J};C[F]=H};switch(z){case"create":case"update":case"updateMany":G("data",V(Q,J.data,X,Z));break;case"createMany":G("data",Array.isArray(J.data)?Zq(J.data,(F)=>V(Q,F,X,Z)):V(Q,J.data,X,Z));break;case"upsert":G("create",V(Q,J.create,X,Z)),G("update",V(Q,J.update,X,Z));break}return C}function V(q,z,J,Q){if(!P(z))return z;let Z;for(let $ of q){if(!($ in z))continue;let X=z[$],C=s($,X,J,Q);if(C!==X)(Z??={...z})[$]=C}return Z??z}function s(q,z,J,Q){if(z===void 0||z===null)return z;if(typeof z==="string")return J(z);if(P(z)&&Object.keys(z).length===1&&"set"in z){let Z=z.set;return Z===null||Z===void 0?z:{set:s(q,Z,J,Q)}}throw new g("data",Q.model,Q.operation,`${Q.model}.${q} is an encrypted column and takes a string or null (or { set: string | null }); got ${Cq(z)}.`)}function Zq(q,z){let J;return q.forEach((Q,Z)=>{let $=z(Q);if($!==Q)(J??=[...q])[Z]=$}),J??q}function $q(q,z){let J=T(q);if(J.length===0||z.length===0)return;let Q;for(let Z of z){if(!P(Z))continue;for(let $ of J){let X=Z[$];if(typeof X!=="string")continue;Q??=c();try{Z[$]=Q.decrypt(X)}catch(C){if(C instanceof N)C.column={model:q.name,field:$},C.message=`Could not decrypt ${q.name}.${$}: ${C.message}`;throw C}}}}function Xq(q,z){let J=O(q.model),Q=[];for(let Z of z){if(!P(Z))continue;let $=Z[q.as];if(Array.isArray($))Q.push(...$);else if(P($))Q.push($)}if(Q.length===0)return;if(J)$q(J,Q);for(let Z of q.folded??[])Xq(Z,Q)}function O(q){if(!S(q))return;return _(q).$schema}function R(q,z){let J=q.relations[z];return J?O(J.model):void 0}function P(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)&&!(q instanceof Date)}function Cq(q){if(Array.isArray(q))return"an array";if(q instanceof Date)return"a Date";return`a ${typeof q}`}
3
+ export{i as ej,S as fj,_ as gj,x as hj,b as ij,Y as jj,U as kj,N as lj,T as mj,Mq as nj,c as oj,Nq as pj,Vq as qj,Lq as rj,Yq as sj,$q as tj,Xq as uj};
4
4
 
5
- //# debugId=318BD8E7C064736E64756E2164756E21
5
+ //# debugId=EA8738709F8C9C6164756E2164756E21
@@ -7,6 +7,6 @@
7
7
  "import { app } from \"../foundation/app\";\nimport {\n DecryptionError,\n Encrypter,\n EncryptionKeyError,\n} from \"../services/encryption/Encrypter\";\nimport { InvalidArgumentError, UnsupportedByDesignError } from \"./errors\";\nimport * as registry from \"./registry\";\nimport type { ModelSchema } from \"./schema\";\n\n/**\n * Encrypted columns: a `String` field marked `/// @gemi.encrypted` in the\n * Prisma schema is stored as an `Encrypter` envelope and read back as the\n * plaintext.\n *\n * Applied in `Model.$exec`, per model, at the two places a value crosses the\n * boundary:\n *\n * - **Writes** encrypt the model's *own* columns in `data` (and an upsert's\n * `create` / `update`). A nested write into a related model is not touched\n * here: every nested write runs through the related model's own `$exec`,\n * which encrypts its own columns, so encrypting it here as well would\n * encrypt it twice.\n * - **Reads** decrypt the model's own rows after shaping. A batched `include`\n * comes back through the child's `$exec` and is already decrypted; a folded\n * (lateral) one never enters it, so the parent decrypts those rows on the\n * child's behalf (`decryptFolded`) — the same split `redactFolded` handles\n * for policies.\n *\n * The schema, not the model class, says which columns are encrypted. That is\n * deliberate: a column that is encrypted when written through `FigmaConnection`\n * and plaintext when written through `FigmaConnectionModel` is not encrypted\n * at rest. The generated base, the subclass and every `Model.on(...)` variant\n * share one `$schema`, so none of them can write the column in the clear.\n *\n * A filter, sort or grouping on an encrypted column is refused: every write\n * stores a different random ciphertext, so the database cannot compare it to\n * anything. A null check is the exception, because a NULL column is stored as\n * NULL.\n */\n\nconst fieldsBySchema = new WeakMap<ModelSchema, readonly string[]>();\n\n/** The schema's encrypted fields, in declaration order. Empty for most models. */\nexport function encryptedFields(schema: ModelSchema): readonly string[] {\n let fields = fieldsBySchema.get(schema);\n if (fields === undefined) {\n fields = Object.values(schema.fields)\n .filter((field) => field.encrypted === true)\n .map((field) => field.name);\n fieldsBySchema.set(schema, fields);\n }\n return fields;\n}\n\n/** `Model.field` for every encrypted column of every registered model. */\nexport function encryptedColumnsInRegistry(): string[] {\n const seen = new Set<string>();\n const columns: string[] = [];\n for (const name of registry.registeredNames()) {\n const schema = schemaOf(name);\n if (!schema || seen.has(schema.name)) continue;\n seen.add(schema.name);\n for (const field of encryptedFields(schema)) columns.push(`${schema.name}.${field}`);\n }\n return columns;\n}\n\n/**\n * The application's `Encrypter`. An application booted without the\n * framework's providers (a test harness that binds only the database) gets a\n * typed error naming the fix rather than a container error.\n */\nexport function currentEncrypter(): Encrypter {\n const application = app();\n if (!application.bound(Encrypter)) {\n throw new EncryptionKeyError(\n \"Encrypted columns need an Encrypter, and none is bound in this \" +\n \"application. A booted Kernel binds one from the `encryption` config \" +\n \"slice; a hand-built Application can bind its own: \" +\n \"`application.instance(Encrypter, new Encrypter({ keys: { k1: key } }))`.\",\n );\n }\n return application.make(Encrypter);\n}\n\n// --- the internal raw mode ---------------------------------------------------\n\n/**\n * Marks an `$exec` call as reading and writing encrypted columns *as stored*:\n * no decryption of results, no encryption of `data`, and filters on encrypted\n * columns allowed (compared against the envelope). Used by `encryption:rotate`\n * to compare-and-swap one envelope for another. A module-private symbol, like\n * the other `$exec` markers, so an application cannot set it.\n */\nconst RAW = Symbol(\"gemi.orm.encryptedColumnsRaw\");\n\nexport function markEncryptionRaw<T extends object>(options: T): T {\n return { ...options, [RAW]: true };\n}\n\nexport function isEncryptionRaw(options: unknown): boolean {\n return (\n typeof options === \"object\" &&\n options !== null &&\n (options as Record<symbol, unknown>)[RAW] === true\n );\n}\n\n// --- refusing filters --------------------------------------------------------\n\ninterface Origin {\n model: string;\n operation: string;\n}\n\n/**\n * Refuses any argument that would make the database compare, sort or group an\n * encrypted column: `where` (including relation filters into other models),\n * `orderBy`, `distinct`, `cursor`, `groupBy`'s `by` and `having`, the\n * `_min` / `_max` aggregates, and the same arguments nested inside an\n * `include` or `select`.\n *\n * Walked whether or not this model has encrypted columns, because a relation\n * filter or an include reaches other models'.\n */\nexport function assertNoEncryptedFilters(schema: ModelSchema, op: string, args: unknown): void {\n if (!isObject(args)) return;\n const origin: Origin = { model: schema.name, operation: op };\n readArgs(schema, args, origin, 0);\n for (const key of [\"by\", \"_min\", \"_max\", \"_avg\", \"_sum\"]) {\n if (args[key] !== undefined) fieldList(schema, args[key], key, origin);\n }\n if (args.having !== undefined) having(schema, args.having, origin);\n}\n\n/** Generous: relation depth is bounded by `MAX_RELATION_DEPTH` long before this. */\nconst MAX_WALK_DEPTH = 64;\n\nfunction readArgs(schema: ModelSchema, args: Record<string, any>, origin: Origin, depth: number) {\n if (depth > MAX_WALK_DEPTH) return;\n if (args.where !== undefined) where(schema, args.where, \"where\", origin, depth);\n if (args.cursor !== undefined) where(schema, args.cursor, \"cursor\", origin, depth);\n if (args.orderBy !== undefined) orderBy(schema, args.orderBy, origin, depth);\n if (args.distinct !== undefined) fieldList(schema, args.distinct, \"distinct\", origin);\n\n for (const projection of [args.include, args.select]) {\n if (!isObject(projection)) continue;\n for (const [key, value] of Object.entries(projection)) {\n if (!isObject(value)) continue;\n if (key === \"_count\") {\n if (!isObject(value.select)) continue;\n for (const [name, count] of Object.entries(value.select)) {\n const target = relationTarget(schema, name);\n if (target && isObject(count) && count.where !== undefined) {\n where(target, count.where, \"where\", origin, depth + 1);\n }\n }\n continue;\n }\n const target = relationTarget(schema, key);\n if (target) readArgs(target, value, origin, depth + 1);\n }\n }\n}\n\nconst RELATION_FILTERS = [\"some\", \"every\", \"none\", \"is\", \"isNot\"];\n\nfunction where(\n schema: ModelSchema,\n node: unknown,\n argument: string,\n origin: Origin,\n depth: number,\n): void {\n if (depth > MAX_WALK_DEPTH) return;\n if (Array.isArray(node)) {\n for (const item of node) where(schema, item, argument, origin, depth);\n return;\n }\n if (!isObject(node)) return;\n\n for (const [key, value] of Object.entries(node)) {\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n where(schema, value, argument, origin, depth);\n continue;\n }\n\n const field = schema.fields[key];\n if (field) {\n if (field.encrypted === true && !isNullCheck(value)) {\n refuse(schema, key, argument, origin);\n }\n continue;\n }\n\n const target = relationTarget(schema, key);\n if (target) {\n if (!isObject(value)) continue;\n const filters = Object.keys(value).filter((name) => RELATION_FILTERS.includes(name));\n if (filters.length > 0) {\n for (const name of filters) where(target, value[name], argument, origin, depth + 1);\n } else {\n where(target, value, argument, origin, depth + 1);\n }\n continue;\n }\n\n // A compound unique key — `provider_providerId: { provider, providerId }`.\n if (isObject(value)) {\n for (const name of Object.keys(value)) {\n if (schema.fields[name]?.encrypted === true) refuse(schema, name, argument, origin);\n }\n }\n }\n}\n\nfunction orderBy(schema: ModelSchema, node: unknown, origin: Origin, depth: number): void {\n if (depth > MAX_WALK_DEPTH) return;\n if (Array.isArray(node)) {\n for (const item of node) orderBy(schema, item, origin, depth);\n return;\n }\n if (!isObject(node)) return;\n for (const [key, value] of Object.entries(node)) {\n if (schema.fields[key]?.encrypted === true) refuse(schema, key, \"orderBy\", origin);\n const target = relationTarget(schema, key);\n if (target && isObject(value) && !(\"_count\" in value)) {\n orderBy(target, value, origin, depth + 1);\n }\n }\n}\n\n/** `distinct`, `by`, and the `_min` / `_max` / `_avg` / `_sum` selections. */\nfunction fieldList(schema: ModelSchema, node: unknown, argument: string, origin: Origin): void {\n const names =\n typeof node === \"string\"\n ? [node]\n : Array.isArray(node)\n ? node.filter((name): name is string => typeof name === \"string\")\n : isObject(node)\n ? Object.keys(node).filter((name) => node[name])\n : [];\n for (const name of names) {\n if (schema.fields[name]?.encrypted === true) refuse(schema, name, argument, origin);\n }\n}\n\nfunction having(schema: ModelSchema, node: unknown, origin: Origin): void {\n if (Array.isArray(node)) {\n for (const item of node) having(schema, item, origin);\n return;\n }\n if (!isObject(node)) return;\n for (const [key, value] of Object.entries(node)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") {\n having(schema, value, origin);\n continue;\n }\n if (schema.fields[key]?.encrypted === true && !isNullCheck(value)) {\n refuse(schema, key, \"having\", origin);\n }\n }\n}\n\n/** `null`, `{ equals: null }`, `{ not: null }` — the only comparisons a ciphertext supports. */\nfunction isNullCheck(value: unknown): boolean {\n if (value === null) return true;\n if (!isObject(value)) return false;\n const entries = Object.entries(value).filter(([, operand]) => operand !== undefined);\n return (\n entries.length > 0 &&\n entries.every(([operator, operand]) => (operator === \"equals\" || operator === \"not\") && operand === null)\n );\n}\n\nfunction refuse(schema: ModelSchema, field: string, argument: string, origin: Origin): never {\n throw new UnsupportedByDesignError(\n argument,\n origin.model,\n origin.operation,\n `${schema.name}.${field} is an encrypted column: each write stores a ` +\n `different random ciphertext, so the database cannot compare, sort or ` +\n `group by it. Only null checks work on it ({ ${field}: null } or ` +\n `{ ${field}: { not: null } }). To look a row up by a secret, store a ` +\n `keyed hash of it in a separate column and filter on that.`,\n );\n}\n\n// --- writes ------------------------------------------------------------------\n\n/**\n * `args` with this model's encrypted columns encrypted, or `args` itself when\n * there is nothing to encrypt. Never mutates the caller's objects: the same\n * `data` may be reused for a second call.\n *\n * Only `data` (and an upsert's `create` / `update`) at this level. Nested\n * relation writes are left as they are; see the note at the top of the file.\n */\nexport function encryptWriteArgs(schema: ModelSchema, op: string, args: any): any {\n const fields = encryptedFields(schema);\n if (fields.length === 0 || !isObject(args)) return args;\n\n const origin: Origin = { model: schema.name, operation: op };\n let encrypter: Encrypter | undefined;\n const encrypt = (value: string) => (encrypter ??= currentEncrypter()).encrypt(value);\n\n let next = args;\n const replace = (key: string, value: unknown) => {\n if (value === next[key]) return;\n if (next === args) next = { ...args };\n next[key] = value;\n };\n\n switch (op) {\n case \"create\":\n case \"update\":\n case \"updateMany\":\n replace(\"data\", encryptData(fields, args.data, encrypt, origin));\n break;\n case \"createMany\":\n replace(\n \"data\",\n Array.isArray(args.data)\n ? mapIfChanged(args.data, (row) => encryptData(fields, row, encrypt, origin))\n : encryptData(fields, args.data, encrypt, origin),\n );\n break;\n case \"upsert\":\n replace(\"create\", encryptData(fields, args.create, encrypt, origin));\n replace(\"update\", encryptData(fields, args.update, encrypt, origin));\n break;\n }\n return next;\n}\n\nfunction encryptData(\n fields: readonly string[],\n data: unknown,\n encrypt: (value: string) => string,\n origin: Origin,\n): unknown {\n if (!isObject(data)) return data;\n let copy: Record<string, unknown> | undefined;\n for (const name of fields) {\n if (!(name in data)) continue;\n const value = data[name];\n const next = encryptValue(name, value, encrypt, origin);\n if (next !== value) (copy ??= { ...data })[name] = next;\n }\n return copy ?? data;\n}\n\nfunction encryptValue(\n field: string,\n value: unknown,\n encrypt: (value: string) => string,\n origin: Origin,\n): unknown {\n if (value === undefined || value === null) return value;\n if (typeof value === \"string\") return encrypt(value);\n // Prisma's `{ set: value }` spelling of a scalar update.\n if (isObject(value) && Object.keys(value).length === 1 && \"set\" in value) {\n const set = value.set;\n return set === null || set === undefined ? value : { set: encryptValue(field, set, encrypt, origin) };\n }\n throw new InvalidArgumentError(\n \"data\",\n origin.model,\n origin.operation,\n `${origin.model}.${field} is an encrypted column and takes a string or ` +\n `null (or { set: string | null }); got ${describe(value)}.`,\n );\n}\n\nfunction mapIfChanged<T>(items: T[], fn: (item: T) => T): T[] {\n let copy: T[] | undefined;\n items.forEach((item, index) => {\n const next = fn(item);\n if (next !== item) (copy ??= [...items])[index] = next;\n });\n return copy ?? items;\n}\n\n// --- reads -------------------------------------------------------------------\n\n/**\n * Decrypts this model's encrypted columns on `rows`, in place. A value that\n * does not decrypt raises `DecryptionError` naming the column — a ciphertext\n * is never handed back as if it were the value.\n */\nexport function decryptRows(schema: ModelSchema, rows: readonly unknown[]): void {\n const fields = encryptedFields(schema);\n if (fields.length === 0 || rows.length === 0) return;\n\n let encrypter: Encrypter | undefined;\n for (const row of rows) {\n if (!isObject(row)) continue;\n for (const field of fields) {\n const value = row[field];\n if (typeof value !== \"string\") continue;\n encrypter ??= currentEncrypter();\n try {\n row[field] = encrypter.decrypt(value);\n } catch (error) {\n if (error instanceof DecryptionError) {\n error.column = { model: schema.name, field };\n error.message = `Could not decrypt ${schema.name}.${field}: ${error.message}`;\n }\n throw error;\n }\n }\n }\n}\n\n/**\n * Decrypts the rows a strategy folded into the parent's statement, which never\n * passed through their own model's `$exec`. Recursive, because the fold is.\n */\nexport function decryptFolded(\n relation: { as: string; model: string; folded?: readonly { as: string; model: string; folded?: readonly unknown[] }[] },\n parents: readonly unknown[],\n): void {\n const schema = schemaOf(relation.model);\n const rows: unknown[] = [];\n for (const parent of parents) {\n if (!isObject(parent)) continue;\n const value = parent[relation.as];\n if (Array.isArray(value)) rows.push(...value);\n else if (isObject(value)) rows.push(value);\n }\n if (rows.length === 0) return;\n if (schema) decryptRows(schema, rows);\n for (const child of relation.folded ?? []) {\n decryptFolded(child as Parameters<typeof decryptFolded>[0], rows);\n }\n}\n\n// --- helpers -----------------------------------------------------------------\n\nfunction schemaOf(model: string): ModelSchema | undefined {\n if (!registry.has(model)) return undefined;\n return registry.get<{ $schema?: ModelSchema }>(model).$schema;\n}\n\nfunction relationTarget(schema: ModelSchema, name: string): ModelSchema | undefined {\n const relation = schema.relations[name];\n return relation ? schemaOf(relation.model) : undefined;\n}\n\nfunction isObject(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction describe(value: unknown): string {\n if (Array.isArray(value)) return \"an array\";\n if (value instanceof Date) return \"a Date\";\n return `a ${typeof value}`;\n}\n"
8
8
  ],
9
9
  "mappings": "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",
10
- "debugId": "318BD8E7C064736E64756E2164756E21",
10
+ "debugId": "EA8738709F8C9C6164756E2164756E21",
11
11
  "names": []
12
12
  }