gemi 0.146.0 → 0.147.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 +1 -1
- package/dist/{chunk-skhnc9g9.js → chunk-01tw5f26.js} +3 -3
- package/dist/{chunk-skhnc9g9.js.map → chunk-01tw5f26.js.map} +3 -3
- package/dist/{chunk-p3dvm08p.js → chunk-3e3tznxc.js} +1 -1
- package/dist/{chunk-g4gzz185.js → chunk-3tjn78zh.js} +2 -2
- package/dist/{chunk-g4gzz185.js.map → chunk-3tjn78zh.js.map} +1 -1
- package/dist/{chunk-9br5qvg4.js → chunk-4dqfpydr.js} +1 -1
- package/dist/{chunk-8km4drvv.js → chunk-95vm1de8.js} +1 -1
- package/dist/chunk-a8n9ec43.js +5 -0
- package/dist/{chunk-0k8fk96c.js.map → chunk-a8n9ec43.js.map} +3 -3
- package/dist/{chunk-8k346pjw.js → chunk-ezn89ezm.js} +1 -1
- package/dist/{chunk-k79ajvtc.js → chunk-fka28ceg.js} +1 -1
- package/dist/{chunk-2gdrj2jm.js → chunk-r9exzwqt.js} +1 -1
- package/dist/client/Head.d.ts.map +1 -1
- package/dist/client/index.js +15 -3
- package/dist/client/index.js.map +1 -1
- package/dist/facades/Meta.d.ts +7 -0
- package/dist/facades/Meta.d.ts.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/http/HttpRequest.d.ts +1 -0
- package/dist/http/HttpRequest.d.ts.map +1 -1
- package/dist/http/Metadata.d.ts +3 -0
- package/dist/http/Metadata.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/http/requestContext.d.ts +1 -0
- package/dist/http/requestContext.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/kernel/index.js +1 -1
- package/dist/orm/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/services/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-0k8fk96c.js +0 -5
- /package/dist/{chunk-p3dvm08p.js.map → chunk-3e3tznxc.js.map} +0 -0
- /package/dist/{chunk-9br5qvg4.js.map → chunk-4dqfpydr.js.map} +0 -0
- /package/dist/{chunk-8km4drvv.js.map → chunk-95vm1de8.js.map} +0 -0
- /package/dist/{chunk-8k346pjw.js.map → chunk-ezn89ezm.js.map} +0 -0
- /package/dist/{chunk-k79ajvtc.js.map → chunk-fka28ceg.js.map} +0 -0
- /package/dist/{chunk-2gdrj2jm.js.map → chunk-r9exzwqt.js.map} +0 -0
package/dist/ai/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{$c as TQ,Ac as Q$,Bc as $$,Cc as Z$,Dc as K$,Ec as G$,Fc as X$,Gc as Y$,Hc as V$,Ic as H$,Jc as z$,Lc as w,Mc as N$,Nc as i,Oc as k,Pc as gQ,Qc as q9,Rc as I9,Sc as w9,Tc as b9,Uc as f9,Vc as v9,Wc as h9,Xb as vQ,Xc as y9,Yb as k6,Yc as g9,Zb as R6,Zc as u9,_b as hQ,_c as c9,ad as m9,bc as MJ,bd as w6,cc as j,cd as p9,dc as E,dd as l9,ec as g,ed as OJ,fc as yQ,fd as oJ,gc as T6,gd as d9,hc as j6,hd as i9,ic as E6,id as n9,jc as m,jd as o9,kc as x6,kd as a9,lc as yJ,ld as s9,mc as q6,nc as I6,oc as gJ,pc as oQ,qc as aQ,sc as sQ,tc as h,uc as G6,vc as X6,wc as tQ,yc as rQ,zc as W$}from"../chunk-
|
|
2
|
+
import{$c as TQ,Ac as Q$,Bc as $$,Cc as Z$,Dc as K$,Ec as G$,Fc as X$,Gc as Y$,Hc as V$,Ic as H$,Jc as z$,Lc as w,Mc as N$,Nc as i,Oc as k,Pc as gQ,Qc as q9,Rc as I9,Sc as w9,Tc as b9,Uc as f9,Vc as v9,Wc as h9,Xb as vQ,Xc as y9,Yb as k6,Yc as g9,Zb as R6,Zc as u9,_b as hQ,_c as c9,ad as m9,bc as MJ,bd as w6,cc as j,cd as p9,dc as E,dd as l9,ec as g,ed as OJ,fc as yQ,fd as oJ,gc as T6,gd as d9,hc as j6,hd as i9,ic as E6,id as n9,jc as m,jd as o9,kc as x6,kd as a9,lc as yJ,ld as s9,mc as q6,nc as I6,oc as gJ,pc as oQ,qc as aQ,sc as sQ,tc as h,uc as G6,vc as X6,wc as tQ,yc as rQ,zc as W$}from"../chunk-ezn89ezm.js";import{Dd as mQ}from"../chunk-v9z4x5j2.js";import"../chunk-877yc341.js";import{Bh as _6,Ci as AQ,Gi as A6,Rh as y$,Sh as j9,Th as E9,Uh as x9,Vh as x,yh as M6,zi as S6}from"../chunk-95vm1de8.js";import{Hi as C6,Ji as vJ,Ki as hJ}from"../chunk-cee5gq7t.js";import{Ti as y}from"../chunk-a8n9ec43.js";import"../chunk-xv58jnpb.js";import"../chunk-86zhngpg.js";import"../chunk-attr793y.js";import{Wj as BJ,Xj as FJ,jk as nQ}from"../chunk-2ery6a75.js";import"../chunk-73rzf7ys.js";import{Yk as s$}from"../chunk-1fyn63ka.js";import"../chunk-e9z8p2fy.js";import"../chunk-mzkzgp2j.js";import"../chunk-apga49vp.js";import"../chunk-jzpbwvbt.js";class cJ extends mQ{name="AgentJobDeadlineSweep";cron="* * * * *";async callback(){while(await h.sweep({limit:100})===100);}}var HJ=20;function lQ(J,Q){if(Q<=0||J.length===0)return null;let $=(K,G)=>G.createdAt-K.createdAt||(K.id<G.id?1:-1);return["<jobs>","Background jobs that tools started in this conversation, running ones first. A running job's result replaces its tool result when it finishes. Do not start the same work again while a job for it is running.",...[...J.filter((K)=>K.state==="running").sort($),...J.filter((K)=>K.state!=="running").sort($)].slice(0,Q).map((K)=>{let G=[`- ${K.id} (${K.toolName})`];if(K.state==="running")G.push(`running since ${mJ(K.createdAt)}`);else if(K.state==="ok")G.push(`finished at ${mJ(K.settledAt??K.updatedAt)}`);else{let Y=K.error?`${K.error.code}: ${pQ(K.error.message,200)}`:"failed";G.push(`failed at ${mJ(K.settledAt??K.updatedAt)} (${Y})`)}if(K.summary!==void 0)G.push(`summary: ${pQ(JSON.stringify(K.summary),300)}`);if(K.orphaned)G.push("its tool call was lost when the turn that started it was cut short");return G.join("; ")}),"</jobs>"].join(`
|
|
3
3
|
`)}function mJ(J){return new Date(J).toISOString().replace(/\.\d{3}Z$/,"Z")}function pQ(J,Q){return J.length<=Q?J:`${J.slice(0,Q-1)}\u2026`}class lJ{table;sql;dialect;connection;constructor(J,Q={}){let $=Q.table??"gemi_agent_jobs";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test($))throw Error(`The agent jobs table name "${$}" is not a plain identifier. Use letters, digits and underscores.`);this.table=$,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of y6(this.dialect,this.table))await this.sql.unsafe(J)}async transaction(J){if(this.connection===void 0||this.joinable())return J();return nQ(this.sql,()=>J(),{connection:this.connection})}async create(J){let Q=this.q(),$=this.clock(Q);await Q`
|
|
4
4
|
INSERT INTO ${this.name(Q)}
|
|
5
5
|
(id, thread_id, run_id, tool_call_id, tool_name, owner, job, summary, state,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{dh as jK}from"./chunk-hh5bs656.js";import{xh as YK}from"./chunk-3csz8pfk.js";import{$h as I$,Ai as WQ,Bi as u$,Ch as zG,Ci as l$,Dh as S9,Di as qG,Eh as A9,Fh as F8,Fi as yG,Gh as j8,Jh as z8,Kh as X8,Lh as lZ,Mh as yQ,Nh as MW,Oh as aW,Ph as p,Vh as C,Wh as R8,Xh as zZ,Yh as B8,Zh as Y6,ai as g,bi as y4,pi as j6,wi as XZ,yh as J3}from"./chunk-8km4drvv.js";import{Ii as d1,Ji as Z0,Ki as l1,Li as f9}from"./chunk-cee5gq7t.js";import{Mi as m3,Ni as UG,Ri as DY,Si as d4,Ti as T}from"./chunk-0k8fk96c.js";import{Wi as tX,Zi as g3}from"./chunk-563ksar3.js";import{bj as CY,ej as AG}from"./chunk-n9n4qt20.js";import{Bj as u1,wj as H$}from"./chunk-xv58jnpb.js";import{Pj as kX}from"./chunk-313593t3.js";import{Qj as i$,Tj as CG}from"./chunk-86zhngpg.js";import{Uj as O1}from"./chunk-attr793y.js";import{$j as vZ,Vj as Z6,Wj as i0,Xj as T1,Yj as ZK,Zj as JK,ak as wG,jk as WK}from"./chunk-2ery6a75.js";import{yk as N1}from"./chunk-73rzf7ys.js";import{Dk as WG,Ik as DW}from"./chunk-2x6cv37t.js";import{Pk as JG,Uk as n}from"./chunk-mr3szvr3.js";import{Vk as uZ,Yk as L}from"./chunk-1fyn63ka.js";import{el as FW}from"./chunk-g8sh9btf.js";import{fl as vG}from"./chunk-mzkzgp2j.js";import{pl as zW}from"./chunk-apga49vp.js";import{rl as XG}from"./chunk-fqqbnp0z.js";import{wl as u4}from"./chunk-jzpbwvbt.js";function o3($){return typeof $==="function"&&$.prototype!==void 0}function l0($){return typeof $==="string"?[$]:$}function a3($,Z){let J=Z?"attachment":"inline",W=$.replace(/["\\]/g,"").replace(/[^\x20-\x7e]/g,"_");return`${J}; filename="${W}"; filename*=UTF-8''${encodeURIComponent($)}`}function UK($){return"total"in $&&"partial"in $&&"body"in $}function cW(){return new Response("Not found",{status:404,headers:{"X-Content-Type-Options":"nosniff"}})}function rZ($){return new Response(null,{status:416,headers:{"Accept-Ranges":"bytes","Content-Range":X8($),"Content-Length":"0","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}async function LK($){if($ instanceof Blob)return{body:$,start:0,end:$.size-1,total:$.size,partial:!1,type:$.type,name:$.name,download:!1,status:200,extraHeaders:{}};if(UK($))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 Q8($,Z){if($ instanceof Response)return $;if(!$)return cW();let J=await LK($),{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 cW()}let{range:Q}=Z;if(Q){if(z<=0)return rZ(Math.max(z,0));if(!X){if(W instanceof Blob){let F=j8(Q,z);if(!F)return rZ(z);W=W.slice(F.start,F.end+1),Y=F.start,j=F.end,X=!0}}}let G=Boolean(Q)&&X,K=G?206:J.status,B=new Headers;if(B.set("Accept-Ranges","bytes"),B.set("Content-Type",J.type||"application/octet-stream"),B.set("X-Content-Type-Options","nosniff"),G)B.set("Content-Range",z8(Y,j,z)),B.set("Content-Length",String(j-Y+1));else if(z>=0)B.set("Content-Length",String(z));if(J.name)B.set("Content-Disposition",a3(J.name,J.download));if(J.etag)B.set("ETag",J.etag);if(J.lastModified)B.set("Last-Modified",J.lastModified.toUTCString());for(let[F,O]of Object.entries(J.extraHeaders))B.set(F,O);if((Z.method??"GET").toUpperCase()==="HEAD"){if(W&&"cancel"in W&&typeof W.cancel==="function")await W.cancel();return new Response(null,{status:K,headers:B})}return new Response(W,{status:K,headers:B})}class $Z extends Z0{limit;constructor($){super("The request body is too large.",{status:413});this.limit=$}}var dW={b:1,k:1024,kb:1024,m:1048576,mb:1048576,g:1073741824,gb:1073741824};function eZ($){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 dW)))return Math.floor(Number(J[1])*(dW[J[2]]??1))}throw Error(`Invalid body limit ${JSON.stringify($)}. Use a byte count or a size such as "64kb", "1mb" or "none".`)}var tZ=new WeakMap;function lW($){return tZ.has($)}function iW($){return tZ.get($)?.limit??null}function sW($){let Z=tZ.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 K8($,Z){let J=HK($);if(J!==null&&J>Z)throw new $Z(Z)}function r3($,Z,J={}){let W=tZ.get($);if(W)W.limit=Z;else{let Y={limit:Z,read:0,stream:void 0,used:!1};tZ.set($,Y),IK($,Y)}if(J.checkDeclared!==!1)K8($,Z)}function PK($){return Reflect.get(Object.getPrototypeOf($),"body",$)??null}function G8($,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 $Z(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 e$($,Z){if(K8($,Z.limit),Z.used||Z.stream?.locked)throw TypeError("Body already used");Z.used=!0;let J=G8($,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 uW($){return $.headers.get("Content-Type")??""}function IK($,Z){let J=(W,Y)=>Object.defineProperty($,W,{configurable:!0,...Y});J("body",{get:()=>G8($,Z)}),J("bodyUsed",{get:()=>Z.used||Boolean(Z.stream?.locked)||Reflect.get(Object.getPrototypeOf($),"bodyUsed",$)}),J("bytes",{value:()=>e$($,Z)}),J("arrayBuffer",{value:async()=>{let W=await e$($,Z);return W.buffer.slice(W.byteOffset,W.byteOffset+W.byteLength)}}),J("text",{value:async()=>new TextDecoder().decode(await e$($,Z))}),J("json",{value:async()=>JSON.parse(new TextDecoder().decode(await e$($,Z)))}),J("blob",{value:async()=>new Blob([await e$($,Z)],{type:uW($)})}),J("formData",{value:async()=>new Response(await e$($,Z),{headers:{"Content-Type":uW($)}}).formData()}),J("clone",{value:()=>{K8($,Z.limit);let W=G8($,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 nW($){return o3($)}class l{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(!nW(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(nW(this.handler)){let Z=new this.handler;return Z[this.methodName].bind(Z)()}return this.handler()}middleware($){return this.middlewares=l0($),this}}class rW{url;headers;__internal_brand="ProxyHandler";middlewares=[];constructor($,Z){this.url=$;this.headers=Z}middleware($){return this.middlewares=l0($),this}async run(){let $=new C,Z=$.headers.toJSON();for(let J of aW($.rawRequest))delete Z[J];try{return await fetch(this.url,{method:$.rawRequest.method,headers:{...Z,...this.headers},body:$.rawRequest.body})}catch(J){if(sW($.rawRequest))throw new $Z(iW($.rawRequest));throw J}}}class tW{constructor(...$){return new l(...$)}}class eW extends l{__internal_brand="StreamHandler";async run($){let Z=T.getStore(),J=Z?.req?.rawRequest,W=F8(J?.headers.get("Range"));if(Z)Z.rangeRequest=W;try{let Y=await super.run($);return await Q8(Y,{range:W,method:J?.method})}catch(Y){if(Y instanceof B8)return rZ(Y.total);throw Y}finally{if(Z)Z.rangeRequest=null}}}class $9{constructor(...$){return new eW(...$)}}class Z9{__internal_brand="ResourceRoutes";first;second;constructor($){this.first={get:new l("GET",$,"list"),post:new l("POST",$,"store")},this.second={get:new l("GET",$,"show"),put:new l("PUT",$,"update"),delete:new l("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 T0{static __brand="ApiRouter";routes={};middlewares=[];middleware($){}get($,Z){return new l("GET",$,Z)}post($,Z){return new l("POST",$,Z)}put($,Z){return new l("PUT",$,Z)}patch($,Z){return new l("PATCH",$,Z)}delete($,Z){return new l("DELETE",$,Z)}resource($){return new Z9($)}agent($){if($.kind!=="agent-controller")throw TypeError(`this.agent() takes an AgentController class, and got ${oW($)}.`);return MK($,this)}voice($){if($.kind!=="agent-controller")throw TypeError(`this.voice() takes an AgentController class, and got ${oW($)}.`);return TK($,this)}file($,Z){return new tW("GET",$,Z)}stream($,Z){return new $9("GET",$,Z)}proxy($,Z={}){return new rW($,Z)}}function oW($){if(typeof $==="function"&&$.name)return $.name;return typeof $}function MK($,Z){let J={stream:new l("POST",$,"stream"),attach:new l("POST",$,"attach"),stop:new l("POST",$,"stop"),upload:new l("POST",$,"upload")};return class extends T0{static __internal_brand="AgentRoute";static controller=$;static handlers=J;constructor(){super();this.middlewares=[...Z?.middlewares??[]]}routes={"/":J.stream,"/attach":J.attach,"/stop":J.stop,"/files":J.upload};static middleware(Y){if(Y.stream)J.stream.middleware(Y.stream);if(Y.attach)J.attach.middleware(Y.attach);if(Y.stop)J.stop.middleware(Y.stop);if(Y.upload)J.upload.middleware(Y.upload);return this}}}function TK($,Z){let J={start:new l("POST",$,"voiceStart"),update:new l("PATCH",$,"voiceUpdate"),end:new l("DELETE",$,"voiceEnd")};return class extends T0{static __internal_brand="VoiceRoute";static controller=$;static handlers=J;constructor(){super();this.middlewares=[...Z?.middlewares??[]]}routes={"/":J.start,"/:sessionId":{patch:J.update,delete:J.end}};static middleware(Y){if(Y.start)J.start.middleware(Y.start);if(Y.update)J.update.middleware(Y.update);if(Y.end)J.end.middleware(Y.end);return this}}}var h1="access_token";function L$($){return $?.cookies?.get("access_token")||$?.headers?.get("access_token")||null}async function t3($,Z){let J=L$(Z);if(!J)return null;return(await $.getSession(J,Z.headers.get("User-Agent")))?.user??null}var NK=/^[A-Za-z0-9_-]+$/,_K=/^:[A-Za-z_][A-Za-z0-9_]*$/,J9=/^[A-Za-z0-9_-]{1,128}$/,xK=/^[A-Za-z0-9_.:-]+$/;class h extends Error{constructor($){super($);this.name="InvalidChannelError"}}function W9($){return typeof $==="object"&&$!==null&&typeof $.topic==="string"}function ZZ($){if(typeof $!=="string"||$.length===0)throw new h("A channel pattern must be a non-empty string.");if($.length>255)throw new h(`The channel pattern "${$.slice(0,40)}\u2026" is longer than ${"255"} characters.`);let Z=$.split("."),J=new Set;for(let W of Z){if(_K.test(W)){let Y=W.slice(1);if(J.has(Y))throw new h(`The channel pattern "${$}" names the param "${Y}" twice.`);J.add(Y);continue}if(W.startsWith("__"))throw new h(`The channel "${$}" has the segment "${W}". Segments starting with "__" are reserved for gemi (driver control messages).`);if(!NK.test(W))throw new h(`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 $3($,Z={}){let J=ZZ($),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 h(`The channel "${$}" needs the param "${z}".`);let Q=typeof X==="number"&&Number.isFinite(X)?String(X):X;if(typeof Q!=="string"||!J9.test(Q))throw new h(`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 h(`The channel "${$}" has no param "${j}".`);if(Y.length>255)throw new h(`The topic built from "${$}" is longer than 255 characters.`);return Y}function V8($){if(ZZ($).some((J)=>J.startsWith(":")))throw new h(`"${$}" is a pattern, not a topic: pass its params, as in Broadcast.to("${$}", { ... }).`);return $}function Y9($){if(typeof $!=="string"||$.length===0||$.length>64||!xK.test($))throw new h(`The event name "${String($).slice(0,40)}" must be 1 to 64 letters, digits, "_", "-", "." or ":".`);return $}function j9($,Z){if($===Z)return!0;if($===G0)return Z.startsWith(`${G0}.`)&&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(":")&&J9.test(W[j]))}var G0="user";function JZ($){let Z=typeof $==="object"&&$!==null?$.id:$;return $3(`${G0}.:id`,{id:Z})}class r{req;static runsOnRefusal=!1;config={};constructor($){this.req=$}run(...$){return{}}static configure($){let Z=this;return class extends Z{config=$}}}class e3 extends r{run($){let Z=$??this.config.limit;if(Z===void 0||Z==="")throw Error('`body-limit` needs a size, as in "body-limit:64kb".');return r3(this.req.rawRequest,eZ(Z)),{}}}function CK($){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 SK={"body-limit":e3};class c1{config;static token="middleware";defaultBodyLimit;constructor($){this.config=$;this.defaultBodyLimit=$.bodyLimit===null||$.bodyLimit===void 0?null:eZ($.bodyLimit)}get aliases(){return{...SK,...this.config.aliases}}applyDefaultBodyLimit($){if(this.defaultBodyLimit!==null&&!lW($))r3($,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 CK($).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:z9(z)})}}else if(o3(Y)){let z=new Y(Z);W.push({run:z.run.bind(z),runsOnRefusal:z9(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 AK(W.slice(j+1)),z}return Y})()}}function z9($){return $?.runsOnRefusal===!0}async function AK($){for(let Z of $){if(!Z.runsOnRefusal)continue;try{await Z.run()}catch(J){console.error(J)}}}class $6{visibility;authorizer;middlewares=[];constructor($,Z){this.visibility=$;this.authorizer=Z}middleware($){return this.middlewares=[...this.middlewares,...l0($)],this}events(...$){return this}}class K9{static __brand="ChannelRouter";channels={};public(){return new $6("public")}private($){return new $6("private",$)}async authorize($,Z,J={},W={}){try{RK(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(!F9(Y))return{ok:!1,code:"unknown_channel"};let j=null;try{if(Z===G0){if(Object.keys(J??{}).length>0)return{ok:!1,code:"invalid_params"}}else j=$3(Z,J??{})}catch(Q){if(Q instanceof h)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(()=>Z6.exit(()=>T.run(X,async()=>{let Q=T.getStore();try{if(Y.middlewares.length>0)await L(c1).runMiddleware(Y.middlewares);if(Z===G0){let G=await X9(X);if(!G)return{ok:!1,code:"denied"};if(j=JZ(G),Y.visibility==="private"&&Y.authorizer){if(await Q9(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 Q9(Y.authorizer,X,z):await X9(X)!==null)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}catch(G){if(bK(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 EK($,Z,J={},W={}){let Y=typeof $==="function"?new $:$;B9(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 F9($){let Z=$?.visibility;return typeof $==="object"&&$!==null&&Array.isArray($.middlewares)&&(Z==="public"||Z==="private")}async function X9($){if(!T.getStore().user&&L$($)===null)return null;try{return await w0.user()}catch(Z){if(Z?.name==="AuthenticationError")return null;throw Z}}function Q9($,Z,J){if(fK($))return new $().authorize(Z,J);return $(Z,J)}function fK($){return typeof $==="function"&&typeof $.prototype?.authorize==="function"}function bK($){return $?.kind===d1||u1($)||H$($)}var G9=new WeakSet;function RK($){if(G9.has($))return;B9($),G9.add($)}function B9($){let Z=Object.entries($.channels),J=[];for(let[W,Y]of Z){if(!F9(Y))throw new h(`The channel "${W}" is not declared with this.public() or this.private().`);let j=ZZ(W);if(j[0].startsWith(":"))throw new h(`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!==G0&&j.length===2&&j[0]===G0)throw new h(`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!==G0&&Y.visibility==="private"&&!Y.authorizer&&j.some((z)=>z.startsWith(":")))throw new h(`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===G0?[G0,":id"]:j})}for(let W=0;W<J.length;W++)for(let Y=W+1;Y<J.length;Y++)if(wK(J[W].segments,J[Y].segments))throw new h(`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 wK($,Z){if($.length!==Z.length)return!1;return $.every((J,W)=>J===Z[W]||J.startsWith(":")||Z[W].startsWith(":"))}class D8{as;input;bind;__internal_brand="McpModelParam";constructor($,Z,J){this.as=$;this.input=Z;this.bind=J}}class O8{method;url;meta;__internal_brand="McpRoute";constructor($,Z,J){this.method=$;this.url=Z;this.meta=J}}class U8{tool;meta;__internal_brand="McpTool";constructor($,Z){this.tool=$;this.meta=Z}}class V9{static __brand="McpRouter";routes={};scopes;param($){return new D8($.as,$.input,$.bind)}fromTool($,Z={}){return new U8($,Z)}fromApiRoute($,Z,J){return new O8($,Z,J)}}function K0($,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 L8 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 I1{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 L8([K0($,Y)||"/",X.toString()].filter(Boolean).join("?"),z??(j?301:307))}static external($,Z=307){throw new L8($,Z)}}var D9=Symbol.for("gemi.HttpResponse");class P${kind;body;status;headers;[D9]=!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 kK(J),new P$("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 P$.json({error:Z},{...J,status:$})}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}}}function kK($){if(!Number.isInteger($)||$<200||$>599)throw RangeError(`HttpResponse: status must be an integer from 200 to 599, got ${$}.`);if($===204||$===205||$===304)throw RangeError(`HttpResponse.json: a ${$} response has no body.`)}function WZ($){return typeof $==="object"&&$!==null&&$[D9]===!0}function qK($,Z,J={}){return P$.error($,Z,J)}class O9{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 I1.to(J,{permanent:W,status:Y}),{}}middleware($){return this.middlewares=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}async function H8($,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",a3(Y,z));return new Response(W instanceof Blob?W.stream():W,{status:X,headers:Z})}class U9{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=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}function L9($,Z){if(WZ($))throw Error(`The handler of view "${Z}" returned an HttpResponse. HttpResponse is for api routes; a view handler returns its props.`);return $}class H9{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=L9(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}middleware($){return this.middlewares=l0($),this}static($={}){return this.staticOptions={...$},this}feature($){return this.featureGates=[...this.featureGates,$],this}}class P9{viewPath;children;middlewares=[];featureGates=[];alwaysRuns=!1;handler=()=>({});constructor($,Z,J){this.viewPath=$;if(typeof Z==="function")this.handler=Z,this.children=class extends M1{routes=J??{}};else if(Array.isArray(Z)){let[W,Y]=Z;this.handler=(j)=>{return new W()[Y](j)},this.children=class extends M1{routes=J??{}}}else this.children=class extends M1{routes=Z},this.handler=()=>({})}async run($,Z){let J=L9(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=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}class M1{middlewares=[];featureGates=[];routes={};view($,Z){return new H9($,Z)}file($){return new U9($)}redirect($){return new O9($)}layout($,Z,J){return new P9($,Z,J)}}function yK($){return $}function vK(){return{aliases:{},global:[],bodyLimit:null}}var Y1="redirect";function j1($,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 YZ($){let Z=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();return Z?Z==="https":new URL($.url).protocol==="https:"}function gK($,Z=!0){let J=new URL($.rawRequest.url),W=J.pathname.replace(/\.(json|og)$/,""),[,Y,...j]=W.split("/");if(L(n).supportedLocales.includes(Y))W=`/${j.join("/")}`;return Z?`${W}${J.search}`:W}function mK($,Z){let J=(W)=>W.replace(/\/+$/,"")||"/";return J($)===J(Z)}function J6($,Z){let J=Z||L(A).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=gK($,!W);if(W||!mK(new URL(j,Y).pathname,Y.pathname))Y.searchParams.set(Y1,j)}return W?Y.href:`${Y.pathname}${Y.search}`}class I9 extends r{async run($){let Z=T.getStore(),J=Z.req;if(Z.user)return{};let W=await t3(L(A),J);if(!W)throw new I$({redirectTo:J6(J,$)});return Z.setUser(W),{}}}var I8="gemi_same_site",P8="private, no-cache, no-store, max-age=0, must-revalidate";class W6 extends r{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(I8))return{};if(L$(Z))return{};let Y=J.headers.get("Sec-Fetch-Site");if(Y&&Y!=="cross-site")return{};throw W.searchParams.set(I8,"1"),new M9(`${W.pathname}${W.search}`)}}class M9 extends Z0{location;constructor($){super("Same-site bounce");this.location=$;this.name="SameSiteBounce";let Z=pK($),J={"Content-Type":"text/html; charset=utf-8","Cache-Control":P8,"Referrer-Policy":"no-referrer","X-Robots-Tag":"noindex"};this.payload={api:{status:401,data:{},headers:{"Cache-Control":P8}},viewData:{status:200,data:{},headers:{"Cache-Control":P8},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 pK($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}class T9 extends r{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 N9={"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 _9 extends r{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={...N9,...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={...N9,...this.config.origins["*"]};delete J["Access-Control-Allow-Credentials"];for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}return{}}}var hK="Rate limit exceeded";class i1 extends Z0{result;retryAfter;constructor($,Z=hK){super(Z);this.result=$;this.retryAfter=$?.retryAfter;let J={"Content-Type":"application/json",...$?M8($):{}};this.payload={api:{status:429,data:{error:{...l1("rate_limit",Z,429),...$?{retryAfter:$.retryAfter}:{}}},headers:J},view:{error:{message:Z},status:429,headers:J}}}}function M8($){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 z1{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(x9("window",W),x9("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 i1(W,typeof J==="function"?J(W):J);return W}}function x9($,Z){if(!Number.isFinite(Z)||Z<=0)throw Error(`Rate limiter ${$} must be greater than zero, got ${Z}`)}import{isIP as T8}from"net";function M$($){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 T8(j)===6?j:null}if(T8(Z))return Z;let J=/^(\d{1,3}(?:\.\d{1,3}){3}):\d{1,5}$/.exec(Z);return J&&T8(J[1])===4?J[1]:null}class E9 extends r{async run($,Z){let J=cK();if(!J)return{};let W=await J.consume(this.key(),{limit:C9($)??this.config.limit,window:C9(Z)??this.config.window});if(this.config.headers!==!1){let Y=this.req.ctx?.();if(Y)for(let[j,z]of Object.entries(M8(W)))Y.setHeaders(j,z)}if(!W.allowed)throw new i1(W);return{}}key(){if(this.config.key)return this.config.key(this.req);let $=S9(this.req.rawRequest);if($)return`mcp:${$.via}:${$.id}:${this.req.routePath??"*"}`;return`${jZ(this.req)}:${this.req.routePath??"*"}`}}function cK(){try{let $=L();return $.bound(z1)?$.make(z1):null}catch{return null}}function jZ($){let Z=A9($.rawRequest);if(Z!==void 0)return Z;let J=$.headers.get("x-forwarded-for");if(J){let[W]=J.split(",");if(W?.trim())return M$(W)??W.trim()}return $.headers.get("x-real-ip")?.trim()||"unknown"}function C9($){if($===void 0||$===null||$==="")return;let Z=Number($);if(!Number.isFinite(Z)||Z<=0)return;return Z}class b9 extends r{async run(){let $=this.req.cookies.get("csrf_token");if(!$)throw new N8;if(!["POST","PUT","PATCH","DELETE"].includes(this.req.rawRequest.method))return{};if(!Bun.CSRF.verify($,{secret:process.env.SECRET}))throw new N8;return{}}}class N8 extends Z0{constructor(){super("Invalid CSRF token");this.name="InvalidCSRFTokenError"}payload={api:{status:403,data:{error:f9("csrf","Invalid CSRF token",403)}},view:{}}}class R9{policiesList={};constructor(){let $=this.register();for(let Z of $){let J=new Z;this.policiesList[Z.name]=J}}register(){return[]}}class w9{all($,Z){return!0}}class _8{options;param;refuse;answers=new WeakMap;constructor($){this.options=$;this.param=$.param,this.refuse=$.refuse??"not_found"}refusal(){return this.refuse==="forbidden"?new zZ:new Y6}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 r{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 zZ:$ instanceof Y6}}function dK($){return new _8($)}async function z6($,Z,J=!1){if(!$.body)return new Uint8Array;let[W,Y]=await WF($.body),z=W.length>=2&&W[0]===31&&W[1]===139?Y.pipeThrough(new DecompressionStream("gzip")):Y;return JF(z,Z,J,$.url)}async function JF($,Z,J,W){let Y=$.getReader(),j=[],z=0;try{for(;;){let{done:G,value:K}=await Y.read();if(G)break;if(z+K.byteLength>Z){if(!J)throw new j6(W,Z);j.push(K.subarray(0,Z-z)),z=Z;break}j.push(K),z+=K.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 WF($){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 X6($){return new TextDecoder("utf-8").decode($)}var YF={"&":"&","<":"<",">":">",'"':""","'":"'"};function T$($){return $.replace(/[&<>"']/g,(Z)=>YF[Z])}var jF={amp:"&",lt:"<",gt:">",quot:'"',apos:"'"};function x8($){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 jF[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 C8($){let Z=$.indexOf(":");return(Z===-1?$:$.slice(Z+1)).toLowerCase()}function k9($,Z){let J=$.length,W=0;while(W<J){if(Z.stopped?.())return;let Y=$.indexOf("<",W);if(Y===-1){Z.text(x8($.slice(W)));return}if(Y>W)Z.text(x8($.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(C8($.slice(Y+2,j).trim())),W=j+1}else{let j=zF($,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=C8(z.slice(0,Q));if(G){if(Z.open(G,XF(z.slice(Q)),X),X)Z.close(G)}W=j+1}}}function zF($,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 XF($){let Z={},J=/([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;for(let W of $.matchAll(J))Z[C8(W[1])]=x8(W[2]??W[3]??"");return Z}class J0 extends Error{url;status;constructor($,Z=null,J=null){super($);this.url=Z;this.status=J;this.name="SitemapError"}}var m9="http://www.sitemaps.org/schemas/sitemap/0.9",QF="http://www.w3.org/1999/xhtml",E8=`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
import{dh as jK}from"./chunk-hh5bs656.js";import{xh as YK}from"./chunk-3csz8pfk.js";import{$h as I$,Ai as WQ,Bi as u$,Ch as zG,Ci as l$,Dh as S9,Di as qG,Eh as A9,Fh as F8,Fi as yG,Gh as j8,Jh as z8,Kh as X8,Lh as lZ,Mh as yQ,Nh as MW,Oh as aW,Ph as p,Vh as C,Wh as R8,Xh as zZ,Yh as B8,Zh as Y6,ai as g,bi as y4,pi as j6,wi as XZ,yh as J3}from"./chunk-95vm1de8.js";import{Ii as d1,Ji as Z0,Ki as l1,Li as f9}from"./chunk-cee5gq7t.js";import{Mi as m3,Ni as UG,Ri as DY,Si as d4,Ti as T}from"./chunk-a8n9ec43.js";import{Wi as tX,Zi as g3}from"./chunk-563ksar3.js";import{bj as CY,ej as AG}from"./chunk-n9n4qt20.js";import{Bj as u1,wj as H$}from"./chunk-xv58jnpb.js";import{Pj as kX}from"./chunk-313593t3.js";import{Qj as i$,Tj as CG}from"./chunk-86zhngpg.js";import{Uj as O1}from"./chunk-attr793y.js";import{$j as vZ,Vj as Z6,Wj as i0,Xj as T1,Yj as ZK,Zj as JK,ak as wG,jk as WK}from"./chunk-2ery6a75.js";import{yk as N1}from"./chunk-73rzf7ys.js";import{Dk as WG,Ik as DW}from"./chunk-2x6cv37t.js";import{Pk as JG,Uk as n}from"./chunk-mr3szvr3.js";import{Vk as uZ,Yk as L}from"./chunk-1fyn63ka.js";import{el as FW}from"./chunk-g8sh9btf.js";import{fl as vG}from"./chunk-mzkzgp2j.js";import{pl as zW}from"./chunk-apga49vp.js";import{rl as XG}from"./chunk-fqqbnp0z.js";import{wl as u4}from"./chunk-jzpbwvbt.js";function o3($){return typeof $==="function"&&$.prototype!==void 0}function l0($){return typeof $==="string"?[$]:$}function a3($,Z){let J=Z?"attachment":"inline",W=$.replace(/["\\]/g,"").replace(/[^\x20-\x7e]/g,"_");return`${J}; filename="${W}"; filename*=UTF-8''${encodeURIComponent($)}`}function UK($){return"total"in $&&"partial"in $&&"body"in $}function cW(){return new Response("Not found",{status:404,headers:{"X-Content-Type-Options":"nosniff"}})}function rZ($){return new Response(null,{status:416,headers:{"Accept-Ranges":"bytes","Content-Range":X8($),"Content-Length":"0","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}async function LK($){if($ instanceof Blob)return{body:$,start:0,end:$.size-1,total:$.size,partial:!1,type:$.type,name:$.name,download:!1,status:200,extraHeaders:{}};if(UK($))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 Q8($,Z){if($ instanceof Response)return $;if(!$)return cW();let J=await LK($),{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 cW()}let{range:Q}=Z;if(Q){if(z<=0)return rZ(Math.max(z,0));if(!X){if(W instanceof Blob){let F=j8(Q,z);if(!F)return rZ(z);W=W.slice(F.start,F.end+1),Y=F.start,j=F.end,X=!0}}}let G=Boolean(Q)&&X,K=G?206:J.status,B=new Headers;if(B.set("Accept-Ranges","bytes"),B.set("Content-Type",J.type||"application/octet-stream"),B.set("X-Content-Type-Options","nosniff"),G)B.set("Content-Range",z8(Y,j,z)),B.set("Content-Length",String(j-Y+1));else if(z>=0)B.set("Content-Length",String(z));if(J.name)B.set("Content-Disposition",a3(J.name,J.download));if(J.etag)B.set("ETag",J.etag);if(J.lastModified)B.set("Last-Modified",J.lastModified.toUTCString());for(let[F,O]of Object.entries(J.extraHeaders))B.set(F,O);if((Z.method??"GET").toUpperCase()==="HEAD"){if(W&&"cancel"in W&&typeof W.cancel==="function")await W.cancel();return new Response(null,{status:K,headers:B})}return new Response(W,{status:K,headers:B})}class $Z extends Z0{limit;constructor($){super("The request body is too large.",{status:413});this.limit=$}}var dW={b:1,k:1024,kb:1024,m:1048576,mb:1048576,g:1073741824,gb:1073741824};function eZ($){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 dW)))return Math.floor(Number(J[1])*(dW[J[2]]??1))}throw Error(`Invalid body limit ${JSON.stringify($)}. Use a byte count or a size such as "64kb", "1mb" or "none".`)}var tZ=new WeakMap;function lW($){return tZ.has($)}function iW($){return tZ.get($)?.limit??null}function sW($){let Z=tZ.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 K8($,Z){let J=HK($);if(J!==null&&J>Z)throw new $Z(Z)}function r3($,Z,J={}){let W=tZ.get($);if(W)W.limit=Z;else{let Y={limit:Z,read:0,stream:void 0,used:!1};tZ.set($,Y),IK($,Y)}if(J.checkDeclared!==!1)K8($,Z)}function PK($){return Reflect.get(Object.getPrototypeOf($),"body",$)??null}function G8($,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 $Z(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 e$($,Z){if(K8($,Z.limit),Z.used||Z.stream?.locked)throw TypeError("Body already used");Z.used=!0;let J=G8($,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 uW($){return $.headers.get("Content-Type")??""}function IK($,Z){let J=(W,Y)=>Object.defineProperty($,W,{configurable:!0,...Y});J("body",{get:()=>G8($,Z)}),J("bodyUsed",{get:()=>Z.used||Boolean(Z.stream?.locked)||Reflect.get(Object.getPrototypeOf($),"bodyUsed",$)}),J("bytes",{value:()=>e$($,Z)}),J("arrayBuffer",{value:async()=>{let W=await e$($,Z);return W.buffer.slice(W.byteOffset,W.byteOffset+W.byteLength)}}),J("text",{value:async()=>new TextDecoder().decode(await e$($,Z))}),J("json",{value:async()=>JSON.parse(new TextDecoder().decode(await e$($,Z)))}),J("blob",{value:async()=>new Blob([await e$($,Z)],{type:uW($)})}),J("formData",{value:async()=>new Response(await e$($,Z),{headers:{"Content-Type":uW($)}}).formData()}),J("clone",{value:()=>{K8($,Z.limit);let W=G8($,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 nW($){return o3($)}class l{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(!nW(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(nW(this.handler)){let Z=new this.handler;return Z[this.methodName].bind(Z)()}return this.handler()}middleware($){return this.middlewares=l0($),this}}class rW{url;headers;__internal_brand="ProxyHandler";middlewares=[];constructor($,Z){this.url=$;this.headers=Z}middleware($){return this.middlewares=l0($),this}async run(){let $=new C,Z=$.headers.toJSON();for(let J of aW($.rawRequest))delete Z[J];try{return await fetch(this.url,{method:$.rawRequest.method,headers:{...Z,...this.headers},body:$.rawRequest.body})}catch(J){if(sW($.rawRequest))throw new $Z(iW($.rawRequest));throw J}}}class tW{constructor(...$){return new l(...$)}}class eW extends l{__internal_brand="StreamHandler";async run($){let Z=T.getStore(),J=Z?.req?.rawRequest,W=F8(J?.headers.get("Range"));if(Z)Z.rangeRequest=W;try{let Y=await super.run($);return await Q8(Y,{range:W,method:J?.method})}catch(Y){if(Y instanceof B8)return rZ(Y.total);throw Y}finally{if(Z)Z.rangeRequest=null}}}class $9{constructor(...$){return new eW(...$)}}class Z9{__internal_brand="ResourceRoutes";first;second;constructor($){this.first={get:new l("GET",$,"list"),post:new l("POST",$,"store")},this.second={get:new l("GET",$,"show"),put:new l("PUT",$,"update"),delete:new l("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 T0{static __brand="ApiRouter";routes={};middlewares=[];middleware($){}get($,Z){return new l("GET",$,Z)}post($,Z){return new l("POST",$,Z)}put($,Z){return new l("PUT",$,Z)}patch($,Z){return new l("PATCH",$,Z)}delete($,Z){return new l("DELETE",$,Z)}resource($){return new Z9($)}agent($){if($.kind!=="agent-controller")throw TypeError(`this.agent() takes an AgentController class, and got ${oW($)}.`);return MK($,this)}voice($){if($.kind!=="agent-controller")throw TypeError(`this.voice() takes an AgentController class, and got ${oW($)}.`);return TK($,this)}file($,Z){return new tW("GET",$,Z)}stream($,Z){return new $9("GET",$,Z)}proxy($,Z={}){return new rW($,Z)}}function oW($){if(typeof $==="function"&&$.name)return $.name;return typeof $}function MK($,Z){let J={stream:new l("POST",$,"stream"),attach:new l("POST",$,"attach"),stop:new l("POST",$,"stop"),upload:new l("POST",$,"upload")};return class extends T0{static __internal_brand="AgentRoute";static controller=$;static handlers=J;constructor(){super();this.middlewares=[...Z?.middlewares??[]]}routes={"/":J.stream,"/attach":J.attach,"/stop":J.stop,"/files":J.upload};static middleware(Y){if(Y.stream)J.stream.middleware(Y.stream);if(Y.attach)J.attach.middleware(Y.attach);if(Y.stop)J.stop.middleware(Y.stop);if(Y.upload)J.upload.middleware(Y.upload);return this}}}function TK($,Z){let J={start:new l("POST",$,"voiceStart"),update:new l("PATCH",$,"voiceUpdate"),end:new l("DELETE",$,"voiceEnd")};return class extends T0{static __internal_brand="VoiceRoute";static controller=$;static handlers=J;constructor(){super();this.middlewares=[...Z?.middlewares??[]]}routes={"/":J.start,"/:sessionId":{patch:J.update,delete:J.end}};static middleware(Y){if(Y.start)J.start.middleware(Y.start);if(Y.update)J.update.middleware(Y.update);if(Y.end)J.end.middleware(Y.end);return this}}}var h1="access_token";function L$($){return $?.cookies?.get("access_token")||$?.headers?.get("access_token")||null}async function t3($,Z){let J=L$(Z);if(!J)return null;return(await $.getSession(J,Z.headers.get("User-Agent")))?.user??null}var NK=/^[A-Za-z0-9_-]+$/,_K=/^:[A-Za-z_][A-Za-z0-9_]*$/,J9=/^[A-Za-z0-9_-]{1,128}$/,xK=/^[A-Za-z0-9_.:-]+$/;class h extends Error{constructor($){super($);this.name="InvalidChannelError"}}function W9($){return typeof $==="object"&&$!==null&&typeof $.topic==="string"}function ZZ($){if(typeof $!=="string"||$.length===0)throw new h("A channel pattern must be a non-empty string.");if($.length>255)throw new h(`The channel pattern "${$.slice(0,40)}\u2026" is longer than ${"255"} characters.`);let Z=$.split("."),J=new Set;for(let W of Z){if(_K.test(W)){let Y=W.slice(1);if(J.has(Y))throw new h(`The channel pattern "${$}" names the param "${Y}" twice.`);J.add(Y);continue}if(W.startsWith("__"))throw new h(`The channel "${$}" has the segment "${W}". Segments starting with "__" are reserved for gemi (driver control messages).`);if(!NK.test(W))throw new h(`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 $3($,Z={}){let J=ZZ($),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 h(`The channel "${$}" needs the param "${z}".`);let Q=typeof X==="number"&&Number.isFinite(X)?String(X):X;if(typeof Q!=="string"||!J9.test(Q))throw new h(`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 h(`The channel "${$}" has no param "${j}".`);if(Y.length>255)throw new h(`The topic built from "${$}" is longer than 255 characters.`);return Y}function V8($){if(ZZ($).some((J)=>J.startsWith(":")))throw new h(`"${$}" is a pattern, not a topic: pass its params, as in Broadcast.to("${$}", { ... }).`);return $}function Y9($){if(typeof $!=="string"||$.length===0||$.length>64||!xK.test($))throw new h(`The event name "${String($).slice(0,40)}" must be 1 to 64 letters, digits, "_", "-", "." or ":".`);return $}function j9($,Z){if($===Z)return!0;if($===G0)return Z.startsWith(`${G0}.`)&&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(":")&&J9.test(W[j]))}var G0="user";function JZ($){let Z=typeof $==="object"&&$!==null?$.id:$;return $3(`${G0}.:id`,{id:Z})}class r{req;static runsOnRefusal=!1;config={};constructor($){this.req=$}run(...$){return{}}static configure($){let Z=this;return class extends Z{config=$}}}class e3 extends r{run($){let Z=$??this.config.limit;if(Z===void 0||Z==="")throw Error('`body-limit` needs a size, as in "body-limit:64kb".');return r3(this.req.rawRequest,eZ(Z)),{}}}function CK($){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 SK={"body-limit":e3};class c1{config;static token="middleware";defaultBodyLimit;constructor($){this.config=$;this.defaultBodyLimit=$.bodyLimit===null||$.bodyLimit===void 0?null:eZ($.bodyLimit)}get aliases(){return{...SK,...this.config.aliases}}applyDefaultBodyLimit($){if(this.defaultBodyLimit!==null&&!lW($))r3($,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 CK($).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:z9(z)})}}else if(o3(Y)){let z=new Y(Z);W.push({run:z.run.bind(z),runsOnRefusal:z9(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 AK(W.slice(j+1)),z}return Y})()}}function z9($){return $?.runsOnRefusal===!0}async function AK($){for(let Z of $){if(!Z.runsOnRefusal)continue;try{await Z.run()}catch(J){console.error(J)}}}class $6{visibility;authorizer;middlewares=[];constructor($,Z){this.visibility=$;this.authorizer=Z}middleware($){return this.middlewares=[...this.middlewares,...l0($)],this}events(...$){return this}}class K9{static __brand="ChannelRouter";channels={};public(){return new $6("public")}private($){return new $6("private",$)}async authorize($,Z,J={},W={}){try{RK(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(!F9(Y))return{ok:!1,code:"unknown_channel"};let j=null;try{if(Z===G0){if(Object.keys(J??{}).length>0)return{ok:!1,code:"invalid_params"}}else j=$3(Z,J??{})}catch(Q){if(Q instanceof h)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(()=>Z6.exit(()=>T.run(X,async()=>{let Q=T.getStore();try{if(Y.middlewares.length>0)await L(c1).runMiddleware(Y.middlewares);if(Z===G0){let G=await X9(X);if(!G)return{ok:!1,code:"denied"};if(j=JZ(G),Y.visibility==="private"&&Y.authorizer){if(await Q9(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 Q9(Y.authorizer,X,z):await X9(X)!==null)!==!0)return{ok:!1,code:"denied"}}return{ok:!0,topic:j,pattern:Z}}catch(G){if(bK(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 EK($,Z,J={},W={}){let Y=typeof $==="function"?new $:$;B9(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 F9($){let Z=$?.visibility;return typeof $==="object"&&$!==null&&Array.isArray($.middlewares)&&(Z==="public"||Z==="private")}async function X9($){if(!T.getStore().user&&L$($)===null)return null;try{return await w0.user()}catch(Z){if(Z?.name==="AuthenticationError")return null;throw Z}}function Q9($,Z,J){if(fK($))return new $().authorize(Z,J);return $(Z,J)}function fK($){return typeof $==="function"&&typeof $.prototype?.authorize==="function"}function bK($){return $?.kind===d1||u1($)||H$($)}var G9=new WeakSet;function RK($){if(G9.has($))return;B9($),G9.add($)}function B9($){let Z=Object.entries($.channels),J=[];for(let[W,Y]of Z){if(!F9(Y))throw new h(`The channel "${W}" is not declared with this.public() or this.private().`);let j=ZZ(W);if(j[0].startsWith(":"))throw new h(`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!==G0&&j.length===2&&j[0]===G0)throw new h(`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!==G0&&Y.visibility==="private"&&!Y.authorizer&&j.some((z)=>z.startsWith(":")))throw new h(`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===G0?[G0,":id"]:j})}for(let W=0;W<J.length;W++)for(let Y=W+1;Y<J.length;Y++)if(wK(J[W].segments,J[Y].segments))throw new h(`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 wK($,Z){if($.length!==Z.length)return!1;return $.every((J,W)=>J===Z[W]||J.startsWith(":")||Z[W].startsWith(":"))}class D8{as;input;bind;__internal_brand="McpModelParam";constructor($,Z,J){this.as=$;this.input=Z;this.bind=J}}class O8{method;url;meta;__internal_brand="McpRoute";constructor($,Z,J){this.method=$;this.url=Z;this.meta=J}}class U8{tool;meta;__internal_brand="McpTool";constructor($,Z){this.tool=$;this.meta=Z}}class V9{static __brand="McpRouter";routes={};scopes;param($){return new D8($.as,$.input,$.bind)}fromTool($,Z={}){return new U8($,Z)}fromApiRoute($,Z,J){return new O8($,Z,J)}}function K0($,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 L8 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 I1{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 L8([K0($,Y)||"/",X.toString()].filter(Boolean).join("?"),z??(j?301:307))}static external($,Z=307){throw new L8($,Z)}}var D9=Symbol.for("gemi.HttpResponse");class P${kind;body;status;headers;[D9]=!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 kK(J),new P$("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 P$.json({error:Z},{...J,status:$})}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}}}function kK($){if(!Number.isInteger($)||$<200||$>599)throw RangeError(`HttpResponse: status must be an integer from 200 to 599, got ${$}.`);if($===204||$===205||$===304)throw RangeError(`HttpResponse.json: a ${$} response has no body.`)}function WZ($){return typeof $==="object"&&$!==null&&$[D9]===!0}function qK($,Z,J={}){return P$.error($,Z,J)}class O9{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 I1.to(J,{permanent:W,status:Y}),{}}middleware($){return this.middlewares=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}async function H8($,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",a3(Y,z));return new Response(W instanceof Blob?W.stream():W,{status:X,headers:Z})}class U9{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=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}function L9($,Z){if(WZ($))throw Error(`The handler of view "${Z}" returned an HttpResponse. HttpResponse is for api routes; a view handler returns its props.`);return $}class H9{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=L9(await this.handler($),this.viewPath);return{[this.viewPath]:{...J,breadcrumb:{label:J?.breadcrumb??"",href:Z}}}}middleware($){return this.middlewares=l0($),this}static($={}){return this.staticOptions={...$},this}feature($){return this.featureGates=[...this.featureGates,$],this}}class P9{viewPath;children;middlewares=[];featureGates=[];alwaysRuns=!1;handler=()=>({});constructor($,Z,J){this.viewPath=$;if(typeof Z==="function")this.handler=Z,this.children=class extends M1{routes=J??{}};else if(Array.isArray(Z)){let[W,Y]=Z;this.handler=(j)=>{return new W()[Y](j)},this.children=class extends M1{routes=J??{}}}else this.children=class extends M1{routes=Z},this.handler=()=>({})}async run($,Z){let J=L9(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=l0($),this}feature($){return this.featureGates=[...this.featureGates,$],this}}class M1{middlewares=[];featureGates=[];routes={};view($,Z){return new H9($,Z)}file($){return new U9($)}redirect($){return new O9($)}layout($,Z,J){return new P9($,Z,J)}}function yK($){return $}function vK(){return{aliases:{},global:[],bodyLimit:null}}var Y1="redirect";function j1($,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 YZ($){let Z=$.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();return Z?Z==="https":new URL($.url).protocol==="https:"}function gK($,Z=!0){let J=new URL($.rawRequest.url),W=J.pathname.replace(/\.(json|og)$/,""),[,Y,...j]=W.split("/");if(L(n).supportedLocales.includes(Y))W=`/${j.join("/")}`;return Z?`${W}${J.search}`:W}function mK($,Z){let J=(W)=>W.replace(/\/+$/,"")||"/";return J($)===J(Z)}function J6($,Z){let J=Z||L(A).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=gK($,!W);if(W||!mK(new URL(j,Y).pathname,Y.pathname))Y.searchParams.set(Y1,j)}return W?Y.href:`${Y.pathname}${Y.search}`}class I9 extends r{async run($){let Z=T.getStore(),J=Z.req;if(Z.user)return{};let W=await t3(L(A),J);if(!W)throw new I$({redirectTo:J6(J,$)});return Z.setUser(W),{}}}var I8="gemi_same_site",P8="private, no-cache, no-store, max-age=0, must-revalidate";class W6 extends r{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(I8))return{};if(L$(Z))return{};let Y=J.headers.get("Sec-Fetch-Site");if(Y&&Y!=="cross-site")return{};throw W.searchParams.set(I8,"1"),new M9(`${W.pathname}${W.search}`)}}class M9 extends Z0{location;constructor($){super("Same-site bounce");this.location=$;this.name="SameSiteBounce";let Z=pK($),J={"Content-Type":"text/html; charset=utf-8","Cache-Control":P8,"Referrer-Policy":"no-referrer","X-Robots-Tag":"noindex"};this.payload={api:{status:401,data:{},headers:{"Cache-Control":P8}},viewData:{status:200,data:{},headers:{"Cache-Control":P8},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 pK($){return $.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}class T9 extends r{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 N9={"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 _9 extends r{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={...N9,...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={...N9,...this.config.origins["*"]};delete J["Access-Control-Allow-Credentials"];for(let[W,Y]of Object.entries(J))$.ctx().setHeaders(W,Y)}return{}}}var hK="Rate limit exceeded";class i1 extends Z0{result;retryAfter;constructor($,Z=hK){super(Z);this.result=$;this.retryAfter=$?.retryAfter;let J={"Content-Type":"application/json",...$?M8($):{}};this.payload={api:{status:429,data:{error:{...l1("rate_limit",Z,429),...$?{retryAfter:$.retryAfter}:{}}},headers:J},view:{error:{message:Z},status:429,headers:J}}}}function M8($){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 z1{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(x9("window",W),x9("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 i1(W,typeof J==="function"?J(W):J);return W}}function x9($,Z){if(!Number.isFinite(Z)||Z<=0)throw Error(`Rate limiter ${$} must be greater than zero, got ${Z}`)}import{isIP as T8}from"net";function M$($){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 T8(j)===6?j:null}if(T8(Z))return Z;let J=/^(\d{1,3}(?:\.\d{1,3}){3}):\d{1,5}$/.exec(Z);return J&&T8(J[1])===4?J[1]:null}class E9 extends r{async run($,Z){let J=cK();if(!J)return{};let W=await J.consume(this.key(),{limit:C9($)??this.config.limit,window:C9(Z)??this.config.window});if(this.config.headers!==!1){let Y=this.req.ctx?.();if(Y)for(let[j,z]of Object.entries(M8(W)))Y.setHeaders(j,z)}if(!W.allowed)throw new i1(W);return{}}key(){if(this.config.key)return this.config.key(this.req);let $=S9(this.req.rawRequest);if($)return`mcp:${$.via}:${$.id}:${this.req.routePath??"*"}`;return`${jZ(this.req)}:${this.req.routePath??"*"}`}}function cK(){try{let $=L();return $.bound(z1)?$.make(z1):null}catch{return null}}function jZ($){let Z=A9($.rawRequest);if(Z!==void 0)return Z;let J=$.headers.get("x-forwarded-for");if(J){let[W]=J.split(",");if(W?.trim())return M$(W)??W.trim()}return $.headers.get("x-real-ip")?.trim()||"unknown"}function C9($){if($===void 0||$===null||$==="")return;let Z=Number($);if(!Number.isFinite(Z)||Z<=0)return;return Z}class b9 extends r{async run(){let $=this.req.cookies.get("csrf_token");if(!$)throw new N8;if(!["POST","PUT","PATCH","DELETE"].includes(this.req.rawRequest.method))return{};if(!Bun.CSRF.verify($,{secret:process.env.SECRET}))throw new N8;return{}}}class N8 extends Z0{constructor(){super("Invalid CSRF token");this.name="InvalidCSRFTokenError"}payload={api:{status:403,data:{error:f9("csrf","Invalid CSRF token",403)}},view:{}}}class R9{policiesList={};constructor(){let $=this.register();for(let Z of $){let J=new Z;this.policiesList[Z.name]=J}}register(){return[]}}class w9{all($,Z){return!0}}class _8{options;param;refuse;answers=new WeakMap;constructor($){this.options=$;this.param=$.param,this.refuse=$.refuse??"not_found"}refusal(){return this.refuse==="forbidden"?new zZ:new Y6}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 r{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 zZ:$ instanceof Y6}}function dK($){return new _8($)}async function z6($,Z,J=!1){if(!$.body)return new Uint8Array;let[W,Y]=await WF($.body),z=W.length>=2&&W[0]===31&&W[1]===139?Y.pipeThrough(new DecompressionStream("gzip")):Y;return JF(z,Z,J,$.url)}async function JF($,Z,J,W){let Y=$.getReader(),j=[],z=0;try{for(;;){let{done:G,value:K}=await Y.read();if(G)break;if(z+K.byteLength>Z){if(!J)throw new j6(W,Z);j.push(K.subarray(0,Z-z)),z=Z;break}j.push(K),z+=K.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 WF($){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 X6($){return new TextDecoder("utf-8").decode($)}var YF={"&":"&","<":"<",">":">",'"':""","'":"'"};function T$($){return $.replace(/[&<>"']/g,(Z)=>YF[Z])}var jF={amp:"&",lt:"<",gt:">",quot:'"',apos:"'"};function x8($){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 jF[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 C8($){let Z=$.indexOf(":");return(Z===-1?$:$.slice(Z+1)).toLowerCase()}function k9($,Z){let J=$.length,W=0;while(W<J){if(Z.stopped?.())return;let Y=$.indexOf("<",W);if(Y===-1){Z.text(x8($.slice(W)));return}if(Y>W)Z.text(x8($.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(C8($.slice(Y+2,j).trim())),W=j+1}else{let j=zF($,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=C8(z.slice(0,Q));if(G){if(Z.open(G,XF(z.slice(Q)),X),X)Z.close(G)}W=j+1}}}function zF($,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 XF($){let Z={},J=/([^\s=]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;for(let W of $.matchAll(J))Z[C8(W[1])]=x8(W[2]??W[3]??"");return Z}class J0 extends Error{url;status;constructor($,Z=null,J=null){super($);this.url=Z;this.status=J;this.name="SitemapError"}}var m9="http://www.sitemaps.org/schemas/sitemap/0.9",QF="http://www.w3.org/1999/xhtml",E8=`<?xml version="1.0" encoding="UTF-8"?>
|
|
3
3
|
`,q9=`<urlset xmlns="${m9}" xmlns:xhtml="${QF}">
|
|
4
4
|
`,y9=`</urlset>
|
|
5
5
|
`,N$=50000,Z3=52428800,v9=2048,GF=new Set(["always","hourly","daily","weekly","monthly","yearly","never"]),KF=/^\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2}))?)?)?$/,FF="application/xml; charset=utf-8",g9=new TextEncoder;function f8($,Z){let J;try{J=new URL($)}catch{throw new J0(`Sitemap: ${Z} "${$}" is not an absolute URL.`)}if(J.protocol!=="http:"&&J.protocol!=="https:")throw new J0(`Sitemap: ${Z} "${$}" is not an http(s) URL.`);let W=J.href;if(W.length>v9)throw new J0(`Sitemap: ${Z} is over ${v9} characters: "${W.slice(0,80)}\u2026".`);return W}function p9($,Z){if($ instanceof Date){if(Number.isNaN($.getTime()))throw new J0(`Sitemap: lastmod of ${Z} is an invalid Date.`);return $.toISOString()}if(!KF.test($))throw new J0(`Sitemap: lastmod "${$}" of ${Z} is not a W3C datetime (e.g. "2026-10-07" or "2026-10-07T12:00:00Z").`);return $}function BF($){let Z=f8($.loc,"loc"),J=`<url><loc>${T$(Z)}</loc>`;if($.lastmod!=null)J+=`<lastmod>${T$(p9($.lastmod,Z))}</lastmod>`;if($.changefreq!=null){if(!GF.has($.changefreq))throw new J0(`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 J0(`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 J0(`Sitemap: an alternate of ${Z} has no hrefLang.`);let j=f8(W.href,`alternate href of ${Z}`);J+=`<xhtml:link rel="alternate" hreflang="${T$(Y)}" href="${T$(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((K)=>{if(X||K.status!=="resolved")return;z.enqueue(Y.encode(`${JSON.stringify([K.path,K.variantKey,K.data])}
|
|
21
21
|
`))});let G=setTimeout(()=>Q(!0),J);Z.allSettled().then(()=>Q(!1),()=>Q(!1))},cancel(){j(!1)}})}import{Fragment as nT,createContext as MO,createElement as oT,lazy as aT,use as rT,useContext as tT}from"react";function pQ($){return{islands:[],render:$,instances:new WeakMap,count:0}}var c3="gemi-slot",hQ="data-slot",cQ="data-gemi-slot";var TO=Symbol.for("gemi.staticRender"),dQ=globalThis[TO]??=MO(null);import{createHash as nQ}from"crypto";var WW='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 NO}from"crypto";import{existsSync as lQ,readFileSync as _O}from"fs";import{join as XW}from"path";var iQ=".script",xO=[".ts",".js"],CO="document-scripts.json",sQ="data-gemi-script",SO=/^[A-Za-z0-9_-]+(\/[A-Za-z0-9_-]+)*$/;function AO($){if(typeof $!=="string"||!SO.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 EO($,Z){for(let J of xO){let W=XW($,"views",`${Z}${iQ}${J}`);if(lQ(W))return W}return null}async function uQ($){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 fO($){return`'sha256-${NO("sha256").update($).digest("base64")}'`}var YW,jW=new Map;function bO(){if(YW===void 0){let $=XW(zW(),"dist","server",CO);YW=lQ($)?JSON.parse(_O($,"utf8")):null}return YW??null}async function QW($){AO($);let Z=Bun.env.NODE_ENV==="production";if(Z){let j=bO()?.[$];if(j!==void 0)return j;let z=jW.get($);if(z)return z}let J=XW(zW(),"app"),W=EO(J,$);if(!W)throw Error(`The document script "${$}" was not found. It is a file at app/views/${$}${iQ}.ts (or .js).`);if(!Z)return uQ(W);let Y=uQ(W);return jW.set($,Y),Y.catch(()=>jW.delete($)),Y}async function jN($){return fO(await QW($))}var RO="gemi-islands",VN=`'sha256-${nQ("sha256").update(FW).digest("base64")}'`;function GW($,Z,J,W){if(!J)return $;let Y=W?$.lastIndexOf(Z):$.indexOf(Z);return Y===-1?$+J:$.slice(0,Y)+J+$.slice(Y)}var KW=($)=>$.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<"),DN=`'sha256-${nQ("sha256").update(WW).digest("base64")}'`,wO='await import("/refresh.js").catch(()=>{});await import("/@vite/client").catch(()=>{});',kO="gemi-static";function oQ($,Z,J,W,Y,j){let z=new Set,X=[];if(J)X=Z.islands.map((V)=>{let D=V.module?J(V.module):void 0;if(!D)return console.error(`[gemi] island ${V.module??"(unknown module)"}: no client build entry. Declare it as island(() => import("./Component")) so gemi's Vite plugin builds it.`),null;if(V.load==="eager"){for(let U of D.preload)z.add(U);if(V.preloadDynamic)for(let U of D.dynamicPreload??[])z.add(U)}return{s:D.src,e:V.export,l:V.load}});let Q=X.some((V)=>V!==null),G=j?`<script type="module" ${sQ}="${KW(j.name)}">${j.source}</script>`:"";if(!Q&&!Y)return GW($,"</head>",G,!1);let B=(Y?`<meta name="${kO}" content="${KW(Y.identity)}"${Y.prefetch==="none"?' data-prefetch="none"':""}/>`:"")+[...z].map((V)=>`<link rel="modulepreload" href="${KW(V)}"/>`).join("")+G,F=Y?WW:FW,O=(Q?`<script type="application/json" id="${RO}">${X1({i:X})}</script>`:"")+`<script type="module">${W?wO+F:F}</script>`;return GW(GW($,"</head>",B,!1),"</body>",O,!0)}function qO($,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 aQ($){let Z=`<template ${cQ}="`;for(let J=$.lastIndexOf(Z);J!==-1;J=$.lastIndexOf(Z)){let W=qO($,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=`<${c3} ${hQ}="${j}" style="display:contents"></${c3}>`;$=$.split(Q).join(`<${c3} style="display:contents">${X}</${c3}>`)}return $}function rQ($){if(!$)return{locale:!0,session:!0,csrf:!0};return{locale:!1,session:$.session===!0,csrf:$.csrf===!0}}function tQ($,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)}var yO=async()=>(await import("./chunk-7txqv2qq.js")).default,BW,d3=async(...$)=>{return BW??=import("react-dom/server.browser").catch((Z)=>{throw BW=void 0,Z}),(await BW).renderToReadableStream(...$)},$G=1e4,ZG="no-locale",vO="no-theme";async function gO($,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 OW="/assets";function mO($){return $===OW||$.startsWith(`${OW}/`)}function pO($){let Z=$.filter(mO);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 "${OW}" prefix. The client build output is served from there before the router runs, so the route would never match. Mount it somewhere else.`)}}function hO($){let Z=L(W1).resolver;return{...$.domain,root:Z.root,origin:Z.publicOrigin($.rawRequest)}}function VW($){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 u3{static token="router.view";flatViewRoutes={};routeManifest={};clientRouteManifest={};componentTree=[];flatComponentTree=[];staticRoutes=[];root=null;shellReporter=vQ();preloadCache=new WeakMap;hooks;partialRendering;localeRouting;theme;constructor($){let Z=jQ();this.partialRendering=$.partialRendering??Z.partialRendering,this.localeRouting=$.localeRouting??Z.localeRouting,this.theme=$.theme??Z.theme,this.hooks={onNotFound:$.onNotFound??Z.onNotFound,onRequestStart:$.onRequestStart??Z.onRequestStart,onRequestEnd:$.onRequestEnd??Z.onRequestEnd,onRequestFail:$.onRequestFail??Z.onRequestFail,onStreamComplete:$.onStreamComplete??Z.onStreamComplete};let J={"/":$.rootRouter,"/auth":SJ};this.flatViewRoutes=g4(J),pO(Object.keys(this.flatViewRoutes)),this.routeManifest=p4(J),this.clientRouteManifest=Object.fromEntries(Object.entries(this.routeManifest).filter(([,W])=>W.at(-1)!=="FILE")),this.componentTree=c4(J),this.flatComponentTree=$W(this.componentTree),this.staticRoutes=Object.entries(this.flatViewRoutes).filter(([,W])=>W.static).map(([W])=>W);for(let W of this.staticRoutes){let Y=this.flatViewRoutes[W].static?.layout;if(Y&&!this.flatComponentTree.includes(Y))this.flatComponentTree.push(Y)}this.root=$.root}async passesFeatureGates($){let Z=L(s1);for(let J of $)if(!await Z.enabled(J))return!1;return!0}async onRequestEnd($,Z={}){if(Z.mintSession!==!1)d4();return await this.hooks.onRequestEnd($)}completeStream($,Z){let J=(W)=>{u$.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 K of J?.[G]??[])Q.add(K);return[...Q].map((G)=>q1("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 K=DW(),B=new AbortController,F=setTimeout(()=>B.abort(),$G),O=(D)=>{if(Bun.env.NODE_ENV!=="production")console.error(D)},V=pQ(async(D,U)=>{let H=await d3(D,{signal:B.signal,identifierPrefix:U,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:O});return await H.allReady.catch(()=>{}),await new Response(H).text()});try{let D,U=typeof W.script==="function"?await J(()=>W.script(Z)):W.script;if(U)D={name:U,source:await QW(U)};let H;if(W.navigation){let x=W.navigation===!0?{}:W.navigation,E=x.version?String(await J(()=>x.version(Z))):"";H={identity:[W.layout??"",$.buildId??"",D?.name??"",E].join("|"),prefetch:x.prefetch==="none"?"none":"intent"}}let M=await d3(q1(dQ.Provider,{value:V,children:q1(eQ,{children:[...G,q1(this.root,{data:j,viewImportMap:$.viewImportMap,viewModules:$.viewModules,serverQueries:z,dictionarySink:K,rootLayout:Q,key:"root"})]})}),{signal:B.signal,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:O});await M.allReady.catch(()=>{});let I=aQ(await new Response(M).text());return new Response(oQ(I,V,$.resolveIsland,Bun.env.NODE_ENV!=="production",H,D),{status:200,headers:X})}finally{clearTimeout(F),J(()=>this.completeStream(Z,z.summarize(B.signal.aborted)))}}async render($){let{req:Z,runInRequestScope:J,csrfTokenHMAC:W,currentPathName:Y,headers:j,i18n:z,params:X,pathname:Q,serverQueries:G,userAgent:K,noStream:B,noTheme:F,url:O,user:V,viewData:D,breadcrumbs:U,urlLocaleSegment:H,meta:M,isOgRequest:I,appId:x,features:E,staticView:f}=$,S=this.theme===!1||F||f?null:{cookie:this.theme.cookie??vJ,default:this.theme.default??null,value:dO(Z,this.theme.cookie??vJ)},R=H?kQ(Q,[H]).pathname:Q,P={kind:"view",data:{meta:M,pageData:{[R]:D},__csrf:W.toString("base64"),prefetchedData:{},i18n:z,auth:{user:V},routeManifest:this.clientRouteManifest,breadcrumbs:U,router:{urlLocaleSegment:H,pathname:Y,params:X,currentPath:Q,searchParams:O.search,is404:!Y?!0:!1,domain:Z.domain?hO(Z):null},appId:x,features:E,theme:S,componentTree:[["404",[]],...this.componentTree],...this.staticRoutes.length>0?{staticRoutes:this.staticRoutes}:{}},head:{}},N=this.root,y=this.routeManifest[Y];return async(D$)=>{let{bootstrapModules:I0=[],loaders:v1,getStyles:s,viewImportMap:q,cssManifest:M0,ogMap:s$,viewModules:i3,clientEntry:O$,modulePreloadManifest:g1,assetBase:m1,resolveIsland:n$,buildId:Q0}=D$,oZ=O$?[]:I0,s3=(R0)=>[R0,`window.loaders=${v1}`,...O$?[`import(${JSON.stringify(O$.module)}).catch(function(e){setTimeout(function(){throw e})})`]:[]].join(";");if(I){let R0=null,r$=null;for(let t$ of y??[])if(typeof s$[t$]==="function")r$=t$,R0=s$[t$];if(!R0)return new Response("Not found",{status:404});let XK=Object.values(P.data.pageData)[0];try{await d3(q1(R0,XK[r$]),{onError:()=>{}})}catch(t$){let{fonts:QK,...GK}=t$.satoriOptions,KK=await Promise.all(QK.map((n3)=>{return gO(n3.name,n3.weight,n3.style).then((OK)=>({...n3,data:OK}))})),hW=new Headers(j);hW.set("Content-Type","image/png");let[FK,BK]=await Promise.all([yO(),y4("Rendering an OG image")]),VK=await FK(t$.jsx,{...GK,fonts:KK}),DK=await BK(Buffer.from(VK)).png({compressionLevel:0,effort:10}).toBuffer();return new Response(new Uint8Array(DK),{headers:hW})}return new Response("data")}if(f&&Y)return await this.renderStatic({req:Z,runInRequestScope:J,staticView:f,currentViews:y,data:P.data,serverQueries:G,headers:j,getStyles:s,viewImportMap:q,viewModules:i3,resolveIsland:n$,buildId:Q0});if(P.data.cssManifest=M0,P.data.modulePreloadManifest=g1??{},m1&&m1!=="/")P.data.assetBase=m1;let o$=this.modulePreloadLinks({clientEntry:O$,modulePreloadManifest:g1,views:y??["404"],routeKey:Y??"404"}),aZ=await s(y??["404"]);P.data.prefetchedData=G.snapshotResolved(),G.markRenderStart();let p1=new AbortController,U$=setTimeout(()=>p1.abort(),$G),b=D6(K)||B,b0=Bun.env.NODE_ENV!=="production"&&!b&&Y&&this.shellReporter.shouldObserve(Y)?gQ():null,a$=DW();try{let R0=await d3(q1(eQ,{children:[...o$,...aZ,...S?[q1("script",{key:"theme-script",dangerouslySetInnerHTML:{__html:GQ(X1({cookie:S.cookie,default:S.default}))}})]:[],q1(N,{data:P.data,viewImportMap:q,viewModules:i3,serverQueries:G,dictionarySink:a$,key:"root"})]}),{bootstrapScriptContent:s3(`window.__GEMI_DATA__ = ${X1(P.data)}`),bootstrapModules:oZ,signal:p1.signal,...b?{progressiveChunkSize:Number.MAX_SAFE_INTEGER}:{},onError(r$){if(Bun.env.NODE_ENV!=="production")console.error(r$)}});if(R0.allReady.catch(()=>{}).finally(()=>clearTimeout(U$)),b)await R0.allReady.catch(()=>{});return new Response(h8(R0,G,{onShell:b?void 0:()=>G.markShell(),onChunk:b0?.onChunk,onClose:()=>J(()=>{if(this.completeStream(Z,G.summarize(p1.signal.aborted)),b0)this.shellReporter.report(Y,b0.measure())})},a$),{status:!Y?$.refusedStatus??404:200,headers:j})}catch(R0){if(clearTimeout(U$),Bun.env.NODE_ENV==="production")throw J(()=>this.completeStream(Z,G.summarize(p1.signal.aborted))),R0;let r$=await d3(q1("div"),{bootstrapScriptContent:s3(`window.error= ${X1(R0.message)}; window.stack_trace=${X1(R0.stack)};window.__GEMI_DATA__ = ${X1(P.data)}`),bootstrapModules:Bun.env.NODE_ENV==="development"?["/render-error.js",...oZ]:oZ});return new Response(h8(r$,G,{onClose:()=>J(()=>this.completeStream(Z,G.summarize(p1.signal.aborted)))}),{status:!Y?$.refusedStatus??404:200,headers:j})}}}viewRefusalStatus($,Z,J){if(H$(Z))return 404;if(Z?.kind===d1){let W=Z.payload?.view?.status;return W===403||W===404?W:null}if(u1(Z)){if(!J.has(Z))this.hooks.onRequestFail($,Z);return console.error(Z),403}if(Z instanceof k1&&(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,K=null,B=L(n),F=p3(this.flatViewRoutes,j),O=B.isLocaleAware&&this.localeRouting==="prefix"&&!F?.route.middleware.includes(ZG);if(O&&B.supportedLocales.includes(z))Q=`/${X.join("/")}`,G=z,K=z;if(($.method==="GET"||$.method==="HEAD")&&!W&&!Y&&F===null&&J.pathname.endsWith("/")&&!J.pathname.startsWith("//")){let P=J.pathname.replace(/\/+$/,""),N=O&&B.supportedLocales.includes(P.slice(1));if(P&&!N)return new Response("",{status:301,headers:{Location:`${P}${J.search}`}})}if(O&&!Y&&K===null&&!(K===null&&F!==null)){let P=JG(z,B.supportedLocales,B.defaultLocale);if(P){let N=X.length?`/${X.join("/")}`:"";return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${P}${N}${W?".json":""}${J.search}`}})}}if(O&&!Y){let P=L(n).detectLocale(new C($,{},"view",Q));if(K===null&&P!==B.defaultLocale){let N=J.pathname==="/"?"":J.pathname;return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${P}${N}${J.search}`}})}}Q=Q.replace("//","/");let D=[],U=[],H=null,M={},I=null,x=!1,E=!1,f=[],S;try{let P=p3(this.flatViewRoutes,Q);if(K&&P?.route.middleware.includes(ZG))P=null;if(P){if(H=P.routePath,M=P.params,D=P.route.exec,U=P.route.middleware,f=P.route.features,x=U.includes("no-stream"),E=U.includes(vO),S=P.route.static,W&&this.partialRendering){let N=$.headers.get(eJ),y=wQ({flatViewRoutes:this.flatViewRoutes,supportedLocales:L(n).supportedLocales,from:N,origin:J.origin,to:{segments:P.route.segments,params:M,search:J.search}});if(y.startIndex>0)D=D.slice(y.startIndex),I={from:N,carriedViews:y.carriedViews}}}}catch(P){throw P}if(S&&W)return new Response("Not found",{status:404});let R=new C($,M,"view",H);return this.hooks.onRequestStart(R),await T.run(R,async()=>{let P=null,N=T.getStore(),y=uZ.getStore(),D$=(q)=>uZ.run(y,()=>T.runWith(N,q));N.serverQueries=new cZ(h3($));let I0=new Set;N.serverQueries.onQueryFail((q)=>{I0.add(q.error);try{D$(()=>Promise.resolve(this.hooks.onRequestFail(s,q.error)).catch(()=>{}))}catch{}});let v1=rQ(S);if(K){let q=K.replaceAll("/","");V$.setLocale(q,{cookie:v1.locale})}else if(B.isLocaleAware&&!O)N.setLocale(B.defaultLocale);else V$.setLocale(void 0,{cookie:v1.locale});let s=N.req;if(v1.session)d4();try{let q=null;try{await L(c1).runMiddleware(U)}catch(b){if(q=this.viewRefusalStatus(s,b,I0),q===null)throw b}if(q!==null||f.length>0&&!await this.passesFeatureGates(f))H=null,D=[],s.routePath="";let M0=L(n),s$=M0.isEnabled,i3=M0.isLocaleAware,O$=new C($,s.params),g1={defaultLocale:M0.defaultLocale,timeZone:M0.detectTimeZone(O$)};if(i3){let b=null;if(K)b=K.replaceAll("/",""),N.setLocale(b);else if(!O)b=N.locale??M0.defaultLocale;else b=M0.detectLocale(O$),N.setLocale(b);let b0=s$?M0.getPageTranslations(b,s.routePath):{};g1={...g1,supportedLocales:M0.supportedLocales,currentLocale:b,dictionary:{[b]:b0},defaultLocale:M0.defaultLocale,...O?{}:{localeRouting:"off"}}}await WG(g1.currentLocale??"");let m1;try{m1=await Promise.all(D.map((b)=>b(s)))}catch(b){if(q=this.viewRefusalStatus(s,b,I0),q===null)throw b;H=null,D=[],s.routePath="",m1=[]}if(H===null)await this.hooks.onNotFound(s,{status:q??404});let{cookies:n$,headers:Q0}=N;if(q!==null)Q0.set("Cache-Control","no-store");P={data:m1,cookies:n$,headers:Q0,user:N.user,prefetchedData:N.serverQueries.snapshotResolved(),currentPathName:H,params:s.params,urlLocaleSegment:G,meta:N.renderMeta(),appId:L(ZW).id,features:await L(s1).forClient()};let{params:oZ,user:s3}=P,o$={},aZ={};for(let b of m1??[]){let[b0,a$]=Object.entries(b)?.[0]??[];if(!b0||!a$)continue;aZ[`${b0}:${H}`]=a$.breadcrumb,o$[b0]=a$}let p1=o$.FILE;if(p1){for(let b of n$)Q0.append("Set-Cookie",b.toString());try{await this.onRequestEnd(s)}catch(b){u$.error(b?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(b)})}return await H8(p1,Q0)}if(W){Q0.set("Content-Type","application/x-ndjson; charset=utf-8"),Q0.append("Vary",eJ),n$.forEach((b0)=>Q0.append("Set-Cookie",b0.toString())),await this.hooks.onRequestEnd(s);let b={meta:I&&!N.metadata.touched?null:P.meta,data:{[Q]:o$},breadcrumbs:aZ,prefetchedData:N.serverQueries.snapshotResolved(),i18n:g1,features:P.features,is404:!H,appId:P.appId,partial:I};return new Response(mQ(b,N.serverQueries,void 0,({aborted:b0})=>D$(()=>this.completeStream(s,N.serverQueries.summarize(b0)))),{headers:Q0})}if(Q0.set("Content-Type","text/html; charset=utf-8"),!x&&!(S&&H))Q0.append("Vary","User-Agent");let U$=Boolean(S&&H);if(!U$||v1.session)d4();for(let b of n$)Q0.append("Set-Cookie",b.toString());if(!U$||v1.csrf){let b=Bun.CSRF.generate(process.env.SECRET);Q0.append("Set-Cookie",`csrf_token=${b}; HttpOnly; Secure; SameSite=Strict; Expires=${new Date(Date.now()+86400000).toUTCString()}`)}try{await this.onRequestEnd(s,{mintSession:!U$||v1.session})}catch(b){u$.error(b?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(b)})}if(U$)tQ(Q0,S);return await this.render({req:s,runInRequestScope:D$,csrfTokenHMAC:Buffer.from(""),currentPathName:H,headers:Q0,i18n:g1,params:oZ,pathname:J.pathname,serverQueries:N.serverQueries,userAgent:$.headers.get("user-agent"),noStream:x,noTheme:E,url:J,user:s3,viewData:o$,breadcrumbs:aZ,urlLocaleSegment:G,meta:P.meta,appId:P.appId,features:P.features,isOgRequest:Y,staticView:H?S:void 0,refusedStatus:q??void 0})}catch(q){if(q.kind===d1){let M0=W?cO(q.payload.viewData??q.payload.api):VW(q.payload.view);for(let s$ of N.cookies)M0.headers.append("Set-Cookie",s$.toString());return M0}if(!I0.has(q))this.hooks.onRequestFail(s,q);if(u1(q))return console.error(q),W?dZ():VW(JW());if(q instanceof k1&&q.status===403)return W?dZ():VW(JW());throw q}},Z)}}function dO($,Z){let J=$.cookies?.get(Z);return QQ(J)?J:null}function UW(){let $=JSON.stringify({error:l1("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 QG extends T0{routes={"/api-routes":this.get(()=>{let $=L(l4).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 $=L(u3).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 uO=new Set([h1,"cookie","content-type","content-length","transfer-encoding","connection","host","user-agent","forwarded"]),lO=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,iO=/^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*$/;function sO($,Z,J,W){for(let[Y,j]of Object.entries(J.headers??{})){if(j===void 0||j===null)continue;let z=Y.toLowerCase();if(uO.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===h1)throw Error(`dispatchAs: credentials may not set the "${h1}" cookie. The access token stays the initiator's.`);if(!lO.test(Y)||!iO.test(j))throw Error(`dispatchAs: "${Y}" is not a cookie a Cookie header can carry.`);Z.push(`${Y}=${j}`)}}function nO($,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 YG($){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 jG($,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})}}class l4{static token="router.api";flatRoutes={};onRequestStart;onRequestEnd;onRequestFail;constructor($){let Z=YQ();this.onRequestStart=$.onRequestStart??Z.onRequestStart,this.onRequestEnd=$.onRequestEnd??Z.onRequestEnd,this.onRequestFail=$.onRequestFail??Z.onRequestFail,this.flatRoutes=kJ({"/":$.rootRouter,"/auth":AJ,"/__gemi__/services/i18n":EJ,"/__gemi__/services/logs":wJ,"/__gemi__/services/image":RJ,"/__gemi__/debug":QG})}getRouteHandlerAndParams($){let Z=new URL($.url),J=XG(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 L(c1).runMiddleware(W)}catch(Y){if(Y.kind===d1)return YG(Y.payload.api);else{if(H$(Y))return UW();if(this.onRequestFail(Z,Y),console.error(Y),u1(Y))return dZ();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===d1)return YG(j.payload.api);if(H$(j))return UW();if(this.onRequestFail(J.req,j),console.error(j),u1(j))return dZ();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){u$.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:l1("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=L(n);if(G.isEnabled){let D=G.detectLocale(j);z.setLocale(D)}z.setRequest(j),L(c1).applyDefaultBodyLimit($);let K=await this.runRouteMiddleware(W,j);if(K instanceof Response){let D=jG(K,z.headers,z.cookies);return await Q(),D}let B=await this.getRouteData(W),F=z.headers,O=z.cookies;if(B instanceof Response){let D=jG(B,F,O);if(this.isOpenEndedBody($,D)){let U=nO(D,()=>this.endRequest(z,j,W));return X=!0,U}return await Q(),D}let V=(WZ(B)?B:P$.json(B)).toResponse(F,O);return await Q(),V}catch(G){if(!X)try{await Q()}catch(K){console.error(K)}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,K=[],B=Q?null:$.cookies.get(h1);if(B)K.push(`${h1}=${B}`);if(Y?.credentials)sO(G,K,Y.credentials,Q!==void 0);if(K.length>0)G.set("Cookie",K.join("; "));let F=Q?null:$.headers.get(h1);if(F)G.set(h1,F);let O=$.headers.get("User-Agent");if(O)G.set("User-Agent",O);let V;if(W instanceof FormData)V=W;else if(W!==void 0)G.set("Content-Type","application/json"),V=JSON.stringify(W);let D=new Request(z,{method:Z,headers:G,body:V,...Y?.signal?{signal:Y.signal}:{}});if(zG(D,jZ($),Q?.grant,Y?.progress),$.domain)lZ(D,$.domain);let U=Q?{user:Q.user}:void 0;return T.exit(()=>Z6.exit(()=>this.handleApiRequest(D,U)))}}import{timingSafeEqual as oO}from"crypto";var n4="",PW="*",aO=60000,rO=1e4,HW=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,i4=16,LW=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,s4="x-forwarded-host";function GG($){return $.startsWith(":")}function iZ($,Z){if($===null)return!1;let J=Buffer.from($,"utf8"),W=Buffer.from(Z,"utf8");return J.length===W.length&&oO(J,W)}function tO($){if(!$)return null;if($===!0)return{header:s4,clientIpHeader:null,secret:null};return{header:($.hostHeader??s4).toLowerCase(),clientIpHeader:$.clientIpHeader?.toLowerCase()??null,secret:$.secret?{header:$.secret.header.toLowerCase(),value:$.secret.value}:null}}function eO($){if(!$||$===!0)return;let{hostHeader:Z,clientIpHeader:J,secret:W}=$;if(Z!==void 0&&(typeof Z!=="string"||!LW.test(Z)))throw Error(`\`route.domains.trustProxy.hostHeader\` must be a single header name, e.g. "x-forwarded-host". Got ${JSON.stringify(Z)}.`);if(J!==void 0){if(typeof J!=="string"||!LW.test(J))throw Error(`\`route.domains.trustProxy.clientIpHeader\` must be a single header name, e.g. "x-client-ip". Got ${JSON.stringify(J)}.`);if(!W)throw Error("`route.domains.trustProxy.clientIpHeader` needs `secret`: without proof the proxy sent it, any client that reaches the app directly picks its own address.");if(J.toLowerCase()===(Z??s4).toLowerCase())throw Error("`route.domains.trustProxy.clientIpHeader` names the same header as `hostHeader`.");if(typeof W.header==="string"&&J.toLowerCase()===W.header.toLowerCase())throw Error("`route.domains.trustProxy.clientIpHeader` names the same header as `secret.header`.")}if(!W)return;if(typeof W.header!=="string"||!LW.test(W.header))throw Error(`\`route.domains.trustProxy.secret.header\` must be a header name. Got "${W.header}".`);if(W.header.toLowerCase()===(Z??s4).toLowerCase())throw Error("`route.domains.trustProxy.secret.header` names the same header as `hostHeader`; the secret needs a header of its own.");if(typeof W.value!=="string"||W.value.length<i4)throw Error(`\`route.domains.trustProxy.secret.value\` must be at least ${i4} characters. A guessable one lets any client name its own host.`)}function L1($){if(!$)return null;try{return new URL(`http://${$.trim()}`).hostname.toLowerCase().replace(/\.$/,"")||null}catch{return null}}function $U($){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 ZU($){let Z=L1($.root),J=$.root?.trim().toLowerCase().replace(/\.$/,"");if(!Z||Z!==J||!Z.split(".").every((j)=>HW.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<i4)throw Error(`\`route.domains.ask.secret\` must be at least ${i4} characters. A guessable one is worse than leaving \`ask\` out.`);eO($.trustProxy);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),GG(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)=>HW.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 IW{root;hostTrust;fixed=new Map;param=null;custom;cacheTtlMs;cache=new Map;inFlight=new Map;askSecret;proxySecretHeader;constructor($){ZU($),this.root=L1($.root),this.hostTrust=tO($.trustProxy);for(let Z of $.groups??[])if(GG(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??aO,this.askSecret=$.ask?.secret??null,this.proxySecretHeader=this.hostTrust?.secret?.header??null}forwardedHost($){let Z=this.hostTrust;if(!Z)return null;if(Z.secret&&!iZ($.headers.get(Z.secret.header),Z.secret.value))return null;return $.headers.get(Z.header)?.split(",")[0]?.trim()||null}trustedClientIp($){let Z=this.hostTrust;if(!Z?.clientIpHeader||!Z.secret)return null;if(!iZ($.headers.get(Z.secret.header),Z.secret.value))return null;let J=$.headers.get(Z.clientIpHeader)?.split(",")[0];return J===void 0?null:M$(J)}applyClientIp($){let Z=this.trustedClientIp($);if(!Z)return;$.headers.set("x-forwarded-for",Z),$.headers.delete("x-real-ip")}hostOf($){return L1(this.forwardedHost($))??L1(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&&L1(Y)?$U(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:PW,params:{},custom:!0};return null}async allows($,Z){let J=L1($);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:n4,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&&HW.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>=rO)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=L1($);if(Z)this.cache.delete(Z)}}}var JU={kind:"none"};function v_($){let Z=($??"").trim().toLowerCase();if(Z===""||Z==="false"||Z==="off"||Z==="0")return JU;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 g_($,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:M$(z))??Z}if(W)$.set("x-forwarded-for",W);else $.delete("x-forwarded-for")}var KG=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,FG=16;function m_($){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(!KG.test(Z))throw Error(`GEMI_CLIENT_IP_HEADER must be a single header name, e.g. "x-azure-clientip". Got ${JSON.stringify(Z)}.`);if(!KG.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<FG)throw Error(`GEMI_PROXY_SECRET must be at least ${FG} characters. A guessable one lets any client name its own address.`);return{header:Z.toLowerCase(),secretHeader:J.toLowerCase(),secret:W}}function BG($,Z){if(!iZ($.get(Z.secretHeader),Z.secret))return null;let J=$.get(Z.header)?.split(",")[0];return J===void 0?null:M$(J)}var WU="/__gemi__/domains/ask";class W1{static token="router.domains";resolver;acceptsCustomDomains;clientIpTrust;groups=new Map;constructor($,Z){this.groups.set(n4,$),this.clientIpTrust=Z.clientIpTrust??null;let{domains:J}=Z;if(this.acceptsCustomDomains=Boolean(J?.custom),!J){this.resolver=null;return}this.resolver=new IW(J);let W=(Y)=>({api:Y.api?new l4({...Z.api,...Y.api}):$.api,view:Y.view?new u3({...Z.view,...Y.view}):$.view});for(let Y of J.groups??[])this.groups.set(Y.subdomain,W(Y));if(J.custom?.fallback)this.groups.set(PW,W(J.custom.fallback))}applyClientIp($){let Z=this.clientIpTrust;if(Z)MW($,Z.secretHeader);let J=this.resolver?.trustedClientIp($)??(Z?BG($.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);if(this.resolver.proxySecretHeader)MW($,this.resolver.proxySecretHeader);let Z=await this.resolver.resolve($);if(!Z)return null;return lZ($,Z),this.dispatchers(Z)}async ask($){if(!this.resolver?.askSecret||$.method!=="GET")return null;let Z=new URL($.url);if(Z.pathname!==WU)return null;if(!iZ(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??n4)}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 o4($){let Z=new Date($??0).getTime();return Number.isFinite(Z)?Z:0}var VG=600000;function DG($,Z){return[G6($,Z),G6($,Z-1)]}class A{static token="auth";config;provider;constructor($={},Z=new i8){GY($.oauthProviders),this.config={...O1(KY($),$),emailCode:p8($.emailCode)},this.provider=Z}async oauthProvider($){return await FZ(this.config.oauthProviders,$)}async oauthProviderNames(){return await _Y(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=L().bound(W1)?L(W1).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"?L(W1).resolver?.root:L1(Z);if(!J)throw Error('`auth.cookieDomain` is "root", but `route.domains` is not configured.');let W=$.domain?.host??L1(new URL($.rawRequest.url).host);return W===J||W?.endsWith(`.${J}`)?J:void 0}async getSession($,Z){if(!$)return null;if(!k8($))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=o4(J.expiresAt),j=o4(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/VG),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=G6($,j),K=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:K,userAgent:Z,...this.freshLifetime(Y)}),!0}))z=G}if(!z){for(let G of DG($,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(k8($)||!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()/VG),W=DG($,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 I$;let W=Bun.env.NODE_ENV==="development"?"local":Z.headers.get("User-Agent"),Y=r9(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){await this.userProvider.deleteMagicLinkToken($);let J=await this.config.generateMagicLinkToken($),W=await this.config.generateCode($),Y=typeof W==="string"&&W!==""?W:YY(Z);return await this.userProvider.createMagicLinkToken({email:$,token:K6("link",$,J),pin:K6("pin",$,Y)}),{email:$,pin:Y,token:J}}async verifyOneTimeCode($,Z,J={}){let{expiresInMinutes:W,maxAttempts:Y}=this.config.emailCode,j=await this.userProvider.findMagicLinkTokenByEmail($);if(!j)return W3("pin",$,null,Z),{status:"invalid"};let z=o4(j.createdAt);if(z+W*60000<=Date.now())return W3("pin",$,null,Z),{status:"expired"};if(!await XY(j.id,z,Y,W))return await this.userProvider.claimMagicLinkToken(j.id),{status:"too_many_attempts"};if(!W3("pin",$,j.pin,Z))return{status:"invalid"};if(J.claim!==!1&&!await this.userProvider.claimMagicLinkToken(j.id))return{status:"invalid"};return{status:"ok",row:j}}async verifyMagicLinkToken($,Z){let J=await this.userProvider.findMagicLinkTokenByEmail($),W=W3("link",$,J?.token,Z);if(!J||!W)return!1;if(o4(J.createdAt)+this.config.emailCode.linkExpiresInMinutes*60000<=Date.now())return!1;return await this.userProvider.claimMagicLinkToken(J.id)}}class w0 extends g{static getFacadeAccessor(){return A}static async user(){let $=await w0.userOrNull();if($)return $;throw new I$({redirectTo:J6(T.getStore()?.req,this.getFacadeRoot().config.signInPath)})}static async userOrNull(){let $=T.getStore();if($?.user)return $.user;let Z=await t3(this.getFacadeRoot(),$?.req);if(Z)$?.setUser(Z);return Z}static intendedUrl($){let Z=T.getStore()?.req;return j1(Z?.search.get(Y1),$??this.getFacadeRoot().config.redirectPath)}static async guard($){let Z=await w0.user();if(!await $(Z))throw new zZ}static async guardSafe($){let Z=await w0.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 a4{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 cZ(h3(J.req.rawRequest)),J.serverQueries.ensure($,Z,"prefetch")}static async instant($,...Z){let J=a4.ensure($,Z[0]);if(await J.promise,J.status==="rejected")throw J.error;return J.data}static prefetch($,...Z){a4.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 cZ(h3($.req.rawRequest)),$.serverQueries.muteDiscoveryHints()}}function OG($,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=YU(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 YU($){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 LG{static origin($){return UG($)}static absolute($,...Z){return`${m3()}${K0(String($),Z[0]??{})}`}static relative($,...Z){return K0(String($),Z[0]??{})}static forDomain($,Z,...J){let W=L(W1).resolver;if(!W)throw Error("`Url.forDomain` needs `route.domains` to be configured.");let Y=T.getStore()?.req?.rawRequest,j=Y?W.publicOrigin(Y):m3();if(!j)throw Error("`Url.forDomain` outside a request needs `HOST_NAME` (or `APP_URL`) for the protocol.");return OG({root:W.root,origin:j},$,K0(String(Z),J[0]??{}))}}class HG{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 fonts($){T.getStore().metadata.fonts($)}}var jU={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 y1 extends g{static getFacadeAccessor(){return l$}static get client(){return this.getFacadeRoot().client}static get($){return y1.client.get($)}static set($,Z){return y1.client.set($,Z)}static del(...$){return y1.client.del(...$)}static exists($){return y1.client.exists($)}static incr($){return y1.client.incr($)}static expire($,Z){return y1.client.expire($,Z)}static ttl($){return y1.client.ttl($)}}function wx($){return $}function PG(){return{store:"memory",ttl:null}}class TW{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 zU="500";class NW{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=`${XU(this.prefix)}*`,J="0";do{let W=await $.send("SCAN",[J,"MATCH",Z,"COUNT",zU]),[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 $=L(),Z=$.bound(l$)?$.make(l$).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 XU($){return $.replace(/[*?[\]\\^-]/g,(Z)=>`\\${Z}`)}var QU="k:",IG="tag:",GU="t:";class _W{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 xW extends _W{options;static token="cache";config;builtStore;inflight=new Map;constructor($={},Z={}){super();this.options=Z;if(this.config=O1(PG(),$),this.config.ttl!==null&&this.config.ttl!==void 0)i$(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 TG(this,Z)}async flush(){await this.store.flush()}async storeKey($){return QU+NG($)}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=MG();return await this.store.set(J,Y,null),Y}))}async flushTags($){await Promise.all($.map((Z)=>this.store.set(IG+Z,MG(),null)))}ttlMs($){let Z=$===void 0?this.config.ttl:$;return Z===null||Z===void 0?null:i$(Z)}buildStore(){let{store:$}=this.config;if($===void 0||$==="memory")return new TW(this.config.memory);if($==="redis"){let Z=this.options.application;return new NW({...this.config.redis,client:Z?{send:(J,W)=>Z.make(l$).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 TG extends _W{manager;tagNames;constructor($,Z){super();this.manager=$;this.tagNames=Z}async flush(){await this.manager.flushTags([...this.tagNames])}async storeKey($){NG($);let Z=await this.manager.tagVersions([...this.tagNames]);return`${GU}${Z.join(",")}:${$}`}}function NG($){if(typeof $!=="string"||$==="")throw TypeError(`A cache key is a non-empty string; got ${JSON.stringify($)}.`);return $}function MG(){let $=new Uint8Array(9);return crypto.getRandomValues($),Array.from($,(Z)=>Z.toString(16).padStart(2,"0")).join("")}class _G extends g{static getFacadeAccessor(){return xW}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 xG extends g{static getFacadeAccessor(){return z1}static consume($,Z={}){return this.getFacadeRoot().consume($,Z)}static enforce($,Z={},J){return this.getFacadeRoot().enforce($,Z,J)}}class SG extends g{static getFacadeAccessor(){return CG}static run($,Z,J){return this.getFacadeRoot().run($,Z,J)}static acquire($,Z={}){return this.getFacadeRoot().acquire($,Z)}}class EG extends g{static getFacadeAccessor(){return AG}static encrypt($){return this.getFacadeRoot().encrypt($)}static decrypt($){return this.getFacadeRoot().decrypt($)}static needsReencryption($){return this.getFacadeRoot().needsReencryption($)}}class fG extends g{static getFacadeAccessor(){return g3}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 XC($){return $}function bG(){return{driver:"memory",pollInterval:30000,maxSubscriptions:1e4,batchSize:100,keepaliveInterval:5000}}function r4($){let Z=new URLSearchParams;for(let[J,W]of $)Z.append(J,String(W));return Z.toString()}function CW($){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:KU}=globalThis.Bun;function FU(){return Bun.semver.satisfies(Bun.version,">=1.4.0")}var BU=async($)=>{let Z=new KU($,{max:1,idleTimeout:0,maxLifetime:0});return{listen:(J,W,Y)=>Z.listen(J,W,Y),close:()=>Z.close({timeout:1})}},VU=async($)=>{let Z;try{Z=(await import("./chunk-65wy1r1a.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(()=>{})}},RG=($)=>FU()?BU($):VU($);var DU=/^[A-Za-z_][A-Za-z0-9_]*$/;class SW{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(!DU.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??RG}async createTable(){for(let $ of OU(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 wG(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 fO($){return`'sha256-${NO("sha256").update($).digest("base64")}'`}var YW,jW=new Map;function bO(){if(YW===void 0){let $=XW(zW(),"dist","server",CO);YW=lQ($)?JSON.parse(_O($,"utf8")):null}return YW??null}async function QW($){AO($);let Z=Bun.env.NODE_ENV==="production";if(Z){let j=bO()?.[$];if(j!==void 0)return j;let z=jW.get($);if(z)return z}let J=XW(zW(),"app"),W=EO(J,$);if(!W)throw Error(`The document script "${$}" was not found. It is a file at app/views/${$}${iQ}.ts (or .js).`);if(!Z)return uQ(W);let Y=uQ(W);return jW.set($,Y),Y.catch(()=>jW.delete($)),Y}async function jN($){return fO(await QW($))}var RO="gemi-islands",VN=`'sha256-${nQ("sha256").update(FW).digest("base64")}'`;function GW($,Z,J,W){if(!J)return $;let Y=W?$.lastIndexOf(Z):$.indexOf(Z);return Y===-1?$+J:$.slice(0,Y)+J+$.slice(Y)}var KW=($)=>$.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<"),DN=`'sha256-${nQ("sha256").update(WW).digest("base64")}'`,wO='await import("/refresh.js").catch(()=>{});await import("/@vite/client").catch(()=>{});',kO="gemi-static";function oQ($,Z,J,W,Y,j){let z=new Set,X=[];if(J)X=Z.islands.map((V)=>{let D=V.module?J(V.module):void 0;if(!D)return console.error(`[gemi] island ${V.module??"(unknown module)"}: no client build entry. Declare it as island(() => import("./Component")) so gemi's Vite plugin builds it.`),null;if(V.load==="eager"){for(let U of D.preload)z.add(U);if(V.preloadDynamic)for(let U of D.dynamicPreload??[])z.add(U)}return{s:D.src,e:V.export,l:V.load}});let Q=X.some((V)=>V!==null),G=j?`<script type="module" ${sQ}="${KW(j.name)}">${j.source}</script>`:"";if(!Q&&!Y)return GW($,"</head>",G,!1);let B=(Y?`<meta name="${kO}" content="${KW(Y.identity)}"${Y.prefetch==="none"?' data-prefetch="none"':""}/>`:"")+[...z].map((V)=>`<link rel="modulepreload" href="${KW(V)}"/>`).join("")+G,F=Y?WW:FW,O=(Q?`<script type="application/json" id="${RO}">${X1({i:X})}</script>`:"")+`<script type="module">${W?wO+F:F}</script>`;return GW(GW($,"</head>",B,!1),"</body>",O,!0)}function qO($,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 aQ($){let Z=`<template ${cQ}="`;for(let J=$.lastIndexOf(Z);J!==-1;J=$.lastIndexOf(Z)){let W=qO($,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=`<${c3} ${hQ}="${j}" style="display:contents"></${c3}>`;$=$.split(Q).join(`<${c3} style="display:contents">${X}</${c3}>`)}return $}function rQ($){if(!$)return{locale:!0,session:!0,csrf:!0};return{locale:!1,session:$.session===!0,csrf:$.csrf===!0}}function tQ($,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)}var yO=async()=>(await import("./chunk-7txqv2qq.js")).default,BW,d3=async(...$)=>{return BW??=import("react-dom/server.browser").catch((Z)=>{throw BW=void 0,Z}),(await BW).renderToReadableStream(...$)},$G=1e4,ZG="no-locale",vO="no-theme";async function gO($,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 OW="/assets";function mO($){return $===OW||$.startsWith(`${OW}/`)}function pO($){let Z=$.filter(mO);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 "${OW}" prefix. The client build output is served from there before the router runs, so the route would never match. Mount it somewhere else.`)}}function hO($){let Z=L(W1).resolver;return{...$.domain,root:Z.root,origin:Z.publicOrigin($.rawRequest)}}function VW($){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 u3{static token="router.view";flatViewRoutes={};routeManifest={};clientRouteManifest={};componentTree=[];flatComponentTree=[];staticRoutes=[];root=null;shellReporter=vQ();preloadCache=new WeakMap;hooks;partialRendering;localeRouting;theme;constructor($){let Z=jQ();this.partialRendering=$.partialRendering??Z.partialRendering,this.localeRouting=$.localeRouting??Z.localeRouting,this.theme=$.theme??Z.theme,this.hooks={onNotFound:$.onNotFound??Z.onNotFound,onRequestStart:$.onRequestStart??Z.onRequestStart,onRequestEnd:$.onRequestEnd??Z.onRequestEnd,onRequestFail:$.onRequestFail??Z.onRequestFail,onStreamComplete:$.onStreamComplete??Z.onStreamComplete};let J={"/":$.rootRouter,"/auth":SJ};this.flatViewRoutes=g4(J),pO(Object.keys(this.flatViewRoutes)),this.routeManifest=p4(J),this.clientRouteManifest=Object.fromEntries(Object.entries(this.routeManifest).filter(([,W])=>W.at(-1)!=="FILE")),this.componentTree=c4(J),this.flatComponentTree=$W(this.componentTree),this.staticRoutes=Object.entries(this.flatViewRoutes).filter(([,W])=>W.static).map(([W])=>W);for(let W of this.staticRoutes){let Y=this.flatViewRoutes[W].static?.layout;if(Y&&!this.flatComponentTree.includes(Y))this.flatComponentTree.push(Y)}this.root=$.root}async passesFeatureGates($){let Z=L(s1);for(let J of $)if(!await Z.enabled(J))return!1;return!0}async onRequestEnd($,Z={}){if(Z.mintSession!==!1)d4();return await this.hooks.onRequestEnd($)}completeStream($,Z){let J=(W)=>{u$.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 K of J?.[G]??[])Q.add(K);return[...Q].map((G)=>q1("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 K=DW(),B=new AbortController,F=setTimeout(()=>B.abort(),$G),O=(D)=>{if(Bun.env.NODE_ENV!=="production")console.error(D)},V=pQ(async(D,U)=>{let H=await d3(D,{signal:B.signal,identifierPrefix:U,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:O});return await H.allReady.catch(()=>{}),await new Response(H).text()});try{let D,U=typeof W.script==="function"?await J(()=>W.script(Z)):W.script;if(U)D={name:U,source:await QW(U)};let H;if(W.navigation){let x=W.navigation===!0?{}:W.navigation,E=x.version?String(await J(()=>x.version(Z))):"";H={identity:[W.layout??"",$.buildId??"",D?.name??"",E].join("|"),prefetch:x.prefetch==="none"?"none":"intent"}}let M=await d3(q1(dQ.Provider,{value:V,children:q1(eQ,{children:[...G,q1(this.root,{data:j,viewImportMap:$.viewImportMap,viewModules:$.viewModules,serverQueries:z,dictionarySink:K,rootLayout:Q,key:"root"})]})}),{signal:B.signal,progressiveChunkSize:Number.MAX_SAFE_INTEGER,onError:O});await M.allReady.catch(()=>{});let I=aQ(await new Response(M).text());return new Response(oQ(I,V,$.resolveIsland,Bun.env.NODE_ENV!=="production",H,D),{status:200,headers:X})}finally{clearTimeout(F),J(()=>this.completeStream(Z,z.summarize(B.signal.aborted)))}}async render($){let{req:Z,runInRequestScope:J,csrfTokenHMAC:W,currentPathName:Y,headers:j,i18n:z,params:X,pathname:Q,serverQueries:G,userAgent:K,noStream:B,noTheme:F,url:O,user:V,viewData:D,breadcrumbs:U,urlLocaleSegment:H,meta:M,isOgRequest:I,appId:x,features:E,staticView:f}=$,S=this.theme===!1||F||f?null:{cookie:this.theme.cookie??vJ,default:this.theme.default??null,value:dO(Z,this.theme.cookie??vJ)},R=H?kQ(Q,[H]).pathname:Q,P={kind:"view",data:{meta:M,pageData:{[R]:D},__csrf:W.toString("base64"),prefetchedData:{},i18n:z,auth:{user:V},routeManifest:this.clientRouteManifest,breadcrumbs:U,router:{urlLocaleSegment:H,pathname:Y,params:X,currentPath:Q,searchParams:O.search,is404:!Y?!0:!1,domain:Z.domain?hO(Z):null},appId:x,features:E,theme:S,componentTree:[["404",[]],...this.componentTree],...this.staticRoutes.length>0?{staticRoutes:this.staticRoutes}:{}},head:{}},N=this.root,y=this.routeManifest[Y];return async(D$)=>{let{bootstrapModules:I0=[],loaders:v1,getStyles:s,viewImportMap:q,cssManifest:M0,ogMap:s$,viewModules:i3,clientEntry:O$,modulePreloadManifest:g1,assetBase:m1,resolveIsland:n$,buildId:Q0}=D$,oZ=O$?[]:I0,s3=(R0)=>[R0,`window.loaders=${v1}`,...O$?[`import(${JSON.stringify(O$.module)}).catch(function(e){setTimeout(function(){throw e})})`]:[]].join(";");if(I){let R0=null,r$=null;for(let t$ of y??[])if(typeof s$[t$]==="function")r$=t$,R0=s$[t$];if(!R0)return new Response("Not found",{status:404});let XK=Object.values(P.data.pageData)[0];try{await d3(q1(R0,XK[r$]),{onError:()=>{}})}catch(t$){let{fonts:QK,...GK}=t$.satoriOptions,KK=await Promise.all(QK.map((n3)=>{return gO(n3.name,n3.weight,n3.style).then((OK)=>({...n3,data:OK}))})),hW=new Headers(j);hW.set("Content-Type","image/png");let[FK,BK]=await Promise.all([yO(),y4("Rendering an OG image")]),VK=await FK(t$.jsx,{...GK,fonts:KK}),DK=await BK(Buffer.from(VK)).png({compressionLevel:0,effort:10}).toBuffer();return new Response(new Uint8Array(DK),{headers:hW})}return new Response("data")}if(f&&Y)return await this.renderStatic({req:Z,runInRequestScope:J,staticView:f,currentViews:y,data:P.data,serverQueries:G,headers:j,getStyles:s,viewImportMap:q,viewModules:i3,resolveIsland:n$,buildId:Q0});if(P.data.cssManifest=M0,P.data.modulePreloadManifest=g1??{},m1&&m1!=="/")P.data.assetBase=m1;let o$=this.modulePreloadLinks({clientEntry:O$,modulePreloadManifest:g1,views:y??["404"],routeKey:Y??"404"}),aZ=await s(y??["404"]);P.data.prefetchedData=G.snapshotResolved(),G.markRenderStart();let p1=new AbortController,U$=setTimeout(()=>p1.abort(),$G),b=D6(K)||B,b0=Bun.env.NODE_ENV!=="production"&&!b&&Y&&this.shellReporter.shouldObserve(Y)?gQ():null,a$=DW();try{let R0=await d3(q1(eQ,{children:[...o$,...aZ,...S?[q1("script",{key:"theme-script",dangerouslySetInnerHTML:{__html:GQ(X1({cookie:S.cookie,default:S.default}))}})]:[],q1(N,{data:P.data,viewImportMap:q,viewModules:i3,serverQueries:G,dictionarySink:a$,key:"root"})]}),{bootstrapScriptContent:s3(`window.__GEMI_DATA__ = ${X1(P.data)}`),bootstrapModules:oZ,signal:p1.signal,...b?{progressiveChunkSize:Number.MAX_SAFE_INTEGER}:{},onError(r$){if(Bun.env.NODE_ENV!=="production")console.error(r$)}});if(R0.allReady.catch(()=>{}).finally(()=>clearTimeout(U$)),b)await R0.allReady.catch(()=>{});return new Response(h8(R0,G,{onShell:b?void 0:()=>G.markShell(),onChunk:b0?.onChunk,onClose:()=>J(()=>{if(this.completeStream(Z,G.summarize(p1.signal.aborted)),b0)this.shellReporter.report(Y,b0.measure())})},a$),{status:!Y?$.refusedStatus??404:200,headers:j})}catch(R0){if(clearTimeout(U$),Bun.env.NODE_ENV==="production")throw J(()=>this.completeStream(Z,G.summarize(p1.signal.aborted))),R0;let r$=await d3(q1("div"),{bootstrapScriptContent:s3(`window.error= ${X1(R0.message)}; window.stack_trace=${X1(R0.stack)};window.__GEMI_DATA__ = ${X1(P.data)}`),bootstrapModules:Bun.env.NODE_ENV==="development"?["/render-error.js",...oZ]:oZ});return new Response(h8(r$,G,{onClose:()=>J(()=>this.completeStream(Z,G.summarize(p1.signal.aborted)))}),{status:!Y?$.refusedStatus??404:200,headers:j})}}}viewRefusalStatus($,Z,J){if(H$(Z))return 404;if(Z?.kind===d1){let W=Z.payload?.view?.status;return W===403||W===404?W:null}if(u1(Z)){if(!J.has(Z))this.hooks.onRequestFail($,Z);return console.error(Z),403}if(Z instanceof k1&&(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,K=null,B=L(n),F=p3(this.flatViewRoutes,j),O=B.isLocaleAware&&this.localeRouting==="prefix"&&!F?.route.middleware.includes(ZG);if(O&&B.supportedLocales.includes(z))Q=`/${X.join("/")}`,G=z,K=z;if(($.method==="GET"||$.method==="HEAD")&&!W&&!Y&&F===null&&J.pathname.endsWith("/")&&!J.pathname.startsWith("//")){let P=J.pathname.replace(/\/+$/,""),N=O&&B.supportedLocales.includes(P.slice(1));if(P&&!N)return new Response("",{status:301,headers:{Location:`${P}${J.search}`}})}if(O&&!Y&&K===null&&!(K===null&&F!==null)){let P=JG(z,B.supportedLocales,B.defaultLocale);if(P){let N=X.length?`/${X.join("/")}`:"";return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${P}${N}${W?".json":""}${J.search}`}})}}if(O&&!Y){let P=L(n).detectLocale(new C($,{},"view",Q));if(K===null&&P!==B.defaultLocale){let N=J.pathname==="/"?"":J.pathname;return new Response("",{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:`/${P}${N}${J.search}`}})}}Q=Q.replace("//","/");let D=[],U=[],H=null,M={},I=null,x=!1,E=!1,f=[],S;try{let P=p3(this.flatViewRoutes,Q);if(K&&P?.route.middleware.includes(ZG))P=null;if(P){if(H=P.routePath,M=P.params,D=P.route.exec,U=P.route.middleware,f=P.route.features,x=U.includes("no-stream"),E=U.includes(vO),S=P.route.static,W&&this.partialRendering){let N=$.headers.get(eJ),y=wQ({flatViewRoutes:this.flatViewRoutes,supportedLocales:L(n).supportedLocales,from:N,origin:J.origin,to:{segments:P.route.segments,params:M,search:J.search}});if(y.startIndex>0)D=D.slice(y.startIndex),I={from:N,carriedViews:y.carriedViews}}}}catch(P){throw P}if(S&&W)return new Response("Not found",{status:404});let R=new C($,M,"view",H);return this.hooks.onRequestStart(R),await T.run(R,async()=>{let P=null,N=T.getStore(),y=uZ.getStore(),D$=(q)=>uZ.run(y,()=>T.runWith(N,q));N.serverQueries=new cZ(h3($));let I0=new Set;N.serverQueries.onQueryFail((q)=>{I0.add(q.error);try{D$(()=>Promise.resolve(this.hooks.onRequestFail(s,q.error)).catch(()=>{}))}catch{}});let v1=rQ(S);if(K){let q=K.replaceAll("/","");V$.setLocale(q,{cookie:v1.locale})}else if(B.isLocaleAware&&!O)N.setLocale(B.defaultLocale);else V$.setLocale(void 0,{cookie:v1.locale});let s=N.req;if(v1.session)d4();try{let q=null;try{await L(c1).runMiddleware(U)}catch(b){if(q=this.viewRefusalStatus(s,b,I0),q===null)throw b}if(q!==null||f.length>0&&!await this.passesFeatureGates(f))H=null,D=[],s.routePath="";let M0=L(n),s$=M0.isEnabled,i3=M0.isLocaleAware,O$=new C($,s.params),g1={defaultLocale:M0.defaultLocale,timeZone:M0.detectTimeZone(O$)};if(i3){let b=null;if(K)b=K.replaceAll("/",""),N.setLocale(b);else if(!O)b=N.locale??M0.defaultLocale;else b=M0.detectLocale(O$),N.setLocale(b);let b0=s$?M0.getPageTranslations(b,s.routePath):{};g1={...g1,supportedLocales:M0.supportedLocales,currentLocale:b,dictionary:{[b]:b0},defaultLocale:M0.defaultLocale,...O?{}:{localeRouting:"off"}}}await WG(g1.currentLocale??"");let m1;try{m1=await Promise.all(D.map((b)=>b(s)))}catch(b){if(q=this.viewRefusalStatus(s,b,I0),q===null)throw b;H=null,D=[],s.routePath="",m1=[]}if(H===null)await this.hooks.onNotFound(s,{status:q??404});let{cookies:n$,headers:Q0}=N;if(q!==null)Q0.set("Cache-Control","no-store");P={data:m1,cookies:n$,headers:Q0,user:N.user,prefetchedData:N.serverQueries.snapshotResolved(),currentPathName:H,params:s.params,urlLocaleSegment:G,meta:N.renderMeta(),appId:L(ZW).id,features:await L(s1).forClient()};let{params:oZ,user:s3}=P,o$={},aZ={};for(let b of m1??[]){let[b0,a$]=Object.entries(b)?.[0]??[];if(!b0||!a$)continue;aZ[`${b0}:${H}`]=a$.breadcrumb,o$[b0]=a$}let p1=o$.FILE;if(p1){for(let b of n$)Q0.append("Set-Cookie",b.toString());try{await this.onRequestEnd(s)}catch(b){u$.error(b?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(b)})}return await H8(p1,Q0)}if(W){Q0.set("Content-Type","application/x-ndjson; charset=utf-8"),Q0.append("Vary",eJ),n$.forEach((b0)=>Q0.append("Set-Cookie",b0.toString())),await this.hooks.onRequestEnd(s);let b={meta:I&&!N.metadata.touched?null:P.meta,data:{[Q]:o$},breadcrumbs:aZ,prefetchedData:N.serverQueries.snapshotResolved(),i18n:g1,features:P.features,is404:!H,appId:P.appId,partial:I};return new Response(mQ(b,N.serverQueries,void 0,({aborted:b0})=>D$(()=>this.completeStream(s,N.serverQueries.summarize(b0)))),{headers:Q0})}if(Q0.set("Content-Type","text/html; charset=utf-8"),!x&&!(S&&H))Q0.append("Vary","User-Agent");let U$=Boolean(S&&H);if(!U$||v1.session)d4();for(let b of n$)Q0.append("Set-Cookie",b.toString());if(!U$||v1.csrf){let b=Bun.CSRF.generate(process.env.SECRET);Q0.append("Set-Cookie",`csrf_token=${b}; HttpOnly; Secure; SameSite=Strict; Expires=${new Date(Date.now()+86400000).toUTCString()}`)}try{await this.onRequestEnd(s,{mintSession:!U$||v1.session})}catch(b){u$.error(b?.message??'Error in "onRequestEnd" event handler',{err:JSON.stringify(b)})}if(U$)tQ(Q0,S);return await this.render({req:s,runInRequestScope:D$,csrfTokenHMAC:Buffer.from(""),currentPathName:H,headers:Q0,i18n:g1,params:oZ,pathname:J.pathname,serverQueries:N.serverQueries,userAgent:$.headers.get("user-agent"),noStream:x,noTheme:E,url:J,user:s3,viewData:o$,breadcrumbs:aZ,urlLocaleSegment:G,meta:P.meta,appId:P.appId,features:P.features,isOgRequest:Y,staticView:H?S:void 0,refusedStatus:q??void 0})}catch(q){if(q.kind===d1){let M0=W?cO(q.payload.viewData??q.payload.api):VW(q.payload.view);for(let s$ of N.cookies)M0.headers.append("Set-Cookie",s$.toString());return M0}if(!I0.has(q))this.hooks.onRequestFail(s,q);if(u1(q))return console.error(q),W?dZ():VW(JW());if(q instanceof k1&&q.status===403)return W?dZ():VW(JW());throw q}},Z)}}function dO($,Z){let J=$.cookies?.get(Z);return QQ(J)?J:null}function UW(){let $=JSON.stringify({error:l1("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 QG extends T0{routes={"/api-routes":this.get(()=>{let $=L(l4).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 $=L(u3).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 uO=new Set([h1,"cookie","content-type","content-length","transfer-encoding","connection","host","user-agent","forwarded"]),lO=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,iO=/^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]*$/;function sO($,Z,J,W){for(let[Y,j]of Object.entries(J.headers??{})){if(j===void 0||j===null)continue;let z=Y.toLowerCase();if(uO.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===h1)throw Error(`dispatchAs: credentials may not set the "${h1}" cookie. The access token stays the initiator's.`);if(!lO.test(Y)||!iO.test(j))throw Error(`dispatchAs: "${Y}" is not a cookie a Cookie header can carry.`);Z.push(`${Y}=${j}`)}}function nO($,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 YG($){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 jG($,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})}}class l4{static token="router.api";flatRoutes={};onRequestStart;onRequestEnd;onRequestFail;constructor($){let Z=YQ();this.onRequestStart=$.onRequestStart??Z.onRequestStart,this.onRequestEnd=$.onRequestEnd??Z.onRequestEnd,this.onRequestFail=$.onRequestFail??Z.onRequestFail,this.flatRoutes=kJ({"/":$.rootRouter,"/auth":AJ,"/__gemi__/services/i18n":EJ,"/__gemi__/services/logs":wJ,"/__gemi__/services/image":RJ,"/__gemi__/debug":QG})}getRouteHandlerAndParams($){let Z=new URL($.url),J=XG(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 L(c1).runMiddleware(W)}catch(Y){if(Y.kind===d1)return YG(Y.payload.api);else{if(H$(Y))return UW();if(this.onRequestFail(Z,Y),console.error(Y),u1(Y))return dZ();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===d1)return YG(j.payload.api);if(H$(j))return UW();if(this.onRequestFail(J.req,j),console.error(j),u1(j))return dZ();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){u$.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:l1("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=L(n);if(G.isEnabled){let D=G.detectLocale(j);z.setLocale(D)}z.setRequest(j),L(c1).applyDefaultBodyLimit($);let K=await this.runRouteMiddleware(W,j);if(K instanceof Response){let D=jG(K,z.headers,z.cookies);return await Q(),D}let B=await this.getRouteData(W),F=z.headers,O=z.cookies;if(B instanceof Response){let D=jG(B,F,O);if(this.isOpenEndedBody($,D)){let U=nO(D,()=>this.endRequest(z,j,W));return X=!0,U}return await Q(),D}let V=(WZ(B)?B:P$.json(B)).toResponse(F,O);return await Q(),V}catch(G){if(!X)try{await Q()}catch(K){console.error(K)}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,K=[],B=Q?null:$.cookies.get(h1);if(B)K.push(`${h1}=${B}`);if(Y?.credentials)sO(G,K,Y.credentials,Q!==void 0);if(K.length>0)G.set("Cookie",K.join("; "));let F=Q?null:$.headers.get(h1);if(F)G.set(h1,F);let O=$.headers.get("User-Agent");if(O)G.set("User-Agent",O);let V;if(W instanceof FormData)V=W;else if(W!==void 0)G.set("Content-Type","application/json"),V=JSON.stringify(W);let D=new Request(z,{method:Z,headers:G,body:V,...Y?.signal?{signal:Y.signal}:{}});if(zG(D,jZ($),Q?.grant,Y?.progress),$.domain)lZ(D,$.domain);let U=Q?{user:Q.user}:void 0;return T.exit(()=>Z6.exit(()=>this.handleApiRequest(D,U)))}}import{timingSafeEqual as oO}from"crypto";var n4="",PW="*",aO=60000,rO=1e4,HW=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,i4=16,LW=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,s4="x-forwarded-host";function GG($){return $.startsWith(":")}function iZ($,Z){if($===null)return!1;let J=Buffer.from($,"utf8"),W=Buffer.from(Z,"utf8");return J.length===W.length&&oO(J,W)}function tO($){if(!$)return null;if($===!0)return{header:s4,clientIpHeader:null,secret:null};return{header:($.hostHeader??s4).toLowerCase(),clientIpHeader:$.clientIpHeader?.toLowerCase()??null,secret:$.secret?{header:$.secret.header.toLowerCase(),value:$.secret.value}:null}}function eO($){if(!$||$===!0)return;let{hostHeader:Z,clientIpHeader:J,secret:W}=$;if(Z!==void 0&&(typeof Z!=="string"||!LW.test(Z)))throw Error(`\`route.domains.trustProxy.hostHeader\` must be a single header name, e.g. "x-forwarded-host". Got ${JSON.stringify(Z)}.`);if(J!==void 0){if(typeof J!=="string"||!LW.test(J))throw Error(`\`route.domains.trustProxy.clientIpHeader\` must be a single header name, e.g. "x-client-ip". Got ${JSON.stringify(J)}.`);if(!W)throw Error("`route.domains.trustProxy.clientIpHeader` needs `secret`: without proof the proxy sent it, any client that reaches the app directly picks its own address.");if(J.toLowerCase()===(Z??s4).toLowerCase())throw Error("`route.domains.trustProxy.clientIpHeader` names the same header as `hostHeader`.");if(typeof W.header==="string"&&J.toLowerCase()===W.header.toLowerCase())throw Error("`route.domains.trustProxy.clientIpHeader` names the same header as `secret.header`.")}if(!W)return;if(typeof W.header!=="string"||!LW.test(W.header))throw Error(`\`route.domains.trustProxy.secret.header\` must be a header name. Got "${W.header}".`);if(W.header.toLowerCase()===(Z??s4).toLowerCase())throw Error("`route.domains.trustProxy.secret.header` names the same header as `hostHeader`; the secret needs a header of its own.");if(typeof W.value!=="string"||W.value.length<i4)throw Error(`\`route.domains.trustProxy.secret.value\` must be at least ${i4} characters. A guessable one lets any client name its own host.`)}function L1($){if(!$)return null;try{return new URL(`http://${$.trim()}`).hostname.toLowerCase().replace(/\.$/,"")||null}catch{return null}}function $U($){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 ZU($){let Z=L1($.root),J=$.root?.trim().toLowerCase().replace(/\.$/,"");if(!Z||Z!==J||!Z.split(".").every((j)=>HW.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<i4)throw Error(`\`route.domains.ask.secret\` must be at least ${i4} characters. A guessable one is worse than leaving \`ask\` out.`);eO($.trustProxy);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),GG(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)=>HW.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 IW{root;hostTrust;fixed=new Map;param=null;custom;cacheTtlMs;cache=new Map;inFlight=new Map;askSecret;proxySecretHeader;constructor($){ZU($),this.root=L1($.root),this.hostTrust=tO($.trustProxy);for(let Z of $.groups??[])if(GG(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??aO,this.askSecret=$.ask?.secret??null,this.proxySecretHeader=this.hostTrust?.secret?.header??null}forwardedHost($){let Z=this.hostTrust;if(!Z)return null;if(Z.secret&&!iZ($.headers.get(Z.secret.header),Z.secret.value))return null;return $.headers.get(Z.header)?.split(",")[0]?.trim()||null}trustedClientIp($){let Z=this.hostTrust;if(!Z?.clientIpHeader||!Z.secret)return null;if(!iZ($.headers.get(Z.secret.header),Z.secret.value))return null;let J=$.headers.get(Z.clientIpHeader)?.split(",")[0];return J===void 0?null:M$(J)}applyClientIp($){let Z=this.trustedClientIp($);if(!Z)return;$.headers.set("x-forwarded-for",Z),$.headers.delete("x-real-ip")}hostOf($){return L1(this.forwardedHost($))??L1(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&&L1(Y)?$U(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:PW,params:{},custom:!0};return null}async allows($,Z){let J=L1($);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:n4,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&&HW.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>=rO)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=L1($);if(Z)this.cache.delete(Z)}}}var JU={kind:"none"};function v_($){let Z=($??"").trim().toLowerCase();if(Z===""||Z==="false"||Z==="off"||Z==="0")return JU;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 g_($,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:M$(z))??Z}if(W)$.set("x-forwarded-for",W);else $.delete("x-forwarded-for")}var KG=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,FG=16;function m_($){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(!KG.test(Z))throw Error(`GEMI_CLIENT_IP_HEADER must be a single header name, e.g. "x-azure-clientip". Got ${JSON.stringify(Z)}.`);if(!KG.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<FG)throw Error(`GEMI_PROXY_SECRET must be at least ${FG} characters. A guessable one lets any client name its own address.`);return{header:Z.toLowerCase(),secretHeader:J.toLowerCase(),secret:W}}function BG($,Z){if(!iZ($.get(Z.secretHeader),Z.secret))return null;let J=$.get(Z.header)?.split(",")[0];return J===void 0?null:M$(J)}var WU="/__gemi__/domains/ask";class W1{static token="router.domains";resolver;acceptsCustomDomains;clientIpTrust;groups=new Map;constructor($,Z){this.groups.set(n4,$),this.clientIpTrust=Z.clientIpTrust??null;let{domains:J}=Z;if(this.acceptsCustomDomains=Boolean(J?.custom),!J){this.resolver=null;return}this.resolver=new IW(J);let W=(Y)=>({api:Y.api?new l4({...Z.api,...Y.api}):$.api,view:Y.view?new u3({...Z.view,...Y.view}):$.view});for(let Y of J.groups??[])this.groups.set(Y.subdomain,W(Y));if(J.custom?.fallback)this.groups.set(PW,W(J.custom.fallback))}applyClientIp($){let Z=this.clientIpTrust;if(Z)MW($,Z.secretHeader);let J=this.resolver?.trustedClientIp($)??(Z?BG($.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);if(this.resolver.proxySecretHeader)MW($,this.resolver.proxySecretHeader);let Z=await this.resolver.resolve($);if(!Z)return null;return lZ($,Z),this.dispatchers(Z)}async ask($){if(!this.resolver?.askSecret||$.method!=="GET")return null;let Z=new URL($.url);if(Z.pathname!==WU)return null;if(!iZ(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??n4)}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 o4($){let Z=new Date($??0).getTime();return Number.isFinite(Z)?Z:0}var VG=600000;function DG($,Z){return[G6($,Z),G6($,Z-1)]}class A{static token="auth";config;provider;constructor($={},Z=new i8){GY($.oauthProviders),this.config={...O1(KY($),$),emailCode:p8($.emailCode)},this.provider=Z}async oauthProvider($){return await FZ(this.config.oauthProviders,$)}async oauthProviderNames(){return await _Y(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=L().bound(W1)?L(W1).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"?L(W1).resolver?.root:L1(Z);if(!J)throw Error('`auth.cookieDomain` is "root", but `route.domains` is not configured.');let W=$.domain?.host??L1(new URL($.rawRequest.url).host);return W===J||W?.endsWith(`.${J}`)?J:void 0}async getSession($,Z){if(!$)return null;if(!k8($))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=o4(J.expiresAt),j=o4(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/VG),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=G6($,j),K=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:K,userAgent:Z,...this.freshLifetime(Y)}),!0}))z=G}if(!z){for(let G of DG($,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(k8($)||!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()/VG),W=DG($,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 I$;let W=Bun.env.NODE_ENV==="development"?"local":Z.headers.get("User-Agent"),Y=r9(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){await this.userProvider.deleteMagicLinkToken($);let J=await this.config.generateMagicLinkToken($),W=await this.config.generateCode($),Y=typeof W==="string"&&W!==""?W:YY(Z);return await this.userProvider.createMagicLinkToken({email:$,token:K6("link",$,J),pin:K6("pin",$,Y)}),{email:$,pin:Y,token:J}}async verifyOneTimeCode($,Z,J={}){let{expiresInMinutes:W,maxAttempts:Y}=this.config.emailCode,j=await this.userProvider.findMagicLinkTokenByEmail($);if(!j)return W3("pin",$,null,Z),{status:"invalid"};let z=o4(j.createdAt);if(z+W*60000<=Date.now())return W3("pin",$,null,Z),{status:"expired"};if(!await XY(j.id,z,Y,W))return await this.userProvider.claimMagicLinkToken(j.id),{status:"too_many_attempts"};if(!W3("pin",$,j.pin,Z))return{status:"invalid"};if(J.claim!==!1&&!await this.userProvider.claimMagicLinkToken(j.id))return{status:"invalid"};return{status:"ok",row:j}}async verifyMagicLinkToken($,Z){let J=await this.userProvider.findMagicLinkTokenByEmail($),W=W3("link",$,J?.token,Z);if(!J||!W)return!1;if(o4(J.createdAt)+this.config.emailCode.linkExpiresInMinutes*60000<=Date.now())return!1;return await this.userProvider.claimMagicLinkToken(J.id)}}class w0 extends g{static getFacadeAccessor(){return A}static async user(){let $=await w0.userOrNull();if($)return $;throw new I$({redirectTo:J6(T.getStore()?.req,this.getFacadeRoot().config.signInPath)})}static async userOrNull(){let $=T.getStore();if($?.user)return $.user;let Z=await t3(this.getFacadeRoot(),$?.req);if(Z)$?.setUser(Z);return Z}static intendedUrl($){let Z=T.getStore()?.req;return j1(Z?.search.get(Y1),$??this.getFacadeRoot().config.redirectPath)}static async guard($){let Z=await w0.user();if(!await $(Z))throw new zZ}static async guardSafe($){let Z=await w0.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 a4{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 cZ(h3(J.req.rawRequest)),J.serverQueries.ensure($,Z,"prefetch")}static async instant($,...Z){let J=a4.ensure($,Z[0]);if(await J.promise,J.status==="rejected")throw J.error;return J.data}static prefetch($,...Z){a4.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 cZ(h3($.req.rawRequest)),$.serverQueries.muteDiscoveryHints()}}function OG($,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=YU(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 YU($){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 LG{static origin($){return UG($)}static absolute($,...Z){return`${m3()}${K0(String($),Z[0]??{})}`}static relative($,...Z){return K0(String($),Z[0]??{})}static forDomain($,Z,...J){let W=L(W1).resolver;if(!W)throw Error("`Url.forDomain` needs `route.domains` to be configured.");let Y=T.getStore()?.req?.rawRequest,j=Y?W.publicOrigin(Y):m3();if(!j)throw Error("`Url.forDomain` outside a request needs `HOST_NAME` (or `APP_URL`) for the protocol.");return OG({root:W.root,origin:j},$,K0(String(Z),J[0]??{}))}}class HG{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 robots($){T.getStore().metadata.robots($)}static fonts($){T.getStore().metadata.fonts($)}}var jU={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 y1 extends g{static getFacadeAccessor(){return l$}static get client(){return this.getFacadeRoot().client}static get($){return y1.client.get($)}static set($,Z){return y1.client.set($,Z)}static del(...$){return y1.client.del(...$)}static exists($){return y1.client.exists($)}static incr($){return y1.client.incr($)}static expire($,Z){return y1.client.expire($,Z)}static ttl($){return y1.client.ttl($)}}function wx($){return $}function PG(){return{store:"memory",ttl:null}}class TW{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 zU="500";class NW{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=`${XU(this.prefix)}*`,J="0";do{let W=await $.send("SCAN",[J,"MATCH",Z,"COUNT",zU]),[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 $=L(),Z=$.bound(l$)?$.make(l$).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 XU($){return $.replace(/[*?[\]\\^-]/g,(Z)=>`\\${Z}`)}var QU="k:",IG="tag:",GU="t:";class _W{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 xW extends _W{options;static token="cache";config;builtStore;inflight=new Map;constructor($={},Z={}){super();this.options=Z;if(this.config=O1(PG(),$),this.config.ttl!==null&&this.config.ttl!==void 0)i$(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 TG(this,Z)}async flush(){await this.store.flush()}async storeKey($){return QU+NG($)}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=MG();return await this.store.set(J,Y,null),Y}))}async flushTags($){await Promise.all($.map((Z)=>this.store.set(IG+Z,MG(),null)))}ttlMs($){let Z=$===void 0?this.config.ttl:$;return Z===null||Z===void 0?null:i$(Z)}buildStore(){let{store:$}=this.config;if($===void 0||$==="memory")return new TW(this.config.memory);if($==="redis"){let Z=this.options.application;return new NW({...this.config.redis,client:Z?{send:(J,W)=>Z.make(l$).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 TG extends _W{manager;tagNames;constructor($,Z){super();this.manager=$;this.tagNames=Z}async flush(){await this.manager.flushTags([...this.tagNames])}async storeKey($){NG($);let Z=await this.manager.tagVersions([...this.tagNames]);return`${GU}${Z.join(",")}:${$}`}}function NG($){if(typeof $!=="string"||$==="")throw TypeError(`A cache key is a non-empty string; got ${JSON.stringify($)}.`);return $}function MG(){let $=new Uint8Array(9);return crypto.getRandomValues($),Array.from($,(Z)=>Z.toString(16).padStart(2,"0")).join("")}class _G extends g{static getFacadeAccessor(){return xW}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 xG extends g{static getFacadeAccessor(){return z1}static consume($,Z={}){return this.getFacadeRoot().consume($,Z)}static enforce($,Z={},J){return this.getFacadeRoot().enforce($,Z,J)}}class SG extends g{static getFacadeAccessor(){return CG}static run($,Z,J){return this.getFacadeRoot().run($,Z,J)}static acquire($,Z={}){return this.getFacadeRoot().acquire($,Z)}}class EG extends g{static getFacadeAccessor(){return AG}static encrypt($){return this.getFacadeRoot().encrypt($)}static decrypt($){return this.getFacadeRoot().decrypt($)}static needsReencryption($){return this.getFacadeRoot().needsReencryption($)}}class fG extends g{static getFacadeAccessor(){return g3}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 XC($){return $}function bG(){return{driver:"memory",pollInterval:30000,maxSubscriptions:1e4,batchSize:100,keepaliveInterval:5000}}function r4($){let Z=new URLSearchParams;for(let[J,W]of $)Z.append(J,String(W));return Z.toString()}function CW($){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:KU}=globalThis.Bun;function FU(){return Bun.semver.satisfies(Bun.version,">=1.4.0")}var BU=async($)=>{let Z=new KU($,{max:1,idleTimeout:0,maxLifetime:0});return{listen:(J,W,Y)=>Z.listen(J,W,Y),close:()=>Z.close({timeout:1})}},VU=async($)=>{let Z;try{Z=(await import("./chunk-65wy1r1a.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(()=>{})}},RG=($)=>FU()?BU($):VU($);var DU=/^[A-Za-z_][A-Za-z0-9_]*$/;class SW{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(!DU.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??RG}async createTable(){for(let $ of OU(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 wG(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
|
|
@@ -114,4 +114,4 @@ data: ${JSON.stringify(Z)}
|
|
|
114
114
|
"deadline_at" BIGINT${W}
|
|
115
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 nG=191,oG=30000;class J8 extends Error{id;constructor($){super(`No run has the id ${$}.`);this.id=$;this.name="RunNotFoundError"}}class W8 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 pW{options;static token="runs";store;config;ownFeed=null;constructor($={},Z={}){this.options=Z;this.config=O1(lG(),$),this.store=NU(this.config.store,Z.application)}get feed(){if(this.options.feed)return this.options.feed;if(this.options.application)return this.options.application.make(sZ);return this.ownFeed??=new sZ,this.ownFeed}channel($){return`gemi:run:${$}`}async create($){tG("kind",$.kind);let Z=$.id??`run_${crypto.randomUUID().replaceAll("-","")}`;tG("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:i$($.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 TU(Z),this.change($,H1,{status:"running",progress:Z})}complete($,Z){return this.change($,H1,{status:"completed",result:Z===void 0?null:Z})}fail($,Z){return this.change($,H1,{status:"failed",error:rG(Z)})}cancel($,Z){return this.change($,H1,{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 J8($);if(P1(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 W8)&&!Y.signal.aborted)console.error(`[gemi] Run ${$} failed.`,Q);X=await this.change($,H1,{status:"failed",error:Q instanceof W8?rG(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()+i$(Z.timeout),Y=this.feed.subscribe(this.channel($),{signal:J});try{await Y.ready();let j=await this.store.get($);if(!j)throw new J8($);let z=null;for(;;){if(P1(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 aG(z,Math.min(Q,X??1/0,oG),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 J8($);if(yield W,P1(W.status))return;for await(let Y of J){let j=MU(Y,$)??await this.store.get($);if(!j||j.version<=W.version)continue;if(W=j,yield W,P1(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=i$($);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||P1(Z.status))return null;let J=await this.untilDeadline(Z);if(J===null||J>0)return null;return this.change($,H1,{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(P1(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,aG(j,Math.min(z??1/0,oG))]);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 aG($,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 MU($,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 rG($){if(typeof $==="string")return{message:$};if($ instanceof W8)return{message:$.message,...$.code!==void 0?{code:$.code}:{},...$.data!==void 0?{data:$.data}:{}};if($ instanceof Error)return{message:$.message};return $}function tG($,Z){if(typeof Z!=="string"||Z===""||Z.length>nG)throw TypeError(`A run's ${$} is a string of 1 to ${nG} characters; got ${JSON.stringify(Z)}.`)}function TU($){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 NU($,Z){if($==="memory")return new qW;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(N1).connection();return new mW(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 eG extends g{static getFacadeAccessor(){return pW}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 $K extends g{static getFacadeAccessor(){return s1}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 Y8{bound;constructor($){this.bound=$}get name(){return this.bound??T1()}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 WK(J.sql,(W)=>ZK(Z,()=>$(W)),{slowTransactionThreshold:J.config.slowTransactionThreshold,connection:Z})}async schema(){let $=this.connection(),{introspect:Z}=await import("./chunk-29jmaj16.js");return Z(this.handle()??$.sql,$.dialect)}run($,Z){let J=this.connection(),{text:W,values:Y}=jK($,YK(J.dialect),Z);return(this.handle()??J.sql).unsafe(W,Y)}handle(){let $=i0();if($===void 0)return;return T1()===this.name?$:void 0}connection($=this.name){return JK($),L(N1).connection($)}}var nZ=new Y8;class zK extends g{static getFacadeAccessor(){return N1}static connection($){return new Y8($)}static get sql(){return nZ.sql}static get dialect(){return nZ.dialect}static query($){return nZ.query($)}static execute($){return nZ.execute($)}static transaction($){return nZ.transaction($)}static schema(){return nZ.schema()}static close(){return this.getFacadeRoot().close()}}export{l0 as ae,rZ as be,Q8 as ce,$Z as de,eZ as ee,T0 as fe,t3 as ge,w8 as he,k8 as ie,r9 as je,i1 as ke,z1 as le,M$ as me,r as ne,E9 as oe,jZ as pe,t9 as qe,e9 as re,y8 as se,v8 as te,K6 as ue,W3 as ve,EF as we,hP as xe,KY as ye,LY as ze,c8 as Ae,HY as Be,PY as Ce,vF as De,IY as Ee,d8 as Fe,pF as Ge,hF as He,u8 as Ie,MY as Je,TY as Ke,s1 as Le,NY as Me,lF as Ne,i8 as Oe,I8 as Pe,W6 as Qe,I1 as Re,P$ as Se,qK as Te,H8 as Ue,M1 as Ve,V$ as We,a4 as Xe,LG as Ye,HG as Ze,jU as _e,y1 as $e,wx as af,PG as bf,TW as cf,NW as df,xW as ef,TG as ff,_G as gf,xG as hf,SG as if,EG as jf,fG as kf,XC as lf,bG as mf,r4 as nf,CW as of,SW as pf,AW as qf,t4 as rf,sZ as sf,cG as tf,dG as uf,h as vf,$3 as wf,A4 as xf,xI as yf,CI as zf,SI as Af,bI as Bf,EX as Cf,HJ as Df,RX as Ef,yI as Ff,qX as Gf,p0 as Hf,q3 as If,yX as Jf,uG as Kf,pC as Lf,kW as Mf,H1 as Nf,P1 as Of,qW as Pf,mW as Qf,IU as Rf,J8 as Sf,W8 as Tf,pW as Uf,eG as Vf,$K as Wf,Y8 as Xf,zK as Yf,IJ as Zf,cD as _f,fJ as $f,bJ as ag,iM as bg,ZQ as cg,JQ as dg,e3 as eg,c1 as fg,JT as gg,YQ as hg,jQ as ig,ZW as jg,dZ as kg,JW as lg,jN as mg,VN as ng,DN as og,OW as pg,mO as qg,VW as rg,cO as sg,u3 as tg,UW as ug,YG as vg,jG as wg,l4 as xg,v_ as yg,g_ as zg,m_ as Ag,W1 as Bg,A as Cg,w0 as Dg,$6 as Eg,K9 as Fg,EK as Gg,X9 as Hg,B9 as Ig,D8 as Jg,O8 as Kg,U8 as Lg,V9 as Mg,yK as Ng,vK as Og,I9 as Pg,T9 as Qg,_9 as Rg,b9 as Sg,R9 as Tg,w9 as Ug,_8 as Vg,dK as Wg,J0 as Xg,u9 as Yg,QZ as Zg,o9 as _g};
|
|
116
116
|
|
|
117
|
-
//# debugId=
|
|
117
|
+
//# debugId=3A3F9D0CD2295D9764756E2164756E21
|