@librechat/agents 3.3.0 → 3.3.2

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.
Files changed (130) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +116 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +2 -0
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +229 -48
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs +102 -27
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  9. package/dist/cjs/llm/bedrock/index.cjs +11 -2
  10. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  11. package/dist/cjs/llm/contextOverflowRecovery.cjs +132 -0
  12. package/dist/cjs/llm/contextOverflowRecovery.cjs.map +1 -0
  13. package/dist/cjs/llm/google/index.cjs +1 -1
  14. package/dist/cjs/llm/invoke.cjs +60 -3
  15. package/dist/cjs/llm/invoke.cjs.map +1 -1
  16. package/dist/cjs/main.cjs +20 -7
  17. package/dist/cjs/messages/prune.cjs +16 -5
  18. package/dist/cjs/messages/prune.cjs.map +1 -1
  19. package/dist/cjs/messages/recency.cjs +2 -0
  20. package/dist/cjs/messages/recency.cjs.map +1 -1
  21. package/dist/cjs/run.cjs +15 -2
  22. package/dist/cjs/run.cjs.map +1 -1
  23. package/dist/cjs/stream.cjs +205 -49
  24. package/dist/cjs/stream.cjs.map +1 -1
  25. package/dist/cjs/summarization/node.cjs +55 -7
  26. package/dist/cjs/summarization/node.cjs.map +1 -1
  27. package/dist/cjs/tools/BashExecutor.cjs +2 -2
  28. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  29. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +2 -2
  30. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  31. package/dist/cjs/tools/CodeExecutor.cjs +69 -8
  32. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  33. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +19 -15
  34. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  35. package/dist/cjs/tools/ToolNode.cjs +32 -3
  36. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  37. package/dist/cjs/utils/errors.cjs +317 -52
  38. package/dist/cjs/utils/errors.cjs.map +1 -1
  39. package/dist/esm/agents/AgentContext.mjs +117 -3
  40. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  41. package/dist/esm/common/enum.mjs +2 -0
  42. package/dist/esm/common/enum.mjs.map +1 -1
  43. package/dist/esm/graphs/Graph.mjs +227 -46
  44. package/dist/esm/graphs/Graph.mjs.map +1 -1
  45. package/dist/esm/graphs/MultiAgentGraph.mjs +102 -27
  46. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  47. package/dist/esm/llm/bedrock/index.mjs +11 -2
  48. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  49. package/dist/esm/llm/contextOverflowRecovery.mjs +130 -0
  50. package/dist/esm/llm/contextOverflowRecovery.mjs.map +1 -0
  51. package/dist/esm/llm/google/index.mjs +1 -1
  52. package/dist/esm/llm/invoke.mjs +59 -4
  53. package/dist/esm/llm/invoke.mjs.map +1 -1
  54. package/dist/esm/main.mjs +9 -9
  55. package/dist/esm/messages/prune.mjs +14 -6
  56. package/dist/esm/messages/prune.mjs.map +1 -1
  57. package/dist/esm/messages/recency.mjs +2 -1
  58. package/dist/esm/messages/recency.mjs.map +1 -1
  59. package/dist/esm/run.mjs +15 -2
  60. package/dist/esm/run.mjs.map +1 -1
  61. package/dist/esm/stream.mjs +205 -49
  62. package/dist/esm/stream.mjs.map +1 -1
  63. package/dist/esm/summarization/node.mjs +55 -7
  64. package/dist/esm/summarization/node.mjs.map +1 -1
  65. package/dist/esm/tools/BashExecutor.mjs +3 -3
  66. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  67. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +3 -3
  68. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  69. package/dist/esm/tools/CodeExecutor.mjs +62 -9
  70. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  71. package/dist/esm/tools/ProgrammaticToolCalling.mjs +20 -16
  72. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  73. package/dist/esm/tools/ToolNode.mjs +32 -3
  74. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  75. package/dist/esm/utils/errors.mjs +317 -53
  76. package/dist/esm/utils/errors.mjs.map +1 -1
  77. package/dist/types/agents/AgentContext.d.ts +62 -3
  78. package/dist/types/common/enum.d.ts +2 -0
  79. package/dist/types/graphs/Graph.d.ts +16 -2
  80. package/dist/types/graphs/MultiAgentGraph.d.ts +1 -0
  81. package/dist/types/llm/contextOverflowRecovery.d.ts +85 -0
  82. package/dist/types/llm/invoke.d.ts +35 -6
  83. package/dist/types/messages/prune.d.ts +10 -2
  84. package/dist/types/messages/recency.d.ts +1 -0
  85. package/dist/types/run.d.ts +2 -0
  86. package/dist/types/tools/CodeExecutor.d.ts +14 -1
  87. package/dist/types/types/llm.d.ts +7 -4
  88. package/dist/types/types/stream.d.ts +5 -4
  89. package/dist/types/types/summarize.d.ts +22 -0
  90. package/dist/types/utils/__tests__/fixtures/contextOverflowSignatures.d.ts +40 -0
  91. package/dist/types/utils/errors.d.ts +65 -16
  92. package/dist/types/utils/redactSecrets.d.ts +3 -0
  93. package/package.json +10 -11
  94. package/src/agents/AgentContext.ts +188 -7
  95. package/src/agents/__tests__/AgentContext.overflow.test.ts +205 -0
  96. package/src/common/enum.ts +2 -0
  97. package/src/graphs/Graph.ts +389 -58
  98. package/src/graphs/MultiAgentGraph.ts +184 -46
  99. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +631 -0
  100. package/src/llm/__tests__/contextOverflowRecovery.test.ts +401 -0
  101. package/src/llm/__tests__/fallbackOverflow.test.ts +287 -0
  102. package/src/llm/anthropic/llm.spec.ts +8 -0
  103. package/src/llm/bedrock/index.ts +25 -12
  104. package/src/llm/contextOverflowRecovery.ts +292 -0
  105. package/src/llm/invoke.ts +119 -4
  106. package/src/messages/prune.ts +24 -11
  107. package/src/messages/recency.ts +3 -1
  108. package/src/run.ts +24 -1
  109. package/src/scripts/context-overflow-probe.ts +997 -0
  110. package/src/specs/agent-handoffs.test.ts +903 -1
  111. package/src/specs/context-overflow-recovery.live.test.ts +213 -0
  112. package/src/splitStream.test.ts +882 -0
  113. package/src/stream.ts +315 -51
  114. package/src/summarization/__tests__/aggregator.test.ts +83 -0
  115. package/src/summarization/__tests__/node.test.ts +139 -0
  116. package/src/summarization/node.ts +99 -14
  117. package/src/tools/BashExecutor.ts +4 -2
  118. package/src/tools/BashProgrammaticToolCalling.ts +4 -7
  119. package/src/tools/CodeExecutor.ts +119 -8
  120. package/src/tools/ProgrammaticToolCalling.ts +29 -27
  121. package/src/tools/ToolNode.ts +50 -8
  122. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +297 -3
  123. package/src/types/llm.ts +8 -1
  124. package/src/types/stream.ts +5 -4
  125. package/src/types/summarize.ts +22 -0
  126. package/src/utils/__tests__/errors.test.ts +270 -0
  127. package/src/utils/__tests__/fixtures/contextOverflowSignatures.ts +336 -0
  128. package/src/utils/__tests__/redactSecrets.test.ts +56 -0
  129. package/src/utils/errors.ts +484 -66
  130. package/src/utils/redactSecrets.ts +61 -0
