@trayai/helix-sdk 1.4.0 → 1.6.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 +14 -0
- package/README.md +33 -0
- package/dist/broker/index.d.ts +73 -2
- 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-HCGX7VQE.js +0 -1
- package/dist/chunk-UKKHDA5X.js +0 -7
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-HCGX7VQE.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var b="X-Helix-Project-Execution-Token",R="X-Tray-Token",O={mode:"dev",deploymentId:null},k={...O},p={};function te(e){let{internalJwt:r,helixExecutionJwt:t,devToken:n,...i}=e;"internalJwt"in e&&(p.internalJwt=r),"helixExecutionJwt"in e&&(p.helixExecutionJwt=t),"devToken"in e&&(p.devToken=n),k={...k,...i}}function ne(){return k}function S(){return p.internalJwt}function P(){return p.helixExecutionJwt}function I(){return p.devToken}var $=new Set(["us1","eu1","ap1","ap2"]),s=new Map,h={name:"us1",exposedName:"us1",displayName:"us1",hosts:{api:"https://api.tray.io",broker:"https://api.tray.io/private/v1/code",ingest:"https://api.tray.io/private/v1/helix/otlp",weaver:"https://weaver.tray.io",app:"https://app.tray.io",projectHost:"helix-app.ai",dashboard:"https://app.helix.tray.ai",auth:"https://auth.tray.io"},login:{storePrefix:"PROD",appUrl:"https://app.tray.io",cookieName:"prod_tray_lid",cookieDomain:"tray.io"}},v={name:"eu1",exposedName:"eu1",displayName:"eu1",hosts:{api:"https://api.eu1.tray.io",broker:"https://api.eu1.tray.io/private/v1/code",ingest:"https://api.eu1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.eu1.tray.io",app:"https://app.eu1.tray.io",projectHost:"eu1.helix-app.ai",dashboard:"https://app.helix.eu1.tray.ai",auth:"https://auth.eu1.tray.io"},login:{storePrefix:"EU1",appUrl:"https://app.eu1.tray.io",cookieName:"prod_tray_lid_eu",cookieDomain:"tray.io"}},x={name:"ap1",exposedName:"ap1",displayName:"ap1",hosts:{api:"https://api.ap1.tray.io",broker:"https://api.ap1.tray.io/private/v1/code",ingest:"https://api.ap1.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap1.tray.io",app:"https://app.ap1.tray.io",projectHost:"ap1.helix-app.ai",dashboard:"https://app.helix.ap1.tray.ai",auth:"https://auth.ap1.tray.io"},login:{storePrefix:"AP1",appUrl:"https://app.ap1.tray.io",cookieName:"prod_tray_lid_ap",cookieDomain:"tray.io"}},E={name:"ap2",exposedName:"ap2",displayName:"ap2",hosts:{api:"https://api.ap2.tray.io",broker:"https://api.ap2.tray.io/private/v1/code",ingest:"https://api.ap2.tray.io/private/v1/helix/otlp",weaver:"https://weaver.ap2.tray.io",app:"https://app.ap2.tray.io",projectHost:"ap2.helix-app.ai",dashboard:"https://app.helix.ap2.tray.ai",auth:"https://auth.ap2.tray.io"},login:{storePrefix:"AP2",appUrl:"https://app.ap2.tray.io",cookieName:"prod_tray_lid_ap2",cookieDomain:"tray.io"}};s.set(h.name,h);s.set(v.name,v);s.set(x.name,x);s.set(E.name,E);var T=["api","broker","ingest","weaver","app","projectHost","dashboard"],N=["auth"],D=["storePrefix","appUrl","cookieName","cookieDomain"];function C(e){if(!e.name||typeof e.name!="string")throw new Error("RegionProfile.name must be a non-empty string");if(!e.exposedName||typeof e.exposedName!="string")throw new Error("RegionProfile.exposedName must be a non-empty string");if(!e.displayName||typeof e.displayName!="string")throw new Error("RegionProfile.displayName must be a non-empty string");if(!e.hosts||typeof e.hosts!="object")throw new Error("RegionProfile.hosts must be an object");if(!e.login||typeof e.login!="object")throw new Error("RegionProfile.login must be an object");for(let r of T)if(typeof e.hosts[r]!="string"||!e.hosts[r])throw new Error(`RegionProfile.hosts.${r} must be a non-empty string`);for(let r of N){let t=e.hosts[r];if(t!==void 0&&(typeof t!="string"||!t))throw new Error(`RegionProfile.hosts.${r} must be a non-empty string when set`)}for(let r of D)if(typeof e.login[r]!="string"||!e.login[r])throw new Error(`RegionProfile.login.${r} must be a non-empty string`)}function j(e,r){return e.name===r.name&&e.exposedName===r.exposedName&&e.displayName===r.displayName&&T.every(t=>e.hosts[t]===r.hosts[t])&&N.every(t=>e.hosts[t]===r.hosts[t])&&D.every(t=>e.login[t]===r.login[t])}function oe(e){C(e);let r=s.get(e.name);if(r){if(j(r,e))return;throw new Error(`RegionProfile.name "${e.name}" is already registered with different values`)}for(let t of s.values())if(t.exposedName===e.exposedName)throw new Error(`RegionProfile.exposedName "${e.exposedName}" is already used by "${t.name}"`);s.set(e.name,e)}function H(e){return s.has(e)}function se(e){return s.get(e)}function m(e){let r=s.get(e);if(!r)throw new Error(`Unknown region: ${e}`);return r}function ae(){return[...s.keys()]}function de(){return[...s.values()].map(e=>e.exposedName)}function F(e){for(let r of s.values())if(r.exposedName===e)return r.name}var f=Symbol.for("@trayai/helix-sdk.forcedEnvironment");function B(e){let r=globalThis;if(e===void 0||e.trim()===""){delete r[f];return}let t=e.trim(),n=F(t);if(n){r[f]=n;return}if(H(t)){r[f]=t;return}throw new Error(`Unknown region: ${t}`)}function le(){return globalThis[f]}function ue(){return[...s.values()].filter(e=>!$.has(e.name))}function ce(){B(void 0),s.clear();for(let e of[h,v,x,E])s.set(e.name,{...e,hosts:{...e.hosts},login:{...e.login}})}var u=class e extends Error{detail;constructor(r){super(L(r)),this.name="SdkError",this.detail=r}get kind(){return this.detail.kind}static unknownAlias(r,t){return new e({kind:"unknown_alias",alias:r,available:t})}static inputValidationFailed(r){return new e({kind:"input_validation_failed",fields:r})}static outputValidationFailed(r){return new e({kind:"output_validation_failed",fields:r})}static configLoadFailed(r){return new e({kind:"config_load_failed",cause:r})}static brokerError(r,t,n,i){return new e({kind:"broker_error",status:r,message:t,body:n,code:i})}static unsupportedBodyType(r){return new e({kind:"unsupported_body_type",actualType:r})}static unsupportedScheme(r){return new e({kind:"unsupported_scheme",scheme:r})}static missingExecutionCredentials(){return new e({kind:"missing_execution_credentials"})}static missingTrayToken(){return new e({kind:"missing_tray_token"})}static dbCallFailed(r,t){return new e({kind:"db_call_failed",message:r,cause:t})}static dbQueryFailed(r){return new e({kind:"db_query_failed",message:r})}static dbInvalidParameters(r){return new e({kind:"db_invalid_parameters",message:r})}static kvKeyInvalid(r){return new e({kind:"kv_key_invalid",message:r})}static kvValueInvalid(r){return new e({kind:"kv_value_invalid",message:r})}static kvValueTooLarge(r,t){return new e({kind:"kv_value_too_large",message:r,maxBytes:t})}static kvTtlInvalid(r){return new e({kind:"kv_ttl_invalid",message:r})}static kvNotAvailable(){return new e({kind:"kv_not_available"})}static kvCallFailed(r,t,n){return new e({kind:"kv_call_failed",status:r,message:t,body:n})}static kvRequiresProvisioning(){return new e({kind:"kv_requires_provisioning"})}static filesPathInvalid(r){return new e({kind:"files_path_invalid",message:r})}static filesValueInvalid(r){return new e({kind:"files_value_invalid",message:r})}static filesValueTooLarge(r,t){return new e({kind:"files_value_too_large",message:r,maxBytes:t})}static filesNotAvailable(){return new e({kind:"files_not_available"})}static filesCallFailed(r,t,n){return new e({kind:"files_call_failed",status:r,message:t,body:n})}static filesRequiresProvisioning(){return new e({kind:"files_requires_provisioning"})}static callFunctionPathInvalid(r){return new e({kind:"call_function_path_invalid",message:r})}static callFunctionCallFailed(r,t,n){return new e({kind:"call_function_call_failed",status:r,message:t,body:n})}static callFunctionRequiresProvisioning(){return new e({kind:"call_function_requires_provisioning"})}static callFunctionNotAvailable(){return new e({kind:"call_function_not_available"})}static callFunctionMissingExecutionJwt(){return new e({kind:"call_function_missing_execution_jwt"})}static aiUnsupportedService(r,t,n){return new e({kind:"ai_unsupported_service",alias:r,service:t,supported:n})}static aiModelIdRequired(r,t){return new e({kind:"ai_model_id_required",alias:r,operation:t})}static aiModelInstanceRequired(r){return new e({kind:"ai_model_instance_required",modelId:r})}static aiProviderNotConfigured(r,t){return new e({kind:"ai_provider_not_configured",alias:r,supported:t})}static aiForeignModelRejected(){return new e({kind:"ai_foreign_model_rejected"})}};function ge(e){return e instanceof u}function L(e){switch(e.kind){case"unknown_alias":return`Unknown auth alias "${e.alias}". Available: ${e.available.join(", ")||"(none)"}`;case"input_validation_failed":return`Input validation failed for fields: ${e.fields.join(", ")}`;case"output_validation_failed":return`Output validation failed for fields: ${e.fields.join(", ")}`;case"config_load_failed":return`Config load failed: ${e.cause}`;case"broker_error":return e.code?`broker error: ${e.status} ${e.code}: ${e.message}`:`broker error: ${e.status} ${e.message}`;case"unsupported_body_type":return`unsupported body type: ${e.actualType}`;case"unsupported_scheme":return`unsupported scheme: ${e.scheme} (only https supported)`;case"missing_execution_credentials":return"missing execution credentials: at least one of internalJwt / helixExecutionJwt must be set before an authed broker/KV call";case"missing_tray_token":return"Not logged in. Run `helix login` to authenticate before making authed HTTP calls in dev.";case"db_call_failed":return`Database call failed: ${e.message}`;case"db_query_failed":return`Database query failed: ${e.message}`;case"db_invalid_parameters":return`Invalid database parameters: ${e.message}`;case"kv_key_invalid":return`Invalid KV key: ${e.message}`;case"kv_value_invalid":return e.message;case"kv_value_too_large":return e.message;case"kv_ttl_invalid":return e.message;case"kv_not_available":return"Key-value store is not available in this environment";case"kv_call_failed":return`KV platform error: ${e.status} ${e.message}`;case"kv_requires_provisioning":return"Key-value store requires a provisioned project (run helix project set)";case"files_path_invalid":return`Invalid file path: ${e.message}`;case"files_value_invalid":return e.message;case"files_value_too_large":return e.message;case"files_not_available":return"File storage is not available in this environment";case"files_call_failed":return`Files platform error: ${e.status} ${e.message}`;case"files_requires_provisioning":return"File storage requires a provisioned project (run helix project set)";case"call_function_path_invalid":return`Invalid function path: ${e.message}`;case"call_function_call_failed":return`Async function call failed: ${e.status} ${e.message}`;case"call_function_requires_provisioning":return"callFunctionAsync requires a provisioned project (run helix project set)";case"call_function_not_available":return"callFunctionAsync is not available: no running dev server was found";case"call_function_missing_execution_jwt":return"ctx.callFunctionAsync requires a helix project-execution JWT \u2014 a legacy internalJwt-only execution cannot call it";case"ai_unsupported_service":return`Authentication alias "${e.alias}" resolves to service "${e.service}", which ctx.ai does not support. Supported AI services: ${e.supported.join(", ")}`;case"ai_model_id_required":return`ctx.ai("${e.alias}").${e.operation} requires \`model\` as a string model id. To pass a model instance, use the top-level ctx.ai.${e.operation} instead.`;case"ai_model_instance_required":return`ctx.ai.* call functions require a model instance from ctx.ai(alias), got the string "${e.modelId}". Bare model ids would route outside the credentials broker and are not supported.`;case"ai_provider_not_configured":return`No AI provider configured for authentication alias "${e.alias}". Add \`aiProviders: { "${e.alias}": "<service>" }\` to helix.config.ts (supported services: ${e.supported.join(", ")}; 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 A="x-helix-destination-url",U="x-helix-authentication-id",J="x-helix-deployment-id",y="x-execution-id",M="x-helix-broker-error",he="route_not_found",K=new Set([A,U,J,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id",y]);function V(e){let r=e.toLowerCase();return K.has(r)||r.startsWith("x-tray-internal-")}var w=g.object({error:g.object({code:g.string(),message:g.string(),issues:g.array(g.unknown()).optional()})});function ve(e,r){let t=`${m(e).hosts.api}/private/v1/helix/broker/http/raw`;return r==="dev"?`${t}/dev`:t}function xe(e){if(e.mode==="lambda"){let t=S(),n=P(),i=!!(t&&t.trim().length>0),o=!!(n&&n.trim().length>0);if(!i&&!o)throw u.missingExecutionCredentials();let a={};return i&&(a[R]=t),o&&(a[b]=n),{headers:a,deploymentId:e.deploymentId??null}}let r=I();if(!r)throw u.missingTrayToken();return{headers:{Authorization:`Bearer ${r}`},deploymentId:null}}function G(e){return typeof e=="string"||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob||typeof FormData<"u"&&e instanceof FormData||e instanceof URLSearchParams||typeof ReadableStream<"u"&&e instanceof ReadableStream}function Ee(e){let r=new URL(e.url);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""));if(e.query!==void 0)if(e.query instanceof URLSearchParams)for(let[l,d]of e.query.entries())r.searchParams.append(l,d);else for(let[l,d]of Object.entries(e.query))for(let q of Array.isArray(d)?d:[d])r.searchParams.append(l,q);let t;e.headers===void 0?t=[]:e.headers instanceof Headers?t=Array.from(e.headers.entries()):Array.isArray(e.headers)?t=e.headers:t=Object.entries(e.headers);let n=t.filter(([l])=>!V(l)),i=e.body!==void 0&&e.body!==null,o,a,c=!1;return i&&(G(e.body)?(o=e.body,c=typeof ReadableStream<"u"&&e.body instanceof ReadableStream):(o=JSON.stringify(e.body),n.some(([d])=>d.toLowerCase()==="content-type")||(a="application/json"))),{authenticationId:e.authenticationId,method:e.method.toUpperCase(),destinationUrl:r.toString(),headers:n,body:o,isStreamBody:c,defaultContentType:a}}async function X(e,r){let t=await e.text(),n=t,i=t||r;try{n=JSON.parse(t);let o=w.safeParse(n);o.success&&(i=o.data.error.message)}catch{}return{status:e.status,code:r,message:i,body:n}}var Y=6e4;function z(e){return e.includes("json")}function W(e){return e.startsWith("text/")||e.includes("xml")||e.includes("urlencoded")||e.includes("javascript")||e.includes("ecmascript")}function Q(e,r){if(e.byteLength===0)return;let t=r.toLowerCase();if(z(t)){let n=new TextDecoder("utf-8").decode(e);try{return JSON.parse(n)}catch{return n}}return W(t)?new TextDecoder("utf-8").decode(e):e}function Z(e){let r={};for(let[t,n]of e.entries())r[t.toLowerCase()]=n;return r}async function we(e){let{request:r}=e,t=new Headers;for(let[l,d]of r.headers)t.append(l,d);r.defaultContentType&&!t.has("content-type")&&t.set("content-type",r.defaultContentType),t.set(A,r.destinationUrl),t.set(U,r.authenticationId);for(let[l,d]of Object.entries(e.credentialHeaders))t.set(l,d);e.executionId&&t.set(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),o=i.headers.get(M);if(o!==null)return{kind:"brokerError",...await X(i,o)};let a=new Uint8Array(await i.arrayBuffer()),c=i.headers.get("content-type")??"";return{kind:"upstream",response:{status:i.status,headers:Z(i.headers),body:Q(a,c)}}}import{z as _}from"zod";var ee=3e4;function Te(e){let r=new URL(e);if(r.protocol!=="https:")throw u.unsupportedScheme(r.protocol.replace(/:$/,""))}function Ne(e,r){let t=`${m(e).hosts.api}/private/v1/helix/broker/s3/sign`;return r==="dev"?`${t}/dev`:t}var re=_.object({url:_.string(),method:_.string(),expiresAt:_.string()});async function De(e){let r=new Headers({"content-type":"application/json"});for(let[a,c]of Object.entries(e.credentialHeaders))r.set(a,c);e.executionId&&r.set(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 a=re.safeParse(i);return a.success?{kind:"signed",result:a.data}:{kind:"brokerError",status:t.status,message:"malformed s3-sign response from credential broker",body:i}}let o=w.safeParse(i);return o.success?{kind:"brokerError",status:t.status,code:o.data.error.code,message:o.data.error.message,body:i}:{kind:"brokerError",status:t.status,message:n||`s3-sign request failed with status ${t.status}`,body:i}}export{b as a,R as b,te as c,ne as d,S as e,P as f,oe as g,H as h,se as i,m as j,ae as k,de as l,F as m,B as n,le as o,ue as p,ce as q,u as r,ge as s,A as t,U as u,J as v,y as w,M as x,he as y,V as z,w as A,ve as B,xe as C,Ee as D,X as E,Y as F,we as G,Te as H,Ne as I,De as J};
|
package/dist/chunk-UKKHDA5X.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{A as Pt,B as q,C as F,D as ie,E as Tt,G as kt,H as Ot,I as _t,J as Dt,a as O,b as Ee,d as h,e as ve,f as _,h as Rt,j as D,k as It,o as Ct,r as c,t as ne,u as Re,v as B,w as oe,x as Ie,y as V,z as At}from"./chunk-HCGX7VQE.js";var os="tray-config-bridge",is="tray-dev-token-bridge",Ce=null;function ss(e){Ce=e}function x(){if(!Ce)throw new Error("Active tray config not seeded. Worker boot must call setActiveConfig() before handlers run.");return Ce}function as(){Ce=null}import{AsyncLocalStorage as Zt}from"async_hooks";import{trace as Hn,SpanKind as Kn,SpanStatusCode as Ze}from"@opentelemetry/api";import{ExportResultCode as Vn,W3CTraceContextPropagator as qn}from"@opentelemetry/core";import{NodeTracerProvider as zn,SimpleSpanProcessor as Yn,BatchSpanProcessor as Jn}from"@opentelemetry/sdk-trace-node";import{OTLPTraceExporter as Tn}from"@opentelemetry/exporter-trace-otlp-proto";import{OTLPLogExporter as kn}from"@opentelemetry/exporter-logs-otlp-proto";function Xe(e){return D(e).hosts.ingest}function On(){return _()??""}function Ft(){return{[O]:On()}}function Lt(){let e=Xe(x().region);return new Tn({url:`${e}/v1/traces`,headers:()=>Promise.resolve(Ft())})}function Ut(){let e=Xe(x().region);return new kn({url:`${e}/v1/logs`,headers:()=>Promise.resolve(Ft())})}import{logs as jt,SeverityNumber as Ae}from"@opentelemetry/api-logs";import{LoggerProvider as Fn,BatchLogRecordProcessor as Ln}from"@opentelemetry/sdk-logs";function se(e){try{return JSON.stringify(e)}catch(t){return JSON.stringify({_serialization_error:t instanceof Error?t.message:String(t)})}}function _n(e){return new TextEncoder().encode(e).length}var Mt="\u2026[truncated]",Dn=_n(Mt),ae=4096;function $(e,t=ae){let r=new TextEncoder().encode(e);if(r.length<=t)return e;let n=r.subarray(0,t-Dn);return new TextDecoder("utf-8").decode(n).replace(/�$/,"")+Mt}function S(e,t=ae){return $(se(e),t)}var Un="@trayai/helix-sdk",ce,Nt={debug:{number:Ae.DEBUG,text:"DEBUG"},info:{number:Ae.INFO,text:"INFO"},warn:{number:Ae.WARN,text:"WARN"},error:{number:Ae.ERROR,text:"ERROR"}};function Mn(){return h().mode==="lambda"?[new Ln({exporter:Ut()})]:[]}function Bt(){if(ce!==void 0)return;let e=Mn();e.length!==0&&(ce=new Fn({processors:e}),jt.setGlobalLoggerProvider(ce))}function Nn(e,t,r){let n=Nt[e]??Nt.info;return{severityNumber:n.number,severityText:n.text,body:t,...r?{attributes:{"tray.log.meta":S(r)}}:{}}}function $t(e,t,r){jt.getLogger(Un).emit(Nn(e,t,r))}async function Ht(e=2e3){if(ce===void 0)return;let t;try{await Promise.race([ce.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 Qe(){let e=process.env.TRAY_PRETTY_LOGS;return e==="1"||e==="true"}function jn(){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 P(e,t){return jn()?`\x1B[${e}m${t}\x1B[0m`:t}var Bn=5,$n={FN:"1;35",INFO:"34",AUTH:"35",API:"36",WARN:"33",ERROR:"31",DEBUG:"90"},Kt="32",Vt="31",Pe="2",qt="1";function Te(e){return P($n[e]??"0",e.padEnd(Bn))}function zt(e,t){return`${Te("FN")} ${P(qt,`${e} ${t}`.trim())}`}function Yt(e,t,r,n){let o=e.toUpperCase(),s=`${n?`${P(Pe,n)} `:""}${Te(o)} ${t}`;return r&&Object.keys(r).length>0&&(s+=` ${P(Pe,se(r))}`),s}function Jt(e){return new Date(e[0]*1e3).toTimeString().slice(0,8)}function Wt(e){return`${Te("AUTH")} ${e}`}function Gt(e,t,r,n,o){let i=r===void 0?"ERR":String(r),s=P(o==="error"?Vt:Kt,i);return`${Te("API")} ${e} ${t} \u2192 ${s} ${P(Pe,`${n}ms`)}`}function Xt(e,t,r){let n=t?Vt:Kt,o=P(n,"\u25CF"),i=P(n,t?"error":"success");return`${o} ${P(qt,e)} ${i} ${P(Pe,`${r}ms`)}`}function z(e){try{process.stdout.write(e+`
|
|
3
|
-
`)}catch{}}var er=new Zt,Wn=new Zt;function v(e){let t=Wn.getStore();t&&(t[e]=!0)}var Gn=/^[0-9a-f]{32}$/;function Xn(e){let t=e.replace(/-/g,"").toLowerCase();return Gn.test(t)?t:null}var Qn={0:"STATUS_CODE_UNSET",1:"STATUS_CODE_OK",2:"STATUS_CODE_ERROR"},Y=new Map;function tr(e,t,r){let n=Y.get(e);n?n[t]=r:Y.set(e,{[t]:r})}function T(e,t,r){e.setAttribute(t,S(r))}var le;function Qt(e){return`${e[0]}${String(e[1]).padStart(9,"0")}`}function Zn(e){return Math.round(e[0]*1e3+e[1]/1e6)}function rr(e){try{process.stdout.write(se(e)+`
|
|
4
|
-
`)}catch{}}var et=class{export(t,r){for(let n of t){let o=n.spanContext().spanId,i=Y.get(o),s={...n.attributes};if(i!==void 0){for(let[u,m]of Object.entries(i))typeof m=="string"?s[u]=$(m):typeof m=="object"&&m!==null?s[u]=S(m):s[u]=m;Y.delete(o)}let a=er.getStore(),l=a?Xn(a):null;rr({_otel:"span",traceId:l??n.spanContext().traceId,spanId:o,parentSpanId:n.parentSpanContext?.spanId??"",name:n.name,kind:n.kind,startTimeUnixNano:Qt(n.startTime),endTimeUnixNano:Qt(n.endTime),attributes:s,status:{code:Qn[n.status.code]??"STATUS_CODE_UNSET",...n.status.message?{message:$(n.status.message)}:{}}})}r({code:Vn.SUCCESS})}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},tt=class{onStart(t,r){}onEnd(t){Y.delete(t.spanContext().spanId)}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},rt=class{onStart(t){let r=t;(r.name==="function"||r.name==="App")&&z(`
|
|
5
|
-
`+zt(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=Y.get(n)?.properties;z(Yt(String(r.level??"info"),String(r.message??""),o,Jt(t.startTime)));break}case"auth":z(Wt(String(r.alias??"")));break;case"externalApi":{let n=typeof r.statusCode=="number"?r.statusCode:void 0;z(Gt(String(r.method??""),String(r.host??""),n,Zn(t.duration),r.status==="error"?"error":"success"));break}}}forceFlush(){return Promise.resolve()}shutdown(){return Promise.resolve()}},nt=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 eo(){let t=[Qe()?new rt:new Yn(new et)];return h().mode==="lambda"&&t.push(new nt(new Jn(Lt()))),t.push(new tt),t}function to(){le===void 0&&(le=new zn({spanProcessors:eo()}),le.register({propagator:new qn}),Bt())}async function ro(e=2e3){let t=[Ht(e)];le!==void 0&&t.push((async()=>{let r;try{await Promise.race([le.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 A=Hn.getTracer("@trayai/helix-sdk");function no({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(),d=Date.now()-i;if(Qe()){z(`
|
|
7
|
-
`+Xt(n,s,d));return}rr({_otel:"summary",executionId:e,deploymentId:t,triggerType:r,routeOrJob:n,status:s?"error":"success",startedAt:o,finishedAt:m,durationMs:d,userId:l,hasError:s||u.hasError,hasAuth:u.hasAuth,hasAi:u.hasAi,hasExternal:u.hasExternal,hasDb:u.hasDb,errorSummary:s&&a!==null?$(a):null})}async function Ls(e,t){let r=e.startMs??Date.now();to();let n=!1,o=null;try{return await er.run(e.executionId,()=>A.startActiveSpan("App",{kind:Kn.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?Ze.ERROR:Ze.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:Ze.ERROR,message:o}),s}finally{i.end()}}))}finally{no({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 ro()}}var ir=1024,L=100*1024*1024,nr=250,oo=3600,io=oo*1e3,or=new TextEncoder,so=/(^|\/)\.\.(\/|$)/,ao=/[?#]/;function co(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=31||r===127)return!0}return!1}function H(e,t=ir){if(e.length===0)throw c.filesPathInvalid("Path must be a non-empty string");ke(e,t)}function ot(e){return e.endsWith("/")?e.slice(0,-1):e}function ke(e,t=ir){if(e.length===0)return;if(so.test(e))throw c.filesPathInvalid("Path contains path traversal segment");if(ao.test(e)||co(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=or.encode(o).length;if(i>nr)throw c.filesPathInvalid(`Path segment exceeds ${nr} UTF-8 bytes (got ${i})`)}let n=or.encode(e).length;if(n<1||n>t)throw c.filesPathInvalid(`Path must be between 1 and ${t} UTF-8 bytes (got ${n})`)}function sr(e){if(e>L)throw c.filesValueTooLarge(`File exceeds maximum size of ${L} bytes (got ${e})`,L)}function J(e){let t=e!==void 0?e*1e3:io;return new Date(Date.now()+t)}import{join as de}from"path";var lo="files",uo="files-meta",fo=1023,mo=1,po=5;function ar(e){let t=Math.max(Buffer.byteLength(Oe(e),"utf8"),Buffer.byteLength(ue(e),"utf8"));return Math.max(0,fo-t-mo-po)}function Oe(e){return de(e,".helix",lo)}function ue(e){return de(e,".helix",uo)}function fe(e,t){return de(Oe(e),...t.split("/"))}function _e(e,t){return de(ue(e),...t.split("/"))+".json"}function De(e,t){return t.length===0?Oe(e):fe(e,t)}function cr(e,t){return t.length===0?ue(e):de(ue(e),...t.split("/"))}import{z as go}from"zod";var Ks=["us1","eu1","ap1","ap2"],it=go.string().refine(e=>Rt(e),e=>({message:`Invalid enum value. Expected ${It().map(t=>`'${t}'`).join(" | ")}, received '${e}'`}));import{resolve as U}from"path";import{existsSync as Fe,realpathSync as lr}from"fs";import{loadConfig as yo}from"c12";import{z as w}from"zod";var dr=w.string().uuid("projectId must be a valid UUID"),fr=w.string().min(1,"workspaceId must be a non-empty string"),me=["openai","anthropic","google","mistral","cohere","openai-compatible"],ho=["openai","anthropic","google","mistral","cohere"],mr=w.union([w.enum(ho),w.object({service:w.enum(me),baseUrl:w.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)"})]),wo=w.object({name:w.string().min(1,"name is required"),projectId:dr.optional(),workspaceId:fr.optional(),region:it.optional(),env:w.literal("production").optional(),authentications:w.record(w.string()).optional().default({}),config:w.record(w.unknown()).optional().default({}),aiProviders:w.record(mr).optional()}).transform(({env:e,region:t,...r})=>({...r,region:t??"us1"})),ur=w.object({name:w.string().min(1,"name is required"),workspaceId:fr.optional(),region:it,authentications:w.record(w.string()),config:w.record(w.unknown()),aiProviders:w.record(mr).optional()}),Qs=w.discriminatedUnion("kind",[ur.extend({kind:w.literal("provisioned"),projectId:dr}),ur.extend({kind:w.literal("unprovisioned")})]),pr=["helix","tray"],gr=["ts","mts","cts","js","mjs","cjs"],yr="HELIX_CONFIG";function st(e){let t=e?.trim();return t||process.env[yr]?.trim()||void 0}function bo(e,t){let r=st(t?.configFile);if(r!==void 0){let n=U(e,r);return Fe(n)?n:void 0}for(let n of pr)for(let o of gr){let i=U(e,`${n}.config.${o}`);if(Fe(i))return i}}function xo(e){for(let t of pr)if(gr.some(r=>Fe(U(e,`${t}.config.${r}`))))return t;return"helix"}function So(e,t){return U(e,t).replace(/\.(?:m|c)?[jt]s$/,"")}function Eo(e,t){let r=st(t?.configFile);return{name:xo(e),cwd:e,...r!==void 0?{configFile:So(e,r)}:{},rcFile:!1,globalRc:!1,packageJson:!1,dotenv:!1,extend:!1}}function vo(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=wo.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=Ct(),l=a!==void 0?{...i,region:a}:i;return n!==void 0?{kind:"provisioned",projectId:n,...l,...s}:{kind:"unprovisioned",...l,...s}}async function Zs(e,t){let r=e??process.cwd(),n=st(t?.configFile),o=n!==void 0?U(r,n):void 0;if(o!==void 0&&!Fe(o)){let a=t?.configFile?.trim()?"":` (from ${yr})`;throw c.configLoadFailed(`Config file not found: ${o}${a}`)}let i;try{i=await yo(Eo(r,t))}catch(a){throw c.configLoadFailed(`Failed to load helix.config.ts: ${a instanceof Error?a.message:String(a)}`)}let s=i._configFile??bo(r,t);if(!s)throw c.configLoadFailed(`helix.config.ts not found at ${U(r,"helix.config.ts")}`);if(o!==void 0&&i._configFile!==void 0){let a=lr(o);if(lr(U(i._configFile))!==a)throw c.configLoadFailed(`Config file conflict: requested ${o} but ${U(i._configFile)} takes extension-resolution precedence \u2014 remove or rename the sibling file`)}return vo(i.config,s)}var Ro="WORKSPACE_ID_REQUIRED";function ea(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:Ro});return e.workspaceId}var hr="helix-schedule",M=class extends Error{constructor(t){super(`defineSchedule: ${t}`),this.name="ScheduleConfigError"}};function ra(e){if(typeof e!="object"||e===null)throw new M("expected a config object");let{cron:t,timezone:r="UTC",concurrent:n=!1,handler:o}=e;if(typeof t!="string"||t.trim()==="")throw new M("`cron` must be a non-empty string");let i=t.trim().split(/\s+/).length;if(i!==5)throw new M(`\`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"||!Io(r))throw new M(`\`timezone\` must be a valid IANA timezone name (e.g. "Europe/London"); got "${String(r)}"`);if(typeof n!="boolean")throw new M("`concurrent` must be a boolean");if(typeof o!="function")throw new M("`handler` must be a function");return Object.freeze({kind:hr,cron:t.trim(),timezone:r,concurrent:n,handler:o})}function na(e){return typeof e=="object"&&e!==null&&e.kind===hr&&typeof e.handler=="function"}function Io(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 Co}from"@opentelemetry/api";function Le(e,t,r){let n=A.startSpan("log",{kind:Co.INTERNAL});n.setAttribute("message",t),n.setAttribute("level",e),r&&tr(n.spanContext().spanId,"properties",r),n.end(),$t(e,t,r)}function wr(){return{info:(e,t)=>Le("info",e,t),warn:(e,t)=>Le("warn",e,t),error:(e,t)=>Le("error",e,t),debug:(e,t)=>Le("debug",e,t)}}function ua(){try{return x().config??{}}catch(e){return console.warn(`[helix-sdk] Config not loaded: ${e instanceof Error?e.message:String(e)}. Using empty config.`),{}}}import Ao from"ky";import{context as ct,trace as Po,SpanKind as ge,SpanStatusCode as xr}from"@opentelemetry/api";function at(e){let t=e.code===V?"credential broker does not support the raw proxy endpoints required by this SDK version \u2014 deploy a newer broker or pin an older SDK":e.message;throw c.brokerError(e.status,t,S(e.body),e.code)}async function Ue(e,t={}){let r=h(),{region:n}=x(),{headers:o,deploymentId:i}=F(r);i&&(o[B]=i);let s=q(n,r.mode==="lambda"?"runtime":"dev"),a;try{a=await kt({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)}return a.kind==="brokerError"&&at(a),a.response}async function br(e){Ot(e.url);let t=h(),{region:r}=x(),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}=F(t);i&&(n.deploymentId=i);let s=_t(r,t.mode==="lambda"?"runtime":"dev"),a;try{a=await Dt({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===V?"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 To=new Set([ne,Re,B,oe,"authorization","x-tray-token","x-helix-project-execution-token","host","content-length","connection","transfer-encoding","te","upgrade","keep-alive","expect","proxy-authorization","proxy-connection","accept-encoding","x-request-id"]);function ko(e){let t=e.toLowerCase();return To.has(t)||t.startsWith("x-tray-internal-")}async function Oo(e,t){let r=e instanceof Request?e:new Request(e,t),n=new URL(r.url);if(n.protocol!=="https:")throw c.unsupportedScheme(n.protocol.replace(/:$/,""));let o=h(),{region:i}=x(),{headers:s,deploymentId:a}=F(o),l=q(i,o.mode==="lambda"?"runtime":"dev"),u=new Headers;for(let[p,b]of r.headers.entries())ko(p)||u.append(p,b);u.set(ne,r.url);for(let[p,b]of Object.entries(s))u.set(p,b);a&&u.set(B,a),o.executionId&&u.set(oe,o.executionId);let m={method:r.method,headers:u,redirect:"manual",signal:r.signal};r.body&&(m.body=r.body,m.duplex="half");let d;try{d=await fetch(l,m)}catch(p){throw p instanceof Error&&p.name==="AbortError"?p:c.brokerError(0,p instanceof Error?p.message:String(p))}let g=d.headers.get(Ie);return g!==null&&at(await Tt(d,g)),d}var _o=["get","post","put","patch","delete","head","options"],Er="[stream body omitted]";function vr(e){return typeof ReadableStream<"u"&&e instanceof ReadableStream?Er: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 lt(e){try{return new URL(e).hostname}catch{return e}}function Sr(e,t,r,n,o){let i=lt(t),s="externalApi",a={kind:ge.CLIENT};return A.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:vr(r)}:{}}),o(l)))}function pe(e,t,r){e.setAttribute("status",t),e.setStatus(t==="success"?{code:xr.OK}:{code:xr.ERROR,message:r}),e.end()}var Do=16;async function Fo(e,t){let r=e.clone().body;return r?Rr(r,t):new Uint8Array(0)}async function Rr(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>=Do)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 Ir(e,t,r){if("kyResponse"in r)try{let n=await Fo(r.kyResponse,ae),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",vr(r.bodyValue))}async function Lo(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 Rr(o,ae);return{body:new TextDecoder("utf-8").decode(s,{stream:!0}),request:i}}catch{return{body:Er}}}return typeof t=="string"?{body:t}:{}}function Ma(){let e=Ao.create({fetch:Oo,retry:{shouldRetry:({error:n})=>n instanceof c?!1:void 0}});function t(n){return(o,i)=>{let s=ct.active(),a,l=!1,u=(d,g)=>{a&&!l&&(l=!0,pe(a,d,g))},m=e.extend({hooks:{beforeRequest:[async(d,g)=>{let p=await Lo(d,g.body),b=p.body;if(a||(a=A.startSpan("externalApi",{kind:ge.CLIENT},s)),a.setAttributes({method:d.method.toUpperCase(),host:lt(d.url)}),T(a,"request",{url:d.url,method:d.method.toUpperCase(),...b!==void 0?{body:b}:{}}),l=!1,v("hasExternal"),p.request)return p.request}],beforeRetry:[d=>{u("error","retry"),a=void 0,l=!1}],afterResponse:[async(d,g,p)=>{a&&(a.setAttribute("statusCode",p.status),await Ir(a,p.status,{kyResponse:p}),p.ok?u("success"):i?.throwHttpErrors===!1&&(v("hasError"),u("error",`HTTP ${p.status}`)))}],beforeError:[d=>(v("hasError"),u("error",d.message),d)]}});return a=A.startSpan("externalApi",{kind:ge.CLIENT},s),a.setAttributes({method:n.toUpperCase(),host:lt(String(o))}),ct.with(Po.setSpan(ct.active(),a),()=>{let d=n==="options"?m(o,{...i,method:"OPTIONS"}):m[n](o,i);return d.catch(g=>{v("hasError"),u("error",g instanceof Error?g.message:String(g))}),d})}}let r=Object.fromEntries(_o.map(n=>[n,t(n)]));return{...e,...r,authed(n){return Uo(n)}}}function Uo(e){let r=x().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 Sr(u,a,l.body,e,async m=>{v("hasAuth");let d=A.startSpan("auth",{kind:ge.INTERNAL});d.setAttribute("alias",e),d.setAttribute("id",n),d.end();try{let g=ie({authenticationId:n,method:u,url:a,body:l.body,headers:l.headers,query:l.query}),p=await Ue(g,{timeout:l.timeout});return m.setAttribute("statusCode",p.status),await Ir(m,p.status,{bodyValue:p.body}),pe(m,"success"),p}catch(g){throw v("hasError"),g instanceof c&&g.detail.kind==="broker_error"&&g.detail.status>0&&m.setAttribute("statusCode",g.detail.status),pe(m,"error",g instanceof Error?g.message:String(g)),g}})}}function i(s,a={}){let l=a.method??"GET";return Sr(l,s,void 0,e,async u=>{v("hasAuth");let m=A.startSpan("auth",{kind:ge.INTERNAL});m.setAttribute("alias",e),m.setAttribute("id",n),m.end();try{let d=await br({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),pe(u,"success"),d}catch(d){throw v("hasError"),d instanceof c&&d.detail.kind==="broker_error"&&d.detail.status>0&&u.setAttribute("statusCode",d.detail.status),pe(u,"error",d instanceof Error?d.message:String(d)),d}})}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 qo,SpanStatusCode as Tr}from"@opentelemetry/api";function ye(e){let t=e.trimStart().match(/^([A-Za-z]+)/);return t?t[1].toUpperCase():"QUERY"}var Mo=18e4,Cr=Mo-1e4,No=2e3;async function Ar(e,t,r){let n=new Set(["FINISHED","FAILED","ABORTED"]),o=Date.now(),i=0;for(;Date.now()-o<Cr;){let s=await e(t,"DescribeStatement",{Id:r}),a=s.Status;if(n.has(a))return s;let l=Math.min(No,200*2**i),u=l/2+Math.random()*(l/2),m=Cr-(Date.now()-o);await new Promise(d=>setTimeout(d,Math.min(u,m))),i++}throw c.dbCallFailed(`statement polling exceeded budget after ${Date.now()-o}ms`)}var jo=new Set(["SELECT","WITH","SHOW"]),Bo=new Set(["INSERT","UPDATE","DELETE","MERGE"]);function $o(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 Ho(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"?$(t):S(t);return c.dbCallFailed(i)}function Ko(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 Vo(e,t){return typeof t!="number"||t<0?{}:jo.has(e)?{rowsRead:t}:Bo.has(e)?{rowsWritten:t}:{}}function Pr(e){async function t(r,n,o){let i=ie({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 Ue(i);if(s>=400)throw Ho(s,a);return Ko(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:$o,async execute(r,n){let o=ye(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 p=S(s);throw c.dbCallFailed(`ExecuteStatement response missing Id; got: ${p}`)}let u=await Ar(t,r.region,l),m=u.Status;if(m==="FAILED"){let p=typeof u.Error=="string"?u.Error:"statement failed";throw c.dbQueryFailed(`${p} (statement: ${l})`)}if(m==="ABORTED")throw c.dbQueryFailed(`statement aborted (statement: ${l})`);let d=Vo(o,u.ResultRows);return u.HasResultSet===!1?{result:{rowsAffected:u.ResultRows??0},metadata:d}:{result:await t(r.region,"GetStatementResult",{Id:l}),metadata:d}}}}var ut=64*1024;function zo(e){return e.length>ut?`${e.slice(0,ut)}...[truncated]`:e}function Yo(e,t,r,n,o){e.setAttributes({system:t.system,statement:o,namespace:r.database,operation:n})}function Jo(e,t,r){let n=typeof t=="string"?t:JSON.stringify(t);return n.length>ut?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 Wo(e,t,r){let n=ye(r),o=zo(r);return A.startActiveSpan("database",{kind:qo.CLIENT},async i=>{Yo(i,e,t,n,o);try{v("hasDb");let{result:s,metadata:a}=await e.execute(t,r),l=Jo(i,s,a);return i.setAttribute("status","success"),i.setStatus({code:Tr.OK}),l}catch(s){v("hasError");let a=s instanceof Error?s.message:String(s);throw i.setAttribute("status","error"),i.setStatus({code:Tr.ERROR,message:a}),s}finally{i.end()}})}function Go(e){let r=x().authentications??{};if(!r[e])throw c.unknownAlias(e,Object.keys(r));let n=r[e],o=Pr(n);function i(s,a){return o.validate(s),Wo(o,s,a)}return{parameters(s){return{sql(a){return i(s,a)}}},sql(s){return i({},s)}}}import{createStorage as ti}from"unstorage";var kr=1024,dt=250*1024,Xo=new TextEncoder,Qo=/(^|\/)\.\.(\/|$)/,Zo=/[?#]/,ei=/[\u0000-\u001F\u007F]/;function Or(e){if(e.length===0)throw c.kvKeyInvalid("Key must be a non-empty string");if(Qo.test(e))throw c.kvKeyInvalid("Key contains path traversal segment");if(Zo.test(e)||ei.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=Xo.encode(e).length;if(t<1||t>kr)throw c.kvKeyInvalid(`Key must be between 1 and ${kr} UTF-8 bytes (got ${t})`)}function _r(e){if(!Number.isInteger(e)||e<=0)throw c.kvTtlInvalid(`ttl must be a positive integer number of seconds (got ${e})`)}function Dr(e){let t;try{t=JSON.stringify(e)}catch{throw c.kvValueInvalid("Value must be JSON-serializable")}if(t===void 0)throw c.kvValueInvalid("Value must be JSON-serializable");let r=Buffer.byteLength(t,"utf8");if(r>dt)throw c.kvValueTooLarge(`Value exceeds maximum size of ${dt} bytes (got ${r})`,dt)}function he(e){Or(e)}function Me(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=Me(e,"getItem"),r=Me(e,"setItem"),n=Me(e,"removeItem"),o=Me(e,"hasItem"),i=e.getKeys;return{...e,getItem(s,a){return he(s),t(s,a)},setItem(s,a,l){return he(s),r(s,a,l)},removeItem(s,a){return he(s),n(s,a)},hasItem(s,a){return he(s),o(s,a)},getKeys(s,a){return s.length>0&&he(s),i(s,a)}}}function Ne(e){return ti({driver:Fr(e)})}import{defineDriver as ri}from"unstorage";function ni(e){try{return JSON.parse(e)}catch{return e}}var oi=ri(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=ni(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 Lr(e){return oi({client:e})}import ai from"ky";import{z as R}from"zod";async function N(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 Ur(e){return D(e).hosts.api}function ii(e){return`/private/v1/helix/projects/${encodeURIComponent(e)}/storage/kv`}function si(e){return e.split("/").map(encodeURIComponent).join("/")}function we(e,t,r){return`${e}${ii(t)}/${si(r)}`}var ci=6e4,ft=R.lazy(()=>R.union([R.string(),R.number(),R.boolean(),R.null(),R.array(ft),R.record(ft)])),li=R.object({projectId:R.string(),key:R.string(),value:ft,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 ui(){let e=ve(),t=_(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[Ee]=e),n&&(o[O]=t),o}function di(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 je(e,t){throw c.kvCallFailed(e,di(t),S(t))}async function Be(e,t,r={}){try{let n=await ai(t,{method:e,headers:ui(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ci}),o=e==="head"?void 0:await N(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 Mr(e){let t=Ur(e.env),{projectId:r}=e;return{async get(n){let{status:o,body:i}=await Be("get",we(t,r,n));if(o===404)return null;(o<200||o>=300)&&je(o,i);let s=li.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 Be("put",we(t,r,n),{json:i?.ttl!==void 0?{value:o,ttl:i.ttl}:{value:o}});(s<200||s>=300)&&je(s,a)},async delete(n){let{status:o,body:i}=await Be("delete",we(t,r,n));o!==204&&je(o,i)},async has(n){let{status:o,body:i}=await Be("head",we(t,r,n));if(o===200)return!0;if(o===404)return!1;je(o,i)}}}function $e(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;Dr(r),typeof o=="number"&&_r(o),await e.setItem(t,r,o!==void 0?{ttl:o}:void 0)}}}function fi(){let e=x();if(e.kind!=="provisioned")throw c.kvRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Nr(e){let t=fi(),r=e??Mr(t),n=Ne(Lr(r));return $e(n)}import{defineDriver as mi}from"unstorage";var pi=mi(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 jr(){return pi({})}var mt;function gi(){return mt||(mt=Ne(jr())),mt}function Br(){return $e(gi())}function yi(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":h().mode==="lambda"}function Hc(){return yi()?Nr():Br()}import{createHash as bi}from"crypto";import{mkdir as xi,readFile as qr,readdir as zr,rm as Hr,unlink as Si,writeFile as Kr}from"fs/promises";import{dirname as Ei}from"path";async function hi(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>L)throw await t.cancel(),c.filesValueTooLarge(`File exceeds maximum size of ${L} bytes (got more than ${L})`,L);r.push(i)}}return Buffer.concat(r)}async function W(e){return Buffer.isBuffer(e)?e:typeof e=="string"?Buffer.from(e,"utf-8"):e instanceof ReadableStream?hi(e):Buffer.from(e)}var wi={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"},$r="application/octet-stream";function He(e){let t=e.lastIndexOf(".");if(t===-1||t===e.length-1)return $r;let r=e.slice(t+1).toLowerCase();return wi[r]??$r}function X(){let e=h().projectRoot;if(!e)throw c.filesNotAvailable();return e}async function G(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 Ke(e,t){return{path:e,size:t.size,contentType:t.contentType,lastModified:new Date(t.lastModified),etag:t.etag}}async function pt(e){try{let t=await qr(_e(X(),e),"utf-8");return JSON.parse(t)}catch(t){if(t.code==="ENOENT")return null;throw t}}async function Vr(e){await xi(Ei(e),{recursive:!0})}async function vi(e,t){let r=De(e,t),n;try{n=await zr(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 Yr(e,t){let r=De(e,t),n;try{n=await zr(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 Yr(e,s)):i.isFile()&&o.push(s)}return o}function Jr(){return{async put(e,t,r){return G(async()=>{let n=X(),o=await W(t),i=r?.contentType??He(e),s=bi("sha1").update(o).digest("hex"),a=new Date,l=fe(n,e);await Vr(l),await Kr(l,o);let u={size:o.byteLength,contentType:i,lastModified:a.toISOString(),etag:s},m=_e(n,e);return await Vr(m),await Kr(m,JSON.stringify(u)),Ke(e,u)})},async get(e){return G(async()=>{let t=await pt(e);return t?{data:await qr(fe(X(),e)),metadata:Ke(e,t)}:null})},async head(e){return G(async()=>{let t=await pt(e);return t?Ke(e,t):null})},async delete(e){return G(async()=>{let t=X();await Promise.all([fe(t,e),_e(t,e)].map(async r=>{try{await Si(r)}catch(n){if(n.code!=="ENOENT")throw n}}))})},async deleteMany(e){return G(async()=>{let t=X(),r=await Yr(t,e);return await Promise.all([Hr(De(t,e),{recursive:!0,force:!0}),Hr(cr(t,e),{recursive:!0,force:!0})]),{deleted:r.length}})},async list(e,t){return G(async()=>{let r=X(),n=t?.limit??100,i=(await vi(r,e??"")).slice(0,n);return{files:(await Promise.all(i.map(async a=>{let l=await pt(a);return l?Ke(a,l):null}))).filter(a=>a!==null),cursor:null}})},async getUploadUrl(e,t){let r=h().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:J(t?.expiresIn)}},async getDownloadUrl(e,t){let r=h().devServerUrl;if(!r)throw c.filesNotAvailable();return{url:`${r}/_helix/files/${e}`,expiresAt:J(t?.expiresIn)}}}}import{createHash as ki}from"crypto";function Ve(e){return D(e).hosts.api}function Ri(e){return`/private/v1/helix/files/projects/${encodeURIComponent(e)}`}function be(e,t){return`${e}${Ri(t)}`}function Q(e,t,r){return`${be(e,t)}/${encodeURIComponent(r)}`}function qe(e,t,r){return`${Q(e,t,r)}/upload`}function Wr(e,t,r){return`${Q(e,t,r)}/download`}function Gr(e,t,r){return`${Q(e,t,r)}/signed-url`}function Xr(e,t,r,n){let o=new URLSearchParams({name:n});return r&&o.set("parentFolder",r),`${be(e,t)}/file?${o.toString()}`}function Qr(e,t,r,n){let o=new URLSearchParams({limit:String(n)});return r&&o.set("id",r),`${be(e,t)}?${o.toString()}`}import yt from"ky";import{z as E}from"zod";var ht=6e4,Zr=E.object({id:E.string(),workspaceId:E.string(),projectId:E.string(),parentFolder:E.string().nullable().optional(),name:E.string(),size:E.number().nullable().optional(),objectType:E.enum(["Folder","File"]),contentType:E.string().nullable().optional(),createdAt:E.string(),updatedAt:E.string()}),Ii=E.object({signedURL:E.string()}),Ci=E.object({path:E.array(E.object({id:E.string(),name:E.string()})),elements:E.array(Zr)});function wt(){let e=ve(),t=_(),r=!!(e&&e.trim().length>0),n=!!(t&&t.trim().length>0);if(!r&&!n)throw c.missingExecutionCredentials();let o={Accept:"application/json"};return r&&(o[Ee]=e),n&&(o[O]=t),o}function en(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 j(e,t){throw c.filesCallFailed(e,en(t),S(t))}function Ai(e,t){return e===400&&en(t).toLowerCase()==="resource not found"}async function Pi(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 Z(e,t,r={}){try{let n=await yt(t,{method:e,headers:wt(),...r.json!==void 0?{json:r.json}:{},throwHttpErrors:!1,timeout:ht}),o=await N(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 gt(e,t){let r=Zr.safeParse(t);if(!r.success)throw c.filesCallFailed(e,"platform returned malformed ObjectMetadata",S(t));return r.data}function tn(e){let t=Ve(e.env),{projectId:r}=e;return{async createMetadata(n){let{status:o,body:i}=await Z("post",be(t,r),{json:n});return(o<200||o>=300)&&j(o,i),gt(o,i)},async getByName(n,o){let{status:i,body:s}=await Z("get",Xr(t,r,n,o));return i===404||Ai(i,s)?null:((i<200||i>=300)&&j(i,s),gt(i,s))},async getById(n){let{status:o,body:i}=await Z("get",Q(t,r,n));return o===404?null:((o<200||o>=300)&&j(o,i),gt(o,i))},async listChildren(n,o){let{status:i,body:s}=await Z("get",Qr(t,r,n,o));(i<200||i>=300)&&j(i,s);let a=Ci.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 Pi(a),m;try{m=await yt(qe(t,r,n),{method:"post",headers:{...wt(),"content-type":u},body:new Uint8Array(l),throwHttpErrors:!1,timeout:ht})}catch(g){if(g instanceof c)throw g;let p=g instanceof Error?g.message:String(g);throw c.filesCallFailed(0,p)}let d=await N(m);(m.status<200||m.status>=300)&&j(m.status,d)},async downloadContent(n){let o;try{o=await yt(Wr(t,r,n),{method:"get",headers:wt(),throwHttpErrors:!1,timeout:ht})}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 N(o);j(o.status,s)}let i=await o.arrayBuffer();return Buffer.from(i)},async getSignedDownloadUrl(n){let{status:o,body:i}=await Z("get",Gr(t,r,n));(o<200||o>=300)&&j(o,i);let s=Ii.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 Z("delete",Q(t,r,n));o===204||o===404||(o<200||o>=300)&&j(o,i)}}}function bt(e){return e.split("/").filter(t=>t.length>0)}function xt(e){return e instanceof c&&e.detail.kind==="files_call_failed"&&e.detail.status===409}async function Ti(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(xt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function St(e,t){let r=bt(t),n=r[r.length-1],o;for(let i of r.slice(0,-1))o=(await Ti(e,o,i)).id;return{parentFolder:o,name:n}}async function xe(e,t){let r=bt(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 Et(e,t){if(t.length===0)return;let r=bt(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 Oi=500,_i=8;async function Di(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 Fi(){let e=x();if(e.kind!=="provisioned")throw c.filesRequiresProvisioning();return{projectId:e.projectId,env:e.region}}function Li(e){return ki("sha1").update(`${e.id}:${e.updatedAt}:${e.size??0}`).digest("hex")}function ze(e,t,r){return{path:e,size:t.size??0,contentType:t.contentType??r??"application/octet-stream",lastModified:new Date(t.updatedAt),etag:Li(t)}}async function rn(e,t,r,n){try{return await e.createMetadata({parentFolder:t,objectType:"File",contentType:n,name:r})}catch(o){if(xt(o)){let i=await e.getByName(t,r);if(i)return i}throw o}}async function nn(e,t){let{elements:r}=await e.listChildren(t,Oi);return(await Di(r,_i,async o=>{let i=o.objectType==="Folder"?await nn(e,o.id):1;return await e.deleteById(o.id),i})).reduce((o,i)=>o+i,0)}function on(e){let t=Fi(),r=e??tn(t),n=Ve(t.env),{projectId:o}=t;return{async put(i,s,a){let{parentFolder:l,name:u}=await St(r,i),m=await W(s),d=a?.contentType??He(i),g=await r.getByName(l,u);if(g&&g.objectType!=="File")throw c.filesCallFailed(409,`A folder already exists at "${i}"`);let p=g??await rn(r,l,u,d);await r.uploadContent(p.id,m,u,d);let b=await r.getById(p.id);return ze(i,b??p,d)},async get(i){let s=await xe(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:ze(i,a)}},async head(i){let s=await xe(r,i);if(!s)return null;let a=await r.getByName(s.parentFolder,s.name);return!a||a.objectType!=="File"?null:ze(i,a)},async delete(i){let s=await xe(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 Et(r,i);if(s===null)return{deleted:0};let a=await nn(r,s);return i.length>0&&s!==void 0&&await r.deleteById(s),{deleted:a}},async list(i,s){let a=await Et(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(d=>d.objectType==="File").map(d=>ze(i?`${i}/${d.name}`:d.name,d)),cursor:null}},async getUploadUrl(i,s){let{parentFolder:a,name:l}=await St(r,i),m=await r.getByName(a,l)??await rn(r,a,l,s?.contentType);return{url:qe(n,o,m.id),expiresAt:J(s?.expiresIn)}},async getDownloadUrl(i,s){let a=await xe(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:J(s?.expiresIn)}}}}function vt(e,t){let r=t?.maxPathBytes;return{async put(n,o,i){H(n,r);let s=await W(o);return sr(s.byteLength),e.put(n,s,i)},async get(n){return H(n,r),e.get(n)},async head(n){return H(n,r),e.head(n)},async delete(n){return H(n,r),e.delete(n)},async deleteMany(n){let o=ot(n);return ke(o,r),e.deleteMany(o)},async list(n,o){let i=ot(n??"");return ke(i,r),e.list(i,o)},async getUploadUrl(n,o){return H(n,r),e.getUploadUrl(n,o)},async getDownloadUrl(n,o){return H(n,r),e.getDownloadUrl(n,o)}}}function Ui(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":h().mode==="lambda"}function Fl(){if(Ui())return vt(on());let e=h().projectRoot;return vt(Jr(),{maxPathBytes:e?ar(e):void 0})}import Ni from"ky";function sn(e){return D(e).hosts.api}function Mi(){return"/private/v1/helix/function-calls"}function an(e){return`${e}${Mi()}`}var ji=5e3;function Bi(){let e=_();if(!!!(e&&e.trim().length>0))throw c.callFunctionMissingExecutionJwt();return{Accept:"application/json",[O]:e}}function $i(e,t){throw c.callFunctionCallFailed(e,Hi(t),S(t))}function Hi(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 cn(e){let t=sn(e.env);return{async callAsync(r,n){let o,i;try{let s=await Ni(an(t),{method:"post",headers:Bi(),json:{functionPath:r,input:n},throwHttpErrors:!1,timeout:ji});o=s.status,i=await N(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)&&$i(o,i)}}}var ln=1024;function Ye(e){if(typeof e!="string"||e.trim().length===0)throw c.callFunctionPathInvalid("functionPath must be a non-empty string");if(e.length>ln)throw c.callFunctionPathInvalid(`functionPath must be at most ${ln} characters`)}function Ki(){let e=x();if(e.kind!=="provisioned")throw c.callFunctionRequiresProvisioning();return{env:e.region}}function un(e){return async function(r,n){Ye(r),await(e??cn(Ki())).callAsync(r,n)}}function dn(){return async function(t,r){Ye(t);let n=h().devServerUrl;if(!n)throw c.callFunctionNotAvailable();let o=t.startsWith("/")?t:`/${t}`,i=wr();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 Vi(){return typeof __TRAY_SDK_MODE__<"u"?__TRAY_SDK_MODE__==="lambda":h().mode==="lambda"}function su(){return Vi()?un():dn()}import{embed as hn,embedMany as wn,generateImage as bn,generateObject as xn,generateSpeech as Sn,generateText as En,streamObject as vn,streamText as Rn,transcribe as In}from"ai";import{SpanKind as ts,SpanStatusCode as yn}from"@opentelemetry/api";import{createOpenAI as Ji}from"@ai-sdk/openai";import{createAnthropic as Wi}from"@ai-sdk/anthropic";import{createGoogle as Gi}from"@ai-sdk/google";import{createMistral as Xi}from"@ai-sdk/mistral";import{createCohere as Qi}from"@ai-sdk/cohere";import{createOpenAICompatible as Zi}from"@ai-sdk/openai-compatible";var qi=new Set(["x-api-key","x-goog-api-key"]);function zi(e){return At(e)||qi.has(e.toLowerCase())}function Yi(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function fn(e){return async(t,r)=>{let n=Yi(t),o=new URL(n);if(o.protocol!=="https:")throw c.unsupportedScheme(o.protocol.replace(/:$/,""));let i=h(),{region:s}=x(),a=new Headers(r?.headers??(t instanceof Request?t.headers:void 0)),l=new Headers;for(let[f,y]of a.entries())zi(f)||l.append(f,y);l.set(ne,n),l.set(Re,e),i.executionId&&l.set(oe,i.executionId);let{headers:u,deploymentId:m}=F(i);for(let[f,y]of Object.entries(u))l.set(f,y);m&&l.set(B,m);let d=q(s,i.mode==="lambda"?"runtime":"dev"),g=r?.body??(t instanceof Request?t.clone().body:void 0),p={method:r?.method??(t instanceof Request?t.method:"GET"),headers:l,redirect:"manual",signal:r?.signal??void 0};g!=null&&(p.body=g,typeof ReadableStream<"u"&&g instanceof ReadableStream&&(p.duplex="half"));let b;try{b=await fetch(d,p)}catch(f){if(f instanceof Error&&f.name==="AbortError")throw f;let y=f instanceof Error?f.message??String(f):String(f);throw c.brokerError(0,y)}let re=b.headers.get(Ie);if(re!==null){let f=await b.text(),y=f||re;try{let I=Pt.safeParse(JSON.parse(f));I.success&&(y=I.data.error.message)}catch{}throw re===V&&(y="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(b.status,y,f||void 0,re)}return b}}var ee="helix-broker";function mn(e){let{alias:t,service:r,baseUrl:n,authenticationId:o}=e,i=fn(o);switch(r){case"openai":return Ji({apiKey:ee,fetch:i});case"anthropic":return Wi({apiKey:ee,fetch:i});case"google":return Gi({apiKey:ee,fetch:i});case"mistral":return Xi({apiKey:ee,fetch:i});case"cohere":return Qi({apiKey:ee,fetch:i});case"openai-compatible":{if(!n)throw c.aiUnsupportedService(t,r,[...me]);return Zi({name:t,baseURL:n,apiKey:ee,fetch:i})}}}var pn={"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}},es=Object.keys(pn).sort((e,t)=>t.length-e.length);function gn(e,t){let r=es.find(i=>e.startsWith(i));if(!r||!t)return{amount:0,currency:"USD"};let n=pn[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 A.startActiveSpan("ai",{kind:ts.CLIENT},async n=>{n.setAttributes({operation:e.operation,model:e.model,...e.alias!==void 0?{alias:e.alias}:{}}),v("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:yn.OK}),o}catch(o){let i=o instanceof Error?o.message:String(o);throw n.setAttribute("status","error"),n.setStatus({code:yn.ERROR,message:i}),o}finally{n.end()}})}function rs(){return`aireq_${crypto.randomUUID().replaceAll("-","")}`}function te(e,t){return{cost:gn(e,t),requestId:rs()}}function K(e){return typeof e=="object"&&e!==null&&"modelId"in e?String(e.modelId):String(e)}var Cn=new WeakSet;function Se(e){return Cn.add(e),e}function k(e){if(typeof e!="object"||e===null)throw c.aiModelInstanceRequired(typeof e=="string"?e:String(e));if(!Cn.has(e))throw c.aiForeignModelRejected()}function Je(e){return e.totalUsage??e.usage}function We(e){return e.usage?.tokens!==void 0?{inputTokens:e.usage.tokens}:void 0}function Ge(e){return e.usage}function ns(e){let t=x(),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,[...me]);let{service:i,baseUrl:s}=typeof o=="string"?{service:o,baseUrl:void 0}:o,a=mn({alias:e,service:i,baseUrl:s,authenticationId:n}),l=f=>Se(a.languageModel(f)),u=f=>Se(a.embeddingModel(f)),m=f=>Se(a.imageModel(f)),d=f=>{if(!a.transcriptionModel)throw new Error(`AI provider "${i}" (alias "${e}") has no transcription models`);return Se(a.transcriptionModel(f))},g=f=>{if(!a.speechModel)throw new Error(`AI provider "${i}" (alias "${e}") has no speech models`);return Se(a.speechModel(f))},p=(f=>l(f)),b=(f,y)=>{let I=f.model;if(typeof I!="string")throw c.aiModelIdRequired(e,y);return I};return Object.assign(p,{specificationVersion:"v4",languageModel:l,embeddingModel:u,textEmbeddingModel:u,imageModel:m,transcriptionModel:d,speechModel:g,async generateText(f){let y=b(f,"generateText"),I=await C({operation:"generateText",model:y,alias:e},()=>En({...f,model:l(y)}),Je);return Object.assign(I,{helix:te(y,Je(I))})},streamText(f){let y=b(f,"streamText");return v("hasAi"),Rn({...f,model:l(y)})},async generateObject(f){let y=b(f,"generateObject"),I=await C({operation:"generateObject",model:y,alias:e},()=>xn({...f,model:l(y)}),Pn=>Pn.usage),An=I.usage;return Object.assign(I,{helix:te(y,An)})},streamObject(f){let y=b(f,"streamObject");return v("hasAi"),vn({...f,model:l(y)})},async embed(f){let y=b(f,"embed");return C({operation:"embed",model:y,alias:e},()=>hn({...f,model:u(y)}),We)},async embedMany(f){let y=b(f,"embedMany");return C({operation:"embedMany",model:y,alias:e},()=>wn({...f,model:u(y)}),We)},async generateImage(f){let y=b(f,"generateImage"),I=await C({operation:"generateImage",model:y,alias:e},()=>bn({...f,model:m(y)}),Ge);return Object.assign(I,{helix:te(y,Ge(I))})},async transcribe(f){let y=b(f,"transcribe");return C({operation:"transcribe",model:y,alias:e},()=>In({...f,model:d(y)}))},async generateSpeech(f){let y=b(f,"generateSpeech");return C({operation:"generateSpeech",model:y,alias:e},()=>Sn({...f,model:g(y)}))}})}function _u(){let e=new Map;return Object.assign((n=>{let o=e.get(n);return o||(o=ns(n),e.set(n,o)),o}),{async generateText(n){k(n.model);let o=K(n.model),i=await C({operation:"generateText",model:o},()=>En(n),Je);return Object.assign(i,{helix:te(o,Je(i))})},streamText(n){return k(n.model),v("hasAi"),Rn(n)},async generateObject(n){k(n.model);let o=K(n.model),i=await C({operation:"generateObject",model:o},()=>xn(n),a=>a.usage),s=i.usage;return Object.assign(i,{helix:te(o,s)})},streamObject(n){return k(n.model),v("hasAi"),vn(n)},async embed(n){return k(n.model),C({operation:"embed",model:K(n.model)},()=>hn(n),We)},async embedMany(n){return k(n.model),C({operation:"embedMany",model:K(n.model)},()=>wn(n),We)},async generateImage(n){k(n.model);let o=K(n.model),i=await C({operation:"generateImage",model:o},()=>bn(n),Ge);return Object.assign(i,{helix:te(o,Ge(i))})},async transcribe(n){return k(n.model),C({operation:"transcribe",model:K(n.model)},()=>In(n))},async generateSpeech(n){return k(n.model),C({operation:"generateSpeech",model:K(n.model)},()=>Sn(n))}})}export{os as a,is as b,ss as c,x as d,as as e,er as f,Wn as g,v as h,T as i,to as j,ro as k,A as l,no as m,Ls as n,wr as o,ua as p,Ma as q,Go as r,Hc as s,H as t,fe as u,_e as v,Fl as w,su as x,Ks as y,it as z,dr as A,fr as B,me as C,mr as D,Qs as E,yr as F,st as G,bo as H,Eo as I,vo as J,Zs as K,Ro as L,ea as M,_u as N,hr as O,M as P,ra as Q,na as R};
|