@optilogic/chat 1.3.3 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -845,6 +845,188 @@ function deduplicateEntries(entries) {
845
845
  return result;
846
846
  }
847
847
 
848
+ // src/components/agent-response/reducer.ts
849
+ function reduceAgentMessage(prev, payload) {
850
+ const now = payload.timestamp ?? Date.now();
851
+ let newStatus = prev.status;
852
+ const isFirstMessage = prev.status === "idle" && payload.type !== "status";
853
+ if (isFirstMessage) {
854
+ newStatus = "processing";
855
+ }
856
+ const firstMessageTime = prev.firstMessageTime ?? (isFirstMessage ? now : null);
857
+ switch (payload.type) {
858
+ case "status":
859
+ if (payload.message === "Harness connected" || payload.status === "Harness connected") {
860
+ return { ...initialAgentResponseState };
861
+ }
862
+ return { ...prev, status: newStatus };
863
+ case "thinking": {
864
+ if (payload.thinkingStep) {
865
+ const newStep = {
866
+ id: payload.thinkingStep.id || `step-${now}`,
867
+ label: payload.thinkingStep.label,
868
+ content: payload.thinkingStep.content,
869
+ depth: payload.thinkingStep.depth ?? payload.depth ?? 0,
870
+ isCollapsed: payload.thinkingStep.isCollapsed,
871
+ timestamp: now,
872
+ agentName: payload.agentName,
873
+ parentAgent: payload.parentAgent
874
+ };
875
+ const thinkingStartTime2 = prev.thinkingStartTime ?? now;
876
+ const next2 = {
877
+ ...prev,
878
+ status: newStatus,
879
+ thinkingSteps: [...prev.thinkingSteps || [], newStep],
880
+ thinkingStartTime: thinkingStartTime2,
881
+ firstMessageTime
882
+ };
883
+ return { ...next2, timelineEntries: buildTimelineEntries(next2) };
884
+ }
885
+ const newThinking = payload.message || payload.content || "";
886
+ const separator = prev.thinking && newThinking ? "\n\n" : "";
887
+ const thinkingStartTime = prev.thinkingStartTime ?? (newThinking ? now : null);
888
+ const prevSteps = prev.thinkingSteps || [];
889
+ const plainStep = {
890
+ id: `step-${prevSteps.length}`,
891
+ label: newThinking,
892
+ content: newThinking,
893
+ depth: payload.depth ?? 0,
894
+ timestamp: now,
895
+ agentName: payload.agentName,
896
+ parentAgent: payload.parentAgent
897
+ };
898
+ const next = {
899
+ ...prev,
900
+ status: newStatus,
901
+ thinking: prev.thinking + separator + newThinking,
902
+ thinkingSteps: [...prevSteps, plainStep],
903
+ thinkingStartTime,
904
+ firstMessageTime
905
+ };
906
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
907
+ }
908
+ case "tool_call": {
909
+ const toolName = payload.message || payload.tool?.name;
910
+ if (toolName) {
911
+ const newToolCall = {
912
+ id: payload.tool?.id || `tool-${now}`,
913
+ name: toolName,
914
+ arguments: payload.tool?.arguments,
915
+ timestamp: now,
916
+ agentName: payload.agentName,
917
+ parentAgent: payload.parentAgent,
918
+ depth: payload.depth
919
+ };
920
+ const next = {
921
+ ...prev,
922
+ status: newStatus,
923
+ toolCalls: [...prev.toolCalls, newToolCall],
924
+ firstMessageTime
925
+ };
926
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
927
+ }
928
+ return { ...prev, status: newStatus, firstMessageTime };
929
+ }
930
+ case "knowledge": {
931
+ const knowledgeContent = payload.message || payload.knowledge?.content;
932
+ if (knowledgeContent) {
933
+ const newKnowledge = {
934
+ id: payload.knowledge?.id || `knowledge-${now}`,
935
+ source: payload.knowledge?.source || "unknown",
936
+ content: knowledgeContent,
937
+ timestamp: now,
938
+ agentName: payload.agentName,
939
+ parentAgent: payload.parentAgent,
940
+ depth: payload.depth
941
+ };
942
+ const next = {
943
+ ...prev,
944
+ status: newStatus,
945
+ knowledge: [...prev.knowledge, newKnowledge],
946
+ firstMessageTime
947
+ };
948
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
949
+ }
950
+ return { ...prev, status: newStatus, firstMessageTime };
951
+ }
952
+ case "memory": {
953
+ const memoryContent = payload.message || payload.memory?.content;
954
+ if (memoryContent) {
955
+ const newMemory = {
956
+ id: payload.memory?.id || `memory-${now}`,
957
+ type: payload.memory?.type || "unknown",
958
+ content: memoryContent,
959
+ timestamp: now,
960
+ agentName: payload.agentName,
961
+ parentAgent: payload.parentAgent,
962
+ depth: payload.depth
963
+ };
964
+ const next = {
965
+ ...prev,
966
+ status: newStatus,
967
+ memory: [...prev.memory, newMemory],
968
+ firstMessageTime
969
+ };
970
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
971
+ }
972
+ return { ...prev, status: newStatus, firstMessageTime };
973
+ }
974
+ case "response":
975
+ return {
976
+ ...prev,
977
+ status: "complete",
978
+ response: payload.message || payload.content || "",
979
+ responseCompleteTime: now,
980
+ firstMessageTime: prev.firstMessageTime ?? now
981
+ };
982
+ case "status_update": {
983
+ const statusMessage = payload.message || payload.statusUpdate?.message;
984
+ if (statusMessage) {
985
+ const newStatusItem = {
986
+ id: payload.statusUpdate?.id || `status-${now}`,
987
+ message: statusMessage,
988
+ agent: payload.statusUpdate?.agent,
989
+ timestamp: now,
990
+ agentName: payload.agentName,
991
+ parentAgent: payload.parentAgent,
992
+ depth: payload.depth
993
+ };
994
+ const next = {
995
+ ...prev,
996
+ status: newStatus,
997
+ statusUpdates: [...prev.statusUpdates, newStatusItem],
998
+ firstMessageTime
999
+ };
1000
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
1001
+ }
1002
+ return { ...prev, status: newStatus, firstMessageTime };
1003
+ }
1004
+ case "potential_response": {
1005
+ const respContent = payload.message || payload.content || "";
1006
+ if (respContent) {
1007
+ const newResp = {
1008
+ id: `resp-${now}`,
1009
+ content: respContent,
1010
+ timestamp: now,
1011
+ agentName: payload.agentName,
1012
+ parentAgent: payload.parentAgent,
1013
+ depth: payload.depth
1014
+ };
1015
+ const next = {
1016
+ ...prev,
1017
+ status: newStatus,
1018
+ potentialResponses: [...prev.potentialResponses || [], newResp],
1019
+ firstMessageTime
1020
+ };
1021
+ return { ...next, timelineEntries: buildTimelineEntries(next) };
1022
+ }
1023
+ return { ...prev, status: newStatus, firstMessageTime };
1024
+ }
1025
+ default:
1026
+ return { ...prev, status: newStatus, firstMessageTime };
1027
+ }
1028
+ }
1029
+
848
1030
  // src/components/agent-response/hooks/useAgentResponseAccumulator.ts
