@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 +184 -179
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -2
- package/dist/index.d.ts +43 -2
- package/dist/index.js +184 -180
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/agent-response/hooks/useAgentResponseAccumulator.ts +6 -216
- package/src/components/agent-response/index.ts +3 -0
- package/src/components/agent-response/reducer.ts +252 -0
- package/src/components/agent-response/types.ts +8 -0
- package/src/index.ts +3 -0
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
|