@assistant-ui/eve 0.0.6 → 0.0.8
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/convertEveMessages.d.ts +32 -3
- package/dist/convertEveMessages.d.ts.map +1 -1
- package/dist/convertEveMessages.js +87 -5
- package/dist/convertEveMessages.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/useEveAgentRuntime.d.ts.map +1 -1
- package/dist/useEveAgentRuntime.js +46 -14
- package/dist/useEveAgentRuntime.js.map +1 -1
- package/package.json +7 -3
- package/src/convertEveMessages.test.ts +1134 -12
- package/src/convertEveMessages.ts +174 -9
- package/src/index.ts +5 -1
- package/src/useEveAgentRuntime.test.tsx +408 -0
- package/src/useEveAgentRuntime.ts +55 -23
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useMemo, useRef, useState } from "react";
|
|
3
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
import {
|
|
5
5
|
fromThreadMessageLike,
|
|
6
6
|
generateId,
|
|
@@ -35,16 +35,6 @@ const USER_STAGED_STATUS = {
|
|
|
35
35
|
reason: "unknown",
|
|
36
36
|
} as const;
|
|
37
37
|
|
|
38
|
-
const truncateThreadMessages = (
|
|
39
|
-
messages: readonly ThreadMessage[],
|
|
40
|
-
parentId: string | null,
|
|
41
|
-
) => {
|
|
42
|
-
if (parentId === null) return [];
|
|
43
|
-
const parentIndex = messages.findIndex((message) => message.id === parentId);
|
|
44
|
-
if (parentIndex === -1) return [];
|
|
45
|
-
return messages.slice(0, parentIndex + 1);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
38
|
export type UseEveAgentRuntimeOptions = Omit<
|
|
49
39
|
UseEveAgentOptions<EveMessageData>,
|
|
50
40
|
"reducer"
|
|
@@ -117,6 +107,7 @@ export const useEveAgentRuntime = (options: UseEveAgentRuntimeOptions = {}) => {
|
|
|
117
107
|
|
|
118
108
|
return convertEveMessages(agent.data, {
|
|
119
109
|
isRunning,
|
|
110
|
+
error: agent.error,
|
|
120
111
|
getCreatedAt: (message) => {
|
|
121
112
|
const existing = createdAtByMessageId.get(message.id);
|
|
122
113
|
if (existing) return existing;
|
|
@@ -126,12 +117,38 @@ export const useEveAgentRuntime = (options: UseEveAgentRuntimeOptions = {}) => {
|
|
|
126
117
|
return createdAt;
|
|
127
118
|
},
|
|
128
119
|
});
|
|
129
|
-
}, [agent.data, isRunning]);
|
|
120
|
+
}, [agent.data, agent.error, isRunning]);
|
|
130
121
|
|
|
131
122
|
const messages = stagedMessages ?? convertedMessages;
|
|
132
123
|
const messagesRef = useRef(messages);
|
|
133
124
|
messagesRef.current = messages;
|
|
134
125
|
|
|
126
|
+
useEffect(() => {
|
|
127
|
+
if (stagedInputsRef.current.size === 0) return;
|
|
128
|
+
const baseIds = new Set(convertedMessages.map((message) => message.id));
|
|
129
|
+
const remaining = messagesRef.current.filter(
|
|
130
|
+
(message) =>
|
|
131
|
+
stagedInputsRef.current.has(message.id) && !baseIds.has(message.id),
|
|
132
|
+
);
|
|
133
|
+
setStagedMessages(
|
|
134
|
+
remaining.length > 0 ? [...convertedMessages, ...remaining] : null,
|
|
135
|
+
);
|
|
136
|
+
}, [convertedMessages]);
|
|
137
|
+
|
|
138
|
+
const getStagedRun = (parentId: string | null) => {
|
|
139
|
+
if (!parentId || !stagedInputsRef.current.has(parentId)) return null;
|
|
140
|
+
const staged: {
|
|
141
|
+
message: ThreadMessage;
|
|
142
|
+
input: { message: AppendMessage; runConfig: AppendMessage["runConfig"] };
|
|
143
|
+
}[] = [];
|
|
144
|
+
for (const message of messagesRef.current) {
|
|
145
|
+
const input = stagedInputsRef.current.get(message.id);
|
|
146
|
+
if (input) staged.push({ message, input });
|
|
147
|
+
if (message.id === parentId) break;
|
|
148
|
+
}
|
|
149
|
+
return staged;
|
|
150
|
+
};
|
|
151
|
+
|
|
135
152
|
const stageUserMessage = (message: AppendMessage) => {
|
|
136
153
|
const threadMessage = fromThreadMessageLike(
|
|
137
154
|
message,
|
|
@@ -142,10 +159,9 @@ export const useEveAgentRuntime = (options: UseEveAgentRuntimeOptions = {}) => {
|
|
|
142
159
|
message,
|
|
143
160
|
runConfig: message.runConfig,
|
|
144
161
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
]);
|
|
162
|
+
const nextMessages = [...messagesRef.current, threadMessage];
|
|
163
|
+
messagesRef.current = nextMessages;
|
|
164
|
+
setStagedMessages(nextMessages);
|
|
149
165
|
};
|
|
150
166
|
|
|
151
167
|
return useExternalStoreRuntime({
|
|
@@ -171,14 +187,30 @@ export const useEveAgentRuntime = (options: UseEveAgentRuntimeOptions = {}) => {
|
|
|
171
187
|
...(stagedMessages
|
|
172
188
|
? {
|
|
173
189
|
onReload: async (parentId: string | null) => {
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
: null;
|
|
177
|
-
if (!staged)
|
|
190
|
+
const stagedRun = getStagedRun(parentId);
|
|
191
|
+
if (!stagedRun)
|
|
178
192
|
throw new Error("Runtime does not support reloading messages.");
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
193
|
+
for (const { message: stagedMessage, input } of stagedRun) {
|
|
194
|
+
const previousMessages = messagesRef.current;
|
|
195
|
+
stagedInputsRef.current.delete(stagedMessage.id);
|
|
196
|
+
const nextMessages = previousMessages.filter(
|
|
197
|
+
(message) => message.id !== stagedMessage.id,
|
|
198
|
+
);
|
|
199
|
+
messagesRef.current = nextMessages;
|
|
200
|
+
setStagedMessages(
|
|
201
|
+
stagedInputsRef.current.size > 0 ? nextMessages : null,
|
|
202
|
+
);
|
|
203
|
+
try {
|
|
204
|
+
await agent.send({
|
|
205
|
+
message: getEveMessageContent(input.message),
|
|
206
|
+
});
|
|
207
|
+
} catch (error) {
|
|
208
|
+
stagedInputsRef.current.set(stagedMessage.id, input);
|
|
209
|
+
messagesRef.current = previousMessages;
|
|
210
|
+
setStagedMessages(previousMessages);
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
182
214
|
},
|
|
183
215
|
}
|
|
184
216
|
: {}),
|