@trayai/helix-sdk 1.15.0 → 1.17.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/CHANGELOG.md +54 -0
- package/README.md +15 -5
- package/dist/broker/index.d.ts +4 -27
- package/dist/chunk-TYQ5RKIZ.js +7 -0
- package/dist/define-agent-B6KPsK4S.d.ts +488 -0
- package/dist/index.d.ts +9 -8
- package/dist/index.js +3 -3
- package/dist/internal/index.d.ts +4 -4
- package/dist/internal/index.js +1 -1
- package/dist/region-schema-DAE9PT3S.d.ts +35 -0
- package/dist/testing/index.d.ts +1 -2
- package/dist/{types-BSbvztCi.d.ts → types-c1QXQC1s.d.ts} +33 -3
- package/package.json +3 -3
- package/dist/chunk-GMEVZH35.js +0 -7
- package/dist/define-agent-BEUgQ_5-.d.ts +0 -911
- package/dist/region-schema-COfWyGI9.d.ts +0 -9
package/dist/internal/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as C,T as fe,U as me,V as de,W as ge,X as pe,Y as he,a as J,aa as Ae,b as V,ba as Se,c as q,d as R,da as l,e as z,f as g,g as P,h as F,ha as v,i as N,j as p,k as O,l as k,m as j,o as A,p as M,q as S,r as x,s as y,t as le,u as ce,v as ue,w as I,x as E}from"../chunk-TYQ5RKIZ.js";import{a as h}from"../chunk-WUCX7RZO.js";import{c as G,d as D,g as Q,h as W,i as X,j as Y,k as Z,l as ee,m as te,n as re,o as oe,p as ne,q as se,r as ie,s as ae}from"../chunk-LKZKDHYO.js";import{randomUUID as xe}from"crypto";import{SpanStatusCode as H,SpanKind as ye}from"@opentelemetry/api";var s=class extends Error{constructor(e){super(`runScheduledFunction: ${e}`),this.name="ScheduleInvocationError"}};async function Ie(t,e){if(typeof e!="object"||e===null)throw new s("`invocation` must be an object");let{schedulePath:r}=e;if(typeof r!="string"||r.length===0)throw new s("`schedulePath` must be a non-empty string");if(typeof e.isManual!="boolean")throw new s("`isManual` must be a boolean");if(!v(t))throw new s(`default export of "${r}" is not a defineSchedule definition`);let b=L("scheduledAt",e.scheduledAt),c=L("firedAt",e.firedAt),u=D(),i=u.executionId??xe(),f=u.deploymentId??null,K=Date.now(),$=new Date().toISOString(),U=M(),_=A();p();let a={hasDb:!1,hasExternal:!1,hasAuth:!1,hasAi:!1,hasError:!1},m=!1,d=null;try{await P.run(a,()=>g.run(i,()=>k.startActiveSpan("schedule",{root:!0,kind:ye.SERVER,attributes:{method:"SCHEDULE",route:r,executionId:i,...f?{deploymentId:f}:{}}},async n=>{let B={type:"schedule",scheduledAt:b,firedAt:c,isManual:e.isManual},w={http:S(),db:o=>x(o),kv:()=>y(),files:()=>I(),callFunctionAsync:E(),ai:C(),agent:o=>l(o),log:_,config:U,state:{},executionId:i,deploymentId:f,traceId:n.spanContext().traceId,parentExecutionId:null,trigger:B};N(n,"input",{scheduledAt:e.scheduledAt,firedAt:e.firedAt,isManual:e.isManual});try{await h.run(w,()=>t.handler(w))}catch(o){throw m=!0,d=o instanceof Error?o.message:String(o),F("hasError"),o}finally{n.setAttribute("hasAuth",a.hasAuth),n.setAttribute("hasAi",a.hasAi),n.setAttribute("hasExternal",a.hasExternal),n.setAttribute("hasDb",a.hasDb),n.setAttribute("status",m?"error":"success");let o=m||a.hasError;n.setStatus({code:o?H.ERROR:H.OK,...d?{message:d}:{}}),n.end()}})))}finally{j({executionId:i,deploymentId:f,triggerType:"schedule",routeOrJob:r,startedAt:$,startMs:K,errored:m,errorMessage:d,userId:null,flags:a}),await O()}}function L(t,e){if(typeof e!="string"||e.length===0)throw new s(`\`${t}\` must be a timestamp string; got ${JSON.stringify(e)}`);let r=new Date(e);if(Number.isNaN(r.getTime()))throw new s(`\`${t}\` must be a Date-parseable timestamp; got ${JSON.stringify(e)}`);return r}function T(t,e){p();let r=t.userId||null,b=R(),c=crypto.randomUUID(),u={http:S(),db:i=>x(i),kv:()=>y(),files:()=>I(),callFunctionAsync:E(),ai:C(),agent:i=>l(i),log:A(),config:b.config??{},state:{},executionId:c,deploymentId:null,traceId:"",parentExecutionId:null,userId:r,identity:r!==null?{user:{id:r,email:t.userEmail||null,name:t.userName||null}}:null};return g.run(c,()=>h.run(u,e))}async function Ee(t,e,r={}){return T(r,()=>l(t).generate(e))}async function Ce(t,e){return T({userId:e.userId},()=>l(t).sessions({...e.first!==void 0?{first:e.first}:{},...e.cursor!==void 0?{cursor:e.cursor}:{}}))}export{fe as AgentCallerError,J as CONFIG_BRIDGE_CHANNEL,V as DEV_TOKEN_BRIDGE_CHANNEL,s as ScheduleInvocationError,ie as SdkError,Ae as SessionExpiredError,le as assertValidPath,z as clearActiveConfig,he as clearAgentRegistry,Se as clearAgentSessions,ce as contentFilePath,R as getActiveConfig,ne as getAdditionalRegionProfiles,ge as getAgentDefinition,X as getRegionProfile,W as isKnownRegion,ae as isSdkError,Ce as listAgentSessionsStandalone,pe as listAgents,ee as listExposedRegionNames,Z as listRegionNames,ue as metaFilePath,te as parseExposedRegionName,Q as registerRegionProfile,Y as requireRegionProfile,se as resetRegionRegistryForTests,oe as resolveForcedRegion,Ee as runAgentStandalone,Ie as runScheduledFunction,q as setActiveConfig,me as setAgentBaseDir,de as setAgentInstructions,re as setForcedRegion,G as setSdkConfig};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { z as z$1 } from 'zod/v3';
|
|
3
|
+
|
|
4
|
+
/** Built-in regions shipped in the published SDK. */
|
|
5
|
+
declare const REGION_VALUES: readonly ["us1", "eu1", "ap1", "ap2"];
|
|
6
|
+
/** Runtime region name (built-ins plus any registered profiles). */
|
|
7
|
+
type Region = string;
|
|
8
|
+
/**
|
|
9
|
+
* Validate a region string against the live registry (built-ins plus any
|
|
10
|
+
* profiles registered at runtime).
|
|
11
|
+
*
|
|
12
|
+
* ZOD3-BRIDGE (remove in 2.0): built on **Zod 3** so it still composes into a
|
|
13
|
+
* customer's own Zod 3 object schema — `z.object({ region: regionSchema })` —
|
|
14
|
+
* which is the pattern existing projects rely on. Zod 3 and Zod 4 schemas cannot
|
|
15
|
+
* be mixed inside one parent, so SDK-internal (Zod 4) code must use
|
|
16
|
+
* `region.schema`, and new customer code on Zod 4 should compose `region.schema`
|
|
17
|
+
* instead. At 2.0 (Zod 3 dropped) this becomes the Zod 4 schema — i.e. fold it
|
|
18
|
+
* into `region.schema`.
|
|
19
|
+
*/
|
|
20
|
+
declare const regionSchema: z$1.ZodEffects<z$1.ZodString, string, string>;
|
|
21
|
+
/** The region API: version-agnostic data + helpers, plus a Zod 4 schema. */
|
|
22
|
+
declare const region: {
|
|
23
|
+
/** Built-in region codes (excludes runtime-registered profiles). */
|
|
24
|
+
values: readonly ["us1", "eu1", "ap1", "ap2"];
|
|
25
|
+
/** True if `name` is a currently-known region (built-ins + registered profiles). */
|
|
26
|
+
isKnown: (name: string) => boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Zod 4 region schema — compose into your own Zod 4 object schemas, and used
|
|
29
|
+
* by the SDK's own (Zod 4) config loader. Equivalent validation to the
|
|
30
|
+
* Zod 3 `regionSchema`, against the same live registry.
|
|
31
|
+
*/
|
|
32
|
+
schema: z.ZodString;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { type Region as R, REGION_VALUES as a, regionSchema as b, region as r };
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,9 +1,39 @@
|
|
|
1
1
|
import { H3Event } from 'h3';
|
|
2
2
|
import { KyInstance } from 'ky';
|
|
3
|
-
import { ZodType } from 'zod';
|
|
4
3
|
import { generateText, streamText, generateObject, streamObject, embed, embedMany, generateImage, transcribe, generateSpeech, LanguageModel, EmbeddingModel, ImageModel, TranscriptionModel, SpeechModel, ModelMessage, StopCondition, ToolSet, PrepareStepFunction, ToolChoice } from 'ai';
|
|
5
4
|
import { LanguageModelV4, EmbeddingModelV4, ImageModelV4, TranscriptionModelV4, SpeechModelV4 } from '@ai-sdk/provider';
|
|
6
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Structural view of a user-supplied validation schema.
|
|
8
|
+
*
|
|
9
|
+
* Customer projects may be on Zod 3.25 (`zod`, or `zod/v3`) or Zod 4, and the
|
|
10
|
+
* two `ZodType` classes are not assignable to each other. Everything the SDK
|
|
11
|
+
* needs from a schema is `parse`/`safeParse`, so that is all we require —
|
|
12
|
+
* both majors satisfy it, and `ctx.input` is inferred from `parse`'s return.
|
|
13
|
+
*/
|
|
14
|
+
interface HelixSchema<TOutput = unknown> {
|
|
15
|
+
parse(data: unknown): TOutput;
|
|
16
|
+
safeParse(data: unknown): {
|
|
17
|
+
success: true;
|
|
18
|
+
data: TOutput;
|
|
19
|
+
} | {
|
|
20
|
+
success: false;
|
|
21
|
+
error: HelixSchemaError;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** The part of a Zod error (v3 and v4) the SDK reads. */
|
|
25
|
+
interface HelixSchemaError {
|
|
26
|
+
readonly issues: ReadonlyArray<{
|
|
27
|
+
readonly path: ReadonlyArray<PropertyKey>;
|
|
28
|
+
}>;
|
|
29
|
+
flatten(): {
|
|
30
|
+
formErrors: string[];
|
|
31
|
+
fieldErrors: Record<string, string[] | undefined>;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Output type of a schema; `fallback` when no schema is supplied. */
|
|
35
|
+
type InferSchemaOutput<TSchema, TFallback = Record<string, unknown>> = TSchema extends HelixSchema<infer TOutput> ? TOutput : TFallback;
|
|
36
|
+
|
|
7
37
|
/** Connection + call params supplied by the caller at `.parameters()` time. */
|
|
8
38
|
interface DbCallParameters {
|
|
9
39
|
clusterIdentifier?: string;
|
|
@@ -556,7 +586,7 @@ interface TrayContext<T = Record<string, unknown>> extends ContextCore {
|
|
|
556
586
|
|
|
557
587
|
/** Sentinel type — skip input validation when only output validation is desired */
|
|
558
588
|
type UnvalidatedInput = Record<string, unknown>;
|
|
559
|
-
interface DefineFunctionOptions<TInput extends
|
|
589
|
+
interface DefineFunctionOptions<TInput extends HelixSchema | undefined = undefined, TOutput extends HelixSchema | undefined = undefined> {
|
|
560
590
|
input?: TInput;
|
|
561
591
|
output?: TOutput;
|
|
562
592
|
}
|
|
@@ -639,4 +669,4 @@ interface ScheduleDefinition {
|
|
|
639
669
|
handler: ScheduleHandler;
|
|
640
670
|
}
|
|
641
671
|
|
|
642
|
-
export { type AgentApprovalDecision as A, type BrokerAuthedClient as B, type CallFunctionAsync as C, type DefineFunctionOptions as D, type
|
|
672
|
+
export { type AgentApprovalDecision as A, type BrokerAuthedClient as B, type CallFunctionAsync as C, type DefineFunctionOptions as D, type HttpClient as E, type FunctionHandler as F, type S3SignOptions as G, type HelixSchema as H, type InferSchemaOutput as I, type S3SignResult as J, type KeyValueStore as K, type Logger as L, type ScheduleContext as M, type ScheduleHandler as N, type ScheduleTrigger as O, type PlatformContext as P, type SqlBuilder as Q, SessionExpiredError as R, type ScheduleDefinition as S, type TrayContext as T, type UnvalidatedInput as U, clearAgentSessions as V, type DefineScheduleConfig as a, type AgentCallOptions as b, type AgentClient as c, type AgentPendingApproval as d, type AgentResult as e, type AgentSession as f, type AgentSessionPage as g, type AgentSessionPageOptions as h, type AgentSessionSummary as i, type AgentSessionsList as j, type AgentStreamResult as k, type AiEmbeddingModelInstance as l, type AiImageModelInstance as m, type AiLanguageModelInstance as n, type AiSpeechModelInstance as o, type AiTranscriptionModelInstance as p, type BrokerCallOptions as q, type BrokerCallResult as r, type DbCallParameters as s, type DbClient as t, type FileSystemClient as u, type HelixAI as v, type HelixAIProvider as w, type HelixAgent as x, type HelixCost as y, type HelixResultMeta as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trayai/helix-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Helix SDK runtime — defineFunction, ctx, defineConfig, authed HTTP",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "trayio",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"h3": "^1.15.11",
|
|
65
65
|
"ky": "^1.14.3",
|
|
66
66
|
"unstorage": "^1.17.5",
|
|
67
|
-
"zod": "^
|
|
67
|
+
"zod": "^4.6.6"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@types/node": "^18.19.130",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"tsup": "^8.5.1",
|
|
73
73
|
"typescript": "^5.9.3",
|
|
74
74
|
"typescript-eslint": "^8.69.0",
|
|
75
|
-
"vitest": "^4.1.
|
|
75
|
+
"vitest": "^4.1.12"
|
|
76
76
|
},
|
|
77
77
|
"scripts": {
|
|
78
78
|
"build": "tsup",
|
package/dist/chunk-GMEVZH35.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{a as mn,b as Ve}from"./chunk-WUCX7RZO.js";import{A as yn,B as fe,C as z,D as ne,E as hn,G as wn,H as Sn,I as bn,J as vn,a as U,b as de,d as E,e as ue,f as $,h as un,j,k as pn,o as fn,r as d,t as Ie,u as ze,v as te,w as Re,x as Ge,y as pe,z as gn}from"./chunk-LKZKDHYO.js";var sc="tray-config-bridge",ic="tray-dev-token-bridge",Je=null;function ac(e){Je=e}function A(){if(!Je)throw new Error("Active tray config not seeded. Worker boot must call setActiveConfig() before handlers run.");return Je}function cc(){Je=null}import{AsyncLocalStorage as Bn}from"async_hooks";import{trace as cs,SpanKind as ls,SpanStatusCode as Ze}from"@opentelemetry/api";import{ExportResultCode as ds,W3CTraceContextPropagator as us}from"@opentelemetry/core";import{NodeTracerProvider as ps,SimpleSpanProcessor as fs,BatchSpanProcessor as ms}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Jo}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as Wo}from"@opentelemetry/exporter-logs-otlp-proto";function Ct(e){return j(e).hosts.ingest}function Xo(){return $()??""}function xn(){return{[U]:Xo()}}function An(){let e=Ct(A().region);return new Jo({url:`${e}/v1/traces`,headers:()=>Promise.resolve(xn())})}function En(){let e=Ct(A().region);return new Wo({url:`${e}/v1/logs`,headers:()=>Promise.resolve(xn())})}import{logs as Cn,SeverityNumber as We}from"@opentelemetry/api-logs";import{LoggerProvider as Zo,BatchLogRecordProcessor as es}from"@opentelemetry/sdk-logs";function Ce(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function Yo(e){return new TextEncoder().encode(e).length}var In="\u2026[truncated]",Qo=Yo(In),Te=4096;function re(e,t=Te){let n=new TextEncoder().encode(e);if(n.length<=t)return e;let r=n.subarray(0,t-Qo);return new TextDecoder("utf-8").decode(r).replace(/�$/,"")+In}function k(e,t=Te){return re(Ce(e),t)}var ts="@trayai/helix-sdk",ke,Rn={debug:{number:We.DEBUG,text:"DEBUG"},info:{number:We.INFO,text:"INFO"},warn:{number:We.WARN,text:"WARN"},error:{number:We.ERROR,text:"ERROR"}};function ns(){return E().mode==="lambda"?[new es({exporter:En()})]:[]}function Tn(){if(ke!==void 0)return;let e=ns();e.length!==0&&(ke=new Zo({processors:e}),Cn.setGlobalLoggerProvider(ke))}function rs(e,t,n){let r=Rn[e]??Rn.info;return{severityNumber:r.number,severityText:r.text,body:t,...n?{attributes:{"tray.log.meta":k(n)}}:{}}}function kn(e,t,n){Cn.getLogger(ts).emit(rs(e,t,n))}async function Pn(e=2e3){if(ke===void 0)return;let t;try{await Promise.race([ke.forceFlush(),new Promise(n=>{t=setTimeout(n,e)})])}catch(n){process.stderr.write(`[helix-sdk] otel log flush failed: ${n instanceof Error?n.message:String(n)}
|
|
2
|
-
`)}finally{t!==void 0&&clearTimeout(t)}}function Tt(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function os(){if(process.env.NO_COLOR!==void 0)return!1;let e=process.env.FORCE_COLOR;return e!==void 0&&e!=="0"&&e!=="false"?!0:!!process.stdout.isTTY&&process.env.TERM!=="dumb"}function D(e,t){return os()?`\x1B[${e}m${t}\x1B[0m`:t}var ss=5,is={FN:"1;35",INFO:"34",AUTH:"35",API:"36",AGENT:"1;36",TOOL:"36",WARN:"33",ERROR:"31",DEBUG:"90"},Xe="32",Ye="31",as="33",oe="2",Qe="1";function se(e){return D(is[e]??"0",e.padEnd(ss))}function On(e,t){return`${se("FN")} ${D(Qe,`${e} ${t}`.trim())}`}function _n(e,t,n,r){let o=e.toUpperCase(),i=`${r?`${D(oe,r)} `:""}${se(o)} ${t}`;return n&&Object.keys(n).length>0&&(i+=` ${D(oe,Ce(n))}`),i}function Dn(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Mn(e){return`${se("AUTH")} ${e}`}function Fn(e,t,n,r,o){let s=n===void 0?"ERR":String(n),i=D(o==="error"?Ye:Xe,s);return`${se("API")} ${e} ${t} \u2192 ${i} ${D(oe,`${r}ms`)}`}function Ln(e){return`${se("AGENT")} ${D(Qe,e)}`}function Nn(e,t,n,r){let o=t==="error"?Ye:t==="awaiting-approval"?as:Xe,s=n!==void 0?`${D(oe,`${n} step${n===1?"":"s"}`)} `:"";return`${se("AGENT")} ${D(Qe,e)} \u2192 ${D(o,t)} ${s}${D(oe,`${r}ms`)}`}function Un(e,t,n){let r=t==="error"?D(Ye,"error"):D(Xe,"ok");return`${se("TOOL")} ${e} \u2192 ${r} ${D(oe,`${n}ms`)}`}function $n(e,t,n){let r=t?Ye:Xe,o=D(r,"\u25CF"),s=D(r,t?"error":"success");return`${o} ${D(Qe,e)} ${s} ${D(oe,`${n}ms`)}`}function H(e){try{process.stdout.write(e+`
|
|
3
|
-
`)}catch{}}var Kn=new Bn,gs=new Bn;function O(e){let t=gs.getStore();t&&(t[e]=!0)}var ys=/^[0-9a-f]{32}$/;function hs(e){let t=e.replace(/-/g,"").toLowerCase();return ys.test(t)?t:null}var ws={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},me=new Map;function Hn(e,t,n){let r=me.get(e);r?r[t]=n:me.set(e,{[t]:n})}function q(e,t,n){e.setAttribute(t,k(n))}var Pe;function jn(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function kt(e){return Math.round(e[0]*1e3+e[1]/1e6)}function qn(e){try{process.stdout.write(Ce(e)+`
|
|
4
|
-
`)}catch{}}var Pt=class{export(t,n){for(let r of t){let o=r.spanContext().spanId,s=me.get(o),i={...r.attributes};if(s!==void 0){for(let[l,u]of Object.entries(s))typeof u=="string"?i[l]=re(u):typeof u=="object"&&u!==null?i[l]=k(u):i[l]=u;me.delete(o)}let a=Kn.getStore(),c=a?hs(a):null;qn({_otel:"span",traceId:c??r.spanContext().traceId,spanId:o,parentSpanId:r.parentSpanContext?.spanId??"",name:r.name,kind:r.kind,startTimeUnixNano:jn(r.startTime),endTimeUnixNano:jn(r.endTime),attributes:i,status:{code:ws[r.status.code]??"STATUS_CODE_UNSET",...r.status.message?{message:re(r.status.message)}:{}}})}n({code:ds.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Ot=class{onStart(t,n){}onEnd(t){me.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},_t=class{onStart(t){let n=t;(n.name==="function"||n.name==="App")&&H(`
|
|
5
|
-
`+On(String(n.attributes.method??""),String(n.attributes.route??""))),(n.name==="agent.generate"||n.name==="agent.stream")&&H(Ln(String(n.attributes.agent??"")))}onEnd(t){let n=t.attributes;switch(t.name){case"log":{let r=t.spanContext().spanId,o=me.get(r)?.properties;H(_n(String(n.level??"info"),String(n.message??""),o,Dn(t.startTime)));break}case"auth":H(Mn(String(n.alias??"")));break;case"externalApi":{let r=typeof n.statusCode=="number"?n.statusCode:void 0;H(Fn(String(n.method??""),String(n.host??""),r,kt(t.duration),n.status==="error"?"error":"success"));break}case"agent.tool":{H(Un(String(n.tool??""),n.status==="error"?"error":"success",kt(t.duration)));break}case"agent.generate":case"agent.stream":{let r=typeof n.status=="string"?n.status:t.status.code===Ze.ERROR?"error":"completed";H(Nn(String(n.agent??""),r,typeof n.steps=="number"?n.steps:void 0,kt(t.duration)));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Dt=class{constructor(t){this.inner=t}inner;onStart(t,n){this.inner.onStart(t,n)}onEnd(t){t.name!=="log"&&this.inner.onEnd(t)}forceFlush(){return this.inner.forceFlush()}shutdown(){return this.inner.shutdown()}};function Ss(){let t=[Tt()?new _t:new fs(new Pt)];return E().mode==="lambda"&&t.push(new Dt(new ms(An()))),t.push(new Ot),t}function bs(){Pe===void 0&&(Pe=new ps({spanProcessors:Ss()}),Pe.register({propagator:new us}),Tn())}async function vs(e=2e3){let t=[Pn(e)];Pe!==void 0&&t.push((async()=>{let n;try{await Promise.race([Pe.forceFlush(),new Promise(r=>{n=setTimeout(r,e)})])}catch(r){process.stderr.write(`[helix-sdk] otel flush failed: ${r instanceof Error?r.message:String(r)}
|
|
6
|
-
`)}finally{n!==void 0&&clearTimeout(n)}})()),await Promise.all(t)}var F=cs.getTracer("@trayai/helix-sdk");function xs({executionId:e,deploymentId:t,triggerType:n="http",routeOrJob:r,startedAt:o,startMs:s,errored:i,errorMessage:a,userId:c,flags:l}){let u=new Date().toISOString(),p=Date.now()-s;if(Tt()){H(`
|
|
7
|
-
`+$n(r,i,p));return}qn({_otel:"summary",executionId:e,deploymentId:t,triggerType:n,routeOrJob:r,status:i?"error":"success",startedAt:o,finishedAt:u,durationMs:p,userId:c,hasError:i||l.hasError,hasAuth:l.hasAuth,hasAi:l.hasAi,hasExternal:l.hasExternal,hasDb:l.hasDb,errorSummary:i&&a!==null?re(a):null})}async function Lc(e,t){let n=e.startMs??Date.now();bs();let r=!1,o=null;try{return await Kn.run(e.executionId,()=>F.startActiveSpan("App",{kind:ls.SERVER,attributes:{method:e.method,route:e.route,...e.deploymentId?{deploymentId:e.deploymentId}:{}}},async s=>{try{let i=await t(),a=i?.httpResponse?.status??404;return r=a>=400,s.setAttribute("http.response.status_code",a),s.setAttribute("helix.status",r?"error":"success"),s.setStatus({code:r?Ze.ERROR:Ze.OK}),i}catch(i){throw r=!0,o=i instanceof Error?i.message:String(i),s.setAttribute("http.response.status_code",500),s.setAttribute("helix.status","error"),s.setStatus({code:Ze.ERROR,message:o}),i}finally{s.end()}}))}finally{xs({executionId:e.executionId,deploymentId:e.deploymentId,routeOrJob:`${e.method} ${e.route}`,startedAt:e.startedAt,startMs:n,errored:r,errorMessage:o,userId:e.userId,flags:{hasDb:!1,hasExternal:!1,hasAuth:!1,hasAi:!1,hasError:!1}}),await vs()}}var Gn=1024,G=100*1024*1024,Vn=250,As=3600,Es=As*1e3,zn=new TextEncoder,Is=/(^|\/)\.\.(\/|$)/,Rs=/[?#]/;function Cs(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<=31||n===127)return!0}return!1}function ie(e,t=Gn){if(e.length===0)throw d.filesPathInvalid("Path must be a non-empty string");et(e,t)}function Mt(e){return e.endsWith("/")?e.slice(0,-1):e}function et(e,t=Gn){if(e.length===0)return;if(Is.test(e))throw d.filesPathInvalid("Path contains path traversal segment");if(Rs.test(e)||Cs(e))throw d.filesPathInvalid("Path contains illegal characters");let n=e.split("/");if(e.startsWith("/")||e.endsWith("/")||n.some(o=>o===""))throw d.filesPathInvalid("Path must not contain empty path segments");for(let o of n){let s=zn.encode(o).length;if(s>Vn)throw d.filesPathInvalid(`Path segment exceeds ${Vn} UTF-8 bytes (got ${s})`)}let r=zn.encode(e).length;if(r<1||r>t)throw d.filesPathInvalid(`Path must be between 1 and ${t} UTF-8 bytes (got ${r})`)}function Jn(e){if(e>G)throw d.filesValueTooLarge(`File exceeds maximum size of ${G} bytes (got ${e})`,G)}function ge(e){let t=e!==void 0?e*1e3:Es;return new Date(Date.now()+t)}import{join as _e}from"path";var Ts="files",ks="files-meta",Ps=1023,Os=1,_s=5;function Wn(e){let t=Math.max(Buffer.byteLength(tt(e),"utf8"),Buffer.byteLength(Oe(e),"utf8"));return Math.max(0,Ps-t-Os-_s)}function tt(e){return _e(e,".helix",Ts)}function Oe(e){return _e(e,".helix",ks)}function De(e,t){return _e(tt(e),...t.split("/"))}function nt(e,t){return _e(Oe(e),...t.split("/"))+".json"}function rt(e,t){return t.length===0?tt(e):De(e,t)}function Xn(e,t){return t.length===0?Oe(e):_e(Oe(e),...t.split("/"))}import{z as Ds}from"zod";var qc=["us1","eu1","ap1","ap2"],Ft=Ds.string().refine(e=>un(e),e=>({message:`Invalid enum value. Expected ${pn().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));import{resolve as J}from"path";import{existsSync as ot,realpathSync as Yn}from"fs";import{loadConfig as Ms}from"c12";import{z as b}from"zod";var Zn=b.string().uuid("projectId must be a valid UUID"),er=b.string().min(1,"workspaceId must be a non-empty string"),tr=b.discriminatedUnion("store",[b.object({store:b.literal("managed")}),b.object({store:b.literal("dynamodb"),auth:b.string().min(1,"agentSessions.auth is required"),table:b.string().min(1,"agentSessions.table is required"),region:b.string().min(1,"agentSessions.region is required")})]),st=["openai","anthropic","google","mistral","cohere","bedrock","openai-compatible"],Fs=["openai","anthropic","google","mistral","cohere"],Ls=/^[a-z0-9][a-z0-9-]*$/i,nr=b.union([b.enum(Fs),b.object({service:b.enum(st),baseUrl:b.string().url().optional(),region:b.string().regex(Ls,"aiProviders: region must be an AWS region name (e.g. us-east-1)").optional()}).refine(e=>e.service!=="openai-compatible"||e.baseUrl!==void 0,{message:'aiProviders: baseUrl is required when service is "openai-compatible"'}).refine(e=>e.service!=="bedrock"||e.region!==void 0||e.baseUrl!==void 0,{message:'aiProviders: region (e.g. "us-east-1") or baseUrl is required when service is "bedrock"'}).refine(e=>e.service==="bedrock"||e.region===void 0,{message:'aiProviders: region only applies to service "bedrock"'}).refine(e=>e.baseUrl===void 0?!0:new URL(e.baseUrl).protocol==="https:",{message:"aiProviders: baseUrl must use https \u2014 ctx.ai requests route through the credentials broker's proxy, which rejects non-https destinations on every call (a plain-http endpoint, e.g. a local Ollama/vLLM instance over http, is not supported)"})]),Ns=b.object({name:b.string().min(1,"name is required"),projectId:Zn.optional(),workspaceId:er.optional(),region:Ft.optional(),env:b.literal("production").optional(),authentications:b.record(b.string()).optional().default({}),config:b.record(b.unknown()).optional().default({}),agentSessions:tr.optional(),aiProviders:b.record(nr).optional()}).transform(({env:e,region:t,...n})=>({...n,region:t??"us1"})),Qn=b.object({name:b.string().min(1,"name is required"),workspaceId:er.optional(),region:Ft,authentications:b.record(b.string()),config:b.record(b.unknown()),agentSessions:tr.optional(),aiProviders:b.record(nr).optional()}),Zc=b.discriminatedUnion("kind",[Qn.extend({kind:b.literal("provisioned"),projectId:Zn}),Qn.extend({kind:b.literal("unprovisioned")})]),rr=["helix","tray"],or=["ts","mts","cts","js","mjs","cjs"],sr="HELIX_CONFIG";function Lt(e){let t=e?.trim();return t||process.env[sr]?.trim()||void 0}function Us(e,t){let n=Lt(t?.configFile);if(n!==void 0){let r=J(e,n);return ot(r)?r:void 0}for(let r of rr)for(let o of or){let s=J(e,`${r}.config.${o}`);if(ot(s))return s}}function $s(e){for(let t of rr)if(or.some(n=>ot(J(e,`${t}.config.${n}`))))return t;return"helix"}function js(e,t){return J(e,t).replace(/\.(?:m|c)?[jt]s$/,"")}function Bs(e,t){let n=Lt(t?.configFile);return{name:$s(e),cwd:e,...n!==void 0?{configFile:js(e,n)}:{},rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function Ks(e,t){if(e!==null&&typeof e=="object"&&"extends"in e)throw d.configLoadFailed(`helix.config.ts at ${t}: 'extends' is not supported \u2014 remove the field`);let n=Ns.safeParse(e);if(!n.success){let l=n.error.issues.map(u=>u.message).join("; ");throw d.configLoadFailed(`Invalid helix.config.ts at ${t}: ${l}`)}let{projectId:r,workspaceId:o,...s}=n.data,i=o!==void 0?{workspaceId:o}:{},a=fn(),c=a!==void 0?{...s,region:a}:s;return r!==void 0?{kind:"provisioned",projectId:r,...c,...i}:{kind:"unprovisioned",...c,...i}}async function el(e,t){let n=e??process.cwd(),r=Lt(t?.configFile),o=r!==void 0?J(n,r):void 0;if(o!==void 0&&!ot(o)){let a=t?.configFile?.trim()?"":` (from ${sr})`;throw d.configLoadFailed(`Config file not found: ${o}${a}`)}let s;try{s=await Ms(Bs(n,t))}catch(a){throw d.configLoadFailed(`Failed to load helix.config.ts: ${a instanceof Error?a.message:String(a)}`)}let i=s._configFile??Us(n,t);if(!i)throw d.configLoadFailed(`helix.config.ts not found at ${J(n,"helix.config.ts")}`);if(o!==void 0&&s._configFile!==void 0){let a=Yn(o);if(Yn(J(s._configFile))!==a)throw d.configLoadFailed(`Config file conflict: requested ${o} but ${J(s._configFile)} takes extension-resolution precedence \u2014 remove or rename the sibling file`)}return Ks(s.config,i)}var Hs="WORKSPACE_ID_REQUIRED";function tl(e){if(e.workspaceId===void 0)throw Object.assign(new Error("No workspaceId found in helix.config.ts. Discover & choose one \u2014 self-serve fix: run `helix workspace select`; agent-driven fix: call the `tray_list_workspaces` MCP tool. Already know the id? Run `helix workspace set <id>` or call the `tray_set_workspace_id` MCP tool. deploy cannot proceed without a workspace."),{code:Hs});return e.workspaceId}var ir="helix-tool",qs=/^[a-z][a-z0-9_]{0,63}$/;function sl(e){if(typeof e.name!="string"||!qs.test(e.name))throw new Error(`defineTool: invalid tool name ${JSON.stringify(e.name)} \u2014 use snake_case (e.g. "lookup_customer")`);if(typeof e.description!="string"||e.description.trim().length===0)throw new Error(`defineTool("${e.name}"): description is required`);if(!e.input||typeof e.input.safeParse!="function")throw new Error(`defineTool("${e.name}"): input must be a Zod schema`);if(typeof e.handler!="function")throw new Error(`defineTool("${e.name}"): handler must be a function`);let t=async(r,o)=>{let s=e.input.safeParse(r);if(!s.success)throw d.inputValidationFailed(s.error.issues.map(i=>i.path.join(".")||"(root)"));return e.handler({...o,input:s.data})},n=(async r=>t(r,Ve()));return Object.defineProperties(n,{kind:{value:ir,enumerable:!0},name:{value:e.name,enumerable:!0},description:{value:e.description,enumerable:!0},inputSchema:{value:e.input,enumerable:!0},needsApproval:{value:e.needsApproval,enumerable:!0},execute:{value:t,enumerable:!0}}),n}function ar(e){return typeof e=="function"&&e.kind===ir&&typeof e.name=="string"}var I=class extends Error{constructor(t){super(t),this.name="AgentCallerError"}};import{readFileSync as Vs}from"fs";import{isAbsolute as zs,resolve as Gs}from"path";var B=new Map;function cr(e){B.set(e.name,{definition:e});for(let t of B.values())t.referencesValidated=void 0}function ul(e,t){let n=B.get(e);n&&(n.baseDir=t,n.resolvedInstructions=void 0)}function pl(e,t){let n=B.get(e);n&&(n.resolvedInstructions=t)}function Me(e){let t=B.get(e);if(!t){let n=[...B.keys()].sort();throw new I(`Unknown agent "${e}". Registered agents: ${n.join(", ")||"(none \u2014 are the functions/_agents/ modules imported?)"}`)}return t.definition}function fl(){return[...B.values()].map(e=>e.definition)}function lr(e){let t=B.get(e);if(!t)throw new I(`Unknown agent "${e}"`);if(t.resolvedInstructions!==void 0)return t.resolvedInstructions;let{definition:n}=t;if(n.instructions!==void 0)return t.resolvedInstructions=n.instructions,n.instructions;let r=n.instructionsFile,o=zs(r)?r:t.baseDir!==void 0?Gs(t.baseDir,r):void 0;if(o===void 0)throw new Error(`Agent "${e}" uses instructionsFile "${r}" but its base directory is unknown \u2014 load the agent through helix dev (which records it), or use inline \`instructions\`.`);let s;try{s=Vs(o,"utf-8")}catch(i){throw new Error(`Agent "${e}": failed to read instructionsFile ${o}: ${i instanceof Error?i.message:String(i)}`)}if(s.trim().length===0)throw new Error(`Agent "${e}": instructionsFile ${o} is empty`);return t.resolvedInstructions=s,s}function dr(e){let t=B.get(e);if(t?.referencesValidated)return;let n=Me(e);for(let r of n.agents??[]){let s=(Me(r).tools??[]).filter(i=>i.needsApproval);if(s.length>0)throw new Error(`Agent "${e}" delegates to "${r}", which has needsApproval tools (${s.map(i=>i.name).join(", ")}) \u2014 approval cannot pause a parent's loop through delegation in v1. Put approval-gated tools on the orchestrating agent.`)}t&&(t.referencesValidated=!0)}function ml(){B.clear()}import{z as P}from"zod";var ur="helix-agent",Js=/^[a-z][a-z0-9-]{0,63}$/,Ws=P.object({model:P.string().min(1),auth:P.string().min(1)}),Xs=P.object({name:P.string().regex(Js,'agent name must be kebab-case (e.g. "support-agent"); name is required in v1'),description:P.string().min(1,"description is required"),model:P.string().min(1,"model is required"),auth:P.string().min(1,"auth (authentication alias) is required"),fallbacks:P.array(Ws).optional(),instructions:P.string().min(1).optional(),instructionsFile:P.string().min(1).optional(),tools:P.array(P.custom(ar,"tools entries must be defineTool exports")).optional(),agents:P.array(P.string().min(1)).optional(),memory:P.object({maxSessionMessages:P.number().int().positive().optional(),ttl:P.number().int().positive().optional(),scope:P.enum(["user","project"]).optional()}).optional(),limits:P.object({maxIterations:P.number().int().positive().optional(),maxToolCalls:P.number().int().positive().optional()}).optional()}).refine(e=>e.instructions===void 0!=(e.instructionsFile===void 0),{message:"exactly one of instructions / instructionsFile must be set"}),pr=200,fr=25,mr=50,Nt=3;function Sl(e){let t=Xs.safeParse(e);if(!t.success){let o=typeof e?.name=="string"?e.name:"(unnamed)",s=t.error.issues.map(i=>`${i.path.join(".")||"(root)"}: ${i.message}`).join("; ");throw new Error(`defineAgent(${o}): invalid definition \u2014 ${s}`)}let n=new Set;for(let o of t.data.tools??[]){if(n.has(o.name))throw new Error(`defineAgent(${t.data.name}): duplicate tool "${o.name}"`);n.add(o.name)}let r={kind:ur,...t.data};return cr(r),r}function bl(e){return typeof e=="object"&&e!==null&&e.kind===ur&&typeof e.name=="string"}var Ys=50,gr=500;function Fe(e){let t=e?.limit??Ys;if(!Number.isInteger(t)||t<1||t>gr)throw new I(`session.page(): limit must be an integer from 1 to ${gr}.`);let n=e?.order??"asc";if(n!=="asc"&&n!=="desc")throw new I('session.page(): order must be "asc" or "desc".');return{limit:t,order:n,cursor:e?.cursor}}function $t(){return new I("session.page(): invalid cursor \u2014 pass the `nextCursor` of the previous page, with the same `order`.")}var W=new Map;function jt(e,t,n){let r=encodeURIComponent;return n!==void 0?`agent:${r(e)}:user:${r(n)}:session:${r(t)}`:`agent:${r(e)}:session:${r(t)}`}function Qs(e,t,n){let r=Math.max(0,e.length-t);for(let s=r;s<e.length;s++)if(e[s]?.role==="user")return e.slice(s);for(let s=r-1;s>=0;s--)if(e[s]?.role==="user")return e.slice(s);if(!n)return;let o=r;for(;o<e.length&&e[o]?.role==="tool";)o++;return e.slice(o)}var Zs=32;async function Bt(e,t){let n=t+Zs;for(;;){let r=await e.messages({limit:n}),o=Qs(r,t,r.length<n);if(o!==void 0)return o;n*=2}}function Kt(e,t){return e.ttlSeconds!==void 0&&t-e.lastActiveAt>e.ttlSeconds*1e3}var ei=6e4,Ut=0;function ti(e){if(!(e-Ut<ei)){Ut=e;for(let[t,n]of W)if(Kt(n,e)){if(n.pendingApprovals.length>0){n.messages=[];continue}W.delete(t)}}}var X=class extends Error{constructor(t){super(`Agent session "${t}" has expired (session-expired)`),this.name="SessionExpiredError"}};function yr(e,t,n,r){let o=Date.now();ti(o);let s=n?.ttl,i=t??`ses_${crypto.randomUUID().replaceAll("-","")}`,a=jt(e,i,r),c=W.get(a);if(c&&(c.ttlSeconds=s),c&&Kt(c,o)){if(W.delete(a),c.pendingApprovals.length>0)throw new X(i);c=void 0}c||(c={id:i,agentName:e,...r!==void 0?{ownerUserId:r}:{},messages:[],createdAt:o,lastActiveAt:o,pendingApprovals:[],ttlSeconds:s},W.set(a,c));let l=c,u=()=>{l.lastActiveAt=Date.now()};return{id:i,async messages(p){u();let m=l.messages;return p?.limit!==void 0?m.slice(-p.limit):[...m]},async page(p){let{limit:m,order:g,cursor:w}=Fe(p);u();let S=w===void 0?0:Number(w);if(!Number.isInteger(S)||S<0)throw $t();let x=g==="desc"?[...l.messages].reverse():l.messages,y=x.slice(S,S+m),f=S+y.length;return{messages:y,nextCursor:f<x.length?String(f):null}},async append(...p){u(),l.messages.push(...p)},async clear(){W.delete(a)},async truncated(){return!1},async pendingApprovals(){return u(),[...l.pendingApprovals]},async addPendingApprovals(p){u(),l.pendingApprovals.push(...p)},async resolveApproval(p){u();let m=l.pendingApprovals.findIndex(g=>g.approvalId===p);return m===-1?"already-resolved":(l.pendingApprovals.splice(m,1),"resolved")}}}function hr(e,t,n={}){let r=Date.now(),o=n.first??20,s=n.cursor!==void 0&&Number.parseInt(n.cursor,10)||0,i=[...W.values()].filter(c=>c.agentName===e&&c.ownerUserId===t&&!Kt(c,r)).sort((c,l)=>l.lastActiveAt-c.lastActiveAt);return{sessions:i.slice(s,s+o).map(c=>({id:c.id,createdAt:c.createdAt,lastActivityAt:c.lastActiveAt,messageCount:c.messages.length,pendingApprovals:c.pendingApprovals.length})),nextCursor:s+o<i.length?String(s+o):null}}function Al(){W.clear(),Ut=0}import{AsyncLocalStorage as Ri}from"async_hooks";import{z as zr}from"zod";import{generateText as Ci,streamText as Ti,tool as Gr,stepCountIs as ki}from"ai";import{SpanKind as zt,SpanStatusCode as Se,context as Jr,trace as Pi}from"@opentelemetry/api";import{embed as xr,embedMany as Ar,generateImage as Er,generateObject as Ir,generateSpeech as Rr,generateText as Cr,streamObject as Tr,streamText as kr,transcribe as Pr}from"ai";import{SpanKind as fi,SpanStatusCode as vr}from"@opentelemetry/api";import{createOpenAI as si}from"@ai-sdk/openai";import{createAnthropic as ii}from"@ai-sdk/anthropic";import{createGoogle as ai}from"@ai-sdk/google";import{createMistral as ci}from"@ai-sdk/mistral";import{createCohere as li}from"@ai-sdk/cohere";import{createAmazonBedrock as di}from"@ai-sdk/amazon-bedrock";import{createOpenAICompatible as ui}from"@ai-sdk/openai-compatible";var ni=new Set(["x-api-key","x-goog-api-key"]);function ri(e){return gn(e)||ni.has(e.toLowerCase())}function oi(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function wr(e){return async(t,n)=>{let r=oi(t),o=new URL(r);if(o.protocol!=="https:")throw d.unsupportedScheme(o.protocol.replace(/:$/,""));let s=E(),{region:i}=A(),a=new Headers(n?.headers??(t instanceof Request?t.headers:void 0)),c=new Headers;for(let[x,y]of a.entries())ri(x)||c.append(x,y);c.set(Ie,r),c.set(ze,e),s.executionId&&c.set(Re,s.executionId);let{headers:l,deploymentId:u}=z(s);for(let[x,y]of Object.entries(l))c.set(x,y);u&&c.set(te,u);let p=fe(i,s.mode==="lambda"?"runtime":"dev"),m=n?.body??(t instanceof Request?t.clone().body:void 0),g={method:n?.method??(t instanceof Request?t.method:"GET"),headers:c,redirect:"manual",signal:n?.signal??void 0};m!=null&&(g.body=m,typeof ReadableStream<"u"&&m instanceof ReadableStream&&(g.duplex="half"));let w;try{w=await fetch(p,g)}catch(x){if(x instanceof Error&&x.name==="AbortError")throw x;let y=x instanceof Error?x.message??String(x):String(x);throw d.brokerError(0,y)}let S=w.headers.get(Ge);if(S!==null){let x=await w.text(),y=x||S;try{let f=yn.safeParse(JSON.parse(x));f.success&&(y=f.data.error.message)}catch{}throw S===pe&&(y="credential broker does not support the raw proxy endpoint required by ctx.ai \u2014 deploy a newer broker or pin an older SDK"),d.brokerError(w.status,y,x||void 0,S)}return w}}var ae="helix-broker";function Sr(e){let{alias:t,service:n,baseUrl:r,region:o,authenticationId:s}=e,i=wr(s);switch(n){case"openai":return si({apiKey:ae,fetch:i});case"anthropic":return ii({apiKey:ae,fetch:i});case"google":return ai({apiKey:ae,fetch:i});case"mistral":return ci({apiKey:ae,fetch:i});case"cohere":return li({apiKey:ae,fetch:i});case"bedrock":{if(!o&&!r)throw d.aiProviderMisconfigured(t,n,'set region (e.g. "us-east-1") or baseUrl for the Bedrock runtime endpoint');return di({apiKey:ae,region:o??"helix-broker",...r?{baseURL:r}:{},fetch:i})}case"openai-compatible":{if(!r)throw d.aiProviderMisconfigured(t,n,"set baseUrl for the endpoint");return ui({name:t,baseURL:r,apiKey:ae,fetch:i})}}}var br={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-mini":{input:.4,output:1.6},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1":{input:2,output:8},"text-embedding-3-small":{input:.02,output:0},"text-embedding-3-large":{input:.13,output:0},"gpt-image-1":{input:5,output:40},"claude-opus-4":{input:15,output:75},"claude-sonnet-4":{input:3,output:15},"claude-haiku-4":{input:1,output:5},"claude-3-5-haiku":{input:.8,output:4},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:.3,output:2.5},"text-embedding-004":{input:0,output:0},"mistral-large":{input:2,output:6},"mistral-small":{input:.1,output:.3},"command-r-plus":{input:2.5,output:10},"command-r":{input:.15,output:.6}},pi=Object.keys(br).sort((e,t)=>t.length-e.length);function it(e,t){let n=pi.find(s=>e.startsWith(s));if(!n||!t)return{amount:0,currency:"USD"};let r=br[n],o=((t.inputTokens??0)*r.input+(t.outputTokens??0)*r.output)/1e6;return{amount:Number(o.toFixed(8)),currency:"USD"}}function L(e,t,n){return F.startActiveSpan("ai",{kind:fi.CLIENT},async r=>{r.setAttributes({operation:e.operation,model:e.model,...e.alias!==void 0?{alias:e.alias}:{}}),O("hasAi");try{let o=await t(),s=n?.(o);return s&&r.setAttributes({...s.inputTokens!==void 0?{inputTokens:s.inputTokens}:{},...s.outputTokens!==void 0?{outputTokens:s.outputTokens}:{}}),r.setAttribute("status","success"),r.setStatus({code:vr.OK}),o}catch(o){let s=o instanceof Error?o.message:String(o);throw r.setAttribute("status","error"),r.setStatus({code:vr.ERROR,message:s}),o}finally{r.end()}})}function mi(){return`aireq_${crypto.randomUUID().replaceAll("-","")}`}function he(e,t){return{cost:it(e,t),requestId:mi()}}function ce(e){return typeof e=="object"&&e!==null&&"modelId"in e?String(e.modelId):String(e)}var Or=new WeakSet;function ye(e){return Or.add(e),e}function _r(e){return ye(e)}function V(e){if(typeof e!="object"||e===null)throw d.aiModelInstanceRequired(typeof e=="string"?e:String(e));if(!Or.has(e))throw d.aiForeignModelRejected()}function at(e){return e.totalUsage??e.usage}function ct(e){return e.usage?.tokens!==void 0?{inputTokens:e.usage.tokens}:void 0}function lt(e){return e.usage}function Ht(e){let t=A(),n=t.authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e],o=(t.aiProviders??{})[e];if(o===void 0)throw d.aiProviderNotConfigured(e,[...st]);let{service:s,baseUrl:i,region:a}=typeof o=="string"?{service:o,baseUrl:void 0,region:void 0}:o,c=Sr({alias:e,service:s,baseUrl:i,region:a,authenticationId:r}),l=y=>ye(c.languageModel(y)),u=y=>ye(c.embeddingModel(y)),p=y=>ye(c.imageModel(y)),m=y=>{if(!c.transcriptionModel)throw new Error(`AI provider "${s}" (alias "${e}") has no transcription models`);return ye(c.transcriptionModel(y))},g=y=>{if(!c.speechModel)throw new Error(`AI provider "${s}" (alias "${e}") has no speech models`);return ye(c.speechModel(y))},w=(y=>l(y)),S=(y,f)=>{let h=y.model;if(typeof h!="string")throw d.aiModelIdRequired(e,f);return h};return Object.assign(w,{specificationVersion:"v4",languageModel:l,embeddingModel:u,textEmbeddingModel:u,imageModel:p,transcriptionModel:m,speechModel:g,async generateText(y){let f=S(y,"generateText"),h=await L({operation:"generateText",model:f,alias:e},()=>Cr({...y,model:l(f)}),at);return Object.assign(h,{helix:he(f,at(h))})},streamText(y){let f=S(y,"streamText");return O("hasAi"),kr({...y,model:l(f)})},async generateObject(y){let f=S(y,"generateObject"),h=await L({operation:"generateObject",model:f,alias:e},()=>Ir({...y,model:l(f)}),R=>R.usage),v=h.usage;return Object.assign(h,{helix:he(f,v)})},streamObject(y){let f=S(y,"streamObject");return O("hasAi"),Tr({...y,model:l(f)})},async embed(y){let f=S(y,"embed");return L({operation:"embed",model:f,alias:e},()=>xr({...y,model:u(f)}),ct)},async embedMany(y){let f=S(y,"embedMany");return L({operation:"embedMany",model:f,alias:e},()=>Ar({...y,model:u(f)}),ct)},async generateImage(y){let f=S(y,"generateImage"),h=await L({operation:"generateImage",model:f,alias:e},()=>Er({...y,model:p(f)}),lt);return Object.assign(h,{helix:he(f,lt(h))})},async transcribe(y){let f=S(y,"transcribe");return L({operation:"transcribe",model:f,alias:e},()=>Pr({...y,model:m(f)}))},async generateSpeech(y){let f=S(y,"generateSpeech");return L({operation:"generateSpeech",model:f,alias:e},()=>Rr({...y,model:g(f)}))}})}function Xl(){let e=new Map;return Object.assign((r=>{let o=e.get(r);return o||(o=Ht(r),e.set(r,o)),o}),{async generateText(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateText",model:o},()=>Cr(r),at);return Object.assign(s,{helix:he(o,at(s))})},streamText(r){return V(r.model),O("hasAi"),kr(r)},async generateObject(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateObject",model:o},()=>Ir(r),a=>a.usage),i=s.usage;return Object.assign(s,{helix:he(o,i)})},streamObject(r){return V(r.model),O("hasAi"),Tr(r)},async embed(r){return V(r.model),L({operation:"embed",model:ce(r.model)},()=>xr(r),ct)},async embedMany(r){return V(r.model),L({operation:"embedMany",model:ce(r.model)},()=>Ar(r),ct)},async generateImage(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateImage",model:o},()=>Er(r),lt);return Object.assign(s,{helix:he(o,lt(s))})},async transcribe(r){return V(r.model),L({operation:"transcribe",model:ce(r.model)},()=>Pr(r))},async generateSpeech(r){return V(r.model),L({operation:"generateSpeech",model:ce(r.model)},()=>Rr(r))}})}var qt=class extends Error{errors;constructor(t){super(`all ${t.length} models in the fallback chain failed \u2014 `+t.map(({modelId:n,error:r})=>`${n}: ${r instanceof Error?r.message:String(r)}`).join("; ")),this.name="FallbackExhaustedError",this.errors=t.map(n=>n.error)}};function Dr(e){if(e.length===0)throw new Error("createFallbackModel: at least one model required");if(e.length===1)return e[0];let t=e[0];async function n(r){let o=[];for(let s of e)try{return await r(s)}catch(i){if(i instanceof Error&&i.name==="AbortError")throw i;o.push({modelId:s.modelId,error:i})}throw new qt(o)}return{specificationVersion:"v4",provider:t.provider,modelId:t.modelId,get supportedUrls(){return Promise.resolve(t.supportedUrls)},doGenerate:r=>n(o=>o.doGenerate(r)),doStream:r=>n(o=>o.doStream(r))}}function Vt(e){let t=e.code===pe?"credential broker does not support the raw proxy endpoints required by this SDK version \u2014 deploy a newer broker or pin an older SDK":e.message;throw d.brokerError(e.status,t,k(e.body),e.code)}async function we(e,t={}){let n=E(),{region:r}=A(),{headers:o,deploymentId:s}=z(n);s&&(o[te]=s);let i=fe(r,n.mode==="lambda"?"runtime":"dev"),a;try{a=await wn({proxyUrl:i,credentialHeaders:o,request:e,timeoutMs:t.timeout,executionId:n.executionId})}catch(c){let l=c instanceof Error?c.message??String(c):String(c);throw d.brokerError(0,l)}return a.kind==="brokerError"&&Vt(a),a.response}var gi=8,ut="msg#",yi="meta",Mr=25,Fr=3,hi=400*1024-1024;function wi(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r?.content))for(let o of r.content){if(typeof o!="object"||o===null)continue;let{type:s,approvalId:i,isAutomatic:a}=o;typeof i=="string"&&(s==="tool-approval-request"&&a!==!0&&t.add(i),s==="tool-approval-response"&&n.add(i))}for(let r of n)t.delete(r);return t}var N=e=>({S:e}),dt=e=>({N:String(e)});function Le(e,t){let n=e?.[t]?.S;return typeof n=="string"?n:void 0}function Lr(e,t){let n=e?.[t]?.N;return typeof n=="string"?Number(n):void 0}function Si(e,t){return e?.[t]?.BOOL===!0}function Nr(e,t){let n=e?.[t]?.M;return typeof n=="object"&&n!==null?n:{}}function bi(e){return`${ut}${String(e).padStart(gi,"0")}`}function vi(e){let t=null;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}else e!==null&&typeof e=="object"&&(t=e);let n=t?.__type;return typeof n=="string"?n.split("#").pop():void 0}function Ur(e){let{agentName:t,table:n,region:r,authenticationId:o}=e,s=e.options?.ttl,i=e.sessionId??`ses_${crypto.randomUUID().replaceAll("-","")}`,a=jt(t,i,e.ownerUserId),c={pk:N(a),sk:N(yi)};async function l(f,h){let v=ne({authenticationId:o,method:"POST",url:`https://dynamodb.${r}.amazonaws.com/`,body:h,headers:{"Content-Type":"application/x-amz-json-1.0","X-Amz-Target":`DynamoDB_20120810.${f}`}}),R,T;try{({status:R,body:T}=await we(v))}catch(C){throw C instanceof d?C:d.agentSessionsFailed(C instanceof Error?C.message:String(C))}if(R>=400){let C=vi(T);throw C==="ConditionalCheckFailedException"?new pt:d.agentSessionsFailed(`DynamoDB ${f} failed (${R}): ${C??JSON.stringify(T).slice(0,300)}`)}if(typeof T=="string")try{return JSON.parse(T)}catch{throw d.agentSessionsFailed(`DynamoDB ${f}: non-JSON response body`)}return T??{}}async function u(){return(await l("GetItem",{TableName:n,Key:c,ConsistentRead:!0})).Item}let p=!1;async function m(){p||(await g(),p=!0)}async function g(){let f=await u();if(!f){let v=await w({ascending:!0});if(v.length===0||await u())return;let R=v.map(T=>JSON.parse(Le(T,"message")??"null"));if(await S(v.map(T=>({DeleteRequest:{Key:{pk:N(a),sk:T.sk}}}))),wi(R).size>0)throw new X(i);return}if(s===void 0)return;let h=Lr(f,"lastActiveAt")??0;if(!(Date.now()-h<=s*1e3)){if(Object.keys(Nr(f,"pendingApprovals")).length>0)throw new X(i);await x()}}async function w(f){let h=[],v;do{let R=await l("Query",{TableName:n,KeyConditionExpression:"pk = :pk AND begins_with(sk, :prefix)",ExpressionAttributeValues:{":pk":N(a),":prefix":N(ut)},ConsistentRead:!0,ScanIndexForward:f.ascending,...f.limit!==void 0?{Limit:f.limit}:{},...f.projection!==void 0?{ProjectionExpression:f.projection}:{},...v!==void 0?{ExclusiveStartKey:v}:{}});if(h.push(...R.Items??[]),v=R.LastEvaluatedKey,f.limit!==void 0&&h.length>=f.limit)break}while(v!==void 0);return h}async function S(f){for(let h=0;h<f.length;h+=Mr){let v=f.slice(h,h+Mr);for(let R=0;v.length>0;R++){let C=(await l("BatchWriteItem",{RequestItems:{[n]:v}})).UnprocessedItems?.[n];if(!C||C.length===0)break;if(R>=Fr)throw d.agentSessionsFailed(`DynamoDB BatchWriteItem: ${C.length} items still unprocessed after ${Fr} retries`);v=C}}}async function x(){let h=(await w({ascending:!0,projection:"sk"})).map(v=>({DeleteRequest:{Key:{pk:N(a),sk:v.sk}}}));h.push({DeleteRequest:{Key:c}}),await S(h)}async function y(f){let h=Date.now();return(await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:"ADD nextSeq :reserve, messageCount :reserve SET lastActiveAt = :now, "+(s!==void 0?"expiresAt = :expires, ":"")+"createdAt = if_not_exists(createdAt, :now), truncated = if_not_exists(truncated, :false), pendingApprovals = if_not_exists(pendingApprovals, :emptyMap)"+(s===void 0?" REMOVE expiresAt":""),ExpressionAttributeValues:{":reserve":dt(f),":now":dt(h),...s!==void 0?{":expires":dt(Math.floor(h/1e3)+s)}:{},":false":{BOOL:!1},":emptyMap":{M:{}}},ReturnValues:"ALL_NEW"})).Attributes??{}}return{id:i,async messages(f){await m();let h=f?.limit;return h!==void 0?(await w({ascending:!1,limit:h})).reverse().map(T=>JSON.parse(Le(T,"message")??"null")):(await w({ascending:!0})).map(R=>JSON.parse(Le(R,"message")??"null"))},async page(f){let{limit:h,order:v,cursor:R}=Fe(f);await m();let T;if(R!==void 0&&(T=Buffer.from(R,"base64url").toString("utf8"),!T.startsWith(ut)))throw $t();let C=await l("Query",{TableName:n,KeyConditionExpression:"pk = :pk AND begins_with(sk, :prefix)",ExpressionAttributeValues:{":pk":N(a),":prefix":N(ut)},ConsistentRead:!0,ScanIndexForward:v==="asc",Limit:h,...T!==void 0?{ExclusiveStartKey:{pk:N(a),sk:N(T)}}:{}}),ee=C.Items??[],qe=Le(C.LastEvaluatedKey,"sk");return{messages:ee.map(Go=>JSON.parse(Le(Go,"message")??"null")),nextCursor:qe!==void 0?Buffer.from(qe,"utf8").toString("base64url"):null}},async append(...f){if(f.length===0)return;let h=f.map(ee=>JSON.stringify(ee)),v=h.findIndex(ee=>Buffer.byteLength(ee,"utf8")>hi);if(v!==-1)throw d.agentSessionsFailed(`a ${f[v].role} message of ${Buffer.byteLength(h[v],"utf8")} bytes exceeds DynamoDB's 400 KB item limit \u2014 the session store keeps one item per message; have tools summarise or offload (ctx.files) large results`);await m();let R=await y(f.length),C=(Lr(R,"nextSeq")??f.length)-f.length+1;await S(h.map((ee,qe)=>({PutRequest:{Item:{pk:N(a),sk:N(bi(C+qe)),message:N(ee)}}})))},async clear(){await x()},async truncated(){return await m(),Si(await u(),"truncated")},async pendingApprovals(){await m();let f=Nr(await u(),"pendingApprovals");return Object.values(f).map(h=>{let v=h.S;return v!==void 0?JSON.parse(v):void 0}).filter(h=>h!==void 0)},async addPendingApprovals(f){if(f.length===0)return;await m(),await y(0);let h={},v={},R=[];f.forEach((T,C)=>{h[`#a${C}`]=T.approvalId,v[`:v${C}`]=N(JSON.stringify(T)),R.push(`pendingApprovals.#a${C} = :v${C}`)}),await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:`SET ${R.join(", ")}`,ExpressionAttributeNames:h,ExpressionAttributeValues:v})},async resolveApproval(f){await m();try{return await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:"REMOVE pendingApprovals.#id SET lastActiveAt = :now",ConditionExpression:"attribute_exists(pendingApprovals.#id)",ExpressionAttributeNames:{"#id":f},ExpressionAttributeValues:{":now":dt(Date.now())}}),"resolved"}catch(h){if(h instanceof pt)return"already-resolved";throw h}}}}var pt=class extends Error{constructor(){super("ConditionalCheckFailedException"),this.name="ConditionalCheckFailed"}};import xi from"ky";async function K(e){let t=e.headers.get("content-type")??"",n=await e.text();if(n.length!==0)return t.includes("application/json")?JSON.parse(n):n}var Ai=6e4,Ei=500,$r=500;function jr(e){let t=A();if(t.kind!=="provisioned")throw d.agentSessionsFailed("the managed session store requires a provisioned project (projectId in helix.config.ts)");return`${j(t.region).hosts.api}/private/v1/helix/projects/${encodeURIComponent(t.projectId)}/storage/agent-sessions/${encodeURIComponent(e)}`}function Ii(){let e=ue(),t=$(),n={Accept:"application/json"};if(e&&e.trim().length>0&&(n[de]=e),t&&t.trim().length>0&&(n[U]=t),Object.keys(n).length===1)throw d.missingExecutionCredentials();return n}async function Y(e,t,n){try{let r=await xi(t,{method:e,headers:Ii(),...n!==void 0?{json:n}:{},throwHttpErrors:!1,timeout:Ai});return{status:r.status,body:await K(r)}}catch(r){throw r instanceof d?r:d.agentSessionsFailed(`managed session store unreachable: ${r instanceof Error?r.message:String(r)}`)}}function ft(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message}return String(e??"unknown error")}function le(e,t,n){throw t===410?new X(e):t===404?new I(`Agent session "${e}" was not found (it may belong to a different user or have expired).`):d.agentSessionsFailed(`managed session store error ${t}: ${ft(n)}`)}function Br(e){let t=jr(e.agentName),n=e.sessionId??`ses_${crypto.randomUUID().replaceAll("-","")}`,r=e.options?.scope,o=e.options?.ttl,s=async c=>{let l=new URL(`${t}/${encodeURIComponent(n)}/messages`);c.first!==void 0&&l.searchParams.set("first",String(c.first)),c.cursor!==void 0&&l.searchParams.set("cursor",c.cursor),c.order!==void 0&&l.searchParams.set("order",c.order);let{status:u,body:p}=await Y("get",l.toString());if(u!==404){if(u===400&&c.cursor!==void 0)throw new I(`session.page(): ${ft(p)}`);return(u<200||u>=300)&&le(n,u,p),p}},i=c=>c.elements.length<2||c.elements[0].id>c.elements[1].id,a=async()=>{let c=[],l;for(;;){let u=await s({...l!==void 0?{cursor:l}:{}});if(u===void 0)return[];if(c.push(...u.elements.map(p=>p.message)),!u.pageInfo.hasNextPage||u.pageInfo.endCursor===null)break;l=u.pageInfo.endCursor}return c};return{id:n,async messages(c){let l=c?.limit;if(l===void 0)return a();let u=[],p;for(;u.length<l;){let m=await s({order:"desc",first:Math.min(l-u.length,Ei),...p!==void 0?{cursor:p}:{}});if(m===void 0)return[];if(!i(m))return(await a()).slice(-l);if(u.push(...m.elements.map(g=>g.message)),!m.pageInfo.hasNextPage||m.pageInfo.endCursor===null)break;p=m.pageInfo.endCursor}return u.slice(0,l).reverse()},async page(c){let{limit:l,order:u,cursor:p}=Fe(c),m=await s({first:l,order:u,...p!==void 0?{cursor:p}:{}});if(m===void 0)return{messages:[],nextCursor:null};if(u==="desc"&&!i(m))throw d.agentSessionsFailed('the managed session store in this environment does not support newest-first paging yet \u2014 page with order: "asc", or read the latest messages with session.messages({ limit }).');return{messages:m.elements.map(g=>g.message),nextCursor:m.pageInfo.hasNextPage?m.pageInfo.endCursor:null}},async append(...c){if(c.length===0)return;let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/messages`,{messages:c,...r!==void 0?{scope:r}:{},...o!==void 0?{ttl:o}:{}});(l<200||l>=300)&&le(n,l,u)},async clear(){for(let c=0;c<$r;c++){let{status:l,body:u}=await Y("delete",`${t}/${encodeURIComponent(n)}`);if(l===204||l===404)return;if(!(l===200&&u?.more===!0)){if(l===200)return;le(n,l,u)}}throw d.agentSessionsFailed(`clearing session "${n}" did not complete after ${$r} calls \u2014 call clear() again to continue.`)},async truncated(){let{status:c,body:l}=await Y("get",`${t}/${encodeURIComponent(n)}`);return c===404?!1:((c<200||c>=300)&&le(n,c,l),l.truncated===!0)},async pendingApprovals(){let{status:c,body:l}=await Y("get",`${t}/${encodeURIComponent(n)}`);return c===404?[]:((c<200||c>=300)&&le(n,c,l),l.pendingApprovals)},async addPendingApprovals(c){if(c.length===0)return;let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/approvals`,{approvals:c});l!==204&&le(n,l,u)},async resolveApproval(c){let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/approvals/${encodeURIComponent(c)}/resolve`);return(l<200||l>=300)&&le(n,l,u),u.status}}}async function Kr(e,t={}){let n=jr(e),r=new URL(n);t.first!==void 0&&r.searchParams.set("first",String(t.first)),t.cursor!==void 0&&r.searchParams.set("cursor",t.cursor);let{status:o,body:s}=await Y("get",r.toString());if(o===400)throw new I(ft(s));if(o<200||o>=300)throw d.agentSessionsFailed(`managed session store error ${o}: ${ft(s)}`);let i=s;return{sessions:i.elements.map(a=>({id:a.sessionId,createdAt:a.createdAt,lastActivityAt:a.lastActivityAt,messageCount:a.messageCount,pendingApprovals:a.pendingApprovalCount})),nextCursor:i.pageInfo.endCursor}}function Hr(e){if(e?.scope!=="user")return;let t=mn.getStore()?.userId;if(typeof t!="string"||t.length===0)throw new I('This agent is user-scoped (memory.scope: "user") \u2014 it can only run in a user execution with a user identity (ctx.userId); schedules have none.');return t}function qr(){return E().mode==="lambda"}function mt(e,t,n){let r=A(),o=r.agentSessions,s=Hr(n);if(o?.store==="dynamodb"){let i=r.authentications??{},a=i[o.auth];if(!a)throw d.unknownAlias(o.auth,Object.keys(i));return Ur({agentName:e,sessionId:t,authenticationId:a,table:o.table,region:o.region,options:n,...s!==void 0?{ownerUserId:s}:{}})}return qr()?Br({agentName:e,sessionId:t,options:n}):yr(e,t,n,s)}async function Vr(e,t,n={}){if(t?.scope!=="user")throw new I(`agent.sessions() lists the calling user's sessions \u2014 the agent must declare memory.scope: "user".`);if(A().agentSessions?.store==="dynamodb")throw new I('agent.sessions() is not supported on the bring-your-own DynamoDB session store \u2014 use the managed store (agentSessions: { store: "managed" }).');let o=Hr(t);return qr()?Kr(e,n):hr(e,o,n)}var Wr=new Ri;function Oi(e){return({steps:t})=>t.reduce((n,r)=>n+r.toolCalls.length,0)>=e}function Xr(e,t,n,r){return F.startActiveSpan("agent.tool",{kind:zt.INTERNAL,attributes:{agent:e,tool:t,...n}},async o=>{try{let s=await r();return o.setAttribute("status","success"),o.setStatus({code:Se.OK}),s}catch(s){throw o.setAttribute("status","error"),o.setStatus({code:Se.ERROR,message:s instanceof Error?s.message:String(s)}),s}finally{o.end()}})}function _i(e){let t={};for(let n of e.tools??[]){let r=n.needsApproval;t[n.name]=Gr({description:n.description,inputSchema:n.inputSchema,...r!==void 0?{needsApproval:typeof r=="function"?o=>r(o):r}:{},execute:o=>Xr(e.name,n.name,{},()=>n.execute(o,Ve()))})}for(let n of e.agents??[]){let r=Me(n),o=`agent_${n.replaceAll("-","_")}`;t[o]=Gr({description:r.description,inputSchema:zr.object({prompt:zr.string().describe("The task or question for the agent")}),execute:({prompt:s})=>Xr(e.name,o,{delegateAgent:n},async()=>{let i=Wr.getStore()??0;return i>=Nt?{error:"delegation_depth_exceeded",message:`Delegation depth limit (${Nt}) reached \u2014 answer with what you have instead of delegating further.`}:(await Wr.run(i+1,()=>Ui(n).generate({prompt:s}))).text})})}return t}function Di(e){let t=[{model:e.model,auth:e.auth},...e.fallbacks??[]];return _r(Dr(t.map(n=>Ht(n.auth)(n.model))))}function Gt(e){return e.filter(t=>typeof t=="object"&&t!==null&&t.type==="tool-approval-request"&&!t.isAutomatic)}function Yr(e){return{approvalId:e.approvalId,toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId,input:e.toolCall.input,requestedAt:new Date().toISOString()}}function Mi(e){return{id:e.approvalId,toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId,input:e.toolCall.input}}function Fi(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let r of Gt(n.content))t.add(r.approvalId);return t}function Li(e,t){let n=e.reduce((r,o)=>r+it(o.response.modelId??t,o.usage).amount,0);return{amount:Number(n.toFixed(8)),currency:"USD"}}async function Ni(e,t,n){let r=[],o=[];if(n.approvals&&n.approvals.length>0){if(n.prompt!==void 0||(n.messages?.length??0)>0)throw new I("agent.generate() cannot combine `approvals` with `prompt` or `messages` \u2014 send the approvals on their own, then send new input on the next call.");let s=new Map((await e.pendingApprovals()).map(p=>[p.approvalId,p]));if(s.size===0&&t.length===0)throw new I(`Session "${e.id}" has no history and nothing awaiting approval \u2014 it does not exist, has expired, or belongs to a different user.`);let i=Fi(t),a=new Set(n.approvals.map(p=>p.id)),c=[...a].filter(p=>!s.has(p)&&!i.has(p));if(c.length>0)throw new I(`Unknown approval id(s) for session "${e.id}": ${c.join(", ")} \u2014 use the ids from \`pendingApprovals\` on the paused result.`);let l=[...s.keys()].filter(p=>!a.has(p));if(l.length>0)throw new I(`Session "${e.id}" has ${l.length} pending approval(s) not decided in this call: ${l.join(", ")} \u2014 decide every pending approval in one generate() call.`);let u=[];for(let p of n.approvals){let m=s.get(p.id);!m||await e.resolveApproval(p.id)==="already-resolved"||(o.push(m),u.push({type:"tool-approval-response",approvalId:p.id,approved:p.approved,...p.reason!==void 0?{reason:p.reason}:{}}))}u.length>0&&r.push({role:"tool",content:u})}if(n.prompt!==void 0?r.push({role:"user",content:n.prompt}):n.messages&&r.push(...n.messages),r.length===0)throw new I("agent.generate() requires `prompt`, `messages`, or `approvals` \u2014 nothing to do.");return{turn:r,claimed:o}}function Ui(e){let t=Me(e);dr(e);let n=lr(e),r=Di(t),o=_i(t),s=t.limits?.maxIterations??fr,i=t.limits?.maxToolCalls??mr,a=t.memory?.maxSessionMessages??pr,c=l=>({model:r,system:n,tools:o,stopWhen:l.stopWhen??[ki(s),Oi(i)],...l.prepareStep!==void 0?{prepareStep:l.prepareStep}:{},...l.activeTools!==void 0?{activeTools:l.activeTools}:{},...l.toolChoice!==void 0?{toolChoice:l.toolChoice}:{},...l.providerOptions!==void 0?{providerOptions:l.providerOptions}:{}});return{model:r,tools:o,instructions:n,session(l){return mt(e,l,t.memory)},sessions(l){return Vr(e,t.memory,l)},async generate(l){return F.startActiveSpan("agent.generate",{kind:zt.INTERNAL,attributes:{agent:e,model:t.model}},async u=>{let p=mt(e,l.sessionId,t.memory);u.setAttribute("sessionId",p.id),O("hasAi");let m=[];try{let g=await Bt(p,a),w=await Ni(p,g,l);m=w.claimed;let S;try{S=await Ci({...c(l),messages:[...g,...w.turn]})}catch(f){if(m.length>0)try{await p.addPendingApprovals(m),m=[]}catch(h){console.error(`[helix-sdk] agent "${e}" session "${p.id}": failed to restore ${m.length} pending approval(s) after a failed resume \u2014 ${h instanceof Error?h.message:String(h)}`)}throw f}let x=Gt(S.content),y=x.length>0?"awaiting-approval":"completed";return await p.append(...w.turn,...S.responseMessages),x.length>0&&await p.addPendingApprovals(x.map(Yr)),u.setAttributes({steps:S.steps.length,status:y}),u.setStatus({code:Se.OK}),Object.assign(S,{sessionId:p.id,status:y,...x.length>0?{pendingApprovals:x.map(Mi)}:{},helix:{cost:Li(S.steps,t.model),model:S.response.modelId??t.model}})}catch(g){throw u.setAttribute("status","error"),u.setStatus({code:Se.ERROR,message:g instanceof Error?g.message:String(g)}),g}finally{u.end()}})},async stream(l){let u=F.startSpan("agent.stream",{kind:zt.INTERNAL,attributes:{agent:e,model:t.model}}),p=!1,m=(g,w)=>{p||(p=!0,u.setAttribute("status",g),u.setStatus(g==="error"?{code:Se.ERROR,...w!==void 0?{message:w}:{}}:{code:Se.OK}),u.end())};try{let g=mt(e,l.sessionId,t.memory);if(u.setAttribute("sessionId",g.id),O("hasAi"),l.approvals&&l.approvals.length>0)throw new I("agent.stream() does not accept approvals \u2014 resume paused runs with generate().");if(l.prompt===void 0&&!l.messages)throw new I("agent.stream() requires `prompt` or `messages`.");let w=l.prompt!==void 0?[{role:"user",content:l.prompt}]:[...l.messages],S=await Bt(g,a),x=Jr.with(Pi.setSpan(Jr.active(),u),()=>Ti({...c(l),messages:[...S,...w],onFinish:async y=>{try{await g.append(...w,...y.responseMessages);let f=Gt(y.content);f.length>0&&await g.addPendingApprovals(f.map(Yr)),m(f.length>0?"awaiting-approval":"completed")}catch(f){let h=f instanceof Error?f.message:String(f);console.error(`[helix-sdk] agent "${e}" session "${g.id}": failed to persist the streamed turn \u2014 ${h}`),m("error",h)}},onError:({error:y})=>{m("error",y instanceof Error?y.message:String(y))},onAbort:()=>{m("error","stream aborted")}}));return Object.assign(x,{sessionId:g.id})}catch(g){throw m("error",g instanceof Error?g.message:String(g)),g}}}}var Qr="helix-schedule",Q=class extends Error{constructor(t){super(`defineSchedule: ${t}`),this.name="ScheduleConfigError"}};function Vd(e){if(typeof e!="object"||e===null)throw new Q("expected a config object");let{cron:t,timezone:n="UTC",concurrent:r=!1,handler:o}=e;if(typeof t!="string"||t.trim()==="")throw new Q("`cron` must be a non-empty string");let s=t.trim().split(/\s+/).length;if(s!==5)throw new Q(`\`cron\` must be a 5-field standard expression (minute hour day-of-month month day-of-week); got ${s} field(s) in "${t}"`);if(typeof n!="string"||!$i(n))throw new Q(`\`timezone\` must be a valid IANA timezone name (e.g. "Europe/London"); got "${String(n)}"`);if(typeof r!="boolean")throw new Q("`concurrent` must be a boolean");if(typeof o!="function")throw new Q("`handler` must be a function");return Object.freeze({kind:Qr,cron:t.trim(),timezone:n,concurrent:r,handler:o})}function zd(e){return typeof e=="object"&&e!==null&&e.kind===Qr&&typeof e.handler=="function"}function $i(e){if(!/^[A-Za-z]/.test(e))return!1;try{return new Intl.DateTimeFormat(void 0,{timeZone:e}),!0}catch{return!1}}import{SpanKind as ji}from"@opentelemetry/api";function gt(e,t,n){let r=F.startSpan("log",{kind:ji.INTERNAL});r.setAttribute("message",t),r.setAttribute("level",e),n&&Hn(r.spanContext().spanId,"properties",n),r.end(),kn(e,t,n)}function Zr(){return{info:(e,t)=>gt("info",e,t),warn:(e,t)=>gt("warn",e,t),error:(e,t)=>gt("error",e,t),debug:(e,t)=>gt("debug",e,t)}}function Zd(){try{return A().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}import Bi from"ky";import{context as Jt,trace as Ki,SpanKind as Ue,SpanStatusCode as to}from"@opentelemetry/api";async function eo(e){Sn(e.url);let t=E(),{region:n}=A(),r={authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},{headers:o,deploymentId:s}=z(t);s&&(r.deploymentId=s);let i=bn(n,t.mode==="lambda"?"runtime":"dev"),a;try{a=await vn({signUrl:i,credentialHeaders:o,body:r,timeoutMs:e.timeout,executionId:t.executionId})}catch(c){let l=c instanceof Error?c.message??String(c):String(c);throw d.brokerError(0,l)}if(a.kind==="brokerError"){let c=a.code===pe?"credential broker does not support the s3 sign endpoint required by this SDK version \u2014 deploy a newer broker or pin an older SDK":a.message;throw d.brokerError(a.status,c,k(a.body),a.code)}return a.result}var Hi=new Set([Ie,ze,te,Re,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id"]);function qi(e){let t=e.toLowerCase();return Hi.has(t)||t.startsWith("x-tray-internal-")}async function Vi(e,t){let n=e instanceof Request?e:new Request(e,t),r=new URL(n.url);if(r.protocol!=="https:")throw d.unsupportedScheme(r.protocol.replace(/:$/,""));let o=E(),{region:s}=A(),{headers:i,deploymentId:a}=z(o),c=fe(s,o.mode==="lambda"?"runtime":"dev"),l=new Headers;for(let[g,w]of n.headers.entries())qi(g)||l.append(g,w);l.set(Ie,n.url);for(let[g,w]of Object.entries(i))l.set(g,w);a&&l.set(te,a),o.executionId&&l.set(Re,o.executionId);let u={method:n.method,headers:l,redirect:"manual",signal:n.signal};n.body&&(u.body=n.body,u.duplex="half");let p;try{p=await fetch(c,u)}catch(g){throw g instanceof Error&&g.name==="AbortError"?g:d.brokerError(0,g instanceof Error?g.message:String(g))}let m=p.headers.get(Ge);return m!==null&&Vt(await hn(p,m)),p}var zi=["get","post","put","patch","delete","head","options"],ro="[stream body omitted]";function oo(e){return typeof ReadableStream<"u"&&e instanceof ReadableStream?ro:e instanceof ArrayBuffer?`[binary body: ${e.byteLength} bytes]`:ArrayBuffer.isView(e)?`[binary body: ${e.byteLength} bytes]`:typeof Blob<"u"&&e instanceof Blob?`[binary body: ${e.size} bytes]`:e}function Wt(e){try{return new URL(e).hostname}catch{return e}}function no(e,t,n,r,o){let s=Wt(t),i="externalApi",a={kind:Ue.CLIENT};return F.startActiveSpan(i,a,async c=>(c.setAttributes({method:e,host:s,"peer.service":r}),q(c,"request",{url:t,method:e,...n!==void 0?{body:oo(n)}:{}}),o(c)))}function Ne(e,t,n){e.setAttribute("status",t),e.setStatus(t==="success"?{code:to.OK}:{code:to.ERROR,message:n}),e.end()}var Gi=16;async function Ji(e,t){let n=e.clone().body;return n?so(n,t):new Uint8Array(0)}async function so(e,t){let n=e.getReader(),r=[],o=0,s=0;try{for(;;){let{done:c,value:l}=await n.read();if(c)break;if(!l||l.byteLength===0){if(s+=1,s>=Gi)break;continue}s=0;let u=t+1-o;if(l.byteLength>=u){r.push(l.slice(0,u)),o+=u;break}r.push(l),o+=l.byteLength}}finally{n.cancel().catch(()=>{}),n.releaseLock()}let i=new Uint8Array(o),a=0;for(let c of r)i.set(c,a),a+=c.byteLength;return i}async function io(e,t,n){if("kyResponse"in n)try{let r=await Ji(n.kyResponse,Te),o=new TextDecoder("utf-8").decode(r,{stream:!0}),s;try{s=JSON.parse(o)}catch{s=o}q(e,"response",s)}catch{q(e,"response",{status:t})}else q(e,"response",oo(n.bodyValue))}async function Wi(e,t){if(t instanceof ReadableStream){let n=e.body??t;try{let[r,o]=n.tee(),s=new Request(e,{body:r,duplex:"half"}),i=await so(o,Te);return{body:new TextDecoder("utf-8").decode(i,{stream:!0}),request:s}}catch{return{body:ro}}}return typeof t=="string"?{body:t}:{}}function wu(){let e=Bi.create({fetch:Vi,retry:{shouldRetry:({error:r})=>r instanceof d?!1:void 0}});function t(r){return(o,s)=>{let i=Jt.active(),a,c=!1,l=(p,m)=>{a&&!c&&(c=!0,Ne(a,p,m))},u=e.extend({hooks:{beforeRequest:[async(p,m)=>{let g=await Wi(p,m.body),w=g.body;if(a||(a=F.startSpan("externalApi",{kind:Ue.CLIENT},i)),a.setAttributes({method:p.method.toUpperCase(),host:Wt(p.url)}),q(a,"request",{url:p.url,method:p.method.toUpperCase(),...w!==void 0?{body:w}:{}}),c=!1,O("hasExternal"),g.request)return g.request}],beforeRetry:[p=>{l("error","retry"),a=void 0,c=!1}],afterResponse:[async(p,m,g)=>{a&&(a.setAttribute("statusCode",g.status),await io(a,g.status,{kyResponse:g}),g.ok?l("success"):s?.throwHttpErrors===!1&&(O("hasError"),l("error",`HTTP ${g.status}`)))}],beforeError:[p=>(O("hasError"),l("error",p.message),p)]}});return a=F.startSpan("externalApi",{kind:Ue.CLIENT},i),a.setAttributes({method:r.toUpperCase(),host:Wt(String(o))}),Jt.with(Ki.setSpan(Jt.active(),a),()=>{let p=r==="options"?u(o,{...s,method:"OPTIONS"}):u[r](o,s);return p.catch(m=>{O("hasError"),l("error",m instanceof Error?m.message:String(m))}),p})}}let n=Object.fromEntries(zi.map(r=>[r,t(r)]));return{...e,...n,authed(r){return Xi(r)}}}function Xi(e){let n=A().authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e];function o(i){return(a,c={})=>{let l=i.toUpperCase();return no(l,a,c.body,e,async u=>{O("hasAuth");let p=F.startSpan("auth",{kind:Ue.INTERNAL});p.setAttribute("alias",e),p.setAttribute("id",r),p.end();try{let m=ne({authenticationId:r,method:l,url:a,body:c.body,headers:c.headers,query:c.query}),g=await we(m,{timeout:c.timeout});return u.setAttribute("statusCode",g.status),await io(u,g.status,{bodyValue:g.body}),Ne(u,"success"),g}catch(m){throw O("hasError"),m instanceof d&&m.detail.kind==="broker_error"&&m.detail.status>0&&u.setAttribute("statusCode",m.detail.status),Ne(u,"error",m instanceof Error?m.message:String(m)),m}})}}function s(i,a={}){let c=a.method??"GET";return no(c,i,void 0,e,async l=>{O("hasAuth");let u=F.startSpan("auth",{kind:Ue.INTERNAL});u.setAttribute("alias",e),u.setAttribute("id",r),u.end();try{let p=await eo({authenticationId:r,url:i,method:c,...a.expiresIn!==void 0?{expiresIn:a.expiresIn}:{},...a.timeout!==void 0?{timeout:a.timeout}:{}});return l.setAttribute("statusCode",200),Ne(l,"success"),p}catch(p){throw O("hasError"),p instanceof d&&p.detail.kind==="broker_error"&&p.detail.status>0&&l.setAttribute("statusCode",p.detail.status),Ne(l,"error",p instanceof Error?p.message:String(p)),p}})}return{get:o("get"),post:o("post"),put:o("put"),patch:o("patch"),delete:o("delete"),head:o("head"),options:o("options"),s3Sign:s}}import{SpanKind as sa,SpanStatusCode as uo}from"@opentelemetry/api";function $e(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Yi=18e4,ao=Yi-1e4,Qi=2e3;async function co(e,t,n){let r=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),s=0;for(;Date.now()-o<ao;){let i=await e(t,"DescribeStatement",{Id:n}),a=i.Status;if(r.has(a))return i;let c=Math.min(Qi,200*2**s),l=c/2+Math.random()*(c/2),u=ao-(Date.now()-o);await new Promise(p=>setTimeout(p,Math.min(l,u))),s++}throw d.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var Zi=new Set(["SELECT","WITH","SHOW"]),ea=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function ta(e){if(!e.clusterIdentifier&&!e.workgroupName)throw d.dbInvalidParameters("either clusterIdentifier or workgroupName is required");if(e.clusterIdentifier&&e.workgroupName)throw d.dbInvalidParameters("clusterIdentifier and workgroupName are mutually exclusive (Provisioned vs Serverless)");if(!e.database)throw d.dbInvalidParameters("database is required");if(e.clusterIdentifier&&!e.dbUser)throw d.dbInvalidParameters("dbUser is required when using clusterIdentifier (Provisioned)");if(!e.region)throw d.dbInvalidParameters("region is required")}function na(e,t){let n=null;if(typeof t=="string")try{n=JSON.parse(t)}catch{}else t!==null&&typeof t=="object"&&(n=t);let r=typeof n?.__type=="string"?n.__type:void 0,o=typeof n?.message=="string"?n.message:void 0;if(r&&o)return d.dbQueryFailed(`${r}: ${o}`);let s=typeof t=="string"?re(t):k(t);return d.dbCallFailed(s)}function ra(e){if(e==null||typeof e!="string")return e;try{return JSON.parse(e)}catch{throw d.dbCallFailed("upstream body not JSON: "+e.slice(0,200))}}function oa(e,t){return typeof t!="number"||t<0?{}:Zi.has(e)?{rowsRead:t}:ea.has(e)?{rowsWritten:t}:{}}function lo(e){async function t(n,r,o){let s=ne({authenticationId:e,method:"POST",url:`https://redshift-data.${n}.amazonaws.com/`,body:o,headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`RedshiftData.${r}`}});try{let{status:i,body:a}=await we(s);if(i>=400)throw na(i,a);return ra(a)}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw d.dbCallFailed(a,i instanceof Error?i:void 0)}}return{system:"redshift",validate:ta,async execute(n,r){let o=$e(r),s={Sql:r,Database:n.database,...n.clusterIdentifier&&{ClusterIdentifier:n.clusterIdentifier,DbUser:n.dbUser},...n.workgroupName&&{WorkgroupName:n.workgroupName},...n.statementName&&{StatementName:n.statementName}},i=await t(n.region,"ExecuteStatement",s),a=i,c=typeof a?.Id=="string"?a.Id:void 0;if(!c){let g=k(i);throw d.dbCallFailed(`ExecuteStatement response missing Id; got: ${g}`)}let l=await co(t,n.region,c),u=l.Status;if(u==="FAILED"){let g=typeof l.Error=="string"?l.Error:"statement failed";throw d.dbQueryFailed(`${g} (statement: ${c})`)}if(u==="ABORTED")throw d.dbQueryFailed(`statement aborted (statement: ${c})`);let p=oa(o,l.ResultRows);return l.HasResultSet===!1?{result:{rowsAffected:l.ResultRows??0},metadata:p}:{result:await t(n.region,"GetStatementResult",{Id:c}),metadata:p}}}}var Xt=64*1024;function ia(e){return e.length>Xt?`${e.slice(0,Xt)}...[truncated]`:e}function aa(e,t,n,r,o){e.setAttributes({system:t.system,statement:o,namespace:n.database,operation:r})}function ca(e,t,n){let r=typeof t=="string"?t:JSON.stringify(t);return r.length>Xt?q(e,"result",{truncated:!0,size:r.length}):q(e,"result",t),n.rowsRead!==void 0&&e.setAttribute("rowsRead",n.rowsRead),n.rowsWritten!==void 0&&e.setAttribute("rowsWritten",n.rowsWritten),r}async function la(e,t,n){let r=$e(n),o=ia(n);return F.startActiveSpan("database",{kind:sa.CLIENT},async s=>{aa(s,e,t,r,o);try{O("hasDb");let{result:i,metadata:a}=await e.execute(t,n),c=ca(s,i,a);return s.setAttribute("status","success"),s.setStatus({code:uo.OK}),c}catch(i){O("hasError");let a=i instanceof Error?i.message:String(i);throw s.setAttribute("status","error"),s.setStatus({code:uo.ERROR,message:a}),i}finally{s.end()}})}function da(e){let n=A().authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e],o=lo(r);function s(i,a){return o.validate(i),la(o,i,a)}return{parameters(i){return{sql(a){return s(i,a)}}},sql(i){return s({},i)}}}import{createStorage as ga}from"unstorage";var po=1024,Yt=250*1024,ua=new TextEncoder,pa=/(^|\/)\.\.(\/|$)/,fa=/[?#]/,ma=/[\u0000-\u001F\u007F]/;function fo(e){if(e.length===0)throw d.kvKeyInvalid("Key must be a non-empty string");if(pa.test(e))throw d.kvKeyInvalid("Key contains path traversal segment");if(fa.test(e)||ma.test(e))throw d.kvKeyInvalid("Key contains illegal characters");if(e.startsWith("/")||e.endsWith("/")||e.split("/").some(n=>n===""))throw d.kvKeyInvalid("Key must not contain empty path segments");let t=ua.encode(e).length;if(t<1||t>po)throw d.kvKeyInvalid(`Key must be between 1 and ${po} UTF-8 bytes (got ${t})`)}function mo(e){if(!Number.isInteger(e)||e<=0)throw d.kvTtlInvalid(`ttl must be a positive integer number of seconds (got ${e})`)}function go(e){let t;try{t=JSON.stringify(e)}catch{throw d.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw d.kvValueInvalid("Value must be JSON-serializable");let n=Buffer.byteLength(t,"utf8");if(n>Yt)throw d.kvValueTooLarge(`Value exceeds maximum size of ${Yt} bytes (got ${n})`,Yt)}function je(e){fo(e)}function yt(e,t){let n=e[t];if(typeof n!="function")throw new Error(`KV driver is missing ${t}`);return n}function yo(e){let t=yt(e,"getItem"),n=yt(e,"setItem"),r=yt(e,"removeItem"),o=yt(e,"hasItem"),s=e.getKeys;return{...e,getItem(i,a){return je(i),t(i,a)},setItem(i,a,c){return je(i),n(i,a,c)},removeItem(i,a){return je(i),r(i,a)},hasItem(i,a){return je(i),o(i,a)},getKeys(i,a){return i.length>0&&je(i),s(i,a)}}}function ht(e){return ga({driver:yo(e)})}import{defineDriver as ya}from"unstorage";function ha(e){try{return JSON.parse(e)}catch{return e}}var wa=ya(e=>{let{client:t}=e;return{name:"helix-kv",async getItem(n){let r=await t.get(n);return r===null?null:JSON.stringify(r)},async setItem(n,r,o){let s=o?.ttl,i=ha(r);s!==void 0?await t.set(n,i,{ttl:s}):await t.set(n,i)},async removeItem(n){await t.delete(n)},async hasItem(n){return await t.has(n)},async getKeys(){throw new Error("KV key listing is not supported")}}});function ho(e){return wa({client:e})}import va from"ky";import{z as M}from"zod";function wo(e){return j(e).hosts.api}function Sa(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function ba(e){return e.split("/").map(encodeURIComponent).join("/")}function Be(e,t,n){return`${e}${Sa(t)}/${ba(n)}`}var xa=6e4,Qt=M.lazy(()=>M.union([M.string(),M.number(),M.boolean(),M.null(),M.array(Qt),M.record(Qt)])),Aa=M.object({projectId:M.string(),key:M.string(),value:Qt,type:M.enum(["string","number","boolean","null","array","object"]),organizationId:M.string(),scope:M.string(),createdBy:M.string(),createdAt:M.number(),updatedBy:M.string(),updatedAt:M.number()});function Ea(){let e=ue(),t=$(),n=!!(e&&e.trim().length>0),r=!!(t&&t.trim().length>0);if(!n&&!r)throw d.missingExecutionCredentials();let o={Accept:"application/json"};return n&&(o[de]=e),r&&(o[U]=t),o}function Ia(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function wt(e,t){throw d.kvCallFailed(e,Ia(t),k(t))}async function St(e,t,n={}){try{let r=await va(t,{method:e,headers:Ea(),...n.json!==void 0?{json:n.json}:{},throwHttpErrors:!1,timeout:xa}),o=e==="head"?void 0:await K(r);return{status:r.status,body:o}}catch(r){if(r instanceof d)throw r;let o=r instanceof Error?r.message??String(r):String(r);throw d.kvCallFailed(0,o)}}function So(e){let t=wo(e.env),{projectId:n}=e;return{async get(r){let{status:o,body:s}=await St("get",Be(t,n,r));if(o===404)return null;(o<200||o>=300)&&wt(o,s);let i=Aa.safeParse(s);if(!i.success)throw d.kvCallFailed(o,"platform returned malformed KeyValueEntry",k(s));return i.data.value},async set(r,o,s){let{status:i,body:a}=await St("put",Be(t,n,r),{json:s?.ttl!==void 0?{value:o,ttl:s.ttl}:{value:o}});(i<200||i>=300)&&wt(i,a)},async delete(r){let{status:o,body:s}=await St("delete",Be(t,n,r));o!==204&&wt(o,s)},async has(r){let{status:o,body:s}=await St("head",Be(t,n,r));if(o===200)return!0;if(o===404)return!1;wt(o,s)}}}function bt(e){return{getItem:t=>e.getItem(t),removeItem:t=>e.removeItem(t),hasItem:t=>e.hasItem(t),setItem:async(t,n,r)=>{let o=r?.ttl;go(n),typeof o=="number"&&mo(o),await e.setItem(t,n,o!==void 0?{ttl:o}:void 0)}}}function Ra(){let e=A();if(e.kind!=="provisioned")throw d.kvRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function bo(e){let t=Ra(),n=e??So(t),r=ht(ho(n));return bt(r)}import{defineDriver as Ca}from"unstorage";var Ta=Ca(e=>{let t=new Map;function n(r){let o=t.get(r);if(o&&o.expiresAt!==void 0&&o.expiresAt<=Date.now()){t.delete(r);return}return o}return{name:"memory-ttl",getItem(r){return n(r)?.value??null},setItem(r,o,s){let i=s?.ttl,a=n(r),c=typeof i=="number"?Date.now()+i*1e3:i===null?void 0:a?.expiresAt;t.set(r,{value:o,expiresAt:c})},removeItem(r){t.delete(r)},hasItem(r){return n(r)!==void 0},getKeys(){return[...t.keys()].filter(r=>n(r)!==void 0)},clear(){t.clear()}}});function vo(){return Ta({})}var Zt;function ka(){return Zt||(Zt=ht(vo())),Zt}function xo(){return bt(ka())}function Pa(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function xp(){return Pa()?bo():xo()}import{createHash as Da}from"crypto";import{mkdir as Ma,readFile as Co,readdir as To,rm as Eo,unlink as Fa,writeFile as Io}from"fs/promises";import{dirname as La}from"path";async function Oa(e){let t=e.getReader(),n=[],r=0;for(;;){let{done:o,value:s}=await t.read();if(o)break;if(s){if(r+=s.byteLength,r>G)throw await t.cancel(),d.filesValueTooLarge(`File exceeds maximum size of ${G} bytes (got more than ${G})`,G);n.push(s)}}return Buffer.concat(n)}async function be(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?Oa(e):Buffer.from(e)}var _a={pdf:"application/pdf",csv:"text/csv",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",json:"application/json",txt:"text/plain",html:"text/html",htm:"text/html",css:"text/css",js:"application/javascript",xml:"application/xml",zip:"application/zip"},Ao="application/octet-stream";function vt(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return Ao;let n=e.slice(t+1).toLowerCase();return _a[n]??Ao}function xe(){let e=E().projectRoot;if(!e)throw d.filesNotAvailable();return e}async function ve(e){try{return await e()}catch(t){if(t instanceof d)throw t;let n=t?.code;throw n?d.filesCallFailed(0,`Local file storage operation failed: ${n}`):d.filesCallFailed(0,"Local file storage operation failed: unknown error")}}function xt(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function en(e){try{let t=await Co(nt(xe(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ro(e){await Ma(La(e),{recursive:!0})}async function Na(e,t){let n=rt(e,t),r;try{r=await To(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return[];throw o}return r.filter(o=>o.isFile()).map(o=>t.length===0?o.name:`${t}/${o.name}`)}async function ko(e,t){let n=rt(e,t),r;try{r=await To(n,{withFileTypes:!0})}catch(s){if(s.code==="ENOENT")return[];throw s}let o=[];for(let s of r){let i=t.length===0?s.name:`${t}/${s.name}`;s.isDirectory()?o.push(...await ko(e,i)):s.isFile()&&o.push(i)}return o}function Po(){return{async put(e,t,n){return ve(async()=>{let r=xe(),o=await be(t),s=n?.contentType??vt(e),i=Da("sha1").update(o).digest("hex"),a=new Date,c=De(r,e);await Ro(c),await Io(c,o);let l={size:o.byteLength,contentType:s,lastModified:a.toISOString(),etag:i},u=nt(r,e);return await Ro(u),await Io(u,JSON.stringify(l)),xt(e,l)})},async get(e){return ve(async()=>{let t=await en(e);return t?{data:await Co(De(xe(),e)),metadata:xt(e,t)}:null})},async head(e){return ve(async()=>{let t=await en(e);return t?xt(e,t):null})},async delete(e){return ve(async()=>{let t=xe();await Promise.all([De(t,e),nt(t,e)].map(async n=>{try{await Fa(n)}catch(r){if(r.code!=="ENOENT")throw r}}))})},async deleteMany(e){return ve(async()=>{let t=xe(),n=await ko(t,e);return await Promise.all([Eo(rt(t,e),{recursive:!0,force:!0}),Eo(Xn(t,e),{recursive:!0,force:!0})]),{deleted:n.length}})},async list(e,t){return ve(async()=>{let n=xe(),r=t?.limit??100,s=(await Na(n,e??"")).slice(0,r);return{files:(await Promise.all(s.map(async a=>{let c=await en(a);return c?xt(a,c):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let n=E().devServerUrl;if(!n)throw d.filesNotAvailable();return{url:`${n}/_helix/files/${e}`,expiresAt:ge(t?.expiresIn)}},async getDownloadUrl(e,t){let n=E().devServerUrl;if(!n)throw d.filesNotAvailable();return{url:`${n}/_helix/files/${e}`,expiresAt:ge(t?.expiresIn)}}}}import{createHash as qa}from"crypto";function At(e){return j(e).hosts.api}function Ua(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function Ke(e,t){return`${e}${Ua(t)}`}function Ae(e,t,n){return`${Ke(e,t)}/${encodeURIComponent(n)}`}function Et(e,t,n){return`${Ae(e,t,n)}/upload`}function Oo(e,t,n){return`${Ae(e,t,n)}/download`}function _o(e,t,n){return`${Ae(e,t,n)}/signed-url`}function Do(e,t,n,r){let o=new URLSearchParams({name:r});return n&&o.set("parentFolder",n),`${Ke(e,t)}/file?${o.toString()}`}function Mo(e,t,n,r){let o=new URLSearchParams({limit:String(r)});return n&&o.set("id",n),`${Ke(e,t)}?${o.toString()}`}import nn from"ky";import{z as _}from"zod";var rn=6e4,Fo=_.object({id:_.string(),workspaceId:_.string(),projectId:_.string(),parentFolder:_.string().nullable().optional(),name:_.string(),size:_.number().nullable().optional(),objectType:_.enum(["Folder","File"]),contentType:_.string().nullable().optional(),createdAt:_.string(),updatedAt:_.string()}),$a=_.object({signedURL:_.string()}),ja=_.object({path:_.array(_.object({id:_.string(),name:_.string()})),elements:_.array(Fo)});function on(){let e=ue(),t=$(),n=!!(e&&e.trim().length>0),r=!!(t&&t.trim().length>0);if(!n&&!r)throw d.missingExecutionCredentials();let o={Accept:"application/json"};return n&&(o[de]=e),r&&(o[U]=t),o}function Lo(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function Z(e,t){throw d.filesCallFailed(e,Lo(t),k(t))}function Ba(e,t){return e===400&&Lo(t).toLowerCase()==="resource not found"}async function Ka(e){let t=new Response(e),n=t.headers.get("content-type")??"multipart/form-data",r=await t.arrayBuffer();return{body:Buffer.from(r),contentType:n}}async function Ee(e,t,n={}){try{let r=await nn(t,{method:e,headers:on(),...n.json!==void 0?{json:n.json}:{},throwHttpErrors:!1,timeout:rn}),o=await K(r);return{status:r.status,body:o}}catch(r){if(r instanceof d)throw r;let o=r instanceof Error?r.message:String(r);throw d.filesCallFailed(0,o)}}function tn(e,t){let n=Fo.safeParse(t);if(!n.success)throw d.filesCallFailed(e,"platform returned malformed ObjectMetadata",k(t));return n.data}function No(e){let t=At(e.env),{projectId:n}=e;return{async createMetadata(r){let{status:o,body:s}=await Ee("post",Ke(t,n),{json:r});return(o<200||o>=300)&&Z(o,s),tn(o,s)},async getByName(r,o){let{status:s,body:i}=await Ee("get",Do(t,n,r,o));return s===404||Ba(s,i)?null:((s<200||s>=300)&&Z(s,i),tn(s,i))},async getById(r){let{status:o,body:s}=await Ee("get",Ae(t,n,r));return o===404?null:((o<200||o>=300)&&Z(o,s),tn(o,s))},async listChildren(r,o){let{status:s,body:i}=await Ee("get",Mo(t,n,r,o));(s<200||s>=300)&&Z(s,i);let a=ja.safeParse(i);if(!a.success)throw d.filesCallFailed(s,"platform returned malformed listing",k(i));return a.data},async uploadContent(r,o,s,i){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:i}),s);let{body:c,contentType:l}=await Ka(a),u;try{u=await nn(Et(t,n,r),{method:"post",headers:{...on(),"content-type":l},body:new Uint8Array(c),throwHttpErrors:!1,timeout:rn})}catch(m){if(m instanceof d)throw m;let g=m instanceof Error?m.message:String(m);throw d.filesCallFailed(0,g)}let p=await K(u);(u.status<200||u.status>=300)&&Z(u.status,p)},async downloadContent(r){let o;try{o=await nn(Oo(t,n,r),{method:"get",headers:on(),throwHttpErrors:!1,timeout:rn})}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message:String(i);throw d.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let i=await K(o);Z(o.status,i)}let s=await o.arrayBuffer();return Buffer.from(s)},async getSignedDownloadUrl(r){let{status:o,body:s}=await Ee("get",_o(t,n,r));(o<200||o>=300)&&Z(o,s);let i=$a.safeParse(s);if(!i.success)throw d.filesCallFailed(o,"platform returned malformed signed URL response",k(s));return i.data.signedURL},async deleteById(r){let{status:o,body:s}=await Ee("delete",Ae(t,n,r));o===204||o===404||(o<200||o>=300)&&Z(o,s)}}}function sn(e){return e.split("/").filter(t=>t.length>0)}function an(e){return e instanceof d&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ha(e,t,n){let r=await e.getByName(t,n);if(r)return r;try{return await e.createMetadata({parentFolder:t,objectType:"Folder",name:n})}catch(o){if(an(o)){let s=await e.getByName(t,n);if(s)return s}throw o}}async function cn(e,t){let n=sn(t),r=n[n.length-1],o;for(let s of n.slice(0,-1))o=(await Ha(e,o,s)).id;return{parentFolder:o,name:r}}async function He(e,t){let n=sn(t),r=n[n.length-1],o;for(let s of n.slice(0,-1)){let i=await e.getByName(o,s);if(!i||i.objectType!=="Folder")return null;o=i.id}return{parentFolder:o,name:r}}async function ln(e,t){if(t.length===0)return;let n=sn(t),r;for(let o of n){let s=await e.getByName(r,o);if(!s||s.objectType!=="Folder")return null;r=s.id}return r}var Va=500,za=8;async function Ga(e,t,n){let r=new Array(e.length),o=0;async function s(){for(;o<e.length;){let i=o++;r[i]=await n(e[i])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}function Ja(){let e=A();if(e.kind!=="provisioned")throw d.filesRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Wa(e){return qa("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function It(e,t,n){return{path:e,size:t.size??0,contentType:t.contentType??n??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:Wa(t)}}async function Uo(e,t,n,r){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:r,name:n})}catch(o){if(an(o)){let s=await e.getByName(t,n);if(s)return s}throw o}}async function $o(e,t){let{elements:n}=await e.listChildren(t,Va);return(await Ga(n,za,async o=>{let s=o.objectType==="Folder"?await $o(e,o.id):1;return await e.deleteById(o.id),s})).reduce((o,s)=>o+s,0)}function jo(e){let t=Ja(),n=e??No(t),r=At(t.env),{projectId:o}=t;return{async put(s,i,a){let{parentFolder:c,name:l}=await cn(n,s),u=await be(i),p=a?.contentType??vt(s),m=await n.getByName(c,l);if(m&&m.objectType!=="File")throw d.filesCallFailed(409,`A folder already exists at "${s}"`);let g=m??await Uo(n,c,l,p);await n.uploadContent(g.id,u,l,p);let w=await n.getById(g.id);return It(s,w??g,p)},async get(s){let i=await He(n,s);if(!i)return null;let a=await n.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:{data:await n.downloadContent(a.id),metadata:It(s,a)}},async head(s){let i=await He(n,s);if(!i)return null;let a=await n.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:It(s,a)},async delete(s){let i=await He(n,s);if(!i)return;let a=await n.getByName(i.parentFolder,i.name);a&&await n.deleteById(a.id)},async deleteMany(s){let i=await ln(n,s);if(i===null)return{deleted:0};let a=await $o(n,i);return s.length>0&&i!==void 0&&await n.deleteById(i),{deleted:a}},async list(s,i){let a=await ln(n,s??"");if(a===null)return{files:[],cursor:null};let c=i?.limit??100,{elements:l}=await n.listChildren(a,c);return{files:l.filter(p=>p.objectType==="File").map(p=>It(s?`${s}/${p.name}`:p.name,p)),cursor:null}},async getUploadUrl(s,i){let{parentFolder:a,name:c}=await cn(n,s),u=await n.getByName(a,c)??await Uo(n,a,c,i?.contentType);return{url:Et(r,o,u.id),expiresAt:ge(i?.expiresIn)}},async getDownloadUrl(s,i){let a=await He(n,s),c=a?await n.getByName(a.parentFolder,a.name):null;if(!c||c.objectType!=="File")throw d.filesCallFailed(404,`File not found: ${s}`);return{url:await n.getSignedDownloadUrl(c.id),expiresAt:ge(i?.expiresIn)}}}}function dn(e,t){let n=t?.maxPathBytes;return{async put(r,o,s){ie(r,n);let i=await be(o);return Jn(i.byteLength),e.put(r,i,s)},async get(r){return ie(r,n),e.get(r)},async head(r){return ie(r,n),e.head(r)},async delete(r){return ie(r,n),e.delete(r)},async deleteMany(r){let o=Mt(r);return et(o,n),e.deleteMany(o)},async list(r,o){let s=Mt(r??"");return et(s,n),e.list(s,o)},async getUploadUrl(r,o){return ie(r,n),e.getUploadUrl(r,o)},async getDownloadUrl(r,o){return ie(r,n),e.getDownloadUrl(r,o)}}}function Xa(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function gf(){if(Xa())return dn(jo());let e=E().projectRoot;return dn(Po(),{maxPathBytes:e?Wn(e):void 0})}import Qa from"ky";function Bo(e){return j(e).hosts.api}function Ya(){return"/private/v1/helix/function-calls"}function Ko(e){return`${e}${Ya()}`}var Za=5e3;function ec(){let e=$();if(!!!(e&&e.trim().length>0))throw d.callFunctionMissingExecutionJwt();return{Accept:"application/json",[U]:e}}function tc(e,t){throw d.callFunctionCallFailed(e,nc(t),k(t))}function nc(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function Ho(e){let t=Bo(e.env);return{async callAsync(n,r){let o,s;try{let i=await Qa(Ko(t),{method:"post",headers:ec(),json:{functionPath:n,input:r},throwHttpErrors:!1,timeout:Za});o=i.status,s=await K(i)}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw d.callFunctionCallFailed(0,a)}(o<200||o>=300)&&tc(o,s)}}}var qo=1024;function Rt(e){if(typeof e!="string"||e.trim().length===0)throw d.callFunctionPathInvalid("functionPath must be a non-empty string");if(e.length>qo)throw d.callFunctionPathInvalid(`functionPath must be at most ${qo} characters`)}function rc(){let e=A();if(e.kind!=="provisioned")throw d.callFunctionRequiresProvisioning();return{env:e.region}}function Vo(e){return async function(n,r){Rt(n),await(e??Ho(rc())).callAsync(n,r)}}function zo(){return async function(t,n){Rt(t);let r=E().devServerUrl;if(!r)throw d.callFunctionNotAvailable();let o=t.startsWith("/")?t:`/${t}`,s=Zr();fetch(`${r}${o}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n??{})}).then(i=>{i.ok||s.warn("ctx.callFunctionAsync: dev-mode dispatch returned a non-2xx response",{functionPath:t,status:i.status})}).catch(i=>{s.warn("ctx.callFunctionAsync: dev-mode dispatch failed",{functionPath:t,error:i instanceof Error?i.message:String(i)})})}}function oc(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function Bf(){return oc()?Vo():zo()}export{sc as a,ic as b,ac as c,A as d,cc as e,Kn as f,gs as g,O as h,q as i,bs as j,vs as k,F as l,xs as m,Lc as n,Zr as o,Zd as p,wu as q,da as r,xp as s,ie as t,De as u,nt as v,gf as w,Bf as x,qc as y,Ft as z,Zn as A,er as B,tr as C,st as D,nr as E,Zc as F,sr as G,Lt as H,Us as I,Bs as J,Ks as K,el as L,Hs as M,tl as N,Xl as O,ir as P,sl as Q,ar as R,I as S,ul as T,pl as U,Me as V,fl as W,ml as X,ur as Y,Sl as Z,bl as _,X as $,Al as aa,Oi as ba,Ui as ca,Qr as da,Q as ea,Vd as fa,zd as ga};
|