@upstash/workflow 0.2.3 → 0.2.5-agents

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/express.js CHANGED
@@ -23696,6 +23696,23 @@ __export(express_exports, {
23696
23696
  });
23697
23697
  module.exports = __toCommonJS(express_exports);
23698
23698
 
23699
+ // src/constants.ts
23700
+ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
23701
+ var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
23702
+ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
23703
+ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
23704
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
23705
+ var WORKFLOW_PROTOCOL_VERSION = "1";
23706
+ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
23707
+ var DEFAULT_CONTENT_TYPE = "application/json";
23708
+ var NO_CONCURRENCY = 1;
23709
+ var DEFAULT_RETRIES = 3;
23710
+ var VERSION = "v0.2.3";
23711
+ var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
23712
+ var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
23713
+ var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
23714
+ var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
23715
+
23699
23716
  // src/client/utils.ts
23700
23717
  var import_qstash = require("@upstash/qstash");
23701
23718
  var makeNotifyRequest = async (requester, eventId, eventData) => {
@@ -24386,18 +24403,6 @@ var Err = class {
24386
24403
  };
24387
24404
  var fromThrowable = Result.fromThrowable;
24388
24405
 
24389
- // src/constants.ts
24390
- var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
24391
- var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
24392
- var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
24393
- var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
24394
- var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
24395
- var WORKFLOW_PROTOCOL_VERSION = "1";
24396
- var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
24397
- var DEFAULT_CONTENT_TYPE = "application/json";
24398
- var NO_CONCURRENCY = 1;
24399
- var DEFAULT_RETRIES = 3;
24400
-
24401
24406
  // src/types.ts
24402
24407
  var StepTypes = [
24403
24408
  "Initial",
@@ -24411,16 +24416,21 @@ var StepTypes = [
24411
24416
 
24412
24417
  // src/workflow-requests.ts
24413
24418
  var import_qstash3 = require("@upstash/qstash");
24414
- var triggerFirstInvocation = async (workflowContext, retries, useJSONContent, debug) => {
24415
- const { headers } = getHeaders(
24416
- "true",
24417
- workflowContext.workflowRunId,
24418
- workflowContext.url,
24419
- workflowContext.headers,
24420
- void 0,
24421
- workflowContext.failureUrl,
24422
- retries
24423
- );
24419
+ var triggerFirstInvocation = async ({
24420
+ workflowContext,
24421
+ useJSONContent,
24422
+ telemetry,
24423
+ debug
24424
+ }) => {
24425
+ const { headers } = getHeaders({
24426
+ initHeaderValue: "true",
24427
+ workflowRunId: workflowContext.workflowRunId,
24428
+ workflowUrl: workflowContext.url,
24429
+ userHeaders: workflowContext.headers,
24430
+ failureUrl: workflowContext.failureUrl,
24431
+ retries: workflowContext.retries,
24432
+ telemetry
24433
+ });
24424
24434
  if (useJSONContent) {
24425
24435
  headers["content-type"] = "application/json";
24426
24436
  }
@@ -24526,7 +24536,16 @@ var recreateUserHeaders = (headers) => {
24526
24536
  }
24527
24537
  return filteredHeaders;
24528
24538
  };
24529
- var handleThirdPartyCallResult = async (request, requestPayload, client, workflowUrl, failureUrl, retries, debug) => {
24539
+ var handleThirdPartyCallResult = async ({
24540
+ request,
24541
+ requestPayload,
24542
+ client,
24543
+ workflowUrl,
24544
+ failureUrl,
24545
+ retries,
24546
+ telemetry,
24547
+ debug
24548
+ }) => {
24530
24549
  try {
24531
24550
  if (request.headers.get("Upstash-Workflow-Callback")) {
24532
24551
  let callbackPayload;
@@ -24585,15 +24604,15 @@ ${atob(callbackMessage.body ?? "")}`
24585
24604
  );
24586
24605
  }
24587
24606
  const userHeaders = recreateUserHeaders(request.headers);
24588
- const { headers: requestHeaders } = getHeaders(
24589
- "false",
24607
+ const { headers: requestHeaders } = getHeaders({
24608
+ initHeaderValue: "false",
24590
24609
  workflowRunId,
24591
24610
  workflowUrl,
24592
24611
  userHeaders,
24593
- void 0,
24594
24612
  failureUrl,
24595
- retries
24596
- );
24613
+ retries,
24614
+ telemetry
24615
+ });
24597
24616
  const callResponse = {
24598
24617
  status: callbackMessage.status,
24599
24618
  body: atob(callbackMessage.body ?? ""),
@@ -24631,12 +24650,31 @@ ${atob(callbackMessage.body ?? "")}`
24631
24650
  );
24632
24651
  }
24633
24652
  };
24634
- var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step, failureUrl, retries, callRetries, callTimeout) => {
24653
+ var getTelemetryHeaders = (telemetry) => {
24654
+ return {
24655
+ [TELEMETRY_HEADER_SDK]: telemetry.sdk,
24656
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
24657
+ [TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
24658
+ };
24659
+ };
24660
+ var getHeaders = ({
24661
+ initHeaderValue,
24662
+ workflowRunId,
24663
+ workflowUrl,
24664
+ userHeaders,
24665
+ failureUrl,
24666
+ retries,
24667
+ step,
24668
+ callRetries,
24669
+ callTimeout,
24670
+ telemetry
24671
+ }) => {
24635
24672
  const baseHeaders = {
24636
24673
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
24637
24674
  [WORKFLOW_ID_HEADER]: workflowRunId,
24638
24675
  [WORKFLOW_URL_HEADER]: workflowUrl,
24639
- [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody"
24676
+ [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
24677
+ ...telemetry ? getTelemetryHeaders(telemetry) : {}
24640
24678
  };
24641
24679
  if (!step?.callUrl) {
24642
24680
  baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
@@ -24710,6 +24748,13 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
24710
24748
  ...Object.fromEntries(
24711
24749
  Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
24712
24750
  ),
24751
+ // to include telemetry headers:
24752
+ ...telemetry ? Object.fromEntries(
24753
+ Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
24754
+ header,
24755
+ [value]
24756
+ ])
24757
+ ) : {},
24713
24758
  // note: using WORKFLOW_ID_HEADER doesn't work, because Runid -> RunId:
24714
24759
  "Upstash-Workflow-Runid": [workflowRunId],
24715
24760
  [WORKFLOW_INIT_HEADER]: ["false"],
@@ -24748,6 +24793,7 @@ If you want to disable QStash Verification, you should clear env variables QSTAS
24748
24793
  };
24749
24794
 
24750
24795
  // src/context/auto-executor.ts
24796
+ var import_qstash4 = require("@upstash/qstash");
24751
24797
  var AutoExecutor = class _AutoExecutor {
24752
24798
  context;
24753
24799
  promises = /* @__PURE__ */ new WeakMap();
@@ -24756,13 +24802,15 @@ var AutoExecutor = class _AutoExecutor {
24756
24802
  nonPlanStepCount;
24757
24803
  steps;
24758
24804
  indexInCurrentList = 0;
24805
+ telemetry;
24759
24806
  stepCount = 0;
24760
24807
  planStepCount = 0;
24761
24808
  executingStep = false;
24762
- constructor(context, steps, debug) {
24809
+ constructor(context, steps, telemetry, debug) {
24763
24810
  this.context = context;
24764
- this.debug = debug;
24765
24811
  this.steps = steps;
24812
+ this.telemetry = telemetry;
24813
+ this.debug = debug;
24766
24814
  this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
24767
24815
  }
24768
24816
  /**
@@ -24905,7 +24953,7 @@ var AutoExecutor = class _AutoExecutor {
24905
24953
  );
24906
24954
  await this.submitStepsToQStash([resultStep], [parallelStep]);
24907
24955
  } catch (error) {
24908
- if (error instanceof WorkflowAbort) {
24956
+ if (error instanceof WorkflowAbort || error instanceof import_qstash4.QstashError && error.status === 400) {
24909
24957
  throw error;
24910
24958
  }
24911
24959
  throw new WorkflowError(
@@ -24976,15 +25024,16 @@ var AutoExecutor = class _AutoExecutor {
24976
25024
  });
24977
25025
  if (steps[0].waitEventId && steps.length === 1) {
24978
25026
  const waitStep = steps[0];
24979
- const { headers, timeoutHeaders } = getHeaders(
24980
- "false",
24981
- this.context.workflowRunId,
24982
- this.context.url,
24983
- this.context.headers,
24984
- waitStep,
24985
- this.context.failureUrl,
24986
- this.context.retries
24987
- );
25027
+ const { headers, timeoutHeaders } = getHeaders({
25028
+ initHeaderValue: "false",
25029
+ workflowRunId: this.context.workflowRunId,
25030
+ workflowUrl: this.context.url,
25031
+ userHeaders: this.context.headers,
25032
+ step: waitStep,
25033
+ failureUrl: this.context.failureUrl,
25034
+ retries: this.context.retries,
25035
+ telemetry: this.telemetry
25036
+ });
24988
25037
  const waitBody = {
24989
25038
  url: this.context.url,
24990
25039
  timeout: waitStep.timeout,
@@ -25011,17 +25060,18 @@ var AutoExecutor = class _AutoExecutor {
25011
25060
  const result = await this.context.qstashClient.batchJSON(
25012
25061
  steps.map((singleStep, index) => {
25013
25062
  const lazyStep = lazySteps[index];
25014
- const { headers } = getHeaders(
25015
- "false",
25016
- this.context.workflowRunId,
25017
- this.context.url,
25018
- this.context.headers,
25019
- singleStep,
25020
- this.context.failureUrl,
25021
- this.context.retries,
25022
- lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
25023
- lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0
25024
- );
25063
+ const { headers } = getHeaders({
25064
+ initHeaderValue: "false",
25065
+ workflowRunId: this.context.workflowRunId,
25066
+ workflowUrl: this.context.url,
25067
+ userHeaders: this.context.headers,
25068
+ step: singleStep,
25069
+ failureUrl: this.context.failureUrl,
25070
+ retries: this.context.retries,
25071
+ callRetries: lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
25072
+ callTimeout: lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0,
25073
+ telemetry: this.telemetry
25074
+ });
25025
25075
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
25026
25076
  singleStep.out = JSON.stringify(singleStep.out);
25027
25077
  return singleStep.callUrl ? (
@@ -25134,7 +25184,7 @@ var sortSteps = (steps) => {
25134
25184
  };
25135
25185
 
25136
25186
  // src/context/api/anthropic.ts
25137
- var import_qstash4 = require("@upstash/qstash");
25187
+ var import_qstash5 = require("@upstash/qstash");
25138
25188
 
25139
25189
  // src/context/provider.ts
25140
25190
  var getProviderInfo = (api) => {
@@ -25198,7 +25248,7 @@ var AnthropicAPI = class extends BaseWorkflowApi {
25198
25248
  return await this.callApi(stepName, {
25199
25249
  api: {
25200
25250
  name: "llm",
25201
- provider: (0, import_qstash4.anthropic)({ token })
25251
+ provider: (0, import_qstash5.anthropic)({ token })
25202
25252
  },
25203
25253
  ...parameters
25204
25254
  });
@@ -25206,14 +25256,14 @@ var AnthropicAPI = class extends BaseWorkflowApi {
25206
25256
  };
25207
25257
 
25208
25258
  // src/context/api/openai.ts
25209
- var import_qstash5 = require("@upstash/qstash");
25259
+ var import_qstash6 = require("@upstash/qstash");
25210
25260
  var OpenAIAPI = class extends BaseWorkflowApi {
25211
25261
  async call(stepName, settings) {
25212
25262
  const { token, organization, operation, ...parameters } = settings;
25213
25263
  return await this.callApi(stepName, {
25214
25264
  api: {
25215
25265
  name: "llm",
25216
- provider: (0, import_qstash5.openai)({ token, organization })
25266
+ provider: (0, import_qstash6.openai)({ token, organization })
25217
25267
  },
25218
25268
  ...parameters
25219
25269
  });
@@ -25221,14 +25271,14 @@ var OpenAIAPI = class extends BaseWorkflowApi {
25221
25271
  };
25222
25272
 
25223
25273
  // src/context/api/resend.ts
25224
- var import_qstash6 = require("@upstash/qstash");
25274
+ var import_qstash7 = require("@upstash/qstash");
25225
25275
  var ResendAPI = class extends BaseWorkflowApi {
25226
25276
  async call(stepName, settings) {
25227
25277
  const { token, batch = false, ...parameters } = settings;
25228
25278
  return await this.callApi(stepName, {
25229
25279
  api: {
25230
25280
  name: "email",
25231
- provider: (0, import_qstash6.resend)({ token, batch })
25281
+ provider: (0, import_qstash7.resend)({ token, batch })
25232
25282
  },
25233
25283
  ...parameters
25234
25284
  });
@@ -25254,6 +25304,216 @@ var WorkflowApi = class extends BaseWorkflowApi {
25254
25304
  }
25255
25305
  };
25256
25306
 
25307
+ // src/agents/adapters.ts
25308
+ var import_openai2 = require("@ai-sdk/openai");
25309
+ var import_ai = require("ai");
25310
+ var AGENT_NAME_HEADER = "upstash-agent-name";
25311
+ var createWorkflowOpenAI = (context) => {
25312
+ return (0, import_openai2.createOpenAI)({
25313
+ compatibility: "strict",
25314
+ fetch: async (input, init) => {
25315
+ try {
25316
+ const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
25317
+ const body = init?.body ? JSON.parse(init.body) : void 0;
25318
+ const agentName = headers[AGENT_NAME_HEADER];
25319
+ const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
25320
+ const responseInfo = await context.call(stepName, {
25321
+ url: input.toString(),
25322
+ method: init?.method,
25323
+ headers,
25324
+ body
25325
+ });
25326
+ const responseHeaders = new Headers(
25327
+ Object.entries(responseInfo.header).reduce(
25328
+ (acc, [key, values]) => {
25329
+ acc[key] = values.join(", ");
25330
+ return acc;
25331
+ },
25332
+ {}
25333
+ )
25334
+ );
25335
+ return new Response(JSON.stringify(responseInfo.body), {
25336
+ status: responseInfo.status,
25337
+ headers: responseHeaders
25338
+ });
25339
+ } catch (error) {
25340
+ if (error instanceof Error && error.name === "WorkflowAbort") {
25341
+ throw error;
25342
+ } else {
25343
+ console.error("Error in fetch implementation:", error);
25344
+ throw error;
25345
+ }
25346
+ }
25347
+ }
25348
+ });
25349
+ };
25350
+ var wrapTools = ({
25351
+ context,
25352
+ tools
25353
+ }) => {
25354
+ return Object.fromEntries(
25355
+ Object.entries(tools).map((toolInfo) => {
25356
+ const [toolName, tool3] = toolInfo;
25357
+ const aiSDKTool = convertToAISDKTool(tool3);
25358
+ const execute = aiSDKTool.execute;
25359
+ if (execute) {
25360
+ const wrappedExecute = (...params) => {
25361
+ return context.run(`Run tool ${toolName}`, () => execute(...params));
25362
+ };
25363
+ aiSDKTool.execute = wrappedExecute;
25364
+ }
25365
+ return [toolName, aiSDKTool];
25366
+ })
25367
+ );
25368
+ };
25369
+ var convertToAISDKTool = (tool3) => {
25370
+ const isLangchainTool = "invoke" in tool3;
25371
+ return isLangchainTool ? convertLangchainTool(tool3) : tool3;
25372
+ };
25373
+ var convertLangchainTool = (langchainTool) => {
25374
+ return (0, import_ai.tool)({
25375
+ description: langchainTool.description,
25376
+ parameters: langchainTool.schema,
25377
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25378
+ execute: async (param) => langchainTool.invoke(param)
25379
+ });
25380
+ };
25381
+
25382
+ // src/agents/agent.ts
25383
+ var import_zod = require("zod");
25384
+ var import_ai2 = require("ai");
25385
+ var Agent = class {
25386
+ name;
25387
+ tools;
25388
+ maxSteps;
25389
+ background;
25390
+ model;
25391
+ constructor({ tools, maxSteps, background, name, model }) {
25392
+ this.name = name;
25393
+ this.tools = tools ?? {};
25394
+ this.maxSteps = maxSteps;
25395
+ this.background = background;
25396
+ this.model = model;
25397
+ }
25398
+ async call({ prompt }) {
25399
+ try {
25400
+ return await (0, import_ai2.generateText)({
25401
+ model: this.model,
25402
+ tools: this.tools,
25403
+ maxSteps: this.maxSteps,
25404
+ system: this.background,
25405
+ prompt,
25406
+ headers: {
25407
+ [AGENT_NAME_HEADER]: this.name
25408
+ }
25409
+ });
25410
+ } catch (error) {
25411
+ if (error instanceof import_ai2.ToolExecutionError) {
25412
+ if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
25413
+ throw error.cause;
25414
+ } else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
25415
+ throw error.cause.cause;
25416
+ } else {
25417
+ throw error;
25418
+ }
25419
+ } else {
25420
+ throw error;
25421
+ }
25422
+ }
25423
+ }
25424
+ asTool() {
25425
+ const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
25426
+ return (0, import_ai2.tool)({
25427
+ parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
25428
+ execute: async ({ prompt }) => {
25429
+ return await this.call({ prompt });
25430
+ },
25431
+ description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
25432
+ });
25433
+ }
25434
+ };
25435
+ var MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents.
25436
+ These other agents have tools available to them.
25437
+ Given a prompt, utilize these agents to address requests.
25438
+ Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another.
25439
+ `;
25440
+ var ManagerAgent = class extends Agent {
25441
+ agents;
25442
+ constructor({
25443
+ maxSteps,
25444
+ background = MANAGER_AGENT_PROMPT,
25445
+ agents,
25446
+ model,
25447
+ name = "manager llm"
25448
+ }) {
25449
+ super({
25450
+ background,
25451
+ maxSteps,
25452
+ tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
25453
+ name,
25454
+ model
25455
+ });
25456
+ this.agents = agents;
25457
+ }
25458
+ };
25459
+
25460
+ // src/agents/task.ts
25461
+ var Task = class {
25462
+ context;
25463
+ taskParameters;
25464
+ constructor({
25465
+ context,
25466
+ taskParameters
25467
+ }) {
25468
+ this.context = context;
25469
+ this.taskParameters = taskParameters;
25470
+ }
25471
+ async run() {
25472
+ const { prompt, ...otherParams } = this.taskParameters;
25473
+ const safePrompt = await this.context.run("Get Prompt", () => prompt);
25474
+ if ("agent" in otherParams) {
25475
+ const agent = otherParams.agent;
25476
+ const result = await agent.call({
25477
+ prompt: safePrompt
25478
+ });
25479
+ return { text: result.text };
25480
+ } else {
25481
+ const { agents, maxSteps, model, background } = otherParams;
25482
+ const managerAgent = new ManagerAgent({
25483
+ model,
25484
+ maxSteps,
25485
+ agents,
25486
+ name: "Manager LLM",
25487
+ background
25488
+ });
25489
+ const result = await managerAgent.call({ prompt: safePrompt });
25490
+ return { text: result.text };
25491
+ }
25492
+ }
25493
+ };
25494
+
25495
+ // src/agents/index.ts
25496
+ var WorkflowAgents = class {
25497
+ context;
25498
+ constructor({ context }) {
25499
+ this.context = context;
25500
+ }
25501
+ agent(params) {
25502
+ const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
25503
+ return new Agent({
25504
+ ...params,
25505
+ tools: wrappedTools
25506
+ });
25507
+ }
25508
+ task(taskParameters) {
25509
+ return new Task({ context: this.context, taskParameters });
25510
+ }
25511
+ openai(...params) {
25512
+ const openai2 = createWorkflowOpenAI(this.context);
25513
+ return openai2(...params);
25514
+ }
25515
+ };
25516
+
25257
25517
  // src/context/context.ts
25258
25518
  var WorkflowContext = class {
25259
25519
  executor;
@@ -25386,7 +25646,8 @@ var WorkflowContext = class {
25386
25646
  debug,
25387
25647
  initialPayload,
25388
25648
  env,
25389
- retries
25649
+ retries,
25650
+ telemetry
25390
25651
  }) {
25391
25652
  this.qstashClient = qstashClient;
25392
25653
  this.workflowRunId = workflowRunId;
@@ -25397,7 +25658,7 @@ var WorkflowContext = class {
25397
25658
  this.requestPayload = initialPayload;
25398
25659
  this.env = env ?? {};
25399
25660
  this.retries = retries ?? DEFAULT_RETRIES;
25400
- this.executor = new AutoExecutor(this, this.steps, debug);
25661
+ this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
25401
25662
  }
25402
25663
  /**
25403
25664
  * Executes a workflow step
@@ -25638,6 +25899,11 @@ var WorkflowContext = class {
25638
25899
  context: this
25639
25900
  });
25640
25901
  }
25902
+ get agents() {
25903
+ return new WorkflowAgents({
25904
+ context: this
25905
+ });
25906
+ }
25641
25907
  };
25642
25908
 
25643
25909
  // src/logger.ts
@@ -25715,7 +25981,7 @@ function decodeBase64(base64) {
25715
25981
  }
25716
25982
 
25717
25983
  // src/serve/authorization.ts
25718
- var import_qstash7 = require("@upstash/qstash");
25984
+ var import_qstash8 = require("@upstash/qstash");
25719
25985
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
25720
25986
  static disabledMessage = "disabled-qstash-worklfow-run";
25721
25987
  /**
@@ -25746,7 +26012,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
25746
26012
  */
25747
26013
  static async tryAuthentication(routeFunction, context) {
25748
26014
  const disabledContext = new _DisabledWorkflowContext({
25749
- qstashClient: new import_qstash7.Client({
26015
+ qstashClient: new import_qstash8.Client({
25750
26016
  baseUrl: "disabled-client",
25751
26017
  token: "disabled-client"
25752
26018
  }),
@@ -25842,6 +26108,7 @@ var checkIfLastOneIsDuplicate = async (steps, debug) => {
25842
26108
  if (step.stepId === lastStepId && step.targetStep === lastTargetStepId) {
25843
26109
  const message = `Upstash Workflow: The step '${step.stepName}' with id '${step.stepId}' has run twice during workflow execution. Rest of the workflow will continue running as usual.`;
25844
26110
  await debug?.log("WARN", "RESPONSE_DEFAULT", message);
26111
+ console.log(steps);
25845
26112
  console.warn(message);
25846
26113
  return true;
25847
26114
  }
@@ -25910,7 +26177,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
25910
26177
  };
25911
26178
  }
25912
26179
  };
25913
- var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, debug) => {
26180
+ var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, env, retries, debug) => {
25914
26181
  if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
25915
26182
  return ok("not-failure-callback");
25916
26183
  }
@@ -25935,7 +26202,11 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
25935
26202
  steps: [],
25936
26203
  url,
25937
26204
  failureUrl: url,
25938
- debug
26205
+ debug,
26206
+ env,
26207
+ retries,
26208
+ telemetry: void 0
26209
+ // not going to make requests in authentication check
25939
26210
  });
25940
26211
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
25941
26212
  routeFunction,
@@ -25960,15 +26231,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
25960
26231
  };
25961
26232
 
25962
26233
  // src/serve/options.ts
25963
- var import_qstash8 = require("@upstash/qstash");
25964
26234
  var import_qstash9 = require("@upstash/qstash");
26235
+ var import_qstash10 = require("@upstash/qstash");
25965
26236
  var processOptions = (options) => {
25966
26237
  const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
25967
26238
  const receiverEnvironmentVariablesSet = Boolean(
25968
26239
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
25969
26240
  );
25970
26241
  return {
25971
- qstashClient: new import_qstash9.Client({
26242
+ qstashClient: new import_qstash10.Client({
25972
26243
  baseUrl: environment.QSTASH_URL,
25973
26244
  token: environment.QSTASH_TOKEN
25974
26245
  }),
@@ -26002,7 +26273,7 @@ var processOptions = (options) => {
26002
26273
  throw error;
26003
26274
  }
26004
26275
  },
26005
- receiver: receiverEnvironmentVariablesSet ? new import_qstash8.Receiver({
26276
+ receiver: receiverEnvironmentVariablesSet ? new import_qstash9.Receiver({
26006
26277
  currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
26007
26278
  nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
26008
26279
  }) : void 0,
@@ -26010,6 +26281,7 @@ var processOptions = (options) => {
26010
26281
  env: environment,
26011
26282
  retries: DEFAULT_RETRIES,
26012
26283
  useJSONContent: false,
26284
+ disableTelemetry: false,
26013
26285
  ...options
26014
26286
  };
26015
26287
  };
@@ -26044,7 +26316,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
26044
26316
  var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is unexpected, see the caveat https://upstash.com/docs/workflow/basics/caveats#avoid-non-deterministic-code-outside-context-run`;
26045
26317
 
26046
26318
  // src/serve/index.ts
26047
- var serveBase = (routeFunction, options) => {
26319
+ var serveBase = (routeFunction, telemetry, options) => {
26048
26320
  const {
26049
26321
  qstashClient,
26050
26322
  onStepFinish,
@@ -26057,8 +26329,10 @@ var serveBase = (routeFunction, options) => {
26057
26329
  baseUrl,
26058
26330
  env,
26059
26331
  retries,
26060
- useJSONContent
26332
+ useJSONContent,
26333
+ disableTelemetry
26061
26334
  } = processOptions(options);
26335
+ telemetry = disableTelemetry ? void 0 : telemetry;
26062
26336
  const debug = WorkflowLogger.getLogger(verbose);
26063
26337
  const handler = async (request) => {
26064
26338
  await debug?.log("INFO", "ENDPOINT_START");
@@ -26094,7 +26368,10 @@ var serveBase = (routeFunction, options) => {
26094
26368
  qstashClient,
26095
26369
  initialPayloadParser,
26096
26370
  routeFunction,
26097
- failureFunction
26371
+ failureFunction,
26372
+ env,
26373
+ retries,
26374
+ debug
26098
26375
  );
26099
26376
  if (failureCheck.isErr()) {
26100
26377
  throw failureCheck.error;
@@ -26112,7 +26389,8 @@ var serveBase = (routeFunction, options) => {
26112
26389
  failureUrl: workflowFailureUrl,
26113
26390
  debug,
26114
26391
  env,
26115
- retries
26392
+ retries,
26393
+ telemetry
26116
26394
  });
26117
26395
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
26118
26396
  routeFunction,
@@ -26128,22 +26406,23 @@ var serveBase = (routeFunction, options) => {
26128
26406
  "auth-fail"
26129
26407
  );
26130
26408
  }
26131
- const callReturnCheck = await handleThirdPartyCallResult(
26409
+ const callReturnCheck = await handleThirdPartyCallResult({
26132
26410
  request,
26133
- rawInitialPayload,
26134
- qstashClient,
26411
+ requestPayload: rawInitialPayload,
26412
+ client: qstashClient,
26135
26413
  workflowUrl,
26136
- workflowFailureUrl,
26414
+ failureUrl: workflowFailureUrl,
26137
26415
  retries,
26416
+ telemetry,
26138
26417
  debug
26139
- );
26418
+ });
26140
26419
  if (callReturnCheck.isErr()) {
26141
26420
  await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", {
26142
26421
  error: callReturnCheck.error.message
26143
26422
  });
26144
26423
  throw callReturnCheck.error;
26145
26424
  } else if (callReturnCheck.value === "continue-workflow") {
26146
- const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, useJSONContent, debug) : await triggerRouteFunction({
26425
+ const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
26147
26426
  onStep: async () => routeFunction(workflowContext),
26148
26427
  onCleanup: async () => {
26149
26428
  await triggerWorkflowDelete(workflowContext, debug);
@@ -26204,7 +26483,12 @@ function serve(routeFunction, options) {
26204
26483
  body: requestBody
26205
26484
  });
26206
26485
  const { handler: serveHandler } = serveBase(
26207
- (workflowContext) => routeFunction(workflowContext),
26486
+ routeFunction,
26487
+ {
26488
+ sdk: SDK_TELEMETRY,
26489
+ framework: "express",
26490
+ runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
26491
+ },
26208
26492
  {
26209
26493
  ...options,
26210
26494
  useJSONContent: true