@trayai/helix-sdk 0.113.0 → 0.115.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 CHANGED
@@ -9,6 +9,56 @@ 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.115.0
13
+
14
+ ### Added
15
+
16
+ - **EU1, AP1, and AP2 regions.** `helix.config.ts` now accepts `region: "us1" | "eu1" | "ap1" |
17
+ "ap2"`. Each region is a fully separate deployment: its own API host, its own login, its own
18
+ data residency.
19
+
20
+ ### Changed
21
+
22
+ - **`helix.config.ts`'s `env` field is renamed to `region`.** `region` is now the primary
23
+ field; `env` still works as a deprecated alias for one release cycle, so existing
24
+ `env: "production"` configs keep building without changes — `region` defaults to `"us1"`
25
+ whether `env` was set or omitted entirely. Rename `env: "production"` to `region: "us1"` (or
26
+ run `helix region set us1`) when convenient. This also frees up the name `env`/environment
27
+ for a future, unrelated project-environment-promotion feature.
28
+ - **The default region's field value is `"us1"`, not `"production"`.** `"production"` was this
29
+ field's historical value before regions existed; now that `us1`/`eu1`/`ap1`/`ap2` are real
30
+ siblings, `region: "us1"` matches the other three and the CLI's `--region us1` /
31
+ `helix region set us1`. `"production"` remains a valid value for the deprecated `env` field
32
+ only (see above) — it is no longer accepted by `region` itself.
33
+
34
+ ## 0.114.0
35
+
36
+ ### Added
37
+
38
+ - **AI gateway — `ctx.ai`.** `ctx.ai(alias)` is a real [AI SDK](https://ai-sdk.dev/) provider
39
+ bound to a `helix.config.ts` authentication alias, with the platform injecting the model
40
+ provider's API key so it never touches your code. Declare the service backing each alias
41
+ with the new `aiProviders` config field, then call `generateText`, `streamText`,
42
+ `generateObject`, `streamObject`, `embed`, `embedMany`, `generateImage`, `transcribe`, or
43
+ `generateSpeech` on it with a string model id. The top-level `ctx.ai.*` functions take a
44
+ model instance instead, for handing a model to a custom agent loop. Generate-style results
45
+ carry an estimated `result.helix.cost` alongside the AI SDK's own fields. Supported
46
+ services: `openai`, `anthropic`, `google`, `mistral`, `cohere`, `openai-compatible`. AI SDK
47
+ helpers and types (`tool`, `stepCountIs`, `convertToModelMessages`, message/stream/result
48
+ types, etc.) are re-exported so your project needs no separate `ai` dependency. See the
49
+ README's "AI — `ctx.ai`" section for the full surface and config shape. New exported types:
50
+ `HelixAI`, `HelixAIProvider`, `HelixResultMeta`, `HelixCost`, `AiLanguageModelInstance`,
51
+ `AiEmbeddingModelInstance`, `AiImageModelInstance`, `AiTranscriptionModelInstance`,
52
+ `AiSpeechModelInstance`, `AiService`, `AiProviderEntry`.
53
+ - The top-level `ctx.ai.*` functions now reject a model instance that wasn't obtained from
54
+ `ctx.ai(alias)` (`SdkError.aiForeignModelRejected`) — such an instance would carry its own
55
+ API key and connect directly to the provider instead of routing through the platform.
56
+ - An `aiProviders` entry's `baseUrl` must be `https:`; this is now validated when your config
57
+ loads instead of failing on the first `ctx.ai` call.
58
+ - `generateImage`'s `result.helix.cost` now reflects the provider's reported token usage
59
+ (previously always `0`) — real for token-billed image models like `gpt-image-1`; most image
60
+ models (e.g. `dall-e-3`) bill per image and report no usage, so they still estimate to `0`.
61
+
12
62
  ## 0.113.0
13
63
 
14
64
  ### Changed
package/README.md CHANGED
@@ -14,6 +14,7 @@ The runtime SDK for **Helix** — a TypeScript-first platform for building integ
14
14
  - [Capability modules](#capability-modules)
15
15
  - [Scheduled functions](#scheduled-functions)
16
16
  - [Async function calls](#async-function-calls)
17
+ - [AI — `ctx.ai`](#ai--ctxai)
17
18
  - [Authentication](#authentication)
18
19
  - [Configuration](#configuration)
19
20
  - [Logging](#logging)
@@ -81,6 +82,7 @@ Every HTTP handler receives a `ctx` (`TrayContext`); scheduled handlers receive
81
82
  | `ctx.http.authed(alias)` | Authenticated HTTP — credentials are injected by the platform; secrets never touch your code |
82
83
  | `ctx.kv()` | Key-value store |
83
84
  | `ctx.files()` | File storage |
85
+ | `ctx.ai(alias)` | AI provider access — credentials are injected by the platform, same as `ctx.http.authed` |
84
86
  | `ctx.log.info/warn/error/debug` | Structured logging |
85
87
  | `ctx.config` | The `config` block from `helix.config.ts` |
86
88
  | `ctx.state` | Per-request scratch space |
@@ -276,9 +278,74 @@ Things to know:
276
278
  `ctx.parentExecutionId` is always `null` in dev, since there's no real calling execution to
277
279
  report.
278
280
 
281
+ ## AI — `ctx.ai`
282
+
283
+ `ctx.ai(alias)` gives you a real [AI SDK](https://ai-sdk.dev/) provider whose calls are routed
284
+ through the platform, so you never handle a model provider's API key directly. Declare which
285
+ service backs each alias in `helix.config.ts`:
286
+
287
+ ```typescript
288
+ // helix.config.ts
289
+ export default defineConfig({
290
+ // ...
291
+ authentications: {
292
+ anthropicKey: '<your-anthropic-auth-uuid>',
293
+ },
294
+ aiProviders: {
295
+ // 'openai' | 'anthropic' | 'google' | 'mistral' | 'cohere', or the object form
296
+ // { service: 'openai-compatible', baseUrl } for self-hosted endpoints
297
+ anthropicKey: 'anthropic',
298
+ },
299
+ });
300
+ ```
301
+
302
+ ```typescript
303
+ import { defineFunction } from '@trayai/helix-sdk';
304
+
305
+ export default defineFunction(async (ctx) => {
306
+ const result = await ctx.ai('anthropicKey').generateText({
307
+ model: 'claude-sonnet-4-5',
308
+ prompt: ctx.input.prompt,
309
+ });
310
+ return { text: result.text, cost: result.helix.cost };
311
+ });
312
+ ```
313
+
314
+ - **`ctx.ai(alias)`** returns a provider scoped to that alias, with methods
315
+ (`generateText`, `streamText`, `generateObject`, `streamObject`, `embed`, `embedMany`,
316
+ `generateImage`, `transcribe`, `generateSpeech`, plus `languageModel`/`embeddingModel`/
317
+ `imageModel`/`transcriptionModel`/`speechModel` for building a model instance) that take
318
+ `model` as a string id.
319
+ - **`ctx.ai.generateText`** and the other top-level `ctx.ai.*` functions take a model
320
+ *instance* (e.g. `ctx.ai(alias).languageModel(id)`) instead of a string — use them when
321
+ handing a model to a custom agent loop or a third-party helper that expects an AI SDK
322
+ model instance rather than a string id.
323
+ - AI SDK helpers and types (`tool`, `dynamicTool`, `jsonSchema`, `zodSchema`, `stepCountIs`,
324
+ `hasToolCall`, `convertToModelMessages`, message/stream/result types, etc.) are re-exported
325
+ from `@trayai/helix-sdk` so your project needs no separate `ai` dependency. The `ai`
326
+ package's own call functions (`generateText`, `streamText`, …) are **not** re-exported —
327
+ always call through `ctx.ai`.
328
+ - Generate-style calls (`generateText`, `generateObject`, `generateImage`) resolve with
329
+ `result.helix.cost` and `result.helix.requestId` alongside the AI SDK's own result fields.
330
+ `cost` is an estimate derived from the provider's reported token usage and public list
331
+ prices — an unrecognized model estimates to `0`. Most image models (e.g. `dall-e-3`) bill
332
+ per image and report no token usage at all, so `generateImage`'s cost estimates to `0` for
333
+ them regardless of whether the model is recognized; token-billed image models (e.g.
334
+ `gpt-image-1`) get a real estimate.
335
+ - Supported services: `openai`, `anthropic`, `google`, `mistral`, `cohere`, and
336
+ `openai-compatible` (self-hosted endpoints — use the object form with `baseUrl` instead of
337
+ the shorthand string). `baseUrl` must be `https:` — this is enforced when your config loads,
338
+ not just on the first call.
339
+ - An alias with no matching `aiProviders` entry throws `SdkError.aiProviderNotConfigured`,
340
+ naming the exact config line to add.
341
+ - The top-level `ctx.ai.*` functions only accept a model instance obtained from `ctx.ai(alias)`
342
+ — passing a string, or omitting `model` entirely, throws `SdkError.aiModelInstanceRequired`,
343
+ and passing a model instance built directly against a third-party AI SDK provider (bypassing
344
+ `ctx.ai`) throws `SdkError.aiForeignModelRejected`.
345
+
279
346
  ## Authentication
280
347
 
281
- Authenticated features (`ctx.http.authed`, `ctx.kv`, `ctx.files`) require you to be logged in during local development:
348
+ Authenticated features (`ctx.http.authed`, `ctx.kv`, `ctx.files`, `ctx.ai`) require you to be logged in during local development:
282
349
 
283
350
  - **Local (`helix dev`):** run `helix login` once, then `helix dev`.
284
351
  - **Deployed:** no token is needed — the platform handles credentials for you.
@@ -300,12 +367,17 @@ export default defineConfig({
300
367
  name: 'my-app',
301
368
  projectId: '00000000-0000-4000-8000-000000000001', // optional UUID
302
369
  workspaceId: '00000000-0000-4000-8000-000000000002', // optional UUID
370
+ region: 'us1', // optional — 'us1' (default), 'eu1', 'ap1', or 'ap2'
303
371
  authentications: {
304
372
  notion: '<your-notion-auth-uuid>',
305
373
  },
306
374
  config: {
307
375
  apiVersion: '2022-06-28',
308
376
  },
377
+ aiProviders: {
378
+ // maps an authentication alias to the AI service it authenticates against
379
+ // — see AI — `ctx.ai` below
380
+ },
309
381
  });
310
382
  ```
311
383
 
@@ -336,7 +408,24 @@ const unsubscribe = service.subscribe((next) => console.log('reloaded:', next.ki
336
408
  await service.stop();
337
409
  ```
338
410
 
339
- Use the CLI (`helix project set`, `helix workspace set`, `helix auth add`) or the Helix MCP tools to write config fields — you rarely edit these by hand.
411
+ Use the CLI (`helix project set`, `helix workspace set`, `helix region set`, `helix auth add`) or the Helix MCP tools to write config fields — you rarely edit these by hand.
412
+
413
+ ### Regions
414
+
415
+ Tray runs in four regions: `us1` (default), `eu1`, `ap1`, `ap2`. `region` in `helix.config.ts`
416
+ pins a project to one. `REGION_VALUES` (the array of valid field values —
417
+ `['us1', 'eu1', 'ap1', 'ap2']`) and `regionSchema` (the Zod schema backing the `region` field)
418
+ are exported for validating a region string yourself, and `Region` is the corresponding type.
419
+
420
+ ```typescript
421
+ import { REGION_VALUES, regionSchema, type Region } from '@trayai/helix-sdk';
422
+
423
+ regionSchema.parse('eu1'); // 'eu1'
424
+ ```
425
+
426
+ > Projects created before the `region` rename may still have an `env` field in
427
+ > `helix.config.ts` — it's accepted as a deprecated alias for one release cycle. Rename it to
428
+ > `region` when convenient.
340
429
 
341
430
  ### Multiple config files
342
431
 
@@ -1,11 +1,11 @@
1
- import { E as Environment } from '../env-schema-DkgTG5b0.js';
1
+ import { R as Region } from '../region-schema-COfWyGI9.js';
2
2
  import 'zod';
3
3
 
4
- type BrokerEnvironment = Environment;
4
+ type BrokerRegion = Region;
5
5
 
6
6
  interface BrokerDevCallParams {
7
- /** Target Tray environment — selects the broker base URL. */
8
- env: BrokerEnvironment;
7
+ /** Target Tray region — selects the broker base URL. */
8
+ env: BrokerRegion;
9
9
  /** Personal dev token (the user's local Tray login) sent as `Authorization: Bearer`. */
10
10
  devToken: string;
11
11
  /** Credential record UUID the broker injects auth for. */
@@ -66,8 +66,8 @@ type BrokerDevCallResult = {
66
66
  */
67
67
  declare function callBrokerDev(params: BrokerDevCallParams): Promise<BrokerDevCallResult>;
68
68
  interface S3SignDevCallParams {
69
- /** Target Tray environment — selects the broker base URL. */
70
- env: BrokerEnvironment;
69
+ /** Target Tray region — selects the broker base URL. */
70
+ env: BrokerRegion;
71
71
  /** Personal dev token (the user's local Tray login) sent as `Authorization: Bearer`. */
72
72
  devToken: string;
73
73
  /** Credential record UUID of an AWS/S3 authentication. */
@@ -110,4 +110,4 @@ type S3SignDevCallResult = {
110
110
  */
111
111
  declare function callS3SignDev(params: S3SignDevCallParams): Promise<S3SignDevCallResult>;
112
112
 
113
- export { type BrokerDevCallParams, type BrokerDevCallResult, type BrokerEnvironment, type S3SignDevCallParams, type S3SignDevCallResult, type UpstreamResponse, callBrokerDev, callS3SignDev };
113
+ export { type BrokerDevCallParams, type BrokerDevCallResult, type BrokerRegion, type S3SignDevCallParams, type S3SignDevCallResult, type UpstreamResponse, callBrokerDev, callS3SignDev };
@@ -1 +1 @@
1
- import{p as n,q as o,r as i,s,t as d,u,v as l}from"../chunk-KUXDW5ED.js";async function a(e){let r=o({authenticationId:e.authenticationId,method:e.method,url:e.url,body:e.body,headers:e.headers,query:e.query}),t=await s({proxyUrl:n(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},request:r,timeoutMs:e.timeoutMs??i});return t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"upstream",upstream:t.response}}async function k(e){d(e.url);let r=await l({signUrl:u(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},body:{authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},timeoutMs:e.timeoutMs});return r.kind==="brokerError"?{kind:"brokerError",brokerStatus:r.status,code:r.code,body:r.body}:{kind:"signed",signed:r.result}}export{a as callBrokerDev,k as callS3SignDev};
1
+ import{B as n,D as o,E as i,F as s,G as d,H as u,I as l}from"../chunk-HEA646WT.js";async function a(e){let r=o({authenticationId:e.authenticationId,method:e.method,url:e.url,body:e.body,headers:e.headers,query:e.query}),t=await s({proxyUrl:n(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},request:r,timeoutMs:e.timeoutMs??i});return t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"upstream",upstream:t.response}}async function k(e){d(e.url);let r=await l({signUrl:u(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},body:{authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},timeoutMs:e.timeoutMs});return r.kind==="brokerError"?{kind:"brokerError",brokerStatus:r.status,code:r.code,body:r.body}:{kind:"signed",signed:r.result}}export{a as callBrokerDev,k as callS3SignDev};
@@ -0,0 +1,7 @@
1
+ import{A as Pt,B as xe,C as H,D as te,F as At,G as Tt,H as kt,I as Ot,a as O,b as be,d as b,e as we,f as F,h as wt,j as _,k as St,o as xt,r as c,t as vt,u as Et,v as Se,w as Rt,x as It,y as K,z as Ct}from"./chunk-HEA646WT.js";var Zi="tray-config-bridge",es="tray-dev-token-bridge",ve=null;function ts(e){ve=e}function w(){if(!ve)throw new Error("Active tray config not seeded. Worker boot must call setActiveConfig() before handlers run.");return ve}function rs(){ve=null}import{AsyncLocalStorage as Xt}from"async_hooks";import{trace as Bn,SpanKind as $n,SpanStatusCode as Ge}from"@opentelemetry/api";import{ExportResultCode as Kn,W3CTraceContextPropagator as Hn}from"@opentelemetry/core";import{NodeTracerProvider as Vn,SimpleSpanProcessor as qn,BatchSpanProcessor as zn}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Pn}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as An}from"@opentelemetry/exporter-logs-otlp-proto";function Je(e){return _(e).hosts.ingest}function Tn(){return F()??""}function Ft(){return{[O]:Tn()}}function _t(){let e=Je(w().region);return new Pn({url:`${e}/v1/traces`,headers:()=>Promise.resolve(Ft())})}function Dt(){let e=Je(w().region);return new An({url:`${e}/v1/logs`,headers:()=>Promise.resolve(Ft())})}import{logs as Mt,SeverityNumber as Ee}from"@opentelemetry/api-logs";import{LoggerProvider as Fn,BatchLogRecordProcessor as _n}from"@opentelemetry/sdk-logs";function re(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function kn(e){return new TextEncoder().encode(e).length}var Lt="\u2026[truncated]",On=kn(Lt),ne=4096;function j(e,t=ne){let r=new TextEncoder().encode(e);if(r.length<=t)return e;let n=r.subarray(0,t-On);return new TextDecoder("utf-8").decode(n).replace(/�$/,"")+Lt}function S(e,t=ne){return j(re(e),t)}var Dn="@trayai/helix-sdk",oe,Ut={debug:{number:Ee.DEBUG,text:"DEBUG"},info:{number:Ee.INFO,text:"INFO"},warn:{number:Ee.WARN,text:"WARN"},error:{number:Ee.ERROR,text:"ERROR"}};function Ln(){return b().mode==="lambda"?[new _n({exporter:Dt()})]:[]}function Nt(){if(oe!==void 0)return;let e=Ln();e.length!==0&&(oe=new Fn({processors:e}),Mt.setGlobalLoggerProvider(oe))}function Un(e,t,r){let n=Ut[e]??Ut.info;return{severityNumber:n.number,severityText:n.text,body:t,...r?{attributes:{"tray.log.meta":S(r)}}:{}}}function jt(e,t,r){Mt.getLogger(Dn).emit(Un(e,t,r))}async function Bt(e=2e3){if(oe===void 0)return;let t;try{await Promise.race([oe.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 Ye(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function Mn(){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 A(e,t){return Mn()?`\x1B[${e}m${t}\x1B[0m`:t}var Nn=5,jn={FN:"1;35",INFO:"34",AUTH:"35",API:"36",WARN:"33",ERROR:"31",DEBUG:"90"},$t="32",Kt="31",Re="2",Ht="1";function Ie(e){return A(jn[e]??"0",e.padEnd(Nn))}function Vt(e,t){return`${Ie("FN")} ${A(Ht,`${e} ${t}`.trim())}`}function qt(e,t,r,n){let o=e.toUpperCase(),s=`${n?`${A(Re,n)} `:""}${Ie(o)} ${t}`;return r&&Object.keys(r).length>0&&(s+=` ${A(Re,re(r))}`),s}function zt(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Jt(e){return`${Ie("AUTH")} ${e}`}function Yt(e,t,r,n,o){let i=r===void 0?"ERR":String(r),s=A(o==="error"?Kt:$t,i);return`${Ie("API")} ${e} ${t} \u2192 ${s} ${A(Re,`${n}ms`)}`}function Gt(e,t,r){let n=t?Kt:$t,o=A(n,"\u25CF"),i=A(n,t?"error":"success");return`${o} ${A(Ht,e)} ${i} ${A(Re,`${r}ms`)}`}function V(e){try{process.stdout.write(e+`
3
+ `)}catch{}}var Qt=new Xt,Jn=new Xt;function E(e){let t=Jn.getStore();t&&(t[e]=!0)}var Yn=/^[0-9a-f]{32}$/;function Gn(e){let t=e.replace(/-/g,"").toLowerCase();return Yn.test(t)?t:null}var Wn={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},q=new Map;function Zt(e,t,r){let n=q.get(e);n?n[t]=r:q.set(e,{[t]:r})}function T(e,t,r){e.setAttribute(t,S(r))}var ie;function Wt(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function Xn(e){return Math.round(e[0]*1e3+e[1]/1e6)}function er(e){try{process.stdout.write(re(e)+`
4
+ `)}catch{}}var We=class{export(t,r){for(let n of t){let o=n.spanContext().spanId,i=q.get(o),s={...n.attributes};if(i!==void 0){for(let[u,m]of Object.entries(i))typeof m=="string"?s[u]=j(m):typeof m=="object"&&m!==null?s[u]=S(m):s[u]=m;q.delete(o)}let a=Qt.getStore(),l=a?Gn(a):null;er({_otel:"span",traceId:l??n.spanContext().traceId,spanId:o,parentSpanId:n.parentSpanContext?.spanId??"",name:n.name,kind:n.kind,startTimeUnixNano:Wt(n.startTime),endTimeUnixNano:Wt(n.endTime),attributes:s,status:{code:Wn[n.status.code]??"STATUS_CODE_UNSET",...n.status.message?{message:j(n.status.message)}:{}}})}r({code:Kn.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Xe=class{onStart(t,r){}onEnd(t){q.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Qe=class{onStart(t){let r=t;(r.name==="function"||r.name==="App")&&V(`
5
+ `+Vt(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=q.get(n)?.properties;V(qt(String(r.level??"info"),String(r.message??""),o,zt(t.startTime)));break}case"auth":V(Jt(String(r.alias??"")));break;case"externalApi":{let n=typeof r.statusCode=="number"?r.statusCode:void 0;V(Yt(String(r.method??""),String(r.host??""),n,Xn(t.duration),r.status==="error"?"error":"success"));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Ze=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 Qn(){let t=[Ye()?new Qe:new qn(new We)];return b().mode==="lambda"&&t.push(new Ze(new zn(_t()))),t.push(new Xe),t}function Zn(){ie===void 0&&(ie=new Vn({spanProcessors:Qn()}),ie.register({propagator:new Hn}),Nt())}async function eo(e=2e3){let t=[Bt(e)];ie!==void 0&&t.push((async()=>{let r;try{await Promise.race([ie.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 P=Bn.getTracer("@trayai/helix-sdk");function to({executionId:e,deploymentId:t,triggerType:r="http",routeOrJob:n,startedAt:o,startMs:i,errored:s,errorMessage:a,userId:l,flags:u}){let m=new Date().toISOString(),f=Date.now()-i;if(Ye()){V(`
7
+ `+Gt(n,s,f));return}er({_otel:"summary",executionId:e,deploymentId:t,triggerType:r,routeOrJob:n,status:s?"error":"success",startedAt:o,finishedAt:m,durationMs:f,userId:l,hasError:s||u.hasError,hasAuth:u.hasAuth,hasAi:u.hasAi,hasExternal:u.hasExternal,hasDb:u.hasDb,errorSummary:s&&a!==null?j(a):null})}async function ks(e,t){let r=e.startMs??Date.now();Zn();let n=!1,o=null;try{return await Qt.run(e.executionId,()=>P.startActiveSpan("App",{kind:$n.SERVER,attributes:{method:e.method,route:e.route,...e.deploymentId?{deploymentId:e.deploymentId}:{}}},async i=>{try{let s=await t(),a=s?.httpResponse?.status??404;return n=a>=400,i.setAttribute("http.response.status_code",a),i.setAttribute("helix.status",n?"error":"success"),i.setStatus({code:n?Ge.ERROR:Ge.OK}),s}catch(s){throw n=!0,o=s instanceof Error?s.message:String(s),i.setAttribute("http.response.status_code",500),i.setAttribute("helix.status","error"),i.setStatus({code:Ge.ERROR,message:o}),s}finally{i.end()}}))}finally{to({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,hasAi:!1,hasError:!1}}),await eo()}}var nr=1024,D=100*1024*1024,tr=250,ro=3600,no=ro*1e3,rr=new TextEncoder,oo=/(^|\/)\.\.(\/|$)/,io=/[?#]/;function so(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=31||r===127)return!0}return!1}function B(e,t=nr){if(e.length===0)throw c.filesPathInvalid("Path must be a non-empty string");Ce(e,t)}function et(e){return e.endsWith("/")?e.slice(0,-1):e}function Ce(e,t=nr){if(e.length===0)return;if(oo.test(e))throw c.filesPathInvalid("Path contains path traversal segment");if(io.test(e)||so(e))throw c.filesPathInvalid("Path contains illegal characters");let r=e.split("/");if(e.startsWith("/")||e.endsWith("/")||r.some(o=>o===""))throw c.filesPathInvalid("Path must not contain empty path segments");for(let o of r){let i=rr.encode(o).length;if(i>tr)throw c.filesPathInvalid(`Path segment exceeds ${tr} UTF-8 bytes (got ${i})`)}let n=rr.encode(e).length;if(n<1||n>t)throw c.filesPathInvalid(`Path must be between 1 and ${t} UTF-8 bytes (got ${n})`)}function or(e){if(e>D)throw c.filesValueTooLarge(`File exceeds maximum size of ${D} bytes (got ${e})`,D)}function z(e){let t=e!==void 0?e*1e3:no;return new Date(Date.now()+t)}import{join as ae}from"path";var ao="files",co="files-meta",lo=1023,uo=1,fo=5;function ir(e){let t=Math.max(Buffer.byteLength(Pe(e),"utf8"),Buffer.byteLength(se(e),"utf8"));return Math.max(0,lo-t-uo-fo)}function Pe(e){return ae(e,".helix",ao)}function se(e){return ae(e,".helix",co)}function ce(e,t){return ae(Pe(e),...t.split("/"))}function Ae(e,t){return ae(se(e),...t.split("/"))+".json"}function Te(e,t){return t.length===0?Pe(e):ce(e,t)}function sr(e,t){return t.length===0?se(e):ae(se(e),...t.split("/"))}import{z as mo}from"zod";var Ns=["us1","eu1","ap1","ap2"],tt=mo.string().refine(e=>wt(e),e=>({message:`Invalid enum value. Expected ${St().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));import{resolve as L}from"path";import{existsSync as ke,realpathSync as ar}from"fs";import{loadConfig as po}from"c12";import{z as h}from"zod";var lr=h.string().uuid("projectId must be a valid UUID"),ur=h.string().min(1,"workspaceId must be a non-empty string"),le=["openai","anthropic","google","mistral","cohere","openai-compatible"],go=["openai","anthropic","google","mistral","cohere"],dr=h.union([h.enum(go),h.object({service:h.enum(le),baseUrl:h.string().url().optional()}).refine(e=>e.service!=="openai-compatible"||e.baseUrl!==void 0,{message:'aiProviders: baseUrl is required when service is "openai-compatible"'}).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)"})]),yo=h.object({name:h.string().min(1,"name is required"),projectId:lr.optional(),workspaceId:ur.optional(),region:tt.optional(),env:h.literal("production").optional(),authentications:h.record(h.string()).optional().default({}),config:h.record(h.unknown()).optional().default({}),aiProviders:h.record(dr).optional()}).transform(({env:e,region:t,...r})=>({...r,region:t??"us1"})),cr=h.object({name:h.string().min(1,"name is required"),workspaceId:ur.optional(),region:tt,authentications:h.record(h.string()),config:h.record(h.unknown()),aiProviders:h.record(dr).optional()}),Js=h.discriminatedUnion("kind",[cr.extend({kind:h.literal("provisioned"),projectId:lr}),cr.extend({kind:h.literal("unprovisioned")})]),fr=["helix","tray"],mr=["ts","mts","cts","js","mjs","cjs"],pr="HELIX_CONFIG";function rt(e){let t=e?.trim();return t||process.env[pr]?.trim()||void 0}function ho(e,t){let r=rt(t?.configFile);if(r!==void 0){let n=L(e,r);return ke(n)?n:void 0}for(let n of fr)for(let o of mr){let i=L(e,`${n}.config.${o}`);if(ke(i))return i}}function bo(e){for(let t of fr)if(mr.some(r=>ke(L(e,`${t}.config.${r}`))))return t;return"helix"}function wo(e,t){return L(e,t).replace(/\.(?:m|c)?[jt]s$/,"")}function So(e,t){let r=rt(t?.configFile);return{name:bo(e),cwd:e,...r!==void 0?{configFile:wo(e,r)}:{},rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function xo(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=yo.safeParse(e);if(!r.success){let u=r.error.issues.map(m=>m.message).join("; ");throw c.configLoadFailed(`Invalid helix.config.ts at ${t}: ${u}`)}let{projectId:n,workspaceId:o,...i}=r.data,s=o!==void 0?{workspaceId:o}:{},a=xt(),l=a!==void 0?{...i,region:a}:i;return n!==void 0?{kind:"provisioned",projectId:n,...l,...s}:{kind:"unprovisioned",...l,...s}}async function Ys(e,t){let r=e??process.cwd(),n=rt(t?.configFile),o=n!==void 0?L(r,n):void 0;if(o!==void 0&&!ke(o)){let a=t?.configFile?.trim()?"":` (from ${pr})`;throw c.configLoadFailed(`Config file not found: ${o}${a}`)}let i;try{i=await po(So(r,t))}catch(a){throw c.configLoadFailed(`Failed to load helix.config.ts: ${a instanceof Error?a.message:String(a)}`)}let s=i._configFile??ho(r,t);if(!s)throw c.configLoadFailed(`helix.config.ts not found at ${L(r,"helix.config.ts")}`);if(o!==void 0&&i._configFile!==void 0){let a=ar(o);if(ar(L(i._configFile))!==a)throw c.configLoadFailed(`Config file conflict: requested ${o} but ${L(i._configFile)} takes extension-resolution precedence \u2014 remove or rename the sibling file`)}return xo(i.config,s)}var vo="WORKSPACE_ID_REQUIRED";function Gs(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:vo});return e.workspaceId}var gr="helix-schedule",U=class extends Error{constructor(t){super(`defineSchedule: ${t}`),this.name="ScheduleConfigError"}};function Xs(e){if(typeof e!="object"||e===null)throw new U("expected a config object");let{cron:t,timezone:r="UTC",concurrent:n=!1,handler:o}=e;if(typeof t!="string"||t.trim()==="")throw new U("`cron` must be a non-empty string");let i=t.trim().split(/\s+/).length;if(i!==5)throw new U(`\`cron\` must be a 5-field standard expression (minute hour day-of-month month day-of-week); got ${i} field(s) in "${t}"`);if(typeof r!="string"||!Eo(r))throw new U(`\`timezone\` must be a valid IANA timezone name (e.g. "Europe/London"); got "${String(r)}"`);if(typeof n!="boolean")throw new U("`concurrent` must be a boolean");if(typeof o!="function")throw new U("`handler` must be a function");return Object.freeze({kind:gr,cron:t.trim(),timezone:r,concurrent:n,handler:o})}function Qs(e){return typeof e=="object"&&e!==null&&e.kind===gr&&typeof e.handler=="function"}function Eo(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 Ro}from"@opentelemetry/api";function Oe(e,t,r){let n=P.startSpan("log",{kind:Ro.INTERNAL});n.setAttribute("message",t),n.setAttribute("level",e),r&&Zt(n.spanContext().spanId,"properties",r),n.end(),jt(e,t,r)}function yr(){return{info:(e,t)=>Oe("info",e,t),warn:(e,t)=>Oe("warn",e,t),error:(e,t)=>Oe("error",e,t),debug:(e,t)=>Oe("debug",e,t)}}function ia(){try{return w().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}import Io from"ky";import{context as nt,trace as Co,SpanKind as de,SpanStatusCode as br}from"@opentelemetry/api";async function Fe(e,t={}){let r=b(),{region:n}=w(),{headers:o,deploymentId:i}=H(r);i&&(o[Se]=i);let s=xe(n,r.mode==="lambda"?"runtime":"dev"),a;try{a=await At({proxyUrl:s,credentialHeaders:o,request:e,timeoutMs:t.timeout,executionId:r.executionId})}catch(l){let u=l instanceof Error?l.message??String(l):String(l);throw c.brokerError(0,u)}if(a.kind==="brokerError"){let l=a.code===K?"credential broker does not support the raw proxy endpoints required by this SDK version \u2014 deploy a newer broker or pin an older SDK":a.message;throw c.brokerError(a.status,l,S(a.body),a.code)}return a.response}async function hr(e){Tt(e.url);let t=b(),{region:r}=w(),n={authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},{headers:o,deploymentId:i}=H(t);i&&(n.deploymentId=i);let s=kt(r,t.mode==="lambda"?"runtime":"dev"),a;try{a=await Ot({signUrl:s,credentialHeaders:o,body:n,timeoutMs:e.timeout,executionId:t.executionId})}catch(l){let u=l instanceof Error?l.message??String(l):String(l);throw c.brokerError(0,u)}if(a.kind==="brokerError"){let l=a.code===K?"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 c.brokerError(a.status,l,S(a.body),a.code)}return a.result}var Po=["get","post","put","patch","delete","head","options"],Sr="[stream body omitted]";function xr(e){return typeof ReadableStream<"u"&&e instanceof ReadableStream?Sr: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 ot(e){try{return new URL(e).hostname}catch{return e}}function wr(e,t,r,n,o){let i=ot(t),s="externalApi",a={kind:de.CLIENT};return P.startActiveSpan(s,a,async l=>(l.setAttributes({method:e,host:i,"peer.service":n}),T(l,"request",{url:t,method:e,...r!==void 0?{body:xr(r)}:{}}),o(l)))}function ue(e,t,r){e.setAttribute("status",t),e.setStatus(t==="success"?{code:br.OK}:{code:br.ERROR,message:r}),e.end()}var Ao=16;async function To(e,t){let r=e.clone().body;return r?vr(r,t):new Uint8Array(0)}async function vr(e,t){let r=e.getReader(),n=[],o=0,i=0;try{for(;;){let{done:l,value:u}=await r.read();if(l)break;if(!u||u.byteLength===0){if(i+=1,i>=Ao)break;continue}i=0;let m=t+1-o;if(u.byteLength>=m){n.push(u.slice(0,m)),o+=m;break}n.push(u),o+=u.byteLength}}finally{r.cancel().catch(()=>{}),r.releaseLock()}let s=new Uint8Array(o),a=0;for(let l of n)s.set(l,a),a+=l.byteLength;return s}async function Er(e,t,r){if("kyResponse"in r)try{let n=await To(r.kyResponse,ne),o=new TextDecoder("utf-8").decode(n,{stream:!0}),i;try{i=JSON.parse(o)}catch{i=o}T(e,"response",i)}catch{T(e,"response",{status:t})}else T(e,"response",xr(r.bodyValue))}async function ko(e,t){if(t instanceof ReadableStream){let r=e.body??t;try{let[n,o]=r.tee(),i=new Request(e,{body:n,duplex:"half"}),s=await vr(o,ne);return{body:new TextDecoder("utf-8").decode(s,{stream:!0}),request:i}}catch{return{body:Sr}}}return typeof t=="string"?{body:t}:{}}function ka(){let e=Io.create({});function t(n){return(o,i)=>{let s=nt.active(),a,l=!1,u=(f,g)=>{a&&!l&&(l=!0,ue(a,f,g))},m=e.extend({hooks:{beforeRequest:[async(f,g)=>{let y=await ko(f,g.body),x=y.body;if(a||(a=P.startSpan("externalApi",{kind:de.CLIENT},s)),a.setAttributes({method:f.method.toUpperCase(),host:ot(f.url)}),T(a,"request",{url:f.url,method:f.method.toUpperCase(),...x!==void 0?{body:x}:{}}),l=!1,E("hasExternal"),y.request)return y.request}],beforeRetry:[f=>{u("error","retry"),a=void 0,l=!1}],afterResponse:[async(f,g,y)=>{a&&(a.setAttribute("statusCode",y.status),await Er(a,y.status,{kyResponse:y}),y.ok?u("success"):i?.throwHttpErrors===!1&&(E("hasError"),u("error",`HTTP ${y.status}`)))}],beforeError:[f=>(E("hasError"),u("error",f.message),f)]}});return a=P.startSpan("externalApi",{kind:de.CLIENT},s),a.setAttributes({method:n.toUpperCase(),host:ot(String(o))}),nt.with(Co.setSpan(nt.active(),a),()=>{let f=n==="options"?m(o,{...i,method:"OPTIONS"}):m[n](o,i);return f.catch(g=>{E("hasError"),u("error",g instanceof Error?g.message:String(g))}),f})}}let r=Object.fromEntries(Po.map(n=>[n,t(n)]));return{...e,...r,authed(n){return Oo(n)}}}function Oo(e){let r=w().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e];function o(s){return(a,l={})=>{let u=s.toUpperCase();return wr(u,a,l.body,e,async m=>{E("hasAuth");let f=P.startSpan("auth",{kind:de.INTERNAL});f.setAttribute("alias",e),f.setAttribute("id",n),f.end();try{let g=te({authenticationId:n,method:u,url:a,body:l.body,headers:l.headers,query:l.query}),y=await Fe(g,{timeout:l.timeout});return m.setAttribute("statusCode",y.status),await Er(m,y.status,{bodyValue:y.body}),ue(m,"success"),y}catch(g){throw E("hasError"),g instanceof c&&g.detail.kind==="broker_error"&&g.detail.status>0&&m.setAttribute("statusCode",g.detail.status),ue(m,"error",g instanceof Error?g.message:String(g)),g}})}}function i(s,a={}){let l=a.method??"GET";return wr(l,s,void 0,e,async u=>{E("hasAuth");let m=P.startSpan("auth",{kind:de.INTERNAL});m.setAttribute("alias",e),m.setAttribute("id",n),m.end();try{let f=await hr({authenticationId:n,url:s,method:l,...a.expiresIn!==void 0?{expiresIn:a.expiresIn}:{},...a.timeout!==void 0?{timeout:a.timeout}:{}});return u.setAttribute("statusCode",200),ue(u,"success"),f}catch(f){throw E("hasError"),f instanceof c&&f.detail.kind==="broker_error"&&f.detail.status>0&&u.setAttribute("statusCode",f.detail.status),ue(u,"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"),s3Sign:i}}import{SpanKind as Bo,SpanStatusCode as Pr}from"@opentelemetry/api";function fe(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Fo=18e4,Rr=Fo-1e4,_o=2e3;async function Ir(e,t,r){let n=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),i=0;for(;Date.now()-o<Rr;){let s=await e(t,"DescribeStatement",{Id:r}),a=s.Status;if(n.has(a))return s;let l=Math.min(_o,200*2**i),u=l/2+Math.random()*(l/2),m=Rr-(Date.now()-o);await new Promise(f=>setTimeout(f,Math.min(u,m))),i++}throw c.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var Do=new Set(["SELECT","WITH","SHOW"]),Lo=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function Uo(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 Mo(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 i=typeof t=="string"?j(t):S(t);return c.dbCallFailed(i)}function No(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 jo(e,t){return typeof t!="number"||t<0?{}:Do.has(e)?{rowsRead:t}:Lo.has(e)?{rowsWritten:t}:{}}function Cr(e){async function t(r,n,o){let i=te({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:s,body:a}=await Fe(i);if(s>=400)throw Mo(s,a);return No(a)}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message??String(s):String(s);throw c.dbCallFailed(a,s instanceof Error?s:void 0)}}return{system:"redshift",validate:Uo,async execute(r,n){let o=fe(n),i={Sql:n,Database:r.database,...r.clusterIdentifier&&{ClusterIdentifier:r.clusterIdentifier,DbUser:r.dbUser},...r.workgroupName&&{WorkgroupName:r.workgroupName},...r.statementName&&{StatementName:r.statementName}},s=await t(r.region,"ExecuteStatement",i),a=s,l=typeof a?.Id=="string"?a.Id:void 0;if(!l){let y=S(s);throw c.dbCallFailed(`ExecuteStatement response missing Id; got: ${y}`)}let u=await Ir(t,r.region,l),m=u.Status;if(m==="FAILED"){let y=typeof u.Error=="string"?u.Error:"statement failed";throw c.dbQueryFailed(`${y} (statement: ${l})`)}if(m==="ABORTED")throw c.dbQueryFailed(`statement aborted (statement: ${l})`);let f=jo(o,u.ResultRows);return u.HasResultSet===!1?{result:{rowsAffected:u.ResultRows??0},metadata:f}:{result:await t(r.region,"GetStatementResult",{Id:l}),metadata:f}}}}var it=64*1024;function $o(e){return e.length>it?`${e.slice(0,it)}...[truncated]`:e}function Ko(e,t,r,n,o){e.setAttributes({system:t.system,statement:o,namespace:r.database,operation:n})}function Ho(e,t,r){let n=typeof t=="string"?t:JSON.stringify(t);return n.length>it?T(e,"result",{truncated:!0,size:n.length}):T(e,"result",t),r.rowsRead!==void 0&&e.setAttribute("rowsRead",r.rowsRead),r.rowsWritten!==void 0&&e.setAttribute("rowsWritten",r.rowsWritten),n}async function Vo(e,t,r){let n=fe(r),o=$o(r);return P.startActiveSpan("database",{kind:Bo.CLIENT},async i=>{Ko(i,e,t,n,o);try{E("hasDb");let{result:s,metadata:a}=await e.execute(t,r),l=Ho(i,s,a);return i.setAttribute("status","success"),i.setStatus({code:Pr.OK}),l}catch(s){E("hasError");let a=s instanceof Error?s.message:String(s);throw i.setAttribute("status","error"),i.setStatus({code:Pr.ERROR,message:a}),s}finally{i.end()}})}function qo(e){let r=w().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=Cr(n);function i(s,a){return o.validate(s),Vo(o,s,a)}return{parameters(s){return{sql(a){return i(s,a)}}},sql(s){return i({},s)}}}import{createStorage as Wo}from"unstorage";var Ar=1024,st=250*1024,zo=new TextEncoder,Jo=/(^|\/)\.\.(\/|$)/,Yo=/[?#]/,Go=/[\u0000-\u001F\u007F]/;function Tr(e){if(e.length===0)throw c.kvKeyInvalid("Key must be a non-empty string");if(Jo.test(e))throw c.kvKeyInvalid("Key contains path traversal segment");if(Yo.test(e)||Go.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=zo.encode(e).length;if(t<1||t>Ar)throw c.kvKeyInvalid(`Key must be between 1 and ${Ar} UTF-8 bytes (got ${t})`)}function kr(e){if(!Number.isInteger(e)||e<=0)throw c.kvTtlInvalid(`ttl must be a positive integer number of seconds (got ${e})`)}function Or(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>st)throw c.kvValueTooLarge(`Value exceeds maximum size of ${st} bytes (got ${r})`,st)}function me(e){Tr(e)}function _e(e,t){let r=e[t];if(typeof r!="function")throw new Error(`KV driver is missing ${t}`);return r}function Fr(e){let t=_e(e,"getItem"),r=_e(e,"setItem"),n=_e(e,"removeItem"),o=_e(e,"hasItem"),i=e.getKeys;return{...e,getItem(s,a){return me(s),t(s,a)},setItem(s,a,l){return me(s),r(s,a,l)},removeItem(s,a){return me(s),n(s,a)},hasItem(s,a){return me(s),o(s,a)},getKeys(s,a){return s.length>0&&me(s),i(s,a)}}}function De(e){return Wo({driver:Fr(e)})}import{defineDriver as Xo}from"unstorage";function Qo(e){try{return JSON.parse(e)}catch{return e}}var Zo=Xo(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,o){let i=o?.ttl,s=Qo(n);i!==void 0?await t.set(r,s,{ttl:i}):await t.set(r,s)},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 _r(e){return Zo({client:e})}import ri from"ky";import{z as R}from"zod";async function M(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 Dr(e){return _(e).hosts.api}function ei(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function ti(e){return e.split("/").map(encodeURIComponent).join("/")}function pe(e,t,r){return`${e}${ei(t)}/${ti(r)}`}var ni=6e4,at=R.lazy(()=>R.union([R.string(),R.number(),R.boolean(),R.null(),R.array(at),R.record(at)])),oi=R.object({projectId:R.string(),key:R.string(),value:at,type:R.enum(["string","number","boolean","null","array","object"]),organizationId:R.string(),scope:R.string(),createdBy:R.string(),createdAt:R.number(),updatedBy:R.string(),updatedAt:R.number()});function ii(){let e=we(),t=F(),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[be]=e),n&&(o[O]=t),o}function si(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 Le(e,t){throw c.kvCallFailed(e,si(t),S(t))}async function Ue(e,t,r={}){try{let n=await ri(t,{method:e,headers:ii(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ni}),o=e==="head"?void 0:await M(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 Lr(e){let t=Dr(e.env),{projectId:r}=e;return{async get(n){let{status:o,body:i}=await Ue("get",pe(t,r,n));if(o===404)return null;(o<200||o>=300)&&Le(o,i);let s=oi.safeParse(i);if(!s.success)throw c.kvCallFailed(o,"platform returned malformed KeyValueEntry",S(i));return s.data.value},async set(n,o,i){let{status:s,body:a}=await Ue("put",pe(t,r,n),{json:i?.ttl!==void 0?{value:o,ttl:i.ttl}:{value:o}});(s<200||s>=300)&&Le(s,a)},async delete(n){let{status:o,body:i}=await Ue("delete",pe(t,r,n));o!==204&&Le(o,i)},async has(n){let{status:o,body:i}=await Ue("head",pe(t,r,n));if(o===200)return!0;if(o===404)return!1;Le(o,i)}}}function Me(e){return{getItem:t=>e.getItem(t),removeItem:t=>e.removeItem(t),hasItem:t=>e.hasItem(t),setItem:async(t,r,n)=>{let o=n?.ttl;Or(r),typeof o=="number"&&kr(o),await e.setItem(t,r,o!==void 0?{ttl:o}:void 0)}}}function ai(){let e=w();if(e.kind!=="provisioned")throw c.kvRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Ur(e){let t=ai(),r=e??Lr(t),n=De(_r(r));return Me(n)}import{defineDriver as ci}from"unstorage";var li=ci(e=>{let t=new Map;function r(n){let o=t.get(n);if(o&&o.expiresAt!==void 0&&o.expiresAt<=Date.now()){t.delete(n);return}return o}return{name:"memory-ttl",getItem(n){return r(n)?.value??null},setItem(n,o,i){let s=i?.ttl,a=r(n),l=typeof s=="number"?Date.now()+s*1e3:s===null?void 0:a?.expiresAt;t.set(n,{value:o,expiresAt:l})},removeItem(n){t.delete(n)},hasItem(n){return r(n)!==void 0},getKeys(){return[...t.keys()].filter(n=>r(n)!==void 0)},clear(){t.clear()}}});function Mr(){return li({})}var ct;function ui(){return ct||(ct=De(Mr())),ct}function Nr(){return Me(ui())}function di(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Lc(){return di()?Ur():Nr()}import{createHash as pi}from"crypto";import{mkdir as gi,readFile as Hr,readdir as Vr,rm as Br,unlink as yi,writeFile as $r}from"fs/promises";import{dirname as hi}from"path";async function fi(e){let t=e.getReader(),r=[],n=0;for(;;){let{done:o,value:i}=await t.read();if(o)break;if(i){if(n+=i.byteLength,n>D)throw await t.cancel(),c.filesValueTooLarge(`File exceeds maximum size of ${D} bytes (got more than ${D})`,D);r.push(i)}}return Buffer.concat(r)}async function J(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?fi(e):Buffer.from(e)}var mi={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"},jr="application/octet-stream";function Ne(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return jr;let r=e.slice(t+1).toLowerCase();return mi[r]??jr}function G(){let e=b().projectRoot;if(!e)throw c.filesNotAvailable();return e}async function Y(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 je(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function lt(e){try{let t=await Hr(Ae(G(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Kr(e){await gi(hi(e),{recursive:!0})}async function bi(e,t){let r=Te(e,t),n;try{n=await Vr(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 qr(e,t){let r=Te(e,t),n;try{n=await Vr(r,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return[];throw i}let o=[];for(let i of n){let s=t.length===0?i.name:`${t}/${i.name}`;i.isDirectory()?o.push(...await qr(e,s)):i.isFile()&&o.push(s)}return o}function zr(){return{async put(e,t,r){return Y(async()=>{let n=G(),o=await J(t),i=r?.contentType??Ne(e),s=pi("sha1").update(o).digest("hex"),a=new Date,l=ce(n,e);await Kr(l),await $r(l,o);let u={size:o.byteLength,contentType:i,lastModified:a.toISOString(),etag:s},m=Ae(n,e);return await Kr(m),await $r(m,JSON.stringify(u)),je(e,u)})},async get(e){return Y(async()=>{let t=await lt(e);return t?{data:await Hr(ce(G(),e)),metadata:je(e,t)}:null})},async head(e){return Y(async()=>{let t=await lt(e);return t?je(e,t):null})},async delete(e){return Y(async()=>{let t=G();await Promise.all([ce(t,e),Ae(t,e)].map(async r=>{try{await yi(r)}catch(n){if(n.code!=="ENOENT")throw n}}))})},async deleteMany(e){return Y(async()=>{let t=G(),r=await qr(t,e);return await Promise.all([Br(Te(t,e),{recursive:!0,force:!0}),Br(sr(t,e),{recursive:!0,force:!0})]),{deleted:r.length}})},async list(e,t){return Y(async()=>{let r=G(),n=t?.limit??100,i=(await bi(r,e??"")).slice(0,n);return{files:(await Promise.all(i.map(async a=>{let l=await lt(a);return l?je(a,l):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let r=b().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:z(t?.expiresIn)}},async getDownloadUrl(e,t){let r=b().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:z(t?.expiresIn)}}}}import{createHash as Ii}from"crypto";function Be(e){return _(e).hosts.api}function wi(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function ge(e,t){return`${e}${wi(t)}`}function W(e,t,r){return`${ge(e,t)}/${encodeURIComponent(r)}`}function $e(e,t,r){return`${W(e,t,r)}/upload`}function Jr(e,t,r){return`${W(e,t,r)}/download`}function Yr(e,t,r){return`${W(e,t,r)}/signed-url`}function Gr(e,t,r,n){let o=new URLSearchParams({name:n});return r&&o.set("parentFolder",r),`${ge(e,t)}/file?${o.toString()}`}function Wr(e,t,r,n){let o=new URLSearchParams({limit:String(n)});return r&&o.set("id",r),`${ge(e,t)}?${o.toString()}`}import dt from"ky";import{z as v}from"zod";var ft=6e4,Xr=v.object({id:v.string(),workspaceId:v.string(),projectId:v.string(),parentFolder:v.string().nullable().optional(),name:v.string(),size:v.number().nullable().optional(),objectType:v.enum(["Folder","File"]),contentType:v.string().nullable().optional(),createdAt:v.string(),updatedAt:v.string()}),Si=v.object({signedURL:v.string()}),xi=v.object({path:v.array(v.object({id:v.string(),name:v.string()})),elements:v.array(Xr)});function mt(){let e=we(),t=F(),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[be]=e),n&&(o[O]=t),o}function Qr(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 N(e,t){throw c.filesCallFailed(e,Qr(t),S(t))}function vi(e,t){return e===400&&Qr(t).toLowerCase()==="resource not found"}async function Ei(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 X(e,t,r={}){try{let n=await dt(t,{method:e,headers:mt(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ft}),o=await M(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 ut(e,t){let r=Xr.safeParse(t);if(!r.success)throw c.filesCallFailed(e,"platform returned malformed ObjectMetadata",S(t));return r.data}function Zr(e){let t=Be(e.env),{projectId:r}=e;return{async createMetadata(n){let{status:o,body:i}=await X("post",ge(t,r),{json:n});return(o<200||o>=300)&&N(o,i),ut(o,i)},async getByName(n,o){let{status:i,body:s}=await X("get",Gr(t,r,n,o));return i===404||vi(i,s)?null:((i<200||i>=300)&&N(i,s),ut(i,s))},async getById(n){let{status:o,body:i}=await X("get",W(t,r,n));return o===404?null:((o<200||o>=300)&&N(o,i),ut(o,i))},async listChildren(n,o){let{status:i,body:s}=await X("get",Wr(t,r,n,o));(i<200||i>=300)&&N(i,s);let a=xi.safeParse(s);if(!a.success)throw c.filesCallFailed(i,"platform returned malformed listing",S(s));return a.data},async uploadContent(n,o,i,s){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:s}),i);let{body:l,contentType:u}=await Ei(a),m;try{m=await dt($e(t,r,n),{method:"post",headers:{...mt(),"content-type":u},body:new Uint8Array(l),throwHttpErrors:!1,timeout:ft})}catch(g){if(g instanceof c)throw g;let y=g instanceof Error?g.message:String(g);throw c.filesCallFailed(0,y)}let f=await M(m);(m.status<200||m.status>=300)&&N(m.status,f)},async downloadContent(n){let o;try{o=await dt(Jr(t,r,n),{method:"get",headers:mt(),throwHttpErrors:!1,timeout:ft})}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message:String(s);throw c.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let s=await M(o);N(o.status,s)}let i=await o.arrayBuffer();return Buffer.from(i)},async getSignedDownloadUrl(n){let{status:o,body:i}=await X("get",Yr(t,r,n));(o<200||o>=300)&&N(o,i);let s=Si.safeParse(i);if(!s.success)throw c.filesCallFailed(o,"platform returned malformed signed URL response",S(i));return s.data.signedURL},async deleteById(n){let{status:o,body:i}=await X("delete",W(t,r,n));o===204||o===404||(o<200||o>=300)&&N(o,i)}}}function pt(e){return e.split("/").filter(t=>t.length>0)}function gt(e){return e instanceof c&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ri(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(gt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function yt(e,t){let r=pt(t),n=r[r.length-1],o;for(let i of r.slice(0,-1))o=(await Ri(e,o,i)).id;return{parentFolder:o,name:n}}async function ye(e,t){let r=pt(t),n=r[r.length-1],o;for(let i of r.slice(0,-1)){let s=await e.getByName(o,i);if(!s||s.objectType!=="Folder")return null;o=s.id}return{parentFolder:o,name:n}}async function ht(e,t){if(t.length===0)return;let r=pt(t),n;for(let o of r){let i=await e.getByName(n,o);if(!i||i.objectType!=="Folder")return null;n=i.id}return n}var Ci=500,Pi=8;async function Ai(e,t,r){let n=new Array(e.length),o=0;async function i(){for(;o<e.length;){let s=o++;n[s]=await r(e[s])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},i)),n}function Ti(){let e=w();if(e.kind!=="provisioned")throw c.filesRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function ki(e){return Ii("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:ki(t)}}async function en(e,t,r,n){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:n,name:r})}catch(o){if(gt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function tn(e,t){let{elements:r}=await e.listChildren(t,Ci);return(await Ai(r,Pi,async o=>{let i=o.objectType==="Folder"?await tn(e,o.id):1;return await e.deleteById(o.id),i})).reduce((o,i)=>o+i,0)}function rn(e){let t=Ti(),r=e??Zr(t),n=Be(t.env),{projectId:o}=t;return{async put(i,s,a){let{parentFolder:l,name:u}=await yt(r,i),m=await J(s),f=a?.contentType??Ne(i),g=await r.getByName(l,u);if(g&&g.objectType!=="File")throw c.filesCallFailed(409,`A folder already exists at "${i}"`);let y=g??await en(r,l,u,f);await r.uploadContent(y.id,m,u,f);let x=await r.getById(y.id);return Ke(i,x??y,f)},async get(i){let s=await ye(r,i);if(!s)return null;let a=await r.getByName(s.parentFolder,s.name);return!a||a.objectType!=="File"?null:{data:await r.downloadContent(a.id),metadata:Ke(i,a)}},async head(i){let s=await ye(r,i);if(!s)return null;let a=await r.getByName(s.parentFolder,s.name);return!a||a.objectType!=="File"?null:Ke(i,a)},async delete(i){let s=await ye(r,i);if(!s)return;let a=await r.getByName(s.parentFolder,s.name);a&&await r.deleteById(a.id)},async deleteMany(i){let s=await ht(r,i);if(s===null)return{deleted:0};let a=await tn(r,s);return i.length>0&&s!==void 0&&await r.deleteById(s),{deleted:a}},async list(i,s){let a=await ht(r,i??"");if(a===null)return{files:[],cursor:null};let l=s?.limit??100,{elements:u}=await r.listChildren(a,l);return{files:u.filter(f=>f.objectType==="File").map(f=>Ke(i?`${i}/${f.name}`:f.name,f)),cursor:null}},async getUploadUrl(i,s){let{parentFolder:a,name:l}=await yt(r,i),m=await r.getByName(a,l)??await en(r,a,l,s?.contentType);return{url:$e(n,o,m.id),expiresAt:z(s?.expiresIn)}},async getDownloadUrl(i,s){let a=await ye(r,i),l=a?await r.getByName(a.parentFolder,a.name):null;if(!l||l.objectType!=="File")throw c.filesCallFailed(404,`File not found: ${i}`);return{url:await r.getSignedDownloadUrl(l.id),expiresAt:z(s?.expiresIn)}}}}function bt(e,t){let r=t?.maxPathBytes;return{async put(n,o,i){B(n,r);let s=await J(o);return or(s.byteLength),e.put(n,s,i)},async get(n){return B(n,r),e.get(n)},async head(n){return B(n,r),e.head(n)},async delete(n){return B(n,r),e.delete(n)},async deleteMany(n){let o=et(n);return Ce(o,r),e.deleteMany(o)},async list(n,o){let i=et(n??"");return Ce(i,r),e.list(i,o)},async getUploadUrl(n,o){return B(n,r),e.getUploadUrl(n,o)},async getDownloadUrl(n,o){return B(n,r),e.getDownloadUrl(n,o)}}}function Oi(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Pl(){if(Oi())return bt(rn());let e=b().projectRoot;return bt(zr(),{maxPathBytes:e?ir(e):void 0})}import _i from"ky";function nn(e){return _(e).hosts.api}function Fi(){return"/private/v1/helix/function-calls"}function on(e){return`${e}${Fi()}`}var Di=5e3;function Li(){let e=F();if(!!!(e&&e.trim().length>0))throw c.callFunctionMissingExecutionJwt();return{Accept:"application/json",[O]:e}}function Ui(e,t){throw c.callFunctionCallFailed(e,Mi(t),S(t))}function Mi(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 sn(e){let t=nn(e.env);return{async callAsync(r,n){let o,i;try{let s=await _i(on(t),{method:"post",headers:Li(),json:{functionPath:r,input:n},throwHttpErrors:!1,timeout:Di});o=s.status,i=await M(s)}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message??String(s):String(s);throw c.callFunctionCallFailed(0,a)}(o<200||o>=300)&&Ui(o,i)}}}var an=1024;function He(e){if(typeof e!="string"||e.trim().length===0)throw c.callFunctionPathInvalid("functionPath must be a non-empty string");if(e.length>an)throw c.callFunctionPathInvalid(`functionPath must be at most ${an} characters`)}function Ni(){let e=w();if(e.kind!=="provisioned")throw c.callFunctionRequiresProvisioning();return{env:e.region}}function cn(e){return async function(r,n){He(r),await(e??sn(Ni())).callAsync(r,n)}}function ln(){return async function(t,r){He(t);let n=b().devServerUrl;if(!n)throw c.callFunctionNotAvailable();let o=t.startsWith("/")?t:`/${t}`,i=yr();fetch(`${n}${o}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r??{})}).then(s=>{s.ok||i.warn("ctx.callFunctionAsync: dev-mode dispatch returned a non-2xx response",{functionPath:t,status:s.status})}).catch(s=>{i.warn("ctx.callFunctionAsync: dev-mode dispatch failed",{functionPath:t,error:s instanceof Error?s.message:String(s)})})}}function ji(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Zl(){return ji()?cn():ln()}import{embed as gn,embedMany as yn,generateImage as hn,generateObject as bn,generateSpeech as wn,generateText as Sn,streamObject as xn,streamText as vn,transcribe as En}from"ai";import{SpanKind as Wi,SpanStatusCode as pn}from"@opentelemetry/api";import{createOpenAI as Hi}from"@ai-sdk/openai";import{createAnthropic as Vi}from"@ai-sdk/anthropic";import{createGoogle as qi}from"@ai-sdk/google";import{createMistral as zi}from"@ai-sdk/mistral";import{createCohere as Ji}from"@ai-sdk/cohere";import{createOpenAICompatible as Yi}from"@ai-sdk/openai-compatible";var Bi=new Set(["x-api-key","x-goog-api-key"]);function $i(e){return Ct(e)||Bi.has(e.toLowerCase())}function Ki(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function un(e){return async(t,r)=>{let n=Ki(t),o=new URL(n);if(o.protocol!=="https:")throw c.unsupportedScheme(o.protocol.replace(/:$/,""));let i=b(),{region:s}=w(),a=new Headers(r?.headers??(t instanceof Request?t.headers:void 0)),l=new Headers;for(let[d,p]of a.entries())$i(d)||l.append(d,p);l.set(vt,n),l.set(Et,e),i.executionId&&l.set(Rt,i.executionId);let{headers:u,deploymentId:m}=H(i);for(let[d,p]of Object.entries(u))l.set(d,p);m&&l.set(Se,m);let f=xe(s,i.mode==="lambda"?"runtime":"dev"),g=r?.body??(t instanceof Request?t.clone().body:void 0),y={method:r?.method??(t instanceof Request?t.method:"GET"),headers:l,redirect:"manual",signal:r?.signal??void 0};g!=null&&(y.body=g,typeof ReadableStream<"u"&&g instanceof ReadableStream&&(y.duplex="half"));let x;try{x=await fetch(f,y)}catch(d){if(d instanceof Error&&d.name==="AbortError")throw d;let p=d instanceof Error?d.message??String(d):String(d);throw c.brokerError(0,p)}let ee=x.headers.get(It);if(ee!==null){let d=await x.text(),p=d||ee;try{let I=Pt.safeParse(JSON.parse(d));I.success&&(p=I.data.error.message)}catch{}throw ee===K&&(p="credential broker does not support the raw proxy endpoint required by ctx.ai \u2014 deploy a newer broker or pin an older SDK"),c.brokerError(x.status,p,d||void 0,ee)}return x}}var Q="helix-broker";function dn(e){let{alias:t,service:r,baseUrl:n,authenticationId:o}=e,i=un(o);switch(r){case"openai":return Hi({apiKey:Q,fetch:i});case"anthropic":return Vi({apiKey:Q,fetch:i});case"google":return qi({apiKey:Q,fetch:i});case"mistral":return zi({apiKey:Q,fetch:i});case"cohere":return Ji({apiKey:Q,fetch:i});case"openai-compatible":{if(!n)throw c.aiUnsupportedService(t,r,[...le]);return Yi({name:t,baseURL:n,apiKey:Q,fetch:i})}}}var fn={"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}},Gi=Object.keys(fn).sort((e,t)=>t.length-e.length);function mn(e,t){let r=Gi.find(i=>e.startsWith(i));if(!r||!t)return{amount:0,currency:"USD"};let n=fn[r],o=((t.inputTokens??0)*n.input+(t.outputTokens??0)*n.output)/1e6;return{amount:Number(o.toFixed(8)),currency:"USD"}}function C(e,t,r){return P.startActiveSpan("ai",{kind:Wi.CLIENT},async n=>{n.setAttributes({operation:e.operation,model:e.model,...e.alias!==void 0?{alias:e.alias}:{}}),E("hasAi");try{let o=await t(),i=r?.(o);return i&&n.setAttributes({...i.inputTokens!==void 0?{inputTokens:i.inputTokens}:{},...i.outputTokens!==void 0?{outputTokens:i.outputTokens}:{}}),n.setAttribute("status","success"),n.setStatus({code:pn.OK}),o}catch(o){let i=o instanceof Error?o.message:String(o);throw n.setAttribute("status","error"),n.setStatus({code:pn.ERROR,message:i}),o}finally{n.end()}})}function Xi(){return`aireq_${crypto.randomUUID().replaceAll("-","")}`}function Z(e,t){return{cost:mn(e,t),requestId:Xi()}}function $(e){return typeof e=="object"&&e!==null&&"modelId"in e?String(e.modelId):String(e)}var Rn=new WeakSet;function he(e){return Rn.add(e),e}function k(e){if(typeof e!="object"||e===null)throw c.aiModelInstanceRequired(typeof e=="string"?e:String(e));if(!Rn.has(e))throw c.aiForeignModelRejected()}function Ve(e){return e.totalUsage??e.usage}function qe(e){return e.usage?.tokens!==void 0?{inputTokens:e.usage.tokens}:void 0}function ze(e){return e.usage}function Qi(e){let t=w(),r=t.authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=(t.aiProviders??{})[e];if(o===void 0)throw c.aiProviderNotConfigured(e,[...le]);let{service:i,baseUrl:s}=typeof o=="string"?{service:o,baseUrl:void 0}:o,a=dn({alias:e,service:i,baseUrl:s,authenticationId:n}),l=d=>he(a.languageModel(d)),u=d=>he(a.embeddingModel(d)),m=d=>he(a.imageModel(d)),f=d=>{if(!a.transcriptionModel)throw new Error(`AI provider "${i}" (alias "${e}") has no transcription models`);return he(a.transcriptionModel(d))},g=d=>{if(!a.speechModel)throw new Error(`AI provider "${i}" (alias "${e}") has no speech models`);return he(a.speechModel(d))},y=(d=>l(d)),x=(d,p)=>{let I=d.model;if(typeof I!="string")throw c.aiModelIdRequired(e,p);return I};return Object.assign(y,{specificationVersion:"v4",languageModel:l,embeddingModel:u,textEmbeddingModel:u,imageModel:m,transcriptionModel:f,speechModel:g,async generateText(d){let p=x(d,"generateText"),I=await C({operation:"generateText",model:p,alias:e},()=>Sn({...d,model:l(p)}),Ve);return Object.assign(I,{helix:Z(p,Ve(I))})},streamText(d){let p=x(d,"streamText");return E("hasAi"),vn({...d,model:l(p)})},async generateObject(d){let p=x(d,"generateObject"),I=await C({operation:"generateObject",model:p,alias:e},()=>bn({...d,model:l(p)}),Cn=>Cn.usage),In=I.usage;return Object.assign(I,{helix:Z(p,In)})},streamObject(d){let p=x(d,"streamObject");return E("hasAi"),xn({...d,model:l(p)})},async embed(d){let p=x(d,"embed");return C({operation:"embed",model:p,alias:e},()=>gn({...d,model:u(p)}),qe)},async embedMany(d){let p=x(d,"embedMany");return C({operation:"embedMany",model:p,alias:e},()=>yn({...d,model:u(p)}),qe)},async generateImage(d){let p=x(d,"generateImage"),I=await C({operation:"generateImage",model:p,alias:e},()=>hn({...d,model:m(p)}),ze);return Object.assign(I,{helix:Z(p,ze(I))})},async transcribe(d){let p=x(d,"transcribe");return C({operation:"transcribe",model:p,alias:e},()=>En({...d,model:f(p)}))},async generateSpeech(d){let p=x(d,"generateSpeech");return C({operation:"generateSpeech",model:p,alias:e},()=>wn({...d,model:g(p)}))}})}function Iu(){let e=new Map;return Object.assign((n=>{let o=e.get(n);return o||(o=Qi(n),e.set(n,o)),o}),{async generateText(n){k(n.model);let o=$(n.model),i=await C({operation:"generateText",model:o},()=>Sn(n),Ve);return Object.assign(i,{helix:Z(o,Ve(i))})},streamText(n){return k(n.model),E("hasAi"),vn(n)},async generateObject(n){k(n.model);let o=$(n.model),i=await C({operation:"generateObject",model:o},()=>bn(n),a=>a.usage),s=i.usage;return Object.assign(i,{helix:Z(o,s)})},streamObject(n){return k(n.model),E("hasAi"),xn(n)},async embed(n){return k(n.model),C({operation:"embed",model:$(n.model)},()=>gn(n),qe)},async embedMany(n){return k(n.model),C({operation:"embedMany",model:$(n.model)},()=>yn(n),qe)},async generateImage(n){k(n.model);let o=$(n.model),i=await C({operation:"generateImage",model:o},()=>hn(n),ze);return Object.assign(i,{helix:Z(o,ze(i))})},async transcribe(n){return k(n.model),C({operation:"transcribe",model:$(n.model)},()=>En(n))},async generateSpeech(n){return k(n.model),C({operation:"generateSpeech",model:$(n.model)},()=>wn(n))}})}export{Zi as a,es as b,ts as c,w as d,rs as e,Qt as f,Jn as g,E as h,T as i,Zn as j,eo as k,P as l,to as m,ks as n,yr as o,ia as p,ka as q,qo as r,Lc as s,B as t,ce as u,Ae as v,Pl as w,Zl as x,Ns as y,tt as z,lr as A,ur as B,le as C,dr as D,Js as E,pr as F,rt as G,ho as H,So as I,xo as J,Ys as K,vo as L,Gs as M,Iu as N,gr as O,U as P,Xs as Q,Qs as R};
@@ -0,0 +1 @@
1
+ var S="X-Helix-Project-Execution-Token",P="X-Tray-Token",$={mode:"dev",deploymentId:null},h={...$},p={};function te(e){let{internalJwt:r,helixExecutionJwt:t,devToken:n,...i}=e;"internalJwt"in e&&(p.internalJwt=r),"helixExecutionJwt"in e&&(p.helixExecutionJwt=t),"devToken"in e&&(p.devToken=n),h={...h,...i}}function ne(){return h}function I(){return p.internalJwt}function T(){return p.helixExecutionJwt}function N(){return p.devToken}var C=new Set(["us1","eu1","ap1","ap2"]),o=new Map,v={name:"us1",exposedName:"us1",displayName:"us1",hosts:{api:"https://api.tray.io",broker:"https://api.tray.io/private/v1/code",ingest:"https://api.tray.io/private/v1/helix/otlp",weaver:"https://weaver.tray.io",app:"https://app.tray.io",projectHost:"helix-app.ai",dashboard:"https://app.helix.tray.ai",auth:"https://auth.tray.io"},login:{storePrefix:"PROD",appUrl:"https://app.tray.io",cookieName:"prod_tray_lid",cookieDomain:"tray.io"}},x={name:"eu1",exposedName:"eu1",displayName:"eu1",hosts:{api:"https://api.eu1.tray.io",broker:"https://api.eu1.tray.io/private/v1/code",ingest:"https://api.eu1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.eu1.tray.io",app:"https://app.eu1.tray.io",projectHost:"eu1.helix-app.ai",dashboard:"https://app.helix.eu1.tray.ai",auth:"https://auth.eu1.tray.io"},login:{storePrefix:"EU1",appUrl:"https://app.eu1.tray.io",cookieName:"prod_tray_lid_eu",cookieDomain:"tray.io"}},E={name:"ap1",exposedName:"ap1",displayName:"ap1",hosts:{api:"https://api.ap1.tray.io",broker:"https://api.ap1.tray.io/private/v1/code",ingest:"https://api.ap1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap1.tray.io",app:"https://app.ap1.tray.io",projectHost:"ap1.helix-app.ai",dashboard:"https://app.helix.ap1.tray.ai",auth:"https://auth.ap1.tray.io"},login:{storePrefix:"AP1",appUrl:"https://app.ap1.tray.io",cookieName:"prod_tray_lid_ap",cookieDomain:"tray.io"}},w={name:"ap2",exposedName:"ap2",displayName:"ap2",hosts:{api:"https://api.ap2.tray.io",broker:"https://api.ap2.tray.io/private/v1/code",ingest:"https://api.ap2.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap2.tray.io",app:"https://app.ap2.tray.io",projectHost:"ap2.helix-app.ai",dashboard:"https://app.helix.ap2.tray.ai",auth:"https://auth.ap2.tray.io"},login:{storePrefix:"AP2",appUrl:"https://app.ap2.tray.io",cookieName:"prod_tray_lid_ap2",cookieDomain:"tray.io"}};o.set(v.name,v);o.set(x.name,x);o.set(E.name,E);o.set(w.name,w);var D=["api","broker","ingest","weaver","app","projectHost","dashboard"],A=["auth"],U=["storePrefix","appUrl","cookieName","cookieDomain"];function j(e){if(!e.name||typeof e.name!="string")throw new Error("RegionProfile.name must be a non-empty string");if(!e.exposedName||typeof e.exposedName!="string")throw new Error("RegionProfile.exposedName must be a non-empty string");if(!e.displayName||typeof e.displayName!="string")throw new Error("RegionProfile.displayName must be a non-empty string");if(!e.hosts||typeof e.hosts!="object")throw new Error("RegionProfile.hosts must be an object");if(!e.login||typeof e.login!="object")throw new Error("RegionProfile.login must be an object");for(let r of D)if(typeof e.hosts[r]!="string"||!e.hosts[r])throw new Error(`RegionProfile.hosts.${r} must be a non-empty string`);for(let r of A){let t=e.hosts[r];if(t!==void 0&&(typeof t!="string"||!t))throw new Error(`RegionProfile.hosts.${r} must be a non-empty string when set`)}for(let r of U)if(typeof e.login[r]!="string"||!e.login[r])throw new Error(`RegionProfile.login.${r} must be a non-empty string`)}function H(e,r){return e.name===r.name&&e.exposedName===r.exposedName&&e.displayName===r.displayName&&D.every(t=>e.hosts[t]===r.hosts[t])&&A.every(t=>e.hosts[t]===r.hosts[t])&&U.every(t=>e.login[t]===r.login[t])}function oe(e){j(e);let r=o.get(e.name);if(r){if(H(r,e))return;throw new Error(`RegionProfile.name "${e.name}" is already registered with different values`)}for(let t of o.values())if(t.exposedName===e.exposedName)throw new Error(`RegionProfile.exposedName "${e.exposedName}" is already used by "${t.name}"`);o.set(e.name,e)}function F(e){return o.has(e)}function se(e){return o.get(e)}function _(e){let r=o.get(e);if(!r)throw new Error(`Unknown region: ${e}`);return r}function ae(){return[...o.keys()]}function de(){return[...o.values()].map(e=>e.exposedName)}function B(e){for(let r of o.values())if(r.exposedName===e)return r.name}var m=Symbol.for("@trayai/helix-sdk.forcedEnvironment");function L(e){let r=globalThis;if(e===void 0||e.trim()===""){delete r[m];return}let t=e.trim(),n=B(t);if(n){r[m]=n;return}if(F(t)){r[m]=t;return}throw new Error(`Unknown region: ${t}`)}function le(){return globalThis[m]}function ue(){return[...o.values()].filter(e=>!C.has(e.name))}function ce(){L(void 0),o.clear();for(let e of[v,x,E,w])o.set(e.name,{...e,hosts:{...e.hosts},login:{...e.login}})}var u=class e extends Error{detail;constructor(r){super(J(r)),this.name="SdkError",this.detail=r}get kind(){return this.detail.kind}static unknownAlias(r,t){return new e({kind:"unknown_alias",alias:r,available:t})}static inputValidationFailed(r){return new e({kind:"input_validation_failed",fields:r})}static outputValidationFailed(r){return new e({kind:"output_validation_failed",fields:r})}static configLoadFailed(r){return new e({kind:"config_load_failed",cause:r})}static brokerError(r,t,n,i){return new e({kind:"broker_error",status:r,message:t,body:n,code:i})}static unsupportedBodyType(r){return new e({kind:"unsupported_body_type",actualType:r})}static unsupportedScheme(r){return new e({kind:"unsupported_scheme",scheme:r})}static missingExecutionCredentials(){return new e({kind:"missing_execution_credentials"})}static missingTrayToken(){return new e({kind:"missing_tray_token"})}static dbCallFailed(r,t){return new e({kind:"db_call_failed",message:r,cause:t})}static dbQueryFailed(r){return new e({kind:"db_query_failed",message:r})}static dbInvalidParameters(r){return new e({kind:"db_invalid_parameters",message:r})}static kvKeyInvalid(r){return new e({kind:"kv_key_invalid",message:r})}static kvValueInvalid(r){return new e({kind:"kv_value_invalid",message:r})}static kvValueTooLarge(r,t){return new e({kind:"kv_value_too_large",message:r,maxBytes:t})}static kvTtlInvalid(r){return new e({kind:"kv_ttl_invalid",message:r})}static kvNotAvailable(){return new e({kind:"kv_not_available"})}static kvCallFailed(r,t,n){return new e({kind:"kv_call_failed",status:r,message:t,body:n})}static kvRequiresProvisioning(){return new e({kind:"kv_requires_provisioning"})}static filesPathInvalid(r){return new e({kind:"files_path_invalid",message:r})}static filesValueInvalid(r){return new e({kind:"files_value_invalid",message:r})}static filesValueTooLarge(r,t){return new e({kind:"files_value_too_large",message:r,maxBytes:t})}static filesNotAvailable(){return new e({kind:"files_not_available"})}static filesCallFailed(r,t,n){return new e({kind:"files_call_failed",status:r,message:t,body:n})}static filesRequiresProvisioning(){return new e({kind:"files_requires_provisioning"})}static callFunctionPathInvalid(r){return new e({kind:"call_function_path_invalid",message:r})}static callFunctionCallFailed(r,t,n){return new e({kind:"call_function_call_failed",status:r,message:t,body:n})}static callFunctionRequiresProvisioning(){return new e({kind:"call_function_requires_provisioning"})}static callFunctionNotAvailable(){return new e({kind:"call_function_not_available"})}static callFunctionMissingExecutionJwt(){return new e({kind:"call_function_missing_execution_jwt"})}static aiUnsupportedService(r,t,n){return new e({kind:"ai_unsupported_service",alias:r,service:t,supported:n})}static aiModelIdRequired(r,t){return new e({kind:"ai_model_id_required",alias:r,operation:t})}static aiModelInstanceRequired(r){return new e({kind:"ai_model_instance_required",modelId:r})}static aiProviderNotConfigured(r,t){return new e({kind:"ai_provider_not_configured",alias:r,supported:t})}static aiForeignModelRejected(){return new e({kind:"ai_foreign_model_rejected"})}};function ge(e){return e instanceof u}function J(e){switch(e.kind){case"unknown_alias":return`Unknown auth alias "${e.alias}". Available: ${e.available.join(", ")||"(none)"}`;case"input_validation_failed":return`Input validation failed for fields: ${e.fields.join(", ")}`;case"output_validation_failed":return`Output validation failed for fields: ${e.fields.join(", ")}`;case"config_load_failed":return`Config load failed: ${e.cause}`;case"broker_error":return e.code?`broker error: ${e.status} ${e.code}: ${e.message}`:`broker error: ${e.status} ${e.message}`;case"unsupported_body_type":return`unsupported body type: ${e.actualType}`;case"unsupported_scheme":return`unsupported scheme: ${e.scheme} (only https supported)`;case"missing_execution_credentials":return"missing execution credentials: at least one of internalJwt / helixExecutionJwt must be set before an authed broker/KV call";case"missing_tray_token":return"Not logged in. Run `helix login` to authenticate before making authed HTTP calls in dev.";case"db_call_failed":return`Database call failed: ${e.message}`;case"db_query_failed":return`Database query failed: ${e.message}`;case"db_invalid_parameters":return`Invalid database parameters: ${e.message}`;case"kv_key_invalid":return`Invalid KV key: ${e.message}`;case"kv_value_invalid":return e.message;case"kv_value_too_large":return e.message;case"kv_ttl_invalid":return e.message;case"kv_not_available":return"Key-value store is not available in this environment";case"kv_call_failed":return`KV platform error: ${e.status} ${e.message}`;case"kv_requires_provisioning":return"Key-value store requires a provisioned project (run helix project set)";case"files_path_invalid":return`Invalid file path: ${e.message}`;case"files_value_invalid":return e.message;case"files_value_too_large":return e.message;case"files_not_available":return"File storage is not available in this environment";case"files_call_failed":return`Files platform error: ${e.status} ${e.message}`;case"files_requires_provisioning":return"File storage requires a provisioned project (run helix project set)";case"call_function_path_invalid":return`Invalid function path: ${e.message}`;case"call_function_call_failed":return`Async function call failed: ${e.status} ${e.message}`;case"call_function_requires_provisioning":return"callFunctionAsync requires a provisioned project (run helix project set)";case"call_function_not_available":return"callFunctionAsync is not available: no running dev server was found";case"call_function_missing_execution_jwt":return"ctx.callFunctionAsync requires a helix project-execution JWT \u2014 a legacy internalJwt-only execution cannot call it";case"ai_unsupported_service":return`Authentication alias "${e.alias}" resolves to service "${e.service}", which ctx.ai does not support. Supported AI services: ${e.supported.join(", ")}`;case"ai_model_id_required":return`ctx.ai("${e.alias}").${e.operation} requires \`model\` as a string model id. To pass a model instance, use the top-level ctx.ai.${e.operation} instead.`;case"ai_model_instance_required":return`ctx.ai.* call functions require a model instance from ctx.ai(alias), got the string "${e.modelId}". Bare model ids would route outside the credentials broker and are not supported.`;case"ai_provider_not_configured":return`No AI provider configured for authentication alias "${e.alias}". Add \`aiProviders: { "${e.alias}": "<service>" }\` to helix.config.ts (supported services: ${e.supported.join(", ")}; openai-compatible needs the object form with baseUrl).`;case"ai_foreign_model_rejected":return"ctx.ai.* call functions require a model instance minted by ctx.ai(alias). A model built directly against a raw @ai-sdk/* provider carries its own transport and credentials, and would bypass the credentials broker, proxy policy, and metering."}}import{z as g}from"zod";var q="x-helix-destination-url",O="x-helix-authentication-id",M="x-helix-deployment-id",y="x-execution-id",K="x-helix-broker-error",he="route_not_found",V=new Set([q,O,M,"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",y]);function G(e){let r=e.toLowerCase();return V.has(r)||r.startsWith("x-tray-internal-")}var b=g.object({error:g.object({code:g.string(),message:g.string(),issues:g.array(g.unknown()).optional()})});function ve(e,r){let t=`${_(e).hosts.api}/private/v1/helix/broker/http/raw`;return r==="dev"?`${t}/dev`:t}function xe(e){if(e.mode==="lambda"){let t=I(),n=T(),i=!!(t&&t.trim().length>0),a=!!(n&&n.trim().length>0);if(!i&&!a)throw u.missingExecutionCredentials();let l={};return i&&(l[P]=t),a&&(l[S]=n),{headers:l,deploymentId:e.deploymentId??null}}let r=N();if(!r)throw u.missingTrayToken();return{headers:{Authorization:`Bearer ${r}`},deploymentId:null}}function X(e){return typeof e=="string"||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob||typeof FormData<"u"&&e instanceof FormData||e instanceof URLSearchParams||typeof ReadableStream<"u"&&e instanceof ReadableStream}function Ee(e){let r=new URL(e.url);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""));if(e.query!==void 0)if(e.query instanceof URLSearchParams)for(let[d,s]of e.query.entries())r.searchParams.append(d,s);else for(let[d,s]of Object.entries(e.query))for(let f of Array.isArray(s)?s:[s])r.searchParams.append(d,f);let t;e.headers===void 0?t=[]:e.headers instanceof Headers?t=Array.from(e.headers.entries()):Array.isArray(e.headers)?t=e.headers:t=Object.entries(e.headers);let n=t.filter(([d])=>!G(d)),i=e.body!==void 0&&e.body!==null,a,l,c=!1;return i&&(X(e.body)?(a=e.body,c=typeof ReadableStream<"u"&&e.body instanceof ReadableStream):(a=JSON.stringify(e.body),n.some(([s])=>s.toLowerCase()==="content-type")||(l="application/json"))),{authenticationId:e.authenticationId,method:e.method.toUpperCase(),destinationUrl:r.toString(),headers:n,body:a,isStreamBody:c,defaultContentType:l}}var Y=6e4;function z(e){return e.includes("json")}function W(e){return e.startsWith("text/")||e.includes("xml")||e.includes("urlencoded")||e.includes("javascript")||e.includes("ecmascript")}function Q(e,r){if(e.byteLength===0)return;let t=r.toLowerCase();if(z(t)){let n=new TextDecoder("utf-8").decode(e);try{return JSON.parse(n)}catch{return n}}return W(t)?new TextDecoder("utf-8").decode(e):e}function Z(e){let r={};for(let[t,n]of e.entries())r[t.toLowerCase()]=n;return r}async function we(e){let{request:r}=e,t=new Headers;for(let[d,s]of r.headers)t.append(d,s);r.defaultContentType&&!t.has("content-type")&&t.set("content-type",r.defaultContentType),t.set(q,r.destinationUrl),t.set(O,r.authenticationId);for(let[d,s]of Object.entries(e.credentialHeaders))t.set(d,s);e.executionId&&t.set(y,e.executionId);let n={method:r.method,headers:t,redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??Y)};r.body!==void 0&&(n.body=r.body,r.isStreamBody&&(n.duplex="half"));let i=await fetch(e.proxyUrl,n),a=i.headers.get(K);if(a!==null){let d=await i.text(),s=d,f=d||a;try{s=JSON.parse(d);let R=b.safeParse(s);R.success&&(f=R.data.error.message)}catch{}return{kind:"brokerError",status:i.status,code:a,message:f,body:s}}let l=new Uint8Array(await i.arrayBuffer()),c=i.headers.get("content-type")??"";return{kind:"upstream",response:{status:i.status,headers:Z(i.headers),body:Q(l,c)}}}import{z as k}from"zod";var ee=3e4;function Te(e){let r=new URL(e);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""))}function Ne(e,r){let t=`${_(e).hosts.api}/private/v1/helix/broker/s3/sign`;return r==="dev"?`${t}/dev`:t}var re=k.object({url:k.string(),method:k.string(),expiresAt:k.string()});async function De(e){let r=new Headers({"content-type":"application/json"});for(let[l,c]of Object.entries(e.credentialHeaders))r.set(l,c);e.executionId&&r.set(y,e.executionId);let t=await fetch(e.signUrl,{method:"POST",headers:r,body:JSON.stringify(e.body),redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??ee)}),n=await t.text(),i=n;try{i=JSON.parse(n)}catch{}if(t.ok){let l=re.safeParse(i);return l.success?{kind:"signed",result:l.data}:{kind:"brokerError",status:t.status,message:"malformed s3-sign response from credential broker",body:i}}let a=b.safeParse(i);return a.success?{kind:"brokerError",status:t.status,code:a.data.error.code,message:a.data.error.message,body:i}:{kind:"brokerError",status:t.status,message:n||`s3-sign request failed with status ${t.status}`,body:i}}export{S as a,P as b,te as c,ne as d,I as e,T as f,oe as g,F as h,se as i,_ as j,ae as k,de as l,B as m,L as n,le as o,ue as p,ce as q,u as r,ge as s,q as t,O as u,M as v,y as w,K as x,he as y,G as z,b as A,ve as B,xe as C,Ee as D,Y as E,we as F,Te as G,Ne as H,De as I};