gemi 0.100.0 → 0.101.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.
@@ -16,10 +16,13 @@
16
16
  * better than one that lets you write a schema the API refuses at runtime.
17
17
  *
18
18
  * `json()` is the one deliberate hole in that, for the formats strict mode
19
- * cannot describe at all: a record with arbitrary keys, a mixed-type tuple, a
20
- * recursive document. It does not widen the subset — it turns strict mode off
21
- * for the schema containing it, which `supportsStrict` reads back off the tree
22
- * so that no caller has to remember to.
19
+ * cannot describe at all: a record with arbitrary keys, a mixed-type tuple. It
20
+ * does not widen the subset — it turns strict mode off for the schema containing
21
+ * it, which `supportsStrict` reads back off the tree so that no caller has to
22
+ * remember to.
23
+ *
24
+ * A document that nests into itself is NOT one of those: strict mode accepts
25
+ * `$defs` + `$ref`, and `recursive()` emits exactly that (#745).
23
26
  */
24
27
  export type JSONSchema = {
25
28
  type?: string | string[];
@@ -31,6 +34,15 @@ export type JSONSchema = {
31
34
  additionalProperties?: false;
32
35
  items?: JSONSchema;
33
36
  anyOf?: readonly JSONSchema[];
37
+ /**
38
+ * `#/$defs/<name>`, pointing at an entry of the root's `$defs`. Emitted by
39
+ * `s.recursive` and never with a sibling keyword: OpenAI's strict mode
40
+ * refuses `{ $ref, description }`, so a described or nullable reference is
41
+ * wrapped in an `anyOf` instead.
42
+ */
43
+ $ref?: string;
44
+ /** Only ever on the root: every `s.recursive` the schema reaches, by name. */
45
+ $defs?: Record<string, JSONSchema>;
34
46
  };
35
47
  /**
36
48
  * Any value JSON can carry. The default output type of `json()`, and the
@@ -209,7 +221,8 @@ export declare const s: {
209
221
  /**
210
222
  * Any JSON value, constrained by nothing — for a format the rest of this
211
223
  * builder cannot describe: a record with arbitrary keys, a mixed-type tuple,
212
- * a document that nests into itself.
224
+ * a document whose shape is not known in advance. (A document that nests
225
+ * into itself has a strict spelling: `s.recursive`.)
213
226
  *
214
227
  * A schema containing one cannot be sent under strict mode, so a tool whose
215
228
  * input uses it is sent with `strict: false` automatically. That is not an
@@ -242,6 +255,47 @@ export declare const s: {
242
255
  */
243
256
  json(): SchemaBuilder<JsonValue>;
244
257
  json<T>(): SchemaBuilder<T>;
258
+ /**
259
+ * A schema that contains itself — a tree of UI nodes, a comment thread, a
260
+ * folder listing — and stays strict-mode safe, unlike `s.json()`.
261
+ *
262
+ * ```ts
263
+ * type Node = { tag: string; text?: string; children: Node[] };
264
+ *
265
+ * const node = s.recursive<Node>("Node", (self) =>
266
+ * s.object({
267
+ * tag: s.enum(["section", "heading", "text"]),
268
+ * text: s.string().optional(),
269
+ * children: s.array(self),
270
+ * }),
271
+ * );
272
+ * const output = s.object({ title: s.string(), root: node });
273
+ * ```
274
+ *
275
+ * Emitted the way OpenAI's strict structured output spells recursion: the
276
+ * body once under the root's `$defs[name]`, and `{ "$ref": "#/$defs/<name>" }`
277
+ * wherever it is used. Used as the root itself, the body is also inlined at
278
+ * the root, since a tool's parameters and an agent's output must be an
279
+ * object there. `parse`, `safeParse` and `validate` follow the reference to
280
+ * any depth.
281
+ *
282
+ * `T` has to be written out: TypeScript cannot infer a type from a value
283
+ * that mentions itself. The callback's schema is checked against it, so a
284
+ * field the type has and the schema lacks (or the reverse) is a type error.
285
+ *
286
+ * Rules, each an error when the schema is built:
287
+ *
288
+ * - `name` is the `$defs` key: letters, digits, `_` and `-`. Two different
289
+ * recursive schemas in one tool or output need different names.
290
+ * - `self` must be nested inside an `s.object` field or an `s.array` — a
291
+ * body that is `self` again through a union describes no finite value.
292
+ * - The body cannot be `optional()`; make the uses optional instead
293
+ * (`children: s.array(self).optional()`, `next: self.optional()`).
294
+ *
295
+ * Strict mode limits the rest as usual: every node of the body is in the
296
+ * strict subset or the whole schema is sent non-strict (`supportsStrict`).
297
+ */
298
+ recursive<T>(name: string, define: (self: SchemaBuilder<T>) => Schema<T>): SchemaBuilder<T>;
245
299
  /**
246
300
  * A schema read from a JSON Schema at runtime — for a shape that comes from
247
301
  * data rather than code, like a collection whose items a user defined.
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../ai/Schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../ai/Schema.ts"],"names":[],"mappings":"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"}
package/dist/ai/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{Ab as l9,Bb as _$,Cb as M$,Db as q3,zb as T}from"../chunk-wc46df4w.js";import{Me as L3,Pe as P3,cf as T6,df as k6,ef as a,ff as YQ,tf as O3,vf as e,wf as d}from"../chunk-h15bd9vn.js";import{Af as cQ,xf as C3,zf as uQ}from"../chunk-9xf2fx98.js";import{Ef as SQ}from"../chunk-eqtsfvvd.js";import{Kg as jQ}from"../chunk-48dek9s7.js";import"../chunk-f6s7ddjz.js";import"../chunk-n63xjrck.js";import"../chunk-68zf43ah.js";class h extends Error{status;body;requestId;constructor(Q,$,Z){super(`Provider request failed with status ${Q}: ${E3($)}`);this.name="ProviderHttpError",this.status=Q,this.body=$,this.requestId=Z}}class KQ extends Error{timeoutMs;constructor(Q){super(`Provider request timed out after ${Q}ms`);this.name="ProviderTimeoutError",this.timeoutMs=Q}}function E3(Q){let $=i9(Q);if($?.message)return $.message;if(typeof Q==="string")return Q.slice(0,500);return"no error body"}function i9(Q){if(!Q||typeof Q!=="object")return null;let $=Q,J=$.error&&typeof $.error==="object"?$.error:Q;if(typeof J.message!=="string"&&typeof J.code!=="string"&&typeof J.type!=="string")return null;let W=J.innererror?.code??J.code;return{message:J.message,type:J.type,code:W,param:J.param}}function A(Q){if(!Q||typeof Q!=="object")return{};let{status:$,requestId:Z}=Q;return{...typeof $==="number"&&$>=100&&$<=599?{status:$}:{},...typeof Z==="string"&&Z?{requestId:Z}:{}}}function k(Q){if(Q instanceof KQ)return{code:"provider_error",message:Q.message,retryable:!0};if(I3(Q))return{code:"aborted",message:"The request was aborted.",retryable:!1};if(Q instanceof h)return x3(Q.status,i9(Q.body),Q.message);if(Q instanceof TypeError)return{code:"provider_error",message:`Could not reach the provider: ${Q.message}`,retryable:!0};if(Q instanceof Error)return{code:"provider_error",message:Q.message,retryable:!1};return{code:"unknown",message:String(Q),retryable:!1}}function x3(Q,$,Z){let J=$?.message??Z,W=($?.code??"").toLowerCase(),X=($?.type??"").toLowerCase(),G=`${W} ${X} ${J}`.toLowerCase();if(Q===429){let V=W==="insufficient_quota"||G.includes("quota");return{code:"rate_limited",message:J,retryable:!V}}if(Q>=500||Q===408||Q===409)return{code:"provider_error",message:J,retryable:!0};if(b3(G))return{code:"context_length_exceeded",message:J,retryable:!1};if(w3(G))return{code:"content_filtered",message:J,retryable:!1};if($?.param?.startsWith("tools")||G.includes("invalid schema for function"))return{code:"invalid_tool_input",message:J,retryable:!1};return{code:"provider_error",message:J,retryable:!1}}function b3(Q){return Q.includes("context_length_exceeded")||Q.includes("maximum context length")||Q.includes("context window")||Q.includes("reduce the length")}function w3(Q){return Q.includes("content_filter")||Q.includes("content_policy_violation")||Q.includes("responsibleaipolicyviolation")||Q.includes("content management policy")}function I3(Q){if(!Q||typeof Q!=="object")return!1;let $=Q;return $.name==="AbortError"||$.code==="ABORT_ERR"}class E extends Error{constructor(){super("The run was stopped");this.name="RunAborted"}}function y(Q,$){if($.aborted)return Promise.reject(new E);return new Promise((Z,J)=>{let W=()=>J(new E);$.addEventListener("abort",W,{once:!0}),Q.then(Z,J).finally(()=>$.removeEventListener("abort",W))})}function M(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function R(Q,$){if(!$)return Q;let Z={inputTokens:Q.inputTokens+($.inputTokens??0),outputTokens:Q.outputTokens+($.outputTokens??0),totalTokens:Q.totalTokens+($.totalTokens??0)};if($.reasoningTokens!==void 0||Q.reasoningTokens!==void 0)Z.reasoningTokens=(Q.reasoningTokens??0)+($.reasoningTokens??0);if($.cachedInputTokens!==void 0||Q.cachedInputTokens!==void 0)Z.cachedInputTokens=(Q.cachedInputTokens??0)+($.cachedInputTokens??0);if($.imageInputTokens!==void 0||Q.imageInputTokens!==void 0)Z.imageInputTokens=(Q.imageInputTokens??0)+($.imageInputTokens??0);if($.imageOutputTokens!==void 0||Q.imageOutputTokens!==void 0)Z.imageOutputTokens=(Q.imageOutputTokens??0)+($.imageOutputTokens??0);return Z}function zQ(Q){if(!Q.trim())return{};try{return JSON.parse(Q)}catch{}let $=[],Z=!1,J=!1;for(let G of Q){if(Z){if(J)J=!1;else if(G==="\\")J=!0;else if(G==='"')Z=!1;continue}if(G==='"')Z=!0;else if(G==="{")$.push("}");else if(G==="[")$.push("]");else if(G==="}"||G==="]")$.pop()}let W=Q;if(Z)W+='"';W=W.replace(/[,:]\s*$/,"");let X=$.reverse().join("");try{return JSON.parse(W+X)}catch{try{return JSON.parse(W.replace(/,?\s*"[^"]*"\s*$/,"")+X)}catch{return{}}}}function BQ(Q){return{name:"output",schema:Q.toJSONSchema(),strict:a(Q)}}function DQ(Q,$){let Z=Q.safeParse(zQ($));if(Z.ok===!0)return{ok:!0,value:Z.value};return{ok:!1,error:{code:"invalid_output",message:`The model's structured answer did not match the output schema: ${Z.errors.join(", ")}`,retryable:!0}}}function UQ(Q){if(Q.length>0)Q[0];return Q}function r(Q,$,Z){let J=Q.content[Q.content.length-1];if(J&&J.type===$){J.text=(J.text??"")+Z;return}Q.content.push($==="text"?{type:"text",text:Z}:{type:"reasoning",text:Z})}function FQ(Q,$,Z){let J=Q.content[Q.content.length-1];if(J&&J.type==="reasoning"&&J.id===$){J.text=(J.text??"")+Z;return}Q.content.push($?{type:"reasoning",id:$,text:Z}:{type:"reasoning",text:Z})}function v3(Q){return mQ(Q)}async function mQ(Q,$={}){let Z=`gen_${crypto.randomUUID()}`,J=await h3(Q);if($.settled?.(J),!J.ok){if(Q.logErrors!==!1&&J.error.code!=="aborted")f3(Z,J.error,$.origin);if(Q.throwOnError)throw new QQ({runId:Z,messages:J.messages,finishReason:J.finishReason,usage:J.usage,error:J.error})}return J}function f3(Q,$,Z){let J=`[gemi/ai] generate() failed (${$.code}${$.status!==void 0?` ${$.status}`:""}): ${$.message}`,W={...Z,generateId:Q,error:$},X=!1;try{e.error(J,W),X=!0}catch{}if(!X||Bun.env.NODE_ENV==="development")console.error(J,W)}async function h3(Q){let $=Q.messages??[];if($.length===0&&!Q.prompt)throw Error("generate() was given neither a `prompt` nor `messages`, so there is nothing to send the model.");let Z=[...$];if(Q.prompt)Z.push({id:`msg_${crypto.randomUUID()}`,role:"user",content:[{type:"text",text:Q.prompt}],createdAt:new Date().toISOString()});let J={id:`msg_${crypto.randomUUID()}`,role:"assistant",content:[],createdAt:new Date().toISOString()},W=Q.signal??new AbortController().signal,X=M(),G="stop",V,H={},Y="";try{let U=Q.provider.stream({messages:[...Z],systemPrompt:Q.instructions?.trim()?Q.instructions:void 0,output:BQ(Q.output),reasoning:Q.reasoning,maxOutputTokens:Q.maxOutputTokens,temperature:Q.temperature,signal:Q.signal})[Symbol.asyncIterator]();try{for(;;){let j=await y(Promise.resolve(U.next()),W);if(j.done)break;let D=j.value;switch(D.type){case"output-delta":Y+=D.delta;break;case"text-delta":r(J,"text",D.delta);break;case"reasoning-delta":FQ(J,D.id,D.delta);break;case"finish":if(X=R(X,D.usage),!V)G=D.reason;break;case"error":G="error",V=D.error,H=A(D);break}}}finally{if(W.aborted)Promise.resolve(U.return?.()).catch(()=>{})}}catch(B){if(B instanceof E||W.aborted)G="aborted",V=y3(W);else G="error",V=Q.provider.normalizeError(B),H=A(B)}let K=!1,z;if(!V)if(G==="length")V={code:"invalid_output",message:"The model ran out of output tokens before finishing its structured answer, so it was cut off. Raise maxOutputTokens, or ask for a shorter answer.",retryable:!0};else if(!Y.trim())V={code:"invalid_output",message:"The model finished without giving a structured answer.",retryable:!0};else{let B=DQ(Q.output,Y);if(B.ok===!0)K=!0,z=B.value;else V=B.error}if(K)J.content.push({type:"output",value:z});else if(Y)r(J,"text",Y);for(let B of J.content)if((B.type==="text"||B.type==="reasoning")&&typeof B.text==="string")B.text=UQ(B.text);if(J.finishReason=G,J.usage=X,Z.push(J),K)return{ok:!0,output:z,messages:Z,usage:X,finishReason:G};return{ok:!1,error:{...V,...H},messages:Z,usage:X,finishReason:G}}function y3(Q){return Q.reason?.name==="TimeoutError"?{code:"timeout",message:"The generation timed out.",retryable:!0}:{code:"aborted",message:"The generation was stopped.",retryable:!1}}import{createHmac as g3,hkdfSync as u3,randomBytes as o9,timingSafeEqual as c3}from"crypto";class $Q{spent=new Map;sweepAt=1024;async consume(Q,$){return this.consumeSync(Q,$)}consumeSync(Q,$,Z=Date.now()){if(this.spent.size>=this.sweepAt)this.sweep(Z);let J=this.spent.get(Q);if(J!==void 0&&J>Z)return!1;return this.spent.set(Q,$),!0}get size(){return this.spent.size}sweep(Q){for(let[$,Z]of this.spent)if(Z<=Q)this.spent.delete($);this.sweepAt=Math.max(1024,this.spent.size*2)}}class pQ{injectedClient;prefix;constructor(Q={}){this.injectedClient=Q.client,this.prefix=Q.prefix??"gemi:ai:nonce"}async consume(Q,$){let Z=Math.max(1,Math.ceil($-Date.now()));return await this.client.send("SET",[`${this.prefix}:${Q}`,"1","PX",String(Z),"NX"])==="OK"}get client(){if(this.injectedClient)return this.injectedClient;let Q=jQ(),$=Q.bound(d)?Q.make(d).client:void 0;if(!$)throw Error("RedisNonceStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisNonceStore({ client }).");return $}}var l=new $Q;var dQ="agt2",CQ="agt1",n9=[dQ,CQ],lQ=86400000,m3=Date.now()+lQ;function s9(Q){return Q<=m3}var t9="gemi.ai.pending-call.v1",a9="gemi.ai.nested-run.v1",p3="gemi.ai.execution-receipt.v1",d3="gemi.ai.signing",LQ=new Map;function ZQ(Q,$){let Z=iQ($),J=`${Q}\x00${Z}`,W=LQ.get(J);if(!W){if(W=Buffer.from(u3("sha256",Z,d3,Q,32)),LQ.size>64)LQ.clear();LQ.set(J,W)}return W}function iQ(Q){let $=Q??process.env.SECRET;if(!$)throw Error("Signing a pending tool call needs an app secret. Set SECRET in the environment.");return $}function I(Q){if(Q===null||typeof Q!=="object")return JSON.stringify(Q)??"null";if(Array.isArray(Q))return`[${Q.map(I).join(",")}]`;let $=Q;return`{${Object.keys($).filter((J)=>$[J]!==void 0).sort().map((J)=>`${JSON.stringify(J)}:${I($[J])}`).join(",")}}`}function l3(Q){return Q.map(($)=>`${$.length}:${$}`).join("")}function g(Q,$){return g3("sha256",Q).update(l3($)).digest()}function r9(Q,$){let Z=Buffer.from(Q.split(".")[4],"base64url");return Z.length===$.length&&c3(Z,$)}function oQ(Q){return I(Q??null)}function e9(Q,$,Z){return[dQ,Q.runId,Q.toolCallId,Q.name,Q.kind,$,String(Z),I(Q.input),I(Q.path??[]),oQ(Q.subject)]}function i3(Q,$,Z){let J=[CQ,Q.runId,Q.toolCallId,Q.name,Q.kind,$,String(Z),I(Q.input)];if(Q.path&&Q.path.length>0)J.push(I(Q.path));return J}var Q$=(Q)=>Buffer.from(Q,"utf8").toString("base64url"),o3=(Q)=>Buffer.from(Q,"base64url").toString("utf8");function $$(Q,$={}){let Z=ZQ(t9,$.secret),W=($.now??Date.now())+($.ttlMs??lQ),X=o9(12).toString("base64url"),G=g(Z,e9(Q,X,W)).toString("base64url");return[dQ,Q$(Q.runId),X,W.toString(36),G].join(".")}function nQ(Q){return OQ(Q,n9)}function OQ(Q,$){let Z=Q.split(".");if(Z.length!==5||!$.includes(Z[0]))return null;let J=Number.parseInt(Z[3],36);if(!Number.isFinite(J))return null;try{return{runId:o3(Z[1]),nonce:Z[2],expiresAt:J,version:Z[0]}}catch{return null}}function Z$(Q,$,Z={}){let J=OQ(Q,n9);if(!J)return{ok:!1,reason:"malformed"};if(J.version===CQ&&!s9(J.expiresAt))return{ok:!1,reason:"forged"};let W=J.version===CQ?g(iQ(Z.secret),i3($,J.nonce,J.expiresAt)):g(ZQ(t9,Z.secret),e9($,J.nonce,J.expiresAt));if(!r9(Q,W))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}var sQ="agn2",PQ="agn1",J$=[sQ,PQ];function W$(Q,$,Z){return[...X$(Q,$,Z,sQ),oQ(Q.subject)]}function X$(Q,$,Z,J=PQ){return[J,Q.runId,I(Q.path),Q.nestedRunId,$,String(Z),I([...Q.open].sort()),I(Q.input)]}function G$(Q,$={}){let Z=ZQ(a9,$.secret),W=($.now??Date.now())+($.ttlMs??lQ),X=o9(12).toString("base64url"),G=g(Z,W$(Q,X,W)).toString("base64url");return[sQ,Q$(Q.runId),X,W.toString(36),G].join(".")}function V$(Q,$,Z={}){let J=OQ(Q,J$);if(!J)return{ok:!1,reason:"malformed"};if(J.version===PQ&&!s9(J.expiresAt))return{ok:!1,reason:"forged"};let W={...$,runId:J.runId},X=J.version===PQ?g(iQ(Z.secret),X$(W,J.nonce,J.expiresAt)):g(ZQ(a9,Z.secret),W$(W,J.nonce,J.expiresAt));if(!r9(Q,X))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}function H$(Q,$,Z={}){let J=ZQ(p3,Z.secret);return g(J,[Q,$.runId,$.toolCallId,$.name,$.kind,I($.input),I($.path??[]),oQ($.subject)]).toString("base64url")}function Y$(Q,$){return z$($,nQ(Q))}function K$(Q,$){return z$($,OQ(Q,J$))}async function z$(Q,$){if(!$)return!1;return Q.consume($.nonce,$.expiresAt)}class JQ extends T{id;code="attachment_not_found";constructor(Q){super(`No attachment ${Q}.`);this.id=Q;this.name="AttachmentNotFoundError"}}class i extends T{code="invalid_attachment_scope";constructor(Q){super(Q);this.name="InvalidAttachmentScopeError"}}function tQ(Q){if(!Q||typeof Q.key!=="string"||Q.key.length===0)throw new i("An attachment scope needs a non-empty key. Return `null` from `attachmentScope()` for a request that has no subject \u2014 an empty key is a bucket every caller shares.");return Q}var f="gemi_att_";function aQ(){return`${f}${crypto.randomUUID()}`}class WQ{store;storage;scope;constructor(Q,$,Z){this.store=Q;this.storage=$;this.scope=Z;tQ(Z)}async get(Q){let $=await this.store.find(this.scope,Q);if(!$||$.scopeKey!==this.scope.key)throw new JQ(Q);return $}async read(Q){return await this.readRecord(Q,await this.get(Q))}async readRecord(Q,$){if(!$.objectName)throw new JQ(Q);return await this.storage.read({name:$.objectName})}async file(Q){let $=await this.get(Q),J=(await this.readRecord(Q,$)).body,W=J instanceof Blob?J:J?await new Response(J).blob():new Blob([]);return new File([W],$.name,{type:$.mimeType})}async put(Q,$={}){let Z=aQ(),J=$.mimeType??Q.type??"",W=$.name??(Q instanceof File?Q.name:Z),X=await this.storage.put({name:rQ(Z,W),body:Q,contentType:J||void 0}),G={id:Z,scopeKey:this.scope.key,objectName:X,name:W,mimeType:J||"application/octet-stream",size:Q.size,createdAt:new Date().toISOString(),destination:$.fileId?"both":"storage",...$.fileId?{fileId:$.fileId}:{}};return await this.store.put(this.scope,G),G}}function rQ(Q,$){let Z=/\.([A-Za-z0-9]{1,8})$/.exec($);return`attachments/${Q}${Z?`.${Z[1].toLowerCase()}`:""}`}class qQ{rows=new Map;async put(Q,$){tQ(Q),this.rows.set($.id,{...$,scopeKey:Q.key})}async find(Q,$){tQ(Q);let Z=this.rows.get($);if(!Z||Z.scopeKey!==Q.key)return null;return Z}get size(){return this.rows.size}}var NQ=new qQ;var eQ=new TextEncoder;function B$(Q){return`id: ${Q.seq}
2
+ import{Ab as l9,Bb as _$,Cb as M$,Db as q3,zb as T}from"../chunk-wc46df4w.js";import{Me as L3,Pe as P3,cf as T6,df as k6,ef as a,ff as YQ,tf as O3,vf as e,wf as d}from"../chunk-4x41cmg3.js";import{Af as cQ,xf as C3,zf as uQ}from"../chunk-9xf2fx98.js";import{Ef as SQ}from"../chunk-eqtsfvvd.js";import{Kg as jQ}from"../chunk-48dek9s7.js";import"../chunk-f6s7ddjz.js";import"../chunk-n63xjrck.js";import"../chunk-68zf43ah.js";class h extends Error{status;body;requestId;constructor(Q,$,Z){super(`Provider request failed with status ${Q}: ${E3($)}`);this.name="ProviderHttpError",this.status=Q,this.body=$,this.requestId=Z}}class KQ extends Error{timeoutMs;constructor(Q){super(`Provider request timed out after ${Q}ms`);this.name="ProviderTimeoutError",this.timeoutMs=Q}}function E3(Q){let $=i9(Q);if($?.message)return $.message;if(typeof Q==="string")return Q.slice(0,500);return"no error body"}function i9(Q){if(!Q||typeof Q!=="object")return null;let $=Q,J=$.error&&typeof $.error==="object"?$.error:Q;if(typeof J.message!=="string"&&typeof J.code!=="string"&&typeof J.type!=="string")return null;let W=J.innererror?.code??J.code;return{message:J.message,type:J.type,code:W,param:J.param}}function A(Q){if(!Q||typeof Q!=="object")return{};let{status:$,requestId:Z}=Q;return{...typeof $==="number"&&$>=100&&$<=599?{status:$}:{},...typeof Z==="string"&&Z?{requestId:Z}:{}}}function k(Q){if(Q instanceof KQ)return{code:"provider_error",message:Q.message,retryable:!0};if(I3(Q))return{code:"aborted",message:"The request was aborted.",retryable:!1};if(Q instanceof h)return x3(Q.status,i9(Q.body),Q.message);if(Q instanceof TypeError)return{code:"provider_error",message:`Could not reach the provider: ${Q.message}`,retryable:!0};if(Q instanceof Error)return{code:"provider_error",message:Q.message,retryable:!1};return{code:"unknown",message:String(Q),retryable:!1}}function x3(Q,$,Z){let J=$?.message??Z,W=($?.code??"").toLowerCase(),X=($?.type??"").toLowerCase(),G=`${W} ${X} ${J}`.toLowerCase();if(Q===429){let V=W==="insufficient_quota"||G.includes("quota");return{code:"rate_limited",message:J,retryable:!V}}if(Q>=500||Q===408||Q===409)return{code:"provider_error",message:J,retryable:!0};if(b3(G))return{code:"context_length_exceeded",message:J,retryable:!1};if(w3(G))return{code:"content_filtered",message:J,retryable:!1};if($?.param?.startsWith("tools")||G.includes("invalid schema for function"))return{code:"invalid_tool_input",message:J,retryable:!1};return{code:"provider_error",message:J,retryable:!1}}function b3(Q){return Q.includes("context_length_exceeded")||Q.includes("maximum context length")||Q.includes("context window")||Q.includes("reduce the length")}function w3(Q){return Q.includes("content_filter")||Q.includes("content_policy_violation")||Q.includes("responsibleaipolicyviolation")||Q.includes("content management policy")}function I3(Q){if(!Q||typeof Q!=="object")return!1;let $=Q;return $.name==="AbortError"||$.code==="ABORT_ERR"}class E extends Error{constructor(){super("The run was stopped");this.name="RunAborted"}}function y(Q,$){if($.aborted)return Promise.reject(new E);return new Promise((Z,J)=>{let W=()=>J(new E);$.addEventListener("abort",W,{once:!0}),Q.then(Z,J).finally(()=>$.removeEventListener("abort",W))})}function M(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function R(Q,$){if(!$)return Q;let Z={inputTokens:Q.inputTokens+($.inputTokens??0),outputTokens:Q.outputTokens+($.outputTokens??0),totalTokens:Q.totalTokens+($.totalTokens??0)};if($.reasoningTokens!==void 0||Q.reasoningTokens!==void 0)Z.reasoningTokens=(Q.reasoningTokens??0)+($.reasoningTokens??0);if($.cachedInputTokens!==void 0||Q.cachedInputTokens!==void 0)Z.cachedInputTokens=(Q.cachedInputTokens??0)+($.cachedInputTokens??0);if($.imageInputTokens!==void 0||Q.imageInputTokens!==void 0)Z.imageInputTokens=(Q.imageInputTokens??0)+($.imageInputTokens??0);if($.imageOutputTokens!==void 0||Q.imageOutputTokens!==void 0)Z.imageOutputTokens=(Q.imageOutputTokens??0)+($.imageOutputTokens??0);return Z}function zQ(Q){if(!Q.trim())return{};try{return JSON.parse(Q)}catch{}let $=[],Z=!1,J=!1;for(let G of Q){if(Z){if(J)J=!1;else if(G==="\\")J=!0;else if(G==='"')Z=!1;continue}if(G==='"')Z=!0;else if(G==="{")$.push("}");else if(G==="[")$.push("]");else if(G==="}"||G==="]")$.pop()}let W=Q;if(Z)W+='"';W=W.replace(/[,:]\s*$/,"");let X=$.reverse().join("");try{return JSON.parse(W+X)}catch{try{return JSON.parse(W.replace(/,?\s*"[^"]*"\s*$/,"")+X)}catch{return{}}}}function BQ(Q){return{name:"output",schema:Q.toJSONSchema(),strict:a(Q)}}function DQ(Q,$){let Z=Q.safeParse(zQ($));if(Z.ok===!0)return{ok:!0,value:Z.value};return{ok:!1,error:{code:"invalid_output",message:`The model's structured answer did not match the output schema: ${Z.errors.join(", ")}`,retryable:!0}}}function UQ(Q){if(Q.length>0)Q[0];return Q}function r(Q,$,Z){let J=Q.content[Q.content.length-1];if(J&&J.type===$){J.text=(J.text??"")+Z;return}Q.content.push($==="text"?{type:"text",text:Z}:{type:"reasoning",text:Z})}function FQ(Q,$,Z){let J=Q.content[Q.content.length-1];if(J&&J.type==="reasoning"&&J.id===$){J.text=(J.text??"")+Z;return}Q.content.push($?{type:"reasoning",id:$,text:Z}:{type:"reasoning",text:Z})}function v3(Q){return mQ(Q)}async function mQ(Q,$={}){let Z=`gen_${crypto.randomUUID()}`,J=await h3(Q);if($.settled?.(J),!J.ok){if(Q.logErrors!==!1&&J.error.code!=="aborted")f3(Z,J.error,$.origin);if(Q.throwOnError)throw new QQ({runId:Z,messages:J.messages,finishReason:J.finishReason,usage:J.usage,error:J.error})}return J}function f3(Q,$,Z){let J=`[gemi/ai] generate() failed (${$.code}${$.status!==void 0?` ${$.status}`:""}): ${$.message}`,W={...Z,generateId:Q,error:$},X=!1;try{e.error(J,W),X=!0}catch{}if(!X||Bun.env.NODE_ENV==="development")console.error(J,W)}async function h3(Q){let $=Q.messages??[];if($.length===0&&!Q.prompt)throw Error("generate() was given neither a `prompt` nor `messages`, so there is nothing to send the model.");let Z=[...$];if(Q.prompt)Z.push({id:`msg_${crypto.randomUUID()}`,role:"user",content:[{type:"text",text:Q.prompt}],createdAt:new Date().toISOString()});let J={id:`msg_${crypto.randomUUID()}`,role:"assistant",content:[],createdAt:new Date().toISOString()},W=Q.signal??new AbortController().signal,X=M(),G="stop",V,H={},Y="";try{let U=Q.provider.stream({messages:[...Z],systemPrompt:Q.instructions?.trim()?Q.instructions:void 0,output:BQ(Q.output),reasoning:Q.reasoning,maxOutputTokens:Q.maxOutputTokens,temperature:Q.temperature,signal:Q.signal})[Symbol.asyncIterator]();try{for(;;){let j=await y(Promise.resolve(U.next()),W);if(j.done)break;let D=j.value;switch(D.type){case"output-delta":Y+=D.delta;break;case"text-delta":r(J,"text",D.delta);break;case"reasoning-delta":FQ(J,D.id,D.delta);break;case"finish":if(X=R(X,D.usage),!V)G=D.reason;break;case"error":G="error",V=D.error,H=A(D);break}}}finally{if(W.aborted)Promise.resolve(U.return?.()).catch(()=>{})}}catch(B){if(B instanceof E||W.aborted)G="aborted",V=y3(W);else G="error",V=Q.provider.normalizeError(B),H=A(B)}let K=!1,z;if(!V)if(G==="length")V={code:"invalid_output",message:"The model ran out of output tokens before finishing its structured answer, so it was cut off. Raise maxOutputTokens, or ask for a shorter answer.",retryable:!0};else if(!Y.trim())V={code:"invalid_output",message:"The model finished without giving a structured answer.",retryable:!0};else{let B=DQ(Q.output,Y);if(B.ok===!0)K=!0,z=B.value;else V=B.error}if(K)J.content.push({type:"output",value:z});else if(Y)r(J,"text",Y);for(let B of J.content)if((B.type==="text"||B.type==="reasoning")&&typeof B.text==="string")B.text=UQ(B.text);if(J.finishReason=G,J.usage=X,Z.push(J),K)return{ok:!0,output:z,messages:Z,usage:X,finishReason:G};return{ok:!1,error:{...V,...H},messages:Z,usage:X,finishReason:G}}function y3(Q){return Q.reason?.name==="TimeoutError"?{code:"timeout",message:"The generation timed out.",retryable:!0}:{code:"aborted",message:"The generation was stopped.",retryable:!1}}import{createHmac as g3,hkdfSync as u3,randomBytes as o9,timingSafeEqual as c3}from"crypto";class $Q{spent=new Map;sweepAt=1024;async consume(Q,$){return this.consumeSync(Q,$)}consumeSync(Q,$,Z=Date.now()){if(this.spent.size>=this.sweepAt)this.sweep(Z);let J=this.spent.get(Q);if(J!==void 0&&J>Z)return!1;return this.spent.set(Q,$),!0}get size(){return this.spent.size}sweep(Q){for(let[$,Z]of this.spent)if(Z<=Q)this.spent.delete($);this.sweepAt=Math.max(1024,this.spent.size*2)}}class pQ{injectedClient;prefix;constructor(Q={}){this.injectedClient=Q.client,this.prefix=Q.prefix??"gemi:ai:nonce"}async consume(Q,$){let Z=Math.max(1,Math.ceil($-Date.now()));return await this.client.send("SET",[`${this.prefix}:${Q}`,"1","PX",String(Z),"NX"])==="OK"}get client(){if(this.injectedClient)return this.injectedClient;let Q=jQ(),$=Q.bound(d)?Q.make(d).client:void 0;if(!$)throw Error("RedisNonceStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisNonceStore({ client }).");return $}}var l=new $Q;var dQ="agt2",CQ="agt1",n9=[dQ,CQ],lQ=86400000,m3=Date.now()+lQ;function s9(Q){return Q<=m3}var t9="gemi.ai.pending-call.v1",a9="gemi.ai.nested-run.v1",p3="gemi.ai.execution-receipt.v1",d3="gemi.ai.signing",LQ=new Map;function ZQ(Q,$){let Z=iQ($),J=`${Q}\x00${Z}`,W=LQ.get(J);if(!W){if(W=Buffer.from(u3("sha256",Z,d3,Q,32)),LQ.size>64)LQ.clear();LQ.set(J,W)}return W}function iQ(Q){let $=Q??process.env.SECRET;if(!$)throw Error("Signing a pending tool call needs an app secret. Set SECRET in the environment.");return $}function I(Q){if(Q===null||typeof Q!=="object")return JSON.stringify(Q)??"null";if(Array.isArray(Q))return`[${Q.map(I).join(",")}]`;let $=Q;return`{${Object.keys($).filter((J)=>$[J]!==void 0).sort().map((J)=>`${JSON.stringify(J)}:${I($[J])}`).join(",")}}`}function l3(Q){return Q.map(($)=>`${$.length}:${$}`).join("")}function g(Q,$){return g3("sha256",Q).update(l3($)).digest()}function r9(Q,$){let Z=Buffer.from(Q.split(".")[4],"base64url");return Z.length===$.length&&c3(Z,$)}function oQ(Q){return I(Q??null)}function e9(Q,$,Z){return[dQ,Q.runId,Q.toolCallId,Q.name,Q.kind,$,String(Z),I(Q.input),I(Q.path??[]),oQ(Q.subject)]}function i3(Q,$,Z){let J=[CQ,Q.runId,Q.toolCallId,Q.name,Q.kind,$,String(Z),I(Q.input)];if(Q.path&&Q.path.length>0)J.push(I(Q.path));return J}var Q$=(Q)=>Buffer.from(Q,"utf8").toString("base64url"),o3=(Q)=>Buffer.from(Q,"base64url").toString("utf8");function $$(Q,$={}){let Z=ZQ(t9,$.secret),W=($.now??Date.now())+($.ttlMs??lQ),X=o9(12).toString("base64url"),G=g(Z,e9(Q,X,W)).toString("base64url");return[dQ,Q$(Q.runId),X,W.toString(36),G].join(".")}function nQ(Q){return OQ(Q,n9)}function OQ(Q,$){let Z=Q.split(".");if(Z.length!==5||!$.includes(Z[0]))return null;let J=Number.parseInt(Z[3],36);if(!Number.isFinite(J))return null;try{return{runId:o3(Z[1]),nonce:Z[2],expiresAt:J,version:Z[0]}}catch{return null}}function Z$(Q,$,Z={}){let J=OQ(Q,n9);if(!J)return{ok:!1,reason:"malformed"};if(J.version===CQ&&!s9(J.expiresAt))return{ok:!1,reason:"forged"};let W=J.version===CQ?g(iQ(Z.secret),i3($,J.nonce,J.expiresAt)):g(ZQ(t9,Z.secret),e9($,J.nonce,J.expiresAt));if(!r9(Q,W))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}var sQ="agn2",PQ="agn1",J$=[sQ,PQ];function W$(Q,$,Z){return[...X$(Q,$,Z,sQ),oQ(Q.subject)]}function X$(Q,$,Z,J=PQ){return[J,Q.runId,I(Q.path),Q.nestedRunId,$,String(Z),I([...Q.open].sort()),I(Q.input)]}function G$(Q,$={}){let Z=ZQ(a9,$.secret),W=($.now??Date.now())+($.ttlMs??lQ),X=o9(12).toString("base64url"),G=g(Z,W$(Q,X,W)).toString("base64url");return[sQ,Q$(Q.runId),X,W.toString(36),G].join(".")}function V$(Q,$,Z={}){let J=OQ(Q,J$);if(!J)return{ok:!1,reason:"malformed"};if(J.version===PQ&&!s9(J.expiresAt))return{ok:!1,reason:"forged"};let W={...$,runId:J.runId},X=J.version===PQ?g(iQ(Z.secret),X$(W,J.nonce,J.expiresAt)):g(ZQ(a9,Z.secret),W$(W,J.nonce,J.expiresAt));if(!r9(Q,X))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}function H$(Q,$,Z={}){let J=ZQ(p3,Z.secret);return g(J,[Q,$.runId,$.toolCallId,$.name,$.kind,I($.input),I($.path??[]),oQ($.subject)]).toString("base64url")}function Y$(Q,$){return z$($,nQ(Q))}function K$(Q,$){return z$($,OQ(Q,J$))}async function z$(Q,$){if(!$)return!1;return Q.consume($.nonce,$.expiresAt)}class JQ extends T{id;code="attachment_not_found";constructor(Q){super(`No attachment ${Q}.`);this.id=Q;this.name="AttachmentNotFoundError"}}class i extends T{code="invalid_attachment_scope";constructor(Q){super(Q);this.name="InvalidAttachmentScopeError"}}function tQ(Q){if(!Q||typeof Q.key!=="string"||Q.key.length===0)throw new i("An attachment scope needs a non-empty key. Return `null` from `attachmentScope()` for a request that has no subject \u2014 an empty key is a bucket every caller shares.");return Q}var f="gemi_att_";function aQ(){return`${f}${crypto.randomUUID()}`}class WQ{store;storage;scope;constructor(Q,$,Z){this.store=Q;this.storage=$;this.scope=Z;tQ(Z)}async get(Q){let $=await this.store.find(this.scope,Q);if(!$||$.scopeKey!==this.scope.key)throw new JQ(Q);return $}async read(Q){return await this.readRecord(Q,await this.get(Q))}async readRecord(Q,$){if(!$.objectName)throw new JQ(Q);return await this.storage.read({name:$.objectName})}async file(Q){let $=await this.get(Q),J=(await this.readRecord(Q,$)).body,W=J instanceof Blob?J:J?await new Response(J).blob():new Blob([]);return new File([W],$.name,{type:$.mimeType})}async put(Q,$={}){let Z=aQ(),J=$.mimeType??Q.type??"",W=$.name??(Q instanceof File?Q.name:Z),X=await this.storage.put({name:rQ(Z,W),body:Q,contentType:J||void 0}),G={id:Z,scopeKey:this.scope.key,objectName:X,name:W,mimeType:J||"application/octet-stream",size:Q.size,createdAt:new Date().toISOString(),destination:$.fileId?"both":"storage",...$.fileId?{fileId:$.fileId}:{}};return await this.store.put(this.scope,G),G}}function rQ(Q,$){let Z=/\.([A-Za-z0-9]{1,8})$/.exec($);return`attachments/${Q}${Z?`.${Z[1].toLowerCase()}`:""}`}class qQ{rows=new Map;async put(Q,$){tQ(Q),this.rows.set($.id,{...$,scopeKey:Q.key})}async find(Q,$){tQ(Q);let Z=this.rows.get($);if(!Z||Z.scopeKey!==Q.key)return null;return Z}get size(){return this.rows.size}}var NQ=new qQ;var eQ=new TextEncoder;function B$(Q){return`id: ${Q.seq}
3
3
  data: ${JSON.stringify(Q.event)}
4
4
 
5
5
  `}var n3=5000,s3=`: keepalive
@@ -0,0 +1,9 @@
1
+ // @bun
2
+ import{Af as GH,Bf as n,zf as R}from"./chunk-9xf2fx98.js";import{Ef as C}from"./chunk-eqtsfvvd.js";import{Kg as qH}from"./chunk-48dek9s7.js";import{Wg as b}from"./chunk-n63xjrck.js";import{bh as W0}from"./chunk-68zf43ah.js";class YH{static kind="controller";constructor(){}}class gH extends YH{}function t(H){let G=new Map;if(!H)return G;for(let Q of H.split(";")){let Z=Q.indexOf("=");if(Z===-1)continue;let X=Q.slice(0,Z).trim();if(!X)continue;G.set(X,Q.slice(Z+1).trim())}return G}function F0(H){return t(H.headers.get("cookie"))}function I(H){if(!/^\d+$/.test(H))return null;let G=Number(H);return Number.isSafeInteger(G)?G:null}function MH(H){if(!H)return null;let G=H.trim();if(!/^bytes=/i.test(G))return null;let Z=G.slice(6).split(",").map((U)=>U.trim()).filter((U)=>U!=="");if(Z.length!==1)return null;let X=Z[0],$=X.indexOf("-");if($===-1)return null;let K=X.slice(0,$),T=X.slice($+1);if(K===""){let U=I(T);if(U===null)return null;return{kind:"suffix",suffixLength:U}}let W=I(K);if(W===null)return null;if(T==="")return{kind:"offset",start:W,end:null};let Y=I(T);if(Y===null||Y<W)return null;return{kind:"offset",start:W,end:Y}}function DH(H,G){if(!Number.isFinite(G)||G<=0)return null;let Q,Z;if(H.kind==="suffix"){if(H.suffixLength<=0)return null;Q=Math.max(0,G-H.suffixLength),Z=G-1}else{if(H.start>=G)return null;if(Q=H.start,Z=H.end===null?G-1:Math.min(H.end,G-1),Z<Q)return null}return{start:Q,end:Z,length:Z-Q+1}}function L0(H){if(H.kind==="suffix")return`bytes=-${H.suffixLength}`;return H.end===null?`bytes=${H.start}-`:`bytes=${H.start}-${H.end}`}function J0(H){if(!H)return null;let G=/^bytes\s+(\d+)-(\d+)\/(\d+)$/i.exec(H.trim());if(!G)return null;let Q=I(G[1]),Z=I(G[2]),X=I(G[3]);if(Q===null||Z===null||X===null||Z<Q)return null;return{start:Q,end:Z,total:X}}function C0(H,G,Q){return`bytes ${H}-${G}/${Q}`}function UH(H){return`bytes */${H}`}class w extends R{errors={};constructor(H){super("Validation error");this.name="ValidationError",this.errors=H,this.payload={api:{status:400,data:{error:{kind:"validation_error",messages:H,status:400}},headers:{"Content-Type":"application/json"}},view:{status:400}}}}function yH(H){let[G,Q]=H.match(/\d+|\D+/g)??[];if(!G||!Q)return 0;let Z=Number.parseInt(G);switch(Q){case"B":return Z;case"KB":return Z*1024;case"MB":return Z*1024*1024;case"GB":return Z*1024*1024*1024;case"TB":return Z*1024*1024*1024*1024;default:return 0}}function kH(H){switch(H){case"image":return"image";case"png":return"image/png";case"jpg":return"image/jpeg";case"jpeg":return"image/jpeg";case"ttf":return"font/ttf";case"excel":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case"csv":return"text/csv";case"word":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case"pdf":return"application/pdf";case"json":return"application/json";default:return H}}function PH(H){if(typeof H==="string"||Array.isArray(H))return H.length;return}function r(H){return typeof H==="number"&&!Number.isNaN(H)}var bH=["required","string","boolean","number","email","password","min","max","gte","lte","file","fileType","fileSize","array","object","in"];class J extends Error{name="InvalidValidationRuleError"}function v(H,G){let Q=G===void 0||G.trim()===""?Number.NaN:Number(G);if(Number.isNaN(Q))throw new J(`Validation rule "${H}:${G??""}" needs a number, e.g. "${H}:3"`);return Q}function BH(H){let G=H.indexOf(":"),Q=G===-1?H:H.slice(0,G),Z=G===-1?void 0:H.slice(G+1);switch(Q){case"required":return(X)=>{if(X instanceof Blob)return X.size>0;if(X===null||X===void 0)return!1;if(typeof X==="string"||Array.isArray(X))return X.length>0;return!0};case"string":return(X)=>typeof X==="string";case"boolean":return(X)=>typeof X==="boolean";case"number":return(X)=>r(X);case"password":return(X)=>{return typeof X==="string"&&/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/.test(X)};case"min":{let X=v(Q,Z);return($)=>{let K=PH($);return K!==void 0&&K>=X}}case"max":{let X=v(Q,Z);return($)=>{let K=PH($);return K!==void 0&&K<=X}}case"gte":{let X=v(Q,Z);return($)=>r($)&&$>=X}case"lte":{let X=v(Q,Z);return($)=>r($)&&$<=X}case"email":return(X)=>{return typeof X==="string"&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(X)};case"file":return(X)=>{return X instanceof Blob};case"fileType":{if(!Z)throw new J('Validation rule "fileType" needs a type, e.g. "fileType:png" or "fileType:image"');let X=kH(Z);return($)=>$ instanceof Blob&&$.type.startsWith(X)}case"fileSize":{let X=yH(Z??"");if(X===0&&!/^0+(B|KB|MB|GB|TB)$/.test(Z??""))throw new J(`Validation rule "fileSize:${Z??""}" needs a whole size in B, KB, MB, GB or TB, e.g. "fileSize:5MB"`);return($)=>$ instanceof Blob&&$.size<=X}case"array":return(X)=>Array.isArray(X);case"object":return(X)=>typeof X==="object"&&X!==null&&!Array.isArray(X)&&!(X instanceof Blob);case"in":{let X=(Z??"").split(",").filter(($)=>$!=="");if(X.length===0)throw new J('Validation rule "in" needs a comma-separated list, e.g. "in:draft,published"');return($)=>typeof $==="string"&&X.includes($)}default:throw new J(`Unknown validation rule "${H}". Known rules: ${bH.join(", ")}`)}}function q(H){if(!H.definition)throw Error(`gemi/ai: the recursive schema "${H.name}" was used before its definition returned; \`self\` can be nested into the schema, but not parsed or emitted inside the callback`);return H.definition}var o=new WeakMap;function AH(H){return typeof H==="object"&&H!==null&&o.has(H)}function c(H){let G=o.get(H);if(!G)throw Error("gemi/ai: expected a schema built with `s`, got a foreign object");return G}function fH(H){let G={defs:{},cells:new Map},Q=H;if(H.node.kind==="ref"){let X=q(H.node.cell);Q={...X,...H.description?{description:H.description}:{},optional:H.optional,nullable:H.nullable||X.nullable}}let Z=x(Q,G);return Object.keys(G.defs).length>0?{...Z,$defs:G.defs}:Z}function x(H,G){let Q=(H.optional||H.nullable)&&H.node.kind!=="json",Z=cH(pH(H.node,G),Q),X=[H.description,vH(H.node)].filter(Boolean).join(" ");if(X&&Z.$ref!==void 0)Z={anyOf:[Z]};return X?{description:X,...Z}:Z}function vH(H){let G=[];if(H.kind==="string"||H.kind==="enum"){let Q=H.checks;if(Q?.format)G.push(`Format: ${Q.format.name}.`);if(Q?.minLength!==void 0)G.push(`At least ${Q.minLength} characters.`);if(Q?.maxLength!==void 0)G.push(`At most ${Q.maxLength} characters.`)}else if(H.kind==="number"){let Q=H.checks;if(Q?.minimum!==void 0)G.push(`Minimum ${Q.minimum}.`);if(Q?.exclusiveMinimum!==void 0)G.push(`Greater than ${Q.exclusiveMinimum}.`);if(Q?.maximum!==void 0)G.push(`Maximum ${Q.maximum}.`);if(Q?.exclusiveMaximum!==void 0)G.push(`Less than ${Q.exclusiveMaximum}.`)}else if(H.kind==="array"){let Q=H.checks;if(Q?.minItems!==void 0)G.push(`At least ${Q.minItems} items.`);if(Q?.maxItems!==void 0)G.push(`At most ${Q.maxItems} items.`)}return G.join(" ")}function pH(H,G){switch(H.kind){case"string":return{type:"string"};case"number":return{type:H.checks?.integer?"integer":"number"};case"boolean":return{type:"boolean"};case"literal":return{type:typeof H.value,const:H.value};case"enum":return{type:"string",enum:H.values};case"array":return{type:"array",items:x(H.item,G)};case"object":return{type:"object",properties:Object.fromEntries(Object.entries(H.shape).map(([Q,Z])=>[Q,x(Z,G)])),required:Object.keys(H.shape),additionalProperties:!1};case"union":return{anyOf:H.members.map((Q)=>x(Q,G))};case"json":return{};case"ref":{let{cell:Q}=H,Z=G.cells.get(Q.name);if(Z&&Z!==Q)throw Error(`gemi/ai: two different recursive schemas are named "${Q.name}" in one schema; give each s.recursive(...) its own name`);if(!Z)G.cells.set(Q.name,Q),G.defs[Q.name]={},G.defs[Q.name]=x(q(Q),G);return{$ref:`#/$defs/${Q.name}`}}}}function cH(H,G){if(!G)return H;if(H.anyOf)return{...H,anyOf:[...H.anyOf,{type:"null"}]};if(H.enum||H.const!==void 0)return{anyOf:[H,{type:"null"}]};if(typeof H.type==="string")return{...H,type:[H.type,"null"]};return{anyOf:[H,{type:"null"}]}}function hH(H){if(H===null)return"null";if(Array.isArray(H))return"array";return typeof H}function mH(H,G){if(typeof G==="number"&&!Number.isFinite(G))return String(G);if(H.kind==="literal"||H.kind==="enum"){if(typeof G==="string"||typeof G==="number"||typeof G==="boolean")return JSON.stringify(G)}return hH(G)}function FH(H){let G=H.node,Q=(()=>{switch(G.kind){case"number":return G.checks?.integer?"integer":"number";case"string":case"boolean":return G.kind;case"literal":return JSON.stringify(G.value);case"enum":return`one of ${G.values.map((Z)=>JSON.stringify(Z)).join(" | ")}`;case"array":return"array";case"object":return"object";case"union":return"one of the variants";case"json":return"a JSON value";case"ref":return FH({...q(G.cell),optional:!1,nullable:!1})}})();return H.optional||H.nullable?`${Q} or null`:Q}function dH(H){let G="";for(let Q of H)G+=typeof Q==="number"?`[${Q}]`:G?`.${Q}`:Q;return G}function uH(H){let G=dH(H);return G?`${G}: `:""}function l(H){return`${uH(H.path)}${H.message}`}function h(H,G){if(G===null||G===void 0)return H.optional||H.nullable?1:0;let Q=H.node;switch(Q.kind){case"string":return typeof G==="string"?1:0;case"number":return typeof G==="number"?1:0;case"boolean":return typeof G==="boolean"?1:0;case"literal":return G===Q.value?10:0;case"enum":return typeof G==="string"&&Q.values.includes(G)?10:0;case"array":return Array.isArray(G)?1:0;case"object":{if(typeof G!=="object"||Array.isArray(G))return 0;let Z=G,X=1;for(let[$,K]of Object.entries(Q.shape))X+=h(K,Z[$]);return X}case"union":return Q.members.reduce((Z,X)=>Math.max(Z,h(X,G)),0);case"json":return 1;case"ref":return zH(Q.cell,G,()=>1,()=>h(q(Q.cell),G))}}function zH(H,G,Q,Z){if(typeof G!=="object"||G===null)return Z();if(H.active.has(G))return Q();H.active.add(G);try{return Z()}finally{H.active.delete(G)}}function _(H,G,Q,Z){if(H.optional&&(G===null||G===void 0))return{drop:!0,value:void 0};if(H.nullable&&G===null)return{drop:!1,value:null};return{drop:!1,value:oH(H,G,Q,Z)}}function oH(H,G,Q,Z){let X=H.node,$=()=>{let K=G===void 0?"required":X.kind==="literal"?"const":X.kind==="enum"&&typeof G==="string"?"enum":"type",T=K==="const"?{allowedValue:X.value}:K==="enum"?{allowedValues:X.values}:{};Z.push({path:Q,code:K,message:`expected ${FH(H)}, got ${mH(X,G)}`,params:T});return};switch(X.kind){case"string":if(typeof G!=="string")return $();return RH(X.checks,G,Q,Z),G;case"number":if(typeof G!=="number"||!Number.isFinite(G))return $();if(X.checks?.integer&&!Number.isInteger(G))return $();return iH(X.checks,G,Q,Z),G;case"boolean":return typeof G==="boolean"?G:$();case"literal":return G===X.value?G:$();case"enum":if(typeof G!=="string"||!X.values.includes(G))return $();return RH(X.checks,G,Q,Z),G;case"array":{if(!Array.isArray(G))return $();let K=G.map((Y,U)=>{let N=_(X.item,Y,[...Q,U],Z);return N.drop?void 0:N.value}),{minItems:T,maxItems:W}=X.checks??{};if(T!==void 0&&G.length<T)Z.push({path:Q,code:"minItems",message:`expected at least ${T} items, got ${G.length}`,params:{limit:T}});if(W!==void 0&&G.length>W)Z.push({path:Q,code:"maxItems",message:`expected at most ${W} items, got ${G.length}`,params:{limit:W}});return K}case"object":{if(typeof G!=="object"||G===null||Array.isArray(G))return $();let K=G,T={};for(let[W,Y]of Object.entries(X.shape)){let U=_(Y,K[W],[...Q,W],Z);if(!U.drop)T[W]=U.value}return T}case"union":{let K;for(let T of X.members){let W=[],Y=_(T,G,Q,W);if(W.length===0)return Y.drop?void 0:Y.value;let U=h(T,G);if(!K||U>K.score)K={issues:W,score:U}}Z.push({path:Q,code:"anyOf",message:`no matching variant; closest: ${K.issues.map(l).join("; ")}`,params:{closest:K.issues}});return}case"json":if(G===void 0)return $();return m(G,Q,Z,new Set),G;case"ref":return zH(X.cell,G,()=>{Z.push({path:Q,code:"type",message:"expected a finite tree, got a circular reference",params:{}});return},()=>_(q(X.cell),G,Q,Z).value)}}function nH(H){let G=0;for(let Q of H)G++;return G}function RH(H,G,Q,Z){if(!H)return;let{minLength:X,maxLength:$,format:K}=H;if(X!==void 0||$!==void 0){let T=nH(G);if(X!==void 0&&T<X)Z.push({path:Q,code:"minLength",message:`expected at least ${X} characters, got ${T}`,params:{limit:X}});if($!==void 0&&T>$)Z.push({path:Q,code:"maxLength",message:`expected at most ${$} characters, got ${T}`,params:{limit:$}})}if(K){let T=!1;try{T=K.test(G)===!0}catch{}if(!T)Z.push({path:Q,code:"format",message:`expected a string in format "${K.name}"`,params:{format:K.name}})}}function iH(H,G,Q,Z){if(!H)return;let X=($,K,T,W)=>{if(K===void 0||T(K))return;Z.push({path:Q,code:$,message:`expected ${W} ${K}, got ${G}`,params:{limit:K}})};X("minimum",H.minimum,($)=>G>=$,"at least"),X("exclusiveMinimum",H.exclusiveMinimum,($)=>G>$,"more than"),X("maximum",H.maximum,($)=>G<=$,"at most"),X("exclusiveMaximum",H.exclusiveMaximum,($)=>G<$,"less than")}function m(H,G,Q,Z,X=!0){let $=(T)=>{Q.push({path:G,code:"type",message:`expected a JSON value, got ${T}`,params:{}})};switch(typeof H){case"undefined":case"string":case"boolean":return;case"number":if(!Number.isFinite(H))$(String(H));return;case"bigint":return $("a bigint");case"function":return $("a function");case"symbol":return $("a symbol")}if(H===null)return;let K=H;if(Z.has(K))return $("a circular reference");Z.add(K);try{let T=X?K.toJSON:void 0;if(typeof T==="function"){let W;try{W=T.call(K)}catch{return $("a toJSON that threw")}if(W===void 0)return $("a toJSON that returns undefined");return m(W,G,Q,Z,!1)}if(Array.isArray(H))H.forEach((W,Y)=>m(W,[...G,Y],Q,Z));else for(let[W,Y]of Object.entries(K))m(Y,[...G,W],Q,Z)}finally{Z.delete(K)}}function A(H){return d(H)}function d(H){let G={toJSONSchema:()=>fH(H),parse(Q){let Z=[],X=_(H,Q,[],Z);if(Z.length>0)throw Error(Z.map(l).join("; "));return X.drop?void 0:X.value},safeParse(Q){let Z=[],X=_(H,Q,[],Z);if(Z.length>0)return{ok:!1,errors:Z.map(l)};return{ok:!0,value:X.drop?void 0:X.value}},validate(Q){let Z=[],X=_(H,Q,[],Z);if(Z.length>0)return{ok:!1,issues:Z};return{ok:!0,value:X.drop?void 0:X.value}},describe:(Q)=>d({...H,description:Q}),optional:()=>d({...H,optional:!0}),nullable:()=>d({...H,nullable:!0,optional:!1})};return o.set(G,H),G}function z(H){return{node:H,optional:!1,nullable:!1}}class LH extends Error{problems;constructor(H){super(`gemi/ai: s.fromJSONSchema cannot model this schema:
3
+ ${H.map((G)=>`- ${G}`).join(`
4
+ `)}`);this.name="JSONSchemaError",this.problems=H}}var tH=new Set(["title","$schema","$id","$comment","examples","default","deprecated","readOnly","writeOnly"]),S={string:["minLength","maxLength","format"],number:["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],integer:["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],boolean:[],object:["properties","required","additionalProperties"],array:["items","minItems","maxItems"]};function p(H){return typeof H==="object"&&H!==null&&!Array.isArray(H)}function u(H,G,Q,Z){let X=(M,D=Q)=>{Z.push(D?`${D}: ${M}`:M);return},$=(M)=>Q?`${Q}.${M}`:M;if(!p(H))return X("expected a schema object");let K=new Set(G.ignoreKeywords??[]),T=(M)=>tH.has(M)||M.startsWith("x-")||K.has(M),W=!1,Y=H.type;if(Array.isArray(Y)){let M=Y.filter((D)=>D!=="null");if(M.length!==1)return X(`type ${JSON.stringify(Y)} is not supported; only one type, optionally with "null". Use anyOf for alternatives`,$("type"));W=M.length<Y.length,Y=M[0]}if(Y!==void 0&&(typeof Y!=="string"||!(Y in S)))return X(`type ${JSON.stringify(Y)} is not supported; expected one of ${Object.keys(S).join(", ")}`,$("type"));let U=new Set(["type","description","enum","const","anyOf",...Y?S[Y]:[]]),N=!1;for(let M of Object.keys(H)){if(U.has(M)||T(M))continue;N=!0;let D=Object.entries(S).find(([,B])=>B.includes(M));X(D&&D[0]!==Y?`"${M}" applies to type ${D[0]}, and this schema is ${Y?`type ${Y}`:"untyped"}`:`"${M}" is not supported by s.fromJSONSchema`,$(M))}if(N)return;if(H.description!==void 0&&typeof H.description!=="string")return X("expected a string",$("description"));let f=H.description,L=(M)=>({node:M,optional:!1,nullable:W,...f?{description:f}:{}});if(H.anyOf!==void 0){if(Y!==void 0||H.enum!==void 0||H.const!==void 0)return X("anyOf cannot be combined with type, enum or const here",$("anyOf"));if(!Array.isArray(H.anyOf)||H.anyOf.length===0)return X("expected a non-empty array",$("anyOf"));let M=[],D=!1;if(H.anyOf.forEach((B,P)=>{if(p(B)&&B.type==="null"&&Object.keys(B).length===1){W=!0;return}let F=u(B,G,$(`anyOf[${P}]`),Z);if(F)M.push(F);else D=!0}),D)return;if(M.length===0)return X("anyOf has only null in it",$("anyOf"));if(M.length===1){let B=M[0];return{...B,nullable:B.nullable||W,...f?{description:f}:{}}}return L({kind:"union",members:M})}if(H.const!==void 0){let M=H.const;if(typeof M!=="string"&&typeof M!=="number"&&typeof M!=="boolean")return X("only a string, number or boolean const is supported",$("const"));if(Y!==void 0&&typeof M!==(Y==="integer"?"number":Y))return X(`const ${JSON.stringify(M)} is not of type ${Y}`,$("const"));return L({kind:"literal",value:M})}let O;if(Y==="string"){if(O=rH(H,G,$,Z),O===null)return}if(H.enum!==void 0){if(!Array.isArray(H.enum)||H.enum.length===0)return X("expected a non-empty array",$("enum"));let M=H.enum.filter((P)=>P!==null);if(M.length<H.enum.length)W=!0;let D=M.find((P)=>!(typeof P==="string"||typeof P==="number"||typeof P==="boolean")||Y!==void 0&&typeof P!==(Y==="integer"?"number":Y));if(D!==void 0||M.length===0)return X(Y?`every value must be of type ${Y}${M.length===0?", and there must be one":`; ${JSON.stringify(D)} is not`}`:"only strings, numbers and booleans are supported",$("enum"));if(M.every((P)=>typeof P==="string"))return L({kind:"enum",values:[...new Set(M)],...O?{checks:O}:{}});let B=[...new Set(M)];if(B.length===1)return L({kind:"literal",value:B[0]});return L({kind:"union",members:B.map((P)=>z({kind:"literal",value:P}))})}switch(Y){case void 0:return X("a schema needs a type, an enum, a const or an anyOf");case"string":return L({kind:"string",...O?{checks:O}:{}});case"number":case"integer":{let M=Y==="integer"?{integer:!0}:{},D=!1;for(let B of S.number){let P=H[B];if(P===void 0)continue;if(typeof P!=="number"||!Number.isFinite(P)){X("expected a number",$(B)),D=!0;continue}M[B]=P}if(D)return;return L({kind:"number",...Object.keys(M).length>0?{checks:M}:{}})}case"boolean":return L({kind:"boolean"});case"array":{if(!p(H.items))return X('an array needs "items" to be one schema (tuples are not supported)',$("items"));let M={},D=!1;for(let P of["minItems","maxItems"]){let F=H[P];if(F===void 0)continue;if(typeof F!=="number"||!Number.isInteger(F)||F<0){X("expected a non-negative integer",$(P)),D=!0;continue}M[P]=F}let B=u(H.items,G,$("items"),Z);if(!B||D)return;return L({kind:"array",item:B,...Object.keys(M).length>0?{checks:M}:{}})}case"object":{let M=H.properties??{};if(!p(M))return X("expected an object",$("properties"));if(H.additionalProperties!==void 0&&H.additionalProperties!==!1)return X("only false is supported; a record with arbitrary keys has no strict-mode form (use s.json())",$("additionalProperties"));let D=H.required??[];if(!Array.isArray(D)||!D.every((V)=>typeof V==="string"))return X("expected an array of property names",$("required"));let B=D.filter((V)=>!Object.hasOwn(M,V));if(B.length>0)return X(`lists properties the schema doesn't have: ${B.join(", ")}`,$("required"));let P={},F=!1;for(let[V,xH]of Object.entries(M)){let i=u(xH,G,$(`properties.${V}`),Z);if(!i){F=!0;continue}P[V]=D.includes(V)?i:{...i,optional:!0}}if(F)return;return L({kind:"object",shape:P})}}return}function rH(H,G,Q,Z){let X={},$=!1;for(let K of["minLength","maxLength"]){let T=H[K];if(T===void 0)continue;if(typeof T!=="number"||!Number.isInteger(T)||T<0){Z.push(`${Q(K)}: expected a non-negative integer`),$=!0;continue}X[K]=T}if(H.format!==void 0){let K=H.format,T=typeof K==="string"?G.formats?.[K]:void 0;if(typeof K!=="string")Z.push(`${Q("format")}: expected a string`),$=!0;else if(!T||!Object.hasOwn(G.formats,K))Z.push(`${Q("format")}: unknown format ${JSON.stringify(K)}; pass a check for it in the formats option`),$=!0;else X.format={name:K,test:lH(T)}}if($)return null;return Object.keys(X).length>0?X:void 0}function lH(H){if(H===!0)return()=>!0;if(H instanceof RegExp)return(G)=>{return H.lastIndex=0,H.test(G)};return H}var I0={string:()=>A(z({kind:"string"})),number:()=>A(z({kind:"number"})),boolean:()=>A(z({kind:"boolean"})),literal:(H)=>A(z({kind:"literal",value:H})),enum:(H)=>A(z({kind:"enum",values:H})),object:(H)=>A(z({kind:"object",shape:Object.fromEntries(Object.entries(H).map(([G,Q])=>[G,c(Q)]))})),array:(H)=>A(z({kind:"array",item:c(H)})),union:(H)=>A(z({kind:"union",members:H.map(c)})),json:()=>A(z({kind:"json"})),recursive:aH,fromJSONSchema:(H,G={})=>{let Q=[],Z=u(H,G,"",Q);if(!Z||Q.length>0)throw new LH(Q.length>0?Q:["unreadable schema"]);return A(Z)}};function q0(H){let G=o.get(H);if(G)return y(G.node);return g(H.toJSONSchema())}function g(H){if(!(H.$ref!==void 0||H.type!==void 0||H.enum!==void 0||H.const!==void 0||H.anyOf!==void 0||H.properties!==void 0||H.items!==void 0))return!1;for(let Q of Object.values(H.properties??{}))if(!g(Q))return!1;if(H.items&&!g(H.items))return!1;for(let Q of H.anyOf??[])if(!g(Q))return!1;for(let Q of Object.values(H.$defs??{}))if(!g(Q))return!1;return!0}function y(H,G=new Set){switch(H.kind){case"string":case"number":case"boolean":case"literal":case"enum":return!0;case"object":return Object.values(H.shape).every((Q)=>y(Q.node,G));case"array":return y(H.item.node,G);case"union":return H.members.every((Q)=>y(Q.node,G));case"json":return!1;case"ref":if(G.has(H.cell))return!0;return G.add(H.cell),y(q(H.cell).node,G)}}function s(H,G,Q=new Set){let Z=H.node;if(Z.kind==="union")return Z.members.some((X)=>s(X,G,Q));if(Z.kind!=="ref")return!1;if(Z.cell===G)return!0;if(Q.has(Z.cell)||!Z.cell.definition)return!1;return Q.add(Z.cell),s(Z.cell.definition,G,Q)}var sH=/^[A-Za-z_][A-Za-z0-9_-]{0,63}$/;function aH(H,G){if(typeof H!=="string"||!sH.test(H))throw Error(`gemi/ai: s.recursive needs a name of letters, digits, "_" and "-" (starting with a letter or "_", at most 64), got ${JSON.stringify(H)}`);let Q={name:H,active:new Set},Z=()=>z({kind:"ref",cell:Q}),X=c(G(A(Z())));if(X.optional)throw Error(`gemi/ai: the recursive schema "${H}" is optional() as a whole; mark the places that use it optional instead`);if(s(X,Q))throw Error(`gemi/ai: the recursive schema "${H}" refers to itself outside any object or array, so it describes no finite value; nest \`self\` in an s.object(...) field or an s.array(...)`);return Q.definition=X,A(Z())}function JH(H){if(typeof H!=="string")return null;let[G]=H.split(";",1),Q=G.trim().toLowerCase();return Q===""?null:Q}function CH(H){if(H===null)return!1;if(H==="application/json")return!0;let G=H.indexOf("/");return G>0&&H.endsWith("+json")&&H.length>G+1+5}var a=new WeakMap;function w0(H,G){a.set(H,{clientAddress:G})}function VH(H){return a.has(H)}function S0(H){return a.get(H)?.clientAddress}var _H=new WeakMap;function g0(H,G){_H.set(H,G)}function jH(H){return _H.get(H)??null}var e=new WeakMap;function y0(H,G){let Q=e.get(H)??[];if(!Q.includes(G))e.set(H,[...Q,G])}function k0(H){return e.get(H)??[]}class E{data;constructor(H){this.data=H}get(H){return this.data[H]}has(H){return this.data[H]!==void 0}toJSON(){return this.data}}function OH(H){return typeof H==="object"&&H!==null&&!(H instanceof Blob)}function eH(H,G){if(!G.includes(".")||Object.hasOwn(H,G))return[{path:[G],value:H[G]}];let Q=[{path:[],value:H}];for(let Z of G.split(".")){let X=[];for(let{path:$,value:K}of Q){if(Z==="*"){if(Array.isArray(K))K.forEach((T,W)=>X.push({path:[...$,W],value:T}));else if(OH(K))for(let[T,W]of Object.entries(K))X.push({path:[...$,T],value:W});continue}if(Array.isArray(K)&&/^\d+$/.test(Z)){X.push({path:[...$,Number(Z)],value:K[Number(Z)]});continue}X.push({path:[...$,Z],value:OH(K)&&Object.hasOwn(K,Z)?K[Z]:void 0})}Q=X}return Q}function IH(H){return H.join(".")}class H0{kind;rawRequest;headers;cookies;search;schema={};routePath;params;domain;constructor(H,G,Q,Z){if(!H){let W=C.getStore().req;this.params=W.params,this.rawRequest=W.rawRequest,this.kind=W.kind,this.routePath=W.routePath,this.domain=W.domain??null}else this.params=G,this.rawRequest=H,this.routePath=Z,this.kind=Q??"api",this.domain=jH(H);this.headers=this.rawRequest.headers;let X=t(this.rawRequest.headers.get("Cookie")),$=new URL(this.rawRequest.url),K=new Map;for(let[W,Y]of $.searchParams)if(K.has(W)){let U=K.get(W);if(Array.isArray(U))U.push(Y),K.set(W,U);else K.set(W,[U,Y])}else K.set(W,Y);let T=Object.fromEntries(K.entries());this.search=new E(T),this.cookies=X}locale(){return C.getStore().locale}ctx(){return C.getStore()}isModelOriginated(){return VH(this.rawRequest)}get signal(){return this.rawRequest.signal}range(){return MH(this.rawRequest.headers.get("Range"))}refine(H){return{}}async parseBody(){let H=JH(this.rawRequest.headers.get("Content-Type"));if(CH(H))return new E(await this.parseJsonBody());if(H==="application/x-www-form-urlencoded"||H==="multipart/form-data"){let G;try{G=await this.rawRequest.formData()}catch{throw new R("The request body could not be read as a form.")}let Q=new Map;for(let[Z,X]of G.entries())if(Q.has(Z)){let $=Q.get(Z);if(Array.isArray($))$.push(X);else Q.set(Z,[$,X])}else Q.set(Z,X);return new E(Object.fromEntries(Q.entries()))}return new E({})}async parseJsonBody(){if(!this.rawRequest.body)return{};let H;try{H=await this.rawRequest.text()}catch{throw new R("The request body could not be read.")}if(H.trim()==="")return{};let G;try{G=JSON.parse(H)}catch{throw new R("The request body is not valid JSON.")}if(G===null||typeof G!=="object")throw new R("The request body must be a JSON object.");return G}validateInput(H){if(AH(this.schema))return this.validateWithSchema(H);let G=H.toJSON()??{},Q={},Z=Object.entries(this.schema).map(([X,$])=>({key:X,rules:Object.entries($).map(([K,T])=>({rule:K,message:T,check:typeof T==="function"?null:this.ruleFor(X,K)}))}));for(let{key:X,rules:$}of Z)for(let{path:K,value:T}of eH(G,X)){let W=this.checkField(T,$);if(W.length>0){let Y=Q[IH(K)]??=[];for(let U of W)if(!Y.includes(U))Y.push(U)}}if(this.addRefinements(Q,G),Object.keys(Q).length>0)throw new w(Q);return H}checkField(H,G){let Q=G.some(({rule:$})=>$==="required"),Z=H===void 0||H===null||H==="",X=[];for(let{rule:$,message:K,check:T}of G){let W=K,Y=!1;if(typeof K==="function")W=K(H),Y=typeof W>"u";else Y=T(H);if(Y)continue;if(Z&&!Q)continue;if($==="required")return[String(W)];if(!X.includes(String(W)))X.push(String(W))}return X}validateWithSchema(H){let G=this.schema.validate(H.toJSON()),Q={};if("issues"in G)for(let X of G.issues){let $=IH(X.path),K=Q[$]??=[];if(!K.includes(X.message))K.push(X.message)}let Z="value"in G?new E(G.value):H;if(this.addRefinements(Q,Z.toJSON()),Object.keys(Q).length>0)throw new w(Q);return Z}addRefinements(H,G){for(let[Q,Z]of Object.entries(this.refine(G)??{})){let X=H[Q]??[];H[Q]=X.includes(Z)?X:[...X,Z]}}ruleFor(H,G){try{return BH(G)}catch(Q){if(Q instanceof J)throw new J(`${this.constructor.name}.schema.${H}: ${Q.message}`);throw Q}}async input(){return this.validateInput(await this.parseBody())}async safeInput(){let H=await this.parseBody();try{return{isValid:!0,errors:{},input:this.validateInput(H)}}catch(G){if(!(G instanceof w))throw G;return{isValid:!1,errors:G.errors,input:H}}}}class G0 extends R{error;constructor(H="Not authorized"){super(H);this.name="AuthorizationError",this.error=H,this.payload={api:{status:401,data:{error:n("authorization",this.error,401)}},view:{}}}}class HH extends R{static apiStatus=403;error;constructor(H="Insufficient permissions"){super(H);this.name="InsufficientPermissionsError",this.error=H,this.payload={api:{status:HH.apiStatus,data:{error:n("permission",this.error,HH.apiStatus)}},view:{status:403}}}}class QH extends R{total;constructor(H){super("Range not satisfiable");this.total=H;this.name="RangeNotSatisfiableError",this.payload={api:{status:416,data:{error:GH("range_not_satisfiable","Range not satisfiable",416)},headers:{"Content-Range":UH(H),"Accept-Ranges":"bytes","Cache-Control":"no-store"}},view:{}}}}class j extends R{fileName;constructor(H){super("File not found");this.fileName=H;this.name="FileNotFoundError",this.payload={api:{status:404,data:{error:GH("not_found","Not found",404)},headers:{"Cache-Control":"no-store"}},view:{}}}}class Q0 extends R{constructor(H={}){super("Authentication error");this.name="AuthenticationError";let G=H.redirectTo??"/auth/sign-in";this.payload={api:{status:401,data:{error:n("authentication","Authentication error",401)}},viewData:{status:200,data:{},headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate"},directive:{kind:"Redirect",path:G}},view:{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:G}}}}}class k{static getFacadeAccessor(){throw Error(`Facade [${this.name}] does not implement getFacadeAccessor().`)}static getFacadeRoot(){return qH(this.getFacadeAccessor())}}class XH{async delete(H){throw Error(`${this.constructor.name} does not implement delete(). Override it to remove objects from this backend.`)}async read(H){let G=typeof H==="string"?{name:H}:H,Q=await this.fetch({name:G.name,bucket:G.bucket});if(!Q.ok)throw new j(G.name);let Z=Q.headers.get("Content-Type")??"application/octet-stream",X=Q.headers.get("ETag")??void 0,$=Q.headers.get("Last-Modified"),K=$?new Date($):void 0;if(G.range){let Y=await Q.blob();return{body:Y,start:0,end:Y.size-1,total:Y.size,partial:!1,type:Z,etag:X,lastModified:K,name:G.name}}let T=Number(Q.headers.get("Content-Length")),W=Number.isFinite(T)?T:0;return{body:Q.body,start:0,end:W-1,total:W,partial:!1,type:Z,etag:X,lastModified:K,name:G.name}}async size(H){let G=typeof H==="string"?H:H.name,Q=typeof H==="string"?void 0:H.bucket,Z=await this.fetch({name:G,bucket:Q});if(!Z.ok)throw new j(G);let X=Number(Z.headers.get("Content-Length"));if(Number.isFinite(X))return await Z.body?.cancel(),X;return(await Z.blob()).size}}function EH(H,G){if(!G)return H;let Q=H.getReader(),Z=!1,X,$=()=>{if(Z=!0,X)G.removeEventListener("abort",X)};return new ReadableStream({start(K){if(X=()=>{if(Z)return;$(),K.error(G.reason),Q.cancel(G.reason).catch(()=>{})},G.aborted)X();else G.addEventListener("abort",X,{once:!0})},async pull(K){let T;try{T=await Q.read()}catch(W){if(Z)return;$(),K.error(W);return}if(Z)return;if(T.done){$(),K.close();return}K.enqueue(T.value)},cancel(K){return $(),Q.cancel(K)}},{highWaterMark:0})}import{readdir as X0,unlink as Z0}from"fs/promises";import{isAbsolute as $0,relative as K0,resolve as NH,sep as T0}from"path";class ZH extends XH{configured;constructor(H){super();this.configured=H}get folderPath(){return this.configured??`${b()}/storage`}async put(H,{signal:G}={}){G?.throwIfAborted();let Q,Z;if(H instanceof Blob)Q=H,Z=`${Bun.randomUUIDv7()}.${H.type.split("/")[1].split(";")[0]}`;else Q=H.body,Z=H.name;let X=Q instanceof Buffer?Q:Q instanceof Blob||Q instanceof File?Buffer.from(await Q.arrayBuffer()):"",$=`${this.folderPath}/${Z}`;return G?.throwIfAborted(),await Bun.write($,X),Z}async fetch(H,{signal:G}={}){G?.throwIfAborted();let Q=process.env.BUCKET_NAME,Z;if(typeof H==="string")Z=H;else Q=H.bucket??Q,Z=H.name;if(!Z)throw Error("Object name has to be specified");let X=`${this.folderPath}/${Z}`,$=Bun.file(X),K=EH(Bun.file(X).stream(),G),T=new Date($.lastModified).toUTCString();return new Response(K,{headers:{"Content-Type":$.type,"Content-Length":String($.size),"Cache-Control":"private, max-age=12000, must-revalidate","Last-Modified":T}})}async read(H){let G=typeof H==="string"?{name:H}:H,{name:Q,range:Z=null}=G;if(!Q)throw Error("Object name has to be specified");let X=Bun.file(`${this.folderPath}/${Q}`);if(!await X.exists())throw new j(Q);let $=X.size,K=Z?DH(Z,$):null;if(Z&&!K)throw new QH($);let T=K?.start??0,W=K?K.end:$-1;return{body:K?X.slice(T,W+1):X,start:T,end:W,total:$,partial:Boolean(K),type:X.type||"application/octet-stream",lastModified:new Date(X.lastModified),name:Q}}async size(H){let G=typeof H==="string"?H:H.name,Q=Bun.file(`${this.folderPath}/${G}`);if(!await Q.exists())throw new j(G);return Q.size}async delete(H){let G=typeof H==="string"?H:H.name;if(!G)throw Error("Object name has to be specified");let Q=NH(this.folderPath),Z=NH(Q,G),X=K0(Q,Z);if(!X||X===".."||X.startsWith(`..${T0}`)||$0(X))throw Error(`Refusing to delete "${G}": it is outside the storage folder`);try{await Z0(Z)}catch($){if($?.code==="ENOENT")return;throw $}}async list(){return await X0(this.folderPath)}}function D4(H){return H}function wH(){return{driver:new ZH}}class $H{static token="filesystem";driver;constructor(H={}){this.driver=H.driver??wH().driver}}import{Buffer as Y0}from"buffer";async function SH(H){try{return(await import("sharp")).default}catch(G){throw Error(`${H} requires the 'sharp' package. Install it with \`bun add sharp\`.`,{cause:G})}}class M0 extends k{static getFacadeAccessor(){return $H}static async put(H,G={}){return this.getFacadeRoot().driver.put(H,G)}static async metadata(H){let G=Y0.from(await H.arrayBuffer()),Q=await SH("Storage.metadata()");try{return await Q(G).metadata()}catch{return{}}}static async fetch(H,G={}){return G.signal?.throwIfAborted(),this.getFacadeRoot().driver.fetch(H,G)}static async read(H,G={}){let Q=typeof H==="string"?{name:H}:{...H},Z="range"in G?G.range??null:Q.range!==void 0?Q.range:C.getStore()?.rangeRequest??null;return this.getFacadeRoot().driver.read({...Q,range:Z})}static list(H){return this.getFacadeRoot().driver.list(H)}static async delete(H){return this.getFacadeRoot().driver.delete(H)}}import{mkdir as KH,readdir as D0,access as U0}from"fs/promises";async function TH(H){try{return await U0(H),!0}catch{return!1}}class WH{config;static token="log";writer;isReady=!1;flushTimeout;fileSize=0;writerSize=0;isCreatingFile=!1;bootPromise=null;currentLogFilePath;get logsDirPath(){return`${b()}/storage/logs`}constructor(H){this.config=H}boot(){if(!this.bootPromise)this.bootPromise=this.createStorage().catch((H)=>{console.error("Log storage unavailable, file logging disabled",H)}).then(()=>{this.isReady=!0});return this.bootPromise}async createStorage(){let H=`${b()}/storage`;if(!await TH(H))await KH(H);if(!await TH(this.logsDirPath))await KH(this.logsDirPath);await this.newLogFile()}async newLogFile(){if(!await TH(this.logsDirPath))await KH(this.logsDirPath);if(this.isCreatingFile=!0,this.currentLogFilePath){this.writer.flush(),this.writer.end(),this.writer=null;let Q=new File([await Bun.file(this.currentLogFilePath).arrayBuffer()],this.currentLogFilePath.split("/").pop(),{type:"text/plain"});this.config.onLogFileClosed(Q),this.fileSize=0,this.writerSize=0}let G=(await D0(this.logsDirPath)).sort().reverse()[0];if(G){let Q=Bun.file(`${this.logsDirPath}/${G}`);if(Q.size<this.config.maxFileSize)this.currentLogFilePath=`${this.logsDirPath}/${G}`,this.writer=Q.writer(),this.writer.write(await Q.text()),this.writer.write(`
5
+ `),this.writer.flush(),this.fileSize=Q.size}if(!this.writer){let Q=`${new Date(Date.now()).toISOString()}.log`.replaceAll(":","-");this.currentLogFilePath=`${this.logsDirPath}/${Q}`;let Z=Bun.file(`${this.logsDirPath}/${Q}`);this.writer=Z.writer(),this.fileSize=0,this.writerSize=0}this.isCreatingFile=!1}async log(H,G,Q={}){if(!this.isReady)await this.boot();let Z=C.getStore(),X={};if(Z)X={url:Z.req.rawRequest.url,method:Z.req.rawRequest.method,headers:Z.req.rawRequest.headers,body:Z.req.rawRequest.body};let $={timestamp:new Date(Date.now()).toISOString(),env:Bun.env.NODE_ENV,level:H,message:G,metadata:{...X,...Q}},K="";try{K=JSON.stringify($)}catch(T){console.log("Error parsing log object",T)}try{let T=this.config.onLogCreated($);if(T instanceof Promise)T.catch((W)=>console.error("Error in onLogCreated",W))}catch(T){console.error("Error in onLogCreated",T)}if(!this.writer)return;this.writerSize+=K.length,this.fileSize+=K.length;try{this.writer.write(K),this.writer.write(`
6
+ `),this.tryFlush()}catch(T){console.error("Error writing log",T)}}async tryFlush(){if(this.fileSize>this.config.maxFileSize){if(!this.isCreatingFile)await this.newLogFile()}if(this.writerSize>this.config.maxFileSize/2)await this.writer.flush(),this.writerSize=0,await this.newLogFile();else clearTimeout(this.flushTimeout),this.flushTimeout=setTimeout(async()=>{await this.writer.flush(),this.writerSize=0},100)}}class P0 extends k{static getFacadeAccessor(){return WH}static debug(H,G){this.getFacadeRoot().log("debug",H,G)}static info(H,G){this.getFacadeRoot().log("info",H,G)}static notice(H,G){this.getFacadeRoot().log("notice",H,G)}static warning(H,G){this.getFacadeRoot().log("warning",H,G)}static error(H,G){this.getFacadeRoot().log("error",H,G)}static critical(H,G){this.getFacadeRoot().log("critical",H,G)}static alert(H,G){this.getFacadeRoot().log("alert",H,G)}static emergency(H,G){this.getFacadeRoot().log("emergency",H,G)}}class B0{config;static token="redis";instance=null;constructor(H={}){this.config=H}get client(){return this.instance??=new(R0())(this.config.url,this.config.options)}set client(H){this.instance=H}close(){let H=this.instance;this.instance=null,H?.close()}}function R0(){let H=globalThis.Bun?.RedisClient;if(typeof H!=="function")throw Error("Redis requires Bun's built-in Redis client, which this runtime does not provide. Run the app under Bun, or bind your own client for the 'redis' token.");return H}
7
+ export{YH as Me,gH as Ne,F0 as Oe,JH as Pe,w0 as Qe,S0 as Re,MH as Se,DH as Te,L0 as Ue,J0 as Ve,C0 as We,UH as Xe,g0 as Ye,jH as Ze,y0 as _e,k0 as $e,w as af,J as bf,LH as cf,I0 as df,q0 as ef,H0 as ff,G0 as gf,HH as hf,QH as if,j as jf,Q0 as kf,k as lf,SH as mf,XH as nf,EH as of,ZH as pf,D4 as qf,wH as rf,$H as sf,M0 as tf,WH as uf,P0 as vf,B0 as wf};
8
+
9
+ //# debugId=25FB1B8A02D49E4F64756E2164756E21