@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 +188 -181
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -2
- package/dist/index.d.ts +64 -2
- package/dist/index.js +188 -182
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/agent-response/AgentResponse.tsx +27 -2
- package/src/components/agent-response/hooks/useAgentResponseAccumulator.ts +6 -216
- package/src/components/agent-response/index.ts +4 -1
- 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
|
);
|
|
@@ -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
|