@@ -781,12 +781,98 @@ hasToolCallChunks: ${hasToolCallChunks}
781
781
  function createContentAggregator() {
782
782
  const contentParts = [];
783
783
  const stepMap = /* @__PURE__ */ new Map();
784
- const toolCallIdMap = /* @__PURE__ */ new Map();
784
+ const toolCallContentIndexMap = /* @__PURE__ */ new Map();
785
+ const sourceContentIndexMap = /* @__PURE__ */ new Map();
786
+ const toolStepContentMap = /* @__PURE__ */ new Map();
787
+ let indexedContentLength = 0;
788
+ /** Physical append cursor; event/chunk indices are correlation keys, not array offsets. */
789
+ let nextContentIndex = 0;
785
790
  const contentMetaMap = /* @__PURE__ */ new Map();
786
791
  const getFirstContentPart = (content) => {
787
792
  if (content == null) return;
788
793
  return Array.isArray(content) ? content[0] : content;
789
794
  };
795
+ const indexContentPart = (index, contentPart) => {
796
+ if (contentPart == null) return;
797
+ if (contentPart.type === "tool_call") {
798
+ const toolCallId = contentPart.tool_call.id;
799
+ if (toolCallId != null && toolCallId !== "") toolCallContentIndexMap.set(toolCallId, index);
800
+ }
801
+ const hasAgentId = contentPart.agentId != null && contentPart.agentId !== "";
802
+ const hasGroupId = contentPart.groupId != null;
803
+ if (hasAgentId || hasGroupId) {
804
+ const existingMeta = contentMetaMap.get(index) ?? {};
805
+ if (hasAgentId) existingMeta.agentId = contentPart.agentId;
806
+ if (hasGroupId) existingMeta.groupId = contentPart.groupId;
807
+ contentMetaMap.set(index, existingMeta);
808
+ }
809
+ };
810
+ const syncSeededContent = () => {
811
+ /** Hosts can seed pre-pause content after creating the aggregator. */
812
+ for (let index = indexedContentLength; index < contentParts.length; index++) indexContentPart(index, contentParts[index]);
813
+ indexedContentLength = contentParts.length;
814
+ nextContentIndex = Math.max(nextContentIndex, contentParts.length);
815
+ };
816
+ const getToolCallContentIndex = (toolCallId) => {
817
+ if (toolCallId == null || toolCallId === "") return;
818
+ syncSeededContent();
819
+ return toolCallContentIndexMap.get(toolCallId);
820
+ };
821
+ const allocateContentIndex = (minimumIndex = 0) => {
822
+ syncSeededContent();
823
+ const contentIndex = Math.max(nextContentIndex, minimumIndex);
824
+ nextContentIndex = contentIndex + 1;
825
+ return contentIndex;
826
+ };
827
+ const resolveSourceContentIndex = (sourceIndex) => {
828
+ const existingIndex = sourceContentIndexMap.get(sourceIndex);
829
+ if (existingIndex != null) return existingIndex;
830
+ const contentIndex = allocateContentIndex(sourceIndex);
831
+ sourceContentIndexMap.set(sourceIndex, contentIndex);
832
+ return contentIndex;
833
+ };
834
+ const createToolStepContentState = (contentIndex) => ({
835
+ indices: new Set([contentIndex]),
836
+ chunkIndices: /* @__PURE__ */ new Map(),
837
+ unclaimedIndices: new Set([contentIndex]),
838
+ unboundIndices: new Set([contentIndex]),
839
+ callIdsByIndex: /* @__PURE__ */ new Map()
840
+ });
841
+ const registerToolContentIndex = (state, contentIndex, toolCallId) => {
842
+ if (!state.indices.has(contentIndex)) {
843
+ state.indices.add(contentIndex);
844
+ state.unclaimedIndices.add(contentIndex);
845
+ state.unboundIndices.add(contentIndex);
846
+ }
847
+ if (toolCallId != null && toolCallId !== "") {
848
+ const existingToolCallId = state.callIdsByIndex.get(contentIndex);
849
+ if (existingToolCallId != null && existingToolCallId !== toolCallId && toolCallContentIndexMap.get(existingToolCallId) === contentIndex) toolCallContentIndexMap.delete(existingToolCallId);
850
+ toolCallContentIndexMap.set(toolCallId, contentIndex);
851
+ state.callIdsByIndex.set(contentIndex, toolCallId);
852
+ state.unboundIndices.delete(contentIndex);
853
+ }
854
+ };
855
+ const takeFirstIndex = (indices) => {
856
+ const contentIndex = indices.values().next().value;
857
+ if (contentIndex != null) indices.delete(contentIndex);
858
+ return contentIndex;
859
+ };
860
+ const setContentMeta = (index, runStep) => {
861
+ const hasAgentId = runStep.agentId != null && runStep.agentId !== "";
862
+ const hasGroupId = runStep.groupId != null;
863
+ if (!hasAgentId && !hasGroupId) return;
864
+ const existingMeta = contentMetaMap.get(index) ?? {};
865
+ if (hasAgentId) existingMeta.agentId = runStep.agentId;
866
+ if (hasGroupId) existingMeta.groupId = runStep.groupId;
867
+ contentMetaMap.set(index, existingMeta);
868
+ };
869
+ const applyContentMetadata = (index) => {
870
+ const contentPart = contentParts[index];
871
+ if (contentPart == null) return;
872
+ const meta = contentMetaMap.get(index);
873
+ if (meta?.agentId != null) contentPart.agentId = meta.agentId;
874
+ if (meta?.groupId != null) contentPart.groupId = meta.groupId;
875
+ };
790
876
  const updateContent = (index, contentPart, finalUpdate = false) => {
791
877
  if (!contentPart) {
792
878
  console.warn("No content part found in 'updateContent'");
@@ -836,9 +922,13 @@ function createContentAggregator() {
836
922
  /** When args are a valid object, they are likely already invoked */
837
923
  let args = finalUpdate || typeof existingContent?.tool_call?.args === "object" || typeof toolCallArgs === "object" ? contentPart.tool_call.args : (existingContent?.tool_call?.args ?? "") + (toolCallArgs ?? "");
838
924
  if (finalUpdate && args == null && existingContent?.tool_call?.args != null) args = existingContent.tool_call.args;
925
+ const id = getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? "";
926
+ const name = getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ?? "";
927
+ const existingToolCallId = existingContent?.tool_call?.id;
928
+ if (existingToolCallId != null && existingToolCallId !== "" && existingToolCallId !== id && toolCallContentIndexMap.get(existingToolCallId) === index) toolCallContentIndexMap.delete(existingToolCallId);
839
929
  const newToolCall = {
840
- id: getNonEmptyValue([incomingId, existingContent?.tool_call?.id]) ?? "",
841
- name: getNonEmptyValue([incomingName, existingContent?.tool_call?.name]) ?? "",
930
+ id,
931
+ name,
842
932
  args,
843
933
  type: "tool_call"
844
934
  };
@@ -856,10 +946,10 @@ function createContentAggregator() {
856
946
  type: "tool_call",
857
947
  tool_call: newToolCall
858
948
  };
949
+ indexContentPart(index, contentParts[index]);
950
+ indexedContentLength = Math.max(indexedContentLength, index + 1);
859
951
  }
860
- const meta = contentMetaMap.get(index);
861
- if (meta?.agentId != null) contentParts[index].agentId = meta.agentId;
862
- if (meta?.groupId != null) contentParts[index].groupId = meta.groupId;
952
+ applyContentMetadata(index);
863
953
  };
864
954
  const aggregateContent = ({ event, data }) => {
865
955
  if (event === "on_summarize_delta") {
@@ -878,33 +968,52 @@ function createContentAggregator() {
878
968
  const runStep = stepMap.get(summary.boundary.messageId);
879
969
  if (!runStep) return;
880
970
  contentParts[runStep.index] = summary;
971
+ applyContentMetadata(runStep.index);
881
972
  return;
882
973
  }
883
974
  if (event === "on_run_step") {
884
- const runStep = data;
975
+ const incomingRunStep = data;
976
+ const toolCalls = incomingRunStep.stepDetails.type === "tool_calls" ? incomingRunStep.stepDetails.tool_calls : void 0;
977
+ syncSeededContent();
978
+ let runStepIndex;
979
+ const toolCallIndices = [];
980
+ if (toolCalls && toolCalls.length > 0) {
981
+ for (let index = 0; index < toolCalls.length; index++) {
982
+ const toolCallId = toolCalls[index].id;
983
+ let contentIndex = getToolCallContentIndex(toolCallId);
984
+ if (contentIndex == null) contentIndex = index === 0 ? resolveSourceContentIndex(incomingRunStep.index) : allocateContentIndex();
985
+ else if (index === 0) sourceContentIndexMap.set(incomingRunStep.index, contentIndex);
986
+ toolCallIndices.push(contentIndex);
987
+ }
988
+ runStepIndex = toolCallIndices[0];
989
+ } else runStepIndex = resolveSourceContentIndex(incomingRunStep.index);
990
+ const runStep = runStepIndex !== incomingRunStep.index ? {
991
+ ...incomingRunStep,
992
+ index: runStepIndex
993
+ } : incomingRunStep;
885
994
  stepMap.set(runStep.id, runStep);
886
- const hasAgentId = runStep.agentId != null && runStep.agentId !== "";
887
- const hasGroupId = runStep.groupId != null;
888
- if (hasAgentId || hasGroupId) {
889
- const existingMeta = contentMetaMap.get(runStep.index) ?? {};
890
- if (hasAgentId) existingMeta.agentId = runStep.agentId;
891
- if (hasGroupId) existingMeta.groupId = runStep.groupId;
892
- contentMetaMap.set(runStep.index, existingMeta);
893
- }
995
+ setContentMeta(runStep.index, runStep);
894
996
  if (runStep.summary != null) updateContent(runStep.index, runStep.summary);
895
- if (runStep.stepDetails.type === "tool_calls" && runStep.stepDetails.tool_calls) runStep.stepDetails.tool_calls.forEach((toolCall) => {
896
- const toolCallId = toolCall.id ?? "";
897
- if ("id" in toolCall && toolCallId) toolCallIdMap.set(runStep.id, toolCallId);
898
- const contentPart = {
899
- type: "tool_call",
900
- tool_call: {
901
- args: toolCall.args,
902
- name: toolCall.name,
903
- id: toolCallId
904
- }
905
- };
906
- updateContent(runStep.index, contentPart);
907
- });
997
+ if (runStep.stepDetails.type === "tool_calls") {
998
+ const toolStepContent = toolStepContentMap.get(runStep.id) ?? createToolStepContentState(runStep.index);
999
+ registerToolContentIndex(toolStepContent, runStep.index);
1000
+ runStep.stepDetails.tool_calls?.forEach((toolCall, toolCallIndex) => {
1001
+ const contentIndex = toolCallIndices[toolCallIndex] ?? runStep.index;
1002
+ const toolCallId = toolCall.id ?? "";
1003
+ registerToolContentIndex(toolStepContent, contentIndex, toolCallId);
1004
+ const contentPart = {
1005
+ type: "tool_call",
1006
+ tool_call: {
1007
+ args: toolCall.args,
1008
+ name: toolCall.name,
1009
+ id: toolCallId
1010
+ }
1011
+ };
1012
+ setContentMeta(contentIndex, runStep);
1013
+ updateContent(contentIndex, contentPart);
1014
+ });
1015
+ toolStepContentMap.set(runStep.id, toolStepContent);
1016
+ }
908
1017
  } else if (event === "on_message_delta") {
909
1018
  const messageDelta = data;
910
1019
  const runStep = stepMap.get(messageDelta.id);
@@ -917,7 +1026,14 @@ function createContentAggregator() {
917
1026
  } else if (event === "on_agent_update" && data?.agent_update) {
918
1027
  const contentPart = data;
919
1028
  if (!contentPart) return;
920
- updateContent(contentPart.agent_update.index, contentPart);
1029
+ const contentIndex = resolveSourceContentIndex(contentPart.agent_update.index);
1030
+ updateContent(contentIndex, {
1031
+ ...contentPart,
1032
+ agent_update: {
1033
+ ...contentPart.agent_update,
1034
+ index: contentIndex
1035
+ }
1036
+ });
921
1037
  } else if (event === "on_reasoning_delta") {
922
1038
  const reasoningDelta = data;
923
1039
  const runStep = stepMap.get(reasoningDelta.id);
@@ -934,35 +1050,75 @@ function createContentAggregator() {
934
1050
  console.warn("No run step or runId found for run step delta event");
935
1051
  return;
936
1052
  }
937
- if (runStepDelta.delta.type === "tool_calls" && runStepDelta.delta.tool_calls) runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {
938
- const toolCallId = toolCallIdMap.get(runStepDelta.id);
939
- const contentPart = {
940
- type: "tool_call",
941
- tool_call: {
942
- args: toolCallDelta.args ?? "",
943
- name: toolCallDelta.name,
944
- id: toolCallId,
945
- auth: runStepDelta.delta.auth,
946
- expires_at: runStepDelta.delta.expires_at
1053
+ if (runStepDelta.delta.type === "tool_calls" && runStepDelta.delta.tool_calls) {
1054
+ const toolStepContent = toolStepContentMap.get(runStepDelta.id) ?? createToolStepContentState(runStep.index);
1055
+ runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {
1056
+ const chunkIndex = typeof toolCallDelta.index === "number" ? toolCallDelta.index : void 0;
1057
+ const explicitToolCallId = toolCallDelta.id != null && toolCallDelta.id !== "" ? toolCallDelta.id : void 0;
1058
+ let contentIndex = getToolCallContentIndex(explicitToolCallId);
1059
+ if (contentIndex == null && chunkIndex != null) contentIndex = toolStepContent.chunkIndices.get(chunkIndex);
1060
+ const soleContentIndex = toolStepContent.indices.size === 1 ? toolStepContent.indices.values().next().value : void 0;
1061
+ if (contentIndex == null && explicitToolCallId == null && soleContentIndex != null && (chunkIndex == null || toolStepContent.callIdsByIndex.has(soleContentIndex) || toolStepContent.unclaimedIndices.has(soleContentIndex))) contentIndex = soleContentIndex;
1062
+ if (contentIndex == null) {
1063
+ if (chunkIndex == null && explicitToolCallId == null) {
1064
+ console.warn("No tool call id or chunk index found for run step delta event");
1065
+ return;
1066
+ }
1067
+ contentIndex = explicitToolCallId == null ? takeFirstIndex(toolStepContent.unclaimedIndices) : takeFirstIndex(toolStepContent.unboundIndices);
1068
+ contentIndex ??= allocateContentIndex();
947
1069
  }
948
- };
949
- updateContent(runStep.index, contentPart);
950
- });
1070
+ registerToolContentIndex(toolStepContent, contentIndex, explicitToolCallId);
1071
+ if (chunkIndex != null) {
1072
+ toolStepContent.chunkIndices.set(chunkIndex, contentIndex);
1073
+ toolStepContent.unclaimedIndices.delete(contentIndex);
1074
+ toolStepContent.unboundIndices.delete(contentIndex);
1075
+ }
1076
+ const toolCallId = explicitToolCallId ?? toolStepContent.callIdsByIndex.get(contentIndex);
1077
+ const contentPart = {
1078
+ type: "tool_call",
1079
+ tool_call: {
1080
+ args: toolCallDelta.args ?? "",
1081
+ name: toolCallDelta.name,
1082
+ id: toolCallId,
1083
+ auth: runStepDelta.delta.auth,
1084
+ expires_at: runStepDelta.delta.expires_at
1085
+ }
1086
+ };
1087
+ setContentMeta(contentIndex, runStep);
1088
+ updateContent(contentIndex, contentPart);
1089
+ });
1090
+ toolStepContentMap.set(runStepDelta.id, toolStepContent);
1091
+ }
951
1092
  } else if (event === "on_run_step_completed") {
952
1093
  const { result } = data;
953
1094
  const { id: stepId } = result;
954
1095
  const runStep = stepMap.get(stepId);
955
- if (!runStep) {
956
- console.warn("No run step or runId found for completed step event");
957
- return;
958
- }
959
- if (result.type === "summary" && "summary" in result) contentParts[runStep.index] = result.summary;
960
- else if ("tool_call" in result) {
1096
+ if (result.type === "summary" && "summary" in result) {
1097
+ if (!runStep) {
1098
+ console.warn("No run step or runId found for completed step event");
1099
+ return;
1100
+ }
1101
+ contentParts[runStep.index] = result.summary;
1102
+ applyContentMetadata(runStep.index);
1103
+ } else if ("tool_call" in result) {
1104
+ let contentIndex = getToolCallContentIndex(result.tool_call.id);
1105
+ if (contentIndex == null && runStep != null) {
1106
+ const toolStepContent = toolStepContentMap.get(runStep.id);
1107
+ if (toolStepContent?.indices.size === 1) contentIndex = toolStepContent.indices.values().next().value;
1108
+ else if (toolStepContent == null) {
1109
+ if (((runStep.stepDetails.type === "tool_calls" ? runStep.stepDetails.tool_calls : void 0)?.length ?? 0) <= 1) contentIndex = runStep.index;
1110
+ }
1111
+ }
1112
+ if (contentIndex == null) {
1113
+ console.warn("No run step or tool call found for completed step event");
1114
+ return;
1115
+ }
1116
+ if (runStep != null) setContentMeta(contentIndex, runStep);
961
1117
  const contentPart = {
962
1118
  type: "tool_call",
963
1119
  tool_call: result.tool_call
964
1120
  };
965
- updateContent(runStep.index, contentPart, true);
1121
+ updateContent(contentIndex, contentPart, true);
966
1122
  }
967
1123
  }
968
1124
  };