@trayai/helix-sdk 0.71.0 → 0.72.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 +10 -0
- package/dist/index.js +9 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,16 @@ general availability, minor versions may include breaking changes.
|
|
|
9
9
|
The SDK and [`@trayai/helix-cli`](https://www.npmjs.com/package/@trayai/helix-cli) are
|
|
10
10
|
released together and share a version — install matching versions.
|
|
11
11
|
|
|
12
|
+
## 0.72.0
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- Spans emitted by the SDK now include the full operation payloads. The function
|
|
16
|
+
span carries its request (headers and body), response, input, and output;
|
|
17
|
+
outbound HTTP spans carry their request and response; database spans carry the
|
|
18
|
+
query result. Previously spans recorded only summary fields such as method,
|
|
19
|
+
route, and status. Payloads are size-capped and sensitive request headers are
|
|
20
|
+
redacted.
|
|
21
|
+
|
|
12
22
|
## 0.70.0
|
|
13
23
|
|
|
14
24
|
No user-visible changes in this release — co-versioned with `@trayai/helix-cli`'s changes.
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{a as wt,b as
|
|
2
|
-
`)}finally{t!==void 0&&clearTimeout(t)}}function
|
|
3
|
-
`)}catch{}}var
|
|
4
|
-
`)}catch{}}var
|
|
5
|
-
`+Nt(String(r.attributes.method??""),String(r.attributes.route??"")))}onEnd(t){let r=t.attributes;switch(t.name){case"log":{let n=t.spanContext().spanId,o=
|
|
6
|
-
`)}finally{r!==void 0&&clearTimeout(r)}})()),await Promise.all(t)}var
|
|
7
|
-
`+Ht(r,s,l));return}Vt({_otel:"summary",executionId:e,deploymentId:t,triggerType:"http",routeOrJob:r,status:s?"error":"success",startedAt:n,finishedAt:d,durationMs:l,userId:a,hasError:s||c.hasError,hasAuth:c.hasAuth,hasExternal:c.hasExternal,hasDb:c.hasDb,errorSummary:s&&i!==null?_(i):null})}async function En(e,t){let r=e.startMs??Date.now();Ue();let n=!1,o=null;try{return await pe.run(e.executionId,()=>R.startActiveSpan("App",{kind:dn.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 n=a>=400,s.setAttribute("http.response.status_code",a),s.setAttribute("helix.status",n?"error":"success"),s.setStatus({code:n?Fe.ERROR:Fe.OK}),i}catch(i){throw n=!0,o=i instanceof Error?i.message:String(i),s.setAttribute("http.response.status_code",500),s.setAttribute("helix.status","error"),s.setStatus({code:Fe.ERROR,message:o}),i}finally{s.end()}}))}finally{$e({executionId:e.executionId,deploymentId:e.deploymentId,routeOrJob:`${e.method} ${e.route}`,startedAt:e.startedAt,startMs:r,errored:n,errorMessage:o,userId:e.userId,flags:{hasDb:!1,hasExternal:!1,hasAuth:!1,hasError:!1}}),await Me()}}import{defineEventHandler as Ho,getMethod as Ko,getRequestURL as qo,getHeaders as Ur,getHeader as Br}from"h3";import{readBody as Sn,getQuery as xn,getRouterParams as Cn}from"h3";async function Wt(e,t){let r=await Rn(e),n=xn(e),o=Cn(e)??{},s={...n,...r,...o};return t?kn(s,t):s}async function Rn(e){try{let t=await Sn(e);return t&&typeof t=="object"?t:(t!=null&&t!==""&&console.warn("[helix-sdk] Request body present but not a JSON object \u2014 ignored"),{})}catch(t){if(t instanceof Error&&"statusCode"in t&&t.statusCode===400){let n=new Error("Malformed request body");throw n.statusCode=400,n.data={message:"Request body is not valid JSON"},n}let r=e.method?.toUpperCase();if(r==="GET"||r==="HEAD"||r==="DELETE")return{};throw t}}function kn(e,t){let r=t.safeParse(e);if(!r.success){let n=new Error("Input validation failed");throw n.statusCode=400,n.data=r.error.flatten(),n}return r.data}import{SpanKind as Tn}from"@opentelemetry/api";function ge(e,t,r){let n=R.startSpan("log",{kind:Tn.INTERNAL});n.setAttribute("message",t),n.setAttribute("level",e),r&&x(n.spanContext().spanId,"properties",r),n.end(),Dt(e,t,r)}function zt(){return{info:(e,t)=>ge("info",e,t),warn:(e,t)=>ge("warn",e,t),error:(e,t)=>ge("error",e,t),debug:(e,t)=>ge("debug",e,t)}}var Z=class extends Error{statusCode;constructor(t,r){super(r),this.statusCode=t,this.name="HttpError"}};function Jt(e){return t=>{e.node.res.statusCode=t}}function Yt(){return(e,t)=>{throw new Z(e,t)}}import An from"ky";import{context as He,trace as _n,SpanKind as he,SpanStatusCode as Zt}from"@opentelemetry/api";import In from"ky";async function Gt(e,t={}){let r=O(),n=I(),o=!!(r&&r.trim().length>0),s=!!(n&&n.trim().length>0);if(!o&&!s)throw u.missingExecutionCredentials();let{env:i}=E(),a=ie(i),c=t.timeout??6e4,d={Accept:"application/json"};o&&(d[D]=r),s&&(d[T]=n);let l=y().deploymentId,m=l?{...e,deploymentId:l}:e,f=await In.post(`${a}/broker/http`,{json:m,headers:d,throwHttpErrors:!1,timeout:c}),p;return(f.headers.get("content-type")??"").includes("application/json")?p=await f.json():p=await f.text(),{status:f.status,body:p}}import Pn from"ky";async function Xt(e,t={}){let r=mt();if(!r)throw u.missingTrayToken();let{env:n}=E(),o=ie(n),s=t.timeout??6e4,i=await Pn.post(`${o}/broker/http/dev`,{json:e,headers:{Authorization:`Bearer ${r}`,Accept:"application/json"},throwHttpErrors:!1,timeout:s}),a;return(i.headers.get("content-type")??"").includes("application/json")?a=await i.json():a=await i.text(),{status:i.status,body:a}}async function ye(e,t={}){let r=y().mode==="lambda"?Gt:Xt,n;try{n=await r(e,t)}catch(a){if(a instanceof u)throw a;let c=a instanceof Error?a.message??String(a):String(a);throw u.brokerError(0,c)}let{status:o,body:s}=n;if(o<200||o>=300){let a;if(s!==null&&typeof s=="object"){let c=s;typeof c.message=="string"?a=c.message:typeof c.error=="string"?a=c.error:a=String(s)}else a=String(s);throw u.brokerError(o,a,v(s))}let i=bt.safeParse(s);if(!i.success)throw u.brokerError(o,"broker returned malformed response",v(s));return Et(i.data)}var Dn=["get","post","put","patch","delete","head","options"],Qt="[stream body omitted]";function Ke(e){try{return new URL(e).hostname}catch{return e}}function On(e,t,r,n){let o=Ke(t),s="externalApi",i={kind:he.CLIENT};return R.startActiveSpan(s,i,async a=>{let c=a.spanContext().spanId;return a.setAttributes({method:e,host:o}),x(c,"request",{url:t,method:e,...r!==void 0?{body:r instanceof ReadableStream?Qt:r}:{}}),n(a,c)})}function qe(e,t,r){e.setAttribute("status",t),e.setStatus(t==="success"?{code:Zt.OK}:{code:Zt.ERROR,message:r}),e.end()}var Fn=16;async function Ln(e,t){let r=e.clone().body;return r?er(r,t):new Uint8Array(0)}async function er(e,t){let r=e.getReader(),n=[],o=0,s=0;try{for(;;){let{done:c,value:d}=await r.read();if(c)break;if(!d||d.byteLength===0){if(s+=1,s>=Fn)break;continue}s=0;let l=t+1-o;if(d.byteLength>=l){n.push(d.slice(0,l)),o+=l;break}n.push(d),o+=d.byteLength}}finally{r.cancel().catch(()=>{}),r.releaseLock()}let i=new Uint8Array(o),a=0;for(let c of n)i.set(c,a),a+=c.byteLength;return i}async function tr(e,t,r){if("kyResponse"in r)try{let n=await Ln(r.kyResponse,j),o=new TextDecoder("utf-8").decode(n,{stream:!0}),s;if(n.length<=j)try{s=JSON.parse(o)}catch{s=o}else s=o;x(e,"response",s)}catch{x(e,"response",{status:t})}else x(e,"response",r.bodyValue)}async function jn(e,t){if(t instanceof ReadableStream){let r=e.body??t;try{let[n,o]=r.tee(),s=new Request(e,{body:n,duplex:"half"}),i=await er(o,j);return{body:new TextDecoder("utf-8").decode(i,{stream:!0}),request:s}}catch{return{body:Qt}}}return typeof t=="string"?{body:t}:{}}function rr(){let e=An.create({});function t(n){return(o,s)=>{let i=He.active(),a,c="",d=!1,l=(f,p)=>{a&&!d&&(d=!0,qe(a,f,p))},m=e.extend({hooks:{beforeRequest:[async(f,p)=>{let g=await jn(f,p.body),w=g.body;if(a||(a=R.startSpan("externalApi",{kind:he.CLIENT},i),c=a.spanContext().spanId),a.setAttributes({method:f.method.toUpperCase(),host:Ke(f.url)}),x(c,"request",{url:f.url,method:f.method.toUpperCase(),...w!==void 0?{body:w}:{}}),d=!1,C("hasExternal"),g.request)return g.request}],beforeRetry:[f=>{l("error","retry"),a=void 0,c="",d=!1}],afterResponse:[async(f,p,g)=>{a&&(a.setAttribute("statusCode",g.status),await tr(c,g.status,{kyResponse:g}),g.ok?l("success"):s?.throwHttpErrors===!1&&(C("hasError"),l("error",`HTTP ${g.status}`)))}],beforeError:[f=>(C("hasError"),l("error",f.message),f)]}});return a=R.startSpan("externalApi",{kind:he.CLIENT},i),c=a.spanContext().spanId,a.setAttributes({method:n.toUpperCase(),host:Ke(String(o))}),He.with(_n.setSpan(He.active(),a),()=>{let f=n==="options"?m(o,{...s,method:"OPTIONS"}):m[n](o,s);return f.catch(p=>{C("hasError"),l("error",p instanceof Error?p.message:String(p))}),f})}}let r=Object.fromEntries(Dn.map(n=>[n,t(n)]));return{...e,...r,authed(n){return Nn(n)}}}function Nn(e){let r=E().authentications??{};if(!r[e])throw u.unknownAlias(e,Object.keys(r));let n=r[e];function o(s){return(i,a={})=>{let c=s.toUpperCase();return On(c,i,a.body,async(d,l)=>{C("hasAuth");let m=R.startSpan("auth",{kind:he.INTERNAL});m.setAttribute("alias",e),m.setAttribute("id",n),m.end();try{let f=z({authenticationId:n,method:c,url:i,body:a.body,headers:a.headers,query:a.query}),p=await ye(f,{timeout:a.timeout});return d.setAttribute("statusCode",p.status),await tr(l,p.status,{bodyValue:p.body}),qe(d,"success"),p}catch(f){throw C("hasError"),f instanceof u&&f.detail.kind==="broker_error"&&f.detail.status>0&&d.setAttribute("statusCode",f.detail.status),qe(d,"error",f instanceof Error?f.message:String(f)),f}})}}return{get:o("get"),post:o("post"),put:o("put"),patch:o("patch"),delete:o("delete"),head:o("head"),options:o("options")}}import{SpanKind as Wn,SpanStatusCode as ir}from"@opentelemetry/api";function Q(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Bn=18e4,nr=Bn-1e4,Un=2e3;async function or(e,t,r){let n=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),s=0;for(;Date.now()-o<nr;){let i=await e(t,"DescribeStatement",{Id:r}),a=i.Status;if(n.has(a))return i;let c=Math.min(Un,200*2**s),d=c/2+Math.random()*(c/2),l=nr-(Date.now()-o);await new Promise(m=>setTimeout(m,Math.min(d,l))),s++}throw u.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var Mn=new Set(["SELECT","WITH","SHOW"]),$n=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function Hn(e){if(!e.clusterIdentifier&&!e.workgroupName)throw u.dbInvalidParameters("either clusterIdentifier or workgroupName is required");if(e.clusterIdentifier&&e.workgroupName)throw u.dbInvalidParameters("clusterIdentifier and workgroupName are mutually exclusive (Provisioned vs Serverless)");if(!e.database)throw u.dbInvalidParameters("database is required");if(e.clusterIdentifier&&!e.dbUser)throw u.dbInvalidParameters("dbUser is required when using clusterIdentifier (Provisioned)");if(!e.region)throw u.dbInvalidParameters("region is required")}function Kn(e,t){let r=null;if(typeof t=="string")try{r=JSON.parse(t)}catch{}else t!==null&&typeof t=="object"&&(r=t);let n=typeof r?.__type=="string"?r.__type:void 0,o=typeof r?.message=="string"?r.message:void 0;if(n&&o)return u.dbQueryFailed(`${n}: ${o}`);let s=typeof t=="string"?_(t):v(t);return u.dbCallFailed(s)}function qn(e){if(e==null||typeof e!="string")return e;try{return JSON.parse(e)}catch{throw u.dbCallFailed("upstream body not JSON: "+e.slice(0,200))}}function Vn(e,t){return typeof t!="number"||t<0?{}:Mn.has(e)?{rowsRead:t}:$n.has(e)?{rowsWritten:t}:{}}function sr(e){async function t(r,n,o){let s=z({authenticationId:e,method:"POST",url:`https://redshift-data.${r}.amazonaws.com/`,body:o,headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`RedshiftData.${n}`}});try{let{status:i,body:a}=await ye(s);if(i>=400)throw Kn(i,a);return qn(a)}catch(i){if(i instanceof u)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw u.dbCallFailed(a,i instanceof Error?i:void 0)}}return{system:"redshift",validate:Hn,async execute(r,n){let o=Q(n),s={Sql:n,Database:r.database,...r.clusterIdentifier&&{ClusterIdentifier:r.clusterIdentifier,DbUser:r.dbUser},...r.workgroupName&&{WorkgroupName:r.workgroupName},...r.statementName&&{StatementName:r.statementName}},i=await t(r.region,"ExecuteStatement",s),a=i,c=typeof a?.Id=="string"?a.Id:void 0;if(!c){let p=v(i);throw u.dbCallFailed(`ExecuteStatement response missing Id; got: ${p}`)}let d=await or(t,r.region,c),l=d.Status;if(l==="FAILED"){let p=typeof d.Error=="string"?d.Error:"statement failed";throw u.dbQueryFailed(`${p} (statement: ${c})`)}if(l==="ABORTED")throw u.dbQueryFailed(`statement aborted (statement: ${c})`);let m=Vn(o,d.ResultRows);return d.HasResultSet===!1?{result:{rowsAffected:d.ResultRows??0},metadata:m}:{result:await t(r.region,"GetStatementResult",{Id:c}),metadata:m}}}}var Ve=64*1024;function zn(e){return e.length>Ve?`${e.slice(0,Ve)}...[truncated]`:e}function Jn(e,t,r,n,o){e.setAttributes({system:t.system,statement:o,namespace:r.database,operation:n})}function Yn(e,t,r,n){let o=typeof r=="string"?r:JSON.stringify(r);return o.length>Ve?x(t,"result",{truncated:!0,size:o.length}):x(t,"result",r),n.rowsRead!==void 0&&e.setAttribute("rowsRead",n.rowsRead),n.rowsWritten!==void 0&&e.setAttribute("rowsWritten",n.rowsWritten),o}async function Gn(e,t,r){let n=Q(r),o=zn(r);return R.startActiveSpan("database",{kind:Wn.CLIENT},async s=>{let i=s.spanContext().spanId;Jn(s,e,t,n,o);try{C("hasDb");let{result:a,metadata:c}=await e.execute(t,r),d=Yn(s,i,a,c);return s.setAttribute("status","success"),s.setStatus({code:ir.OK}),d}catch(a){C("hasError");let c=a instanceof Error?a.message:String(a);throw s.setAttribute("status","error"),s.setStatus({code:ir.ERROR,message:c}),a}finally{s.end()}})}function We(e){let r=E().authentications??{};if(!r[e])throw u.unknownAlias(e,Object.keys(r));let n=r[e],o=sr(n);function s(i,a){return o.validate(i),Gn(o,i,a)}return{parameters(i){return{sql(a){return s(i,a)}}},sql(i){return s({},i)}}}import{createStorage as to}from"unstorage";var ar=1024,ze=250*1024,Xn=new TextEncoder,Zn=/(^|\/)\.\.(\/|$)/,Qn=/[?#]/,eo=/[\u0000-\u001F\u007F]/;function cr(e){if(e.length===0)throw u.kvKeyInvalid("Key must be a non-empty string");if(Zn.test(e))throw u.kvKeyInvalid("Key contains path traversal segment");if(Qn.test(e)||eo.test(e))throw u.kvKeyInvalid("Key contains illegal characters");if(e.startsWith("/")||e.endsWith("/")||e.split("/").some(r=>r===""))throw u.kvKeyInvalid("Key must not contain empty path segments");let t=Xn.encode(e).length;if(t<1||t>ar)throw u.kvKeyInvalid(`Key must be between 1 and ${ar} UTF-8 bytes (got ${t})`)}function ur(e){let t;try{t=JSON.stringify(e)}catch{throw u.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw u.kvValueInvalid("Value must be JSON-serializable");let r=Buffer.byteLength(t,"utf8");if(r>ze)throw u.kvValueTooLarge(`Value exceeds maximum size of ${ze} bytes (got ${r})`,ze)}function ee(e){cr(e)}function we(e,t){let r=e[t];if(typeof r!="function")throw new Error(`KV driver is missing ${t}`);return r}function dr(e){let t=we(e,"getItem"),r=we(e,"setItem"),n=we(e,"removeItem"),o=we(e,"hasItem"),s=e.getKeys;return{...e,getItem(i,a){return ee(i),t(i,a)},setItem(i,a,c){return ee(i),r(i,a,c)},removeItem(i,a){return ee(i),n(i,a)},hasItem(i,a){return ee(i),o(i,a)},getKeys(i,a){return i.length>0&&ee(i),s(i,a)}}}function ve(e){return to({driver:dr(e)})}import{defineDriver as ro}from"unstorage";function no(e){try{return JSON.parse(e)}catch{return e}}var oo=ro(e=>{let{client:t}=e;return{name:"helix-kv",async getItem(r){let n=await t.get(r);return n===null?null:JSON.stringify(n)},async setItem(r,n){await t.set(r,no(n))},async removeItem(r){await t.delete(r)},async hasItem(r){return await t.has(r)},async getKeys(){throw new Error("KV key listing is not supported")}}});function lr(e){return oo({client:e})}import ao from"ky";import{z as b}from"zod";async function U(e){let t=e.headers.get("content-type")??"",r=await e.text();if(r.length!==0)return t.includes("application/json")?JSON.parse(r):r}function fr(e){return F(e).hosts.api}function so(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function io(e){return e.split("/").map(encodeURIComponent).join("/")}function te(e,t,r){return`${e}${so(t)}/${io(r)}`}var co=6e4,Je=b.lazy(()=>b.union([b.string(),b.number(),b.boolean(),b.null(),b.array(Je),b.record(Je)])),uo=b.object({projectId:b.string(),key:b.string(),value:Je,type:b.enum(["string","number","boolean","null","array","object"]),organizationId:b.string(),scope:b.string(),createdBy:b.string(),createdAt:b.number(),updatedBy:b.string(),updatedAt:b.number()});function lo(){let e=O(),t=I(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw u.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[D]=e),n&&(o[T]=t),o}function fo(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 be(e,t){throw u.kvCallFailed(e,fo(t),v(t))}async function Ee(e,t,r={}){try{let n=await ao(t,{method:e,headers:lo(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:co}),o=e==="head"?void 0:await U(n);return{status:n.status,body:o}}catch(n){if(n instanceof u)throw n;let o=n instanceof Error?n.message??String(n):String(n);throw u.kvCallFailed(0,o)}}function pr(e){let t=fr(e.env),{projectId:r}=e;return{async get(n){let{status:o,body:s}=await Ee("get",te(t,r,n));if(o===404)return null;(o<200||o>=300)&&be(o,s);let i=uo.safeParse(s);if(!i.success)throw u.kvCallFailed(o,"platform returned malformed KeyValueEntry",v(s));return i.data.value},async set(n,o){let{status:s,body:i}=await Ee("put",te(t,r,n),{json:{value:o}});(s<200||s>=300)&&be(s,i)},async delete(n){let{status:o,body:s}=await Ee("delete",te(t,r,n));o!==204&&be(o,s)},async has(n){let{status:o,body:s}=await Ee("head",te(t,r,n));if(o===200)return!0;if(o===404)return!1;be(o,s)}}}function Se(e){return{getItem:(t,r)=>e.getItem(t,r),removeItem:(t,r)=>e.removeItem(t,r),hasItem:(t,r)=>e.hasItem(t,r),setItem:async(t,r,n)=>{ur(r),await e.setItem(t,r,n)}}}function po(){let e=E();if(e.kind!=="provisioned")throw u.kvRequiresProvisioning();return{projectId:e.projectId,env:e.env}}function mr(e){let t=po(),r=e??pr(t),n=ve(lr(r));return Se(n)}import mo from"unstorage/drivers/memory";var Ye;function go(){return Ye||(Ye=ve(mo())),Ye}function gr(){return Se(go())}function yo(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":y().mode==="lambda"}function yr(){return yo()?mr():gr()}import{createHash as vo}from"crypto";import{mkdir as bo,readFile as Er,readdir as Sr,rm as wr,unlink as Eo,writeFile as vr}from"fs/promises";import{dirname as So}from"path";async function ho(e){let t=e.getReader(),r=[],n=0;for(;;){let{done:o,value:s}=await t.read();if(o)break;if(s){if(n+=s.byteLength,n>J)throw await t.cancel(),u.filesValueTooLarge(`File exceeds maximum size of ${J} bytes (got more than ${J})`,J);r.push(s)}}return Buffer.concat(r)}async function M(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?ho(e):Buffer.from(e)}var wo={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"},hr="application/octet-stream";function xe(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return hr;let r=e.slice(t+1).toLowerCase();return wo[r]??hr}function H(){let e=y().projectRoot;if(!e)throw u.filesNotAvailable();return e}async function $(e){try{return await e()}catch(t){if(t instanceof u)throw t;let r=t?.code;throw r?u.filesCallFailed(0,`Local file storage operation failed: ${r}`):u.filesCallFailed(0,"Local file storage operation failed: unknown error")}}function Ce(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function Ge(e){try{let t=await Er(ce(H(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function br(e){await bo(So(e),{recursive:!0})}async function xo(e,t){let r=ue(e,t),n;try{n=await Sr(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return[];throw o}return n.filter(o=>o.isFile()).map(o=>t.length===0?o.name:`${t}/${o.name}`)}async function xr(e,t){let r=ue(e,t),n;try{n=await Sr(r,{withFileTypes:!0})}catch(s){if(s.code==="ENOENT")return[];throw s}let o=[];for(let s of n){let i=t.length===0?s.name:`${t}/${s.name}`;s.isDirectory()?o.push(...await xr(e,i)):s.isFile()&&o.push(i)}return o}function Cr(){return{async put(e,t,r){return $(async()=>{let n=H(),o=await M(t),s=r?.contentType??xe(e),i=vo("sha1").update(o).digest("hex"),a=new Date,c=ae(n,e);await br(c),await vr(c,o);let d={size:o.byteLength,contentType:s,lastModified:a.toISOString(),etag:i},l=ce(n,e);return await br(l),await vr(l,JSON.stringify(d)),Ce(e,d)})},async get(e){return $(async()=>{let t=await Ge(e);return t?{data:await Er(ae(H(),e)),metadata:Ce(e,t)}:null})},async head(e){return $(async()=>{let t=await Ge(e);return t?Ce(e,t):null})},async delete(e){return $(async()=>{let t=H();await Promise.all([ae(t,e),ce(t,e)].map(async r=>{try{await Eo(r)}catch(n){if(n.code!=="ENOENT")throw n}}))})},async deleteMany(e){return $(async()=>{let t=H(),r=await xr(t,e);return await Promise.all([wr(ue(t,e),{recursive:!0,force:!0}),wr(Ct(t,e),{recursive:!0,force:!0})]),{deleted:r.length}})},async list(e,t){return $(async()=>{let r=H(),n=t?.limit??100,s=(await xo(r,e??"")).slice(0,n);return{files:(await Promise.all(s.map(async a=>{let c=await Ge(a);return c?Ce(a,c):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let r=y().devServerUrl;if(!r)throw u.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:L(t?.expiresIn)}},async getDownloadUrl(e,t){let r=y().devServerUrl;if(!r)throw u.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:L(t?.expiresIn)}}}}import{createHash as Ao}from"crypto";function Re(e){return F(e).hosts.api}function Co(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function re(e,t){return`${e}${Co(t)}`}function K(e,t,r){return`${re(e,t)}/${encodeURIComponent(r)}`}function ke(e,t,r){return`${K(e,t,r)}/upload`}function Rr(e,t,r){return`${K(e,t,r)}/download`}function kr(e,t,r){return`${K(e,t,r)}/signed-url`}function Tr(e,t,r,n){let o=new URLSearchParams({name:n});return r&&o.set("parentFolder",r),`${re(e,t)}/file?${o.toString()}`}function Ir(e,t,r,n){let o=new URLSearchParams({limit:String(n)});return r&&o.set("id",r),`${re(e,t)}?${o.toString()}`}import Ze from"ky";import{z as h}from"zod";var Qe=6e4,Pr=h.object({id:h.string(),workspaceId:h.string(),projectId:h.string(),parentFolder:h.string().nullable().optional(),name:h.string(),size:h.number().nullable().optional(),objectType:h.enum(["Folder","File"]),contentType:h.string().nullable().optional(),createdAt:h.string(),updatedAt:h.string()}),Ro=h.object({signedURL:h.string()}),ko=h.object({path:h.array(h.object({id:h.string(),name:h.string()})),elements:h.array(Pr)});function et(){let e=O(),t=I(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw u.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[D]=e),n&&(o[T]=t),o}function Ar(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 P(e,t){throw u.filesCallFailed(e,Ar(t),v(t))}function To(e,t){return e===400&&Ar(t).toLowerCase()==="resource not found"}async function Io(e){let t=new Response(e),r=t.headers.get("content-type")??"multipart/form-data",n=await t.arrayBuffer();return{body:Buffer.from(n),contentType:r}}async function q(e,t,r={}){try{let n=await Ze(t,{method:e,headers:et(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:Qe}),o=await U(n);return{status:n.status,body:o}}catch(n){if(n instanceof u)throw n;let o=n instanceof Error?n.message:String(n);throw u.filesCallFailed(0,o)}}function Xe(e,t){let r=Pr.safeParse(t);if(!r.success)throw u.filesCallFailed(e,"platform returned malformed ObjectMetadata",v(t));return r.data}function _r(e){let t=Re(e.env),{projectId:r}=e;return{async createMetadata(n){let{status:o,body:s}=await q("post",re(t,r),{json:n});return(o<200||o>=300)&&P(o,s),Xe(o,s)},async getByName(n,o){let{status:s,body:i}=await q("get",Tr(t,r,n,o));return s===404||To(s,i)?null:((s<200||s>=300)&&P(s,i),Xe(s,i))},async getById(n){let{status:o,body:s}=await q("get",K(t,r,n));return o===404?null:((o<200||o>=300)&&P(o,s),Xe(o,s))},async listChildren(n,o){let{status:s,body:i}=await q("get",Ir(t,r,n,o));(s<200||s>=300)&&P(s,i);let a=ko.safeParse(i);if(!a.success)throw u.filesCallFailed(s,"platform returned malformed listing",v(i));return a.data},async uploadContent(n,o,s,i){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:i}),s);let{body:c,contentType:d}=await Io(a),l;try{l=await Ze(ke(t,r,n),{method:"post",headers:{...et(),"content-type":d},body:new Uint8Array(c),throwHttpErrors:!1,timeout:Qe})}catch(f){if(f instanceof u)throw f;let p=f instanceof Error?f.message:String(f);throw u.filesCallFailed(0,p)}let m=await U(l);(l.status<200||l.status>=300)&&P(l.status,m)},async downloadContent(n){let o;try{o=await Ze(Rr(t,r,n),{method:"get",headers:et(),throwHttpErrors:!1,timeout:Qe})}catch(i){if(i instanceof u)throw i;let a=i instanceof Error?i.message:String(i);throw u.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let i=await U(o);P(o.status,i)}let s=await o.arrayBuffer();return Buffer.from(s)},async getSignedDownloadUrl(n){let{status:o,body:s}=await q("get",kr(t,r,n));(o<200||o>=300)&&P(o,s);let i=Ro.safeParse(s);if(!i.success)throw u.filesCallFailed(o,"platform returned malformed signed URL response",v(s));return i.data.signedURL},async deleteById(n){let{status:o,body:s}=await q("delete",K(t,r,n));o===204||o===404||(o<200||o>=300)&&P(o,s)}}}function tt(e){return e.split("/").filter(t=>t.length>0)}function rt(e){return e instanceof u&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Po(e,t,r){let n=await e.getByName(t,r);if(n)return n;try{return await e.createMetadata({parentFolder:t,objectType:"Folder",name:r})}catch(o){if(rt(o)){let s=await e.getByName(t,r);if(s)return s}throw o}}async function nt(e,t){let r=tt(t),n=r[r.length-1],o;for(let s of r.slice(0,-1))o=(await Po(e,o,s)).id;return{parentFolder:o,name:n}}async function ne(e,t){let r=tt(t),n=r[r.length-1],o;for(let s of r.slice(0,-1)){let i=await e.getByName(o,s);if(!i||i.objectType!=="Folder")return null;o=i.id}return{parentFolder:o,name:n}}async function ot(e,t){if(t.length===0)return;let r=tt(t),n;for(let o of r){let s=await e.getByName(n,o);if(!s||s.objectType!=="Folder")return null;n=s.id}return n}var _o=500,Do=8;async function Oo(e,t,r){let n=new Array(e.length),o=0;async function s(){for(;o<e.length;){let i=o++;n[i]=await r(e[i])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),n}function Fo(){let e=E();if(e.kind!=="provisioned")throw u.filesRequiresProvisioning();return{projectId:e.projectId,env:e.env}}function Lo(e){return Ao("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function Te(e,t,r){return{path:e,size:t.size??0,contentType:t.contentType??r??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:Lo(t)}}async function Dr(e,t,r,n){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:n,name:r})}catch(o){if(rt(o)){let s=await e.getByName(t,r);if(s)return s}throw o}}async function Or(e,t){let{elements:r}=await e.listChildren(t,_o);return(await Oo(r,Do,async o=>{let s=o.objectType==="Folder"?await Or(e,o.id):1;return await e.deleteById(o.id),s})).reduce((o,s)=>o+s,0)}function Fr(e){let t=Fo(),r=e??_r(t),n=Re(t.env),{projectId:o}=t;return{async put(s,i,a){let{parentFolder:c,name:d}=await nt(r,s),l=await M(i),m=a?.contentType??xe(s),f=await r.getByName(c,d);if(f&&f.objectType!=="File")throw u.filesCallFailed(409,`A folder already exists at "${s}"`);let p=f??await Dr(r,c,d,m);await r.uploadContent(p.id,l,d,m);let g=await r.getById(p.id);return Te(s,g??p,m)},async get(s){let i=await ne(r,s);if(!i)return null;let a=await r.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:{data:await r.downloadContent(a.id),metadata:Te(s,a)}},async head(s){let i=await ne(r,s);if(!i)return null;let a=await r.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:Te(s,a)},async delete(s){let i=await ne(r,s);if(!i)return;let a=await r.getByName(i.parentFolder,i.name);a&&await r.deleteById(a.id)},async deleteMany(s){let i=await ot(r,s);if(i===null)return{deleted:0};let a=await Or(r,i);return s.length>0&&i!==void 0&&await r.deleteById(i),{deleted:a}},async list(s,i){let a=await ot(r,s??"");if(a===null)return{files:[],cursor:null};let c=i?.limit??100,{elements:d}=await r.listChildren(a,c);return{files:d.filter(m=>m.objectType==="File").map(m=>Te(s?`${s}/${m.name}`:m.name,m)),cursor:null}},async getUploadUrl(s,i){let{parentFolder:a,name:c}=await nt(r,s),l=await r.getByName(a,c)??await Dr(r,a,c,i?.contentType);return{url:ke(n,o,l.id),expiresAt:L(i?.expiresIn)}},async getDownloadUrl(s,i){let a=await ne(r,s),c=a?await r.getByName(a.parentFolder,a.name):null;if(!c||c.objectType!=="File")throw u.filesCallFailed(404,`File not found: ${s}`);return{url:await r.getSignedDownloadUrl(c.id),expiresAt:L(i?.expiresIn)}}}}function st(e,t){let r=t?.maxPathBytes;return{async put(n,o,s){A(n,r);let i=await M(o);return St(i.byteLength),e.put(n,i,s)},async get(n){return A(n,r),e.get(n)},async head(n){return A(n,r),e.head(n)},async delete(n){return A(n,r),e.delete(n)},async deleteMany(n){let o=Ae(n);return _e(o,r),e.deleteMany(o)},async list(n,o){let s=Ae(n??"");return _e(s,r),e.list(s,o)},async getUploadUrl(n,o){return A(n,r),e.getUploadUrl(n,o)},async getDownloadUrl(n,o){return A(n,r),e.getDownloadUrl(n,o)}}}function jo(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":y().mode==="lambda"}function Lr(){if(jo())return st(Fr());let e=y().projectRoot;return st(Cr(),{maxPathBytes:e?xt(e):void 0})}function jr(e,t){let{statusCode:r,message:n}=No(t.detail);return e.node.res.statusCode=r,{error:n,statusCode:r}}function No(e){switch(e.kind){case"unknown_alias":return{statusCode:400,message:"Unknown authentication alias"};case"input_validation_failed":return{statusCode:400,message:"Input validation failed"};case"output_validation_failed":return{statusCode:500,message:"Internal server error"};case"config_load_failed":return{statusCode:500,message:"Configuration error"};case"broker_error":return{statusCode:502,message:"Broker error"};case"unsupported_body_type":return{statusCode:400,message:"Unsupported request body type"};case"unsupported_scheme":return{statusCode:400,message:"Unsupported URL scheme"};case"missing_execution_credentials":return{statusCode:401,message:"Missing execution credentials"};case"missing_tray_token":return{statusCode:500,message:"Missing Tray token"};case"db_call_failed":return{statusCode:502,message:e.message};case"db_query_failed":return{statusCode:502,message:`Database query failed: ${e.message}`};case"db_invalid_parameters":return{statusCode:400,message:e.message};case"kv_key_invalid":return{statusCode:400,message:e.message};case"kv_value_invalid":return{statusCode:400,message:e.message};case"kv_value_too_large":return{statusCode:400,message:e.message};case"kv_not_available":return{statusCode:501,message:"Key-value store is not available in this environment"};case"kv_call_failed":return{statusCode:502,message:"Key-value store request failed"};case"kv_requires_provisioning":return{statusCode:500,message:"Internal server error"};case"files_path_invalid":return{statusCode:400,message:e.message};case"files_value_invalid":return{statusCode:400,message:e.message};case"files_value_too_large":return{statusCode:400,message:e.message};case"files_not_available":return{statusCode:501,message:"File storage is not available in this environment"};case"files_call_failed":return{statusCode:502,message:"File storage request failed"};case"files_requires_provisioning":return{statusCode:500,message:"Internal server error"};default:return{statusCode:500,message:`Unhandled error kind: ${e.kind}`}}}var Bo=["authorization","x-tray-token","set-cookie","x-kong-request-id","traceparent","x-real-ip","cookie"];function Uo(e){return e.toLowerCase().includes("tray_lid")}function it(e){let t={};for(let[r,n]of Object.entries(e))if(!Bo.includes(r.toLowerCase())){if(r.toLowerCase()==="cookie"&&n){let o=n.split(";").map(s=>s.trim()).filter(s=>{let i=s.split("=")[0].trim();return!Uo(i)}).join("; ");o&&(t[r]=o);continue}t[r]=n}return t}function Vo(e,t){let{inputSchema:r,outputSchema:n}=Xo(t),o=e;return Ho(async s=>{let i=y(),{executionId:a,userId:c,deploymentId:d}=Zo(i,s),l=Date.now(),m=new Date().toISOString(),f=Ko(s),p=qo(s).pathname,g=Qo(),w=zt(),V=`${f} ${p}`;Ue();let W={hasDb:!1,hasExternal:!1,hasAuth:!1,hasError:!1};return Wo(()=>me.run(W,()=>pe.run(a,async()=>{let se=await zo(s,r);if(!se.ok)return{response:se.response,errored:!1,errorMessage:null};let zr=ts(s,se.input,g,w,f,p,a,d,c);return Jo(o,zr,n,s,w,a,d,{method:f,path:p,rawInput:se.input})})),{executionId:a,deploymentId:d,routeOrJob:V,startedAt:m,startMs:l,userId:c,flags:W})})}async function Wo(e,t){let r=!1,n=null;try{let o=await e();return r=o.errored,n=o.errorMessage,o.response}finally{$e({...t,errored:r,errorMessage:n}),await Me()}}async function zo(e,t){try{return{ok:!0,input:await Wt(e,t)}}catch(r){let n=es(e,r);if(n)return{ok:!1,response:n};throw r}}async function Jo(e,t,r,n,o,s,i,a){return R.startActiveSpan("function",{root:!0,kind:$o.SERVER,attributes:{method:a.method,route:a.path,executionId:s,...i?{deploymentId:i}:{}}},async c=>{t.traceId=c.spanContext().traceId;let d=it(Ur(n)),l=c.spanContext().spanId;x(l,"input",a.rawInput),x(l,"request",{method:a.method,path:a.path,headers:d,body:a.rawInput});let m=!1,f=null,p,g;try{let w=await wt.run(t,()=>e(t));if(p=w,w==null)n.node.res.statusCode=204,g="";else if(w instanceof Response)g=w;else if(r){let V=r.safeParse(w);if(!V.success){let W=Object.keys(V.error.flatten().fieldErrors);throw o.error("Output validation failed",{fields:W,executionId:s}),u.outputValidationFailed(W)}g=V.data}else g=w}catch(w){m=!0,f=w instanceof Error?w.message:String(w),C("hasError"),g=Yo(w,n,o,s)}finally{Go(c,n,{errored:m,errorMessage:f,handlerResult:p,response:g})}return{response:g,errored:m,errorMessage:f}})}function Yo(e,t,r,n){if(e instanceof Z)return t.node.res.statusCode=e.statusCode,{error:e.message,statusCode:e.statusCode};if(vt(e))return jr(t,e);r.error("Unhandled error in handler",{error:e instanceof Error?e.message:String(e),executionId:n}),t.node.res.statusCode=500;let o=process.env.NODE_ENV==="development";return{error:o&&e instanceof Error?e.message:"Internal server error",statusCode:500,...o&&e instanceof Error&&e.stack?{stack:e.stack}:{}}}function Go(e,t,r){let n=e.spanContext().spanId;e.setAttribute("statusCode",t.node.res.statusCode),!r.errored&&r.handlerResult!==void 0&&x(n,"output",r.handlerResult),x(n,"response",r.response);let o=me.getStore();e.setAttribute("hasAuth",o?.hasAuth??!1),e.setAttribute("hasExternal",o?.hasExternal??!1),e.setAttribute("hasDb",o?.hasDb??!1),e.setAttribute("status",r.errored?"error":"success");let s=r.errored||(o?.hasError??!1);e.setStatus({code:s?Nr.ERROR:Nr.OK,...r.errorMessage?{message:r.errorMessage}:{}}),e.end()}function Xo(e){if(!e)return{inputSchema:void 0,outputSchema:void 0};if(e instanceof Object&&"_def"in e)return{inputSchema:e,outputSchema:void 0};if(typeof e=="object"&&("input"in e||"output"in e)){let t=e;return{inputSchema:t.input,outputSchema:t.output}}return{inputSchema:e,outputSchema:void 0}}function Zo(e,t){let r=e.mode==="lambda",n=(r?e.executionId:Br(t,"x-tray-execution-id"))??Mo(),o=(r?e.userId:Br(t,"x-tray-user-id"))??null,s=r?e.deploymentId??null:null;return{executionId:n,userId:o,deploymentId:s}}function Qo(){try{return E().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}function es(e,t){if(!(t instanceof Error)||!("statusCode"in t)||!("data"in t))return null;let r=t.statusCode,n=t.data;e.node.res.statusCode=r;let o=n&&typeof n=="object"&&"fieldErrors"in n?n.fieldErrors:void 0;return{error:"Input validation failed",statusCode:r,...o?{fields:Object.keys(o)}:{}}}function ts(e,t,r,n,o,s,i,a,c){return{input:t,method:o,path:s,headers:it(Ur(e)),http:rr(),db:d=>We(d),kv:()=>yr(),files:()=>Lr(),log:n,config:r,status:Jt(e),error:Yt(),state:{},request:e,executionId:i,deploymentId:a,userId:c,identity:c!==null?{user:{id:c}}:null,traceId:""}}function rs(e){return e}import{resolve as at}from"path";import{existsSync as $r}from"fs";import{loadConfig as ss}from"c12";import{z as S}from"zod";import{z as ns}from"zod";var os=["production"],Ie=ns.string().refine(e=>gt(e),e=>({message:`Invalid enum value. Expected ${yt().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));var ct=S.string().uuid("projectId must be a valid UUID"),ut=S.string().min(1,"workspaceId must be a non-empty string"),is=S.object({name:S.string().min(1,"name is required"),projectId:ct.optional(),workspaceId:ut.optional(),env:Ie.default("production"),authentications:S.record(S.string()).optional().default({}),config:S.record(S.unknown()).optional().default({})}),Mr=S.object({name:S.string().min(1,"name is required"),workspaceId:ut.optional(),env:Ie,authentications:S.record(S.string()),config:S.record(S.unknown())}),as=S.discriminatedUnion("kind",[Mr.extend({kind:S.literal("provisioned"),projectId:ct}),Mr.extend({kind:S.literal("unprovisioned")})]),Hr=["helix","tray"],Kr=["ts","mts","cts","js","mjs","cjs"];function Pe(e){for(let t of Hr)for(let r of Kr){let n=at(e,`${t}.config.${r}`);if($r(n))return n}}function cs(e){for(let t of Hr)if(Kr.some(r=>$r(at(e,`${t}.config.${r}`))))return t;return"helix"}function dt(e){return{name:cs(e),cwd:e,rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function lt(e,t){if(e!==null&&typeof e=="object"&&"extends"in e)throw u.configLoadFailed(`helix.config.ts at ${t}: 'extends' is not supported \u2014 remove the field`);let r=is.safeParse(e);if(!r.success){let d=r.error.issues.map(l=>l.message).join("; ");throw u.configLoadFailed(`Invalid helix.config.ts at ${t}: ${d}`)}let{projectId:n,workspaceId:o,...s}=r.data,i=o!==void 0?{workspaceId:o}:{},a=ht(),c=a!==void 0?{...s,env:a}:s;return n!==void 0?{kind:"provisioned",projectId:n,...c,...i}:{kind:"unprovisioned",...c,...i}}async function oe(e){let t=e??process.cwd(),r;try{r=await ss(dt(t))}catch(o){throw u.configLoadFailed(`Failed to load helix.config.ts: ${o instanceof Error?o.message:String(o)}`)}let n=r._configFile??Pe(t);if(!n)throw u.configLoadFailed(`helix.config.ts not found at ${at(t,"helix.config.ts")}`);return lt(r.config,n)}var qr="WORKSPACE_ID_REQUIRED";function us(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:qr});return e.workspaceId}import{existsSync as ds,watch as ls,writeSync as fs}from"fs";import{join as ps,resolve as ms}from"path";import{watchConfig as gs}from"c12";function ys(e,t){let r=e instanceof Error?e.message:String(e);fs(2,`[helix-watch] ${t.phase} error: ${r}
|
|
8
|
-
`)}function
|
|
9
|
-
`),
|
|
1
|
+
import{a as wt,b as Yr}from"./chunk-L6J5L3JQ.js";import{a as k,b as D,d as y,e as O,f as T,g as pt,j as b,l as V,m as I,n as Ie,o as Ae,p as St,q as L,r as xt,s as ie,t as ae,u as ce,v as Ct}from"./chunk-KURGNIK4.js";import{a as q,b as se,c as bt,d as Et}from"./chunk-5XNPF4RA.js";import{b as gt,d as F,e as yt,i as ht,l as c,m as vt}from"./chunk-ATJUJXR7.js";import{randomUUID as $o}from"crypto";import{SpanStatusCode as Br,SpanKind as Ho}from"@opentelemetry/api";import{AsyncLocalStorage as qt}from"async_hooks";import{trace as dn,SpanKind as ln,SpanStatusCode as Oe}from"@opentelemetry/api";import{ExportResultCode as fn,W3CTraceContextPropagator as mn}from"@opentelemetry/core";import{NodeTracerProvider as pn,SimpleSpanProcessor as gn,BatchSpanProcessor as yn}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Gr}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as Xr}from"@opentelemetry/exporter-logs-otlp-proto";function _e(e){return F(e).hosts.ingest}function Zr(){return T()??""}function Rt(){return{[k]:Zr()}}function kt(){let e=_e(b().env);return new Gr({url:`${e}/v1/traces`,headers:()=>Promise.resolve(Rt())})}function Tt(){let e=_e(b().env);return new Xr({url:`${e}/v1/logs`,headers:()=>Promise.resolve(Rt())})}import{logs as At,SeverityNumber as ue}from"@opentelemetry/api-logs";import{LoggerProvider as tn,BatchLogRecordProcessor as rn}from"@opentelemetry/sdk-logs";function W(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function Qr(e){return new TextEncoder().encode(e).length}var Pt="\u2026[truncated]",en=Qr(Pt),z=4096;function A(e,t=z){let r=new TextEncoder().encode(e);if(r.length<=t)return e;let n=r.subarray(0,t-en);return new TextDecoder("utf-8").decode(n).replace(/�$/,"")+Pt}function h(e,t=z){return A(W(e),t)}var nn="@trayai/helix-sdk",J,It={debug:{number:ue.DEBUG,text:"DEBUG"},info:{number:ue.INFO,text:"INFO"},warn:{number:ue.WARN,text:"WARN"},error:{number:ue.ERROR,text:"ERROR"}};function on(){return y().mode==="lambda"?[new rn({exporter:Tt()})]:[]}function _t(){if(J!==void 0)return;let e=on();e.length!==0&&(J=new tn({processors:e}),At.setGlobalLoggerProvider(J))}function sn(e,t,r){let n=It[e]??It.info;return{severityNumber:n.number,severityText:n.text,body:t,...r?{attributes:{"tray.log.meta":h(r)}}:{}}}function Dt(e,t,r){At.getLogger(nn).emit(sn(e,t,r))}async function Ot(e=2e3){if(J===void 0)return;let t;try{await Promise.race([J.forceFlush(),new Promise(r=>{t=setTimeout(r,e)})])}catch(r){process.stderr.write(`[helix-sdk] otel log flush failed: ${r instanceof Error?r.message:String(r)}
|
|
2
|
+
`)}finally{t!==void 0&&clearTimeout(t)}}function De(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function an(){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 R(e,t){return an()?`\x1B[${e}m${t}\x1B[0m`:t}var cn=5,un={FN:"1;35",INFO:"34",AUTH:"35",API:"36",WARN:"33",ERROR:"31",DEBUG:"90"},Ft="32",Lt="31",de="2",jt="1";function le(e){return R(un[e]??"0",e.padEnd(cn))}function Nt(e,t){return`${le("FN")} ${R(jt,`${e} ${t}`.trim())}`}function Bt(e,t,r,n){let o=e.toUpperCase(),i=`${n?`${R(de,n)} `:""}${le(o)} ${t}`;return r&&Object.keys(r).length>0&&(i+=` ${R(de,W(r))}`),i}function Ut(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Mt(e){return`${le("AUTH")} ${e}`}function $t(e,t,r,n,o){let s=r===void 0?"ERR":String(r),i=R(o==="error"?Lt:Ft,s);return`${le("API")} ${e} ${t} \u2192 ${i} ${R(de,`${n}ms`)}`}function Ht(e,t,r){let n=t?Lt:Ft,o=R(n,"\u25CF"),s=R(n,t?"error":"success");return`${o} ${R(jt,e)} ${s} ${R(de,`${r}ms`)}`}function j(e){try{process.stdout.write(e+`
|
|
3
|
+
`)}catch{}}var fe=new qt,me=new qt;function x(e){let t=me.getStore();t&&(t[e]=!0)}var hn=/^[0-9a-f]{32}$/;function wn(e){let t=e.replace(/-/g,"").toLowerCase();return hn.test(t)?t:null}var vn={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},N=new Map;function Vt(e,t,r){let n=N.get(e);n?n[t]=r:N.set(e,{[t]:r})}function S(e,t,r){e.setAttribute(t,h(r))}var Y;function Kt(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function bn(e){return Math.round(e[0]*1e3+e[1]/1e6)}function Wt(e){try{process.stdout.write(W(e)+`
|
|
4
|
+
`)}catch{}}var Fe=class{export(t,r){for(let n of t){let o=n.spanContext().spanId,s=N.get(o),i={...n.attributes};if(s!==void 0){for(let[d,f]of Object.entries(s))typeof f=="string"?i[d]=A(f):typeof f=="object"&&f!==null?i[d]=h(f):i[d]=f;N.delete(o)}let a=fe.getStore(),u=a?wn(a):null;Wt({_otel:"span",traceId:u??n.spanContext().traceId,spanId:o,parentSpanId:n.parentSpanContext?.spanId??"",name:n.name,kind:n.kind,startTimeUnixNano:Kt(n.startTime),endTimeUnixNano:Kt(n.endTime),attributes:i,status:{code:vn[n.status.code]??"STATUS_CODE_UNSET",...n.status.message?{message:A(n.status.message)}:{}}})}r({code:fn.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Le=class{onStart(t,r){}onEnd(t){N.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},je=class{onStart(t){let r=t;(r.name==="function"||r.name==="App")&&j(`
|
|
5
|
+
`+Nt(String(r.attributes.method??""),String(r.attributes.route??"")))}onEnd(t){let r=t.attributes;switch(t.name){case"log":{let n=t.spanContext().spanId,o=N.get(n)?.properties;j(Bt(String(r.level??"info"),String(r.message??""),o,Ut(t.startTime)));break}case"auth":j(Mt(String(r.alias??"")));break;case"externalApi":{let n=typeof r.statusCode=="number"?r.statusCode:void 0;j($t(String(r.method??""),String(r.host??""),n,bn(t.duration),r.status==="error"?"error":"success"));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Ne=class{constructor(t){this.inner=t}inner;onStart(t,r){this.inner.onStart(t,r)}onEnd(t){t.name!=="log"&&this.inner.onEnd(t)}forceFlush(){return this.inner.forceFlush()}shutdown(){return this.inner.shutdown()}};function En(){let t=[De()?new je:new gn(new Fe)];return y().mode==="lambda"&&t.push(new Ne(new yn(kt()))),t.push(new Le),t}function Be(){Y===void 0&&(Y=new pn({spanProcessors:En()}),Y.register({propagator:new mn}),_t())}async function Ue(e=2e3){let t=[Ot(e)];Y!==void 0&&t.push((async()=>{let r;try{await Promise.race([Y.forceFlush(),new Promise(n=>{r=setTimeout(n,e)})])}catch(n){process.stderr.write(`[helix-sdk] otel flush failed: ${n instanceof Error?n.message:String(n)}
|
|
6
|
+
`)}finally{r!==void 0&&clearTimeout(r)}})()),await Promise.all(t)}var C=dn.getTracer("@trayai/helix-sdk");function Me({executionId:e,deploymentId:t,routeOrJob:r,startedAt:n,startMs:o,errored:s,errorMessage:i,userId:a,flags:u}){let d=new Date().toISOString(),f=Date.now()-o;if(De()){j(`
|
|
7
|
+
`+Ht(r,s,f));return}Wt({_otel:"summary",executionId:e,deploymentId:t,triggerType:"http",routeOrJob:r,status:s?"error":"success",startedAt:n,finishedAt:d,durationMs:f,userId:a,hasError:s||u.hasError,hasAuth:u.hasAuth,hasExternal:u.hasExternal,hasDb:u.hasDb,errorSummary:s&&i!==null?A(i):null})}async function Sn(e,t){let r=e.startMs??Date.now();Be();let n=!1,o=null;try{return await fe.run(e.executionId,()=>C.startActiveSpan("App",{kind:ln.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 n=a>=400,s.setAttribute("http.response.status_code",a),s.setAttribute("helix.status",n?"error":"success"),s.setStatus({code:n?Oe.ERROR:Oe.OK}),i}catch(i){throw n=!0,o=i instanceof Error?i.message:String(i),s.setAttribute("http.response.status_code",500),s.setAttribute("helix.status","error"),s.setStatus({code:Oe.ERROR,message:o}),i}finally{s.end()}}))}finally{Me({executionId:e.executionId,deploymentId:e.deploymentId,routeOrJob:`${e.method} ${e.route}`,startedAt:e.startedAt,startMs:r,errored:n,errorMessage:o,userId:e.userId,flags:{hasDb:!1,hasExternal:!1,hasAuth:!1,hasError:!1}}),await Ue()}}import{defineEventHandler as Ko,getMethod as qo,getRequestURL as Vo,getHeaders as Mr,getHeader as Ur}from"h3";import{readBody as xn,getQuery as Cn,getRouterParams as Rn}from"h3";async function zt(e,t){let r=await kn(e),n=Cn(e),o=Rn(e)??{},s={...n,...r,...o};return t?Tn(s,t):s}async function kn(e){try{let t=await xn(e);return t&&typeof t=="object"?t:(t!=null&&t!==""&&console.warn("[helix-sdk] Request body present but not a JSON object \u2014 ignored"),{})}catch(t){if(t instanceof Error&&"statusCode"in t&&t.statusCode===400){let n=new Error("Malformed request body");throw n.statusCode=400,n.data={message:"Request body is not valid JSON"},n}let r=e.method?.toUpperCase();if(r==="GET"||r==="HEAD"||r==="DELETE")return{};throw t}}function Tn(e,t){let r=t.safeParse(e);if(!r.success){let n=new Error("Input validation failed");throw n.statusCode=400,n.data=r.error.flatten(),n}return r.data}import{SpanKind as Pn}from"@opentelemetry/api";function pe(e,t,r){let n=C.startSpan("log",{kind:Pn.INTERNAL});n.setAttribute("message",t),n.setAttribute("level",e),r&&Vt(n.spanContext().spanId,"properties",r),n.end(),Dt(e,t,r)}function Jt(){return{info:(e,t)=>pe("info",e,t),warn:(e,t)=>pe("warn",e,t),error:(e,t)=>pe("error",e,t),debug:(e,t)=>pe("debug",e,t)}}var G=class extends Error{statusCode;constructor(t,r){super(r),this.statusCode=t,this.name="HttpError"}};function Yt(e){return t=>{e.node.res.statusCode=t}}function Gt(){return(e,t)=>{throw new G(e,t)}}import _n from"ky";import{context as $e,trace as Dn,SpanKind as ye,SpanStatusCode as Qt}from"@opentelemetry/api";import In from"ky";async function Xt(e,t={}){let r=O(),n=T(),o=!!(r&&r.trim().length>0),s=!!(n&&n.trim().length>0);if(!o&&!s)throw c.missingExecutionCredentials();let{env:i}=b(),a=se(i),u=t.timeout??6e4,d={Accept:"application/json"};o&&(d[D]=r),s&&(d[k]=n);let f=y().deploymentId,l=f?{...e,deploymentId:f}:e,m=await In.post(`${a}/broker/http`,{json:l,headers:d,throwHttpErrors:!1,timeout:u}),p;return(m.headers.get("content-type")??"").includes("application/json")?p=await m.json():p=await m.text(),{status:m.status,body:p}}import An from"ky";async function Zt(e,t={}){let r=pt();if(!r)throw c.missingTrayToken();let{env:n}=b(),o=se(n),s=t.timeout??6e4,i=await An.post(`${o}/broker/http/dev`,{json:e,headers:{Authorization:`Bearer ${r}`,Accept:"application/json"},throwHttpErrors:!1,timeout:s}),a;return(i.headers.get("content-type")??"").includes("application/json")?a=await i.json():a=await i.text(),{status:i.status,body:a}}async function ge(e,t={}){let r=y().mode==="lambda"?Xt:Zt,n;try{n=await r(e,t)}catch(a){if(a instanceof c)throw a;let u=a instanceof Error?a.message??String(a):String(a);throw c.brokerError(0,u)}let{status:o,body:s}=n;if(o<200||o>=300){let a;if(s!==null&&typeof s=="object"){let u=s;typeof u.message=="string"?a=u.message:typeof u.error=="string"?a=u.error:a=String(s)}else a=String(s);throw c.brokerError(o,a,h(s))}let i=bt.safeParse(s);if(!i.success)throw c.brokerError(o,"broker returned malformed response",h(s));return Et(i.data)}var On=["get","post","put","patch","delete","head","options"],er="[stream body omitted]";function He(e){try{return new URL(e).hostname}catch{return e}}function Fn(e,t,r,n){let o=He(t),s="externalApi",i={kind:ye.CLIENT};return C.startActiveSpan(s,i,async a=>(a.setAttributes({method:e,host:o}),S(a,"request",{url:t,method:e,...r!==void 0?{body:r instanceof ReadableStream?er:r}:{}}),n(a)))}function Ke(e,t,r){e.setAttribute("status",t),e.setStatus(t==="success"?{code:Qt.OK}:{code:Qt.ERROR,message:r}),e.end()}var Ln=16;async function jn(e,t){let r=e.clone().body;return r?tr(r,t):new Uint8Array(0)}async function tr(e,t){let r=e.getReader(),n=[],o=0,s=0;try{for(;;){let{done:u,value:d}=await r.read();if(u)break;if(!d||d.byteLength===0){if(s+=1,s>=Ln)break;continue}s=0;let f=t+1-o;if(d.byteLength>=f){n.push(d.slice(0,f)),o+=f;break}n.push(d),o+=d.byteLength}}finally{r.cancel().catch(()=>{}),r.releaseLock()}let i=new Uint8Array(o),a=0;for(let u of n)i.set(u,a),a+=u.byteLength;return i}async function rr(e,t,r){if("kyResponse"in r)try{let n=await jn(r.kyResponse,z),o=new TextDecoder("utf-8").decode(n,{stream:!0}),s;try{s=JSON.parse(o)}catch{s=o}S(e,"response",s)}catch{S(e,"response",{status:t})}else S(e,"response",r.bodyValue)}async function Nn(e,t){if(t instanceof ReadableStream){let r=e.body??t;try{let[n,o]=r.tee(),s=new Request(e,{body:n,duplex:"half"}),i=await tr(o,z);return{body:new TextDecoder("utf-8").decode(i,{stream:!0}),request:s}}catch{return{body:er}}}return typeof t=="string"?{body:t}:{}}function nr(){let e=_n.create({});function t(n){return(o,s)=>{let i=$e.active(),a,u=!1,d=(l,m)=>{a&&!u&&(u=!0,Ke(a,l,m))},f=e.extend({hooks:{beforeRequest:[async(l,m)=>{let p=await Nn(l,m.body),g=p.body;if(a||(a=C.startSpan("externalApi",{kind:ye.CLIENT},i)),a.setAttributes({method:l.method.toUpperCase(),host:He(l.url)}),S(a,"request",{url:l.url,method:l.method.toUpperCase(),...g!==void 0?{body:g}:{}}),u=!1,x("hasExternal"),p.request)return p.request}],beforeRetry:[l=>{d("error","retry"),a=void 0,u=!1}],afterResponse:[async(l,m,p)=>{a&&(a.setAttribute("statusCode",p.status),await rr(a,p.status,{kyResponse:p}),p.ok?d("success"):s?.throwHttpErrors===!1&&(x("hasError"),d("error",`HTTP ${p.status}`)))}],beforeError:[l=>(x("hasError"),d("error",l.message),l)]}});return a=C.startSpan("externalApi",{kind:ye.CLIENT},i),a.setAttributes({method:n.toUpperCase(),host:He(String(o))}),$e.with(Dn.setSpan($e.active(),a),()=>{let l=n==="options"?f(o,{...s,method:"OPTIONS"}):f[n](o,s);return l.catch(m=>{x("hasError"),d("error",m instanceof Error?m.message:String(m))}),l})}}let r=Object.fromEntries(On.map(n=>[n,t(n)]));return{...e,...r,authed(n){return Bn(n)}}}function Bn(e){let r=b().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e];function o(s){return(i,a={})=>{let u=s.toUpperCase();return Fn(u,i,a.body,async d=>{x("hasAuth");let f=C.startSpan("auth",{kind:ye.INTERNAL});f.setAttribute("alias",e),f.setAttribute("id",n),f.end();try{let l=q({authenticationId:n,method:u,url:i,body:a.body,headers:a.headers,query:a.query}),m=await ge(l,{timeout:a.timeout});return d.setAttribute("statusCode",m.status),await rr(d,m.status,{bodyValue:m.body}),Ke(d,"success"),m}catch(l){throw x("hasError"),l instanceof c&&l.detail.kind==="broker_error"&&l.detail.status>0&&d.setAttribute("statusCode",l.detail.status),Ke(d,"error",l instanceof Error?l.message:String(l)),l}})}}return{get:o("get"),post:o("post"),put:o("put"),patch:o("patch"),delete:o("delete"),head:o("head"),options:o("options")}}import{SpanKind as zn,SpanStatusCode as ar}from"@opentelemetry/api";function X(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Un=18e4,or=Un-1e4,Mn=2e3;async function sr(e,t,r){let n=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),s=0;for(;Date.now()-o<or;){let i=await e(t,"DescribeStatement",{Id:r}),a=i.Status;if(n.has(a))return i;let u=Math.min(Mn,200*2**s),d=u/2+Math.random()*(u/2),f=or-(Date.now()-o);await new Promise(l=>setTimeout(l,Math.min(d,f))),s++}throw c.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var $n=new Set(["SELECT","WITH","SHOW"]),Hn=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function Kn(e){if(!e.clusterIdentifier&&!e.workgroupName)throw c.dbInvalidParameters("either clusterIdentifier or workgroupName is required");if(e.clusterIdentifier&&e.workgroupName)throw c.dbInvalidParameters("clusterIdentifier and workgroupName are mutually exclusive (Provisioned vs Serverless)");if(!e.database)throw c.dbInvalidParameters("database is required");if(e.clusterIdentifier&&!e.dbUser)throw c.dbInvalidParameters("dbUser is required when using clusterIdentifier (Provisioned)");if(!e.region)throw c.dbInvalidParameters("region is required")}function qn(e,t){let r=null;if(typeof t=="string")try{r=JSON.parse(t)}catch{}else t!==null&&typeof t=="object"&&(r=t);let n=typeof r?.__type=="string"?r.__type:void 0,o=typeof r?.message=="string"?r.message:void 0;if(n&&o)return c.dbQueryFailed(`${n}: ${o}`);let s=typeof t=="string"?A(t):h(t);return c.dbCallFailed(s)}function Vn(e){if(e==null||typeof e!="string")return e;try{return JSON.parse(e)}catch{throw c.dbCallFailed("upstream body not JSON: "+e.slice(0,200))}}function Wn(e,t){return typeof t!="number"||t<0?{}:$n.has(e)?{rowsRead:t}:Hn.has(e)?{rowsWritten:t}:{}}function ir(e){async function t(r,n,o){let s=q({authenticationId:e,method:"POST",url:`https://redshift-data.${r}.amazonaws.com/`,body:o,headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`RedshiftData.${n}`}});try{let{status:i,body:a}=await ge(s);if(i>=400)throw qn(i,a);return Vn(a)}catch(i){if(i instanceof c)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw c.dbCallFailed(a,i instanceof Error?i:void 0)}}return{system:"redshift",validate:Kn,async execute(r,n){let o=X(n),s={Sql:n,Database:r.database,...r.clusterIdentifier&&{ClusterIdentifier:r.clusterIdentifier,DbUser:r.dbUser},...r.workgroupName&&{WorkgroupName:r.workgroupName},...r.statementName&&{StatementName:r.statementName}},i=await t(r.region,"ExecuteStatement",s),a=i,u=typeof a?.Id=="string"?a.Id:void 0;if(!u){let p=h(i);throw c.dbCallFailed(`ExecuteStatement response missing Id; got: ${p}`)}let d=await sr(t,r.region,u),f=d.Status;if(f==="FAILED"){let p=typeof d.Error=="string"?d.Error:"statement failed";throw c.dbQueryFailed(`${p} (statement: ${u})`)}if(f==="ABORTED")throw c.dbQueryFailed(`statement aborted (statement: ${u})`);let l=Wn(o,d.ResultRows);return d.HasResultSet===!1?{result:{rowsAffected:d.ResultRows??0},metadata:l}:{result:await t(r.region,"GetStatementResult",{Id:u}),metadata:l}}}}var qe=64*1024;function Jn(e){return e.length>qe?`${e.slice(0,qe)}...[truncated]`:e}function Yn(e,t,r,n,o){e.setAttributes({system:t.system,statement:o,namespace:r.database,operation:n})}function Gn(e,t,r){let n=typeof t=="string"?t:JSON.stringify(t);return n.length>qe?S(e,"result",{truncated:!0,size:n.length}):S(e,"result",t),r.rowsRead!==void 0&&e.setAttribute("rowsRead",r.rowsRead),r.rowsWritten!==void 0&&e.setAttribute("rowsWritten",r.rowsWritten),n}async function Xn(e,t,r){let n=X(r),o=Jn(r);return C.startActiveSpan("database",{kind:zn.CLIENT},async s=>{Yn(s,e,t,n,o);try{x("hasDb");let{result:i,metadata:a}=await e.execute(t,r),u=Gn(s,i,a);return s.setAttribute("status","success"),s.setStatus({code:ar.OK}),u}catch(i){x("hasError");let a=i instanceof Error?i.message:String(i);throw s.setAttribute("status","error"),s.setStatus({code:ar.ERROR,message:a}),i}finally{s.end()}})}function Ve(e){let r=b().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=ir(n);function s(i,a){return o.validate(i),Xn(o,i,a)}return{parameters(i){return{sql(a){return s(i,a)}}},sql(i){return s({},i)}}}import{createStorage as ro}from"unstorage";var cr=1024,We=250*1024,Zn=new TextEncoder,Qn=/(^|\/)\.\.(\/|$)/,eo=/[?#]/,to=/[\u0000-\u001F\u007F]/;function ur(e){if(e.length===0)throw c.kvKeyInvalid("Key must be a non-empty string");if(Qn.test(e))throw c.kvKeyInvalid("Key contains path traversal segment");if(eo.test(e)||to.test(e))throw c.kvKeyInvalid("Key contains illegal characters");if(e.startsWith("/")||e.endsWith("/")||e.split("/").some(r=>r===""))throw c.kvKeyInvalid("Key must not contain empty path segments");let t=Zn.encode(e).length;if(t<1||t>cr)throw c.kvKeyInvalid(`Key must be between 1 and ${cr} UTF-8 bytes (got ${t})`)}function dr(e){let t;try{t=JSON.stringify(e)}catch{throw c.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw c.kvValueInvalid("Value must be JSON-serializable");let r=Buffer.byteLength(t,"utf8");if(r>We)throw c.kvValueTooLarge(`Value exceeds maximum size of ${We} bytes (got ${r})`,We)}function Z(e){ur(e)}function he(e,t){let r=e[t];if(typeof r!="function")throw new Error(`KV driver is missing ${t}`);return r}function lr(e){let t=he(e,"getItem"),r=he(e,"setItem"),n=he(e,"removeItem"),o=he(e,"hasItem"),s=e.getKeys;return{...e,getItem(i,a){return Z(i),t(i,a)},setItem(i,a,u){return Z(i),r(i,a,u)},removeItem(i,a){return Z(i),n(i,a)},hasItem(i,a){return Z(i),o(i,a)},getKeys(i,a){return i.length>0&&Z(i),s(i,a)}}}function we(e){return ro({driver:lr(e)})}import{defineDriver as no}from"unstorage";function oo(e){try{return JSON.parse(e)}catch{return e}}var so=no(e=>{let{client:t}=e;return{name:"helix-kv",async getItem(r){let n=await t.get(r);return n===null?null:JSON.stringify(n)},async setItem(r,n){await t.set(r,oo(n))},async removeItem(r){await t.delete(r)},async hasItem(r){return await t.has(r)},async getKeys(){throw new Error("KV key listing is not supported")}}});function fr(e){return so({client:e})}import co from"ky";import{z as v}from"zod";async function B(e){let t=e.headers.get("content-type")??"",r=await e.text();if(r.length!==0)return t.includes("application/json")?JSON.parse(r):r}function mr(e){return F(e).hosts.api}function io(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function ao(e){return e.split("/").map(encodeURIComponent).join("/")}function Q(e,t,r){return`${e}${io(t)}/${ao(r)}`}var uo=6e4,ze=v.lazy(()=>v.union([v.string(),v.number(),v.boolean(),v.null(),v.array(ze),v.record(ze)])),lo=v.object({projectId:v.string(),key:v.string(),value:ze,type:v.enum(["string","number","boolean","null","array","object"]),organizationId:v.string(),scope:v.string(),createdBy:v.string(),createdAt:v.number(),updatedBy:v.string(),updatedAt:v.number()});function fo(){let e=O(),t=T(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[D]=e),n&&(o[k]=t),o}function mo(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 ve(e,t){throw c.kvCallFailed(e,mo(t),h(t))}async function be(e,t,r={}){try{let n=await co(t,{method:e,headers:fo(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:uo}),o=e==="head"?void 0:await B(n);return{status:n.status,body:o}}catch(n){if(n instanceof c)throw n;let o=n instanceof Error?n.message??String(n):String(n);throw c.kvCallFailed(0,o)}}function pr(e){let t=mr(e.env),{projectId:r}=e;return{async get(n){let{status:o,body:s}=await be("get",Q(t,r,n));if(o===404)return null;(o<200||o>=300)&&ve(o,s);let i=lo.safeParse(s);if(!i.success)throw c.kvCallFailed(o,"platform returned malformed KeyValueEntry",h(s));return i.data.value},async set(n,o){let{status:s,body:i}=await be("put",Q(t,r,n),{json:{value:o}});(s<200||s>=300)&&ve(s,i)},async delete(n){let{status:o,body:s}=await be("delete",Q(t,r,n));o!==204&&ve(o,s)},async has(n){let{status:o,body:s}=await be("head",Q(t,r,n));if(o===200)return!0;if(o===404)return!1;ve(o,s)}}}function Ee(e){return{getItem:(t,r)=>e.getItem(t,r),removeItem:(t,r)=>e.removeItem(t,r),hasItem:(t,r)=>e.hasItem(t,r),setItem:async(t,r,n)=>{dr(r),await e.setItem(t,r,n)}}}function po(){let e=b();if(e.kind!=="provisioned")throw c.kvRequiresProvisioning();return{projectId:e.projectId,env:e.env}}function gr(e){let t=po(),r=e??pr(t),n=we(fr(r));return Ee(n)}import go from"unstorage/drivers/memory";var Je;function yo(){return Je||(Je=we(go())),Je}function yr(){return Ee(yo())}function ho(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":y().mode==="lambda"}function hr(){return ho()?gr():yr()}import{createHash as bo}from"crypto";import{mkdir as Eo,readFile as Sr,readdir as xr,rm as vr,unlink as So,writeFile as br}from"fs/promises";import{dirname as xo}from"path";async function wo(e){let t=e.getReader(),r=[],n=0;for(;;){let{done:o,value:s}=await t.read();if(o)break;if(s){if(n+=s.byteLength,n>V)throw await t.cancel(),c.filesValueTooLarge(`File exceeds maximum size of ${V} bytes (got more than ${V})`,V);r.push(s)}}return Buffer.concat(r)}async function U(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?wo(e):Buffer.from(e)}var vo={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"},wr="application/octet-stream";function Se(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return wr;let r=e.slice(t+1).toLowerCase();return vo[r]??wr}function $(){let e=y().projectRoot;if(!e)throw c.filesNotAvailable();return e}async function M(e){try{return await e()}catch(t){if(t instanceof c)throw t;let r=t?.code;throw r?c.filesCallFailed(0,`Local file storage operation failed: ${r}`):c.filesCallFailed(0,"Local file storage operation failed: unknown error")}}function xe(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function Ye(e){try{let t=await Sr(ae($(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Er(e){await Eo(xo(e),{recursive:!0})}async function Co(e,t){let r=ce(e,t),n;try{n=await xr(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return[];throw o}return n.filter(o=>o.isFile()).map(o=>t.length===0?o.name:`${t}/${o.name}`)}async function Cr(e,t){let r=ce(e,t),n;try{n=await xr(r,{withFileTypes:!0})}catch(s){if(s.code==="ENOENT")return[];throw s}let o=[];for(let s of n){let i=t.length===0?s.name:`${t}/${s.name}`;s.isDirectory()?o.push(...await Cr(e,i)):s.isFile()&&o.push(i)}return o}function Rr(){return{async put(e,t,r){return M(async()=>{let n=$(),o=await U(t),s=r?.contentType??Se(e),i=bo("sha1").update(o).digest("hex"),a=new Date,u=ie(n,e);await Er(u),await br(u,o);let d={size:o.byteLength,contentType:s,lastModified:a.toISOString(),etag:i},f=ae(n,e);return await Er(f),await br(f,JSON.stringify(d)),xe(e,d)})},async get(e){return M(async()=>{let t=await Ye(e);return t?{data:await Sr(ie($(),e)),metadata:xe(e,t)}:null})},async head(e){return M(async()=>{let t=await Ye(e);return t?xe(e,t):null})},async delete(e){return M(async()=>{let t=$();await Promise.all([ie(t,e),ae(t,e)].map(async r=>{try{await So(r)}catch(n){if(n.code!=="ENOENT")throw n}}))})},async deleteMany(e){return M(async()=>{let t=$(),r=await Cr(t,e);return await Promise.all([vr(ce(t,e),{recursive:!0,force:!0}),vr(Ct(t,e),{recursive:!0,force:!0})]),{deleted:r.length}})},async list(e,t){return M(async()=>{let r=$(),n=t?.limit??100,s=(await Co(r,e??"")).slice(0,n);return{files:(await Promise.all(s.map(async a=>{let u=await Ye(a);return u?xe(a,u):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let r=y().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:L(t?.expiresIn)}},async getDownloadUrl(e,t){let r=y().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:L(t?.expiresIn)}}}}import{createHash as _o}from"crypto";function Ce(e){return F(e).hosts.api}function Ro(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function ee(e,t){return`${e}${Ro(t)}`}function H(e,t,r){return`${ee(e,t)}/${encodeURIComponent(r)}`}function Re(e,t,r){return`${H(e,t,r)}/upload`}function kr(e,t,r){return`${H(e,t,r)}/download`}function Tr(e,t,r){return`${H(e,t,r)}/signed-url`}function Pr(e,t,r,n){let o=new URLSearchParams({name:n});return r&&o.set("parentFolder",r),`${ee(e,t)}/file?${o.toString()}`}function Ir(e,t,r,n){let o=new URLSearchParams({limit:String(n)});return r&&o.set("id",r),`${ee(e,t)}?${o.toString()}`}import Xe from"ky";import{z as w}from"zod";var Ze=6e4,Ar=w.object({id:w.string(),workspaceId:w.string(),projectId:w.string(),parentFolder:w.string().nullable().optional(),name:w.string(),size:w.number().nullable().optional(),objectType:w.enum(["Folder","File"]),contentType:w.string().nullable().optional(),createdAt:w.string(),updatedAt:w.string()}),ko=w.object({signedURL:w.string()}),To=w.object({path:w.array(w.object({id:w.string(),name:w.string()})),elements:w.array(Ar)});function Qe(){let e=O(),t=T(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[D]=e),n&&(o[k]=t),o}function _r(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 P(e,t){throw c.filesCallFailed(e,_r(t),h(t))}function Po(e,t){return e===400&&_r(t).toLowerCase()==="resource not found"}async function Io(e){let t=new Response(e),r=t.headers.get("content-type")??"multipart/form-data",n=await t.arrayBuffer();return{body:Buffer.from(n),contentType:r}}async function K(e,t,r={}){try{let n=await Xe(t,{method:e,headers:Qe(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:Ze}),o=await B(n);return{status:n.status,body:o}}catch(n){if(n instanceof c)throw n;let o=n instanceof Error?n.message:String(n);throw c.filesCallFailed(0,o)}}function Ge(e,t){let r=Ar.safeParse(t);if(!r.success)throw c.filesCallFailed(e,"platform returned malformed ObjectMetadata",h(t));return r.data}function Dr(e){let t=Ce(e.env),{projectId:r}=e;return{async createMetadata(n){let{status:o,body:s}=await K("post",ee(t,r),{json:n});return(o<200||o>=300)&&P(o,s),Ge(o,s)},async getByName(n,o){let{status:s,body:i}=await K("get",Pr(t,r,n,o));return s===404||Po(s,i)?null:((s<200||s>=300)&&P(s,i),Ge(s,i))},async getById(n){let{status:o,body:s}=await K("get",H(t,r,n));return o===404?null:((o<200||o>=300)&&P(o,s),Ge(o,s))},async listChildren(n,o){let{status:s,body:i}=await K("get",Ir(t,r,n,o));(s<200||s>=300)&&P(s,i);let a=To.safeParse(i);if(!a.success)throw c.filesCallFailed(s,"platform returned malformed listing",h(i));return a.data},async uploadContent(n,o,s,i){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:i}),s);let{body:u,contentType:d}=await Io(a),f;try{f=await Xe(Re(t,r,n),{method:"post",headers:{...Qe(),"content-type":d},body:new Uint8Array(u),throwHttpErrors:!1,timeout:Ze})}catch(m){if(m instanceof c)throw m;let p=m instanceof Error?m.message:String(m);throw c.filesCallFailed(0,p)}let l=await B(f);(f.status<200||f.status>=300)&&P(f.status,l)},async downloadContent(n){let o;try{o=await Xe(kr(t,r,n),{method:"get",headers:Qe(),throwHttpErrors:!1,timeout:Ze})}catch(i){if(i instanceof c)throw i;let a=i instanceof Error?i.message:String(i);throw c.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let i=await B(o);P(o.status,i)}let s=await o.arrayBuffer();return Buffer.from(s)},async getSignedDownloadUrl(n){let{status:o,body:s}=await K("get",Tr(t,r,n));(o<200||o>=300)&&P(o,s);let i=ko.safeParse(s);if(!i.success)throw c.filesCallFailed(o,"platform returned malformed signed URL response",h(s));return i.data.signedURL},async deleteById(n){let{status:o,body:s}=await K("delete",H(t,r,n));o===204||o===404||(o<200||o>=300)&&P(o,s)}}}function et(e){return e.split("/").filter(t=>t.length>0)}function tt(e){return e instanceof c&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ao(e,t,r){let n=await e.getByName(t,r);if(n)return n;try{return await e.createMetadata({parentFolder:t,objectType:"Folder",name:r})}catch(o){if(tt(o)){let s=await e.getByName(t,r);if(s)return s}throw o}}async function rt(e,t){let r=et(t),n=r[r.length-1],o;for(let s of r.slice(0,-1))o=(await Ao(e,o,s)).id;return{parentFolder:o,name:n}}async function te(e,t){let r=et(t),n=r[r.length-1],o;for(let s of r.slice(0,-1)){let i=await e.getByName(o,s);if(!i||i.objectType!=="Folder")return null;o=i.id}return{parentFolder:o,name:n}}async function nt(e,t){if(t.length===0)return;let r=et(t),n;for(let o of r){let s=await e.getByName(n,o);if(!s||s.objectType!=="Folder")return null;n=s.id}return n}var Do=500,Oo=8;async function Fo(e,t,r){let n=new Array(e.length),o=0;async function s(){for(;o<e.length;){let i=o++;n[i]=await r(e[i])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),n}function Lo(){let e=b();if(e.kind!=="provisioned")throw c.filesRequiresProvisioning();return{projectId:e.projectId,env:e.env}}function jo(e){return _o("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function ke(e,t,r){return{path:e,size:t.size??0,contentType:t.contentType??r??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:jo(t)}}async function Or(e,t,r,n){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:n,name:r})}catch(o){if(tt(o)){let s=await e.getByName(t,r);if(s)return s}throw o}}async function Fr(e,t){let{elements:r}=await e.listChildren(t,Do);return(await Fo(r,Oo,async o=>{let s=o.objectType==="Folder"?await Fr(e,o.id):1;return await e.deleteById(o.id),s})).reduce((o,s)=>o+s,0)}function Lr(e){let t=Lo(),r=e??Dr(t),n=Ce(t.env),{projectId:o}=t;return{async put(s,i,a){let{parentFolder:u,name:d}=await rt(r,s),f=await U(i),l=a?.contentType??Se(s),m=await r.getByName(u,d);if(m&&m.objectType!=="File")throw c.filesCallFailed(409,`A folder already exists at "${s}"`);let p=m??await Or(r,u,d,l);await r.uploadContent(p.id,f,d,l);let g=await r.getById(p.id);return ke(s,g??p,l)},async get(s){let i=await te(r,s);if(!i)return null;let a=await r.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:{data:await r.downloadContent(a.id),metadata:ke(s,a)}},async head(s){let i=await te(r,s);if(!i)return null;let a=await r.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:ke(s,a)},async delete(s){let i=await te(r,s);if(!i)return;let a=await r.getByName(i.parentFolder,i.name);a&&await r.deleteById(a.id)},async deleteMany(s){let i=await nt(r,s);if(i===null)return{deleted:0};let a=await Fr(r,i);return s.length>0&&i!==void 0&&await r.deleteById(i),{deleted:a}},async list(s,i){let a=await nt(r,s??"");if(a===null)return{files:[],cursor:null};let u=i?.limit??100,{elements:d}=await r.listChildren(a,u);return{files:d.filter(l=>l.objectType==="File").map(l=>ke(s?`${s}/${l.name}`:l.name,l)),cursor:null}},async getUploadUrl(s,i){let{parentFolder:a,name:u}=await rt(r,s),f=await r.getByName(a,u)??await Or(r,a,u,i?.contentType);return{url:Re(n,o,f.id),expiresAt:L(i?.expiresIn)}},async getDownloadUrl(s,i){let a=await te(r,s),u=a?await r.getByName(a.parentFolder,a.name):null;if(!u||u.objectType!=="File")throw c.filesCallFailed(404,`File not found: ${s}`);return{url:await r.getSignedDownloadUrl(u.id),expiresAt:L(i?.expiresIn)}}}}function ot(e,t){let r=t?.maxPathBytes;return{async put(n,o,s){I(n,r);let i=await U(o);return St(i.byteLength),e.put(n,i,s)},async get(n){return I(n,r),e.get(n)},async head(n){return I(n,r),e.head(n)},async delete(n){return I(n,r),e.delete(n)},async deleteMany(n){let o=Ie(n);return Ae(o,r),e.deleteMany(o)},async list(n,o){let s=Ie(n??"");return Ae(s,r),e.list(s,o)},async getUploadUrl(n,o){return I(n,r),e.getUploadUrl(n,o)},async getDownloadUrl(n,o){return I(n,r),e.getDownloadUrl(n,o)}}}function No(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":y().mode==="lambda"}function jr(){if(No())return ot(Lr());let e=y().projectRoot;return ot(Rr(),{maxPathBytes:e?xt(e):void 0})}function Nr(e,t){let{statusCode:r,message:n}=Bo(t.detail);return e.node.res.statusCode=r,{error:n,statusCode:r}}function Bo(e){switch(e.kind){case"unknown_alias":return{statusCode:400,message:"Unknown authentication alias"};case"input_validation_failed":return{statusCode:400,message:"Input validation failed"};case"output_validation_failed":return{statusCode:500,message:"Internal server error"};case"config_load_failed":return{statusCode:500,message:"Configuration error"};case"broker_error":return{statusCode:502,message:"Broker error"};case"unsupported_body_type":return{statusCode:400,message:"Unsupported request body type"};case"unsupported_scheme":return{statusCode:400,message:"Unsupported URL scheme"};case"missing_execution_credentials":return{statusCode:401,message:"Missing execution credentials"};case"missing_tray_token":return{statusCode:500,message:"Missing Tray token"};case"db_call_failed":return{statusCode:502,message:e.message};case"db_query_failed":return{statusCode:502,message:`Database query failed: ${e.message}`};case"db_invalid_parameters":return{statusCode:400,message:e.message};case"kv_key_invalid":return{statusCode:400,message:e.message};case"kv_value_invalid":return{statusCode:400,message:e.message};case"kv_value_too_large":return{statusCode:400,message:e.message};case"kv_not_available":return{statusCode:501,message:"Key-value store is not available in this environment"};case"kv_call_failed":return{statusCode:502,message:"Key-value store request failed"};case"kv_requires_provisioning":return{statusCode:500,message:"Internal server error"};case"files_path_invalid":return{statusCode:400,message:e.message};case"files_value_invalid":return{statusCode:400,message:e.message};case"files_value_too_large":return{statusCode:400,message:e.message};case"files_not_available":return{statusCode:501,message:"File storage is not available in this environment"};case"files_call_failed":return{statusCode:502,message:"File storage request failed"};case"files_requires_provisioning":return{statusCode:500,message:"Internal server error"};default:return{statusCode:500,message:`Unhandled error kind: ${e.kind}`}}}var Uo=["authorization","x-tray-token","set-cookie","x-kong-request-id","traceparent","x-real-ip","cookie"];function Mo(e){return e.toLowerCase().includes("tray_lid")}function st(e){let t={};for(let[r,n]of Object.entries(e))if(!Uo.includes(r.toLowerCase())){if(r.toLowerCase()==="cookie"&&n){let o=n.split(";").map(s=>s.trim()).filter(s=>{let i=s.split("=")[0].trim();return!Mo(i)}).join("; ");o&&(t[r]=o);continue}t[r]=n}return t}function Wo(e,t){let{inputSchema:r,outputSchema:n}=Zo(t),o=e;return Ko(async s=>{let i=y(),{executionId:a,userId:u,deploymentId:d}=Qo(i,s),f=Date.now(),l=new Date().toISOString(),m=qo(s),p=Vo(s).pathname,g=es(),_=Jt(),ne=`${m} ${p}`;Be();let mt={hasDb:!1,hasExternal:!1,hasAuth:!1,hasError:!1};return zo(()=>me.run(mt,()=>fe.run(a,async()=>{let oe=await Jo(s,r);if(!oe.ok)return{response:oe.response,errored:!1,errorMessage:null};let Jr=rs(s,oe.input,g,_,m,p,a,d,u);return Yo(o,Jr,n,s,_,a,d,{method:m,path:p,rawInput:oe.input})})),{executionId:a,deploymentId:d,routeOrJob:ne,startedAt:l,startMs:f,userId:u,flags:mt})})}async function zo(e,t){let r=!1,n=null;try{let o=await e();return r=o.errored,n=o.errorMessage,o.response}finally{Me({...t,errored:r,errorMessage:n}),await Ue()}}async function Jo(e,t){try{return{ok:!0,input:await zt(e,t)}}catch(r){let n=ts(e,r);if(n)return{ok:!1,response:n};throw r}}async function Yo(e,t,r,n,o,s,i,a){return C.startActiveSpan("function",{root:!0,kind:Ho.SERVER,attributes:{method:a.method,route:a.path,executionId:s,...i?{deploymentId:i}:{}}},async u=>{t.traceId=u.spanContext().traceId;let d=st(Mr(n));S(u,"input",a.rawInput),S(u,"request",{method:a.method,path:a.path,headers:d,body:a.rawInput});let f=!1,l=null,m,p;try{let g=await wt.run(t,()=>e(t));if(m=g,g==null)n.node.res.statusCode=204,p="";else if(g instanceof Response)p=g;else if(r){let _=r.safeParse(g);if(!_.success){let ne=Object.keys(_.error.flatten().fieldErrors);throw o.error("Output validation failed",{fields:ne,executionId:s}),c.outputValidationFailed(ne)}p=_.data}else p=g}catch(g){f=!0,l=g instanceof Error?g.message:String(g),x("hasError"),p=Go(g,n,o,s)}finally{Xo(u,n,{errored:f,errorMessage:l,handlerResult:m,response:p})}return{response:p,errored:f,errorMessage:l}})}function Go(e,t,r,n){if(e instanceof G)return t.node.res.statusCode=e.statusCode,{error:e.message,statusCode:e.statusCode};if(vt(e))return Nr(t,e);r.error("Unhandled error in handler",{error:e instanceof Error?e.message:String(e),executionId:n}),t.node.res.statusCode=500;let o=process.env.NODE_ENV==="development";return{error:o&&e instanceof Error?e.message:"Internal server error",statusCode:500,...o&&e instanceof Error&&e.stack?{stack:e.stack}:{}}}function Xo(e,t,r){e.setAttribute("statusCode",t.node.res.statusCode),!r.errored&&r.handlerResult!==void 0&&S(e,"output",r.handlerResult),S(e,"response",r.response);let n=me.getStore();e.setAttribute("hasAuth",n?.hasAuth??!1),e.setAttribute("hasExternal",n?.hasExternal??!1),e.setAttribute("hasDb",n?.hasDb??!1),e.setAttribute("status",r.errored?"error":"success");let o=r.errored||(n?.hasError??!1);e.setStatus({code:o?Br.ERROR:Br.OK,...r.errorMessage?{message:r.errorMessage}:{}}),e.end()}function Zo(e){if(!e)return{inputSchema:void 0,outputSchema:void 0};if(e instanceof Object&&"_def"in e)return{inputSchema:e,outputSchema:void 0};if(typeof e=="object"&&("input"in e||"output"in e)){let t=e;return{inputSchema:t.input,outputSchema:t.output}}return{inputSchema:e,outputSchema:void 0}}function Qo(e,t){let r=e.mode==="lambda",n=(r?e.executionId:Ur(t,"x-tray-execution-id"))??$o(),o=(r?e.userId:Ur(t,"x-tray-user-id"))??null,s=r?e.deploymentId??null:null;return{executionId:n,userId:o,deploymentId:s}}function es(){try{return b().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}function ts(e,t){if(!(t instanceof Error)||!("statusCode"in t)||!("data"in t))return null;let r=t.statusCode,n=t.data;e.node.res.statusCode=r;let o=n&&typeof n=="object"&&"fieldErrors"in n?n.fieldErrors:void 0;return{error:"Input validation failed",statusCode:r,...o?{fields:Object.keys(o)}:{}}}function rs(e,t,r,n,o,s,i,a,u){return{input:t,method:o,path:s,headers:st(Mr(e)),http:nr(),db:d=>Ve(d),kv:()=>hr(),files:()=>jr(),log:n,config:r,status:Yt(e),error:Gt(),state:{},request:e,executionId:i,deploymentId:a,userId:u,identity:u!==null?{user:{id:u}}:null,traceId:""}}function ns(e){return e}import{resolve as it}from"path";import{existsSync as Hr}from"fs";import{loadConfig as is}from"c12";import{z as E}from"zod";import{z as os}from"zod";var ss=["production"],Te=os.string().refine(e=>gt(e),e=>({message:`Invalid enum value. Expected ${yt().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));var at=E.string().uuid("projectId must be a valid UUID"),ct=E.string().min(1,"workspaceId must be a non-empty string"),as=E.object({name:E.string().min(1,"name is required"),projectId:at.optional(),workspaceId:ct.optional(),env:Te.default("production"),authentications:E.record(E.string()).optional().default({}),config:E.record(E.unknown()).optional().default({})}),$r=E.object({name:E.string().min(1,"name is required"),workspaceId:ct.optional(),env:Te,authentications:E.record(E.string()),config:E.record(E.unknown())}),cs=E.discriminatedUnion("kind",[$r.extend({kind:E.literal("provisioned"),projectId:at}),$r.extend({kind:E.literal("unprovisioned")})]),Kr=["helix","tray"],qr=["ts","mts","cts","js","mjs","cjs"];function Pe(e){for(let t of Kr)for(let r of qr){let n=it(e,`${t}.config.${r}`);if(Hr(n))return n}}function us(e){for(let t of Kr)if(qr.some(r=>Hr(it(e,`${t}.config.${r}`))))return t;return"helix"}function ut(e){return{name:us(e),cwd:e,rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function dt(e,t){if(e!==null&&typeof e=="object"&&"extends"in e)throw c.configLoadFailed(`helix.config.ts at ${t}: 'extends' is not supported \u2014 remove the field`);let r=as.safeParse(e);if(!r.success){let d=r.error.issues.map(f=>f.message).join("; ");throw c.configLoadFailed(`Invalid helix.config.ts at ${t}: ${d}`)}let{projectId:n,workspaceId:o,...s}=r.data,i=o!==void 0?{workspaceId:o}:{},a=ht(),u=a!==void 0?{...s,env:a}:s;return n!==void 0?{kind:"provisioned",projectId:n,...u,...i}:{kind:"unprovisioned",...u,...i}}async function re(e){let t=e??process.cwd(),r;try{r=await is(ut(t))}catch(o){throw c.configLoadFailed(`Failed to load helix.config.ts: ${o instanceof Error?o.message:String(o)}`)}let n=r._configFile??Pe(t);if(!n)throw c.configLoadFailed(`helix.config.ts not found at ${it(t,"helix.config.ts")}`);return dt(r.config,n)}var Vr="WORKSPACE_ID_REQUIRED";function ds(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:Vr});return e.workspaceId}import{existsSync as ls,watch as fs,writeSync as ms}from"fs";import{join as ps,resolve as gs}from"path";import{watchConfig as ys}from"c12";function hs(e,t){let r=e instanceof Error?e.message:String(e);ms(2,`[helix-watch] ${t.phase} error: ${r}
|
|
8
|
+
`)}function lt(){return{kind:"unprovisioned",name:"",authentications:{},config:{},env:"production"}}var ws=/^(?:helix|tray)\.config\.(?:m|c)?[jt]s$/,Wr=new Set;function zr(e){return Pe(e)!==void 0}async function vs(e,t){if(zr(e.cwd))try{return{current:await re(e.cwd),initialLoadSucceeded:!0}}catch(r){return t(r,{phase:"reload"}),{current:lt(),initialLoadSucceeded:!1}}if(e.watch){let r=gs(e.cwd);Wr.has(r)||(process.stderr.write(`warning: no helix.config.ts found at ${e.cwd}; tray running with default config \u2014 create one via \`helix init\`
|
|
9
|
+
`),Wr.add(r))}return{current:lt(),initialLoadSucceeded:!1}}var ft=class{constructor(t,r,n){this.cwd=t;this.onError=r;this.emit=n}cwd;onError;emit;stopped=!1;directoryWatcher=null;c12Unwatch=null;c12AttachPromise=null;updateChain=Promise.resolve();start(t){t?this.attachC12Watcher():this.attachCreationWatcher()}watcherReady(){return this.c12AttachPromise===null?Promise.resolve():this.c12AttachPromise.catch(()=>{})}async stop(){this.stopped=!0,this.directoryWatcher&&(this.directoryWatcher.close(),this.directoryWatcher=null),this.c12AttachPromise&&await this.c12AttachPromise.catch(t=>this.onError(t,{phase:"attach"})),this.c12Unwatch&&(await this.c12Unwatch(),this.c12Unwatch=null)}attachC12Watcher(){this.c12AttachPromise===null&&(this.c12AttachPromise=ys({...ut(this.cwd),onUpdate:({newConfig:t})=>{this.stopped||(this.updateChain=this.updateChain.then(async()=>{if(this.stopped)return;let r;try{r=dt(t.config,this.cwd)}catch(n){this.onError(n,{phase:"validation"});return}try{this.emit(r)}catch(n){this.onError(n,{phase:"reload"})}}))}}).then(async t=>{if(this.stopped){t.unwatch();return}this.c12Unwatch=t.unwatch;let{watch:r}=await import("chokidar"),n=r(this.cwd,{persistent:!1,depth:0});try{await new Promise((o,s)=>{n.once("ready",o),n.once("error",s)})}finally{await n.close()}}).catch(t=>{this.onError(t,{phase:"attach"})}))}attachCreationWatcher(){try{this.directoryWatcher=fs(this.cwd,{persistent:!1},(t,r)=>{if(this.stopped||!r)return;let n=r.toString();ws.test(n)&&ls(ps(this.cwd,n))&&(this.updateChain=this.updateChain.then(async()=>{if(this.stopped)return;let o;try{o=await re(this.cwd)}catch(i){this.onError(i,{phase:"reload"});return}if(this.stopped)return;this.emit(o);let s=this.directoryWatcher;s&&(this.directoryWatcher=null,s.close()),this.attachC12Watcher()}))}),this.directoryWatcher.on("error",t=>{this.onError(t,{phase:"attach"})})}catch(t){this.onError(t,{phase:"attach"})}}};async function bs(e){let t=e.onError??hs,r=new Set,n=await vs(e,t),o=n.current;function s(a){o=a;for(let u of[...r])try{u(a)}catch(d){t(d,{phase:"reload"})}}let i=new ft(e.cwd,t,s);return e.watch&&i.start(n.initialLoadSucceeded),{get(){return o},async reload(){if(!zr(e.cwd)){let a=lt();return s(a),a}try{let a=await re(e.cwd);return s(a),a}catch(a){return t(a,{phase:"reload"}),o}},subscribe(a){return r.add(a),()=>{r.delete(a)}},async stop(){r.clear(),await i.stop()},ready(){return i.watcherReady()}}}export{ss as ENVIRONMENT_VALUES,Vr as WORKSPACE_ID_REQUIRED_CODE,bs as createConfigService,ns as defineConfig,Wo as defineFunction,Te as environmentSchema,Yr as getContext,y as getSdkConfig,re as loadConfig,cs as loadedTrayConfigSchema,at as projectIdSchema,ds as requireWorkspaceId,Pe as resolveConfigFile,Sn as runWithinAppSpan,ct as workspaceIdSchema};
|