@trayai/helix-sdk 1.3.0 → 1.5.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 +15 -0
- package/README.md +3 -3
- package/dist/broker/index.js +1 -1
- package/dist/chunk-3T2WZMJJ.js +1 -0
- package/dist/chunk-7R345MR6.js +7 -0
- package/dist/{config-loader-BqIGpFg8.d.ts → define-agent-CICJokmS.d.ts} +419 -9
- package/dist/index.d.ts +9 -5
- package/dist/index.js +3 -3
- package/dist/internal/index.d.ts +62 -3
- package/dist/internal/index.js +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/{types-B9ZTUx-H.d.ts → types-Ci9SeHOE.d.ts} +169 -8
- package/package.json +1 -1
- package/dist/chunk-CYG3GXE2.js +0 -7
- package/dist/chunk-HEA646WT.js +0 -1
package/dist/internal/index.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import { L as LoadedTrayConfig } from '../
|
|
2
|
-
export {
|
|
1
|
+
import { L as LoadedTrayConfig, b as AgentDefinition } from '../define-agent-CICJokmS.js';
|
|
2
|
+
export { z as SdkConfigInput, B as setSdkConfig } from '../define-agent-CICJokmS.js';
|
|
3
|
+
import { h as AgentSessionsList, b as AgentCallOptions, e as AgentResult } from '../types-Ci9SeHOE.js';
|
|
4
|
+
export { M as SessionExpiredError, N as clearAgentSessions } from '../types-Ci9SeHOE.js';
|
|
3
5
|
import 'zod';
|
|
6
|
+
import 'h3';
|
|
7
|
+
import 'ky';
|
|
8
|
+
import 'ai';
|
|
9
|
+
import '@ai-sdk/provider';
|
|
4
10
|
|
|
5
11
|
/** BroadcastChannel name for parent→worker config updates. */
|
|
6
12
|
declare const CONFIG_BRIDGE_CHANNEL = "tray-config-bridge";
|
|
@@ -44,6 +50,55 @@ interface ScheduleInvocation {
|
|
|
44
50
|
*/
|
|
45
51
|
declare function runScheduledFunction(definition: unknown, invocation: ScheduleInvocation): Promise<void>;
|
|
46
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Host entry points for the agent surface OUTSIDE a defineFunction execution —
|
|
55
|
+
* the CLI's `/_helix/agents` dev route (and, later, the lambda router's agent
|
|
56
|
+
* surface). Each builds a minimal PlatformContext (agents and their tools use
|
|
57
|
+
* `ctx.*` capabilities via getContext()) and runs inside it.
|
|
58
|
+
*
|
|
59
|
+
* @internal — exported via `@trayai/helix-sdk/internal` only.
|
|
60
|
+
*/
|
|
61
|
+
/** Caller identity for user-scoped agents — the dev route forwards
|
|
62
|
+
`x-tray-user-id` here, mirroring `readInvocationContext` in dev. */
|
|
63
|
+
interface StandaloneIdentity {
|
|
64
|
+
userId?: string | null;
|
|
65
|
+
}
|
|
66
|
+
/** Invoke an agent outside a defineFunction execution. */
|
|
67
|
+
declare function runAgentStandalone(name: string, options: AgentCallOptions, identity?: StandaloneIdentity): Promise<AgentResult>;
|
|
68
|
+
/** The recent-sessions listing outside a defineFunction execution (the dev
|
|
69
|
+
route's `GET /_helix/agents/<name>/sessions`). */
|
|
70
|
+
declare function listAgentSessionsStandalone(name: string, params: {
|
|
71
|
+
userId?: string | null;
|
|
72
|
+
first?: number;
|
|
73
|
+
cursor?: string;
|
|
74
|
+
}): Promise<AgentSessionsList>;
|
|
75
|
+
|
|
76
|
+
/** Host loader hook: record where the agent's file lives (for instructionsFile). */
|
|
77
|
+
declare function setAgentBaseDir(name: string, baseDir: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Host loader hook: inject instructions resolved OUTSIDE this process — the
|
|
80
|
+
* lambda bundler extracts `instructionsFile` contents at build time (the
|
|
81
|
+
* deployed bundle ships no source tree to read from) and the generated shim
|
|
82
|
+
* installs them here after importing the agent modules. Takes precedence over
|
|
83
|
+
* any filesystem resolution; a no-op for unknown names so the shim can call
|
|
84
|
+
* it unconditionally.
|
|
85
|
+
*/
|
|
86
|
+
declare function setAgentInstructions(name: string, instructions: string): void;
|
|
87
|
+
declare function getAgentDefinition(name: string): AgentDefinition;
|
|
88
|
+
declare function listAgents(): AgentDefinition[];
|
|
89
|
+
/** Test seam. */
|
|
90
|
+
declare function clearAgentRegistry(): void;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Caller-fault agent errors — a typed contract for hosts (the dev route, the
|
|
94
|
+
* future lambda agent surface) to classify failures without string-matching
|
|
95
|
+
* messages: `AgentCallerError` / `SessionExpiredError` (see sessions.ts) mean
|
|
96
|
+
* "your request", everything else means "the runtime".
|
|
97
|
+
*/
|
|
98
|
+
declare class AgentCallerError extends Error {
|
|
99
|
+
constructor(message: string);
|
|
100
|
+
}
|
|
101
|
+
|
|
47
102
|
declare function assertValidPath(path: string, maxPathBytes?: number): void;
|
|
48
103
|
|
|
49
104
|
type SdkErrorDetail = {
|
|
@@ -158,6 +213,9 @@ type SdkErrorDetail = {
|
|
|
158
213
|
supported: string[];
|
|
159
214
|
} | {
|
|
160
215
|
readonly kind: "ai_foreign_model_rejected";
|
|
216
|
+
} | {
|
|
217
|
+
readonly kind: "agent_sessions_failed";
|
|
218
|
+
message: string;
|
|
161
219
|
};
|
|
162
220
|
declare class SdkError extends Error {
|
|
163
221
|
readonly detail: SdkErrorDetail;
|
|
@@ -198,6 +256,7 @@ declare class SdkError extends Error {
|
|
|
198
256
|
static aiModelInstanceRequired(modelId: string): SdkError;
|
|
199
257
|
static aiProviderNotConfigured(alias: string, supported: string[]): SdkError;
|
|
200
258
|
static aiForeignModelRejected(): SdkError;
|
|
259
|
+
static agentSessionsFailed(message: string): SdkError;
|
|
201
260
|
}
|
|
202
261
|
declare function isSdkError(err: unknown): err is SdkError;
|
|
203
262
|
|
|
@@ -249,4 +308,4 @@ declare function getAdditionalRegionProfiles(): RegionProfile[];
|
|
|
249
308
|
/** Test helper: drop non-builtin profiles and restore the built-in regions. */
|
|
250
309
|
declare function resetRegionRegistryForTests(): void;
|
|
251
310
|
|
|
252
|
-
export { CONFIG_BRIDGE_CHANNEL, DEV_TOKEN_BRIDGE_CHANNEL, type RegionProfile, type ScheduleInvocation, ScheduleInvocationError, assertValidPath, clearActiveConfig, contentFilePath, getActiveConfig, getAdditionalRegionProfiles, getRegionProfile, isKnownRegion, isSdkError, listExposedRegionNames, listRegionNames, metaFilePath, parseExposedRegionName, registerRegionProfile, requireRegionProfile, resetRegionRegistryForTests, resolveForcedRegion, runScheduledFunction, setActiveConfig, setForcedRegion };
|
|
311
|
+
export { AgentCallerError, CONFIG_BRIDGE_CHANNEL, DEV_TOKEN_BRIDGE_CHANNEL, type RegionProfile, type ScheduleInvocation, ScheduleInvocationError, SdkError, assertValidPath, clearActiveConfig, clearAgentRegistry, contentFilePath, getActiveConfig, getAdditionalRegionProfiles, getAgentDefinition, getRegionProfile, isKnownRegion, isSdkError, listAgentSessionsStandalone, listAgents, listExposedRegionNames, listRegionNames, metaFilePath, parseExposedRegionName, registerRegionProfile, requireRegionProfile, resetRegionRegistryForTests, resolveForcedRegion, runAgentStandalone, runScheduledFunction, setActiveConfig, setAgentBaseDir, setAgentInstructions, setForcedRegion };
|
package/dist/internal/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{$ as At,O as E,S as ft,T as dt,U as mt,V as gt,W as pt,X as ht,a as J,aa as St,b as V,c as q,ca as l,d as R,e as z,f as g,g as P,ga as v,h as F,i as N,j as p,k as O,l as k,m as j,o as A,p as M,q as S,r as x,s as y,t as lt,u as ct,v as ut,w as I,x as C}from"../chunk-7R345MR6.js";import{a as h}from"../chunk-WUCX7RZO.js";import{c as G,d as D,g as Q,h as W,i as X,j as Y,k as Z,l as tt,m as et,n as rt,o as ot,p as nt,q as it,r as st,s as at}from"../chunk-3T2WZMJJ.js";import{randomUUID as xt}from"crypto";import{SpanStatusCode as H,SpanKind as yt}from"@opentelemetry/api";var i=class extends Error{constructor(t){super(`runScheduledFunction: ${t}`),this.name="ScheduleInvocationError"}};async function It(e,t){if(typeof t!="object"||t===null)throw new i("`invocation` must be an object");let{schedulePath:r}=t;if(typeof r!="string"||r.length===0)throw new i("`schedulePath` must be a non-empty string");if(typeof t.isManual!="boolean")throw new i("`isManual` must be a boolean");if(!v(e))throw new i(`default export of "${r}" is not a defineSchedule definition`);let c=L("scheduledAt",t.scheduledAt),b=L("firedAt",t.firedAt),a=D(),u=a.executionId??xt(),f=a.deploymentId??null,K=Date.now(),$=new Date().toISOString(),U=M(),_=A();p();let s={hasDb:!1,hasExternal:!1,hasAuth:!1,hasAi:!1,hasError:!1},d=!1,m=null;try{await P.run(s,()=>g.run(u,()=>k.startActiveSpan("schedule",{root:!0,kind:yt.SERVER,attributes:{method:"SCHEDULE",route:r,executionId:u,...f?{deploymentId:f}:{}}},async n=>{let B={type:"schedule",scheduledAt:c,firedAt:b,isManual:t.isManual},w={http:S(),db:o=>x(o),kv:()=>y(),files:()=>I(),callFunctionAsync:C(),ai:E(),agent:o=>l(o),log:_,config:U,state:{},executionId:u,deploymentId:f,traceId:n.spanContext().traceId,parentExecutionId:null,trigger:B};N(n,"input",{scheduledAt:t.scheduledAt,firedAt:t.firedAt,isManual:t.isManual});try{await h.run(w,()=>e.handler(w))}catch(o){throw d=!0,m=o instanceof Error?o.message:String(o),F("hasError"),o}finally{n.setAttribute("hasAuth",s.hasAuth),n.setAttribute("hasAi",s.hasAi),n.setAttribute("hasExternal",s.hasExternal),n.setAttribute("hasDb",s.hasDb),n.setAttribute("status",d?"error":"success");let o=d||s.hasError;n.setStatus({code:o?H.ERROR:H.OK,...m?{message:m}:{}}),n.end()}})))}finally{j({executionId:u,deploymentId:f,triggerType:"schedule",routeOrJob:r,startedAt:$,startMs:K,errored:d,errorMessage:m,userId:null,flags:s}),await O()}}function L(e,t){if(typeof t!="string"||t.length===0)throw new i(`\`${e}\` must be a timestamp string; got ${JSON.stringify(t)}`);let r=new Date(t);if(Number.isNaN(r.getTime()))throw new i(`\`${e}\` must be a Date-parseable timestamp; got ${JSON.stringify(t)}`);return r}function T(e,t){p();let r=R(),c=crypto.randomUUID(),b={http:S(),db:a=>x(a),kv:()=>y(),files:()=>I(),callFunctionAsync:C(),ai:E(),agent:a=>l(a),log:A(),config:r.config??{},state:{},executionId:c,deploymentId:null,traceId:"",parentExecutionId:null,userId:e.userId??null};return g.run(c,()=>h.run(b,t))}async function Ct(e,t,r={}){return T(r,()=>l(e).generate(t))}async function Et(e,t){return T({userId:t.userId},()=>l(e).sessions({...t.first!==void 0?{first:t.first}:{},...t.cursor!==void 0?{cursor:t.cursor}:{}}))}export{ft as AgentCallerError,J as CONFIG_BRIDGE_CHANNEL,V as DEV_TOKEN_BRIDGE_CHANNEL,i as ScheduleInvocationError,st as SdkError,At as SessionExpiredError,lt as assertValidPath,z as clearActiveConfig,ht as clearAgentRegistry,St as clearAgentSessions,ct as contentFilePath,R as getActiveConfig,nt as getAdditionalRegionProfiles,gt as getAgentDefinition,X as getRegionProfile,W as isKnownRegion,at as isSdkError,Et as listAgentSessionsStandalone,pt as listAgents,tt as listExposedRegionNames,Z as listRegionNames,ut as metaFilePath,et as parseExposedRegionName,Q as registerRegionProfile,Y as requireRegionProfile,it as resetRegionRegistryForTests,ot as resolveForcedRegion,Ct as runAgentStandalone,It as runScheduledFunction,q as setActiveConfig,dt as setAgentBaseDir,mt as setAgentInstructions,rt as setForcedRegion,G as setSdkConfig};
|
package/dist/testing/index.d.ts
CHANGED
package/dist/testing/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as n}from"../chunk-WUCX7RZO.js";var f={http:!0,db:!0,kv:!0,files:!0,callFunctionAsync:!0,ai:!0,log:!0,config:!0,state:!0,executionId:!0,deploymentId:!0,traceId:!0,parentExecutionId:!0},d={input:!0,method:!0,path:!0,headers:!0,status:!0,error:!0,request:!0,userId:!0,identity:!0,trigger:!0};async function l(o,u){let i=new Proxy(o,{get(e,t,r){if(typeof t=="symbol"||t==="then"||t==="toJSON"||t in e)return Reflect.get(e,t,r);if(!(t in d))throw t in f?new Error(`Accessed unset context field "${String(t)}" in test. Provide it via runWithContext({ ${String(t)}: ... }, fn).`):new Error(`Accessed unknown context field "${String(t)}" in test \u2014 not a PlatformContext member.`)}});return n.run(i,u)}export{l as runWithContext};
|
|
1
|
+
import{a as n}from"../chunk-WUCX7RZO.js";var f={http:!0,db:!0,kv:!0,files:!0,callFunctionAsync:!0,ai:!0,agent:!0,log:!0,config:!0,state:!0,executionId:!0,deploymentId:!0,traceId:!0,parentExecutionId:!0},d={input:!0,method:!0,path:!0,headers:!0,status:!0,error:!0,request:!0,userId:!0,identity:!0,trigger:!0};async function l(o,u){let i=new Proxy(o,{get(e,t,r){if(typeof t=="symbol"||t==="then"||t==="toJSON"||t in e)return Reflect.get(e,t,r);if(!(t in d))throw t in f?new Error(`Accessed unset context field "${String(t)}" in test. Provide it via runWithContext({ ${String(t)}: ... }, fn).`):new Error(`Accessed unknown context field "${String(t)}" in test \u2014 not a PlatformContext member.`)}});return n.run(i,u)}export{l as runWithContext};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { H3Event } from 'h3';
|
|
2
2
|
import { KyInstance } from 'ky';
|
|
3
3
|
import { ZodType } from 'zod';
|
|
4
|
-
import {
|
|
4
|
+
import { generateText, streamText, generateObject, streamObject, embed, embedMany, generateImage, transcribe, generateSpeech, LanguageModel, EmbeddingModel, ImageModel, TranscriptionModel, SpeechModel, ModelMessage, StopCondition, ToolSet, PrepareStepFunction, ToolChoice } from 'ai';
|
|
5
5
|
import { LanguageModelV4, EmbeddingModelV4, ImageModelV4, TranscriptionModelV4, SpeechModelV4 } from '@ai-sdk/provider';
|
|
6
6
|
|
|
7
7
|
/** Connection + call params supplied by the caller at `.parameters()` time. */
|
|
@@ -176,8 +176,8 @@ type EmbedManyOptions = Parameters<typeof embedMany>[0];
|
|
|
176
176
|
type GenerateImageOptions = Parameters<typeof generateImage>[0];
|
|
177
177
|
type TranscribeOptions = Parameters<typeof transcribe>[0];
|
|
178
178
|
type GenerateSpeechOptions = Parameters<typeof generateSpeech>[0];
|
|
179
|
-
type GenerateTextReturn = Awaited<ReturnType<typeof generateText>>;
|
|
180
|
-
type StreamTextReturn = ReturnType<typeof streamText>;
|
|
179
|
+
type GenerateTextReturn$1 = Awaited<ReturnType<typeof generateText>>;
|
|
180
|
+
type StreamTextReturn$1 = ReturnType<typeof streamText>;
|
|
181
181
|
type GenerateObjectReturn = Awaited<ReturnType<typeof generateObject>>;
|
|
182
182
|
type StreamObjectReturn = ReturnType<typeof streamObject>;
|
|
183
183
|
type EmbedReturn = Awaited<ReturnType<typeof embed>>;
|
|
@@ -199,8 +199,8 @@ interface HelixAIProvider {
|
|
|
199
199
|
imageModel(modelId: string): ImageModelV4;
|
|
200
200
|
transcriptionModel(modelId: string): TranscriptionModelV4;
|
|
201
201
|
speechModel(modelId: string): SpeechModelV4;
|
|
202
|
-
generateText(options: WithStringModel<GenerateTextOptions>): Promise<GenerateTextReturn & HelixResultMeta>;
|
|
203
|
-
streamText(options: WithStringModel<StreamTextOptions>): StreamTextReturn;
|
|
202
|
+
generateText(options: WithStringModel<GenerateTextOptions>): Promise<GenerateTextReturn$1 & HelixResultMeta>;
|
|
203
|
+
streamText(options: WithStringModel<StreamTextOptions>): StreamTextReturn$1;
|
|
204
204
|
generateObject(options: WithStringModel<GenerateObjectOptions>): Promise<GenerateObjectReturn & HelixResultMeta>;
|
|
205
205
|
streamObject(options: WithStringModel<StreamObjectOptions>): StreamObjectReturn;
|
|
206
206
|
embed(options: WithStringModel<EmbedOptions>): Promise<EmbedReturn>;
|
|
@@ -216,8 +216,8 @@ interface HelixAIProvider {
|
|
|
216
216
|
*/
|
|
217
217
|
interface HelixAI {
|
|
218
218
|
(alias: string): HelixAIProvider;
|
|
219
|
-
generateText(options: WithModelInstance<GenerateTextOptions, AiLanguageModelInstance>): Promise<GenerateTextReturn & HelixResultMeta>;
|
|
220
|
-
streamText(options: WithModelInstance<StreamTextOptions, AiLanguageModelInstance>): StreamTextReturn;
|
|
219
|
+
generateText(options: WithModelInstance<GenerateTextOptions, AiLanguageModelInstance>): Promise<GenerateTextReturn$1 & HelixResultMeta>;
|
|
220
|
+
streamText(options: WithModelInstance<StreamTextOptions, AiLanguageModelInstance>): StreamTextReturn$1;
|
|
221
221
|
generateObject(options: WithModelInstance<GenerateObjectOptions, AiLanguageModelInstance>): Promise<GenerateObjectReturn & HelixResultMeta>;
|
|
222
222
|
streamObject(options: WithModelInstance<StreamObjectOptions, AiLanguageModelInstance>): StreamObjectReturn;
|
|
223
223
|
embed(options: WithModelInstance<EmbedOptions, AiEmbeddingModelInstance>): Promise<EmbedReturn>;
|
|
@@ -227,6 +227,161 @@ interface HelixAI {
|
|
|
227
227
|
generateSpeech(options: WithModelInstance<GenerateSpeechOptions, AiSpeechModelInstance>): Promise<GenerateSpeechReturn>;
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Agent session store (helix-spec 14 → Sessions & Memory).
|
|
232
|
+
*
|
|
233
|
+
* v1 backend: **in-memory**, emulating the managed session-store service
|
|
234
|
+
* contract (ordered append, ranged read, trim with approval pinning, TTL,
|
|
235
|
+
* pending-approval index). This is the spec'd `helix dev` behaviour (sessions
|
|
236
|
+
* reset on server restart); the managed service and DynamoDB backends slot in
|
|
237
|
+
* behind the same interface when the platform ships them — see
|
|
238
|
+
* README_INTERNAL.md § Agent harness.
|
|
239
|
+
*
|
|
240
|
+
* Loop state IS the session: tool-approval requests/responses are ordinary
|
|
241
|
+
* ModelMessage content parts, so a paused agent needs no storage beyond its
|
|
242
|
+
* message log plus the denormalized pending-approval index in meta.
|
|
243
|
+
*/
|
|
244
|
+
interface PendingApproval {
|
|
245
|
+
approvalId: string;
|
|
246
|
+
toolName: string;
|
|
247
|
+
toolCallId: string;
|
|
248
|
+
input: unknown;
|
|
249
|
+
requestedAt: string;
|
|
250
|
+
}
|
|
251
|
+
interface AgentSession {
|
|
252
|
+
readonly id: string;
|
|
253
|
+
/**
|
|
254
|
+
* Note: `maxSessionMessages` is a SOFT cap while approvals are pending —
|
|
255
|
+
* trimming never drops a message carrying an unresolved approval request,
|
|
256
|
+
* so a session can exceed the cap until those approvals resolve or expire.
|
|
257
|
+
*/
|
|
258
|
+
messages(opts?: {
|
|
259
|
+
limit?: number;
|
|
260
|
+
}): Promise<ModelMessage[]>;
|
|
261
|
+
append(...messages: ModelMessage[]): Promise<void>;
|
|
262
|
+
clear(): Promise<void>;
|
|
263
|
+
/** Whether the oldest messages have been trimmed away (partial history). */
|
|
264
|
+
truncated(): Promise<boolean>;
|
|
265
|
+
pendingApprovals(): Promise<PendingApproval[]>;
|
|
266
|
+
addPendingApprovals(approvals: PendingApproval[]): Promise<void>;
|
|
267
|
+
/**
|
|
268
|
+
* Resolve a pending approval. Returns "resolved" when this call removed it,
|
|
269
|
+
* "already-resolved" when no such id is pending (idempotent double-approve).
|
|
270
|
+
*/
|
|
271
|
+
resolveApproval(approvalId: string): Promise<"resolved" | "already-resolved">;
|
|
272
|
+
}
|
|
273
|
+
/** One row of the recent-sessions listing (`agent.sessions()`). */
|
|
274
|
+
interface AgentSessionSummary {
|
|
275
|
+
id: string;
|
|
276
|
+
createdAt: number;
|
|
277
|
+
lastActivityAt: number;
|
|
278
|
+
messageCount: number;
|
|
279
|
+
pendingApprovals: number;
|
|
280
|
+
}
|
|
281
|
+
interface AgentSessionsList {
|
|
282
|
+
sessions: AgentSessionSummary[];
|
|
283
|
+
nextCursor: string | null;
|
|
284
|
+
}
|
|
285
|
+
declare class SessionExpiredError extends Error {
|
|
286
|
+
constructor(sessionId: string);
|
|
287
|
+
}
|
|
288
|
+
/** Test seam. */
|
|
289
|
+
declare function clearAgentSessions(): void;
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Public `ctx.agent` types (helix-spec 14).
|
|
293
|
+
*/
|
|
294
|
+
interface AgentApprovalDecision {
|
|
295
|
+
/** `approvalId` from a pending approval request. */
|
|
296
|
+
id: string;
|
|
297
|
+
approved: boolean;
|
|
298
|
+
reason?: string;
|
|
299
|
+
}
|
|
300
|
+
interface AgentPendingApproval {
|
|
301
|
+
/** Echo back as `approvals[].id` on a later generate() to resume. */
|
|
302
|
+
id: string;
|
|
303
|
+
toolName: string;
|
|
304
|
+
toolCallId: string;
|
|
305
|
+
/** Validated input the tool would run with. */
|
|
306
|
+
input: unknown;
|
|
307
|
+
}
|
|
308
|
+
interface AgentCallOptions {
|
|
309
|
+
/** Single-turn input… */
|
|
310
|
+
prompt?: string;
|
|
311
|
+
/** …or explicit messages for this turn. */
|
|
312
|
+
messages?: ModelMessage[];
|
|
313
|
+
/** Continue an existing session; omit to create one. */
|
|
314
|
+
sessionId?: string;
|
|
315
|
+
/** Resolve pending tool-approval requests before the loop re-enters. May be
|
|
316
|
+
sent alone or alongside new input. */
|
|
317
|
+
approvals?: AgentApprovalDecision[];
|
|
318
|
+
/** Overrides limits.maxIterations / maxToolCalls for this call. */
|
|
319
|
+
stopWhen?: StopCondition<ToolSet> | Array<StopCondition<ToolSet>>;
|
|
320
|
+
prepareStep?: PrepareStepFunction<ToolSet>;
|
|
321
|
+
/** Narrow the agent's tools for this call. */
|
|
322
|
+
activeTools?: string[];
|
|
323
|
+
toolChoice?: ToolChoice<ToolSet>;
|
|
324
|
+
providerOptions?: Record<string, unknown>;
|
|
325
|
+
}
|
|
326
|
+
type GenerateTextReturn = Awaited<ReturnType<typeof generateText>>;
|
|
327
|
+
type StreamTextReturn = ReturnType<typeof streamText>;
|
|
328
|
+
interface AgentResult extends GenerateTextReturn {
|
|
329
|
+
/** Session used (created if none was passed). */
|
|
330
|
+
sessionId: string;
|
|
331
|
+
/** 'completed' — final answer in `text`; 'awaiting-approval' — the loop
|
|
332
|
+
paused on needsApproval tool call(s); resume with `approvals`. */
|
|
333
|
+
status: "completed" | "awaiting-approval";
|
|
334
|
+
pendingApprovals?: AgentPendingApproval[];
|
|
335
|
+
helix: {
|
|
336
|
+
cost: HelixCost;
|
|
337
|
+
/** Model that produced the final answer (may be a fallback). */
|
|
338
|
+
model: string;
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* If a `needsApproval` tool fires mid-stream, the stream finishes and the
|
|
343
|
+
* pause is recorded in the session (not on this result — the stream return
|
|
344
|
+
* shape is the AI SDK's). After consumption, check
|
|
345
|
+
* `agent.session(sessionId).pendingApprovals()` and resume with `generate()`.
|
|
346
|
+
*/
|
|
347
|
+
type AgentStreamResult = StreamTextReturn & {
|
|
348
|
+
sessionId: string;
|
|
349
|
+
};
|
|
350
|
+
/**
|
|
351
|
+
* What `ctx.agent(name)` returns.
|
|
352
|
+
*
|
|
353
|
+
* @beta Agents and tools are in beta and may change in a future release.
|
|
354
|
+
*/
|
|
355
|
+
interface HelixAgent {
|
|
356
|
+
/** The AI SDK loop + session handling. */
|
|
357
|
+
generate(options: AgentCallOptions): Promise<AgentResult>;
|
|
358
|
+
/** Resolves once prior session history is loaded (the store may be remote);
|
|
359
|
+
the resolved value is the live AI SDK stream result. */
|
|
360
|
+
stream(options: AgentCallOptions): Promise<AgentStreamResult>;
|
|
361
|
+
/** Bring your own loop — real AI SDK values, usable with ctx.ai.* directly. */
|
|
362
|
+
readonly model: LanguageModelV4;
|
|
363
|
+
readonly tools: ToolSet;
|
|
364
|
+
readonly instructions: string;
|
|
365
|
+
/** Session message history (in-memory store in v1). */
|
|
366
|
+
session(sessionId?: string): AgentSession;
|
|
367
|
+
/**
|
|
368
|
+
* The calling user's recent sessions with this agent, newest activity
|
|
369
|
+
* first (cursor-paginated). Requires the agent to declare
|
|
370
|
+
* `memory.scope: "user"` and a user execution (`ctx.userId`) — the listing
|
|
371
|
+
* is always the caller's own; there is no way to list another user's.
|
|
372
|
+
*/
|
|
373
|
+
sessions(params?: {
|
|
374
|
+
first?: number;
|
|
375
|
+
cursor?: string;
|
|
376
|
+
}): Promise<AgentSessionsList>;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* `ctx.agent` — look up a registered agent by name.
|
|
380
|
+
*
|
|
381
|
+
* @beta Agents and tools are in beta and may change in a future release.
|
|
382
|
+
*/
|
|
383
|
+
type AgentClient = (name: string) => HelixAgent;
|
|
384
|
+
|
|
230
385
|
interface Logger {
|
|
231
386
|
info(message: string, data?: Record<string, unknown>): void;
|
|
232
387
|
warn(message: string, data?: Record<string, unknown>): void;
|
|
@@ -315,6 +470,12 @@ interface ContextCore {
|
|
|
315
470
|
/** AI client (helix-spec 11): `ctx.ai(alias)` for broker-routed providers,
|
|
316
471
|
`ctx.ai.generateText({ model })` etc. for model-instance calls. */
|
|
317
472
|
ai: HelixAI;
|
|
473
|
+
/**
|
|
474
|
+
* Agent client (helix-spec 14): `ctx.agent(name).generate()/.stream()`.
|
|
475
|
+
*
|
|
476
|
+
* @beta Agents and tools are in beta and may change in a future release.
|
|
477
|
+
*/
|
|
478
|
+
agent: AgentClient;
|
|
318
479
|
log: Logger;
|
|
319
480
|
config: Record<string, unknown>;
|
|
320
481
|
state: Record<string, unknown>;
|
|
@@ -433,4 +594,4 @@ interface ScheduleDefinition {
|
|
|
433
594
|
handler: ScheduleHandler;
|
|
434
595
|
}
|
|
435
596
|
|
|
436
|
-
export type
|
|
597
|
+
export { type AgentApprovalDecision as A, type BrokerAuthedClient as B, type CallFunctionAsync as C, type DefineFunctionOptions as D, type ScheduleContext as E, type FunctionHandler as F, type ScheduleHandler as G, type HelixAI as H, type ScheduleTrigger as I, type SqlBuilder as J, type KeyValueStore as K, type Logger as L, SessionExpiredError as M, clearAgentSessions as N, type PlatformContext as P, type ScheduleDefinition as S, type TrayContext as T, type UnvalidatedInput as U, type DefineScheduleConfig as a, type AgentCallOptions as b, type AgentClient as c, type AgentPendingApproval as d, type AgentResult as e, type AgentSession as f, type AgentSessionSummary as g, type AgentSessionsList as h, type AgentStreamResult as i, type AiEmbeddingModelInstance as j, type AiImageModelInstance as k, type AiLanguageModelInstance as l, type AiSpeechModelInstance as m, type AiTranscriptionModelInstance as n, type BrokerCallOptions as o, type BrokerCallResult as p, type DbCallParameters as q, type DbClient as r, type FileSystemClient as s, type HelixAIProvider as t, type HelixAgent as u, type HelixCost as v, type HelixResultMeta as w, type HttpClient as x, type S3SignOptions as y, type S3SignResult as z };
|
package/package.json
CHANGED
package/dist/chunk-CYG3GXE2.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{A as Pt,B as xe,C as H,D as te,F as At,G as Tt,H as kt,I as Ot,a as O,b as be,d as b,e as we,f as F,h as wt,j as _,k as St,o as xt,r as c,t as vt,u as Et,v as Se,w as Rt,x as It,y as K,z as Ct}from"./chunk-HEA646WT.js";var Zi="tray-config-bridge",es="tray-dev-token-bridge",ve=null;function ts(e){ve=e}function w(){if(!ve)throw new Error("Active tray config not seeded. Worker boot must call setActiveConfig() before handlers run.");return ve}function rs(){ve=null}import{AsyncLocalStorage as Xt}from"async_hooks";import{trace as Bn,SpanKind as $n,SpanStatusCode as Ge}from"@opentelemetry/api";import{ExportResultCode as Kn,W3CTraceContextPropagator as Hn}from"@opentelemetry/core";import{NodeTracerProvider as Vn,SimpleSpanProcessor as qn,BatchSpanProcessor as zn}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Pn}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as An}from"@opentelemetry/exporter-logs-otlp-proto";function Je(e){return _(e).hosts.ingest}function Tn(){return F()??""}function Ft(){return{[O]:Tn()}}function _t(){let e=Je(w().region);return new Pn({url:`${e}/v1/traces`,headers:()=>Promise.resolve(Ft())})}function Dt(){let e=Je(w().region);return new An({url:`${e}/v1/logs`,headers:()=>Promise.resolve(Ft())})}import{logs as Mt,SeverityNumber as Ee}from"@opentelemetry/api-logs";import{LoggerProvider as Fn,BatchLogRecordProcessor as _n}from"@opentelemetry/sdk-logs";function re(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function kn(e){return new TextEncoder().encode(e).length}var Lt="\u2026[truncated]",On=kn(Lt),ne=4096;function j(e,t=ne){let r=new TextEncoder().encode(e);if(r.length<=t)return e;let n=r.subarray(0,t-On);return new TextDecoder("utf-8").decode(n).replace(/�$/,"")+Lt}function S(e,t=ne){return j(re(e),t)}var Dn="@trayai/helix-sdk",oe,Ut={debug:{number:Ee.DEBUG,text:"DEBUG"},info:{number:Ee.INFO,text:"INFO"},warn:{number:Ee.WARN,text:"WARN"},error:{number:Ee.ERROR,text:"ERROR"}};function Ln(){return b().mode==="lambda"?[new _n({exporter:Dt()})]:[]}function Nt(){if(oe!==void 0)return;let e=Ln();e.length!==0&&(oe=new Fn({processors:e}),Mt.setGlobalLoggerProvider(oe))}function Un(e,t,r){let n=Ut[e]??Ut.info;return{severityNumber:n.number,severityText:n.text,body:t,...r?{attributes:{"tray.log.meta":S(r)}}:{}}}function jt(e,t,r){Mt.getLogger(Dn).emit(Un(e,t,r))}async function Bt(e=2e3){if(oe===void 0)return;let t;try{await Promise.race([oe.forceFlush(),new Promise(r=>{t=setTimeout(r,e)})])}catch(r){process.stderr.write(`[helix-sdk] otel log flush failed: ${r instanceof Error?r.message:String(r)}
|
|
2
|
-
`)}finally{t!==void 0&&clearTimeout(t)}}function Ye(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function Mn(){if(process.env.NO_COLOR!==void 0)return!1;let e=process.env.FORCE_COLOR;return e!==void 0&&e!=="0"&&e!=="false"?!0:!!process.stdout.isTTY&&process.env.TERM!=="dumb"}function A(e,t){return Mn()?`\x1B[${e}m${t}\x1B[0m`:t}var Nn=5,jn={FN:"1;35",INFO:"34",AUTH:"35",API:"36",WARN:"33",ERROR:"31",DEBUG:"90"},$t="32",Kt="31",Re="2",Ht="1";function Ie(e){return A(jn[e]??"0",e.padEnd(Nn))}function Vt(e,t){return`${Ie("FN")} ${A(Ht,`${e} ${t}`.trim())}`}function qt(e,t,r,n){let o=e.toUpperCase(),s=`${n?`${A(Re,n)} `:""}${Ie(o)} ${t}`;return r&&Object.keys(r).length>0&&(s+=` ${A(Re,re(r))}`),s}function zt(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Jt(e){return`${Ie("AUTH")} ${e}`}function Yt(e,t,r,n,o){let i=r===void 0?"ERR":String(r),s=A(o==="error"?Kt:$t,i);return`${Ie("API")} ${e} ${t} \u2192 ${s} ${A(Re,`${n}ms`)}`}function Gt(e,t,r){let n=t?Kt:$t,o=A(n,"\u25CF"),i=A(n,t?"error":"success");return`${o} ${A(Ht,e)} ${i} ${A(Re,`${r}ms`)}`}function V(e){try{process.stdout.write(e+`
|
|
3
|
-
`)}catch{}}var Qt=new Xt,Jn=new Xt;function E(e){let t=Jn.getStore();t&&(t[e]=!0)}var Yn=/^[0-9a-f]{32}$/;function Gn(e){let t=e.replace(/-/g,"").toLowerCase();return Yn.test(t)?t:null}var Wn={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},q=new Map;function Zt(e,t,r){let n=q.get(e);n?n[t]=r:q.set(e,{[t]:r})}function T(e,t,r){e.setAttribute(t,S(r))}var ie;function Wt(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function Xn(e){return Math.round(e[0]*1e3+e[1]/1e6)}function er(e){try{process.stdout.write(re(e)+`
|
|
4
|
-
`)}catch{}}var We=class{export(t,r){for(let n of t){let o=n.spanContext().spanId,i=q.get(o),s={...n.attributes};if(i!==void 0){for(let[u,m]of Object.entries(i))typeof m=="string"?s[u]=j(m):typeof m=="object"&&m!==null?s[u]=S(m):s[u]=m;q.delete(o)}let a=Qt.getStore(),l=a?Gn(a):null;er({_otel:"span",traceId:l??n.spanContext().traceId,spanId:o,parentSpanId:n.parentSpanContext?.spanId??"",name:n.name,kind:n.kind,startTimeUnixNano:Wt(n.startTime),endTimeUnixNano:Wt(n.endTime),attributes:s,status:{code:Wn[n.status.code]??"STATUS_CODE_UNSET",...n.status.message?{message:j(n.status.message)}:{}}})}r({code:Kn.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Xe=class{onStart(t,r){}onEnd(t){q.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Qe=class{onStart(t){let r=t;(r.name==="function"||r.name==="App")&&V(`
|
|
5
|
-
`+Vt(String(r.attributes.method??""),String(r.attributes.route??"")))}onEnd(t){let r=t.attributes;switch(t.name){case"log":{let n=t.spanContext().spanId,o=q.get(n)?.properties;V(qt(String(r.level??"info"),String(r.message??""),o,zt(t.startTime)));break}case"auth":V(Jt(String(r.alias??"")));break;case"externalApi":{let n=typeof r.statusCode=="number"?r.statusCode:void 0;V(Yt(String(r.method??""),String(r.host??""),n,Xn(t.duration),r.status==="error"?"error":"success"));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},Ze=class{constructor(t){this.inner=t}inner;onStart(t,r){this.inner.onStart(t,r)}onEnd(t){t.name!=="log"&&this.inner.onEnd(t)}forceFlush(){return this.inner.forceFlush()}shutdown(){return this.inner.shutdown()}};function Qn(){let t=[Ye()?new Qe:new qn(new We)];return b().mode==="lambda"&&t.push(new Ze(new zn(_t()))),t.push(new Xe),t}function Zn(){ie===void 0&&(ie=new Vn({spanProcessors:Qn()}),ie.register({propagator:new Hn}),Nt())}async function eo(e=2e3){let t=[Bt(e)];ie!==void 0&&t.push((async()=>{let r;try{await Promise.race([ie.forceFlush(),new Promise(n=>{r=setTimeout(n,e)})])}catch(n){process.stderr.write(`[helix-sdk] otel flush failed: ${n instanceof Error?n.message:String(n)}
|
|
6
|
-
`)}finally{r!==void 0&&clearTimeout(r)}})()),await Promise.all(t)}var P=Bn.getTracer("@trayai/helix-sdk");function to({executionId:e,deploymentId:t,triggerType:r="http",routeOrJob:n,startedAt:o,startMs:i,errored:s,errorMessage:a,userId:l,flags:u}){let m=new Date().toISOString(),f=Date.now()-i;if(Ye()){V(`
|
|
7
|
-
`+Gt(n,s,f));return}er({_otel:"summary",executionId:e,deploymentId:t,triggerType:r,routeOrJob:n,status:s?"error":"success",startedAt:o,finishedAt:m,durationMs:f,userId:l,hasError:s||u.hasError,hasAuth:u.hasAuth,hasAi:u.hasAi,hasExternal:u.hasExternal,hasDb:u.hasDb,errorSummary:s&&a!==null?j(a):null})}async function ks(e,t){let r=e.startMs??Date.now();Zn();let n=!1,o=null;try{return await Qt.run(e.executionId,()=>P.startActiveSpan("App",{kind:$n.SERVER,attributes:{method:e.method,route:e.route,...e.deploymentId?{deploymentId:e.deploymentId}:{}}},async i=>{try{let s=await t(),a=s?.httpResponse?.status??404;return n=a>=400,i.setAttribute("http.response.status_code",a),i.setAttribute("helix.status",n?"error":"success"),i.setStatus({code:n?Ge.ERROR:Ge.OK}),s}catch(s){throw n=!0,o=s instanceof Error?s.message:String(s),i.setAttribute("http.response.status_code",500),i.setAttribute("helix.status","error"),i.setStatus({code:Ge.ERROR,message:o}),s}finally{i.end()}}))}finally{to({executionId:e.executionId,deploymentId:e.deploymentId,routeOrJob:`${e.method} ${e.route}`,startedAt:e.startedAt,startMs:r,errored:n,errorMessage:o,userId:e.userId,flags:{hasDb:!1,hasExternal:!1,hasAuth:!1,hasAi:!1,hasError:!1}}),await eo()}}var nr=1024,D=100*1024*1024,tr=250,ro=3600,no=ro*1e3,rr=new TextEncoder,oo=/(^|\/)\.\.(\/|$)/,io=/[?#]/;function so(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=31||r===127)return!0}return!1}function B(e,t=nr){if(e.length===0)throw c.filesPathInvalid("Path must be a non-empty string");Ce(e,t)}function et(e){return e.endsWith("/")?e.slice(0,-1):e}function Ce(e,t=nr){if(e.length===0)return;if(oo.test(e))throw c.filesPathInvalid("Path contains path traversal segment");if(io.test(e)||so(e))throw c.filesPathInvalid("Path contains illegal characters");let r=e.split("/");if(e.startsWith("/")||e.endsWith("/")||r.some(o=>o===""))throw c.filesPathInvalid("Path must not contain empty path segments");for(let o of r){let i=rr.encode(o).length;if(i>tr)throw c.filesPathInvalid(`Path segment exceeds ${tr} UTF-8 bytes (got ${i})`)}let n=rr.encode(e).length;if(n<1||n>t)throw c.filesPathInvalid(`Path must be between 1 and ${t} UTF-8 bytes (got ${n})`)}function or(e){if(e>D)throw c.filesValueTooLarge(`File exceeds maximum size of ${D} bytes (got ${e})`,D)}function z(e){let t=e!==void 0?e*1e3:no;return new Date(Date.now()+t)}import{join as ae}from"path";var ao="files",co="files-meta",lo=1023,uo=1,fo=5;function ir(e){let t=Math.max(Buffer.byteLength(Pe(e),"utf8"),Buffer.byteLength(se(e),"utf8"));return Math.max(0,lo-t-uo-fo)}function Pe(e){return ae(e,".helix",ao)}function se(e){return ae(e,".helix",co)}function ce(e,t){return ae(Pe(e),...t.split("/"))}function Ae(e,t){return ae(se(e),...t.split("/"))+".json"}function Te(e,t){return t.length===0?Pe(e):ce(e,t)}function sr(e,t){return t.length===0?se(e):ae(se(e),...t.split("/"))}import{z as mo}from"zod";var Ns=["us1","eu1","ap1","ap2"],tt=mo.string().refine(e=>wt(e),e=>({message:`Invalid enum value. Expected ${St().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));import{resolve as L}from"path";import{existsSync as ke,realpathSync as ar}from"fs";import{loadConfig as po}from"c12";import{z as h}from"zod";var lr=h.string().uuid("projectId must be a valid UUID"),ur=h.string().min(1,"workspaceId must be a non-empty string"),le=["openai","anthropic","google","mistral","cohere","openai-compatible"],go=["openai","anthropic","google","mistral","cohere"],dr=h.union([h.enum(go),h.object({service:h.enum(le),baseUrl:h.string().url().optional()}).refine(e=>e.service!=="openai-compatible"||e.baseUrl!==void 0,{message:'aiProviders: baseUrl is required when service is "openai-compatible"'}).refine(e=>e.baseUrl===void 0?!0:new URL(e.baseUrl).protocol==="https:",{message:"aiProviders: baseUrl must use https \u2014 ctx.ai requests route through the credentials broker's proxy, which rejects non-https destinations on every call (a plain-http endpoint, e.g. a local Ollama/vLLM instance over http, is not supported)"})]),yo=h.object({name:h.string().min(1,"name is required"),projectId:lr.optional(),workspaceId:ur.optional(),region:tt.optional(),env:h.literal("production").optional(),authentications:h.record(h.string()).optional().default({}),config:h.record(h.unknown()).optional().default({}),aiProviders:h.record(dr).optional()}).transform(({env:e,region:t,...r})=>({...r,region:t??"us1"})),cr=h.object({name:h.string().min(1,"name is required"),workspaceId:ur.optional(),region:tt,authentications:h.record(h.string()),config:h.record(h.unknown()),aiProviders:h.record(dr).optional()}),Js=h.discriminatedUnion("kind",[cr.extend({kind:h.literal("provisioned"),projectId:lr}),cr.extend({kind:h.literal("unprovisioned")})]),fr=["helix","tray"],mr=["ts","mts","cts","js","mjs","cjs"],pr="HELIX_CONFIG";function rt(e){let t=e?.trim();return t||process.env[pr]?.trim()||void 0}function ho(e,t){let r=rt(t?.configFile);if(r!==void 0){let n=L(e,r);return ke(n)?n:void 0}for(let n of fr)for(let o of mr){let i=L(e,`${n}.config.${o}`);if(ke(i))return i}}function bo(e){for(let t of fr)if(mr.some(r=>ke(L(e,`${t}.config.${r}`))))return t;return"helix"}function wo(e,t){return L(e,t).replace(/\.(?:m|c)?[jt]s$/,"")}function So(e,t){let r=rt(t?.configFile);return{name:bo(e),cwd:e,...r!==void 0?{configFile:wo(e,r)}:{},rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function xo(e,t){if(e!==null&&typeof e=="object"&&"extends"in e)throw c.configLoadFailed(`helix.config.ts at ${t}: 'extends' is not supported \u2014 remove the field`);let r=yo.safeParse(e);if(!r.success){let u=r.error.issues.map(m=>m.message).join("; ");throw c.configLoadFailed(`Invalid helix.config.ts at ${t}: ${u}`)}let{projectId:n,workspaceId:o,...i}=r.data,s=o!==void 0?{workspaceId:o}:{},a=xt(),l=a!==void 0?{...i,region:a}:i;return n!==void 0?{kind:"provisioned",projectId:n,...l,...s}:{kind:"unprovisioned",...l,...s}}async function Ys(e,t){let r=e??process.cwd(),n=rt(t?.configFile),o=n!==void 0?L(r,n):void 0;if(o!==void 0&&!ke(o)){let a=t?.configFile?.trim()?"":` (from ${pr})`;throw c.configLoadFailed(`Config file not found: ${o}${a}`)}let i;try{i=await po(So(r,t))}catch(a){throw c.configLoadFailed(`Failed to load helix.config.ts: ${a instanceof Error?a.message:String(a)}`)}let s=i._configFile??ho(r,t);if(!s)throw c.configLoadFailed(`helix.config.ts not found at ${L(r,"helix.config.ts")}`);if(o!==void 0&&i._configFile!==void 0){let a=ar(o);if(ar(L(i._configFile))!==a)throw c.configLoadFailed(`Config file conflict: requested ${o} but ${L(i._configFile)} takes extension-resolution precedence \u2014 remove or rename the sibling file`)}return xo(i.config,s)}var vo="WORKSPACE_ID_REQUIRED";function Gs(e){if(e.workspaceId===void 0)throw Object.assign(new Error("No workspaceId found in helix.config.ts. Discover & choose one \u2014 self-serve fix: run `helix workspace select`; agent-driven fix: call the `tray_list_workspaces` MCP tool. Already know the id? Run `helix workspace set <id>` or call the `tray_set_workspace_id` MCP tool. deploy cannot proceed without a workspace."),{code:vo});return e.workspaceId}var gr="helix-schedule",U=class extends Error{constructor(t){super(`defineSchedule: ${t}`),this.name="ScheduleConfigError"}};function Xs(e){if(typeof e!="object"||e===null)throw new U("expected a config object");let{cron:t,timezone:r="UTC",concurrent:n=!1,handler:o}=e;if(typeof t!="string"||t.trim()==="")throw new U("`cron` must be a non-empty string");let i=t.trim().split(/\s+/).length;if(i!==5)throw new U(`\`cron\` must be a 5-field standard expression (minute hour day-of-month month day-of-week); got ${i} field(s) in "${t}"`);if(typeof r!="string"||!Eo(r))throw new U(`\`timezone\` must be a valid IANA timezone name (e.g. "Europe/London"); got "${String(r)}"`);if(typeof n!="boolean")throw new U("`concurrent` must be a boolean");if(typeof o!="function")throw new U("`handler` must be a function");return Object.freeze({kind:gr,cron:t.trim(),timezone:r,concurrent:n,handler:o})}function Qs(e){return typeof e=="object"&&e!==null&&e.kind===gr&&typeof e.handler=="function"}function Eo(e){if(!/^[A-Za-z]/.test(e))return!1;try{return new Intl.DateTimeFormat(void 0,{timeZone:e}),!0}catch{return!1}}import{SpanKind as Ro}from"@opentelemetry/api";function Oe(e,t,r){let n=P.startSpan("log",{kind:Ro.INTERNAL});n.setAttribute("message",t),n.setAttribute("level",e),r&&Zt(n.spanContext().spanId,"properties",r),n.end(),jt(e,t,r)}function yr(){return{info:(e,t)=>Oe("info",e,t),warn:(e,t)=>Oe("warn",e,t),error:(e,t)=>Oe("error",e,t),debug:(e,t)=>Oe("debug",e,t)}}function ia(){try{return w().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}import Io from"ky";import{context as nt,trace as Co,SpanKind as de,SpanStatusCode as br}from"@opentelemetry/api";async function Fe(e,t={}){let r=b(),{region:n}=w(),{headers:o,deploymentId:i}=H(r);i&&(o[Se]=i);let s=xe(n,r.mode==="lambda"?"runtime":"dev"),a;try{a=await At({proxyUrl:s,credentialHeaders:o,request:e,timeoutMs:t.timeout,executionId:r.executionId})}catch(l){let u=l instanceof Error?l.message??String(l):String(l);throw c.brokerError(0,u)}if(a.kind==="brokerError"){let l=a.code===K?"credential broker does not support the raw proxy endpoints required by this SDK version \u2014 deploy a newer broker or pin an older SDK":a.message;throw c.brokerError(a.status,l,S(a.body),a.code)}return a.response}async function hr(e){Tt(e.url);let t=b(),{region:r}=w(),n={authenticationId:e.authenticationId,url:e.url,...e.method!==void 0?{method:e.method}:{},...e.expiresIn!==void 0?{expiresIn:e.expiresIn}:{}},{headers:o,deploymentId:i}=H(t);i&&(n.deploymentId=i);let s=kt(r,t.mode==="lambda"?"runtime":"dev"),a;try{a=await Ot({signUrl:s,credentialHeaders:o,body:n,timeoutMs:e.timeout,executionId:t.executionId})}catch(l){let u=l instanceof Error?l.message??String(l):String(l);throw c.brokerError(0,u)}if(a.kind==="brokerError"){let l=a.code===K?"credential broker does not support the s3 sign endpoint required by this SDK version \u2014 deploy a newer broker or pin an older SDK":a.message;throw c.brokerError(a.status,l,S(a.body),a.code)}return a.result}var Po=["get","post","put","patch","delete","head","options"],Sr="[stream body omitted]";function xr(e){return typeof ReadableStream<"u"&&e instanceof ReadableStream?Sr:e instanceof ArrayBuffer?`[binary body: ${e.byteLength} bytes]`:ArrayBuffer.isView(e)?`[binary body: ${e.byteLength} bytes]`:typeof Blob<"u"&&e instanceof Blob?`[binary body: ${e.size} bytes]`:e}function ot(e){try{return new URL(e).hostname}catch{return e}}function wr(e,t,r,n,o){let i=ot(t),s="externalApi",a={kind:de.CLIENT};return P.startActiveSpan(s,a,async l=>(l.setAttributes({method:e,host:i,"peer.service":n}),T(l,"request",{url:t,method:e,...r!==void 0?{body:xr(r)}:{}}),o(l)))}function ue(e,t,r){e.setAttribute("status",t),e.setStatus(t==="success"?{code:br.OK}:{code:br.ERROR,message:r}),e.end()}var Ao=16;async function To(e,t){let r=e.clone().body;return r?vr(r,t):new Uint8Array(0)}async function vr(e,t){let r=e.getReader(),n=[],o=0,i=0;try{for(;;){let{done:l,value:u}=await r.read();if(l)break;if(!u||u.byteLength===0){if(i+=1,i>=Ao)break;continue}i=0;let m=t+1-o;if(u.byteLength>=m){n.push(u.slice(0,m)),o+=m;break}n.push(u),o+=u.byteLength}}finally{r.cancel().catch(()=>{}),r.releaseLock()}let s=new Uint8Array(o),a=0;for(let l of n)s.set(l,a),a+=l.byteLength;return s}async function Er(e,t,r){if("kyResponse"in r)try{let n=await To(r.kyResponse,ne),o=new TextDecoder("utf-8").decode(n,{stream:!0}),i;try{i=JSON.parse(o)}catch{i=o}T(e,"response",i)}catch{T(e,"response",{status:t})}else T(e,"response",xr(r.bodyValue))}async function ko(e,t){if(t instanceof ReadableStream){let r=e.body??t;try{let[n,o]=r.tee(),i=new Request(e,{body:n,duplex:"half"}),s=await vr(o,ne);return{body:new TextDecoder("utf-8").decode(s,{stream:!0}),request:i}}catch{return{body:Sr}}}return typeof t=="string"?{body:t}:{}}function ka(){let e=Io.create({});function t(n){return(o,i)=>{let s=nt.active(),a,l=!1,u=(f,g)=>{a&&!l&&(l=!0,ue(a,f,g))},m=e.extend({hooks:{beforeRequest:[async(f,g)=>{let y=await ko(f,g.body),x=y.body;if(a||(a=P.startSpan("externalApi",{kind:de.CLIENT},s)),a.setAttributes({method:f.method.toUpperCase(),host:ot(f.url)}),T(a,"request",{url:f.url,method:f.method.toUpperCase(),...x!==void 0?{body:x}:{}}),l=!1,E("hasExternal"),y.request)return y.request}],beforeRetry:[f=>{u("error","retry"),a=void 0,l=!1}],afterResponse:[async(f,g,y)=>{a&&(a.setAttribute("statusCode",y.status),await Er(a,y.status,{kyResponse:y}),y.ok?u("success"):i?.throwHttpErrors===!1&&(E("hasError"),u("error",`HTTP ${y.status}`)))}],beforeError:[f=>(E("hasError"),u("error",f.message),f)]}});return a=P.startSpan("externalApi",{kind:de.CLIENT},s),a.setAttributes({method:n.toUpperCase(),host:ot(String(o))}),nt.with(Co.setSpan(nt.active(),a),()=>{let f=n==="options"?m(o,{...i,method:"OPTIONS"}):m[n](o,i);return f.catch(g=>{E("hasError"),u("error",g instanceof Error?g.message:String(g))}),f})}}let r=Object.fromEntries(Po.map(n=>[n,t(n)]));return{...e,...r,authed(n){return Oo(n)}}}function Oo(e){let r=w().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e];function o(s){return(a,l={})=>{let u=s.toUpperCase();return wr(u,a,l.body,e,async m=>{E("hasAuth");let f=P.startSpan("auth",{kind:de.INTERNAL});f.setAttribute("alias",e),f.setAttribute("id",n),f.end();try{let g=te({authenticationId:n,method:u,url:a,body:l.body,headers:l.headers,query:l.query}),y=await Fe(g,{timeout:l.timeout});return m.setAttribute("statusCode",y.status),await Er(m,y.status,{bodyValue:y.body}),ue(m,"success"),y}catch(g){throw E("hasError"),g instanceof c&&g.detail.kind==="broker_error"&&g.detail.status>0&&m.setAttribute("statusCode",g.detail.status),ue(m,"error",g instanceof Error?g.message:String(g)),g}})}}function i(s,a={}){let l=a.method??"GET";return wr(l,s,void 0,e,async u=>{E("hasAuth");let m=P.startSpan("auth",{kind:de.INTERNAL});m.setAttribute("alias",e),m.setAttribute("id",n),m.end();try{let f=await hr({authenticationId:n,url:s,method:l,...a.expiresIn!==void 0?{expiresIn:a.expiresIn}:{},...a.timeout!==void 0?{timeout:a.timeout}:{}});return u.setAttribute("statusCode",200),ue(u,"success"),f}catch(f){throw E("hasError"),f instanceof c&&f.detail.kind==="broker_error"&&f.detail.status>0&&u.setAttribute("statusCode",f.detail.status),ue(u,"error",f instanceof Error?f.message:String(f)),f}})}return{get:o("get"),post:o("post"),put:o("put"),patch:o("patch"),delete:o("delete"),head:o("head"),options:o("options"),s3Sign:i}}import{SpanKind as Bo,SpanStatusCode as Pr}from"@opentelemetry/api";function fe(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Fo=18e4,Rr=Fo-1e4,_o=2e3;async function Ir(e,t,r){let n=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),i=0;for(;Date.now()-o<Rr;){let s=await e(t,"DescribeStatement",{Id:r}),a=s.Status;if(n.has(a))return s;let l=Math.min(_o,200*2**i),u=l/2+Math.random()*(l/2),m=Rr-(Date.now()-o);await new Promise(f=>setTimeout(f,Math.min(u,m))),i++}throw c.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var Do=new Set(["SELECT","WITH","SHOW"]),Lo=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function Uo(e){if(!e.clusterIdentifier&&!e.workgroupName)throw c.dbInvalidParameters("either clusterIdentifier or workgroupName is required");if(e.clusterIdentifier&&e.workgroupName)throw c.dbInvalidParameters("clusterIdentifier and workgroupName are mutually exclusive (Provisioned vs Serverless)");if(!e.database)throw c.dbInvalidParameters("database is required");if(e.clusterIdentifier&&!e.dbUser)throw c.dbInvalidParameters("dbUser is required when using clusterIdentifier (Provisioned)");if(!e.region)throw c.dbInvalidParameters("region is required")}function Mo(e,t){let r=null;if(typeof t=="string")try{r=JSON.parse(t)}catch{}else t!==null&&typeof t=="object"&&(r=t);let n=typeof r?.__type=="string"?r.__type:void 0,o=typeof r?.message=="string"?r.message:void 0;if(n&&o)return c.dbQueryFailed(`${n}: ${o}`);let i=typeof t=="string"?j(t):S(t);return c.dbCallFailed(i)}function No(e){if(e==null||typeof e!="string")return e;try{return JSON.parse(e)}catch{throw c.dbCallFailed("upstream body not JSON: "+e.slice(0,200))}}function jo(e,t){return typeof t!="number"||t<0?{}:Do.has(e)?{rowsRead:t}:Lo.has(e)?{rowsWritten:t}:{}}function Cr(e){async function t(r,n,o){let i=te({authenticationId:e,method:"POST",url:`https://redshift-data.${r}.amazonaws.com/`,body:o,headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`RedshiftData.${n}`}});try{let{status:s,body:a}=await Fe(i);if(s>=400)throw Mo(s,a);return No(a)}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message??String(s):String(s);throw c.dbCallFailed(a,s instanceof Error?s:void 0)}}return{system:"redshift",validate:Uo,async execute(r,n){let o=fe(n),i={Sql:n,Database:r.database,...r.clusterIdentifier&&{ClusterIdentifier:r.clusterIdentifier,DbUser:r.dbUser},...r.workgroupName&&{WorkgroupName:r.workgroupName},...r.statementName&&{StatementName:r.statementName}},s=await t(r.region,"ExecuteStatement",i),a=s,l=typeof a?.Id=="string"?a.Id:void 0;if(!l){let y=S(s);throw c.dbCallFailed(`ExecuteStatement response missing Id; got: ${y}`)}let u=await Ir(t,r.region,l),m=u.Status;if(m==="FAILED"){let y=typeof u.Error=="string"?u.Error:"statement failed";throw c.dbQueryFailed(`${y} (statement: ${l})`)}if(m==="ABORTED")throw c.dbQueryFailed(`statement aborted (statement: ${l})`);let f=jo(o,u.ResultRows);return u.HasResultSet===!1?{result:{rowsAffected:u.ResultRows??0},metadata:f}:{result:await t(r.region,"GetStatementResult",{Id:l}),metadata:f}}}}var it=64*1024;function $o(e){return e.length>it?`${e.slice(0,it)}...[truncated]`:e}function Ko(e,t,r,n,o){e.setAttributes({system:t.system,statement:o,namespace:r.database,operation:n})}function Ho(e,t,r){let n=typeof t=="string"?t:JSON.stringify(t);return n.length>it?T(e,"result",{truncated:!0,size:n.length}):T(e,"result",t),r.rowsRead!==void 0&&e.setAttribute("rowsRead",r.rowsRead),r.rowsWritten!==void 0&&e.setAttribute("rowsWritten",r.rowsWritten),n}async function Vo(e,t,r){let n=fe(r),o=$o(r);return P.startActiveSpan("database",{kind:Bo.CLIENT},async i=>{Ko(i,e,t,n,o);try{E("hasDb");let{result:s,metadata:a}=await e.execute(t,r),l=Ho(i,s,a);return i.setAttribute("status","success"),i.setStatus({code:Pr.OK}),l}catch(s){E("hasError");let a=s instanceof Error?s.message:String(s);throw i.setAttribute("status","error"),i.setStatus({code:Pr.ERROR,message:a}),s}finally{i.end()}})}function qo(e){let r=w().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=Cr(n);function i(s,a){return o.validate(s),Vo(o,s,a)}return{parameters(s){return{sql(a){return i(s,a)}}},sql(s){return i({},s)}}}import{createStorage as Wo}from"unstorage";var Ar=1024,st=250*1024,zo=new TextEncoder,Jo=/(^|\/)\.\.(\/|$)/,Yo=/[?#]/,Go=/[\u0000-\u001F\u007F]/;function Tr(e){if(e.length===0)throw c.kvKeyInvalid("Key must be a non-empty string");if(Jo.test(e))throw c.kvKeyInvalid("Key contains path traversal segment");if(Yo.test(e)||Go.test(e))throw c.kvKeyInvalid("Key contains illegal characters");if(e.startsWith("/")||e.endsWith("/")||e.split("/").some(r=>r===""))throw c.kvKeyInvalid("Key must not contain empty path segments");let t=zo.encode(e).length;if(t<1||t>Ar)throw c.kvKeyInvalid(`Key must be between 1 and ${Ar} UTF-8 bytes (got ${t})`)}function kr(e){if(!Number.isInteger(e)||e<=0)throw c.kvTtlInvalid(`ttl must be a positive integer number of seconds (got ${e})`)}function Or(e){let t;try{t=JSON.stringify(e)}catch{throw c.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw c.kvValueInvalid("Value must be JSON-serializable");let r=Buffer.byteLength(t,"utf8");if(r>st)throw c.kvValueTooLarge(`Value exceeds maximum size of ${st} bytes (got ${r})`,st)}function me(e){Tr(e)}function _e(e,t){let r=e[t];if(typeof r!="function")throw new Error(`KV driver is missing ${t}`);return r}function Fr(e){let t=_e(e,"getItem"),r=_e(e,"setItem"),n=_e(e,"removeItem"),o=_e(e,"hasItem"),i=e.getKeys;return{...e,getItem(s,a){return me(s),t(s,a)},setItem(s,a,l){return me(s),r(s,a,l)},removeItem(s,a){return me(s),n(s,a)},hasItem(s,a){return me(s),o(s,a)},getKeys(s,a){return s.length>0&&me(s),i(s,a)}}}function De(e){return Wo({driver:Fr(e)})}import{defineDriver as Xo}from"unstorage";function Qo(e){try{return JSON.parse(e)}catch{return e}}var Zo=Xo(e=>{let{client:t}=e;return{name:"helix-kv",async getItem(r){let n=await t.get(r);return n===null?null:JSON.stringify(n)},async setItem(r,n,o){let i=o?.ttl,s=Qo(n);i!==void 0?await t.set(r,s,{ttl:i}):await t.set(r,s)},async removeItem(r){await t.delete(r)},async hasItem(r){return await t.has(r)},async getKeys(){throw new Error("KV key listing is not supported")}}});function _r(e){return Zo({client:e})}import ri from"ky";import{z as R}from"zod";async function M(e){let t=e.headers.get("content-type")??"",r=await e.text();if(r.length!==0)return t.includes("application/json")?JSON.parse(r):r}function Dr(e){return _(e).hosts.api}function ei(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function ti(e){return e.split("/").map(encodeURIComponent).join("/")}function pe(e,t,r){return`${e}${ei(t)}/${ti(r)}`}var ni=6e4,at=R.lazy(()=>R.union([R.string(),R.number(),R.boolean(),R.null(),R.array(at),R.record(at)])),oi=R.object({projectId:R.string(),key:R.string(),value:at,type:R.enum(["string","number","boolean","null","array","object"]),organizationId:R.string(),scope:R.string(),createdBy:R.string(),createdAt:R.number(),updatedBy:R.string(),updatedAt:R.number()});function ii(){let e=we(),t=F(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[be]=e),n&&(o[O]=t),o}function si(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function Le(e,t){throw c.kvCallFailed(e,si(t),S(t))}async function Ue(e,t,r={}){try{let n=await ri(t,{method:e,headers:ii(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ni}),o=e==="head"?void 0:await M(n);return{status:n.status,body:o}}catch(n){if(n instanceof c)throw n;let o=n instanceof Error?n.message??String(n):String(n);throw c.kvCallFailed(0,o)}}function Lr(e){let t=Dr(e.env),{projectId:r}=e;return{async get(n){let{status:o,body:i}=await Ue("get",pe(t,r,n));if(o===404)return null;(o<200||o>=300)&&Le(o,i);let s=oi.safeParse(i);if(!s.success)throw c.kvCallFailed(o,"platform returned malformed KeyValueEntry",S(i));return s.data.value},async set(n,o,i){let{status:s,body:a}=await Ue("put",pe(t,r,n),{json:i?.ttl!==void 0?{value:o,ttl:i.ttl}:{value:o}});(s<200||s>=300)&&Le(s,a)},async delete(n){let{status:o,body:i}=await Ue("delete",pe(t,r,n));o!==204&&Le(o,i)},async has(n){let{status:o,body:i}=await Ue("head",pe(t,r,n));if(o===200)return!0;if(o===404)return!1;Le(o,i)}}}function Me(e){return{getItem:t=>e.getItem(t),removeItem:t=>e.removeItem(t),hasItem:t=>e.hasItem(t),setItem:async(t,r,n)=>{let o=n?.ttl;Or(r),typeof o=="number"&&kr(o),await e.setItem(t,r,o!==void 0?{ttl:o}:void 0)}}}function ai(){let e=w();if(e.kind!=="provisioned")throw c.kvRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Ur(e){let t=ai(),r=e??Lr(t),n=De(_r(r));return Me(n)}import{defineDriver as ci}from"unstorage";var li=ci(e=>{let t=new Map;function r(n){let o=t.get(n);if(o&&o.expiresAt!==void 0&&o.expiresAt<=Date.now()){t.delete(n);return}return o}return{name:"memory-ttl",getItem(n){return r(n)?.value??null},setItem(n,o,i){let s=i?.ttl,a=r(n),l=typeof s=="number"?Date.now()+s*1e3:s===null?void 0:a?.expiresAt;t.set(n,{value:o,expiresAt:l})},removeItem(n){t.delete(n)},hasItem(n){return r(n)!==void 0},getKeys(){return[...t.keys()].filter(n=>r(n)!==void 0)},clear(){t.clear()}}});function Mr(){return li({})}var ct;function ui(){return ct||(ct=De(Mr())),ct}function Nr(){return Me(ui())}function di(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Lc(){return di()?Ur():Nr()}import{createHash as pi}from"crypto";import{mkdir as gi,readFile as Hr,readdir as Vr,rm as Br,unlink as yi,writeFile as $r}from"fs/promises";import{dirname as hi}from"path";async function fi(e){let t=e.getReader(),r=[],n=0;for(;;){let{done:o,value:i}=await t.read();if(o)break;if(i){if(n+=i.byteLength,n>D)throw await t.cancel(),c.filesValueTooLarge(`File exceeds maximum size of ${D} bytes (got more than ${D})`,D);r.push(i)}}return Buffer.concat(r)}async function J(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?fi(e):Buffer.from(e)}var mi={pdf:"application/pdf",csv:"text/csv",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",json:"application/json",txt:"text/plain",html:"text/html",htm:"text/html",css:"text/css",js:"application/javascript",xml:"application/xml",zip:"application/zip"},jr="application/octet-stream";function Ne(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return jr;let r=e.slice(t+1).toLowerCase();return mi[r]??jr}function G(){let e=b().projectRoot;if(!e)throw c.filesNotAvailable();return e}async function Y(e){try{return await e()}catch(t){if(t instanceof c)throw t;let r=t?.code;throw r?c.filesCallFailed(0,`Local file storage operation failed: ${r}`):c.filesCallFailed(0,"Local file storage operation failed: unknown error")}}function je(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function lt(e){try{let t=await Hr(Ae(G(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Kr(e){await gi(hi(e),{recursive:!0})}async function bi(e,t){let r=Te(e,t),n;try{n=await Vr(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return[];throw o}return n.filter(o=>o.isFile()).map(o=>t.length===0?o.name:`${t}/${o.name}`)}async function qr(e,t){let r=Te(e,t),n;try{n=await Vr(r,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return[];throw i}let o=[];for(let i of n){let s=t.length===0?i.name:`${t}/${i.name}`;i.isDirectory()?o.push(...await qr(e,s)):i.isFile()&&o.push(s)}return o}function zr(){return{async put(e,t,r){return Y(async()=>{let n=G(),o=await J(t),i=r?.contentType??Ne(e),s=pi("sha1").update(o).digest("hex"),a=new Date,l=ce(n,e);await Kr(l),await $r(l,o);let u={size:o.byteLength,contentType:i,lastModified:a.toISOString(),etag:s},m=Ae(n,e);return await Kr(m),await $r(m,JSON.stringify(u)),je(e,u)})},async get(e){return Y(async()=>{let t=await lt(e);return t?{data:await Hr(ce(G(),e)),metadata:je(e,t)}:null})},async head(e){return Y(async()=>{let t=await lt(e);return t?je(e,t):null})},async delete(e){return Y(async()=>{let t=G();await Promise.all([ce(t,e),Ae(t,e)].map(async r=>{try{await yi(r)}catch(n){if(n.code!=="ENOENT")throw n}}))})},async deleteMany(e){return Y(async()=>{let t=G(),r=await qr(t,e);return await Promise.all([Br(Te(t,e),{recursive:!0,force:!0}),Br(sr(t,e),{recursive:!0,force:!0})]),{deleted:r.length}})},async list(e,t){return Y(async()=>{let r=G(),n=t?.limit??100,i=(await bi(r,e??"")).slice(0,n);return{files:(await Promise.all(i.map(async a=>{let l=await lt(a);return l?je(a,l):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let r=b().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:z(t?.expiresIn)}},async getDownloadUrl(e,t){let r=b().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:z(t?.expiresIn)}}}}import{createHash as Ii}from"crypto";function Be(e){return _(e).hosts.api}function wi(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function ge(e,t){return`${e}${wi(t)}`}function W(e,t,r){return`${ge(e,t)}/${encodeURIComponent(r)}`}function $e(e,t,r){return`${W(e,t,r)}/upload`}function Jr(e,t,r){return`${W(e,t,r)}/download`}function Yr(e,t,r){return`${W(e,t,r)}/signed-url`}function Gr(e,t,r,n){let o=new URLSearchParams({name:n});return r&&o.set("parentFolder",r),`${ge(e,t)}/file?${o.toString()}`}function Wr(e,t,r,n){let o=new URLSearchParams({limit:String(n)});return r&&o.set("id",r),`${ge(e,t)}?${o.toString()}`}import dt from"ky";import{z as v}from"zod";var ft=6e4,Xr=v.object({id:v.string(),workspaceId:v.string(),projectId:v.string(),parentFolder:v.string().nullable().optional(),name:v.string(),size:v.number().nullable().optional(),objectType:v.enum(["Folder","File"]),contentType:v.string().nullable().optional(),createdAt:v.string(),updatedAt:v.string()}),Si=v.object({signedURL:v.string()}),xi=v.object({path:v.array(v.object({id:v.string(),name:v.string()})),elements:v.array(Xr)});function mt(){let e=we(),t=F(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[be]=e),n&&(o[O]=t),o}function Qr(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function N(e,t){throw c.filesCallFailed(e,Qr(t),S(t))}function vi(e,t){return e===400&&Qr(t).toLowerCase()==="resource not found"}async function Ei(e){let t=new Response(e),r=t.headers.get("content-type")??"multipart/form-data",n=await t.arrayBuffer();return{body:Buffer.from(n),contentType:r}}async function X(e,t,r={}){try{let n=await dt(t,{method:e,headers:mt(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ft}),o=await M(n);return{status:n.status,body:o}}catch(n){if(n instanceof c)throw n;let o=n instanceof Error?n.message:String(n);throw c.filesCallFailed(0,o)}}function ut(e,t){let r=Xr.safeParse(t);if(!r.success)throw c.filesCallFailed(e,"platform returned malformed ObjectMetadata",S(t));return r.data}function Zr(e){let t=Be(e.env),{projectId:r}=e;return{async createMetadata(n){let{status:o,body:i}=await X("post",ge(t,r),{json:n});return(o<200||o>=300)&&N(o,i),ut(o,i)},async getByName(n,o){let{status:i,body:s}=await X("get",Gr(t,r,n,o));return i===404||vi(i,s)?null:((i<200||i>=300)&&N(i,s),ut(i,s))},async getById(n){let{status:o,body:i}=await X("get",W(t,r,n));return o===404?null:((o<200||o>=300)&&N(o,i),ut(o,i))},async listChildren(n,o){let{status:i,body:s}=await X("get",Wr(t,r,n,o));(i<200||i>=300)&&N(i,s);let a=xi.safeParse(s);if(!a.success)throw c.filesCallFailed(i,"platform returned malformed listing",S(s));return a.data},async uploadContent(n,o,i,s){let a=new FormData;a.append("fileUploadContentInput",new Blob([new Uint8Array(o)],{type:s}),i);let{body:l,contentType:u}=await Ei(a),m;try{m=await dt($e(t,r,n),{method:"post",headers:{...mt(),"content-type":u},body:new Uint8Array(l),throwHttpErrors:!1,timeout:ft})}catch(g){if(g instanceof c)throw g;let y=g instanceof Error?g.message:String(g);throw c.filesCallFailed(0,y)}let f=await M(m);(m.status<200||m.status>=300)&&N(m.status,f)},async downloadContent(n){let o;try{o=await dt(Jr(t,r,n),{method:"get",headers:mt(),throwHttpErrors:!1,timeout:ft})}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message:String(s);throw c.filesCallFailed(0,a)}if(o.status<200||o.status>=300){let s=await M(o);N(o.status,s)}let i=await o.arrayBuffer();return Buffer.from(i)},async getSignedDownloadUrl(n){let{status:o,body:i}=await X("get",Yr(t,r,n));(o<200||o>=300)&&N(o,i);let s=Si.safeParse(i);if(!s.success)throw c.filesCallFailed(o,"platform returned malformed signed URL response",S(i));return s.data.signedURL},async deleteById(n){let{status:o,body:i}=await X("delete",W(t,r,n));o===204||o===404||(o<200||o>=300)&&N(o,i)}}}function pt(e){return e.split("/").filter(t=>t.length>0)}function gt(e){return e instanceof c&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ri(e,t,r){let n=await e.getByName(t,r);if(n)return n;try{return await e.createMetadata({parentFolder:t,objectType:"Folder",name:r})}catch(o){if(gt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function yt(e,t){let r=pt(t),n=r[r.length-1],o;for(let i of r.slice(0,-1))o=(await Ri(e,o,i)).id;return{parentFolder:o,name:n}}async function ye(e,t){let r=pt(t),n=r[r.length-1],o;for(let i of r.slice(0,-1)){let s=await e.getByName(o,i);if(!s||s.objectType!=="Folder")return null;o=s.id}return{parentFolder:o,name:n}}async function ht(e,t){if(t.length===0)return;let r=pt(t),n;for(let o of r){let i=await e.getByName(n,o);if(!i||i.objectType!=="Folder")return null;n=i.id}return n}var Ci=500,Pi=8;async function Ai(e,t,r){let n=new Array(e.length),o=0;async function i(){for(;o<e.length;){let s=o++;n[s]=await r(e[s])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},i)),n}function Ti(){let e=w();if(e.kind!=="provisioned")throw c.filesRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function ki(e){return Ii("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function Ke(e,t,r){return{path:e,size:t.size??0,contentType:t.contentType??r??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:ki(t)}}async function en(e,t,r,n){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:n,name:r})}catch(o){if(gt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function tn(e,t){let{elements:r}=await e.listChildren(t,Ci);return(await Ai(r,Pi,async o=>{let i=o.objectType==="Folder"?await tn(e,o.id):1;return await e.deleteById(o.id),i})).reduce((o,i)=>o+i,0)}function rn(e){let t=Ti(),r=e??Zr(t),n=Be(t.env),{projectId:o}=t;return{async put(i,s,a){let{parentFolder:l,name:u}=await yt(r,i),m=await J(s),f=a?.contentType??Ne(i),g=await r.getByName(l,u);if(g&&g.objectType!=="File")throw c.filesCallFailed(409,`A folder already exists at "${i}"`);let y=g??await en(r,l,u,f);await r.uploadContent(y.id,m,u,f);let x=await r.getById(y.id);return Ke(i,x??y,f)},async get(i){let s=await ye(r,i);if(!s)return null;let a=await r.getByName(s.parentFolder,s.name);return!a||a.objectType!=="File"?null:{data:await r.downloadContent(a.id),metadata:Ke(i,a)}},async head(i){let s=await ye(r,i);if(!s)return null;let a=await r.getByName(s.parentFolder,s.name);return!a||a.objectType!=="File"?null:Ke(i,a)},async delete(i){let s=await ye(r,i);if(!s)return;let a=await r.getByName(s.parentFolder,s.name);a&&await r.deleteById(a.id)},async deleteMany(i){let s=await ht(r,i);if(s===null)return{deleted:0};let a=await tn(r,s);return i.length>0&&s!==void 0&&await r.deleteById(s),{deleted:a}},async list(i,s){let a=await ht(r,i??"");if(a===null)return{files:[],cursor:null};let l=s?.limit??100,{elements:u}=await r.listChildren(a,l);return{files:u.filter(f=>f.objectType==="File").map(f=>Ke(i?`${i}/${f.name}`:f.name,f)),cursor:null}},async getUploadUrl(i,s){let{parentFolder:a,name:l}=await yt(r,i),m=await r.getByName(a,l)??await en(r,a,l,s?.contentType);return{url:$e(n,o,m.id),expiresAt:z(s?.expiresIn)}},async getDownloadUrl(i,s){let a=await ye(r,i),l=a?await r.getByName(a.parentFolder,a.name):null;if(!l||l.objectType!=="File")throw c.filesCallFailed(404,`File not found: ${i}`);return{url:await r.getSignedDownloadUrl(l.id),expiresAt:z(s?.expiresIn)}}}}function bt(e,t){let r=t?.maxPathBytes;return{async put(n,o,i){B(n,r);let s=await J(o);return or(s.byteLength),e.put(n,s,i)},async get(n){return B(n,r),e.get(n)},async head(n){return B(n,r),e.head(n)},async delete(n){return B(n,r),e.delete(n)},async deleteMany(n){let o=et(n);return Ce(o,r),e.deleteMany(o)},async list(n,o){let i=et(n??"");return Ce(i,r),e.list(i,o)},async getUploadUrl(n,o){return B(n,r),e.getUploadUrl(n,o)},async getDownloadUrl(n,o){return B(n,r),e.getDownloadUrl(n,o)}}}function Oi(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Pl(){if(Oi())return bt(rn());let e=b().projectRoot;return bt(zr(),{maxPathBytes:e?ir(e):void 0})}import _i from"ky";function nn(e){return _(e).hosts.api}function Fi(){return"/private/v1/helix/function-calls"}function on(e){return`${e}${Fi()}`}var Di=5e3;function Li(){let e=F();if(!!!(e&&e.trim().length>0))throw c.callFunctionMissingExecutionJwt();return{Accept:"application/json",[O]:e}}function Ui(e,t){throw c.callFunctionCallFailed(e,Mi(t),S(t))}function Mi(e){if(e!==null&&typeof e=="object"){let t=e;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error}return String(e??"unknown error")}function sn(e){let t=nn(e.env);return{async callAsync(r,n){let o,i;try{let s=await _i(on(t),{method:"post",headers:Li(),json:{functionPath:r,input:n},throwHttpErrors:!1,timeout:Di});o=s.status,i=await M(s)}catch(s){if(s instanceof c)throw s;let a=s instanceof Error?s.message??String(s):String(s);throw c.callFunctionCallFailed(0,a)}(o<200||o>=300)&&Ui(o,i)}}}var an=1024;function He(e){if(typeof e!="string"||e.trim().length===0)throw c.callFunctionPathInvalid("functionPath must be a non-empty string");if(e.length>an)throw c.callFunctionPathInvalid(`functionPath must be at most ${an} characters`)}function Ni(){let e=w();if(e.kind!=="provisioned")throw c.callFunctionRequiresProvisioning();return{env:e.region}}function cn(e){return async function(r,n){He(r),await(e??sn(Ni())).callAsync(r,n)}}function ln(){return async function(t,r){He(t);let n=b().devServerUrl;if(!n)throw c.callFunctionNotAvailable();let o=t.startsWith("/")?t:`/${t}`,i=yr();fetch(`${n}${o}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r??{})}).then(s=>{s.ok||i.warn("ctx.callFunctionAsync: dev-mode dispatch returned a non-2xx response",{functionPath:t,status:s.status})}).catch(s=>{i.warn("ctx.callFunctionAsync: dev-mode dispatch failed",{functionPath:t,error:s instanceof Error?s.message:String(s)})})}}function ji(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":b().mode==="lambda"}function Zl(){return ji()?cn():ln()}import{embed as gn,embedMany as yn,generateImage as hn,generateObject as bn,generateSpeech as wn,generateText as Sn,streamObject as xn,streamText as vn,transcribe as En}from"ai";import{SpanKind as Wi,SpanStatusCode as pn}from"@opentelemetry/api";import{createOpenAI as Hi}from"@ai-sdk/openai";import{createAnthropic as Vi}from"@ai-sdk/anthropic";import{createGoogle as qi}from"@ai-sdk/google";import{createMistral as zi}from"@ai-sdk/mistral";import{createCohere as Ji}from"@ai-sdk/cohere";import{createOpenAICompatible as Yi}from"@ai-sdk/openai-compatible";var Bi=new Set(["x-api-key","x-goog-api-key"]);function $i(e){return Ct(e)||Bi.has(e.toLowerCase())}function Ki(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function un(e){return async(t,r)=>{let n=Ki(t),o=new URL(n);if(o.protocol!=="https:")throw c.unsupportedScheme(o.protocol.replace(/:$/,""));let i=b(),{region:s}=w(),a=new Headers(r?.headers??(t instanceof Request?t.headers:void 0)),l=new Headers;for(let[d,p]of a.entries())$i(d)||l.append(d,p);l.set(vt,n),l.set(Et,e),i.executionId&&l.set(Rt,i.executionId);let{headers:u,deploymentId:m}=H(i);for(let[d,p]of Object.entries(u))l.set(d,p);m&&l.set(Se,m);let f=xe(s,i.mode==="lambda"?"runtime":"dev"),g=r?.body??(t instanceof Request?t.clone().body:void 0),y={method:r?.method??(t instanceof Request?t.method:"GET"),headers:l,redirect:"manual",signal:r?.signal??void 0};g!=null&&(y.body=g,typeof ReadableStream<"u"&&g instanceof ReadableStream&&(y.duplex="half"));let x;try{x=await fetch(f,y)}catch(d){if(d instanceof Error&&d.name==="AbortError")throw d;let p=d instanceof Error?d.message??String(d):String(d);throw c.brokerError(0,p)}let ee=x.headers.get(It);if(ee!==null){let d=await x.text(),p=d||ee;try{let I=Pt.safeParse(JSON.parse(d));I.success&&(p=I.data.error.message)}catch{}throw ee===K&&(p="credential broker does not support the raw proxy endpoint required by ctx.ai \u2014 deploy a newer broker or pin an older SDK"),c.brokerError(x.status,p,d||void 0,ee)}return x}}var Q="helix-broker";function dn(e){let{alias:t,service:r,baseUrl:n,authenticationId:o}=e,i=un(o);switch(r){case"openai":return Hi({apiKey:Q,fetch:i});case"anthropic":return Vi({apiKey:Q,fetch:i});case"google":return qi({apiKey:Q,fetch:i});case"mistral":return zi({apiKey:Q,fetch:i});case"cohere":return Ji({apiKey:Q,fetch:i});case"openai-compatible":{if(!n)throw c.aiUnsupportedService(t,r,[...le]);return Yi({name:t,baseURL:n,apiKey:Q,fetch:i})}}}var fn={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-mini":{input:.4,output:1.6},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1":{input:2,output:8},"text-embedding-3-small":{input:.02,output:0},"text-embedding-3-large":{input:.13,output:0},"gpt-image-1":{input:5,output:40},"claude-opus-4":{input:15,output:75},"claude-sonnet-4":{input:3,output:15},"claude-haiku-4":{input:1,output:5},"claude-3-5-haiku":{input:.8,output:4},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:.3,output:2.5},"text-embedding-004":{input:0,output:0},"mistral-large":{input:2,output:6},"mistral-small":{input:.1,output:.3},"command-r-plus":{input:2.5,output:10},"command-r":{input:.15,output:.6}},Gi=Object.keys(fn).sort((e,t)=>t.length-e.length);function mn(e,t){let r=Gi.find(i=>e.startsWith(i));if(!r||!t)return{amount:0,currency:"USD"};let n=fn[r],o=((t.inputTokens??0)*n.input+(t.outputTokens??0)*n.output)/1e6;return{amount:Number(o.toFixed(8)),currency:"USD"}}function C(e,t,r){return P.startActiveSpan("ai",{kind:Wi.CLIENT},async n=>{n.setAttributes({operation:e.operation,model:e.model,...e.alias!==void 0?{alias:e.alias}:{}}),E("hasAi");try{let o=await t(),i=r?.(o);return i&&n.setAttributes({...i.inputTokens!==void 0?{inputTokens:i.inputTokens}:{},...i.outputTokens!==void 0?{outputTokens:i.outputTokens}:{}}),n.setAttribute("status","success"),n.setStatus({code:pn.OK}),o}catch(o){let i=o instanceof Error?o.message:String(o);throw n.setAttribute("status","error"),n.setStatus({code:pn.ERROR,message:i}),o}finally{n.end()}})}function Xi(){return`aireq_${crypto.randomUUID().replaceAll("-","")}`}function Z(e,t){return{cost:mn(e,t),requestId:Xi()}}function $(e){return typeof e=="object"&&e!==null&&"modelId"in e?String(e.modelId):String(e)}var Rn=new WeakSet;function he(e){return Rn.add(e),e}function k(e){if(typeof e!="object"||e===null)throw c.aiModelInstanceRequired(typeof e=="string"?e:String(e));if(!Rn.has(e))throw c.aiForeignModelRejected()}function Ve(e){return e.totalUsage??e.usage}function qe(e){return e.usage?.tokens!==void 0?{inputTokens:e.usage.tokens}:void 0}function ze(e){return e.usage}function Qi(e){let t=w(),r=t.authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=(t.aiProviders??{})[e];if(o===void 0)throw c.aiProviderNotConfigured(e,[...le]);let{service:i,baseUrl:s}=typeof o=="string"?{service:o,baseUrl:void 0}:o,a=dn({alias:e,service:i,baseUrl:s,authenticationId:n}),l=d=>he(a.languageModel(d)),u=d=>he(a.embeddingModel(d)),m=d=>he(a.imageModel(d)),f=d=>{if(!a.transcriptionModel)throw new Error(`AI provider "${i}" (alias "${e}") has no transcription models`);return he(a.transcriptionModel(d))},g=d=>{if(!a.speechModel)throw new Error(`AI provider "${i}" (alias "${e}") has no speech models`);return he(a.speechModel(d))},y=(d=>l(d)),x=(d,p)=>{let I=d.model;if(typeof I!="string")throw c.aiModelIdRequired(e,p);return I};return Object.assign(y,{specificationVersion:"v4",languageModel:l,embeddingModel:u,textEmbeddingModel:u,imageModel:m,transcriptionModel:f,speechModel:g,async generateText(d){let p=x(d,"generateText"),I=await C({operation:"generateText",model:p,alias:e},()=>Sn({...d,model:l(p)}),Ve);return Object.assign(I,{helix:Z(p,Ve(I))})},streamText(d){let p=x(d,"streamText");return E("hasAi"),vn({...d,model:l(p)})},async generateObject(d){let p=x(d,"generateObject"),I=await C({operation:"generateObject",model:p,alias:e},()=>bn({...d,model:l(p)}),Cn=>Cn.usage),In=I.usage;return Object.assign(I,{helix:Z(p,In)})},streamObject(d){let p=x(d,"streamObject");return E("hasAi"),xn({...d,model:l(p)})},async embed(d){let p=x(d,"embed");return C({operation:"embed",model:p,alias:e},()=>gn({...d,model:u(p)}),qe)},async embedMany(d){let p=x(d,"embedMany");return C({operation:"embedMany",model:p,alias:e},()=>yn({...d,model:u(p)}),qe)},async generateImage(d){let p=x(d,"generateImage"),I=await C({operation:"generateImage",model:p,alias:e},()=>hn({...d,model:m(p)}),ze);return Object.assign(I,{helix:Z(p,ze(I))})},async transcribe(d){let p=x(d,"transcribe");return C({operation:"transcribe",model:p,alias:e},()=>En({...d,model:f(p)}))},async generateSpeech(d){let p=x(d,"generateSpeech");return C({operation:"generateSpeech",model:p,alias:e},()=>wn({...d,model:g(p)}))}})}function Iu(){let e=new Map;return Object.assign((n=>{let o=e.get(n);return o||(o=Qi(n),e.set(n,o)),o}),{async generateText(n){k(n.model);let o=$(n.model),i=await C({operation:"generateText",model:o},()=>Sn(n),Ve);return Object.assign(i,{helix:Z(o,Ve(i))})},streamText(n){return k(n.model),E("hasAi"),vn(n)},async generateObject(n){k(n.model);let o=$(n.model),i=await C({operation:"generateObject",model:o},()=>bn(n),a=>a.usage),s=i.usage;return Object.assign(i,{helix:Z(o,s)})},streamObject(n){return k(n.model),E("hasAi"),xn(n)},async embed(n){return k(n.model),C({operation:"embed",model:$(n.model)},()=>gn(n),qe)},async embedMany(n){return k(n.model),C({operation:"embedMany",model:$(n.model)},()=>yn(n),qe)},async generateImage(n){k(n.model);let o=$(n.model),i=await C({operation:"generateImage",model:o},()=>hn(n),ze);return Object.assign(i,{helix:Z(o,ze(i))})},async transcribe(n){return k(n.model),C({operation:"transcribe",model:$(n.model)},()=>En(n))},async generateSpeech(n){return k(n.model),C({operation:"generateSpeech",model:$(n.model)},()=>wn(n))}})}export{Zi as a,es as b,ts as c,w as d,rs as e,Qt as f,Jn as g,E as h,T as i,Zn as j,eo as k,P as l,to as m,ks as n,yr as o,ia as p,ka as q,qo as r,Lc as s,B as t,ce as u,Ae as v,Pl as w,Zl as x,Ns as y,tt as z,lr as A,ur as B,le as C,dr as D,Js as E,pr as F,rt as G,ho as H,So as I,xo as J,Ys as K,vo as L,Gs as M,Iu as N,gr as O,U as P,Xs as Q,Qs as R};
|
package/dist/chunk-HEA646WT.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var S="X-Helix-Project-Execution-Token",P="X-Tray-Token",$={mode:"dev",deploymentId:null},h={...$},p={};function te(e){let{internalJwt:r,helixExecutionJwt:t,devToken:n,...i}=e;"internalJwt"in e&&(p.internalJwt=r),"helixExecutionJwt"in e&&(p.helixExecutionJwt=t),"devToken"in e&&(p.devToken=n),h={...h,...i}}function ne(){return h}function I(){return p.internalJwt}function T(){return p.helixExecutionJwt}function N(){return p.devToken}var C=new Set(["us1","eu1","ap1","ap2"]),o=new Map,v={name:"us1",exposedName:"us1",displayName:"us1",hosts:{api:"https://api.tray.io",broker:"https://api.tray.io/private/v1/code",ingest:"https://api.tray.io/private/v1/helix/otlp",weaver:"https://weaver.tray.io",app:"https://app.tray.io",projectHost:"helix-app.ai",dashboard:"https://app.helix.tray.ai",auth:"https://auth.tray.io"},login:{storePrefix:"PROD",appUrl:"https://app.tray.io",cookieName:"prod_tray_lid",cookieDomain:"tray.io"}},x={name:"eu1",exposedName:"eu1",displayName:"eu1",hosts:{api:"https://api.eu1.tray.io",broker:"https://api.eu1.tray.io/private/v1/code",ingest:"https://api.eu1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.eu1.tray.io",app:"https://app.eu1.tray.io",projectHost:"eu1.helix-app.ai",dashboard:"https://app.helix.eu1.tray.ai",auth:"https://auth.eu1.tray.io"},login:{storePrefix:"EU1",appUrl:"https://app.eu1.tray.io",cookieName:"prod_tray_lid_eu",cookieDomain:"tray.io"}},E={name:"ap1",exposedName:"ap1",displayName:"ap1",hosts:{api:"https://api.ap1.tray.io",broker:"https://api.ap1.tray.io/private/v1/code",ingest:"https://api.ap1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap1.tray.io",app:"https://app.ap1.tray.io",projectHost:"ap1.helix-app.ai",dashboard:"https://app.helix.ap1.tray.ai",auth:"https://auth.ap1.tray.io"},login:{storePrefix:"AP1",appUrl:"https://app.ap1.tray.io",cookieName:"prod_tray_lid_ap",cookieDomain:"tray.io"}},w={name:"ap2",exposedName:"ap2",displayName:"ap2",hosts:{api:"https://api.ap2.tray.io",broker:"https://api.ap2.tray.io/private/v1/code",ingest:"https://api.ap2.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap2.tray.io",app:"https://app.ap2.tray.io",projectHost:"ap2.helix-app.ai",dashboard:"https://app.helix.ap2.tray.ai",auth:"https://auth.ap2.tray.io"},login:{storePrefix:"AP2",appUrl:"https://app.ap2.tray.io",cookieName:"prod_tray_lid_ap2",cookieDomain:"tray.io"}};o.set(v.name,v);o.set(x.name,x);o.set(E.name,E);o.set(w.name,w);var D=["api","broker","ingest","weaver","app","projectHost","dashboard"],A=["auth"],U=["storePrefix","appUrl","cookieName","cookieDomain"];function j(e){if(!e.name||typeof e.name!="string")throw new Error("RegionProfile.name must be a non-empty string");if(!e.exposedName||typeof e.exposedName!="string")throw new Error("RegionProfile.exposedName must be a non-empty string");if(!e.displayName||typeof e.displayName!="string")throw new Error("RegionProfile.displayName must be a non-empty string");if(!e.hosts||typeof e.hosts!="object")throw new Error("RegionProfile.hosts must be an object");if(!e.login||typeof e.login!="object")throw new Error("RegionProfile.login must be an object");for(let r of D)if(typeof e.hosts[r]!="string"||!e.hosts[r])throw new Error(`RegionProfile.hosts.${r} must be a non-empty string`);for(let r of A){let t=e.hosts[r];if(t!==void 0&&(typeof t!="string"||!t))throw new Error(`RegionProfile.hosts.${r} must be a non-empty string when set`)}for(let r of U)if(typeof e.login[r]!="string"||!e.login[r])throw new Error(`RegionProfile.login.${r} must be a non-empty string`)}function H(e,r){return e.name===r.name&&e.exposedName===r.exposedName&&e.displayName===r.displayName&&D.every(t=>e.hosts[t]===r.hosts[t])&&A.every(t=>e.hosts[t]===r.hosts[t])&&U.every(t=>e.login[t]===r.login[t])}function oe(e){j(e);let r=o.get(e.name);if(r){if(H(r,e))return;throw new Error(`RegionProfile.name "${e.name}" is already registered with different values`)}for(let t of o.values())if(t.exposedName===e.exposedName)throw new Error(`RegionProfile.exposedName "${e.exposedName}" is already used by "${t.name}"`);o.set(e.name,e)}function F(e){return o.has(e)}function se(e){return o.get(e)}function _(e){let r=o.get(e);if(!r)throw new Error(`Unknown region: ${e}`);return r}function ae(){return[...o.keys()]}function de(){return[...o.values()].map(e=>e.exposedName)}function B(e){for(let r of o.values())if(r.exposedName===e)return r.name}var m=Symbol.for("@trayai/helix-sdk.forcedEnvironment");function L(e){let r=globalThis;if(e===void 0||e.trim()===""){delete r[m];return}let t=e.trim(),n=B(t);if(n){r[m]=n;return}if(F(t)){r[m]=t;return}throw new Error(`Unknown region: ${t}`)}function le(){return globalThis[m]}function ue(){return[...o.values()].filter(e=>!C.has(e.name))}function ce(){L(void 0),o.clear();for(let e of[v,x,E,w])o.set(e.name,{...e,hosts:{...e.hosts},login:{...e.login}})}var u=class e extends Error{detail;constructor(r){super(J(r)),this.name="SdkError",this.detail=r}get kind(){return this.detail.kind}static unknownAlias(r,t){return new e({kind:"unknown_alias",alias:r,available:t})}static inputValidationFailed(r){return new e({kind:"input_validation_failed",fields:r})}static outputValidationFailed(r){return new e({kind:"output_validation_failed",fields:r})}static configLoadFailed(r){return new e({kind:"config_load_failed",cause:r})}static brokerError(r,t,n,i){return new e({kind:"broker_error",status:r,message:t,body:n,code:i})}static unsupportedBodyType(r){return new e({kind:"unsupported_body_type",actualType:r})}static unsupportedScheme(r){return new e({kind:"unsupported_scheme",scheme:r})}static missingExecutionCredentials(){return new e({kind:"missing_execution_credentials"})}static missingTrayToken(){return new e({kind:"missing_tray_token"})}static dbCallFailed(r,t){return new e({kind:"db_call_failed",message:r,cause:t})}static dbQueryFailed(r){return new e({kind:"db_query_failed",message:r})}static dbInvalidParameters(r){return new e({kind:"db_invalid_parameters",message:r})}static kvKeyInvalid(r){return new e({kind:"kv_key_invalid",message:r})}static kvValueInvalid(r){return new e({kind:"kv_value_invalid",message:r})}static kvValueTooLarge(r,t){return new e({kind:"kv_value_too_large",message:r,maxBytes:t})}static kvTtlInvalid(r){return new e({kind:"kv_ttl_invalid",message:r})}static kvNotAvailable(){return new e({kind:"kv_not_available"})}static kvCallFailed(r,t,n){return new e({kind:"kv_call_failed",status:r,message:t,body:n})}static kvRequiresProvisioning(){return new e({kind:"kv_requires_provisioning"})}static filesPathInvalid(r){return new e({kind:"files_path_invalid",message:r})}static filesValueInvalid(r){return new e({kind:"files_value_invalid",message:r})}static filesValueTooLarge(r,t){return new e({kind:"files_value_too_large",message:r,maxBytes:t})}static filesNotAvailable(){return new e({kind:"files_not_available"})}static filesCallFailed(r,t,n){return new e({kind:"files_call_failed",status:r,message:t,body:n})}static filesRequiresProvisioning(){return new e({kind:"files_requires_provisioning"})}static callFunctionPathInvalid(r){return new e({kind:"call_function_path_invalid",message:r})}static callFunctionCallFailed(r,t,n){return new e({kind:"call_function_call_failed",status:r,message:t,body:n})}static callFunctionRequiresProvisioning(){return new e({kind:"call_function_requires_provisioning"})}static callFunctionNotAvailable(){return new e({kind:"call_function_not_available"})}static callFunctionMissingExecutionJwt(){return new e({kind:"call_function_missing_execution_jwt"})}static aiUnsupportedService(r,t,n){return new e({kind:"ai_unsupported_service",alias:r,service:t,supported:n})}static aiModelIdRequired(r,t){return new e({kind:"ai_model_id_required",alias:r,operation:t})}static aiModelInstanceRequired(r){return new e({kind:"ai_model_instance_required",modelId:r})}static aiProviderNotConfigured(r,t){return new e({kind:"ai_provider_not_configured",alias:r,supported:t})}static aiForeignModelRejected(){return new e({kind:"ai_foreign_model_rejected"})}};function ge(e){return e instanceof u}function J(e){switch(e.kind){case"unknown_alias":return`Unknown auth alias "${e.alias}". Available: ${e.available.join(", ")||"(none)"}`;case"input_validation_failed":return`Input validation failed for fields: ${e.fields.join(", ")}`;case"output_validation_failed":return`Output validation failed for fields: ${e.fields.join(", ")}`;case"config_load_failed":return`Config load failed: ${e.cause}`;case"broker_error":return e.code?`broker error: ${e.status} ${e.code}: ${e.message}`:`broker error: ${e.status} ${e.message}`;case"unsupported_body_type":return`unsupported body type: ${e.actualType}`;case"unsupported_scheme":return`unsupported scheme: ${e.scheme} (only https supported)`;case"missing_execution_credentials":return"missing execution credentials: at least one of internalJwt / helixExecutionJwt must be set before an authed broker/KV call";case"missing_tray_token":return"Not logged in. Run `helix login` to authenticate before making authed HTTP calls in dev.";case"db_call_failed":return`Database call failed: ${e.message}`;case"db_query_failed":return`Database query failed: ${e.message}`;case"db_invalid_parameters":return`Invalid database parameters: ${e.message}`;case"kv_key_invalid":return`Invalid KV key: ${e.message}`;case"kv_value_invalid":return e.message;case"kv_value_too_large":return e.message;case"kv_ttl_invalid":return e.message;case"kv_not_available":return"Key-value store is not available in this environment";case"kv_call_failed":return`KV platform error: ${e.status} ${e.message}`;case"kv_requires_provisioning":return"Key-value store requires a provisioned project (run helix project set)";case"files_path_invalid":return`Invalid file path: ${e.message}`;case"files_value_invalid":return e.message;case"files_value_too_large":return e.message;case"files_not_available":return"File storage is not available in this environment";case"files_call_failed":return`Files platform error: ${e.status} ${e.message}`;case"files_requires_provisioning":return"File storage requires a provisioned project (run helix project set)";case"call_function_path_invalid":return`Invalid function path: ${e.message}`;case"call_function_call_failed":return`Async function call failed: ${e.status} ${e.message}`;case"call_function_requires_provisioning":return"callFunctionAsync requires a provisioned project (run helix project set)";case"call_function_not_available":return"callFunctionAsync is not available: no running dev server was found";case"call_function_missing_execution_jwt":return"ctx.callFunctionAsync requires a helix project-execution JWT \u2014 a legacy internalJwt-only execution cannot call it";case"ai_unsupported_service":return`Authentication alias "${e.alias}" resolves to service "${e.service}", which ctx.ai does not support. Supported AI services: ${e.supported.join(", ")}`;case"ai_model_id_required":return`ctx.ai("${e.alias}").${e.operation} requires \`model\` as a string model id. To pass a model instance, use the top-level ctx.ai.${e.operation} instead.`;case"ai_model_instance_required":return`ctx.ai.* call functions require a model instance from ctx.ai(alias), got the string "${e.modelId}". Bare model ids would route outside the credentials broker and are not supported.`;case"ai_provider_not_configured":return`No AI provider configured for authentication alias "${e.alias}". Add \`aiProviders: { "${e.alias}": "<service>" }\` to helix.config.ts (supported services: ${e.supported.join(", ")}; openai-compatible needs the object form with baseUrl).`;case"ai_foreign_model_rejected":return"ctx.ai.* call functions require a model instance minted by ctx.ai(alias). A model built directly against a raw @ai-sdk/* provider carries its own transport and credentials, and would bypass the credentials broker, proxy policy, and metering."}}import{z as g}from"zod";var q="x-helix-destination-url",O="x-helix-authentication-id",M="x-helix-deployment-id",y="x-execution-id",K="x-helix-broker-error",he="route_not_found",V=new Set([q,O,M,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id",y]);function G(e){let r=e.toLowerCase();return V.has(r)||r.startsWith("x-tray-internal-")}var b=g.object({error:g.object({code:g.string(),message:g.string(),issues:g.array(g.unknown()).optional()})});function ve(e,r){let t=`${_(e).hosts.api}/private/v1/helix/broker/http/raw`;return r==="dev"?`${t}/dev`:t}function xe(e){if(e.mode==="lambda"){let t=I(),n=T(),i=!!(t&&t.trim().length>0),a=!!(n&&n.trim().length>0);if(!i&&!a)throw u.missingExecutionCredentials();let l={};return i&&(l[P]=t),a&&(l[S]=n),{headers:l,deploymentId:e.deploymentId??null}}let r=N();if(!r)throw u.missingTrayToken();return{headers:{Authorization:`Bearer ${r}`},deploymentId:null}}function X(e){return typeof e=="string"||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob||typeof FormData<"u"&&e instanceof FormData||e instanceof URLSearchParams||typeof ReadableStream<"u"&&e instanceof ReadableStream}function Ee(e){let r=new URL(e.url);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""));if(e.query!==void 0)if(e.query instanceof URLSearchParams)for(let[d,s]of e.query.entries())r.searchParams.append(d,s);else for(let[d,s]of Object.entries(e.query))for(let f of Array.isArray(s)?s:[s])r.searchParams.append(d,f);let t;e.headers===void 0?t=[]:e.headers instanceof Headers?t=Array.from(e.headers.entries()):Array.isArray(e.headers)?t=e.headers:t=Object.entries(e.headers);let n=t.filter(([d])=>!G(d)),i=e.body!==void 0&&e.body!==null,a,l,c=!1;return i&&(X(e.body)?(a=e.body,c=typeof ReadableStream<"u"&&e.body instanceof ReadableStream):(a=JSON.stringify(e.body),n.some(([s])=>s.toLowerCase()==="content-type")||(l="application/json"))),{authenticationId:e.authenticationId,method:e.method.toUpperCase(),destinationUrl:r.toString(),headers:n,body:a,isStreamBody:c,defaultContentType:l}}var Y=6e4;function z(e){return e.includes("json")}function W(e){return e.startsWith("text/")||e.includes("xml")||e.includes("urlencoded")||e.includes("javascript")||e.includes("ecmascript")}function Q(e,r){if(e.byteLength===0)return;let t=r.toLowerCase();if(z(t)){let n=new TextDecoder("utf-8").decode(e);try{return JSON.parse(n)}catch{return n}}return W(t)?new TextDecoder("utf-8").decode(e):e}function Z(e){let r={};for(let[t,n]of e.entries())r[t.toLowerCase()]=n;return r}async function we(e){let{request:r}=e,t=new Headers;for(let[d,s]of r.headers)t.append(d,s);r.defaultContentType&&!t.has("content-type")&&t.set("content-type",r.defaultContentType),t.set(q,r.destinationUrl),t.set(O,r.authenticationId);for(let[d,s]of Object.entries(e.credentialHeaders))t.set(d,s);e.executionId&&t.set(y,e.executionId);let n={method:r.method,headers:t,redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??Y)};r.body!==void 0&&(n.body=r.body,r.isStreamBody&&(n.duplex="half"));let i=await fetch(e.proxyUrl,n),a=i.headers.get(K);if(a!==null){let d=await i.text(),s=d,f=d||a;try{s=JSON.parse(d);let R=b.safeParse(s);R.success&&(f=R.data.error.message)}catch{}return{kind:"brokerError",status:i.status,code:a,message:f,body:s}}let l=new Uint8Array(await i.arrayBuffer()),c=i.headers.get("content-type")??"";return{kind:"upstream",response:{status:i.status,headers:Z(i.headers),body:Q(l,c)}}}import{z as k}from"zod";var ee=3e4;function Te(e){let r=new URL(e);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""))}function Ne(e,r){let t=`${_(e).hosts.api}/private/v1/helix/broker/s3/sign`;return r==="dev"?`${t}/dev`:t}var re=k.object({url:k.string(),method:k.string(),expiresAt:k.string()});async function De(e){let r=new Headers({"content-type":"application/json"});for(let[l,c]of Object.entries(e.credentialHeaders))r.set(l,c);e.executionId&&r.set(y,e.executionId);let t=await fetch(e.signUrl,{method:"POST",headers:r,body:JSON.stringify(e.body),redirect:"manual",signal:AbortSignal.timeout(e.timeoutMs??ee)}),n=await t.text(),i=n;try{i=JSON.parse(n)}catch{}if(t.ok){let l=re.safeParse(i);return l.success?{kind:"signed",result:l.data}:{kind:"brokerError",status:t.status,message:"malformed s3-sign response from credential broker",body:i}}let a=b.safeParse(i);return a.success?{kind:"brokerError",status:t.status,code:a.data.error.code,message:a.data.error.message,body:i}:{kind:"brokerError",status:t.status,message:n||`s3-sign request failed with status ${t.status}`,body:i}}export{S as a,P as b,te as c,ne as d,I as e,T as f,oe as g,F as h,se as i,_ as j,ae as k,de as l,B as m,L as n,le as o,ue as p,ce as q,u as r,ge as s,q as t,O as u,M as v,y as w,K as x,he as y,G as z,b as A,ve as B,xe as C,Ee as D,Y as E,we as F,Te as G,Ne as H,De as I};
|