@trayai/helix-sdk 1.7.0 → 1.13.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
@@ -8,6 +8,41 @@ project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
8
  The SDK and [`@trayai/helix-cli`](https://www.npmjs.com/package/@trayai/helix-cli) are
9
9
  released together and share a version — install matching versions.
10
10
 
11
+ ## 1.9.0
12
+
13
+ ### Added
14
+
15
+ - **Agents and tools are now a documented, public part of the SDK.** Define a tool with
16
+ `defineTool` (`functions/_tools/`) and an agent with `defineAgent` (`functions/_agents/`),
17
+ then run it from any handler with `ctx.agent(name).generate()` / `.stream()`. An agent's
18
+ `model`/`auth` use the same `aiProviders` aliases as `ctx.ai` (every provider, including
19
+ Amazon Bedrock), can declare `fallbacks`, and can delegate to other agents. Conversations
20
+ persist as **sessions** (the full record, not just the model window) — read them with
21
+ `session(id).messages()` / `.page()` and clear them with `session(id).clear()`; cap the model
22
+ window with `memory.maxSessionMessages`, scope sessions per user with `memory.scope: 'user'`.
23
+ Choose a session store with the new `agentSessions` field in `helix.config.ts`
24
+ (`{ store: 'managed' }` by default, or a bring-your-own `{ store: 'dynamodb', … }`). See the
25
+ README's "Agents and tools" section; try them locally with `helix agent list` / `helix agent
26
+ chat`. (These APIs shipped earlier marked beta; the beta label has been removed.)
27
+
28
+ ### Changed
29
+
30
+ - Removed the `@beta` labels from `defineAgent`, `defineTool`, `ctx.agent`, `HelixAgent`, and
31
+ `AgentClient` — the agent harness is now covered by the SDK's semantic-versioning contract
32
+ like the rest of the public API.
33
+
34
+ ## 1.8.0
35
+
36
+ ### Added
37
+
38
+ - **Amazon Bedrock support in `ctx.ai` and agents.** `aiProviders` accepts a new `bedrock`
39
+ service in the object form — `{ service: 'bedrock', region: 'us-east-1' }` (or `baseUrl`
40
+ for a VPC / custom endpoint) — mapped to an **Amazon Bedrock** authentication in your
41
+ workspace. Use Bedrock model ids (`anthropic.claude-sonnet-4-5-20250929-v1:0`,
42
+ `us.anthropic.…`, `amazon.nova-…`) with `ctx.ai(alias)` and as an agent's `model`/`auth`
43
+ pair. A `bedrock` entry with neither `region` nor `baseUrl` is rejected when your config
44
+ loads.
45
+
11
46
  ## 1.7.0
12
47
 
13
48
  No user-visible changes in this release — co-versioned with `@trayai/helix-cli`'s changes.
package/README.md CHANGED
@@ -15,6 +15,7 @@ The runtime SDK for **Helix** — a TypeScript-first platform for building integ
15
15
  - [Scheduled functions](#scheduled-functions)
16
16
  - [Async function calls](#async-function-calls)
17
17
  - [AI — `ctx.ai`](#ai--ctxai)
18
+ - [Agents and tools — `ctx.agent`](#agents-and-tools--ctxagent)
18
19
  - [Authentication](#authentication)
19
20
  - [Configuration](#configuration)
20
21
  - [Logging](#logging)
@@ -83,6 +84,7 @@ Every HTTP handler receives a `ctx` (`TrayContext`); scheduled handlers receive
83
84
  | `ctx.kv()` | Key-value store |
84
85
  | `ctx.files()` | File storage |
85
86
  | `ctx.ai(alias)` | AI provider access — credentials are injected by the platform, same as `ctx.http.authed` |
87
+ | `ctx.agent(name)` | Run an agent defined with `defineAgent` — `generate`/`stream`, with persisted conversation sessions |
86
88
  | `ctx.log.info/warn/error/debug` | Structured logging |
87
89
  | `ctx.config` | The `config` block from `helix.config.ts` |
88
90
  | `ctx.state` | Per-request scratch space |
@@ -325,7 +327,8 @@ export default defineConfig({
325
327
  anthropicKey: '<your-anthropic-auth-uuid>',
326
328
  },
327
329
  aiProviders: {
328
- // 'openai' | 'anthropic' | 'google' | 'mistral' | 'cohere', or the object form
330
+ // 'openai' | 'anthropic' | 'google' | 'mistral' | 'cohere', or the object forms
331
+ // { service: 'bedrock', region } for Amazon Bedrock and
329
332
  // { service: 'openai-compatible', baseUrl } for self-hosted endpoints
330
333
  anthropicKey: 'anthropic',
331
334
  },
@@ -365,10 +368,16 @@ export default defineFunction(async (ctx) => {
365
368
  per image and report no token usage at all, so `generateImage`'s cost estimates to `0` for
366
369
  them regardless of whether the model is recognized; token-billed image models (e.g.
367
370
  `gpt-image-1`) get a real estimate.
368
- - Supported services: `openai`, `anthropic`, `google`, `mistral`, `cohere`, and
369
- `openai-compatible` (self-hosted endpoints — use the object form with `baseUrl` instead of
370
- the shorthand string). `baseUrl` must be `https:` — this is enforced when your config loads,
371
- not just on the first call.
371
+ - Supported services: `openai`, `anthropic`, `google`, `mistral`, `cohere`, `bedrock`
372
+ (Amazon Bedrock — use the object form with the AWS `region` your models are enabled in,
373
+ e.g. `{ service: 'bedrock', region: 'us-east-1' }`, and Bedrock model ids such as
374
+ `anthropic.claude-sonnet-4-5-20250929-v1:0` or `us.anthropic.…`; pass `baseUrl` instead of
375
+ `region` for a VPC or other custom endpoint), and `openai-compatible` (self-hosted
376
+ endpoints — use the object form with `baseUrl` instead of the shorthand string). `baseUrl`
377
+ must be `https:` — this is enforced when your config loads, not just on the first call.
378
+ - A `bedrock` alias points at an **Amazon Bedrock** authentication (AWS access key and secret)
379
+ in your workspace; `ctx.ai` never handles the AWS keys and signs nothing itself. The AI
380
+ SDK's own `providerOptions.bedrock` passthrough works as usual.
372
381
  - An alias with no matching `aiProviders` entry throws `SdkError.aiProviderNotConfigured`,
373
382
  naming the exact config line to add.
374
383
  - The top-level `ctx.ai.*` functions only accept a model instance obtained from `ctx.ai(alias)`
@@ -376,6 +385,125 @@ export default defineFunction(async (ctx) => {
376
385
  and passing a model instance built directly against a third-party AI SDK provider (bypassing
377
386
  `ctx.ai`) throws `SdkError.aiForeignModelRejected`.
378
387
 
388
+ ## Agents and tools — `ctx.agent`
389
+
390
+ An **agent** is an AI loop you define once and run from any handler: it calls a model, decides
391
+ when to use the **tools** you gave it, and keeps a conversation **session** across turns. You
392
+ write agents and tools as files; `ctx.agent(name)` runs them.
393
+
394
+ - **Tools** (`defineTool`) live under `functions/_tools/` — a name, description, Zod `input`
395
+ schema, and a handler. A tool is a normal module you can also call in-process; when an agent
396
+ calls it, the same validation and handler run.
397
+ - **Agents** (`defineAgent`) live under `functions/_agents/`, one file per agent. The agent
398
+ declares its `model` and `auth` (an `aiProviders`/`authentications` alias, exactly like
399
+ `ctx.ai`), its `instructions`, and the `tools` it may call.
400
+
401
+ ```typescript
402
+ // functions/_tools/lookup_order.ts
403
+ import { defineTool } from '@trayai/helix-sdk';
404
+ import { z } from 'zod';
405
+
406
+ export default defineTool({
407
+ name: 'lookup_order',
408
+ description: 'Look up an order by its id.',
409
+ input: z.object({ orderId: z.string() }),
410
+ async handler(ctx) {
411
+ const res = await ctx.http.authed('shop').get(`https://api.shop.example/orders/${ctx.input.orderId}`);
412
+ return res.body; // { status, body?, headers } — see Authenticated HTTP
413
+ },
414
+ });
415
+ ```
416
+
417
+ ```typescript
418
+ // functions/_agents/support-agent.ts
419
+ import { defineAgent } from '@trayai/helix-sdk';
420
+ import lookupOrder from '../_tools/lookup_order.js';
421
+
422
+ export default defineAgent({
423
+ name: 'support-agent',
424
+ description: 'Answers customer support questions.',
425
+ model: 'claude-sonnet-4-5',
426
+ auth: 'anthropicKey', // an aiProviders alias, like ctx.ai
427
+ instructions: 'You are a helpful support agent. Use tools to look up real data.',
428
+ tools: [lookupOrder],
429
+ });
430
+ ```
431
+
432
+ Run it from any function:
433
+
434
+ ```typescript
435
+ import { defineFunction } from '@trayai/helix-sdk';
436
+ import { z } from 'zod';
437
+ import '../_agents/support-agent.js'; // register the agent (see note below)
438
+
439
+ export const input = z.object({
440
+ message: z.string(),
441
+ sessionId: z.string().optional(),
442
+ });
443
+
444
+ export default defineFunction<typeof input>(async (ctx) => {
445
+ const result = await ctx.agent('support-agent').generate({
446
+ prompt: ctx.input.message,
447
+ sessionId: ctx.input.sessionId, // omit to start a new conversation
448
+ });
449
+ return { text: result.text, sessionId: result.sessionId };
450
+ });
451
+ ```
452
+
453
+ - **`generate(options)`** runs the loop to completion and resolves with the model result plus
454
+ the `sessionId` it used. **`stream(options)`** returns the AI SDK stream result (with its
455
+ `sessionId`) for token-by-token responses. Both accept a `prompt` (or `messages`) and an
456
+ optional `sessionId`.
457
+ - **Deployed functions must import the agent module** (e.g. `import '../_agents/support-agent.js'`)
458
+ so it registers before `ctx.agent(name)` runs — only `helix dev` auto-loads `_agents/`; an
459
+ unknown name throws `Unknown agent "<name>"`.
460
+ - **`model` / `auth`** reference the same `aiProviders` + `authentications` aliases as
461
+ `ctx.ai`, so every provider works — including **Amazon Bedrock** (`auth` pointing at a
462
+ Bedrock authentication and a Bedrock model id). Declare one or more `fallbacks`
463
+ (`{ model, auth }` pairs) and the agent retries the next on a model error.
464
+ - **Tools** passed to `defineAgent` are given to the model automatically. Set
465
+ `needsApproval: true` (or a predicate of the input) on a tool and the loop pauses for human
466
+ approval before that tool runs.
467
+ - **Delegation** — list other agents' names in `agents: [...]` and the agent can hand work to
468
+ them as sub-agents (each keeps its own session; nesting is capped).
469
+
470
+ ### Sessions
471
+
472
+ A session is the **full record of a conversation**, not just the model's context window —
473
+ appends never delete, and there is no default expiry, so an app can always show a user their
474
+ earlier conversations. `ctx.agent(name).session(sessionId)` reads and manages one:
475
+
476
+ ```typescript
477
+ const agent = ctx.agent('support-agent');
478
+ const history = await agent.session(sessionId).messages(); // whole conversation
479
+ const page = await agent.session(sessionId).page({ limit: 50, order: 'desc' }); // newest first
480
+ await agent.session(sessionId).clear(); // delete the conversation
481
+ ```
482
+
483
+ - **`memory.maxSessionMessages`** (default 200) caps only what the **model** is sent each turn
484
+ — never what is stored. **`memory.ttl`** (seconds) is opt-in idle retention; omit it and
485
+ sessions are kept until you `clear()` them.
486
+ - **`memory.scope: 'user'`** keys sessions by the invoking user (`ctx.identity`), so each user
487
+ only sees their own; `agent.sessions({ first, cursor })` then lists the calling user's recent
488
+ sessions, newest first. The default scope is `'project'` (sessions shared across the
489
+ project's executions). `agent.sessions()` requires the **managed** store (below) and a
490
+ `'user'`-scoped agent — it is not supported on the bring-your-own DynamoDB store.
491
+
492
+ Choose where sessions are stored with the `agentSessions` field in `helix.config.ts`:
493
+
494
+ ```typescript
495
+ export default defineConfig({
496
+ // ...
497
+ // Managed by Helix (the default — nothing to configure):
498
+ agentSessions: { store: 'managed' },
499
+ // …or bring your own DynamoDB table (credentials injected by the platform):
500
+ // agentSessions: { store: 'dynamodb', auth: '<aws-alias>', table: 'agent-sessions', region: 'us-east-1' },
501
+ });
502
+ ```
503
+
504
+ Try agents locally with `helix dev`, then `helix agent list` and `helix agent chat <name>`
505
+ (see the `@trayai/helix-cli` README).
506
+
379
507
  ## Authentication
380
508
 
381
509
  Authenticated features (`ctx.http.authed`, `ctx.kv`, `ctx.files`, `ctx.ai`) require you to be logged in during local development:
@@ -1 +1 @@
1
- import{A as u,B as d,D as p,F as m,G as c,H as k,I as g,J as b,j as l}from"../chunk-3T2WZMJJ.js";import{z as s}from"zod";function v(e,t){let r=`${l(e).hosts.api}/private/v1/helix/authentications/templates`;return t==="dev"?`${r}/dev`:r}var h=s.object({templates:s.array(s.object({serviceName:s.string(),serviceVersion:s.number().int(),authenticationType:s.string(),strategy:s.string().optional()}))}),S=3e4;async function y(e){let t=new Headers;for(let[n,T]of Object.entries(e.credentialHeaders))t.set(n,T);let r=await fetch(e.templatesUrl,{method:"GET",headers:t,redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??S)}),a=await r.text(),o=a;try{o=JSON.parse(a)}catch{}if(r.ok){let n=h.safeParse(o);return n.success?{kind:"templates",result:n.data}:{kind:"brokerError",status:r.status,message:"malformed templates-discovery response",body:o}}let i=u.safeParse(o);return i.success?{kind:"brokerError",status:r.status,code:i.data.error.code,message:i.data.error.message,body:o}:{kind:"brokerError",status:r.status,message:a||`templates-discovery request failed with status ${r.status}`,body:o}}async function R(e){let t=p({authenticationId:e.authenticationId,method:e.method,url:e.url,body:e.body,headers:e.headers,query:e.query}),r=await c({proxyUrl:d(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},request:t,timeoutMs:e.timeoutMs??m});return r.kind==="brokerError"?{kind:"brokerError",brokerStatus:r.status,code:r.code,body:r.body}:{kind:"upstream",upstream:r.response}}async function f(e){k(e.url);let t=await b({signUrl:g(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 t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"signed",signed:t.result}}async function x(e){let t=await y({templatesUrl:v(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},timeoutMs:e.timeoutMs});return t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"templates",templates:t.result.templates}}export{R as callBrokerDev,f as callS3SignDev,x as callTemplatesDev};
1
+ import{A as u,B as d,D as p,F as m,G as c,H as k,I as g,J as b,j as l}from"../chunk-JKFMPHA4.js";import{z as s}from"zod";function v(e,t){let r=`${l(e).hosts.api}/private/v1/helix/authentications/templates`;return t==="dev"?`${r}/dev`:r}var h=s.object({templates:s.array(s.object({serviceName:s.string(),serviceVersion:s.number().int(),authenticationType:s.string(),strategy:s.string().optional()}))}),S=3e4;async function y(e){let t=new Headers;for(let[n,T]of Object.entries(e.credentialHeaders))t.set(n,T);let r=await fetch(e.templatesUrl,{method:"GET",headers:t,redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??S)}),a=await r.text(),o=a;try{o=JSON.parse(a)}catch{}if(r.ok){let n=h.safeParse(o);return n.success?{kind:"templates",result:n.data}:{kind:"brokerError",status:r.status,message:"malformed templates-discovery response",body:o}}let i=u.safeParse(o);return i.success?{kind:"brokerError",status:r.status,code:i.data.error.code,message:i.data.error.message,body:o}:{kind:"brokerError",status:r.status,message:a||`templates-discovery request failed with status ${r.status}`,body:o}}async function R(e){let t=p({authenticationId:e.authenticationId,method:e.method,url:e.url,body:e.body,headers:e.headers,query:e.query}),r=await c({proxyUrl:d(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},request:t,timeoutMs:e.timeoutMs??m});return r.kind==="brokerError"?{kind:"brokerError",brokerStatus:r.status,code:r.code,body:r.body}:{kind:"upstream",upstream:r.response}}async function f(e){k(e.url);let t=await b({signUrl:g(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 t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"signed",signed:t.result}}async function x(e){let t=await y({templatesUrl:v(e.env,"dev"),credentialHeaders:{Authorization:`Bearer ${e.devToken}`},timeoutMs:e.timeoutMs});return t.kind==="brokerError"?{kind:"brokerError",brokerStatus:t.status,code:t.code,body:t.body}:{kind:"templates",templates:t.result.templates}}export{R as callBrokerDev,f as callS3SignDev,x as callTemplatesDev};
@@ -0,0 +1,7 @@
1
+ import{a as mn,b as Ve}from"./chunk-WUCX7RZO.js";import{A as yn,B as fe,C as z,D as ne,E as hn,G as wn,H as Sn,I as bn,J as vn,a as U,b as de,d as E,e as ue,f as $,h as un,j,k as pn,o as fn,r as d,t as Ie,u as ze,v as te,w as Re,x as Ge,y as pe,z as gn}from"./chunk-JKFMPHA4.js";var sc="tray-config-bridge",ic="tray-dev-token-bridge",Je=null;function ac(e){Je=e}function A(){if(!Je)throw new Error("Active tray config not seeded. Worker boot must call setActiveConfig() before handlers run.");return Je}function cc(){Je=null}import{AsyncLocalStorage as Bn}from"async_hooks";import{trace as cs,SpanKind as ls,SpanStatusCode as Ze}from"@opentelemetry/api";import{ExportResultCode as ds,W3CTraceContextPropagator as us}from"@opentelemetry/core";import{NodeTracerProvider as ps,SimpleSpanProcessor as fs,BatchSpanProcessor as ms}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Jo}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as Wo}from"@opentelemetry/exporter-logs-otlp-proto";function Ct(e){return j(e).hosts.ingest}function Xo(){return $()??""}function xn(){return{[U]:Xo()}}function An(){let e=Ct(A().region);return new Jo({url:`${e}/v1/traces`,headers:()=>Promise.resolve(xn())})}function En(){let e=Ct(A().region);return new Wo({url:`${e}/v1/logs`,headers:()=>Promise.resolve(xn())})}import{logs as Cn,SeverityNumber as We}from"@opentelemetry/api-logs";import{LoggerProvider as Zo,BatchLogRecordProcessor as es}from"@opentelemetry/sdk-logs";function Ce(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function Yo(e){return new TextEncoder().encode(e).length}var In="\u2026[truncated]",Qo=Yo(In),Te=4096;function re(e,t=Te){let n=new TextEncoder().encode(e);if(n.length<=t)return e;let r=n.subarray(0,t-Qo);return new TextDecoder("utf-8").decode(r).replace(/�$/,"")+In}function k(e,t=Te){return re(Ce(e),t)}var ts="@trayai/helix-sdk",ke,Rn={debug:{number:We.DEBUG,text:"DEBUG"},info:{number:We.INFO,text:"INFO"},warn:{number:We.WARN,text:"WARN"},error:{number:We.ERROR,text:"ERROR"}};function ns(){return E().mode==="lambda"?[new es({exporter:En()})]:[]}function Tn(){if(ke!==void 0)return;let e=ns();e.length!==0&&(ke=new Zo({processors:e}),Cn.setGlobalLoggerProvider(ke))}function rs(e,t,n){let r=Rn[e]??Rn.info;return{severityNumber:r.number,severityText:r.text,body:t,...n?{attributes:{"tray.log.meta":k(n)}}:{}}}function kn(e,t,n){Cn.getLogger(ts).emit(rs(e,t,n))}async function Pn(e=2e3){if(ke===void 0)return;let t;try{await Promise.race([ke.forceFlush(),new Promise(n=>{t=setTimeout(n,e)})])}catch(n){process.stderr.write(`[helix-sdk] otel log flush failed: ${n instanceof Error?n.message:String(n)}
2
+ `)}finally{t!==void 0&&clearTimeout(t)}}function Tt(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function os(){if(process.env.NO_COLOR!==void 0)return!1;let e=process.env.FORCE_COLOR;return e!==void 0&&e!=="0"&&e!=="false"?!0:!!process.stdout.isTTY&&process.env.TERM!=="dumb"}function D(e,t){return os()?`\x1B[${e}m${t}\x1B[0m`:t}var ss=5,is={FN:"1;35",INFO:"34",AUTH:"35",API:"36",AGENT:"1;36",TOOL:"36",WARN:"33",ERROR:"31",DEBUG:"90"},Xe="32",Ye="31",as="33",oe="2",Qe="1";function se(e){return D(is[e]??"0",e.padEnd(ss))}function On(e,t){return`${se("FN")} ${D(Qe,`${e} ${t}`.trim())}`}function _n(e,t,n,r){let o=e.toUpperCase(),i=`${r?`${D(oe,r)} `:""}${se(o)} ${t}`;return n&&Object.keys(n).length>0&&(i+=` ${D(oe,Ce(n))}`),i}function Dn(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Mn(e){return`${se("AUTH")} ${e}`}function Fn(e,t,n,r,o){let s=n===void 0?"ERR":String(n),i=D(o==="error"?Ye:Xe,s);return`${se("API")} ${e} ${t} \u2192 ${i} ${D(oe,`${r}ms`)}`}function Ln(e){return`${se("AGENT")} ${D(Qe,e)}`}function Nn(e,t,n,r){let o=t==="error"?Ye:t==="awaiting-approval"?as:Xe,s=n!==void 0?`${D(oe,`${n} step${n===1?"":"s"}`)} `:"";return`${se("AGENT")} ${D(Qe,e)} \u2192 ${D(o,t)} ${s}${D(oe,`${r}ms`)}`}function Un(e,t,n){let r=t==="error"?D(Ye,"error"):D(Xe,"ok");return`${se("TOOL")} ${e} \u2192 ${r} ${D(oe,`${n}ms`)}`}function $n(e,t,n){let r=t?Ye:Xe,o=D(r,"\u25CF"),s=D(r,t?"error":"success");return`${o} ${D(Qe,e)} ${s} ${D(oe,`${n}ms`)}`}function H(e){try{process.stdout.write(e+`
3
+ `)}catch{}}var Kn=new Bn,gs=new Bn;function O(e){let t=gs.getStore();t&&(t[e]=!0)}var ys=/^[0-9a-f]{32}$/;function hs(e){let t=e.replace(/-/g,"").toLowerCase();return ys.test(t)?t:null}var ws={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},me=new Map;function Hn(e,t,n){let r=me.get(e);r?r[t]=n:me.set(e,{[t]:n})}function q(e,t,n){e.setAttribute(t,k(n))}var Pe;function jn(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function kt(e){return Math.round(e[0]*1e3+e[1]/1e6)}function qn(e){try{process.stdout.write(Ce(e)+`
4
+ `)}catch{}}var Pt=class{export(t,n){for(let r of t){let o=r.spanContext().spanId,s=me.get(o),i={...r.attributes};if(s!==void 0){for(let[l,u]of Object.entries(s))typeof u=="string"?i[l]=re(u):typeof u=="object"&&u!==null?i[l]=k(u):i[l]=u;me.delete(o)}let a=Kn.getStore(),c=a?hs(a):null;qn({_otel:"span",traceId:c??r.spanContext().traceId,spanId:o,parentSpanId:r.parentSpanContext?.spanId??"",name:r.name,kind:r.kind,startTimeUnixNano:jn(r.startTime),endTimeUnixNano:jn(r.endTime),attributes:i,status:{code:ws[r.status.code]??"STATUS_CODE_UNSET",...r.status.message?{message:re(r.status.message)}:{}}})}n({code:ds.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Ot=class{onStart(t,n){}onEnd(t){me.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},_t=class{onStart(t){let n=t;(n.name==="function"||n.name==="App")&&H(`
5
+ `+On(String(n.attributes.method??""),String(n.attributes.route??""))),(n.name==="agent.generate"||n.name==="agent.stream")&&H(Ln(String(n.attributes.agent??"")))}onEnd(t){let n=t.attributes;switch(t.name){case"log":{let r=t.spanContext().spanId,o=me.get(r)?.properties;H(_n(String(n.level??"info"),String(n.message??""),o,Dn(t.startTime)));break}case"auth":H(Mn(String(n.alias??"")));break;case"externalApi":{let r=typeof n.statusCode=="number"?n.statusCode:void 0;H(Fn(String(n.method??""),String(n.host??""),r,kt(t.duration),n.status==="error"?"error":"success"));break}case"agent.tool":{H(Un(String(n.tool??""),n.status==="error"?"error":"success",kt(t.duration)));break}case"agent.generate":case"agent.stream":{let r=typeof n.status=="string"?n.status:t.status.code===Ze.ERROR?"error":"completed";H(Nn(String(n.agent??""),r,typeof n.steps=="number"?n.steps:void 0,kt(t.duration)));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Dt=class{constructor(t){this.inner=t}inner;onStart(t,n){this.inner.onStart(t,n)}onEnd(t){t.name!=="log"&&this.inner.onEnd(t)}forceFlush(){return this.inner.forceFlush()}shutdown(){return this.inner.shutdown()}};function Ss(){let t=[Tt()?new _t:new fs(new Pt)];return E().mode==="lambda"&&t.push(new Dt(new ms(An()))),t.push(new Ot),t}function bs(){Pe===void 0&&(Pe=new ps({spanProcessors:Ss()}),Pe.register({propagator:new us}),Tn())}async function vs(e=2e3){let t=[Pn(e)];Pe!==void 0&&t.push((async()=>{let n;try{await Promise.race([Pe.forceFlush(),new Promise(r=>{n=setTimeout(r,e)})])}catch(r){process.stderr.write(`[helix-sdk] otel flush failed: ${r instanceof Error?r.message:String(r)}
6
+ `)}finally{n!==void 0&&clearTimeout(n)}})()),await Promise.all(t)}var F=cs.getTracer("@trayai/helix-sdk");function xs({executionId:e,deploymentId:t,triggerType:n="http",routeOrJob:r,startedAt:o,startMs:s,errored:i,errorMessage:a,userId:c,flags:l}){let u=new Date().toISOString(),p=Date.now()-s;if(Tt()){H(`
7
+ `+$n(r,i,p));return}qn({_otel:"summary",executionId:e,deploymentId:t,triggerType:n,routeOrJob:r,status:i?"error":"success",startedAt:o,finishedAt:u,durationMs:p,userId:c,hasError:i||l.hasError,hasAuth:l.hasAuth,hasAi:l.hasAi,hasExternal:l.hasExternal,hasDb:l.hasDb,errorSummary:i&&a!==null?re(a):null})}async function Lc(e,t){let n=e.startMs??Date.now();bs();let r=!1,o=null;try{return await Kn.run(e.executionId,()=>F.startActiveSpan("App",{kind:ls.SERVER,attributes:{method:e.method,route:e.route,...e.deploymentId?{deploymentId:e.deploymentId}:{}}},async s=>{try{let i=await t(),a=i?.httpResponse?.status??404;return r=a>=400,s.setAttribute("http.response.status_code",a),s.setAttribute("helix.status",r?"error":"success"),s.setStatus({code:r?Ze.ERROR:Ze.OK}),i}catch(i){throw r=!0,o=i instanceof Error?i.message:String(i),s.setAttribute("http.response.status_code",500),s.setAttribute("helix.status","error"),s.setStatus({code:Ze.ERROR,message:o}),i}finally{s.end()}}))}finally{xs({executionId:e.executionId,deploymentId:e.deploymentId,routeOrJob:`${e.method} ${e.route}`,startedAt:e.startedAt,startMs:n,errored:r,errorMessage:o,userId:e.userId,flags:{hasDb:!1,hasExternal:!1,hasAuth:!1,hasAi:!1,hasError:!1}}),await vs()}}var Gn=1024,G=100*1024*1024,Vn=250,As=3600,Es=As*1e3,zn=new TextEncoder,Is=/(^|\/)\.\.(\/|$)/,Rs=/[?#]/;function Cs(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<=31||n===127)return!0}return!1}function ie(e,t=Gn){if(e.length===0)throw d.filesPathInvalid("Path must be a non-empty string");et(e,t)}function Mt(e){return e.endsWith("/")?e.slice(0,-1):e}function et(e,t=Gn){if(e.length===0)return;if(Is.test(e))throw d.filesPathInvalid("Path contains path traversal segment");if(Rs.test(e)||Cs(e))throw d.filesPathInvalid("Path contains illegal characters");let n=e.split("/");if(e.startsWith("/")||e.endsWith("/")||n.some(o=>o===""))throw d.filesPathInvalid("Path must not contain empty path segments");for(let o of n){let s=zn.encode(o).length;if(s>Vn)throw d.filesPathInvalid(`Path segment exceeds ${Vn} UTF-8 bytes (got ${s})`)}let r=zn.encode(e).length;if(r<1||r>t)throw d.filesPathInvalid(`Path must be between 1 and ${t} UTF-8 bytes (got ${r})`)}function Jn(e){if(e>G)throw d.filesValueTooLarge(`File exceeds maximum size of ${G} bytes (got ${e})`,G)}function ge(e){let t=e!==void 0?e*1e3:Es;return new Date(Date.now()+t)}import{join as _e}from"path";var Ts="files",ks="files-meta",Ps=1023,Os=1,_s=5;function Wn(e){let t=Math.max(Buffer.byteLength(tt(e),"utf8"),Buffer.byteLength(Oe(e),"utf8"));return Math.max(0,Ps-t-Os-_s)}function tt(e){return _e(e,".helix",Ts)}function Oe(e){return _e(e,".helix",ks)}function De(e,t){return _e(tt(e),...t.split("/"))}function nt(e,t){return _e(Oe(e),...t.split("/"))+".json"}function rt(e,t){return t.length===0?tt(e):De(e,t)}function Xn(e,t){return t.length===0?Oe(e):_e(Oe(e),...t.split("/"))}import{z as Ds}from"zod";var qc=["us1","eu1","ap1","ap2"],Ft=Ds.string().refine(e=>un(e),e=>({message:`Invalid enum value. Expected ${pn().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));import{resolve as J}from"path";import{existsSync as ot,realpathSync as Yn}from"fs";import{loadConfig as Ms}from"c12";import{z as b}from"zod";var Zn=b.string().uuid("projectId must be a valid UUID"),er=b.string().min(1,"workspaceId must be a non-empty string"),tr=b.discriminatedUnion("store",[b.object({store:b.literal("managed")}),b.object({store:b.literal("dynamodb"),auth:b.string().min(1,"agentSessions.auth is required"),table:b.string().min(1,"agentSessions.table is required"),region:b.string().min(1,"agentSessions.region is required")})]),st=["openai","anthropic","google","mistral","cohere","bedrock","openai-compatible"],Fs=["openai","anthropic","google","mistral","cohere"],Ls=/^[a-z0-9][a-z0-9-]*$/i,nr=b.union([b.enum(Fs),b.object({service:b.enum(st),baseUrl:b.string().url().optional(),region:b.string().regex(Ls,"aiProviders: region must be an AWS region name (e.g. us-east-1)").optional()}).refine(e=>e.service!=="openai-compatible"||e.baseUrl!==void 0,{message:'aiProviders: baseUrl is required when service is "openai-compatible"'}).refine(e=>e.service!=="bedrock"||e.region!==void 0||e.baseUrl!==void 0,{message:'aiProviders: region (e.g. "us-east-1") or baseUrl is required when service is "bedrock"'}).refine(e=>e.service==="bedrock"||e.region===void 0,{message:'aiProviders: region only applies to service "bedrock"'}).refine(e=>e.baseUrl===void 0?!0:new URL(e.baseUrl).protocol==="https:",{message:"aiProviders: baseUrl must use https \u2014 ctx.ai requests route through the credentials broker's proxy, which rejects non-https destinations on every call (a plain-http endpoint, e.g. a local Ollama/vLLM instance over http, is not supported)"})]),Ns=b.object({name:b.string().min(1,"name is required"),projectId:Zn.optional(),workspaceId:er.optional(),region:Ft.optional(),env:b.literal("production").optional(),authentications:b.record(b.string()).optional().default({}),config:b.record(b.unknown()).optional().default({}),agentSessions:tr.optional(),aiProviders:b.record(nr).optional()}).transform(({env:e,region:t,...n})=>({...n,region:t??"us1"})),Qn=b.object({name:b.string().min(1,"name is required"),workspaceId:er.optional(),region:Ft,authentications:b.record(b.string()),config:b.record(b.unknown()),agentSessions:tr.optional(),aiProviders:b.record(nr).optional()}),Zc=b.discriminatedUnion("kind",[Qn.extend({kind:b.literal("provisioned"),projectId:Zn}),Qn.extend({kind:b.literal("unprovisioned")})]),rr=["helix","tray"],or=["ts","mts","cts","js","mjs","cjs"],sr="HELIX_CONFIG";function Lt(e){let t=e?.trim();return t||process.env[sr]?.trim()||void 0}function Us(e,t){let n=Lt(t?.configFile);if(n!==void 0){let r=J(e,n);return ot(r)?r:void 0}for(let r of rr)for(let o of or){let s=J(e,`${r}.config.${o}`);if(ot(s))return s}}function $s(e){for(let t of rr)if(or.some(n=>ot(J(e,`${t}.config.${n}`))))return t;return"helix"}function js(e,t){return J(e,t).replace(/\.(?:m|c)?[jt]s$/,"")}function Bs(e,t){let n=Lt(t?.configFile);return{name:$s(e),cwd:e,...n!==void 0?{configFile:js(e,n)}:{},rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function Ks(e,t){if(e!==null&&typeof e=="object"&&"extends"in e)throw d.configLoadFailed(`helix.config.ts at ${t}: 'extends' is not supported \u2014 remove the field`);let n=Ns.safeParse(e);if(!n.success){let l=n.error.issues.map(u=>u.message).join("; ");throw d.configLoadFailed(`Invalid helix.config.ts at ${t}: ${l}`)}let{projectId:r,workspaceId:o,...s}=n.data,i=o!==void 0?{workspaceId:o}:{},a=fn(),c=a!==void 0?{...s,region:a}:s;return r!==void 0?{kind:"provisioned",projectId:r,...c,...i}:{kind:"unprovisioned",...c,...i}}async function el(e,t){let n=e??process.cwd(),r=Lt(t?.configFile),o=r!==void 0?J(n,r):void 0;if(o!==void 0&&!ot(o)){let a=t?.configFile?.trim()?"":` (from ${sr})`;throw d.configLoadFailed(`Config file not found: ${o}${a}`)}let s;try{s=await Ms(Bs(n,t))}catch(a){throw d.configLoadFailed(`Failed to load helix.config.ts: ${a instanceof Error?a.message:String(a)}`)}let i=s._configFile??Us(n,t);if(!i)throw d.configLoadFailed(`helix.config.ts not found at ${J(n,"helix.config.ts")}`);if(o!==void 0&&s._configFile!==void 0){let a=Yn(o);if(Yn(J(s._configFile))!==a)throw d.configLoadFailed(`Config file conflict: requested ${o} but ${J(s._configFile)} takes extension-resolution precedence \u2014 remove or rename the sibling file`)}return Ks(s.config,i)}var Hs="WORKSPACE_ID_REQUIRED";function tl(e){if(e.workspaceId===void 0)throw Object.assign(new Error("No workspaceId found in helix.config.ts. Discover & choose one \u2014 self-serve fix: run `helix workspace select`; agent-driven fix: call the `tray_list_workspaces` MCP tool. Already know the id? Run `helix workspace set <id>` or call the `tray_set_workspace_id` MCP tool. deploy cannot proceed without a workspace."),{code:Hs});return e.workspaceId}var ir="helix-tool",qs=/^[a-z][a-z0-9_]{0,63}$/;function sl(e){if(typeof e.name!="string"||!qs.test(e.name))throw new Error(`defineTool: invalid tool name ${JSON.stringify(e.name)} \u2014 use snake_case (e.g. "lookup_customer")`);if(typeof e.description!="string"||e.description.trim().length===0)throw new Error(`defineTool("${e.name}"): description is required`);if(!e.input||typeof e.input.safeParse!="function")throw new Error(`defineTool("${e.name}"): input must be a Zod schema`);if(typeof e.handler!="function")throw new Error(`defineTool("${e.name}"): handler must be a function`);let t=async(r,o)=>{let s=e.input.safeParse(r);if(!s.success)throw d.inputValidationFailed(s.error.issues.map(i=>i.path.join(".")||"(root)"));return e.handler({...o,input:s.data})},n=(async r=>t(r,Ve()));return Object.defineProperties(n,{kind:{value:ir,enumerable:!0},name:{value:e.name,enumerable:!0},description:{value:e.description,enumerable:!0},inputSchema:{value:e.input,enumerable:!0},needsApproval:{value:e.needsApproval,enumerable:!0},execute:{value:t,enumerable:!0}}),n}function ar(e){return typeof e=="function"&&e.kind===ir&&typeof e.name=="string"}var I=class extends Error{constructor(t){super(t),this.name="AgentCallerError"}};import{readFileSync as Vs}from"fs";import{isAbsolute as zs,resolve as Gs}from"path";var B=new Map;function cr(e){B.set(e.name,{definition:e});for(let t of B.values())t.referencesValidated=void 0}function ul(e,t){let n=B.get(e);n&&(n.baseDir=t,n.resolvedInstructions=void 0)}function pl(e,t){let n=B.get(e);n&&(n.resolvedInstructions=t)}function Me(e){let t=B.get(e);if(!t){let n=[...B.keys()].sort();throw new I(`Unknown agent "${e}". Registered agents: ${n.join(", ")||"(none \u2014 are the functions/_agents/ modules imported?)"}`)}return t.definition}function fl(){return[...B.values()].map(e=>e.definition)}function lr(e){let t=B.get(e);if(!t)throw new I(`Unknown agent "${e}"`);if(t.resolvedInstructions!==void 0)return t.resolvedInstructions;let{definition:n}=t;if(n.instructions!==void 0)return t.resolvedInstructions=n.instructions,n.instructions;let r=n.instructionsFile,o=zs(r)?r:t.baseDir!==void 0?Gs(t.baseDir,r):void 0;if(o===void 0)throw new Error(`Agent "${e}" uses instructionsFile "${r}" but its base directory is unknown \u2014 load the agent through helix dev (which records it), or use inline \`instructions\`.`);let s;try{s=Vs(o,"utf-8")}catch(i){throw new Error(`Agent "${e}": failed to read instructionsFile ${o}: ${i instanceof Error?i.message:String(i)}`)}if(s.trim().length===0)throw new Error(`Agent "${e}": instructionsFile ${o} is empty`);return t.resolvedInstructions=s,s}function dr(e){let t=B.get(e);if(t?.referencesValidated)return;let n=Me(e);for(let r of n.agents??[]){let s=(Me(r).tools??[]).filter(i=>i.needsApproval);if(s.length>0)throw new Error(`Agent "${e}" delegates to "${r}", which has needsApproval tools (${s.map(i=>i.name).join(", ")}) \u2014 approval cannot pause a parent's loop through delegation in v1. Put approval-gated tools on the orchestrating agent.`)}t&&(t.referencesValidated=!0)}function ml(){B.clear()}import{z as P}from"zod";var ur="helix-agent",Js=/^[a-z][a-z0-9-]{0,63}$/,Ws=P.object({model:P.string().min(1),auth:P.string().min(1)}),Xs=P.object({name:P.string().regex(Js,'agent name must be kebab-case (e.g. "support-agent"); name is required in v1'),description:P.string().min(1,"description is required"),model:P.string().min(1,"model is required"),auth:P.string().min(1,"auth (authentication alias) is required"),fallbacks:P.array(Ws).optional(),instructions:P.string().min(1).optional(),instructionsFile:P.string().min(1).optional(),tools:P.array(P.custom(ar,"tools entries must be defineTool exports")).optional(),agents:P.array(P.string().min(1)).optional(),memory:P.object({maxSessionMessages:P.number().int().positive().optional(),ttl:P.number().int().positive().optional(),scope:P.enum(["user","project"]).optional()}).optional(),limits:P.object({maxIterations:P.number().int().positive().optional(),maxToolCalls:P.number().int().positive().optional()}).optional()}).refine(e=>e.instructions===void 0!=(e.instructionsFile===void 0),{message:"exactly one of instructions / instructionsFile must be set"}),pr=200,fr=25,mr=50,Nt=3;function Sl(e){let t=Xs.safeParse(e);if(!t.success){let o=typeof e?.name=="string"?e.name:"(unnamed)",s=t.error.issues.map(i=>`${i.path.join(".")||"(root)"}: ${i.message}`).join("; ");throw new Error(`defineAgent(${o}): invalid definition \u2014 ${s}`)}let n=new Set;for(let o of t.data.tools??[]){if(n.has(o.name))throw new Error(`defineAgent(${t.data.name}): duplicate tool "${o.name}"`);n.add(o.name)}let r={kind:ur,...t.data};return cr(r),r}function bl(e){return typeof e=="object"&&e!==null&&e.kind===ur&&typeof e.name=="string"}var Ys=50,gr=500;function Fe(e){let t=e?.limit??Ys;if(!Number.isInteger(t)||t<1||t>gr)throw new I(`session.page(): limit must be an integer from 1 to ${gr}.`);let n=e?.order??"asc";if(n!=="asc"&&n!=="desc")throw new I('session.page(): order must be "asc" or "desc".');return{limit:t,order:n,cursor:e?.cursor}}function $t(){return new I("session.page(): invalid cursor \u2014 pass the `nextCursor` of the previous page, with the same `order`.")}var W=new Map;function jt(e,t,n){let r=encodeURIComponent;return n!==void 0?`agent:${r(e)}:user:${r(n)}:session:${r(t)}`:`agent:${r(e)}:session:${r(t)}`}function Qs(e,t,n){let r=Math.max(0,e.length-t);for(let s=r;s<e.length;s++)if(e[s]?.role==="user")return e.slice(s);for(let s=r-1;s>=0;s--)if(e[s]?.role==="user")return e.slice(s);if(!n)return;let o=r;for(;o<e.length&&e[o]?.role==="tool";)o++;return e.slice(o)}var Zs=32;async function Bt(e,t){let n=t+Zs;for(;;){let r=await e.messages({limit:n}),o=Qs(r,t,r.length<n);if(o!==void 0)return o;n*=2}}function Kt(e,t){return e.ttlSeconds!==void 0&&t-e.lastActiveAt>e.ttlSeconds*1e3}var ei=6e4,Ut=0;function ti(e){if(!(e-Ut<ei)){Ut=e;for(let[t,n]of W)if(Kt(n,e)){if(n.pendingApprovals.length>0){n.messages=[];continue}W.delete(t)}}}var X=class extends Error{constructor(t){super(`Agent session "${t}" has expired (session-expired)`),this.name="SessionExpiredError"}};function yr(e,t,n,r){let o=Date.now();ti(o);let s=n?.ttl,i=t??`ses_${crypto.randomUUID().replaceAll("-","")}`,a=jt(e,i,r),c=W.get(a);if(c&&(c.ttlSeconds=s),c&&Kt(c,o)){if(W.delete(a),c.pendingApprovals.length>0)throw new X(i);c=void 0}c||(c={id:i,agentName:e,...r!==void 0?{ownerUserId:r}:{},messages:[],createdAt:o,lastActiveAt:o,pendingApprovals:[],ttlSeconds:s},W.set(a,c));let l=c,u=()=>{l.lastActiveAt=Date.now()};return{id:i,async messages(p){u();let m=l.messages;return p?.limit!==void 0?m.slice(-p.limit):[...m]},async page(p){let{limit:m,order:g,cursor:w}=Fe(p);u();let S=w===void 0?0:Number(w);if(!Number.isInteger(S)||S<0)throw $t();let x=g==="desc"?[...l.messages].reverse():l.messages,y=x.slice(S,S+m),f=S+y.length;return{messages:y,nextCursor:f<x.length?String(f):null}},async append(...p){u(),l.messages.push(...p)},async clear(){W.delete(a)},async truncated(){return!1},async pendingApprovals(){return u(),[...l.pendingApprovals]},async addPendingApprovals(p){u(),l.pendingApprovals.push(...p)},async resolveApproval(p){u();let m=l.pendingApprovals.findIndex(g=>g.approvalId===p);return m===-1?"already-resolved":(l.pendingApprovals.splice(m,1),"resolved")}}}function hr(e,t,n={}){let r=Date.now(),o=n.first??20,s=n.cursor!==void 0&&Number.parseInt(n.cursor,10)||0,i=[...W.values()].filter(c=>c.agentName===e&&c.ownerUserId===t&&!Kt(c,r)).sort((c,l)=>l.lastActiveAt-c.lastActiveAt);return{sessions:i.slice(s,s+o).map(c=>({id:c.id,createdAt:c.createdAt,lastActivityAt:c.lastActiveAt,messageCount:c.messages.length,pendingApprovals:c.pendingApprovals.length})),nextCursor:s+o<i.length?String(s+o):null}}function Al(){W.clear(),Ut=0}import{AsyncLocalStorage as Ri}from"async_hooks";import{z as zr}from"zod";import{generateText as Ci,streamText as Ti,tool as Gr,stepCountIs as ki}from"ai";import{SpanKind as zt,SpanStatusCode as Se,context as Jr,trace as Pi}from"@opentelemetry/api";import{embed as xr,embedMany as Ar,generateImage as Er,generateObject as Ir,generateSpeech as Rr,generateText as Cr,streamObject as Tr,streamText as kr,transcribe as Pr}from"ai";import{SpanKind as fi,SpanStatusCode as vr}from"@opentelemetry/api";import{createOpenAI as si}from"@ai-sdk/openai";import{createAnthropic as ii}from"@ai-sdk/anthropic";import{createGoogle as ai}from"@ai-sdk/google";import{createMistral as ci}from"@ai-sdk/mistral";import{createCohere as li}from"@ai-sdk/cohere";import{createAmazonBedrock as di}from"@ai-sdk/amazon-bedrock";import{createOpenAICompatible as ui}from"@ai-sdk/openai-compatible";var ni=new Set(["x-api-key","x-goog-api-key"]);function ri(e){return gn(e)||ni.has(e.toLowerCase())}function oi(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function wr(e){return async(t,n)=>{let r=oi(t),o=new URL(r);if(o.protocol!=="https:")throw d.unsupportedScheme(o.protocol.replace(/:$/,""));let s=E(),{region:i}=A(),a=new Headers(n?.headers??(t instanceof Request?t.headers:void 0)),c=new Headers;for(let[x,y]of a.entries())ri(x)||c.append(x,y);c.set(Ie,r),c.set(ze,e),s.executionId&&c.set(Re,s.executionId);let{headers:l,deploymentId:u}=z(s);for(let[x,y]of Object.entries(l))c.set(x,y);u&&c.set(te,u);let p=fe(i,s.mode==="lambda"?"runtime":"dev"),m=n?.body??(t instanceof Request?t.clone().body:void 0),g={method:n?.method??(t instanceof Request?t.method:"GET"),headers:c,redirect:"manual",signal:n?.signal??void 0};m!=null&&(g.body=m,typeof ReadableStream<"u"&&m instanceof ReadableStream&&(g.duplex="half"));let w;try{w=await fetch(p,g)}catch(x){if(x instanceof Error&&x.name==="AbortError")throw x;let y=x instanceof Error?x.message??String(x):String(x);throw d.brokerError(0,y)}let S=w.headers.get(Ge);if(S!==null){let x=await w.text(),y=x||S;try{let f=yn.safeParse(JSON.parse(x));f.success&&(y=f.data.error.message)}catch{}throw S===pe&&(y="credential broker does not support the raw proxy endpoint required by ctx.ai \u2014 deploy a newer broker or pin an older SDK"),d.brokerError(w.status,y,x||void 0,S)}return w}}var ae="helix-broker";function Sr(e){let{alias:t,service:n,baseUrl:r,region:o,authenticationId:s}=e,i=wr(s);switch(n){case"openai":return si({apiKey:ae,fetch:i});case"anthropic":return ii({apiKey:ae,fetch:i});case"google":return ai({apiKey:ae,fetch:i});case"mistral":return ci({apiKey:ae,fetch:i});case"cohere":return li({apiKey:ae,fetch:i});case"bedrock":{if(!o&&!r)throw d.aiProviderMisconfigured(t,n,'set region (e.g. "us-east-1") or baseUrl for the Bedrock runtime endpoint');return di({apiKey:ae,region:o??"helix-broker",...r?{baseURL:r}:{},fetch:i})}case"openai-compatible":{if(!r)throw d.aiProviderMisconfigured(t,n,"set baseUrl for the endpoint");return ui({name:t,baseURL:r,apiKey:ae,fetch:i})}}}var br={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-mini":{input:.4,output:1.6},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1":{input:2,output:8},"text-embedding-3-small":{input:.02,output:0},"text-embedding-3-large":{input:.13,output:0},"gpt-image-1":{input:5,output:40},"claude-opus-4":{input:15,output:75},"claude-sonnet-4":{input:3,output:15},"claude-haiku-4":{input:1,output:5},"claude-3-5-haiku":{input:.8,output:4},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:.3,output:2.5},"text-embedding-004":{input:0,output:0},"mistral-large":{input:2,output:6},"mistral-small":{input:.1,output:.3},"command-r-plus":{input:2.5,output:10},"command-r":{input:.15,output:.6}},pi=Object.keys(br).sort((e,t)=>t.length-e.length);function it(e,t){let n=pi.find(s=>e.startsWith(s));if(!n||!t)return{amount:0,currency:"USD"};let r=br[n],o=((t.inputTokens??0)*r.input+(t.outputTokens??0)*r.output)/1e6;return{amount:Number(o.toFixed(8)),currency:"USD"}}function L(e,t,n){return F.startActiveSpan("ai",{kind:fi.CLIENT},async r=>{r.setAttributes({operation:e.operation,model:e.model,...e.alias!==void 0?{alias:e.alias}:{}}),O("hasAi");try{let o=await t(),s=n?.(o);return s&&r.setAttributes({...s.inputTokens!==void 0?{inputTokens:s.inputTokens}:{},...s.outputTokens!==void 0?{outputTokens:s.outputTokens}:{}}),r.setAttribute("status","success"),r.setStatus({code:vr.OK}),o}catch(o){let s=o instanceof Error?o.message:String(o);throw r.setAttribute("status","error"),r.setStatus({code:vr.ERROR,message:s}),o}finally{r.end()}})}function mi(){return`aireq_${crypto.randomUUID().replaceAll("-","")}`}function he(e,t){return{cost:it(e,t),requestId:mi()}}function ce(e){return typeof e=="object"&&e!==null&&"modelId"in e?String(e.modelId):String(e)}var Or=new WeakSet;function ye(e){return Or.add(e),e}function _r(e){return ye(e)}function V(e){if(typeof e!="object"||e===null)throw d.aiModelInstanceRequired(typeof e=="string"?e:String(e));if(!Or.has(e))throw d.aiForeignModelRejected()}function at(e){return e.totalUsage??e.usage}function ct(e){return e.usage?.tokens!==void 0?{inputTokens:e.usage.tokens}:void 0}function lt(e){return e.usage}function Ht(e){let t=A(),n=t.authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e],o=(t.aiProviders??{})[e];if(o===void 0)throw d.aiProviderNotConfigured(e,[...st]);let{service:s,baseUrl:i,region:a}=typeof o=="string"?{service:o,baseUrl:void 0,region:void 0}:o,c=Sr({alias:e,service:s,baseUrl:i,region:a,authenticationId:r}),l=y=>ye(c.languageModel(y)),u=y=>ye(c.embeddingModel(y)),p=y=>ye(c.imageModel(y)),m=y=>{if(!c.transcriptionModel)throw new Error(`AI provider "${s}" (alias "${e}") has no transcription models`);return ye(c.transcriptionModel(y))},g=y=>{if(!c.speechModel)throw new Error(`AI provider "${s}" (alias "${e}") has no speech models`);return ye(c.speechModel(y))},w=(y=>l(y)),S=(y,f)=>{let h=y.model;if(typeof h!="string")throw d.aiModelIdRequired(e,f);return h};return Object.assign(w,{specificationVersion:"v4",languageModel:l,embeddingModel:u,textEmbeddingModel:u,imageModel:p,transcriptionModel:m,speechModel:g,async generateText(y){let f=S(y,"generateText"),h=await L({operation:"generateText",model:f,alias:e},()=>Cr({...y,model:l(f)}),at);return Object.assign(h,{helix:he(f,at(h))})},streamText(y){let f=S(y,"streamText");return O("hasAi"),kr({...y,model:l(f)})},async generateObject(y){let f=S(y,"generateObject"),h=await L({operation:"generateObject",model:f,alias:e},()=>Ir({...y,model:l(f)}),R=>R.usage),v=h.usage;return Object.assign(h,{helix:he(f,v)})},streamObject(y){let f=S(y,"streamObject");return O("hasAi"),Tr({...y,model:l(f)})},async embed(y){let f=S(y,"embed");return L({operation:"embed",model:f,alias:e},()=>xr({...y,model:u(f)}),ct)},async embedMany(y){let f=S(y,"embedMany");return L({operation:"embedMany",model:f,alias:e},()=>Ar({...y,model:u(f)}),ct)},async generateImage(y){let f=S(y,"generateImage"),h=await L({operation:"generateImage",model:f,alias:e},()=>Er({...y,model:p(f)}),lt);return Object.assign(h,{helix:he(f,lt(h))})},async transcribe(y){let f=S(y,"transcribe");return L({operation:"transcribe",model:f,alias:e},()=>Pr({...y,model:m(f)}))},async generateSpeech(y){let f=S(y,"generateSpeech");return L({operation:"generateSpeech",model:f,alias:e},()=>Rr({...y,model:g(f)}))}})}function Xl(){let e=new Map;return Object.assign((r=>{let o=e.get(r);return o||(o=Ht(r),e.set(r,o)),o}),{async generateText(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateText",model:o},()=>Cr(r),at);return Object.assign(s,{helix:he(o,at(s))})},streamText(r){return V(r.model),O("hasAi"),kr(r)},async generateObject(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateObject",model:o},()=>Ir(r),a=>a.usage),i=s.usage;return Object.assign(s,{helix:he(o,i)})},streamObject(r){return V(r.model),O("hasAi"),Tr(r)},async embed(r){return V(r.model),L({operation:"embed",model:ce(r.model)},()=>xr(r),ct)},async embedMany(r){return V(r.model),L({operation:"embedMany",model:ce(r.model)},()=>Ar(r),ct)},async generateImage(r){V(r.model);let o=ce(r.model),s=await L({operation:"generateImage",model:o},()=>Er(r),lt);return Object.assign(s,{helix:he(o,lt(s))})},async transcribe(r){return V(r.model),L({operation:"transcribe",model:ce(r.model)},()=>Pr(r))},async generateSpeech(r){return V(r.model),L({operation:"generateSpeech",model:ce(r.model)},()=>Rr(r))}})}var qt=class extends Error{errors;constructor(t){super(`all ${t.length} models in the fallback chain failed \u2014 `+t.map(({modelId:n,error:r})=>`${n}: ${r instanceof Error?r.message:String(r)}`).join("; ")),this.name="FallbackExhaustedError",this.errors=t.map(n=>n.error)}};function Dr(e){if(e.length===0)throw new Error("createFallbackModel: at least one model required");if(e.length===1)return e[0];let t=e[0];async function n(r){let o=[];for(let s of e)try{return await r(s)}catch(i){if(i instanceof Error&&i.name==="AbortError")throw i;o.push({modelId:s.modelId,error:i})}throw new qt(o)}return{specificationVersion:"v4",provider:t.provider,modelId:t.modelId,get supportedUrls(){return Promise.resolve(t.supportedUrls)},doGenerate:r=>n(o=>o.doGenerate(r)),doStream:r=>n(o=>o.doStream(r))}}function Vt(e){let t=e.code===pe?"credential broker does not support the raw proxy endpoints required by this SDK version \u2014 deploy a newer broker or pin an older SDK":e.message;throw d.brokerError(e.status,t,k(e.body),e.code)}async function we(e,t={}){let n=E(),{region:r}=A(),{headers:o,deploymentId:s}=z(n);s&&(o[te]=s);let i=fe(r,n.mode==="lambda"?"runtime":"dev"),a;try{a=await wn({proxyUrl:i,credentialHeaders:o,request:e,timeoutMs:t.timeout,executionId:n.executionId})}catch(c){let l=c instanceof Error?c.message??String(c):String(c);throw d.brokerError(0,l)}return a.kind==="brokerError"&&Vt(a),a.response}var gi=8,ut="msg#",yi="meta",Mr=25,Fr=3,hi=400*1024-1024;function wi(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r?.content))for(let o of r.content){if(typeof o!="object"||o===null)continue;let{type:s,approvalId:i,isAutomatic:a}=o;typeof i=="string"&&(s==="tool-approval-request"&&a!==!0&&t.add(i),s==="tool-approval-response"&&n.add(i))}for(let r of n)t.delete(r);return t}var N=e=>({S:e}),dt=e=>({N:String(e)});function Le(e,t){let n=e?.[t]?.S;return typeof n=="string"?n:void 0}function Lr(e,t){let n=e?.[t]?.N;return typeof n=="string"?Number(n):void 0}function Si(e,t){return e?.[t]?.BOOL===!0}function Nr(e,t){let n=e?.[t]?.M;return typeof n=="object"&&n!==null?n:{}}function bi(e){return`${ut}${String(e).padStart(gi,"0")}`}function vi(e){let t=null;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}else e!==null&&typeof e=="object"&&(t=e);let n=t?.__type;return typeof n=="string"?n.split("#").pop():void 0}function Ur(e){let{agentName:t,table:n,region:r,authenticationId:o}=e,s=e.options?.ttl,i=e.sessionId??`ses_${crypto.randomUUID().replaceAll("-","")}`,a=jt(t,i,e.ownerUserId),c={pk:N(a),sk:N(yi)};async function l(f,h){let v=ne({authenticationId:o,method:"POST",url:`https://dynamodb.${r}.amazonaws.com/`,body:h,headers:{"Content-Type":"application/x-amz-json-1.0","X-Amz-Target":`DynamoDB_20120810.${f}`}}),R,T;try{({status:R,body:T}=await we(v))}catch(C){throw C instanceof d?C:d.agentSessionsFailed(C instanceof Error?C.message:String(C))}if(R>=400){let C=vi(T);throw C==="ConditionalCheckFailedException"?new pt:d.agentSessionsFailed(`DynamoDB ${f} failed (${R}): ${C??JSON.stringify(T).slice(0,300)}`)}if(typeof T=="string")try{return JSON.parse(T)}catch{throw d.agentSessionsFailed(`DynamoDB ${f}: non-JSON response body`)}return T??{}}async function u(){return(await l("GetItem",{TableName:n,Key:c,ConsistentRead:!0})).Item}let p=!1;async function m(){p||(await g(),p=!0)}async function g(){let f=await u();if(!f){let v=await w({ascending:!0});if(v.length===0||await u())return;let R=v.map(T=>JSON.parse(Le(T,"message")??"null"));if(await S(v.map(T=>({DeleteRequest:{Key:{pk:N(a),sk:T.sk}}}))),wi(R).size>0)throw new X(i);return}if(s===void 0)return;let h=Lr(f,"lastActiveAt")??0;if(!(Date.now()-h<=s*1e3)){if(Object.keys(Nr(f,"pendingApprovals")).length>0)throw new X(i);await x()}}async function w(f){let h=[],v;do{let R=await l("Query",{TableName:n,KeyConditionExpression:"pk = :pk AND begins_with(sk, :prefix)",ExpressionAttributeValues:{":pk":N(a),":prefix":N(ut)},ConsistentRead:!0,ScanIndexForward:f.ascending,...f.limit!==void 0?{Limit:f.limit}:{},...f.projection!==void 0?{ProjectionExpression:f.projection}:{},...v!==void 0?{ExclusiveStartKey:v}:{}});if(h.push(...R.Items??[]),v=R.LastEvaluatedKey,f.limit!==void 0&&h.length>=f.limit)break}while(v!==void 0);return h}async function S(f){for(let h=0;h<f.length;h+=Mr){let v=f.slice(h,h+Mr);for(let R=0;v.length>0;R++){let C=(await l("BatchWriteItem",{RequestItems:{[n]:v}})).UnprocessedItems?.[n];if(!C||C.length===0)break;if(R>=Fr)throw d.agentSessionsFailed(`DynamoDB BatchWriteItem: ${C.length} items still unprocessed after ${Fr} retries`);v=C}}}async function x(){let h=(await w({ascending:!0,projection:"sk"})).map(v=>({DeleteRequest:{Key:{pk:N(a),sk:v.sk}}}));h.push({DeleteRequest:{Key:c}}),await S(h)}async function y(f){let h=Date.now();return(await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:"ADD nextSeq :reserve, messageCount :reserve SET lastActiveAt = :now, "+(s!==void 0?"expiresAt = :expires, ":"")+"createdAt = if_not_exists(createdAt, :now), truncated = if_not_exists(truncated, :false), pendingApprovals = if_not_exists(pendingApprovals, :emptyMap)"+(s===void 0?" REMOVE expiresAt":""),ExpressionAttributeValues:{":reserve":dt(f),":now":dt(h),...s!==void 0?{":expires":dt(Math.floor(h/1e3)+s)}:{},":false":{BOOL:!1},":emptyMap":{M:{}}},ReturnValues:"ALL_NEW"})).Attributes??{}}return{id:i,async messages(f){await m();let h=f?.limit;return h!==void 0?(await w({ascending:!1,limit:h})).reverse().map(T=>JSON.parse(Le(T,"message")??"null")):(await w({ascending:!0})).map(R=>JSON.parse(Le(R,"message")??"null"))},async page(f){let{limit:h,order:v,cursor:R}=Fe(f);await m();let T;if(R!==void 0&&(T=Buffer.from(R,"base64url").toString("utf8"),!T.startsWith(ut)))throw $t();let C=await l("Query",{TableName:n,KeyConditionExpression:"pk = :pk AND begins_with(sk, :prefix)",ExpressionAttributeValues:{":pk":N(a),":prefix":N(ut)},ConsistentRead:!0,ScanIndexForward:v==="asc",Limit:h,...T!==void 0?{ExclusiveStartKey:{pk:N(a),sk:N(T)}}:{}}),ee=C.Items??[],qe=Le(C.LastEvaluatedKey,"sk");return{messages:ee.map(Go=>JSON.parse(Le(Go,"message")??"null")),nextCursor:qe!==void 0?Buffer.from(qe,"utf8").toString("base64url"):null}},async append(...f){if(f.length===0)return;let h=f.map(ee=>JSON.stringify(ee)),v=h.findIndex(ee=>Buffer.byteLength(ee,"utf8")>hi);if(v!==-1)throw d.agentSessionsFailed(`a ${f[v].role} message of ${Buffer.byteLength(h[v],"utf8")} bytes exceeds DynamoDB's 400 KB item limit \u2014 the session store keeps one item per message; have tools summarise or offload (ctx.files) large results`);await m();let R=await y(f.length),C=(Lr(R,"nextSeq")??f.length)-f.length+1;await S(h.map((ee,qe)=>({PutRequest:{Item:{pk:N(a),sk:N(bi(C+qe)),message:N(ee)}}})))},async clear(){await x()},async truncated(){return await m(),Si(await u(),"truncated")},async pendingApprovals(){await m();let f=Nr(await u(),"pendingApprovals");return Object.values(f).map(h=>{let v=h.S;return v!==void 0?JSON.parse(v):void 0}).filter(h=>h!==void 0)},async addPendingApprovals(f){if(f.length===0)return;await m(),await y(0);let h={},v={},R=[];f.forEach((T,C)=>{h[`#a${C}`]=T.approvalId,v[`:v${C}`]=N(JSON.stringify(T)),R.push(`pendingApprovals.#a${C} = :v${C}`)}),await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:`SET ${R.join(", ")}`,ExpressionAttributeNames:h,ExpressionAttributeValues:v})},async resolveApproval(f){await m();try{return await l("UpdateItem",{TableName:n,Key:c,UpdateExpression:"REMOVE pendingApprovals.#id SET lastActiveAt = :now",ConditionExpression:"attribute_exists(pendingApprovals.#id)",ExpressionAttributeNames:{"#id":f},ExpressionAttributeValues:{":now":dt(Date.now())}}),"resolved"}catch(h){if(h instanceof pt)return"already-resolved";throw h}}}}var pt=class extends Error{constructor(){super("ConditionalCheckFailedException"),this.name="ConditionalCheckFailed"}};import xi from"ky";async function K(e){let t=e.headers.get("content-type")??"",n=await e.text();if(n.length!==0)return t.includes("application/json")?JSON.parse(n):n}var Ai=6e4,Ei=500,$r=500;function jr(e){let t=A();if(t.kind!=="provisioned")throw d.agentSessionsFailed("the managed session store requires a provisioned project (projectId in helix.config.ts)");return`${j(t.region).hosts.api}/private/v1/helix/projects/${encodeURIComponent(t.projectId)}/storage/agent-sessions/${encodeURIComponent(e)}`}function Ii(){let e=ue(),t=$(),n={Accept:"application/json"};if(e&&e.trim().length>0&&(n[de]=e),t&&t.trim().length>0&&(n[U]=t),Object.keys(n).length===1)throw d.missingExecutionCredentials();return n}async function Y(e,t,n){try{let r=await xi(t,{method:e,headers:Ii(),...n!==void 0?{json:n}:{},throwHttpErrors:!1,timeout:Ai});return{status:r.status,body:await K(r)}}catch(r){throw r instanceof d?r:d.agentSessionsFailed(`managed session store unreachable: ${r instanceof Error?r.message:String(r)}`)}}function ft(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message}return String(e??"unknown error")}function le(e,t,n){throw t===410?new X(e):t===404?new I(`Agent session "${e}" was not found (it may belong to a different user or have expired).`):d.agentSessionsFailed(`managed session store error ${t}: ${ft(n)}`)}function Br(e){let t=jr(e.agentName),n=e.sessionId??`ses_${crypto.randomUUID().replaceAll("-","")}`,r=e.options?.scope,o=e.options?.ttl,s=async c=>{let l=new URL(`${t}/${encodeURIComponent(n)}/messages`);c.first!==void 0&&l.searchParams.set("first",String(c.first)),c.cursor!==void 0&&l.searchParams.set("cursor",c.cursor),c.order!==void 0&&l.searchParams.set("order",c.order);let{status:u,body:p}=await Y("get",l.toString());if(u!==404){if(u===400&&c.cursor!==void 0)throw new I(`session.page(): ${ft(p)}`);return(u<200||u>=300)&&le(n,u,p),p}},i=c=>c.elements.length<2||c.elements[0].id>c.elements[1].id,a=async()=>{let c=[],l;for(;;){let u=await s({...l!==void 0?{cursor:l}:{}});if(u===void 0)return[];if(c.push(...u.elements.map(p=>p.message)),!u.pageInfo.hasNextPage||u.pageInfo.endCursor===null)break;l=u.pageInfo.endCursor}return c};return{id:n,async messages(c){let l=c?.limit;if(l===void 0)return a();let u=[],p;for(;u.length<l;){let m=await s({order:"desc",first:Math.min(l-u.length,Ei),...p!==void 0?{cursor:p}:{}});if(m===void 0)return[];if(!i(m))return(await a()).slice(-l);if(u.push(...m.elements.map(g=>g.message)),!m.pageInfo.hasNextPage||m.pageInfo.endCursor===null)break;p=m.pageInfo.endCursor}return u.slice(0,l).reverse()},async page(c){let{limit:l,order:u,cursor:p}=Fe(c),m=await s({first:l,order:u,...p!==void 0?{cursor:p}:{}});if(m===void 0)return{messages:[],nextCursor:null};if(u==="desc"&&!i(m))throw d.agentSessionsFailed('the managed session store in this environment does not support newest-first paging yet \u2014 page with order: "asc", or read the latest messages with session.messages({ limit }).');return{messages:m.elements.map(g=>g.message),nextCursor:m.pageInfo.hasNextPage?m.pageInfo.endCursor:null}},async append(...c){if(c.length===0)return;let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/messages`,{messages:c,...r!==void 0?{scope:r}:{},...o!==void 0?{ttl:o}:{}});(l<200||l>=300)&&le(n,l,u)},async clear(){for(let c=0;c<$r;c++){let{status:l,body:u}=await Y("delete",`${t}/${encodeURIComponent(n)}`);if(l===204||l===404)return;if(!(l===200&&u?.more===!0)){if(l===200)return;le(n,l,u)}}throw d.agentSessionsFailed(`clearing session "${n}" did not complete after ${$r} calls \u2014 call clear() again to continue.`)},async truncated(){let{status:c,body:l}=await Y("get",`${t}/${encodeURIComponent(n)}`);return c===404?!1:((c<200||c>=300)&&le(n,c,l),l.truncated===!0)},async pendingApprovals(){let{status:c,body:l}=await Y("get",`${t}/${encodeURIComponent(n)}`);return c===404?[]:((c<200||c>=300)&&le(n,c,l),l.pendingApprovals)},async addPendingApprovals(c){if(c.length===0)return;let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/approvals`,{approvals:c});l!==204&&le(n,l,u)},async resolveApproval(c){let{status:l,body:u}=await Y("post",`${t}/${encodeURIComponent(n)}/approvals/${encodeURIComponent(c)}/resolve`);return(l<200||l>=300)&&le(n,l,u),u.status}}}async function Kr(e,t={}){let n=jr(e),r=new URL(n);t.first!==void 0&&r.searchParams.set("first",String(t.first)),t.cursor!==void 0&&r.searchParams.set("cursor",t.cursor);let{status:o,body:s}=await Y("get",r.toString());if(o===400)throw new I(ft(s));if(o<200||o>=300)throw d.agentSessionsFailed(`managed session store error ${o}: ${ft(s)}`);let i=s;return{sessions:i.elements.map(a=>({id:a.sessionId,createdAt:a.createdAt,lastActivityAt:a.lastActivityAt,messageCount:a.messageCount,pendingApprovals:a.pendingApprovalCount})),nextCursor:i.pageInfo.endCursor}}function Hr(e){if(e?.scope!=="user")return;let t=mn.getStore()?.userId;if(typeof t!="string"||t.length===0)throw new I('This agent is user-scoped (memory.scope: "user") \u2014 it can only run in a user execution with a user identity (ctx.userId); schedules have none.');return t}function qr(){return E().mode==="lambda"}function mt(e,t,n){let r=A(),o=r.agentSessions,s=Hr(n);if(o?.store==="dynamodb"){let i=r.authentications??{},a=i[o.auth];if(!a)throw d.unknownAlias(o.auth,Object.keys(i));return Ur({agentName:e,sessionId:t,authenticationId:a,table:o.table,region:o.region,options:n,...s!==void 0?{ownerUserId:s}:{}})}return qr()?Br({agentName:e,sessionId:t,options:n}):yr(e,t,n,s)}async function Vr(e,t,n={}){if(t?.scope!=="user")throw new I(`agent.sessions() lists the calling user's sessions \u2014 the agent must declare memory.scope: "user".`);if(A().agentSessions?.store==="dynamodb")throw new I('agent.sessions() is not supported on the bring-your-own DynamoDB session store \u2014 use the managed store (agentSessions: { store: "managed" }).');let o=Hr(t);return qr()?Kr(e,n):hr(e,o,n)}var Wr=new Ri;function Oi(e){return({steps:t})=>t.reduce((n,r)=>n+r.toolCalls.length,0)>=e}function Xr(e,t,n,r){return F.startActiveSpan("agent.tool",{kind:zt.INTERNAL,attributes:{agent:e,tool:t,...n}},async o=>{try{let s=await r();return o.setAttribute("status","success"),o.setStatus({code:Se.OK}),s}catch(s){throw o.setAttribute("status","error"),o.setStatus({code:Se.ERROR,message:s instanceof Error?s.message:String(s)}),s}finally{o.end()}})}function _i(e){let t={};for(let n of e.tools??[]){let r=n.needsApproval;t[n.name]=Gr({description:n.description,inputSchema:n.inputSchema,...r!==void 0?{needsApproval:typeof r=="function"?o=>r(o):r}:{},execute:o=>Xr(e.name,n.name,{},()=>n.execute(o,Ve()))})}for(let n of e.agents??[]){let r=Me(n),o=`agent_${n.replaceAll("-","_")}`;t[o]=Gr({description:r.description,inputSchema:zr.object({prompt:zr.string().describe("The task or question for the agent")}),execute:({prompt:s})=>Xr(e.name,o,{delegateAgent:n},async()=>{let i=Wr.getStore()??0;return i>=Nt?{error:"delegation_depth_exceeded",message:`Delegation depth limit (${Nt}) reached \u2014 answer with what you have instead of delegating further.`}:(await Wr.run(i+1,()=>Ui(n).generate({prompt:s}))).text})})}return t}function Di(e){let t=[{model:e.model,auth:e.auth},...e.fallbacks??[]];return _r(Dr(t.map(n=>Ht(n.auth)(n.model))))}function Gt(e){return e.filter(t=>typeof t=="object"&&t!==null&&t.type==="tool-approval-request"&&!t.isAutomatic)}function Yr(e){return{approvalId:e.approvalId,toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId,input:e.toolCall.input,requestedAt:new Date().toISOString()}}function Mi(e){return{id:e.approvalId,toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId,input:e.toolCall.input}}function Fi(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let r of Gt(n.content))t.add(r.approvalId);return t}function Li(e,t){let n=e.reduce((r,o)=>r+it(o.response.modelId??t,o.usage).amount,0);return{amount:Number(n.toFixed(8)),currency:"USD"}}async function Ni(e,t,n){let r=[],o=[];if(n.approvals&&n.approvals.length>0){if(n.prompt!==void 0||(n.messages?.length??0)>0)throw new I("agent.generate() cannot combine `approvals` with `prompt` or `messages` \u2014 send the approvals on their own, then send new input on the next call.");let s=new Map((await e.pendingApprovals()).map(p=>[p.approvalId,p]));if(s.size===0&&t.length===0)throw new I(`Session "${e.id}" has no history and nothing awaiting approval \u2014 it does not exist, has expired, or belongs to a different user.`);let i=Fi(t),a=new Set(n.approvals.map(p=>p.id)),c=[...a].filter(p=>!s.has(p)&&!i.has(p));if(c.length>0)throw new I(`Unknown approval id(s) for session "${e.id}": ${c.join(", ")} \u2014 use the ids from \`pendingApprovals\` on the paused result.`);let l=[...s.keys()].filter(p=>!a.has(p));if(l.length>0)throw new I(`Session "${e.id}" has ${l.length} pending approval(s) not decided in this call: ${l.join(", ")} \u2014 decide every pending approval in one generate() call.`);let u=[];for(let p of n.approvals){let m=s.get(p.id);!m||await e.resolveApproval(p.id)==="already-resolved"||(o.push(m),u.push({type:"tool-approval-response",approvalId:p.id,approved:p.approved,...p.reason!==void 0?{reason:p.reason}:{}}))}u.length>0&&r.push({role:"tool",content:u})}if(n.prompt!==void 0?r.push({role:"user",content:n.prompt}):n.messages&&r.push(...n.messages),r.length===0)throw new I("agent.generate() requires `prompt`, `messages`, or `approvals` \u2014 nothing to do.");return{turn:r,claimed:o}}function Ui(e){let t=Me(e);dr(e);let n=lr(e),r=Di(t),o=_i(t),s=t.limits?.maxIterations??fr,i=t.limits?.maxToolCalls??mr,a=t.memory?.maxSessionMessages??pr,c=l=>({model:r,system:n,tools:o,stopWhen:l.stopWhen??[ki(s),Oi(i)],...l.prepareStep!==void 0?{prepareStep:l.prepareStep}:{},...l.activeTools!==void 0?{activeTools:l.activeTools}:{},...l.toolChoice!==void 0?{toolChoice:l.toolChoice}:{},...l.providerOptions!==void 0?{providerOptions:l.providerOptions}:{}});return{model:r,tools:o,instructions:n,session(l){return mt(e,l,t.memory)},sessions(l){return Vr(e,t.memory,l)},async generate(l){return F.startActiveSpan("agent.generate",{kind:zt.INTERNAL,attributes:{agent:e,model:t.model}},async u=>{let p=mt(e,l.sessionId,t.memory);u.setAttribute("sessionId",p.id),O("hasAi");let m=[];try{let g=await Bt(p,a),w=await Ni(p,g,l);m=w.claimed;let S;try{S=await Ci({...c(l),messages:[...g,...w.turn]})}catch(f){if(m.length>0)try{await p.addPendingApprovals(m),m=[]}catch(h){console.error(`[helix-sdk] agent "${e}" session "${p.id}": failed to restore ${m.length} pending approval(s) after a failed resume \u2014 ${h instanceof Error?h.message:String(h)}`)}throw f}let x=Gt(S.content),y=x.length>0?"awaiting-approval":"completed";return await p.append(...w.turn,...S.responseMessages),x.length>0&&await p.addPendingApprovals(x.map(Yr)),u.setAttributes({steps:S.steps.length,status:y}),u.setStatus({code:Se.OK}),Object.assign(S,{sessionId:p.id,status:y,...x.length>0?{pendingApprovals:x.map(Mi)}:{},helix:{cost:Li(S.steps,t.model),model:S.response.modelId??t.model}})}catch(g){throw u.setAttribute("status","error"),u.setStatus({code:Se.ERROR,message:g instanceof Error?g.message:String(g)}),g}finally{u.end()}})},async stream(l){let u=F.startSpan("agent.stream",{kind:zt.INTERNAL,attributes:{agent:e,model:t.model}}),p=!1,m=(g,w)=>{p||(p=!0,u.setAttribute("status",g),u.setStatus(g==="error"?{code:Se.ERROR,...w!==void 0?{message:w}:{}}:{code:Se.OK}),u.end())};try{let g=mt(e,l.sessionId,t.memory);if(u.setAttribute("sessionId",g.id),O("hasAi"),l.approvals&&l.approvals.length>0)throw new I("agent.stream() does not accept approvals \u2014 resume paused runs with generate().");if(l.prompt===void 0&&!l.messages)throw new I("agent.stream() requires `prompt` or `messages`.");let w=l.prompt!==void 0?[{role:"user",content:l.prompt}]:[...l.messages],S=await Bt(g,a),x=Jr.with(Pi.setSpan(Jr.active(),u),()=>Ti({...c(l),messages:[...S,...w],onFinish:async y=>{try{await g.append(...w,...y.responseMessages);let f=Gt(y.content);f.length>0&&await g.addPendingApprovals(f.map(Yr)),m(f.length>0?"awaiting-approval":"completed")}catch(f){let h=f instanceof Error?f.message:String(f);console.error(`[helix-sdk] agent "${e}" session "${g.id}": failed to persist the streamed turn \u2014 ${h}`),m("error",h)}},onError:({error:y})=>{m("error",y instanceof Error?y.message:String(y))},onAbort:()=>{m("error","stream aborted")}}));return Object.assign(x,{sessionId:g.id})}catch(g){throw m("error",g instanceof Error?g.message:String(g)),g}}}}var Qr="helix-schedule",Q=class extends Error{constructor(t){super(`defineSchedule: ${t}`),this.name="ScheduleConfigError"}};function Vd(e){if(typeof e!="object"||e===null)throw new Q("expected a config object");let{cron:t,timezone:n="UTC",concurrent:r=!1,handler:o}=e;if(typeof t!="string"||t.trim()==="")throw new Q("`cron` must be a non-empty string");let s=t.trim().split(/\s+/).length;if(s!==5)throw new Q(`\`cron\` must be a 5-field standard expression (minute hour day-of-month month day-of-week); got ${s} field(s) in "${t}"`);if(typeof n!="string"||!$i(n))throw new Q(`\`timezone\` must be a valid IANA timezone name (e.g. "Europe/London"); got "${String(n)}"`);if(typeof r!="boolean")throw new Q("`concurrent` must be a boolean");if(typeof o!="function")throw new Q("`handler` must be a function");return Object.freeze({kind:Qr,cron:t.trim(),timezone:n,concurrent:r,handler:o})}function zd(e){return typeof e=="object"&&e!==null&&e.kind===Qr&&typeof e.handler=="function"}function $i(e){if(!/^[A-Za-z]/.test(e))return!1;try{return new Intl.DateTimeFormat(void 0,{timeZone:e}),!0}catch{return!1}}import{SpanKind as ji}from"@opentelemetry/api";function gt(e,t,n){let r=F.startSpan("log",{kind:ji.INTERNAL});r.setAttribute("message",t),r.setAttribute("level",e),n&&Hn(r.spanContext().spanId,"properties",n),r.end(),kn(e,t,n)}function Zr(){return{info:(e,t)=>gt("info",e,t),warn:(e,t)=>gt("warn",e,t),error:(e,t)=>gt("error",e,t),debug:(e,t)=>gt("debug",e,t)}}function Zd(){try{return A().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}import Bi from"ky";import{context as Jt,trace as Ki,SpanKind as Ue,SpanStatusCode as to}from"@opentelemetry/api";async function eo(e){Sn(e.url);let t=E(),{region:n}=A(),r={authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},{headers:o,deploymentId:s}=z(t);s&&(r.deploymentId=s);let i=bn(n,t.mode==="lambda"?"runtime":"dev"),a;try{a=await vn({signUrl:i,credentialHeaders:o,body:r,timeoutMs:e.timeout,executionId:t.executionId})}catch(c){let l=c instanceof Error?c.message??String(c):String(c);throw d.brokerError(0,l)}if(a.kind==="brokerError"){let c=a.code===pe?"credential broker does not support the s3 sign endpoint required by this SDK version \u2014 deploy a newer broker or pin an older SDK":a.message;throw d.brokerError(a.status,c,k(a.body),a.code)}return a.result}var Hi=new Set([Ie,ze,te,Re,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id"]);function qi(e){let t=e.toLowerCase();return Hi.has(t)||t.startsWith("x-tray-internal-")}async function Vi(e,t){let n=e instanceof Request?e:new Request(e,t),r=new URL(n.url);if(r.protocol!=="https:")throw d.unsupportedScheme(r.protocol.replace(/:$/,""));let o=E(),{region:s}=A(),{headers:i,deploymentId:a}=z(o),c=fe(s,o.mode==="lambda"?"runtime":"dev"),l=new Headers;for(let[g,w]of n.headers.entries())qi(g)||l.append(g,w);l.set(Ie,n.url);for(let[g,w]of Object.entries(i))l.set(g,w);a&&l.set(te,a),o.executionId&&l.set(Re,o.executionId);let u={method:n.method,headers:l,redirect:"manual",signal:n.signal};n.body&&(u.body=n.body,u.duplex="half");let p;try{p=await fetch(c,u)}catch(g){throw g instanceof Error&&g.name==="AbortError"?g:d.brokerError(0,g instanceof Error?g.message:String(g))}let m=p.headers.get(Ge);return m!==null&&Vt(await hn(p,m)),p}var zi=["get","post","put","patch","delete","head","options"],ro="[stream body omitted]";function oo(e){return typeof ReadableStream<"u"&&e instanceof ReadableStream?ro:e instanceof ArrayBuffer?`[binary body: ${e.byteLength} bytes]`:ArrayBuffer.isView(e)?`[binary body: ${e.byteLength} bytes]`:typeof Blob<"u"&&e instanceof Blob?`[binary body: ${e.size} bytes]`:e}function Wt(e){try{return new URL(e).hostname}catch{return e}}function no(e,t,n,r,o){let s=Wt(t),i="externalApi",a={kind:Ue.CLIENT};return F.startActiveSpan(i,a,async c=>(c.setAttributes({method:e,host:s,"peer.service":r}),q(c,"request",{url:t,method:e,...n!==void 0?{body:oo(n)}:{}}),o(c)))}function Ne(e,t,n){e.setAttribute("status",t),e.setStatus(t==="success"?{code:to.OK}:{code:to.ERROR,message:n}),e.end()}var Gi=16;async function Ji(e,t){let n=e.clone().body;return n?so(n,t):new Uint8Array(0)}async function so(e,t){let n=e.getReader(),r=[],o=0,s=0;try{for(;;){let{done:c,value:l}=await n.read();if(c)break;if(!l||l.byteLength===0){if(s+=1,s>=Gi)break;continue}s=0;let u=t+1-o;if(l.byteLength>=u){r.push(l.slice(0,u)),o+=u;break}r.push(l),o+=l.byteLength}}finally{n.cancel().catch(()=>{}),n.releaseLock()}let i=new Uint8Array(o),a=0;for(let c of r)i.set(c,a),a+=c.byteLength;return i}async function io(e,t,n){if("kyResponse"in n)try{let r=await Ji(n.kyResponse,Te),o=new TextDecoder("utf-8").decode(r,{stream:!0}),s;try{s=JSON.parse(o)}catch{s=o}q(e,"response",s)}catch{q(e,"response",{status:t})}else q(e,"response",oo(n.bodyValue))}async function Wi(e,t){if(t instanceof ReadableStream){let n=e.body??t;try{let[r,o]=n.tee(),s=new Request(e,{body:r,duplex:"half"}),i=await so(o,Te);return{body:new TextDecoder("utf-8").decode(i,{stream:!0}),request:s}}catch{return{body:ro}}}return typeof t=="string"?{body:t}:{}}function wu(){let e=Bi.create({fetch:Vi,retry:{shouldRetry:({error:r})=>r instanceof d?!1:void 0}});function t(r){return(o,s)=>{let i=Jt.active(),a,c=!1,l=(p,m)=>{a&&!c&&(c=!0,Ne(a,p,m))},u=e.extend({hooks:{beforeRequest:[async(p,m)=>{let g=await Wi(p,m.body),w=g.body;if(a||(a=F.startSpan("externalApi",{kind:Ue.CLIENT},i)),a.setAttributes({method:p.method.toUpperCase(),host:Wt(p.url)}),q(a,"request",{url:p.url,method:p.method.toUpperCase(),...w!==void 0?{body:w}:{}}),c=!1,O("hasExternal"),g.request)return g.request}],beforeRetry:[p=>{l("error","retry"),a=void 0,c=!1}],afterResponse:[async(p,m,g)=>{a&&(a.setAttribute("statusCode",g.status),await io(a,g.status,{kyResponse:g}),g.ok?l("success"):s?.throwHttpErrors===!1&&(O("hasError"),l("error",`HTTP ${g.status}`)))}],beforeError:[p=>(O("hasError"),l("error",p.message),p)]}});return a=F.startSpan("externalApi",{kind:Ue.CLIENT},i),a.setAttributes({method:r.toUpperCase(),host:Wt(String(o))}),Jt.with(Ki.setSpan(Jt.active(),a),()=>{let p=r==="options"?u(o,{...s,method:"OPTIONS"}):u[r](o,s);return p.catch(m=>{O("hasError"),l("error",m instanceof Error?m.message:String(m))}),p})}}let n=Object.fromEntries(zi.map(r=>[r,t(r)]));return{...e,...n,authed(r){return Xi(r)}}}function Xi(e){let n=A().authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e];function o(i){return(a,c={})=>{let l=i.toUpperCase();return no(l,a,c.body,e,async u=>{O("hasAuth");let p=F.startSpan("auth",{kind:Ue.INTERNAL});p.setAttribute("alias",e),p.setAttribute("id",r),p.end();try{let m=ne({authenticationId:r,method:l,url:a,body:c.body,headers:c.headers,query:c.query}),g=await we(m,{timeout:c.timeout});return u.setAttribute("statusCode",g.status),await io(u,g.status,{bodyValue:g.body}),Ne(u,"success"),g}catch(m){throw O("hasError"),m instanceof d&&m.detail.kind==="broker_error"&&m.detail.status>0&&u.setAttribute("statusCode",m.detail.status),Ne(u,"error",m instanceof Error?m.message:String(m)),m}})}}function s(i,a={}){let c=a.method??"GET";return no(c,i,void 0,e,async l=>{O("hasAuth");let u=F.startSpan("auth",{kind:Ue.INTERNAL});u.setAttribute("alias",e),u.setAttribute("id",r),u.end();try{let p=await eo({authenticationId:r,url:i,method:c,...a.expiresIn!==void 0?{expiresIn:a.expiresIn}:{},...a.timeout!==void 0?{timeout:a.timeout}:{}});return l.setAttribute("statusCode",200),Ne(l,"success"),p}catch(p){throw O("hasError"),p instanceof d&&p.detail.kind==="broker_error"&&p.detail.status>0&&l.setAttribute("statusCode",p.detail.status),Ne(l,"error",p instanceof Error?p.message:String(p)),p}})}return{get:o("get"),post:o("post"),put:o("put"),patch:o("patch"),delete:o("delete"),head:o("head"),options:o("options"),s3Sign:s}}import{SpanKind as sa,SpanStatusCode as uo}from"@opentelemetry/api";function $e(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Yi=18e4,ao=Yi-1e4,Qi=2e3;async function co(e,t,n){let r=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),s=0;for(;Date.now()-o<ao;){let i=await e(t,"DescribeStatement",{Id:n}),a=i.Status;if(r.has(a))return i;let c=Math.min(Qi,200*2**s),l=c/2+Math.random()*(c/2),u=ao-(Date.now()-o);await new Promise(p=>setTimeout(p,Math.min(l,u))),s++}throw d.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var Zi=new Set(["SELECT","WITH","SHOW"]),ea=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function ta(e){if(!e.clusterIdentifier&&!e.workgroupName)throw d.dbInvalidParameters("either clusterIdentifier or workgroupName is required");if(e.clusterIdentifier&&e.workgroupName)throw d.dbInvalidParameters("clusterIdentifier and workgroupName are mutually exclusive (Provisioned vs Serverless)");if(!e.database)throw d.dbInvalidParameters("database is required");if(e.clusterIdentifier&&!e.dbUser)throw d.dbInvalidParameters("dbUser is required when using clusterIdentifier (Provisioned)");if(!e.region)throw d.dbInvalidParameters("region is required")}function na(e,t){let n=null;if(typeof t=="string")try{n=JSON.parse(t)}catch{}else t!==null&&typeof t=="object"&&(n=t);let r=typeof n?.__type=="string"?n.__type:void 0,o=typeof n?.message=="string"?n.message:void 0;if(r&&o)return d.dbQueryFailed(`${r}: ${o}`);let s=typeof t=="string"?re(t):k(t);return d.dbCallFailed(s)}function ra(e){if(e==null||typeof e!="string")return e;try{return JSON.parse(e)}catch{throw d.dbCallFailed("upstream body not JSON: "+e.slice(0,200))}}function oa(e,t){return typeof t!="number"||t<0?{}:Zi.has(e)?{rowsRead:t}:ea.has(e)?{rowsWritten:t}:{}}function lo(e){async function t(n,r,o){let s=ne({authenticationId:e,method:"POST",url:`https://redshift-data.${n}.amazonaws.com/`,body:o,headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`RedshiftData.${r}`}});try{let{status:i,body:a}=await we(s);if(i>=400)throw na(i,a);return ra(a)}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw d.dbCallFailed(a,i instanceof Error?i:void 0)}}return{system:"redshift",validate:ta,async execute(n,r){let o=$e(r),s={Sql:r,Database:n.database,...n.clusterIdentifier&&{ClusterIdentifier:n.clusterIdentifier,DbUser:n.dbUser},...n.workgroupName&&{WorkgroupName:n.workgroupName},...n.statementName&&{StatementName:n.statementName}},i=await t(n.region,"ExecuteStatement",s),a=i,c=typeof a?.Id=="string"?a.Id:void 0;if(!c){let g=k(i);throw d.dbCallFailed(`ExecuteStatement response missing Id; got: ${g}`)}let l=await co(t,n.region,c),u=l.Status;if(u==="FAILED"){let g=typeof l.Error=="string"?l.Error:"statement failed";throw d.dbQueryFailed(`${g} (statement: ${c})`)}if(u==="ABORTED")throw d.dbQueryFailed(`statement aborted (statement: ${c})`);let p=oa(o,l.ResultRows);return l.HasResultSet===!1?{result:{rowsAffected:l.ResultRows??0},metadata:p}:{result:await t(n.region,"GetStatementResult",{Id:c}),metadata:p}}}}var Xt=64*1024;function ia(e){return e.length>Xt?`${e.slice(0,Xt)}...[truncated]`:e}function aa(e,t,n,r,o){e.setAttributes({system:t.system,statement:o,namespace:n.database,operation:r})}function ca(e,t,n){let r=typeof t=="string"?t:JSON.stringify(t);return r.length>Xt?q(e,"result",{truncated:!0,size:r.length}):q(e,"result",t),n.rowsRead!==void 0&&e.setAttribute("rowsRead",n.rowsRead),n.rowsWritten!==void 0&&e.setAttribute("rowsWritten",n.rowsWritten),r}async function la(e,t,n){let r=$e(n),o=ia(n);return F.startActiveSpan("database",{kind:sa.CLIENT},async s=>{aa(s,e,t,r,o);try{O("hasDb");let{result:i,metadata:a}=await e.execute(t,n),c=ca(s,i,a);return s.setAttribute("status","success"),s.setStatus({code:uo.OK}),c}catch(i){O("hasError");let a=i instanceof Error?i.message:String(i);throw s.setAttribute("status","error"),s.setStatus({code:uo.ERROR,message:a}),i}finally{s.end()}})}function da(e){let n=A().authentications??{};if(!n[e])throw d.unknownAlias(e,Object.keys(n));let r=n[e],o=lo(r);function s(i,a){return o.validate(i),la(o,i,a)}return{parameters(i){return{sql(a){return s(i,a)}}},sql(i){return s({},i)}}}import{createStorage as ga}from"unstorage";var po=1024,Yt=250*1024,ua=new TextEncoder,pa=/(^|\/)\.\.(\/|$)/,fa=/[?#]/,ma=/[\u0000-\u001F\u007F]/;function fo(e){if(e.length===0)throw d.kvKeyInvalid("Key must be a non-empty string");if(pa.test(e))throw d.kvKeyInvalid("Key contains path traversal segment");if(fa.test(e)||ma.test(e))throw d.kvKeyInvalid("Key contains illegal characters");if(e.startsWith("/")||e.endsWith("/")||e.split("/").some(n=>n===""))throw d.kvKeyInvalid("Key must not contain empty path segments");let t=ua.encode(e).length;if(t<1||t>po)throw d.kvKeyInvalid(`Key must be between 1 and ${po} UTF-8 bytes (got ${t})`)}function mo(e){if(!Number.isInteger(e)||e<=0)throw d.kvTtlInvalid(`ttl must be a positive integer number of seconds (got ${e})`)}function go(e){let t;try{t=JSON.stringify(e)}catch{throw d.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw d.kvValueInvalid("Value must be JSON-serializable");let n=Buffer.byteLength(t,"utf8");if(n>Yt)throw d.kvValueTooLarge(`Value exceeds maximum size of ${Yt} bytes (got ${n})`,Yt)}function je(e){fo(e)}function yt(e,t){let n=e[t];if(typeof n!="function")throw new Error(`KV driver is missing ${t}`);return n}function yo(e){let t=yt(e,"getItem"),n=yt(e,"setItem"),r=yt(e,"removeItem"),o=yt(e,"hasItem"),s=e.getKeys;return{...e,getItem(i,a){return je(i),t(i,a)},setItem(i,a,c){return je(i),n(i,a,c)},removeItem(i,a){return je(i),r(i,a)},hasItem(i,a){return je(i),o(i,a)},getKeys(i,a){return i.length>0&&je(i),s(i,a)}}}function ht(e){return ga({driver:yo(e)})}import{defineDriver as ya}from"unstorage";function ha(e){try{return JSON.parse(e)}catch{return e}}var wa=ya(e=>{let{client:t}=e;return{name:"helix-kv",async getItem(n){let r=await t.get(n);return r===null?null:JSON.stringify(r)},async setItem(n,r,o){let s=o?.ttl,i=ha(r);s!==void 0?await t.set(n,i,{ttl:s}):await t.set(n,i)},async removeItem(n){await t.delete(n)},async hasItem(n){return await t.has(n)},async getKeys(){throw new Error("KV key listing is not supported")}}});function ho(e){return wa({client:e})}import va from"ky";import{z as M}from"zod";function wo(e){return j(e).hosts.api}function Sa(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function ba(e){return e.split("/").map(encodeURIComponent).join("/")}function Be(e,t,n){return`${e}${Sa(t)}/${ba(n)}`}var xa=6e4,Qt=M.lazy(()=>M.union([M.string(),M.number(),M.boolean(),M.null(),M.array(Qt),M.record(Qt)])),Aa=M.object({projectId:M.string(),key:M.string(),value:Qt,type:M.enum(["string","number","boolean","null","array","object"]),organizationId:M.string(),scope:M.string(),createdBy:M.string(),createdAt:M.number(),updatedBy:M.string(),updatedAt:M.number()});function Ea(){let e=ue(),t=$(),n=!!(e&&e.trim().length>0),r=!!(t&&t.trim().length>0);if(!n&&!r)throw d.missingExecutionCredentials();let o={Accept:"application/json"};return n&&(o[de]=e),r&&(o[U]=t),o}function Ia(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function wt(e,t){throw d.kvCallFailed(e,Ia(t),k(t))}async function St(e,t,n={}){try{let r=await va(t,{method:e,headers:Ea(),...n.json!==void 0?{json:n.json}:{},throwHttpErrors:!1,timeout:xa}),o=e==="head"?void 0:await K(r);return{status:r.status,body:o}}catch(r){if(r instanceof d)throw r;let o=r instanceof Error?r.message??String(r):String(r);throw d.kvCallFailed(0,o)}}function So(e){let t=wo(e.env),{projectId:n}=e;return{async get(r){let{status:o,body:s}=await St("get",Be(t,n,r));if(o===404)return null;(o<200||o>=300)&&wt(o,s);let i=Aa.safeParse(s);if(!i.success)throw d.kvCallFailed(o,"platform returned malformed KeyValueEntry",k(s));return i.data.value},async set(r,o,s){let{status:i,body:a}=await St("put",Be(t,n,r),{json:s?.ttl!==void 0?{value:o,ttl:s.ttl}:{value:o}});(i<200||i>=300)&&wt(i,a)},async delete(r){let{status:o,body:s}=await St("delete",Be(t,n,r));o!==204&&wt(o,s)},async has(r){let{status:o,body:s}=await St("head",Be(t,n,r));if(o===200)return!0;if(o===404)return!1;wt(o,s)}}}function bt(e){return{getItem:t=>e.getItem(t),removeItem:t=>e.removeItem(t),hasItem:t=>e.hasItem(t),setItem:async(t,n,r)=>{let o=r?.ttl;go(n),typeof o=="number"&&mo(o),await e.setItem(t,n,o!==void 0?{ttl:o}:void 0)}}}function Ra(){let e=A();if(e.kind!=="provisioned")throw d.kvRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function bo(e){let t=Ra(),n=e??So(t),r=ht(ho(n));return bt(r)}import{defineDriver as Ca}from"unstorage";var Ta=Ca(e=>{let t=new Map;function n(r){let o=t.get(r);if(o&&o.expiresAt!==void 0&&o.expiresAt<=Date.now()){t.delete(r);return}return o}return{name:"memory-ttl",getItem(r){return n(r)?.value??null},setItem(r,o,s){let i=s?.ttl,a=n(r),c=typeof i=="number"?Date.now()+i*1e3:i===null?void 0:a?.expiresAt;t.set(r,{value:o,expiresAt:c})},removeItem(r){t.delete(r)},hasItem(r){return n(r)!==void 0},getKeys(){return[...t.keys()].filter(r=>n(r)!==void 0)},clear(){t.clear()}}});function vo(){return Ta({})}var Zt;function ka(){return Zt||(Zt=ht(vo())),Zt}function xo(){return bt(ka())}function Pa(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function xp(){return Pa()?bo():xo()}import{createHash as Da}from"crypto";import{mkdir as Ma,readFile as Co,readdir as To,rm as Eo,unlink as Fa,writeFile as Io}from"fs/promises";import{dirname as La}from"path";async function Oa(e){let t=e.getReader(),n=[],r=0;for(;;){let{done:o,value:s}=await t.read();if(o)break;if(s){if(r+=s.byteLength,r>G)throw await t.cancel(),d.filesValueTooLarge(`File exceeds maximum size of ${G} bytes (got more than ${G})`,G);n.push(s)}}return Buffer.concat(n)}async function be(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?Oa(e):Buffer.from(e)}var _a={pdf:"application/pdf",csv:"text/csv",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",json:"application/json",txt:"text/plain",html:"text/html",htm:"text/html",css:"text/css",js:"application/javascript",xml:"application/xml",zip:"application/zip"},Ao="application/octet-stream";function vt(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return Ao;let n=e.slice(t+1).toLowerCase();return _a[n]??Ao}function xe(){let e=E().projectRoot;if(!e)throw d.filesNotAvailable();return e}async function ve(e){try{return await e()}catch(t){if(t instanceof d)throw t;let n=t?.code;throw n?d.filesCallFailed(0,`Local file storage operation failed: ${n}`):d.filesCallFailed(0,"Local file storage operation failed: unknown error")}}function xt(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function en(e){try{let t=await Co(nt(xe(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Ro(e){await Ma(La(e),{recursive:!0})}async function Na(e,t){let n=rt(e,t),r;try{r=await To(n,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return[];throw o}return r.filter(o=>o.isFile()).map(o=>t.length===0?o.name:`${t}/${o.name}`)}async function ko(e,t){let n=rt(e,t),r;try{r=await To(n,{withFileTypes:!0})}catch(s){if(s.code==="ENOENT")return[];throw s}let o=[];for(let s of r){let i=t.length===0?s.name:`${t}/${s.name}`;s.isDirectory()?o.push(...await ko(e,i)):s.isFile()&&o.push(i)}return o}function Po(){return{async put(e,t,n){return ve(async()=>{let r=xe(),o=await be(t),s=n?.contentType??vt(e),i=Da("sha1").update(o).digest("hex"),a=new Date,c=De(r,e);await Ro(c),await Io(c,o);let l={size:o.byteLength,contentType:s,lastModified:a.toISOString(),etag:i},u=nt(r,e);return await Ro(u),await Io(u,JSON.stringify(l)),xt(e,l)})},async get(e){return ve(async()=>{let t=await en(e);return t?{data:await Co(De(xe(),e)),metadata:xt(e,t)}:null})},async head(e){return ve(async()=>{let t=await en(e);return t?xt(e,t):null})},async delete(e){return ve(async()=>{let t=xe();await Promise.all([De(t,e),nt(t,e)].map(async n=>{try{await Fa(n)}catch(r){if(r.code!=="ENOENT")throw r}}))})},async deleteMany(e){return ve(async()=>{let t=xe(),n=await ko(t,e);return await Promise.all([Eo(rt(t,e),{recursive:!0,force:!0}),Eo(Xn(t,e),{recursive:!0,force:!0})]),{deleted:n.length}})},async list(e,t){return ve(async()=>{let n=xe(),r=t?.limit??100,s=(await Na(n,e??"")).slice(0,r);return{files:(await Promise.all(s.map(async a=>{let c=await en(a);return c?xt(a,c):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let n=E().devServerUrl;if(!n)throw d.filesNotAvailable();return{url:`${n}/_helix/files/${e}`,expiresAt:ge(t?.expiresIn)}},async getDownloadUrl(e,t){let n=E().devServerUrl;if(!n)throw d.filesNotAvailable();return{url:`${n}/_helix/files/${e}`,expiresAt:ge(t?.expiresIn)}}}}import{createHash as qa}from"crypto";function At(e){return j(e).hosts.api}function Ua(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function Ke(e,t){return`${e}${Ua(t)}`}function Ae(e,t,n){return`${Ke(e,t)}/${encodeURIComponent(n)}`}function Et(e,t,n){return`${Ae(e,t,n)}/upload`}function Oo(e,t,n){return`${Ae(e,t,n)}/download`}function _o(e,t,n){return`${Ae(e,t,n)}/signed-url`}function Do(e,t,n,r){let o=new URLSearchParams({name:r});return n&&o.set("parentFolder",n),`${Ke(e,t)}/file?${o.toString()}`}function Mo(e,t,n,r){let o=new URLSearchParams({limit:String(r)});return n&&o.set("id",n),`${Ke(e,t)}?${o.toString()}`}import nn from"ky";import{z as _}from"zod";var rn=6e4,Fo=_.object({id:_.string(),workspaceId:_.string(),projectId:_.string(),parentFolder:_.string().nullable().optional(),name:_.string(),size:_.number().nullable().optional(),objectType:_.enum(["Folder","File"]),contentType:_.string().nullable().optional(),createdAt:_.string(),updatedAt:_.string()}),$a=_.object({signedURL:_.string()}),ja=_.object({path:_.array(_.object({id:_.string(),name:_.string()})),elements:_.array(Fo)});function on(){let e=ue(),t=$(),n=!!(e&&e.trim().length>0),r=!!(t&&t.trim().length>0);if(!n&&!r)throw d.missingExecutionCredentials();let o={Accept:"application/json"};return n&&(o[de]=e),r&&(o[U]=t),o}function Lo(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function Z(e,t){throw d.filesCallFailed(e,Lo(t),k(t))}function Ba(e,t){return e===400&&Lo(t).toLowerCase()==="resource not found"}async function Ka(e){let t=new Response(e),n=t.headers.get("content-type")??"multipart/form-data",r=await t.arrayBuffer();return{body:Buffer.from(r),contentType:n}}async function Ee(e,t,n={}){try{let r=await nn(t,{method:e,headers:on(),...n.json!==void 0?{json:n.json}:{},throwHttpErrors:!1,timeout:rn}),o=await K(r);return{status:r.status,body:o}}catch(r){if(r instanceof d)throw r;let o=r instanceof Error?r.message:String(r);throw d.filesCallFailed(0,o)}}function tn(e,t){let n=Fo.safeParse(t);if(!n.success)throw d.filesCallFailed(e,"platform returned malformed ObjectMetadata",k(t));return n.data}function No(e){let t=At(e.env),{projectId:n}=e;return{async createMetadata(r){let{status:o,body:s}=await Ee("post",Ke(t,n),{json:r});return(o<200||o>=300)&&Z(o,s),tn(o,s)},async getByName(r,o){let{status:s,body:i}=await Ee("get",Do(t,n,r,o));return s===404||Ba(s,i)?null:((s<200||s>=300)&&Z(s,i),tn(s,i))},async getById(r){let{status:o,body:s}=await Ee("get",Ae(t,n,r));return o===404?null:((o<200||o>=300)&&Z(o,s),tn(o,s))},async listChildren(r,o){let{status:s,body:i}=await Ee("get",Mo(t,n,r,o));(s<200||s>=300)&&Z(s,i);let a=ja.safeParse(i);if(!a.success)throw d.filesCallFailed(s,"platform returned malformed listing",k(i));return a.data},async uploadContent(r,o,s,i){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:i}),s);let{body:c,contentType:l}=await Ka(a),u;try{u=await nn(Et(t,n,r),{method:"post",headers:{...on(),"content-type":l},body:new Uint8Array(c),throwHttpErrors:!1,timeout:rn})}catch(m){if(m instanceof d)throw m;let g=m instanceof Error?m.message:String(m);throw d.filesCallFailed(0,g)}let p=await K(u);(u.status<200||u.status>=300)&&Z(u.status,p)},async downloadContent(r){let o;try{o=await nn(Oo(t,n,r),{method:"get",headers:on(),throwHttpErrors:!1,timeout:rn})}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message:String(i);throw d.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let i=await K(o);Z(o.status,i)}let s=await o.arrayBuffer();return Buffer.from(s)},async getSignedDownloadUrl(r){let{status:o,body:s}=await Ee("get",_o(t,n,r));(o<200||o>=300)&&Z(o,s);let i=$a.safeParse(s);if(!i.success)throw d.filesCallFailed(o,"platform returned malformed signed URL response",k(s));return i.data.signedURL},async deleteById(r){let{status:o,body:s}=await Ee("delete",Ae(t,n,r));o===204||o===404||(o<200||o>=300)&&Z(o,s)}}}function sn(e){return e.split("/").filter(t=>t.length>0)}function an(e){return e instanceof d&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ha(e,t,n){let r=await e.getByName(t,n);if(r)return r;try{return await e.createMetadata({parentFolder:t,objectType:"Folder",name:n})}catch(o){if(an(o)){let s=await e.getByName(t,n);if(s)return s}throw o}}async function cn(e,t){let n=sn(t),r=n[n.length-1],o;for(let s of n.slice(0,-1))o=(await Ha(e,o,s)).id;return{parentFolder:o,name:r}}async function He(e,t){let n=sn(t),r=n[n.length-1],o;for(let s of n.slice(0,-1)){let i=await e.getByName(o,s);if(!i||i.objectType!=="Folder")return null;o=i.id}return{parentFolder:o,name:r}}async function ln(e,t){if(t.length===0)return;let n=sn(t),r;for(let o of n){let s=await e.getByName(r,o);if(!s||s.objectType!=="Folder")return null;r=s.id}return r}var Va=500,za=8;async function Ga(e,t,n){let r=new Array(e.length),o=0;async function s(){for(;o<e.length;){let i=o++;r[i]=await n(e[i])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}function Ja(){let e=A();if(e.kind!=="provisioned")throw d.filesRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Wa(e){return qa("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function It(e,t,n){return{path:e,size:t.size??0,contentType:t.contentType??n??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:Wa(t)}}async function Uo(e,t,n,r){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:r,name:n})}catch(o){if(an(o)){let s=await e.getByName(t,n);if(s)return s}throw o}}async function $o(e,t){let{elements:n}=await e.listChildren(t,Va);return(await Ga(n,za,async o=>{let s=o.objectType==="Folder"?await $o(e,o.id):1;return await e.deleteById(o.id),s})).reduce((o,s)=>o+s,0)}function jo(e){let t=Ja(),n=e??No(t),r=At(t.env),{projectId:o}=t;return{async put(s,i,a){let{parentFolder:c,name:l}=await cn(n,s),u=await be(i),p=a?.contentType??vt(s),m=await n.getByName(c,l);if(m&&m.objectType!=="File")throw d.filesCallFailed(409,`A folder already exists at "${s}"`);let g=m??await Uo(n,c,l,p);await n.uploadContent(g.id,u,l,p);let w=await n.getById(g.id);return It(s,w??g,p)},async get(s){let i=await He(n,s);if(!i)return null;let a=await n.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:{data:await n.downloadContent(a.id),metadata:It(s,a)}},async head(s){let i=await He(n,s);if(!i)return null;let a=await n.getByName(i.parentFolder,i.name);return!a||a.objectType!=="File"?null:It(s,a)},async delete(s){let i=await He(n,s);if(!i)return;let a=await n.getByName(i.parentFolder,i.name);a&&await n.deleteById(a.id)},async deleteMany(s){let i=await ln(n,s);if(i===null)return{deleted:0};let a=await $o(n,i);return s.length>0&&i!==void 0&&await n.deleteById(i),{deleted:a}},async list(s,i){let a=await ln(n,s??"");if(a===null)return{files:[],cursor:null};let c=i?.limit??100,{elements:l}=await n.listChildren(a,c);return{files:l.filter(p=>p.objectType==="File").map(p=>It(s?`${s}/${p.name}`:p.name,p)),cursor:null}},async getUploadUrl(s,i){let{parentFolder:a,name:c}=await cn(n,s),u=await n.getByName(a,c)??await Uo(n,a,c,i?.contentType);return{url:Et(r,o,u.id),expiresAt:ge(i?.expiresIn)}},async getDownloadUrl(s,i){let a=await He(n,s),c=a?await n.getByName(a.parentFolder,a.name):null;if(!c||c.objectType!=="File")throw d.filesCallFailed(404,`File not found: ${s}`);return{url:await n.getSignedDownloadUrl(c.id),expiresAt:ge(i?.expiresIn)}}}}function dn(e,t){let n=t?.maxPathBytes;return{async put(r,o,s){ie(r,n);let i=await be(o);return Jn(i.byteLength),e.put(r,i,s)},async get(r){return ie(r,n),e.get(r)},async head(r){return ie(r,n),e.head(r)},async delete(r){return ie(r,n),e.delete(r)},async deleteMany(r){let o=Mt(r);return et(o,n),e.deleteMany(o)},async list(r,o){let s=Mt(r??"");return et(s,n),e.list(s,o)},async getUploadUrl(r,o){return ie(r,n),e.getUploadUrl(r,o)},async getDownloadUrl(r,o){return ie(r,n),e.getDownloadUrl(r,o)}}}function Xa(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function gf(){if(Xa())return dn(jo());let e=E().projectRoot;return dn(Po(),{maxPathBytes:e?Wn(e):void 0})}import Qa from"ky";function Bo(e){return j(e).hosts.api}function Ya(){return"/private/v1/helix/function-calls"}function Ko(e){return`${e}${Ya()}`}var Za=5e3;function ec(){let e=$();if(!!!(e&&e.trim().length>0))throw d.callFunctionMissingExecutionJwt();return{Accept:"application/json",[U]:e}}function tc(e,t){throw d.callFunctionCallFailed(e,nc(t),k(t))}function nc(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function Ho(e){let t=Bo(e.env);return{async callAsync(n,r){let o,s;try{let i=await Qa(Ko(t),{method:"post",headers:ec(),json:{functionPath:n,input:r},throwHttpErrors:!1,timeout:Za});o=i.status,s=await K(i)}catch(i){if(i instanceof d)throw i;let a=i instanceof Error?i.message??String(i):String(i);throw d.callFunctionCallFailed(0,a)}(o<200||o>=300)&&tc(o,s)}}}var qo=1024;function Rt(e){if(typeof e!="string"||e.trim().length===0)throw d.callFunctionPathInvalid("functionPath must be a non-empty string");if(e.length>qo)throw d.callFunctionPathInvalid(`functionPath must be at most ${qo} characters`)}function rc(){let e=A();if(e.kind!=="provisioned")throw d.callFunctionRequiresProvisioning();return{env:e.region}}function Vo(e){return async function(n,r){Rt(n),await(e??Ho(rc())).callAsync(n,r)}}function zo(){return async function(t,n){Rt(t);let r=E().devServerUrl;if(!r)throw d.callFunctionNotAvailable();let o=t.startsWith("/")?t:`/${t}`,s=Zr();fetch(`${r}${o}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n??{})}).then(i=>{i.ok||s.warn("ctx.callFunctionAsync: dev-mode dispatch returned a non-2xx response",{functionPath:t,status:i.status})}).catch(i=>{s.warn("ctx.callFunctionAsync: dev-mode dispatch failed",{functionPath:t,error:i instanceof Error?i.message:String(i)})})}}function oc(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":E().mode==="lambda"}function Bf(){return oc()?Vo():zo()}export{sc as a,ic as b,ac as c,A as d,cc as e,Kn as f,gs as g,O as h,q as i,bs as j,vs as k,F as l,xs as m,Lc as n,Zr as o,Zd as p,wu as q,da as r,xp as s,ie as t,De as u,nt as v,gf as w,Bf as x,qc as y,Ft as z,Zn as A,er as B,tr as C,st as D,nr as E,Zc as F,sr as G,Lt as H,Us as I,Bs as J,Ks as K,el as L,Hs as M,tl as N,Xl as O,ir as P,sl as Q,ar as R,I as S,ul as T,pl as U,Me as V,fl as W,ml as X,ur as Y,Sl as Z,bl as _,X as $,Al as aa,Oi as ba,Ui as ca,Qr as da,Q as ea,Vd as fa,zd as ga};
@@ -0,0 +1 @@
1
+ var b="X-Helix-Project-Execution-Token",R="X-Tray-Token",q={mode:"dev",deploymentId:null},k={...q},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),k={...k,...i}}function ne(){return k}function S(){return p.internalJwt}function P(){return p.helixExecutionJwt}function I(){return p.devToken}var O=new Set(["us1","eu1","ap1","ap2"]),s=new Map,h={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"}},v={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"}},x={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"}},E={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"}};s.set(h.name,h);s.set(v.name,v);s.set(x.name,x);s.set(E.name,E);var T=["api","broker","ingest","weaver","app","projectHost","dashboard"],N=["auth"],D=["storePrefix","appUrl","cookieName","cookieDomain"];function C(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 T)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 N){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 D)if(typeof e.login[r]!="string"||!e.login[r])throw new Error(`RegionProfile.login.${r} must be a non-empty string`)}function j(e,r){return e.name===r.name&&e.exposedName===r.exposedName&&e.displayName===r.displayName&&T.every(t=>e.hosts[t]===r.hosts[t])&&N.every(t=>e.hosts[t]===r.hosts[t])&&D.every(t=>e.login[t]===r.login[t])}function oe(e){C(e);let r=s.get(e.name);if(r){if(j(r,e))return;throw new Error(`RegionProfile.name "${e.name}" is already registered with different values`)}for(let t of s.values())if(t.exposedName===e.exposedName)throw new Error(`RegionProfile.exposedName "${e.exposedName}" is already used by "${t.name}"`);s.set(e.name,e)}function H(e){return s.has(e)}function se(e){return s.get(e)}function m(e){let r=s.get(e);if(!r)throw new Error(`Unknown region: ${e}`);return r}function ae(){return[...s.keys()]}function de(){return[...s.values()].map(e=>e.exposedName)}function F(e){for(let r of s.values())if(r.exposedName===e)return r.name}var f=Symbol.for("@trayai/helix-sdk.forcedEnvironment");function B(e){let r=globalThis;if(e===void 0||e.trim()===""){delete r[f];return}let t=e.trim(),n=F(t);if(n){r[f]=n;return}if(H(t)){r[f]=t;return}throw new Error(`Unknown region: ${t}`)}function le(){return globalThis[f]}function ue(){return[...s.values()].filter(e=>!O.has(e.name))}function ce(){B(void 0),s.clear();for(let e of[h,v,x,E])s.set(e.name,{...e,hosts:{...e.hosts},login:{...e.login}})}var u=class e extends Error{detail;constructor(r){super(L(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 aiProviderMisconfigured(r,t,n){return new e({kind:"ai_provider_misconfigured",alias:r,service:t,message:n})}static aiForeignModelRejected(){return new e({kind:"ai_foreign_model_rejected"})}static agentSessionsFailed(r){return new e({kind:"agent_sessions_failed",message:r})}};function ge(e){return e instanceof u}function L(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(", ")}; bedrock needs the object form with region, openai-compatible the object form with baseUrl).`;case"ai_provider_misconfigured":return`aiProviders entry for authentication alias "${e.alias}" (service "${e.service}") is incomplete: ${e.message}`;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.";case"agent_sessions_failed":return`Agent session store error: ${e.message}`}}import{z as g}from"zod";var A="x-helix-destination-url",U="x-helix-authentication-id",J="x-helix-deployment-id",_="x-execution-id",M="x-helix-broker-error",he="route_not_found",K=new Set([A,U,J,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id",_]);function V(e){let r=e.toLowerCase();return K.has(r)||r.startsWith("x-tray-internal-")}var w=g.object({error:g.object({code:g.string(),message:g.string(),issues:g.array(g.unknown()).optional()})});function ve(e,r){let t=`${m(e).hosts.api}/private/v1/helix/broker/http/raw`;return r==="dev"?`${t}/dev`:t}function xe(e){if(e.mode==="lambda"){let t=S(),n=P(),i=!!(t&&t.trim().length>0),o=!!(n&&n.trim().length>0);if(!i&&!o)throw u.missingExecutionCredentials();let a={};return i&&(a[R]=t),o&&(a[b]=n),{headers:a,deploymentId:e.deploymentId??null}}let r=I();if(!r)throw u.missingTrayToken();return{headers:{Authorization:`Bearer ${r}`},deploymentId:null}}function G(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[l,d]of e.query.entries())r.searchParams.append(l,d);else for(let[l,d]of Object.entries(e.query))for(let $ of Array.isArray(d)?d:[d])r.searchParams.append(l,$);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(([l])=>!V(l)),i=e.body!==void 0&&e.body!==null,o,a,c=!1;return i&&(G(e.body)?(o=e.body,c=typeof ReadableStream<"u"&&e.body instanceof ReadableStream):(o=JSON.stringify(e.body),n.some(([d])=>d.toLowerCase()==="content-type")||(a="application/json"))),{authenticationId:e.authenticationId,method:e.method.toUpperCase(),destinationUrl:r.toString(),headers:n,body:o,isStreamBody:c,defaultContentType:a}}async function X(e,r){let t=await e.text(),n=t,i=t||r;try{n=JSON.parse(t);let o=w.safeParse(n);o.success&&(i=o.data.error.message)}catch{}return{status:e.status,code:r,message:i,body:n}}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[l,d]of r.headers)t.append(l,d);r.defaultContentType&&!t.has("content-type")&&t.set("content-type",r.defaultContentType),t.set(A,r.destinationUrl),t.set(U,r.authenticationId);for(let[l,d]of Object.entries(e.credentialHeaders))t.set(l,d);e.executionId&&t.set(_,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),o=i.headers.get(M);if(o!==null)return{kind:"brokerError",...await X(i,o)};let a=new Uint8Array(await i.arrayBuffer()),c=i.headers.get("content-type")??"";return{kind:"upstream",response:{status:i.status,headers:Z(i.headers),body:Q(a,c)}}}import{z as y}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=`${m(e).hosts.api}/private/v1/helix/broker/s3/sign`;return r==="dev"?`${t}/dev`:t}var re=y.object({url:y.string(),method:y.string(),expiresAt:y.string()});async function De(e){let r=new Headers({"content-type":"application/json"});for(let[a,c]of Object.entries(e.credentialHeaders))r.set(a,c);e.executionId&&r.set(_,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 a=re.safeParse(i);return a.success?{kind:"signed",result:a.data}:{kind:"brokerError",status:t.status,message:"malformed s3-sign response from credential broker",body:i}}let o=w.safeParse(i);return o.success?{kind:"brokerError",status:t.status,code:o.data.error.code,message:o.data.error.message,body:i}:{kind:"brokerError",status:t.status,message:n||`s3-sign request failed with status ${t.status}`,body:i}}export{b as a,R as b,te as c,ne as d,S as e,P as f,oe as g,H as h,se as i,m as j,ae as k,de as l,F as m,B as n,le as o,ue as p,ce as q,u as r,ge as s,A as t,U as u,J as v,_ as w,M as x,he as y,V as z,w as A,ve as B,xe as C,Ee as D,X as E,Y as F,we as G,Te as H,Ne as I,De as J};