@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/solidjs.js CHANGED
@@ -77,6 +77,23 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
77
77
  }
78
78
  };
79
79
 
80
+ // src/constants.ts
81
+ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
82
+ var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
83
+ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
84
+ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
85
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
86
+ var WORKFLOW_PROTOCOL_VERSION = "1";
87
+ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
88
+ var DEFAULT_CONTENT_TYPE = "application/json";
89
+ var NO_CONCURRENCY = 1;
90
+ var DEFAULT_RETRIES = 3;
91
+ var VERSION = "v0.2.3";
92
+ var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
93
+ var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
94
+ var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
95
+ var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
96
+
80
97
  // src/error.ts
81
98
  var import_qstash2 = require("@upstash/qstash");
82
99
  var WorkflowError = class extends import_qstash2.QstashError {
@@ -714,18 +731,6 @@ var Err = class {
714
731
  };
715
732
  var fromThrowable = Result.fromThrowable;
716
733
 
717
- // src/constants.ts
718
- var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
719
- var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
720
- var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
721
- var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
722
- var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
723
- var WORKFLOW_PROTOCOL_VERSION = "1";
724
- var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
725
- var DEFAULT_CONTENT_TYPE = "application/json";
726
- var NO_CONCURRENCY = 1;
727
- var DEFAULT_RETRIES = 3;
728
-
729
734
  // src/types.ts
730
735
  var StepTypes = [
731
736
  "Initial",
@@ -739,16 +744,21 @@ var StepTypes = [
739
744
 
740
745
  // src/workflow-requests.ts
741
746
  var import_qstash3 = require("@upstash/qstash");
742
- var triggerFirstInvocation = async (workflowContext, retries, useJSONContent, debug) => {
743
- const { headers } = getHeaders(
744
- "true",
745
- workflowContext.workflowRunId,
746
- workflowContext.url,
747
- workflowContext.headers,
748
- void 0,
749
- workflowContext.failureUrl,
750
- retries
751
- );
747
+ var triggerFirstInvocation = async ({
748
+ workflowContext,
749
+ useJSONContent,
750
+ telemetry,
751
+ debug
752
+ }) => {
753
+ const { headers } = getHeaders({
754
+ initHeaderValue: "true",
755
+ workflowRunId: workflowContext.workflowRunId,
756
+ workflowUrl: workflowContext.url,
757
+ userHeaders: workflowContext.headers,
758
+ failureUrl: workflowContext.failureUrl,
759
+ retries: workflowContext.retries,
760
+ telemetry
761
+ });
752
762
  if (useJSONContent) {
753
763
  headers["content-type"] = "application/json";
754
764
  }
@@ -854,7 +864,16 @@ var recreateUserHeaders = (headers) => {
854
864
  }
855
865
  return filteredHeaders;
856
866
  };
857
- var handleThirdPartyCallResult = async (request, requestPayload, client, workflowUrl, failureUrl, retries, debug) => {
867
+ var handleThirdPartyCallResult = async ({
868
+ request,
869
+ requestPayload,
870
+ client,
871
+ workflowUrl,
872
+ failureUrl,
873
+ retries,
874
+ telemetry,
875
+ debug
876
+ }) => {
858
877
  try {
859
878
  if (request.headers.get("Upstash-Workflow-Callback")) {
860
879
  let callbackPayload;
@@ -913,15 +932,15 @@ ${atob(callbackMessage.body ?? "")}`
913
932
  );
914
933
  }
915
934
  const userHeaders = recreateUserHeaders(request.headers);
916
- const { headers: requestHeaders } = getHeaders(
917
- "false",
935
+ const { headers: requestHeaders } = getHeaders({
936
+ initHeaderValue: "false",
918
937
  workflowRunId,
919
938
  workflowUrl,
920
939
  userHeaders,
921
- void 0,
922
940
  failureUrl,
923
- retries
924
- );
941
+ retries,
942
+ telemetry
943
+ });
925
944
  const callResponse = {
926
945
  status: callbackMessage.status,
927
946
  body: atob(callbackMessage.body ?? ""),
@@ -959,12 +978,31 @@ ${atob(callbackMessage.body ?? "")}`
959
978
  );
960
979
  }
961
980
  };
962
- var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step, failureUrl, retries, callRetries, callTimeout) => {
981
+ var getTelemetryHeaders = (telemetry) => {
982
+ return {
983
+ [TELEMETRY_HEADER_SDK]: telemetry.sdk,
984
+ [TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
985
+ [TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
986
+ };
987
+ };
988
+ var getHeaders = ({
989
+ initHeaderValue,
990
+ workflowRunId,
991
+ workflowUrl,
992
+ userHeaders,
993
+ failureUrl,
994
+ retries,
995
+ step,
996
+ callRetries,
997
+ callTimeout,
998
+ telemetry
999
+ }) => {
963
1000
  const baseHeaders = {
964
1001
  [WORKFLOW_INIT_HEADER]: initHeaderValue,
965
1002
  [WORKFLOW_ID_HEADER]: workflowRunId,
966
1003
  [WORKFLOW_URL_HEADER]: workflowUrl,
967
- [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody"
1004
+ [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
1005
+ ...telemetry ? getTelemetryHeaders(telemetry) : {}
968
1006
  };
969
1007
  if (!step?.callUrl) {
970
1008
  baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
@@ -1038,6 +1076,13 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
1038
1076
  ...Object.fromEntries(
1039
1077
  Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
1040
1078
  ),
1079
+ // to include telemetry headers:
1080
+ ...telemetry ? Object.fromEntries(
1081
+ Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
1082
+ header,
1083
+ [value]
1084
+ ])
1085
+ ) : {},
1041
1086
  // note: using WORKFLOW_ID_HEADER doesn't work, because Runid -> RunId:
1042
1087
  "Upstash-Workflow-Runid": [workflowRunId],
1043
1088
  [WORKFLOW_INIT_HEADER]: ["false"],
@@ -1076,6 +1121,7 @@ If you want to disable QStash Verification, you should clear env variables QSTAS
1076
1121
  };
1077
1122
 
1078
1123
  // src/context/auto-executor.ts
1124
+ var import_qstash4 = require("@upstash/qstash");
1079
1125
  var AutoExecutor = class _AutoExecutor {
1080
1126
  context;
1081
1127
  promises = /* @__PURE__ */ new WeakMap();
@@ -1084,13 +1130,15 @@ var AutoExecutor = class _AutoExecutor {
1084
1130
  nonPlanStepCount;
1085
1131
  steps;
1086
1132
  indexInCurrentList = 0;
1133
+ telemetry;
1087
1134
  stepCount = 0;
1088
1135
  planStepCount = 0;
1089
1136
  executingStep = false;
1090
- constructor(context, steps, debug) {
1137
+ constructor(context, steps, telemetry, debug) {
1091
1138
  this.context = context;
1092
- this.debug = debug;
1093
1139
  this.steps = steps;
1140
+ this.telemetry = telemetry;
1141
+ this.debug = debug;
1094
1142
  this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
1095
1143
  }
1096
1144
  /**
@@ -1233,7 +1281,7 @@ var AutoExecutor = class _AutoExecutor {
1233
1281
  );
1234
1282
  await this.submitStepsToQStash([resultStep], [parallelStep]);
1235
1283
  } catch (error) {
1236
- if (error instanceof WorkflowAbort) {
1284
+ if (error instanceof WorkflowAbort || error instanceof import_qstash4.QstashError && error.status === 400) {
1237
1285
  throw error;
1238
1286
  }
1239
1287
  throw new WorkflowError(
@@ -1304,15 +1352,16 @@ var AutoExecutor = class _AutoExecutor {
1304
1352
  });
1305
1353
  if (steps[0].waitEventId && steps.length === 1) {
1306
1354
  const waitStep = steps[0];
1307
- const { headers, timeoutHeaders } = getHeaders(
1308
- "false",
1309
- this.context.workflowRunId,
1310
- this.context.url,
1311
- this.context.headers,
1312
- waitStep,
1313
- this.context.failureUrl,
1314
- this.context.retries
1315
- );
1355
+ const { headers, timeoutHeaders } = getHeaders({
1356
+ initHeaderValue: "false",
1357
+ workflowRunId: this.context.workflowRunId,
1358
+ workflowUrl: this.context.url,
1359
+ userHeaders: this.context.headers,
1360
+ step: waitStep,
1361
+ failureUrl: this.context.failureUrl,
1362
+ retries: this.context.retries,
1363
+ telemetry: this.telemetry
1364
+ });
1316
1365
  const waitBody = {
1317
1366
  url: this.context.url,
1318
1367
  timeout: waitStep.timeout,
@@ -1339,17 +1388,18 @@ var AutoExecutor = class _AutoExecutor {
1339
1388
  const result = await this.context.qstashClient.batchJSON(
1340
1389
  steps.map((singleStep, index) => {
1341
1390
  const lazyStep = lazySteps[index];
1342
- const { headers } = getHeaders(
1343
- "false",
1344
- this.context.workflowRunId,
1345
- this.context.url,
1346
- this.context.headers,
1347
- singleStep,
1348
- this.context.failureUrl,
1349
- this.context.retries,
1350
- lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
1351
- lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0
1352
- );
1391
+ const { headers } = getHeaders({
1392
+ initHeaderValue: "false",
1393
+ workflowRunId: this.context.workflowRunId,
1394
+ workflowUrl: this.context.url,
1395
+ userHeaders: this.context.headers,
1396
+ step: singleStep,
1397
+ failureUrl: this.context.failureUrl,
1398
+ retries: this.context.retries,
1399
+ callRetries: lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
1400
+ callTimeout: lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0,
1401
+ telemetry: this.telemetry
1402
+ });
1353
1403
  const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
1354
1404
  singleStep.out = JSON.stringify(singleStep.out);
1355
1405
  return singleStep.callUrl ? (
@@ -1462,7 +1512,7 @@ var sortSteps = (steps) => {
1462
1512
  };
1463
1513
 
1464
1514
  // src/context/api/anthropic.ts
1465
- var import_qstash4 = require("@upstash/qstash");
1515
+ var import_qstash5 = require("@upstash/qstash");
1466
1516
 
1467
1517
  // src/context/provider.ts
1468
1518
  var getProviderInfo = (api) => {
@@ -1526,7 +1576,7 @@ var AnthropicAPI = class extends BaseWorkflowApi {
1526
1576
  return await this.callApi(stepName, {
1527
1577
  api: {
1528
1578
  name: "llm",
1529
- provider: (0, import_qstash4.anthropic)({ token })
1579
+ provider: (0, import_qstash5.anthropic)({ token })
1530
1580
  },
1531
1581
  ...parameters
1532
1582
  });
@@ -1534,14 +1584,14 @@ var AnthropicAPI = class extends BaseWorkflowApi {
1534
1584
  };
1535
1585
 
1536
1586
  // src/context/api/openai.ts
1537
- var import_qstash5 = require("@upstash/qstash");
1587
+ var import_qstash6 = require("@upstash/qstash");
1538
1588
  var OpenAIAPI = class extends BaseWorkflowApi {
1539
1589
  async call(stepName, settings) {
1540
1590
  const { token, organization, operation, ...parameters } = settings;
1541
1591
  return await this.callApi(stepName, {
1542
1592
  api: {
1543
1593
  name: "llm",
1544
- provider: (0, import_qstash5.openai)({ token, organization })
1594
+ provider: (0, import_qstash6.openai)({ token, organization })
1545
1595
  },
1546
1596
  ...parameters
1547
1597
  });
@@ -1549,14 +1599,14 @@ var OpenAIAPI = class extends BaseWorkflowApi {
1549
1599
  };
1550
1600
 
1551
1601
  // src/context/api/resend.ts
1552
- var import_qstash6 = require("@upstash/qstash");
1602
+ var import_qstash7 = require("@upstash/qstash");
1553
1603
  var ResendAPI = class extends BaseWorkflowApi {
1554
1604
  async call(stepName, settings) {
1555
1605
  const { token, batch = false, ...parameters } = settings;
1556
1606
  return await this.callApi(stepName, {
1557
1607
  api: {
1558
1608
  name: "email",
1559
- provider: (0, import_qstash6.resend)({ token, batch })
1609
+ provider: (0, import_qstash7.resend)({ token, batch })
1560
1610
  },
1561
1611
  ...parameters
1562
1612
  });
@@ -1582,6 +1632,216 @@ var WorkflowApi = class extends BaseWorkflowApi {
1582
1632
  }
1583
1633
  };
1584
1634
 
1635
+ // src/agents/adapters.ts
1636
+ var import_openai2 = require("@ai-sdk/openai");
1637
+ var import_ai = require("ai");
1638
+ var AGENT_NAME_HEADER = "upstash-agent-name";
1639
+ var createWorkflowOpenAI = (context) => {
1640
+ return (0, import_openai2.createOpenAI)({
1641
+ compatibility: "strict",
1642
+ fetch: async (input, init) => {
1643
+ try {
1644
+ const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
1645
+ const body = init?.body ? JSON.parse(init.body) : void 0;
1646
+ const agentName = headers[AGENT_NAME_HEADER];
1647
+ const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
1648
+ const responseInfo = await context.call(stepName, {
1649
+ url: input.toString(),
1650
+ method: init?.method,
1651
+ headers,
1652
+ body
1653
+ });
1654
+ const responseHeaders = new Headers(
1655
+ Object.entries(responseInfo.header).reduce(
1656
+ (acc, [key, values]) => {
1657
+ acc[key] = values.join(", ");
1658
+ return acc;
1659
+ },
1660
+ {}
1661
+ )
1662
+ );
1663
+ return new Response(JSON.stringify(responseInfo.body), {
1664
+ status: responseInfo.status,
1665
+ headers: responseHeaders
1666
+ });
1667
+ } catch (error) {
1668
+ if (error instanceof Error && error.name === "WorkflowAbort") {
1669
+ throw error;
1670
+ } else {
1671
+ console.error("Error in fetch implementation:", error);
1672
+ throw error;
1673
+ }
1674
+ }
1675
+ }
1676
+ });
1677
+ };
1678
+ var wrapTools = ({
1679
+ context,
1680
+ tools
1681
+ }) => {
1682
+ return Object.fromEntries(
1683
+ Object.entries(tools).map((toolInfo) => {
1684
+ const [toolName, tool3] = toolInfo;
1685
+ const aiSDKTool = convertToAISDKTool(tool3);
1686
+ const execute = aiSDKTool.execute;
1687
+ if (execute) {
1688
+ const wrappedExecute = (...params) => {
1689
+ return context.run(`Run tool ${toolName}`, () => execute(...params));
1690
+ };
1691
+ aiSDKTool.execute = wrappedExecute;
1692
+ }
1693
+ return [toolName, aiSDKTool];
1694
+ })
1695
+ );
1696
+ };
1697
+ var convertToAISDKTool = (tool3) => {
1698
+ const isLangchainTool = "invoke" in tool3;
1699
+ return isLangchainTool ? convertLangchainTool(tool3) : tool3;
1700
+ };
1701
+ var convertLangchainTool = (langchainTool) => {
1702
+ return (0, import_ai.tool)({
1703
+ description: langchainTool.description,
1704
+ parameters: langchainTool.schema,
1705
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1706
+ execute: async (param) => langchainTool.invoke(param)
1707
+ });
1708
+ };
1709
+
1710
+ // src/agents/agent.ts
1711
+ var import_zod = require("zod");
1712
+ var import_ai2 = require("ai");
1713
+ var Agent = class {
1714
+ name;
1715
+ tools;
1716
+ maxSteps;
1717
+ background;
1718
+ model;
1719
+ constructor({ tools, maxSteps, background, name, model }) {
1720
+ this.name = name;
1721
+ this.tools = tools ?? {};
1722
+ this.maxSteps = maxSteps;
1723
+ this.background = background;
1724
+ this.model = model;
1725
+ }
1726
+ async call({ prompt }) {
1727
+ try {
1728
+ return await (0, import_ai2.generateText)({
1729
+ model: this.model,
1730
+ tools: this.tools,
1731
+ maxSteps: this.maxSteps,
1732
+ system: this.background,
1733
+ prompt,
1734
+ headers: {
1735
+ [AGENT_NAME_HEADER]: this.name
1736
+ }
1737
+ });
1738
+ } catch (error) {
1739
+ if (error instanceof import_ai2.ToolExecutionError) {
1740
+ if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
1741
+ throw error.cause;
1742
+ } else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
1743
+ throw error.cause.cause;
1744
+ } else {
1745
+ throw error;
1746
+ }
1747
+ } else {
1748
+ throw error;
1749
+ }
1750
+ }
1751
+ }
1752
+ asTool() {
1753
+ const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
1754
+ return (0, import_ai2.tool)({
1755
+ parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
1756
+ execute: async ({ prompt }) => {
1757
+ return await this.call({ prompt });
1758
+ },
1759
+ description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
1760
+ });
1761
+ }
1762
+ };
1763
+ var MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents.
1764
+ These other agents have tools available to them.
1765
+ Given a prompt, utilize these agents to address requests.
1766
+ 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.
1767
+ `;
1768
+ var ManagerAgent = class extends Agent {
1769
+ agents;
1770
+ constructor({
1771
+ maxSteps,
1772
+ background = MANAGER_AGENT_PROMPT,
1773
+ agents,
1774
+ model,
1775
+ name = "manager llm"
1776
+ }) {
1777
+ super({
1778
+ background,
1779
+ maxSteps,
1780
+ tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
1781
+ name,
1782
+ model
1783
+ });
1784
+ this.agents = agents;
1785
+ }
1786
+ };
1787
+
1788
+ // src/agents/task.ts
1789
+ var Task = class {
1790
+ context;
1791
+ taskParameters;
1792
+ constructor({
1793
+ context,
1794
+ taskParameters
1795
+ }) {
1796
+ this.context = context;
1797
+ this.taskParameters = taskParameters;
1798
+ }
1799
+ async run() {
1800
+ const { prompt, ...otherParams } = this.taskParameters;
1801
+ const safePrompt = await this.context.run("Get Prompt", () => prompt);
1802
+ if ("agent" in otherParams) {
1803
+ const agent = otherParams.agent;
1804
+ const result = await agent.call({
1805
+ prompt: safePrompt
1806
+ });
1807
+ return { text: result.text };
1808
+ } else {
1809
+ const { agents, maxSteps, model, background } = otherParams;
1810
+ const managerAgent = new ManagerAgent({
1811
+ model,
1812
+ maxSteps,
1813
+ agents,
1814
+ name: "Manager LLM",
1815
+ background
1816
+ });
1817
+ const result = await managerAgent.call({ prompt: safePrompt });
1818
+ return { text: result.text };
1819
+ }
1820
+ }
1821
+ };
1822
+
1823
+ // src/agents/index.ts
1824
+ var WorkflowAgents = class {
1825
+ context;
1826
+ constructor({ context }) {
1827
+ this.context = context;
1828
+ }
1829
+ agent(params) {
1830
+ const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
1831
+ return new Agent({
1832
+ ...params,
1833
+ tools: wrappedTools
1834
+ });
1835
+ }
1836
+ task(taskParameters) {
1837
+ return new Task({ context: this.context, taskParameters });
1838
+ }
1839
+ openai(...params) {
1840
+ const openai2 = createWorkflowOpenAI(this.context);
1841
+ return openai2(...params);
1842
+ }
1843
+ };
1844
+
1585
1845
  // src/context/context.ts
1586
1846
  var WorkflowContext = class {
1587
1847
  executor;
@@ -1714,7 +1974,8 @@ var WorkflowContext = class {
1714
1974
  debug,
1715
1975
  initialPayload,
1716
1976
  env,
1717
- retries
1977
+ retries,
1978
+ telemetry
1718
1979
  }) {
1719
1980
  this.qstashClient = qstashClient;
1720
1981
  this.workflowRunId = workflowRunId;
@@ -1725,7 +1986,7 @@ var WorkflowContext = class {
1725
1986
  this.requestPayload = initialPayload;
1726
1987
  this.env = env ?? {};
1727
1988
  this.retries = retries ?? DEFAULT_RETRIES;
1728
- this.executor = new AutoExecutor(this, this.steps, debug);
1989
+ this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
1729
1990
  }
1730
1991
  /**
1731
1992
  * Executes a workflow step
@@ -1966,6 +2227,11 @@ var WorkflowContext = class {
1966
2227
  context: this
1967
2228
  });
1968
2229
  }
2230
+ get agents() {
2231
+ return new WorkflowAgents({
2232
+ context: this
2233
+ });
2234
+ }
1969
2235
  };
1970
2236
 
1971
2237
  // src/logger.ts
@@ -2043,7 +2309,7 @@ function decodeBase64(base64) {
2043
2309
  }
2044
2310
 
2045
2311
  // src/serve/authorization.ts
2046
- var import_qstash7 = require("@upstash/qstash");
2312
+ var import_qstash8 = require("@upstash/qstash");
2047
2313
  var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
2048
2314
  static disabledMessage = "disabled-qstash-worklfow-run";
2049
2315
  /**
@@ -2074,7 +2340,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
2074
2340
  */
2075
2341
  static async tryAuthentication(routeFunction, context) {
2076
2342
  const disabledContext = new _DisabledWorkflowContext({
2077
- qstashClient: new import_qstash7.Client({
2343
+ qstashClient: new import_qstash8.Client({
2078
2344
  baseUrl: "disabled-client",
2079
2345
  token: "disabled-client"
2080
2346
  }),
@@ -2170,6 +2436,7 @@ var checkIfLastOneIsDuplicate = async (steps, debug) => {
2170
2436
  if (step.stepId === lastStepId && step.targetStep === lastTargetStepId) {
2171
2437
  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.`;
2172
2438
  await debug?.log("WARN", "RESPONSE_DEFAULT", message);
2439
+ console.log(steps);
2173
2440
  console.warn(message);
2174
2441
  return true;
2175
2442
  }
@@ -2238,7 +2505,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
2238
2505
  };
2239
2506
  }
2240
2507
  };
2241
- var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, debug) => {
2508
+ var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, env, retries, debug) => {
2242
2509
  if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
2243
2510
  return ok("not-failure-callback");
2244
2511
  }
@@ -2263,7 +2530,11 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
2263
2530
  steps: [],
2264
2531
  url,
2265
2532
  failureUrl: url,
2266
- debug
2533
+ debug,
2534
+ env,
2535
+ retries,
2536
+ telemetry: void 0
2537
+ // not going to make requests in authentication check
2267
2538
  });
2268
2539
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
2269
2540
  routeFunction,
@@ -2288,15 +2559,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
2288
2559
  };
2289
2560
 
2290
2561
  // src/serve/options.ts
2291
- var import_qstash8 = require("@upstash/qstash");
2292
2562
  var import_qstash9 = require("@upstash/qstash");
2563
+ var import_qstash10 = require("@upstash/qstash");
2293
2564
  var processOptions = (options) => {
2294
2565
  const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
2295
2566
  const receiverEnvironmentVariablesSet = Boolean(
2296
2567
  environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
2297
2568
  );
2298
2569
  return {
2299
- qstashClient: new import_qstash9.Client({
2570
+ qstashClient: new import_qstash10.Client({
2300
2571
  baseUrl: environment.QSTASH_URL,
2301
2572
  token: environment.QSTASH_TOKEN
2302
2573
  }),
@@ -2330,7 +2601,7 @@ var processOptions = (options) => {
2330
2601
  throw error;
2331
2602
  }
2332
2603
  },
2333
- receiver: receiverEnvironmentVariablesSet ? new import_qstash8.Receiver({
2604
+ receiver: receiverEnvironmentVariablesSet ? new import_qstash9.Receiver({
2334
2605
  currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
2335
2606
  nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
2336
2607
  }) : void 0,
@@ -2338,6 +2609,7 @@ var processOptions = (options) => {
2338
2609
  env: environment,
2339
2610
  retries: DEFAULT_RETRIES,
2340
2611
  useJSONContent: false,
2612
+ disableTelemetry: false,
2341
2613
  ...options
2342
2614
  };
2343
2615
  };
@@ -2372,7 +2644,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
2372
2644
  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`;
2373
2645
 
2374
2646
  // src/serve/index.ts
2375
- var serveBase = (routeFunction, options) => {
2647
+ var serveBase = (routeFunction, telemetry, options) => {
2376
2648
  const {
2377
2649
  qstashClient,
2378
2650
  onStepFinish,
@@ -2385,8 +2657,10 @@ var serveBase = (routeFunction, options) => {
2385
2657
  baseUrl,
2386
2658
  env,
2387
2659
  retries,
2388
- useJSONContent
2660
+ useJSONContent,
2661
+ disableTelemetry
2389
2662
  } = processOptions(options);
2663
+ telemetry = disableTelemetry ? void 0 : telemetry;
2390
2664
  const debug = WorkflowLogger.getLogger(verbose);
2391
2665
  const handler = async (request) => {
2392
2666
  await debug?.log("INFO", "ENDPOINT_START");
@@ -2422,7 +2696,10 @@ var serveBase = (routeFunction, options) => {
2422
2696
  qstashClient,
2423
2697
  initialPayloadParser,
2424
2698
  routeFunction,
2425
- failureFunction
2699
+ failureFunction,
2700
+ env,
2701
+ retries,
2702
+ debug
2426
2703
  );
2427
2704
  if (failureCheck.isErr()) {
2428
2705
  throw failureCheck.error;
@@ -2440,7 +2717,8 @@ var serveBase = (routeFunction, options) => {
2440
2717
  failureUrl: workflowFailureUrl,
2441
2718
  debug,
2442
2719
  env,
2443
- retries
2720
+ retries,
2721
+ telemetry
2444
2722
  });
2445
2723
  const authCheck = await DisabledWorkflowContext.tryAuthentication(
2446
2724
  routeFunction,
@@ -2456,22 +2734,23 @@ var serveBase = (routeFunction, options) => {
2456
2734
  "auth-fail"
2457
2735
  );
2458
2736
  }
2459
- const callReturnCheck = await handleThirdPartyCallResult(
2737
+ const callReturnCheck = await handleThirdPartyCallResult({
2460
2738
  request,
2461
- rawInitialPayload,
2462
- qstashClient,
2739
+ requestPayload: rawInitialPayload,
2740
+ client: qstashClient,
2463
2741
  workflowUrl,
2464
- workflowFailureUrl,
2742
+ failureUrl: workflowFailureUrl,
2465
2743
  retries,
2744
+ telemetry,
2466
2745
  debug
2467
- );
2746
+ });
2468
2747
  if (callReturnCheck.isErr()) {
2469
2748
  await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", {
2470
2749
  error: callReturnCheck.error.message
2471
2750
  });
2472
2751
  throw callReturnCheck.error;
2473
2752
  } else if (callReturnCheck.value === "continue-workflow") {
2474
- const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext, retries, useJSONContent, debug) : await triggerRouteFunction({
2753
+ const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
2475
2754
  onStep: async () => routeFunction(workflowContext),
2476
2755
  onCleanup: async () => {
2477
2756
  await triggerWorkflowDelete(workflowContext, debug);
@@ -2515,7 +2794,15 @@ var serve = (routeFunction, options) => {
2515
2794
  status: 405
2516
2795
  });
2517
2796
  }
2518
- const { handler: serveHandler } = serveBase(routeFunction, options);
2797
+ const { handler: serveHandler } = serveBase(
2798
+ routeFunction,
2799
+ {
2800
+ sdk: SDK_TELEMETRY,
2801
+ framework: "solidjs",
2802
+ runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
2803
+ },
2804
+ options
2805
+ );
2519
2806
  return await serveHandler(event.request);
2520
2807
  };
2521
2808
  return { POST: handler };