849
1031
  function useAgentResponseAccumulator(options) {
850
1032
  const [state, setState] = React11.useState(initialAgentResponseState);
@@ -859,185 +1041,7 @@ function useAgentResponseAccumulator(options) {
859
1041
  } else {
860
1042
  payload = message;
861
1043
  }
862
- setState((prev) => {
863
- let newStatus = prev.status;
864
- const isFirstMessage = prev.status === "idle" && payload.type !== "status";
865
- if (isFirstMessage) {
866
- newStatus = "processing";
867
- }
868
- const firstMessageTime = prev.firstMessageTime ?? (isFirstMessage ? Date.now() : null);
869
- switch (payload.type) {
870
- case "status":
871
- if (payload.message === "Harness connected" || payload.status === "Harness connected") {
872
- return { ...initialAgentResponseState };
873
- }
874
- return { ...prev, status: newStatus };
875
- case "thinking": {
876
- if (payload.thinkingStep) {
877
- const newStep = {
878
- id: payload.thinkingStep.id || `step-${Date.now()}`,
879
- label: payload.thinkingStep.label,
880
- content: payload.thinkingStep.content,
881
- depth: payload.thinkingStep.depth ?? payload.depth ?? 0,
882
- isCollapsed: payload.thinkingStep.isCollapsed,
883
- timestamp: Date.now(),
884
- agentName: payload.agentName,
885
- parentAgent: payload.parentAgent
886
- };
887
- const thinkingStartTime2 = prev.thinkingStartTime ?? Date.now();
888
- const next2 = {
889
- ...prev,
890
- status: newStatus,
891
- thinkingSteps: [...prev.thinkingSteps || [], newStep],
892
- thinkingStartTime: thinkingStartTime2,
893
- firstMessageTime
894
- };
895
- return { ...next2, timelineEntries: buildTimelineEntries(next2) };
896
- }
897
- const newThinking = payload.message || payload.content || "";
898
- const separator = prev.thinking && newThinking ? "\n\n" : "";
899
- const thinkingStartTime = prev.thinkingStartTime ?? (newThinking ? Date.now() : null);
900
- const prevSteps = prev.thinkingSteps || [];
901
- const plainStep = {
902
- id: `step-${prevSteps.length}`,
903
- label: newThinking,
904
- content: newThinking,
905
- depth: payload.depth ?? 0,
906
- timestamp: Date.now(),
907
- agentName: payload.agentName,
908
- parentAgent: payload.parentAgent
909
- };
910
- const next = {
911
- ...prev,
912
- status: newStatus,
913
- thinking: prev.thinking + separator + newThinking,
914
- thinkingSteps: [...prevSteps, plainStep],
915
- thinkingStartTime,
916
- firstMessageTime
917
- };
918
- return { ...next, timelineEntries: buildTimelineEntries(next) };
919
- }
920
- case "tool_call": {
921
- const toolName = payload.message || payload.tool?.name;
922
- if (toolName) {
923
- const newToolCall = {
924
- id: payload.tool?.id || `tool-${Date.now()}`,
925
- name: toolName,
926
- arguments: payload.tool?.arguments,
927
- timestamp: Date.now(),
928
- agentName: payload.agentName,
929
- parentAgent: payload.parentAgent,
930
- depth: payload.depth
931
- };
932
- const next = {
933
- ...prev,
934
- status: newStatus,
935
- toolCalls: [...prev.toolCalls, newToolCall],
936
- firstMessageTime
937
- };
938
- return { ...next, timelineEntries: buildTimelineEntries(next) };
939
- }
940
- return { ...prev, status: newStatus, firstMessageTime };
941
- }
942
- case "knowledge": {
943
- const knowledgeContent = payload.message || payload.knowledge?.content;
944
- if (knowledgeContent) {
945
- const newKnowledge = {
946
- id: payload.knowledge?.id || `knowledge-${Date.now()}`,
947
- source: payload.knowledge?.source || "unknown",
948
- content: knowledgeContent,
949
- timestamp: Date.now(),
950
- agentName: payload.agentName,
951
- parentAgent: payload.parentAgent,
952
- depth: payload.depth
953
- };
954
- const next = {
955
- ...prev,
956
- status: newStatus,
957
- knowledge: [...prev.knowledge, newKnowledge],
958
- firstMessageTime
959
- };
960
- return { ...next, timelineEntries: buildTimelineEntries(next) };
961
- }
962
- return { ...prev, status: newStatus, firstMessageTime };
963
- }
964
- case "memory": {
965
- const memoryContent = payload.message || payload.memory?.content;
966
- if (memoryContent) {
967
- const newMemory = {
968
- id: payload.memory?.id || `memory-${Date.now()}`,
969
- type: payload.memory?.type || "unknown",
970
- content: memoryContent,
971
- timestamp: Date.now(),
972
- agentName: payload.agentName,
973
- parentAgent: payload.parentAgent,
974
- depth: payload.depth
975
- };
976
- const next = {
977
- ...prev,
978
- status: newStatus,
979
- memory: [...prev.memory, newMemory],
980
- firstMessageTime
981
- };
982
- return { ...next, timelineEntries: buildTimelineEntries(next) };
983
- }
984
- return { ...prev, status: newStatus, firstMessageTime };
985
- }
986
- case "response":
987
- return {
988
- ...prev,
989
- status: "complete",
990
- response: payload.message || payload.content || "",
991
- responseCompleteTime: Date.now(),
992
- firstMessageTime: prev.firstMessageTime ?? Date.now()
993
- };
994
- case "status_update": {
995
- const statusMessage = payload.message || payload.statusUpdate?.message;
996
- if (statusMessage) {
997
- const newStatusItem = {
998
- id: payload.statusUpdate?.id || `status-${Date.now()}`,
999
- message: statusMessage,
1000
- agent: payload.statusUpdate?.agent,
1001
- timestamp: Date.now(),
1002
- agentName: payload.agentName,
1003
- parentAgent: payload.parentAgent,
1004
- depth: payload.depth
1005
- };
1006
- const next = {
1007
- ...prev,
1008
- status: newStatus,
1009
- statusUpdates: [...prev.statusUpdates, newStatusItem],
1010
- firstMessageTime
1011
- };
1012
- return { ...next, timelineEntries: buildTimelineEntries(next) };
1013
- }
1014
- return { ...prev, status: newStatus, firstMessageTime };
1015
- }
1016
- case "potential_response": {
1017
- const respContent = payload.message || payload.content || "";
1018
- if (respContent) {
1019
- const newResp = {
1020
- id: `resp-${Date.now()}`,
1021
- content: respContent,
1022
- timestamp: Date.now(),
1023
- agentName: payload.agentName,
1024
- parentAgent: payload.parentAgent,
1025
- depth: payload.depth
1026
- };
1027
- const next = {
1028
- ...prev,
1029
- status: newStatus,
1030
- potentialResponses: [...prev.potentialResponses || [], newResp],
1031
- firstMessageTime
1032
- };
1033
- return { ...next, timelineEntries: buildTimelineEntries(next) };
1034
- }
1035
- return { ...prev, status: newStatus, firstMessageTime };
1036
- }
1037
- default:
1038
- return { ...prev, status: newStatus, firstMessageTime };
1039
- }
1040
- });
1044
+ setState((prev) => reduceAgentMessage(prev, payload));
1041
1045
  },
1042
1046
  [topic]
1043
1047
  );
@@ -1858,6 +1862,7 @@ exports.formatTotalTime = formatTotalTime;
1858
1862
  exports.groupIntoAgentRuns = groupIntoAgentRuns;
1859
1863
  exports.initialAgentResponseState = initialAgentResponseState;
1860
1864
  exports.parseResponseSegments = parseResponseSegments;
1865
+ exports.reduceAgentMessage = reduceAgentMessage;
1861
1866
  exports.useAgentResponseAccumulator = useAgentResponseAccumulator;
1862
1867
  exports.useThinkingTimer = useThinkingTimer;
1863
1868
  //# sourceMappingURL=index.cjs.map