gemi 0.178.0 → 0.179.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.
- package/dist/ai/index.js +2 -2
- package/dist/ai/index.js.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/auth/connections/ConnectionManager.d.ts +7 -0
- package/dist/auth/connections/ConnectionManager.d.ts.map +1 -1
- package/dist/auth/connections/InstagramPublisher.d.ts +186 -0
- package/dist/auth/connections/InstagramPublisher.d.ts.map +1 -0
- package/dist/auth/oauth/instagram.d.ts +6 -0
- package/dist/auth/oauth/instagram.d.ts.map +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-bhaae60h.js → chunk-47cjayhh.js} +4 -4
- package/dist/{chunk-bhaae60h.js.map → chunk-47cjayhh.js.map} +3 -3
- package/dist/{chunk-a2r94jbz.js → chunk-4hj0q8fs.js} +2 -2
- package/dist/{chunk-a2r94jbz.js.map → chunk-4hj0q8fs.js.map} +1 -1
- package/dist/{chunk-s1x12f0b.js → chunk-51yv7x03.js} +2 -2
- package/dist/{chunk-s1x12f0b.js.map → chunk-51yv7x03.js.map} +1 -1
- package/dist/{chunk-ygdmm1h4.js → chunk-520hnb9j.js} +2 -2
- package/dist/{chunk-ygdmm1h4.js.map → chunk-520hnb9j.js.map} +1 -1
- package/dist/{chunk-hthdwnfr.js → chunk-5cf61bb5.js} +2 -2
- package/dist/{chunk-hthdwnfr.js.map → chunk-5cf61bb5.js.map} +1 -1
- package/dist/{chunk-pv3152gj.js → chunk-5db4v8gv.js} +1 -1
- package/dist/{chunk-10ap3vpj.js → chunk-5v07y14d.js} +2 -2
- package/dist/{chunk-10ap3vpj.js.map → chunk-5v07y14d.js.map} +1 -1
- package/dist/{chunk-wap1efbn.js → chunk-66xyz4m3.js} +4 -4
- package/dist/{chunk-wap1efbn.js.map → chunk-66xyz4m3.js.map} +1 -1
- package/dist/{chunk-yhdwr77h.js → chunk-6nrd3djs.js} +2 -2
- package/dist/{chunk-yhdwr77h.js.map → chunk-6nrd3djs.js.map} +1 -1
- package/dist/{chunk-x9h1hchj.js → chunk-6t9zjhm6.js} +2 -2
- package/dist/{chunk-x9h1hchj.js.map → chunk-6t9zjhm6.js.map} +1 -1
- package/dist/{chunk-mg9m53kk.js → chunk-6vdvhj14.js} +2 -2
- package/dist/{chunk-mg9m53kk.js.map → chunk-6vdvhj14.js.map} +1 -1
- package/dist/{chunk-p779zv1n.js → chunk-6wwk0psy.js} +2 -2
- package/dist/{chunk-p779zv1n.js.map → chunk-6wwk0psy.js.map} +1 -1
- package/dist/{chunk-n8egkp1k.js → chunk-7jxf0kys.js} +2 -2
- package/dist/{chunk-n8egkp1k.js.map → chunk-7jxf0kys.js.map} +1 -1
- package/dist/{chunk-c6ms23fk.js → chunk-8v95cjc5.js} +2 -2
- package/dist/{chunk-c6ms23fk.js.map → chunk-8v95cjc5.js.map} +1 -1
- package/dist/{chunk-hmvbj1rq.js → chunk-8zwm5n7d.js} +2 -2
- package/dist/{chunk-hmvbj1rq.js.map → chunk-8zwm5n7d.js.map} +1 -1
- package/dist/{chunk-gr4vynwd.js → chunk-93s13x3v.js} +2 -2
- package/dist/{chunk-gr4vynwd.js.map → chunk-93s13x3v.js.map} +1 -1
- package/dist/{chunk-nwdtdq2k.js → chunk-9522w4e4.js} +2 -2
- package/dist/{chunk-nwdtdq2k.js.map → chunk-9522w4e4.js.map} +1 -1
- package/dist/{chunk-5yjseh8g.js → chunk-9mcweetq.js} +2 -2
- package/dist/{chunk-5yjseh8g.js.map → chunk-9mcweetq.js.map} +1 -1
- package/dist/{chunk-3szc00gq.js → chunk-b53n5696.js} +2 -2
- package/dist/{chunk-3szc00gq.js.map → chunk-b53n5696.js.map} +1 -1
- package/dist/{chunk-eq252sbg.js → chunk-bm2zz2j1.js} +2 -2
- package/dist/{chunk-eq252sbg.js.map → chunk-bm2zz2j1.js.map} +1 -1
- package/dist/{chunk-gr625kyj.js → chunk-bptarxbq.js} +2 -2
- package/dist/{chunk-gr625kyj.js.map → chunk-bptarxbq.js.map} +1 -1
- package/dist/{chunk-5d7qhnt9.js → chunk-c0qq5t8a.js} +3 -3
- package/dist/{chunk-5d7qhnt9.js.map → chunk-c0qq5t8a.js.map} +1 -1
- package/dist/{chunk-7e1fgzcv.js → chunk-cv496s8h.js} +2 -2
- package/dist/{chunk-7e1fgzcv.js.map → chunk-cv496s8h.js.map} +1 -1
- package/dist/{chunk-jj4w6ce5.js → chunk-czzyrw7d.js} +2 -2
- package/dist/{chunk-jj4w6ce5.js.map → chunk-czzyrw7d.js.map} +1 -1
- package/dist/{chunk-a2br22hp.js → chunk-dp5ha6qy.js} +2 -2
- package/dist/{chunk-a2br22hp.js.map → chunk-dp5ha6qy.js.map} +1 -1
- package/dist/{chunk-8bnmvhrv.js → chunk-e14fgtk1.js} +2 -2
- package/dist/{chunk-8bnmvhrv.js.map → chunk-e14fgtk1.js.map} +1 -1
- package/dist/{chunk-tpx30rbj.js → chunk-e7hb47yy.js} +2 -2
- package/dist/{chunk-tpx30rbj.js.map → chunk-e7hb47yy.js.map} +1 -1
- package/dist/{chunk-9tt0bb0p.js → chunk-f5mhc5eh.js} +2 -2
- package/dist/{chunk-9tt0bb0p.js.map → chunk-f5mhc5eh.js.map} +1 -1
- package/dist/{chunk-5zfwvabd.js → chunk-gjb7cfr4.js} +2 -2
- package/dist/{chunk-5zfwvabd.js.map → chunk-gjb7cfr4.js.map} +1 -1
- package/dist/{chunk-rhqcv3te.js → chunk-hbjatkm9.js} +2 -2
- package/dist/{chunk-rhqcv3te.js.map → chunk-hbjatkm9.js.map} +1 -1
- package/dist/{chunk-bmzznzhz.js → chunk-hm1xy515.js} +3 -3
- package/dist/{chunk-bmzznzhz.js.map → chunk-hm1xy515.js.map} +1 -1
- package/dist/{chunk-y13dsype.js → chunk-ht0atvyc.js} +3 -3
- package/dist/{chunk-y13dsype.js.map → chunk-ht0atvyc.js.map} +1 -1
- package/dist/{chunk-q21wxx5y.js → chunk-jpq74abh.js} +1 -1
- package/dist/{chunk-96gnm8zb.js → chunk-jwvwve00.js} +2 -2
- package/dist/{chunk-96gnm8zb.js.map → chunk-jwvwve00.js.map} +1 -1
- package/dist/{chunk-hkjfyhv4.js → chunk-ks99tx7f.js} +2 -2
- package/dist/{chunk-hkjfyhv4.js.map → chunk-ks99tx7f.js.map} +1 -1
- package/dist/{chunk-344f6c5q.js → chunk-mby1wdny.js} +2 -2
- package/dist/{chunk-344f6c5q.js.map → chunk-mby1wdny.js.map} +1 -1
- package/dist/{chunk-tdbm67bb.js → chunk-me14hs9k.js} +2 -2
- package/dist/{chunk-tdbm67bb.js.map → chunk-me14hs9k.js.map} +1 -1
- package/dist/{chunk-cmjmy3gt.js → chunk-mpv431ga.js} +1 -1
- package/dist/{chunk-yszn7ses.js → chunk-nv2ecda9.js} +2 -2
- package/dist/{chunk-yszn7ses.js.map → chunk-nv2ecda9.js.map} +1 -1
- package/dist/{chunk-sq2ccgxy.js → chunk-nwg70wza.js} +3 -3
- package/dist/{chunk-sq2ccgxy.js.map → chunk-nwg70wza.js.map} +1 -1
- package/dist/{chunk-0mye000w.js → chunk-pw6ssy3a.js} +2 -2
- package/dist/{chunk-64m4fmf0.js.map → chunk-pw6ssy3a.js.map} +1 -1
- package/dist/{chunk-e4f6xw7b.js → chunk-q30ryk1a.js} +2 -2
- package/dist/{chunk-e4f6xw7b.js.map → chunk-q30ryk1a.js.map} +1 -1
- package/dist/{chunk-cnnmb8p3.js → chunk-q3g4xs1z.js} +2 -2
- package/dist/{chunk-cnnmb8p3.js.map → chunk-q3g4xs1z.js.map} +1 -1
- package/dist/{chunk-h2yyyzsv.js → chunk-r36kq8x1.js} +3 -3
- package/dist/{chunk-h2yyyzsv.js.map → chunk-r36kq8x1.js.map} +1 -1
- package/dist/{chunk-h3xpvksc.js → chunk-r7j4c5t2.js} +2 -2
- package/dist/{chunk-h3xpvksc.js.map → chunk-r7j4c5t2.js.map} +1 -1
- package/dist/{chunk-w1y6x2rm.js → chunk-rv0r5fde.js} +2 -2
- package/dist/{chunk-w1y6x2rm.js.map → chunk-rv0r5fde.js.map} +1 -1
- package/dist/{chunk-8ym912fj.js → chunk-s0m717j8.js} +3 -3
- package/dist/{chunk-8ym912fj.js.map → chunk-s0m717j8.js.map} +1 -1
- package/dist/{chunk-9nks1y2h.js → chunk-s208599z.js} +2 -2
- package/dist/{chunk-9nks1y2h.js.map → chunk-s208599z.js.map} +1 -1
- package/dist/{chunk-brcn3h9b.js → chunk-sen7c0e6.js} +3 -3
- package/dist/{chunk-brcn3h9b.js.map → chunk-sen7c0e6.js.map} +1 -1
- package/dist/{chunk-fbbqy4af.js → chunk-sr1gv50s.js} +2 -2
- package/dist/{chunk-fbbqy4af.js.map → chunk-sr1gv50s.js.map} +1 -1
- package/dist/{chunk-640mjh9h.js → chunk-ssmq5r41.js} +2 -2
- package/dist/{chunk-640mjh9h.js.map → chunk-ssmq5r41.js.map} +1 -1
- package/dist/{chunk-q5j1bwny.js → chunk-sx6jmyaf.js} +1 -1
- package/dist/{chunk-mkb9nt5n.js → chunk-tefb1nz7.js} +2 -2
- package/dist/{chunk-mkb9nt5n.js.map → chunk-tefb1nz7.js.map} +1 -1
- package/dist/{chunk-j6sbfa2q.js → chunk-tjmw2z5z.js} +2 -2
- package/dist/{chunk-j6sbfa2q.js.map → chunk-tjmw2z5z.js.map} +1 -1
- package/dist/{chunk-r4ewwmcr.js → chunk-tv13vbcm.js} +2 -2
- package/dist/{chunk-r4ewwmcr.js.map → chunk-tv13vbcm.js.map} +1 -1
- package/dist/{chunk-2cw1et3n.js → chunk-v8qzdvpj.js} +2 -2
- package/dist/{chunk-2cw1et3n.js.map → chunk-v8qzdvpj.js.map} +1 -1
- package/dist/{chunk-bcdst4fd.js → chunk-vhk6735r.js} +2 -2
- package/dist/{chunk-bcdst4fd.js.map → chunk-vhk6735r.js.map} +1 -1
- package/dist/chunk-vq2a7qd8.js +5 -0
- package/dist/{chunk-sz8w3kwt.js.map → chunk-vq2a7qd8.js.map} +1 -1
- package/dist/{chunk-q21p7bq9.js → chunk-vv1na1vj.js} +1 -1
- package/dist/{chunk-xvaan2fe.js → chunk-w6br58a9.js} +4 -4
- package/dist/{chunk-xvaan2fe.js.map → chunk-w6br58a9.js.map} +1 -1
- package/dist/{chunk-zn6j65pg.js → chunk-wjkcqe8w.js} +2 -2
- package/dist/{chunk-zn6j65pg.js.map → chunk-wjkcqe8w.js.map} +1 -1
- package/dist/{chunk-z0q126b1.js → chunk-wtjfjh0x.js} +2 -2
- package/dist/{chunk-z0q126b1.js.map → chunk-wtjfjh0x.js.map} +1 -1
- package/dist/{chunk-fsesx3mr.js → chunk-xf8f9tbf.js} +2 -2
- package/dist/{chunk-fsesx3mr.js.map → chunk-xf8f9tbf.js.map} +1 -1
- package/dist/{chunk-a4s0kf20.js → chunk-xgmc7cp5.js} +2 -2
- package/dist/{chunk-a4s0kf20.js.map → chunk-xgmc7cp5.js.map} +1 -1
- package/dist/{chunk-nbmzs80j.js → chunk-xvaryyd0.js} +2 -2
- package/dist/{chunk-nbmzs80j.js.map → chunk-xvaryyd0.js.map} +1 -1
- package/dist/{chunk-64m4fmf0.js → chunk-xzzdywf6.js} +2 -2
- package/dist/{chunk-0mye000w.js.map → chunk-xzzdywf6.js.map} +1 -1
- package/dist/{chunk-aat9zhrj.js → chunk-y3pnwpvp.js} +3 -3
- package/dist/{chunk-aat9zhrj.js.map → chunk-y3pnwpvp.js.map} +1 -1
- package/dist/{chunk-h9kgvg25.js → chunk-yef8dvmg.js} +2 -2
- package/dist/{chunk-h9kgvg25.js.map → chunk-yef8dvmg.js.map} +1 -1
- package/dist/{chunk-kx3etqsr.js → chunk-yx26j5vk.js} +2 -2
- package/dist/{chunk-kx3etqsr.js.map → chunk-yx26j5vk.js.map} +1 -1
- package/dist/{chunk-v9g2np6k.js → chunk-z8mq4g46.js} +2 -2
- package/dist/{chunk-v9g2np6k.js.map → chunk-z8mq4g46.js.map} +1 -1
- package/dist/{chunk-zczvbygf.js → chunk-zm4fdsq5.js} +2 -2
- package/dist/{chunk-zczvbygf.js.map → chunk-zm4fdsq5.js.map} +1 -1
- package/dist/{chunk-ay60f8dy.js → chunk-znrk326r.js} +1 -1
- package/dist/{chunk-574s5sgz.js → chunk-zpshgset.js} +2 -2
- package/dist/{chunk-574s5sgz.js.map → chunk-zpshgset.js.map} +1 -1
- package/dist/{chunk-nfx1p5z2.js → chunk-zrrpab1x.js} +3 -3
- package/dist/{chunk-nfx1p5z2.js.map → chunk-zrrpab1x.js.map} +1 -1
- package/dist/{chunk-8tyxtp36.js → chunk-zx5tp1c6.js} +2 -2
- package/dist/{chunk-8tyxtp36.js.map → chunk-zx5tp1c6.js.map} +1 -1
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/probe/index.js +2 -2
- package/dist/probe/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +13 -13
- package/dist/services/index.js.map +5 -4
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/vitest/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-sz8w3kwt.js +0 -5
- /package/dist/{chunk-pv3152gj.js.map → chunk-5db4v8gv.js.map} +0 -0
- /package/dist/{chunk-q21wxx5y.js.map → chunk-jpq74abh.js.map} +0 -0
- /package/dist/{chunk-cmjmy3gt.js.map → chunk-mpv431ga.js.map} +0 -0
- /package/dist/{chunk-q5j1bwny.js.map → chunk-sx6jmyaf.js.map} +0 -0
- /package/dist/{chunk-q21p7bq9.js.map → chunk-vv1na1vj.js.map} +0 -0
- /package/dist/{chunk-ay60f8dy.js.map → chunk-znrk326r.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{nh as EK}from"./chunk-nwdtdq2k.js";import{Hh as SK}from"./chunk-v9g2np6k.js";import{Gi as b1,Ih as G3,Ki as AQ,Li as ZZ,Mh as EG,Mi as JZ,Nh as l5,Ni as XK,Oh as i5,Ph as P8,Pi as QK,Qh as D8,Th as O8,Uh as L8,Vh as tZ,Wh as a4,Xh as kY,Yh as D5,Zh as d,di as C,ei as p8,fi as VZ,gi as N8,hi as B6,ji as b$,ki as m,li as d4,ti as F6,zi as V6}from"./chunk-5d7qhnt9.js";import{Si as $$,Ti as z0,Ui as J$,Vi as n5}from"./chunk-96gnm8zb.js";import{$i as fj,Wi as t$,Xi as qY,aj as r4,bj as T}from"./chunk-hmvbj1rq.js";import{ej as OQ,hj as l3}from"./chunk-bhaae60h.js";import{lj as uj,oj as $K}from"./chunk-8ym912fj.js";import{Gj as E$,Lj as Z$}from"./chunk-344f6c5q.js";import{Zj as tX}from"./chunk-9nks1y2h.js";import{_j as WZ,bk as tG}from"./chunk-c6ms23fk.js";import{ck as P1}from"./chunk-cnnmb8p3.js";import{dk as X6,ek as l0,fk as R1,gk as Z5,hk as AK,jk as uZ,kk as jK,tk as J5}from"./chunk-sq2ccgxy.js";import{Ik as f1}from"./chunk-x9h1hchj.js";import{Nk as xY,Sk as CY}from"./chunk-a2br22hp.js";import{Zk as IY,cl as c}from"./chunk-gr4vynwd.js";import{dl as rZ,gl as M}from"./chunk-h2yyyzsv.js";import{ol as HY}from"./chunk-574s5sgz.js";import{pl as GK}from"./chunk-zczvbygf.js";import{zl as UY}from"./chunk-a2r94jbz.js";import{Al as j8,Cl as bG}from"./chunk-tpx30rbj.js";import{Hl as t4}from"./chunk-0mye000w.js";function Z6($){return typeof $==="function"&&$.prototype!==void 0}var z5=Symbol.for("gemi.HttpResponse"),yK=new Set([301,302,303,307,308]);class K1{kind;body;status;headers;[z5]=!0;constructor($,Z,J,W){this.kind=$;this.body=Z;this.status=J;this.headers=W}static json($,Z={}){let J=Z.status??200;return j5(J,"json"),new K1("json",$,J,new Headers(Z.headers))}static error($,Z,J={}){if(!Number.isInteger($)||$<400||$>599)throw RangeError(`HttpResponse.error: status must be an integer from 400 to 599, got ${$}.`);return K1.json({error:Z},{...J,status:$})}static redirect($,Z={}){let J=Z.status??303;if(!yK.has(J))throw RangeError(`HttpResponse.redirect: status must be 301, 302, 303, 307 or 308, got ${J}.`);let W=String($);if(W==="")throw TypeError("HttpResponse.redirect: url is empty.");let Y=new Headers(Z.headers);return Y.set("Location",W),new K1("empty",void 0,J,Y)}static noContent($={}){return new K1("empty",null,204,new Headers($.headers))}static text($,Z={}){let J=Z.status??200;return j5(J,"text"),new K1("text",$,J,new Headers(Z.headers))}get ok(){return this.status>=200&&this.status<300}toResponse($,Z){let J=$,W=this.serialize(J);for(let Y of Z)J.append("Set-Cookie",Y);this.headers.forEach((Y,j)=>{if(j.toLowerCase()!=="set-cookie")J.set(j,Y)});for(let Y of this.headers.getSetCookie())J.append("Set-Cookie",Y);if(this.status>=400&&!this.headers.has("Cache-Control"))J.set("Cache-Control","no-store");return new Response(W,{status:this.status,headers:J})}serialize($){switch(this.kind){case"json":return $.set("Content-Type","application/json"),JSON.stringify(this.body)??null;case"text":return $.set("Content-Type","text/plain; charset=utf-8"),this.body;case"empty":return $.delete("Content-Type"),null}}}function j5($,Z){if(!Number.isInteger($)||$<200||$>599)throw RangeError(`HttpResponse.${Z}: status must be an integer from 200 to 599, got ${$}.`);if($===204||$===205||$===304)throw RangeError(`HttpResponse.${Z}: a ${$} response has no body.${$===204?" Use HttpResponse.noContent().":""}`)}function r1($){return typeof $==="object"&&$!==null&&$[z5]===!0}function vK($,Z,J={}){return K1.error($,Z,J)}function a0($){return typeof $==="string"?[$]:$}function J6($,Z){let J=$.split(/[\\/]/).pop()??"",W=Z?"attachment":"inline",Y=J.replace(/["\\]/g,"").replace(/[^\x20-\x7e]/g,"_");return`${W}; filename="${Y}"; filename*=UTF-8''${encodeURIComponent(J)}`}function gK($){return"total"in $&&"partial"in $&&"body"in $}function X5(){return new Response("Not found",{status:404,headers:{"X-Content-Type-Options":"nosniff"}})}function Y3($){return new Response(null,{status:416,headers:{"Accept-Ranges":"bytes","Content-Range":L8($),"Content-Length":"0","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}async function mK($){if($ instanceof Blob)return{body:$,start:0,end:$.size-1,total:$.size,partial:!1,type:$.type,name:$.name,download:!1,status:200,extraHeaders:{}};if(gK($))return{body:$.body,start:$.start,end:$.end,total:$.total,partial:$.partial,type:$.type,name:$.name,download:$.download??!1,etag:$.etag,lastModified:$.lastModified,status:$.status??200,extraHeaders:$.headers??{}};let Z=$.file,J=Z instanceof Blob?Z:null,W=$.total??J?.size??-1;return{body:Z,start:$.start??0,end:$.end??W-1,total:W,partial:$.partial??!1,type:$.type??J?.type??"",name:$.name??Z?.name,download:$.download??!1,etag:$.etag,lastModified:$.lastModified,status:$.status??200,extraHeaders:$.headers??{}}}async function M8($,Z){if($ instanceof Response)return $;if(!$)return X5();let J=await mK($),{body:W,start:Y,end:j,total:z,partial:X}=J;if(W instanceof Blob&&"exists"in W&&typeof W.exists==="function"){if(!await W.exists())return X5()}let{range:Q}=Z;if(Q){if(z<=0)return Y3(Math.max(z,0));if(!X){if(W instanceof Blob){let K=D8(Q,z);if(!K)return Y3(z);W=W.slice(K.start,K.end+1),Y=K.start,j=K.end,X=!0}}}let G=Boolean(Q)&&X,B=G?206:J.status,F=new Headers;if(F.set("Accept-Ranges","bytes"),F.set("Content-Type",J.type||"application/octet-stream"),F.set("X-Content-Type-Options","nosniff"),G)F.set("Content-Range",O8(Y,j,z)),F.set("Content-Length",String(j-Y+1));else if(z>=0)F.set("Content-Length",String(z));if(J.name)F.set("Content-Disposition",J6(J.name,J.download));if(J.etag)F.set("ETag",J.etag);if(J.lastModified)F.set("Last-Modified",J.lastModified.toUTCString());for(let[K,V]of Object.entries(J.extraHeaders))F.set(K,V);if((Z.method??"GET").toUpperCase()==="HEAD"){if(W&&"cancel"in W&&typeof W.cancel==="function")await W.cancel();return new Response(null,{status:B,headers:F})}return new Response(W,{status:B,headers:F})}class QZ extends z0{limit;constructor($){super("The request body is too large.",{status:413});this.limit=$}}var Q5={b:1,k:1024,kb:1024,m:1048576,mb:1048576,g:1073741824,gb:1073741824};function z3($){if(typeof $==="number"){if(Number.isFinite($)&&$>=0)return Math.floor($);if($===1/0)return 1/0}else{let Z=$.trim().toLowerCase();if(Z==="none"||Z==="off")return 1/0;let J=/^(\d+(?:\.\d+)?)\s*([a-z]*)$/.exec(Z);if(J&&(J[2]===""||(J[2]in Q5)))return Math.floor(Number(J[1])*(Q5[J[2]]??1))}throw Error(`Invalid body limit ${JSON.stringify($)}. Use a byte count or a size such as "64kb", "1mb" or "none".`)}var j3=new WeakMap;function K5($){return j3.has($)}function B5($){return j3.get($)?.limit??null}function F5($){let Z=j3.get($);return Z?Z.read>Z.limit:!1}function hK($){let Z=$.headers.get("Content-Length");if(Z===null||!/^\s*\d+\s*$/.test(Z))return null;return Number(Z)}function T8($,Z){let J=hK($);if(J!==null&&J>Z)throw new QZ(Z)}function W6($,Z,J={}){let W=j3.get($);if(W)W.limit=Z;else{let Y={limit:Z,read:0,stream:void 0,used:!1};j3.set($,Y),cK($,Y)}if(J.checkDeclared!==!1)T8($,Z)}function pK($){return Reflect.get(Object.getPrototypeOf($),"body",$)??null}function H8($,Z){if(Z.stream!==void 0)return Z.stream;let J=pK($);if(!J)return Z.stream=null;let W;return Z.stream=new ReadableStream({async pull(Y){W??=J.getReader();let{done:j,value:z}=await W.read();if(j){Y.close();return}if(Z.read+=z.byteLength,Z.read>Z.limit){let X=new QZ(Z.limit);Y.error(X),W.cancel(X).catch(()=>{});return}Y.enqueue(z)},cancel(Y){return W?W.cancel(Y):J.cancel(Y)}},{highWaterMark:0}),Z.stream}async function XZ($,Z){if(T8($,Z.limit),Z.used||Z.stream?.locked)throw TypeError("Body already used");Z.used=!0;let J=H8($,Z);if(!J)return new Uint8Array(0);let W=J.getReader(),Y=[],j=0;for(;;){let{done:Q,value:G}=await W.read();if(Q)break;Y.push(G),j+=G.byteLength}let z=new Uint8Array(j),X=0;for(let Q of Y)z.set(Q,X),X+=Q.byteLength;return z}function G5($){return $.headers.get("Content-Type")??""}function cK($,Z){let J=(W,Y)=>Object.defineProperty($,W,{configurable:!0,...Y});J("body",{get:()=>H8($,Z)}),J("bodyUsed",{get:()=>Z.used||Boolean(Z.stream?.locked)||Reflect.get(Object.getPrototypeOf($),"bodyUsed",$)}),J("bytes",{value:()=>XZ($,Z)}),J("arrayBuffer",{value:async()=>{let W=await XZ($,Z);return W.buffer.slice(W.byteOffset,W.byteOffset+W.byteLength)}}),J("text",{value:async()=>new TextDecoder().decode(await XZ($,Z))}),J("json",{value:async()=>JSON.parse(new TextDecoder().decode(await XZ($,Z)))}),J("blob",{value:async()=>new Blob([await XZ($,Z)],{type:G5($)})}),J("formData",{value:async()=>new Response(await XZ($,Z),{headers:{"Content-Type":G5($)}}).formData()}),J("clone",{value:()=>{T8($,Z.limit);let W=H8($,Z),Y=null;if(W){let[j,z]=W.tee();Z.stream=j,Y=z}return new Request($.url,{method:$.method,headers:$.headers,body:Y,signal:$.signal,duplex:"half"})}})}function dK($){return Z6($)}function V5($,Z){if($.length===0)return $();return $(Z??new C)}class o{method;handler;methodName;__internal_brand="RouteHandler";middlewares=[];constructor($,Z,J){this.method=$;this.handler=Z;this.methodName=J;this.handler=Z,this.methodName=J,this.method=$}get source(){if(!dK(this.handler)||typeof this.methodName!=="string")return;return{controller:this.handler,methodName:this.methodName}}__internal_use(){return{run:this.run.bind(this),middlewares:this.middlewares}}run($){if(this.source){let Z=new this.source.controller;return V5(Z[this.methodName].bind(Z),$)}return V5(this.handler,$)}middleware($){return this.middlewares=a0($),this}}class O5{url;headers;__internal_brand="ProxyHandler";middlewares=[];constructor($,Z){this.url=$;this.headers=Z}middleware($){return this.middlewares=a0($),this}async run(){let $=new C,Z=$.headers.toJSON();for(let J of D5($.rawRequest))delete Z[J];try{return await fetch(this.url,{method:$.rawRequest.method,headers:{...Z,...this.headers},body:$.rawRequest.body})}catch(J){if(F5($.rawRequest))throw new QZ(B5($.rawRequest));throw J}}}class L5{constructor(...$){return new o(...$)}}class M5 extends o{__internal_brand="StreamHandler";async run($){let Z=T.getStore(),J=Z?.req?.rawRequest,W=P8(J?.headers.get("Range"));if(Z)Z.rangeRequest=W;try{let Y=await super.run($);if(r1(Y))return Y;return await M8(Y,{range:W,method:J?.method})}catch(Y){if(Y instanceof N8)return Y3(Y.total);throw Y}finally{if(Z)Z.rangeRequest=null}}}class H5{constructor(...$){return new M5(...$)}}class T5{__internal_brand="ResourceRoutes";first;second;constructor($){this.first={get:new o("GET",$,"list"),post:new o("POST",$,"store")},this.second={get:new o("GET",$,"show"),put:new o("PUT",$,"update"),delete:new o("DELETE",$,"delete")}}middleware($){if($.list)this.first.get.middleware($.list);if($.store)this.first.post.middleware($.store);if($.show)this.second.get.middleware($.show);if($.update)this.second.put.middleware($.update);if($.delete)this.second.delete.middleware($.delete);return this}}class C0{static __brand="ApiRouter";routes={};middlewares=[];middleware($){}get($,Z){return new o("GET",$,Z)}post($,Z){return new o("POST",$,Z)}put($,Z){return new o("PUT",$,Z)}patch($,Z){return new o("PATCH",$,Z)}delete($,Z){return new o("DELETE",$,Z)}resource($){return new T5($)}agent($){if($.kind!=="agent-controller")throw TypeError(`this.agent() takes an AgentController class, and got ${U5($)}.`);return uK($)}voice($){if($.kind!=="agent-controller")throw TypeError(`this.voice() takes an AgentController class, and got ${U5($)}.`);return lK($)}file($,Z){return new L5("GET",$,Z)}stream($,Z){return new H5("GET",$,Z)}proxy($,Z={}){return new O5($,Z)}}function U5($){if(typeof $==="function"&&$.name)return $.name;return typeof $}function uK($){let Z={stream:new o("POST",$,"stream"),attach:new o("POST",$,"attach"),stop:new o("POST",$,"stop"),upload:new o("POST",$,"upload")};return class extends C0{static __internal_brand="AgentRoute";static controller=$;static handlers=Z;routes={"/":Z.stream,"/attach":Z.attach,"/stop":Z.stop,"/files":Z.upload};static middleware(W){if(W.stream)Z.stream.middleware(W.stream);if(W.attach)Z.attach.middleware(W.attach);if(W.stop)Z.stop.middleware(W.stop);if(W.upload)Z.upload.middleware(W.upload);return this}}}function lK($){let Z={start:new o("POST",$,"voiceStart"),update:new o("PATCH",$,"voiceUpdate"),end:new o("DELETE",$,"voiceEnd")};return class extends C0{static __internal_brand="VoiceRoute";static controller=$;static handlers=Z;routes={"/":Z.start,"/:sessionId":{patch:Z.update,delete:Z.end}};static middleware(W){if(W.start)Z.start.middleware(W.start);if(W.update)Z.update.middleware(W.update);if(W.end)Z.end.middleware(W.end);return this}}}var t1="access_token";function S$($){return $?.cookies?.get("access_token")||$?.headers?.get("access_token")||null}async function Y6($,Z){let J=S$(Z);if(!J)return null;return(await $.getSession(J,Z.headers.get("User-Agent")))?.user??null}var iK=/^[A-Za-z0-9_-]+$/,sK=/^:[A-Za-z_][A-Za-z0-9_]*$/,P5=/^[A-Za-z0-9_-]{1,128}$/,nK=/^[A-Za-z0-9_.:-]+$/;class u extends Error{constructor($){super($);this.name="InvalidChannelError"}}function N5($){return typeof $==="object"&&$!==null&&typeof $.topic==="string"}function GZ($){if(typeof $!=="string"||$.length===0)throw new u("A channel pattern must be a non-empty string.");if($.length>255)throw new u(`The channel pattern "${$.slice(0,40)}\u2026" is longer than ${"255"} characters.`);let Z=$.split("."),J=new Set;for(let W of Z){if(sK.test(W)){let Y=W.slice(1);if(J.has(Y))throw new u(`The channel pattern "${$}" names the param "${Y}" twice.`);J.add(Y);continue}if(W.startsWith("__"))throw new u(`The channel "${$}" has the segment "${W}". Segments starting with "__" are reserved for gemi (driver control messages).`);if(!iK.test(W))throw new u(`The channel pattern "${$}" has an invalid segment "${W}". Segments are separated by dots and are either letters, digits, "_" and "-", or a param such as ":siteId".`)}return Z}function X3($,Z={}){let J=GZ($),W=new Set,Y=J.map((j)=>{if(!j.startsWith(":"))return j;let z=j.slice(1);W.add(z);let X=Z[z];if(X===void 0||X===null)throw new u(`The channel "${$}" needs the param "${z}".`);let Q=typeof X==="number"&&Number.isFinite(X)?String(X):X;if(typeof Q!=="string"||!P5.test(Q))throw new u(`The param "${z}" of the channel "${$}" must be 1 to 128 letters, digits, "_" or "-". Use a public id in a channel name.`);return Q}).join(".");for(let j of Object.keys(Z))if(!W.has(j))throw new u(`The channel "${$}" has no param "${j}".`);if(Y.length>255)throw new u(`The topic built from "${$}" is longer than 255 characters.`);return Y}function _8($){if(GZ($).some((J)=>J.startsWith(":")))throw new u(`"${$}" is a pattern, not a topic: pass its params, as in Broadcast.to("${$}", { ... }).`);return $}function _5($){if(typeof $!=="string"||$.length===0||$.length>64||!nK.test($))throw new u(`The event name "${String($).slice(0,40)}" must be 1 to 64 letters, digits, "_", "-", "." or ":".`);return $}function I5($,Z){if($===Z)return!0;if($===U0)return Z.startsWith(`${U0}.`)&&Z.split(".").length===2;let J=$.split("."),W=Z.split(".");if(J.length!==W.length)return!1;return J.every((Y,j)=>Y===W[j]||Y.startsWith(":")&&P5.test(W[j]))}var U0="user";function KZ($){let Z=typeof $==="object"&&$!==null?$.id:$;return X3(`${U0}.:id`,{id:Z})}class J0{req;static runsOnRefusal=!1;config={};constructor($){this.req=$}run(...$){return{}}static configure($){let Z=this;return class extends Z{config=$}}}class j6 extends J0{run($){let Z=$??this.config.limit;if(Z===void 0||Z==="")throw Error('`body-limit` needs a size, as in "body-limit:64kb".');return W6(this.req.rawRequest,z3(Z)),{}}}function oK($){let Z=new Map;for(let J of $)if(typeof J==="string"){let[W,Y=""]=J.split(":");if(W.startsWith("-")){if(Z.has(W.replace("-","")))Z.delete(W.replace("-",""))}else Z.set(W,Y.split(",").filter(Boolean))}else Z.set(J,[]);return Z}var aK={"body-limit":j6};class e1{config;static token="middleware";defaultBodyLimit;constructor($){this.config=$;this.defaultBodyLimit=$.bodyLimit===null||$.bodyLimit===void 0?null:z3($.bodyLimit)}get aliases(){return{...aK,...this.config.aliases}}applyDefaultBodyLimit($){if(this.defaultBodyLimit!==null&&!K5($))W6($,this.defaultBodyLimit,{checkDeclared:!1})}assertGlobalMiddleware(){for(let $ of this.config.global){if(typeof $!=="string")continue;let[Z]=$.split(":");if(Z.startsWith("-"))throw Error(`Global middleware "${$}" cancels an alias, but nothing is inherited into the global list. Remove it.`);if(!this.aliases[Z])throw Error(`Global middleware "${Z}" is not a registered alias. Add it to \`aliases\` in the middleware config, or list the class itself.`)}}runGlobalMiddleware(){return this.runMiddleware(this.config.global)}runMiddleware($){let Z=new C,J=this.aliases,W=[];for(let[Y,j]of oK($).entries())if(typeof Y==="string"){let z=J[Y];if(z){let X=new z(Z);W.push({run:()=>X.run.call(X,...j),runsOnRefusal:x5(z)})}}else if(Z6(Y)){let z=new Y(Z);W.push({run:z.run.bind(z),runsOnRefusal:x5(Y)})}else W.push({run:Y,runsOnRefusal:!1});return(async()=>{let Y={};for(let j=0;j<W.length;j++)try{Y={...Y,...await W[j].run()}}catch(z){throw await rK(W.slice(j+1)),z}return Y})()}}function x5($){return $?.runsOnRefusal===!0}async function rK($){for(let Z of $){if(!Z.runsOnRefusal)continue;try{await Z.run()}catch(J){console.error(J)}}}class z6{visibility;authorizer;middlewares=[];constructor($,Z){this.visibility=$;this.authorizer=Z}middleware($){return this.middlewares=[...this.middlewares,...a0($)],this}events(...$){return this}}class E5{static __brand="ChannelRouter";channels={};public(){return new z6("public")}private($){return new z6("private",$)}async authorize($,Z,J={},W={}){try{ZB(this)}catch(Q){return console.error("[gemi] The channel router is invalid, so every subscription is refused.",Q),{ok:!1,code:"error"}}let Y=Object.hasOwn(this.channels,Z)?this.channels[Z]:void 0;if(!b5(Y))return{ok:!1,code:"unknown_channel"};let j=null;try{if(Z===U0){if(Object.keys(J??{}).length>0)return{ok:!1,code:"invalid_params"}}else j=X3(Z,J??{})}catch(Q){if(Q instanceof u)return{ok:!1,code:"invalid_params"};throw Q}let z=Object.fromEntries(Object.entries(J??{}).map(([Q,G])=>[Q,String(G)])),X=new C($,z,"api",Z);return T.exit(()=>X6.exit(()=>T.run(X,async()=>{let Q=T.getStore();try{if(Y.middlewares.length>0)await M(e1).runMiddleware(Y.middlewares);if(Z===U0){let G=await C5(X);if(!G)return{ok:!1,code:"denied"};if(j=KZ(G),Y.visibility==="private"&&Y.authorizer){if(await A5(Y.authorizer,X,z)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}if(Y.visibility==="private"){if((Y.authorizer?await A5(Y.authorizer,X,z):await C5(X)!==null)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}catch(G){if($B(G))return{ok:!1,code:"denied"};return console.error(`[gemi] Authorizing the channel "${Z}" threw, so the subscription was refused.`,G),{ok:!1,code:"error"}}finally{Q.destroy()}},W.carried)))}}async function tK($,Z,J={},W={}){let Y=typeof $==="function"?new $:$;R5(Y);let j=W.as,z,X=null;if(j instanceof Request)z=j;else if(j&&typeof j==="object"&&j.rawRequest instanceof Request)z=j.rawRequest;else z=new Request("http://localhost/__gemi/socket"),X=j?{user:j}:null;return(await Y.authorize(z,Z,J,{carried:X})).ok}function b5($){let Z=$?.visibility;return typeof $==="object"&&$!==null&&Array.isArray($.middlewares)&&(Z==="public"||Z==="private")}async function C5($){if(!T.getStore().user&&S$($)===null)return null;try{return await q0.user()}catch(Z){if(Z?.name==="AuthenticationError")return null;throw Z}}function A5($,Z,J){if(eK($))return new $().authorize(Z,J);return $(Z,J)}function eK($){return typeof $==="function"&&typeof $.prototype?.authorize==="function"}function $B($){return $?.kind===$$||Z$($)||E$($)}var S5=new WeakSet;function ZB($){if(S5.has($))return;R5($),S5.add($)}function R5($){let Z=Object.entries($.channels),J=[];for(let[W,Y]of Z){if(!b5(Y))throw new u(`The channel "${W}" is not declared with this.public() or this.private().`);let j=GZ(W);if(j[0].startsWith(":"))throw new u(`The channel pattern "${W}" starts with a param. Start it with a literal segment, such as "site.:siteId", so it cannot overlap another channel.`);if(W!==U0&&j.length===2&&j[0]===U0)throw new u(`The channel pattern "${W}" can build user.<id>, which belongs to the "user" channel (the signed-in user's own). Declare "user" and emit with Broadcast.toUser(user), or name this channel differently.`);if(W!==U0&&Y.visibility==="private"&&!Y.authorizer&&j.some((z)=>z.startsWith(":")))throw new u(`The private channel "${W}" has params but no authorization, so every signed-in user could join every one of them. Pass a callback or a policy that checks the params: this.private((req, params) => ...).`);J.push({pattern:W,segments:W===U0?[U0,":id"]:j})}for(let W=0;W<J.length;W++)for(let Y=W+1;Y<J.length;Y++)if(JB(J[W].segments,J[Y].segments))throw new u(`The channel patterns "${J[W].pattern}" and "${J[Y].pattern}" can build the same topic, so a subscriber could join one's topics through the other's authorization. Make them differ in a literal segment.`)}function JB($,Z){if($.length!==Z.length)return!1;return $.every((J,W)=>J===Z[W]||J.startsWith(":")||Z[W].startsWith(":"))}class I8{as;input;bind;__internal_brand="McpModelParam";constructor($,Z,J){this.as=$;this.input=Z;this.bind=J}}class Q6{method;url;meta;__internal_brand="McpRoute";constructor($,Z,J){this.method=$;this.url=Z;this.meta=J}}class x8{tool;meta;__internal_brand="McpTool";constructor($,Z){this.tool=$;this.meta=Z}}function WB($){let Z=[],J="";for(let W of $)if(W==="_"||W==="-"||W===" "){if(J)Z.push(J);J=""}else if(W===W.toLowerCase())J+=W;else{if(J)Z.push(J);J=W.toLowerCase()}if(J)Z.push(J);return Z}function YB($,Z){let J=WB($);if(Z==="snake")return J.join("_");if(Z==="kebab")return J.join("-");return J.map((W,Y)=>Y===0?W:W[0].toUpperCase()+W.slice(1)).join("")}class f5{static __brand="McpRouter";routes={};scopes;param($){return new I8($.as,$.input,$.bind)}fromTool($,Z={}){return new x8($,Z)}fromApiRoute($,Z,J){return new Q6($,Z,J)}fromApiRouteFor($,Z,J){let{name:W,audiences:Y,description:j,params:z,files:X,...Q}=J,G=`McpRouter.fromApiRouteFor("${$}", "${Z}")`,B=Object.keys(Y??{});if(B.length===0)throw Error(`${G}: declare at least one audience.`);let F={},K=new Map;for(let V of B){let{name:D,casing:U,description:O,params:L,files:P,...H}=Y[V],I=D??(U?YB(W,U):W);if(K.has(I))throw Error(`${G}: the audiences "${K.get(I)}" and "${V}" are both named "${I}". Give one its own name or casing.`);K.set(I,V);let E=typeof O==="function"?j===void 0?void 0:O(j):O??j;if(typeof E!=="string")throw Error(`${G}: the audience "${V}" has no description, and there is no shared one.`);let S={...Q,...H,description:E};if(z||L)S.params={...z,...L};if(X||P)S.files={...X,...P};F[I]=new Q6($,Z,S)}return F}}function D0($,Z){return $.replace(/:([^/]+[*?]?)/g,(J,W)=>{let Y=W.endsWith("?")||W.endsWith("*"),j=Y?W.slice(0,-1):W,z=Z[j];if(z===void 0){if(Y)return"";if(import.meta.env.DEV)throw Error(`Missing parameter: ${j}`);console.error(`Missing parameter: ${j} in URL: ${$}`)}return String(z)}).replace(/\/\//g,"/").replace(/\/$/,"")}class C8 extends z0{constructor($,Z=307){super("Redirect error");this.name="RedirectError",this.payload={api:{status:200,data:{},directive:{kind:"Redirect",path:$}},view:{status:Z,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:$}}}}}class S1{static to($,...Z){let[J={}]=Z,{search:W={},params:Y={},permanent:j,status:z}={params:{},status:307,permanent:!1,...J},X=new URLSearchParams(W).toString();throw new C8([D0($,Y)||"/",X.toString()].filter(Boolean).join("?"),z??(j?301:307))}static external($,Z=307){throw new C8($,Z)}}class k5{kind="redirect";viewPath="REDIRECT";middlewares=[];featureGates=[];handler;constructor($){if(!$)this.handler=()=>({});else if(typeof $==="function")this.handler=$;else{let[Z,J]=$;this.handler=(W)=>{return new Z()[J](W)}}}async run($,Z){let{destination:J,permanent:W=!1,status:Y=307}=await this.handler($);if(!J)throw Error(`Redirect destination is required see ${Z}`);return S1.to(J,{permanent:W,status:Y}),{}}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}async function A8($,Z){if($ instanceof Response)return $;let J=$ instanceof Blob,W=J?$:$.file,Y=J?$.name:$.name??$.file?.name,j=(J?$.type:$.type??$.file?.type)||"",z=J?!1:$.download??!1,X=J?200:$.status??200;if(!J)for(let[Q,G]of Object.entries($.headers??{}))Z.set(Q,G);if(W instanceof Blob&&"exists"in W&&typeof W.exists==="function"){if(!await W.exists())return new Response("Not found",{status:404})}if(Z.set("Content-Type",j||"application/octet-stream"),W instanceof Blob)Z.set("Content-Length",String(W.size));if(Y)Z.set("Content-Disposition",J6(Y,z));return new Response(W instanceof Blob?W.stream():W,{status:X,headers:Z})}class w5{kind="file";viewPath="FILE";middlewares=[];featureGates=[];handler;constructor($){if(!$)this.handler=()=>null;else if(typeof $==="function")this.handler=$;else{let[Z,J]=$;this.handler=(W)=>{return new Z()[J](W)}}}async run($,Z){let J=await this.handler($);if(!J)throw Error(`File route handler must return a file see ${Z}`);return{FILE:J}}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}function q5($,Z){if(r1($))throw Error(`The handler of view "${Z}" returned an HttpResponse. HttpResponse is for api routes; a view handler returns its props.`);return $}class y5{viewPath;middlewares=[];featureGates=[];staticOptions=null;handler;constructor($,Z){this.viewPath=$;if(!Z)this.handler=()=>({});else if(typeof Z==="function")this.handler=Z;else{let[J,W]=Z;this.handler=(Y)=>{return new J()[W](Y)}}}async run($,Z){let J=q5(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}middleware($){return this.middlewares=a0($),this}static($={}){return this.staticOptions={...$},this}feature($){return this.featureGates=[...this.featureGates,$],this}}class v5{viewPath;children;middlewares=[];featureGates=[];alwaysRuns=!1;handler=()=>({});constructor($,Z,J){this.viewPath=$;if(typeof Z==="function")this.handler=Z,this.children=class extends E1{routes=J??{}};else if(Array.isArray(Z)){let[W,Y]=Z;this.handler=(j)=>{return new W()[Y](j)},this.children=class extends E1{routes=J??{}}}else this.children=class extends E1{routes=Z},this.handler=()=>({})}async run($,Z){let J=q5(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}alwaysRun(){return this.alwaysRuns=!0,this}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}class E1{middlewares=[];featureGates=[];routes={};view($,Z){return new y5($,Z)}file($){return new w5($)}redirect($){return new k5($)}layout($,Z,J){return new v5($,Z,J)}}function jB($){return $}function zB(){return{aliases:{},global:[],bodyLimit:null}}var B1="redirect";function F1($,Z="/"){if(typeof $!=="string"||!$.startsWith("/"))return Z;if(/[\u0000-\u001f\u007f\\]/.test($)||$.startsWith("//"))return Z;try{let J=new URL($,"http://gemi.invalid");if(J.origin!=="http://gemi.invalid")return Z;let W=`${J.search}${J.hash}`.replaceAll("/","%2F"),Y=`${J.pathname}${W}`.replaceAll(":","%3A");return Y.startsWith("//")?Z:Y}catch{return Z}}function BZ($){let Z=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();return Z?Z==="https":new URL($.url).protocol==="https:"}function XB($,Z=!0){let J=new URL($.rawRequest.url),W=J.pathname.replace(/\.(json|og)$/,""),[,Y,...j]=W.split("/");if(M(c).supportedLocales.includes(Y))W=`/${j.join("/")}`;return Z?`${W}${J.search}`:W}function QB($,Z){let J=(W)=>W.replace(/\/+$/,"")||"/";return J($)===J(Z)}function G6($,Z){let J=Z||M(b).config.signInPath,W=/^[a-z][a-z\d+.-]*:/i.test(J);if(W?!/^https?:\/\//i.test(J):!J.startsWith("/"))throw Error(`\`auth.signInPath\` must be a path like "/auth/sign-in", or an http(s) URL for sign-in hosted elsewhere. Got "${J}". A route's own \`"auth:<path>"\` cannot carry a URL, because the alias parser splits it on the colon.`);let Y=new URL(J,"http://gemi.invalid");if($?.kind==="view"){let j=XB($,!W);if(W||!QB(new URL(j,Y).pathname,Y.pathname))Y.searchParams.set(B1,j)}return W?Y.href:`${Y.pathname}${Y.search}`}class g5 extends J0{async run($){let Z=T.getStore(),J=Z.req;if(Z.user)return{};let W=await Y6(M(b),J);if(!W)throw new b$({redirectTo:G6(J,$)});return Z.setUser(W),{}}}var E8="gemi_same_site",S8="private, no-cache, no-store, max-age=0, must-revalidate";class K6 extends J0{run(){let $=T.getStore(),Z=$?.req;if(!Z||$.user)return{};let J=Z.rawRequest;if(Z.kind!=="view"||J.method!=="GET"&&J.method!=="HEAD")return{};let W=new URL(J.url);if(/\.(json|og)$/.test(W.pathname))return{};if(W.searchParams.has(E8))return{};if(S$(Z))return{};let Y=J.headers.get("Sec-Fetch-Site");if(Y&&Y!=="cross-site")return{};throw W.searchParams.set(E8,"1"),new m5(`${W.pathname}${W.search}`)}}class m5 extends z0{location;constructor($){super("Same-site bounce");this.location=$;this.name="SameSiteBounce";let Z=GB($),J={"Content-Type":"text/html; charset=utf-8","Cache-Control":S8,"Referrer-Policy":"no-referrer","X-Robots-Tag":"noindex"};this.payload={api:{status:401,data:{},headers:{"Cache-Control":S8}},viewData:{status:200,data:{},headers:{"Cache-Control":S8},directive:{kind:"Redirect",path:$}},view:{status:200,headers:J,body:`<!doctype html><html><head><meta charset="utf-8"><meta name="robots" content="noindex"><meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0;url=${Z}"><title>Redirecting</title></head><body><p><a href="${Z}">Continue</a></p></body></html>`}}}}function GB($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}class h5 extends J0{async run(...$){let[Z="public",J="864000",...W]=$,Y=`${Z}, max-age=${J}${W.length>0?", ":""}${W.join(", ")}`;if($.length===0)Y="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if($.length===1&&$[0]==="public")Y="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if($.length===1&&$[0]==="private")Y="private, max-age=0, stale-while-revalidate=300, stale-if-error=600";if(this.req.rawRequest.method==="GET")this.req.ctx().setHeaders("Cache-Control",Y);return{}}}var p5={"Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"};class c5 extends J0{static runsOnRefusal=!0;config={origins:{"":{"Access-Control-Allow-Methods":"GET, HEAD, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"}}};run(){let $=this.req,Z=$.rawRequest.headers.get("Origin");if(Z&&this.config.origins[Z]){$.ctx().setHeaders("Access-Control-Allow-Origin",Z);let J={...p5,...this.config.origins[Z]};for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}else if(Z&&this.config.origins["*"]){$.ctx().setHeaders("Access-Control-Allow-Origin","*");let J={...p5,...this.config.origins["*"]};delete J["Access-Control-Allow-Credentials"];for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}return{}}}var KB="Rate limit exceeded";class W$ extends z0{result;retryAfter;constructor($,Z=KB){super(Z);this.result=$;this.retryAfter=$?.retryAfter;let J={"Content-Type":"application/json",...$?b8($):{}};this.payload={api:{status:429,data:{error:{...J$("rate_limit",Z,429),...$?{retryAfter:$.retryAfter}:{}}},headers:J},view:{error:{message:Z},status:429,headers:J}}}}function b8($){let Z={"X-RateLimit-Limit":String($.limit),"X-RateLimit-Remaining":String($.remaining),"X-RateLimit-Reset":String(Math.ceil($.resetAt/1000))};if(!$.allowed)Z["Retry-After"]=String(Math.max(1,Math.ceil($.retryAfter/1000)));return Z}class V1{config;static token="ratelimiter";constructor($){this.config=$}get driver(){return this.config.driver}async consume($,Z={}){let J=Z.limit??this.config.limit,W=Z.window??this.config.window,Y=Z.cost??1;if(d5("window",W),d5("limit",J),!Number.isFinite(Y)||Y<0)throw Error(`Rate limiter cost must be zero or greater, got ${Y}`);return await this.config.driver.consume({key:$,limit:J,window:W*1000,cost:Y})}async enforce($,Z={},J){let W=await this.consume($,Z);if(!W.allowed)throw new W$(W,typeof J==="function"?J(W):J);return W}}function d5($,Z){if(!Number.isFinite(Z)||Z<=0)throw Error(`Rate limiter ${$} must be greater than zero, got ${Z}`)}import{isIP as R8}from"net";function R$($){let Z=$.trim();if(Z==="")return null;if(Z.startsWith("[")){let W=Z.indexOf("]");if(W<0)return null;let Y=Z.slice(W+1);if(Y!==""&&!/^:\d{1,5}$/.test(Y))return null;let j=Z.slice(1,W);return R8(j)===6?j:null}if(R8(Z))return Z;let J=/^(\d{1,3}(?:\.\d{1,3}){3}):\d{1,5}$/.exec(Z);return J&&R8(J[1])===4?J[1]:null}class s5 extends J0{async run($,Z){let J=BB();if(!J)return{};let W=await J.consume(this.key(),{limit:u5($)??this.config.limit,window:u5(Z)??this.config.window});if(this.config.headers!==!1){let Y=this.req.ctx?.();if(Y)for(let[j,z]of Object.entries(b8(W)))Y.setHeaders(j,z)}if(!W.allowed)throw new W$(W);return{}}key(){if(this.config.key)return this.config.key(this.req);let $=l5(this.req.rawRequest);if($)return`mcp:${$.via}:${$.id}:${this.req.routePath??"*"}`;return`${FZ(this.req)}:${this.req.routePath??"*"}`}}function BB(){try{let $=M();return $.bound(V1)?$.make(V1):null}catch{return null}}function FZ($){let Z=i5($.rawRequest);if(Z!==void 0)return Z;let J=$.headers.get("x-forwarded-for");if(J){let[W]=J.split(",");if(W?.trim())return R$(W)??W.trim()}return $.headers.get("x-real-ip")?.trim()||"unknown"}function u5($){if($===void 0||$===null||$==="")return;let Z=Number($);if(!Number.isFinite(Z)||Z<=0)return;return Z}class o5 extends J0{async run(){let $=this.req.cookies.get("csrf_token");if(!$)throw new f8;if(!["POST","PUT","PATCH","DELETE"].includes(this.req.rawRequest.method))return{};if(!Bun.CSRF.verify($,{secret:process.env.SECRET}))throw new f8;return{}}}class f8 extends z0{constructor(){super("Invalid CSRF token");this.name="InvalidCSRFTokenError"}payload={api:{status:403,data:{error:n5("csrf","Invalid CSRF token",403)}},view:{}}}class a5{policiesList={};constructor(){let $=this.register();for(let Z of $){let J=new Z;this.policiesList[Z.name]=J}}register(){return[]}}class r5{all($,Z){return!0}}class k8{options;param;refuse;answers=new WeakMap;constructor($){this.options=$;this.param=$.param,this.refuse=$.refuse??"not_found"}refusal(){return this.refuse==="forbidden"?new VZ:new B6}authorize($,Z){if(typeof Z==="number"&&Number.isFinite(Z))Z=String(Z);if(typeof Z!=="string"||Z==="")return Promise.reject(this.refusal());let J=this.answers.get($.rawRequest);if(!J)J=new Map,this.answers.set($.rawRequest,J);let W=J.get(Z);if(!W)W=this.decide($,Z),J.set(Z,W);return W}async allows($,Z){try{return await this.authorize($,Z),!0}catch(J){if(this.isRefusal(J))return!1;throw J}}fromRoute($=new C,Z=this.param){if(Z===void 0)throw Error('This resource policy has no `param`. Give `defineResourcePolicy` one, or name it: `fromRoute(req, "pageId")`, or `alias:pageId` on the middleware.');return this.authorize($,$.params?.[Z])}get middleware(){if(!this.middlewareClass){let $=(Z,J)=>this.fromRoute(Z,J||void 0);this.middlewareClass=class extends J0{async run(J){await $(this.req,J)}}}return this.middlewareClass}middlewareClass;forAgent($){return{authorize:async(Z,{threadId:J,body:W})=>{let Y;if(J!==void 0){if(Y=$.thread?await $.thread(J,Z):null,Y===null||Y===void 0)throw this.refusal()}if(W!==void 0){let j=await $.body(W,Z);if(await this.authorize(Z,j),J!==void 0&&String(Y)!==String(j))throw this.refusal();return}if(J!==void 0)await this.authorize(Z,Y)}}}async decide($,Z){let J=await this.options.load(Z,$);if(J===null||J===void 0||!await this.options.allow(J,$))throw this.refusal();return J}isRefusal($){return this.refuse==="forbidden"?$ instanceof VZ:$ instanceof B6}}function FB($){return new k8($)}async function U6($,Z,J=!1){if(!$.body)return new Uint8Array;let[W,Y]=await xB($.body),z=W.length>=2&&W[0]===31&&W[1]===139?Y.pipeThrough(new DecompressionStream("gzip")):Y;return IB(z,Z,J,$.url)}async function IB($,Z,J,W){let Y=$.getReader(),j=[],z=0;try{for(;;){let{done:G,value:B}=await Y.read();if(G)break;if(z+B.byteLength>Z){if(!J)throw new V6(W,Z);j.push(B.subarray(0,Z-z)),z=Z;break}j.push(B),z+=B.byteLength}}finally{Y.cancel().catch(()=>{})}let X=new Uint8Array(z),Q=0;for(let G of j)X.set(G,Q),Q+=G.byteLength;return X}async function xB($){let Z=$.getReader(),J=await Z.read(),W=J.done?new Uint8Array:J.value,Y=new ReadableStream({start(j){if(J.done)j.close();else j.enqueue(W)},async pull(j){let z=await Z.read();if(z.done)j.close();else j.enqueue(z.value)},cancel(j){return Z.cancel(j)}});return[W,Y]}function D6($){return new TextDecoder("utf-8").decode($)}var CB={"&":"&","<":"<",">":">",'"':""","'":"'"};function f$($){return $.replace(/[&<>"']/g,(Z)=>CB[Z])}var AB={amp:"&",lt:"<",gt:">",quot:'"',apos:"'"};function w8($){if(!$.includes("&"))return $;return $.replace(/&(#x[0-9a-fA-F]{1,6}|#[0-9]{1,7}|[a-zA-Z]{2,4});/g,(Z,J)=>{if(J[0]!=="#")return AB[J]??Z;let W=J[1]==="x"?parseInt(J.slice(2),16):parseInt(J.slice(1),10);return W>0&&W<=1114111?String.fromCodePoint(W):Z})}function q8($){let Z=$.indexOf(":");return(Z===-1?$:$.slice(Z+1)).toLowerCase()}function t5($,Z){let J=$.length,W=0;while(W<J){if(Z.stopped?.())return;let Y=$.indexOf("<",W);if(Y===-1){Z.text(w8($.slice(W)));return}if(Y>W)Z.text(w8($.slice(W,Y)));if($.startsWith("<!--",Y)){let j=$.indexOf("-->",Y+4);if(j===-1)return;W=j+3}else if($.startsWith("<![CDATA[",Y)){let j=$.indexOf("]]>",Y+9);if(j===-1)return;Z.text($.slice(Y+9,j)),W=j+3}else if($.startsWith("<?",Y)){let j=$.indexOf("?>",Y+2);if(j===-1)return;W=j+2}else if($.startsWith("<!",Y)){let j=$.indexOf(">",Y+2);if(j===-1)return;let z=$.indexOf("[",Y+2);if(z!==-1&&z<j){let X=$.indexOf("]",z+1);if(X===-1)return;let Q=$.indexOf(">",X+1);if(Q===-1)return;W=Q+1}else W=j+1}else if($[Y+1]==="/"){let j=$.indexOf(">",Y+2);if(j===-1)return;Z.close(q8($.slice(Y+2,j).trim())),W=j+1}else{let j=SB($,Y+1);if(j===-1)return;let z=$.slice(Y+1,j),X=z.endsWith("/");if(X)z=z.slice(0,-1);let Q=z.search(/[\s]|$/),G=q8(z.slice(0,Q));if(G){if(Z.open(G,EB(z.slice(Q)),X),X)Z.close(G)}W=j+1}}}function SB($,Z){let J=null;for(let W=Z;W<$.length;W++){let Y=$[W];if(J){if(Y===J)J=null}else if(Y==='"'||Y==="'")J=Y;else if(Y===">")return W}return-1}function EB($){let Z={},J=/([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;for(let W of $.matchAll(J))Z[q8(W[1])]=w8(W[2]??W[3]??"");return Z}class X0 extends Error{url;status;constructor($,Z=null,J=null){super($);this.url=Z;this.status=J;this.name="SitemapError"}}var Wj="http://www.sitemaps.org/schemas/sitemap/0.9",bB="http://www.w3.org/1999/xhtml",g8=`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
import{nh as EK}from"./chunk-9522w4e4.js";import{Hh as SK}from"./chunk-z8mq4g46.js";import{Hi as b1,Ih as G3,Li as AQ,Mh as EG,Mi as ZZ,Nh as l5,Ni as JZ,Oh as i5,Oi as XK,Ph as P8,Qh as D8,Qi as QK,Th as O8,Uh as L8,Vh as tZ,Wh as a4,Xh as kY,Yh as D5,Zh as d,di as C,ei as p8,fi as VZ,gi as N8,hi as B6,ji as b$,ki as m,li as d4,ti as F6,zi as V6}from"./chunk-c0qq5t8a.js";import{Ti as $$,Ui as z0,Vi as J$,Wi as n5}from"./chunk-jwvwve00.js";import{Xi as t$,Yi as qY,aj as fj,bj as r4,cj as T}from"./chunk-8zwm5n7d.js";import{fj as OQ,ij as l3}from"./chunk-47cjayhh.js";import{mj as uj,pj as $K}from"./chunk-s0m717j8.js";import{Hj as E$,Mj as Z$}from"./chunk-mby1wdny.js";import{_j as tX}from"./chunk-s208599z.js";import{$j as WZ,ck as tG}from"./chunk-8v95cjc5.js";import{dk as P1}from"./chunk-q3g4xs1z.js";import{ek as X6,fk as l0,gk as R1,hk as Z5,ik as AK,kk as uZ,lk as jK,uk as J5}from"./chunk-nwg70wza.js";import{Jk as f1}from"./chunk-6t9zjhm6.js";import{Ok as xY,Tk as CY}from"./chunk-dp5ha6qy.js";import{_k as IY,dl as c}from"./chunk-93s13x3v.js";import{el as rZ,hl as M}from"./chunk-r36kq8x1.js";import{pl as HY}from"./chunk-zpshgset.js";import{ql as GK}from"./chunk-zm4fdsq5.js";import{Al as UY}from"./chunk-4hj0q8fs.js";import{Bl as j8,Dl as bG}from"./chunk-e7hb47yy.js";import{Il as t4}from"./chunk-pw6ssy3a.js";function Z6($){return typeof $==="function"&&$.prototype!==void 0}var z5=Symbol.for("gemi.HttpResponse"),yK=new Set([301,302,303,307,308]);class K1{kind;body;status;headers;[z5]=!0;constructor($,Z,J,W){this.kind=$;this.body=Z;this.status=J;this.headers=W}static json($,Z={}){let J=Z.status??200;return j5(J,"json"),new K1("json",$,J,new Headers(Z.headers))}static error($,Z,J={}){if(!Number.isInteger($)||$<400||$>599)throw RangeError(`HttpResponse.error: status must be an integer from 400 to 599, got ${$}.`);return K1.json({error:Z},{...J,status:$})}static redirect($,Z={}){let J=Z.status??303;if(!yK.has(J))throw RangeError(`HttpResponse.redirect: status must be 301, 302, 303, 307 or 308, got ${J}.`);let W=String($);if(W==="")throw TypeError("HttpResponse.redirect: url is empty.");let Y=new Headers(Z.headers);return Y.set("Location",W),new K1("empty",void 0,J,Y)}static noContent($={}){return new K1("empty",null,204,new Headers($.headers))}static text($,Z={}){let J=Z.status??200;return j5(J,"text"),new K1("text",$,J,new Headers(Z.headers))}get ok(){return this.status>=200&&this.status<300}toResponse($,Z){let J=$,W=this.serialize(J);for(let Y of Z)J.append("Set-Cookie",Y);this.headers.forEach((Y,j)=>{if(j.toLowerCase()!=="set-cookie")J.set(j,Y)});for(let Y of this.headers.getSetCookie())J.append("Set-Cookie",Y);if(this.status>=400&&!this.headers.has("Cache-Control"))J.set("Cache-Control","no-store");return new Response(W,{status:this.status,headers:J})}serialize($){switch(this.kind){case"json":return $.set("Content-Type","application/json"),JSON.stringify(this.body)??null;case"text":return $.set("Content-Type","text/plain; charset=utf-8"),this.body;case"empty":return $.delete("Content-Type"),null}}}function j5($,Z){if(!Number.isInteger($)||$<200||$>599)throw RangeError(`HttpResponse.${Z}: status must be an integer from 200 to 599, got ${$}.`);if($===204||$===205||$===304)throw RangeError(`HttpResponse.${Z}: a ${$} response has no body.${$===204?" Use HttpResponse.noContent().":""}`)}function r1($){return typeof $==="object"&&$!==null&&$[z5]===!0}function vK($,Z,J={}){return K1.error($,Z,J)}function a0($){return typeof $==="string"?[$]:$}function J6($,Z){let J=$.split(/[\\/]/).pop()??"",W=Z?"attachment":"inline",Y=J.replace(/["\\]/g,"").replace(/[^\x20-\x7e]/g,"_");return`${W}; filename="${Y}"; filename*=UTF-8''${encodeURIComponent(J)}`}function gK($){return"total"in $&&"partial"in $&&"body"in $}function X5(){return new Response("Not found",{status:404,headers:{"X-Content-Type-Options":"nosniff"}})}function Y3($){return new Response(null,{status:416,headers:{"Accept-Ranges":"bytes","Content-Range":L8($),"Content-Length":"0","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}async function mK($){if($ instanceof Blob)return{body:$,start:0,end:$.size-1,total:$.size,partial:!1,type:$.type,name:$.name,download:!1,status:200,extraHeaders:{}};if(gK($))return{body:$.body,start:$.start,end:$.end,total:$.total,partial:$.partial,type:$.type,name:$.name,download:$.download??!1,etag:$.etag,lastModified:$.lastModified,status:$.status??200,extraHeaders:$.headers??{}};let Z=$.file,J=Z instanceof Blob?Z:null,W=$.total??J?.size??-1;return{body:Z,start:$.start??0,end:$.end??W-1,total:W,partial:$.partial??!1,type:$.type??J?.type??"",name:$.name??Z?.name,download:$.download??!1,etag:$.etag,lastModified:$.lastModified,status:$.status??200,extraHeaders:$.headers??{}}}async function M8($,Z){if($ instanceof Response)return $;if(!$)return X5();let J=await mK($),{body:W,start:Y,end:j,total:z,partial:X}=J;if(W instanceof Blob&&"exists"in W&&typeof W.exists==="function"){if(!await W.exists())return X5()}let{range:Q}=Z;if(Q){if(z<=0)return Y3(Math.max(z,0));if(!X){if(W instanceof Blob){let K=D8(Q,z);if(!K)return Y3(z);W=W.slice(K.start,K.end+1),Y=K.start,j=K.end,X=!0}}}let G=Boolean(Q)&&X,B=G?206:J.status,F=new Headers;if(F.set("Accept-Ranges","bytes"),F.set("Content-Type",J.type||"application/octet-stream"),F.set("X-Content-Type-Options","nosniff"),G)F.set("Content-Range",O8(Y,j,z)),F.set("Content-Length",String(j-Y+1));else if(z>=0)F.set("Content-Length",String(z));if(J.name)F.set("Content-Disposition",J6(J.name,J.download));if(J.etag)F.set("ETag",J.etag);if(J.lastModified)F.set("Last-Modified",J.lastModified.toUTCString());for(let[K,V]of Object.entries(J.extraHeaders))F.set(K,V);if((Z.method??"GET").toUpperCase()==="HEAD"){if(W&&"cancel"in W&&typeof W.cancel==="function")await W.cancel();return new Response(null,{status:B,headers:F})}return new Response(W,{status:B,headers:F})}class QZ extends z0{limit;constructor($){super("The request body is too large.",{status:413});this.limit=$}}var Q5={b:1,k:1024,kb:1024,m:1048576,mb:1048576,g:1073741824,gb:1073741824};function z3($){if(typeof $==="number"){if(Number.isFinite($)&&$>=0)return Math.floor($);if($===1/0)return 1/0}else{let Z=$.trim().toLowerCase();if(Z==="none"||Z==="off")return 1/0;let J=/^(\d+(?:\.\d+)?)\s*([a-z]*)$/.exec(Z);if(J&&(J[2]===""||(J[2]in Q5)))return Math.floor(Number(J[1])*(Q5[J[2]]??1))}throw Error(`Invalid body limit ${JSON.stringify($)}. Use a byte count or a size such as "64kb", "1mb" or "none".`)}var j3=new WeakMap;function K5($){return j3.has($)}function B5($){return j3.get($)?.limit??null}function F5($){let Z=j3.get($);return Z?Z.read>Z.limit:!1}function hK($){let Z=$.headers.get("Content-Length");if(Z===null||!/^\s*\d+\s*$/.test(Z))return null;return Number(Z)}function T8($,Z){let J=hK($);if(J!==null&&J>Z)throw new QZ(Z)}function W6($,Z,J={}){let W=j3.get($);if(W)W.limit=Z;else{let Y={limit:Z,read:0,stream:void 0,used:!1};j3.set($,Y),cK($,Y)}if(J.checkDeclared!==!1)T8($,Z)}function pK($){return Reflect.get(Object.getPrototypeOf($),"body",$)??null}function H8($,Z){if(Z.stream!==void 0)return Z.stream;let J=pK($);if(!J)return Z.stream=null;let W;return Z.stream=new ReadableStream({async pull(Y){W??=J.getReader();let{done:j,value:z}=await W.read();if(j){Y.close();return}if(Z.read+=z.byteLength,Z.read>Z.limit){let X=new QZ(Z.limit);Y.error(X),W.cancel(X).catch(()=>{});return}Y.enqueue(z)},cancel(Y){return W?W.cancel(Y):J.cancel(Y)}},{highWaterMark:0}),Z.stream}async function XZ($,Z){if(T8($,Z.limit),Z.used||Z.stream?.locked)throw TypeError("Body already used");Z.used=!0;let J=H8($,Z);if(!J)return new Uint8Array(0);let W=J.getReader(),Y=[],j=0;for(;;){let{done:Q,value:G}=await W.read();if(Q)break;Y.push(G),j+=G.byteLength}let z=new Uint8Array(j),X=0;for(let Q of Y)z.set(Q,X),X+=Q.byteLength;return z}function G5($){return $.headers.get("Content-Type")??""}function cK($,Z){let J=(W,Y)=>Object.defineProperty($,W,{configurable:!0,...Y});J("body",{get:()=>H8($,Z)}),J("bodyUsed",{get:()=>Z.used||Boolean(Z.stream?.locked)||Reflect.get(Object.getPrototypeOf($),"bodyUsed",$)}),J("bytes",{value:()=>XZ($,Z)}),J("arrayBuffer",{value:async()=>{let W=await XZ($,Z);return W.buffer.slice(W.byteOffset,W.byteOffset+W.byteLength)}}),J("text",{value:async()=>new TextDecoder().decode(await XZ($,Z))}),J("json",{value:async()=>JSON.parse(new TextDecoder().decode(await XZ($,Z)))}),J("blob",{value:async()=>new Blob([await XZ($,Z)],{type:G5($)})}),J("formData",{value:async()=>new Response(await XZ($,Z),{headers:{"Content-Type":G5($)}}).formData()}),J("clone",{value:()=>{T8($,Z.limit);let W=H8($,Z),Y=null;if(W){let[j,z]=W.tee();Z.stream=j,Y=z}return new Request($.url,{method:$.method,headers:$.headers,body:Y,signal:$.signal,duplex:"half"})}})}function dK($){return Z6($)}function V5($,Z){if($.length===0)return $();return $(Z??new C)}class o{method;handler;methodName;__internal_brand="RouteHandler";middlewares=[];constructor($,Z,J){this.method=$;this.handler=Z;this.methodName=J;this.handler=Z,this.methodName=J,this.method=$}get source(){if(!dK(this.handler)||typeof this.methodName!=="string")return;return{controller:this.handler,methodName:this.methodName}}__internal_use(){return{run:this.run.bind(this),middlewares:this.middlewares}}run($){if(this.source){let Z=new this.source.controller;return V5(Z[this.methodName].bind(Z),$)}return V5(this.handler,$)}middleware($){return this.middlewares=a0($),this}}class O5{url;headers;__internal_brand="ProxyHandler";middlewares=[];constructor($,Z){this.url=$;this.headers=Z}middleware($){return this.middlewares=a0($),this}async run(){let $=new C,Z=$.headers.toJSON();for(let J of D5($.rawRequest))delete Z[J];try{return await fetch(this.url,{method:$.rawRequest.method,headers:{...Z,...this.headers},body:$.rawRequest.body})}catch(J){if(F5($.rawRequest))throw new QZ(B5($.rawRequest));throw J}}}class L5{constructor(...$){return new o(...$)}}class M5 extends o{__internal_brand="StreamHandler";async run($){let Z=T.getStore(),J=Z?.req?.rawRequest,W=P8(J?.headers.get("Range"));if(Z)Z.rangeRequest=W;try{let Y=await super.run($);if(r1(Y))return Y;return await M8(Y,{range:W,method:J?.method})}catch(Y){if(Y instanceof N8)return Y3(Y.total);throw Y}finally{if(Z)Z.rangeRequest=null}}}class H5{constructor(...$){return new M5(...$)}}class T5{__internal_brand="ResourceRoutes";first;second;constructor($){this.first={get:new o("GET",$,"list"),post:new o("POST",$,"store")},this.second={get:new o("GET",$,"show"),put:new o("PUT",$,"update"),delete:new o("DELETE",$,"delete")}}middleware($){if($.list)this.first.get.middleware($.list);if($.store)this.first.post.middleware($.store);if($.show)this.second.get.middleware($.show);if($.update)this.second.put.middleware($.update);if($.delete)this.second.delete.middleware($.delete);return this}}class C0{static __brand="ApiRouter";routes={};middlewares=[];middleware($){}get($,Z){return new o("GET",$,Z)}post($,Z){return new o("POST",$,Z)}put($,Z){return new o("PUT",$,Z)}patch($,Z){return new o("PATCH",$,Z)}delete($,Z){return new o("DELETE",$,Z)}resource($){return new T5($)}agent($){if($.kind!=="agent-controller")throw TypeError(`this.agent() takes an AgentController class, and got ${U5($)}.`);return uK($)}voice($){if($.kind!=="agent-controller")throw TypeError(`this.voice() takes an AgentController class, and got ${U5($)}.`);return lK($)}file($,Z){return new L5("GET",$,Z)}stream($,Z){return new H5("GET",$,Z)}proxy($,Z={}){return new O5($,Z)}}function U5($){if(typeof $==="function"&&$.name)return $.name;return typeof $}function uK($){let Z={stream:new o("POST",$,"stream"),attach:new o("POST",$,"attach"),stop:new o("POST",$,"stop"),upload:new o("POST",$,"upload")};return class extends C0{static __internal_brand="AgentRoute";static controller=$;static handlers=Z;routes={"/":Z.stream,"/attach":Z.attach,"/stop":Z.stop,"/files":Z.upload};static middleware(W){if(W.stream)Z.stream.middleware(W.stream);if(W.attach)Z.attach.middleware(W.attach);if(W.stop)Z.stop.middleware(W.stop);if(W.upload)Z.upload.middleware(W.upload);return this}}}function lK($){let Z={start:new o("POST",$,"voiceStart"),update:new o("PATCH",$,"voiceUpdate"),end:new o("DELETE",$,"voiceEnd")};return class extends C0{static __internal_brand="VoiceRoute";static controller=$;static handlers=Z;routes={"/":Z.start,"/:sessionId":{patch:Z.update,delete:Z.end}};static middleware(W){if(W.start)Z.start.middleware(W.start);if(W.update)Z.update.middleware(W.update);if(W.end)Z.end.middleware(W.end);return this}}}var t1="access_token";function S$($){return $?.cookies?.get("access_token")||$?.headers?.get("access_token")||null}async function Y6($,Z){let J=S$(Z);if(!J)return null;return(await $.getSession(J,Z.headers.get("User-Agent")))?.user??null}var iK=/^[A-Za-z0-9_-]+$/,sK=/^:[A-Za-z_][A-Za-z0-9_]*$/,P5=/^[A-Za-z0-9_-]{1,128}$/,nK=/^[A-Za-z0-9_.:-]+$/;class u extends Error{constructor($){super($);this.name="InvalidChannelError"}}function N5($){return typeof $==="object"&&$!==null&&typeof $.topic==="string"}function GZ($){if(typeof $!=="string"||$.length===0)throw new u("A channel pattern must be a non-empty string.");if($.length>255)throw new u(`The channel pattern "${$.slice(0,40)}\u2026" is longer than ${"255"} characters.`);let Z=$.split("."),J=new Set;for(let W of Z){if(sK.test(W)){let Y=W.slice(1);if(J.has(Y))throw new u(`The channel pattern "${$}" names the param "${Y}" twice.`);J.add(Y);continue}if(W.startsWith("__"))throw new u(`The channel "${$}" has the segment "${W}". Segments starting with "__" are reserved for gemi (driver control messages).`);if(!iK.test(W))throw new u(`The channel pattern "${$}" has an invalid segment "${W}". Segments are separated by dots and are either letters, digits, "_" and "-", or a param such as ":siteId".`)}return Z}function X3($,Z={}){let J=GZ($),W=new Set,Y=J.map((j)=>{if(!j.startsWith(":"))return j;let z=j.slice(1);W.add(z);let X=Z[z];if(X===void 0||X===null)throw new u(`The channel "${$}" needs the param "${z}".`);let Q=typeof X==="number"&&Number.isFinite(X)?String(X):X;if(typeof Q!=="string"||!P5.test(Q))throw new u(`The param "${z}" of the channel "${$}" must be 1 to 128 letters, digits, "_" or "-". Use a public id in a channel name.`);return Q}).join(".");for(let j of Object.keys(Z))if(!W.has(j))throw new u(`The channel "${$}" has no param "${j}".`);if(Y.length>255)throw new u(`The topic built from "${$}" is longer than 255 characters.`);return Y}function _8($){if(GZ($).some((J)=>J.startsWith(":")))throw new u(`"${$}" is a pattern, not a topic: pass its params, as in Broadcast.to("${$}", { ... }).`);return $}function _5($){if(typeof $!=="string"||$.length===0||$.length>64||!nK.test($))throw new u(`The event name "${String($).slice(0,40)}" must be 1 to 64 letters, digits, "_", "-", "." or ":".`);return $}function I5($,Z){if($===Z)return!0;if($===U0)return Z.startsWith(`${U0}.`)&&Z.split(".").length===2;let J=$.split("."),W=Z.split(".");if(J.length!==W.length)return!1;return J.every((Y,j)=>Y===W[j]||Y.startsWith(":")&&P5.test(W[j]))}var U0="user";function KZ($){let Z=typeof $==="object"&&$!==null?$.id:$;return X3(`${U0}.:id`,{id:Z})}class J0{req;static runsOnRefusal=!1;config={};constructor($){this.req=$}run(...$){return{}}static configure($){let Z=this;return class extends Z{config=$}}}class j6 extends J0{run($){let Z=$??this.config.limit;if(Z===void 0||Z==="")throw Error('`body-limit` needs a size, as in "body-limit:64kb".');return W6(this.req.rawRequest,z3(Z)),{}}}function oK($){let Z=new Map;for(let J of $)if(typeof J==="string"){let[W,Y=""]=J.split(":");if(W.startsWith("-")){if(Z.has(W.replace("-","")))Z.delete(W.replace("-",""))}else Z.set(W,Y.split(",").filter(Boolean))}else Z.set(J,[]);return Z}var aK={"body-limit":j6};class e1{config;static token="middleware";defaultBodyLimit;constructor($){this.config=$;this.defaultBodyLimit=$.bodyLimit===null||$.bodyLimit===void 0?null:z3($.bodyLimit)}get aliases(){return{...aK,...this.config.aliases}}applyDefaultBodyLimit($){if(this.defaultBodyLimit!==null&&!K5($))W6($,this.defaultBodyLimit,{checkDeclared:!1})}assertGlobalMiddleware(){for(let $ of this.config.global){if(typeof $!=="string")continue;let[Z]=$.split(":");if(Z.startsWith("-"))throw Error(`Global middleware "${$}" cancels an alias, but nothing is inherited into the global list. Remove it.`);if(!this.aliases[Z])throw Error(`Global middleware "${Z}" is not a registered alias. Add it to \`aliases\` in the middleware config, or list the class itself.`)}}runGlobalMiddleware(){return this.runMiddleware(this.config.global)}runMiddleware($){let Z=new C,J=this.aliases,W=[];for(let[Y,j]of oK($).entries())if(typeof Y==="string"){let z=J[Y];if(z){let X=new z(Z);W.push({run:()=>X.run.call(X,...j),runsOnRefusal:x5(z)})}}else if(Z6(Y)){let z=new Y(Z);W.push({run:z.run.bind(z),runsOnRefusal:x5(Y)})}else W.push({run:Y,runsOnRefusal:!1});return(async()=>{let Y={};for(let j=0;j<W.length;j++)try{Y={...Y,...await W[j].run()}}catch(z){throw await rK(W.slice(j+1)),z}return Y})()}}function x5($){return $?.runsOnRefusal===!0}async function rK($){for(let Z of $){if(!Z.runsOnRefusal)continue;try{await Z.run()}catch(J){console.error(J)}}}class z6{visibility;authorizer;middlewares=[];constructor($,Z){this.visibility=$;this.authorizer=Z}middleware($){return this.middlewares=[...this.middlewares,...a0($)],this}events(...$){return this}}class E5{static __brand="ChannelRouter";channels={};public(){return new z6("public")}private($){return new z6("private",$)}async authorize($,Z,J={},W={}){try{ZB(this)}catch(Q){return console.error("[gemi] The channel router is invalid, so every subscription is refused.",Q),{ok:!1,code:"error"}}let Y=Object.hasOwn(this.channels,Z)?this.channels[Z]:void 0;if(!b5(Y))return{ok:!1,code:"unknown_channel"};let j=null;try{if(Z===U0){if(Object.keys(J??{}).length>0)return{ok:!1,code:"invalid_params"}}else j=X3(Z,J??{})}catch(Q){if(Q instanceof u)return{ok:!1,code:"invalid_params"};throw Q}let z=Object.fromEntries(Object.entries(J??{}).map(([Q,G])=>[Q,String(G)])),X=new C($,z,"api",Z);return T.exit(()=>X6.exit(()=>T.run(X,async()=>{let Q=T.getStore();try{if(Y.middlewares.length>0)await M(e1).runMiddleware(Y.middlewares);if(Z===U0){let G=await C5(X);if(!G)return{ok:!1,code:"denied"};if(j=KZ(G),Y.visibility==="private"&&Y.authorizer){if(await A5(Y.authorizer,X,z)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}if(Y.visibility==="private"){if((Y.authorizer?await A5(Y.authorizer,X,z):await C5(X)!==null)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}catch(G){if($B(G))return{ok:!1,code:"denied"};return console.error(`[gemi] Authorizing the channel "${Z}" threw, so the subscription was refused.`,G),{ok:!1,code:"error"}}finally{Q.destroy()}},W.carried)))}}async function tK($,Z,J={},W={}){let Y=typeof $==="function"?new $:$;R5(Y);let j=W.as,z,X=null;if(j instanceof Request)z=j;else if(j&&typeof j==="object"&&j.rawRequest instanceof Request)z=j.rawRequest;else z=new Request("http://localhost/__gemi/socket"),X=j?{user:j}:null;return(await Y.authorize(z,Z,J,{carried:X})).ok}function b5($){let Z=$?.visibility;return typeof $==="object"&&$!==null&&Array.isArray($.middlewares)&&(Z==="public"||Z==="private")}async function C5($){if(!T.getStore().user&&S$($)===null)return null;try{return await q0.user()}catch(Z){if(Z?.name==="AuthenticationError")return null;throw Z}}function A5($,Z,J){if(eK($))return new $().authorize(Z,J);return $(Z,J)}function eK($){return typeof $==="function"&&typeof $.prototype?.authorize==="function"}function $B($){return $?.kind===$$||Z$($)||E$($)}var S5=new WeakSet;function ZB($){if(S5.has($))return;R5($),S5.add($)}function R5($){let Z=Object.entries($.channels),J=[];for(let[W,Y]of Z){if(!b5(Y))throw new u(`The channel "${W}" is not declared with this.public() or this.private().`);let j=GZ(W);if(j[0].startsWith(":"))throw new u(`The channel pattern "${W}" starts with a param. Start it with a literal segment, such as "site.:siteId", so it cannot overlap another channel.`);if(W!==U0&&j.length===2&&j[0]===U0)throw new u(`The channel pattern "${W}" can build user.<id>, which belongs to the "user" channel (the signed-in user's own). Declare "user" and emit with Broadcast.toUser(user), or name this channel differently.`);if(W!==U0&&Y.visibility==="private"&&!Y.authorizer&&j.some((z)=>z.startsWith(":")))throw new u(`The private channel "${W}" has params but no authorization, so every signed-in user could join every one of them. Pass a callback or a policy that checks the params: this.private((req, params) => ...).`);J.push({pattern:W,segments:W===U0?[U0,":id"]:j})}for(let W=0;W<J.length;W++)for(let Y=W+1;Y<J.length;Y++)if(JB(J[W].segments,J[Y].segments))throw new u(`The channel patterns "${J[W].pattern}" and "${J[Y].pattern}" can build the same topic, so a subscriber could join one's topics through the other's authorization. Make them differ in a literal segment.`)}function JB($,Z){if($.length!==Z.length)return!1;return $.every((J,W)=>J===Z[W]||J.startsWith(":")||Z[W].startsWith(":"))}class I8{as;input;bind;__internal_brand="McpModelParam";constructor($,Z,J){this.as=$;this.input=Z;this.bind=J}}class Q6{method;url;meta;__internal_brand="McpRoute";constructor($,Z,J){this.method=$;this.url=Z;this.meta=J}}class x8{tool;meta;__internal_brand="McpTool";constructor($,Z){this.tool=$;this.meta=Z}}function WB($){let Z=[],J="";for(let W of $)if(W==="_"||W==="-"||W===" "){if(J)Z.push(J);J=""}else if(W===W.toLowerCase())J+=W;else{if(J)Z.push(J);J=W.toLowerCase()}if(J)Z.push(J);return Z}function YB($,Z){let J=WB($);if(Z==="snake")return J.join("_");if(Z==="kebab")return J.join("-");return J.map((W,Y)=>Y===0?W:W[0].toUpperCase()+W.slice(1)).join("")}class f5{static __brand="McpRouter";routes={};scopes;param($){return new I8($.as,$.input,$.bind)}fromTool($,Z={}){return new x8($,Z)}fromApiRoute($,Z,J){return new Q6($,Z,J)}fromApiRouteFor($,Z,J){let{name:W,audiences:Y,description:j,params:z,files:X,...Q}=J,G=`McpRouter.fromApiRouteFor("${$}", "${Z}")`,B=Object.keys(Y??{});if(B.length===0)throw Error(`${G}: declare at least one audience.`);let F={},K=new Map;for(let V of B){let{name:D,casing:U,description:O,params:L,files:P,...H}=Y[V],I=D??(U?YB(W,U):W);if(K.has(I))throw Error(`${G}: the audiences "${K.get(I)}" and "${V}" are both named "${I}". Give one its own name or casing.`);K.set(I,V);let E=typeof O==="function"?j===void 0?void 0:O(j):O??j;if(typeof E!=="string")throw Error(`${G}: the audience "${V}" has no description, and there is no shared one.`);let S={...Q,...H,description:E};if(z||L)S.params={...z,...L};if(X||P)S.files={...X,...P};F[I]=new Q6($,Z,S)}return F}}function D0($,Z){return $.replace(/:([^/]+[*?]?)/g,(J,W)=>{let Y=W.endsWith("?")||W.endsWith("*"),j=Y?W.slice(0,-1):W,z=Z[j];if(z===void 0){if(Y)return"";if(import.meta.env.DEV)throw Error(`Missing parameter: ${j}`);console.error(`Missing parameter: ${j} in URL: ${$}`)}return String(z)}).replace(/\/\//g,"/").replace(/\/$/,"")}class C8 extends z0{constructor($,Z=307){super("Redirect error");this.name="RedirectError",this.payload={api:{status:200,data:{},directive:{kind:"Redirect",path:$}},view:{status:Z,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:$}}}}}class S1{static to($,...Z){let[J={}]=Z,{search:W={},params:Y={},permanent:j,status:z}={params:{},status:307,permanent:!1,...J},X=new URLSearchParams(W).toString();throw new C8([D0($,Y)||"/",X.toString()].filter(Boolean).join("?"),z??(j?301:307))}static external($,Z=307){throw new C8($,Z)}}class k5{kind="redirect";viewPath="REDIRECT";middlewares=[];featureGates=[];handler;constructor($){if(!$)this.handler=()=>({});else if(typeof $==="function")this.handler=$;else{let[Z,J]=$;this.handler=(W)=>{return new Z()[J](W)}}}async run($,Z){let{destination:J,permanent:W=!1,status:Y=307}=await this.handler($);if(!J)throw Error(`Redirect destination is required see ${Z}`);return S1.to(J,{permanent:W,status:Y}),{}}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}async function A8($,Z){if($ instanceof Response)return $;let J=$ instanceof Blob,W=J?$:$.file,Y=J?$.name:$.name??$.file?.name,j=(J?$.type:$.type??$.file?.type)||"",z=J?!1:$.download??!1,X=J?200:$.status??200;if(!J)for(let[Q,G]of Object.entries($.headers??{}))Z.set(Q,G);if(W instanceof Blob&&"exists"in W&&typeof W.exists==="function"){if(!await W.exists())return new Response("Not found",{status:404})}if(Z.set("Content-Type",j||"application/octet-stream"),W instanceof Blob)Z.set("Content-Length",String(W.size));if(Y)Z.set("Content-Disposition",J6(Y,z));return new Response(W instanceof Blob?W.stream():W,{status:X,headers:Z})}class w5{kind="file";viewPath="FILE";middlewares=[];featureGates=[];handler;constructor($){if(!$)this.handler=()=>null;else if(typeof $==="function")this.handler=$;else{let[Z,J]=$;this.handler=(W)=>{return new Z()[J](W)}}}async run($,Z){let J=await this.handler($);if(!J)throw Error(`File route handler must return a file see ${Z}`);return{FILE:J}}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}function q5($,Z){if(r1($))throw Error(`The handler of view "${Z}" returned an HttpResponse. HttpResponse is for api routes; a view handler returns its props.`);return $}class y5{viewPath;middlewares=[];featureGates=[];staticOptions=null;handler;constructor($,Z){this.viewPath=$;if(!Z)this.handler=()=>({});else if(typeof Z==="function")this.handler=Z;else{let[J,W]=Z;this.handler=(Y)=>{return new J()[W](Y)}}}async run($,Z){let J=q5(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}middleware($){return this.middlewares=a0($),this}static($={}){return this.staticOptions={...$},this}feature($){return this.featureGates=[...this.featureGates,$],this}}class v5{viewPath;children;middlewares=[];featureGates=[];alwaysRuns=!1;handler=()=>({});constructor($,Z,J){this.viewPath=$;if(typeof Z==="function")this.handler=Z,this.children=class extends E1{routes=J??{}};else if(Array.isArray(Z)){let[W,Y]=Z;this.handler=(j)=>{return new W()[Y](j)},this.children=class extends E1{routes=J??{}}}else this.children=class extends E1{routes=Z},this.handler=()=>({})}async run($,Z){let J=q5(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}alwaysRun(){return this.alwaysRuns=!0,this}middleware($){return this.middlewares=a0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}class E1{middlewares=[];featureGates=[];routes={};view($,Z){return new y5($,Z)}file($){return new w5($)}redirect($){return new k5($)}layout($,Z,J){return new v5($,Z,J)}}function jB($){return $}function zB(){return{aliases:{},global:[],bodyLimit:null}}var B1="redirect";function F1($,Z="/"){if(typeof $!=="string"||!$.startsWith("/"))return Z;if(/[\u0000-\u001f\u007f\\]/.test($)||$.startsWith("//"))return Z;try{let J=new URL($,"http://gemi.invalid");if(J.origin!=="http://gemi.invalid")return Z;let W=`${J.search}${J.hash}`.replaceAll("/","%2F"),Y=`${J.pathname}${W}`.replaceAll(":","%3A");return Y.startsWith("//")?Z:Y}catch{return Z}}function BZ($){let Z=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();return Z?Z==="https":new URL($.url).protocol==="https:"}function XB($,Z=!0){let J=new URL($.rawRequest.url),W=J.pathname.replace(/\.(json|og)$/,""),[,Y,...j]=W.split("/");if(M(c).supportedLocales.includes(Y))W=`/${j.join("/")}`;return Z?`${W}${J.search}`:W}function QB($,Z){let J=(W)=>W.replace(/\/+$/,"")||"/";return J($)===J(Z)}function G6($,Z){let J=Z||M(b).config.signInPath,W=/^[a-z][a-z\d+.-]*:/i.test(J);if(W?!/^https?:\/\//i.test(J):!J.startsWith("/"))throw Error(`\`auth.signInPath\` must be a path like "/auth/sign-in", or an http(s) URL for sign-in hosted elsewhere. Got "${J}". A route's own \`"auth:<path>"\` cannot carry a URL, because the alias parser splits it on the colon.`);let Y=new URL(J,"http://gemi.invalid");if($?.kind==="view"){let j=XB($,!W);if(W||!QB(new URL(j,Y).pathname,Y.pathname))Y.searchParams.set(B1,j)}return W?Y.href:`${Y.pathname}${Y.search}`}class g5 extends J0{async run($){let Z=T.getStore(),J=Z.req;if(Z.user)return{};let W=await Y6(M(b),J);if(!W)throw new b$({redirectTo:G6(J,$)});return Z.setUser(W),{}}}var E8="gemi_same_site",S8="private, no-cache, no-store, max-age=0, must-revalidate";class K6 extends J0{run(){let $=T.getStore(),Z=$?.req;if(!Z||$.user)return{};let J=Z.rawRequest;if(Z.kind!=="view"||J.method!=="GET"&&J.method!=="HEAD")return{};let W=new URL(J.url);if(/\.(json|og)$/.test(W.pathname))return{};if(W.searchParams.has(E8))return{};if(S$(Z))return{};let Y=J.headers.get("Sec-Fetch-Site");if(Y&&Y!=="cross-site")return{};throw W.searchParams.set(E8,"1"),new m5(`${W.pathname}${W.search}`)}}class m5 extends z0{location;constructor($){super("Same-site bounce");this.location=$;this.name="SameSiteBounce";let Z=GB($),J={"Content-Type":"text/html; charset=utf-8","Cache-Control":S8,"Referrer-Policy":"no-referrer","X-Robots-Tag":"noindex"};this.payload={api:{status:401,data:{},headers:{"Cache-Control":S8}},viewData:{status:200,data:{},headers:{"Cache-Control":S8},directive:{kind:"Redirect",path:$}},view:{status:200,headers:J,body:`<!doctype html><html><head><meta charset="utf-8"><meta name="robots" content="noindex"><meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0;url=${Z}"><title>Redirecting</title></head><body><p><a href="${Z}">Continue</a></p></body></html>`}}}}function GB($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}class h5 extends J0{async run(...$){let[Z="public",J="864000",...W]=$,Y=`${Z}, max-age=${J}${W.length>0?", ":""}${W.join(", ")}`;if($.length===0)Y="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if($.length===1&&$[0]==="public")Y="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if($.length===1&&$[0]==="private")Y="private, max-age=0, stale-while-revalidate=300, stale-if-error=600";if(this.req.rawRequest.method==="GET")this.req.ctx().setHeaders("Cache-Control",Y);return{}}}var p5={"Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"};class c5 extends J0{static runsOnRefusal=!0;config={origins:{"":{"Access-Control-Allow-Methods":"GET, HEAD, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"}}};run(){let $=this.req,Z=$.rawRequest.headers.get("Origin");if(Z&&this.config.origins[Z]){$.ctx().setHeaders("Access-Control-Allow-Origin",Z);let J={...p5,...this.config.origins[Z]};for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}else if(Z&&this.config.origins["*"]){$.ctx().setHeaders("Access-Control-Allow-Origin","*");let J={...p5,...this.config.origins["*"]};delete J["Access-Control-Allow-Credentials"];for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}return{}}}var KB="Rate limit exceeded";class W$ extends z0{result;retryAfter;constructor($,Z=KB){super(Z);this.result=$;this.retryAfter=$?.retryAfter;let J={"Content-Type":"application/json",...$?b8($):{}};this.payload={api:{status:429,data:{error:{...J$("rate_limit",Z,429),...$?{retryAfter:$.retryAfter}:{}}},headers:J},view:{error:{message:Z},status:429,headers:J}}}}function b8($){let Z={"X-RateLimit-Limit":String($.limit),"X-RateLimit-Remaining":String($.remaining),"X-RateLimit-Reset":String(Math.ceil($.resetAt/1000))};if(!$.allowed)Z["Retry-After"]=String(Math.max(1,Math.ceil($.retryAfter/1000)));return Z}class V1{config;static token="ratelimiter";constructor($){this.config=$}get driver(){return this.config.driver}async consume($,Z={}){let J=Z.limit??this.config.limit,W=Z.window??this.config.window,Y=Z.cost??1;if(d5("window",W),d5("limit",J),!Number.isFinite(Y)||Y<0)throw Error(`Rate limiter cost must be zero or greater, got ${Y}`);return await this.config.driver.consume({key:$,limit:J,window:W*1000,cost:Y})}async enforce($,Z={},J){let W=await this.consume($,Z);if(!W.allowed)throw new W$(W,typeof J==="function"?J(W):J);return W}}function d5($,Z){if(!Number.isFinite(Z)||Z<=0)throw Error(`Rate limiter ${$} must be greater than zero, got ${Z}`)}import{isIP as R8}from"net";function R$($){let Z=$.trim();if(Z==="")return null;if(Z.startsWith("[")){let W=Z.indexOf("]");if(W<0)return null;let Y=Z.slice(W+1);if(Y!==""&&!/^:\d{1,5}$/.test(Y))return null;let j=Z.slice(1,W);return R8(j)===6?j:null}if(R8(Z))return Z;let J=/^(\d{1,3}(?:\.\d{1,3}){3}):\d{1,5}$/.exec(Z);return J&&R8(J[1])===4?J[1]:null}class s5 extends J0{async run($,Z){let J=BB();if(!J)return{};let W=await J.consume(this.key(),{limit:u5($)??this.config.limit,window:u5(Z)??this.config.window});if(this.config.headers!==!1){let Y=this.req.ctx?.();if(Y)for(let[j,z]of Object.entries(b8(W)))Y.setHeaders(j,z)}if(!W.allowed)throw new W$(W);return{}}key(){if(this.config.key)return this.config.key(this.req);let $=l5(this.req.rawRequest);if($)return`mcp:${$.via}:${$.id}:${this.req.routePath??"*"}`;return`${FZ(this.req)}:${this.req.routePath??"*"}`}}function BB(){try{let $=M();return $.bound(V1)?$.make(V1):null}catch{return null}}function FZ($){let Z=i5($.rawRequest);if(Z!==void 0)return Z;let J=$.headers.get("x-forwarded-for");if(J){let[W]=J.split(",");if(W?.trim())return R$(W)??W.trim()}return $.headers.get("x-real-ip")?.trim()||"unknown"}function u5($){if($===void 0||$===null||$==="")return;let Z=Number($);if(!Number.isFinite(Z)||Z<=0)return;return Z}class o5 extends J0{async run(){let $=this.req.cookies.get("csrf_token");if(!$)throw new f8;if(!["POST","PUT","PATCH","DELETE"].includes(this.req.rawRequest.method))return{};if(!Bun.CSRF.verify($,{secret:process.env.SECRET}))throw new f8;return{}}}class f8 extends z0{constructor(){super("Invalid CSRF token");this.name="InvalidCSRFTokenError"}payload={api:{status:403,data:{error:n5("csrf","Invalid CSRF token",403)}},view:{}}}class a5{policiesList={};constructor(){let $=this.register();for(let Z of $){let J=new Z;this.policiesList[Z.name]=J}}register(){return[]}}class r5{all($,Z){return!0}}class k8{options;param;refuse;answers=new WeakMap;constructor($){this.options=$;this.param=$.param,this.refuse=$.refuse??"not_found"}refusal(){return this.refuse==="forbidden"?new VZ:new B6}authorize($,Z){if(typeof Z==="number"&&Number.isFinite(Z))Z=String(Z);if(typeof Z!=="string"||Z==="")return Promise.reject(this.refusal());let J=this.answers.get($.rawRequest);if(!J)J=new Map,this.answers.set($.rawRequest,J);let W=J.get(Z);if(!W)W=this.decide($,Z),J.set(Z,W);return W}async allows($,Z){try{return await this.authorize($,Z),!0}catch(J){if(this.isRefusal(J))return!1;throw J}}fromRoute($=new C,Z=this.param){if(Z===void 0)throw Error('This resource policy has no `param`. Give `defineResourcePolicy` one, or name it: `fromRoute(req, "pageId")`, or `alias:pageId` on the middleware.');return this.authorize($,$.params?.[Z])}get middleware(){if(!this.middlewareClass){let $=(Z,J)=>this.fromRoute(Z,J||void 0);this.middlewareClass=class extends J0{async run(J){await $(this.req,J)}}}return this.middlewareClass}middlewareClass;forAgent($){return{authorize:async(Z,{threadId:J,body:W})=>{let Y;if(J!==void 0){if(Y=$.thread?await $.thread(J,Z):null,Y===null||Y===void 0)throw this.refusal()}if(W!==void 0){let j=await $.body(W,Z);if(await this.authorize(Z,j),J!==void 0&&String(Y)!==String(j))throw this.refusal();return}if(J!==void 0)await this.authorize(Z,Y)}}}async decide($,Z){let J=await this.options.load(Z,$);if(J===null||J===void 0||!await this.options.allow(J,$))throw this.refusal();return J}isRefusal($){return this.refuse==="forbidden"?$ instanceof VZ:$ instanceof B6}}function FB($){return new k8($)}async function U6($,Z,J=!1){if(!$.body)return new Uint8Array;let[W,Y]=await xB($.body),z=W.length>=2&&W[0]===31&&W[1]===139?Y.pipeThrough(new DecompressionStream("gzip")):Y;return IB(z,Z,J,$.url)}async function IB($,Z,J,W){let Y=$.getReader(),j=[],z=0;try{for(;;){let{done:G,value:B}=await Y.read();if(G)break;if(z+B.byteLength>Z){if(!J)throw new V6(W,Z);j.push(B.subarray(0,Z-z)),z=Z;break}j.push(B),z+=B.byteLength}}finally{Y.cancel().catch(()=>{})}let X=new Uint8Array(z),Q=0;for(let G of j)X.set(G,Q),Q+=G.byteLength;return X}async function xB($){let Z=$.getReader(),J=await Z.read(),W=J.done?new Uint8Array:J.value,Y=new ReadableStream({start(j){if(J.done)j.close();else j.enqueue(W)},async pull(j){let z=await Z.read();if(z.done)j.close();else j.enqueue(z.value)},cancel(j){return Z.cancel(j)}});return[W,Y]}function D6($){return new TextDecoder("utf-8").decode($)}var CB={"&":"&","<":"<",">":">",'"':""","'":"'"};function f$($){return $.replace(/[&<>"']/g,(Z)=>CB[Z])}var AB={amp:"&",lt:"<",gt:">",quot:'"',apos:"'"};function w8($){if(!$.includes("&"))return $;return $.replace(/&(#x[0-9a-fA-F]{1,6}|#[0-9]{1,7}|[a-zA-Z]{2,4});/g,(Z,J)=>{if(J[0]!=="#")return AB[J]??Z;let W=J[1]==="x"?parseInt(J.slice(2),16):parseInt(J.slice(1),10);return W>0&&W<=1114111?String.fromCodePoint(W):Z})}function q8($){let Z=$.indexOf(":");return(Z===-1?$:$.slice(Z+1)).toLowerCase()}function t5($,Z){let J=$.length,W=0;while(W<J){if(Z.stopped?.())return;let Y=$.indexOf("<",W);if(Y===-1){Z.text(w8($.slice(W)));return}if(Y>W)Z.text(w8($.slice(W,Y)));if($.startsWith("<!--",Y)){let j=$.indexOf("-->",Y+4);if(j===-1)return;W=j+3}else if($.startsWith("<![CDATA[",Y)){let j=$.indexOf("]]>",Y+9);if(j===-1)return;Z.text($.slice(Y+9,j)),W=j+3}else if($.startsWith("<?",Y)){let j=$.indexOf("?>",Y+2);if(j===-1)return;W=j+2}else if($.startsWith("<!",Y)){let j=$.indexOf(">",Y+2);if(j===-1)return;let z=$.indexOf("[",Y+2);if(z!==-1&&z<j){let X=$.indexOf("]",z+1);if(X===-1)return;let Q=$.indexOf(">",X+1);if(Q===-1)return;W=Q+1}else W=j+1}else if($[Y+1]==="/"){let j=$.indexOf(">",Y+2);if(j===-1)return;Z.close(q8($.slice(Y+2,j).trim())),W=j+1}else{let j=SB($,Y+1);if(j===-1)return;let z=$.slice(Y+1,j),X=z.endsWith("/");if(X)z=z.slice(0,-1);let Q=z.search(/[\s]|$/),G=q8(z.slice(0,Q));if(G){if(Z.open(G,EB(z.slice(Q)),X),X)Z.close(G)}W=j+1}}}function SB($,Z){let J=null;for(let W=Z;W<$.length;W++){let Y=$[W];if(J){if(Y===J)J=null}else if(Y==='"'||Y==="'")J=Y;else if(Y===">")return W}return-1}function EB($){let Z={},J=/([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;for(let W of $.matchAll(J))Z[q8(W[1])]=w8(W[2]??W[3]??"");return Z}class X0 extends Error{url;status;constructor($,Z=null,J=null){super($);this.url=Z;this.status=J;this.name="SitemapError"}}var Wj="http://www.sitemaps.org/schemas/sitemap/0.9",bB="http://www.w3.org/1999/xhtml",g8=`<?xml version="1.0" encoding="UTF-8"?>
|
|
3
3
|
`,e5=`<urlset xmlns="${Wj}" xmlns:xhtml="${bB}">
|
|
4
4
|
`,$j=`</urlset>
|
|
5
5
|
`,k$=50000,Q3=52428800,Zj=2048,RB=new Set(["always","hourly","daily","weekly","monthly","yearly","never"]),fB=/^\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2}))?)?)?$/,kB="application/xml; charset=utf-8",Jj=new TextEncoder;function m8($,Z){let J;try{J=new URL($)}catch{throw new X0(`Sitemap: ${Z} "${$}" is not an absolute URL.`)}if(J.protocol!=="http:"&&J.protocol!=="https:")throw new X0(`Sitemap: ${Z} "${$}" is not an http(s) URL.`);let W=J.href;if(W.length>Zj)throw new X0(`Sitemap: ${Z} is over ${Zj} characters: "${W.slice(0,80)}\u2026".`);return W}function Yj($,Z){if($ instanceof Date){if(Number.isNaN($.getTime()))throw new X0(`Sitemap: lastmod of ${Z} is an invalid Date.`);return $.toISOString()}if(!fB.test($))throw new X0(`Sitemap: lastmod "${$}" of ${Z} is not a W3C datetime (e.g. "2026-10-07" or "2026-10-07T12:00:00Z").`);return $}function wB($){let Z=m8($.loc,"loc"),J=`<url><loc>${f$(Z)}</loc>`;if($.lastmod!=null)J+=`<lastmod>${f$(Yj($.lastmod,Z))}</lastmod>`;if($.changefreq!=null){if(!RB.has($.changefreq))throw new X0(`Sitemap: changefreq "${$.changefreq}" of ${Z} is not one the protocol knows.`);J+=`<changefreq>${$.changefreq}</changefreq>`}if($.priority!=null){let W=$.priority;if(!Number.isFinite(W)||W<0||W>1)throw new X0(`Sitemap: priority ${W} of ${Z} is not between 0 and 1.`);J+=`<priority>${Number(W.toFixed(4))}</priority>`}for(let W of $.alternates??[]){let Y=W.hrefLang?.trim();if(!Y)throw new X0(`Sitemap: an alternate of ${Z} has no hrefLang.`);let j=m8(W.href,`alternate href of ${Z}`);J+=`<xhtml:link rel="alternate" hreflang="${f$(Y)}" href="${f$(j)}"/>`}return`${J}</url>
|
|
@@ -20,7 +20,7 @@ c.remove(e==='dark'?'light':'dark');c.add(e);d.style.colorScheme=e}catch(x){}}($
|
|
|
20
20
|
`)),Z.onSettle((B)=>{if(X||B.status!=="resolved")return;z.enqueue(Y.encode(`${JSON.stringify([B.path,B.variantKey,B.data])}
|
|
21
21
|
`))});let G=setTimeout(()=>Q(!0),J);Z.allSettled().then(()=>Q(!1),()=>Q(!1))},cancel(){j(!1)}})}import{Fragment as YI,createContext as JO,createElement as jI,lazy as zI,use as XI,useContext as QI}from"react";import{createContext as oD}from"react";var aD=oD(null);import{createContext as eD,useContext as $I}from"react";import{useContext as o_}from"react";import{createContext as rD}from"react";import{jsx as i_}from"react/jsx-runtime";var tD=rD({});var $O="gemi.islandI18n",ZO=globalThis[Symbol.for($O)]??=eD(null);function GG($,Z={}){let J=new Set,W={islands:[],render:$,instances:new WeakMap,count:0,i18n:{},localeAware:Boolean(Z.currentLocale),i18nUsed:!1,dictionaries:[],sink:{use(Y,j,z){let X=`${Y} ${j}`;if(J.has(X))return;J.add(X),W.dictionaries.push([Y,j,z])},onUse(){}}};for(let Y of["currentLocale","defaultLocale","timeZone"])Object.defineProperty(W.i18n,Y,{enumerable:!0,get(){return W.i18nUsed=!0,Z[Y]}});return W}function KG($){if(!$.i18nUsed&&!$.localeAware)return;let{currentLocale:Z,defaultLocale:J,timeZone:W}=$.i18n;return{...Z?{currentLocale:Z}:{},...J?{defaultLocale:J}:{},...W?{timeZone:W}:{},...$.dictionaries.length>0?{dictionaries:$.dictionaries}:{}}}var n3="gemi-slot",BG="data-slot",FG="data-gemi-slot";var WO=Symbol.for("gemi.staticRender"),VG=globalThis[WO]??=JO(null);import{createHash as MG}from"crypto";var BY='var r=document,i=window,a=history;i.__gemi_nav?.d();var L=new AbortController,h=(t,e,n,s)=>t.addEventListener(e,n,{signal:L.signal,...s}),q=i.__gemi_nav={d:()=>L.abort()},v=(t,e)=>{if(!t.g)t.g=1,import(e.s).then((n)=>{if(t.isConnected)t.r=n.h(t,n.m[e.e])}).catch((n)=>console.error(n))},D=(t)=>{let e=t.getElementById("gemi-islands");return e?JSON.parse(e.textContent):{i:[]}},R=(t,e)=>{for(let n of t.querySelectorAll("gemi-island")){let s=e.i[n.dataset.island];if(!s||n.o)continue;if(s.l=="eager")v(n,s);else if(s.l=="idle"||!i.IntersectionObserver||!n.children.length)(i.requestIdleCallback||setTimeout)(()=>v(n,s));else{let l=new IntersectionObserver((m)=>{if(m.some((d)=>d.isIntersecting))l.disconnect(),v(n,s)});for(let m of n.children)l.observe(m)}}},O=\'meta[name="gemi-static"]\',A="style:not([data-gemi-fonts])",T=A+",link[rel=stylesheet]",K=`head>${A},body>${A},link[rel=stylesheet]`,I=\'meta[name]:not([name=viewport]),meta[property],link[rel~=canonical],link[rel~=alternate],link[rel~=icon],link[rel=preload][as=font],style[data-gemi-fonts],script[type="application/ld+json"]\',w=(t)=>t.querySelector(O)?.content,C=(t)=>[...t.querySelectorAll(K)].map((e)=>e.outerHTML).join(),c=(t)=>t.href.split("#")[0],p=r.createElement("div");p.setAttribute("aria-live","polite");p.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap";r.body.append(p);var _=(t)=>{q.p={url:location.href,title:r.title,initial:t},r.dispatchEvent(new CustomEvent("gemi:page-load",{detail:q.p}))},f=new Map,k=(t)=>{let e=f.get(t);if(!e||Date.now()-e[0]>30000){let n=fetch(t,{headers:{accept:"text/html","x-gemi-navigate":"1"},signal:AbortSignal.timeout(1e4)}).then((s)=>{if(!s.ok||!/^text\\/html/.test(s.headers.get("content-type"))||new URL(s.url||t).origin!=location.origin)throw s;return s.text().then((l)=>[s.url||t,l])});e=[Date.now(),n],n.catch(()=>f.get(t)==e&&f.delete(t))}if(f.delete(t),f.set(t,e),f.size>10)f.delete(f.keys().next().value);return e[1]},M=(t)=>{let e=t.target.closest?.("a[href]"),n=e?.getAttribute("target");if(!e||n&&n!="_self"||e.hasAttribute("download")||/(^|\\s)external(\\s|$)/i.test(e.getAttribute("rel"))||e.closest("[data-gemi-reload]"))return;let s=new URL(e.getAttribute("href"),r.baseURI);if(s.origin==location.origin&&!(s.href.includes("#")&&c(s)==c(location)))return s},y={},U=()=>Math.random().toString(36).slice(2),E=()=>a.state?.g||a.replaceState({...a.state,g:U()},""),P=c(location),b=0,N=(t)=>{if(!t.hasAttribute("tabindex"))t.setAttribute("tabindex","-1"),t.addEventListener("blur",()=>t.removeAttribute("tabindex"),{once:!0});t.focus({preventScroll:!0})},Y=(t)=>{let e=r.body,n=t.body,s=D(t),l=r.documentElement;r.title=t.title;for(let o of["lang","dir"]){let u=t.documentElement.getAttribute(o);if(u==null)l.removeAttribute(o);else l.setAttribute(o,u)}for(let o of r.head.querySelectorAll(I))o.remove();let m=new Set([...r.querySelectorAll("link[rel=modulepreload]")].map((o)=>o.getAttribute("href")));r.head.append(...t.head.querySelectorAll(I),...[...t.head.querySelectorAll("link[rel=modulepreload]")].filter((o)=>!m.has(o.getAttribute("href"))));let d=new Map([...e.querySelectorAll("[data-gemi-persist]")].map((o)=>[o.dataset.gemiPersist,o])),g=[...n.querySelectorAll("[data-gemi-persist]")].map((o)=>[o,d.get(o.dataset.gemiPersist)]).filter((o)=>o[1]);for(let o of[...e.querySelectorAll("gemi-island")].reverse())if(o.o=1,!g.some((u)=>u[1].contains(o)))try{o.r?.unmount()}catch(u){console.error(u)}for(let[o,u]of g)o.replaceWith(u);for(let o of[...e.childNodes])if(!o.matches?.(T))o.remove();for(let o of[...n.children])if(o.matches(T))o.remove();for(let o of[...e.attributes])e.removeAttribute(o.name);for(let o of n.attributes)e.setAttribute(o.name,o.value);e.append(...n.childNodes,p),R(e,s)},H=async(t,e)=>{let n=++b,s=!e&&y[a.state?.g];a.scrollRestoration="manual";try{let[l,m]=await k(c(t));if(n!=b)return;let d=new DOMParser().parseFromString(m,"text/html");if(w(d)==null||w(d)!=w(r)||C(d)!=C(r))throw 0;if(e){let o=new URL(l);o.hash=t.hash,a.pushState({g:U()},"",o.href)}P=c(location),Y(d);let g=e&&t.hash&&r.getElementById(decodeURIComponent(t.hash.slice(1)));if(g)g.scrollIntoView({behavior:"instant"});else i.scrollTo({left:s?.[0]||0,top:s?.[1]||0,behavior:"instant"});if(e)N(g||r.querySelector("h1")||r.querySelector("main")||r.body);p.textContent=r.title,_(!1)}catch{if(n!=b)return;if(e)location.assign(t.href);else location.reload()}};h(r,"click",(t)=>{if(t.defaultPrevented||t.button||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let e=M(t);if(e&&r.dispatchEvent(new CustomEvent("gemi:before-navigate",{cancelable:!0,detail:{url:e.href}})))t.preventDefault(),E(),y[a.state.g]=[i.scrollX,i.scrollY],H(e,1)});h(i,"popstate",()=>{if(b++,c(location)==P){let t=y[a.state?.g];if(t)i.scrollTo({left:t[0],top:t[1],behavior:"instant"})}else if(a.state?.g)H(new URL(location.href),0);else location.reload()});h(i,"hashchange",E);h(i,"scroll",()=>a.state?.g&&(y[a.state.g]=[i.scrollX,i.scrollY]),{passive:!0});var S,x=(t)=>{if(r.querySelector(O)?.dataset.prefetch=="none"||navigator.connection?.saveData)return;let e=M(t);if(e&&c(e)!=c(location))k(c(e))};h(r,"pointerover",(t)=>{clearTimeout(S),S=setTimeout(()=>x(t),65)});h(r,"pointerout",()=>clearTimeout(S));h(r,"focusin",x);h(r,"touchstart",x,{passive:!0});E();R(r,D(r));_(!0);';import{createHash as YO}from"crypto";import{existsSync as DG,readFileSync as jO}from"fs";import{join as DY}from"path";var OG=".script",zO=[".ts",".js"],XO="document-scripts.json",LG="data-gemi-script",QO=/^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$/;function GO($){if(typeof $!=="string"||!QO.test($))throw Error(`A static view's \`script\` is a path under app/views without the ".script.ts" suffix, e.g. "site/clicks". Got ${JSON.stringify($)}.`)}function KO($,Z){for(let J of zO){let W=DY($,"views",`${Z}${OG}${J}`);if(DG(W))return W}return null}async function UG($){let Z=await Bun.build({entrypoints:[$],target:"browser",format:"iife",minify:!0,throw:!1});if(!Z.success||!Z.outputs[0]){let W=Z.logs.map((Y)=>String(Y)).join(`
|
|
22
22
|
`);throw Error(`The document script ${$} does not bundle.
|
|
23
|
-
${W}`)}let J=(await Z.outputs[0].text()).trim();if(/<\/script|<!--/i.test(J))throw Error(`The document script ${$} contains "</script" or "<!--", which would end the inline <script> it is put in. Write it "<\\/script" or build the string from parts.`);return J}function BO($){return`'sha256-${YO("sha256").update($).digest("base64")}'`}var FY,VY=new Map;function FO(){if(FY===void 0){let $=DY(UY(),"dist","server",XO);FY=DG($)?JSON.parse(jO($,"utf8")):null}return FY??null}async function OY($){GO($);let Z=Bun.env.NODE_ENV==="production";if(Z){let j=FO()?.[$];if(j!==void 0)return j;let z=VY.get($);if(z)return z}let J=DY(UY(),"app"),W=KO(J,$);if(!W)throw Error(`The document script "${$}" was not found. It is a file at app/views/${$}${OG}.ts (or .js).`);if(!Z)return UG(W);let Y=UG(W);return VY.set($,Y),Y.catch(()=>VY.delete($)),Y}async function LI($){return BO(await OY($))}var VO="gemi-islands",UO="gemi-island-i18n",xI=`'sha256-${MG("sha256").update(HY).digest("base64")}'`;function LY($,Z,J,W){if(!J)return $;let Y=W?$.lastIndexOf(Z):$.indexOf(Z);return Y===-1?$+J:$.slice(0,Y)+J+$.slice(Y)}var MY=($)=>$.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<"),CI=`'sha256-${MG("sha256").update(BY).digest("base64")}'`,DO='await import("/refresh.js").catch(()=>{});await import("/@vite/client").catch(()=>{});',OO="gemi-static";function HG($,Z,J,W,Y,j){let z=new Set,X=[];if(J)X=Z.islands.map((U)=>{let O=U.module?J(U.module):void 0;if(!O)return console.error(`[gemi] island ${U.module??"(unknown module)"}: no client build entry. Declare it as island(() => import("./Component")) so gemi's Vite plugin builds it.`),null;if(U.load==="eager"){for(let L of O.preload)z.add(L);if(U.preloadDynamic)for(let L of O.dynamicPreload??[])z.add(L)}return{s:O.src,e:U.export,l:U.load}});let Q=X.some((U)=>U!==null),G=j?`<script type="module" ${LG}="${MY(j.name)}">${j.source}</script>`:"";if(!Q&&!Y)return LY($,"</head>",G,!1);let F=(Y?`<meta name="${OO}" content="${MY(Y.identity)}"${Y.prefetch==="none"?' data-prefetch="none"':""}/>`:"")+[...z].map((U)=>`<link rel="modulepreload" href="${MY(U)}"/>`).join("")+G,K=Y?BY:HY,V=Q?KG(Z):void 0,D=(Q?`<script type="application/json" id="${VO}">${r0({i:X})}</script>`:"")+(V?`<script type="application/json" id="${UO}">${r0(V)}</script>`:"")+`<script type="module">${W?DO+K:K}</script>`;return LY(LY($,"</head>",F,!1),"</body>",D,!0)}function LO($,Z){let J=/<(\/?)template\b[^>]*>/gi;J.lastIndex=Z;let W=0;for(let Y=J.exec($);Y;Y=J.exec($))if(W+=Y[1]?-1:1,W===0)return J.lastIndex;return-1}function TG($){let Z=`<template ${FG}="`;for(let J=$.lastIndexOf(Z);J!==-1;J=$.lastIndexOf(Z)){let W=LO($,J);if(W===-1)break;let Y=J+Z.length,j=$.slice(Y,$.indexOf('"',Y)),z=$.indexOf(">",Y)+1,X=$.slice(z,W-11);$=$.slice(0,J)+$.slice(W);let Q=`<${n3} ${BG}="${j}" style="display:contents"></${n3}>`;$=$.split(Q).join(`<${n3} style="display:contents">${X}</${n3}>`)}return $}function TY($){if(!$)return{locale:!0,session:!0,csrf:!0};return{locale:!1,session:$.session===!0,csrf:$.csrf===!0}}function _G($,Z){if($.getSetCookie().length>0){if(Z.cacheControl&&Bun.env.NODE_ENV!=="production")console.warn(`[gemi] A static view with cacheControl "${Z.cacheControl}" set a cookie, so it was sent "private, no-store" instead. Static pages are cacheable only when nothing on them sets a cookie.`);$.set("Cache-Control","private, no-store");return}if(Z.cacheControl&&!$.has("Cache-Control"))$.set("Cache-Control",Z.cacheControl)}function MO($){let Z=$.headers.get("Cache-Control")?.toLowerCase()??"";return/(^|[\s,])(public|s-maxage)\b/.test(Z)}var PG=new Set,HO=new Set(["public","private","s-maxage","proxy-revalidate"]);function PY($,Z){let J=$.get("Cache-Control");if(!J||$.getSetCookie().length===0)return;if(!/(^|[\s,])(public|s-maxage)\b/i.test(J))return;let Y=["private",...J.split(",").map((j)=>j.trim()).filter((j)=>{let z=j.split("=")[0].trim().toLowerCase();return z!==""&&!HO.has(z)})].join(", ");if(Bun.env.NODE_ENV!=="production"&&!PG.has(Z)){PG.add(Z);let j=[...new Set($.getSetCookie().map((z)=>z.split("=")[0]))];console.warn(`[gemi] The view "${Z??""}" sets cookies (${j.join(", ")}) on a response with Cache-Control "${J}", so it was sent "${Y}" instead: a shared cache would hand those cookies to every visitor. To let a CDN cache the page, make it a static view with .static({ cacheControl }).`)}$.set("Cache-Control",Y)}var NG=new Set;function IG($,Z){if(!MO($)||$.headers.getSetCookie().length===0)return $;if(Bun.env.NODE_ENV!=="production"&&!NG.has(Z))NG.add(Z),console.warn(`[gemi] The file route "${Z??""}" set a cookie on a response with Cache-Control "${$.headers.get("Cache-Control")}", so the cookie was not sent: a shared cache would hand it to every visitor. Make the response private, or set the cookie elsewhere.`);try{return $.headers.delete("Set-Cookie"),$}catch{let J=new Headers($.headers);return J.delete("Set-Cookie"),new Response($.body,{status:$.status,statusText:$.statusText,headers:J})}}var TO=async()=>(await import("./chunk-brcn3h9b.js")).default,NY,o3=async(...$)=>{return NY??=import("react-dom/server.browser").catch((Z)=>{throw NY=void 0,Z}),(await NY).renderToReadableStream(...$)},CG=1e4,AG="no-locale",PO="no-theme";async function NO($,Z,J){let W=`${J==="italic"?"italic,":""}wght@${J==="italic"?"1,":""}${Z}`,z=(await(await fetch(`https://fonts.googleapis.com/css2?family=${$}:${W}&display=swap`,{headers:{"User-Agent":"Mozilla/5.0 Firefox/1.0"}})).text()).match(/url\(([^)]+)\)/)?.[1];return await fetch(z).then((X)=>X.arrayBuffer())}var AY="/assets";function _O($){return $===AY||$.startsWith(`${AY}/`)}function IO($){let Z=$.filter(_O);if(Z.length>0){let J=Z.length>1;throw Error(`View route path${J?"s":""} ${Z.map((W)=>`"${W}"`).join(", ")} use${J?"":"s"} the reserved "${AY}" prefix. The client build output is served from there before the router runs, so the route would never match. Mount it somewhere else, or set \`assetRoutes: true\` on these views' config (route.view or a route.domains group's view).`)}}function xO($){let Z=M(Q1).resolver;return{...$.domain,root:Z.root,origin:Z.publicOrigin($.rawRequest)}}function _Y($){let{status:Z=400,error:J,body:W,...Y}=$;return new Response(W??J?.message,{...Y,status:Z})}function CO($){let{status:Z=400,data:J,directive:W,headers:Y}=$;return new Response(JSON.stringify({data:J,directive:W}),{headers:Y,status:Z})}class a3{static token="router.view";flatViewRoutes={};routeManifest={};clientRouteManifest={};componentTree=[];flatComponentTree=[];requiredViews={};staticRoutes=[];root=null;shellReporter=zG();preloadCache=new WeakMap;hooks;partialRendering;localeRouting;detectLocale;theme;defaultMeta;notFound;publicFiles;assetRoutes;translate;constructor($,Z={}){let J=EQ();if(this.partialRendering=$.partialRendering??J.partialRendering,this.localeRouting=$.localeRouting??J.localeRouting,this.detectLocale=$.detectLocale,this.detectLocale&&this.localeRouting!=="off")throw Error('`view.detectLocale` needs `view.localeRouting: "off"`: on locale-routed views the URL, the `i18n-locale` cookie and `Accept-Language` decide the locale. A `route.domains` group that inherits it and keeps locale routing can set `detectLocale: undefined`.');this.theme=$.theme??J.theme,this.defaultMeta=$.meta,this.notFound=$.notFound,this.publicFiles=$.publicFiles??J.publicFiles,this.assetRoutes=$.assetRoutes??J.assetRoutes,this.translate=$.translate,this.hooks={onNotFound:$.onNotFound??J.onNotFound,onRequestStart:$.onRequestStart??J.onRequestStart,onRequestEnd:$.onRequestEnd??J.onRequestEnd,onRequestFail:$.onRequestFail??J.onRequestFail,onStreamComplete:$.onStreamComplete??J.onStreamComplete};let W={"/":$.rootRouter,"/auth":PQ(Z)};if(this.requiredViews=Object.fromEntries(HQ(Z).map(({view:Y,requiredBy:j})=>[Y,j])),this.flatViewRoutes=l4(W),!this.assetRoutes)IO(Object.keys(this.flatViewRoutes));this.routeManifest=s4(W),this.clientRouteManifest=Object.fromEntries(Object.entries(this.routeManifest).filter(([,Y])=>Y.at(-1)!=="FILE")),this.componentTree=o4(W),this.flatComponentTree=QY(this.componentTree),this.staticRoutes=Object.entries(this.flatViewRoutes).filter(([,Y])=>Y.static).map(([Y])=>Y);for(let Y of this.staticRoutes){let j=this.flatViewRoutes[Y].static?.layout;if(j&&!this.flatComponentTree.includes(j))this.flatComponentTree.push(j)}if(this.notFound){for(let Y of[this.notFound.view,this.notFound.static?.layout])if(Y&&!this.flatComponentTree.includes(Y))this.flatComponentTree.push(Y)}this.root=$.root}async passesFeatureGates($){let Z=M(Y$);for(let J of $)if(!await Z.enabled(J))return!1;return!0}async onRequestEnd($,Z={}){if(Z.mintSession!==!1)r4();return await this.hooks.onRequestEnd($)}completeStream($,Z){let J=(W)=>{ZZ.error(W?.message??'Error in "onStreamComplete" event handler',{err:JSON.stringify(W)})};try{Promise.resolve(this.hooks.onStreamComplete($,Z)).catch(J)}catch(W){J(W)}}modulePreloadLinks($){let{clientEntry:Z,modulePreloadManifest:J,views:W,routeKey:Y}=$,j=()=>{let Q=new Set(Z?.preload??[]);for(let G of W)for(let B of J?.[G]??[])Q.add(B);return[...Q].map((G)=>u1("link",{key:`modulepreload:${G}`,rel:"modulepreload",href:G}))};if(!J)return j();let z=this.preloadCache.get(J);if(!z||z.clientEntry!==Z)z={clientEntry:Z,byRoute:new Map},this.preloadCache.set(J,z);let X=z.byRoute.get(Y);if(!X)X=j(),z.byRoute.set(Y,X);return X}async renderStatic($){let{req:Z,runInRequestScope:J,staticView:W,currentViews:Y,data:j,serverQueries:z,headers:X}=$,Q;if(W.layout){if(Q=$.viewImportMap[W.layout],!Q)throw Error(`The static layout "${W.layout}" was not found. It is a view path: a file at app/views/${W.layout}.tsx whose default export renders the document.`)}let G=await $.getStyles(Y,{static:!0,layout:W.layout});z.markRenderStart();let B=CY(),F=new AbortController,K=setTimeout(()=>F.abort(),CG),V=(U)=>{if(Bun.env.NODE_ENV!=="production")console.error(U)},D=GG(async(U,O)=>{let L=await o3(U,{signal:F.signal,identifierPrefix:O,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:V});return await L.allReady.catch(()=>{}),await new Response(L).text()},{currentLocale:j?.i18n?.currentLocale,defaultLocale:j?.i18n?.defaultLocale,timeZone:j?.i18n?.timeZone});try{let U,O=typeof W.script==="function"?await J(()=>W.script(Z)):W.script;if(O)U={name:O,source:await OY(O)};let L;if(W.navigation){let I=W.navigation===!0?{}:W.navigation,E=I.version?String(await J(()=>I.version(Z))):"";L={identity:[W.layout??"",$.buildId??"",U?.name??"",E].join("|"),prefetch:I.prefetch==="none"?"none":"intent"}}let P=await o3(u1(VG.Provider,{value:D,children:u1(xG,{children:[...G,u1(this.root,{data:j,viewImportMap:$.viewImportMap,viewModules:$.viewModules,serverQueries:z,dictionarySink:B,rootLayout:Q,key:"root"})]})}),{signal:F.signal,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:V});await P.allReady.catch(()=>{});let H=TG(await new Response(P).text());return new Response(HG(H,D,$.resolveIsland,Bun.env.NODE_ENV!=="production",L,U),{status:$.status,headers:X})}finally{clearTimeout(K),J(()=>this.completeStream(Z,z.summarize(F.signal.aborted)))}}async render($){let{req:Z,runInRequestScope:J,csrfTokenHMAC:W,currentPathName:Y,headers:j,i18n:z,params:X,pathname:Q,serverQueries:G,userAgent:B,noStream:F,noTheme:K,url:V,user:D,viewData:U,breadcrumbs:O,urlLocaleSegment:L,meta:P,isOgRequest:H,appId:I,features:E,staticView:S}=$,R=this.theme===!1||K||S?null:{cookie:this.theme.cookie??lW,default:this.theme.default??null,value:AO(Z,this.theme.cookie??lW)},k=L?YG(Q,[L]).pathname:Q,N={kind:"view",data:{meta:P,pageData:{[k]:U},__csrf:W.toString("base64"),prefetchedData:{},i18n:z,auth:{user:D},routeManifest:this.clientRouteManifest,breadcrumbs:O,router:{urlLocaleSegment:L,pathname:Y,params:X,currentPath:Q,searchParams:V.search,is404:!Y?!0:!1,domain:Z.domain?xO(Z):null},appId:I,features:E,theme:R,componentTree:[["404",[]],...this.componentTree],...this.staticRoutes.length>0?{staticRoutes:this.staticRoutes}:{}},head:{}},v=this.root,_=this.routeManifest[Y];return async(f)=>{let{bootstrapModules:H0=[],loaders:Z3,getStyles:i1,viewImportMap:C1,cssManifest:i,ogMap:y,viewModules:r,clientEntry:A1,modulePreloadManifest:J3,assetBase:jZ,resolveIsland:o0,buildId:G1}=f,x$=A1?[]:H0,s1=(p)=>[p,`window.loaders=${Z3}`,...A1?[`import(${JSON.stringify(A1.module)}).catch(function(e){setTimeout(function(){throw e})})`]:[]].join(";");if(H){let p=null,u0=null;for(let A of _??[])if(typeof y[A]==="function")u0=A,p=y[A];if(!p)return new Response("Not found",{status:404});let W3=Object.values(N.data.pageData)[0];try{await o3(u1(p,W3[u0]),{onError:()=>{}})}catch(A){let{fonts:e,...a1}=A.satoriOptions,e3=await Promise.all(e.map(($6)=>{return NO($6.name,$6.weight,$6.style).then((qK)=>({...$6,data:qK}))})),Y5=new Headers(j);Y5.set("Content-Type","image/png");let[RK,fK]=await Promise.all([TO(),d4("Rendering an OG image")]),kK=await RK(A.jsx,{...a1,fonts:e3}),wK=await fK(Buffer.from(kK)).png({compressionLevel:0,effort:10}).toBuffer();return new Response(new Uint8Array(wK),{headers:Y5})}return new Response("data")}if(S&&Y)return await this.renderStatic({req:Z,runInRequestScope:J,staticView:S,currentViews:_,data:N.data,serverQueries:G,headers:j,getStyles:i1,viewImportMap:C1,viewModules:r,resolveIsland:o0,buildId:G1,status:200});if(S&&!Y&&this.notFound){let p=this.notFound.view;if(!C1[p])throw Error(`The not-found view "${p}" (route.view.notFound) was not found. It is a view path: a file at app/views/${p}.tsx.`);return await this.renderStatic({req:Z,runInRequestScope:J,staticView:S,currentViews:[p],data:N.data,serverQueries:G,headers:j,getStyles:i1,viewImportMap:{...C1,"404":C1[p]},viewModules:r&&{...r,"404":r[p]},resolveIsland:o0,buildId:G1,status:$.refusedStatus??404})}if(N.data.cssManifest=i,N.data.modulePreloadManifest=J3??{},jZ&&jZ!=="/")N.data.assetBase=jZ;if(G1&&G1!=="dev")N.data.buildId=G1;let t=this.modulePreloadLinks({clientEntry:A1,modulePreloadManifest:J3,views:_??["404"],routeKey:Y??"404"}),U8=await i1(_??["404"]);N.data.prefetchedData=G.snapshotResolved(),G.markRenderStart();let C$=new AbortController,n1=setTimeout(()=>C$.abort(),CG),o1=P6(B)||F,zZ=Bun.env.NODE_ENV!=="production"&&!o1&&Y&&this.shellReporter.shouldObserve(Y)?XG():null,A$=CY();try{let p=await o3(u1(xG,{children:[...t,...U8,...R?[u1("script",{key:"theme-script",dangerouslySetInnerHTML:{__html:kQ(r0({cookie:R.cookie,default:R.default}))}})]:[],u1(v,{data:N.data,viewImportMap:C1,viewModules:r,serverQueries:G,dictionarySink:A$,key:"root"})]}),{bootstrapScriptContent:s1(`window.__GEMI_DATA__ = ${r0(N.data)}`),bootstrapModules:x$,signal:C$.signal,...o1?{progressiveChunkSize:Number.MAX_SAFE_INTEGER}:{},onError(u0){if(Bun.env.NODE_ENV!=="production")console.error(u0)}});if(p.allReady.catch(()=>{}).finally(()=>clearTimeout(n1)),o1)await p.allReady.catch(()=>{});return new Response(a8(p,G,{onShell:o1?void 0:()=>G.markShell(),onChunk:zZ?.onChunk,onClose:()=>J(()=>{if(this.completeStream(Z,G.summarize(C$.signal.aborted)),zZ)this.shellReporter.report(Y,zZ.measure())})},A$),{status:!Y?$.refusedStatus??404:200,headers:j})}catch(p){if(clearTimeout(n1),Bun.env.NODE_ENV==="production")throw J(()=>this.completeStream(Z,G.summarize(C$.signal.aborted))),p;let u0=await o3(u1("div"),{bootstrapScriptContent:s1(`window.error= ${r0(p.message)}; window.stack_trace=${r0(p.stack)};window.__GEMI_DATA__ = ${r0(N.data)}`),bootstrapModules:Bun.env.NODE_ENV==="development"?["/render-error.js",...x$]:x$});return new Response(a8(u0,G,{onClose:()=>J(()=>this.completeStream(Z,G.summarize(C$.signal.aborted)))}),{status:!Y?$.refusedStatus??404:200,headers:j})}}}viewRefusalStatus($,Z,J){if(E$(Z))return 404;if(Z?.kind===$$){let W=Z.payload?.view?.status;return W===403||W===404?W:null}if(Z$(Z)){if(!J.has(Z))this.hooks.onRequestFail($,Z);return console.error(Z),403}if(Z instanceof d1&&(Z.status===403||Z.status===404))return Z.status;return null}async handleViewRequest($,Z){let J=new URL($.url),W=J.pathname.endsWith(".json"),Y=J.pathname.endsWith(".og"),j=J.pathname.replace(".json","").replace(".og",""),[,z,...X]=j.split("/"),Q=j,G=null,B=null,F=M(c),K=i3(this.flatViewRoutes,j),V=F.isLocaleAware&&this.localeRouting==="prefix"&&!K?.route.middleware.includes(AG);if(V&&F.supportedLocales.includes(z))Q=`/${X.join("/")}`,G=z,B=z;if(($.method==="GET"||$.method==="HEAD")&&!W&&!Y&&K===null&&J.pathname.endsWith("/")&&!J.pathname.startsWith("//")){let _=J.pathname.replace(/\/+$/,""),f=V&&F.supportedLocales.includes(_.slice(1));if(_&&!f)return new Response("",{status:301,headers:{Location:`${_}${J.search}`}})}if(V&&!Y&&B===null&&!(B===null&&K!==null)){let _=IY(z,F.supportedLocales,F.defaultLocale);if(_){let f=X.length?`/${X.join("/")}`:"";return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${_}${f}${W?".json":""}${J.search}`}})}}if(V&&!Y){let _=M(c).detectLocale(new C($,{},"view",Q));if(B===null&&_!==F.defaultLocale){let f=J.pathname==="/"?"":J.pathname;return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${_}${f}${J.search}`}})}}Q=Q.replace("//","/");let U=[],O=[],L=null,P={},H=null,I=!1,E=!1,S=[],R,k=!1,N=!1;try{let _=i3(this.flatViewRoutes,Q);if(B&&_?.route.middleware.includes(AG))_=null;if(_){if(k=!0,L=_.routePath,P=_.params,U=_.route.exec,O=_.route.middleware,S=_.route.features,I=O.includes("no-stream"),E=O.includes(PO),R=_.route.static,N=_.route.segments.at(-1)?.viewPath==="FILE",W&&this.partialRendering){let f=$.headers.get(XY),H0=WG({flatViewRoutes:this.flatViewRoutes,supportedLocales:M(c).supportedLocales,from:f,origin:J.origin,to:{segments:_.route.segments,params:P,search:J.search}});if(H0.startIndex>0)U=U.slice(H0.startIndex),H={from:f,carriedViews:H0.carriedViews}}}}catch(_){throw _}if(R&&W)return new Response("Not found",{status:404});let v=new C($,P,"view",L);return this.hooks.onRequestStart(v),await T.run(v,async()=>{let _=null,f=T.getStore(),H0=rZ.getStore(),Z3=(y)=>rZ.run(H0,()=>T.runWith(f,y));f.serverQueries=new oZ(s3($));let i1=new Set;f.serverQueries.onQueryFail((y)=>{i1.add(y.error);try{Z3(()=>Promise.resolve(this.hooks.onRequestFail(i,y.error)).catch(()=>{}))}catch{}});let C1=TY(N?{}:R??(L===null&&!W?this.notFound?.static:void 0));if(B){let y=B.replaceAll("/","");I$.setLocale(y,{cookie:C1.locale})}else if(F.isLocaleAware&&!V)f.setLocale(F.defaultLocale);else I$.setLocale(void 0,{cookie:C1.locale});let i=f.req;if(C1.session)r4();try{let y=null;if(this.detectLocale&&!V&&M(c).isLocaleAware){let{supportedLocales:A,defaultLocale:e}=M(c),a1=await this.detectLocale(i,{supportedLocales:A,defaultLocale:e}),e3=typeof a1==="string"?IY(a1,A,e):null;if(e3)f.setLocale(e3)}try{await M(e1).runMiddleware(O)}catch(A){if(y=this.viewRefusalStatus(i,A,i1),y===null)throw A}if(y!==null||S.length>0&&!await this.passesFeatureGates(S))L=null,U=[],i.routePath="";let r=M(c),A1=r.isEnabled,J3=r.isLocaleAware,jZ=new C($,i.params),o0={defaultLocale:r.defaultLocale,timeZone:r.detectTimeZone(jZ)};if(J3){let A=null;if(B)A=B.replaceAll("/",""),f.setLocale(A);else if(!V)A=f.locale??r.defaultLocale;else A=r.detectLocale(jZ),f.setLocale(A);let e=A1?r.getPageTranslations(A,i.routePath):{};o0={...o0,supportedLocales:r.supportedLocales,currentLocale:A,dictionary:{[A]:e},defaultLocale:r.defaultLocale,...V?{}:{localeRouting:"off"}}}await xY(o0.currentLocale??"");let G1;try{G1=await Promise.all(U.map((A)=>A(i)))}catch(A){if(y=this.viewRefusalStatus(i,A,i1),y===null)throw A;L=null,U=[],i.routePath="",G1=[]}let x$=void 0;if(L===null){if(x$=await this.hooks.onNotFound(i,{status:y??404}),J3&&!V&&f.locale&&f.locale!==o0.currentLocale){let A=f.locale;o0={...o0,currentLocale:A,dictionary:{[A]:A1?r.getPageTranslations(A,i.routePath):{}}},await xY(A)}}if(this.defaultMeta&&!f.metadata.hasAllDefaultFields)f.metadata.applyDefaults(typeof this.defaultMeta==="function"?await this.defaultMeta(i):this.defaultMeta);if(this.translate!==void 0)f.metadata.applyTranslateDefault(this.translate);let{cookies:s1,headers:t}=f;if(y!==null)t.set("Cache-Control","no-store");_={data:G1,cookies:s1,headers:t,user:f.user,prefetchedData:f.serverQueries.snapshotResolved(),currentPathName:L,params:i.params,urlLocaleSegment:G,meta:f.renderMeta(),appId:M(GY).id,features:await M(Y$).forClient()};let{params:U8,user:C$}=_,n1={},o1={};for(let A of G1??[]){let[e,a1]=Object.entries(A)?.[0]??[];if(!e||!a1)continue;o1[`${e}:${L}`]=a1.breadcrumb,n1[e]=a1}let zZ=L===null&&this.notFound&&!W?this.notFound.static:void 0;if(zZ&&x$)n1["404"]=x$;let A$=n1.FILE;if(A$){try{await this.onRequestEnd(i,{mintSession:!1})}catch(e){ZZ.error(e?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(e)})}let A;if(A$ instanceof Response)A=e4(A$,t,s1);else{for(let e of s1)t.append("Set-Cookie",e.toString());A=await A8(A$,t)}return IG(A,L)}if(W){t.set("Content-Type","application/x-ndjson; charset=utf-8"),t.append("Vary",XY),s1.forEach((e)=>t.append("Set-Cookie",e.toString())),PY(t,L),await this.hooks.onRequestEnd(i);let A={meta:H&&!f.metadata.touched?null:_.meta,data:{[Q]:n1},breadcrumbs:o1,prefetchedData:f.serverQueries.snapshotResolved(),i18n:o0,features:_.features,is404:!L,appId:_.appId,partial:H};return new Response(QG(A,f.serverQueries,void 0,({aborted:e})=>Z3(()=>this.completeStream(i,f.serverQueries.summarize(e)))),{headers:t})}t.set("Content-Type","text/html; charset=utf-8");let p=L?R:zZ,u0=Boolean(p),W3=TY(p);if(!I&&!u0)t.append("Vary","User-Agent");if(!u0||W3.session)r4();for(let A of s1)t.append("Set-Cookie",A.toString());if(!u0||W3.csrf){let A=Bun.CSRF.generate(process.env.SECRET);t.append("Set-Cookie",`csrf_token=${A}; HttpOnly; Secure; SameSite=Strict; Expires=${new Date(Date.now()+86400000).toUTCString()}`)}try{await this.onRequestEnd(i,{mintSession:!u0||W3.session})}catch(A){ZZ.error(A?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(A)})}if(u0&&(L||!k))_G(t,p);return PY(t,L),await this.render({req:i,runInRequestScope:Z3,csrfTokenHMAC:Buffer.from(""),currentPathName:L,headers:t,i18n:o0,params:U8,pathname:J.pathname,serverQueries:f.serverQueries,userAgent:$.headers.get("user-agent"),noStream:I,noTheme:E,url:J,user:C$,viewData:n1,breadcrumbs:o1,urlLocaleSegment:G,meta:_.meta,appId:_.appId,features:_.features,isOgRequest:Y,staticView:p,refusedStatus:y??void 0})}catch(y){if(y.kind===$$){let r=W?CO(y.payload.viewData??y.payload.api):_Y(y.payload.view);for(let A1 of f.cookies)r.headers.append("Set-Cookie",A1.toString());return r}if(!i1.has(y))this.hooks.onRequestFail(i,y);if(Z$(y))return console.error(y),W?aZ():_Y(KY());if(y instanceof d1&&y.status===403)return W?aZ():_Y(KY());throw y}},Z)}}function AO($,Z){let J=$.cookies?.get(Z);return fQ(J)?J:null}function SY(){let $=JSON.stringify({error:J$("not_found","Not found",404)});return new Response($,{status:404,headers:{"Content-Type":"application/json","Content-Length":String(Buffer.byteLength($)),"Cache-Control":"no-store"}})}class RG extends C0{routes={"/api-routes":this.get(()=>{let $=M($8).flatRoutes,Z=[];for(let[J,W]of Object.entries($))for(let[Y,j]of Object.entries(W)){let{exec:z,middleware:X}=j;Z.push({path:J,method:Y,middleware:X})}return Z}),"/view-routes":this.get(()=>{let $=M(a3).flatViewRoutes,Z=[];for(let[J,{middleware:W,viewPath:Y}]of Object.entries($))Z.push({path:J,method:"GET",viewPath:Y,middleware:W});return Z})}}var SO=new Set([t1,"cookie","content-type","content-length","transfer-encoding","connection","host","user-agent","forwarded"]),EO=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,bO=/^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*$/;function RO($,Z,J,W){for(let[Y,j]of Object.entries(J.headers??{})){if(j===void 0||j===null)continue;let z=Y.toLowerCase();if(SO.has(z)||z.startsWith("x-forwarded-"))throw Error(`dispatchAs: credentials may not set the "${Y}" header. The access token stays the initiator's, and the request's framing is dispatchAs's own.`);if(W&&z==="authorization")throw Error(`dispatchAs: credentials may not set "Authorization" on a call dispatched as an identity. The caller's token is for the MCP endpoint and is never passed on.`);$.set(Y,j)}for(let[Y,j]of Object.entries(J.cookies??{})){if(j===void 0||j===null)continue;if(Y===t1)throw Error(`dispatchAs: credentials may not set the "${t1}" cookie. The access token stays the initiator's.`);if(!EO.test(Y)||!bO.test(j))throw Error(`dispatchAs: "${Y}" is not a cookie a Cookie header can carry.`);Z.push(`${Y}=${j}`)}}function fO($,Z){let J=$.body.getReader(),W=!1,Y=()=>{if(W)return;W=!0;try{Z()}catch(z){console.error(z)}},j=new ReadableStream({async pull(z){let X;try{X=await J.read()}catch(Q){Y(),z.error(Q);return}if(X.done){Y();try{z.close()}catch{}return}try{z.enqueue(X.value)}catch{}},async cancel(z){try{await J.cancel(z)}finally{Y()}}},{highWaterMark:0});return new Response(j,{status:$.status,statusText:$.statusText,headers:$.headers})}function SG($){let{status:Z=400,data:J,headers:W}=$,Y=new Headers({"Content-Type":"application/json",...W});if(!Y.has("Cache-Control"))Y.set("Cache-Control","no-store");return new Response(JSON.stringify(J),{status:Z,headers:Y})}function e4($,Z,J){let W=[];Z?.forEach((z,X)=>W.push([X,z]));let Y=[...typeof Z?.getSetCookie==="function"?Z.getSetCookie():[],...Array.from(J??[])];if(W.length===0&&Y.length===0)return $;let j=(z)=>{for(let[X,Q]of W){if(X.toLowerCase()==="set-cookie")continue;if(!z.has(X))z.set(X,Q)}for(let X of Y)z.append("Set-Cookie",X)};try{return j($.headers),$}catch{let z=new Headers($.headers);return j(z),new Response($.body,{status:$.status,statusText:$.statusText,headers:z})}}function kO(){return Bun.env.NODE_ENV==="development"}class $8{static token="router.api";flatRoutes={};onRequestStart;onRequestEnd;onRequestFail;constructor($){let Z=SQ();this.onRequestStart=$.onRequestStart??Z.onRequestStart,this.onRequestEnd=$.onRequestEnd??Z.onRequestEnd,this.onRequestFail=$.onRequestFail??Z.onRequestFail,this.flatRoutes=cW({"/":$.rootRouter,"/auth":yW,"/__gemi__/services/i18n":vW,"/__gemi__/services/image":hW,...kO()?{"/__gemi__/services/logs":pW,"/__gemi__/debug":RG}:{}})}getRouteHandlerAndParams($){let Z=new URL($.url),J=bG(Z.pathname),W={},Y;for(let[j]of Object.entries(this.flatRoutes))try{let z=new URLPattern({pathname:j});if(z.test({pathname:J})){Y=j,W=z.exec({pathname:J})?.pathname.groups;break}}catch(z){console.error(z)}return{params:W,path:Y}}async runRouteMiddleware($,Z){let W=this.flatRoutes[$][Z.rawRequest.method].middleware;try{await M(e1).runMiddleware(W)}catch(Y){if(Y.kind===$$)return SG(Y.payload.api);else{if(E$(Y))return SY();if(this.onRequestFail(Z,Y),console.error(Y),Z$(Y))return aZ();throw Y}}}async getRouteData($){let Z=this.flatRoutes[$],J=T.getStore(),W=Z[J.req.rawRequest.method].exec??(()=>Promise.resolve({})),Y={};try{Y=await W()}catch(j){if(j.kind===$$)return SG(j.payload.api);if(E$(j))return SY();if(this.onRequestFail(J.req,j),console.error(j),Z$(j))return aZ();throw j}return Y}isFrameworkRoute($){return $.startsWith("/__gemi__")}async endRequest($,Z,J){let W=async()=>{try{if(!this.isFrameworkRoute(J))await this.onRequestEnd(Z)}catch(Y){ZZ.error(Y?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(Y)})}finally{$.destroy()}};if(!$.hasPendingWork()){await W();return}$.whenIdle().then(W).catch((Y)=>{console.error(Y)})}isOpenEndedBody($,Z){return $.method!=="HEAD"&&!Z.headers.has("Content-Length")&&Z.body!==null}async handleApiRequest($,Z){let{params:J,path:W}=this.getRouteHandlerAndParams($),Y=this.flatRoutes[W];if(!Y||!Y[$.method])return new Response(JSON.stringify({error:J$("not_found","Not found",404)}),{status:404});let j=new C($,J,"api",W);if(!this.isFrameworkRoute(W))this.onRequestStart(j);return await T.run(j,async()=>{let z=T.getStore(),X=!1,Q=async()=>{X=!0,await this.endRequest(z,j,W)};try{let G=M(c);if(G.isEnabled){let U=G.detectLocale(j);z.setLocale(U)}z.setRequest(j),M(e1).applyDefaultBodyLimit($);let B=await this.runRouteMiddleware(W,j);if(B instanceof Response){let U=e4(B,z.headers,z.cookies);return await Q(),U}let F=await this.getRouteData(W),K=z.headers,V=z.cookies;if(F instanceof Response){let U=e4(F,K,V);if(this.isOpenEndedBody($,U)){let O=fO(U,()=>this.endRequest(z,j,W));return X=!0,O}return await Q(),U}let D=(r1(F)?F:K1.json(F)).toResponse(K,V);return await Q(),D}catch(G){if(!X)try{await Q()}catch(B){console.error(B)}throw G}},Z)}async dispatchAs($,Z,J,W,Y){let j=new URL($.rawRequest.url).origin,z=new URL(`${j}/api${J}`),X=`/api${J.split(/[?#]/)[0]}`;if(!J.startsWith("/")||z.origin!==j||z.pathname!==X||z.hash!==""||z.pathname.startsWith("/api/__gemi__")||z.pathname==="/api/auth"||z.pathname.startsWith("/api/auth/"))throw Error(`dispatchAs: "${J}" is not an app api path. Pass the route's own path, without "/api", with every param encoded.`);let Q=Y?.identity;if(Q!==void 0&&(typeof Q!=="object"||!Q?.user))throw Error("dispatchAs: identity needs the user to dispatch as.");let G=new Headers,B=[],F=Q?null:$.cookies.get(t1);if(F)B.push(`${t1}=${F}`);if(Y?.credentials)RO(G,B,Y.credentials,Q!==void 0);if(B.length>0)G.set("Cookie",B.join("; "));let K=Q?null:$.headers.get(t1);if(K)G.set(t1,K);let V=$.headers.get("User-Agent");if(V)G.set("User-Agent",V);let D;if(W instanceof FormData)D=W;else if(W!==void 0)G.set("Content-Type","application/json"),D=JSON.stringify(W);let U=new Request(z,{method:Z,headers:G,body:D,...Y?.signal?{signal:Y.signal}:{}});if(EG(U,FZ($),Q?.grant,Y?.progress),$.domain)tZ(U,$.domain);let O=Q?{user:Q.user}:void 0;return T.exit(()=>X6.exit(()=>this.handleApiRequest(U,O)))}}import{timingSafeEqual as wO}from"crypto";var W8="",RY="*",qO=60000,yO=1e4,Z8=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,J8=16,EY=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,bY="x-forwarded-host";function kG($){return $.startsWith(":")}function r3($,Z){if($===null)return!1;let J=Buffer.from($,"utf8"),W=Buffer.from(Z,"utf8");return J.length===W.length&&wO(J,W)}function vO($){if(!$)return[];if($===!0)return[{header:bY,clientIpHeader:null,secret:null}];let Z=Array.isArray($)?$:[$],J=Array.isArray($)?null:bY;return Z.map((W)=>({header:W.hostHeader?.toLowerCase()??J,clientIpHeader:W.clientIpHeader?.toLowerCase()??null,secret:W.secret?{header:W.secret.header.toLowerCase(),value:W.secret.value}:null}))}function gO($){if(!$||$===!0)return;if(!Array.isArray($)){fG($,"route.domains.trustProxy",bY);return}if($.length===0)throw Error("`route.domains.trustProxy` is an empty list. List at least one proxy, or leave `trustProxy` out.");let Z=new Map;$.forEach((J,W)=>{let Y=`route.domains.trustProxy[${W}]`;if(typeof J!=="object"||J===null||Array.isArray(J))throw Error(`\`${Y}\` must be an object: { hostHeader?, clientIpHeader?, secret }. \`true\` is only accepted on its own.`);if(!J.secret)throw Error(`\`${Y}.secret\` is required: in a list, each proxy proves itself with a secret of its own.`);if(J.hostHeader===void 0&&J.clientIpHeader===void 0)throw Error(`\`${Y}\` names neither \`hostHeader\` nor \`clientIpHeader\`, so it would trust nothing.`);fG(J,Y,null);let j=Z.get(J.secret.value);if(j!==void 0)throw Error(`\`${Y}.secret.value\` is the same as \`route.domains.trustProxy[${j}].secret.value\`. Give each proxy a secret of its own.`);Z.set(J.secret.value,W)})}function fG($,Z,J){let{hostHeader:W,clientIpHeader:Y,secret:j}=$;if(W!==void 0&&(typeof W!=="string"||!EY.test(W)))throw Error(`\`${Z}.hostHeader\` must be a single header name, e.g. "x-forwarded-host". Got ${JSON.stringify(W)}.`);let z=(W??J)?.toLowerCase()??null;if(Y!==void 0){if(typeof Y!=="string"||!EY.test(Y))throw Error(`\`${Z}.clientIpHeader\` must be a single header name, e.g. "x-client-ip". Got ${JSON.stringify(Y)}.`);if(!j)throw Error(`\`${Z}.clientIpHeader\` needs \`secret\`: without proof the proxy sent it, any client that reaches the app directly picks its own address.`);if(Y.toLowerCase()===z)throw Error(`\`${Z}.clientIpHeader\` names the same header as \`hostHeader\`.`);if(typeof j.header==="string"&&Y.toLowerCase()===j.header.toLowerCase())throw Error(`\`${Z}.clientIpHeader\` names the same header as \`secret.header\`.`)}if(!j)return;if(typeof j.header!=="string"||!EY.test(j.header))throw Error(`\`${Z}.secret.header\` must be a header name. Got "${j.header}".`);if(j.header.toLowerCase()===z)throw Error(`\`${Z}.secret.header\` names the same header as \`hostHeader\`; the secret needs a header of its own.`);if(typeof j.value!=="string"||j.value.length<J8)throw Error(`\`${Z}.secret.value\` must be at least ${J8} characters. A guessable one lets any client name its own host.`)}function _1($){if(!$)return null;try{return new URL(`http://${$.trim()}`).hostname.toLowerCase().replace(/\.$/,"")||null}catch{return null}}function mO($){try{let Z=new URL(`http://${$.trim()}`),J=Z.hostname.toLowerCase().replace(/\.$/,"");return J?Z.port?`${J}:${Z.port}`:J:null}catch{return null}}function wG($){if($===void 0)return[];if($===!0)return!0;if(!Array.isArray($))throw Error(`\`route.domains.devHosts\` must be a list of hostnames (or \`true\`). Got ${JSON.stringify($)}.`);return $.map((Z,J)=>{let W=typeof Z==="string"?Z.trim().toLowerCase():"",Y=W.startsWith(".")?W.slice(1):W;if(!Y||!Y.split(".").every((j)=>Z8.test(j)))throw Error(`\`route.domains.devHosts[${J}]\` must be a bare hostname, e.g. "app.acme.test", or ".acme.test" for the domain and its subdomains \u2014 no scheme, port, path or "*". Got ${JSON.stringify(Z)}.`);return W})}function hO($){let Z=_1($.root),J=$.root?.trim().toLowerCase().replace(/\.$/,"");if(!Z||Z!==J||!Z.split(".").every((j)=>Z8.test(j)))throw Error(`\`route.domains.root\` must be a bare hostname, e.g. "example.com" \u2014 no scheme, port or path. Got "${$.root}".`);if($.custom&&($.custom.cacheTtlMs??0)<0)throw Error(`\`route.domains.custom.cacheTtlMs\` is ${$.custom.cacheTtlMs}; it cannot be negative. Use 0 to disable the cache.`);if($.ask&&$.ask.secret.length<J8)throw Error(`\`route.domains.ask.secret\` must be at least ${J8} characters. A guessable one is worse than leaving \`ask\` out.`);gO($.trustProxy),wG($.devHosts);let W=new Set,Y=null;for(let j of $.groups??[]){let{subdomain:z}=j;if(W.has(z))throw Error(`\`route.domains\` declares the subdomain "${z}" twice.`);if(W.add(z),kG(z)){if(!/^:[A-Za-z_][A-Za-z0-9_]*$/.test(z))throw Error(`"${z}" is not a valid param subdomain. It must be a single \`:name\` label.`);if(Y)throw Error(`\`route.domains\` declares two param subdomains, "${Y.subdomain}" and "${z}"; a host could match either.`);Y=j;continue}if(j.exists)throw Error(`The subdomain "${z}" is fixed, so \`exists\` has no param to check. It only applies to a \`:param\` subdomain.`);if(!z.split(".").every((X)=>Z8.test(X)))throw Error(`"${z}" is not a valid subdomain.`)}if($.custom&&!W.has($.custom.group))throw Error(`\`route.domains.custom.group\` is "${$.custom.group}", but no group declares that subdomain.`);if($.ask&&Y&&!Y.exists)throw Error(`\`route.domains.ask\` is set, so "${Y.subdomain}" needs an \`exists\` to say which tenants are real. Without one every host under the root would be approved for a certificate.`)}class fY{root;devHosts;hostTrusts;fixed=new Map;param=null;custom;cacheTtlMs;cache=new Map;inFlight=new Map;askSecret;proxySecretHeaders;constructor($){hO($),this.root=_1($.root),this.devHosts=wG($.devHosts),this.hostTrusts=vO($.trustProxy);for(let Z of $.groups??[])if(kG(Z.subdomain))this.param={...Z,name:Z.subdomain.slice(1)};else this.fixed.set(Z.subdomain.toLowerCase(),Z);this.custom=$.custom??null,this.cacheTtlMs=this.custom?.cacheTtlMs??qO,this.askSecret=$.ask?.secret??null,this.proxySecretHeaders=Array.from(new Set(this.hostTrusts.flatMap((Z)=>Z.secret?[Z.secret.header]:[])))}trustOf($){let Z=null;for(let J of this.hostTrusts)if((!J.secret||r3($.headers.get(J.secret.header),J.secret.value))&&!Z)Z=J;return Z}forwardedHost($){let Z=this.trustOf($)?.header;if(!Z)return null;return $.headers.get(Z)?.split(",")[0]?.trim()||null}trustedClientIp($){let Z=this.trustOf($);if(!Z?.clientIpHeader||!Z.secret)return null;let J=$.headers.get(Z.clientIpHeader)?.split(",")[0];return J===void 0?null:R$(J)}applyClientIp($){let Z=this.trustedClientIp($);if(!Z)return;$.headers.set("x-forwarded-for",Z),$.headers.delete("x-real-ip")}hostOf($){return _1(this.forwardedHost($))??_1(new URL($.url).host)}publicOrigin($){let Z=new URL($.url),J=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim(),W=J==="http"||J==="https"?J:Z.protocol.replace(/:$/,""),Y=this.forwardedHost($),j=Y&&_1(Y)?mO(Y):null;return`${W}://${j??Z.host}`}async resolve($){let Z=this.hostOf($);if(!Z)return null;let J=await this.match(Z,$);if(J)return J;if(this.custom?.fallback&&!this.isUnderRoot(Z))return{host:Z,group:RY,params:{},custom:!0};return null}async allows($,Z){let J=_1($);return J?await this.match(J,Z)!==null:!1}isUnderRoot($){return $===this.root||$.endsWith(`.${this.root}`)}async match($,Z){if($===this.root)return{host:$,group:W8,params:{},custom:!1};if($.endsWith(`.${this.root}`)){let W=$.slice(0,-(this.root.length+1)),Y=this.fixed.get(W);if(Y)return{host:$,group:Y.subdomain,params:{},custom:!1};if(this.param&&Z8.test(W)){let j={[this.param.name]:W};if(this.param.exists&&!await this.param.exists(j,Z))return null;return{host:$,group:this.param.subdomain,params:j,custom:!1}}return null}if(!this.custom)return null;let J=await this.resolveCustom($);return J?{host:$,group:this.custom.group,params:J,custom:!0}:null}async resolveCustom($){let Z=Date.now(),J=this.cache.get($);if(J&&J.expiresAt>Z)return this.cache.delete($),this.cache.set($,J),J.value;let W=this.inFlight.get($);if(W)return W;let Y=(async()=>await this.custom.resolve($)??null)();this.inFlight.set($,Y);let j;try{j=await Y}finally{this.inFlight.delete($)}if(this.cacheTtlMs>0){if(this.cache.size>=yO)this.cache.delete(this.cache.keys().next().value);this.cache.delete($),this.cache.set($,{value:j,expiresAt:Date.now()+this.cacheTtlMs})}return j}forget($){if($===void 0)this.cache.clear();else{let Z=_1($);if(Z)this.cache.delete(Z)}}}var pO={kind:"none"};function ax($){let Z=($??"").trim().toLowerCase();if(Z===""||Z==="false"||Z==="off"||Z==="0")return pO;if(Z==="true")return{kind:"all"};if(/^[1-9]\d*$/.test(Z))return{kind:"hops",hops:Number(Z)};throw Error(`GEMI_TRUST_PROXY must be "false", "true" or the number of proxies in front of the app (e.g. 1). Got ${JSON.stringify($)}.`)}function rx($,Z,J){if(J.kind==="all"){if(!$.get("x-forwarded-for")&&Z)$.set("x-forwarded-for",Z);return}$.delete("x-real-ip");let W=Z;if(J.kind==="hops"){let Y=($.get("x-forwarded-for")??"").split(",").map((X)=>X.trim()).filter(Boolean),j=Y.length-J.hops,z=j>=0?Y[j]:Y[0];W=(z===void 0?null:R$(z))??Z}if(W)$.set("x-forwarded-for",W);else $.delete("x-forwarded-for")}var qG=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,yG=16;function tx($){let Z=$.GEMI_CLIENT_IP_HEADER?.trim()??"",J=$.GEMI_PROXY_SECRET_HEADER?.trim()??"",W=$.GEMI_PROXY_SECRET??"";if(Z===""&&J===""&&W==="")return null;if(Z===""||J===""||W==="")throw Error("GEMI_CLIENT_IP_HEADER, GEMI_PROXY_SECRET_HEADER and GEMI_PROXY_SECRET go together: the client-IP header is only believed on a request that carries the proxy's secret. Set all three, or none.");if(!qG.test(Z))throw Error(`GEMI_CLIENT_IP_HEADER must be a single header name, e.g. "x-azure-clientip". Got ${JSON.stringify(Z)}.`);if(!qG.test(J))throw Error(`GEMI_PROXY_SECRET_HEADER must be a single header name, e.g. "x-azure-fdid". Got ${JSON.stringify(J)}.`);if(Z.toLowerCase()===J.toLowerCase())throw Error("GEMI_CLIENT_IP_HEADER and GEMI_PROXY_SECRET_HEADER name the same header.");if(W.length<yG)throw Error(`GEMI_PROXY_SECRET must be at least ${yG} characters. A guessable one lets any client name its own address.`);return{header:Z.toLowerCase(),secretHeader:J.toLowerCase(),secret:W}}function vG($,Z){if(!r3($.get(Z.secretHeader),Z.secret))return null;let J=$.get(Z.header)?.split(",")[0];return J===void 0?null:R$(J)}var cO="/__gemi__/domains/ask";class Q1{static token="router.domains";resolver;acceptsCustomDomains;clientIpTrust;groups=new Map;staticFilesVary=!1;constructor($,Z){this.groups.set(W8,$),this.clientIpTrust=Z.clientIpTrust??null;let{domains:J}=Z;if(this.acceptsCustomDomains=Boolean(J?.custom),!J){this.resolver=null;return}this.resolver=new fY(J);let W=(Y)=>({api:Y.api?new $8({...Z.api,...Y.api}):$.api,view:Y.view?new a3({...Z.view,...Y.view},Z.auth):$.view});for(let Y of J.groups??[])this.groups.set(Y.subdomain,W(Y));if(J.custom?.fallback)this.groups.set(RY,W(J.custom.fallback));this.staticFilesVary=this.viewDispatchers().some((Y)=>Y.publicFiles!==$.view.publicFiles||Y.assetRoutes!==$.view.assetRoutes)}async staticFiles($){let Z=(this.staticFilesVary?await this.route($):null)?.view??this.dispatchers(null).view;return{publicFiles:Z.publicFiles,assetRoutes:Z.assetRoutes}}applyClientIp($){let Z=this.clientIpTrust;if(Z)kY($,Z.secretHeader);let J=this.resolver?.trustedClientIp($)??(Z?vG($.headers,Z):null);if(!J)return;$.headers.set("x-forwarded-for",J),$.headers.delete("x-real-ip")}async route($){if(!this.resolver)return this.dispatchers(null);for(let J of this.resolver.proxySecretHeaders)kY($,J);let Z=a4($)??await this.resolver.resolve($);if(!Z)return null;return tZ($,Z),this.dispatchers(Z)}async ask($){if(!this.resolver?.askSecret||$.method!=="GET")return null;let Z=new URL($.url);if(Z.pathname!==cO)return null;if(!r3(Z.searchParams.get("secret"),this.resolver.askSecret))return null;let J=Z.searchParams.get("domain"),W=J?await this.resolver.allows(J,$):!1;return new Response(null,{status:W?200:404})}dispatchers($){return this.groups.get($?.group??W8)}viewDispatchers(){return Array.from(new Set(Array.from(this.groups.values(),($)=>$.view)))}viewGroups(){let $=new Set,Z=[];for(let[J,W]of this.groups){if($.has(W.view))continue;$.add(W.view),Z.push({group:J,view:W.view})}return Z}}function eZ($){let Z=new Date($??0).getTime();return Number.isFinite(Z)?Z:0}var gG=600000;function mG($,Z){return[L6($,Z),L6($,Z-1)]}class b{static token="auth";config;provider;constructor($={},Z=new Z7){Aj($.oauthProviders),this.config={...P1(Sj($),$),emailCode:o8($.emailCode)},this.provider=Z}async oauthProvider($){return await MZ(this.config.oauthProviders,$)}async oauthProviderNames(){return await cj(this.config.oauthProviders)}get userProvider(){return this.provider}accessTokenCookieOptions($,Z){return{expires:Z,secure:this.publicOrigin($).startsWith("https://"),httpOnly:!0,domain:this.cookieDomain($)}}publicOrigin($){let Z=M().bound(Q1)?M(Q1).resolver:null;return Z?Z.publicOrigin($.rawRequest):new URL($.rawRequest.url).origin}cookieDomain($){let Z=this.config.cookieDomain;if(!Z)return;let J=Z==="root"?M(Q1).resolver?.root:_1(Z);if(!J)throw Error('`auth.cookieDomain` is "root", but `route.domains` is not configured.');let W=$.domain?.host??_1(new URL($.rawRequest.url).host);return W===J||W?.endsWith(`.${J}`)?J:void 0}async getSession($,Z){if(!$)return null;if(!d8($))return this.config.migrateLegacySession?this.convertLegacySession($,Z,this.config.migrateLegacySession):null;let J=await this.userProvider.findSession({token:$,userAgent:Z});if(!J?.user)return null;let W=Date.now(),Y=eZ(J.expiresAt),j=eZ(J.absoluteExpiresAt);if(Y<=W||j<=W)return await this.userProvider.deleteSession({token:$}),null;let X=await this.slideSession(J,W);return X.user.extension=await this.config.extendSession(X.user),X}async convertLegacySession($,Z,J){let W=T.getStore()?.req;if(!W)return null;let Y=Date.now(),j=Math.floor(Y/gG),z=null,X=await this.userProvider.findSession({token:$,userAgent:Z});if(X?.user){if(!await J(X,{token:$,req:W,userAgent:Z}))return null;let G=L6($,j),B=X.user.id;if(await this.userProvider.withLegacySessionLock($,async()=>{if(!await this.userProvider.claimLegacySession({token:$}))return!1;return await this.userProvider.createSessionV2({token:G,userId:B,userAgent:Z,...this.freshLifetime(Y)}),!0}))z=G}if(!z){for(let G of mG($,j))if((await this.userProvider.findSession({token:G,userAgent:Z}))?.user){z=G;break}}if(!z)return null;let Q=await this.getSession(z,Z);if(Q)W.ctx().setCookie("access_token",z,this.accessTokenCookieOptions(W,new Date(Q.expiresAt)));return Q}async revokeSession($,Z){if(!$)return await this.userProvider.deleteSession({token:$}),null;if(d8($)||!this.config.migrateLegacySession){let Y=await this.userProvider.findSession({token:$,userAgent:Z});return await this.userProvider.deleteSession({token:$}),Y}let J=Math.floor(Date.now()/gG),W=mG($,J);return this.userProvider.withLegacySessionLock($,async()=>{let Y=await this.userProvider.findSession({token:$,userAgent:Z});for(let j of W){if(Y?.user)break;Y=await this.userProvider.findSession({token:j,userAgent:Z})}await this.userProvider.deleteSession({token:$});for(let j of W)await this.userProvider.deleteSession({token:j});return Y})}requestCarryingCookie($){let Z=T.getStore()?.req;return Z?.cookies.get("access_token")===$?Z:null}async slideSession($,Z){let J=this.config.sessionExpiresInHours*3600000;if(new Date($.expiresAt).getTime()-Z>=J/2)return $;let W=new Date(Math.min(Z+J,new Date($.absoluteExpiresAt).getTime())),Y=await this.userProvider.updateSession({token:$.token,expiresAt:W}),j=this.requestCarryingCookie($.token);if(j)j.ctx().setCookie("access_token",$.token,this.accessTokenCookieOptions(j,W));if(!Y)return $;return{...$,expiresAt:Y.expiresAt??W}}freshLifetime($){return{expiresAt:new Date($+this.config.sessionExpiresInHours*3600000),absoluteExpiresAt:new Date($+this.config.sessionAbsoluteExpiresInHours*3600000)}}async generateMagicLink($){}async upsertSession($){await this.userProvider.findSession({token:"",userAgent:""})}async authenticate($){try{let Z=await this.userProvider.findUserByEmailAddress($,!1);if(!Z)throw Error(`User not found with email: ${$}`);let J=await this.createOrUpdateSession({email:$,id:Z.id}),W=new C;if(W.ctx().setCookie("access_token",J.token,this.accessTokenCookieOptions(W,J.expiresAt)),J?.user)J.user.extension=await this.config.extendSession(J.user);return J}catch(Z){console.log(Z)}}async createOrUpdateSessionV2($){let Z=await this.createOrUpdateSession($),J=null;if(Z?.user)J=await this.config.extendSession(Z.user),Z.user.extension=J;return Z}async createOrUpdateSession($){let Z=new C,J=$.id??(await this.userProvider.findUserByEmailAddress($.email,!1))?.id;if(!J)throw new b$;let W=Bun.env.NODE_ENV==="development"?"local":Z.headers.get("User-Agent"),Y=Dj(J),j=await this.userProvider.createSessionV2({token:Y,userId:J,userAgent:W,...this.freshLifetime(Date.now())}),z=await this.userProvider.findSession({token:Y,userAgent:W??""});return z?.user?z:j}async createMagicLinkToken($){let Z=await this.userProvider.findUserByEmailAddress($,!1);if(Z){let{pin:J,token:W}=await this.issueOneTimeCode($,6);return{user:Z,email:$,pin:J,token:W}}return{}}async issueOneTimeCode($,Z){let{activeCodes:J,expiresInMinutes:W,linkExpiresInMinutes:Y}=this.config.emailCode,j=await this.config.generateMagicLinkToken($),z=await this.config.generateCode($),X=typeof z==="string"&&z!==""?z:Nj(Z),Q=M6("link",$,j),G=M6("pin",$,X);if(J===1)await this.userProvider.deleteMagicLinkToken($);else{let B=Math.max(W,Y)*60000,K=(await this.userProvider.listMagicLinkTokensByEmail($,J-1)).filter((V)=>eZ(V.createdAt)+B>Date.now()&&V.pin!==G&&V.token!==Q);await this.userProvider.deleteMagicLinkTokensExcept($,K.map((V)=>V.id))}return await this.userProvider.createMagicLinkToken({email:$,token:Q,pin:G}),{email:$,pin:X,token:j}}async oneTimeCodeRows($){let{activeCodes:Z}=this.config.emailCode;if(Z===1){let J=await this.userProvider.findMagicLinkTokenByEmail($);return J?[J]:[]}return await this.userProvider.listMagicLinkTokensByEmail($,Z)}async claimOneTimeCode($,Z){if(!await this.userProvider.claimMagicLinkToken(Z))return!1;if(this.config.emailCode.activeCodes>1)await this.userProvider.deleteMagicLinkToken($);return!0}async verifyOneTimeCode($,Z,J={}){let{expiresInMinutes:W,maxAttempts:Y}=this.config.emailCode,j=await this.oneTimeCodeRows($);if(j.length===0)return OZ("pin",$,null,Z),{status:"invalid"};let z=j.filter((G)=>eZ(G.createdAt)+W*60000>Date.now());if(z.length===0)return OZ("pin",$,null,Z),{status:"expired"};let X=!0;for(let G of z)if(!await xj(G.id,eZ(G.createdAt),Y,W))X=!1;if(!X){if(this.config.emailCode.activeCodes===1)await this.userProvider.claimMagicLinkToken(z[0].id);else await this.userProvider.deleteMagicLinkToken($);return{status:"too_many_attempts"}}let Q=null;for(let G of z)if(OZ("pin",$,G.pin,Z))Q??=G;if(!Q)return{status:"invalid"};if(J.claim!==!1&&!await this.claimOneTimeCode($,Q.id))return{status:"invalid"};return{status:"ok",row:Q}}async verifyMagicLinkToken($,Z){let J=await this.oneTimeCodeRows($);if(J.length===0)return OZ("link",$,void 0,Z),!1;let W=null;for(let j of J)if(OZ("link",$,j.token,Z))W??=j;if(!W)return!1;if(eZ(W.createdAt)+this.config.emailCode.linkExpiresInMinutes*60000<=Date.now())return!1;return await this.claimOneTimeCode($,W.id)}}class q0 extends m{static getFacadeAccessor(){return b}static async user(){let $=await q0.userOrNull();if($)return $;throw new b$({redirectTo:G6(T.getStore()?.req,this.getFacadeRoot().config.signInPath)})}static async userOrNull(){let $=T.getStore();if($?.user)return $.user;let Z=await Y6(this.getFacadeRoot(),$?.req);if(Z)$?.setUser(Z);return Z}static intendedUrl($){let Z=T.getStore()?.req;return F1(Z?.search.get(B1),$??this.getFacadeRoot().config.redirectPath)}static async guard($){let Z=await q0.user();if(!await $(Z))throw new VZ}static async guardSafe($){let Z=await q0.user();try{return await $(Z)}catch(J){return!1}}static async authenticate($){return await this.getFacadeRoot().authenticate($)}static async oauthProviders(){return await this.getFacadeRoot().oauthProviderNames()}static async createMagicLink($){return await this.getFacadeRoot().createMagicLinkToken($)}}class Y8{static ensure($,Z={}){let J=T.getStore();if(J.req.kind==="api")throw Error("Query.prefetch() cannot be called from an API request");return J.serverQueries??=new oZ(s3(J.req.rawRequest)),J.serverQueries.ensure($,Z,"prefetch")}static async instant($,...Z){let J=Y8.ensure($,Z[0]);if(await J.promise,J.status==="rejected")throw J.error;return J.data}static prefetch($,...Z){Y8.ensure($,Z[0])}static noPrefetch(){let $=T.getStore();if($.req.kind==="api")throw Error("Query.noPrefetch() cannot be called from an API request");$.serverQueries??=new oZ(s3($.req.rawRequest)),$.serverQueries.muteDiscoveryHints()}}function dO($){return(Array.isArray($)?$:String($).split("/")).map((J)=>encodeURIComponent(String(J))).join("/")}function wY($,Z={}){let J=$.replace(/\/:(\w+)([*?]?)/g,(W,Y,j)=>{let z=Object.hasOwn(Z,Y)?Z[Y]:void 0;if(z===void 0||z===""){if(j)return"";throw Error(`\`${$}\` needs a value for :${Y}.`)}return`/${j==="*"?dO(z):encodeURIComponent(String(z))}`});return`${j8}${J==="/"?"":J}`||j8}var hG=new Map;function pG($,Z){let J=hG.get($);if(!J)J=new URLPattern({pathname:`${j8}${$==="/"?"":$}`}),hG.set($,J);let W;try{W=new URL(Z,"http://localhost").pathname}catch{return null}let Y=J.exec({pathname:W})?.pathname.groups;if(!Y)return null;let j={};for(let[z,X]of Object.entries(Y)){if(X===void 0)continue;try{j[z]=decodeURIComponent(X)}catch{return null}}return j}function cG($,Z,J="/"){let W=new URL($.origin),Y=Z.host?Z.host:Z.subdomain?`${Z.subdomain}.${$.root}`:$.root,j=new URL(J.startsWith("/")?J:`/${J}`,W),z=uO(Y);if(!z)throw Error(`"${Y}" is not a hostname, so there is no URL for it. Give a bare host, optionally with a port \u2014 no scheme, path or credentials.`);if(j.hostname=z.hostname,z.port)j.port=z.port;return j.toString()}function uO($){try{let Z=new URL(`http://${$.trim()}`);return Z.host===$.trim().toLowerCase()&&Z.pathname==="/"?{hostname:Z.hostname,port:Z.port}:null}catch{return null}}class dG{static origin($){return qY($)}static absolute($,...Z){return`${t$()}${D0(String($),Z[0]??{})}`}static relative($,...Z){return D0(String($),Z[0]??{})}static forDomain($,Z,...J){let W=M(Q1).resolver;if(!W)throw Error("`Url.forDomain` needs `route.domains` to be configured.");let Y=T.getStore()?.req?.rawRequest,j=Y?W.publicOrigin(Y):t$();if(!j)throw Error("`Url.forDomain` outside a request needs `HOST_NAME` (or `APP_URL`) for the protocol.");return cG({root:W.root,origin:j},$,D0(String(Z),J[0]??{}))}static api($,...Z){return wY(String($),Z[0]??{})}static apiAbsolute($,...Z){return`${qY()}${wY(String($),Z[0]??{})}`}static matchApi($,Z){return pG(String($),Z)}}class uG{name="Meta";static description($){T.getStore().metadata.description($)}static title($){T.getStore().metadata.title($)}static openGraph($){T.getStore().metadata.openGraph($)}static htmlAttributes($){T.getStore().metadata.htmlAttributes($)}static canonical($){T.getStore().metadata.canonical($)}static alternates($){T.getStore().metadata.alternates($)}static tags($){T.getStore().metadata.tags($)}static robots($){T.getStore().metadata.robots($)}static translate($=!0){T.getStore().metadata.translate($)}static fonts($){T.getStore().metadata.fonts($)}}var lO={set($,Z,J){T.getStore().setCookie($,Z,J)},setIfAbsent($,Z,J){if(T.getStore().req.cookies.has($))return!1;return T.getStore().setCookie($,Z,J),!0},delete($,Z){T.getStore().deleteCookie($,Z)}};class l1 extends m{static getFacadeAccessor(){return JZ}static get client(){return this.getFacadeRoot().client}static get($){return l1.client.get($)}static set($,Z){return l1.client.set($,Z)}static del(...$){return l1.client.del(...$)}static exists($){return l1.client.exists($)}static incr($){return l1.client.incr($)}static expire($,Z){return l1.client.expire($,Z)}static ttl($){return l1.client.ttl($)}}function oC($){return $}function lG(){return{store:"memory",ttl:null}}class yY{entries=new Map;maxEntries;now;constructor($={}){let Z=$.maxEntries??1e4;if(!Number.isInteger(Z)||Z<1)throw TypeError(`MemoryCacheStore maxEntries is a whole number of 1 or more; got ${Z}.`);this.maxEntries=Z,this.now=$.now??Date.now}get size(){return this.entries.size}async get($){let Z=this.live($);if(!Z)return null;return this.entries.delete($),this.entries.set($,Z),Z.value}async set($,Z,J){this.entries.delete($),this.entries.set($,{value:Z,expiresAt:J===null?null:this.now()+J});while(this.entries.size>this.maxEntries)this.entries.delete(this.entries.keys().next().value)}async delete($){let Z=this.live($)!==void 0;return this.entries.delete($),Z}async flush(){this.entries.clear()}live($){let Z=this.entries.get($);if(!Z)return;if(Z.expiresAt!==null&&Z.expiresAt<=this.now()){this.entries.delete($);return}return Z}}var iO="500";class vY{prefix;injectedClient;constructor($={}){this.injectedClient=$.client,this.prefix=$.prefix??"gemi:cache:"}async get($){let Z=await this.client.send("GET",[this.prefix+$]);return Z===null||Z===void 0?null:String(Z)}async set($,Z,J){let W=[this.prefix+$,Z];if(J!==null)W.push("PX",String(Math.max(1,Math.round(J))));await this.client.send("SET",W)}async delete($){return Number(await this.client.send("DEL",[this.prefix+$]))>0}async flush(){if(this.prefix==="")throw Error("RedisCacheStore refuses to flush with an empty prefix: that would delete every key in the database.");let $=this.client,Z=`${sO(this.prefix)}*`,J="0";do{let W=await $.send("SCAN",[J,"MATCH",Z,"COUNT",iO]),[Y,j]=Array.isArray(W)?W:["0",[]];if(J=String(Y),Array.isArray(j)&&j.length>0)await $.send("UNLINK",j.map(String))}while(J!=="0")}get client(){if(this.injectedClient)return this.injectedClient;let $=M(),Z=$.bound(JZ)?$.make(JZ).client:void 0;if(!Z)throw Error("RedisCacheStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisCacheStore({ client }).");return Z}}function sO($){return $.replace(/[*?[\]\\^-]/g,(Z)=>`\\${Z}`)}var nO="k:",iG="tag:",oO="t:";class gY{async get($){let Z=await this.manager.read(await this.storeKey($));return Z.found?Z.value:void 0}async has($){return(await this.manager.read(await this.storeKey($))).found}async set($,Z,J){await this.manager.write(await this.storeKey($),Z,J)}async delete($){return this.manager.store.delete(await this.storeKey($))}async pull($){let Z=await this.storeKey($),J=await this.manager.read(Z);if(!J.found)return;return await this.manager.store.delete(Z),J.value}async remember($,Z,J){let[W,Y]=typeof Z==="function"?[void 0,Z]:[Z,J];if(typeof Y!=="function")throw TypeError("Cache.remember needs a function that computes the value.");return this.manager.rememberAt(await this.storeKey($),W,Y)}}class mY extends gY{options;static token="cache";config;builtStore;inflight=new Map;constructor($={},Z={}){super();this.options=Z;if(this.config=P1(lG(),$),this.config.ttl!==null&&this.config.ttl!==void 0)WZ(this.config.ttl)}get manager(){return this}get store(){return this.builtStore??=this.buildStore()}tags(...$){let Z=[...new Set($.flat())].sort();if(Z.length===0)throw TypeError("Cache.tags needs at least one tag.");for(let J of Z)if(typeof J!=="string"||J==="")throw TypeError(`A cache tag is a non-empty string; got ${JSON.stringify(J)}.`);return new nG(this,Z)}async flush(){await this.store.flush()}async storeKey($){return nO+oG($)}async read($){let Z=await this.store.get($);if(Z===null)return{found:!1};try{return{found:!0,value:JSON.parse(Z)}}catch{return{found:!1}}}async write($,Z,J){if(Z===void 0)throw TypeError("Cache.set cannot store undefined: get() returns undefined for a miss. Store null instead.");let W=this.ttlMs(J);if(W===0){await this.store.delete($);return}let Y=JSON.stringify(Z);if(Y===void 0)throw TypeError(`Cache.set cannot store a ${typeof Z}: it has no JSON form.`);await this.store.set($,Y,W)}async rememberAt($,Z,J){let W=await this.read($);if(W.found)return W.value;let Y=this.inflight.get($);if(Y)return Y;let j=(async()=>{try{let z=await J();if(z!==void 0)await this.write($,z,Z);return z}finally{this.inflight.delete($)}})();return this.inflight.set($,j),j}async tagVersions($){return Promise.all($.map(async(Z)=>{let J=iG+Z,W=await this.store.get(J);if(W!==null)return W;let Y=sG();return await this.store.set(J,Y,null),Y}))}async flushTags($){await Promise.all($.map((Z)=>this.store.set(iG+Z,sG(),null)))}ttlMs($){let Z=$===void 0?this.config.ttl:$;return Z===null||Z===void 0?null:WZ(Z)}buildStore(){let{store:$}=this.config;if($===void 0||$==="memory")return new yY(this.config.memory);if($==="redis"){let Z=this.options.application;return new vY({...this.config.redis,client:Z?{send:(J,W)=>Z.make(JZ).client.send(J,W)}:void 0})}if(typeof $==="function"){let Z=this.options.application;if(!Z)throw Error("A cache store factory needs the application: build CacheManager with { application }.");return $(Z)}if($&&typeof $==="object")return $;throw Error(`Unknown cache store ${JSON.stringify($)} in app/config/cache.ts: use "memory", "redis", a CacheStore, or a function returning one.`)}}class nG extends gY{manager;tagNames;constructor($,Z){super();this.manager=$;this.tagNames=Z}async flush(){await this.manager.flushTags([...this.tagNames])}async storeKey($){oG($);let Z=await this.manager.tagVersions([...this.tagNames]);return`${oO}${Z.join(",")}:${$}`}}function oG($){if(typeof $!=="string"||$==="")throw TypeError(`A cache key is a non-empty string; got ${JSON.stringify($)}.`);return $}function sG(){let $=new Uint8Array(9);return crypto.getRandomValues($),Array.from($,(Z)=>Z.toString(16).padStart(2,"0")).join("")}class aG extends m{static getFacadeAccessor(){return mY}static get($){return this.getFacadeRoot().get($)}static has($){return this.getFacadeRoot().has($)}static set($,Z,J){return this.getFacadeRoot().set($,Z,J)}static delete($){return this.getFacadeRoot().delete($)}static pull($){return this.getFacadeRoot().pull($)}static remember($,Z,J){let W=this.getFacadeRoot();return typeof Z==="function"?W.remember($,Z):W.remember($,Z,J)}static tags(...$){return this.getFacadeRoot().tags(...$)}static flush(){return this.getFacadeRoot().flush()}}class rG extends m{static getFacadeAccessor(){return V1}static consume($,Z={}){return this.getFacadeRoot().consume($,Z)}static enforce($,Z={},J){return this.getFacadeRoot().enforce($,Z,J)}}class eG extends m{static getFacadeAccessor(){return tG}static run($,Z,J){return this.getFacadeRoot().run($,Z,J)}static acquire($,Z={}){return this.getFacadeRoot().acquire($,Z)}}class ZK extends m{static getFacadeAccessor(){return $K}static encrypt($){return this.getFacadeRoot().encrypt($)}static decrypt($){return this.getFacadeRoot().decrypt($)}static needsReencryption($){return this.getFacadeRoot().needsReencryption($)}}class JK extends m{static getFacadeAccessor(){return l3}static for($,Z,J){return this.getFacadeRoot().for($,Z,J)}static list($,Z){return this.getFacadeRoot().list($,Z)}static save($,Z,J){return this.getFacadeRoot().save($,Z,J)}static fake($={}){return this.getFacadeRoot().fake($)}static restore(){this.getFacadeRoot().restore()}}function _A($){return $}function WK(){return{driver:"memory",pollInterval:30000,maxSubscriptions:1e4,batchSize:100,keepaliveInterval:5000}}function z8($){let Z=new URLSearchParams;for(let[J,W]of $)Z.append(J,String(W));return Z.toString()}function hY($){let Z=new Map;if(!$)return Z;let J;try{J=new URLSearchParams($)}catch{return Z}for(let[W,Y]of J){let j=Number(Y);if(Y!==""&&Number.isSafeInteger(j)&&j>=0)Z.set(W,j)}return Z}var{SQL:aO}=globalThis.Bun;function rO(){return Bun.semver.satisfies(Bun.version,">=1.4.0")}var tO=async($)=>{let Z=new aO($,{max:1,idleTimeout:0,maxLifetime:0});return{listen:(J,W,Y)=>Z.listen(J,W,Y),close:()=>Z.close({timeout:1})}},eO=async($)=>{let Z;try{Z=(await import("./chunk-pv3152gj.js")).default}catch(W){throw Error("The change feed's database driver needs a Postgres client that can LISTEN: Bun 1.4 or later, or the `postgres` package (bun add postgres).",{cause:W})}let J=Z($,{max:1,idle_timeout:0,max_lifetime:null,fetch_types:!1,onnotice:()=>{}});return{listen:(W,Y,j)=>J.listen(W,Y,j),close:()=>J.end({timeout:1}).catch(()=>{})}},YK=($)=>rO()?tO($):eO($);var $L=/^[A-Za-z_][A-Za-z0-9_]*$/;class pY{headsTable;entriesTable;notifyChannel;sql;dialect;connection;url;retain;listener;sqliteTurn=Promise.resolve();constructor($,Z={}){if($.dialect!=="postgres"&&$.dialect!=="sqlite")throw Error(`The change feed's database driver supports Postgres and SQLite, not ${$.dialect}.`);let J=Z.headsTable??"gemi_change_heads",W=Z.entriesTable??"gemi_changes",Y=Z.notifyChannel??"gemi_changes";for(let z of[J,W,Y])if(!$L.test(z))throw Error(`"${z}" is not a plain identifier. Use letters, digits and underscores.`);let j=Z.retain??1000;if(!Number.isInteger(j)||j<1)throw Error(`The change feed's retain must be a whole number, 1 or more; got ${j}.`);this.headsTable=J,this.entriesTable=W,this.notifyChannel=Y,this.sql=$.sql,this.dialect=$.dialect,this.connection=$.name,this.url=$.url,this.retain=j,this.listener=Z.listener??YK}async createTable(){for(let $ of ZL(this.headsTable,this.entriesTable))await this.sql.unsafe($)}joinsTransaction(){return this.transaction()!==void 0}publish($,Z){let J=this.transaction();if(!J){let Y=()=>this.sql.begin((z)=>this.append(z,$,Z));if(this.dialect!=="sqlite")return Y();let j=this.sqliteTurn.then(Y);return this.sqliteTurn=j.catch(()=>{}),j}let W=this.append(J,$,Z);return jK(W),W}async append($,Z,J){let W=$.unsafe(`"${this.headsTable}"`),Y=$.unsafe(`"${this.entriesTable}"`),[j]=await $`
|
|
23
|
+
${W}`)}let J=(await Z.outputs[0].text()).trim();if(/<\/script|<!--/i.test(J))throw Error(`The document script ${$} contains "</script" or "<!--", which would end the inline <script> it is put in. Write it "<\\/script" or build the string from parts.`);return J}function BO($){return`'sha256-${YO("sha256").update($).digest("base64")}'`}var FY,VY=new Map;function FO(){if(FY===void 0){let $=DY(UY(),"dist","server",XO);FY=DG($)?JSON.parse(jO($,"utf8")):null}return FY??null}async function OY($){GO($);let Z=Bun.env.NODE_ENV==="production";if(Z){let j=FO()?.[$];if(j!==void 0)return j;let z=VY.get($);if(z)return z}let J=DY(UY(),"app"),W=KO(J,$);if(!W)throw Error(`The document script "${$}" was not found. It is a file at app/views/${$}${OG}.ts (or .js).`);if(!Z)return UG(W);let Y=UG(W);return VY.set($,Y),Y.catch(()=>VY.delete($)),Y}async function LI($){return BO(await OY($))}var VO="gemi-islands",UO="gemi-island-i18n",xI=`'sha256-${MG("sha256").update(HY).digest("base64")}'`;function LY($,Z,J,W){if(!J)return $;let Y=W?$.lastIndexOf(Z):$.indexOf(Z);return Y===-1?$+J:$.slice(0,Y)+J+$.slice(Y)}var MY=($)=>$.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<"),CI=`'sha256-${MG("sha256").update(BY).digest("base64")}'`,DO='await import("/refresh.js").catch(()=>{});await import("/@vite/client").catch(()=>{});',OO="gemi-static";function HG($,Z,J,W,Y,j){let z=new Set,X=[];if(J)X=Z.islands.map((U)=>{let O=U.module?J(U.module):void 0;if(!O)return console.error(`[gemi] island ${U.module??"(unknown module)"}: no client build entry. Declare it as island(() => import("./Component")) so gemi's Vite plugin builds it.`),null;if(U.load==="eager"){for(let L of O.preload)z.add(L);if(U.preloadDynamic)for(let L of O.dynamicPreload??[])z.add(L)}return{s:O.src,e:U.export,l:U.load}});let Q=X.some((U)=>U!==null),G=j?`<script type="module" ${LG}="${MY(j.name)}">${j.source}</script>`:"";if(!Q&&!Y)return LY($,"</head>",G,!1);let F=(Y?`<meta name="${OO}" content="${MY(Y.identity)}"${Y.prefetch==="none"?' data-prefetch="none"':""}/>`:"")+[...z].map((U)=>`<link rel="modulepreload" href="${MY(U)}"/>`).join("")+G,K=Y?BY:HY,V=Q?KG(Z):void 0,D=(Q?`<script type="application/json" id="${VO}">${r0({i:X})}</script>`:"")+(V?`<script type="application/json" id="${UO}">${r0(V)}</script>`:"")+`<script type="module">${W?DO+K:K}</script>`;return LY(LY($,"</head>",F,!1),"</body>",D,!0)}function LO($,Z){let J=/<(\/?)template\b[^>]*>/gi;J.lastIndex=Z;let W=0;for(let Y=J.exec($);Y;Y=J.exec($))if(W+=Y[1]?-1:1,W===0)return J.lastIndex;return-1}function TG($){let Z=`<template ${FG}="`;for(let J=$.lastIndexOf(Z);J!==-1;J=$.lastIndexOf(Z)){let W=LO($,J);if(W===-1)break;let Y=J+Z.length,j=$.slice(Y,$.indexOf('"',Y)),z=$.indexOf(">",Y)+1,X=$.slice(z,W-11);$=$.slice(0,J)+$.slice(W);let Q=`<${n3} ${BG}="${j}" style="display:contents"></${n3}>`;$=$.split(Q).join(`<${n3} style="display:contents">${X}</${n3}>`)}return $}function TY($){if(!$)return{locale:!0,session:!0,csrf:!0};return{locale:!1,session:$.session===!0,csrf:$.csrf===!0}}function _G($,Z){if($.getSetCookie().length>0){if(Z.cacheControl&&Bun.env.NODE_ENV!=="production")console.warn(`[gemi] A static view with cacheControl "${Z.cacheControl}" set a cookie, so it was sent "private, no-store" instead. Static pages are cacheable only when nothing on them sets a cookie.`);$.set("Cache-Control","private, no-store");return}if(Z.cacheControl&&!$.has("Cache-Control"))$.set("Cache-Control",Z.cacheControl)}function MO($){let Z=$.headers.get("Cache-Control")?.toLowerCase()??"";return/(^|[\s,])(public|s-maxage)\b/.test(Z)}var PG=new Set,HO=new Set(["public","private","s-maxage","proxy-revalidate"]);function PY($,Z){let J=$.get("Cache-Control");if(!J||$.getSetCookie().length===0)return;if(!/(^|[\s,])(public|s-maxage)\b/i.test(J))return;let Y=["private",...J.split(",").map((j)=>j.trim()).filter((j)=>{let z=j.split("=")[0].trim().toLowerCase();return z!==""&&!HO.has(z)})].join(", ");if(Bun.env.NODE_ENV!=="production"&&!PG.has(Z)){PG.add(Z);let j=[...new Set($.getSetCookie().map((z)=>z.split("=")[0]))];console.warn(`[gemi] The view "${Z??""}" sets cookies (${j.join(", ")}) on a response with Cache-Control "${J}", so it was sent "${Y}" instead: a shared cache would hand those cookies to every visitor. To let a CDN cache the page, make it a static view with .static({ cacheControl }).`)}$.set("Cache-Control",Y)}var NG=new Set;function IG($,Z){if(!MO($)||$.headers.getSetCookie().length===0)return $;if(Bun.env.NODE_ENV!=="production"&&!NG.has(Z))NG.add(Z),console.warn(`[gemi] The file route "${Z??""}" set a cookie on a response with Cache-Control "${$.headers.get("Cache-Control")}", so the cookie was not sent: a shared cache would hand it to every visitor. Make the response private, or set the cookie elsewhere.`);try{return $.headers.delete("Set-Cookie"),$}catch{let J=new Headers($.headers);return J.delete("Set-Cookie"),new Response($.body,{status:$.status,statusText:$.statusText,headers:J})}}var TO=async()=>(await import("./chunk-sen7c0e6.js")).default,NY,o3=async(...$)=>{return NY??=import("react-dom/server.browser").catch((Z)=>{throw NY=void 0,Z}),(await NY).renderToReadableStream(...$)},CG=1e4,AG="no-locale",PO="no-theme";async function NO($,Z,J){let W=`${J==="italic"?"italic,":""}wght@${J==="italic"?"1,":""}${Z}`,z=(await(await fetch(`https://fonts.googleapis.com/css2?family=${$}:${W}&display=swap`,{headers:{"User-Agent":"Mozilla/5.0 Firefox/1.0"}})).text()).match(/url\(([^)]+)\)/)?.[1];return await fetch(z).then((X)=>X.arrayBuffer())}var AY="/assets";function _O($){return $===AY||$.startsWith(`${AY}/`)}function IO($){let Z=$.filter(_O);if(Z.length>0){let J=Z.length>1;throw Error(`View route path${J?"s":""} ${Z.map((W)=>`"${W}"`).join(", ")} use${J?"":"s"} the reserved "${AY}" prefix. The client build output is served from there before the router runs, so the route would never match. Mount it somewhere else, or set \`assetRoutes: true\` on these views' config (route.view or a route.domains group's view).`)}}function xO($){let Z=M(Q1).resolver;return{...$.domain,root:Z.root,origin:Z.publicOrigin($.rawRequest)}}function _Y($){let{status:Z=400,error:J,body:W,...Y}=$;return new Response(W??J?.message,{...Y,status:Z})}function CO($){let{status:Z=400,data:J,directive:W,headers:Y}=$;return new Response(JSON.stringify({data:J,directive:W}),{headers:Y,status:Z})}class a3{static token="router.view";flatViewRoutes={};routeManifest={};clientRouteManifest={};componentTree=[];flatComponentTree=[];requiredViews={};staticRoutes=[];root=null;shellReporter=zG();preloadCache=new WeakMap;hooks;partialRendering;localeRouting;detectLocale;theme;defaultMeta;notFound;publicFiles;assetRoutes;translate;constructor($,Z={}){let J=EQ();if(this.partialRendering=$.partialRendering??J.partialRendering,this.localeRouting=$.localeRouting??J.localeRouting,this.detectLocale=$.detectLocale,this.detectLocale&&this.localeRouting!=="off")throw Error('`view.detectLocale` needs `view.localeRouting: "off"`: on locale-routed views the URL, the `i18n-locale` cookie and `Accept-Language` decide the locale. A `route.domains` group that inherits it and keeps locale routing can set `detectLocale: undefined`.');this.theme=$.theme??J.theme,this.defaultMeta=$.meta,this.notFound=$.notFound,this.publicFiles=$.publicFiles??J.publicFiles,this.assetRoutes=$.assetRoutes??J.assetRoutes,this.translate=$.translate,this.hooks={onNotFound:$.onNotFound??J.onNotFound,onRequestStart:$.onRequestStart??J.onRequestStart,onRequestEnd:$.onRequestEnd??J.onRequestEnd,onRequestFail:$.onRequestFail??J.onRequestFail,onStreamComplete:$.onStreamComplete??J.onStreamComplete};let W={"/":$.rootRouter,"/auth":PQ(Z)};if(this.requiredViews=Object.fromEntries(HQ(Z).map(({view:Y,requiredBy:j})=>[Y,j])),this.flatViewRoutes=l4(W),!this.assetRoutes)IO(Object.keys(this.flatViewRoutes));this.routeManifest=s4(W),this.clientRouteManifest=Object.fromEntries(Object.entries(this.routeManifest).filter(([,Y])=>Y.at(-1)!=="FILE")),this.componentTree=o4(W),this.flatComponentTree=QY(this.componentTree),this.staticRoutes=Object.entries(this.flatViewRoutes).filter(([,Y])=>Y.static).map(([Y])=>Y);for(let Y of this.staticRoutes){let j=this.flatViewRoutes[Y].static?.layout;if(j&&!this.flatComponentTree.includes(j))this.flatComponentTree.push(j)}if(this.notFound){for(let Y of[this.notFound.view,this.notFound.static?.layout])if(Y&&!this.flatComponentTree.includes(Y))this.flatComponentTree.push(Y)}this.root=$.root}async passesFeatureGates($){let Z=M(Y$);for(let J of $)if(!await Z.enabled(J))return!1;return!0}async onRequestEnd($,Z={}){if(Z.mintSession!==!1)r4();return await this.hooks.onRequestEnd($)}completeStream($,Z){let J=(W)=>{ZZ.error(W?.message??'Error in "onStreamComplete" event handler',{err:JSON.stringify(W)})};try{Promise.resolve(this.hooks.onStreamComplete($,Z)).catch(J)}catch(W){J(W)}}modulePreloadLinks($){let{clientEntry:Z,modulePreloadManifest:J,views:W,routeKey:Y}=$,j=()=>{let Q=new Set(Z?.preload??[]);for(let G of W)for(let B of J?.[G]??[])Q.add(B);return[...Q].map((G)=>u1("link",{key:`modulepreload:${G}`,rel:"modulepreload",href:G}))};if(!J)return j();let z=this.preloadCache.get(J);if(!z||z.clientEntry!==Z)z={clientEntry:Z,byRoute:new Map},this.preloadCache.set(J,z);let X=z.byRoute.get(Y);if(!X)X=j(),z.byRoute.set(Y,X);return X}async renderStatic($){let{req:Z,runInRequestScope:J,staticView:W,currentViews:Y,data:j,serverQueries:z,headers:X}=$,Q;if(W.layout){if(Q=$.viewImportMap[W.layout],!Q)throw Error(`The static layout "${W.layout}" was not found. It is a view path: a file at app/views/${W.layout}.tsx whose default export renders the document.`)}let G=await $.getStyles(Y,{static:!0,layout:W.layout});z.markRenderStart();let B=CY(),F=new AbortController,K=setTimeout(()=>F.abort(),CG),V=(U)=>{if(Bun.env.NODE_ENV!=="production")console.error(U)},D=GG(async(U,O)=>{let L=await o3(U,{signal:F.signal,identifierPrefix:O,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:V});return await L.allReady.catch(()=>{}),await new Response(L).text()},{currentLocale:j?.i18n?.currentLocale,defaultLocale:j?.i18n?.defaultLocale,timeZone:j?.i18n?.timeZone});try{let U,O=typeof W.script==="function"?await J(()=>W.script(Z)):W.script;if(O)U={name:O,source:await OY(O)};let L;if(W.navigation){let I=W.navigation===!0?{}:W.navigation,E=I.version?String(await J(()=>I.version(Z))):"";L={identity:[W.layout??"",$.buildId??"",U?.name??"",E].join("|"),prefetch:I.prefetch==="none"?"none":"intent"}}let P=await o3(u1(VG.Provider,{value:D,children:u1(xG,{children:[...G,u1(this.root,{data:j,viewImportMap:$.viewImportMap,viewModules:$.viewModules,serverQueries:z,dictionarySink:B,rootLayout:Q,key:"root"})]})}),{signal:F.signal,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:V});await P.allReady.catch(()=>{});let H=TG(await new Response(P).text());return new Response(HG(H,D,$.resolveIsland,Bun.env.NODE_ENV!=="production",L,U),{status:$.status,headers:X})}finally{clearTimeout(K),J(()=>this.completeStream(Z,z.summarize(F.signal.aborted)))}}async render($){let{req:Z,runInRequestScope:J,csrfTokenHMAC:W,currentPathName:Y,headers:j,i18n:z,params:X,pathname:Q,serverQueries:G,userAgent:B,noStream:F,noTheme:K,url:V,user:D,viewData:U,breadcrumbs:O,urlLocaleSegment:L,meta:P,isOgRequest:H,appId:I,features:E,staticView:S}=$,R=this.theme===!1||K||S?null:{cookie:this.theme.cookie??lW,default:this.theme.default??null,value:AO(Z,this.theme.cookie??lW)},k=L?YG(Q,[L]).pathname:Q,N={kind:"view",data:{meta:P,pageData:{[k]:U},__csrf:W.toString("base64"),prefetchedData:{},i18n:z,auth:{user:D},routeManifest:this.clientRouteManifest,breadcrumbs:O,router:{urlLocaleSegment:L,pathname:Y,params:X,currentPath:Q,searchParams:V.search,is404:!Y?!0:!1,domain:Z.domain?xO(Z):null},appId:I,features:E,theme:R,componentTree:[["404",[]],...this.componentTree],...this.staticRoutes.length>0?{staticRoutes:this.staticRoutes}:{}},head:{}},v=this.root,_=this.routeManifest[Y];return async(f)=>{let{bootstrapModules:H0=[],loaders:Z3,getStyles:i1,viewImportMap:C1,cssManifest:i,ogMap:y,viewModules:r,clientEntry:A1,modulePreloadManifest:J3,assetBase:jZ,resolveIsland:o0,buildId:G1}=f,x$=A1?[]:H0,s1=(p)=>[p,`window.loaders=${Z3}`,...A1?[`import(${JSON.stringify(A1.module)}).catch(function(e){setTimeout(function(){throw e})})`]:[]].join(";");if(H){let p=null,u0=null;for(let A of _??[])if(typeof y[A]==="function")u0=A,p=y[A];if(!p)return new Response("Not found",{status:404});let W3=Object.values(N.data.pageData)[0];try{await o3(u1(p,W3[u0]),{onError:()=>{}})}catch(A){let{fonts:e,...a1}=A.satoriOptions,e3=await Promise.all(e.map(($6)=>{return NO($6.name,$6.weight,$6.style).then((qK)=>({...$6,data:qK}))})),Y5=new Headers(j);Y5.set("Content-Type","image/png");let[RK,fK]=await Promise.all([TO(),d4("Rendering an OG image")]),kK=await RK(A.jsx,{...a1,fonts:e3}),wK=await fK(Buffer.from(kK)).png({compressionLevel:0,effort:10}).toBuffer();return new Response(new Uint8Array(wK),{headers:Y5})}return new Response("data")}if(S&&Y)return await this.renderStatic({req:Z,runInRequestScope:J,staticView:S,currentViews:_,data:N.data,serverQueries:G,headers:j,getStyles:i1,viewImportMap:C1,viewModules:r,resolveIsland:o0,buildId:G1,status:200});if(S&&!Y&&this.notFound){let p=this.notFound.view;if(!C1[p])throw Error(`The not-found view "${p}" (route.view.notFound) was not found. It is a view path: a file at app/views/${p}.tsx.`);return await this.renderStatic({req:Z,runInRequestScope:J,staticView:S,currentViews:[p],data:N.data,serverQueries:G,headers:j,getStyles:i1,viewImportMap:{...C1,"404":C1[p]},viewModules:r&&{...r,"404":r[p]},resolveIsland:o0,buildId:G1,status:$.refusedStatus??404})}if(N.data.cssManifest=i,N.data.modulePreloadManifest=J3??{},jZ&&jZ!=="/")N.data.assetBase=jZ;if(G1&&G1!=="dev")N.data.buildId=G1;let t=this.modulePreloadLinks({clientEntry:A1,modulePreloadManifest:J3,views:_??["404"],routeKey:Y??"404"}),U8=await i1(_??["404"]);N.data.prefetchedData=G.snapshotResolved(),G.markRenderStart();let C$=new AbortController,n1=setTimeout(()=>C$.abort(),CG),o1=P6(B)||F,zZ=Bun.env.NODE_ENV!=="production"&&!o1&&Y&&this.shellReporter.shouldObserve(Y)?XG():null,A$=CY();try{let p=await o3(u1(xG,{children:[...t,...U8,...R?[u1("script",{key:"theme-script",dangerouslySetInnerHTML:{__html:kQ(r0({cookie:R.cookie,default:R.default}))}})]:[],u1(v,{data:N.data,viewImportMap:C1,viewModules:r,serverQueries:G,dictionarySink:A$,key:"root"})]}),{bootstrapScriptContent:s1(`window.__GEMI_DATA__ = ${r0(N.data)}`),bootstrapModules:x$,signal:C$.signal,...o1?{progressiveChunkSize:Number.MAX_SAFE_INTEGER}:{},onError(u0){if(Bun.env.NODE_ENV!=="production")console.error(u0)}});if(p.allReady.catch(()=>{}).finally(()=>clearTimeout(n1)),o1)await p.allReady.catch(()=>{});return new Response(a8(p,G,{onShell:o1?void 0:()=>G.markShell(),onChunk:zZ?.onChunk,onClose:()=>J(()=>{if(this.completeStream(Z,G.summarize(C$.signal.aborted)),zZ)this.shellReporter.report(Y,zZ.measure())})},A$),{status:!Y?$.refusedStatus??404:200,headers:j})}catch(p){if(clearTimeout(n1),Bun.env.NODE_ENV==="production")throw J(()=>this.completeStream(Z,G.summarize(C$.signal.aborted))),p;let u0=await o3(u1("div"),{bootstrapScriptContent:s1(`window.error= ${r0(p.message)}; window.stack_trace=${r0(p.stack)};window.__GEMI_DATA__ = ${r0(N.data)}`),bootstrapModules:Bun.env.NODE_ENV==="development"?["/render-error.js",...x$]:x$});return new Response(a8(u0,G,{onClose:()=>J(()=>this.completeStream(Z,G.summarize(C$.signal.aborted)))}),{status:!Y?$.refusedStatus??404:200,headers:j})}}}viewRefusalStatus($,Z,J){if(E$(Z))return 404;if(Z?.kind===$$){let W=Z.payload?.view?.status;return W===403||W===404?W:null}if(Z$(Z)){if(!J.has(Z))this.hooks.onRequestFail($,Z);return console.error(Z),403}if(Z instanceof d1&&(Z.status===403||Z.status===404))return Z.status;return null}async handleViewRequest($,Z){let J=new URL($.url),W=J.pathname.endsWith(".json"),Y=J.pathname.endsWith(".og"),j=J.pathname.replace(".json","").replace(".og",""),[,z,...X]=j.split("/"),Q=j,G=null,B=null,F=M(c),K=i3(this.flatViewRoutes,j),V=F.isLocaleAware&&this.localeRouting==="prefix"&&!K?.route.middleware.includes(AG);if(V&&F.supportedLocales.includes(z))Q=`/${X.join("/")}`,G=z,B=z;if(($.method==="GET"||$.method==="HEAD")&&!W&&!Y&&K===null&&J.pathname.endsWith("/")&&!J.pathname.startsWith("//")){let _=J.pathname.replace(/\/+$/,""),f=V&&F.supportedLocales.includes(_.slice(1));if(_&&!f)return new Response("",{status:301,headers:{Location:`${_}${J.search}`}})}if(V&&!Y&&B===null&&!(B===null&&K!==null)){let _=IY(z,F.supportedLocales,F.defaultLocale);if(_){let f=X.length?`/${X.join("/")}`:"";return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${_}${f}${W?".json":""}${J.search}`}})}}if(V&&!Y){let _=M(c).detectLocale(new C($,{},"view",Q));if(B===null&&_!==F.defaultLocale){let f=J.pathname==="/"?"":J.pathname;return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${_}${f}${J.search}`}})}}Q=Q.replace("//","/");let U=[],O=[],L=null,P={},H=null,I=!1,E=!1,S=[],R,k=!1,N=!1;try{let _=i3(this.flatViewRoutes,Q);if(B&&_?.route.middleware.includes(AG))_=null;if(_){if(k=!0,L=_.routePath,P=_.params,U=_.route.exec,O=_.route.middleware,S=_.route.features,I=O.includes("no-stream"),E=O.includes(PO),R=_.route.static,N=_.route.segments.at(-1)?.viewPath==="FILE",W&&this.partialRendering){let f=$.headers.get(XY),H0=WG({flatViewRoutes:this.flatViewRoutes,supportedLocales:M(c).supportedLocales,from:f,origin:J.origin,to:{segments:_.route.segments,params:P,search:J.search}});if(H0.startIndex>0)U=U.slice(H0.startIndex),H={from:f,carriedViews:H0.carriedViews}}}}catch(_){throw _}if(R&&W)return new Response("Not found",{status:404});let v=new C($,P,"view",L);return this.hooks.onRequestStart(v),await T.run(v,async()=>{let _=null,f=T.getStore(),H0=rZ.getStore(),Z3=(y)=>rZ.run(H0,()=>T.runWith(f,y));f.serverQueries=new oZ(s3($));let i1=new Set;f.serverQueries.onQueryFail((y)=>{i1.add(y.error);try{Z3(()=>Promise.resolve(this.hooks.onRequestFail(i,y.error)).catch(()=>{}))}catch{}});let C1=TY(N?{}:R??(L===null&&!W?this.notFound?.static:void 0));if(B){let y=B.replaceAll("/","");I$.setLocale(y,{cookie:C1.locale})}else if(F.isLocaleAware&&!V)f.setLocale(F.defaultLocale);else I$.setLocale(void 0,{cookie:C1.locale});let i=f.req;if(C1.session)r4();try{let y=null;if(this.detectLocale&&!V&&M(c).isLocaleAware){let{supportedLocales:A,defaultLocale:e}=M(c),a1=await this.detectLocale(i,{supportedLocales:A,defaultLocale:e}),e3=typeof a1==="string"?IY(a1,A,e):null;if(e3)f.setLocale(e3)}try{await M(e1).runMiddleware(O)}catch(A){if(y=this.viewRefusalStatus(i,A,i1),y===null)throw A}if(y!==null||S.length>0&&!await this.passesFeatureGates(S))L=null,U=[],i.routePath="";let r=M(c),A1=r.isEnabled,J3=r.isLocaleAware,jZ=new C($,i.params),o0={defaultLocale:r.defaultLocale,timeZone:r.detectTimeZone(jZ)};if(J3){let A=null;if(B)A=B.replaceAll("/",""),f.setLocale(A);else if(!V)A=f.locale??r.defaultLocale;else A=r.detectLocale(jZ),f.setLocale(A);let e=A1?r.getPageTranslations(A,i.routePath):{};o0={...o0,supportedLocales:r.supportedLocales,currentLocale:A,dictionary:{[A]:e},defaultLocale:r.defaultLocale,...V?{}:{localeRouting:"off"}}}await xY(o0.currentLocale??"");let G1;try{G1=await Promise.all(U.map((A)=>A(i)))}catch(A){if(y=this.viewRefusalStatus(i,A,i1),y===null)throw A;L=null,U=[],i.routePath="",G1=[]}let x$=void 0;if(L===null){if(x$=await this.hooks.onNotFound(i,{status:y??404}),J3&&!V&&f.locale&&f.locale!==o0.currentLocale){let A=f.locale;o0={...o0,currentLocale:A,dictionary:{[A]:A1?r.getPageTranslations(A,i.routePath):{}}},await xY(A)}}if(this.defaultMeta&&!f.metadata.hasAllDefaultFields)f.metadata.applyDefaults(typeof this.defaultMeta==="function"?await this.defaultMeta(i):this.defaultMeta);if(this.translate!==void 0)f.metadata.applyTranslateDefault(this.translate);let{cookies:s1,headers:t}=f;if(y!==null)t.set("Cache-Control","no-store");_={data:G1,cookies:s1,headers:t,user:f.user,prefetchedData:f.serverQueries.snapshotResolved(),currentPathName:L,params:i.params,urlLocaleSegment:G,meta:f.renderMeta(),appId:M(GY).id,features:await M(Y$).forClient()};let{params:U8,user:C$}=_,n1={},o1={};for(let A of G1??[]){let[e,a1]=Object.entries(A)?.[0]??[];if(!e||!a1)continue;o1[`${e}:${L}`]=a1.breadcrumb,n1[e]=a1}let zZ=L===null&&this.notFound&&!W?this.notFound.static:void 0;if(zZ&&x$)n1["404"]=x$;let A$=n1.FILE;if(A$){try{await this.onRequestEnd(i,{mintSession:!1})}catch(e){ZZ.error(e?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(e)})}let A;if(A$ instanceof Response)A=e4(A$,t,s1);else{for(let e of s1)t.append("Set-Cookie",e.toString());A=await A8(A$,t)}return IG(A,L)}if(W){t.set("Content-Type","application/x-ndjson; charset=utf-8"),t.append("Vary",XY),s1.forEach((e)=>t.append("Set-Cookie",e.toString())),PY(t,L),await this.hooks.onRequestEnd(i);let A={meta:H&&!f.metadata.touched?null:_.meta,data:{[Q]:n1},breadcrumbs:o1,prefetchedData:f.serverQueries.snapshotResolved(),i18n:o0,features:_.features,is404:!L,appId:_.appId,partial:H};return new Response(QG(A,f.serverQueries,void 0,({aborted:e})=>Z3(()=>this.completeStream(i,f.serverQueries.summarize(e)))),{headers:t})}t.set("Content-Type","text/html; charset=utf-8");let p=L?R:zZ,u0=Boolean(p),W3=TY(p);if(!I&&!u0)t.append("Vary","User-Agent");if(!u0||W3.session)r4();for(let A of s1)t.append("Set-Cookie",A.toString());if(!u0||W3.csrf){let A=Bun.CSRF.generate(process.env.SECRET);t.append("Set-Cookie",`csrf_token=${A}; HttpOnly; Secure; SameSite=Strict; Expires=${new Date(Date.now()+86400000).toUTCString()}`)}try{await this.onRequestEnd(i,{mintSession:!u0||W3.session})}catch(A){ZZ.error(A?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(A)})}if(u0&&(L||!k))_G(t,p);return PY(t,L),await this.render({req:i,runInRequestScope:Z3,csrfTokenHMAC:Buffer.from(""),currentPathName:L,headers:t,i18n:o0,params:U8,pathname:J.pathname,serverQueries:f.serverQueries,userAgent:$.headers.get("user-agent"),noStream:I,noTheme:E,url:J,user:C$,viewData:n1,breadcrumbs:o1,urlLocaleSegment:G,meta:_.meta,appId:_.appId,features:_.features,isOgRequest:Y,staticView:p,refusedStatus:y??void 0})}catch(y){if(y.kind===$$){let r=W?CO(y.payload.viewData??y.payload.api):_Y(y.payload.view);for(let A1 of f.cookies)r.headers.append("Set-Cookie",A1.toString());return r}if(!i1.has(y))this.hooks.onRequestFail(i,y);if(Z$(y))return console.error(y),W?aZ():_Y(KY());if(y instanceof d1&&y.status===403)return W?aZ():_Y(KY());throw y}},Z)}}function AO($,Z){let J=$.cookies?.get(Z);return fQ(J)?J:null}function SY(){let $=JSON.stringify({error:J$("not_found","Not found",404)});return new Response($,{status:404,headers:{"Content-Type":"application/json","Content-Length":String(Buffer.byteLength($)),"Cache-Control":"no-store"}})}class RG extends C0{routes={"/api-routes":this.get(()=>{let $=M($8).flatRoutes,Z=[];for(let[J,W]of Object.entries($))for(let[Y,j]of Object.entries(W)){let{exec:z,middleware:X}=j;Z.push({path:J,method:Y,middleware:X})}return Z}),"/view-routes":this.get(()=>{let $=M(a3).flatViewRoutes,Z=[];for(let[J,{middleware:W,viewPath:Y}]of Object.entries($))Z.push({path:J,method:"GET",viewPath:Y,middleware:W});return Z})}}var SO=new Set([t1,"cookie","content-type","content-length","transfer-encoding","connection","host","user-agent","forwarded"]),EO=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,bO=/^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*$/;function RO($,Z,J,W){for(let[Y,j]of Object.entries(J.headers??{})){if(j===void 0||j===null)continue;let z=Y.toLowerCase();if(SO.has(z)||z.startsWith("x-forwarded-"))throw Error(`dispatchAs: credentials may not set the "${Y}" header. The access token stays the initiator's, and the request's framing is dispatchAs's own.`);if(W&&z==="authorization")throw Error(`dispatchAs: credentials may not set "Authorization" on a call dispatched as an identity. The caller's token is for the MCP endpoint and is never passed on.`);$.set(Y,j)}for(let[Y,j]of Object.entries(J.cookies??{})){if(j===void 0||j===null)continue;if(Y===t1)throw Error(`dispatchAs: credentials may not set the "${t1}" cookie. The access token stays the initiator's.`);if(!EO.test(Y)||!bO.test(j))throw Error(`dispatchAs: "${Y}" is not a cookie a Cookie header can carry.`);Z.push(`${Y}=${j}`)}}function fO($,Z){let J=$.body.getReader(),W=!1,Y=()=>{if(W)return;W=!0;try{Z()}catch(z){console.error(z)}},j=new ReadableStream({async pull(z){let X;try{X=await J.read()}catch(Q){Y(),z.error(Q);return}if(X.done){Y();try{z.close()}catch{}return}try{z.enqueue(X.value)}catch{}},async cancel(z){try{await J.cancel(z)}finally{Y()}}},{highWaterMark:0});return new Response(j,{status:$.status,statusText:$.statusText,headers:$.headers})}function SG($){let{status:Z=400,data:J,headers:W}=$,Y=new Headers({"Content-Type":"application/json",...W});if(!Y.has("Cache-Control"))Y.set("Cache-Control","no-store");return new Response(JSON.stringify(J),{status:Z,headers:Y})}function e4($,Z,J){let W=[];Z?.forEach((z,X)=>W.push([X,z]));let Y=[...typeof Z?.getSetCookie==="function"?Z.getSetCookie():[],...Array.from(J??[])];if(W.length===0&&Y.length===0)return $;let j=(z)=>{for(let[X,Q]of W){if(X.toLowerCase()==="set-cookie")continue;if(!z.has(X))z.set(X,Q)}for(let X of Y)z.append("Set-Cookie",X)};try{return j($.headers),$}catch{let z=new Headers($.headers);return j(z),new Response($.body,{status:$.status,statusText:$.statusText,headers:z})}}function kO(){return Bun.env.NODE_ENV==="development"}class $8{static token="router.api";flatRoutes={};onRequestStart;onRequestEnd;onRequestFail;constructor($){let Z=SQ();this.onRequestStart=$.onRequestStart??Z.onRequestStart,this.onRequestEnd=$.onRequestEnd??Z.onRequestEnd,this.onRequestFail=$.onRequestFail??Z.onRequestFail,this.flatRoutes=cW({"/":$.rootRouter,"/auth":yW,"/__gemi__/services/i18n":vW,"/__gemi__/services/image":hW,...kO()?{"/__gemi__/services/logs":pW,"/__gemi__/debug":RG}:{}})}getRouteHandlerAndParams($){let Z=new URL($.url),J=bG(Z.pathname),W={},Y;for(let[j]of Object.entries(this.flatRoutes))try{let z=new URLPattern({pathname:j});if(z.test({pathname:J})){Y=j,W=z.exec({pathname:J})?.pathname.groups;break}}catch(z){console.error(z)}return{params:W,path:Y}}async runRouteMiddleware($,Z){let W=this.flatRoutes[$][Z.rawRequest.method].middleware;try{await M(e1).runMiddleware(W)}catch(Y){if(Y.kind===$$)return SG(Y.payload.api);else{if(E$(Y))return SY();if(this.onRequestFail(Z,Y),console.error(Y),Z$(Y))return aZ();throw Y}}}async getRouteData($){let Z=this.flatRoutes[$],J=T.getStore(),W=Z[J.req.rawRequest.method].exec??(()=>Promise.resolve({})),Y={};try{Y=await W()}catch(j){if(j.kind===$$)return SG(j.payload.api);if(E$(j))return SY();if(this.onRequestFail(J.req,j),console.error(j),Z$(j))return aZ();throw j}return Y}isFrameworkRoute($){return $.startsWith("/__gemi__")}async endRequest($,Z,J){let W=async()=>{try{if(!this.isFrameworkRoute(J))await this.onRequestEnd(Z)}catch(Y){ZZ.error(Y?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(Y)})}finally{$.destroy()}};if(!$.hasPendingWork()){await W();return}$.whenIdle().then(W).catch((Y)=>{console.error(Y)})}isOpenEndedBody($,Z){return $.method!=="HEAD"&&!Z.headers.has("Content-Length")&&Z.body!==null}async handleApiRequest($,Z){let{params:J,path:W}=this.getRouteHandlerAndParams($),Y=this.flatRoutes[W];if(!Y||!Y[$.method])return new Response(JSON.stringify({error:J$("not_found","Not found",404)}),{status:404});let j=new C($,J,"api",W);if(!this.isFrameworkRoute(W))this.onRequestStart(j);return await T.run(j,async()=>{let z=T.getStore(),X=!1,Q=async()=>{X=!0,await this.endRequest(z,j,W)};try{let G=M(c);if(G.isEnabled){let U=G.detectLocale(j);z.setLocale(U)}z.setRequest(j),M(e1).applyDefaultBodyLimit($);let B=await this.runRouteMiddleware(W,j);if(B instanceof Response){let U=e4(B,z.headers,z.cookies);return await Q(),U}let F=await this.getRouteData(W),K=z.headers,V=z.cookies;if(F instanceof Response){let U=e4(F,K,V);if(this.isOpenEndedBody($,U)){let O=fO(U,()=>this.endRequest(z,j,W));return X=!0,O}return await Q(),U}let D=(r1(F)?F:K1.json(F)).toResponse(K,V);return await Q(),D}catch(G){if(!X)try{await Q()}catch(B){console.error(B)}throw G}},Z)}async dispatchAs($,Z,J,W,Y){let j=new URL($.rawRequest.url).origin,z=new URL(`${j}/api${J}`),X=`/api${J.split(/[?#]/)[0]}`;if(!J.startsWith("/")||z.origin!==j||z.pathname!==X||z.hash!==""||z.pathname.startsWith("/api/__gemi__")||z.pathname==="/api/auth"||z.pathname.startsWith("/api/auth/"))throw Error(`dispatchAs: "${J}" is not an app api path. Pass the route's own path, without "/api", with every param encoded.`);let Q=Y?.identity;if(Q!==void 0&&(typeof Q!=="object"||!Q?.user))throw Error("dispatchAs: identity needs the user to dispatch as.");let G=new Headers,B=[],F=Q?null:$.cookies.get(t1);if(F)B.push(`${t1}=${F}`);if(Y?.credentials)RO(G,B,Y.credentials,Q!==void 0);if(B.length>0)G.set("Cookie",B.join("; "));let K=Q?null:$.headers.get(t1);if(K)G.set(t1,K);let V=$.headers.get("User-Agent");if(V)G.set("User-Agent",V);let D;if(W instanceof FormData)D=W;else if(W!==void 0)G.set("Content-Type","application/json"),D=JSON.stringify(W);let U=new Request(z,{method:Z,headers:G,body:D,...Y?.signal?{signal:Y.signal}:{}});if(EG(U,FZ($),Q?.grant,Y?.progress),$.domain)tZ(U,$.domain);let O=Q?{user:Q.user}:void 0;return T.exit(()=>X6.exit(()=>this.handleApiRequest(U,O)))}}import{timingSafeEqual as wO}from"crypto";var W8="",RY="*",qO=60000,yO=1e4,Z8=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,J8=16,EY=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,bY="x-forwarded-host";function kG($){return $.startsWith(":")}function r3($,Z){if($===null)return!1;let J=Buffer.from($,"utf8"),W=Buffer.from(Z,"utf8");return J.length===W.length&&wO(J,W)}function vO($){if(!$)return[];if($===!0)return[{header:bY,clientIpHeader:null,secret:null}];let Z=Array.isArray($)?$:[$],J=Array.isArray($)?null:bY;return Z.map((W)=>({header:W.hostHeader?.toLowerCase()??J,clientIpHeader:W.clientIpHeader?.toLowerCase()??null,secret:W.secret?{header:W.secret.header.toLowerCase(),value:W.secret.value}:null}))}function gO($){if(!$||$===!0)return;if(!Array.isArray($)){fG($,"route.domains.trustProxy",bY);return}if($.length===0)throw Error("`route.domains.trustProxy` is an empty list. List at least one proxy, or leave `trustProxy` out.");let Z=new Map;$.forEach((J,W)=>{let Y=`route.domains.trustProxy[${W}]`;if(typeof J!=="object"||J===null||Array.isArray(J))throw Error(`\`${Y}\` must be an object: { hostHeader?, clientIpHeader?, secret }. \`true\` is only accepted on its own.`);if(!J.secret)throw Error(`\`${Y}.secret\` is required: in a list, each proxy proves itself with a secret of its own.`);if(J.hostHeader===void 0&&J.clientIpHeader===void 0)throw Error(`\`${Y}\` names neither \`hostHeader\` nor \`clientIpHeader\`, so it would trust nothing.`);fG(J,Y,null);let j=Z.get(J.secret.value);if(j!==void 0)throw Error(`\`${Y}.secret.value\` is the same as \`route.domains.trustProxy[${j}].secret.value\`. Give each proxy a secret of its own.`);Z.set(J.secret.value,W)})}function fG($,Z,J){let{hostHeader:W,clientIpHeader:Y,secret:j}=$;if(W!==void 0&&(typeof W!=="string"||!EY.test(W)))throw Error(`\`${Z}.hostHeader\` must be a single header name, e.g. "x-forwarded-host". Got ${JSON.stringify(W)}.`);let z=(W??J)?.toLowerCase()??null;if(Y!==void 0){if(typeof Y!=="string"||!EY.test(Y))throw Error(`\`${Z}.clientIpHeader\` must be a single header name, e.g. "x-client-ip". Got ${JSON.stringify(Y)}.`);if(!j)throw Error(`\`${Z}.clientIpHeader\` needs \`secret\`: without proof the proxy sent it, any client that reaches the app directly picks its own address.`);if(Y.toLowerCase()===z)throw Error(`\`${Z}.clientIpHeader\` names the same header as \`hostHeader\`.`);if(typeof j.header==="string"&&Y.toLowerCase()===j.header.toLowerCase())throw Error(`\`${Z}.clientIpHeader\` names the same header as \`secret.header\`.`)}if(!j)return;if(typeof j.header!=="string"||!EY.test(j.header))throw Error(`\`${Z}.secret.header\` must be a header name. Got "${j.header}".`);if(j.header.toLowerCase()===z)throw Error(`\`${Z}.secret.header\` names the same header as \`hostHeader\`; the secret needs a header of its own.`);if(typeof j.value!=="string"||j.value.length<J8)throw Error(`\`${Z}.secret.value\` must be at least ${J8} characters. A guessable one lets any client name its own host.`)}function _1($){if(!$)return null;try{return new URL(`http://${$.trim()}`).hostname.toLowerCase().replace(/\.$/,"")||null}catch{return null}}function mO($){try{let Z=new URL(`http://${$.trim()}`),J=Z.hostname.toLowerCase().replace(/\.$/,"");return J?Z.port?`${J}:${Z.port}`:J:null}catch{return null}}function wG($){if($===void 0)return[];if($===!0)return!0;if(!Array.isArray($))throw Error(`\`route.domains.devHosts\` must be a list of hostnames (or \`true\`). Got ${JSON.stringify($)}.`);return $.map((Z,J)=>{let W=typeof Z==="string"?Z.trim().toLowerCase():"",Y=W.startsWith(".")?W.slice(1):W;if(!Y||!Y.split(".").every((j)=>Z8.test(j)))throw Error(`\`route.domains.devHosts[${J}]\` must be a bare hostname, e.g. "app.acme.test", or ".acme.test" for the domain and its subdomains \u2014 no scheme, port, path or "*". Got ${JSON.stringify(Z)}.`);return W})}function hO($){let Z=_1($.root),J=$.root?.trim().toLowerCase().replace(/\.$/,"");if(!Z||Z!==J||!Z.split(".").every((j)=>Z8.test(j)))throw Error(`\`route.domains.root\` must be a bare hostname, e.g. "example.com" \u2014 no scheme, port or path. Got "${$.root}".`);if($.custom&&($.custom.cacheTtlMs??0)<0)throw Error(`\`route.domains.custom.cacheTtlMs\` is ${$.custom.cacheTtlMs}; it cannot be negative. Use 0 to disable the cache.`);if($.ask&&$.ask.secret.length<J8)throw Error(`\`route.domains.ask.secret\` must be at least ${J8} characters. A guessable one is worse than leaving \`ask\` out.`);gO($.trustProxy),wG($.devHosts);let W=new Set,Y=null;for(let j of $.groups??[]){let{subdomain:z}=j;if(W.has(z))throw Error(`\`route.domains\` declares the subdomain "${z}" twice.`);if(W.add(z),kG(z)){if(!/^:[A-Za-z_][A-Za-z0-9_]*$/.test(z))throw Error(`"${z}" is not a valid param subdomain. It must be a single \`:name\` label.`);if(Y)throw Error(`\`route.domains\` declares two param subdomains, "${Y.subdomain}" and "${z}"; a host could match either.`);Y=j;continue}if(j.exists)throw Error(`The subdomain "${z}" is fixed, so \`exists\` has no param to check. It only applies to a \`:param\` subdomain.`);if(!z.split(".").every((X)=>Z8.test(X)))throw Error(`"${z}" is not a valid subdomain.`)}if($.custom&&!W.has($.custom.group))throw Error(`\`route.domains.custom.group\` is "${$.custom.group}", but no group declares that subdomain.`);if($.ask&&Y&&!Y.exists)throw Error(`\`route.domains.ask\` is set, so "${Y.subdomain}" needs an \`exists\` to say which tenants are real. Without one every host under the root would be approved for a certificate.`)}class fY{root;devHosts;hostTrusts;fixed=new Map;param=null;custom;cacheTtlMs;cache=new Map;inFlight=new Map;askSecret;proxySecretHeaders;constructor($){hO($),this.root=_1($.root),this.devHosts=wG($.devHosts),this.hostTrusts=vO($.trustProxy);for(let Z of $.groups??[])if(kG(Z.subdomain))this.param={...Z,name:Z.subdomain.slice(1)};else this.fixed.set(Z.subdomain.toLowerCase(),Z);this.custom=$.custom??null,this.cacheTtlMs=this.custom?.cacheTtlMs??qO,this.askSecret=$.ask?.secret??null,this.proxySecretHeaders=Array.from(new Set(this.hostTrusts.flatMap((Z)=>Z.secret?[Z.secret.header]:[])))}trustOf($){let Z=null;for(let J of this.hostTrusts)if((!J.secret||r3($.headers.get(J.secret.header),J.secret.value))&&!Z)Z=J;return Z}forwardedHost($){let Z=this.trustOf($)?.header;if(!Z)return null;return $.headers.get(Z)?.split(",")[0]?.trim()||null}trustedClientIp($){let Z=this.trustOf($);if(!Z?.clientIpHeader||!Z.secret)return null;let J=$.headers.get(Z.clientIpHeader)?.split(",")[0];return J===void 0?null:R$(J)}applyClientIp($){let Z=this.trustedClientIp($);if(!Z)return;$.headers.set("x-forwarded-for",Z),$.headers.delete("x-real-ip")}hostOf($){return _1(this.forwardedHost($))??_1(new URL($.url).host)}publicOrigin($){let Z=new URL($.url),J=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim(),W=J==="http"||J==="https"?J:Z.protocol.replace(/:$/,""),Y=this.forwardedHost($),j=Y&&_1(Y)?mO(Y):null;return`${W}://${j??Z.host}`}async resolve($){let Z=this.hostOf($);if(!Z)return null;let J=await this.match(Z,$);if(J)return J;if(this.custom?.fallback&&!this.isUnderRoot(Z))return{host:Z,group:RY,params:{},custom:!0};return null}async allows($,Z){let J=_1($);return J?await this.match(J,Z)!==null:!1}isUnderRoot($){return $===this.root||$.endsWith(`.${this.root}`)}async match($,Z){if($===this.root)return{host:$,group:W8,params:{},custom:!1};if($.endsWith(`.${this.root}`)){let W=$.slice(0,-(this.root.length+1)),Y=this.fixed.get(W);if(Y)return{host:$,group:Y.subdomain,params:{},custom:!1};if(this.param&&Z8.test(W)){let j={[this.param.name]:W};if(this.param.exists&&!await this.param.exists(j,Z))return null;return{host:$,group:this.param.subdomain,params:j,custom:!1}}return null}if(!this.custom)return null;let J=await this.resolveCustom($);return J?{host:$,group:this.custom.group,params:J,custom:!0}:null}async resolveCustom($){let Z=Date.now(),J=this.cache.get($);if(J&&J.expiresAt>Z)return this.cache.delete($),this.cache.set($,J),J.value;let W=this.inFlight.get($);if(W)return W;let Y=(async()=>await this.custom.resolve($)??null)();this.inFlight.set($,Y);let j;try{j=await Y}finally{this.inFlight.delete($)}if(this.cacheTtlMs>0){if(this.cache.size>=yO)this.cache.delete(this.cache.keys().next().value);this.cache.delete($),this.cache.set($,{value:j,expiresAt:Date.now()+this.cacheTtlMs})}return j}forget($){if($===void 0)this.cache.clear();else{let Z=_1($);if(Z)this.cache.delete(Z)}}}var pO={kind:"none"};function ax($){let Z=($??"").trim().toLowerCase();if(Z===""||Z==="false"||Z==="off"||Z==="0")return pO;if(Z==="true")return{kind:"all"};if(/^[1-9]\d*$/.test(Z))return{kind:"hops",hops:Number(Z)};throw Error(`GEMI_TRUST_PROXY must be "false", "true" or the number of proxies in front of the app (e.g. 1). Got ${JSON.stringify($)}.`)}function rx($,Z,J){if(J.kind==="all"){if(!$.get("x-forwarded-for")&&Z)$.set("x-forwarded-for",Z);return}$.delete("x-real-ip");let W=Z;if(J.kind==="hops"){let Y=($.get("x-forwarded-for")??"").split(",").map((X)=>X.trim()).filter(Boolean),j=Y.length-J.hops,z=j>=0?Y[j]:Y[0];W=(z===void 0?null:R$(z))??Z}if(W)$.set("x-forwarded-for",W);else $.delete("x-forwarded-for")}var qG=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,yG=16;function tx($){let Z=$.GEMI_CLIENT_IP_HEADER?.trim()??"",J=$.GEMI_PROXY_SECRET_HEADER?.trim()??"",W=$.GEMI_PROXY_SECRET??"";if(Z===""&&J===""&&W==="")return null;if(Z===""||J===""||W==="")throw Error("GEMI_CLIENT_IP_HEADER, GEMI_PROXY_SECRET_HEADER and GEMI_PROXY_SECRET go together: the client-IP header is only believed on a request that carries the proxy's secret. Set all three, or none.");if(!qG.test(Z))throw Error(`GEMI_CLIENT_IP_HEADER must be a single header name, e.g. "x-azure-clientip". Got ${JSON.stringify(Z)}.`);if(!qG.test(J))throw Error(`GEMI_PROXY_SECRET_HEADER must be a single header name, e.g. "x-azure-fdid". Got ${JSON.stringify(J)}.`);if(Z.toLowerCase()===J.toLowerCase())throw Error("GEMI_CLIENT_IP_HEADER and GEMI_PROXY_SECRET_HEADER name the same header.");if(W.length<yG)throw Error(`GEMI_PROXY_SECRET must be at least ${yG} characters. A guessable one lets any client name its own address.`);return{header:Z.toLowerCase(),secretHeader:J.toLowerCase(),secret:W}}function vG($,Z){if(!r3($.get(Z.secretHeader),Z.secret))return null;let J=$.get(Z.header)?.split(",")[0];return J===void 0?null:R$(J)}var cO="/__gemi__/domains/ask";class Q1{static token="router.domains";resolver;acceptsCustomDomains;clientIpTrust;groups=new Map;staticFilesVary=!1;constructor($,Z){this.groups.set(W8,$),this.clientIpTrust=Z.clientIpTrust??null;let{domains:J}=Z;if(this.acceptsCustomDomains=Boolean(J?.custom),!J){this.resolver=null;return}this.resolver=new fY(J);let W=(Y)=>({api:Y.api?new $8({...Z.api,...Y.api}):$.api,view:Y.view?new a3({...Z.view,...Y.view},Z.auth):$.view});for(let Y of J.groups??[])this.groups.set(Y.subdomain,W(Y));if(J.custom?.fallback)this.groups.set(RY,W(J.custom.fallback));this.staticFilesVary=this.viewDispatchers().some((Y)=>Y.publicFiles!==$.view.publicFiles||Y.assetRoutes!==$.view.assetRoutes)}async staticFiles($){let Z=(this.staticFilesVary?await this.route($):null)?.view??this.dispatchers(null).view;return{publicFiles:Z.publicFiles,assetRoutes:Z.assetRoutes}}applyClientIp($){let Z=this.clientIpTrust;if(Z)kY($,Z.secretHeader);let J=this.resolver?.trustedClientIp($)??(Z?vG($.headers,Z):null);if(!J)return;$.headers.set("x-forwarded-for",J),$.headers.delete("x-real-ip")}async route($){if(!this.resolver)return this.dispatchers(null);for(let J of this.resolver.proxySecretHeaders)kY($,J);let Z=a4($)??await this.resolver.resolve($);if(!Z)return null;return tZ($,Z),this.dispatchers(Z)}async ask($){if(!this.resolver?.askSecret||$.method!=="GET")return null;let Z=new URL($.url);if(Z.pathname!==cO)return null;if(!r3(Z.searchParams.get("secret"),this.resolver.askSecret))return null;let J=Z.searchParams.get("domain"),W=J?await this.resolver.allows(J,$):!1;return new Response(null,{status:W?200:404})}dispatchers($){return this.groups.get($?.group??W8)}viewDispatchers(){return Array.from(new Set(Array.from(this.groups.values(),($)=>$.view)))}viewGroups(){let $=new Set,Z=[];for(let[J,W]of this.groups){if($.has(W.view))continue;$.add(W.view),Z.push({group:J,view:W.view})}return Z}}function eZ($){let Z=new Date($??0).getTime();return Number.isFinite(Z)?Z:0}var gG=600000;function mG($,Z){return[L6($,Z),L6($,Z-1)]}class b{static token="auth";config;provider;constructor($={},Z=new Z7){Aj($.oauthProviders),this.config={...P1(Sj($),$),emailCode:o8($.emailCode)},this.provider=Z}async oauthProvider($){return await MZ(this.config.oauthProviders,$)}async oauthProviderNames(){return await cj(this.config.oauthProviders)}get userProvider(){return this.provider}accessTokenCookieOptions($,Z){return{expires:Z,secure:this.publicOrigin($).startsWith("https://"),httpOnly:!0,domain:this.cookieDomain($)}}publicOrigin($){let Z=M().bound(Q1)?M(Q1).resolver:null;return Z?Z.publicOrigin($.rawRequest):new URL($.rawRequest.url).origin}cookieDomain($){let Z=this.config.cookieDomain;if(!Z)return;let J=Z==="root"?M(Q1).resolver?.root:_1(Z);if(!J)throw Error('`auth.cookieDomain` is "root", but `route.domains` is not configured.');let W=$.domain?.host??_1(new URL($.rawRequest.url).host);return W===J||W?.endsWith(`.${J}`)?J:void 0}async getSession($,Z){if(!$)return null;if(!d8($))return this.config.migrateLegacySession?this.convertLegacySession($,Z,this.config.migrateLegacySession):null;let J=await this.userProvider.findSession({token:$,userAgent:Z});if(!J?.user)return null;let W=Date.now(),Y=eZ(J.expiresAt),j=eZ(J.absoluteExpiresAt);if(Y<=W||j<=W)return await this.userProvider.deleteSession({token:$}),null;let X=await this.slideSession(J,W);return X.user.extension=await this.config.extendSession(X.user),X}async convertLegacySession($,Z,J){let W=T.getStore()?.req;if(!W)return null;let Y=Date.now(),j=Math.floor(Y/gG),z=null,X=await this.userProvider.findSession({token:$,userAgent:Z});if(X?.user){if(!await J(X,{token:$,req:W,userAgent:Z}))return null;let G=L6($,j),B=X.user.id;if(await this.userProvider.withLegacySessionLock($,async()=>{if(!await this.userProvider.claimLegacySession({token:$}))return!1;return await this.userProvider.createSessionV2({token:G,userId:B,userAgent:Z,...this.freshLifetime(Y)}),!0}))z=G}if(!z){for(let G of mG($,j))if((await this.userProvider.findSession({token:G,userAgent:Z}))?.user){z=G;break}}if(!z)return null;let Q=await this.getSession(z,Z);if(Q)W.ctx().setCookie("access_token",z,this.accessTokenCookieOptions(W,new Date(Q.expiresAt)));return Q}async revokeSession($,Z){if(!$)return await this.userProvider.deleteSession({token:$}),null;if(d8($)||!this.config.migrateLegacySession){let Y=await this.userProvider.findSession({token:$,userAgent:Z});return await this.userProvider.deleteSession({token:$}),Y}let J=Math.floor(Date.now()/gG),W=mG($,J);return this.userProvider.withLegacySessionLock($,async()=>{let Y=await this.userProvider.findSession({token:$,userAgent:Z});for(let j of W){if(Y?.user)break;Y=await this.userProvider.findSession({token:j,userAgent:Z})}await this.userProvider.deleteSession({token:$});for(let j of W)await this.userProvider.deleteSession({token:j});return Y})}requestCarryingCookie($){let Z=T.getStore()?.req;return Z?.cookies.get("access_token")===$?Z:null}async slideSession($,Z){let J=this.config.sessionExpiresInHours*3600000;if(new Date($.expiresAt).getTime()-Z>=J/2)return $;let W=new Date(Math.min(Z+J,new Date($.absoluteExpiresAt).getTime())),Y=await this.userProvider.updateSession({token:$.token,expiresAt:W}),j=this.requestCarryingCookie($.token);if(j)j.ctx().setCookie("access_token",$.token,this.accessTokenCookieOptions(j,W));if(!Y)return $;return{...$,expiresAt:Y.expiresAt??W}}freshLifetime($){return{expiresAt:new Date($+this.config.sessionExpiresInHours*3600000),absoluteExpiresAt:new Date($+this.config.sessionAbsoluteExpiresInHours*3600000)}}async generateMagicLink($){}async upsertSession($){await this.userProvider.findSession({token:"",userAgent:""})}async authenticate($){try{let Z=await this.userProvider.findUserByEmailAddress($,!1);if(!Z)throw Error(`User not found with email: ${$}`);let J=await this.createOrUpdateSession({email:$,id:Z.id}),W=new C;if(W.ctx().setCookie("access_token",J.token,this.accessTokenCookieOptions(W,J.expiresAt)),J?.user)J.user.extension=await this.config.extendSession(J.user);return J}catch(Z){console.log(Z)}}async createOrUpdateSessionV2($){let Z=await this.createOrUpdateSession($),J=null;if(Z?.user)J=await this.config.extendSession(Z.user),Z.user.extension=J;return Z}async createOrUpdateSession($){let Z=new C,J=$.id??(await this.userProvider.findUserByEmailAddress($.email,!1))?.id;if(!J)throw new b$;let W=Bun.env.NODE_ENV==="development"?"local":Z.headers.get("User-Agent"),Y=Dj(J),j=await this.userProvider.createSessionV2({token:Y,userId:J,userAgent:W,...this.freshLifetime(Date.now())}),z=await this.userProvider.findSession({token:Y,userAgent:W??""});return z?.user?z:j}async createMagicLinkToken($){let Z=await this.userProvider.findUserByEmailAddress($,!1);if(Z){let{pin:J,token:W}=await this.issueOneTimeCode($,6);return{user:Z,email:$,pin:J,token:W}}return{}}async issueOneTimeCode($,Z){let{activeCodes:J,expiresInMinutes:W,linkExpiresInMinutes:Y}=this.config.emailCode,j=await this.config.generateMagicLinkToken($),z=await this.config.generateCode($),X=typeof z==="string"&&z!==""?z:Nj(Z),Q=M6("link",$,j),G=M6("pin",$,X);if(J===1)await this.userProvider.deleteMagicLinkToken($);else{let B=Math.max(W,Y)*60000,K=(await this.userProvider.listMagicLinkTokensByEmail($,J-1)).filter((V)=>eZ(V.createdAt)+B>Date.now()&&V.pin!==G&&V.token!==Q);await this.userProvider.deleteMagicLinkTokensExcept($,K.map((V)=>V.id))}return await this.userProvider.createMagicLinkToken({email:$,token:Q,pin:G}),{email:$,pin:X,token:j}}async oneTimeCodeRows($){let{activeCodes:Z}=this.config.emailCode;if(Z===1){let J=await this.userProvider.findMagicLinkTokenByEmail($);return J?[J]:[]}return await this.userProvider.listMagicLinkTokensByEmail($,Z)}async claimOneTimeCode($,Z){if(!await this.userProvider.claimMagicLinkToken(Z))return!1;if(this.config.emailCode.activeCodes>1)await this.userProvider.deleteMagicLinkToken($);return!0}async verifyOneTimeCode($,Z,J={}){let{expiresInMinutes:W,maxAttempts:Y}=this.config.emailCode,j=await this.oneTimeCodeRows($);if(j.length===0)return OZ("pin",$,null,Z),{status:"invalid"};let z=j.filter((G)=>eZ(G.createdAt)+W*60000>Date.now());if(z.length===0)return OZ("pin",$,null,Z),{status:"expired"};let X=!0;for(let G of z)if(!await xj(G.id,eZ(G.createdAt),Y,W))X=!1;if(!X){if(this.config.emailCode.activeCodes===1)await this.userProvider.claimMagicLinkToken(z[0].id);else await this.userProvider.deleteMagicLinkToken($);return{status:"too_many_attempts"}}let Q=null;for(let G of z)if(OZ("pin",$,G.pin,Z))Q??=G;if(!Q)return{status:"invalid"};if(J.claim!==!1&&!await this.claimOneTimeCode($,Q.id))return{status:"invalid"};return{status:"ok",row:Q}}async verifyMagicLinkToken($,Z){let J=await this.oneTimeCodeRows($);if(J.length===0)return OZ("link",$,void 0,Z),!1;let W=null;for(let j of J)if(OZ("link",$,j.token,Z))W??=j;if(!W)return!1;if(eZ(W.createdAt)+this.config.emailCode.linkExpiresInMinutes*60000<=Date.now())return!1;return await this.claimOneTimeCode($,W.id)}}class q0 extends m{static getFacadeAccessor(){return b}static async user(){let $=await q0.userOrNull();if($)return $;throw new b$({redirectTo:G6(T.getStore()?.req,this.getFacadeRoot().config.signInPath)})}static async userOrNull(){let $=T.getStore();if($?.user)return $.user;let Z=await Y6(this.getFacadeRoot(),$?.req);if(Z)$?.setUser(Z);return Z}static intendedUrl($){let Z=T.getStore()?.req;return F1(Z?.search.get(B1),$??this.getFacadeRoot().config.redirectPath)}static async guard($){let Z=await q0.user();if(!await $(Z))throw new VZ}static async guardSafe($){let Z=await q0.user();try{return await $(Z)}catch(J){return!1}}static async authenticate($){return await this.getFacadeRoot().authenticate($)}static async oauthProviders(){return await this.getFacadeRoot().oauthProviderNames()}static async createMagicLink($){return await this.getFacadeRoot().createMagicLinkToken($)}}class Y8{static ensure($,Z={}){let J=T.getStore();if(J.req.kind==="api")throw Error("Query.prefetch() cannot be called from an API request");return J.serverQueries??=new oZ(s3(J.req.rawRequest)),J.serverQueries.ensure($,Z,"prefetch")}static async instant($,...Z){let J=Y8.ensure($,Z[0]);if(await J.promise,J.status==="rejected")throw J.error;return J.data}static prefetch($,...Z){Y8.ensure($,Z[0])}static noPrefetch(){let $=T.getStore();if($.req.kind==="api")throw Error("Query.noPrefetch() cannot be called from an API request");$.serverQueries??=new oZ(s3($.req.rawRequest)),$.serverQueries.muteDiscoveryHints()}}function dO($){return(Array.isArray($)?$:String($).split("/")).map((J)=>encodeURIComponent(String(J))).join("/")}function wY($,Z={}){let J=$.replace(/\/:(\w+)([*?]?)/g,(W,Y,j)=>{let z=Object.hasOwn(Z,Y)?Z[Y]:void 0;if(z===void 0||z===""){if(j)return"";throw Error(`\`${$}\` needs a value for :${Y}.`)}return`/${j==="*"?dO(z):encodeURIComponent(String(z))}`});return`${j8}${J==="/"?"":J}`||j8}var hG=new Map;function pG($,Z){let J=hG.get($);if(!J)J=new URLPattern({pathname:`${j8}${$==="/"?"":$}`}),hG.set($,J);let W;try{W=new URL(Z,"http://localhost").pathname}catch{return null}let Y=J.exec({pathname:W})?.pathname.groups;if(!Y)return null;let j={};for(let[z,X]of Object.entries(Y)){if(X===void 0)continue;try{j[z]=decodeURIComponent(X)}catch{return null}}return j}function cG($,Z,J="/"){let W=new URL($.origin),Y=Z.host?Z.host:Z.subdomain?`${Z.subdomain}.${$.root}`:$.root,j=new URL(J.startsWith("/")?J:`/${J}`,W),z=uO(Y);if(!z)throw Error(`"${Y}" is not a hostname, so there is no URL for it. Give a bare host, optionally with a port \u2014 no scheme, path or credentials.`);if(j.hostname=z.hostname,z.port)j.port=z.port;return j.toString()}function uO($){try{let Z=new URL(`http://${$.trim()}`);return Z.host===$.trim().toLowerCase()&&Z.pathname==="/"?{hostname:Z.hostname,port:Z.port}:null}catch{return null}}class dG{static origin($){return qY($)}static absolute($,...Z){return`${t$()}${D0(String($),Z[0]??{})}`}static relative($,...Z){return D0(String($),Z[0]??{})}static forDomain($,Z,...J){let W=M(Q1).resolver;if(!W)throw Error("`Url.forDomain` needs `route.domains` to be configured.");let Y=T.getStore()?.req?.rawRequest,j=Y?W.publicOrigin(Y):t$();if(!j)throw Error("`Url.forDomain` outside a request needs `HOST_NAME` (or `APP_URL`) for the protocol.");return cG({root:W.root,origin:j},$,D0(String(Z),J[0]??{}))}static api($,...Z){return wY(String($),Z[0]??{})}static apiAbsolute($,...Z){return`${qY()}${wY(String($),Z[0]??{})}`}static matchApi($,Z){return pG(String($),Z)}}class uG{name="Meta";static description($){T.getStore().metadata.description($)}static title($){T.getStore().metadata.title($)}static openGraph($){T.getStore().metadata.openGraph($)}static htmlAttributes($){T.getStore().metadata.htmlAttributes($)}static canonical($){T.getStore().metadata.canonical($)}static alternates($){T.getStore().metadata.alternates($)}static tags($){T.getStore().metadata.tags($)}static robots($){T.getStore().metadata.robots($)}static translate($=!0){T.getStore().metadata.translate($)}static fonts($){T.getStore().metadata.fonts($)}}var lO={set($,Z,J){T.getStore().setCookie($,Z,J)},setIfAbsent($,Z,J){if(T.getStore().req.cookies.has($))return!1;return T.getStore().setCookie($,Z,J),!0},delete($,Z){T.getStore().deleteCookie($,Z)}};class l1 extends m{static getFacadeAccessor(){return JZ}static get client(){return this.getFacadeRoot().client}static get($){return l1.client.get($)}static set($,Z){return l1.client.set($,Z)}static del(...$){return l1.client.del(...$)}static exists($){return l1.client.exists($)}static incr($){return l1.client.incr($)}static expire($,Z){return l1.client.expire($,Z)}static ttl($){return l1.client.ttl($)}}function oC($){return $}function lG(){return{store:"memory",ttl:null}}class yY{entries=new Map;maxEntries;now;constructor($={}){let Z=$.maxEntries??1e4;if(!Number.isInteger(Z)||Z<1)throw TypeError(`MemoryCacheStore maxEntries is a whole number of 1 or more; got ${Z}.`);this.maxEntries=Z,this.now=$.now??Date.now}get size(){return this.entries.size}async get($){let Z=this.live($);if(!Z)return null;return this.entries.delete($),this.entries.set($,Z),Z.value}async set($,Z,J){this.entries.delete($),this.entries.set($,{value:Z,expiresAt:J===null?null:this.now()+J});while(this.entries.size>this.maxEntries)this.entries.delete(this.entries.keys().next().value)}async delete($){let Z=this.live($)!==void 0;return this.entries.delete($),Z}async flush(){this.entries.clear()}live($){let Z=this.entries.get($);if(!Z)return;if(Z.expiresAt!==null&&Z.expiresAt<=this.now()){this.entries.delete($);return}return Z}}var iO="500";class vY{prefix;injectedClient;constructor($={}){this.injectedClient=$.client,this.prefix=$.prefix??"gemi:cache:"}async get($){let Z=await this.client.send("GET",[this.prefix+$]);return Z===null||Z===void 0?null:String(Z)}async set($,Z,J){let W=[this.prefix+$,Z];if(J!==null)W.push("PX",String(Math.max(1,Math.round(J))));await this.client.send("SET",W)}async delete($){return Number(await this.client.send("DEL",[this.prefix+$]))>0}async flush(){if(this.prefix==="")throw Error("RedisCacheStore refuses to flush with an empty prefix: that would delete every key in the database.");let $=this.client,Z=`${sO(this.prefix)}*`,J="0";do{let W=await $.send("SCAN",[J,"MATCH",Z,"COUNT",iO]),[Y,j]=Array.isArray(W)?W:["0",[]];if(J=String(Y),Array.isArray(j)&&j.length>0)await $.send("UNLINK",j.map(String))}while(J!=="0")}get client(){if(this.injectedClient)return this.injectedClient;let $=M(),Z=$.bound(JZ)?$.make(JZ).client:void 0;if(!Z)throw Error("RedisCacheStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisCacheStore({ client }).");return Z}}function sO($){return $.replace(/[*?[\]\\^-]/g,(Z)=>`\\${Z}`)}var nO="k:",iG="tag:",oO="t:";class gY{async get($){let Z=await this.manager.read(await this.storeKey($));return Z.found?Z.value:void 0}async has($){return(await this.manager.read(await this.storeKey($))).found}async set($,Z,J){await this.manager.write(await this.storeKey($),Z,J)}async delete($){return this.manager.store.delete(await this.storeKey($))}async pull($){let Z=await this.storeKey($),J=await this.manager.read(Z);if(!J.found)return;return await this.manager.store.delete(Z),J.value}async remember($,Z,J){let[W,Y]=typeof Z==="function"?[void 0,Z]:[Z,J];if(typeof Y!=="function")throw TypeError("Cache.remember needs a function that computes the value.");return this.manager.rememberAt(await this.storeKey($),W,Y)}}class mY extends gY{options;static token="cache";config;builtStore;inflight=new Map;constructor($={},Z={}){super();this.options=Z;if(this.config=P1(lG(),$),this.config.ttl!==null&&this.config.ttl!==void 0)WZ(this.config.ttl)}get manager(){return this}get store(){return this.builtStore??=this.buildStore()}tags(...$){let Z=[...new Set($.flat())].sort();if(Z.length===0)throw TypeError("Cache.tags needs at least one tag.");for(let J of Z)if(typeof J!=="string"||J==="")throw TypeError(`A cache tag is a non-empty string; got ${JSON.stringify(J)}.`);return new nG(this,Z)}async flush(){await this.store.flush()}async storeKey($){return nO+oG($)}async read($){let Z=await this.store.get($);if(Z===null)return{found:!1};try{return{found:!0,value:JSON.parse(Z)}}catch{return{found:!1}}}async write($,Z,J){if(Z===void 0)throw TypeError("Cache.set cannot store undefined: get() returns undefined for a miss. Store null instead.");let W=this.ttlMs(J);if(W===0){await this.store.delete($);return}let Y=JSON.stringify(Z);if(Y===void 0)throw TypeError(`Cache.set cannot store a ${typeof Z}: it has no JSON form.`);await this.store.set($,Y,W)}async rememberAt($,Z,J){let W=await this.read($);if(W.found)return W.value;let Y=this.inflight.get($);if(Y)return Y;let j=(async()=>{try{let z=await J();if(z!==void 0)await this.write($,z,Z);return z}finally{this.inflight.delete($)}})();return this.inflight.set($,j),j}async tagVersions($){return Promise.all($.map(async(Z)=>{let J=iG+Z,W=await this.store.get(J);if(W!==null)return W;let Y=sG();return await this.store.set(J,Y,null),Y}))}async flushTags($){await Promise.all($.map((Z)=>this.store.set(iG+Z,sG(),null)))}ttlMs($){let Z=$===void 0?this.config.ttl:$;return Z===null||Z===void 0?null:WZ(Z)}buildStore(){let{store:$}=this.config;if($===void 0||$==="memory")return new yY(this.config.memory);if($==="redis"){let Z=this.options.application;return new vY({...this.config.redis,client:Z?{send:(J,W)=>Z.make(JZ).client.send(J,W)}:void 0})}if(typeof $==="function"){let Z=this.options.application;if(!Z)throw Error("A cache store factory needs the application: build CacheManager with { application }.");return $(Z)}if($&&typeof $==="object")return $;throw Error(`Unknown cache store ${JSON.stringify($)} in app/config/cache.ts: use "memory", "redis", a CacheStore, or a function returning one.`)}}class nG extends gY{manager;tagNames;constructor($,Z){super();this.manager=$;this.tagNames=Z}async flush(){await this.manager.flushTags([...this.tagNames])}async storeKey($){oG($);let Z=await this.manager.tagVersions([...this.tagNames]);return`${oO}${Z.join(",")}:${$}`}}function oG($){if(typeof $!=="string"||$==="")throw TypeError(`A cache key is a non-empty string; got ${JSON.stringify($)}.`);return $}function sG(){let $=new Uint8Array(9);return crypto.getRandomValues($),Array.from($,(Z)=>Z.toString(16).padStart(2,"0")).join("")}class aG extends m{static getFacadeAccessor(){return mY}static get($){return this.getFacadeRoot().get($)}static has($){return this.getFacadeRoot().has($)}static set($,Z,J){return this.getFacadeRoot().set($,Z,J)}static delete($){return this.getFacadeRoot().delete($)}static pull($){return this.getFacadeRoot().pull($)}static remember($,Z,J){let W=this.getFacadeRoot();return typeof Z==="function"?W.remember($,Z):W.remember($,Z,J)}static tags(...$){return this.getFacadeRoot().tags(...$)}static flush(){return this.getFacadeRoot().flush()}}class rG extends m{static getFacadeAccessor(){return V1}static consume($,Z={}){return this.getFacadeRoot().consume($,Z)}static enforce($,Z={},J){return this.getFacadeRoot().enforce($,Z,J)}}class eG extends m{static getFacadeAccessor(){return tG}static run($,Z,J){return this.getFacadeRoot().run($,Z,J)}static acquire($,Z={}){return this.getFacadeRoot().acquire($,Z)}}class ZK extends m{static getFacadeAccessor(){return $K}static encrypt($){return this.getFacadeRoot().encrypt($)}static decrypt($){return this.getFacadeRoot().decrypt($)}static needsReencryption($){return this.getFacadeRoot().needsReencryption($)}}class JK extends m{static getFacadeAccessor(){return l3}static for($,Z,J){return this.getFacadeRoot().for($,Z,J)}static list($,Z){return this.getFacadeRoot().list($,Z)}static save($,Z,J){return this.getFacadeRoot().save($,Z,J)}static fake($={}){return this.getFacadeRoot().fake($)}static restore(){this.getFacadeRoot().restore()}}function _A($){return $}function WK(){return{driver:"memory",pollInterval:30000,maxSubscriptions:1e4,batchSize:100,keepaliveInterval:5000}}function z8($){let Z=new URLSearchParams;for(let[J,W]of $)Z.append(J,String(W));return Z.toString()}function hY($){let Z=new Map;if(!$)return Z;let J;try{J=new URLSearchParams($)}catch{return Z}for(let[W,Y]of J){let j=Number(Y);if(Y!==""&&Number.isSafeInteger(j)&&j>=0)Z.set(W,j)}return Z}var{SQL:aO}=globalThis.Bun;function rO(){return Bun.semver.satisfies(Bun.version,">=1.4.0")}var tO=async($)=>{let Z=new aO($,{max:1,idleTimeout:0,maxLifetime:0});return{listen:(J,W,Y)=>Z.listen(J,W,Y),close:()=>Z.close({timeout:1})}},eO=async($)=>{let Z;try{Z=(await import("./chunk-5db4v8gv.js")).default}catch(W){throw Error("The change feed's database driver needs a Postgres client that can LISTEN: Bun 1.4 or later, or the `postgres` package (bun add postgres).",{cause:W})}let J=Z($,{max:1,idle_timeout:0,max_lifetime:null,fetch_types:!1,onnotice:()=>{}});return{listen:(W,Y,j)=>J.listen(W,Y,j),close:()=>J.end({timeout:1}).catch(()=>{})}},YK=($)=>rO()?tO($):eO($);var $L=/^[A-Za-z_][A-Za-z0-9_]*$/;class pY{headsTable;entriesTable;notifyChannel;sql;dialect;connection;url;retain;listener;sqliteTurn=Promise.resolve();constructor($,Z={}){if($.dialect!=="postgres"&&$.dialect!=="sqlite")throw Error(`The change feed's database driver supports Postgres and SQLite, not ${$.dialect}.`);let J=Z.headsTable??"gemi_change_heads",W=Z.entriesTable??"gemi_changes",Y=Z.notifyChannel??"gemi_changes";for(let z of[J,W,Y])if(!$L.test(z))throw Error(`"${z}" is not a plain identifier. Use letters, digits and underscores.`);let j=Z.retain??1000;if(!Number.isInteger(j)||j<1)throw Error(`The change feed's retain must be a whole number, 1 or more; got ${j}.`);this.headsTable=J,this.entriesTable=W,this.notifyChannel=Y,this.sql=$.sql,this.dialect=$.dialect,this.connection=$.name,this.url=$.url,this.retain=j,this.listener=Z.listener??YK}async createTable(){for(let $ of ZL(this.headsTable,this.entriesTable))await this.sql.unsafe($)}joinsTransaction(){return this.transaction()!==void 0}publish($,Z){let J=this.transaction();if(!J){let Y=()=>this.sql.begin((z)=>this.append(z,$,Z));if(this.dialect!=="sqlite")return Y();let j=this.sqliteTurn.then(Y);return this.sqliteTurn=j.catch(()=>{}),j}let W=this.append(J,$,Z);return jK(W),W}async append($,Z,J){let W=$.unsafe(`"${this.headsTable}"`),Y=$.unsafe(`"${this.entriesTable}"`),[j]=await $`
|
|
24
24
|
INSERT INTO ${W} (channel, seq) VALUES (${Z}, 1)
|
|
25
25
|
ON CONFLICT (channel) DO UPDATE SET seq = ${W}.seq + 1
|
|
26
26
|
RETURNING seq
|
|
@@ -112,6 +112,6 @@ data: ${JSON.stringify(Z)}
|
|
|
112
112
|
"updated_at" BIGINT NOT NULL,
|
|
113
113
|
"finished_at" BIGINT,
|
|
114
114
|
"deadline_at" BIGINT${W}
|
|
115
|
-
)`,`CREATE INDEX IF NOT EXISTS "${Z}_subject_created_at_idx" ON "${Z}"("subject", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Z}_status_deadline_at_idx" ON "${Z}"("status", "deadline_at")`]}var TK=191,PK=30000;class B8 extends Error{id;constructor($){super(`No run has the id ${$}.`);this.id=$;this.name="RunNotFoundError"}}class F8 extends Error{code;data;constructor($,Z={}){super($,Z.cause===void 0?void 0:{cause:Z.cause});this.name="RunFailure",this.code=Z.code,this.data=Z.data}}class $5{options;static token="runs";store;config;ownFeed=null;constructor($={},Z={}){this.options=Z;this.config=P1(LK(),$),this.store=GL(this.config.store,Z.application)}get feed(){if(this.options.feed)return this.options.feed;if(this.options.application)return this.options.application.make($3);return this.ownFeed??=new $3,this.ownFeed}channel($){return`gemi:run:${$}`}async create($){IK("kind",$.kind);let Z=$.id??`run_${crypto.randomUUID().replaceAll("-","")}`;IK("id",Z);let J=await this.store.create({id:Z,kind:$.kind,subject:$.subject??null,owner:$.owner??null,meta:$.meta??null,status:$.start?"running":"pending",deadlineMs:$.deadline===void 0||$.deadline===null?null:WZ($.deadline)});return await this.publish(J),J}async get($){return await this.store.get($)}list($={}){return this.store.list($)}start($){return this.change($,["pending"],{status:"running"})}async progress($,Z){return QL(Z),this.change($,I1,{status:"running",progress:Z})}complete($,Z){return this.change($,I1,{status:"completed",result:Z===void 0?null:Z})}fail($,Z){return this.change($,I1,{status:"failed",error:_K(Z)})}cancel($,Z){return this.change($,I1,{status:"cancelled",error:{message:Z??"The run was cancelled.",code:"cancelled"}})}async execute($,Z){let J=this.feed.subscribe(this.channel($));try{await J.ready();let W=await this.start($)??await this.store.get($);if(!W)throw new B8($);if(x1(W.status))return W;let Y=new AbortController,j=this.watch($,W,J,Y),z={id:$,record:W,signal:Y.signal,progress:async(Q)=>{if(Y.signal.aborted)return;await this.progress($,Q)}},X;try{let Q=await Z(z);X=await this.complete($,Q)}catch(Q){if(!(Q instanceof F8)&&!Y.signal.aborted)console.error(`[gemi] Run ${$} failed.`,Q);X=await this.change($,I1,{status:"failed",error:Q instanceof F8?_K(Q):{message:"The run failed.",code:"error"}})}finally{Y.abort(),J.close(),await j}return X??await this.store.get($)??W}finally{J.close()}}async wait($,Z={}){let{signal:J}=Z;J?.throwIfAborted();let W=Z.timeout===void 0?1/0:Date.now()+WZ(Z.timeout),Y=this.feed.subscribe(this.channel($),{signal:J});try{await Y.ready();let j=await this.store.get($);if(!j)throw new B8($);let z=null;for(;;){if(x1(j.status))return j;J?.throwIfAborted();let X=await this.untilDeadline(j);if(X!==null&&X<=0){j=await this.expire($)??await this.store.get($)??j;continue}let Q=W-Date.now();if(Q<=0)return j;if(z??=Y.isClosed?new Promise(()=>{}):Y.next(),await NK(z,Math.min(Q,X??1/0,PK),J))z=null;j=await this.store.get($)??j}}finally{Y.close()}}async*subscribe($,Z={}){let J=this.feed.subscribe(this.channel($),{signal:Z.signal});try{await J.ready();let W=await this.store.get($);if(!W)throw new B8($);if(yield W,x1(W.status))return;for await(let Y of J){let j=XL(Y,$)??await this.store.get($);if(!j||j.version<=W.version)continue;if(W=j,yield W,x1(W.status))return}}finally{J.close()}}stream($,Z,J={}){return this.feed.stream($,this.channel(Z),J)}cursor($){return this.feed.cursor(this.channel($))}async sweep(){let $=await this.now(),Z=0;for(let J of await this.store.overdue($,this.config.sweepLimit))if(await this.expire(J.id))Z++;return Z}async prune($){let Z=WZ($);return await this.store.prune?.(Z)??0}async close(){await this.ownFeed?.close(),this.ownFeed=null}now(){return this.store.now?this.store.now():Promise.resolve(Date.now())}async untilDeadline($){if($.deadlineAt===null)return null;return $.deadlineAt-await this.now()}async expire($){let Z=await this.store.get($);if(!Z||x1(Z.status))return null;let J=await this.untilDeadline(Z);if(J===null||J>0)return null;return this.change($,I1,{status:"timed_out",error:{message:"The run passed its deadline.",code:"deadline"}})}async watch($,Z,J,W){let Y=new Promise((z)=>{if(W.signal.aborted)z("ended");W.signal.addEventListener("abort",()=>z("ended"),{once:!0})}),j=null;try{for(;;){if(W.signal.aborted)return;if(x1(Z.status)){W.abort();return}let z=await this.untilDeadline(Z);if(z!==null&&z<=0){Z=await this.expire($)??await this.store.get($)??Z;continue}j??=J.next();let X=await Promise.race([Y,NK(j,Math.min(z??1/0,PK))]);if(X==="ended")return;if(X)j=null;Z=await this.store.get($)??Z}}catch(z){console.error(`[gemi] Run ${$}: could not follow the run for a cancel.`,z)}}async change($,Z,J){let W=await this.store.transition($,Z,J);if(W)await this.publish(W);return W}async publish($){try{await this.feed.publish(this.channel($.id),$)}catch(Z){console.error(`[gemi] Run ${$.id}: could not publish its change.`,Z)}}}function NK($,Z,J){return new Promise((W,Y)=>{let j=Number.isFinite(Z)?setTimeout(()=>Q(!1),Math.max(0,Z)):null,z=()=>{X(),Y(J.reason)},X=()=>{if(j)clearTimeout(j);J?.removeEventListener("abort",z)},Q=(G)=>{X(),W(G)};J?.addEventListener("abort",z,{once:!0}),$.then(()=>Q(!0),()=>Q(!0))})}function XL($,Z){if($.type!=="change")return null;let J=$.data;if(!J||typeof J!=="object"||J.id!==Z||typeof J.version!=="number")return null;return J}function _K($){if(typeof $==="string")return{message:$};if($ instanceof F8)return{message:$.message,...$.code!==void 0?{code:$.code}:{},...$.data!==void 0?{data:$.data}:{}};if($ instanceof Error)return{message:$.message};return $}function IK($,Z){if(typeof Z!=="string"||Z===""||Z.length>TK)throw TypeError(`A run's ${$} is a string of 1 to ${TK} characters; got ${JSON.stringify(Z)}.`)}function QL($){let{fraction:Z}=$;if(Z!==void 0&&!(Number.isFinite(Z)&&Z>=0&&Z<=1))throw RangeError(`A run's progress fraction is between 0 and 1; got ${Z}.`)}function GL($,Z){if($==="memory")return new oY;if($==="database"||typeof $==="function"){if(!Z&&($==="database"||$.length>0))throw Error("The runs store needs the application it belongs to, and this RunManager was built without one. Pass { application }.");if($==="database"){let J=Z.make(f1).connection();return new eY(J)}return $(Z)}if(typeof $==="string")throw Error(`Unknown runs store "${$}". The runs slice's store is "memory", "database", a RunStore, or a function returning one.`);return $}class xK extends m{static getFacadeAccessor(){return $5}static create($){return this.getFacadeRoot().create($)}static get($){return this.getFacadeRoot().get($)}static list($){return this.getFacadeRoot().list($)}static start($){return this.getFacadeRoot().start($)}static progress($,Z){return this.getFacadeRoot().progress($,Z)}static complete($,Z){return this.getFacadeRoot().complete($,Z)}static fail($,Z){return this.getFacadeRoot().fail($,Z)}static cancel($,Z){return this.getFacadeRoot().cancel($,Z)}static execute($,Z){return this.getFacadeRoot().execute($,Z)}static wait($,Z){return this.getFacadeRoot().wait($,Z)}static subscribe($,Z){return this.getFacadeRoot().subscribe($,Z)}static stream($,Z,J){return this.getFacadeRoot().stream($,Z,J)}static cursor($){return this.getFacadeRoot().cursor($)}static channel($){return this.getFacadeRoot().channel($)}static sweep(){return this.getFacadeRoot().sweep()}static prune($){return this.getFacadeRoot().prune($)}}class CK extends m{static getFacadeAccessor(){return Y$}static enabled($){return this.getFacadeRoot().enabled($)}static all(){return this.getFacadeRoot().forClient()}static explain($){return this.getFacadeRoot().explain($)}static for($){return this.getFacadeRoot().for($)}static list(){return this.getFacadeRoot().list()}static set($,Z,J){return this.getFacadeRoot().set($,Z,J)}static refresh(){return this.getFacadeRoot().refresh()}static invalidate(){return this.getFacadeRoot().invalidate()}}class W5{value;constructor($){this.value=$}}var KL=/^[A-Za-z_][A-Za-z0-9_$]*$/;function BL($){let Z=["SET TRANSACTION READ ONLY"],J=[["statementTimeoutMs","statement_timeout"],["lockTimeoutMs","lock_timeout"],["idleInTransactionTimeoutMs","idle_in_transaction_session_timeout"]];for(let[W,Y]of J){let j=$[W];if(j===void 0)continue;if(typeof j!=="number"||!Number.isInteger(j)||j<=0)throw TypeError(`DB.readOnly: ${W} must be a positive whole number of milliseconds, got ${String(j)}.`);Z.push(`SET LOCAL ${Y} = ${j}`)}if($.role!==void 0){if(typeof $.role!=="string"||!KL.test($.role))throw TypeError(`DB.readOnly: the role "${String($.role)}" is not a plain identifier. Use letters, digits, _ and $.`);Z.push(`SET LOCAL ROLE "${$.role}"`)}return Z}class V8{bound;constructor($){this.bound=$}get name(){return this.bound??R1()}get sql(){return this.connection().sql}get dialect(){return this.connection().dialect}async query($){return await this.run($,"query")}async execute($){let Z=await this.run($,"execute");return Number(Z?.count??0)}async transaction($){let Z=this.name,J=this.connection(Z);return J5(J.sql,(W)=>Z5(Z,()=>$(W)),{slowTransactionThreshold:J.config.slowTransactionThreshold,connection:Z})}async readOnly($,Z){let J=typeof $==="function"?{}:$,W=typeof $==="function"?$:Z;if(typeof W!=="function")throw TypeError("DB.readOnly needs a callback: readOnly(options, async (tx) => ...).");let Y=BL(J??{}),j=this.name,z=this.connection(j);if(z.dialect!=="postgres")throw Error(`DB.readOnly is supported on Postgres only, and the "${j}" connection is ${z.dialect}.`);if(l0()!==void 0)throw Error("DB.readOnly cannot run inside a transaction: SET TRANSACTION READ ONLY has to be the first statement of its own transaction. Call it outside the transaction.");try{await J5(z.sql,async(X)=>{for(let G of Y)await X.unsafe(G);let Q=await Z5(j,()=>W(X));throw new W5(Q)},{slowTransactionThreshold:z.config.slowTransactionThreshold,connection:j})}catch(X){if(X instanceof W5)return X.value;throw X}throw Error("DB.readOnly: the transaction committed, which it never should.")}async schema(){let $=this.connection(),{introspect:Z}=await import("./chunk-q5j1bwny.js");return Z(this.handle()??$.sql,$.dialect)}run($,Z){let J=this.connection(),{text:W,values:Y}=EK($,SK(J.dialect),Z);return(this.handle()??J.sql).unsafe(W,Y)}handle(){let $=l0();if($===void 0)return;return R1()===this.name?$:void 0}connection($=this.name){return AK($),M(f1).connection($)}}var YZ=new V8;class bK extends m{static getFacadeAccessor(){return f1}static connection($){return new V8($)}static get sql(){return YZ.sql}static get dialect(){return YZ.dialect}static query($){return YZ.query($)}static execute($){return YZ.execute($)}static transaction($){return YZ.transaction($)}static readOnly($,Z){return YZ.readOnly($,Z)}static schema(){return YZ.schema()}static close(){return this.getFacadeRoot().close()}}export{K1 as ie,vK as je,a0 as ke,Y3 as le,M8 as me,QZ as ne,z3 as oe,C0 as pe,Y6 as qe,c8 as re,d8 as se,Dj as te,W$ as ue,V1 as ve,R$ as we,J0 as xe,s5 as ye,FZ as ze,Oj as Ae,Lj as Be,l8 as Ce,i8 as De,M6 as Ee,OZ as Fe,rB as Ge,bT as He,Sj as Ie,qj as Je,r8 as Ke,yj as Le,vj as Me,jF as Ne,gj as Oe,t8 as Pe,QF as Qe,GF as Re,e8 as Se,mj as Te,hj as Ue,Y$ as Ve,pj as We,VF as Xe,Z7 as Ye,E8 as Ze,K6 as _e,S1 as $e,A8 as af,E1 as bf,I$ as cf,Y8 as df,dG as ef,uG as ff,lO as gf,l1 as hf,oC as if,lG as jf,yY as kf,vY as lf,mY as mf,nG as nf,aG as of,rG as pf,eG as qf,ZK as rf,JK as sf,_A as tf,WK as uf,z8 as vf,hY as wf,pY as xf,cY as yf,X8 as zf,$3 as Af,UK as Bf,DK as Cf,u as Df,X3 as Ef,q4 as Ff,UP as Gf,DP as Hf,OP as If,TP as Jf,sX as Kf,AW as Lf,aX as Mf,xP as Nf,eX as Of,c0 as Pf,c3 as Qf,$Q as Rf,OK as Sf,JS as Tf,nY as Uf,I1 as Vf,x1 as Wf,oY as Xf,eY as Yf,zL as Zf,B8 as _f,F8 as $f,$5 as ag,xK as bg,CK as cg,V8 as dg,bK as eg,EW as fg,KD as gg,gW as hg,mW as ig,qN as jg,NQ as kg,CQ as lg,j6 as mg,e1 as ng,aN as og,SQ as pg,EQ as qg,GY as rg,aZ as sg,KY as tg,LI as ug,xI as vg,CI as wg,MO as xg,PY as yg,AY as zg,_O as Ag,_Y as Bg,CO as Cg,a3 as Dg,SY as Eg,SG as Fg,e4 as Gg,$8 as Hg,ax as Ig,rx as Jg,tx as Kg,Q1 as Lg,b as Mg,q0 as Ng,z6 as Og,E5 as Pg,tK as Qg,C5 as Rg,R5 as Sg,I8 as Tg,Q6 as Ug,x8 as Vg,f5 as Wg,jB as Xg,zB as Yg,g5 as Zg,h5 as _g,c5 as $g,o5 as ah,a5 as bh,r5 as ch,k8 as dh,FB as eh,X0 as fh,Qj as gh,UZ as hh,Vj as ih};
|
|
115
|
+
)`,`CREATE INDEX IF NOT EXISTS "${Z}_subject_created_at_idx" ON "${Z}"("subject", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Z}_status_deadline_at_idx" ON "${Z}"("status", "deadline_at")`]}var TK=191,PK=30000;class B8 extends Error{id;constructor($){super(`No run has the id ${$}.`);this.id=$;this.name="RunNotFoundError"}}class F8 extends Error{code;data;constructor($,Z={}){super($,Z.cause===void 0?void 0:{cause:Z.cause});this.name="RunFailure",this.code=Z.code,this.data=Z.data}}class $5{options;static token="runs";store;config;ownFeed=null;constructor($={},Z={}){this.options=Z;this.config=P1(LK(),$),this.store=GL(this.config.store,Z.application)}get feed(){if(this.options.feed)return this.options.feed;if(this.options.application)return this.options.application.make($3);return this.ownFeed??=new $3,this.ownFeed}channel($){return`gemi:run:${$}`}async create($){IK("kind",$.kind);let Z=$.id??`run_${crypto.randomUUID().replaceAll("-","")}`;IK("id",Z);let J=await this.store.create({id:Z,kind:$.kind,subject:$.subject??null,owner:$.owner??null,meta:$.meta??null,status:$.start?"running":"pending",deadlineMs:$.deadline===void 0||$.deadline===null?null:WZ($.deadline)});return await this.publish(J),J}async get($){return await this.store.get($)}list($={}){return this.store.list($)}start($){return this.change($,["pending"],{status:"running"})}async progress($,Z){return QL(Z),this.change($,I1,{status:"running",progress:Z})}complete($,Z){return this.change($,I1,{status:"completed",result:Z===void 0?null:Z})}fail($,Z){return this.change($,I1,{status:"failed",error:_K(Z)})}cancel($,Z){return this.change($,I1,{status:"cancelled",error:{message:Z??"The run was cancelled.",code:"cancelled"}})}async execute($,Z){let J=this.feed.subscribe(this.channel($));try{await J.ready();let W=await this.start($)??await this.store.get($);if(!W)throw new B8($);if(x1(W.status))return W;let Y=new AbortController,j=this.watch($,W,J,Y),z={id:$,record:W,signal:Y.signal,progress:async(Q)=>{if(Y.signal.aborted)return;await this.progress($,Q)}},X;try{let Q=await Z(z);X=await this.complete($,Q)}catch(Q){if(!(Q instanceof F8)&&!Y.signal.aborted)console.error(`[gemi] Run ${$} failed.`,Q);X=await this.change($,I1,{status:"failed",error:Q instanceof F8?_K(Q):{message:"The run failed.",code:"error"}})}finally{Y.abort(),J.close(),await j}return X??await this.store.get($)??W}finally{J.close()}}async wait($,Z={}){let{signal:J}=Z;J?.throwIfAborted();let W=Z.timeout===void 0?1/0:Date.now()+WZ(Z.timeout),Y=this.feed.subscribe(this.channel($),{signal:J});try{await Y.ready();let j=await this.store.get($);if(!j)throw new B8($);let z=null;for(;;){if(x1(j.status))return j;J?.throwIfAborted();let X=await this.untilDeadline(j);if(X!==null&&X<=0){j=await this.expire($)??await this.store.get($)??j;continue}let Q=W-Date.now();if(Q<=0)return j;if(z??=Y.isClosed?new Promise(()=>{}):Y.next(),await NK(z,Math.min(Q,X??1/0,PK),J))z=null;j=await this.store.get($)??j}}finally{Y.close()}}async*subscribe($,Z={}){let J=this.feed.subscribe(this.channel($),{signal:Z.signal});try{await J.ready();let W=await this.store.get($);if(!W)throw new B8($);if(yield W,x1(W.status))return;for await(let Y of J){let j=XL(Y,$)??await this.store.get($);if(!j||j.version<=W.version)continue;if(W=j,yield W,x1(W.status))return}}finally{J.close()}}stream($,Z,J={}){return this.feed.stream($,this.channel(Z),J)}cursor($){return this.feed.cursor(this.channel($))}async sweep(){let $=await this.now(),Z=0;for(let J of await this.store.overdue($,this.config.sweepLimit))if(await this.expire(J.id))Z++;return Z}async prune($){let Z=WZ($);return await this.store.prune?.(Z)??0}async close(){await this.ownFeed?.close(),this.ownFeed=null}now(){return this.store.now?this.store.now():Promise.resolve(Date.now())}async untilDeadline($){if($.deadlineAt===null)return null;return $.deadlineAt-await this.now()}async expire($){let Z=await this.store.get($);if(!Z||x1(Z.status))return null;let J=await this.untilDeadline(Z);if(J===null||J>0)return null;return this.change($,I1,{status:"timed_out",error:{message:"The run passed its deadline.",code:"deadline"}})}async watch($,Z,J,W){let Y=new Promise((z)=>{if(W.signal.aborted)z("ended");W.signal.addEventListener("abort",()=>z("ended"),{once:!0})}),j=null;try{for(;;){if(W.signal.aborted)return;if(x1(Z.status)){W.abort();return}let z=await this.untilDeadline(Z);if(z!==null&&z<=0){Z=await this.expire($)??await this.store.get($)??Z;continue}j??=J.next();let X=await Promise.race([Y,NK(j,Math.min(z??1/0,PK))]);if(X==="ended")return;if(X)j=null;Z=await this.store.get($)??Z}}catch(z){console.error(`[gemi] Run ${$}: could not follow the run for a cancel.`,z)}}async change($,Z,J){let W=await this.store.transition($,Z,J);if(W)await this.publish(W);return W}async publish($){try{await this.feed.publish(this.channel($.id),$)}catch(Z){console.error(`[gemi] Run ${$.id}: could not publish its change.`,Z)}}}function NK($,Z,J){return new Promise((W,Y)=>{let j=Number.isFinite(Z)?setTimeout(()=>Q(!1),Math.max(0,Z)):null,z=()=>{X(),Y(J.reason)},X=()=>{if(j)clearTimeout(j);J?.removeEventListener("abort",z)},Q=(G)=>{X(),W(G)};J?.addEventListener("abort",z,{once:!0}),$.then(()=>Q(!0),()=>Q(!0))})}function XL($,Z){if($.type!=="change")return null;let J=$.data;if(!J||typeof J!=="object"||J.id!==Z||typeof J.version!=="number")return null;return J}function _K($){if(typeof $==="string")return{message:$};if($ instanceof F8)return{message:$.message,...$.code!==void 0?{code:$.code}:{},...$.data!==void 0?{data:$.data}:{}};if($ instanceof Error)return{message:$.message};return $}function IK($,Z){if(typeof Z!=="string"||Z===""||Z.length>TK)throw TypeError(`A run's ${$} is a string of 1 to ${TK} characters; got ${JSON.stringify(Z)}.`)}function QL($){let{fraction:Z}=$;if(Z!==void 0&&!(Number.isFinite(Z)&&Z>=0&&Z<=1))throw RangeError(`A run's progress fraction is between 0 and 1; got ${Z}.`)}function GL($,Z){if($==="memory")return new oY;if($==="database"||typeof $==="function"){if(!Z&&($==="database"||$.length>0))throw Error("The runs store needs the application it belongs to, and this RunManager was built without one. Pass { application }.");if($==="database"){let J=Z.make(f1).connection();return new eY(J)}return $(Z)}if(typeof $==="string")throw Error(`Unknown runs store "${$}". The runs slice's store is "memory", "database", a RunStore, or a function returning one.`);return $}class xK extends m{static getFacadeAccessor(){return $5}static create($){return this.getFacadeRoot().create($)}static get($){return this.getFacadeRoot().get($)}static list($){return this.getFacadeRoot().list($)}static start($){return this.getFacadeRoot().start($)}static progress($,Z){return this.getFacadeRoot().progress($,Z)}static complete($,Z){return this.getFacadeRoot().complete($,Z)}static fail($,Z){return this.getFacadeRoot().fail($,Z)}static cancel($,Z){return this.getFacadeRoot().cancel($,Z)}static execute($,Z){return this.getFacadeRoot().execute($,Z)}static wait($,Z){return this.getFacadeRoot().wait($,Z)}static subscribe($,Z){return this.getFacadeRoot().subscribe($,Z)}static stream($,Z,J){return this.getFacadeRoot().stream($,Z,J)}static cursor($){return this.getFacadeRoot().cursor($)}static channel($){return this.getFacadeRoot().channel($)}static sweep(){return this.getFacadeRoot().sweep()}static prune($){return this.getFacadeRoot().prune($)}}class CK extends m{static getFacadeAccessor(){return Y$}static enabled($){return this.getFacadeRoot().enabled($)}static all(){return this.getFacadeRoot().forClient()}static explain($){return this.getFacadeRoot().explain($)}static for($){return this.getFacadeRoot().for($)}static list(){return this.getFacadeRoot().list()}static set($,Z,J){return this.getFacadeRoot().set($,Z,J)}static refresh(){return this.getFacadeRoot().refresh()}static invalidate(){return this.getFacadeRoot().invalidate()}}class W5{value;constructor($){this.value=$}}var KL=/^[A-Za-z_][A-Za-z0-9_$]*$/;function BL($){let Z=["SET TRANSACTION READ ONLY"],J=[["statementTimeoutMs","statement_timeout"],["lockTimeoutMs","lock_timeout"],["idleInTransactionTimeoutMs","idle_in_transaction_session_timeout"]];for(let[W,Y]of J){let j=$[W];if(j===void 0)continue;if(typeof j!=="number"||!Number.isInteger(j)||j<=0)throw TypeError(`DB.readOnly: ${W} must be a positive whole number of milliseconds, got ${String(j)}.`);Z.push(`SET LOCAL ${Y} = ${j}`)}if($.role!==void 0){if(typeof $.role!=="string"||!KL.test($.role))throw TypeError(`DB.readOnly: the role "${String($.role)}" is not a plain identifier. Use letters, digits, _ and $.`);Z.push(`SET LOCAL ROLE "${$.role}"`)}return Z}class V8{bound;constructor($){this.bound=$}get name(){return this.bound??R1()}get sql(){return this.connection().sql}get dialect(){return this.connection().dialect}async query($){return await this.run($,"query")}async execute($){let Z=await this.run($,"execute");return Number(Z?.count??0)}async transaction($){let Z=this.name,J=this.connection(Z);return J5(J.sql,(W)=>Z5(Z,()=>$(W)),{slowTransactionThreshold:J.config.slowTransactionThreshold,connection:Z})}async readOnly($,Z){let J=typeof $==="function"?{}:$,W=typeof $==="function"?$:Z;if(typeof W!=="function")throw TypeError("DB.readOnly needs a callback: readOnly(options, async (tx) => ...).");let Y=BL(J??{}),j=this.name,z=this.connection(j);if(z.dialect!=="postgres")throw Error(`DB.readOnly is supported on Postgres only, and the "${j}" connection is ${z.dialect}.`);if(l0()!==void 0)throw Error("DB.readOnly cannot run inside a transaction: SET TRANSACTION READ ONLY has to be the first statement of its own transaction. Call it outside the transaction.");try{await J5(z.sql,async(X)=>{for(let G of Y)await X.unsafe(G);let Q=await Z5(j,()=>W(X));throw new W5(Q)},{slowTransactionThreshold:z.config.slowTransactionThreshold,connection:j})}catch(X){if(X instanceof W5)return X.value;throw X}throw Error("DB.readOnly: the transaction committed, which it never should.")}async schema(){let $=this.connection(),{introspect:Z}=await import("./chunk-sx6jmyaf.js");return Z(this.handle()??$.sql,$.dialect)}run($,Z){let J=this.connection(),{text:W,values:Y}=EK($,SK(J.dialect),Z);return(this.handle()??J.sql).unsafe(W,Y)}handle(){let $=l0();if($===void 0)return;return R1()===this.name?$:void 0}connection($=this.name){return AK($),M(f1).connection($)}}var YZ=new V8;class bK extends m{static getFacadeAccessor(){return f1}static connection($){return new V8($)}static get sql(){return YZ.sql}static get dialect(){return YZ.dialect}static query($){return YZ.query($)}static execute($){return YZ.execute($)}static transaction($){return YZ.transaction($)}static readOnly($,Z){return YZ.readOnly($,Z)}static schema(){return YZ.schema()}static close(){return this.getFacadeRoot().close()}}export{K1 as ie,vK as je,a0 as ke,Y3 as le,M8 as me,QZ as ne,z3 as oe,C0 as pe,Y6 as qe,c8 as re,d8 as se,Dj as te,W$ as ue,V1 as ve,R$ as we,J0 as xe,s5 as ye,FZ as ze,Oj as Ae,Lj as Be,l8 as Ce,i8 as De,M6 as Ee,OZ as Fe,rB as Ge,bT as He,Sj as Ie,qj as Je,r8 as Ke,yj as Le,vj as Me,jF as Ne,gj as Oe,t8 as Pe,QF as Qe,GF as Re,e8 as Se,mj as Te,hj as Ue,Y$ as Ve,pj as We,VF as Xe,Z7 as Ye,E8 as Ze,K6 as _e,S1 as $e,A8 as af,E1 as bf,I$ as cf,Y8 as df,dG as ef,uG as ff,lO as gf,l1 as hf,oC as if,lG as jf,yY as kf,vY as lf,mY as mf,nG as nf,aG as of,rG as pf,eG as qf,ZK as rf,JK as sf,_A as tf,WK as uf,z8 as vf,hY as wf,pY as xf,cY as yf,X8 as zf,$3 as Af,UK as Bf,DK as Cf,u as Df,X3 as Ef,q4 as Ff,UP as Gf,DP as Hf,OP as If,TP as Jf,sX as Kf,AW as Lf,aX as Mf,xP as Nf,eX as Of,c0 as Pf,c3 as Qf,$Q as Rf,OK as Sf,JS as Tf,nY as Uf,I1 as Vf,x1 as Wf,oY as Xf,eY as Yf,zL as Zf,B8 as _f,F8 as $f,$5 as ag,xK as bg,CK as cg,V8 as dg,bK as eg,EW as fg,KD as gg,gW as hg,mW as ig,qN as jg,NQ as kg,CQ as lg,j6 as mg,e1 as ng,aN as og,SQ as pg,EQ as qg,GY as rg,aZ as sg,KY as tg,LI as ug,xI as vg,CI as wg,MO as xg,PY as yg,AY as zg,_O as Ag,_Y as Bg,CO as Cg,a3 as Dg,SY as Eg,SG as Fg,e4 as Gg,$8 as Hg,ax as Ig,rx as Jg,tx as Kg,Q1 as Lg,b as Mg,q0 as Ng,z6 as Og,E5 as Pg,tK as Qg,C5 as Rg,R5 as Sg,I8 as Tg,Q6 as Ug,x8 as Vg,f5 as Wg,jB as Xg,zB as Yg,g5 as Zg,h5 as _g,c5 as $g,o5 as ah,a5 as bh,r5 as ch,k8 as dh,FB as eh,X0 as fh,Qj as gh,UZ as hh,Vj as ih};
|
|
116
116
|
|
|
117
|
-
//# debugId=
|
|
117
|
+
//# debugId=7F0451300140909764756E2164756E21
|