@optilogic/chat 1.3.2 → 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
  );
@@ -1345,6 +1349,7 @@ var AgentResponse = React11__namespace.forwardRef(
1345
1349
  renderMarkdown,
1346
1350
  renderThinkingMarkdown,
1347
1351
  timelineMaxHeight,
1352
+ classNames,
1348
1353
  className,
1349
1354
  ...props
1350
1355
  }, ref) => {
@@ -1389,7 +1394,7 @@ var AgentResponse = React11__namespace.forwardRef(
1389
1394
  onMouseLeave: () => setIsHovered(false),
1390
1395
  ...props,
1391
1396
  children: [
1392
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border border-border rounded-lg overflow-hidden", children: [
1397
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: core.cn("border border-border rounded-lg overflow-hidden", classNames?.container), children: [
1393
1398
  showMetadataRow && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1394
1399
  /* @__PURE__ */ jsxRuntime.jsx(
1395
1400
  MetadataRow,
@@ -1435,7 +1440,8 @@ var AgentResponse = React11__namespace.forwardRef(
1435
1440
  {
1436
1441
  className: core.cn(
1437
1442
  "bg-muted/50 p-4",
1438
- showMetadataRow && "border-t border-border"
1443
+ showMetadataRow && "border-t border-border",
1444
+ classNames?.response
1439
1445
  ),
1440
1446
  children: renderMarkdown ? renderMarkdown(state.response) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-pre-wrap", children: state.response })
1441
1447
  }
@@ -1856,6 +1862,7 @@ exports.formatTotalTime = formatTotalTime;
1856
1862
  exports.groupIntoAgentRuns = groupIntoAgentRuns;
1857
1863
  exports.initialAgentResponseState = initialAgentResponseState;
1858
1864
  exports.parseResponseSegments = parseResponseSegments;
1865
+ exports.reduceAgentMessage = reduceAgentMessage;
1859
1866
  exports.useAgentResponseAccumulator = useAgentResponseAccumulator;
1860
1867
  exports.useThinkingTimer = useThinkingTimer;
1861
1868
  //# sourceMappingURL=index.cjs.map