@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/h3.js CHANGED
@@ -389,6 +389,23 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
389
389
  }
390
390
  };
391
391
 
392
+ // src/constants.ts
393
+ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
394
+ var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
395
+ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
396
+ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
397
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
398
+ var WORKFLOW_PROTOCOL_VERSION = "1";
399
+ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
400
+ var DEFAULT_CONTENT_TYPE = "application/json";
401
+ var NO_CONCURRENCY = 1;
402
+ var DEFAULT_RETRIES = 3;
403
+ var VERSION = "v0.2.3";
404
+ var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
405
+ var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
406
+ var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
407
+ var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
408
+
392
409
  // src/error.ts
393
410
  var import_qstash2 = require("@upstash/qstash");
394
411
  var WorkflowError = class extends import_qstash2.QstashError {
@@ -1026,18 +1043,6 @@ var Err = class {
1026
1043
  };
1027
1044
  var fromThrowable = Result.fromThrowable;
1028
1045
 
1029
- // src/constants.ts
1030
- var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
1031
- var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
1032
- var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
1033
- var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
1034
- var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
1035
- var WORKFLOW_PROTOCOL_VERSION = "1";
1036
- var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
1037
- var DEFAULT_CONTENT_TYPE = "application/json";
1038
- var NO_CONCURRENCY = 1;
1039
- var DEFAULT_RETRIES = 3;
1040
-
1041
1046
  // src/types.ts
1042
1047
  var StepTypes = [
1043
1048
  "Initial",
@@ -1051,16 +1056,21 @@ var StepTypes = [
1051
1056
 
1052
1057
  // src/workflow-requests.ts
1053
1058
  var import_qstash3 = require("@upstash/qstash");
1054
- var triggerFirstInvocation = async (workflowContext, retries, useJSONContent, debug) => {
1055
- const { headers } = getHeaders(
1056
- "true",
1057
- workflowContext.workflowRunId,
1058
- workflowContext.url,
1059
- workflowContext.headers,
1060
- void 0,
1061
- workflowContext.failureUrl,
1062
- retries
1063
- );
1059
+ var triggerFirstInvocation = async ({
1060
+ workflowContext,
1061
+ useJSONContent,
1062
+ telemetry,
1063
+ debug
1064
+ }) => {
1065
+ const { headers } = getHeaders({
1066
+ initHeaderValue: "true",
1067
+ workflowRunId: workflowContext.workflowRunId,
1068
+ workflowUrl: workflowContext.url,
1069
+ userHeaders: workflowContext.headers,
1070
+ failureUrl: workflowContext.failureUrl,
1071
+ retries: workflowContext.retries,
1072
+ telemetry
1073
+ });
1064
1074
  if (useJSONContent) {
1065
1075
  headers["content-type"] = "application/json";
1066
1076
  }
@@ -1166,7 +1176,16 @@ var recreateUserHeaders = (headers) => {
1166
1176
  }
1167
1177
  return filteredHeaders;
1168
1178
  };
1169
- var handleThirdPartyCallResult = async (request, requestPayload, client, workflowUrl, failureUrl, retries, debug) => {
1179
+ var handleThirdPartyCallResult = async ({
1180
+ request,
1181
+ requestPayload,
1182
+ client,
1183
+ workflowUrl,
1184
+ failureUrl,
1185
+ retries,
1186
+ telemetry,
1187
+ debug
1188
+ }) => {
1170
1189
  try {
1171
1190
  if (request.headers.get("Upstash-Workflow-Callback")) {
1172
1191
  let callbackPayload;
@@ -1225,15 +1244,15 @@ ${atob(callbackMessage.body ?? "")}`
1225
1244
  );
1226
1245
  }
1227
1246
  const userHeaders = recreateUserHeaders(request.headers);
1228
- const { headers: requestHeaders } = getHeaders(
1229
- "false",
1247
+ const { headers: requestHeaders } = getHeaders({
1248
+ initHeaderValue: "false",
1230
1249
  workflowRunId,
1231
1250
  workflowUrl,
1232
1251
  userHeaders,
1233
- void 0,
1234
1252
  failureUrl,
1235
- retries
1236
- );
1253
+ retries,
1254
+ telemetry
1255
+ });
1237
1256
  const callResponse = {
1238
1257
  status: callbackMessage.status,
1239
1258
  body: atob(callbackMessage.body ?? ""),
@@ -1271,12 +1290,31 @@ ${atob(callbackMessage.body ?? "")}`
1271
1290
  );
1272
1291
  }
1273
1292
  };
1274
- var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step, failureUrl, retries, callRetries, callTimeout) => {
1293
+ var getTelemetryHeaders = (telemetry) => {
1294
+ return {
1295
+ [TELEMETRY_HEADER_SDK]: telemetry.sdk,
1296
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
1297
+ [TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
1298
+ };
1299
+ };
1300
+ var getHeaders = ({
1301
+ initHeaderValue,
1302
+ workflowRunId,
1303
+ workflowUrl,
1304
+ userHeaders,
1305
+ failureUrl,
1306
+ retries,
1307
+ step,
1308
+ callRetries,
1309
+ callTimeout,
1310
+ telemetry
1311
+ }) => {
1275
1312
  const baseHeaders = {
1276
1313
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
1277
1314
  [WORKFLOW_ID_HEADER]: workflowRunId,
1278
1315
  [WORKFLOW_URL_HEADER]: workflowUrl,
1279
- [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody"
1316
+ [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
1317
+ ...telemetry ? getTelemetryHeaders(telemetry) : {}
1280
1318
  };
1281
1319
  if (!step?.callUrl) {
1282
1320
  baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
@@ -1350,6 +1388,13 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
1350
1388
  ...Object.fromEntries(
1351
1389
  Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
1352
1390
  ),
1391
+ // to include telemetry headers:
1392
+ ...telemetry ? Object.fromEntries(
1393
+ Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
1394
+ header,
1395
+ [value]
1396
+ ])
1397
+ ) : {},
1353
1398
  // note: using WORKFLOW_ID_HEADER doesn't work, because Runid -> RunId:
1354
1399
  "Upstash-Workflow-Runid": [workflowRunId],
1355
1400
  [WORKFLOW_INIT_HEADER]: ["false"],
@@ -1388,6 +1433,7 @@ If you want to disable QStash Verification, you should clear env variables QSTAS
1388
1433
  };
1389
1434
 
1390
1435
  // src/context/auto-executor.ts
1436
+ var import_qstash4 = require("@upstash/qstash");
1391
1437
  var AutoExecutor = class _AutoExecutor {
1392
1438
  context;
1393
1439
  promises = /* @__PURE__ */ new WeakMap();
@@ -1396,13 +1442,15 @@ var AutoExecutor = class _AutoExecutor {
1396
1442
  nonPlanStepCount;
1397
1443
  steps;
1398
1444
  indexInCurrentList = 0;
1445
+ telemetry;
1399
1446
  stepCount = 0;
1400
1447
  planStepCount = 0;
1401
1448
  executingStep = false;
1402
- constructor(context, steps, debug) {
1449
+ constructor(context, steps, telemetry, debug) {
1403
1450
  this.context = context;
1404
- this.debug = debug;
1405
1451
  this.steps = steps;
1452
+ this.telemetry = telemetry;
1453
+ this.debug = debug;
1406
1454
  this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
1407
1455
  }
1408
1456
  /**
@@ -1545,7 +1593,7 @@ var AutoExecutor = class _AutoExecutor {
1545
1593
  );
1546
1594
  await this.submitStepsToQStash([resultStep], [parallelStep]);
1547
1595
  } catch (error) {
1548
- if (error instanceof WorkflowAbort) {
1596
+ if (error instanceof WorkflowAbort || error instanceof import_qstash4.QstashError && error.status === 400) {
1549
1597
  throw error;
1550
1598
  }
1551
1599
  throw new WorkflowError(
@@ -1616,15 +1664,16 @@ var AutoExecutor = class _AutoExecutor {
1616
1664
  });
1617
1665
  if (steps[0].waitEventId && steps.length === 1) {
1618
1666
  const waitStep = steps[0];
1619
- const { headers, timeoutHeaders } = getHeaders(
1620
- "false",
1621
- this.context.workflowRunId,
1622
- this.context.url,
1623
- this.context.headers,
1624
- waitStep,
1625
- this.context.failureUrl,
1626
- this.context.retries
1627
- );
1667
+ const { headers, timeoutHeaders } = getHeaders({
1668
+ initHeaderValue: "false",
1669
+ workflowRunId: this.context.workflowRunId,
1670
+ workflowUrl: this.context.url,
1671
+ userHeaders: this.context.headers,
1672
+ step: waitStep,
1673
+ failureUrl: this.context.failureUrl,
1674
+ retries: this.context.retries,
1675
+ telemetry: this.telemetry
1676
+ });
1628
1677
  const waitBody = {
1629
1678
  url: this.context.url,
1630
1679
  timeout: waitStep.timeout,
@@ -1651,17 +1700,18 @@ var AutoExecutor = class _AutoExecutor {
1651
1700
  const result = await this.context.qstashClient.batchJSON(
1652
1701
  steps.map((singleStep, index) => {
1653
1702
  const lazyStep = lazySteps[index];
1654
- const { headers } = getHeaders(
1655
- "false",
1656
- this.context.workflowRunId,
1657
- this.context.url,
1658
- this.context.headers,
1659
- singleStep,
1660
- this.context.failureUrl,
1661
- this.context.retries,
1662
- lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
1663
- lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0
1664
- );
1703
+ const { headers } = getHeaders({
1704
+ initHeaderValue: "false",
1705
+ workflowRunId: this.context.workflowRunId,
1706
+ workflowUrl: this.context.url,
1707
+ userHeaders: this.context.headers,
1708
+ step: singleStep,
1709
+ failureUrl: this.context.failureUrl,
1710
+ retries: this.context.retries,
1711
+ callRetries: lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
1712
+ callTimeout: lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0,
1713
+ telemetry: this.telemetry
1714
+ });
1665
1715
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1666
1716
  singleStep.out = JSON.stringify(singleStep.out);
1667
1717
  return singleStep.callUrl ? (
@@ -1774,7 +1824,7 @@ var sortSteps = (steps) => {
1774
1824
  };
1775
1825
 
1776
1826
  // src/context/api/anthropic.ts
1777
- var import_qstash4 = require("@upstash/qstash");
1827
+ var import_qstash5 = require("@upstash/qstash");
1778
1828
 
1779
1829
  // src/context/provider.ts
1780
1830
  var getProviderInfo = (api) => {
@@ -1838,7 +1888,7 @@ var AnthropicAPI = class extends BaseWorkflowApi {
1838
1888
  return await this.callApi(stepName, {
1839
1889
  api: {
1840
1890
  name: "llm",
1841
- provider: (0, import_qstash4.anthropic)({ token })
1891
+ provider: (0, import_qstash5.anthropic)({ token })
1842
1892
  },
1843
1893
  ...parameters
1844
1894
  });
@@ -1846,14 +1896,14 @@ var AnthropicAPI = class extends BaseWorkflowApi {
1846
1896
  };
1847
1897
 
1848
1898
  // src/context/api/openai.ts
1849
- var import_qstash5 = require("@upstash/qstash");
1899
+ var import_qstash6 = require("@upstash/qstash");
1850
1900
  var OpenAIAPI = class extends BaseWorkflowApi {
1851
1901
  async call(stepName, settings) {
1852
1902
  const { token, organization, operation, ...parameters } = settings;
1853
1903
  return await this.callApi(stepName, {
1854
1904
  api: {
1855
1905
  name: "llm",
1856
- provider: (0, import_qstash5.openai)({ token, organization })
1906
+ provider: (0, import_qstash6.openai)({ token, organization })
1857
1907
  },
1858
1908
  ...parameters
1859
1909
  });
@@ -1861,14 +1911,14 @@ var OpenAIAPI = class extends BaseWorkflowApi {
1861
1911
  };
1862
1912
 
1863
1913
  // src/context/api/resend.ts
1864
- var import_qstash6 = require("@upstash/qstash");
1914
+ var import_qstash7 = require("@upstash/qstash");
1865
1915
  var ResendAPI = class extends BaseWorkflowApi {
1866
1916
  async call(stepName, settings) {
1867
1917
  const { token, batch = false, ...parameters } = settings;
1868
1918
  return await this.callApi(stepName, {
1869
1919
  api: {
1870
1920
  name: "email",
1871
- provider: (0, import_qstash6.resend)({ token, batch })
1921
+ provider: (0, import_qstash7.resend)({ token, batch })
1872
1922
  },
1873
1923
  ...parameters
1874
1924
  });
@@ -1894,6 +1944,216 @@ var WorkflowApi = class extends BaseWorkflowApi {
1894
1944
  }
1895
1945
  };
1896
1946
 
1947
+ // src/agents/adapters.ts
1948
+ var import_openai2 = require("@ai-sdk/openai");
1949
+ var import_ai = require("ai");
1950
+ var AGENT_NAME_HEADER = "upstash-agent-name";
1951
+ var createWorkflowOpenAI = (context) => {
1952
+ return (0, import_openai2.createOpenAI)({
1953
+ compatibility: "strict",
1954
+ fetch: async (input, init) => {
1955
+ try {
1956
+ const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
1957
+ const body = init?.body ? JSON.parse(init.body) : void 0;
1958
+ const agentName = headers[AGENT_NAME_HEADER];
1959
+ const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
1960
+ const responseInfo = await context.call(stepName, {
1961
+ url: input.toString(),
1962
+ method: init?.method,
1963
+ headers,
1964
+ body
1965
+ });
1966
+ const responseHeaders = new Headers(
1967
+ Object.entries(responseInfo.header).reduce(
1968
+ (acc, [key, values]) => {
1969
+ acc[key] = values.join(", ");
1970
+ return acc;
1971
+ },
1972
+ {}
1973
+ )
1974
+ );
1975
+ return new Response(JSON.stringify(responseInfo.body), {
1976
+ status: responseInfo.status,
1977
+ headers: responseHeaders
1978
+ });
1979
+ } catch (error) {
1980
+ if (error instanceof Error && error.name === "WorkflowAbort") {
1981
+ throw error;
1982
+ } else {
1983
+ console.error("Error in fetch implementation:", error);
1984
+ throw error;
1985
+ }
1986
+ }
1987
+ }
1988
+ });
1989
+ };
1990
+ var wrapTools = ({
1991
+ context,
1992
+ tools
1993
+ }) => {
1994
+ return Object.fromEntries(
1995
+ Object.entries(tools).map((toolInfo) => {
1996
+ const [toolName, tool3] = toolInfo;
1997
+ const aiSDKTool = convertToAISDKTool(tool3);
1998
+ const execute = aiSDKTool.execute;
1999
+ if (execute) {
2000
+ const wrappedExecute = (...params) => {
2001
+ return context.run(`Run tool ${toolName}`, () => execute(...params));
2002
+ };
2003
+ aiSDKTool.execute = wrappedExecute;
2004
+ }
2005
+ return [toolName, aiSDKTool];
2006
+ })
2007
+ );
2008
+ };
2009
+ var convertToAISDKTool = (tool3) => {
2010
+ const isLangchainTool = "invoke" in tool3;
2011
+ return isLangchainTool ? convertLangchainTool(tool3) : tool3;
2012
+ };
2013
+ var convertLangchainTool = (langchainTool) => {
2014
+ return (0, import_ai.tool)({
2015
+ description: langchainTool.description,
2016
+ parameters: langchainTool.schema,
2017
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2018
+ execute: async (param) => langchainTool.invoke(param)
2019
+ });
2020
+ };
2021
+
2022
+ // src/agents/agent.ts
2023
+ var import_zod = require("zod");
2024
+ var import_ai2 = require("ai");
2025
+ var Agent = class {
2026
+ name;
2027
+ tools;
2028
+ maxSteps;
2029
+ background;
2030
+ model;
2031
+ constructor({ tools, maxSteps, background, name, model }) {
2032
+ this.name = name;
2033
+ this.tools = tools ?? {};
2034
+ this.maxSteps = maxSteps;
2035
+ this.background = background;
2036
+ this.model = model;
2037
+ }
2038
+ async call({ prompt }) {
2039
+ try {
2040
+ return await (0, import_ai2.generateText)({
2041
+ model: this.model,
2042
+ tools: this.tools,
2043
+ maxSteps: this.maxSteps,
2044
+ system: this.background,
2045
+ prompt,
2046
+ headers: {
2047
+ [AGENT_NAME_HEADER]: this.name
2048
+ }
2049
+ });
2050
+ } catch (error) {
2051
+ if (error instanceof import_ai2.ToolExecutionError) {
2052
+ if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
2053
+ throw error.cause;
2054
+ } else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
2055
+ throw error.cause.cause;
2056
+ } else {
2057
+ throw error;
2058
+ }
2059
+ } else {
2060
+ throw error;
2061
+ }
2062
+ }
2063
+ }
2064
+ asTool() {
2065
+ const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
2066
+ return (0, import_ai2.tool)({
2067
+ parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
2068
+ execute: async ({ prompt }) => {
2069
+ return await this.call({ prompt });
2070
+ },
2071
+ description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
2072
+ });
2073
+ }
2074
+ };
2075
+ var MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents.
2076
+ These other agents have tools available to them.
2077
+ Given a prompt, utilize these agents to address requests.
2078
+ 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.
2079
+ `;
2080
+ var ManagerAgent = class extends Agent {
2081
+ agents;
2082
+ constructor({
2083
+ maxSteps,
2084
+ background = MANAGER_AGENT_PROMPT,
2085
+ agents,
2086
+ model,
2087
+ name = "manager llm"
2088
+ }) {
2089
+ super({
2090
+ background,
2091
+ maxSteps,
2092
+ tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
2093
+ name,
2094
+ model
2095
+ });
2096
+ this.agents = agents;
2097
+ }
2098
+ };
2099
+
2100
+ // src/agents/task.ts
2101
+ var Task = class {
2102
+ context;
2103
+ taskParameters;
2104
+ constructor({
2105
+ context,
2106
+ taskParameters
2107
+ }) {
2108
+ this.context = context;
2109
+ this.taskParameters = taskParameters;
2110
+ }
2111
+ async run() {
2112
+ const { prompt, ...otherParams } = this.taskParameters;
2113
+ const safePrompt = await this.context.run("Get Prompt", () => prompt);
2114
+ if ("agent" in otherParams) {
2115
+ const agent = otherParams.agent;
2116
+ const result = await agent.call({
2117
+ prompt: safePrompt
2118
+ });
2119
+ return { text: result.text };
2120
+ } else {
2121
+ const { agents, maxSteps, model, background } = otherParams;
2122
+ const managerAgent = new ManagerAgent({
2123
+ model,
2124
+ maxSteps,
2125
+ agents,
2126
+ name: "Manager LLM",
2127
+ background
2128
+ });
2129
+ const result = await managerAgent.call({ prompt: safePrompt });
2130
+ return { text: result.text };
2131
+ }
2132
+ }
2133
+ };
2134
+
2135
+ // src/agents/index.ts
2136
+ var WorkflowAgents = class {
2137
+ context;
2138
+ constructor({ context }) {
2139
+ this.context = context;
2140
+ }
2141
+ agent(params) {
2142
+ const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
2143
+ return new Agent({
2144
+ ...params,
2145
+ tools: wrappedTools
2146
+ });
2147
+ }
2148
+ task(taskParameters) {
2149
+ return new Task({ context: this.context, taskParameters });
2150
+ }
2151
+ openai(...params) {
2152
+ const openai2 = createWorkflowOpenAI(this.context);
2153
+ return openai2(...params);
2154
+ }
2155
+ };
2156
+
1897
2157
  // src/context/context.ts
1898
2158
  var WorkflowContext = class {
1899
2159
  executor;
@@ -2026,7 +2286,8 @@ var WorkflowContext = class {
2026
2286
  debug,
2027
2287
  initialPayload,
2028
2288
  env,
2029
- retries
2289
+ retries,
2290
+ telemetry
2030
2291
  }) {
2031
2292
  this.qstashClient = qstashClient;
2032
2293
  this.workflowRunId = workflowRunId;
@@ -2037,7 +2298,7 @@ var WorkflowContext = class {
2037
2298
  this.requestPayload = initialPayload;
2038
2299
  this.env = env ?? {};
2039
2300
  this.retries = retries ?? DEFAULT_RETRIES;
2040
- this.executor = new AutoExecutor(this, this.steps, debug);
2301
+ this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
2041
2302
  }
2042
2303
  /**
2043
2304
  * Executes a workflow step
@@ -2278,6 +2539,11 @@ var WorkflowContext = class {
2278
2539
  context: this
2279
2540
  });
2280
2541
  }
2542
+ get agents() {
2543
+ return new WorkflowAgents({
2544
+ context: this
2545
+ });
2546
+ }
2281
2547
  };
2282
2548
 
2283
2549
  // src/logger.ts
@@ -2355,7 +2621,7 @@ function decodeBase64(base64) {
2355
2621
  }
2356
2622
 
2357
2623
  // src/serve/authorization.ts
2358
- var import_qstash7 = require("@upstash/qstash");
2624
+ var import_qstash8 = require("@upstash/qstash");
2359
2625
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
2360
2626
  static disabledMessage = "disabled-qstash-worklfow-run";
2361
2627
  /**
@@ -2386,7 +2652,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2386
2652
  */
2387
2653
  static async tryAuthentication(routeFunction, context) {
2388
2654
  const disabledContext = new _DisabledWorkflowContext({
2389
- qstashClient: new import_qstash7.Client({
2655
+ qstashClient: new import_qstash8.Client({
2390
2656
  baseUrl: "disabled-client",
2391
2657
  token: "disabled-client"
2392
2658
  }),
@@ -2482,6 +2748,7 @@ var checkIfLastOneIsDuplicate = async (steps, debug) => {
2482
2748
  if (step.stepId === lastStepId && step.targetStep === lastTargetStepId) {
2483
2749
  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.`;
2484
2750
  await debug?.log("WARN", "RESPONSE_DEFAULT", message);
2751
+ console.log(steps);
2485
2752
  console.warn(message);
2486
2753
  return true;
2487
2754
  }
@@ -2550,7 +2817,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
2550
2817
  };
2551
2818
  }
2552
2819
  };
2553
- var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, debug) => {
2820
+ var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, env, retries, debug) => {
2554
2821
  if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
2555
2822
  return ok("not-failure-callback");
2556
2823
  }
@@ -2575,7 +2842,11 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
2575
2842
  steps: [],
2576
2843
  url,
2577
2844
  failureUrl: url,
2578
- debug
2845
+ debug,
2846
+ env,
2847
+ retries,
2848
+ telemetry: void 0
2849
+ // not going to make requests in authentication check
2579
2850
  });
2580
2851
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
2581
2852
  routeFunction,
@@ -2600,15 +2871,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
2600
2871
  };
2601
2872
 
2602
2873
  // src/serve/options.ts
2603
- var import_qstash8 = require("@upstash/qstash");
2604
2874
  var import_qstash9 = require("@upstash/qstash");
2875
+ var import_qstash10 = require("@upstash/qstash");
2605
2876
  var processOptions = (options) => {
2606
2877
  const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
2607
2878
  const receiverEnvironmentVariablesSet = Boolean(
2608
2879
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
2609
2880
  );
2610
2881
  return {
2611
- qstashClient: new import_qstash9.Client({
2882
+ qstashClient: new import_qstash10.Client({
2612
2883
  baseUrl: environment.QSTASH_URL,
2613
2884
  token: environment.QSTASH_TOKEN
2614
2885
  }),
@@ -2642,7 +2913,7 @@ var processOptions = (options) => {
2642
2913
  throw error;
2643
2914
  }
2644
2915
  },
2645
- receiver: receiverEnvironmentVariablesSet ? new import_qstash8.Receiver({
2916
+ receiver: receiverEnvironmentVariablesSet ? new import_qstash9.Receiver({
2646
2917
  currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
2647
2918
  nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
2648
2919
  }) : void 0,
@@ -2650,6 +2921,7 @@ var processOptions = (options) => {
2650
2921
  env: environment,
2651
2922
  retries: DEFAULT_RETRIES,
2652
2923
  useJSONContent: false,
2924
+ disableTelemetry: false,
2653
2925
  ...options
2654
2926
  };
2655
2927
  };
@@ -2684,7 +2956,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
2684
2956
  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`;
2685
2957
 
2686
2958
  // src/serve/index.ts
2687
- var serveBase = (routeFunction, options) => {
2959
+ var serveBase = (routeFunction, telemetry, options) => {
2688
2960
  const {
2689
2961
  qstashClient,
2690
2962
  onStepFinish,
@@ -2697,8 +2969,10 @@ var serveBase = (routeFunction, options) => {
2697
2969
  baseUrl,
2698
2970
  env,
2699
2971
  retries,
2700
- useJSONContent
2972
+ useJSONContent,
2973
+ disableTelemetry
2701
2974
  } = processOptions(options);
2975
+ telemetry = disableTelemetry ? void 0 : telemetry;
2702
2976
  const debug = WorkflowLogger.getLogger(verbose);
2703
2977
  const handler = async (request) => {
2704
2978
  await debug?.log("INFO", "ENDPOINT_START");
@@ -2734,7 +3008,10 @@ var serveBase = (routeFunction, options) => {
2734
3008
  qstashClient,
2735
3009
  initialPayloadParser,
2736
3010
  routeFunction,
2737
- failureFunction
3011
+ failureFunction,
3012
+ env,
3013
+ retries,
3014
+ debug
2738
3015
  );
2739
3016
  if (failureCheck.isErr()) {
2740
3017
  throw failureCheck.error;
@@ -2752,7 +3029,8 @@ var serveBase = (routeFunction, options) => {
2752
3029
  failureUrl: workflowFailureUrl,
2753
3030
  debug,
2754
3031
  env,
2755
- retries
3032
+ retries,
3033
+ telemetry
2756
3034
  });
2757
3035
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
2758
3036
  routeFunction,
@@ -2768,22 +3046,23 @@ var serveBase = (routeFunction, options) => {
2768
3046
  "auth-fail"
2769
3047
  );
2770
3048
  }
2771
- const callReturnCheck = await handleThirdPartyCallResult(
3049
+ const callReturnCheck = await handleThirdPartyCallResult({
2772
3050
  request,
2773
- rawInitialPayload,
2774
- qstashClient,
3051
+ requestPayload: rawInitialPayload,
3052
+ client: qstashClient,
2775
3053
  workflowUrl,
2776
- workflowFailureUrl,
3054
+ failureUrl: workflowFailureUrl,
2777
3055
  retries,
3056
+ telemetry,
2778
3057
  debug
2779
- );
3058
+ });
2780
3059
  if (callReturnCheck.isErr()) {
2781
3060
  await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", {
2782
3061
  error: callReturnCheck.error.message
2783
3062
  });
2784
3063
  throw callReturnCheck.error;
2785
3064
  } else if (callReturnCheck.value === "continue-workflow") {
2786
- const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, useJSONContent, debug) : await triggerRouteFunction({
3065
+ const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
2787
3066
  onStep: async () => routeFunction(workflowContext),
2788
3067
  onCleanup: async () => {
2789
3068
  await triggerWorkflowDelete(workflowContext, debug);
@@ -2845,7 +3124,15 @@ var serve = (routeFunction, options) => {
2845
3124
  body: await readRawBody(event),
2846
3125
  method: "POST"
2847
3126
  });
2848
- const { handler: serveHandler } = serveBase(routeFunction, options);
3127
+ const { handler: serveHandler } = serveBase(
3128
+ routeFunction,
3129
+ {
3130
+ sdk: SDK_TELEMETRY,
3131
+ framework: "h3",
3132
+ runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
3133
+ },
3134
+ options
3135
+ );
2849
3136
  return await serveHandler(request);
2850
3137
  });
2851
3138
  return { handler };