@blocksdiy/react-common 1.14.1 → 1.15.0
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.
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type UIMessage } from "ai";
|
|
2
1
|
import { ReactNode, SetStateAction } from "react";
|
|
3
2
|
import { type VoiceCallMessage } from "../hooks/use-voice-call.js";
|
|
4
3
|
export interface Attachment {
|
|
@@ -13,8 +12,7 @@ type MessageType = "progress" | "text" | "missing_integration";
|
|
|
13
12
|
*
|
|
14
13
|
* Consumers of `@blocksdiy/react-common/agent-chat` currently read `msg.content`,
|
|
15
14
|
* `msg.role` (`human`/`ai`), `msg.attachments`, and the flattened compatibility
|
|
16
|
-
* fields returned from `AgentChatContextValue.messages`. Keep this shape stable
|
|
17
|
-
* while the runtime underneath moves to AI SDK `UIMessage` objects.
|
|
15
|
+
* fields returned from `AgentChatContextValue.messages`. Keep this shape stable.
|
|
18
16
|
*/
|
|
19
17
|
export interface LegacyMessagePayload {
|
|
20
18
|
id: string;
|
|
@@ -26,12 +24,30 @@ export interface LegacyMessagePayload {
|
|
|
26
24
|
payload: Record<string, any>;
|
|
27
25
|
hiddenContent?: string;
|
|
28
26
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
type CopilotMessageMetadata = {
|
|
28
|
+
version?: 1;
|
|
29
|
+
hiddenPrompt?: string;
|
|
30
|
+
};
|
|
31
|
+
type CopilotToolCall = {
|
|
32
|
+
id?: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
args?: unknown;
|
|
35
|
+
input?: unknown;
|
|
36
|
+
function?: {
|
|
37
|
+
name?: string;
|
|
38
|
+
arguments?: unknown;
|
|
32
39
|
};
|
|
33
40
|
};
|
|
34
|
-
|
|
41
|
+
type CopilotMessage = {
|
|
42
|
+
id?: string;
|
|
43
|
+
role?: string;
|
|
44
|
+
content?: string;
|
|
45
|
+
metadata?: CopilotMessageMetadata;
|
|
46
|
+
toolCalls?: CopilotToolCall[];
|
|
47
|
+
toolCallId?: string;
|
|
48
|
+
name?: string;
|
|
49
|
+
};
|
|
50
|
+
export type PersistedMessagePayload = LegacyMessagePayload | CopilotMessage;
|
|
35
51
|
interface MessageItemBase {
|
|
36
52
|
createdAt: string;
|
|
37
53
|
createdBy?: string;
|
|
@@ -42,12 +58,10 @@ interface MessageItemBase {
|
|
|
42
58
|
export type LegacyMessageItem = MessageItemBase & {
|
|
43
59
|
msg: LegacyMessagePayload;
|
|
44
60
|
};
|
|
45
|
-
export type
|
|
46
|
-
msg: V1AiSdkMessagePayload;
|
|
47
|
-
};
|
|
48
|
-
export type MessageItem = LegacyMessageItem | V1AiSdkMessageItem;
|
|
61
|
+
export type MessageItem = LegacyMessageItem;
|
|
49
62
|
export interface AgentChatContextValue {
|
|
50
63
|
messages: MessageItem[];
|
|
64
|
+
initialAgentMessages: MessageItem[];
|
|
51
65
|
attachments: Attachment[];
|
|
52
66
|
prompt: string;
|
|
53
67
|
isThinking: boolean;
|
|
@@ -74,15 +88,6 @@ export interface AgentChatContextValue {
|
|
|
74
88
|
chatId?: string;
|
|
75
89
|
noPersistency?: boolean;
|
|
76
90
|
}
|
|
77
|
-
export type AgentChatUIMessage = UIMessage & {
|
|
78
|
-
metadata?: {
|
|
79
|
-
version?: 1;
|
|
80
|
-
hiddenPrompt?: string;
|
|
81
|
-
};
|
|
82
|
-
};
|
|
83
|
-
export declare const isV1AiSdkMessageItem: (message: MessageItem) => message is V1AiSdkMessageItem;
|
|
84
|
-
export declare const isLegacyMessageItem: (message: MessageItem) => message is LegacyMessageItem;
|
|
85
|
-
export declare const uiMessageToV1MessageItem: (message: AgentChatUIMessage, createdAt?: string) => V1AiSdkMessageItem;
|
|
86
91
|
export declare const useAgentChat: () => AgentChatContextValue;
|
|
87
92
|
export interface ToolCardContextValue {
|
|
88
93
|
open: boolean;
|
|
@@ -184,7 +189,7 @@ export interface AgentChatMessageProps {
|
|
|
184
189
|
message: MessageItem;
|
|
185
190
|
index: number;
|
|
186
191
|
}
|
|
187
|
-
export declare function AgentChatMessage({ message, index, ...props }: React.ComponentProps<"div"> & AgentChatMessageProps): import("react/jsx-runtime").JSX.Element
|
|
192
|
+
export declare function AgentChatMessage({ message, index, ...props }: React.ComponentProps<"div"> & AgentChatMessageProps): import("react/jsx-runtime").JSX.Element;
|
|
188
193
|
export interface AgentChatMessagesProps {
|
|
189
194
|
asChild?: boolean;
|
|
190
195
|
autoScroll?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-chat.d.ts","sourceRoot":"","sources":["../../src/components/agent-chat.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-chat.d.ts","sourceRoot":"","sources":["../../src/components/agent-chat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { HttpAgent } from "@ag-ui/client";
|
|
3
3
|
import { AppVersionService, BlocksApiService, DataApiService, websocketsService } from "@blocksdiy/blocks-client-api";
|
|
4
4
|
import { getApiHost } from "@blocksdiy/blocks-client-api/envService";
|
|
5
5
|
import { WorkflowRequest } from "@blocksdiy/blocks-client-api/workflowService";
|
|
6
|
+
import { CopilotKit, useCopilotChatInternal } from "@copilotkit/react-core";
|
|
6
7
|
import { Slot } from "@radix-ui/react-slot";
|
|
7
|
-
import { DefaultChatTransport } from "ai";
|
|
8
8
|
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, } from "react";
|
|
9
9
|
import { useVoiceCall } from "../hooks/use-voice-call.js";
|
|
10
10
|
/* public decouple - blocks common */
|
|
@@ -14,7 +14,7 @@ const CHAT_AGENT_CALL_ACTION_BLOCK_ID = "688ed4d77b454b1fdaf5cf2d";
|
|
|
14
14
|
// File upload constraints
|
|
15
15
|
const MAX_FILE_SIZE_MB = 5;
|
|
16
16
|
const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024;
|
|
17
|
-
const DEFAULT_SHORT_TERM_MEMORY = { isEnabled: true, isPersistent:
|
|
17
|
+
const DEFAULT_SHORT_TERM_MEMORY = { isEnabled: true, isPersistent: true };
|
|
18
18
|
const validateAndConvertFiles = (files) => {
|
|
19
19
|
if (files.length === 0) {
|
|
20
20
|
return null;
|
|
@@ -36,77 +36,89 @@ const generateId = (length = 10) => {
|
|
|
36
36
|
.toString(36)
|
|
37
37
|
.substring(2, 2 + length);
|
|
38
38
|
};
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
url: attachment.url,
|
|
45
|
-
filename: attachment.fileName,
|
|
46
|
-
mediaType: attachment.fileType,
|
|
47
|
-
}));
|
|
48
|
-
const uiMessageToLegacyPayload = (message) => {
|
|
49
|
-
const text = message.parts
|
|
50
|
-
.filter((part) => part.type === "text")
|
|
51
|
-
.map((part) => part.text)
|
|
52
|
-
.join("");
|
|
53
|
-
const attachments = message.parts
|
|
54
|
-
.filter((part) => part.type === "file")
|
|
55
|
-
.map((part) => ({
|
|
56
|
-
url: part.url,
|
|
57
|
-
fileName: part.filename ?? "File",
|
|
58
|
-
fileType: part.mediaType ?? "application/octet-stream",
|
|
59
|
-
}));
|
|
60
|
-
if (!text && attachments.length === 0) {
|
|
61
|
-
return null;
|
|
39
|
+
class BlocksCopilotHttpAgent extends HttpAgent {
|
|
40
|
+
requestHeaders = {};
|
|
41
|
+
requestBody = {};
|
|
42
|
+
constructor({ url }) {
|
|
43
|
+
super({ url, headers: {} });
|
|
62
44
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
type: "text",
|
|
67
|
-
content: text,
|
|
68
|
-
attachments: attachments.length > 0 ? attachments : undefined,
|
|
69
|
-
hiddenContent: message.metadata?.hiddenPrompt,
|
|
70
|
-
payload: {},
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
const messageItemToLegacyPayload = (message) => {
|
|
74
|
-
if (isLegacyMessageItem(message)) {
|
|
75
|
-
return message.msg;
|
|
45
|
+
setRequestOptions({ headers, body }) {
|
|
46
|
+
this.requestHeaders = headers;
|
|
47
|
+
this.requestBody = body;
|
|
76
48
|
}
|
|
77
|
-
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
49
|
+
clearRequestOptions() {
|
|
50
|
+
this.requestHeaders = {};
|
|
51
|
+
this.requestBody = {};
|
|
52
|
+
}
|
|
53
|
+
requestInit(input) {
|
|
54
|
+
const init = super.requestInit({ ...input, ...this.requestBody });
|
|
55
|
+
return {
|
|
56
|
+
...init,
|
|
57
|
+
headers: {
|
|
58
|
+
...init.headers,
|
|
59
|
+
...this.requestHeaders,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const parseMaybeJson = (value) => {
|
|
65
|
+
if (typeof value !== "string") {
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(value);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return value;
|
|
82
73
|
}
|
|
74
|
+
};
|
|
75
|
+
const legacyPayloadToCopilotMessage = (message) => ({
|
|
76
|
+
id: message.id,
|
|
77
|
+
role: message.role === "human" ? "user" : "assistant",
|
|
78
|
+
content: message.content ?? "",
|
|
79
|
+
metadata: {
|
|
80
|
+
version: 1,
|
|
81
|
+
hiddenPrompt: message.hiddenContent,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const messageItemToCopilotMessage = (message) => {
|
|
85
|
+
return legacyPayloadToCopilotMessage(message.msg);
|
|
86
|
+
};
|
|
87
|
+
const normalizeCopilotToolCall = (toolCall, allMessages) => {
|
|
88
|
+
const toolCallId = toolCall.id;
|
|
89
|
+
const toolName = toolCall.function?.name ?? toolCall.name ?? "tool";
|
|
90
|
+
const toolResult = toolCallId
|
|
91
|
+
? allMessages.find((candidate) => candidate.role === "tool" && candidate.toolCallId === toolCallId)
|
|
92
|
+
: undefined;
|
|
83
93
|
return {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
94
|
+
...toolCall,
|
|
95
|
+
type: `tool-${toolName}`,
|
|
96
|
+
toolCallId,
|
|
97
|
+
toolName,
|
|
98
|
+
state: toolResult ? "output-available" : "input-available",
|
|
99
|
+
input: parseMaybeJson(toolCall.function?.arguments ?? toolCall.args ?? toolCall.input),
|
|
100
|
+
...(toolResult ? { output: parseMaybeJson(toolResult.content) } : {}),
|
|
91
101
|
};
|
|
92
102
|
};
|
|
93
|
-
|
|
103
|
+
const copilotMessageToLegacyPayload = (message, allMessages = []) => {
|
|
104
|
+
if (!message.id || (message.role !== "user" && message.role !== "assistant")) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const toolCalls = message.toolCalls?.map((toolCall) => normalizeCopilotToolCall(toolCall, allMessages)) ?? [];
|
|
94
108
|
return {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
109
|
+
id: message.id,
|
|
110
|
+
role: message.role === "user" ? "human" : "ai",
|
|
111
|
+
type: "text",
|
|
112
|
+
content: message.content ?? "",
|
|
113
|
+
hiddenContent: message.metadata?.hiddenPrompt,
|
|
114
|
+
payload: toolCalls.length ? { toolCalls } : {},
|
|
100
115
|
};
|
|
101
116
|
};
|
|
102
|
-
const
|
|
117
|
+
const messageItemToLegacyPayload = (message) => message.msg;
|
|
118
|
+
const appendCopilotErrorMessage = (messages, error) => {
|
|
103
119
|
const text = "Error: " + (error instanceof Error ? error.message : "Unknown error");
|
|
104
120
|
const lastMessage = messages[messages.length - 1];
|
|
105
|
-
|
|
106
|
-
?.filter((part) => part.type === "text")
|
|
107
|
-
.map((part) => part.text)
|
|
108
|
-
.join("");
|
|
109
|
-
if (lastMessage?.role === "assistant" && lastText === text) {
|
|
121
|
+
if (lastMessage?.role === "assistant" && lastMessage.content === text) {
|
|
110
122
|
return messages;
|
|
111
123
|
}
|
|
112
124
|
return [
|
|
@@ -114,22 +126,33 @@ const appendAiSdkErrorMessage = (messages, error) => {
|
|
|
114
126
|
{
|
|
115
127
|
id: generateId(10),
|
|
116
128
|
role: "assistant",
|
|
117
|
-
|
|
129
|
+
content: text,
|
|
118
130
|
metadata: { version: 1 },
|
|
119
131
|
},
|
|
120
132
|
];
|
|
121
133
|
};
|
|
122
134
|
const storedMessageToLegacyView = (message) => {
|
|
123
|
-
if (
|
|
135
|
+
if ("type" in message.msg) {
|
|
136
|
+
return message;
|
|
137
|
+
}
|
|
138
|
+
const legacyPayload = copilotMessageToLegacyPayload(message.msg);
|
|
139
|
+
if (legacyPayload) {
|
|
124
140
|
return {
|
|
125
|
-
...
|
|
141
|
+
...message,
|
|
126
142
|
createdAt: message.createdAt,
|
|
127
|
-
|
|
128
|
-
chatId: message.chatId,
|
|
129
|
-
threadId: message.threadId,
|
|
143
|
+
msg: legacyPayload,
|
|
130
144
|
};
|
|
131
145
|
}
|
|
132
|
-
return
|
|
146
|
+
return {
|
|
147
|
+
...message,
|
|
148
|
+
msg: {
|
|
149
|
+
id: message.msg.id ?? generateId(),
|
|
150
|
+
role: "ai",
|
|
151
|
+
type: "text",
|
|
152
|
+
content: "",
|
|
153
|
+
payload: {},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
133
156
|
};
|
|
134
157
|
export const useAgentChat = () => {
|
|
135
158
|
const context = useContext(AgentChatContext);
|
|
@@ -302,8 +325,10 @@ const resolveAgentChatConfig = async ({ agentChatId, token, }) => {
|
|
|
302
325
|
},
|
|
303
326
|
};
|
|
304
327
|
};
|
|
305
|
-
const flattenLegacyMessages = (messages) => messages.map((m) => (
|
|
306
|
-
const createInitialAgentMessages = (initialMessages = []) => initialMessages
|
|
328
|
+
const flattenLegacyMessages = (messages) => messages.map((m) => ({ ...m, ...m.msg }));
|
|
329
|
+
const createInitialAgentMessages = (initialMessages = []) => initialMessages
|
|
330
|
+
.filter((im) => typeof im?.content === "string" && im.content.length > 0)
|
|
331
|
+
.map((initialMessage) => {
|
|
307
332
|
const id = generateId();
|
|
308
333
|
return {
|
|
309
334
|
id,
|
|
@@ -364,21 +389,22 @@ function useAgentChatInputState({ isThinking, isFetchingMessages, sendMessage, }
|
|
|
364
389
|
setThreadIds,
|
|
365
390
|
};
|
|
366
391
|
}
|
|
367
|
-
function useAgentChatDataInitialization({ agentChatData, addMessages, sendMessage, }) {
|
|
392
|
+
function useAgentChatDataInitialization({ agentChatData, addMessages, sendMessage, isPersistentFlow, }) {
|
|
368
393
|
const initializedAgentChatDataRef = useRef(false);
|
|
369
394
|
useEffect(() => {
|
|
370
395
|
if (!agentChatData || initializedAgentChatDataRef.current) {
|
|
371
396
|
return;
|
|
372
397
|
}
|
|
373
398
|
const { initialMessages, initialPrompt } = agentChatData;
|
|
374
|
-
|
|
399
|
+
// Persistent flow seeds initial messages via `initialAgentMessages`.
|
|
400
|
+
if (!isPersistentFlow && initialMessages && initialMessages.length > 0) {
|
|
375
401
|
addMessages(createInitialAgentMessages(initialMessages));
|
|
376
402
|
}
|
|
377
403
|
if (initialPrompt?.content || initialPrompt?.hiddenContent) {
|
|
378
404
|
sendMessage({ content: initialPrompt?.content, hiddenContent: initialPrompt?.hiddenContent });
|
|
379
405
|
}
|
|
380
406
|
initializedAgentChatDataRef.current = true;
|
|
381
|
-
}, [agentChatData, sendMessage, addMessages]);
|
|
407
|
+
}, [agentChatData, sendMessage, addMessages, isPersistentFlow]);
|
|
382
408
|
}
|
|
383
409
|
function AgentChatContextProvider({ children, ...value }) {
|
|
384
410
|
return _jsx(AgentChatContext.Provider, { value: value, children: children });
|
|
@@ -392,7 +418,10 @@ export const AgentChatRoot = ({ appId, token, agentBlockId, agentHarness, useAge
|
|
|
392
418
|
const effectiveShortTermMemory = shortTermMemory ?? resolvedAgentChatConfig?.shortTermMemory ?? DEFAULT_SHORT_TERM_MEMORY;
|
|
393
419
|
const shouldUseAgentBlockDirectChat = useAgentBlockDirectChat ?? effectiveAgentHarness === "deep_agent";
|
|
394
420
|
const isNewAgent = Boolean(effectiveAgentBlockId && shouldUseAgentBlockDirectChat);
|
|
395
|
-
|
|
421
|
+
// isPersistent supersedes noPersistency on the new direct-chat path.
|
|
422
|
+
const isPersistentFlow = isNewAgent && Boolean(effectiveShortTermMemory?.isPersistent);
|
|
423
|
+
const effectiveNoPersistency = isNewAgent ? !effectiveShortTermMemory?.isPersistent : Boolean(noPersistency);
|
|
424
|
+
const [isFetchingMessages, setIsFetchingMessages] = useState(!effectiveNoPersistency);
|
|
396
425
|
const [currentThreadId, setCurrentThreadId] = useState(defaultThreadId);
|
|
397
426
|
const [fetchedMessages, setFetchedMessages] = useState([]);
|
|
398
427
|
useEffect(() => {
|
|
@@ -418,7 +447,7 @@ export const AgentChatRoot = ({ appId, token, agentBlockId, agentHarness, useAge
|
|
|
418
447
|
}, [agentChatId, token]);
|
|
419
448
|
useEffect(() => {
|
|
420
449
|
let cancelled = false;
|
|
421
|
-
if (
|
|
450
|
+
if (effectiveNoPersistency) {
|
|
422
451
|
setFetchedMessages([]);
|
|
423
452
|
return;
|
|
424
453
|
}
|
|
@@ -445,7 +474,48 @@ export const AgentChatRoot = ({ appId, token, agentBlockId, agentHarness, useAge
|
|
|
445
474
|
return () => {
|
|
446
475
|
cancelled = true;
|
|
447
476
|
};
|
|
448
|
-
}, [appId, token, chatId, currentThreadId,
|
|
477
|
+
}, [appId, token, chatId, currentThreadId, effectiveNoPersistency, effectiveAgentChatData, isNewAgent]);
|
|
478
|
+
// Stable ids per (chatId, threadId) — must match the ids the backend
|
|
479
|
+
// persists so the stream echo merges by id in the UI.
|
|
480
|
+
const initialAgentMessageIdsRef = useRef({});
|
|
481
|
+
const initialAgentMessages = useMemo(() => {
|
|
482
|
+
if (!isPersistentFlow || isFetchingMessages || fetchedMessages.length > 0) {
|
|
483
|
+
return [];
|
|
484
|
+
}
|
|
485
|
+
const initialMessages = effectiveAgentChatData?.initialMessages;
|
|
486
|
+
if (!initialMessages || initialMessages.length === 0) {
|
|
487
|
+
return [];
|
|
488
|
+
}
|
|
489
|
+
const validMessages = initialMessages.filter((im) => typeof im?.content === "string" && im.content.length > 0);
|
|
490
|
+
if (validMessages.length === 0) {
|
|
491
|
+
return [];
|
|
492
|
+
}
|
|
493
|
+
const cacheKey = `${chatId ?? "_"}|${currentThreadId ?? "_"}`;
|
|
494
|
+
const cached = initialAgentMessageIdsRef.current[cacheKey] ?? [];
|
|
495
|
+
const ids = [];
|
|
496
|
+
for (let i = 0; i < validMessages.length; i++) {
|
|
497
|
+
ids.push(cached[i] ?? generateId());
|
|
498
|
+
}
|
|
499
|
+
initialAgentMessageIdsRef.current[cacheKey] = ids;
|
|
500
|
+
return validMessages.map((initialMessage, i) => ({
|
|
501
|
+
id: ids[i],
|
|
502
|
+
createdAt: new Date(1).toISOString(),
|
|
503
|
+
msg: {
|
|
504
|
+
id: ids[i],
|
|
505
|
+
role: "ai",
|
|
506
|
+
type: "text",
|
|
507
|
+
content: initialMessage.content,
|
|
508
|
+
payload: {},
|
|
509
|
+
},
|
|
510
|
+
}));
|
|
511
|
+
}, [
|
|
512
|
+
isPersistentFlow,
|
|
513
|
+
isFetchingMessages,
|
|
514
|
+
fetchedMessages.length,
|
|
515
|
+
effectiveAgentChatData?.initialMessages,
|
|
516
|
+
chatId,
|
|
517
|
+
currentThreadId,
|
|
518
|
+
]);
|
|
449
519
|
if (isResolvingAgentChatConfig) {
|
|
450
520
|
return null;
|
|
451
521
|
}
|
|
@@ -469,13 +539,15 @@ export const AgentChatRoot = ({ appId, token, agentBlockId, agentHarness, useAge
|
|
|
469
539
|
currentThreadId,
|
|
470
540
|
setCurrentThreadId,
|
|
471
541
|
fetchedMessages,
|
|
542
|
+
initialAgentMessages,
|
|
543
|
+
isPersistentFlow,
|
|
472
544
|
};
|
|
473
545
|
if (isNewAgent) {
|
|
474
|
-
return _jsx(
|
|
546
|
+
return _jsx(CopilotAgentChatRootProvider, { ...commonProps });
|
|
475
547
|
}
|
|
476
548
|
return _jsx(LegacyAgentChatProvider, { ...commonProps });
|
|
477
549
|
};
|
|
478
|
-
function LegacyAgentChatProvider({ appId, token, agentChatId, children, chatId, noPersistency, currentThreadId, chatContext, chatContextFiles, agentChatData, memoryEnabled = false, shortTermMemory = { isEnabled: true, isPersistent:
|
|
550
|
+
function LegacyAgentChatProvider({ appId, token, agentChatId, children, chatId, noPersistency, currentThreadId, chatContext, chatContextFiles, agentChatData, memoryEnabled = false, shortTermMemory = { isEnabled: true, isPersistent: true }, isFetchingMessages, setCurrentThreadId, fetchedMessages, initialAgentMessages, isPersistentFlow, }) {
|
|
479
551
|
const [messages, setMessages] = useState([]);
|
|
480
552
|
const [isThinking, setIsThinking] = useState(false);
|
|
481
553
|
const addMessages = useCallback((messagesToAdd) => {
|
|
@@ -594,54 +666,49 @@ function LegacyAgentChatProvider({ appId, token, agentChatId, children, chatId,
|
|
|
594
666
|
memoryEnabled,
|
|
595
667
|
shortTermMemory,
|
|
596
668
|
]);
|
|
597
|
-
useAgentChatDataInitialization({ agentChatData, addMessages, sendMessage });
|
|
669
|
+
useAgentChatDataInitialization({ agentChatData, addMessages, sendMessage, isPersistentFlow });
|
|
598
670
|
const inputState = useAgentChatInputState({ isThinking, isFetchingMessages, sendMessage });
|
|
599
|
-
return (_jsx(AgentChatContextProvider, { ...inputState, messages: flattenLegacyMessages(messages), isThinking: isThinking, isFetchingMessages: isFetchingMessages, currentThreadId: currentThreadId, agentChatData: agentChatData, sendMessage: sendMessage, addMessages: addMessages, setCurrentThreadId: setCurrentThreadId, appId: appId, token: token, agentChatId: agentChatId, chatId: chatId, noPersistency: noPersistency, children: children }));
|
|
671
|
+
return (_jsx(AgentChatContextProvider, { ...inputState, messages: flattenLegacyMessages(messages), initialAgentMessages: initialAgentMessages, isThinking: isThinking, isFetchingMessages: isFetchingMessages, currentThreadId: currentThreadId, agentChatData: agentChatData, sendMessage: sendMessage, addMessages: addMessages, setCurrentThreadId: setCurrentThreadId, appId: appId, token: token, agentChatId: agentChatId, chatId: chatId, noPersistency: noPersistency, children: children }));
|
|
600
672
|
}
|
|
601
|
-
function
|
|
673
|
+
function CopilotAgentChatRootProvider({ appId, token, ...props }) {
|
|
674
|
+
const copilotRuntimeUrl = `${getApiHost()}/agent-chat-stream`;
|
|
675
|
+
const agent = useMemo(() => new BlocksCopilotHttpAgent({ url: copilotRuntimeUrl }), [copilotRuntimeUrl]);
|
|
676
|
+
const agents = useMemo(() => ({ default: agent }), [agent]);
|
|
677
|
+
return (_jsx(CopilotKit, { runtimeUrl: copilotRuntimeUrl, agents__unsafe_dev_only: agents, children: _jsx(CopilotAgentChatProvider, { ...props, appId: appId, token: token, copilotAgent: agent }) }));
|
|
678
|
+
}
|
|
679
|
+
function CopilotAgentChatProvider({ appId, token, agentBlockId, agentChatId, children, chatId, noPersistency, currentThreadId, chatContext, chatContextFiles, agentChatData, shortTermMemory = { isEnabled: true, isPersistent: true }, isFetchingMessages, setCurrentThreadId, fetchedMessages, initialAgentMessages, isPersistentFlow, copilotAgent, }) {
|
|
602
680
|
const [externalMessages, setExternalMessages] = useState([]);
|
|
603
|
-
const
|
|
604
|
-
const
|
|
605
|
-
const
|
|
606
|
-
|
|
607
|
-
credentials: "include",
|
|
608
|
-
prepareSendMessagesRequest: ({ body, id, messages, trigger, messageId }) => {
|
|
609
|
-
const submittedMessage = messages[messages.length - 1];
|
|
610
|
-
const requestMessages = Array.isArray(body?.messages) ? body.messages : [];
|
|
611
|
-
return {
|
|
612
|
-
body: {
|
|
613
|
-
...body,
|
|
614
|
-
id,
|
|
615
|
-
trigger,
|
|
616
|
-
messages: submittedMessage ? [...requestMessages, submittedMessage] : requestMessages,
|
|
617
|
-
...(messageId ? { messageId } : {}),
|
|
618
|
-
},
|
|
619
|
-
};
|
|
620
|
-
},
|
|
621
|
-
}), []);
|
|
622
|
-
const aiChatId = useMemo(() => [appId, agentChatId, chatId, currentThreadId].filter(Boolean).join(":"), [appId, agentChatId, chatId, currentThreadId]);
|
|
623
|
-
const { messages: aiMessages, sendMessage: sendAiSdkMessage, setMessages: setAiMessages, status: aiChatStatus, } = useChat({
|
|
624
|
-
id: aiChatId,
|
|
625
|
-
transport: aiChatTransport,
|
|
626
|
-
onError: (error) => {
|
|
627
|
-
setAiMessages((prev) => appendAiSdkErrorMessage(prev, error));
|
|
628
|
-
},
|
|
629
|
-
});
|
|
681
|
+
const copilotMessageCreatedAtByIdRef = useRef({});
|
|
682
|
+
const previousCopilotChatIdRef = useRef(undefined);
|
|
683
|
+
const copilotChatId = useMemo(() => [appId, agentChatId, chatId, currentThreadId].filter(Boolean).join(":"), [appId, agentChatId, chatId, currentThreadId]);
|
|
684
|
+
const { messages: copilotMessages, sendMessage: sendCopilotMessage, setMessages: setCopilotMessages, isLoading: isCopilotLoading, } = useCopilotChatInternal();
|
|
630
685
|
useEffect(() => {
|
|
631
|
-
if (
|
|
686
|
+
if (previousCopilotChatIdRef.current === copilotChatId) {
|
|
632
687
|
return;
|
|
633
688
|
}
|
|
634
|
-
|
|
635
|
-
|
|
689
|
+
previousCopilotChatIdRef.current = copilotChatId;
|
|
690
|
+
copilotMessageCreatedAtByIdRef.current = {};
|
|
636
691
|
setExternalMessages([]);
|
|
637
|
-
|
|
638
|
-
}, [
|
|
692
|
+
setCopilotMessages([]);
|
|
693
|
+
}, [copilotChatId, setCopilotMessages]);
|
|
694
|
+
const copilotMessageItems = useMemo(() => copilotMessages
|
|
695
|
+
.map((message) => {
|
|
696
|
+
const legacyPayload = copilotMessageToLegacyPayload(message, copilotMessages);
|
|
697
|
+
if (!legacyPayload) {
|
|
698
|
+
return null;
|
|
699
|
+
}
|
|
700
|
+
copilotMessageCreatedAtByIdRef.current[legacyPayload.id] ??= new Date().toISOString();
|
|
701
|
+
return {
|
|
702
|
+
createdAt: copilotMessageCreatedAtByIdRef.current[legacyPayload.id],
|
|
703
|
+
msg: legacyPayload,
|
|
704
|
+
};
|
|
705
|
+
})
|
|
706
|
+
.filter((message) => Boolean(message)), [copilotMessages]);
|
|
639
707
|
const messages = useMemo(() => {
|
|
640
708
|
const fetchedMessageItems = fetchedMessages.map(storedMessageToLegacyView);
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
const messageItem = uiMessageToV1MessageItem(aiMessage, aiMessageCreatedAtByIdRef.current[aiMessage.id]);
|
|
709
|
+
// Seed initial agent messages so the stream echo merges by id and keeps the early createdAt.
|
|
710
|
+
const nextMessages = mergeMessageItemsById(mergeMessageItemsById(initialAgentMessages, fetchedMessageItems), externalMessages);
|
|
711
|
+
for (const messageItem of copilotMessageItems) {
|
|
645
712
|
const existingIndex = nextMessages.findIndex((message) => message.msg.id === messageItem.msg.id);
|
|
646
713
|
if (existingIndex !== -1) {
|
|
647
714
|
nextMessages[existingIndex] = {
|
|
@@ -656,26 +723,30 @@ function AiSdkAgentChatProvider({ appId, token, agentBlockId, agentChatId, child
|
|
|
656
723
|
}
|
|
657
724
|
nextMessages.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt));
|
|
658
725
|
return nextMessages;
|
|
659
|
-
}, [
|
|
660
|
-
const isThinking =
|
|
726
|
+
}, [copilotMessageItems, externalMessages, fetchedMessages, initialAgentMessages]);
|
|
727
|
+
const isThinking = isCopilotLoading;
|
|
661
728
|
const addExternalMessages = useCallback((messagesToAdd) => {
|
|
662
729
|
const normalizedMessages = messagesToAdd.map(storedMessageToLegacyView);
|
|
663
730
|
setExternalMessages((prevMessages) => mergeMessageItemsById(prevMessages, normalizedMessages));
|
|
664
731
|
}, []);
|
|
665
|
-
const
|
|
666
|
-
|
|
667
|
-
}, [
|
|
732
|
+
const addCopilotErrorMessage = useCallback((error) => {
|
|
733
|
+
setCopilotMessages(appendCopilotErrorMessage(copilotMessages, error));
|
|
734
|
+
}, [copilotMessages, setCopilotMessages]);
|
|
668
735
|
const sendMessage = useCallback(async ({ content, hiddenContent, ...message }) => {
|
|
669
736
|
try {
|
|
670
737
|
const messageId = generateId();
|
|
671
738
|
const uploadedAttachments = await uploadAttachments({ attachments: message.attachments, appId, token });
|
|
672
|
-
const
|
|
739
|
+
const userCopilotMessage = {
|
|
673
740
|
id: messageId,
|
|
674
741
|
role: "user",
|
|
675
|
-
|
|
742
|
+
content: content ?? "",
|
|
676
743
|
metadata: { version: 1, hiddenPrompt: hiddenContent ?? undefined },
|
|
677
744
|
};
|
|
678
|
-
|
|
745
|
+
const requestMessages = messages
|
|
746
|
+
.map(messageItemToCopilotMessage)
|
|
747
|
+
.filter((requestMessage) => Boolean(requestMessage));
|
|
748
|
+
setCopilotMessages(requestMessages);
|
|
749
|
+
copilotAgent.setRequestOptions({
|
|
679
750
|
headers: {
|
|
680
751
|
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
681
752
|
...(AppVersionService.getCurrentVersionNumber()
|
|
@@ -694,31 +765,46 @@ function AiSdkAgentChatProvider({ appId, token, agentBlockId, agentChatId, child
|
|
|
694
765
|
shortTermMemory,
|
|
695
766
|
chatContextFiles,
|
|
696
767
|
chatContext: formatChatContext(chatContext),
|
|
697
|
-
|
|
768
|
+
files: uploadedAttachments,
|
|
769
|
+
messages: [...requestMessages, userCopilotMessage],
|
|
770
|
+
messageId,
|
|
771
|
+
initialMessageIds: initialAgentMessages.map((m) => m.msg.id),
|
|
698
772
|
},
|
|
699
773
|
});
|
|
774
|
+
await sendCopilotMessage(userCopilotMessage);
|
|
700
775
|
}
|
|
701
776
|
catch (error) {
|
|
702
|
-
|
|
777
|
+
addCopilotErrorMessage(error);
|
|
778
|
+
}
|
|
779
|
+
finally {
|
|
780
|
+
copilotAgent.clearRequestOptions();
|
|
703
781
|
}
|
|
704
782
|
}, [
|
|
705
|
-
|
|
783
|
+
addCopilotErrorMessage,
|
|
706
784
|
agentBlockId,
|
|
707
785
|
agentChatId,
|
|
708
786
|
appId,
|
|
709
787
|
chatId,
|
|
710
788
|
chatContext,
|
|
711
789
|
chatContextFiles,
|
|
790
|
+
copilotAgent,
|
|
712
791
|
currentThreadId,
|
|
713
792
|
messages,
|
|
714
793
|
noPersistency,
|
|
715
|
-
|
|
794
|
+
sendCopilotMessage,
|
|
795
|
+
setCopilotMessages,
|
|
716
796
|
shortTermMemory,
|
|
717
797
|
token,
|
|
798
|
+
initialAgentMessages,
|
|
718
799
|
]);
|
|
719
|
-
useAgentChatDataInitialization({
|
|
800
|
+
useAgentChatDataInitialization({
|
|
801
|
+
agentChatData,
|
|
802
|
+
addMessages: addExternalMessages,
|
|
803
|
+
sendMessage,
|
|
804
|
+
isPersistentFlow,
|
|
805
|
+
});
|
|
720
806
|
const inputState = useAgentChatInputState({ isThinking, isFetchingMessages, sendMessage });
|
|
721
|
-
return (_jsx(AgentChatContextProvider, { ...inputState, messages: messages, isThinking: isThinking, isFetchingMessages: isFetchingMessages, currentThreadId: currentThreadId, agentChatData: agentChatData, sendMessage: sendMessage, addMessages: addExternalMessages, setCurrentThreadId: setCurrentThreadId, appId: appId, token: token, agentBlockId: agentBlockId, agentChatId: agentChatId, chatId: chatId, noPersistency: noPersistency, children: children }));
|
|
807
|
+
return (_jsx(AgentChatContextProvider, { ...inputState, messages: messages, initialAgentMessages: initialAgentMessages, isThinking: isThinking, isFetchingMessages: isFetchingMessages, currentThreadId: currentThreadId, agentChatData: agentChatData, sendMessage: sendMessage, addMessages: addExternalMessages, setCurrentThreadId: setCurrentThreadId, appId: appId, token: token, agentBlockId: agentBlockId, agentChatId: agentChatId, chatId: chatId, noPersistency: noPersistency, children: children }));
|
|
722
808
|
}
|
|
723
809
|
const AgentChatVoiceContext = createContext(null);
|
|
724
810
|
const noopVoice = {
|
|
@@ -904,7 +990,7 @@ export function AgentChatVoice({ children }) {
|
|
|
904
990
|
return;
|
|
905
991
|
}
|
|
906
992
|
const conversationHistory = messagesRef.current
|
|
907
|
-
.filter((m) =>
|
|
993
|
+
.filter((m) => Boolean(m.msg.content) && m.msg.type === "text" && !m.msg.payload?.isVoiceMarker)
|
|
908
994
|
.slice(-20)
|
|
909
995
|
.map((m) => ({
|
|
910
996
|
role: (m.msg.role === "human" ? "user" : "assistant"),
|
|
@@ -944,18 +1030,7 @@ export function AgentChatVoice({ children }) {
|
|
|
944
1030
|
say: voiceSay,
|
|
945
1031
|
}, children: children }));
|
|
946
1032
|
}
|
|
947
|
-
const hasRenderableMessageContent = (message) => {
|
|
948
|
-
if (isV1AiSdkMessageItem(message)) {
|
|
949
|
-
return Boolean(message.msg.parts.length);
|
|
950
|
-
}
|
|
951
|
-
const hasTextContent = Boolean(message.msg.content);
|
|
952
|
-
const hasAttachments = Boolean(message.msg.attachments?.length);
|
|
953
|
-
return hasTextContent || hasAttachments;
|
|
954
|
-
};
|
|
955
1033
|
export function AgentChatMessage({ message, index, ...props }) {
|
|
956
|
-
if (!hasRenderableMessageContent(message)) {
|
|
957
|
-
return null;
|
|
958
|
-
}
|
|
959
1034
|
return _jsx("div", { "data-message-index": index, "data-message-role": message.msg.role, ...props });
|
|
960
1035
|
}
|
|
961
1036
|
export function AgentChatMessages({ asChild = false, autoScroll = true, scrollAreaClassName, ...props }) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocksdiy/react-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "React common",
|
|
6
6
|
"keywords": [],
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
]
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@
|
|
33
|
+
"@ag-ui/client": "^0.0.53",
|
|
34
|
+
"@copilotkit/react-core": "^1.57.1",
|
|
34
35
|
"@radix-ui/react-slot": "^1.2.3",
|
|
35
36
|
"@vapi-ai/web": "^2.5.2",
|
|
36
|
-
"ai": "^6.0.175",
|
|
37
37
|
"penpal": "^7.0.6",
|
|
38
38
|
"react": "^19.2.4",
|
|
39
39
|
"@blocksdiy/blocks-client-api": "1.5.0"
|