@onereach/step-create-chat-completion 0.0.7-rc.53 → 0.0.7-rc.55

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/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { CONFIG, IThreadId, RESULT, LOCAL, IEvent, IThread, IStepId, STATE, IActionEvent, ACTION } from '@onereach/flow-sdk/types/index.js';
2
2
  import { ChatCompletion, ChatCompletionToolMessageParam, ChatCompletionMessageFunctionToolCall, ChatCompletionChunk as ChatCompletionChunk$1, ChatCompletionMessageParam } from 'openai/resources';
3
3
  import { z } from 'zod/v4-mini';
4
+ import * as zod_v4_core from 'zod/v4/core';
4
5
  import Step from '@onereach/flow-sdk/step.js';
5
6
  import { ChatCompletionMessageFunctionToolCall as ChatCompletionMessageFunctionToolCall$1, ChatCompletionMessageParam as ChatCompletionMessageParam$1, ChatCompletionToolMessageParam as ChatCompletionToolMessageParam$2 } from 'openai/resources.js';
6
7
  import { ChatCompletion as ChatCompletion$1, ChatCompletionToolMessageParam as ChatCompletionToolMessageParam$1, ChatCompletionChunk } from 'openai/resources.mjs';
@@ -138,6 +139,10 @@ declare const dataInSchema: z.ZodMiniObject<{
138
139
  }>>>;
139
140
  strict: z.ZodMiniBoolean<boolean>;
140
141
  }, z.core.$strip>>;
142
+ useState: z.ZodMiniOptional<z.ZodMiniBoolean<boolean>>;
143
+ stateSettings: z.ZodMiniOptional<z.ZodMiniObject<{
144
+ stateFunction: z.ZodMiniFunction<z.core.$ZodFunctionArgs, z.core.$ZodFunctionOut>;
145
+ }, z.core.$strip>>;
141
146
  processError: z.ZodMiniBoolean<boolean>;
142
147
  processTimeout: z.ZodMiniBoolean<boolean>;
143
148
  timeoutDuration: z.ZodMiniString<string>;
@@ -293,6 +298,10 @@ declare class BaseStep<T extends BaseConfig> extends Step<T> {
293
298
  tool_call_id: string;
294
299
  name?: string | undefined;
295
300
  })[] | undefined;
301
+ useState?: boolean | undefined;
302
+ stateSettings?: {
303
+ stateFunction: zod_v4_core.$InferOuterFunctionType<zod_v4_core.$ZodFunctionArgs, zod_v4_core.$ZodFunctionOut>;
304
+ } | undefined;
296
305
  }>;
297
306
  }
298
307
 
