gemi 0.193.1 → 0.195.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/dist/ai/index.js +2 -2
  2. package/dist/ai/index.js.map +1 -1
  3. package/dist/app/index.js +1 -1
  4. package/dist/auth/AuthController.d.ts.map +1 -1
  5. package/dist/auth/AuthServiceProvider.d.ts +4 -1
  6. package/dist/auth/AuthServiceProvider.d.ts.map +1 -1
  7. package/dist/auth/config.d.ts +10 -0
  8. package/dist/auth/config.d.ts.map +1 -1
  9. package/dist/auth/fixedCode.d.ts +16 -0
  10. package/dist/auth/fixedCode.d.ts.map +1 -0
  11. package/dist/auth/isFixedSignInCode.d.ts +21 -0
  12. package/dist/auth/isFixedSignInCode.d.ts.map +1 -0
  13. package/dist/bun/plugin.js +1 -1
  14. package/dist/bun/preload.js +1 -1
  15. package/dist/{chunk-9hmm8acy.js → chunk-03q4j7wa.js} +1 -1
  16. package/dist/{chunk-tvsjq0my.js → chunk-07zfrfbg.js} +2 -2
  17. package/dist/{chunk-tvsjq0my.js.map → chunk-07zfrfbg.js.map} +1 -1
  18. package/dist/{chunk-m37vvh99.js → chunk-08m9egzx.js} +2 -2
  19. package/dist/{chunk-m37vvh99.js.map → chunk-08m9egzx.js.map} +1 -1
  20. package/dist/{chunk-0mb77yd2.js → chunk-0xssrbar.js} +2 -2
  21. package/dist/{chunk-0mb77yd2.js.map → chunk-0xssrbar.js.map} +1 -1
  22. package/dist/{chunk-vese6sny.js → chunk-0y7jqe6m.js} +2 -2
  23. package/dist/{chunk-vese6sny.js.map → chunk-0y7jqe6m.js.map} +1 -1
  24. package/dist/{chunk-vr48swd0.js → chunk-1705yamg.js} +2 -2
  25. package/dist/{chunk-vr48swd0.js.map → chunk-1705yamg.js.map} +1 -1
  26. package/dist/{chunk-tngf3h1g.js → chunk-1ghbn9jg.js} +2 -2
  27. package/dist/{chunk-tngf3h1g.js.map → chunk-1ghbn9jg.js.map} +1 -1
  28. package/dist/{chunk-ejc0mbe3.js → chunk-1x23scpn.js} +2 -2
  29. package/dist/{chunk-ejc0mbe3.js.map → chunk-1x23scpn.js.map} +1 -1
  30. package/dist/{chunk-xsx69765.js → chunk-228w21t6.js} +2 -2
  31. package/dist/{chunk-xsx69765.js.map → chunk-228w21t6.js.map} +1 -1
  32. package/dist/{chunk-thq8tc9x.js → chunk-2485bwzs.js} +3 -3
  33. package/dist/{chunk-thq8tc9x.js.map → chunk-2485bwzs.js.map} +1 -1
  34. package/dist/{chunk-7ynahcy6.js → chunk-28fz99pn.js} +2 -2
  35. package/dist/{chunk-7ynahcy6.js.map → chunk-28fz99pn.js.map} +1 -1
  36. package/dist/{chunk-zcrhagx5.js → chunk-28macaes.js} +2 -2
  37. package/dist/{chunk-zcrhagx5.js.map → chunk-28macaes.js.map} +1 -1
  38. package/dist/{chunk-y67rmd3y.js → chunk-2g2fsr71.js} +2 -2
  39. package/dist/{chunk-y67rmd3y.js.map → chunk-2g2fsr71.js.map} +1 -1
  40. package/dist/{chunk-p00rd4ja.js → chunk-2yzv5v3m.js} +2 -2
  41. package/dist/{chunk-p00rd4ja.js.map → chunk-2yzv5v3m.js.map} +1 -1
  42. package/dist/{chunk-6rmz0mkm.js → chunk-39w89wss.js} +3 -3
  43. package/dist/{chunk-6rmz0mkm.js.map → chunk-39w89wss.js.map} +1 -1
  44. package/dist/{chunk-t86nc1jd.js → chunk-3fcd8a47.js} +2 -2
  45. package/dist/{chunk-t86nc1jd.js.map → chunk-3fcd8a47.js.map} +1 -1
  46. package/dist/{chunk-gsrf5c3c.js → chunk-3qmvtfw2.js} +2 -2
  47. package/dist/{chunk-gsrf5c3c.js.map → chunk-3qmvtfw2.js.map} +1 -1
  48. package/dist/{chunk-f02anz24.js → chunk-5bfrr8x5.js} +2 -2
  49. package/dist/{chunk-f02anz24.js.map → chunk-5bfrr8x5.js.map} +1 -1
  50. package/dist/chunk-5qcqwcp7.js +117 -0
  51. package/dist/{chunk-8zeky0fj.js.map → chunk-5qcqwcp7.js.map} +6 -5
  52. package/dist/{chunk-24jgzc8y.js → chunk-652a9mr0.js} +3 -3
  53. package/dist/{chunk-24jgzc8y.js.map → chunk-652a9mr0.js.map} +1 -1
  54. package/dist/{chunk-m3180wkp.js → chunk-6efjnt6r.js} +2 -2
  55. package/dist/{chunk-m3180wkp.js.map → chunk-6efjnt6r.js.map} +1 -1
  56. package/dist/{chunk-17mdszc3.js → chunk-6m9qrs6d.js} +2 -2
  57. package/dist/{chunk-17mdszc3.js.map → chunk-6m9qrs6d.js.map} +1 -1
  58. package/dist/{chunk-hwq0kk1d.js → chunk-7t60d5qy.js} +1 -1
  59. package/dist/{chunk-67zz58cw.js → chunk-7zf8rnsb.js} +3 -3
  60. package/dist/{chunk-67zz58cw.js.map → chunk-7zf8rnsb.js.map} +1 -1
  61. package/dist/{chunk-ccx7rt7y.js → chunk-8e17k7ht.js} +2 -2
  62. package/dist/{chunk-ccx7rt7y.js.map → chunk-8e17k7ht.js.map} +1 -1
  63. package/dist/{chunk-z1aeh05w.js → chunk-8fdk8bfd.js} +3 -3
  64. package/dist/{chunk-z1aeh05w.js.map → chunk-8fdk8bfd.js.map} +1 -1
  65. package/dist/{chunk-9m04tdzh.js → chunk-9hjxpdjt.js} +1 -1
  66. package/dist/{chunk-tt5qk0xt.js → chunk-a02bmp0q.js} +2 -2
  67. package/dist/{chunk-tt5qk0xt.js.map → chunk-a02bmp0q.js.map} +1 -1
  68. package/dist/chunk-afs0geyy.js +10 -0
  69. package/dist/{chunk-7k43y71n.js.map → chunk-afs0geyy.js.map} +4 -5
  70. package/dist/{chunk-fhvyq67n.js → chunk-ahx3g8tq.js} +2 -2
  71. package/dist/{chunk-fhvyq67n.js.map → chunk-ahx3g8tq.js.map} +1 -1
  72. package/dist/{chunk-fryj3asn.js → chunk-aycfrzh1.js} +2 -2
  73. package/dist/{chunk-fryj3asn.js.map → chunk-aycfrzh1.js.map} +1 -1
  74. package/dist/{chunk-m4r8btey.js → chunk-b6zqjyn1.js} +2 -2
  75. package/dist/{chunk-m4r8btey.js.map → chunk-b6zqjyn1.js.map} +1 -1
  76. package/dist/{chunk-qfb6r3cq.js → chunk-bc7hr358.js} +3 -3
  77. package/dist/{chunk-qfb6r3cq.js.map → chunk-bc7hr358.js.map} +1 -1
  78. package/dist/{chunk-ce73s4kh.js → chunk-beckfwe9.js} +2 -2
  79. package/dist/{chunk-ce73s4kh.js.map → chunk-beckfwe9.js.map} +1 -1
  80. package/dist/{chunk-rf9c6e49.js → chunk-dfmxvp8p.js} +2 -2
  81. package/dist/{chunk-rf9c6e49.js.map → chunk-dfmxvp8p.js.map} +1 -1
  82. package/dist/{chunk-z9pq557m.js → chunk-dn20caf2.js} +2 -2
  83. package/dist/{chunk-z9pq557m.js.map → chunk-dn20caf2.js.map} +1 -1
  84. package/dist/{chunk-freerpzc.js → chunk-ejktrxp2.js} +1 -1
  85. package/dist/{chunk-8pfy75y6.js → chunk-ermvtpy9.js} +3 -3
  86. package/dist/{chunk-8pfy75y6.js.map → chunk-ermvtpy9.js.map} +1 -1
  87. package/dist/{chunk-bm7z4vj9.js → chunk-f6css3z6.js} +2 -2
  88. package/dist/{chunk-bm7z4vj9.js.map → chunk-f6css3z6.js.map} +1 -1
  89. package/dist/{chunk-0m1a636t.js → chunk-fhfkcmkc.js} +2 -2
  90. package/dist/{chunk-0m1a636t.js.map → chunk-fhfkcmkc.js.map} +1 -1
  91. package/dist/{chunk-8em2ebj1.js → chunk-ftvc1a0k.js} +2 -2
  92. package/dist/{chunk-8em2ebj1.js.map → chunk-ftvc1a0k.js.map} +1 -1
  93. package/dist/{chunk-5zx4e2wa.js → chunk-g02gqhq0.js} +3 -3
  94. package/dist/{chunk-5zx4e2wa.js.map → chunk-g02gqhq0.js.map} +1 -1
  95. package/dist/{chunk-j34ektzj.js → chunk-g7h28xcr.js} +2 -2
  96. package/dist/{chunk-j34ektzj.js.map → chunk-g7h28xcr.js.map} +1 -1
  97. package/dist/chunk-ggbf1web.js +5 -0
  98. package/dist/{chunk-waq4kj7n.js.map → chunk-ggbf1web.js.map} +1 -1
  99. package/dist/{chunk-9dfrsj4m.js → chunk-gmcttf0f.js} +2 -2
  100. package/dist/{chunk-9dfrsj4m.js.map → chunk-gmcttf0f.js.map} +1 -1
  101. package/dist/{chunk-wa1xmvgr.js → chunk-hmn6pa78.js} +2 -2
  102. package/dist/{chunk-wa1xmvgr.js.map → chunk-hmn6pa78.js.map} +1 -1
  103. package/dist/{chunk-jbee3n3p.js → chunk-hswnqn33.js} +2 -2
  104. package/dist/{chunk-jbee3n3p.js.map → chunk-hswnqn33.js.map} +1 -1
  105. package/dist/{chunk-6n44t4hn.js → chunk-j49vh5bs.js} +2 -2
  106. package/dist/{chunk-6n44t4hn.js.map → chunk-j49vh5bs.js.map} +1 -1
  107. package/dist/{chunk-199nvtrj.js → chunk-j56zk5a0.js} +3 -3
  108. package/dist/{chunk-199nvtrj.js.map → chunk-j56zk5a0.js.map} +1 -1
  109. package/dist/{chunk-h688s2ba.js → chunk-m08p5mre.js} +2 -2
  110. package/dist/{chunk-h688s2ba.js.map → chunk-m08p5mre.js.map} +1 -1
  111. package/dist/{chunk-fbxnxze2.js → chunk-m0dfgmbj.js} +1 -1
  112. package/dist/{chunk-efgemgbe.js → chunk-mgdrf89p.js} +2 -2
  113. package/dist/{chunk-efgemgbe.js.map → chunk-mgdrf89p.js.map} +1 -1
  114. package/dist/{chunk-495k9h6p.js → chunk-mndcq5z1.js} +2 -2
  115. package/dist/{chunk-495k9h6p.js.map → chunk-mndcq5z1.js.map} +1 -1
  116. package/dist/{chunk-7zpjdwfq.js → chunk-n914rs58.js} +3 -3
  117. package/dist/{chunk-7zpjdwfq.js.map → chunk-n914rs58.js.map} +1 -1
  118. package/dist/{chunk-6frbegay.js → chunk-nk7nmtng.js} +2 -2
  119. package/dist/{chunk-6frbegay.js.map → chunk-nk7nmtng.js.map} +1 -1
  120. package/dist/{chunk-ryfty6mj.js → chunk-nphb176s.js} +9 -9
  121. package/dist/{chunk-ryfty6mj.js.map → chunk-nphb176s.js.map} +5 -4
  122. package/dist/{chunk-c36sbvnz.js → chunk-p2vasd1z.js} +2 -2
  123. package/dist/{chunk-c36sbvnz.js.map → chunk-p2vasd1z.js.map} +1 -1
  124. package/dist/{chunk-xwz5fmwy.js → chunk-p4eger3g.js} +3 -3
  125. package/dist/{chunk-xwz5fmwy.js.map → chunk-p4eger3g.js.map} +1 -1
  126. package/dist/{chunk-6wsmdf51.js → chunk-paawtkza.js} +2 -2
  127. package/dist/{chunk-6wsmdf51.js.map → chunk-paawtkza.js.map} +1 -1
  128. package/dist/{chunk-0p76bhy2.js → chunk-pg5hm00s.js} +2 -2
  129. package/dist/{chunk-0p76bhy2.js.map → chunk-pg5hm00s.js.map} +1 -1
  130. package/dist/{chunk-bhfwp3gz.js → chunk-pmt2jt9b.js} +2 -2
  131. package/dist/{chunk-bhfwp3gz.js.map → chunk-pmt2jt9b.js.map} +1 -1
  132. package/dist/{chunk-etzd00a8.js → chunk-pqr01waj.js} +2 -2
  133. package/dist/{chunk-etzd00a8.js.map → chunk-pqr01waj.js.map} +1 -1
  134. package/dist/{chunk-z8dxdqzm.js → chunk-q1aaqhnw.js} +2 -2
  135. package/dist/{chunk-k1c0xd8r.js.map → chunk-q1aaqhnw.js.map} +1 -1
  136. package/dist/{chunk-mdrsec0r.js → chunk-qg9pyxg7.js} +2 -2
  137. package/dist/{chunk-mdrsec0r.js.map → chunk-qg9pyxg7.js.map} +1 -1
  138. package/dist/{chunk-xzz6ps4z.js → chunk-qjwv9xfq.js} +2 -2
  139. package/dist/{chunk-xzz6ps4z.js.map → chunk-qjwv9xfq.js.map} +1 -1
  140. package/dist/{chunk-d0khszc9.js → chunk-qrn6ch3t.js} +2 -2
  141. package/dist/{chunk-d0khszc9.js.map → chunk-qrn6ch3t.js.map} +1 -1
  142. package/dist/{chunk-67ex6nem.js → chunk-reaty2mv.js} +3 -3
  143. package/dist/{chunk-67ex6nem.js.map → chunk-reaty2mv.js.map} +1 -1
  144. package/dist/{chunk-cx3n8qyr.js → chunk-rp6ss7v3.js} +2 -2
  145. package/dist/{chunk-cx3n8qyr.js.map → chunk-rp6ss7v3.js.map} +1 -1
  146. package/dist/{chunk-k8gn0q91.js → chunk-sqqby94y.js} +1 -1
  147. package/dist/{chunk-r7vnxqck.js → chunk-tj7z65ba.js} +2 -2
  148. package/dist/{chunk-r7vnxqck.js.map → chunk-tj7z65ba.js.map} +1 -1
  149. package/dist/{chunk-z7mbhc68.js → chunk-trqt1kkd.js} +2 -2
  150. package/dist/{chunk-z7mbhc68.js.map → chunk-trqt1kkd.js.map} +1 -1
  151. package/dist/{chunk-k1c0xd8r.js → chunk-vgxkt9vd.js} +2 -2
  152. package/dist/{chunk-z8dxdqzm.js.map → chunk-vgxkt9vd.js.map} +1 -1
  153. package/dist/{chunk-xpkpz4g6.js → chunk-vqq0z746.js} +2 -2
  154. package/dist/{chunk-xpkpz4g6.js.map → chunk-vqq0z746.js.map} +1 -1
  155. package/dist/{chunk-1mpwzjxa.js → chunk-wgqppqcn.js} +3 -3
  156. package/dist/{chunk-1mpwzjxa.js.map → chunk-wgqppqcn.js.map} +1 -1
  157. package/dist/{chunk-4s7st9y4.js → chunk-wvq3c25z.js} +3 -3
  158. package/dist/{chunk-4s7st9y4.js.map → chunk-wvq3c25z.js.map} +1 -1
  159. package/dist/{chunk-bd14zwmj.js → chunk-xjb8frdx.js} +3 -3
  160. package/dist/{chunk-bd14zwmj.js.map → chunk-xjb8frdx.js.map} +1 -1
  161. package/dist/{chunk-sqev442x.js → chunk-zzdvdr5a.js} +4 -4
  162. package/dist/{chunk-sqev442x.js.map → chunk-zzdvdr5a.js.map} +1 -1
  163. package/dist/config/index.js +1 -1
  164. package/dist/console/run.js +2 -2
  165. package/dist/console/run.js.map +1 -1
  166. package/dist/container/index.js +2 -2
  167. package/dist/container/index.js.map +1 -1
  168. package/dist/database/index.js +2 -2
  169. package/dist/database/index.js.map +1 -1
  170. package/dist/email/Email.d.ts.map +1 -1
  171. package/dist/email/index.js +3 -3
  172. package/dist/email/index.js.map +3 -3
  173. package/dist/facades/index.js +2 -2
  174. package/dist/facades/index.js.map +1 -1
  175. package/dist/foundation/index.js +2 -2
  176. package/dist/foundation/index.js.map +1 -1
  177. package/dist/http/index.js +2 -2
  178. package/dist/http/index.js.map +1 -1
  179. package/dist/i18n/dictionaryRuntime.js +2 -2
  180. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  181. package/dist/i18n/index.js +2 -2
  182. package/dist/i18n/index.js.map +1 -1
  183. package/dist/kernel/index.js +2 -2
  184. package/dist/kernel/index.js.map +1 -1
  185. package/dist/orm/index.js +2 -2
  186. package/dist/orm/index.js.map +1 -1
  187. package/dist/probe/index.js +2 -2
  188. package/dist/probe/index.js.map +1 -1
  189. package/dist/server/index.js +2 -2
  190. package/dist/server/index.js.map +1 -1
  191. package/dist/services/index.d.ts +2 -1
  192. package/dist/services/index.d.ts.map +1 -1
  193. package/dist/services/index.js +9 -9
  194. package/dist/services/index.js.map +4 -3
  195. package/dist/services/logging/LogManager.d.ts +10 -1
  196. package/dist/services/logging/LogManager.d.ts.map +1 -1
  197. package/dist/services/logging/config.d.ts +29 -0
  198. package/dist/services/logging/config.d.ts.map +1 -1
  199. package/dist/services/queue/work.js +2 -2
  200. package/dist/services/queue/work.js.map +1 -1
  201. package/dist/stats/route-table.js +1 -1
  202. package/dist/support/index.js +2 -2
  203. package/dist/support/index.js.map +1 -1
  204. package/dist/vitest/index.js +1 -1
  205. package/package.json +1 -1
  206. package/dist/chunk-7k43y71n.js +0 -10
  207. package/dist/chunk-8zeky0fj.js +0 -117
  208. package/dist/chunk-waq4kj7n.js +0 -5
  209. /package/dist/{chunk-9hmm8acy.js.map → chunk-03q4j7wa.js.map} +0 -0
  210. /package/dist/{chunk-hwq0kk1d.js.map → chunk-7t60d5qy.js.map} +0 -0
  211. /package/dist/{chunk-9m04tdzh.js.map → chunk-9hjxpdjt.js.map} +0 -0
  212. /package/dist/{chunk-freerpzc.js.map → chunk-ejktrxp2.js.map} +0 -0
  213. /package/dist/{chunk-fbxnxze2.js.map → chunk-m0dfgmbj.js.map} +0 -0
  214. /package/dist/{chunk-k8gn0q91.js.map → chunk-sqqby94y.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{W as P,Y as c,Z as f,_ as l}from"./chunk-gsrf5c3c.js";import{na as u,oa as m}from"./chunk-hwq0kk1d.js";import"./chunk-bwg7genv.js";import"./chunk-mvd4mc8p.js";import"./chunk-7txst143.js";import"./chunk-m37vvh99.js";import"./chunk-s0z61m9j.js";import"./chunk-m4r8btey.js";import{dj as S}from"./chunk-xsx69765.js";import{vl as T}from"./chunk-6n44t4hn.js";import{Ll as y}from"./chunk-y67rmd3y.js";import"./chunk-k1c0xd8r.js";import{join as YJ}from"path";import{createServer as AJ}from"vite";import{join as R,sep as o}from"path";import{existsSync as a,statSync as s}from"fs";import{IncomingMessage as t,ServerResponse as r}from"http";import{Socket as e}from"net";function i(J){return J.replace(/\x1b\[[0-9;]*m/g,"").replace(/\[[0-9;]*m/g,"").replace(/\n\s*\n/g,`
2
+ import{W as P,Y as c,Z as f,_ as l}from"./chunk-3qmvtfw2.js";import{na as u,oa as m}from"./chunk-7t60d5qy.js";import"./chunk-bwg7genv.js";import"./chunk-mvd4mc8p.js";import"./chunk-7txst143.js";import"./chunk-08m9egzx.js";import"./chunk-s0z61m9j.js";import"./chunk-b6zqjyn1.js";import{gj as S}from"./chunk-228w21t6.js";import{yl as T}from"./chunk-j49vh5bs.js";import{Ol as y}from"./chunk-2g2fsr71.js";import"./chunk-vgxkt9vd.js";import{join as YJ}from"path";import{createServer as AJ}from"vite";import{join as R,sep as o}from"path";import{existsSync as a,statSync as s}from"fs";import{IncomingMessage as t,ServerResponse as r}from"http";import{Socket as e}from"net";function i(J){return J.replace(/\x1b\[[0-9;]*m/g,"").replace(/\[[0-9;]*m/g,"").replace(/\n\s*\n/g,`
3
3
  `).split(`
4
4
  `).map((W)=>W.trim()).filter((W)=>W.length>0).join(`
5
5
  `).trim()}function N(J){return`
@@ -55,4 +55,4 @@ window.$RefreshSig$ = () => (type) => type;
55
55
  window.__vite_plugin_react_preamble_installed__ = true;
56
56
  `;function zJ(J){let{pathname:W}=new URL(J.url),Z=($)=>new Response($,{headers:{"Content-Type":"application/javascript"}});if(W===k)return Z(ZJ);if(W.startsWith("/render-error.js"))return Z("window.render_error = true");if(W.startsWith("/refresh.js"))return Z($J);return null}function GJ(J,W){let Z=J.config?.publicDir;if(!Z||W==="/assets"||W.startsWith("/assets/"))return!1;let $;try{$=decodeURIComponent(W)}catch{return!1}if($.split("/").some((Q)=>Q.startsWith(".")))return!1;let z=R(Z,$);if(!z.startsWith(Z+o))return!1;try{return s(z).isFile()}catch{return!1}}function E(J,W,Z){let $=R(process.cwd(),"app");return async(z)=>{let{pathname:Q}=new URL(z.url),L=(G)=>{if(console.error(G),Z.ssrFixStacktrace?.(G),x(G),y(Q))return new Response(JSON.stringify({error:S("server_error",G?.message??String(G),500)}),{status:500,headers:{"Content-Type":"application/json"}});return globalThis.__gemiErrorPageServed=!0,new Response(N(I(G)),{status:500,headers:{"Content-Type":"text/html"}})},X=async(G)=>{let O=zJ(G);if(O)return O;try{let Y=J.fetch.bind(J),A=(GJ(Z,Q)&&!(await J.staticFiles(G)).publicFiles?null:await JJ(Z,G))??await Y(G);if(A instanceof Response)return A;let V={},_={},C={},d=(U,j)=>`"${U}": () => import("${j}")`,D=[],n=J.getRequiredViews.call(J);for(let U of["404",...J.getFlatComponentTree.call(J)]){if(Bun.env.NODE_ENV==="test")break;let j=`${process.env.APP_DIR}`,b=n[U];if(b&&!a(`${j}/views/${U}.tsx`))throw f(U,b);let B=await M(Z).import(`${j}/views/${U}.tsx`);V[U]=B.default,_[U]=B?.OpenGraph,C[U]=B,D.push(d(U,`/app/views/${U}.tsx`))}let p=`{${D.join(",")}}`;return await A({getStyles:async(U,j)=>await P($,Z,U,j?.layout),resolveIsland:(U)=>({src:`/${U}${T}`,preload:[]}),buildId:"dev",bootstrapModules:[k],viewImportMap:V,viewModules:C,ogMap:_,loaders:p,cssManifest:{}})}catch(Y){return L(Y)}};return await W(z,(G)=>J.withGlobalMiddleware(G,X,L))}}function QJ(J){try{return Bun.listen({hostname:"0.0.0.0",port:J,socket:{data(){}}}).stop(!0),!0}catch(W){return W?.code!=="EADDRINUSE"}}function g(J,W=QJ){let Z=24678+(J-5173);if(Z>65471)Z=24678;for(let $=Z;$<Z+64;$++)if(W($))return $;throw Error(`Could not find a free port for Vite's HMR websocket: tried ${Z}-${Z+64-1}. Set one explicitly in gemi.config.ts as \`vite: { server: { ws: { port } } }\`.`)}import{createServer as XJ}from"http";var KJ=new Set(["vite-hmr","vite-ping"]);async function q(J){let W=XJ((Z,$)=>{$.writeHead(426,{"Content-Type":"text/plain"}),$.end("Upgrade Required")});return await new Promise((Z,$)=>{W.once("error",$),W.listen(J,"127.0.0.1",()=>{W.off("error",$),Z()})}),W}function w(J){if(!J||typeof J!=="object")return null;let Z=J.server?.address?.();if(Z&&typeof Z==="object"&&"port"in Z)return Number(Z.port)||null;return null}function h(J){if(J.headers.get("upgrade")?.toLowerCase()!=="websocket")return!1;return KJ.has(J.headers.get("sec-websocket-protocol")??"")}var LJ=(J)=>typeof J==="string"?J:new Uint8Array(J);async function v(J,W,Z){let $=new URL(J.url),z=J.headers.get("sec-websocket-protocol")??"vite-hmr",Q={host:J.headers.get("host")??$.host},L=J.headers.get("origin");if(L)Q.origin=L;let X=new WebSocket(`ws://127.0.0.1:${Z}${$.pathname}${$.search}`,{protocols:[z],headers:Q});X.binaryType="arraybuffer";let G={upstream:X,early:[]};if(X.onmessage=(K)=>{let A=LJ(K.data);if(G.browser)G.browser.send(A);else G.early.push(A)},X.onclose=(K)=>{G.browser?.close(UJ(K.code),K.reason)},X.onerror=()=>{},!await new Promise((K)=>{X.addEventListener("open",()=>K(!0),{once:!0}),X.addEventListener("close",()=>K(!1),{once:!0})}))return new Response("Vite refused the HMR websocket",{status:403});if(!W.upgrade(J,{headers:{"Sec-WebSocket-Protocol":z},data:G}))return X.close(),new Response("WebSocket upgrade failed",{status:400});return}function UJ(J){if(J===1000||J>=1001&&J<=1003||J>=1007&&J<=1014)return J;if(J>=3000&&J<=4999)return J;return 1000}var F={open(J){let W=J.data;for(let Z of W.early)J.send(Z);if(W.early=[],W.browser=J,W.upstream.readyState!==WebSocket.OPEN)J.close(1000)},message(J,W){if(J.data.upstream.readyState===WebSocket.OPEN)J.data.upstream.send(W)},close(J){let{upstream:W}=J.data;if(W.readyState<=WebSocket.OPEN)W.close()}};function OJ(J,W){let Z=W.websocket,$=(z)=>z.data?.gemiSocket===!0;return{...W.socketOptions(),maxPayloadLength:16777216,closeOnBackpressureLimit:!1,open:(z)=>$(z)?Z.open?.(z):J.open?.(z),message:(z,Q)=>$(z)?Z.message(z,Q):J.message(z,Q),close:(z,Q,L)=>$(z)?Z.close?.(z,Q,L):J.close?.(z,Q,L)}}var H=process.cwd(),jJ=YJ(H,"app");if(!globalThis.__gemiErrorHooked)globalThis.__gemiErrorHooked=!0,process.on("unhandledRejection",(J)=>{console.error(J),x(J)}),process.on("uncaughtException",(J)=>{console.error(J),x(J)});async function vJ(J,W){let Z=Number(process.env.PORT)||5173,$=l(),z=Boolean(globalThis.__gemiVite),Q=J.devAllowedHosts.call(J);if(Q===!0&&!z)console.warn("gemi dev: `route.domains.devHosts` is `true`, so the dev server answers any Host. A web page you visit can then read the app's source through DNS rebinding. List the hosts you need instead.");let L=globalThis.__gemiVite??=await AJ({configFile:!1,plugins:[m()],server:{middlewareMode:!0,port:Z,ws:{server:await q(g(Z))},allowedHosts:Q,watch:{ignored:(K)=>{let A=K.split(/[/\\]/).pop()??"";return A===".env"||A.startsWith(".env.")}}},appType:"custom",resolve:{dedupe:["react","react-dom"]},optimizeDeps:{include:["react","react-dom","react-dom/client"]},ssr:{external:[...u]}});process.env.ROOT_DIR=H,process.env.APP_DIR=jJ;let X=E(J,W,L),G=w(L.config?.server?.ws),O=J.sockets(),Y=Bun.serve({port:Z,idleTimeout:$,fetch:(K,A)=>{if(G!==null&&h(K))return v(K,A,G);if(J.applyTrustedClientIp(K),O?.matches(K))return O.upgrade(K,A);return X(K)},websocket:O?OJ(F,O):F});if(await O?.start(Y),z)M(L).clearCache();if(z)if(globalThis.__gemiErrorActive&&globalThis.__gemiErrorPageServed)globalThis.__gemiErrorActive=!1,globalThis.__gemiErrorPageServed=!1,L.ws.send({type:"full-reload"});else globalThis.__gemiErrorActive=!1,L.ws.send({type:"custom",event:"http-reload"});else c({port:Y.port,rootDir:H});return Y}export{I as viteErrorPayload,vJ as httpDev};
57
57
 
58
- //# debugId=753FD0D130422AF164756E2164756E21
58
+ //# debugId=42D6D345C648986D64756E2164756E21
@@ -9,6 +9,6 @@
9
9
  "import { createServer, type Server as NodeServer } from \"node:http\";\n\nimport type { Server, ServerWebSocket, WebSocketHandler } from \"bun\";\n\n// Vite's HMR websocket, carried on the dev server's own port.\n//\n// In middleware mode Vite has no HTTP server of its own, so by default it\n// stands up a second one for the websocket, on a second port (see\n// `hmrPort.ts`), and tells the browser to connect to `<page host>:<that port>`.\n// A reverse proxy or tunnel (ngrok, a container port mapping, a phone on the\n// LAN through https) only carries the port the page came from, so HMR could\n// not connect there, and the client logged connection failures forever.\n//\n// Vite can attach its websocket to a server it is handed (`server.ws.server`)\n// instead, and then tells the browser to connect to the page's own origin. That\n// server has to be a Node `http.Server`; the dev server is `Bun.serve`. So:\n//\n// - the Node server Vite is handed listens on loopback only, on the port\n// `resolveHmrPort` picked, and answers nothing but websocket upgrades;\n// - `Bun.serve` accepts the browser's upgrade on the page's origin and relays\n// frames both ways to that loopback server.\n//\n// The relay forwards the browser's `Host` and `Origin` and the request's query\n// (the `token`), so Vite still runs its own host and token checks against what\n// the browser actually sent.\n\n/** The subprotocols Vite's client opens its sockets with. */\nconst VITE_PROTOCOLS = new Set([\"vite-hmr\", \"vite-ping\"]);\n\n/**\n * Start the loopback Node server Vite attaches its HMR websocket to.\n * Everything but an upgrade gets `426 Upgrade Required`, as Vite's own\n * websocket server answers.\n */\nexport async function listenHmrServer(port: number): Promise<NodeServer> {\n const server = createServer((_req, res) => {\n res.writeHead(426, { \"Content-Type\": \"text/plain\" });\n res.end(\"Upgrade Required\");\n });\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n return server;\n}\n\n/**\n * The loopback port to relay to, read from the config Vite actually resolved,\n * so an app that set its own `server.ws` in `gemi.config.ts` is relayed to\n * where Vite really is, or not relayed at all. `null` when Vite was not given\n * a server (its websocket is then on a port of its own, and the client goes\n * there directly) or when HMR is off.\n */\nexport function hmrRelayPort(wsConfig: unknown): number | null {\n if (!wsConfig || typeof wsConfig !== \"object\") return null;\n const server = (wsConfig as { server?: { address?: () => unknown } }).server;\n const address = server?.address?.();\n if (address && typeof address === \"object\" && \"port\" in address) {\n return Number((address as { port: number }).port) || null;\n }\n return null;\n}\n\n/** Whether a request is the Vite client opening its HMR (or ping) socket. */\nexport function isHmrUpgrade(req: Request): boolean {\n if (req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\") return false;\n return VITE_PROTOCOLS.has(req.headers.get(\"sec-websocket-protocol\") ?? \"\");\n}\n\nexport type HmrRelayData = {\n /** The socket to Vite, already open when the browser's is accepted. */\n upstream: WebSocket;\n /** Frames Vite sent before the browser's socket opened (its `connected`). */\n early: (string | Uint8Array)[];\n browser?: ServerWebSocket<HmrRelayData>;\n};\n\ntype Frame = string | Uint8Array;\n\nconst frameOf = (data: unknown): Frame =>\n typeof data === \"string\" ? data : new Uint8Array(data as ArrayBuffer);\n\n/**\n * Open the socket to Vite first, and accept the browser's upgrade only once\n * Vite has accepted it. Returns `undefined` once Bun has taken the request\n * over, or a refusal.\n *\n * The order matters. Vite refuses a socket whose host is not in\n * `allowedHosts`, or a cross-origin one without its token. Had the browser's\n * socket been accepted first and closed when Vite refused, the client would\n * read that as \"server connection lost\", ping (which Vite always answers),\n * and reload the page, forever. Refused before it opens, the client logs one\n * \"failed to connect to websocket\" and the page keeps working.\n */\nexport async function upgradeHmr(\n req: Request,\n server: Server<HmrRelayData>,\n port: number,\n): Promise<Response | undefined> {\n const url = new URL(req.url);\n const protocol = req.headers.get(\"sec-websocket-protocol\") ?? \"vite-hmr\";\n // `Host` is what Vite's `allowedHosts` check reads; the URL's host is the\n // same value `Bun.serve` derived it from.\n const headers: Record<string, string> = {\n host: req.headers.get(\"host\") ?? url.host,\n };\n const origin = req.headers.get(\"origin\");\n if (origin) headers.origin = origin;\n\n const upstream = new WebSocket(\n `ws://127.0.0.1:${port}${url.pathname}${url.search}`,\n {\n protocols: [protocol],\n headers,\n } as any,\n );\n upstream.binaryType = \"arraybuffer\";\n const data: HmrRelayData = { upstream, early: [] };\n\n upstream.onmessage = (event) => {\n const frame = frameOf(event.data);\n if (data.browser) data.browser.send(frame);\n else data.early.push(frame);\n };\n upstream.onclose = (event) => {\n data.browser?.close(sendableCloseCode(event.code), event.reason);\n };\n upstream.onerror = () => {\n // A `close` follows; it ends the browser's socket if there is one.\n };\n\n const opened = await new Promise<boolean>((resolve) => {\n upstream.addEventListener(\"open\", () => resolve(true), { once: true });\n upstream.addEventListener(\"close\", () => resolve(false), { once: true });\n });\n if (!opened) {\n return new Response(\"Vite refused the HMR websocket\", { status: 403 });\n }\n\n const upgraded = server.upgrade(req, {\n // The browser fails a connection whose response does not echo the\n // subprotocol it asked for.\n headers: { \"Sec-WebSocket-Protocol\": protocol },\n data,\n });\n if (!upgraded) {\n upstream.close();\n return new Response(\"WebSocket upgrade failed\", { status: 400 });\n }\n return undefined;\n}\n\n// A close code that may be sent in a close frame. 1005, 1006 and 1015 are\n// reported locally and never sent.\nfunction sendableCloseCode(code: number): number {\n if (\n code === 1000 ||\n (code >= 1001 && code <= 1003) ||\n (code >= 1007 && code <= 1014)\n ) {\n return code;\n }\n if (code >= 3000 && code <= 4999) return code;\n return 1000;\n}\n\n/** `Bun.serve`'s `websocket` option: relays frames to and from Vite. */\nexport const hmrRelayHandler: WebSocketHandler<HmrRelayData> = {\n open(ws: ServerWebSocket<HmrRelayData>) {\n const data = ws.data;\n for (const frame of data.early) ws.send(frame);\n data.early = [];\n data.browser = ws;\n // Vite may have hung up while the upgrade was in flight.\n if (data.upstream.readyState !== WebSocket.OPEN) ws.close(1000);\n },\n message(ws: ServerWebSocket<HmrRelayData>, message) {\n if (ws.data.upstream.readyState === WebSocket.OPEN) {\n ws.data.upstream.send(message);\n }\n },\n close(ws: ServerWebSocket<HmrRelayData>) {\n const { upstream } = ws.data;\n if (upstream.readyState <= WebSocket.OPEN) upstream.close();\n },\n};\n"
10
10
  ],
11
11
  "mappings": "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",
12
- "debugId": "753FD0D130422AF164756E2164756E21",
12
+ "debugId": "42D6D345C648986D64756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -2,6 +2,6 @@
2
2
  import{existsSync as $,readdirSync as B}from"fs";import{join as Y,relative as G}from"path";function J(K,Q=[]){let U=[],X=(H)=>{let z=G(K,H).split("\\").join("/");return Q.some((q)=>z===q||z.startsWith(`${q}/`))},V=(H)=>{for(let z of B(H,{withFileTypes:!0}).sort((q,Z)=>q.name<Z.name?-1:q.name>Z.name?1:0)){let q=Y(H,z.name);if(X(q))continue;if(z.isDirectory()){if(z.name.startsWith(".")||z.name==="node_modules")continue;if($(Y(q,"package.json")))continue;V(q);continue}if(!z.name.endsWith(".ts")&&!z.name.endsWith(".tsx"))continue;if(z.name.endsWith(".d.ts"))continue;if(/\.(test|test-d|spec|bench)\.tsx?$/.test(z.name))continue;U.push(q)}};if(!$(K))return U;return V(K),U}class A extends Error{constructor(K,Q){super(K,Q);this.name="DiscoveryError"}}async function W(K,Q,U=[],X){let V=new Set;for(let H of J(K,U)){let z;try{z=await import(H)}catch(q){throw new A(`${H} could not be imported, so the classes in it could not be discovered:
3
3
  ${q.message}
4
4
  List the classes explicitly in the config slice for this directory to skip the walk.`,{cause:q})}for(let q of Object.values(z)){if(typeof q==="function"&&q!==Q&&Object.prototype.isPrototypeOf.call(Q,q)){V.add(q);continue}X?.(q,H)}}return[...V]}function F(){return Y(process.cwd(),process.env.GEMI_PROJECT_DIR??"")}
5
- export{J as Gl,A as Hl,W as Il,F as Jl};
5
+ export{J as Jl,A as Kl,W as Ll,F as Ml};
6
6
 
7
- //# debugId=DC6AAA6BDCEDA86564756E2164756E21
7
+ //# debugId=0E62821082E7519E64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import { existsSync, readdirSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\n/**\n * Finding the classes an application declared and never imported — the walk\n * #322 and #323 both end at.\n *\n * ### Why it has to run the files\n *\n * A job that is written and not listed does not fail; it disappears.\n * `QueueManager.run` looks a dispatched name up in the map its config built and\n * drops what is not there, so the dispatch is simply lost. A cron drifts worse:\n * nothing is waiting on a tick, so a job that never fires reports nothing to\n * anyone. What both come down to is that `app/config/queue.ts` naming every\n * `Job` subclass is the *only* thing putting those classes in the module graph —\n * the list and the directory are two spellings of one set, kept in step by hand.\n *\n * The way out of that is to read the directory, and there is no static read that\n * will do: the class does not exist until its module has run. So **every file\n * walked here is imported**, and a file that *does something* when imported does\n * it here — at boot, in production, on every start. `gemi check models` makes\n * the same trade for the same reason and pays it once per CI run; a caller of\n * this pays it once per process.\n *\n * ### What that asks of a caller\n *\n * **Point it at a directory of class declarations, not at `app/`.** The skip\n * rules on `sourceFiles` drop what certainly is not one — tests, benchmarks,\n * `.d.ts`, vendored packages — and nothing else. Widening the guesses is how a\n * discovery pass ends up quietly covering less than the directory holds, which\n * is the same silence in a new place.\n *\n * **Let a broken file stop the boot.** `discoverClasses` rethrows an import\n * failure naming the file rather than dropping it and carrying on, for the same\n * reason: four classes found out of five looks exactly like five out of five.\n *\n * **Leave a way out.** Discovery is what should happen when an app said\n * nothing. An app that lists its classes explicitly must not reach this file at\n * all — that is the escape hatch for a directory holding something this cannot\n * import, and it is the sentence an error from here should point at.\n *\n * ### One more thing worth knowing\n *\n * This imports by absolute path, while the application imports the same files\n * through the `@/app/*` alias. Bun keys its module registry by the *resolved*\n * path, so those two specifiers land on one module: a job already reached from\n * a controller is not evaluated a second time here, and the class object is the\n * same one. `gemi build` leaves that true in production — `packages: \"external\"`\n * keeps the app's own code out of `dist/server/server.mjs` and resolves it from\n * source at runtime, exactly as `gemi dev` does.\n *\n * Nothing here depends on that holding, and deliberately: `QueueManager` and the\n * `Scheduler`'s cross-reload registry are both keyed by name rather than by\n * class identity, so a build that did inline the app's modules would produce a\n * duplicate class object and still register the right job. Worth knowing before\n * writing a registry keyed the other way.\n */\n\n/**\n * The files under `dir` that could declare a class.\n *\n * Everything underneath it, because apps do group classes into folders, minus\n * what cannot be one. Each of these is going to be *imported*, so the exclusions\n * are about what is certainly not source rather than about what is probably not:\n *\n * - **Declaration files.** `.d.ts` has no runtime module behind it.\n * - **Tests, type tests and benchmarks**, by the suffix a runner already\n * recognises.\n * - **Dot-directories and `node_modules`.**\n * - **Any directory holding a `package.json`.** That is a package that happens\n * to live here — a vendored client, a generated SDK — not this app's source,\n * and importing its entry point runs somebody else's module graph. The\n * template has two under `app/models`.\n *\n * `ignore` is the escape hatch for the rest: a path prefix, relative to `dir`,\n * naming a file or a directory of adjacent code that runs something on import.\n * Nothing is ignored by default.\n *\n * The order is the same on every run over the same tree, which matters because\n * the caller is going to import in it: entries are sorted per directory before\n * recursing, and `readdirSync` order is the filesystem's rather than\n * alphabetical — a tree written `A.ts` then `B.ts` reads back `B.ts` first on\n * the machines this was tested on. Sorting per directory rather than sorting the\n * finished list is deliberate: for a tree holding both `a.ts` and `a/b.ts`, this\n * emits `a/b.ts` first, because the directory sorts before the file.\n *\n * A directory that does not exist yields an empty list rather than throwing.\n * \"The app has no jobs yet\" is an ordinary state and not this function's to\n * complain about — but it is indistinguishable from \"the app's source did not\n * ship\", so a caller that boots on the answer owes the reader a word about which\n * one it got.\n */\nexport function sourceFiles(dir: string, ignore: string[] = []): string[] {\n const out: string[] = [];\n\n const ignored = (path: string) => {\n const rel = relative(dir, path).split(\"\\\\\").join(\"/\");\n return ignore.some(\n (pattern) => rel === pattern || rel.startsWith(`${pattern}/`),\n );\n };\n\n const walk = (current: string) => {\n for (const entry of readdirSync(current, { withFileTypes: true }).sort(\n (a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0),\n )) {\n const path = join(current, entry.name);\n if (ignored(path)) continue;\n\n if (entry.isDirectory()) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\")\n continue;\n if (existsSync(join(path, \"package.json\"))) continue;\n walk(path);\n continue;\n }\n\n if (!entry.name.endsWith(\".ts\") && !entry.name.endsWith(\".tsx\")) continue;\n if (entry.name.endsWith(\".d.ts\")) continue;\n if (/\\.(test|test-d|spec|bench)\\.tsx?$/.test(entry.name)) continue;\n\n out.push(path);\n }\n };\n\n if (!existsSync(dir)) return out;\n\n walk(dir);\n return out;\n}\n\n/**\n * A class, as much of one as this file can name. `abstract` so that a base an\n * app never instantiates directly is a legal argument.\n */\ntype ClassLike = abstract new (...args: never[]) => unknown;\n\n/**\n * A file that would not import, reported with the file that would not import.\n *\n * Separate from a bare rethrow because the stack of a failed dynamic import\n * names the module that failed to *resolve*, several frames deep, and says\n * nothing about the walk that asked for it — so the reader learns that some\n * `?raw` specifier is unresolvable without learning that discovery is what\n * imported it, or that listing the classes explicitly is how they get their boot\n * back.\n */\nexport class DiscoveryError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"DiscoveryError\";\n }\n}\n\n/**\n * Every exported class under `dir` whose prototype chain reaches `base`.\n *\n * `base` is a parameter rather than an import so that this file names no\n * service and stays cheap to depend on — `bin/check-models.ts` uses the walker\n * above and is bundled into `dist/bin/gemi.js`, which is not somewhere gemi's\n * service layer should end up. It is also what lets a test hand in a base class\n * of its own instead of standing up a project that can resolve `gemi/services`.\n *\n * `base` itself is never returned. A directory whose files import their base\n * from a sibling — the shape an app reaches for when several jobs share a gate —\n * re-exports it as often as not, and a framework that scheduled the abstract\n * base along with its subclasses would be running a job nobody wrote.\n *\n * A class is returned once no matter how many exports name it. A barrel in the\n * directory re-exporting everything beside it is the ordinary case, and it makes\n * every class reachable twice.\n *\n * The order is the walk's, and within a file the module namespace's, which the\n * language sorts by name. So the answer is the same on every run — worth having\n * where the caller is a scheduler and the alternative is a boot order that\n * depends on the filesystem.\n *\n * `onSkipped` is handed every export that did *not* match, with the file it came\n * from. Discovery's characteristic failure is a thing the author wrote and this\n * walk cannot see, and by the time an export has been discarded here the\n * information about why is gone — the caller is left holding \"four classes\"\n * where the directory holds five. A caller that can recognise its own\n * near-misses, as `discoverCommands` recognises a builder chain that was never\n * finished, uses this to say so by name instead.\n *\n * @throws DiscoveryError if a walked file cannot be imported. Not a skip: a file\n * that will not load is a class the caller was going to be told about and now is\n * not, which is the failure discovery exists to remove.\n */\nexport async function discoverClasses<T extends ClassLike>(\n dir: string,\n base: T,\n ignore: string[] = [],\n onSkipped?: (value: unknown, file: string) => void,\n): Promise<T[]> {\n const found = new Set<T>();\n\n for (const path of sourceFiles(dir, ignore)) {\n let module: Record<string, unknown>;\n\n try {\n module = (await import(path)) as Record<string, unknown>;\n } catch (error) {\n throw new DiscoveryError(\n `${path} could not be imported, so the classes in it could not be ` +\n `discovered:\\n ${(error as Error).message}\\n` +\n `List the classes explicitly in the config slice for this directory ` +\n `to skip the walk.`,\n { cause: error },\n );\n }\n\n for (const value of Object.values(module)) {\n if (\n typeof value === \"function\" &&\n value !== base &&\n Object.prototype.isPrototypeOf.call(base, value)\n ) {\n found.add(value as unknown as T);\n continue;\n }\n\n onSkipped?.(value, path);\n }\n }\n\n return [...found];\n}\n\n/**\n * The directory an app's `app/` sits in, as the running process can know it.\n *\n * `ROOT_DIR` is the obvious answer and is not available: `Server.start` awaits\n * `waitForBoot()` — every provider's `register` and `boot` — and only then\n * imports the http layer that sets it. Anything resolving paths during boot is\n * earlier than the variable it would want.\n *\n * What it can use is the same rule `httpProd` computes `ROOT_DIR` with a moment\n * later, which is why that file now calls this instead of repeating it. `gemi\n * dev` and `gemi start` both spawn the server with no `cwd`, so the process\n * inherits the CLI's, and the CLI takes `process.cwd()` for the project root\n * itself — `bun/preload.ts` reads `gemi.config` from it on the same assumption.\n *\n * `httpDev` computes a bare `process.cwd()`, so it and `httpProd` already\n * disagree whenever `GEMI_PROJECT_DIR` is set. Nothing in this repo sets it and\n * `gemi start` ignores it when locating the built entry point, so the two rules\n * are the same rule for every configuration that runs today; the divergence is\n * older than this function and wants its own fix.\n */\nexport function projectRoot(): string {\n return join(process.cwd(), process.env.GEMI_PROJECT_DIR ?? \"\");\n}\n"
6
6
  ],
7
7
  "mappings": ";AAAA,qBAAS,iBAAY,WACrB,eAAS,cAAM,aA2FR,SAAS,CAAW,CAAC,EAAa,EAAmB,CAAC,EAAa,CACxE,IAAM,EAAgB,CAAC,EAEjB,EAAU,CAAC,IAAiB,CAChC,IAAM,EAAM,EAAS,EAAK,CAAI,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG,EACpD,OAAO,EAAO,KACZ,CAAC,IAAY,IAAQ,GAAW,EAAI,WAAW,GAAG,IAAU,CAC9D,GAGI,EAAO,CAAC,IAAoB,CAChC,QAAW,KAAS,EAAY,EAAS,CAAE,cAAe,EAAK,CAAC,EAAE,KAChE,CAAC,EAAG,IAAO,EAAE,KAAO,EAAE,KAAO,GAAK,EAAE,KAAO,EAAE,KAAO,EAAI,CAC1D,EAAG,CACD,IAAM,EAAO,EAAK,EAAS,EAAM,IAAI,EACrC,GAAI,EAAQ,CAAI,EAAG,SAEnB,GAAI,EAAM,YAAY,EAAG,CACvB,GAAI,EAAM,KAAK,WAAW,GAAG,GAAK,EAAM,OAAS,eAC/C,SACF,GAAI,EAAW,EAAK,EAAM,cAAc,CAAC,EAAG,SAC5C,EAAK,CAAI,EACT,SAGF,GAAI,CAAC,EAAM,KAAK,SAAS,KAAK,GAAK,CAAC,EAAM,KAAK,SAAS,MAAM,EAAG,SACjE,GAAI,EAAM,KAAK,SAAS,OAAO,EAAG,SAClC,GAAI,oCAAoC,KAAK,EAAM,IAAI,EAAG,SAE1D,EAAI,KAAK,CAAI,IAIjB,GAAI,CAAC,EAAW,CAAG,EAAG,OAAO,EAG7B,OADA,EAAK,CAAG,EACD,EAmBF,MAAM,UAAuB,KAAM,CACxC,WAAW,CAAC,EAAiB,EAA+B,CAC1D,MAAM,EAAS,CAAO,EACtB,KAAK,KAAO,iBAEhB,CAqCA,eAAsB,CAAoC,CACxD,EACA,EACA,EAAmB,CAAC,EACpB,EACc,CACd,IAAM,EAAQ,IAAI,IAElB,QAAW,KAAQ,EAAY,EAAK,CAAM,EAAG,CAC3C,IAAI,EAEJ,GAAI,CACF,EAAU,MAAa,UACvB,MAAO,EAAO,CACd,MAAM,IAAI,EACR,GAAG;AAAA,MACoB,EAAgB;AAAA,sFAGvC,CAAE,MAAO,CAAM,CACjB,EAGF,QAAW,KAAS,OAAO,OAAO,CAAM,EAAG,CACzC,GACE,OAAO,IAAU,YACjB,IAAU,GACV,OAAO,UAAU,cAAc,KAAK,EAAM,CAAK,EAC/C,CACA,EAAM,IAAI,CAAqB,EAC/B,SAGF,IAAY,EAAO,CAAI,GAI3B,MAAO,CAAC,GAAG,CAAK,EAuBX,SAAS,CAAW,EAAW,CACpC,OAAO,EAAK,QAAQ,IAAI,EAAG,QAAQ,IAAI,kBAAoB,EAAE",
8
- "debugId": "DC6AAA6BDCEDA86564756E2164756E21",
8
+ "debugId": "0E62821082E7519E64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{Ll as J}from"./chunk-y67rmd3y.js";class L{kernel;onException;constructor(f){this.kernel=new f.kernel,this.kernel.boot.call(this.kernel),this.onException=f.onException??((A)=>{console.error("Unhandled exception in App:",A)})}async waitForBoot(){await this.kernel.waitForBoot()}getComponentTree(){return this.kernel.viewRoutes().componentTree}getFlatComponentTree(){let f=new Set;for(let A of this.kernel.domains().viewDispatchers())for(let C of A.flatComponentTree)f.add(C);return Array.from(f)}getRequiredViews(){let f={};for(let A of this.kernel.domains().viewDispatchers())Object.assign(f,A.requiredViews);return f}devAllowedHosts(){let{resolver:f}=this.kernel.domains();if(!f)return[];if(f.devHosts===!0)return!0;return[`.${f.root}`,...f.devHosts]}sockets(){return this.kernel.sockets.call(this.kernel)}applyTrustedClientIp(f){this.kernel.domains().applyClientIp(f)}async staticFiles(f){return this.kernel.run.call(this.kernel,()=>this.kernel.domains().staticFiles(f))}getRouteManifest(){return this.kernel.viewRoutes().routeManifest}globallyGated=new WeakMap;async withGlobalMiddleware(f,A,C){let z;try{z=await this.kernel.run.call(this.kernel,()=>this.kernel.globalMiddleware(f))}catch(F){return await C(F)}if(z.refusal)return z.refusal;return this.globallyGated.set(f,z.carried),z.apply(await A(f))}async fetch(f){let A=new URL(f.url);return this.kernel.run.call(this.kernel,async()=>{this.applyTrustedClientIp(f);let C=this.globallyGated.has(f),z=C?null:await this.kernel.globalMiddleware(f),F=C?this.globallyGated.get(f):z.carried;if(z?.refusal)return z.refusal;let H=this.kernel.mcpHttp();if(H){let B=await H.handle(f);if(B)return z?z.apply(B):B}let I=this.kernel.domains(),D=await I.ask(f)??await I.route(f);if(D instanceof Response)return z?z.apply(D):D;if(!D){let B=new Response("Unknown host",{status:404});return z?z.apply(B):B}let G=J(A.pathname)?await D.api.handleApiRequest(f,F):await D.view.handleViewRequest(f,F);if(!z)return G;if(typeof G==="function"){let B=G;return async(...M)=>z.apply(await B(...M))}return z.apply(G)})}dispatchJob(f,A){return this.kernel.run.bind(this.kernel)(()=>{return this.kernel.queue().dispatchJob(f,A)})}shutdown(f){return this.kernel.shutdown(f)}destroy(){this.kernel.destroy()}clone(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}}export{L as Ea};
2
+ import{Ol as J}from"./chunk-2g2fsr71.js";class L{kernel;onException;constructor(f){this.kernel=new f.kernel,this.kernel.boot.call(this.kernel),this.onException=f.onException??((A)=>{console.error("Unhandled exception in App:",A)})}async waitForBoot(){await this.kernel.waitForBoot()}getComponentTree(){return this.kernel.viewRoutes().componentTree}getFlatComponentTree(){let f=new Set;for(let A of this.kernel.domains().viewDispatchers())for(let C of A.flatComponentTree)f.add(C);return Array.from(f)}getRequiredViews(){let f={};for(let A of this.kernel.domains().viewDispatchers())Object.assign(f,A.requiredViews);return f}devAllowedHosts(){let{resolver:f}=this.kernel.domains();if(!f)return[];if(f.devHosts===!0)return!0;return[`.${f.root}`,...f.devHosts]}sockets(){return this.kernel.sockets.call(this.kernel)}applyTrustedClientIp(f){this.kernel.domains().applyClientIp(f)}async staticFiles(f){return this.kernel.run.call(this.kernel,()=>this.kernel.domains().staticFiles(f))}getRouteManifest(){return this.kernel.viewRoutes().routeManifest}globallyGated=new WeakMap;async withGlobalMiddleware(f,A,C){let z;try{z=await this.kernel.run.call(this.kernel,()=>this.kernel.globalMiddleware(f))}catch(F){return await C(F)}if(z.refusal)return z.refusal;return this.globallyGated.set(f,z.carried),z.apply(await A(f))}async fetch(f){let A=new URL(f.url);return this.kernel.run.call(this.kernel,async()=>{this.applyTrustedClientIp(f);let C=this.globallyGated.has(f),z=C?null:await this.kernel.globalMiddleware(f),F=C?this.globallyGated.get(f):z.carried;if(z?.refusal)return z.refusal;let H=this.kernel.mcpHttp();if(H){let B=await H.handle(f);if(B)return z?z.apply(B):B}let I=this.kernel.domains(),D=await I.ask(f)??await I.route(f);if(D instanceof Response)return z?z.apply(D):D;if(!D){let B=new Response("Unknown host",{status:404});return z?z.apply(B):B}let G=J(A.pathname)?await D.api.handleApiRequest(f,F):await D.view.handleViewRequest(f,F);if(!z)return G;if(typeof G==="function"){let B=G;return async(...M)=>z.apply(await B(...M))}return z.apply(G)})}dispatchJob(f,A){return this.kernel.run.bind(this.kernel)(()=>{return this.kernel.queue().dispatchJob(f,A)})}shutdown(f){return this.kernel.shutdown(f)}destroy(){this.kernel.destroy()}clone(){return Object.assign(Object.create(Object.getPrototypeOf(this)),this)}}export{L as Ea};
3
3
 
4
- //# debugId=3431C8FBDEAFCCD364756E2164756E21
4
+ //# debugId=AAD6E0C63612F55B64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import type { Kernel } from \"../kernel\";\nimport type { CarriedContext } from \"../http/requestContext\";\nimport { isApiPath } from \"../services/router/apiPath\";\nimport type { SocketHub } from \"../services/broadcast/SocketHub\";\n\n/** What the servers use of the broadcast `SocketHub`. */\nexport type SocketTransport = Pick<\n SocketHub,\n \"matches\" | \"upgrade\" | \"websocket\" | \"socketOptions\" | \"start\" | \"shutdown\"\n>;\n\ninterface AppParams {\n kernel: new () => Kernel;\n onException?: (error: Error) => void;\n}\n\nexport class App {\n private kernel: Kernel;\n public onException?: (error: Error) => void;\n\n constructor(params: AppParams) {\n this.kernel = new params.kernel();\n this.kernel.boot.call(this.kernel);\n this.onException =\n params.onException ??\n ((error: Error) => {\n console.error(\"Unhandled exception in App:\", error);\n });\n }\n\n // Every service this class touches is resolved through a `this.kernel.*`\n // accessor rather than by importing the service class and calling `app()`\n // here. That is deliberate: the built bin (`dist/bin/gemi.js`) bundles its own\n // copy of gemi, while the app's Kernel is loaded from source and resolves\n // `gemi/*` to the source modules — so the two copies have *different*\n // `kernelContext` AsyncLocalStorage instances and different `Application`\n // class objects. A method call on the Kernel executes in the app's copy and\n // reads the app's container; a resolution attempted here would not. Service\n // *tokens* still cross the boundary safely (they are plain strings), which is\n // why `kernel.resolve()` works from either side.\n public async waitForBoot() {\n await this.kernel.waitForBoot();\n }\n\n public getComponentTree() {\n return this.kernel.viewRoutes().componentTree;\n }\n\n // Every host group's views, not just the root's: the servers load these\n // modules up front, and a view only an `admin.` group routes to still has\n // to be among them.\n public getFlatComponentTree() {\n const views = new Set<string>();\n for (const dispatcher of this.kernel.domains().viewDispatchers()) {\n for (const view of dispatcher.flatComponentTree) {\n views.add(view);\n }\n }\n return Array.from(views);\n }\n\n /**\n * The views gemi's own routes need from `app/views`, by name, with the\n * config that requires each (#1040), for the servers' existence check.\n */\n public getRequiredViews(): Record<string, string> {\n const views: Record<string, string> = {};\n for (const dispatcher of this.kernel.domains().viewDispatchers()) {\n Object.assign(views, dispatcher.requiredViews);\n }\n return views;\n }\n\n /**\n * The hosts the dev server's Vite may answer, besides the ones it always\n * admits (`localhost`, `*.localhost`, IP addresses): the `route.domains`\n * root, its subdomains and `route.domains.devHosts`. `true`, any host, only\n * when the app sets `devHosts: true` itself. Custom domains are not let\n * through on their own: the dev server cannot tell a real one from a host\n * name pointed at it by DNS rebinding, even less so with `custom.fallback`.\n */\n public devAllowedHosts(): true | string[] {\n const { resolver } = this.kernel.domains();\n if (!resolver) {\n return [];\n }\n if (resolver.devHosts === true) {\n return true;\n }\n return [`.${resolver.root}`, ...resolver.devHosts];\n }\n\n /**\n * The broadcast WebSocket endpoint the servers wire into `Bun.serve`, or\n * `null` when the app has no `route.channels`. Typed structurally: the hub\n * belongs to the app's copy of gemi (see the note above).\n */\n public sockets(): SocketTransport | null {\n return this.kernel.sockets.call(this.kernel);\n }\n\n /**\n * Applies `route.domains.trustProxy`'s `clientIpHeader` and, failing that,\n * `GEMI_CLIENT_IP_HEADER` (with or without `route.domains`): on a request\n * that carries a proxy's secret, the address its header names becomes\n * the one in `X-Forwarded-For`. The servers call it right after settling\n * `X-Forwarded-For` (`GEMI_TRUST_PROXY`) and before anything reads it —\n * the socket upgrade and the global middleware included. `fetch` calls it\n * too, for a caller that is not one of the servers. Idempotent.\n */\n public applyTrustedClientIp(req: Request) {\n this.kernel.domains().applyClientIp(req);\n }\n\n /**\n * How the servers serve static files to `req`'s host (#1015): whether the\n * files copied out of `public/` are served, and whether a miss under\n * `/assets` reaches the routes. Resolves the host only when a\n * `route.domains` group sets either differently from the root.\n */\n public async staticFiles(req: Request): Promise<{ publicFiles: boolean; assetRoutes: boolean }> {\n return this.kernel.run.call(this.kernel, () => this.kernel.domains().staticFiles(req));\n }\n\n public getRouteManifest() {\n return this.kernel.viewRoutes().routeManifest;\n }\n\n // Requests `withGlobalMiddleware` already ran the global middleware for, so\n // `fetch` inside it does not run the list a second time, and can still hand\n // the route what the list carried. Keyed by the Request object: the servers\n // hand `fetch` the same one they gated.\n private globallyGated = new WeakMap<Request, CarriedContext | null>();\n\n /**\n * Runs the `global` middleware list, then `next` — what the servers put in\n * front of everything they serve, so the list covers static files, which\n * never reach `fetch`, as well as routes. A refusal is answered without\n * calling `next`. A global middleware that throws something other than a\n * break is answered by `onError` rather than by `next`, since a gate that\n * failed must not let a static file through.\n */\n public async withGlobalMiddleware(\n req: Request,\n next: (req: Request) => Promise<Response>,\n onError: (err: unknown) => Response | Promise<Response>,\n ): Promise<Response> {\n let outcome: Awaited<ReturnType<Kernel[\"globalMiddleware\"]>>;\n try {\n outcome = await this.kernel.run.call(this.kernel, () => this.kernel.globalMiddleware(req));\n } catch (err) {\n return await onError(err);\n }\n if (outcome.refusal) {\n return outcome.refusal;\n }\n this.globallyGated.set(req, outcome.carried);\n return outcome.apply(await next(req));\n }\n\n public async fetch(req: Request): Promise<Response> {\n const url = new URL(req.url);\n return this.kernel.run.call(this.kernel, async () => {\n // Repeated from the servers, for a caller that is not one of them.\n this.applyTrustedClientIp(req);\n // Run here too for a caller that is not one of the servers, a test or an\n // app's own `Bun.serve`, so the list is not skipped by calling `fetch`.\n const gated = this.globallyGated.has(req);\n const outcome = gated ? null : await this.kernel.globalMiddleware(req);\n const carried = gated ? this.globallyGated.get(req) : outcome.carried;\n if (outcome?.refusal) {\n return outcome.refusal;\n }\n // The MCP endpoint, and its OAuth endpoints, on the host it is\n // configured for. Ahead of routing, so no route can shadow it, and after\n // the global middleware, which covers it as it covers everything.\n const mcp = this.kernel.mcpHttp();\n if (mcp) {\n const answered = await mcp.handle(req);\n if (answered) {\n return outcome ? outcome.apply(answered) : answered;\n }\n }\n const domains = this.kernel.domains();\n const dispatchers = (await domains.ask(req)) ?? (await domains.route(req));\n if (dispatchers instanceof Response) {\n return outcome ? outcome.apply(dispatchers) : dispatchers;\n }\n if (!dispatchers) {\n const unknown = new Response(\"Unknown host\", { status: 404 });\n return outcome ? outcome.apply(unknown) : unknown;\n }\n const result = isApiPath(url.pathname)\n ? await dispatchers.api.handleApiRequest(req, carried)\n : await dispatchers.view.handleViewRequest(req, carried);\n if (!outcome) {\n return result;\n }\n // A document comes back as a render function the server calls with its\n // manifests, and the Response only exists once it has.\n if (typeof result === \"function\") {\n const render = result as (...args: any[]) => Promise<Response>;\n return (async (...args: any[]) => outcome.apply(await render(...args))) as any;\n }\n return outcome.apply(result);\n });\n }\n\n public dispatchJob(jobName: string, args: string) {\n const kernelRun = this.kernel.run.bind(this.kernel);\n return kernelRun(() => {\n return this.kernel.queue().dispatchJob(jobName, args);\n });\n }\n\n /** Every provider's `shutdown()`; see `Kernel.shutdown`. */\n public shutdown(options?: { timeoutMs?: number }) {\n return this.kernel.shutdown(options);\n }\n\n public destroy() {\n this.kernel.destroy();\n }\n\n public clone() {\n return Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n }\n}\n\nexport type FetchHandler = InstanceType<typeof App>[\"fetch\"];\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "3431C8FBDEAFCCD364756E2164756E21",
8
+ "debugId": "AAD6E0C63612F55B64756E2164756E21",
9
9
  "names": []
10
10
  }