@@ -571,7 +580,7 @@ declare class RequestContext extends BaseStep<RequestContextConfig> {
571
580
  runStep(): Promise<void>;
572
581
  private cancel;
573
582
  private complete;
574
- private get history();
583
+ private getHistory;
575
584
  private get openAiService();
576
585
  private get responseHandler();
577
586
  }
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var Qe=Object.defineProperty;var l=(n,e)=>Qe(n,"name",{value:e,configurable:!0});import{install as It}from"source-map-support";import{ACTION as Xe}from"@onereach/flow-sdk/types/index.js";import xe from"@onereach/flow-sdk/errors/timeout.js";import{z as we}from"zod/v4-mini";import Te from"@onereach/flow-sdk/errors/base.js";var p={UNKNOWN:"UNKNOWN",STEP_LOGIC_ISSUE:"STEP_LOGIC_ISSUE",AUTH:"AUTH",TIMEOUT:"TIMEOUT",VALIDATION:"VALIDATION",INVALID_REQUEST:"INVALID_REQUEST",RATE_LIMITED:"RATE_LIMITED",LLM_FINISH_LENGTH:"LLM_FINISH_LENGTH",SERVER_ERROR:"SERVER_ERROR",UNSUPPORTED:"UNSUPPORTED"},h=class extends Te{static{l(this,"CreateChatCompletionStepError")}},ne=class extends Te{static{l(this,"AbortRequestError")}};var Ze=[h,xe];function x(n,e={}){let{preserveErrors:t=Ze,unknownMessage:r="Unknown error",unknownCode:i=p.UNKNOWN}=e;if(t?.some(o=>n instanceof o))return n;if(n instanceof we.core.$ZodError)return new h(we.prettifyError(n),n,{code:p.VALIDATION});if(typeof n=="string")return new h(n,{code:p.UNKNOWN});if(n instanceof Error){if(n.message.includes("Request timed out"))return new xe("Timeout",n,{code:p.TIMEOUT});let o=n?.response?.data?.error?.message;return o!=null?new h(o,n,{code:p.SERVER_ERROR}):new h(r,n,{code:i})}return new h(r,{code:i,data:n})}l(x,"errorFilter");function oe(n,e){function t(r,i,o,a){let c=n(r,i,o,a);if(typeof c=="function"){let f=a.value,w=c;if(f?.name!=null)try{Object.defineProperty(w,"name",{value:f.name})}catch{}return a.value=w,a}return c??a}return l(t,"runApply"),l(function(i,o,a){if(i!==null&&typeof i=="object"&&(typeof o=="string"||typeof o=="symbol")&&a!==null&&typeof a=="object")return t(e,i,o,a);{let c=i??e;return(f,w,m)=>t(c,f,w,m)}},"decoratorOrFactory")}l(oe,"createMethodDecoratorWithOptionalArguments");var Ye={allowHandleError:!1,useErrorFilter:!0},u=oe((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>be.call(this,n,c,t)):a}catch(a){return be.call(this,n,a,t)}}},Ye);function be(n,e,t){let r=t.toString();this.log.DEBUG?.(`Error in method '${r}'`,e);let i=n.useErrorFilter?x(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:Xe.error,error:i});return}else{this.end(i);return}throw i}l(be,"errorHandler");function _e({thread:n,...e}){let t=pe({thread:n,...e}),r=n.process;if(r.cache[t]!=null)throw new Error(`AbortController for key '${t}' already exists`);return r.cache[t]=new AbortController}l(_e,"createAbortController");function ve({thread:n,...e}){let t=pe({thread:n,...e});return n.process.cache[t]}l(ve,"getAbortController");function z({thread:n,...e}){let t=pe({thread:n,...e});delete n.process.cache[t]}l(z,"deleteAbortController");function pe({thread:n,prefix:e,stepId:t=n.currentStepId}){return`${e?`${e}:`:""}abrt_ctrl:${t}`}l(pe,"getAbortControllerKey");import{ACTION as Re}from"@onereach/flow-sdk/types/index.js";async function k(n,{id:e,state:t,local:r,...i},{force:o}={}){let a=n.process.getThread(e);if(n.log.DEBUG?.(`runThread: thread with id '${e}'`,i),a==null)return await n.thread.runThread({...i,id:e,state:t,local:{...r,parent:n.thread.id,active:!0}});if(!o&&!a.ended&&a.local.active)throw new Error(`Thread with id '${e}' has not ended yet, cannot start it again`);if(t==null)throw new Error(`Thread with id '${e}' must have a state to run`);return a.local.active=!0,await a.enqueueAndRun({name:Re.goto,state:{...t,active:!0}})}l(k,"runChildThread");function Se(n,e){let t=n.process.getThread(e);return!!(t!=null&&t.local.active&&!t.ended)}l(Se,"isThreadBusy");function et(n,e=n.id){let t=[];for(let r in n.process.threads){let i=n.process.threads[r];i?.local.parent===e&&t.push(i)}return t}l(et,"listChildThreads");async function J(n,e,{result:t,stopChildThreads:r}={}){let i=n.process.getThread(e);n.log.DEBUG?.(`stopThread: thread with id '${e}'`),i&&(r&&await ue(i,t),i.local.active&&(i.local.active=!1,!i.ended&&await i.enqueueAndRun({name:Re.ending,result:t})))}l(J,"stopThread");async function ue(n,e,t={}){let i=et(n).map(async c=>await J(n,c.id,{stopChildThreads:!0,result:e})),o=await Promise.allSettled(i);if(t.throw??!0){let c=o.find(f=>f.status==="rejected");if(c)throw c.reason}return o}l(ue,"endChildThreads");import st from"@onereach/flow-sdk/step.js";var tt={},U=oe((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),x(c)}):a}catch(a){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,a),x(a)}}},tt);import{en as nt}from"zod/v4/locales";import{z as s}from"zod/v4-mini";s.config(nt());var y=s.string().check(s.trim(),s.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),Ie=s.discriminatedUnion("role",[s.object({role:s.literal("system"),content:y}),s.object({role:s.literal("user"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64)))}),s.object({role:s.literal("assistant"),content:s.nullable(y),tool_calls:s.optional(s.array(s.object({id:y.check(s.minLength(1)),type:s.literal("function"),function:s.object({name:y.check(s.minLength(1)),arguments:y.check(s.minLength(1))})})))}),s.object({role:s.literal("tool"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64))),tool_call_id:y.check(s.minLength(1))})]),ot=s.object({type:s.literal("object"),properties:s.record(s.string().check(s.minLength(1),s.maxLength(64)),s.object({type:s.enum(["string","number","boolean","array","object"]),description:s.optional(s.string().check(s.maxLength(1e3))),items:s.optional(s.object({type:s.enum(["string","number","boolean","object"]),description:s.optional(s.string().check(s.maxLength(1e3)))}))}))}),Oe=s.object({provider:y.check(s.minLength(1)),model:y.check(s.minLength(1)),accountKey:N(y),typeOfStep:s.enum(["chat","completion"]),systemMessage:s.optional(y),userMessage:s.optional(y),switchAssistantsMessage:s._default(s.boolean(),!1),assistantsFirstMessage:s.optional(y),temperature:N(s.coerce.number().check(s.gte(0),s.lte(2))),topP:N(s.coerce.number().check(s.gte(0),s.lte(1))),maxTokens:N(s.coerce.number().check(s.int(),s.gte(1))),presencePenalty:N(s.coerce.number().check(s.gte(-2),s.lte(2))),frequencyPenalty:N(s.coerce.number().check(s.gte(-2),s.lte(2))),n:N(s.coerce.number().check(s.int(),s.gte(1),s.lte(128))),stop:s.optional(s.array(s.object({token:s.string().check(s.minLength(1),s.maxLength(64))})).check(s.maxLength(4))),streamResponse:s._default(s.boolean(),!1),streamSettings:s.optional(s.object({maxBufferLength:s.coerce.number().check(s.overwrite(n=>n===0?50:n),s.int(),s.gte(1),s.lte(32768)),debounceDuration:s.coerce.number().check(s.int(),s.gte(0),s.lte(1e4))})),customHistory:s._default(s.boolean(),!1),historyLength:N(s.coerce.number().check(s.int(),s.gte(1),s.lte(100))),historyMode:s.optional(s.enum(["mergefield","codeHistory"])),historyMergefield:s.optional(s.array(Ie)),historyCode:s.optional(s.array(Ie)),functionsList:s.array(s.object({name:y.check(s.minLength(1),s.maxLength(64)),description:s.optional(y.check(s.maxLength(1e3))),parameters:s.optional(s.pipe(ot,s.transform(n=>(n.required=Object.keys(n.properties),n.additionalProperties=!1,n)))),strict:s.boolean()})),processError:s.boolean(),processTimeout:s.boolean(),timeoutDuration:y.check(s.trim(),s.minLength(1))}).check(s.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),s.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),s.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),s.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via merge-field'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via code'}));function N(n){return s.pipe(s.union([s.undefined(),s.literal(""),n]),s.transform(e=>e===""?void 0:e))}l(N,"optionalStringValue");function rt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(rt,"_ts_decorate");function he(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(he,"_ts_metadata");var C=class extends st{static{l(this,"BaseStep")}async resolveDataIn(){let e=await super.resolveDataIn();return Oe.parse(e)}};rt([U,he("design:type",Function),he("design:paramtypes",[]),he("design:returntype",Promise)],C.prototype,"resolveDataIn",null);var I="llm_cmp";var ke="cncl_ctrl",re={cancel:"st_cancel"},je={cancel:"cnl_cancel"};function fe(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(fe,"_ts_decorate");function D(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(D,"_ts_metadata");var j=class n extends C{static{l(this,"CancelContext")}static class=ke;static async start(e){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0},{force:!0})}static async stop(e){await J(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local({name:je.cancel},this.onCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCancel(){this.log.DEBUG?.("Canceling LLM request");let e=this.local.parent,t=this.process.getThread(e);if(!t||t.ended)return this.end();let r=ve({thread:this.thread});r?r.abort(new ne("Request cancelled")):this.process.enqueueAndRun({name:re.cancel,thread:e})}};fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"runStep",null);fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"initialize",null);fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"onCancel",null);import{ACTION as He}from"@onereach/flow-sdk/types/index.js";import{setImmediate as gt}from"timers/promises";import{clear as yt,Memoize as Ct}from"typescript-memoize";import{clear as ht,Memoize as Ue}from"typescript-memoize";var Ae="hst_ctrl",B={appendToHistory:"hst_append",prepareHistory:"hst_prepare",adjustOnCancel:"hst_cncl"};function Q(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Q,"_ts_decorate");function b(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(b,"_ts_metadata");var g=class n extends C{static{l(this,"HistoryContext")}static class=Ae;static async start(e){let t=this.getThreadId(e.step.id);e.process.getThread(t)==null&&await e.process.runThread({id:t,background:!0,state:{step:e.step.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.prepareHistory})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.appendToHistory,params:{message:t}})}static async adjustOnCancel(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.adjustOnCancel})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e.step.id)).state.messages}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(B.prepareHistory,this.onPrepareHistory).local(B.appendToHistory,this.onAppendToHistory).local(B.adjustOnCancel,this.onAdjustOnCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onAdjustOnCancel(){let e;for(;(e=this.state.messages.at(-1))&&!(["system","user"].includes(e.role)||e.role==="assistant"&&e.tool_calls==null);){let t=this.state.messages.pop();this.log.DEBUG?.("Removed message from history",t)}}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:r,typeOfStep:i,userMessage:o,historyMode:a,historyMergefield:c,historyCode:f,assistantsFirstMessage:w}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:o}];return}if(e){this.state.messages=a==="mergefield"?c:f;return}let m=this.state.messages;if(m.length===0&&w!=null&&w.length>0&&m.push({role:"assistant",content:w}),m.at(-1)?.role!=="tool"&&m.push({role:"user",content:o}),!m.some(P=>P.role==="tool")&&t!=null&&t>0&&(m=m.slice(-1*t)),r!=null&&r.length>0){let P={role:"system",content:r};m[0]?.role==="system"?m[0]=P:m.unshift(P)}this.state.messages=m}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,r=Array.isArray(t)?t:[t];this.state.messages.push(...r)}};Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"runStep",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"initialize",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"onAdjustOnCancel",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"onPrepareHistory",null);Q([u,b("design:type",Function),b("design:paramtypes",[typeof HistoryContextEventAppendToHistory>"u"?Object:HistoryContextEventAppendToHistory]),b("design:returntype",void 0)],g.prototype,"onAppendToHistory",null);import{BasicThreadService as it}from"@onereach/flow-sdk/services/basic.js";import{setImmediate as at}from"timers/promises";var se={handleContent:"hnd_cnt"};var W=class extends it{static{l(this,"AbstractResponseHandler")}async handleContentByParentThread(e){await at(),await this.thread.process.enqueueAndRun({thread:this.thread.local.parent,name:se.handleContent,params:{content:e}})}};var ie=class extends W{static{l(this,"SimpleResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing response from LLM"),await this.handleContentByParentThread(e),z({thread:this.thread})}};var ae=class extends W{static{l(this,"StreamResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await this.handleContentByParentThread(t);z({thread:this.thread})}};function Pe({thread:n,isStreaming:e}){return e?new ae(n):new ie(n)}l(Pe,"responseHandlerFactory");var Le="rqst_ctx";import dt from"openai";import pt from"timestring";import{Memoize as ut}from"typescript-memoize";import{z as ce}from"zod/v4-mini";import{BasicThreadService as lt}from"@onereach/flow-sdk/services/basic.js";var le=class extends lt{static{l(this,"ThreadServiceWithData")}data;constructor(e,t){super(e),this.data=t}};function ct(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ct,"_ts_decorate");function Me(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(Me,"_ts_metadata");var $=class extends le{static{l(this,"OpenAIRequestService")}async makeOpenAiRequest(e,t){let{model:r,temperature:i,topP:o,maxTokens:a,frequencyPenalty:c,presencePenalty:f,n:w,streamResponse:m}=this.data,q={messages:structuredClone(e),model:r,temperature:i,top_p:o,max_tokens:a,frequency_penalty:c,presence_penalty:f,stop:this.stopSequences,n:w,stream:m,tools:this.tools,reasoning_effort:"none"};this.log.DEBUG?.("LLM request",q);try{let P=await this.openAiClient.chat.completions.create(q,{signal:t});return m||this.log.DEBUG?.("LLM response",P),P}catch(P){throw P instanceof Error?new h("Chat completion request failed",P,{code:p.SERVER_ERROR,data:q}):P}}get tools(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0))return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:!t.parameters||Object.keys(t.parameters).length===0?void 0:t.parameters,strict:t.strict}}))}get openAiClient(){let{provider:e,accountKey:t}=this.data,r={baseURL:`${this.config.env.OPENAI_API_URL}/${e}`,apiKey:"",defaultHeaders:{Authorization:this.config.authorization,"x-or-session-id":this.session.get(["reporting","sessionId"]),...t?{"x-or-account-token-name":t}:void 0},timeout:this.timeoutMs};return this.log.DEBUG?.("OpenAI client options",r),new dt(r)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=pt(this.data.timeoutDuration,"ms");return ce.number().check(ce.int(),ce.gte(1e3),ce.lte(6e5)).parse(e)}};ct([ut(),Me("design:type",Number),Me("design:paramtypes",[])],$.prototype,"timeoutMs",null);function me(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(me,"_ts_decorate");function G(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(G,"_ts_metadata");var De=["requestInit"],_=class extends C{static{l(this,"RequestContext")}static class=Le;static async start(e){return await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0})}static getThreadId(e){return`${I}_${this.class}_${e}`}async runStep(){ht(De);let e=_e({thread:this.thread});try{let t=await this.openAiService.makeOpenAiRequest(this.history,e.signal);await this.responseHandler.handle(t),this.complete()}catch(t){if(e?.signal.aborted)return this.cancel();throw t}finally{z({thread:this.thread})}}cancel(){this.end({status:"cancel"})}complete(){this.end({status:"ok"})}get history(){return g.getHistory(this.thread)}get openAiService(){return new $(this.thread,this.data)}get responseHandler(){let e=this.data.streamResponse;return Pe({thread:this.thread,isStreaming:e})}};me([u,G("design:type",Function),G("design:paramtypes",[]),G("design:returntype",Promise)],_.prototype,"runStep",null);me([Ue(),G("design:type",typeof $>"u"?Object:$),G("design:paramtypes",[])],_.prototype,"openAiService",null);me([Ue({tags:De}),G("design:type",typeof AbstractResponseHandler>"u"?Object:AbstractResponseHandler),G("design:paramtypes",[])],_.prototype,"responseHandler",null);import{ACTION as mt}from"@onereach/flow-sdk/types/index.js";var Fe="tl_ctrl",Z={callTool:"tl_run_call",lastToolCallReceived:"tl_rsp_end"};var Ne="tl_wrk";function ft(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ft,"_ts_decorate");function ge(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ge,"_ts_metadata");var L=class extends C{static{l(this,"ToolsContextWorker")}static class=Ne;static async start(e,t){let r=JSON.parse(t.function?.arguments);await k(e,{id:this.getThreadId(t),state:{step:e.step.id,class:this.class},local:{toolCall:t,parsedArguments:r,parent:e.id,active:!0}})}static getThreadId(e){return`${I}_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{function:{name:e.function.name,arguments:t}})}getExitName(){return"function"}};ft([U,ge("design:type",Function),ge("design:paramtypes",[]),ge("design:returntype",void 0)],L.prototype,"runStep",null);function X(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(X,"_ts_decorate");function v(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(v,"_ts_metadata");var E=class n extends C{static{l(this,"ToolsContext")}static class=Fe;static async start(e){let t=this.getThreadId(e.step.id);await k(e,{id:t,state:{step:e.step.id,class:this.class,tasks:{},expectMoreTasks:!0},background:!0})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:Z.callTool,params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:Z.lastToolCallReceived})}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(Z.callTool,this.onCallTool).local(Z.lastToolCallReceived,this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new h("Only function tools are supported at the moment",{code:p.UNSUPPORTED});this.state.tasks[t.id]={call:t,status:"pending"},this.startToolWorkerThread(t)}onLastToolCallReceived(){this.log.DEBUG?.("No more tool calls expected",this.state.tasks),this.state.expectMoreTasks=!1,this.tryEndToolsContextThread()}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params.thread;if(t==null)throw new h(`${L.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${L.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});t.status!=="cancel"&&(this.log.DEBUG?.("Tool worker thread completed successfully",{toolCallId:t.toolCallId,result:t.data}),this.setToolCallResult(t.toolCallId,t.data),this.tryEndToolsContextThread())}startToolWorkerThread(e){this.triggers.hook({name:mt.end,thread:L.getThreadId(e)},this.onWorkerThreadEnd),L.start(this.thread,e)}setToolCallResult(e,t){let r=this.state.tasks[e];if(r==null)throw new h(`Unknown tool call with id '${e}'`,{code:p.STEP_LOGIC_ISSUE});r.status="completed",r.result=t}tryEndToolsContextThread(){this.state.expectMoreTasks||Object.values(this.state.tasks).some(t=>t.status==="pending")||(this.log.DEBUG?.("All tool calls completed or failed",this.state.tasks),this.end({status:"ok",messages:this.messages}))}get messages(){return Object.values(this.state.tasks).map(e=>({role:"tool",tool_call_id:e.call.id,content:JSON.stringify(e.result)}))}};X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"runStep",null);X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"initialize",null);X([u,v("design:type",Function),v("design:paramtypes",[typeof ToolsContextEventCallTool>"u"?Object:ToolsContextEventCallTool]),v("design:returntype",void 0)],E.prototype,"onCallTool",null);X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"onLastToolCallReceived",null);X([u,v("design:type",Function),v("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),v("design:returntype",void 0)],E.prototype,"onWorkerThreadEnd",null);function Y(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Y,"_ts_decorate");function R(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(R,"_ts_metadata");var Be=["toolsInit"],M=class extends C{static{l(this,"AbstractContentContext")}static get class(){throw new Error('Define "class" static field')}static getInitialState(){throw new Error('Define "getInitialState" static method')}runStep(){yt(Be),this.triggers.local(se.handleContent,this.onHandleContent).hook({name:He.end,thread:_.getThreadId(this.thread.step.id)},this.onRequestContextEnd).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`),_.start(this.thread)}async onRequestContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${_.name} thread ended with result`,t),t==null)throw new h(`${_.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${_.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return this.cancel();if(t.status!=="ok")throw new h(`Unexpected end of the ${_.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.requestComplete=!0,await this.onAllContentReceived(),this.state.toolsReady!=null&&(await gt(),await E.lastToolCallReceived(this.thread)),await this.tryToComplete()}async onToolsContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${E.name} thread ended`,t),t==null)throw new h(`${E.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${E.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return;let{status:r,messages:i}=t;if(r!=="ok"||!Array.isArray(i))throw new h(`Unexpected end of the ${E.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=i,this.state.toolsReady=!0,await this.tryToComplete()}async callFunction(e){this.state.toolsReady=!1,await this.initToolsContextThread(),await E.callTool(this.thread,e)}handleMultipleChoices(){let{chatCompletion:e}=this.state,t=e?.choices??[];t?.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choices:t.length})}async initToolsContextThread(){this.triggers.hook({name:He.end,thread:E.getThreadId(this.thread.step.id)},this.onToolsContextEnd),await E.start(this.thread)}cancel(){this.end({status:"cancel"})}complete(){let{chatCompletion:e}=this.state;if(e==null)throw new h("Missing chat completion content to return value",{code:p.STEP_LOGIC_ISSUE});this.end({status:"ok",chatCompletion:e,toolsResults:this.state.toolsResults??[]})}};Y([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Object)],M.prototype,"runStep",null);Y([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],M.prototype,"initialize",null);Y([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",Promise)],M.prototype,"onRequestContextEnd",null);Y([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",Promise)],M.prototype,"onToolsContextEnd",null);Y([Ct({tags:Be}),R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Promise)],M.prototype,"initToolsContextThread",null);function $e(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l($e,"_ts_decorate");function K(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(K,"_ts_metadata");var F=class extends M{static{l(this,"SimpleContentContext")}static class="cnt_cxt_smp";static getInitialState(){return{requestComplete:!1}}async onHandleContent(e){let{content:t}=e.params;this.state.chatCompletion=t;let r=t.choices[0]?.message.tool_calls;if(r!=null)for(let i of r)await this.callFunction(i)}onAllContentReceived(){this.handleMultipleChoices()}tryToComplete(){let{requestComplete:e,toolsReady:t}=this.state;!e||t===!1||this.complete()}};$e([u,K("design:type",Function),K("design:paramtypes",[typeof SimpleContentContextHandleContentEvent>"u"?Object:SimpleContentContextHandleContentEvent]),K("design:returntype",Promise)],F.prototype,"onHandleContent",null);$e([u,K("design:type",Function),K("design:paramtypes",[]),K("design:returntype",void 0)],F.prototype,"onAllContentReceived",null);var Ge="str_wrk",qe={chunk:"chunk"};function Et(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Et,"_ts_decorate");function ye(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ye,"_ts_metadata");var A=class extends C{static{l(this,"StreamContentContextWorker")}static class=Ge;static async start(e,t){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class,event:t}})}static isBusy(e){return Se(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new h("Stream worker thread state must contain an event to process",{code:p.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep(qe.chunk,{chunk:e})}};Et([U,ye("design:type",Function),ye("design:paramtypes",[]),ye("design:returntype",void 0)],A.prototype,"runStep",null);import{ACTION as Tt}from"@onereach/flow-sdk/types/index.js";import{clear as wt,Memoize as Ke}from"typescript-memoize";import{z as d}from"zod/v4-mini";var ze=d.looseObject({name:d.string(),params:d.looseObject({content:d.looseObject({id:d.string(),object:d.literal("chat.completion.chunk"),created:d.number(),model:d.string(),service_tier:d.nullish(d.enum(["default","auto","flex","scale","priority"])),choices:d.array(d.looseObject({index:d.number().check(d.int(),d.gte(0)),delta:d.looseObject({role:d.optional(d.enum(["developer","system","user","assistant","tool"])),content:d.nullish(d.string()),refusal:d.nullish(d.string()),tool_calls:d.optional(d.array(d.looseObject({index:d.number().check(d.int(),d.gte(0)),id:d.optional(d.string()),type:d.optional(d.literal("function")),function:d.looseObject({name:d.optional(d.string()),arguments:d.optional(d.string())})})))}),logprobs:d.nullish(d.any()),finish_reason:d.nullable(d.enum(["stop","length","tool_calls","content_filter"]))})),logprobs:d.nullish(d.looseObject({content:d.nullable(d.array(d.looseObject({}))),refusal:d.nullable(d.array(d.looseObject({})))})),usage:d.nullish(d.looseObject({prompt_tokens:d.number(),completion_tokens:d.number(),total_tokens:d.number(),completion_tokens_details:d.optional(d.looseObject({accepted_prediction_tokens:d.optional(d.number()),audio_tokens:d.optional(d.number()),reasoning_tokens:d.optional(d.number()),rejected_prediction_tokens:d.optional(d.number())})),prompt_tokens_details:d.optional(d.looseObject({audio_tokens:d.optional(d.number()),cached_tokens:d.optional(d.number())}))}))})})});var de=class{static{l(this,"StreamReducerService")}_result;_onToolCall;constructor(e,t){this._result=e,this._onToolCall=t}reduceChunk(e){if(Object.keys(this._result).length===0){let{choices:t,...r}=e;Object.assign(this._result,r),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let r=this._result.choices?.[t.index];if(!r){let{delta:i,...o}=t;r=o,this._result.choices??=[],this._result.choices[t.index]=r}if(t.finish_reason!=null&&(r.finish_reason=t.finish_reason),t.logprobs!=null&&(r.logprobs=t.logprobs),t.delta?.content!==void 0){let{content:i,...o}=t.delta;r.message??=o,i===null?r.message.content??=null:(r.message.content??="",r.message.content+=i)}if(t.delta?.tool_calls!=null){let{tool_calls:i,...o}=t.delta;r.message??=o,r.message.tool_calls??=[];for(let a of t.delta.tool_calls){let c=a.index;if(r.message.tool_calls[c]==null)r.message.tool_calls[c]=structuredClone(a);else{let f=r.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=a.function?.arguments??""}t.index===0&&this.tryParseToolCall(r.message.tool_calls[c])}}}}tryParseToolCall(e){try{if(!("function"in e)||e.function==null)return;let t=JSON.parse(e.function.arguments);this._onToolCall(e,t)}catch{}}};var We="cnt_cxt_str";function V(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(V,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(T,"_ts_metadata");var Ce=["streamInit"],O=class n extends M{static{l(this,"StreamContentContext")}static class=We;static getInitialState(){return{class:n.class,requestComplete:!1,workerComplete:!1,partialChatCompletion:{},events:[],lastChunkReceived:!1,index:-1}}async runStep(){await super.runStep(),wt(Ce),this.triggers.hook({name:Tt.end,thread:A.getThreadId(this.thread.step.id)},this.onWorkerThreadEnd)}onWorkerThreadEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${A.name} thread finished processing chunk`,t),t instanceof Error)throw x(t,{unknownMessage:`${A.name} thread ended with an error`});t?.status!=="cancel"&&this.tryRunWorker()}onHandleContent(e){let r=ze.parse(e).params.content;new de(this.state.partialChatCompletion,this.onToolCall.bind(this)).reduceChunk(r);for(let o of r.choices){if(o.index>0)continue;let a=o.delta?.content;a!=null&&a.length>0&&(this.addContentToQueue(a),this.scheduleNextContentEvent())}}onAllContentReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.chatCompletion=this.state.partialChatCompletion,this.handleMultipleChoices(),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker()}onToolCall(e){this.log.DEBUG?.("Tool call received",e),this.callFunction(e)}scheduleNextContentEvent(){let e=this.state.events[0];e==null||!this.isEventReady(e)||"lastChunkReceived"in e||this.tryRunWorker()}addContentToQueue(e){let t=this.state.events.at(-1);if(t!=null){if("lastChunkReceived"in t){this.log.WARN?.("A new chunk received after the `lastChunkReceived` event. Ignoring it.");return}if(t.content.length<this.maxChunkContentLength){let r=`${t.content}${e}`;t.content=r.slice(0,this.maxChunkContentLength),e=r.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let r={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",r),this.state.events.push(r),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(A.isBusy(this.thread)){this.log.DEBUG?.("Skip event processing. Worker thread is busy");return}let e=this.getEventToProcess();if(e!=null){if("lastChunkReceived"in e){this.log.DEBUG?.(`Stopping ${n.name} thread. All response content chunks were processed and no new chunks are coming`),this.state.workerComplete=!0,this.tryToComplete();return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),A.start(this.thread,e)}}isEventReady(e){if(e==null)return!1;if("lastChunkReceived"in e)return!0;if(e.content==null)return!1;let t=Date.now()-e.ts;return this.state.lastChunkReceived||t>=this.debounceDuration||e.content.length>=this.maxChunkContentLength}getEventToProcess(){let e=this.state.events[0];if(e!=null&&this.isEventReady(e))return"lastChunkReceived"in e||this.state.events.shift(),e}tryToComplete(){let{chatCompletion:e,toolsReady:t,requestComplete:r,workerComplete:i}=this.state;if(!i||!r||t===!1||e==null)return;if(e.choices?.[0]?.message==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});this.complete()}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",Promise)],O.prototype,"runStep",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],O.prototype,"onWorkerThreadEnd",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof StreamContentContextHandleContentEvent>"u"?Object:StreamContentContextHandleContentEvent]),T("design:returntype",void 0)],O.prototype,"onHandleContent",null);V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],O.prototype,"onAllContentReceived",null);V([Ke({tags:Ce}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"maxChunkContentLength",null);V([Ke({tags:Ce}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"debounceDuration",null);import{ACTION as Je}from"@onereach/flow-sdk/types/index.js";import{Memoize as bt}from"typescript-memoize";function xt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(xt,"_ts_decorate");function Ee(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(Ee,"_ts_metadata");var ee=class n{static{l(this,"ContentContextUtilities")}static factory(e){let t=e?O:F;return new n(t)}Constructor;constructor(e){this.Constructor=e}async start(e){let t=this.Constructor.getInitialState();await k(e,{id:this.getThreadId(e.step.id),state:{...t,requestComplete:!1,step:e.step.id,class:this.Constructor.class},background:!0})}async cancel(e){await J(e,this.getThreadId(e.step.id),{result:{status:"cancel"},stopChildThreads:!0})}getThreadId(e){return`${I}_${this.Constructor.class}_${e}`}};xt([bt(),Ee("design:type",Function),Ee("design:paramtypes",[Boolean]),Ee("design:returntype",Object)],ee,"factory",null);import{readFile as _t}from"fs/promises";import{createRequire as vt}from"module";var Rt=vt(import.meta.url);async function Ve(n){if(typeof n!="string"||!/^\d+\.\d+\.\d+$/.test(n))throw new Error(`Invalid minimum version format: ${n}`);let e=Rt.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await _t(e,"utf8"),{version:r}=JSON.parse(t),{groups:i}=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/.exec(r)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${r}`);let o=Number.parseInt(i.major??"0",10),a=Number.parseInt(i.minor??"0",10),c=Number.parseInt(i.patch??"0",10);if(o==null||a==null||c==null||Number.isNaN(o)||Number.isNaN(a)||Number.isNaN(c))throw new Error(`Invalid version format: ${r}`);let[f,w,m]=n.split(".").map(q=>Number.parseInt(q,10));if(f==null||w==null||m==null||Number.isNaN(f)||Number.isNaN(w)||Number.isNaN(m))throw new Error(`Invalid minimum version format: ${n}`);if(o<f||o===f&&a<w||o===f&&a===w&&c<m)throw new Error(`Flow SDK version '${r}' is lower than required minimum version '${n}' for the step`)}l(Ve,"validateFlowSdkVersion");function te(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(te,"_ts_decorate");function S(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(S,"_ts_metadata");var St="8.0.72",H=class extends C{static{l(this,"CreateChatCompletionStep")}runStep(){this.triggers.hook({name:Je.end,thread:this.contentContext.getThreadId(this.thread.step.id)},this.onContentContextEnd),this.triggers.hook({name:Je.end,thread:g.getThreadId(this.thread.step.id)},this.onHistoryContextEnd),this.triggers.local(re.cancel,this.onCancel),this.triggers.otherwise(this.initialize)}async initialize(){await Ve(St),this.validateMergeFieldType(),this.resetState(),this.state.cancelled=!1,await Promise.all([g.start(this.thread),j.start(this.thread)]),await g.prepareHistory(this.thread),await this.contentContext.start(this.thread)}async onContentContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.("ContentContext thread ended with result",t),t==null)throw new h("ContentContext thread ended unexpectedly",{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:"ContentContext thread ended with an error",unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel"){await this.resetStep();return}let{status:r,chatCompletion:i,toolsResults:o}=t;if(r!=="ok"||i==null||o==null)throw new h("Unexpected end of the ContentContext thread",{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",i),this.state.contentReady=!0,this.state.chatCompletion=i,this.state.toolsResults=o,await this.tryToExitStep()}catch(t){throw await this.resetStep().catch(()=>{}),t}}async onHistoryContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${g.name} thread ended with result`,t),t instanceof Error)throw x(t,{unknownMessage:`${g.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE})}catch(t){throw await j.stop(this.thread).catch(()=>{}),t}}async onCancel(){await this.resetStep()}async tryToExitStep(){let{cancelled:e,contentReady:t,chatCompletion:r,toolsResults:i}=this.state;if(e){this.resetState();return}if(!t)return;if(r==null)throw new h("Missing chat completion result, but request is marked as processed",{code:p.STEP_LOGIC_ISSUE});let o=r.choices?.[0]?.message;if(o==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});await Promise.all([g.appendToHistory(this.thread,[o,...i]),j.stop(this.thread)]);let a=r.choices[0]?.finish_reason;if(a==="length")throw new h("Reached limit of tokens for LLM completion response",{code:p.LLM_FINISH_LENGTH});if(a==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}this.log.DEBUG?.("Exiting step with collected data",r),this.exitStep("next",r)}async resetStep(){this.resetState(),this.state.cancelled=!0;let t=(await Promise.allSettled([ue(this.thread,{status:"cancel"}),g.adjustOnCancel(this.thread)])).find(r=>r.status==="rejected");if(t)throw t.reason}resetState(){this.state.contentReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[]}validateMergeFieldType(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0)&&(this.dataOut==null||this.getMergeField(this.dataOut).type!=="thread"))throw new h('Merge-field type has to be "Thread" if you are using functions',{code:p.VALIDATION})}get contentContext(){let e=this.data.streamResponse;return ee.factory(e)}};te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",void 0)],H.prototype,"runStep",null);te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"initialize",null);te([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onContentContextEnd",null);te([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onHistoryContextEnd",null);te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"onCancel",null);It();var Zr={[g.class]:g,[_.class]:_,[E.class]:E,[L.class]:L,[F.class]:F,[O.class]:O,[A.class]:A,[j.class]:j};export{Zr as states,H as step};
1
+ var Qe=Object.defineProperty;var l=(n,e)=>Qe(n,"name",{value:e,configurable:!0});import{install as It}from"source-map-support";import{ACTION as Xe}from"@onereach/flow-sdk/types/index.js";import xe from"@onereach/flow-sdk/errors/timeout.js";import{z as we}from"zod/v4-mini";import Te from"@onereach/flow-sdk/errors/base.js";var p={UNKNOWN:"UNKNOWN",STEP_LOGIC_ISSUE:"STEP_LOGIC_ISSUE",AUTH:"AUTH",TIMEOUT:"TIMEOUT",VALIDATION:"VALIDATION",INVALID_REQUEST:"INVALID_REQUEST",RATE_LIMITED:"RATE_LIMITED",LLM_FINISH_LENGTH:"LLM_FINISH_LENGTH",SERVER_ERROR:"SERVER_ERROR",UNSUPPORTED:"UNSUPPORTED"},h=class extends Te{static{l(this,"CreateChatCompletionStepError")}},ne=class extends Te{static{l(this,"AbortRequestError")}};var Ze=[h,xe];function x(n,e={}){let{preserveErrors:t=Ze,unknownMessage:r="Unknown error",unknownCode:i=p.UNKNOWN}=e;if(t?.some(o=>n instanceof o))return n;if(n instanceof we.core.$ZodError)return new h(we.prettifyError(n),n,{code:p.VALIDATION});if(typeof n=="string")return new h(n,{code:p.UNKNOWN});if(n instanceof Error){if(n.message.includes("Request timed out"))return new xe("Timeout",n,{code:p.TIMEOUT});let o=n?.response?.data?.error?.message;return o!=null?new h(o,n,{code:p.SERVER_ERROR}):new h(r,n,{code:i})}return new h(r,{code:i,data:n})}l(x,"errorFilter");function oe(n,e){function t(r,i,o,a){let c=n(r,i,o,a);if(typeof c=="function"){let f=a.value,w=c;if(f?.name!=null)try{Object.defineProperty(w,"name",{value:f.name})}catch{}return a.value=w,a}return c??a}return l(t,"runApply"),l(function(i,o,a){if(i!==null&&typeof i=="object"&&(typeof o=="string"||typeof o=="symbol")&&a!==null&&typeof a=="object")return t(e,i,o,a);{let c=i??e;return(f,w,m)=>t(c,f,w,m)}},"decoratorOrFactory")}l(oe,"createMethodDecoratorWithOptionalArguments");var Ye={allowHandleError:!1,useErrorFilter:!0},u=oe((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>be.call(this,n,c,t)):a}catch(a){return be.call(this,n,a,t)}}},Ye);function be(n,e,t){let r=t.toString();this.log.DEBUG?.(`Error in method '${r}'`,e);let i=n.useErrorFilter?x(e):e;if(i instanceof Error)if(n.allowHandleError){this.thread.enqueue({name:Xe.error,error:i});return}else{this.end(i);return}throw i}l(be,"errorHandler");function _e({thread:n,...e}){let t=pe({thread:n,...e}),r=n.process;if(r.cache[t]!=null)throw new Error(`AbortController for key '${t}' already exists`);return r.cache[t]=new AbortController}l(_e,"createAbortController");function ve({thread:n,...e}){let t=pe({thread:n,...e});return n.process.cache[t]}l(ve,"getAbortController");function z({thread:n,...e}){let t=pe({thread:n,...e});delete n.process.cache[t]}l(z,"deleteAbortController");function pe({thread:n,prefix:e,stepId:t=n.currentStepId}){return`${e?`${e}:`:""}abrt_ctrl:${t}`}l(pe,"getAbortControllerKey");import{ACTION as Re}from"@onereach/flow-sdk/types/index.js";async function k(n,{id:e,state:t,local:r,...i},{force:o}={}){let a=n.process.getThread(e);if(n.log.DEBUG?.(`runThread: thread with id '${e}'`,i),a==null)return await n.thread.runThread({...i,id:e,state:t,local:{...r,parent:n.thread.id,active:!0}});if(!o&&!a.ended&&a.local.active)throw new Error(`Thread with id '${e}' has not ended yet, cannot start it again`);if(t==null)throw new Error(`Thread with id '${e}' must have a state to run`);return a.local.active=!0,await a.enqueueAndRun({name:Re.goto,state:{...t,active:!0}})}l(k,"runChildThread");function Se(n,e){let t=n.process.getThread(e);return!!(t!=null&&t.local.active&&!t.ended)}l(Se,"isThreadBusy");function et(n,e=n.id){let t=[];for(let r in n.process.threads){let i=n.process.threads[r];i?.local.parent===e&&t.push(i)}return t}l(et,"listChildThreads");async function J(n,e,{result:t,stopChildThreads:r}={}){let i=n.process.getThread(e);n.log.DEBUG?.(`stopThread: thread with id '${e}'`),i&&(r&&await ue(i,t),i.local.active&&(i.local.active=!1,!i.ended&&await i.enqueueAndRun({name:Re.ending,result:t})))}l(J,"stopThread");async function ue(n,e,t={}){let i=et(n).map(async c=>await J(n,c.id,{stopChildThreads:!0,result:e})),o=await Promise.allSettled(i);if(t.throw??!0){let c=o.find(f=>f.status==="rejected");if(c)throw c.reason}return o}l(ue,"endChildThreads");import st from"@onereach/flow-sdk/step.js";var tt={},U=oe((n,e,t,r)=>{let i=r.value;if(!(!i||typeof i!="function"))return function(...o){try{let a=i.apply(this,o);return a instanceof Promise?a.catch(c=>{let f=t.toString();throw this.log.DEBUG?.(`Error in method '${f}'`,c),x(c)}):a}catch(a){let c=t.toString();throw this.log.DEBUG?.(`Error in method '${c}'`,a),x(a)}}},tt);import{en as nt}from"zod/v4/locales";import{z as s}from"zod/v4-mini";s.config(nt());var y=s.string().check(s.trim(),s.refine(n=>!["undefined","null"].includes(n),{error:"Unexpected undefined or null merge-field value"})),Ie=s.discriminatedUnion("role",[s.object({role:s.literal("system"),content:y}),s.object({role:s.literal("user"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64)))}),s.object({role:s.literal("assistant"),content:s.nullable(y),tool_calls:s.optional(s.array(s.object({id:y.check(s.minLength(1)),type:s.literal("function"),function:s.object({name:y.check(s.minLength(1)),arguments:y.check(s.minLength(1))})})))}),s.object({role:s.literal("tool"),content:y,name:s.optional(y.check(s.minLength(1),s.maxLength(64))),tool_call_id:y.check(s.minLength(1))})]),ot=s.object({type:s.literal("object"),properties:s.record(s.string().check(s.minLength(1),s.maxLength(64)),s.object({type:s.enum(["string","number","boolean","array","object"]),description:s.optional(s.string().check(s.maxLength(1e3))),items:s.optional(s.object({type:s.enum(["string","number","boolean","object"]),description:s.optional(s.string().check(s.maxLength(1e3)))}))}))}),Oe=s.object({provider:y.check(s.minLength(1)),model:y.check(s.minLength(1)),accountKey:N(y),typeOfStep:s.enum(["chat","completion"]),systemMessage:s.optional(y),userMessage:s.optional(y),switchAssistantsMessage:s._default(s.boolean(),!1),assistantsFirstMessage:s.optional(y),temperature:N(s.coerce.number().check(s.gte(0),s.lte(2))),topP:N(s.coerce.number().check(s.gte(0),s.lte(1))),maxTokens:N(s.coerce.number().check(s.int(),s.gte(1))),presencePenalty:N(s.coerce.number().check(s.gte(-2),s.lte(2))),frequencyPenalty:N(s.coerce.number().check(s.gte(-2),s.lte(2))),n:N(s.coerce.number().check(s.int(),s.gte(1),s.lte(128))),stop:s.optional(s.array(s.object({token:s.string().check(s.minLength(1),s.maxLength(64))})).check(s.maxLength(4))),streamResponse:s._default(s.boolean(),!1),streamSettings:s.optional(s.object({maxBufferLength:s.coerce.number().check(s.overwrite(n=>n===0?50:n),s.int(),s.gte(1),s.lte(32768)),debounceDuration:s.coerce.number().check(s.int(),s.gte(0),s.lte(1e4))})),customHistory:s._default(s.boolean(),!1),historyLength:N(s.coerce.number().check(s.int(),s.gte(1),s.lte(100))),historyMode:s.optional(s.enum(["mergefield","codeHistory"])),historyMergefield:s.optional(s.array(Ie)),historyCode:s.optional(s.array(Ie)),functionsList:s.array(s.object({name:y.check(s.minLength(1),s.maxLength(64)),description:s.optional(y.check(s.maxLength(1e3))),parameters:s.optional(s.pipe(ot,s.transform(n=>(n.required=Object.keys(n.properties),n.additionalProperties=!1,n)))),strict:s.boolean()})),useState:s.optional(s.boolean()),stateSettings:s.optional(s.object({stateFunction:s.function()})),processError:s.boolean(),processTimeout:s.boolean(),timeoutDuration:y.check(s.trim(),s.minLength(1))}).check(s.refine(n=>!n.streamResponse||n.provider==="openai",{error:"Streaming is only supported for OpenAI provider"}),s.refine(n=>!n.streamResponse||n.streamSettings!==void 0,{error:'Missing "Stream settings" for response streaming mode'}),s.refine(n=>n.typeOfStep!=="chat"||n.customHistory||!n.switchAssistantsMessage||n.assistantsFirstMessage!==void 0,{error:`Missing "Assistant's first message" value`}),s.refine(n=>n.customHistory||n.userMessage!==void 0,{error:'Missing "User message" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!==void 0,{error:'Missing "History mode" value'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield!==void 0,{error:'Missing "History" data via merge-field'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="mergefield"||n.historyMergefield?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via merge-field'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode!==void 0,{error:'Missing "History" data as code'}),s.refine(n=>n.typeOfStep!=="chat"||!n.customHistory||n.historyMode!=="codeHistory"||n.historyCode?.find?.(e=>e.role==="user"),{error:'Missing at least one message with role "user" message in "History" data via code'}),s.refine(n=>!n.useState||n.stateSettings!=null,{error:"Missing state settings"}));function N(n){return s.pipe(s.union([s.undefined(),s.literal(""),n]),s.transform(e=>e===""?void 0:e))}l(N,"optionalStringValue");function rt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(rt,"_ts_decorate");function he(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(he,"_ts_metadata");var C=class extends st{static{l(this,"BaseStep")}async resolveDataIn(){let e=await super.resolveDataIn();return Oe.parse(e)}};rt([U,he("design:type",Function),he("design:paramtypes",[]),he("design:returntype",Promise)],C.prototype,"resolveDataIn",null);var I="llm_cmp";var ke="cncl_ctrl",re={cancel:"st_cancel"},je={cancel:"cnl_cancel"};function fe(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(fe,"_ts_decorate");function D(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(D,"_ts_metadata");var j=class n extends C{static{l(this,"CancelContext")}static class=ke;static async start(e){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0},{force:!0})}static async stop(e){await J(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local({name:je.cancel},this.onCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCancel(){this.log.DEBUG?.("Canceling LLM request");let e=this.local.parent,t=this.process.getThread(e);if(!t||t.ended)return this.end();let r=ve({thread:this.thread});r?r.abort(new ne("Request cancelled")):this.process.enqueueAndRun({name:re.cancel,thread:e})}};fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"runStep",null);fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"initialize",null);fe([u,D("design:type",Function),D("design:paramtypes",[]),D("design:returntype",void 0)],j.prototype,"onCancel",null);import{ACTION as He}from"@onereach/flow-sdk/types/index.js";import{setImmediate as gt}from"timers/promises";import{clear as yt,Memoize as Ct}from"typescript-memoize";import{clear as ht,Memoize as Ue}from"typescript-memoize";var Ae="hst_ctrl",B={appendToHistory:"hst_append",prepareHistory:"hst_prepare",adjustOnCancel:"hst_cncl"};function Q(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Q,"_ts_decorate");function b(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(b,"_ts_metadata");var g=class n extends C{static{l(this,"HistoryContext")}static class=Ae;static async start(e){let t=this.getThreadId(e.step.id);e.process.getThread(t)==null&&await e.process.runThread({id:t,background:!0,state:{step:e.step.id,class:this.class,messages:[]}})}static async prepareHistory(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.prepareHistory})}static async appendToHistory(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.appendToHistory,params:{message:t}})}static async adjustOnCancel(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:B.adjustOnCancel})}static getHistory(e){return e.process.getSafeThread(this.getThreadId(e.step.id)).state.messages}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(B.prepareHistory,this.onPrepareHistory).local(B.appendToHistory,this.onAppendToHistory).local(B.adjustOnCancel,this.onAdjustOnCancel).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onAdjustOnCancel(){let e;for(;(e=this.state.messages.at(-1))&&!(["system","user"].includes(e.role)||e.role==="assistant"&&e.tool_calls==null);){let t=this.state.messages.pop();this.log.DEBUG?.("Removed message from history",t)}}onPrepareHistory(){this.log.DEBUG?.("Preparing history");let{customHistory:e,historyLength:t,systemMessage:r,typeOfStep:i,userMessage:o,historyMode:a,historyMergefield:c,historyCode:f,assistantsFirstMessage:w}=this.data;if(i==="completion"){this.state.messages=[{role:"user",content:o}];return}if(e){this.state.messages=a==="mergefield"?c:f;return}let m=this.state.messages;if(m.length===0&&w!=null&&w.length>0&&m.push({role:"assistant",content:w}),m.at(-1)?.role!=="tool"&&m.push({role:"user",content:o}),!m.some(P=>P.role==="tool")&&t!=null&&t>0&&(m=m.slice(-1*t)),r!=null&&r.length>0){let P={role:"system",content:r};m[0]?.role==="system"?m[0]=P:m.unshift(P)}this.state.messages=m}onAppendToHistory(e){this.log.DEBUG?.("Appending message to history",e.params);let{message:t}=e.params,r=Array.isArray(t)?t:[t];this.state.messages.push(...r)}};Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"runStep",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"initialize",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"onAdjustOnCancel",null);Q([u,b("design:type",Function),b("design:paramtypes",[]),b("design:returntype",void 0)],g.prototype,"onPrepareHistory",null);Q([u,b("design:type",Function),b("design:paramtypes",[typeof HistoryContextEventAppendToHistory>"u"?Object:HistoryContextEventAppendToHistory]),b("design:returntype",void 0)],g.prototype,"onAppendToHistory",null);import{BasicThreadService as it}from"@onereach/flow-sdk/services/basic.js";import{setImmediate as at}from"timers/promises";var se={handleContent:"hnd_cnt"};var W=class extends it{static{l(this,"AbstractResponseHandler")}async handleContentByParentThread(e){await at(),await this.thread.process.enqueueAndRun({thread:this.thread.local.parent,name:se.handleContent,params:{content:e}})}};var ie=class extends W{static{l(this,"SimpleResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing response from LLM"),await this.handleContentByParentThread(e),z({thread:this.thread})}};var ae=class extends W{static{l(this,"StreamResponseHandler")}async handle(e){this.log.DEBUG?.("Start processing stream of chunks from LLM");for await(let t of e)await this.handleContentByParentThread(t);z({thread:this.thread})}};function Pe({thread:n,isStreaming:e}){return e?new ae(n):new ie(n)}l(Pe,"responseHandlerFactory");var Le="rqst_ctx";import dt from"openai";import pt from"timestring";import{Memoize as ut}from"typescript-memoize";import{z as ce}from"zod/v4-mini";import{BasicThreadService as lt}from"@onereach/flow-sdk/services/basic.js";var le=class extends lt{static{l(this,"ThreadServiceWithData")}data;constructor(e,t){super(e),this.data=t}};function ct(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ct,"_ts_decorate");function Me(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(Me,"_ts_metadata");var $=class extends le{static{l(this,"OpenAIRequestService")}async makeOpenAiRequest(e,t){let{model:r,temperature:i,topP:o,maxTokens:a,frequencyPenalty:c,presencePenalty:f,n:w,streamResponse:m}=this.data,q={messages:structuredClone(e),model:r,temperature:i,top_p:o,max_tokens:a,frequency_penalty:c,presence_penalty:f,stop:this.stopSequences,n:w,stream:m,tools:this.tools};this.log.DEBUG?.("LLM request",q);try{let P=await this.openAiClient.chat.completions.create(q,{signal:t});return m||this.log.DEBUG?.("LLM response",P),P}catch(P){throw P instanceof Error?new h("Chat completion request failed",P,{code:p.SERVER_ERROR,data:q}):P}}get tools(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0))return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:!t.parameters||Object.keys(t.parameters).length===0?void 0:t.parameters,strict:t.strict}}))}get openAiClient(){let{provider:e,accountKey:t}=this.data,r={baseURL:`${this.config.env.OPENAI_API_URL}/${e}`,apiKey:"",defaultHeaders:{Authorization:this.config.authorization,"x-or-session-id":this.session.get(["reporting","sessionId"]),...t?{"x-or-account-token-name":t}:void 0},timeout:this.timeoutMs};return this.log.DEBUG?.("OpenAI client options",r),new dt(r)}get stopSequences(){return(this.data.stop??[]).map(t=>t.token).filter(t=>t.length>0)}get timeoutMs(){let e=pt(this.data.timeoutDuration,"ms");return ce.number().check(ce.int(),ce.gte(1e3),ce.lte(6e5)).parse(e)}};ct([ut(),Me("design:type",Number),Me("design:paramtypes",[])],$.prototype,"timeoutMs",null);function me(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(me,"_ts_decorate");function G(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(G,"_ts_metadata");var De=["requestInit"],_=class extends C{static{l(this,"RequestContext")}static class=Le;static async start(e){return await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class},background:!0})}static getThreadId(e){return`${I}_${this.class}_${e}`}async runStep(){ht(De);let e=_e({thread:this.thread});try{let t=await this.openAiService.makeOpenAiRequest(await this.getHistory(),e.signal);await this.responseHandler.handle(t),this.complete()}catch(t){if(e?.signal.aborted)return this.cancel();throw t}finally{z({thread:this.thread})}}cancel(){this.end({status:"cancel"})}complete(){this.end({status:"ok"})}async getHistory(){let e=g.getHistory(this.thread);if(!this.data.useState)return e;let t=[...e],i={role:"assistant",content:await this.data.stateSettings?.stateFunction()};return e.at(-1)?.role==="user"?t.splice(-1,0,i):t.push(i),t}get openAiService(){return new $(this.thread,this.data)}get responseHandler(){let e=this.data.streamResponse;return Pe({thread:this.thread,isStreaming:e})}};me([u,G("design:type",Function),G("design:paramtypes",[]),G("design:returntype",Promise)],_.prototype,"runStep",null);me([Ue(),G("design:type",typeof $>"u"?Object:$),G("design:paramtypes",[])],_.prototype,"openAiService",null);me([Ue({tags:De}),G("design:type",typeof AbstractResponseHandler>"u"?Object:AbstractResponseHandler),G("design:paramtypes",[])],_.prototype,"responseHandler",null);import{ACTION as mt}from"@onereach/flow-sdk/types/index.js";var Fe="tl_ctrl",Z={callTool:"tl_run_call",lastToolCallReceived:"tl_rsp_end"};var Ne="tl_wrk";function ft(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(ft,"_ts_decorate");function ge(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ge,"_ts_metadata");var L=class extends C{static{l(this,"ToolsContextWorker")}static class=Ne;static async start(e,t){let r=JSON.parse(t.function?.arguments);await k(e,{id:this.getThreadId(t),state:{step:e.step.id,class:this.class},local:{toolCall:t,parsedArguments:r,parent:e.id,active:!0}})}static getThreadId(e){return`${I}_${this.class}_${e.id}`}runStep(){let{toolCall:e,parsedArguments:t}=this.local;this.log.DEBUG?.("Initializing tool worker thread",e),this.exitStep(this.getExitName(),{function:{name:e.function.name,arguments:t}})}getExitName(){return"function"}};ft([U,ge("design:type",Function),ge("design:paramtypes",[]),ge("design:returntype",void 0)],L.prototype,"runStep",null);function X(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(X,"_ts_decorate");function v(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(v,"_ts_metadata");var E=class n extends C{static{l(this,"ToolsContext")}static class=Fe;static async start(e){let t=this.getThreadId(e.step.id);await k(e,{id:t,state:{step:e.step.id,class:this.class,tasks:{},expectMoreTasks:!0},background:!0})}static async callTool(e,t){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:Z.callTool,params:{toolCall:t}})}static async lastToolCallReceived(e){await e.process.enqueueAndRun({thread:this.getThreadId(e.step.id),name:Z.lastToolCallReceived})}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){this.triggers.local(Z.callTool,this.onCallTool).local(Z.lastToolCallReceived,this.onLastToolCallReceived).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${n.name} thread`)}onCallTool(e){let{toolCall:t}=e.params;if(t.type!=="function")throw new h("Only function tools are supported at the moment",{code:p.UNSUPPORTED});this.state.tasks[t.id]={call:t,status:"pending"},this.startToolWorkerThread(t)}onLastToolCallReceived(){this.log.DEBUG?.("No more tool calls expected",this.state.tasks),this.state.expectMoreTasks=!1,this.tryEndToolsContextThread()}onWorkerThreadEnd(e){this.log.DEBUG?.("Tool caller worker thread has ended",e);let{result:t}=e.params.thread;if(t==null)throw new h(`${L.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${L.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});t.status!=="cancel"&&(this.log.DEBUG?.("Tool worker thread completed successfully",{toolCallId:t.toolCallId,result:t.data}),this.setToolCallResult(t.toolCallId,t.data),this.tryEndToolsContextThread())}startToolWorkerThread(e){this.triggers.hook({name:mt.end,thread:L.getThreadId(e)},this.onWorkerThreadEnd),L.start(this.thread,e)}setToolCallResult(e,t){let r=this.state.tasks[e];if(r==null)throw new h(`Unknown tool call with id '${e}'`,{code:p.STEP_LOGIC_ISSUE});r.status="completed",r.result=t}tryEndToolsContextThread(){this.state.expectMoreTasks||Object.values(this.state.tasks).some(t=>t.status==="pending")||(this.log.DEBUG?.("All tool calls completed or failed",this.state.tasks),this.end({status:"ok",messages:this.messages}))}get messages(){return Object.values(this.state.tasks).map(e=>({role:"tool",tool_call_id:e.call.id,content:JSON.stringify(e.result)}))}};X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"runStep",null);X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"initialize",null);X([u,v("design:type",Function),v("design:paramtypes",[typeof ToolsContextEventCallTool>"u"?Object:ToolsContextEventCallTool]),v("design:returntype",void 0)],E.prototype,"onCallTool",null);X([u,v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",void 0)],E.prototype,"onLastToolCallReceived",null);X([u,v("design:type",Function),v("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),v("design:returntype",void 0)],E.prototype,"onWorkerThreadEnd",null);function Y(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Y,"_ts_decorate");function R(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(R,"_ts_metadata");var Be=["toolsInit"],M=class extends C{static{l(this,"AbstractContentContext")}static get class(){throw new Error('Define "class" static field')}static getInitialState(){throw new Error('Define "getInitialState" static method')}runStep(){yt(Be),this.triggers.local(se.handleContent,this.onHandleContent).hook({name:He.end,thread:_.getThreadId(this.thread.step.id)},this.onRequestContextEnd).otherwise(this.initialize)}initialize(){this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`),_.start(this.thread)}async onRequestContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${_.name} thread ended with result`,t),t==null)throw new h(`${_.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${_.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return this.cancel();if(t.status!=="ok")throw new h(`Unexpected end of the ${_.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.requestComplete=!0,await this.onAllContentReceived(),this.state.toolsReady!=null&&(await gt(),await E.lastToolCallReceived(this.thread)),await this.tryToComplete()}async onToolsContextEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${E.name} thread ended`,t),t==null)throw new h(`${E.name} thread ended unexpectedly`,{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:`${E.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel")return;let{status:r,messages:i}=t;if(r!=="ok"||!Array.isArray(i))throw new h(`Unexpected end of the ${E.name} thread`,{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.state.toolsResults=i,this.state.toolsReady=!0,await this.tryToComplete()}async callFunction(e){this.state.toolsReady=!1,await this.initToolsContextThread(),await E.callTool(this.thread,e)}handleMultipleChoices(){let{chatCompletion:e}=this.state,t=e?.choices??[];t?.length>1&&this.log.WARN?.("Multiple choices received from LLM, but only the first one will be processed",{choices:t.length})}async initToolsContextThread(){this.triggers.hook({name:He.end,thread:E.getThreadId(this.thread.step.id)},this.onToolsContextEnd),await E.start(this.thread)}cancel(){this.end({status:"cancel"})}complete(){let{chatCompletion:e}=this.state;if(e==null)throw new h("Missing chat completion content to return value",{code:p.STEP_LOGIC_ISSUE});this.end({status:"ok",chatCompletion:e,toolsResults:this.state.toolsResults??[]})}};Y([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Object)],M.prototype,"runStep",null);Y([u,R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",void 0)],M.prototype,"initialize",null);Y([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",Promise)],M.prototype,"onRequestContextEnd",null);Y([u,R("design:type",Function),R("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),R("design:returntype",Promise)],M.prototype,"onToolsContextEnd",null);Y([Ct({tags:Be}),R("design:type",Function),R("design:paramtypes",[]),R("design:returntype",Promise)],M.prototype,"initToolsContextThread",null);function $e(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l($e,"_ts_decorate");function K(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(K,"_ts_metadata");var F=class extends M{static{l(this,"SimpleContentContext")}static class="cnt_cxt_smp";static getInitialState(){return{requestComplete:!1}}async onHandleContent(e){let{content:t}=e.params;this.state.chatCompletion=t;let r=t.choices[0]?.message.tool_calls;if(r!=null)for(let i of r)await this.callFunction(i)}onAllContentReceived(){this.handleMultipleChoices()}tryToComplete(){let{requestComplete:e,toolsReady:t}=this.state;!e||t===!1||this.complete()}};$e([u,K("design:type",Function),K("design:paramtypes",[typeof SimpleContentContextHandleContentEvent>"u"?Object:SimpleContentContextHandleContentEvent]),K("design:returntype",Promise)],F.prototype,"onHandleContent",null);$e([u,K("design:type",Function),K("design:paramtypes",[]),K("design:returntype",void 0)],F.prototype,"onAllContentReceived",null);var Ge="str_wrk",qe={chunk:"chunk"};function Et(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(Et,"_ts_decorate");function ye(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(ye,"_ts_metadata");var A=class extends C{static{l(this,"StreamContentContextWorker")}static class=Ge;static async start(e,t){await k(e,{id:this.getThreadId(e.step.id),state:{step:e.step.id,class:this.class,event:t}})}static isBusy(e){return Se(e,this.getThreadId(e.step.id))}static getThreadId(e){return`${I}_${this.class}_${e}`}runStep(){if(!("event"in this.state)||this.state.event==null)throw new h("Stream worker thread state must contain an event to process",{code:p.STEP_LOGIC_ISSUE});let e=this.state.event;this.log.DEBUG?.("Executing stream worker thread",e),this.exitStep(qe.chunk,{chunk:e})}};Et([U,ye("design:type",Function),ye("design:paramtypes",[]),ye("design:returntype",void 0)],A.prototype,"runStep",null);import{ACTION as Tt}from"@onereach/flow-sdk/types/index.js";import{clear as wt,Memoize as Ke}from"typescript-memoize";import{z as d}from"zod/v4-mini";var ze=d.looseObject({name:d.string(),params:d.looseObject({content:d.looseObject({id:d.string(),object:d.literal("chat.completion.chunk"),created:d.number(),model:d.string(),service_tier:d.nullish(d.enum(["default","auto","flex","scale","priority"])),choices:d.array(d.looseObject({index:d.number().check(d.int(),d.gte(0)),delta:d.looseObject({role:d.optional(d.enum(["developer","system","user","assistant","tool"])),content:d.nullish(d.string()),refusal:d.nullish(d.string()),tool_calls:d.optional(d.array(d.looseObject({index:d.number().check(d.int(),d.gte(0)),id:d.optional(d.string()),type:d.optional(d.literal("function")),function:d.looseObject({name:d.optional(d.string()),arguments:d.optional(d.string())})})))}),logprobs:d.nullish(d.any()),finish_reason:d.nullable(d.enum(["stop","length","tool_calls","content_filter"]))})),logprobs:d.nullish(d.looseObject({content:d.nullable(d.array(d.looseObject({}))),refusal:d.nullable(d.array(d.looseObject({})))})),usage:d.nullish(d.looseObject({prompt_tokens:d.number(),completion_tokens:d.number(),total_tokens:d.number(),completion_tokens_details:d.optional(d.looseObject({accepted_prediction_tokens:d.optional(d.number()),audio_tokens:d.optional(d.number()),reasoning_tokens:d.optional(d.number()),rejected_prediction_tokens:d.optional(d.number())})),prompt_tokens_details:d.optional(d.looseObject({audio_tokens:d.optional(d.number()),cached_tokens:d.optional(d.number())}))}))})})});var de=class{static{l(this,"StreamReducerService")}_result;_onToolCall;constructor(e,t){this._result=e,this._onToolCall=t}reduceChunk(e){if(Object.keys(this._result).length===0){let{choices:t,...r}=e;Object.assign(this._result,r),this._result.object!=null&&(this._result.object="chat.completion")}e.usage&&(this._result.usage=e.usage);for(let t of e.choices){let r=this._result.choices?.[t.index];if(!r){let{delta:i,...o}=t;r=o,this._result.choices??=[],this._result.choices[t.index]=r}if(t.finish_reason!=null&&(r.finish_reason=t.finish_reason),t.logprobs!=null&&(r.logprobs=t.logprobs),t.delta?.content!==void 0){let{content:i,...o}=t.delta;r.message??=o,i===null?r.message.content??=null:(r.message.content??="",r.message.content+=i)}if(t.delta?.tool_calls!=null){let{tool_calls:i,...o}=t.delta;r.message??=o,r.message.tool_calls??=[];for(let a of t.delta.tool_calls){let c=a.index;if(r.message.tool_calls[c]==null)r.message.tool_calls[c]=structuredClone(a);else{let f=r.message.tool_calls[c];if(!("function"in f)||f.function==null)continue;f.function.arguments+=a.function?.arguments??""}t.index===0&&this.tryParseToolCall(r.message.tool_calls[c])}}}}tryParseToolCall(e){try{if(!("function"in e)||e.function==null)return;let t=JSON.parse(e.function.arguments);this._onToolCall(e,t)}catch{}}};var We="cnt_cxt_str";function V(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(V,"_ts_decorate");function T(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(T,"_ts_metadata");var Ce=["streamInit"],O=class n extends M{static{l(this,"StreamContentContext")}static class=We;static getInitialState(){return{class:n.class,requestComplete:!1,workerComplete:!1,partialChatCompletion:{},events:[],lastChunkReceived:!1,index:-1}}async runStep(){await super.runStep(),wt(Ce),this.triggers.hook({name:Tt.end,thread:A.getThreadId(this.thread.step.id)},this.onWorkerThreadEnd)}onWorkerThreadEnd(e){let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${A.name} thread finished processing chunk`,t),t instanceof Error)throw x(t,{unknownMessage:`${A.name} thread ended with an error`});t?.status!=="cancel"&&this.tryRunWorker()}onHandleContent(e){let r=ze.parse(e).params.content;new de(this.state.partialChatCompletion,this.onToolCall.bind(this)).reduceChunk(r);for(let o of r.choices){if(o.index>0)continue;let a=o.delta?.content;a!=null&&a.length>0&&(this.addContentToQueue(a),this.scheduleNextContentEvent())}}onAllContentReceived(){this.log.DEBUG?.("All LLM response chunks were received. No more response chunks expected"),this.state.chatCompletion=this.state.partialChatCompletion,this.handleMultipleChoices(),this.state.events.push({lastChunkReceived:!0}),this.state.lastChunkReceived=!0,this.tryRunWorker()}onToolCall(e){this.log.DEBUG?.("Tool call received",e),this.callFunction(e)}scheduleNextContentEvent(){let e=this.state.events[0];e==null||!this.isEventReady(e)||"lastChunkReceived"in e||this.tryRunWorker()}addContentToQueue(e){let t=this.state.events.at(-1);if(t!=null){if("lastChunkReceived"in t){this.log.WARN?.("A new chunk received after the `lastChunkReceived` event. Ignoring it.");return}if(t.content.length<this.maxChunkContentLength){let r=`${t.content}${e}`;t.content=r.slice(0,this.maxChunkContentLength),e=r.slice(this.maxChunkContentLength)}}for(;e;){this.state.index+=1;let r={content:e.slice(0,this.maxChunkContentLength),index:this.state.index,ts:Date.now()};this.log.DEBUG?.("Add new event into the queue",r),this.state.events.push(r),e=e.slice(this.maxChunkContentLength)}}tryRunWorker(){if(A.isBusy(this.thread)){this.log.DEBUG?.("Skip event processing. Worker thread is busy");return}let e=this.getEventToProcess();if(e!=null){if("lastChunkReceived"in e){this.log.DEBUG?.(`Stopping ${n.name} thread. All response content chunks were processed and no new chunks are coming`),this.state.workerComplete=!0,this.tryToComplete();return}this.log.DEBUG?.("Notify stream worker thread about response chunk to process",e),A.start(this.thread,e)}}isEventReady(e){if(e==null)return!1;if("lastChunkReceived"in e)return!0;if(e.content==null)return!1;let t=Date.now()-e.ts;return this.state.lastChunkReceived||t>=this.debounceDuration||e.content.length>=this.maxChunkContentLength}getEventToProcess(){let e=this.state.events[0];if(e!=null&&this.isEventReady(e))return"lastChunkReceived"in e||this.state.events.shift(),e}tryToComplete(){let{chatCompletion:e,toolsReady:t,requestComplete:r,workerComplete:i}=this.state;if(!i||!r||t===!1||e==null)return;if(e.choices?.[0]?.message==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});this.complete()}get maxChunkContentLength(){return this.data.streamSettings?.maxBufferLength??100}get debounceDuration(){return this.data.streamSettings?.debounceDuration??200}};V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",Promise)],O.prototype,"runStep",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),T("design:returntype",void 0)],O.prototype,"onWorkerThreadEnd",null);V([u,T("design:type",Function),T("design:paramtypes",[typeof StreamContentContextHandleContentEvent>"u"?Object:StreamContentContextHandleContentEvent]),T("design:returntype",void 0)],O.prototype,"onHandleContent",null);V([u,T("design:type",Function),T("design:paramtypes",[]),T("design:returntype",void 0)],O.prototype,"onAllContentReceived",null);V([Ke({tags:Ce}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"maxChunkContentLength",null);V([Ke({tags:Ce}),T("design:type",Number),T("design:paramtypes",[])],O.prototype,"debounceDuration",null);import{ACTION as Je}from"@onereach/flow-sdk/types/index.js";import{Memoize as bt}from"typescript-memoize";function xt(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(xt,"_ts_decorate");function Ee(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(Ee,"_ts_metadata");var ee=class n{static{l(this,"ContentContextUtilities")}static factory(e){let t=e?O:F;return new n(t)}Constructor;constructor(e){this.Constructor=e}async start(e){let t=this.Constructor.getInitialState();await k(e,{id:this.getThreadId(e.step.id),state:{...t,requestComplete:!1,step:e.step.id,class:this.Constructor.class},background:!0})}async cancel(e){await J(e,this.getThreadId(e.step.id),{result:{status:"cancel"},stopChildThreads:!0})}getThreadId(e){return`${I}_${this.Constructor.class}_${e}`}};xt([bt(),Ee("design:type",Function),Ee("design:paramtypes",[Boolean]),Ee("design:returntype",Object)],ee,"factory",null);import{readFile as _t}from"fs/promises";import{createRequire as vt}from"module";var Rt=vt(import.meta.url);async function Ve(n){if(typeof n!="string"||!/^\d+\.\d+\.\d+$/.test(n))throw new Error(`Invalid minimum version format: ${n}`);let e=Rt.resolve("@onereach/flow-sdk/package.json");if(!e)throw new Error("Could not find package.json for @onereach/flow-sdk");let t=await _t(e,"utf8"),{version:r}=JSON.parse(t),{groups:i}=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/.exec(r)||{};if(!i)throw new Error(`Invalid Flow SDK version format: ${r}`);let o=Number.parseInt(i.major??"0",10),a=Number.parseInt(i.minor??"0",10),c=Number.parseInt(i.patch??"0",10);if(o==null||a==null||c==null||Number.isNaN(o)||Number.isNaN(a)||Number.isNaN(c))throw new Error(`Invalid version format: ${r}`);let[f,w,m]=n.split(".").map(q=>Number.parseInt(q,10));if(f==null||w==null||m==null||Number.isNaN(f)||Number.isNaN(w)||Number.isNaN(m))throw new Error(`Invalid minimum version format: ${n}`);if(o<f||o===f&&a<w||o===f&&a===w&&c<m)throw new Error(`Flow SDK version '${r}' is lower than required minimum version '${n}' for the step`)}l(Ve,"validateFlowSdkVersion");function te(n,e,t,r){var i=arguments.length,o=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(o=(i<3?a(o):i>3?a(e,t,o):a(e,t))||o);return i>3&&o&&Object.defineProperty(e,t,o),o}l(te,"_ts_decorate");function S(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)}l(S,"_ts_metadata");var St="8.0.72",H=class extends C{static{l(this,"CreateChatCompletionStep")}runStep(){this.triggers.hook({name:Je.end,thread:this.contentContext.getThreadId(this.thread.step.id)},this.onContentContextEnd),this.triggers.hook({name:Je.end,thread:g.getThreadId(this.thread.step.id)},this.onHistoryContextEnd),this.triggers.local(re.cancel,this.onCancel),this.triggers.otherwise(this.initialize)}async initialize(){await Ve(St),this.validateMergeFieldType(),this.resetState(),this.state.cancelled=!1,await Promise.all([g.start(this.thread),j.start(this.thread)]),await g.prepareHistory(this.thread),await this.contentContext.start(this.thread)}async onContentContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.("ContentContext thread ended with result",t),t==null)throw new h("ContentContext thread ended unexpectedly",{code:p.STEP_LOGIC_ISSUE});if(t instanceof Error)throw x(t,{unknownMessage:"ContentContext thread ended with an error",unknownCode:p.STEP_LOGIC_ISSUE});if(t.status==="cancel"){await this.resetStep();return}let{status:r,chatCompletion:i,toolsResults:o}=t;if(r!=="ok"||i==null||o==null)throw new h("Unexpected end of the ContentContext thread",{code:p.STEP_LOGIC_ISSUE,data:e.params.result});this.log.DEBUG?.("Create Chat Completion result",i),this.state.contentReady=!0,this.state.chatCompletion=i,this.state.toolsResults=o,await this.tryToExitStep()}catch(t){throw await this.resetStep().catch(()=>{}),t}}async onHistoryContextEnd(e){try{let{result:t}=e.params.thread;if(this.log.DEBUG?.(`${g.name} thread ended with result`,t),t instanceof Error)throw x(t,{unknownMessage:`${g.name} thread ended with an error`,unknownCode:p.STEP_LOGIC_ISSUE})}catch(t){throw await j.stop(this.thread).catch(()=>{}),t}}async onCancel(){await this.resetStep()}async tryToExitStep(){let{cancelled:e,contentReady:t,chatCompletion:r,toolsResults:i}=this.state;if(e){this.resetState();return}if(!t)return;if(r==null)throw new h("Missing chat completion result, but request is marked as processed",{code:p.STEP_LOGIC_ISSUE});let o=r.choices?.[0]?.message;if(o==null)throw new h("Missing completion message in chat completion result",{code:p.STEP_LOGIC_ISSUE});await Promise.all([g.appendToHistory(this.thread,[o,...i]),j.stop(this.thread)]);let a=r.choices[0]?.finish_reason;if(a==="length")throw new h("Reached limit of tokens for LLM completion response",{code:p.LLM_FINISH_LENGTH});if(a==="tool_calls"){this.thread.jumpTo(this.currentStepId);return}this.log.DEBUG?.("Exiting step with collected data",r),this.exitStep("next",r)}async resetStep(){this.resetState(),this.state.cancelled=!0;let t=(await Promise.allSettled([ue(this.thread,{status:"cancel"}),g.adjustOnCancel(this.thread)])).find(r=>r.status==="rejected");if(t)throw t.reason}resetState(){this.state.contentReady=!1,this.state.chatCompletion=void 0,this.state.toolsResults=[]}validateMergeFieldType(){let{functionsList:e}=this.data;if(!(!Array.isArray(e)||e.length===0)&&(this.dataOut==null||this.getMergeField(this.dataOut).type!=="thread"))throw new h('Merge-field type has to be "Thread" if you are using functions',{code:p.VALIDATION})}get contentContext(){let e=this.data.streamResponse;return ee.factory(e)}};te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",void 0)],H.prototype,"runStep",null);te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"initialize",null);te([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onContentContextEnd",null);te([u({allowHandleError:!0}),S("design:type",Function),S("design:paramtypes",[typeof IActionEvent>"u"?Object:IActionEvent]),S("design:returntype",Promise)],H.prototype,"onHistoryContextEnd",null);te([U,S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",Promise)],H.prototype,"onCancel",null);It();var Zr={[g.class]:g,[_.class]:_,[E.class]:E,[L.class]:L,[F.class]:F,[O.class]:O,[A.class]:A,[j.class]:j};export{Zr as states,H as step};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/decorators/background-thread-error-filter.ts","../src/errors/error-filter.ts","../src/errors/step-error.ts","../src/utils/create-method-decorator.ts","../src/utils/process-abort-controller.ts","../src/utils/thread-utilities.ts","../src/threads/base.ts","../src/decorators/error-filter.ts","../src/schemas/data-in.ts","../src/threads/cancel/cancel-context-types.ts","../src/threads/cancel/cancel-context.ts","../src/threads/content/abstract-content-context.ts","../src/threads/request/request-context.ts","../src/threads/history/history-context-types.ts","../src/threads/history/history-context.ts","../src/threads/request/response-handlers/abstract-response-handler.ts","../src/threads/content/abstract-content-context-types.ts","../src/threads/request/response-handlers/simple-response-handler.ts","../src/threads/request/response-handlers/stream-response-handler.ts","../src/threads/request/factories/response-handler.ts","../src/threads/request/request-context-types.ts","../src/threads/request/services/openai-request.ts","../src/services/thread-service-with-data.ts","../src/threads/tools/tools-context.ts","../src/threads/tools/tools-context-types.ts","../src/threads/tools/tools-context-worker-types.ts","../src/threads/tools/tools-context-worker.ts","../src/threads/content/simple/simple-content-context.ts","../src/threads/content/stream/stream-content-context-worker-types.ts","../src/threads/content/stream/stream-content-context-worker.ts","../src/threads/content/stream/stream-content-context.ts","../src/threads/content/stream/schemas/stream-chunk.ts","../src/threads/content/stream/services/stream-reducer.ts","../src/threads/content/stream/stream-content-context-types.ts","../src/step.ts","../src/threads/content/content-context-utilities.ts","../src/utils/validate-flow-sdk-version.ts"],"sourcesContent":["import { install } from 'source-map-support';\n\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { SimpleContentContext } from './threads/content/simple/simple-content-context.ts';\nimport { StreamContentContextWorker } from './threads/content/stream/stream-content-context-worker.ts';\nimport { StreamContentContext } from './threads/content/stream/stream-content-context.ts';\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { RequestContext } from './threads/request/request-context.ts';\nimport { ToolsContextWorker } from './threads/tools/tools-context-worker.ts';\nimport { ToolsContext } from './threads/tools/tools-context.ts';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const states = {\n [HistoryContext.class]: HistoryContext,\n [RequestContext.class]: RequestContext,\n [ToolsContext.class]: ToolsContext,\n [ToolsContextWorker.class]: ToolsContextWorker,\n [SimpleContentContext.class]: SimpleContentContext,\n [StreamContentContext.class]: StreamContentContext,\n [StreamContentContextWorker.class]: StreamContentContextWorker,\n [CancelContext.class]: CancelContext,\n};\n\nexport { CreateChatCompletionStep as step } from './step.ts';\n\nexport type * from './step-types.ts';\nexport type * from './threads/cancel/cancel-context-types.ts';\nexport type * from './threads/content/abstract-content-context-types.ts';\nexport type * from './threads/content/simple/simple-content-context-types.ts';\nexport type * from './threads/content/stream/stream-content-context-types.ts';\nexport type * from './threads/content/stream/stream-content-context-worker-types.ts';\nexport type * from './threads/history/history-context-types.ts';\nexport type * from './threads/request/request-context-types.ts';\nexport type * from './threads/tools/tools-context-types.ts';\nexport type * from './threads/tools/tools-context-worker-types.ts';\n","import type Step from '@onereach/flow-sdk/step.js';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\n\nimport { errorFilter } from '../errors/error-filter.ts';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\n\nconst defaultOptions: BackgroundThreadErrorFilterOptions = { allowHandleError: false, useErrorFilter: true };\n\n/**\n * Since errors in hooks are fatal and can't be processed this decorator allows to wrap hook handler\n * and manage errors by ending a thread with the error (preventing sending error to `error` exit)\n * @param options.allowHandleError - Default `false`. If `false` in case of error will end thread with error as result, if `true` will allow to handle error via 'error' exit\n * @param options.useErrorFilter - Default `true`. If `true` every error wild be processed with `errorFilter` utility function\n */\nexport const BackgroundThreadErrorFilter = createMethodDecoratorWithOptionalArguments(\n (options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error) => errorHandler.call(this, options, error, propertyKey));\n }\n\n return result;\n } catch (error) {\n return errorHandler.call(this, options, error, propertyKey) as ReturnType<typeof originalMethod>;\n }\n } as typeof originalMethod;\n },\n defaultOptions,\n);\n\nfunction errorHandler(\n this: Step,\n options: BackgroundThreadErrorFilterOptions,\n error: unknown,\n propertyKey: string | symbol,\n): void {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n const filteredError = options.useErrorFilter ? errorFilter(error) : error;\n\n if (filteredError instanceof Error) {\n if (options.allowHandleError) {\n // Send it to the 'error' exit and stop here\n this.thread.enqueue({ name: ACTION.error, error: filteredError });\n return;\n } else {\n // End the thread with the error and stop here\n this.end(filteredError);\n return;\n }\n }\n\n // Only throw if it's not an Error instance and you truly want to bubble it\n throw filteredError;\n}\n\nexport type BackgroundThreadErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout.js';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step-error.ts';\n\nconst defaultPreserveErrors = [CreateChatCompletionStepError, TimeoutError] as const;\nexport function errorFilter<P extends readonly AnyErrorClass[] = typeof defaultPreserveErrors>(\n error: unknown,\n options: ErrorFilterOptions<P> = {},\n): InstancesOf<P> | CreateChatCompletionStepError | TimeoutError {\n const {\n preserveErrors = defaultPreserveErrors,\n unknownMessage = 'Unknown error',\n unknownCode = ErrorCode.UNKNOWN,\n } = options;\n\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (preserveErrors?.some((ErrorClass) => error instanceof ErrorClass)) {\n return error as InstancesOf<P>;\n }\n\n // validation errors\n if (error instanceof z.core.$ZodError) {\n return new CreateChatCompletionStepError(z.prettifyError(error), error, {\n code: ErrorCode.VALIDATION,\n });\n }\n\n // if error is a string assume it's an error message\n if (typeof error === 'string') {\n return new CreateChatCompletionStepError(error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (error instanceof Error) {\n // timeout errors\n if (error.message.includes('Request timed out')) {\n return new TimeoutError('Timeout', error, { code: ErrorCode.TIMEOUT });\n }\n\n // TODO: fix interpreting of this kind of errors\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const responseErrorMessage: string | undefined = (error as unknown as any)?.response?.data?.error?.message;\n if (responseErrorMessage != undefined) {\n return new CreateChatCompletionStepError(responseErrorMessage, error, {\n code: ErrorCode.SERVER_ERROR,\n });\n }\n\n return new CreateChatCompletionStepError(unknownMessage, error, {\n code: unknownCode,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError(unknownMessage, {\n code: unknownCode,\n data: error,\n });\n}\n\nexport type ErrorFilterOptions<P extends readonly AnyErrorClass[]> = {\n /** Array of error classes that should not be wrapped */\n preserveErrors?: P;\n /** Error message to use when message is unknown */\n unknownMessage?: string;\n /** Error code to use when message is unknown */\n unknownCode?: keyof typeof ErrorCode;\n};\n\n/** Any Error class */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyErrorClass<E extends Error = Error> = new (...arguments_: any[]) => E;\n\n/** Turn a tuple/array of constructors into a union of their instance types. */\nexport type InstancesOf<Ctors extends readonly AnyErrorClass[]> =\n Ctors[number] extends AnyErrorClass<infer I> ? I : never;\n","import BaseError from '@onereach/flow-sdk/errors/base.js';\n\nexport const ErrorCode = {\n UNKNOWN: 'UNKNOWN',\n STEP_LOGIC_ISSUE: 'STEP_LOGIC_ISSUE',\n AUTH: 'AUTH',\n TIMEOUT: 'TIMEOUT',\n VALIDATION: 'VALIDATION',\n INVALID_REQUEST: 'INVALID_REQUEST',\n RATE_LIMITED: 'RATE_LIMITED',\n LLM_FINISH_LENGTH: 'LLM_FINISH_LENGTH',\n SERVER_ERROR: 'SERVER_ERROR',\n UNSUPPORTED: 'UNSUPPORTED',\n} as const;\n\nexport class CreateChatCompletionStepError extends BaseError<{\n code: keyof typeof ErrorCode;\n data?: unknown;\n}> {}\n\nexport class AbortRequestError extends BaseError {}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Creates a method decorator that can be used with or without options.\n * @param apply - Function that applies the decorator logic with given options.\n * @param defaultOptions - Default options to use if none are provided.\n */\nexport function createMethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction>(\n apply: (\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => T | TypedPropertyDescriptor<T> | void,\n defaultOptions: A,\n): MethodDecoratorWithOptionalArguments<A, T> {\n function runApply(\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void {\n const maybe = apply(options, target, propertyKey, descriptor);\n\n // If the decorator factory returned a wrapped function, assign it to the descriptor here\n if (typeof maybe === 'function') {\n const originalMethod = descriptor.value;\n const wrappedMethod = maybe as typeof originalMethod;\n\n if (originalMethod?.name != undefined) {\n try {\n Object.defineProperty(wrappedMethod, 'name', { value: originalMethod.name });\n } catch {\n // ignore if name is non-configurable\n }\n }\n\n descriptor.value = wrappedMethod;\n return descriptor;\n }\n\n // If a descriptor was returned or decorator mutated descriptor in-place, use that\n return maybe ?? descriptor;\n }\n\n return function decoratorOrFactory(\n argument0?: object | A,\n argument1?: string | symbol,\n argument2?: TypedPropertyDescriptor<T>,\n ): any {\n if (\n argument0 !== null &&\n typeof argument0 === 'object' &&\n (typeof argument1 === 'string' || typeof argument1 === 'symbol') &&\n argument2 !== null &&\n typeof argument2 === 'object'\n ) {\n // Called as plain decorator: @Decorator\n return runApply(defaultOptions, argument0, argument1, argument2);\n } else {\n // Called as decorator factory: @Decorator(options)\n const options = (argument0 as A) ?? defaultOptions;\n return (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => {\n return runApply(options, target, propertyKey, descriptor);\n };\n }\n };\n}\n\nexport type AnyFunction = (...arguments_: any[]) => any;\n\nexport type MethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction> =\n // Plain method decorator (three arguments)\n ((\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void) &\n // Decorator factory (optional options argument)\n ((options?: A) => MethodDecorator);\n","import type { CONFIG, IThread } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Create an AbortController in process cache.\n * It will be available during flow execution, but will disappear in the end of execution\n *\n * @throws If controller already exists will throw an error.\n */\nexport function createAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n const process = thread.process;\n\n if (process.cache[cacheKey] != undefined) throw new Error(`AbortController for key '${cacheKey}' already exists`);\n\n return (process.cache[cacheKey] = new AbortController());\n}\n\n/**\n * Get instance of AbortController from process cache\n */\nexport function getAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController | undefined {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n return thread.process.cache[cacheKey] as AbortController | undefined;\n}\n\n/**\n * Remove instance of AbortController from the cache\n *\n * If it does not exists, will not throw an error\n */\nexport function deleteAbortController<T extends CONFIG>({ thread, ...options }: AbortControllerParameters<T>): void {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n delete thread.process.cache[cacheKey];\n}\n\nexport function getAbortControllerKey<T extends CONFIG>({\n thread,\n prefix,\n stepId = thread.currentStepId,\n}: AbortControllerParameters<T>): string {\n const normalizedPrefix = prefix ? `${prefix}:` : '';\n return `${normalizedPrefix}abrt_ctrl:${stepId}`;\n}\n\nexport type AbortControllerParameters<T extends CONFIG> = {\n /** thread to access flow process */\n thread: IThread<T>;\n\n /** Optional step id to use for unique name. If not present will use `thread.currentStepId` */\n stepId?: string;\n\n /** Optional prefix in name if you need to create several controllers */\n prefix?: string;\n};\n","import { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { CONFIG, IThread, IThreadId, IThreadOptions, RESULT } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param thread The step to run the thread for.\n * @throws Error if the thread is not ended or if the state is not provided.\n */\nexport async function runChildThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n { id, state, local, ...options }: IThreadOptions<ThreadConfig>,\n { force }: { force?: boolean } = {},\n): Promise<RESULT<ThreadConfig>> {\n const threadToRun = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (threadToRun == undefined) {\n // create thread\n return await thread.thread.runThread<ThreadConfig>({\n ...options,\n id,\n state,\n local: {\n ...local,\n parent: thread.thread.id,\n active: true,\n },\n });\n } else {\n if (!force && !threadToRun.ended && threadToRun.local.active)\n throw new Error(`Thread with id '${id}' has not ended yet, cannot start it again`);\n if (state == undefined) throw new Error(`Thread with id '${id}' must have a state to run`);\n\n // reuse existing thread\n threadToRun.local.active = true;\n return await threadToRun.enqueueAndRun({\n name: ACTION.goto,\n state: {\n ...state,\n active: true,\n },\n });\n }\n}\n\nexport function isThreadBusy<StepConfig extends CONFIG, ThreadConfig extends CONFIG & ManagedThreadConfig>(\n thread: IThread<StepConfig>,\n threadId: IThreadId,\n): boolean {\n const threadToCheck = thread.process.getThread<ThreadConfig>(threadId);\n return Boolean(threadToCheck != undefined && threadToCheck.local.active && !threadToCheck.ended);\n}\n\nexport function listChildThreads<StepConfig extends CONFIG, ChildThreadConfig extends CONFIG & ManagedThreadConfig>(\n thread: IThread<StepConfig>,\n parentThreadId: IThreadId = thread.id,\n): IThread<ChildThreadConfig>[] {\n const childThreads = [];\n for (const threadId in thread.process.threads) {\n const item = thread.process.threads[threadId]! as unknown as IThread<ChildThreadConfig>;\n if (item?.local.parent === parentThreadId) childThreads.push(item);\n }\n return childThreads;\n}\n\nexport async function stopThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n id: IThreadId,\n { result, stopChildThreads }: { result?: RESULT<ThreadConfig>; stopChildThreads?: boolean } = {},\n): Promise<void> {\n const threadToStop = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`stopThread: thread with id '${id}'`);\n\n if (!threadToStop) return;\n\n if (stopChildThreads) await endChildThreads(threadToStop, result);\n\n if (!threadToStop.local.active) return;\n\n threadToStop.local.active = false;\n if (threadToStop.ended) return;\n\n await threadToStop.enqueueAndRun({ name: ACTION.ending, result });\n}\n\nexport async function endChildThreads<ThreadConfig extends CONFIG, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n result?: RESULT<ThreadConfig>,\n options: { throw?: boolean } = {},\n): Promise<PromiseSettledResult<void>[]> {\n const childThreads = listChildThreads(thread);\n const stopTasks = childThreads.map(\n async (child) => await stopThread(thread, child.id, { stopChildThreads: true, result }),\n );\n const stopResults = await Promise.allSettled(stopTasks);\n\n const throwError = options.throw ?? true;\n if (throwError) {\n const failedTask = stopResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n return stopResults;\n}\n\nexport type ManagedThreadLocal = {\n active: boolean;\n parent: IThreadId;\n};\n\nexport type ManagedThreadConfig = {\n local: ManagedThreadLocal;\n};\n","import Step from '@onereach/flow-sdk/step.js';\n\nimport { ErrorFilter } from '../decorators/error-filter.ts';\nimport { dataInSchema } from '../schemas/data-in.ts';\n\nimport type { BaseConfig } from './base-types.ts';\n\n// TODO: convert it into class decorator\nexport class BaseStep<T extends BaseConfig> extends Step<T> {\n @ErrorFilter\n public async resolveDataIn() {\n const dataIn = await super.resolveDataIn();\n\n // TODO: add some caching since this logic runs for every thread class\n // validate dataIn against schema\n return dataInSchema.parse(dataIn);\n }\n}\n\nexport const baseClassIdPrefix = 'llm_cmp';\n","import type Step from '@onereach/flow-sdk/step.js';\n\nimport { errorFilter } from '../errors/error-filter.ts';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\n\nconst defaultOptions = {};\n\n/**\n * Will wrap method with `errorFilter` for every error.\n */\nexport const ErrorFilter = createMethodDecoratorWithOptionalArguments((_options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error: unknown) => {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }) as ReturnType<typeof originalMethod>;\n }\n\n return result;\n } catch (error) {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }\n };\n}, defaultOptions);\n","import { en } from 'zod/v4/locales';\nimport { z } from 'zod/v4-mini';\n\nz.config(en());\n\n// string that prevents\nconst stringNoUndefinedSchema = z.string().check(\n z.trim(),\n z.refine((value) => !['undefined', 'null'].includes(value), {\n error: 'Unexpected undefined or null merge-field value',\n }),\n);\n\nconst messageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: stringNoUndefinedSchema,\n }),\n z.object({\n role: z.literal('user'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n }),\n z.object({\n role: z.literal('assistant'),\n content: z.nullable(stringNoUndefinedSchema),\n\n // TODO: add support for annotations and refusal\n // params to support in the future\n // refusal: z.nullable(z.string().check(z.trim(), z.minLength(1))),\n // annotations: z.optional(z.array(z.any())), // TODO: replace z.any() with more details\n tool_calls: z.optional(\n z.array(\n z.object({\n id: stringNoUndefinedSchema.check(z.minLength(1)),\n type: z.literal('function'),\n function: z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1)),\n arguments: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n }),\n ),\n ),\n }),\n z.object({\n role: z.literal('tool'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n tool_call_id: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n]);\nexport type Message = z.infer<typeof messageSchema>;\n\nconst functionParametersBaseSchema = z.object({\n type: z.literal('object'),\n properties: z.record(\n z.string().check(z.minLength(1), z.maxLength(64)),\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n items: z.optional(\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n }),\n ),\n }),\n ),\n // next two params would be injected with z.transform()\n // required: z.optional(z.array(z.string().check(z.minLength(1), z.maxLength(64)))),\n // additionalProperties: z._default(z.literal(false), false),\n});\nexport const dataInSchema = z\n .object({\n provider: stringNoUndefinedSchema.check(z.minLength(1)),\n model: stringNoUndefinedSchema.check(z.minLength(1)),\n accountKey: optionalStringValue(stringNoUndefinedSchema),\n\n typeOfStep: z.enum(['chat', 'completion']),\n\n systemMessage: z.optional(stringNoUndefinedSchema),\n userMessage: z.optional(stringNoUndefinedSchema),\n switchAssistantsMessage: z._default(z.boolean(), false), // Add assistant's first message\n assistantsFirstMessage: z.optional(stringNoUndefinedSchema),\n\n // llm generation\n temperature: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(2))),\n topP: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(1))),\n maxTokens: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1))),\n presencePenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n frequencyPenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n n: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(128))),\n stop: z.optional(\n z\n .array(\n z.object({\n token: z.string().check(z.minLength(1), z.maxLength(64)),\n }),\n )\n .check(z.maxLength(4)),\n ),\n\n // streaming\n streamResponse: z._default(z.boolean(), false),\n streamSettings: z.optional(\n z.object({\n maxBufferLength: z.coerce.number().check(\n z.overwrite((value) => (value === 0 ? 50 : value)), // default value is 50\n z.int(),\n z.gte(1),\n z.lte(32_768),\n ),\n debounceDuration: z.coerce.number().check(z.int(), z.gte(0), z.lte(10_000)), // in milliseconds\n }),\n ),\n\n // history\n customHistory: z._default(z.boolean(), false), // only for 'chat' mode\n historyLength: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(100))),\n historyMode: z.optional(z.enum(['mergefield', 'codeHistory'])),\n historyMergefield: z.optional(z.array(messageSchema)),\n historyCode: z.optional(z.array(messageSchema)),\n\n // function calls\n functionsList: z.array(\n z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64)),\n description: z.optional(stringNoUndefinedSchema.check(z.maxLength(1000))),\n parameters: z.optional(\n z.pipe(\n functionParametersBaseSchema,\n z.transform<\n z.infer<typeof functionParametersBaseSchema> & { additionalProperties: false; required: string[] }\n >((object) => {\n object.required = Object.keys(object.properties);\n object.additionalProperties = false;\n return object;\n }),\n ),\n ),\n strict: z.boolean(),\n }),\n ),\n\n processError: z.boolean(),\n processTimeout: z.boolean(),\n timeoutDuration: stringNoUndefinedSchema.check(z.trim(), z.minLength(1)),\n })\n .check(\n z.refine((data) => !data.streamResponse || data.provider === 'openai', {\n error: 'Streaming is only supported for OpenAI provider',\n }),\n z.refine((data) => !data.streamResponse || data.streamSettings !== undefined, {\n error: 'Missing \"Stream settings\" for response streaming mode',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n data.customHistory ||\n !data.switchAssistantsMessage ||\n data.assistantsFirstMessage !== undefined,\n { error: 'Missing \"Assistant\\'s first message\" value' },\n ),\n z.refine((data) => data.customHistory || data.userMessage !== undefined, {\n error: 'Missing \"User message\" value',\n }),\n z.refine((data) => data.typeOfStep !== 'chat' || !data.customHistory || data.historyMode !== undefined, {\n error: 'Missing \"History mode\" value',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield !== undefined,\n { error: 'Missing \"History\" data via merge-field' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via merge-field',\n },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode !== undefined,\n { error: 'Missing \"History\" data as code' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via code',\n },\n ),\n );\n\nexport type DataIn = z.infer<typeof dataInSchema>;\n\n/**\n * Convert empty string to undefined before running schema validation\n * @param schema schema to validate against\n * @param defaultValue optional default value\n */\nfunction optionalStringValue<T extends z.core.SomeType>(schema: T) {\n return z.pipe(\n z.union([z.undefined(), z.literal(''), schema]),\n z.transform((value) => (value === '' ? undefined : value)),\n );\n}\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const cancelContextClassId = 'cncl_ctrl';\n\nexport const parentEvents = {\n cancel: 'st_cancel',\n} as const;\nexport type ParentEventName = typeof parentEvents;\n\nexport const cancelContentEvents = {\n cancel: 'cnl_cancel',\n} as const;\nexport type CancelContentEventName = typeof cancelContentEvents;\n\nexport type CancelContextEvents = IEvent<unknown, CancelContentEventName['cancel']>;\n\nexport type CancelContextState = {\n class: typeof cancelContextClassId;\n};\n\nexport interface CancelContextConfig extends BaseChildConfig {\n state: CancelContextState;\n events: CancelContextEvents;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type { IThreadId, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { AbortRequestError } from '../../errors/step-error.ts';\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { getAbortController } from '../../utils/process-abort-controller.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport { cancelContextClassId, cancelContentEvents, parentEvents } from './cancel-context-types.ts';\nimport type { CancelContextConfig } from './cancel-context-types.ts';\n\nexport class CancelContext extends BaseStep<CancelContextConfig> {\n public static readonly class = cancelContextClassId;\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await runChildThread<CancelContextConfig, ChatCompletionConfig>(\n thread,\n {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n },\n { force: true },\n );\n }\n\n public static async stop(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread(thread, this.getThreadId(thread.step.id));\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers.local({ name: cancelContentEvents.cancel }, this.onCancel).otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n initialize(): void {\n this.log.DEBUG?.(`Initializing ${CancelContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCancel(): void {\n this.log.DEBUG?.('Canceling LLM request');\n const parentThreadId = this.local.parent;\n const parentThread = this.process.getThread<ChatCompletionConfig>(parentThreadId);\n\n if (!parentThread || parentThread.ended) return this.end();\n\n const abortController = getAbortController({ thread: this.thread });\n if (abortController) {\n // LLM request is active\n abortController.abort(new AbortRequestError('Request cancelled'));\n } else {\n // LLM request already ended\n void this.process.enqueueAndRun({ name: parentEvents.cancel, thread: parentThreadId });\n }\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport { setImmediate } from 'node:timers/promises';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport type { BaseChildResultCancel } from '../base-child-types.ts';\nimport { BaseStep } from '../base.ts';\nimport type { RequestContextConfig } from '../request/request-context-types.ts';\nimport { RequestContext } from '../request/request-context.ts';\nimport type { ToolsContextConfig } from '../tools/tools-context-types.ts';\nimport { ToolsContext } from '../tools/tools-context.ts';\n\nimport { contentContextEvents } from './abstract-content-context-types.ts';\nimport type {\n ContentContextConfig,\n ContentContextHandleContentEvent,\n ContentContextOkResult,\n ContentContextResult,\n} from './abstract-content-context-types.ts';\n\nconst memoizeTag = ['toolsInit'];\n\nexport abstract class AbstractContentContext<T extends ContentContextConfig> extends BaseStep<T> {\n public static get class(): string {\n throw new Error('Define \"class\" static field');\n }\n\n public static getInitialState<T extends ContentContextConfig>(): STATE<T> {\n throw new Error('Define \"getInitialState\" static method');\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void | Promise<void> {\n // reset init of tools thread on a fresh start\n clear(memoizeTag);\n\n // TODO: add hook for end of ToolsContext thread\n this.triggers\n .local(contentContextEvents.handleContent, this.onHandleContent)\n .hook<RequestContextConfig, ACTION.end>(\n { name: ACTION.end, thread: RequestContext.getThreadId(this.thread.step.id) },\n this.onRequestContextEnd,\n )\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize() {\n this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`);\n\n void RequestContext.start(this.thread);\n }\n\n public abstract onHandleContent(event: ContentContextHandleContentEvent): void | Promise<void>;\n protected abstract onAllContentReceived(): void | Promise<void>;\n protected abstract tryToComplete(): void | Promise<void>;\n\n @BackgroundThreadErrorFilter\n public async onRequestContextEnd(event: IActionEvent<RequestContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${RequestContext.name} thread ended with result`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${RequestContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${RequestContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n\n // do nothing on cancel\n if (result.status === 'cancel') return this.cancel();\n\n if (result.status !== 'ok') {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${RequestContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.requestComplete = true;\n await this.onAllContentReceived();\n\n if (this.state.toolsReady != undefined) {\n await setImmediate();\n // notify ToolsContext no more tool calls will be made\n await ToolsContext.lastToolCallReceived(this.thread);\n }\n\n await this.tryToComplete();\n }\n\n @BackgroundThreadErrorFilter\n public async onToolsContextEnd(event: IActionEvent<ToolsContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${ToolsContext.name} thread ended`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: validate result with zod schema\n\n // do nothing on cancel\n if (result.status === 'cancel') return;\n\n const { status, messages } = result;\n\n if (status !== 'ok' || !Array.isArray(messages)) {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${ToolsContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.toolsResults = messages;\n this.state.toolsReady = true;\n\n await this.tryToComplete();\n }\n\n protected async callFunction(toolCall: ChatCompletionMessageFunctionToolCall) {\n // wait for ToolController needed\n this.state.toolsReady = false;\n await this.initToolsContextThread();\n await ToolsContext.callTool(this.thread, toolCall);\n }\n\n protected handleMultipleChoices(): void {\n const { chatCompletion } = this.state;\n\n const choices = chatCompletion?.choices ?? [];\n if (choices?.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choices: choices.length,\n });\n }\n }\n\n @Memoize({ tags: memoizeTag })\n protected async initToolsContextThread() {\n // wait for the end of ToolsContext thread\n this.triggers.hook<ToolsContextConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContext.getThreadId(this.thread.step.id) },\n this.onToolsContextEnd,\n );\n\n await ToolsContext.start(this.thread);\n }\n\n protected cancel(): void {\n this.end({ status: 'cancel' } satisfies ContentContextResult as BaseChildResultCancel);\n }\n\n protected complete() {\n const { chatCompletion } = this.state;\n\n // TODO: add validation for ChatCompletion structure\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion content to return value', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.end({\n status: 'ok',\n chatCompletion,\n toolsResults: this.state.toolsResults ?? [],\n } satisfies ContentContextResult as ContentContextOkResult);\n }\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { createAbortController, deleteAbortController } from '../../utils/process-abort-controller.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context-types.ts';\nimport { HistoryContext } from '../history/history-context.ts';\n\nimport { responseHandlerFactory } from './factories/response-handler.ts';\nimport { requestContextClassId } from './request-context-types.ts';\nimport type { RequestContextConfig, RequestContextResult } from './request-context-types.ts';\nimport type { AbstractResponseHandler } from './response-handlers/abstract-response-handler.ts';\nimport { OpenAIRequestService } from './services/openai-request.ts';\n\nconst memoizeTag = ['requestInit'];\n\nexport class RequestContext extends BaseStep<RequestContextConfig> {\n public static readonly class = requestContextClassId;\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<RequestContextResult> {\n return await runChildThread<RequestContextConfig, T>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n clear(memoizeTag);\n const abortController = createAbortController({ thread: this.thread });\n try {\n const response = await this.openAiService.makeOpenAiRequest(this.history, abortController.signal);\n await this.responseHandler.handle(response);\n this.complete();\n } catch (error) {\n if (abortController?.signal.aborted) return this.cancel();\n throw error;\n } finally {\n deleteAbortController({ thread: this.thread });\n }\n }\n\n private cancel() {\n this.end({ status: 'cancel' });\n }\n\n private complete() {\n this.end({ status: 'ok' });\n }\n\n private get history(): ChatCompletionMessageParam[] {\n return HistoryContext.getHistory(this.thread);\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService {\n return new OpenAIRequestService(this.thread, this.data);\n }\n\n @Memoize({ tags: memoizeTag })\n private get responseHandler(): AbstractResponseHandler {\n const isStreaming = this.data.streamResponse;\n return responseHandlerFactory({\n thread: this.thread,\n isStreaming,\n });\n }\n}\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources';\n\nimport { BaseConfig } from '../base-types.ts';\n\nexport const historyContextClassId = 'hst_ctrl';\n\nexport const historyContextEvents = {\n appendToHistory: 'hst_append',\n prepareHistory: 'hst_prepare',\n adjustOnCancel: 'hst_cncl',\n} as const;\nexport type HistoryContextEventName = typeof historyContextEvents;\n\nexport type HistoryContextAppendParameters = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\nexport type HistoryContextEventAppendToHistory = IEvent<\n HistoryContextAppendParameters,\n HistoryContextEventName['appendToHistory']\n>;\nexport type HistoryContextEventPrepareHistory = IEvent<unknown, HistoryContextEventName['prepareHistory']>;\nexport type HistoryContextEventAdjustOnCancel = IEvent<unknown, HistoryContextEventName['adjustOnCancel']>;\nexport type HistoryContextEvent =\n | HistoryContextEventAppendToHistory\n | HistoryContextEventPrepareHistory\n | HistoryContextEventAdjustOnCancel;\n\nexport type HistoryContextState = {\n class: typeof historyContextClassId;\n\n /** messages to send to OpenAI API */\n messages: ChatCompletionMessageParam[];\n};\n\nexport interface HistoryContextConfig extends BaseConfig {\n state: HistoryContextState;\n events: HistoryContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type { CONFIG, IThreadId, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport { historyContextClassId, historyContextEvents } from './history-context-types.ts';\nimport type {\n HistoryContextConfig,\n HistoryContextEventName,\n HistoryContextAppendParameters,\n HistoryContextEventAppendToHistory,\n} from './history-context-types.ts';\n\nexport class HistoryContext extends BaseStep<HistoryContextConfig> {\n public static readonly class = historyContextClassId;\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const historyThreadId = this.getThreadId(thread.step.id);\n const historyThread = thread.process.getThread<HistoryContextConfig>(historyThreadId);\n\n if (historyThread != undefined) return; // thread already exists\n\n // create tools context thread\n await thread.process.runThread<HistoryContextConfig>({\n id: historyThreadId,\n background: true,\n state: {\n step: thread.step.id,\n class: this.class,\n\n messages: [],\n },\n });\n }\n\n public static async prepareHistory<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['prepareHistory']>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends ChatCompletionConfig>(\n thread: IThread<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['appendToHistory'], HistoryContextAppendParameters>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.appendToHistory,\n params: { message },\n });\n }\n\n public static async adjustOnCancel<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['adjustOnCancel']>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.adjustOnCancel,\n });\n }\n\n public static getHistory<T extends CONFIG>(thread: IThread<T>): ChatCompletionMessageParam[] {\n return thread.process.getSafeThread<HistoryContextConfig>(this.getThreadId(thread.step.id)).state.messages;\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(historyContextEvents.prepareHistory, this.onPrepareHistory)\n .local(historyContextEvents.appendToHistory, this.onAppendToHistory)\n .local(historyContextEvents.adjustOnCancel, this.onAdjustOnCancel)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${HistoryContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onAdjustOnCancel(): void {\n let message;\n while ((message = this.state.messages.at(-1))) {\n if (['system', 'user'].includes(message.role)) break;\n if (message.role === 'assistant' && message.tool_calls == undefined) break;\n\n const removedMessage = this.state.messages.pop();\n this.log.DEBUG?.('Removed message from history', removedMessage);\n }\n }\n\n @BackgroundThreadErrorFilter\n public onPrepareHistory(): void {\n this.log.DEBUG?.('Preparing history');\n\n const {\n customHistory,\n historyLength,\n systemMessage,\n typeOfStep,\n userMessage,\n historyMode,\n historyMergefield,\n historyCode,\n assistantsFirstMessage,\n } = this.data;\n\n // 1. text completion mode\n if (typeOfStep === 'completion') {\n this.state.messages = [\n {\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n },\n ];\n return;\n }\n\n // 2. chat mode (custom history)\n if (customHistory) {\n this.state.messages = historyMode === 'mergefield' ? historyMergefield! : historyCode!;\n return;\n }\n\n // 3. chat mode (step managed history)\n let messages = this.state.messages;\n\n // is a fresh conversation?\n if (messages.length === 0 && assistantsFirstMessage != undefined && assistantsFirstMessage.length > 0) {\n messages.push({\n role: 'assistant',\n content: assistantsFirstMessage,\n });\n }\n\n // if last message is a tool response, assume user message is already in history\n if (messages.at(-1)?.role !== 'tool') {\n messages.push({\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n // TODO: add support for optional user name\n // name: userName,\n });\n }\n\n // trim history length\n const hasToolCalls = messages.some((message) => message.role === 'tool');\n if (!hasToolCalls && historyLength != undefined && historyLength > 0) {\n messages = messages.slice(-1 * historyLength);\n }\n\n // add system message as first message if it exists\n if (systemMessage != undefined && systemMessage.length > 0) {\n const systemMessageRecord = {\n role: 'system' as const,\n content: systemMessage,\n };\n\n if (messages[0]?.role === 'system') {\n messages[0] = systemMessageRecord; // replace existing system message\n } else {\n messages.unshift(systemMessageRecord); // add system message as first message\n }\n }\n\n // store history\n this.state.messages = messages;\n }\n\n @BackgroundThreadErrorFilter\n public onAppendToHistory(event: HistoryContextEventAppendToHistory): void {\n this.log.DEBUG?.('Appending message to history', event.params);\n\n const { message } = event.params;\n const messages = Array.isArray(message) ? message : [message];\n this.state.messages.push(...messages);\n }\n}\n","import { BasicThreadService } from '@onereach/flow-sdk/services/basic.js';\nimport { setImmediate } from 'node:timers/promises';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletion, ChatCompletionChunk } from 'openai/resources/index.js';\n\nimport { contentContextEvents } from '../../content/abstract-content-context-types.ts';\nimport type { RequestContextConfig } from '../request-context-types.ts';\n\nexport abstract class AbstractResponseHandler extends BasicThreadService<RequestContextConfig> {\n public abstract handle(response: ChatCompletion | Stream<ChatCompletionChunk>): Promise<void>;\n\n protected async handleContentByParentThread(content: ChatCompletion | ChatCompletionChunk): Promise<void> {\n await setImmediate();\n await this.thread.process.enqueueAndRun({\n thread: this.thread.local.parent,\n name: contentContextEvents.handleContent,\n params: { content },\n });\n }\n}\n","import type { IEvent, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionToolMessageParam } from 'openai/resources.mjs';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const contentContextEvents = {\n handleContent: 'hnd_cnt',\n} as const;\nexport type ContentContentEventName = typeof contentContextEvents;\n\nexport type ContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk | ChatCompletion },\n ContentContentEventName['handleContent']\n>;\n\nexport type ContentContextEvent = ContentContextHandleContentEvent;\n\nexport type ContentContextState = {\n requestComplete: boolean;\n chatCompletion?: ChatCompletion;\n /**\n * Are tool calls ready?\n * - `undefined` - no tools to wait for\n * - `false` - tools are processing\n * - `true` - tools finished processing\n */\n toolsReady?: boolean;\n toolsResults?: ChatCompletionToolMessageParam[];\n};\n\nexport type ContentContextOkResult = {\n status: 'ok';\n chatCompletion: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\nexport type ContentContextResult = ContentContextOkResult | RESULT<BaseChildConfig>;\n\nexport interface ContentContextConfig extends BaseChildConfig<ContentContextResult> {\n state: ContentContextState;\n result: ContentContextResult;\n events: ContentContextEvent;\n}\n","import type { ChatCompletion } from 'openai/resources.js';\n\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport { AbstractResponseHandler } from './abstract-response-handler.ts';\n\nexport class SimpleResponseHandler extends AbstractResponseHandler {\n public async handle(response: ChatCompletion): Promise<void> {\n this.log.DEBUG?.('Start processing response from LLM');\n await this.handleContentByParentThread(response);\n deleteAbortController({ thread: this.thread });\n }\n}\n","import type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletionChunk } from 'openai/resources.js';\n\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport { AbstractResponseHandler } from './abstract-response-handler.ts';\n\nexport class StreamResponseHandler extends AbstractResponseHandler {\n public async handle(response: Stream<ChatCompletionChunk>): Promise<void> {\n this.log.DEBUG?.('Start processing stream of chunks from LLM');\n\n for await (const chunk of response) {\n // send each chunk to the controller thread for processing\n await this.handleContentByParentThread(chunk);\n }\n\n deleteAbortController({ thread: this.thread });\n }\n}\n","import type { IThread } from '@onereach/flow-sdk/types/index.js';\n\nimport type { RequestContextConfig } from '../request-context-types.ts';\nimport type { AbstractResponseHandler } from '../response-handlers/abstract-response-handler.ts';\nimport { SimpleResponseHandler } from '../response-handlers/simple-response-handler.ts';\nimport { StreamResponseHandler } from '../response-handlers/stream-response-handler.ts';\n\nexport function responseHandlerFactory({\n thread,\n isStreaming,\n}: ResponseHandlerFactoryParameters): AbstractResponseHandler {\n if (isStreaming) return new StreamResponseHandler(thread);\n return new SimpleResponseHandler(thread);\n}\n\nexport type ResponseHandlerFactoryParameters = {\n thread: IThread<RequestContextConfig>;\n isStreaming: boolean;\n};\n","import type { RESULT } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const requestContextClassId = 'rqst_ctx';\n\nexport type RequestContextState = {\n class: typeof requestContextClassId;\n};\n\nexport type RequestContextResultOk = { status: 'ok' };\nexport type RequestContextResult = RequestContextResultOk | RESULT<BaseChildConfig>;\n\nexport interface RequestContextConfig extends BaseChildConfig<RequestContextResult> {\n state: RequestContextState;\n result: RequestContextResult;\n}\n","import OpenAI from 'openai';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions.mjs';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources.js';\nimport timestring from 'timestring';\nimport { Memoize } from 'typescript-memoize';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { ThreadServiceWithData } from '../../../services/thread-service-with-data.ts';\nimport { RequestContextConfig } from '../request-context-types.ts';\n\nexport class OpenAIRequestService extends ThreadServiceWithData<RequestContextConfig> {\n /**\n * Makes a request to the OpenAI API to create a chat completion.\n */\n public async makeOpenAiRequest(\n messages: ChatCompletionMessageParam[],\n signal?: AbortSignal,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const { model, temperature, topP, maxTokens, frequencyPenalty, presencePenalty, n, streamResponse } = this.data;\n\n const request: ChatCompletionCreateParamsBase = {\n messages: structuredClone(messages), // clone to avoid mutation\n model,\n temperature,\n top_p: topP,\n max_tokens: maxTokens,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n stop: this.stopSequences,\n n,\n stream: streamResponse,\n tools: this.tools,\n reasoning_effort: 'none',\n };\n this.log.DEBUG?.('LLM request', request);\n\n try {\n const response = await this.openAiClient.chat.completions.create(request, { signal });\n\n if (!streamResponse) this.log.DEBUG?.('LLM response', response);\n\n return response;\n } catch (error) {\n if (error instanceof Error === false) throw error;\n\n throw new CreateChatCompletionStepError('Chat completion request failed', error, {\n code: ErrorCode.SERVER_ERROR,\n data: request,\n });\n }\n }\n\n private get tools(): ChatCompletionTool[] | undefined {\n const { functionsList } = this.data;\n\n if (!Array.isArray(functionsList) || functionsList.length === 0) return undefined;\n\n return functionsList.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: !tool.parameters || Object.keys(tool.parameters).length === 0 ? undefined : tool.parameters,\n strict: tool.strict,\n },\n }));\n }\n\n /**\n * Returns the OpenAI client instance configured with the step's data.\n */\n private get openAiClient(): OpenAI {\n const { provider, accountKey } = this.data;\n\n const clientOptions = {\n baseURL: `${this.config.env.OPENAI_API_URL}/${provider}`,\n apiKey: '',\n defaultHeaders: {\n Authorization: this.config.authorization,\n 'x-or-session-id': this.session.get<string>(['reporting', 'sessionId']),\n ...(accountKey ? { 'x-or-account-token-name': accountKey } : undefined),\n },\n timeout: this.timeoutMs,\n };\n this.log.DEBUG?.('OpenAI client options', clientOptions);\n\n return new OpenAI(clientOptions);\n }\n\n private get stopSequences(): string[] {\n const list = this.data.stop ?? [];\n return list.map((item) => item.token).filter((token) => token.length > 0);\n }\n\n /**\n * Returns the timeout duration in milliseconds.\n */\n @Memoize()\n private get timeoutMs(): number {\n const value = timestring(this.data.timeoutDuration, 'ms');\n\n // 1 second to 10 minutes\n return z.number().check(z.int(), z.gte(1000), z.lte(600_000)).parse(value);\n }\n}\n","import { BasicThreadService } from '@onereach/flow-sdk/services/basic.js';\nimport type { CONFIG, IN, IThread } from '@onereach/flow-sdk/types/index.js';\n\nexport class ThreadServiceWithData<\n TConfig extends CONFIG,\n TData extends IN<CONFIG> = IN<TConfig>,\n> extends BasicThreadService<TConfig> {\n protected readonly data: TData;\n\n constructor(thread: IThread<TConfig>, data: TData) {\n super(thread);\n this.data = data;\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context-types.ts';\n\nimport { toolContextEvents, toolsContextClassId } from './tools-context-types.ts';\nimport type {\n ToolsContextConfig,\n ToolContextEventName,\n CallToolParameters,\n ToolsContextEventCallTool,\n} from './tools-context-types.ts';\nimport { ToolsContextWorkerConfig } from './tools-context-worker-types.ts';\nimport { ToolsContextWorker } from './tools-context-worker.ts';\n\nexport class ToolsContext extends BaseStep<ToolsContextConfig> {\n public static readonly class = toolsContextClassId;\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n const threadId = this.getThreadId(thread.step.id);\n await runChildThread<ToolsContextConfig, T>(thread, {\n id: threadId,\n state: {\n step: thread.step.id,\n class: this.class,\n\n /** tool calls from LLM response */\n tasks: {},\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: true,\n },\n background: true,\n });\n }\n\n public static async callTool<T extends ContentContextConfig>(\n thread: IThread<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await thread.process.enqueueAndRun<ToolContextEventName['callTool'], CallToolParameters>({\n thread: this.getThreadId(thread.step.id),\n name: toolContextEvents.callTool,\n params: { toolCall },\n });\n }\n\n /**\n * Notify tools context thread that no more tool calls are expected\n */\n public static async lastToolCallReceived<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<ToolContextEventName['lastToolCallReceived']>({\n thread: this.getThreadId(thread.step.id),\n name: toolContextEvents.lastToolCallReceived,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(toolContextEvents.callTool, this.onCallTool)\n .local(toolContextEvents.lastToolCallReceived, this.onLastToolCallReceived)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${ToolsContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCallTool(event: ToolsContextEventCallTool): void {\n const { toolCall } = event.params;\n\n // TODO: support other tool types\n if (toolCall.type !== 'function') {\n throw new CreateChatCompletionStepError('Only function tools are supported at the moment', {\n code: ErrorCode.UNSUPPORTED,\n });\n }\n\n this.state.tasks[toolCall.id] = {\n call: toolCall,\n status: 'pending',\n };\n\n this.startToolWorkerThread(toolCall);\n }\n\n @BackgroundThreadErrorFilter\n public onLastToolCallReceived(): void {\n this.log.DEBUG?.('No more tool calls expected', this.state.tasks);\n this.state.expectMoreTasks = false; // set flag to indicate no more tasks expected\n this.tryEndToolsContextThread();\n }\n\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<ToolsContextWorkerConfig, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params.thread;\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContextWorker.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContextWorker.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // if thread was cancelled do nothing\n if (result.status === 'cancel') return;\n\n // TODO: validate structure of the result (zod?)\n this.log.DEBUG?.(`Tool worker thread completed successfully`, {\n toolCallId: result.toolCallId,\n result: result.data,\n });\n this.setToolCallResult(result.toolCallId, result.data);\n\n this.tryEndToolsContextThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.triggers.hook<ToolsContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContextWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsContextWorker.start(this.thread, toolCall);\n }\n\n protected setToolCallResult(toolCallId: string, result: unknown): void {\n const toolCall = this.state.tasks[toolCallId];\n\n if (toolCall == undefined) {\n throw new CreateChatCompletionStepError(`Unknown tool call with id '${toolCallId}'`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n toolCall.status = 'completed';\n toolCall.result = result;\n }\n\n protected tryEndToolsContextThread(): void {\n if (this.state.expectMoreTasks) return;\n\n // TODO: handle errored out tool calls\n\n // check if all tool calls are completed\n const hasActiveTasks = Object.values(this.state.tasks).some((task) => task.status === 'pending');\n if (hasActiveTasks) return;\n\n this.log.DEBUG?.('All tool calls completed or failed', this.state.tasks);\n this.end({\n status: 'ok',\n messages: this.messages,\n });\n }\n\n protected get messages(): ChatCompletionToolMessageParam[] {\n return Object.values(this.state.tasks).map((task) => ({\n role: 'tool',\n tool_call_id: task.call.id,\n content: JSON.stringify(task.result),\n }));\n }\n}\n","import type { RESULT, IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const toolsContextClassId = 'tl_ctrl';\n\nexport const toolContextEvents = {\n callTool: 'tl_run_call',\n lastToolCallReceived: 'tl_rsp_end',\n} as const;\nexport type ToolContextEventName = typeof toolContextEvents;\n\nexport type ToolCallTask = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n\n /** result of the tool call, if completed */\n result?: unknown;\n};\nexport type TasksMap = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask>;\n\nexport type ToolsContextResultOk = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\nexport type ToolsContextResult = ToolsContextResultOk | RESULT<BaseChildConfig>;\n\nexport type CallToolParameters = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\nexport type ToolsContextEventCallTool = IEvent<CallToolParameters, ToolContextEventName['callTool']>;\nexport type ToolsContextEventLastToolReceived = IEvent<unknown, ToolContextEventName['lastToolCallReceived']>;\nexport type ToolsContextEvent = ToolsContextEventCallTool | ToolsContextEventLastToolReceived;\n\nexport type ToolsContextState = {\n class: typeof toolsContextClassId;\n\n /** tool calls from LLM response */\n tasks: TasksMap;\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: boolean;\n};\n\nexport interface ToolsContextConfig extends BaseChildConfig<ToolsContextResult> {\n state: ToolsContextState;\n events: ToolsContextEvent;\n}\n","import type { LOCAL, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const toolsContextWorkerClassId = 'tl_wrk';\n\nexport type ToolsContextParsedArguments = Record<string, unknown>;\nexport type ToolsContextWorkerMergeField = {\n function: {\n name: string;\n arguments: ToolsContextParsedArguments;\n };\n};\n\nexport type ToolsContextWorkerOut = ToolsContextWorkerMergeField;\n\nexport type ToolsContextWorkerState = {\n class: typeof toolsContextWorkerClassId;\n};\n\nexport type ToolsContextWorkerLocal = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: ToolsContextParsedArguments;\n} & LOCAL<BaseChildConfig>;\n\nexport type ThreadWorkerResultOk = {\n status: 'ok';\n\n /** id of the tool call that was processed */\n toolCallId: string;\n\n /** result of the tool call */\n data: unknown;\n};\nexport type ThreadWorkerResult = ThreadWorkerResultOk | RESULT<BaseChildConfig>;\n\nexport interface ToolsContextWorkerConfig extends BaseChildConfig<ThreadWorkerResult, ToolsContextWorkerLocal> {\n dataOut: ToolsContextWorkerOut;\n state: ToolsContextWorkerState;\n}\n","import type { IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\n\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport type { ToolsContextConfig } from './tools-context-types.ts';\nimport type { ToolsContextWorkerConfig, ToolsContextParsedArguments } from './tools-context-worker-types.ts';\nimport { toolsContextWorkerClassId } from './tools-context-worker-types.ts';\n\nexport class ToolsContextWorker extends BaseStep<ToolsContextWorkerConfig> {\n public static readonly class = toolsContextWorkerClassId;\n\n public static async start(\n thread: IThread<ToolsContextConfig>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n // parse tool call arguments if they are in string format\n const parsedArguments = JSON.parse(toolCall.function?.arguments) as ToolsContextParsedArguments;\n\n await runChildThread<ToolsContextWorkerConfig, ToolsContextConfig>(thread, {\n id: this.getThreadId(toolCall),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n\n // TODO: figure out how to remove these params without breaking typing\n parent: thread.id,\n active: true,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${toolCall.id}`;\n }\n\n // -----------------------------------------------------------------------------------\n\n /**\n * Initializes the tool worker thread to handle processing of repackaged content chunks.\n */\n @ErrorFilter\n public runStep(): void {\n const { toolCall, parsedArguments } = this.local;\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\n },\n });\n }\n\n protected getExitName(/*toolCall: ChatCompletionMessageFunctionToolCall*/): string {\n // TODO: add support for exits based on individual functions\n return 'function';\n }\n}\n","import type { STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\n\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\n\nimport type {\n SimpleContentContextConfig,\n SimpleContentContextHandleContentEvent,\n} from './simple-content-context-types.ts';\n\nexport class SimpleContentContext extends AbstractContentContext<SimpleContentContextConfig> {\n public static readonly class = 'cnt_cxt_smp';\n\n public static getInitialState(): STATE<SimpleContentContextConfig> {\n return {\n requestComplete: false,\n };\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public async onHandleContent(event: SimpleContentContextHandleContentEvent) {\n const { content } = event.params;\n\n this.state.chatCompletion = content;\n\n // Process tool calls if any\n const toolCalls = content.choices[0]?.message.tool_calls;\n if (toolCalls != undefined) {\n for (const toolCall of toolCalls) {\n // TODO: throw an error if tool call is not a function\n await this.callFunction(toolCall as ChatCompletionMessageFunctionToolCall);\n }\n }\n }\n\n @BackgroundThreadErrorFilter\n public onAllContentReceived() {\n this.handleMultipleChoices();\n }\n\n protected tryToComplete() {\n const { requestComplete, toolsReady } = this.state;\n\n // need to wait for request and tools to finish processing\n if (!requestComplete || toolsReady === false) return;\n\n this.complete();\n }\n}\n","import type { RESULT } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../../base-child-types.ts';\n\nexport const streamContentContextWorkerClassId = 'str_wrk';\n\nexport const streamWorkerExits = {\n chunk: 'chunk',\n} as const;\n\nexport type ContentChunk = {\n content: string;\n index: number;\n ts: number;\n};\n\nexport type StreamContentContextWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamContentContextWorkerState = {\n class: typeof streamContentContextWorkerClassId;\n\n event: ContentChunk;\n};\n\nexport type StreamContentContextWorkerResult = undefined | RESULT<BaseChildConfig>;\n\nexport interface StreamContentContextWorkerConfig extends BaseChildConfig<StreamContentContextWorkerResult> {\n dataOut: StreamContentContextWorkerOut;\n state: StreamContentContextWorkerState;\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\n\nimport { ErrorFilter } from '../../../decorators/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { isThreadBusy, runChildThread } from '../../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../../base.ts';\n\nimport type { StreamContentContextConfig } from './stream-content-context-types.ts';\nimport { streamContentContextWorkerClassId, streamWorkerExits } from './stream-content-context-worker-types.ts';\nimport type { StreamContentContextWorkerConfig, ContentChunk } from './stream-content-context-worker-types.ts';\n\nexport class StreamContentContextWorker extends BaseStep<StreamContentContextWorkerConfig> {\n public static readonly class = streamContentContextWorkerClassId;\n\n public static async start(thread: IThread<StreamContentContextConfig>, event: ContentChunk): Promise<void> {\n await runChildThread<StreamContentContextWorkerConfig, StreamContentContextConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(thread: IThread<StreamContentContextConfig>): boolean {\n return isThreadBusy<StreamContentContextConfig, StreamContentContextWorkerConfig>(\n thread,\n this.getThreadId(thread.step.id),\n );\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ----------------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n if ('event' in this.state === false || this.state.event == undefined) {\n throw new CreateChatCompletionStepError('Stream worker thread state must contain an event to process', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const chunk = this.state.event;\n this.log.DEBUG?.('Executing stream worker thread', chunk);\n this.exitStep(streamWorkerExits.chunk, { chunk });\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\n\nimport { streamChunkEventSchema } from './schemas/stream-chunk.ts';\nimport { StreamReducerService } from './services/stream-reducer.ts';\nimport { streamContentContextClassId } from './stream-content-context-types.ts';\nimport type {\n StreamContentContextConfig,\n StreamContentContextHandleContentEvent,\n ContentEvent,\n ContentChunkEvent,\n} from './stream-content-context-types.ts';\nimport { StreamContentContextWorkerConfig } from './stream-content-context-worker-types.ts';\nimport { StreamContentContextWorker } from './stream-content-context-worker.ts';\n\nconst memoizeTag = ['streamInit'];\n\nexport class StreamContentContext extends AbstractContentContext<StreamContentContextConfig> {\n public static readonly class = streamContentContextClassId;\n\n public static getInitialState(): STATE<StreamContentContextConfig> {\n return {\n class: StreamContentContext.class,\n requestComplete: false,\n workerComplete: false,\n\n partialChatCompletion: {},\n events: [],\n lastChunkReceived: false,\n index: -1,\n };\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n await super.runStep();\n\n clear(memoizeTag);\n\n this.triggers.hook<StreamContentContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamContentContextWorker.getThreadId(this.thread.step.id) },\n this.onWorkerThreadEnd,\n );\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<StreamContentContextWorkerConfig, ACTION.end>): void {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${StreamContentContextWorker.name} thread finished processing chunk`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${StreamContentContextWorker.name} thread ended with an error`,\n });\n throw resultError;\n }\n\n if (result?.status === 'cancel') return;\n\n // check if there are more tool calls or content chunks to process\n this.tryRunWorker();\n }\n\n /**\n * Handles a single chunk of the streaming response from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n public onHandleContent(event: StreamContentContextHandleContentEvent): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.content satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.partialChatCompletion, this.onToolCall.bind(this));\n streamReducer.reduceChunk(chunk);\n\n for (const chunkChoice of chunk.choices) {\n // this.log.DEBUG?.('LLM stream response chunk', chunkChoice);\n\n // skip streaming additional choices (if n > 1)\n if (chunkChoice.index > 0) continue;\n\n // aggregate content\n const content = chunkChoice.delta?.content;\n if (content != undefined && content.length > 0) {\n this.addContentToQueue(content);\n this.scheduleNextContentEvent();\n }\n }\n }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n protected onAllContentReceived(): void {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // TODO: maybe validate that completionResult is correct?\n this.state.chatCompletion = this.state.partialChatCompletion as ChatCompletion;\n\n this.handleMultipleChoices();\n\n // add fake event as marker for end of stream\n this.state.events.push({ lastChunkReceived: true });\n\n // mark last chunk was received in stream content context thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n }\n\n private onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void this.callFunction(toolCall);\n }\n\n /**\n * Tries to flush the queue of response chunks to the controller thread.\n * If the first event in the queue is not full, it waits for a debounce duration before flushing.\n * If the first event is full, it flushes it immediately.\n */\n private scheduleNextContentEvent(): void {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined || !this.isEventReady(firstEvent) || 'lastChunkReceived' in firstEvent) return;\n\n this.tryRunWorker();\n }\n\n /**\n * Compacts the content into the controller thread's events queue.\n * If the content is too long, it splits it into multiple events.\n * If the last event is not full, it extends it with the new content.\n */\n private addContentToQueue(content: string): void {\n // extend content chunk in the last event to max event size\n const lastEvent: ContentEvent | undefined = this.state.events.at(-1);\n\n if (lastEvent != undefined) {\n if ('lastChunkReceived' in lastEvent) {\n this.log.WARN?.('A new chunk received after the `lastChunkReceived` event. Ignoring it.');\n return;\n }\n\n if (lastEvent.content.length < this.maxChunkContentLength) {\n const mergedChunk = `${lastEvent.content}${content}`;\n // TODO: might be an issue with streaming to TTS\n lastEvent.content = mergedChunk.slice(0, this.maxChunkContentLength);\n // this.log.DEBUG?.('Compacting response chunk into last queue event', lastEvent);\n\n content = mergedChunk.slice(this.maxChunkContentLength);\n }\n }\n\n // split chunk into max socket size events\n while (content) {\n this.state.index += 1;\n\n const event: ContentChunkEvent = {\n // TODO: might be an issue with streaming to TTS\n content: content.slice(0, this.maxChunkContentLength),\n index: this.state.index,\n ts: Date.now(),\n };\n this.log.DEBUG?.('Add new event into the queue', event);\n this.state.events.push(event);\n\n content = content.slice(this.maxChunkContentLength);\n }\n }\n\n /**\n * Processes the next event in the controller thread's queue.\n * If the worker thread is busy, it skips processing.\n * If the event is the termination marker, it notifies the end of the controller thread.\n * If the event is ready for processing, it starts the worker thread to handle it.\n */\n private tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamContentContextWorker.isBusy(this.thread)) {\n this.log.DEBUG?.('Skip event processing. Worker thread is busy');\n return;\n }\n\n const event: ContentEvent | undefined = this.getEventToProcess();\n\n if (event == undefined) return;\n\n if ('lastChunkReceived' in event) {\n // if last chunk received, stop ContentContext thread with aggregated response\n this.log.DEBUG?.(\n `Stopping ${StreamContentContext.name} thread. All response content chunks were processed and no new chunks are coming`,\n );\n\n this.state.workerComplete = true;\n\n this.tryToComplete();\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamContentContextWorker.start(this.thread, event);\n }\n\n private isEventReady(event: ContentEvent): boolean {\n if (event == undefined) return false;\n if ('lastChunkReceived' in event) return true;\n if (event.content == undefined) return false; // TODO: is it even possible? add test for this use-case\n\n const eventDelay = Date.now() - event.ts;\n return (\n this.state.lastChunkReceived ||\n eventDelay >= this.debounceDuration ||\n event.content.length >= this.maxChunkContentLength\n );\n }\n\n private getEventToProcess(): ContentEvent | undefined {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined) return undefined;\n if (!this.isEventReady(firstEvent)) return undefined;\n if ('lastChunkReceived' in firstEvent) return firstEvent;\n\n this.state.events.shift();\n return firstEvent;\n }\n\n protected tryToComplete(): void {\n const { chatCompletion, toolsReady, requestComplete, workerComplete } = this.state;\n if (!workerComplete || !requestComplete || toolsReady === false || chatCompletion == undefined) return;\n\n const completionMessage = chatCompletion.choices?.[0]?.message;\n if (completionMessage == undefined) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.complete();\n }\n\n @Memoize({ tags: memoizeTag })\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n @Memoize({ tags: memoizeTag })\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n","import type { ChatCompletionChunk } from 'openai/resources';\nimport { z } from 'zod/v4-mini';\n\nexport const streamChunkEventSchema = z.looseObject({\n name: z.string(),\n params: z.looseObject({\n content: z.looseObject({\n id: z.string(),\n object: z.literal('chat.completion.chunk'),\n created: z.number(),\n model: z.string(),\n service_tier: z.nullish(z.enum(['default', 'auto', 'flex', 'scale', 'priority'])),\n choices: z.array(\n z.looseObject({\n index: z.number().check(z.int(), z.gte(0)),\n delta: z.looseObject({\n role: z.optional(z.enum(['developer', 'system', 'user', 'assistant', 'tool'])),\n content: z.nullish(z.string()),\n refusal: z.nullish(z.string()),\n tool_calls: z.optional(\n z.array(\n z.looseObject({\n index: z.number().check(z.int(), z.gte(0)),\n id: z.optional(z.string()),\n type: z.optional(z.literal('function')),\n function: z.looseObject({\n name: z.optional(z.string()),\n arguments: z.optional(z.string()),\n }),\n }) satisfies z.core.$ZodType<ChatCompletionChunk.Choice.Delta.ToolCall>,\n ),\n ),\n }),\n logprobs: z.nullish(z.any()), // logprobs may be null or omitted\n finish_reason: z.nullable(z.enum(['stop', 'length', 'tool_calls', 'content_filter'])),\n }),\n ),\n\n logprobs: z.nullish(\n z.looseObject({\n content: z.nullable(z.array(z.looseObject({}))),\n refusal: z.nullable(z.array(z.looseObject({}))),\n }),\n ),\n\n usage: z.nullish(\n z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n completion_tokens_details: z.optional(\n z.looseObject({\n accepted_prediction_tokens: z.optional(z.number()),\n audio_tokens: z.optional(z.number()),\n reasoning_tokens: z.optional(z.number()),\n rejected_prediction_tokens: z.optional(z.number()),\n }),\n ),\n prompt_tokens_details: z.optional(\n z.looseObject({\n audio_tokens: z.optional(z.number()),\n cached_tokens: z.optional(z.number()),\n }),\n ),\n }),\n ),\n }) satisfies z.core.$ZodType<ChatCompletionChunk>,\n }),\n});\n\nexport type StreamChunkEvent = z.infer<typeof streamChunkEventSchema>;\n","import type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n} from 'openai/resources.js';\n\nimport { ToolsContextParsedArguments } from '../../../tools/tools-context-worker-types.ts';\n\nexport class StreamReducerService<TArguments = ToolsContextParsedArguments> {\n protected _result: Partial<ChatCompletion>;\n protected readonly _onToolCall: OnToolCallCallback<TArguments>;\n\n constructor(memo: Partial<ChatCompletion>, onToolCall: OnToolCallCallback<TArguments>) {\n this._result = memo;\n this._onToolCall = onToolCall;\n }\n\n public reduceChunk(chunk: ChatCompletionChunk): void {\n if (Object.keys(this._result).length === 0) {\n const { choices, ...rest } = chunk; // eslint-disable-line @typescript-eslint/no-unused-vars\n Object.assign(this._result, rest);\n\n if (this._result.object != undefined) {\n this._result.object = 'chat.completion';\n }\n }\n\n if (chunk.usage) {\n this._result.usage = chunk.usage;\n // return\n }\n\n for (const choice of chunk.choices) {\n let existing = this._result.choices?.[choice.index];\n\n if (!existing) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { delta, ...rest } = choice;\n existing = rest as ChatCompletion.Choice;\n this._result.choices ??= [];\n this._result.choices[choice.index] = existing;\n }\n\n if (choice.finish_reason != undefined) {\n existing.finish_reason = choice.finish_reason;\n }\n\n if (choice.logprobs != undefined) {\n existing.logprobs = choice.logprobs;\n }\n\n if (choice.delta?.content !== undefined) {\n const { content, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n if (content === null) {\n // eslint-disable-next-line unicorn/no-null\n existing.message.content ??= null;\n } else {\n existing.message.content ??= '';\n existing.message.content += content;\n }\n }\n\n if (choice.delta?.tool_calls != undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { tool_calls, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n existing.message.tool_calls ??= [];\n\n for (const deltaToolCall of choice.delta.tool_calls) {\n const index = deltaToolCall.index;\n if (existing.message.tool_calls[index] == undefined) {\n existing.message.tool_calls[index] = structuredClone(\n deltaToolCall,\n ) as ChatCompletionMessageFunctionToolCall;\n } else {\n const toolCall = existing.message.tool_calls[index];\n if (!('function' in toolCall) || toolCall.function == undefined) continue;\n\n toolCall.function.arguments += deltaToolCall.function?.arguments ?? '';\n }\n\n // set immediate to not block the event loop\n if (choice.index === 0) {\n this.tryParseToolCall(existing.message.tool_calls[index]);\n }\n }\n }\n }\n }\n\n protected tryParseToolCall(toolCall: ChatCompletionMessageToolCall): void {\n try {\n if (!('function' in toolCall) || toolCall.function == undefined) return;\n const parsedArguments = JSON.parse(toolCall.function.arguments) as TArguments;\n this._onToolCall(toolCall, parsedArguments);\n } catch {\n // if failed to parse, just ignore it assume it's not fully loaded yet\n }\n }\n}\n\nexport type OnToolCallCallback<TArguments = ToolsContextParsedArguments> = (\n toolCall: ChatCompletionMessageFunctionToolCall,\n parsedArguments: TArguments,\n) => void;\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionChunk, ChatCompletion } from 'openai/resources';\n\nimport type {\n ContentContentEventName,\n ContentContextConfig,\n ContentContextState,\n} from '../abstract-content-context-types.ts';\n\nexport const streamContentContextClassId = 'cnt_cxt_str';\n\nexport type StreamContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk },\n ContentContentEventName['handleContent']\n>;\nexport type StreamContentContextEvent = StreamContentContextHandleContentEvent;\n\nexport type ContentChunkEvent = {\n content: string;\n index: number;\n ts: number;\n};\nexport type ContentEndEvent = {\n // marker for end of content stream\n lastChunkReceived: true;\n};\nexport type ContentEvent = ContentChunkEvent | ContentEndEvent;\nexport type StreamContentContextState = Omit<ContentContextState, 'class'> & {\n class: typeof streamContentContextClassId;\n\n /** aggregated result of the LLM response */\n partialChatCompletion: Partial<ChatCompletion>;\n\n /** queue of response chunks */\n events: ContentEvent[];\n\n /** last index for a chunk to be processed by worker */\n index: number;\n\n /** marker for end of response stream */\n lastChunkReceived: boolean;\n\n /** When `true` means worker finished the processing the queue */\n workerComplete: boolean;\n};\n\nexport interface StreamContentContextConfig extends ContentContextConfig {\n events: StreamContentContextEvent;\n state: StreamContentContextState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent } from '@onereach/flow-sdk/types/index.js';\n\nimport { BackgroundThreadErrorFilter } from './decorators/background-thread-error-filter.ts';\nimport { ErrorFilter } from './decorators/error-filter.ts';\nimport { errorFilter } from './errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step-error.ts';\nimport { ChatCompletionConfig } from './step-types.ts';\nimport { BaseStep } from './threads/base.ts';\nimport { parentEvents as stepEvents } from './threads/cancel/cancel-context-types.ts';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport type { ContentContextConfig } from './threads/content/abstract-content-context-types.ts';\nimport { ContentContextUtilities } from './threads/content/content-context-utilities.ts';\nimport { HistoryContextConfig } from './threads/history/history-context-types.ts';\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { endChildThreads } from './utils/thread-utilities.ts';\nimport { validateFlowSdkVersion } from './utils/validate-flow-sdk-version.ts';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.72';\n\nexport class CreateChatCompletionStep extends BaseStep<ChatCompletionConfig> {\n @ErrorFilter\n public runStep(): void {\n this.triggers.hook<ContentContextConfig, ACTION.end>(\n { name: ACTION.end, thread: this.contentContext.getThreadId(this.thread.step.id) },\n this.onContentContextEnd,\n );\n this.triggers.hook<HistoryContextConfig, ACTION.end>(\n { name: ACTION.end, thread: HistoryContext.getThreadId(this.thread.step.id) },\n this.onHistoryContextEnd,\n );\n this.triggers.local(stepEvents.cancel, this.onCancel);\n this.triggers.otherwise(this.initialize);\n }\n\n @ErrorFilter\n public async initialize(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n this.validateMergeFieldType();\n\n this.resetState();\n this.state.cancelled = false;\n\n await Promise.all([HistoryContext.start(this.thread), CancelContext.start(this.thread)]);\n\n // prepare messages history for the request\n await HistoryContext.prepareHistory(this.thread);\n\n // starting ContentContext thread will initiate the request to LLM\n await this.contentContext.start(this.thread);\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onContentContextEnd(event: IActionEvent<ContentContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.('ContentContext thread ended with result', result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError('ContentContext thread ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: 'ContentContext thread ended with an error',\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n if (result.status === 'cancel') {\n await this.resetStep();\n return;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, chatCompletion, toolsResults } = result;\n\n if (status !== 'ok' || chatCompletion == undefined || toolsResults == undefined) {\n throw new CreateChatCompletionStepError('Unexpected end of the ContentContext thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', chatCompletion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = chatCompletion;\n this.state.toolsResults = toolsResults;\n\n await this.tryToExitStep();\n } catch (error) {\n await this.resetStep().catch(() => {});\n throw error;\n }\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onHistoryContextEnd(event: IActionEvent<HistoryContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${HistoryContext.name} thread ended with result`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${HistoryContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n } catch (error) {\n await CancelContext.stop(this.thread).catch(() => {});\n throw error;\n }\n }\n\n @ErrorFilter\n public async onCancel(): Promise<void> {\n await this.resetStep();\n }\n\n private async tryToExitStep(): Promise<void> {\n const { cancelled, contentReady, chatCompletion, toolsResults } = this.state;\n\n if (cancelled) {\n // TODO: cleanup history with tool responses from it if \"second\" response was cancelled\n this.resetState();\n return;\n }\n\n if (!contentReady) return;\n\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const completionMessage = chatCompletion.choices?.[0]?.message;\n if (completionMessage == undefined) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n await Promise.all([\n // add completion message and possible tool results to history\n HistoryContext.appendToHistory(this.thread, [completionMessage, ...toolsResults]),\n // at this point there's nothing to cancel, so CancelContext thread is not needed anymore\n CancelContext.stop(this.thread),\n ]);\n\n const finishReason = chatCompletion.choices[0]?.finish_reason;\n if (finishReason === 'length') {\n // TODO: allow to proceed with partial data?\n throw new CreateChatCompletionStepError('Reached limit of tokens for LLM completion response', {\n code: ErrorCode.LLM_FINISH_LENGTH,\n });\n } else if (finishReason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\n }\n\n // both tools and content are ready, we can exit the step\n this.log.DEBUG?.('Exiting step with collected data', chatCompletion);\n this.exitStep('next', chatCompletion);\n }\n\n /**\n * Reset the step so it can handle new request\n *\n * - Reset state of initial thread (e.g. main) to original state;\n * - End CancelContext thread;\n * - End ContentController (with child thread);\n *\n * @throws if there any issues with stopping threads\n */\n private async resetStep(): Promise<void> {\n this.resetState();\n this.state.cancelled = true;\n\n const resetResults = await Promise.allSettled([\n endChildThreads(this.thread, { status: 'cancel' }),\n HistoryContext.adjustOnCancel(this.thread),\n ]);\n const failedTask = resetResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n private resetState(): void {\n this.state.contentReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n }\n\n private validateMergeFieldType(): void {\n const { functionsList } = this.data;\n if (!Array.isArray(functionsList) || functionsList.length === 0) return; // no functions used\n\n if (this.dataOut == undefined || this.getMergeField(this.dataOut).type !== 'thread') {\n throw new CreateChatCompletionStepError('Merge-field type has to be \"Thread\" if you are using functions', {\n code: ErrorCode.VALIDATION,\n });\n }\n }\n\n private get contentContext(): ContentContextUtilities {\n const isStreaming = this.data.streamResponse;\n return ContentContextUtilities.factory(isStreaming);\n }\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport { Memoize } from 'typescript-memoize';\n\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix } from '../base.ts';\n\nimport type { ContentContextConfig } from './abstract-content-context-types.ts';\nimport { SimpleContentContext } from './simple/simple-content-context.ts';\nimport { StreamContentContext } from './stream/stream-content-context.ts';\n\nexport class ContentContextUtilities {\n @Memoize()\n static factory(isStreaming: boolean): ContentContextUtilities {\n const Constructor: ContentContextConstructor = isStreaming ? StreamContentContext : SimpleContentContext;\n return new ContentContextUtilities(Constructor);\n }\n\n private Constructor: ContentContextConstructor;\n\n private constructor(Constructor: ContentContextConstructor) {\n this.Constructor = Constructor;\n }\n\n public async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const initialState = this.Constructor.getInitialState();\n await runChildThread<ContentContextConfig, ChatCompletionConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n ...initialState,\n requestComplete: false,\n step: thread.step.id,\n class: this.Constructor.class,\n },\n background: true,\n });\n }\n\n public async cancel(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread<ContentContextConfig, ChatCompletionConfig>(thread, this.getThreadId(thread.step.id), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.Constructor.class}_${stepId}`;\n }\n}\n\nexport type ContentContextConstructor = typeof SimpleContentContext | typeof StreamContentContext;\n","import { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nexport async function validateFlowSdkVersion(minVersion: string): Promise<void> {\n if (typeof minVersion !== 'string' || !/^\\d+\\.\\d+\\.\\d+$/.test(minVersion)) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n const packageJsonPath = require.resolve('@onereach/flow-sdk/package.json');\n if (!packageJsonPath) {\n throw new Error(`Could not find package.json for @onereach/flow-sdk`);\n }\n // Read the package.json file to get the version\n const packageJsonContent = await readFile(packageJsonPath, 'utf8');\n\n const { version } = JSON.parse(packageJsonContent) as { version: string };\n const { groups } = /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/.exec(version) || {};\n\n if (!groups) throw new Error(`Invalid Flow SDK version format: ${version}`);\n\n const major = Number.parseInt(groups.major ?? '0', 10);\n const minor = Number.parseInt(groups.minor ?? '0', 10);\n const patch = Number.parseInt(groups.patch ?? '0', 10);\n\n if (\n major == undefined ||\n minor == undefined ||\n patch == undefined ||\n Number.isNaN(major) ||\n Number.isNaN(minor) ||\n Number.isNaN(patch)\n ) {\n throw new Error(`Invalid version format: ${version}`);\n }\n\n const [minMajor, minMinor, minPatch] = minVersion.split('.').map((x) => Number.parseInt(x, 10));\n\n if (\n minMajor == undefined ||\n minMinor == undefined ||\n minPatch == undefined ||\n Number.isNaN(minMajor) ||\n Number.isNaN(minMinor) ||\n Number.isNaN(minPatch)\n ) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n if (\n major < minMajor ||\n (major === minMajor && minor < minMinor) ||\n (major === minMajor && minor === minMinor && patch < minPatch)\n ) {\n throw new Error(\n `Flow SDK version '${version}' is lower than required minimum version '${minVersion}' for the step`,\n );\n }\n}\n"],"mappings":"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","names":["install","ACTION","TimeoutError","z","BaseError","ErrorCode","UNKNOWN","STEP_LOGIC_ISSUE","AUTH","TIMEOUT","VALIDATION","INVALID_REQUEST","RATE_LIMITED","LLM_FINISH_LENGTH","SERVER_ERROR","UNSUPPORTED","CreateChatCompletionStepError","BaseError","AbortRequestError","defaultPreserveErrors","CreateChatCompletionStepError","TimeoutError","errorFilter","error","options","preserveErrors","unknownMessage","unknownCode","ErrorCode","UNKNOWN","some","ErrorClass","z","core","$ZodError","prettifyError","code","VALIDATION","Error","message","includes","TIMEOUT","responseErrorMessage","response","data","undefined","SERVER_ERROR","createMethodDecoratorWithOptionalArguments","apply","defaultOptions","runApply","options","target","propertyKey","descriptor","maybe","originalMethod","value","wrappedMethod","name","undefined","Object","defineProperty","__name","argument0","argument1","argument2","defaultOptions","allowHandleError","useErrorFilter","BackgroundThreadErrorFilter","createMethodDecoratorWithOptionalArguments","options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","errorHandler","call","methodName","toString","log","DEBUG","filteredError","errorFilter","Error","thread","enqueue","name","ACTION","end","createAbortController","thread","options","cacheKey","getAbortControllerKey","process","cache","undefined","Error","AbortController","getAbortController","deleteAbortController","prefix","stepId","currentStepId","normalizedPrefix","ACTION","runChildThread","thread","id","state","local","options","force","threadToRun","process","getThread","log","DEBUG","undefined","runThread","parent","active","ended","Error","enqueueAndRun","name","ACTION","goto","isThreadBusy","threadId","threadToCheck","Boolean","listChildThreads","parentThreadId","childThreads","threads","item","push","stopThread","result","stopChildThreads","threadToStop","endChildThreads","ending","stopTasks","map","child","stopResults","Promise","allSettled","throw","failedTask","find","task","status","reason","Step","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArguments","_options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","en","z","z","config","en","stringNoUndefinedSchema","string","check","trim","refine","value","includes","error","messageSchema","discriminatedUnion","object","role","literal","content","name","optional","minLength","maxLength","nullable","tool_calls","array","id","type","function","arguments","tool_call_id","functionParametersBaseSchema","properties","record","enum","description","items","dataInSchema","provider","model","accountKey","optionalStringValue","typeOfStep","systemMessage","userMessage","switchAssistantsMessage","_default","boolean","assistantsFirstMessage","temperature","coerce","number","gte","lte","topP","maxTokens","int","presencePenalty","frequencyPenalty","n","stop","token","streamResponse","streamSettings","maxBufferLength","overwrite","debounceDuration","customHistory","historyLength","historyMode","historyMergefield","historyCode","functionsList","parameters","pipe","transform","required","Object","keys","additionalProperties","strict","processError","processTimeout","timeoutDuration","data","undefined","find","message","schema","union","BaseStep","Step","resolveDataIn","dataIn","dataInSchema","parse","baseClassIdPrefix","cancelContextClassId","parentEvents","cancel","cancelContentEvents","_ts_decorate","decorators","target","key","desc","__name","CancelContext","BaseStep","class","cancelContextClassId","start","thread","runChildThread","id","getThreadId","step","state","background","force","stop","stopThread","stepId","baseClassIdPrefix","runStep","triggers","local","name","cancelContentEvents","cancel","onCancel","otherwise","initialize","log","DEBUG","parentThreadId","parent","parentThread","process","getThread","ended","end","abortController","getAbortController","abort","AbortRequestError","enqueueAndRun","parentEvents","ACTION","setImmediate","clear","Memoize","clear","Memoize","historyContextClassId","historyContextEvents","appendToHistory","prepareHistory","adjustOnCancel","_ts_decorate","decorators","target","key","desc","__name","HistoryContext","BaseStep","class","historyContextClassId","start","thread","historyThreadId","getThreadId","step","id","process","getThread","undefined","runThread","background","state","messages","prepareHistory","enqueueAndRun","name","historyContextEvents","appendToHistory","message","params","adjustOnCancel","getHistory","getSafeThread","stepId","baseClassIdPrefix","runStep","triggers","local","onPrepareHistory","onAppendToHistory","onAdjustOnCancel","otherwise","initialize","log","DEBUG","at","includes","role","tool_calls","removedMessage","pop","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","content","length","push","some","slice","systemMessageRecord","unshift","event","Array","isArray","BasicThreadService","setImmediate","contentContextEvents","handleContent","AbstractResponseHandler","BasicThreadService","handleContentByParentThread","content","setImmediate","thread","process","enqueueAndRun","local","parent","name","contentContextEvents","handleContent","params","SimpleResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","handleContentByParentThread","deleteAbortController","thread","StreamResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","chunk","handleContentByParentThread","deleteAbortController","thread","responseHandlerFactory","thread","isStreaming","StreamResponseHandler","SimpleResponseHandler","requestContextClassId","OpenAI","timestring","Memoize","z","BasicThreadService","ThreadServiceWithData","BasicThreadService","data","thread","OpenAIRequestService","ThreadServiceWithData","makeOpenAiRequest","messages","signal","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","data","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","reasoning_effort","log","DEBUG","response","openAiClient","chat","completions","create","error","Error","CreateChatCompletionStepError","code","ErrorCode","SERVER_ERROR","functionsList","Array","isArray","length","map","tool","type","function","name","description","parameters","Object","keys","undefined","strict","provider","accountKey","clientOptions","baseURL","config","env","OPENAI_API_URL","apiKey","defaultHeaders","Authorization","authorization","session","get","timeout","timeoutMs","OpenAI","item","token","filter","value","timestring","timeoutDuration","z","number","check","int","gte","lte","parse","memoizeTag","RequestContext","BaseStep","class","requestContextClassId","start","thread","runChildThread","id","getThreadId","step","state","background","stepId","baseClassIdPrefix","runStep","clear","abortController","createAbortController","response","openAiService","makeOpenAiRequest","history","signal","responseHandler","handle","complete","error","aborted","cancel","deleteAbortController","end","status","HistoryContext","getHistory","OpenAIRequestService","data","isStreaming","streamResponse","responseHandlerFactory","tags","ACTION","toolsContextClassId","toolContextEvents","callTool","lastToolCallReceived","toolsContextWorkerClassId","ToolsContextWorker","BaseStep","class","toolsContextWorkerClassId","start","thread","toolCall","parsedArguments","JSON","parse","function","arguments","runChildThread","id","getThreadId","state","step","local","parent","active","baseClassIdPrefix","runStep","log","DEBUG","exitStep","getExitName","name","_ts_decorate","decorators","target","key","desc","__name","ToolsContext","BaseStep","class","toolsContextClassId","start","thread","threadId","getThreadId","step","id","runChildThread","state","tasks","expectMoreTasks","background","callTool","toolCall","process","enqueueAndRun","name","toolContextEvents","params","lastToolCallReceived","stepId","baseClassIdPrefix","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsContextThread","onWorkerThreadEnd","result","undefined","ToolsContextWorker","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","toolCallId","data","setToolCallResult","hook","ACTION","end","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","AbstractContentContext","BaseStep","class","Error","getInitialState","runStep","clear","triggers","local","contentContextEvents","handleContent","onHandleContent","hook","name","ACTION","end","thread","RequestContext","getThreadId","step","id","onRequestContextEnd","otherwise","initialize","log","DEBUG","start","event","result","params","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","errorFilter","unknownMessage","unknownCode","status","cancel","data","state","requestComplete","onAllContentReceived","toolsReady","setImmediate","ToolsContext","lastToolCallReceived","tryToComplete","onToolsContextEnd","messages","Array","isArray","toolsResults","callFunction","toolCall","initToolsContextThread","callTool","handleMultipleChoices","chatCompletion","choices","length","WARN","complete","tags","SimpleContentContext","AbstractContentContext","class","getInitialState","requestComplete","onHandleContent","event","content","params","state","chatCompletion","toolCalls","choices","message","tool_calls","undefined","toolCall","callFunction","onAllContentReceived","handleMultipleChoices","tryToComplete","toolsReady","complete","streamContentContextWorkerClassId","streamWorkerExits","chunk","StreamContentContextWorker","BaseStep","class","streamContentContextWorkerClassId","start","thread","event","runChildThread","id","getThreadId","step","state","isBusy","isThreadBusy","stepId","baseClassIdPrefix","runStep","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","streamWorkerExits","ACTION","clear","Memoize","z","streamChunkEventSchema","looseObject","name","string","params","content","id","object","literal","created","number","model","service_tier","nullish","enum","choices","array","index","check","int","gte","delta","role","optional","refusal","tool_calls","type","function","arguments","logprobs","any","finish_reason","nullable","usage","prompt_tokens","completion_tokens","total_tokens","completion_tokens_details","accepted_prediction_tokens","audio_tokens","reasoning_tokens","rejected_prediction_tokens","prompt_tokens_details","cached_tokens","StreamReducerService","_result","_onToolCall","memo","onToolCall","reduceChunk","chunk","Object","keys","length","choices","rest","assign","object","undefined","usage","choice","existing","index","delta","finish_reason","logprobs","content","message","tool_calls","deltaToolCall","structuredClone","toolCall","function","arguments","tryParseToolCall","parsedArguments","JSON","parse","streamContentContextClassId","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","StreamContentContext","AbstractContentContext","class","streamContentContextClassId","getInitialState","requestComplete","workerComplete","partialChatCompletion","events","lastChunkReceived","index","runStep","clear","triggers","hook","name","ACTION","end","thread","StreamContentContextWorker","getThreadId","step","id","onWorkerThreadEnd","event","result","params","log","DEBUG","Error","errorFilter","unknownMessage","status","tryRunWorker","onHandleContent","chunk","streamChunkEventSchema","parse","content","StreamReducerService","state","onToolCall","bind","reduceChunk","chunkChoice","choices","delta","undefined","length","addContentToQueue","scheduleNextContentEvent","onAllContentReceived","chatCompletion","handleMultipleChoices","push","toolCall","callFunction","firstEvent","isEventReady","lastEvent","at","WARN","maxChunkContentLength","mergedChunk","slice","ts","Date","now","isBusy","getEventToProcess","tryToComplete","start","eventDelay","debounceDuration","shift","toolsReady","message","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","complete","data","streamSettings","maxBufferLength","tags","ACTION","Memoize","ContentContextUtilities","factory","isStreaming","Constructor","StreamContentContext","SimpleContentContext","start","thread","initialState","getInitialState","runChildThread","id","getThreadId","step","state","requestComplete","class","background","cancel","stopThread","result","status","stopChildThreads","stepId","baseClassIdPrefix","readFile","createRequire","require","createRequire","url","validateFlowSdkVersion","minVersion","test","Error","packageJsonPath","resolve","packageJsonContent","readFile","version","JSON","parse","groups","exec","major","Number","parseInt","minor","patch","undefined","isNaN","minMajor","minMinor","minPatch","split","map","x","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","BaseStep","runStep","triggers","hook","name","ACTION","end","thread","contentContext","getThreadId","step","id","onContentContextEnd","HistoryContext","onHistoryContextEnd","local","stepEvents","cancel","onCancel","otherwise","initialize","validateFlowSdkVersion","validateMergeFieldType","resetState","state","cancelled","Promise","all","start","CancelContext","prepareHistory","event","result","params","log","DEBUG","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","status","resetStep","chatCompletion","toolsResults","data","contentReady","tryToExitStep","error","catch","stop","completionMessage","choices","message","appendToHistory","finishReason","finish_reason","LLM_FINISH_LENGTH","jumpTo","currentStepId","exitStep","failedTask","allSettled","endChildThreads","adjustOnCancel","find","task","reason","functionsList","Array","isArray","length","dataOut","getMergeField","type","VALIDATION","isStreaming","streamResponse","ContentContextUtilities","factory","allowHandleError","install","states","HistoryContext","class","RequestContext","ToolsContext","ToolsContextWorker","SimpleContentContext","StreamContentContext","StreamContentContextWorker","CancelContext"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/decorators/background-thread-error-filter.ts","../src/errors/error-filter.ts","../src/errors/step-error.ts","../src/utils/create-method-decorator.ts","../src/utils/process-abort-controller.ts","../src/utils/thread-utilities.ts","../src/threads/base.ts","../src/decorators/error-filter.ts","../src/schemas/data-in.ts","../src/threads/cancel/cancel-context-types.ts","../src/threads/cancel/cancel-context.ts","../src/threads/content/abstract-content-context.ts","../src/threads/request/request-context.ts","../src/threads/history/history-context-types.ts","../src/threads/history/history-context.ts","../src/threads/request/response-handlers/abstract-response-handler.ts","../src/threads/content/abstract-content-context-types.ts","../src/threads/request/response-handlers/simple-response-handler.ts","../src/threads/request/response-handlers/stream-response-handler.ts","../src/threads/request/factories/response-handler.ts","../src/threads/request/request-context-types.ts","../src/threads/request/services/openai-request.ts","../src/services/thread-service-with-data.ts","../src/threads/tools/tools-context.ts","../src/threads/tools/tools-context-types.ts","../src/threads/tools/tools-context-worker-types.ts","../src/threads/tools/tools-context-worker.ts","../src/threads/content/simple/simple-content-context.ts","../src/threads/content/stream/stream-content-context-worker-types.ts","../src/threads/content/stream/stream-content-context-worker.ts","../src/threads/content/stream/stream-content-context.ts","../src/threads/content/stream/schemas/stream-chunk.ts","../src/threads/content/stream/services/stream-reducer.ts","../src/threads/content/stream/stream-content-context-types.ts","../src/step.ts","../src/threads/content/content-context-utilities.ts","../src/utils/validate-flow-sdk-version.ts"],"sourcesContent":["import { install } from 'source-map-support';\n\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport { SimpleContentContext } from './threads/content/simple/simple-content-context.ts';\nimport { StreamContentContextWorker } from './threads/content/stream/stream-content-context-worker.ts';\nimport { StreamContentContext } from './threads/content/stream/stream-content-context.ts';\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { RequestContext } from './threads/request/request-context.ts';\nimport { ToolsContextWorker } from './threads/tools/tools-context-worker.ts';\nimport { ToolsContext } from './threads/tools/tools-context.ts';\n\n// enable source map support for better error stack traces\ninstall();\n\nexport const states = {\n [HistoryContext.class]: HistoryContext,\n [RequestContext.class]: RequestContext,\n [ToolsContext.class]: ToolsContext,\n [ToolsContextWorker.class]: ToolsContextWorker,\n [SimpleContentContext.class]: SimpleContentContext,\n [StreamContentContext.class]: StreamContentContext,\n [StreamContentContextWorker.class]: StreamContentContextWorker,\n [CancelContext.class]: CancelContext,\n};\n\nexport { CreateChatCompletionStep as step } from './step.ts';\n\nexport type * from './step-types.ts';\nexport type * from './threads/cancel/cancel-context-types.ts';\nexport type * from './threads/content/abstract-content-context-types.ts';\nexport type * from './threads/content/simple/simple-content-context-types.ts';\nexport type * from './threads/content/stream/stream-content-context-types.ts';\nexport type * from './threads/content/stream/stream-content-context-worker-types.ts';\nexport type * from './threads/history/history-context-types.ts';\nexport type * from './threads/request/request-context-types.ts';\nexport type * from './threads/tools/tools-context-types.ts';\nexport type * from './threads/tools/tools-context-worker-types.ts';\n","import type Step from '@onereach/flow-sdk/step.js';\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\n\nimport { errorFilter } from '../errors/error-filter.ts';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\n\nconst defaultOptions: BackgroundThreadErrorFilterOptions = { allowHandleError: false, useErrorFilter: true };\n\n/**\n * Since errors in hooks are fatal and can't be processed this decorator allows to wrap hook handler\n * and manage errors by ending a thread with the error (preventing sending error to `error` exit)\n * @param options.allowHandleError - Default `false`. If `false` in case of error will end thread with error as result, if `true` will allow to handle error via 'error' exit\n * @param options.useErrorFilter - Default `true`. If `true` every error wild be processed with `errorFilter` utility function\n */\nexport const BackgroundThreadErrorFilter = createMethodDecoratorWithOptionalArguments(\n (options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error) => errorHandler.call(this, options, error, propertyKey));\n }\n\n return result;\n } catch (error) {\n return errorHandler.call(this, options, error, propertyKey) as ReturnType<typeof originalMethod>;\n }\n } as typeof originalMethod;\n },\n defaultOptions,\n);\n\nfunction errorHandler(\n this: Step,\n options: BackgroundThreadErrorFilterOptions,\n error: unknown,\n propertyKey: string | symbol,\n): void {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n const filteredError = options.useErrorFilter ? errorFilter(error) : error;\n\n if (filteredError instanceof Error) {\n if (options.allowHandleError) {\n // Send it to the 'error' exit and stop here\n this.thread.enqueue({ name: ACTION.error, error: filteredError });\n return;\n } else {\n // End the thread with the error and stop here\n this.end(filteredError);\n return;\n }\n }\n\n // Only throw if it's not an Error instance and you truly want to bubble it\n throw filteredError;\n}\n\nexport type BackgroundThreadErrorFilterOptions = {\n allowHandleError?: boolean;\n useErrorFilter?: boolean;\n};\n","import TimeoutError from '@onereach/flow-sdk/errors/timeout.js';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from './step-error.ts';\n\nconst defaultPreserveErrors = [CreateChatCompletionStepError, TimeoutError] as const;\nexport function errorFilter<P extends readonly AnyErrorClass[] = typeof defaultPreserveErrors>(\n error: unknown,\n options: ErrorFilterOptions<P> = {},\n): InstancesOf<P> | CreateChatCompletionStepError | TimeoutError {\n const {\n preserveErrors = defaultPreserveErrors,\n unknownMessage = 'Unknown error',\n unknownCode = ErrorCode.UNKNOWN,\n } = options;\n\n // if error is CreateChatCompletionStepError or TimeoutError, return it directly\n if (preserveErrors?.some((ErrorClass) => error instanceof ErrorClass)) {\n return error as InstancesOf<P>;\n }\n\n // validation errors\n if (error instanceof z.core.$ZodError) {\n return new CreateChatCompletionStepError(z.prettifyError(error), error, {\n code: ErrorCode.VALIDATION,\n });\n }\n\n // if error is a string assume it's an error message\n if (typeof error === 'string') {\n return new CreateChatCompletionStepError(error, {\n code: ErrorCode.UNKNOWN,\n });\n }\n\n if (error instanceof Error) {\n // timeout errors\n if (error.message.includes('Request timed out')) {\n return new TimeoutError('Timeout', error, { code: ErrorCode.TIMEOUT });\n }\n\n // TODO: fix interpreting of this kind of errors\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n const responseErrorMessage: string | undefined = (error as unknown as any)?.response?.data?.error?.message;\n if (responseErrorMessage != undefined) {\n return new CreateChatCompletionStepError(responseErrorMessage, error, {\n code: ErrorCode.SERVER_ERROR,\n });\n }\n\n return new CreateChatCompletionStepError(unknownMessage, error, {\n code: unknownCode,\n });\n }\n\n // catch all for unknown errors\n return new CreateChatCompletionStepError(unknownMessage, {\n code: unknownCode,\n data: error,\n });\n}\n\nexport type ErrorFilterOptions<P extends readonly AnyErrorClass[]> = {\n /** Array of error classes that should not be wrapped */\n preserveErrors?: P;\n /** Error message to use when message is unknown */\n unknownMessage?: string;\n /** Error code to use when message is unknown */\n unknownCode?: keyof typeof ErrorCode;\n};\n\n/** Any Error class */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyErrorClass<E extends Error = Error> = new (...arguments_: any[]) => E;\n\n/** Turn a tuple/array of constructors into a union of their instance types. */\nexport type InstancesOf<Ctors extends readonly AnyErrorClass[]> =\n Ctors[number] extends AnyErrorClass<infer I> ? I : never;\n","import BaseError from '@onereach/flow-sdk/errors/base.js';\n\nexport const ErrorCode = {\n UNKNOWN: 'UNKNOWN',\n STEP_LOGIC_ISSUE: 'STEP_LOGIC_ISSUE',\n AUTH: 'AUTH',\n TIMEOUT: 'TIMEOUT',\n VALIDATION: 'VALIDATION',\n INVALID_REQUEST: 'INVALID_REQUEST',\n RATE_LIMITED: 'RATE_LIMITED',\n LLM_FINISH_LENGTH: 'LLM_FINISH_LENGTH',\n SERVER_ERROR: 'SERVER_ERROR',\n UNSUPPORTED: 'UNSUPPORTED',\n} as const;\n\nexport class CreateChatCompletionStepError extends BaseError<{\n code: keyof typeof ErrorCode;\n data?: unknown;\n}> {}\n\nexport class AbortRequestError extends BaseError {}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Creates a method decorator that can be used with or without options.\n * @param apply - Function that applies the decorator logic with given options.\n * @param defaultOptions - Default options to use if none are provided.\n */\nexport function createMethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction>(\n apply: (\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => T | TypedPropertyDescriptor<T> | void,\n defaultOptions: A,\n): MethodDecoratorWithOptionalArguments<A, T> {\n function runApply(\n options: A,\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ): TypedPropertyDescriptor<T> | void {\n const maybe = apply(options, target, propertyKey, descriptor);\n\n // If the decorator factory returned a wrapped function, assign it to the descriptor here\n if (typeof maybe === 'function') {\n const originalMethod = descriptor.value;\n const wrappedMethod = maybe as typeof originalMethod;\n\n if (originalMethod?.name != undefined) {\n try {\n Object.defineProperty(wrappedMethod, 'name', { value: originalMethod.name });\n } catch {\n // ignore if name is non-configurable\n }\n }\n\n descriptor.value = wrappedMethod;\n return descriptor;\n }\n\n // If a descriptor was returned or decorator mutated descriptor in-place, use that\n return maybe ?? descriptor;\n }\n\n return function decoratorOrFactory(\n argument0?: object | A,\n argument1?: string | symbol,\n argument2?: TypedPropertyDescriptor<T>,\n ): any {\n if (\n argument0 !== null &&\n typeof argument0 === 'object' &&\n (typeof argument1 === 'string' || typeof argument1 === 'symbol') &&\n argument2 !== null &&\n typeof argument2 === 'object'\n ) {\n // Called as plain decorator: @Decorator\n return runApply(defaultOptions, argument0, argument1, argument2);\n } else {\n // Called as decorator factory: @Decorator(options)\n const options = (argument0 as A) ?? defaultOptions;\n return (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => {\n return runApply(options, target, propertyKey, descriptor);\n };\n }\n };\n}\n\nexport type AnyFunction = (...arguments_: any[]) => any;\n\nexport type MethodDecoratorWithOptionalArguments<A, T extends AnyFunction = AnyFunction> =\n // Plain method decorator (three arguments)\n ((\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>,\n ) => TypedPropertyDescriptor<T> | void) &\n // Decorator factory (optional options argument)\n ((options?: A) => MethodDecorator);\n","import type { CONFIG, IThread } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Create an AbortController in process cache.\n * It will be available during flow execution, but will disappear in the end of execution\n *\n * @throws If controller already exists will throw an error.\n */\nexport function createAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n const process = thread.process;\n\n if (process.cache[cacheKey] != undefined) throw new Error(`AbortController for key '${cacheKey}' already exists`);\n\n return (process.cache[cacheKey] = new AbortController());\n}\n\n/**\n * Get instance of AbortController from process cache\n */\nexport function getAbortController<T extends CONFIG>({\n thread,\n ...options\n}: AbortControllerParameters<T>): AbortController | undefined {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n return thread.process.cache[cacheKey] as AbortController | undefined;\n}\n\n/**\n * Remove instance of AbortController from the cache\n *\n * If it does not exists, will not throw an error\n */\nexport function deleteAbortController<T extends CONFIG>({ thread, ...options }: AbortControllerParameters<T>): void {\n const cacheKey = getAbortControllerKey({ thread, ...options });\n delete thread.process.cache[cacheKey];\n}\n\nexport function getAbortControllerKey<T extends CONFIG>({\n thread,\n prefix,\n stepId = thread.currentStepId,\n}: AbortControllerParameters<T>): string {\n const normalizedPrefix = prefix ? `${prefix}:` : '';\n return `${normalizedPrefix}abrt_ctrl:${stepId}`;\n}\n\nexport type AbortControllerParameters<T extends CONFIG> = {\n /** thread to access flow process */\n thread: IThread<T>;\n\n /** Optional step id to use for unique name. If not present will use `thread.currentStepId` */\n stepId?: string;\n\n /** Optional prefix in name if you need to create several controllers */\n prefix?: string;\n};\n","import { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { CONFIG, IThread, IThreadId, IThreadOptions, RESULT } from '@onereach/flow-sdk/types/index.js';\n\n/**\n * Runs a new thread or reuses an existing one (if it ended).\n * @param thread The step to run the thread for.\n * @throws Error if the thread is not ended or if the state is not provided.\n */\nexport async function runChildThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n { id, state, local, ...options }: IThreadOptions<ThreadConfig>,\n { force }: { force?: boolean } = {},\n): Promise<RESULT<ThreadConfig>> {\n const threadToRun = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`runThread: thread with id '${id}'`, options);\n\n if (threadToRun == undefined) {\n // create thread\n return await thread.thread.runThread<ThreadConfig>({\n ...options,\n id,\n state,\n local: {\n ...local,\n parent: thread.thread.id,\n active: true,\n },\n });\n } else {\n if (!force && !threadToRun.ended && threadToRun.local.active)\n throw new Error(`Thread with id '${id}' has not ended yet, cannot start it again`);\n if (state == undefined) throw new Error(`Thread with id '${id}' must have a state to run`);\n\n // reuse existing thread\n threadToRun.local.active = true;\n return await threadToRun.enqueueAndRun({\n name: ACTION.goto,\n state: {\n ...state,\n active: true,\n },\n });\n }\n}\n\nexport function isThreadBusy<StepConfig extends CONFIG, ThreadConfig extends CONFIG & ManagedThreadConfig>(\n thread: IThread<StepConfig>,\n threadId: IThreadId,\n): boolean {\n const threadToCheck = thread.process.getThread<ThreadConfig>(threadId);\n return Boolean(threadToCheck != undefined && threadToCheck.local.active && !threadToCheck.ended);\n}\n\nexport function listChildThreads<StepConfig extends CONFIG, ChildThreadConfig extends CONFIG & ManagedThreadConfig>(\n thread: IThread<StepConfig>,\n parentThreadId: IThreadId = thread.id,\n): IThread<ChildThreadConfig>[] {\n const childThreads = [];\n for (const threadId in thread.process.threads) {\n const item = thread.process.threads[threadId]! as unknown as IThread<ChildThreadConfig>;\n if (item?.local.parent === parentThreadId) childThreads.push(item);\n }\n return childThreads;\n}\n\nexport async function stopThread<ThreadConfig extends CONFIG & ManagedThreadConfig, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n id: IThreadId,\n { result, stopChildThreads }: { result?: RESULT<ThreadConfig>; stopChildThreads?: boolean } = {},\n): Promise<void> {\n const threadToStop = thread.process.getThread<ThreadConfig>(id);\n thread.log.DEBUG?.(`stopThread: thread with id '${id}'`);\n\n if (!threadToStop) return;\n\n if (stopChildThreads) await endChildThreads(threadToStop, result);\n\n if (!threadToStop.local.active) return;\n\n threadToStop.local.active = false;\n if (threadToStop.ended) return;\n\n await threadToStop.enqueueAndRun({ name: ACTION.ending, result });\n}\n\nexport async function endChildThreads<ThreadConfig extends CONFIG, StepConfig extends CONFIG>(\n thread: IThread<StepConfig>,\n result?: RESULT<ThreadConfig>,\n options: { throw?: boolean } = {},\n): Promise<PromiseSettledResult<void>[]> {\n const childThreads = listChildThreads(thread);\n const stopTasks = childThreads.map(\n async (child) => await stopThread(thread, child.id, { stopChildThreads: true, result }),\n );\n const stopResults = await Promise.allSettled(stopTasks);\n\n const throwError = options.throw ?? true;\n if (throwError) {\n const failedTask = stopResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n return stopResults;\n}\n\nexport type ManagedThreadLocal = {\n active: boolean;\n parent: IThreadId;\n};\n\nexport type ManagedThreadConfig = {\n local: ManagedThreadLocal;\n};\n","import Step from '@onereach/flow-sdk/step.js';\n\nimport { ErrorFilter } from '../decorators/error-filter.ts';\nimport { dataInSchema } from '../schemas/data-in.ts';\n\nimport type { BaseConfig } from './base-types.ts';\n\n// TODO: convert it into class decorator\nexport class BaseStep<T extends BaseConfig> extends Step<T> {\n @ErrorFilter\n public async resolveDataIn() {\n const dataIn = await super.resolveDataIn();\n\n // TODO: add some caching since this logic runs for every thread class\n // validate dataIn against schema\n return dataInSchema.parse(dataIn);\n }\n}\n\nexport const baseClassIdPrefix = 'llm_cmp';\n","import type Step from '@onereach/flow-sdk/step.js';\n\nimport { errorFilter } from '../errors/error-filter.ts';\nimport { createMethodDecoratorWithOptionalArguments } from '../utils/create-method-decorator.ts';\n\nconst defaultOptions = {};\n\n/**\n * Will wrap method with `errorFilter` for every error.\n */\nexport const ErrorFilter = createMethodDecoratorWithOptionalArguments((_options, _target, propertyKey, descriptor) => {\n const originalMethod = descriptor.value;\n\n if (!originalMethod || typeof originalMethod !== 'function') return;\n\n return function (this: Step, ...arguments_: Parameters<typeof originalMethod>): ReturnType<typeof originalMethod> {\n try {\n const result: unknown = originalMethod.apply(this, arguments_);\n\n if (result instanceof Promise) {\n return result.catch((error: unknown) => {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }) as ReturnType<typeof originalMethod>;\n }\n\n return result;\n } catch (error) {\n const methodName = propertyKey.toString();\n this.log.DEBUG?.(`Error in method '${methodName}'`, error);\n throw errorFilter(error);\n }\n };\n}, defaultOptions);\n","import { en } from 'zod/v4/locales';\nimport { z } from 'zod/v4-mini';\n\nz.config(en());\n\n// string that prevents\nconst stringNoUndefinedSchema = z.string().check(\n z.trim(),\n z.refine((value) => !['undefined', 'null'].includes(value), {\n error: 'Unexpected undefined or null merge-field value',\n }),\n);\n\nconst messageSchema = z.discriminatedUnion('role', [\n z.object({\n role: z.literal('system'),\n content: stringNoUndefinedSchema,\n }),\n z.object({\n role: z.literal('user'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n }),\n z.object({\n role: z.literal('assistant'),\n content: z.nullable(stringNoUndefinedSchema),\n\n // TODO: add support for annotations and refusal\n // params to support in the future\n // refusal: z.nullable(z.string().check(z.trim(), z.minLength(1))),\n // annotations: z.optional(z.array(z.any())), // TODO: replace z.any() with more details\n tool_calls: z.optional(\n z.array(\n z.object({\n id: stringNoUndefinedSchema.check(z.minLength(1)),\n type: z.literal('function'),\n function: z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1)),\n arguments: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n }),\n ),\n ),\n }),\n z.object({\n role: z.literal('tool'),\n content: stringNoUndefinedSchema,\n name: z.optional(stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64))),\n tool_call_id: stringNoUndefinedSchema.check(z.minLength(1)),\n }),\n]);\nexport type Message = z.infer<typeof messageSchema>;\n\nconst functionParametersBaseSchema = z.object({\n type: z.literal('object'),\n properties: z.record(\n z.string().check(z.minLength(1), z.maxLength(64)),\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'array', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n items: z.optional(\n z.object({\n type: z.enum(['string', 'number', 'boolean', 'object']),\n description: z.optional(z.string().check(z.maxLength(1000))),\n }),\n ),\n }),\n ),\n // next two params would be injected with z.transform()\n // required: z.optional(z.array(z.string().check(z.minLength(1), z.maxLength(64)))),\n // additionalProperties: z._default(z.literal(false), false),\n});\nexport const dataInSchema = z\n .object({\n provider: stringNoUndefinedSchema.check(z.minLength(1)),\n model: stringNoUndefinedSchema.check(z.minLength(1)),\n accountKey: optionalStringValue(stringNoUndefinedSchema),\n\n typeOfStep: z.enum(['chat', 'completion']),\n\n systemMessage: z.optional(stringNoUndefinedSchema),\n userMessage: z.optional(stringNoUndefinedSchema),\n switchAssistantsMessage: z._default(z.boolean(), false), // Add assistant's first message\n assistantsFirstMessage: z.optional(stringNoUndefinedSchema),\n\n // llm generation\n temperature: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(2))),\n topP: optionalStringValue(z.coerce.number().check(z.gte(0), z.lte(1))),\n maxTokens: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1))),\n presencePenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n frequencyPenalty: optionalStringValue(z.coerce.number().check(z.gte(-2), z.lte(2))),\n n: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(128))),\n stop: z.optional(\n z\n .array(\n z.object({\n token: z.string().check(z.minLength(1), z.maxLength(64)),\n }),\n )\n .check(z.maxLength(4)),\n ),\n\n // streaming\n streamResponse: z._default(z.boolean(), false),\n streamSettings: z.optional(\n z.object({\n maxBufferLength: z.coerce.number().check(\n z.overwrite((value) => (value === 0 ? 50 : value)), // default value is 50\n z.int(),\n z.gte(1),\n z.lte(32_768),\n ),\n debounceDuration: z.coerce.number().check(z.int(), z.gte(0), z.lte(10_000)), // in milliseconds\n }),\n ),\n\n // history\n customHistory: z._default(z.boolean(), false), // only for 'chat' mode\n historyLength: optionalStringValue(z.coerce.number().check(z.int(), z.gte(1), z.lte(100))),\n historyMode: z.optional(z.enum(['mergefield', 'codeHistory'])),\n historyMergefield: z.optional(z.array(messageSchema)),\n historyCode: z.optional(z.array(messageSchema)),\n\n // function calls\n functionsList: z.array(\n z.object({\n name: stringNoUndefinedSchema.check(z.minLength(1), z.maxLength(64)),\n description: z.optional(stringNoUndefinedSchema.check(z.maxLength(1000))),\n parameters: z.optional(\n z.pipe(\n functionParametersBaseSchema,\n z.transform<\n z.infer<typeof functionParametersBaseSchema> & { additionalProperties: false; required: string[] }\n >((object) => {\n object.required = Object.keys(object.properties);\n object.additionalProperties = false;\n return object;\n }),\n ),\n ),\n strict: z.boolean(),\n }),\n ),\n\n // state management\n useState: z.optional(z.boolean()),\n stateSettings: z.optional(\n z.object({\n stateFunction: z.function(),\n // stateFunction: z.function({\n // output: z.union([z.string(), z.promise(z.string())]),\n // }),\n }),\n ),\n\n processError: z.boolean(),\n processTimeout: z.boolean(),\n timeoutDuration: stringNoUndefinedSchema.check(z.trim(), z.minLength(1)),\n })\n .check(\n z.refine((data) => !data.streamResponse || data.provider === 'openai', {\n error: 'Streaming is only supported for OpenAI provider',\n }),\n z.refine((data) => !data.streamResponse || data.streamSettings !== undefined, {\n error: 'Missing \"Stream settings\" for response streaming mode',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n data.customHistory ||\n !data.switchAssistantsMessage ||\n data.assistantsFirstMessage !== undefined,\n { error: 'Missing \"Assistant\\'s first message\" value' },\n ),\n z.refine((data) => data.customHistory || data.userMessage !== undefined, {\n error: 'Missing \"User message\" value',\n }),\n z.refine((data) => data.typeOfStep !== 'chat' || !data.customHistory || data.historyMode !== undefined, {\n error: 'Missing \"History mode\" value',\n }),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield !== undefined,\n { error: 'Missing \"History\" data via merge-field' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'mergefield' ||\n data.historyMergefield?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via merge-field',\n },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode !== undefined,\n { error: 'Missing \"History\" data as code' },\n ),\n z.refine(\n (data) =>\n data.typeOfStep !== 'chat' ||\n !data.customHistory ||\n data.historyMode !== 'codeHistory' ||\n data.historyCode?.find?.((message) => message.role === 'user'),\n {\n error: 'Missing at least one message with role \"user\" message in \"History\" data via code',\n },\n ),\n z.refine((data) => !data.useState || data.stateSettings != undefined, {\n error: 'Missing state settings',\n }),\n );\n\nexport type DataIn = z.infer<typeof dataInSchema>;\n\n/**\n * Convert empty string to undefined before running schema validation\n * @param schema schema to validate against\n * @param defaultValue optional default value\n */\nfunction optionalStringValue<T extends z.core.SomeType>(schema: T) {\n return z.pipe(\n z.union([z.undefined(), z.literal(''), schema]),\n z.transform((value) => (value === '' ? undefined : value)),\n );\n}\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const cancelContextClassId = 'cncl_ctrl';\n\nexport const parentEvents = {\n cancel: 'st_cancel',\n} as const;\nexport type ParentEventName = typeof parentEvents;\n\nexport const cancelContentEvents = {\n cancel: 'cnl_cancel',\n} as const;\nexport type CancelContentEventName = typeof cancelContentEvents;\n\nexport type CancelContextEvents = IEvent<unknown, CancelContentEventName['cancel']>;\n\nexport type CancelContextState = {\n class: typeof cancelContextClassId;\n};\n\nexport interface CancelContextConfig extends BaseChildConfig {\n state: CancelContextState;\n events: CancelContextEvents;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type { IThreadId, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { AbortRequestError } from '../../errors/step-error.ts';\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { getAbortController } from '../../utils/process-abort-controller.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport { cancelContextClassId, cancelContentEvents, parentEvents } from './cancel-context-types.ts';\nimport type { CancelContextConfig } from './cancel-context-types.ts';\n\nexport class CancelContext extends BaseStep<CancelContextConfig> {\n public static readonly class = cancelContextClassId;\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await runChildThread<CancelContextConfig, ChatCompletionConfig>(\n thread,\n {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n },\n { force: true },\n );\n }\n\n public static async stop(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread(thread, this.getThreadId(thread.step.id));\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers.local({ name: cancelContentEvents.cancel }, this.onCancel).otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n initialize(): void {\n this.log.DEBUG?.(`Initializing ${CancelContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCancel(): void {\n this.log.DEBUG?.('Canceling LLM request');\n const parentThreadId = this.local.parent;\n const parentThread = this.process.getThread<ChatCompletionConfig>(parentThreadId);\n\n if (!parentThread || parentThread.ended) return this.end();\n\n const abortController = getAbortController({ thread: this.thread });\n if (abortController) {\n // LLM request is active\n abortController.abort(new AbortRequestError('Request cancelled'));\n } else {\n // LLM request already ended\n void this.process.enqueueAndRun({ name: parentEvents.cancel, thread: parentThreadId });\n }\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport { setImmediate } from 'node:timers/promises';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport type { BaseChildResultCancel } from '../base-child-types.ts';\nimport { BaseStep } from '../base.ts';\nimport type { RequestContextConfig } from '../request/request-context-types.ts';\nimport { RequestContext } from '../request/request-context.ts';\nimport type { ToolsContextConfig } from '../tools/tools-context-types.ts';\nimport { ToolsContext } from '../tools/tools-context.ts';\n\nimport { contentContextEvents } from './abstract-content-context-types.ts';\nimport type {\n ContentContextConfig,\n ContentContextHandleContentEvent,\n ContentContextOkResult,\n ContentContextResult,\n} from './abstract-content-context-types.ts';\n\nconst memoizeTag = ['toolsInit'];\n\nexport abstract class AbstractContentContext<T extends ContentContextConfig> extends BaseStep<T> {\n public static get class(): string {\n throw new Error('Define \"class\" static field');\n }\n\n public static getInitialState<T extends ContentContextConfig>(): STATE<T> {\n throw new Error('Define \"getInitialState\" static method');\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void | Promise<void> {\n // reset init of tools thread on a fresh start\n clear(memoizeTag);\n\n // TODO: add hook for end of ToolsContext thread\n this.triggers\n .local(contentContextEvents.handleContent, this.onHandleContent)\n .hook<RequestContextConfig, ACTION.end>(\n { name: ACTION.end, thread: RequestContext.getThreadId(this.thread.step.id) },\n this.onRequestContextEnd,\n )\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize() {\n this.log.DEBUG?.(`Initializing ${this.constructor.name} thread`);\n\n void RequestContext.start(this.thread);\n }\n\n public abstract onHandleContent(event: ContentContextHandleContentEvent): void | Promise<void>;\n protected abstract onAllContentReceived(): void | Promise<void>;\n protected abstract tryToComplete(): void | Promise<void>;\n\n @BackgroundThreadErrorFilter\n public async onRequestContextEnd(event: IActionEvent<RequestContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${RequestContext.name} thread ended with result`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${RequestContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${RequestContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n\n // do nothing on cancel\n if (result.status === 'cancel') return this.cancel();\n\n if (result.status !== 'ok') {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${RequestContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.requestComplete = true;\n await this.onAllContentReceived();\n\n if (this.state.toolsReady != undefined) {\n await setImmediate();\n // notify ToolsContext no more tool calls will be made\n await ToolsContext.lastToolCallReceived(this.thread);\n }\n\n await this.tryToComplete();\n }\n\n @BackgroundThreadErrorFilter\n public async onToolsContextEnd(event: IActionEvent<ToolsContextConfig, ACTION.end>): Promise<void> {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${ToolsContext.name} thread ended`, result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContext.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // TODO: validate result with zod schema\n\n // do nothing on cancel\n if (result.status === 'cancel') return;\n\n const { status, messages } = result;\n\n if (status !== 'ok' || !Array.isArray(messages)) {\n throw new CreateChatCompletionStepError(`Unexpected end of the ${ToolsContext.name} thread`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.state.toolsResults = messages;\n this.state.toolsReady = true;\n\n await this.tryToComplete();\n }\n\n protected async callFunction(toolCall: ChatCompletionMessageFunctionToolCall) {\n // wait for ToolController needed\n this.state.toolsReady = false;\n await this.initToolsContextThread();\n await ToolsContext.callTool(this.thread, toolCall);\n }\n\n protected handleMultipleChoices(): void {\n const { chatCompletion } = this.state;\n\n const choices = chatCompletion?.choices ?? [];\n if (choices?.length > 1) {\n this.log.WARN?.('Multiple choices received from LLM, but only the first one will be processed', {\n choices: choices.length,\n });\n }\n }\n\n @Memoize({ tags: memoizeTag })\n protected async initToolsContextThread() {\n // wait for the end of ToolsContext thread\n this.triggers.hook<ToolsContextConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContext.getThreadId(this.thread.step.id) },\n this.onToolsContextEnd,\n );\n\n await ToolsContext.start(this.thread);\n }\n\n protected cancel(): void {\n this.end({ status: 'cancel' } satisfies ContentContextResult as BaseChildResultCancel);\n }\n\n protected complete() {\n const { chatCompletion } = this.state;\n\n // TODO: add validation for ChatCompletion structure\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion content to return value', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.end({\n status: 'ok',\n chatCompletion,\n toolsResults: this.state.toolsResults ?? [],\n } satisfies ContentContextResult as ContentContextOkResult);\n }\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { createAbortController, deleteAbortController } from '../../utils/process-abort-controller.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context-types.ts';\nimport { HistoryContext } from '../history/history-context.ts';\n\nimport { responseHandlerFactory } from './factories/response-handler.ts';\nimport { requestContextClassId } from './request-context-types.ts';\nimport type { RequestContextConfig, RequestContextResult } from './request-context-types.ts';\nimport type { AbstractResponseHandler } from './response-handlers/abstract-response-handler.ts';\nimport { OpenAIRequestService } from './services/openai-request.ts';\n\nconst memoizeTag = ['requestInit'];\n\nexport class RequestContext extends BaseStep<RequestContextConfig> {\n public static readonly class = requestContextClassId;\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<RequestContextResult> {\n return await runChildThread<RequestContextConfig, T>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n background: true,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n clear(memoizeTag);\n const abortController = createAbortController({ thread: this.thread });\n try {\n const response = await this.openAiService.makeOpenAiRequest(await this.getHistory(), abortController.signal);\n await this.responseHandler.handle(response);\n this.complete();\n } catch (error) {\n if (abortController?.signal.aborted) return this.cancel();\n throw error;\n } finally {\n deleteAbortController({ thread: this.thread });\n }\n }\n\n private cancel() {\n this.end({ status: 'cancel' });\n }\n\n private complete() {\n this.end({ status: 'ok' });\n }\n\n private async getHistory(): Promise<ChatCompletionMessageParam[]> {\n const history = HistoryContext.getHistory(this.thread);\n\n if (!this.data.useState) return history;\n\n const historyClone = [...history];\n const content = (await this.data.stateSettings?.stateFunction()) as string;\n const message = {\n role: 'assistant',\n content,\n } as ChatCompletionMessageParam;\n\n if (history.at(-1)?.role === 'user') {\n historyClone.splice(-1, 0, message);\n } else {\n historyClone.push(message);\n }\n return historyClone;\n }\n\n @Memoize()\n private get openAiService(): OpenAIRequestService {\n return new OpenAIRequestService(this.thread, this.data);\n }\n\n @Memoize({ tags: memoizeTag })\n private get responseHandler(): AbstractResponseHandler {\n const isStreaming = this.data.streamResponse;\n return responseHandlerFactory({\n thread: this.thread,\n isStreaming,\n });\n }\n}\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources';\n\nimport { BaseConfig } from '../base-types.ts';\n\nexport const historyContextClassId = 'hst_ctrl';\n\nexport const historyContextEvents = {\n appendToHistory: 'hst_append',\n prepareHistory: 'hst_prepare',\n adjustOnCancel: 'hst_cncl',\n} as const;\nexport type HistoryContextEventName = typeof historyContextEvents;\n\nexport type HistoryContextAppendParameters = {\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[];\n};\nexport type HistoryContextEventAppendToHistory = IEvent<\n HistoryContextAppendParameters,\n HistoryContextEventName['appendToHistory']\n>;\nexport type HistoryContextEventPrepareHistory = IEvent<unknown, HistoryContextEventName['prepareHistory']>;\nexport type HistoryContextEventAdjustOnCancel = IEvent<unknown, HistoryContextEventName['adjustOnCancel']>;\nexport type HistoryContextEvent =\n | HistoryContextEventAppendToHistory\n | HistoryContextEventPrepareHistory\n | HistoryContextEventAdjustOnCancel;\n\nexport type HistoryContextState = {\n class: typeof historyContextClassId;\n\n /** messages to send to OpenAI API */\n messages: ChatCompletionMessageParam[];\n};\n\nexport interface HistoryContextConfig extends BaseConfig {\n state: HistoryContextState;\n events: HistoryContextEvent;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport type { CONFIG, IThreadId, IThread, IStepId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageParam } from 'openai/resources.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport { historyContextClassId, historyContextEvents } from './history-context-types.ts';\nimport type {\n HistoryContextConfig,\n HistoryContextEventName,\n HistoryContextAppendParameters,\n HistoryContextEventAppendToHistory,\n} from './history-context-types.ts';\n\nexport class HistoryContext extends BaseStep<HistoryContextConfig> {\n public static readonly class = historyContextClassId;\n\n public static async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const historyThreadId = this.getThreadId(thread.step.id);\n const historyThread = thread.process.getThread<HistoryContextConfig>(historyThreadId);\n\n if (historyThread != undefined) return; // thread already exists\n\n // create tools context thread\n await thread.process.runThread<HistoryContextConfig>({\n id: historyThreadId,\n background: true,\n state: {\n step: thread.step.id,\n class: this.class,\n\n messages: [],\n },\n });\n }\n\n public static async prepareHistory<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['prepareHistory']>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.prepareHistory,\n });\n }\n\n public static async appendToHistory<T extends ChatCompletionConfig>(\n thread: IThread<T>,\n message: ChatCompletionMessageParam | ChatCompletionMessageParam[],\n ): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['appendToHistory'], HistoryContextAppendParameters>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.appendToHistory,\n params: { message },\n });\n }\n\n public static async adjustOnCancel<T extends ChatCompletionConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<HistoryContextEventName['adjustOnCancel']>({\n thread: this.getThreadId(thread.step.id),\n name: historyContextEvents.adjustOnCancel,\n });\n }\n\n public static getHistory<T extends CONFIG>(thread: IThread<T>): ChatCompletionMessageParam[] {\n return thread.process.getSafeThread<HistoryContextConfig>(this.getThreadId(thread.step.id)).state.messages;\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(historyContextEvents.prepareHistory, this.onPrepareHistory)\n .local(historyContextEvents.appendToHistory, this.onAppendToHistory)\n .local(historyContextEvents.adjustOnCancel, this.onAdjustOnCancel)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${HistoryContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onAdjustOnCancel(): void {\n let message;\n while ((message = this.state.messages.at(-1))) {\n if (['system', 'user'].includes(message.role)) break;\n if (message.role === 'assistant' && message.tool_calls == undefined) break;\n\n const removedMessage = this.state.messages.pop();\n this.log.DEBUG?.('Removed message from history', removedMessage);\n }\n }\n\n @BackgroundThreadErrorFilter\n public onPrepareHistory(): void {\n this.log.DEBUG?.('Preparing history');\n\n const {\n customHistory,\n historyLength,\n systemMessage,\n typeOfStep,\n userMessage,\n historyMode,\n historyMergefield,\n historyCode,\n assistantsFirstMessage,\n } = this.data;\n\n // 1. text completion mode\n if (typeOfStep === 'completion') {\n this.state.messages = [\n {\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n },\n ];\n return;\n }\n\n // 2. chat mode (custom history)\n if (customHistory) {\n this.state.messages = historyMode === 'mergefield' ? historyMergefield! : historyCode!;\n return;\n }\n\n // 3. chat mode (step managed history)\n let messages = this.state.messages;\n\n // is a fresh conversation?\n if (messages.length === 0 && assistantsFirstMessage != undefined && assistantsFirstMessage.length > 0) {\n messages.push({\n role: 'assistant',\n content: assistantsFirstMessage,\n });\n }\n\n // if last message is a tool response, assume user message is already in history\n if (messages.at(-1)?.role !== 'tool') {\n messages.push({\n role: 'user',\n content: userMessage!, // never would be undefined due to validation against schema\n // TODO: add support for optional user name\n // name: userName,\n });\n }\n\n // trim history length\n const hasToolCalls = messages.some((message) => message.role === 'tool');\n if (!hasToolCalls && historyLength != undefined && historyLength > 0) {\n messages = messages.slice(-1 * historyLength);\n }\n\n // add system message as first message if it exists\n if (systemMessage != undefined && systemMessage.length > 0) {\n const systemMessageRecord = {\n role: 'system' as const,\n content: systemMessage,\n };\n\n if (messages[0]?.role === 'system') {\n messages[0] = systemMessageRecord; // replace existing system message\n } else {\n messages.unshift(systemMessageRecord); // add system message as first message\n }\n }\n\n // store history\n this.state.messages = messages;\n }\n\n @BackgroundThreadErrorFilter\n public onAppendToHistory(event: HistoryContextEventAppendToHistory): void {\n this.log.DEBUG?.('Appending message to history', event.params);\n\n const { message } = event.params;\n const messages = Array.isArray(message) ? message : [message];\n this.state.messages.push(...messages);\n }\n}\n","import { BasicThreadService } from '@onereach/flow-sdk/services/basic.js';\nimport { setImmediate } from 'node:timers/promises';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletion, ChatCompletionChunk } from 'openai/resources/index.js';\n\nimport { contentContextEvents } from '../../content/abstract-content-context-types.ts';\nimport type { RequestContextConfig } from '../request-context-types.ts';\n\nexport abstract class AbstractResponseHandler extends BasicThreadService<RequestContextConfig> {\n public abstract handle(response: ChatCompletion | Stream<ChatCompletionChunk>): Promise<void>;\n\n protected async handleContentByParentThread(content: ChatCompletion | ChatCompletionChunk): Promise<void> {\n await setImmediate();\n await this.thread.process.enqueueAndRun({\n thread: this.thread.local.parent,\n name: contentContextEvents.handleContent,\n params: { content },\n });\n }\n}\n","import type { IEvent, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionToolMessageParam } from 'openai/resources.mjs';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const contentContextEvents = {\n handleContent: 'hnd_cnt',\n} as const;\nexport type ContentContentEventName = typeof contentContextEvents;\n\nexport type ContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk | ChatCompletion },\n ContentContentEventName['handleContent']\n>;\n\nexport type ContentContextEvent = ContentContextHandleContentEvent;\n\nexport type ContentContextState = {\n requestComplete: boolean;\n chatCompletion?: ChatCompletion;\n /**\n * Are tool calls ready?\n * - `undefined` - no tools to wait for\n * - `false` - tools are processing\n * - `true` - tools finished processing\n */\n toolsReady?: boolean;\n toolsResults?: ChatCompletionToolMessageParam[];\n};\n\nexport type ContentContextOkResult = {\n status: 'ok';\n chatCompletion: ChatCompletion;\n toolsResults: ChatCompletionToolMessageParam[];\n};\nexport type ContentContextResult = ContentContextOkResult | RESULT<BaseChildConfig>;\n\nexport interface ContentContextConfig extends BaseChildConfig<ContentContextResult> {\n state: ContentContextState;\n result: ContentContextResult;\n events: ContentContextEvent;\n}\n","import type { ChatCompletion } from 'openai/resources.js';\n\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport { AbstractResponseHandler } from './abstract-response-handler.ts';\n\nexport class SimpleResponseHandler extends AbstractResponseHandler {\n public async handle(response: ChatCompletion): Promise<void> {\n this.log.DEBUG?.('Start processing response from LLM');\n await this.handleContentByParentThread(response);\n deleteAbortController({ thread: this.thread });\n }\n}\n","import type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletionChunk } from 'openai/resources.js';\n\nimport { deleteAbortController } from '../../../utils/process-abort-controller.ts';\n\nimport { AbstractResponseHandler } from './abstract-response-handler.ts';\n\nexport class StreamResponseHandler extends AbstractResponseHandler {\n public async handle(response: Stream<ChatCompletionChunk>): Promise<void> {\n this.log.DEBUG?.('Start processing stream of chunks from LLM');\n\n for await (const chunk of response) {\n // send each chunk to the controller thread for processing\n await this.handleContentByParentThread(chunk);\n }\n\n deleteAbortController({ thread: this.thread });\n }\n}\n","import type { IThread } from '@onereach/flow-sdk/types/index.js';\n\nimport type { RequestContextConfig } from '../request-context-types.ts';\nimport type { AbstractResponseHandler } from '../response-handlers/abstract-response-handler.ts';\nimport { SimpleResponseHandler } from '../response-handlers/simple-response-handler.ts';\nimport { StreamResponseHandler } from '../response-handlers/stream-response-handler.ts';\n\nexport function responseHandlerFactory({\n thread,\n isStreaming,\n}: ResponseHandlerFactoryParameters): AbstractResponseHandler {\n if (isStreaming) return new StreamResponseHandler(thread);\n return new SimpleResponseHandler(thread);\n}\n\nexport type ResponseHandlerFactoryParameters = {\n thread: IThread<RequestContextConfig>;\n isStreaming: boolean;\n};\n","import type { RESULT } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const requestContextClassId = 'rqst_ctx';\n\nexport type RequestContextState = {\n class: typeof requestContextClassId;\n};\n\nexport type RequestContextResultOk = { status: 'ok' };\nexport type RequestContextResult = RequestContextResultOk | RESULT<BaseChildConfig>;\n\nexport interface RequestContextConfig extends BaseChildConfig<RequestContextResult> {\n state: RequestContextState;\n result: RequestContextResult;\n}\n","import OpenAI from 'openai';\nimport type { Stream } from 'openai/core/streaming.js';\nimport type { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions.mjs';\nimport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessageParam,\n ChatCompletionTool,\n} from 'openai/resources.js';\nimport timestring from 'timestring';\nimport { Memoize } from 'typescript-memoize';\nimport { z } from 'zod/v4-mini';\n\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { ThreadServiceWithData } from '../../../services/thread-service-with-data.ts';\nimport { RequestContextConfig } from '../request-context-types.ts';\n\nexport class OpenAIRequestService extends ThreadServiceWithData<RequestContextConfig> {\n /**\n * Makes a request to the OpenAI API to create a chat completion.\n */\n public async makeOpenAiRequest(\n messages: ChatCompletionMessageParam[],\n signal?: AbortSignal,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const { model, temperature, topP, maxTokens, frequencyPenalty, presencePenalty, n, streamResponse } = this.data;\n\n const request: ChatCompletionCreateParamsBase = {\n messages: structuredClone(messages), // clone to avoid mutation\n model,\n temperature,\n top_p: topP,\n max_tokens: maxTokens,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n stop: this.stopSequences,\n n,\n stream: streamResponse,\n tools: this.tools,\n // reasoning_effort: 'none',\n };\n this.log.DEBUG?.('LLM request', request);\n\n try {\n const response = await this.openAiClient.chat.completions.create(request, { signal });\n\n if (!streamResponse) this.log.DEBUG?.('LLM response', response);\n\n return response;\n } catch (error) {\n if (error instanceof Error === false) throw error;\n\n throw new CreateChatCompletionStepError('Chat completion request failed', error, {\n code: ErrorCode.SERVER_ERROR,\n data: request,\n });\n }\n }\n\n private get tools(): ChatCompletionTool[] | undefined {\n const { functionsList } = this.data;\n\n if (!Array.isArray(functionsList) || functionsList.length === 0) return undefined;\n\n return functionsList.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: !tool.parameters || Object.keys(tool.parameters).length === 0 ? undefined : tool.parameters,\n strict: tool.strict,\n },\n }));\n }\n\n /**\n * Returns the OpenAI client instance configured with the step's data.\n */\n private get openAiClient(): OpenAI {\n const { provider, accountKey } = this.data;\n\n const clientOptions = {\n baseURL: `${this.config.env.OPENAI_API_URL}/${provider}`,\n apiKey: '',\n defaultHeaders: {\n Authorization: this.config.authorization,\n 'x-or-session-id': this.session.get<string>(['reporting', 'sessionId']),\n ...(accountKey ? { 'x-or-account-token-name': accountKey } : undefined),\n },\n timeout: this.timeoutMs,\n };\n this.log.DEBUG?.('OpenAI client options', clientOptions);\n\n return new OpenAI(clientOptions);\n }\n\n private get stopSequences(): string[] {\n const list = this.data.stop ?? [];\n return list.map((item) => item.token).filter((token) => token.length > 0);\n }\n\n /**\n * Returns the timeout duration in milliseconds.\n */\n @Memoize()\n private get timeoutMs(): number {\n const value = timestring(this.data.timeoutDuration, 'ms');\n\n // 1 second to 10 minutes\n return z.number().check(z.int(), z.gte(1000), z.lte(600_000)).parse(value);\n }\n}\n","import { BasicThreadService } from '@onereach/flow-sdk/services/basic.js';\nimport type { CONFIG, IN, IThread } from '@onereach/flow-sdk/types/index.js';\n\nexport class ThreadServiceWithData<\n TConfig extends CONFIG,\n TData extends IN<CONFIG> = IN<TConfig>,\n> extends BasicThreadService<TConfig> {\n protected readonly data: TData;\n\n constructor(thread: IThread<TConfig>, data: TData) {\n super(thread);\n this.data = data;\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources.js';\n\nimport { BackgroundThreadErrorFilter } from '../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../errors/step-error.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\nimport type { ContentContextConfig } from '../content/abstract-content-context-types.ts';\n\nimport { toolContextEvents, toolsContextClassId } from './tools-context-types.ts';\nimport type {\n ToolsContextConfig,\n ToolContextEventName,\n CallToolParameters,\n ToolsContextEventCallTool,\n} from './tools-context-types.ts';\nimport { ToolsContextWorkerConfig } from './tools-context-worker-types.ts';\nimport { ToolsContextWorker } from './tools-context-worker.ts';\n\nexport class ToolsContext extends BaseStep<ToolsContextConfig> {\n public static readonly class = toolsContextClassId;\n\n public static async start<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n const threadId = this.getThreadId(thread.step.id);\n await runChildThread<ToolsContextConfig, T>(thread, {\n id: threadId,\n state: {\n step: thread.step.id,\n class: this.class,\n\n /** tool calls from LLM response */\n tasks: {},\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: true,\n },\n background: true,\n });\n }\n\n public static async callTool<T extends ContentContextConfig>(\n thread: IThread<T>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n await thread.process.enqueueAndRun<ToolContextEventName['callTool'], CallToolParameters>({\n thread: this.getThreadId(thread.step.id),\n name: toolContextEvents.callTool,\n params: { toolCall },\n });\n }\n\n /**\n * Notify tools context thread that no more tool calls are expected\n */\n public static async lastToolCallReceived<T extends ContentContextConfig>(thread: IThread<T>): Promise<void> {\n await thread.process.enqueueAndRun<ToolContextEventName['lastToolCallReceived']>({\n thread: this.getThreadId(thread.step.id),\n name: toolContextEvents.lastToolCallReceived,\n });\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public runStep(): void {\n this.triggers\n .local(toolContextEvents.callTool, this.onCallTool)\n .local(toolContextEvents.lastToolCallReceived, this.onLastToolCallReceived)\n .otherwise(this.initialize);\n }\n\n @BackgroundThreadErrorFilter\n public initialize(): void {\n this.log.DEBUG?.(`Initializing ${ToolsContext.name} thread`);\n }\n\n @BackgroundThreadErrorFilter\n public onCallTool(event: ToolsContextEventCallTool): void {\n const { toolCall } = event.params;\n\n // TODO: support other tool types\n if (toolCall.type !== 'function') {\n throw new CreateChatCompletionStepError('Only function tools are supported at the moment', {\n code: ErrorCode.UNSUPPORTED,\n });\n }\n\n this.state.tasks[toolCall.id] = {\n call: toolCall,\n status: 'pending',\n };\n\n this.startToolWorkerThread(toolCall);\n }\n\n @BackgroundThreadErrorFilter\n public onLastToolCallReceived(): void {\n this.log.DEBUG?.('No more tool calls expected', this.state.tasks);\n this.state.expectMoreTasks = false; // set flag to indicate no more tasks expected\n this.tryEndToolsContextThread();\n }\n\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<ToolsContextWorkerConfig, ACTION.end>): void {\n this.log.DEBUG?.('Tool caller worker thread has ended', event);\n\n const { result } = event.params.thread;\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError(`${ToolsContextWorker.name} thread ended unexpectedly`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${ToolsContextWorker.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n // if thread was cancelled do nothing\n if (result.status === 'cancel') return;\n\n // TODO: validate structure of the result (zod?)\n this.log.DEBUG?.(`Tool worker thread completed successfully`, {\n toolCallId: result.toolCallId,\n result: result.data,\n });\n this.setToolCallResult(result.toolCallId, result.data);\n\n this.tryEndToolsContextThread();\n }\n\n /**\n * Starts the tool worker thread to process the tool call.\n */\n protected startToolWorkerThread(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.triggers.hook<ToolsContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: ToolsContextWorker.getThreadId(toolCall) },\n this.onWorkerThreadEnd,\n );\n\n void ToolsContextWorker.start(this.thread, toolCall);\n }\n\n protected setToolCallResult(toolCallId: string, result: unknown): void {\n const toolCall = this.state.tasks[toolCallId];\n\n if (toolCall == undefined) {\n throw new CreateChatCompletionStepError(`Unknown tool call with id '${toolCallId}'`, {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n toolCall.status = 'completed';\n toolCall.result = result;\n }\n\n protected tryEndToolsContextThread(): void {\n if (this.state.expectMoreTasks) return;\n\n // TODO: handle errored out tool calls\n\n // check if all tool calls are completed\n const hasActiveTasks = Object.values(this.state.tasks).some((task) => task.status === 'pending');\n if (hasActiveTasks) return;\n\n this.log.DEBUG?.('All tool calls completed or failed', this.state.tasks);\n this.end({\n status: 'ok',\n messages: this.messages,\n });\n }\n\n protected get messages(): ChatCompletionToolMessageParam[] {\n return Object.values(this.state.tasks).map((task) => ({\n role: 'tool',\n tool_call_id: task.call.id,\n content: JSON.stringify(task.result),\n }));\n }\n}\n","import type { RESULT, IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall, ChatCompletionToolMessageParam } from 'openai/resources';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const toolsContextClassId = 'tl_ctrl';\n\nexport const toolContextEvents = {\n callTool: 'tl_run_call',\n lastToolCallReceived: 'tl_rsp_end',\n} as const;\nexport type ToolContextEventName = typeof toolContextEvents;\n\nexport type ToolCallTask = {\n status: 'pending' | 'completed' | 'failed';\n call: ChatCompletionMessageFunctionToolCall;\n\n /** result of the tool call, if completed */\n result?: unknown;\n};\nexport type TasksMap = Record<ChatCompletionMessageFunctionToolCall['id'], ToolCallTask>;\n\nexport type ToolsContextResultOk = {\n status: 'ok';\n messages: ChatCompletionToolMessageParam[]; // messages to be sent to the LLM\n};\nexport type ToolsContextResult = ToolsContextResultOk | RESULT<BaseChildConfig>;\n\nexport type CallToolParameters = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n};\nexport type ToolsContextEventCallTool = IEvent<CallToolParameters, ToolContextEventName['callTool']>;\nexport type ToolsContextEventLastToolReceived = IEvent<unknown, ToolContextEventName['lastToolCallReceived']>;\nexport type ToolsContextEvent = ToolsContextEventCallTool | ToolsContextEventLastToolReceived;\n\nexport type ToolsContextState = {\n class: typeof toolsContextClassId;\n\n /** tool calls from LLM response */\n tasks: TasksMap;\n\n /** flag to indicate if there are more tasks to process */\n expectMoreTasks: boolean;\n};\n\nexport interface ToolsContextConfig extends BaseChildConfig<ToolsContextResult> {\n state: ToolsContextState;\n events: ToolsContextEvent;\n}\n","import type { LOCAL, RESULT } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\n\nimport type { BaseChildConfig } from '../base-child-types.ts';\n\nexport const toolsContextWorkerClassId = 'tl_wrk';\n\nexport type ToolsContextParsedArguments = Record<string, unknown>;\nexport type ToolsContextWorkerMergeField = {\n function: {\n name: string;\n arguments: ToolsContextParsedArguments;\n };\n};\n\nexport type ToolsContextWorkerOut = ToolsContextWorkerMergeField;\n\nexport type ToolsContextWorkerState = {\n class: typeof toolsContextWorkerClassId;\n};\n\nexport type ToolsContextWorkerLocal = {\n toolCall: ChatCompletionMessageFunctionToolCall;\n parsedArguments: ToolsContextParsedArguments;\n} & LOCAL<BaseChildConfig>;\n\nexport type ThreadWorkerResultOk = {\n status: 'ok';\n\n /** id of the tool call that was processed */\n toolCallId: string;\n\n /** result of the tool call */\n data: unknown;\n};\nexport type ThreadWorkerResult = ThreadWorkerResultOk | RESULT<BaseChildConfig>;\n\nexport interface ToolsContextWorkerConfig extends BaseChildConfig<ThreadWorkerResult, ToolsContextWorkerLocal> {\n dataOut: ToolsContextWorkerOut;\n state: ToolsContextWorkerState;\n}\n","import type { IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\n\nimport { ErrorFilter } from '../../decorators/error-filter.ts';\nimport { runChildThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../base.ts';\n\nimport type { ToolsContextConfig } from './tools-context-types.ts';\nimport type { ToolsContextWorkerConfig, ToolsContextParsedArguments } from './tools-context-worker-types.ts';\nimport { toolsContextWorkerClassId } from './tools-context-worker-types.ts';\n\nexport class ToolsContextWorker extends BaseStep<ToolsContextWorkerConfig> {\n public static readonly class = toolsContextWorkerClassId;\n\n public static async start(\n thread: IThread<ToolsContextConfig>,\n toolCall: ChatCompletionMessageFunctionToolCall,\n ): Promise<void> {\n // parse tool call arguments if they are in string format\n const parsedArguments = JSON.parse(toolCall.function?.arguments) as ToolsContextParsedArguments;\n\n await runChildThread<ToolsContextWorkerConfig, ToolsContextConfig>(thread, {\n id: this.getThreadId(toolCall),\n state: {\n step: thread.step.id,\n class: this.class,\n },\n local: {\n toolCall,\n parsedArguments,\n\n // TODO: figure out how to remove these params without breaking typing\n parent: thread.id,\n active: true,\n },\n });\n }\n\n public static getThreadId(toolCall: ChatCompletionMessageFunctionToolCall): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${toolCall.id}`;\n }\n\n // -----------------------------------------------------------------------------------\n\n /**\n * Initializes the tool worker thread to handle processing of repackaged content chunks.\n */\n @ErrorFilter\n public runStep(): void {\n const { toolCall, parsedArguments } = this.local;\n\n this.log.DEBUG?.('Initializing tool worker thread', toolCall);\n this.exitStep(this.getExitName(/*toolCall*/), {\n function: {\n name: toolCall.function.name,\n arguments: parsedArguments, // use parsed arguments\n },\n });\n }\n\n protected getExitName(/*toolCall: ChatCompletionMessageFunctionToolCall*/): string {\n // TODO: add support for exits based on individual functions\n return 'function';\n }\n}\n","import type { STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionMessageFunctionToolCall } from 'openai/resources';\n\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\n\nimport type {\n SimpleContentContextConfig,\n SimpleContentContextHandleContentEvent,\n} from './simple-content-context-types.ts';\n\nexport class SimpleContentContext extends AbstractContentContext<SimpleContentContextConfig> {\n public static readonly class = 'cnt_cxt_smp';\n\n public static getInitialState(): STATE<SimpleContentContextConfig> {\n return {\n requestComplete: false,\n };\n }\n\n // ----------------------------------------------\n\n @BackgroundThreadErrorFilter\n public async onHandleContent(event: SimpleContentContextHandleContentEvent) {\n const { content } = event.params;\n\n this.state.chatCompletion = content;\n\n // Process tool calls if any\n const toolCalls = content.choices[0]?.message.tool_calls;\n if (toolCalls != undefined) {\n for (const toolCall of toolCalls) {\n // TODO: throw an error if tool call is not a function\n await this.callFunction(toolCall as ChatCompletionMessageFunctionToolCall);\n }\n }\n }\n\n @BackgroundThreadErrorFilter\n public onAllContentReceived() {\n this.handleMultipleChoices();\n }\n\n protected tryToComplete() {\n const { requestComplete, toolsReady } = this.state;\n\n // need to wait for request and tools to finish processing\n if (!requestComplete || toolsReady === false) return;\n\n this.complete();\n }\n}\n","import type { RESULT } from '@onereach/flow-sdk/types/index.js';\n\nimport type { BaseChildConfig } from '../../base-child-types.ts';\n\nexport const streamContentContextWorkerClassId = 'str_wrk';\n\nexport const streamWorkerExits = {\n chunk: 'chunk',\n} as const;\n\nexport type ContentChunk = {\n content: string;\n index: number;\n ts: number;\n};\n\nexport type StreamContentContextWorkerOut = {\n chunk: ContentChunk;\n};\n\nexport type StreamContentContextWorkerState = {\n class: typeof streamContentContextWorkerClassId;\n\n event: ContentChunk;\n};\n\nexport type StreamContentContextWorkerResult = undefined | RESULT<BaseChildConfig>;\n\nexport interface StreamContentContextWorkerConfig extends BaseChildConfig<StreamContentContextWorkerResult> {\n dataOut: StreamContentContextWorkerOut;\n state: StreamContentContextWorkerState;\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\n\nimport { ErrorFilter } from '../../../decorators/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { isThreadBusy, runChildThread } from '../../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix, BaseStep } from '../../base.ts';\n\nimport type { StreamContentContextConfig } from './stream-content-context-types.ts';\nimport { streamContentContextWorkerClassId, streamWorkerExits } from './stream-content-context-worker-types.ts';\nimport type { StreamContentContextWorkerConfig, ContentChunk } from './stream-content-context-worker-types.ts';\n\nexport class StreamContentContextWorker extends BaseStep<StreamContentContextWorkerConfig> {\n public static readonly class = streamContentContextWorkerClassId;\n\n public static async start(thread: IThread<StreamContentContextConfig>, event: ContentChunk): Promise<void> {\n await runChildThread<StreamContentContextWorkerConfig, StreamContentContextConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n step: thread.step.id,\n class: this.class,\n\n event,\n },\n });\n }\n\n public static isBusy(thread: IThread<StreamContentContextConfig>): boolean {\n return isThreadBusy<StreamContentContextConfig, StreamContentContextWorkerConfig>(\n thread,\n this.getThreadId(thread.step.id),\n );\n }\n\n public static getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.class}_${stepId}`;\n }\n\n // ----------------------------------------------\n\n @ErrorFilter\n public runStep(): void {\n if ('event' in this.state === false || this.state.event == undefined) {\n throw new CreateChatCompletionStepError('Stream worker thread state must contain an event to process', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const chunk = this.state.event;\n this.log.DEBUG?.('Executing stream worker thread', chunk);\n this.exitStep(streamWorkerExits.chunk, { chunk });\n }\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent, STATE } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageFunctionToolCall } from 'openai/resources.js';\nimport { clear, Memoize } from 'typescript-memoize';\n\nimport { BackgroundThreadErrorFilter } from '../../../decorators/background-thread-error-filter.ts';\nimport { errorFilter } from '../../../errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from '../../../errors/step-error.ts';\nimport { AbstractContentContext } from '../abstract-content-context.ts';\n\nimport { streamChunkEventSchema } from './schemas/stream-chunk.ts';\nimport { StreamReducerService } from './services/stream-reducer.ts';\nimport { streamContentContextClassId } from './stream-content-context-types.ts';\nimport type {\n StreamContentContextConfig,\n StreamContentContextHandleContentEvent,\n ContentEvent,\n ContentChunkEvent,\n} from './stream-content-context-types.ts';\nimport { StreamContentContextWorkerConfig } from './stream-content-context-worker-types.ts';\nimport { StreamContentContextWorker } from './stream-content-context-worker.ts';\n\nconst memoizeTag = ['streamInit'];\n\nexport class StreamContentContext extends AbstractContentContext<StreamContentContextConfig> {\n public static readonly class = streamContentContextClassId;\n\n public static getInitialState(): STATE<StreamContentContextConfig> {\n return {\n class: StreamContentContext.class,\n requestComplete: false,\n workerComplete: false,\n\n partialChatCompletion: {},\n events: [],\n lastChunkReceived: false,\n index: -1,\n };\n }\n\n // ---------------------------------------\n\n @BackgroundThreadErrorFilter\n public async runStep(): Promise<void> {\n await super.runStep();\n\n clear(memoizeTag);\n\n this.triggers.hook<StreamContentContextWorkerConfig, ACTION.end>(\n { name: ACTION.end, thread: StreamContentContextWorker.getThreadId(this.thread.step.id) },\n this.onWorkerThreadEnd,\n );\n }\n\n /**\n * Handler of the worker thread end event.\n */\n @BackgroundThreadErrorFilter\n public onWorkerThreadEnd(event: IActionEvent<StreamContentContextWorkerConfig, ACTION.end>): void {\n const { result } = event.params.thread;\n\n this.log.DEBUG?.(`${StreamContentContextWorker.name} thread finished processing chunk`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${StreamContentContextWorker.name} thread ended with an error`,\n });\n throw resultError;\n }\n\n if (result?.status === 'cancel') return;\n\n // check if there are more tool calls or content chunks to process\n this.tryRunWorker();\n }\n\n /**\n * Handles a single chunk of the streaming response from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n public onHandleContent(event: StreamContentContextHandleContentEvent): void {\n const parsedEvent = streamChunkEventSchema.parse(event);\n const chunk = parsedEvent.params.content satisfies ChatCompletionChunk;\n\n const streamReducer = new StreamReducerService(this.state.partialChatCompletion, this.onToolCall.bind(this));\n streamReducer.reduceChunk(chunk);\n\n for (const chunkChoice of chunk.choices) {\n // this.log.DEBUG?.('LLM stream response chunk', chunkChoice);\n\n // skip streaming additional choices (if n > 1)\n if (chunkChoice.index > 0) continue;\n\n // aggregate content\n const content = chunkChoice.delta?.content;\n if (content != undefined && content.length > 0) {\n this.addContentToQueue(content);\n this.scheduleNextContentEvent();\n }\n }\n }\n\n /**\n * Handles the notification that all response chunks were received from the OpenAI API.\n */\n @BackgroundThreadErrorFilter\n protected onAllContentReceived(): void {\n this.log.DEBUG?.('All LLM response chunks were received. No more response chunks expected');\n\n // TODO: maybe validate that completionResult is correct?\n this.state.chatCompletion = this.state.partialChatCompletion as ChatCompletion;\n\n this.handleMultipleChoices();\n\n // add fake event as marker for end of stream\n this.state.events.push({ lastChunkReceived: true });\n\n // mark last chunk was received in stream content context thread state\n this.state.lastChunkReceived = true;\n\n // force processing of the top chunk in the content queue\n this.tryRunWorker();\n }\n\n private onToolCall(toolCall: ChatCompletionMessageFunctionToolCall): void {\n this.log.DEBUG?.('Tool call received', toolCall);\n void this.callFunction(toolCall);\n }\n\n /**\n * Tries to flush the queue of response chunks to the controller thread.\n * If the first event in the queue is not full, it waits for a debounce duration before flushing.\n * If the first event is full, it flushes it immediately.\n */\n private scheduleNextContentEvent(): void {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined || !this.isEventReady(firstEvent) || 'lastChunkReceived' in firstEvent) return;\n\n this.tryRunWorker();\n }\n\n /**\n * Compacts the content into the controller thread's events queue.\n * If the content is too long, it splits it into multiple events.\n * If the last event is not full, it extends it with the new content.\n */\n private addContentToQueue(content: string): void {\n // extend content chunk in the last event to max event size\n const lastEvent: ContentEvent | undefined = this.state.events.at(-1);\n\n if (lastEvent != undefined) {\n if ('lastChunkReceived' in lastEvent) {\n this.log.WARN?.('A new chunk received after the `lastChunkReceived` event. Ignoring it.');\n return;\n }\n\n if (lastEvent.content.length < this.maxChunkContentLength) {\n const mergedChunk = `${lastEvent.content}${content}`;\n // TODO: might be an issue with streaming to TTS\n lastEvent.content = mergedChunk.slice(0, this.maxChunkContentLength);\n // this.log.DEBUG?.('Compacting response chunk into last queue event', lastEvent);\n\n content = mergedChunk.slice(this.maxChunkContentLength);\n }\n }\n\n // split chunk into max socket size events\n while (content) {\n this.state.index += 1;\n\n const event: ContentChunkEvent = {\n // TODO: might be an issue with streaming to TTS\n content: content.slice(0, this.maxChunkContentLength),\n index: this.state.index,\n ts: Date.now(),\n };\n this.log.DEBUG?.('Add new event into the queue', event);\n this.state.events.push(event);\n\n content = content.slice(this.maxChunkContentLength);\n }\n }\n\n /**\n * Processes the next event in the controller thread's queue.\n * If the worker thread is busy, it skips processing.\n * If the event is the termination marker, it notifies the end of the controller thread.\n * If the event is ready for processing, it starts the worker thread to handle it.\n */\n private tryRunWorker(): void {\n // skip if worker thread is busy\n if (StreamContentContextWorker.isBusy(this.thread)) {\n this.log.DEBUG?.('Skip event processing. Worker thread is busy');\n return;\n }\n\n const event: ContentEvent | undefined = this.getEventToProcess();\n\n if (event == undefined) return;\n\n if ('lastChunkReceived' in event) {\n // if last chunk received, stop ContentContext thread with aggregated response\n this.log.DEBUG?.(\n `Stopping ${StreamContentContext.name} thread. All response content chunks were processed and no new chunks are coming`,\n );\n\n this.state.workerComplete = true;\n\n this.tryToComplete();\n return;\n }\n\n this.log.DEBUG?.('Notify stream worker thread about response chunk to process', event);\n\n void StreamContentContextWorker.start(this.thread, event);\n }\n\n private isEventReady(event: ContentEvent): boolean {\n if (event == undefined) return false;\n if ('lastChunkReceived' in event) return true;\n if (event.content == undefined) return false; // TODO: is it even possible? add test for this use-case\n\n const eventDelay = Date.now() - event.ts;\n return (\n this.state.lastChunkReceived ||\n eventDelay >= this.debounceDuration ||\n event.content.length >= this.maxChunkContentLength\n );\n }\n\n private getEventToProcess(): ContentEvent | undefined {\n const firstEvent = this.state.events[0];\n\n if (firstEvent == undefined) return undefined;\n if (!this.isEventReady(firstEvent)) return undefined;\n if ('lastChunkReceived' in firstEvent) return firstEvent;\n\n this.state.events.shift();\n return firstEvent;\n }\n\n protected tryToComplete(): void {\n const { chatCompletion, toolsReady, requestComplete, workerComplete } = this.state;\n if (!workerComplete || !requestComplete || toolsReady === false || chatCompletion == undefined) return;\n\n const completionMessage = chatCompletion.choices?.[0]?.message;\n if (completionMessage == undefined) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n this.complete();\n }\n\n @Memoize({ tags: memoizeTag })\n protected get maxChunkContentLength(): number {\n return this.data.streamSettings?.maxBufferLength ?? 100;\n }\n\n @Memoize({ tags: memoizeTag })\n protected get debounceDuration(): number {\n return this.data.streamSettings?.debounceDuration ?? 200;\n }\n}\n","import type { ChatCompletionChunk } from 'openai/resources';\nimport { z } from 'zod/v4-mini';\n\nexport const streamChunkEventSchema = z.looseObject({\n name: z.string(),\n params: z.looseObject({\n content: z.looseObject({\n id: z.string(),\n object: z.literal('chat.completion.chunk'),\n created: z.number(),\n model: z.string(),\n service_tier: z.nullish(z.enum(['default', 'auto', 'flex', 'scale', 'priority'])),\n choices: z.array(\n z.looseObject({\n index: z.number().check(z.int(), z.gte(0)),\n delta: z.looseObject({\n role: z.optional(z.enum(['developer', 'system', 'user', 'assistant', 'tool'])),\n content: z.nullish(z.string()),\n refusal: z.nullish(z.string()),\n tool_calls: z.optional(\n z.array(\n z.looseObject({\n index: z.number().check(z.int(), z.gte(0)),\n id: z.optional(z.string()),\n type: z.optional(z.literal('function')),\n function: z.looseObject({\n name: z.optional(z.string()),\n arguments: z.optional(z.string()),\n }),\n }) satisfies z.core.$ZodType<ChatCompletionChunk.Choice.Delta.ToolCall>,\n ),\n ),\n }),\n logprobs: z.nullish(z.any()), // logprobs may be null or omitted\n finish_reason: z.nullable(z.enum(['stop', 'length', 'tool_calls', 'content_filter'])),\n }),\n ),\n\n logprobs: z.nullish(\n z.looseObject({\n content: z.nullable(z.array(z.looseObject({}))),\n refusal: z.nullable(z.array(z.looseObject({}))),\n }),\n ),\n\n usage: z.nullish(\n z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n completion_tokens_details: z.optional(\n z.looseObject({\n accepted_prediction_tokens: z.optional(z.number()),\n audio_tokens: z.optional(z.number()),\n reasoning_tokens: z.optional(z.number()),\n rejected_prediction_tokens: z.optional(z.number()),\n }),\n ),\n prompt_tokens_details: z.optional(\n z.looseObject({\n audio_tokens: z.optional(z.number()),\n cached_tokens: z.optional(z.number()),\n }),\n ),\n }),\n ),\n }) satisfies z.core.$ZodType<ChatCompletionChunk>,\n }),\n});\n\nexport type StreamChunkEvent = z.infer<typeof streamChunkEventSchema>;\n","import type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionMessage,\n ChatCompletionMessageFunctionToolCall,\n ChatCompletionMessageToolCall,\n} from 'openai/resources.js';\n\nimport { ToolsContextParsedArguments } from '../../../tools/tools-context-worker-types.ts';\n\nexport class StreamReducerService<TArguments = ToolsContextParsedArguments> {\n protected _result: Partial<ChatCompletion>;\n protected readonly _onToolCall: OnToolCallCallback<TArguments>;\n\n constructor(memo: Partial<ChatCompletion>, onToolCall: OnToolCallCallback<TArguments>) {\n this._result = memo;\n this._onToolCall = onToolCall;\n }\n\n public reduceChunk(chunk: ChatCompletionChunk): void {\n if (Object.keys(this._result).length === 0) {\n const { choices, ...rest } = chunk; // eslint-disable-line @typescript-eslint/no-unused-vars\n Object.assign(this._result, rest);\n\n if (this._result.object != undefined) {\n this._result.object = 'chat.completion';\n }\n }\n\n if (chunk.usage) {\n this._result.usage = chunk.usage;\n // return\n }\n\n for (const choice of chunk.choices) {\n let existing = this._result.choices?.[choice.index];\n\n if (!existing) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { delta, ...rest } = choice;\n existing = rest as ChatCompletion.Choice;\n this._result.choices ??= [];\n this._result.choices[choice.index] = existing;\n }\n\n if (choice.finish_reason != undefined) {\n existing.finish_reason = choice.finish_reason;\n }\n\n if (choice.logprobs != undefined) {\n existing.logprobs = choice.logprobs;\n }\n\n if (choice.delta?.content !== undefined) {\n const { content, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n if (content === null) {\n // eslint-disable-next-line unicorn/no-null\n existing.message.content ??= null;\n } else {\n existing.message.content ??= '';\n existing.message.content += content;\n }\n }\n\n if (choice.delta?.tool_calls != undefined) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { tool_calls, ...delta } = choice.delta;\n existing.message ??= delta as ChatCompletionMessage;\n existing.message.tool_calls ??= [];\n\n for (const deltaToolCall of choice.delta.tool_calls) {\n const index = deltaToolCall.index;\n if (existing.message.tool_calls[index] == undefined) {\n existing.message.tool_calls[index] = structuredClone(\n deltaToolCall,\n ) as ChatCompletionMessageFunctionToolCall;\n } else {\n const toolCall = existing.message.tool_calls[index];\n if (!('function' in toolCall) || toolCall.function == undefined) continue;\n\n toolCall.function.arguments += deltaToolCall.function?.arguments ?? '';\n }\n\n // set immediate to not block the event loop\n if (choice.index === 0) {\n this.tryParseToolCall(existing.message.tool_calls[index]);\n }\n }\n }\n }\n }\n\n protected tryParseToolCall(toolCall: ChatCompletionMessageToolCall): void {\n try {\n if (!('function' in toolCall) || toolCall.function == undefined) return;\n const parsedArguments = JSON.parse(toolCall.function.arguments) as TArguments;\n this._onToolCall(toolCall, parsedArguments);\n } catch {\n // if failed to parse, just ignore it assume it's not fully loaded yet\n }\n }\n}\n\nexport type OnToolCallCallback<TArguments = ToolsContextParsedArguments> = (\n toolCall: ChatCompletionMessageFunctionToolCall,\n parsedArguments: TArguments,\n) => void;\n","import type { IEvent } from '@onereach/flow-sdk/types/index.js';\nimport type { ChatCompletionChunk, ChatCompletion } from 'openai/resources';\n\nimport type {\n ContentContentEventName,\n ContentContextConfig,\n ContentContextState,\n} from '../abstract-content-context-types.ts';\n\nexport const streamContentContextClassId = 'cnt_cxt_str';\n\nexport type StreamContentContextHandleContentEvent = IEvent<\n { content: ChatCompletionChunk },\n ContentContentEventName['handleContent']\n>;\nexport type StreamContentContextEvent = StreamContentContextHandleContentEvent;\n\nexport type ContentChunkEvent = {\n content: string;\n index: number;\n ts: number;\n};\nexport type ContentEndEvent = {\n // marker for end of content stream\n lastChunkReceived: true;\n};\nexport type ContentEvent = ContentChunkEvent | ContentEndEvent;\nexport type StreamContentContextState = Omit<ContentContextState, 'class'> & {\n class: typeof streamContentContextClassId;\n\n /** aggregated result of the LLM response */\n partialChatCompletion: Partial<ChatCompletion>;\n\n /** queue of response chunks */\n events: ContentEvent[];\n\n /** last index for a chunk to be processed by worker */\n index: number;\n\n /** marker for end of response stream */\n lastChunkReceived: boolean;\n\n /** When `true` means worker finished the processing the queue */\n workerComplete: boolean;\n};\n\nexport interface StreamContentContextConfig extends ContentContextConfig {\n events: StreamContentContextEvent;\n state: StreamContentContextState;\n}\n","/* eslint-disable @typescript-eslint/unbound-method */\n\nimport { ACTION } from '@onereach/flow-sdk/types/index.js';\nimport type { IActionEvent } from '@onereach/flow-sdk/types/index.js';\n\nimport { BackgroundThreadErrorFilter } from './decorators/background-thread-error-filter.ts';\nimport { ErrorFilter } from './decorators/error-filter.ts';\nimport { errorFilter } from './errors/error-filter.ts';\nimport { CreateChatCompletionStepError, ErrorCode } from './errors/step-error.ts';\nimport { ChatCompletionConfig } from './step-types.ts';\nimport { BaseStep } from './threads/base.ts';\nimport { parentEvents as stepEvents } from './threads/cancel/cancel-context-types.ts';\nimport { CancelContext } from './threads/cancel/cancel-context.ts';\nimport type { ContentContextConfig } from './threads/content/abstract-content-context-types.ts';\nimport { ContentContextUtilities } from './threads/content/content-context-utilities.ts';\nimport { HistoryContextConfig } from './threads/history/history-context-types.ts';\nimport { HistoryContext } from './threads/history/history-context.ts';\nimport { endChildThreads } from './utils/thread-utilities.ts';\nimport { validateFlowSdkVersion } from './utils/validate-flow-sdk-version.ts';\n\nconst MINIMAL_FLOW_SDK_VERSION = '8.0.72';\n\nexport class CreateChatCompletionStep extends BaseStep<ChatCompletionConfig> {\n @ErrorFilter\n public runStep(): void {\n this.triggers.hook<ContentContextConfig, ACTION.end>(\n { name: ACTION.end, thread: this.contentContext.getThreadId(this.thread.step.id) },\n this.onContentContextEnd,\n );\n this.triggers.hook<HistoryContextConfig, ACTION.end>(\n { name: ACTION.end, thread: HistoryContext.getThreadId(this.thread.step.id) },\n this.onHistoryContextEnd,\n );\n this.triggers.local(stepEvents.cancel, this.onCancel);\n this.triggers.otherwise(this.initialize);\n }\n\n @ErrorFilter\n public async initialize(): Promise<void> {\n await validateFlowSdkVersion(MINIMAL_FLOW_SDK_VERSION);\n this.validateMergeFieldType();\n\n this.resetState();\n this.state.cancelled = false;\n\n await Promise.all([HistoryContext.start(this.thread), CancelContext.start(this.thread)]);\n\n // prepare messages history for the request\n await HistoryContext.prepareHistory(this.thread);\n\n // starting ContentContext thread will initiate the request to LLM\n await this.contentContext.start(this.thread);\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onContentContextEnd(event: IActionEvent<ContentContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.('ContentContext thread ended with result', result);\n\n if (result == undefined) {\n throw new CreateChatCompletionStepError('ContentContext thread ended unexpectedly', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: 'ContentContext thread ended with an error',\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n\n if (result.status === 'cancel') {\n await this.resetStep();\n return;\n }\n\n // TODO: figure out better way to check for correct structure of the event (zod?)\n const { status, chatCompletion, toolsResults } = result;\n\n if (status !== 'ok' || chatCompletion == undefined || toolsResults == undefined) {\n throw new CreateChatCompletionStepError('Unexpected end of the ContentContext thread', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n data: event.params.result,\n });\n }\n\n this.log.DEBUG?.('Create Chat Completion result', chatCompletion);\n\n this.state.contentReady = true;\n this.state.chatCompletion = chatCompletion;\n this.state.toolsResults = toolsResults;\n\n await this.tryToExitStep();\n } catch (error) {\n await this.resetStep().catch(() => {});\n throw error;\n }\n }\n\n @BackgroundThreadErrorFilter({ allowHandleError: true })\n public async onHistoryContextEnd(event: IActionEvent<HistoryContextConfig, ACTION.end>): Promise<void> {\n try {\n const { result } = event.params.thread;\n this.log.DEBUG?.(`${HistoryContext.name} thread ended with result`, result);\n\n if (result instanceof Error) {\n const resultError = errorFilter(result, {\n unknownMessage: `${HistoryContext.name} thread ended with an error`,\n unknownCode: ErrorCode.STEP_LOGIC_ISSUE,\n });\n throw resultError;\n }\n } catch (error) {\n await CancelContext.stop(this.thread).catch(() => {});\n throw error;\n }\n }\n\n @ErrorFilter\n public async onCancel(): Promise<void> {\n await this.resetStep();\n }\n\n private async tryToExitStep(): Promise<void> {\n const { cancelled, contentReady, chatCompletion, toolsResults } = this.state;\n\n if (cancelled) {\n // TODO: cleanup history with tool responses from it if \"second\" response was cancelled\n this.resetState();\n return;\n }\n\n if (!contentReady) return;\n\n if (chatCompletion == undefined) {\n throw new CreateChatCompletionStepError('Missing chat completion result, but request is marked as processed', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n const completionMessage = chatCompletion.choices?.[0]?.message;\n if (completionMessage == undefined) {\n throw new CreateChatCompletionStepError('Missing completion message in chat completion result', {\n code: ErrorCode.STEP_LOGIC_ISSUE,\n });\n }\n\n await Promise.all([\n // add completion message and possible tool results to history\n HistoryContext.appendToHistory(this.thread, [completionMessage, ...toolsResults]),\n // at this point there's nothing to cancel, so CancelContext thread is not needed anymore\n CancelContext.stop(this.thread),\n ]);\n\n const finishReason = chatCompletion.choices[0]?.finish_reason;\n if (finishReason === 'length') {\n // TODO: allow to proceed with partial data?\n throw new CreateChatCompletionStepError('Reached limit of tokens for LLM completion response', {\n code: ErrorCode.LLM_FINISH_LENGTH,\n });\n } else if (finishReason === 'tool_calls') {\n // reset the step and run request again\n this.thread.jumpTo(this.currentStepId);\n return;\n }\n\n // both tools and content are ready, we can exit the step\n this.log.DEBUG?.('Exiting step with collected data', chatCompletion);\n this.exitStep('next', chatCompletion);\n }\n\n /**\n * Reset the step so it can handle new request\n *\n * - Reset state of initial thread (e.g. main) to original state;\n * - End CancelContext thread;\n * - End ContentController (with child thread);\n *\n * @throws if there any issues with stopping threads\n */\n private async resetStep(): Promise<void> {\n this.resetState();\n this.state.cancelled = true;\n\n const resetResults = await Promise.allSettled([\n endChildThreads(this.thread, { status: 'cancel' }),\n HistoryContext.adjustOnCancel(this.thread),\n ]);\n const failedTask = resetResults.find((task) => task.status === 'rejected');\n if (failedTask) throw failedTask.reason;\n }\n\n private resetState(): void {\n this.state.contentReady = false;\n this.state.chatCompletion = undefined;\n this.state.toolsResults = [];\n }\n\n private validateMergeFieldType(): void {\n const { functionsList } = this.data;\n if (!Array.isArray(functionsList) || functionsList.length === 0) return; // no functions used\n\n if (this.dataOut == undefined || this.getMergeField(this.dataOut).type !== 'thread') {\n throw new CreateChatCompletionStepError('Merge-field type has to be \"Thread\" if you are using functions', {\n code: ErrorCode.VALIDATION,\n });\n }\n }\n\n private get contentContext(): ContentContextUtilities {\n const isStreaming = this.data.streamResponse;\n return ContentContextUtilities.factory(isStreaming);\n }\n}\n","import type { IStepId, IThread, IThreadId } from '@onereach/flow-sdk/types/index.js';\nimport { Memoize } from 'typescript-memoize';\n\nimport type { ChatCompletionConfig } from '../../step-types.ts';\nimport { runChildThread, stopThread } from '../../utils/thread-utilities.ts';\nimport { baseClassIdPrefix } from '../base.ts';\n\nimport type { ContentContextConfig } from './abstract-content-context-types.ts';\nimport { SimpleContentContext } from './simple/simple-content-context.ts';\nimport { StreamContentContext } from './stream/stream-content-context.ts';\n\nexport class ContentContextUtilities {\n @Memoize()\n static factory(isStreaming: boolean): ContentContextUtilities {\n const Constructor: ContentContextConstructor = isStreaming ? StreamContentContext : SimpleContentContext;\n return new ContentContextUtilities(Constructor);\n }\n\n private Constructor: ContentContextConstructor;\n\n private constructor(Constructor: ContentContextConstructor) {\n this.Constructor = Constructor;\n }\n\n public async start(thread: IThread<ChatCompletionConfig>): Promise<void> {\n const initialState = this.Constructor.getInitialState();\n await runChildThread<ContentContextConfig, ChatCompletionConfig>(thread, {\n id: this.getThreadId(thread.step.id),\n state: {\n ...initialState,\n requestComplete: false,\n step: thread.step.id,\n class: this.Constructor.class,\n },\n background: true,\n });\n }\n\n public async cancel(thread: IThread<ChatCompletionConfig>): Promise<void> {\n await stopThread<ContentContextConfig, ChatCompletionConfig>(thread, this.getThreadId(thread.step.id), {\n result: { status: 'cancel' },\n stopChildThreads: true,\n });\n }\n\n public getThreadId(stepId: IStepId): IThreadId {\n return `${baseClassIdPrefix}_${this.Constructor.class}_${stepId}`;\n }\n}\n\nexport type ContentContextConstructor = typeof SimpleContentContext | typeof StreamContentContext;\n","import { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nexport async function validateFlowSdkVersion(minVersion: string): Promise<void> {\n if (typeof minVersion !== 'string' || !/^\\d+\\.\\d+\\.\\d+$/.test(minVersion)) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n const packageJsonPath = require.resolve('@onereach/flow-sdk/package.json');\n if (!packageJsonPath) {\n throw new Error(`Could not find package.json for @onereach/flow-sdk`);\n }\n // Read the package.json file to get the version\n const packageJsonContent = await readFile(packageJsonPath, 'utf8');\n\n const { version } = JSON.parse(packageJsonContent) as { version: string };\n const { groups } = /^(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)/.exec(version) || {};\n\n if (!groups) throw new Error(`Invalid Flow SDK version format: ${version}`);\n\n const major = Number.parseInt(groups.major ?? '0', 10);\n const minor = Number.parseInt(groups.minor ?? '0', 10);\n const patch = Number.parseInt(groups.patch ?? '0', 10);\n\n if (\n major == undefined ||\n minor == undefined ||\n patch == undefined ||\n Number.isNaN(major) ||\n Number.isNaN(minor) ||\n Number.isNaN(patch)\n ) {\n throw new Error(`Invalid version format: ${version}`);\n }\n\n const [minMajor, minMinor, minPatch] = minVersion.split('.').map((x) => Number.parseInt(x, 10));\n\n if (\n minMajor == undefined ||\n minMinor == undefined ||\n minPatch == undefined ||\n Number.isNaN(minMajor) ||\n Number.isNaN(minMinor) ||\n Number.isNaN(minPatch)\n ) {\n throw new Error(`Invalid minimum version format: ${minVersion}`);\n }\n\n if (\n major < minMajor ||\n (major === minMajor && minor < minMinor) ||\n (major === minMajor && minor === minMinor && patch < minPatch)\n ) {\n throw new Error(\n `Flow SDK version '${version}' is lower than required minimum version '${minVersion}' for the step`,\n );\n }\n}\n"],"mappings":"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","names":["install","ACTION","TimeoutError","z","BaseError","ErrorCode","UNKNOWN","STEP_LOGIC_ISSUE","AUTH","TIMEOUT","VALIDATION","INVALID_REQUEST","RATE_LIMITED","LLM_FINISH_LENGTH","SERVER_ERROR","UNSUPPORTED","CreateChatCompletionStepError","BaseError","AbortRequestError","defaultPreserveErrors","CreateChatCompletionStepError","TimeoutError","errorFilter","error","options","preserveErrors","unknownMessage","unknownCode","ErrorCode","UNKNOWN","some","ErrorClass","z","core","$ZodError","prettifyError","code","VALIDATION","Error","message","includes","TIMEOUT","responseErrorMessage","response","data","undefined","SERVER_ERROR","createMethodDecoratorWithOptionalArguments","apply","defaultOptions","runApply","options","target","propertyKey","descriptor","maybe","originalMethod","value","wrappedMethod","name","undefined","Object","defineProperty","__name","argument0","argument1","argument2","defaultOptions","allowHandleError","useErrorFilter","BackgroundThreadErrorFilter","createMethodDecoratorWithOptionalArguments","options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","errorHandler","call","methodName","toString","log","DEBUG","filteredError","errorFilter","Error","thread","enqueue","name","ACTION","end","createAbortController","thread","options","cacheKey","getAbortControllerKey","process","cache","undefined","Error","AbortController","getAbortController","deleteAbortController","prefix","stepId","currentStepId","normalizedPrefix","ACTION","runChildThread","thread","id","state","local","options","force","threadToRun","process","getThread","log","DEBUG","undefined","runThread","parent","active","ended","Error","enqueueAndRun","name","ACTION","goto","isThreadBusy","threadId","threadToCheck","Boolean","listChildThreads","parentThreadId","childThreads","threads","item","push","stopThread","result","stopChildThreads","threadToStop","endChildThreads","ending","stopTasks","map","child","stopResults","Promise","allSettled","throw","failedTask","find","task","status","reason","Step","defaultOptions","ErrorFilter","createMethodDecoratorWithOptionalArguments","_options","_target","propertyKey","descriptor","originalMethod","value","arguments_","result","apply","Promise","catch","error","methodName","toString","log","DEBUG","errorFilter","en","z","z","config","en","stringNoUndefinedSchema","string","check","trim","refine","value","includes","error","messageSchema","discriminatedUnion","object","role","literal","content","name","optional","minLength","maxLength","nullable","tool_calls","array","id","type","function","arguments","tool_call_id","functionParametersBaseSchema","properties","record","enum","description","items","dataInSchema","provider","model","accountKey","optionalStringValue","typeOfStep","systemMessage","userMessage","switchAssistantsMessage","_default","boolean","assistantsFirstMessage","temperature","coerce","number","gte","lte","topP","maxTokens","int","presencePenalty","frequencyPenalty","n","stop","token","streamResponse","streamSettings","maxBufferLength","overwrite","debounceDuration","customHistory","historyLength","historyMode","historyMergefield","historyCode","functionsList","parameters","pipe","transform","required","Object","keys","additionalProperties","strict","useState","stateSettings","stateFunction","processError","processTimeout","timeoutDuration","data","undefined","find","message","schema","union","BaseStep","Step","resolveDataIn","dataIn","dataInSchema","parse","baseClassIdPrefix","cancelContextClassId","parentEvents","cancel","cancelContentEvents","_ts_decorate","decorators","target","key","desc","__name","CancelContext","BaseStep","class","cancelContextClassId","start","thread","runChildThread","id","getThreadId","step","state","background","force","stop","stopThread","stepId","baseClassIdPrefix","runStep","triggers","local","name","cancelContentEvents","cancel","onCancel","otherwise","initialize","log","DEBUG","parentThreadId","parent","parentThread","process","getThread","ended","end","abortController","getAbortController","abort","AbortRequestError","enqueueAndRun","parentEvents","ACTION","setImmediate","clear","Memoize","clear","Memoize","historyContextClassId","historyContextEvents","appendToHistory","prepareHistory","adjustOnCancel","_ts_decorate","decorators","target","key","desc","__name","HistoryContext","BaseStep","class","historyContextClassId","start","thread","historyThreadId","getThreadId","step","id","process","getThread","undefined","runThread","background","state","messages","prepareHistory","enqueueAndRun","name","historyContextEvents","appendToHistory","message","params","adjustOnCancel","getHistory","getSafeThread","stepId","baseClassIdPrefix","runStep","triggers","local","onPrepareHistory","onAppendToHistory","onAdjustOnCancel","otherwise","initialize","log","DEBUG","at","includes","role","tool_calls","removedMessage","pop","customHistory","historyLength","systemMessage","typeOfStep","userMessage","historyMode","historyMergefield","historyCode","assistantsFirstMessage","data","content","length","push","some","slice","systemMessageRecord","unshift","event","Array","isArray","BasicThreadService","setImmediate","contentContextEvents","handleContent","AbstractResponseHandler","BasicThreadService","handleContentByParentThread","content","setImmediate","thread","process","enqueueAndRun","local","parent","name","contentContextEvents","handleContent","params","SimpleResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","handleContentByParentThread","deleteAbortController","thread","StreamResponseHandler","AbstractResponseHandler","handle","response","log","DEBUG","chunk","handleContentByParentThread","deleteAbortController","thread","responseHandlerFactory","thread","isStreaming","StreamResponseHandler","SimpleResponseHandler","requestContextClassId","OpenAI","timestring","Memoize","z","BasicThreadService","ThreadServiceWithData","BasicThreadService","data","thread","OpenAIRequestService","ThreadServiceWithData","makeOpenAiRequest","messages","signal","model","temperature","topP","maxTokens","frequencyPenalty","presencePenalty","n","streamResponse","data","request","structuredClone","top_p","max_tokens","frequency_penalty","presence_penalty","stop","stopSequences","stream","tools","log","DEBUG","response","openAiClient","chat","completions","create","error","Error","CreateChatCompletionStepError","code","ErrorCode","SERVER_ERROR","functionsList","Array","isArray","length","map","tool","type","function","name","description","parameters","Object","keys","undefined","strict","provider","accountKey","clientOptions","baseURL","config","env","OPENAI_API_URL","apiKey","defaultHeaders","Authorization","authorization","session","get","timeout","timeoutMs","OpenAI","item","token","filter","value","timestring","timeoutDuration","z","number","check","int","gte","lte","parse","memoizeTag","RequestContext","BaseStep","class","requestContextClassId","start","thread","runChildThread","id","getThreadId","step","state","background","stepId","baseClassIdPrefix","runStep","clear","abortController","createAbortController","response","openAiService","makeOpenAiRequest","getHistory","signal","responseHandler","handle","complete","error","aborted","cancel","deleteAbortController","end","status","history","HistoryContext","data","useState","historyClone","message","role","content","stateSettings","stateFunction","at","splice","push","OpenAIRequestService","isStreaming","streamResponse","responseHandlerFactory","tags","ACTION","toolsContextClassId","toolContextEvents","callTool","lastToolCallReceived","toolsContextWorkerClassId","ToolsContextWorker","BaseStep","class","toolsContextWorkerClassId","start","thread","toolCall","parsedArguments","JSON","parse","function","arguments","runChildThread","id","getThreadId","state","step","local","parent","active","baseClassIdPrefix","runStep","log","DEBUG","exitStep","getExitName","name","_ts_decorate","decorators","target","key","desc","__name","ToolsContext","BaseStep","class","toolsContextClassId","start","thread","threadId","getThreadId","step","id","runChildThread","state","tasks","expectMoreTasks","background","callTool","toolCall","process","enqueueAndRun","name","toolContextEvents","params","lastToolCallReceived","stepId","baseClassIdPrefix","runStep","triggers","local","onCallTool","onLastToolCallReceived","otherwise","initialize","log","DEBUG","event","type","CreateChatCompletionStepError","code","ErrorCode","UNSUPPORTED","call","status","startToolWorkerThread","tryEndToolsContextThread","onWorkerThreadEnd","result","undefined","ToolsContextWorker","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","toolCallId","data","setToolCallResult","hook","ACTION","end","Object","values","some","task","messages","map","role","tool_call_id","content","JSON","stringify","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","AbstractContentContext","BaseStep","class","Error","getInitialState","runStep","clear","triggers","local","contentContextEvents","handleContent","onHandleContent","hook","name","ACTION","end","thread","RequestContext","getThreadId","step","id","onRequestContextEnd","otherwise","initialize","log","DEBUG","start","event","result","params","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","errorFilter","unknownMessage","unknownCode","status","cancel","data","state","requestComplete","onAllContentReceived","toolsReady","setImmediate","ToolsContext","lastToolCallReceived","tryToComplete","onToolsContextEnd","messages","Array","isArray","toolsResults","callFunction","toolCall","initToolsContextThread","callTool","handleMultipleChoices","chatCompletion","choices","length","WARN","complete","tags","SimpleContentContext","AbstractContentContext","class","getInitialState","requestComplete","onHandleContent","event","content","params","state","chatCompletion","toolCalls","choices","message","tool_calls","undefined","toolCall","callFunction","onAllContentReceived","handleMultipleChoices","tryToComplete","toolsReady","complete","streamContentContextWorkerClassId","streamWorkerExits","chunk","StreamContentContextWorker","BaseStep","class","streamContentContextWorkerClassId","start","thread","event","runChildThread","id","getThreadId","step","state","isBusy","isThreadBusy","stepId","baseClassIdPrefix","runStep","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","chunk","log","DEBUG","exitStep","streamWorkerExits","ACTION","clear","Memoize","z","streamChunkEventSchema","looseObject","name","string","params","content","id","object","literal","created","number","model","service_tier","nullish","enum","choices","array","index","check","int","gte","delta","role","optional","refusal","tool_calls","type","function","arguments","logprobs","any","finish_reason","nullable","usage","prompt_tokens","completion_tokens","total_tokens","completion_tokens_details","accepted_prediction_tokens","audio_tokens","reasoning_tokens","rejected_prediction_tokens","prompt_tokens_details","cached_tokens","StreamReducerService","_result","_onToolCall","memo","onToolCall","reduceChunk","chunk","Object","keys","length","choices","rest","assign","object","undefined","usage","choice","existing","index","delta","finish_reason","logprobs","content","message","tool_calls","deltaToolCall","structuredClone","toolCall","function","arguments","tryParseToolCall","parsedArguments","JSON","parse","streamContentContextClassId","_ts_decorate","decorators","target","key","desc","__name","memoizeTag","StreamContentContext","AbstractContentContext","class","streamContentContextClassId","getInitialState","requestComplete","workerComplete","partialChatCompletion","events","lastChunkReceived","index","runStep","clear","triggers","hook","name","ACTION","end","thread","StreamContentContextWorker","getThreadId","step","id","onWorkerThreadEnd","event","result","params","log","DEBUG","Error","errorFilter","unknownMessage","status","tryRunWorker","onHandleContent","chunk","streamChunkEventSchema","parse","content","StreamReducerService","state","onToolCall","bind","reduceChunk","chunkChoice","choices","delta","undefined","length","addContentToQueue","scheduleNextContentEvent","onAllContentReceived","chatCompletion","handleMultipleChoices","push","toolCall","callFunction","firstEvent","isEventReady","lastEvent","at","WARN","maxChunkContentLength","mergedChunk","slice","ts","Date","now","isBusy","getEventToProcess","tryToComplete","start","eventDelay","debounceDuration","shift","toolsReady","message","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","complete","data","streamSettings","maxBufferLength","tags","ACTION","Memoize","ContentContextUtilities","factory","isStreaming","Constructor","StreamContentContext","SimpleContentContext","start","thread","initialState","getInitialState","runChildThread","id","getThreadId","step","state","requestComplete","class","background","cancel","stopThread","result","status","stopChildThreads","stepId","baseClassIdPrefix","readFile","createRequire","require","createRequire","url","validateFlowSdkVersion","minVersion","test","Error","packageJsonPath","resolve","packageJsonContent","readFile","version","JSON","parse","groups","exec","major","Number","parseInt","minor","patch","undefined","isNaN","minMajor","minMinor","minPatch","split","map","x","_ts_decorate","decorators","target","key","desc","__name","MINIMAL_FLOW_SDK_VERSION","CreateChatCompletionStep","BaseStep","runStep","triggers","hook","name","ACTION","end","thread","contentContext","getThreadId","step","id","onContentContextEnd","HistoryContext","onHistoryContextEnd","local","stepEvents","cancel","onCancel","otherwise","initialize","validateFlowSdkVersion","validateMergeFieldType","resetState","state","cancelled","Promise","all","start","CancelContext","prepareHistory","event","result","params","log","DEBUG","undefined","CreateChatCompletionStepError","code","ErrorCode","STEP_LOGIC_ISSUE","Error","errorFilter","unknownMessage","unknownCode","status","resetStep","chatCompletion","toolsResults","data","contentReady","tryToExitStep","error","catch","stop","completionMessage","choices","message","appendToHistory","finishReason","finish_reason","LLM_FINISH_LENGTH","jumpTo","currentStepId","exitStep","failedTask","allSettled","endChildThreads","adjustOnCancel","find","task","reason","functionsList","Array","isArray","length","dataOut","getMergeField","type","VALIDATION","isStreaming","streamResponse","ContentContextUtilities","factory","allowHandleError","install","states","HistoryContext","class","RequestContext","ToolsContext","ToolsContextWorker","SimpleContentContext","StreamContentContext","StreamContentContextWorker","CancelContext"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onereach/step-create-chat-completion",
3
- "version": "0.0.7-rc.53",
3
+ "version": "0.0.7-rc.55",
4
4
  "description": "Logic for creating LLM chat completion step",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -22,7 +22,7 @@
22
22
  "publish:rc": "npm version prerelease --preid rc && npm publish --tag rc",
23
23
  "test": "npm run unit",
24
24
  "unit": "vitest run",
25
- "preversion_": "pnpm build && pnpm test"
25
+ "preversion": "pnpm build && pnpm test"
26
26
  },
27
27
  "dependencies": {
28
28
  "openai": "^6.10.0",