@assistant-ui/react-langgraph 0.0.2 → 0.0.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.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +31 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -25
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -32,24 +32,24 @@ type LangChainEvent = {
|
|
|
32
32
|
data: LangChainMessage[];
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
declare const
|
|
35
|
+
declare const useLangGraphRuntime: ({ threadId, stream, }: {
|
|
36
36
|
threadId?: string | undefined;
|
|
37
|
-
stream: (
|
|
37
|
+
stream: (messages: LangChainMessage[]) => Promise<AsyncGenerator<{
|
|
38
38
|
event: string;
|
|
39
39
|
data: any;
|
|
40
40
|
}>>;
|
|
41
41
|
}) => ExternalStoreRuntime;
|
|
42
42
|
|
|
43
43
|
declare const useLangGraphMessages: <TMessage>({ stream, }: {
|
|
44
|
-
stream: (
|
|
44
|
+
stream: (messages: TMessage[]) => Promise<AsyncGenerator<{
|
|
45
45
|
event: string;
|
|
46
46
|
data: any;
|
|
47
47
|
}>>;
|
|
48
48
|
}) => {
|
|
49
49
|
messages: TMessage[];
|
|
50
|
-
sendMessage: (
|
|
50
|
+
sendMessage: (messages: TMessage[]) => Promise<void>;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
declare const convertLangchainMessages: useExternalMessageConverter.Callback<LangChainMessage>;
|
|
54
54
|
|
|
55
|
-
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages,
|
|
55
|
+
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages, useLangGraphMessages, useLangGraphRuntime };
|
package/dist/index.d.ts
CHANGED
|
@@ -32,24 +32,24 @@ type LangChainEvent = {
|
|
|
32
32
|
data: LangChainMessage[];
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
declare const
|
|
35
|
+
declare const useLangGraphRuntime: ({ threadId, stream, }: {
|
|
36
36
|
threadId?: string | undefined;
|
|
37
|
-
stream: (
|
|
37
|
+
stream: (messages: LangChainMessage[]) => Promise<AsyncGenerator<{
|
|
38
38
|
event: string;
|
|
39
39
|
data: any;
|
|
40
40
|
}>>;
|
|
41
41
|
}) => ExternalStoreRuntime;
|
|
42
42
|
|
|
43
43
|
declare const useLangGraphMessages: <TMessage>({ stream, }: {
|
|
44
|
-
stream: (
|
|
44
|
+
stream: (messages: TMessage[]) => Promise<AsyncGenerator<{
|
|
45
45
|
event: string;
|
|
46
46
|
data: any;
|
|
47
47
|
}>>;
|
|
48
48
|
}) => {
|
|
49
49
|
messages: TMessage[];
|
|
50
|
-
sendMessage: (
|
|
50
|
+
sendMessage: (messages: TMessage[]) => Promise<void>;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
declare const convertLangchainMessages: useExternalMessageConverter.Callback<LangChainMessage>;
|
|
54
54
|
|
|
55
|
-
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages,
|
|
55
|
+
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages, useLangGraphMessages, useLangGraphRuntime };
|
package/dist/index.js
CHANGED
|
@@ -21,8 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
23
|
convertLangchainMessages: () => convertLangchainMessages,
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
useLangGraphMessages: () => useLangGraphMessages,
|
|
25
|
+
useLangGraphRuntime: () => useLangGraphRuntime
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(src_exports);
|
|
28
28
|
|
|
@@ -82,23 +82,23 @@ var useLangGraphMessages = ({
|
|
|
82
82
|
}) => {
|
|
83
83
|
const [messages, setMessages] = (0, import_react.useState)([]);
|
|
84
84
|
const sendMessage = (0, import_react.useCallback)(
|
|
85
|
-
async (
|
|
86
|
-
if (
|
|
87
|
-
setMessages((currentMessages) => [...currentMessages,
|
|
85
|
+
async (messages2) => {
|
|
86
|
+
if (messages2.length > 0) {
|
|
87
|
+
setMessages((currentMessages) => [...currentMessages, ...messages2]);
|
|
88
88
|
}
|
|
89
|
-
const response = await stream(
|
|
89
|
+
const response = await stream(messages2);
|
|
90
90
|
const completeMessages = [];
|
|
91
91
|
let partialMessages = /* @__PURE__ */ new Map();
|
|
92
92
|
for await (const chunk of response) {
|
|
93
93
|
if (chunk.event === "messages/partial") {
|
|
94
|
-
for (const
|
|
95
|
-
if (!
|
|
96
|
-
partialMessages.set(
|
|
94
|
+
for (const message of chunk.data) {
|
|
95
|
+
if (!message.id) throw new Error("Partial message missing id");
|
|
96
|
+
partialMessages.set(message.id, message);
|
|
97
97
|
}
|
|
98
98
|
} else if (chunk.event === "messages/complete") {
|
|
99
|
-
for (const
|
|
100
|
-
if (!
|
|
101
|
-
partialMessages.delete(
|
|
99
|
+
for (const message of chunk.data) {
|
|
100
|
+
if (!message.id) continue;
|
|
101
|
+
partialMessages.delete(message.id);
|
|
102
102
|
}
|
|
103
103
|
completeMessages.push(...chunk.data);
|
|
104
104
|
} else {
|
|
@@ -116,7 +116,7 @@ var useLangGraphMessages = ({
|
|
|
116
116
|
};
|
|
117
117
|
|
|
118
118
|
// src/useLangGraphRuntime.ts
|
|
119
|
-
var
|
|
119
|
+
var useLangGraphRuntime = ({
|
|
120
120
|
threadId,
|
|
121
121
|
stream
|
|
122
122
|
}) => {
|
|
@@ -124,10 +124,10 @@ var useLangChainLangGraphRuntime = ({
|
|
|
124
124
|
stream
|
|
125
125
|
});
|
|
126
126
|
const [isRunning, setIsRunning] = (0, import_react2.useState)(false);
|
|
127
|
-
const handleSendMessage = async (
|
|
127
|
+
const handleSendMessage = async (messages2) => {
|
|
128
128
|
try {
|
|
129
129
|
setIsRunning(true);
|
|
130
|
-
await sendMessage(
|
|
130
|
+
await sendMessage(messages2);
|
|
131
131
|
} catch (error) {
|
|
132
132
|
console.error("Error streaming messages:", error);
|
|
133
133
|
} finally {
|
|
@@ -146,25 +146,29 @@ var useLangChainLangGraphRuntime = ({
|
|
|
146
146
|
onNew: (msg) => {
|
|
147
147
|
if (msg.content.length !== 1 || msg.content[0]?.type !== "text")
|
|
148
148
|
throw new Error("Only text messages are supported");
|
|
149
|
-
return handleSendMessage(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
return handleSendMessage([
|
|
150
|
+
{
|
|
151
|
+
type: "human",
|
|
152
|
+
content: msg.content[0].text
|
|
153
|
+
}
|
|
154
|
+
]);
|
|
153
155
|
},
|
|
154
156
|
onAddToolResult: async ({ toolCallId, toolName, result }) => {
|
|
155
|
-
await handleSendMessage(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
157
|
+
await handleSendMessage([
|
|
158
|
+
{
|
|
159
|
+
type: "tool",
|
|
160
|
+
name: toolName,
|
|
161
|
+
tool_call_id: toolCallId,
|
|
162
|
+
content: JSON.stringify(result)
|
|
163
|
+
}
|
|
164
|
+
]);
|
|
161
165
|
}
|
|
162
166
|
});
|
|
163
167
|
};
|
|
164
168
|
// Annotate the CommonJS export names for ESM import in node:
|
|
165
169
|
0 && (module.exports = {
|
|
166
170
|
convertLangchainMessages,
|
|
167
|
-
|
|
168
|
-
|
|
171
|
+
useLangGraphMessages,
|
|
172
|
+
useLangGraphRuntime
|
|
169
173
|
});
|
|
170
174
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["export { useLangGraphRuntime } from \"./useLangGraphRuntime\";\n\nexport { useLangGraphMessages } from \"./useLangGraphMessages\";\nexport { convertLangchainMessages } from \"./convertLangchainMessages\";\nexport type {\n LangChainMessage,\n LangChainEvent,\n LangChainToolCall,\n LangChainToolCallChunk,\n} from \"./types\";\n","import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const useLangGraphRuntime = ({\n threadId,\n stream,\n}: {\n threadId?: string | undefined;\n stream: (messages: LangChainMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}): ExternalStoreRuntime => {\n const { messages, sendMessage } = useLangGraphMessages({\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (messages: LangChainMessage[]) => {\n try {\n setIsRunning(true);\n await sendMessage(messages);\n } catch (error) {\n console.error(\"Error streaming messages:\", error);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertLangchainMessages,\n messages,\n isRunning,\n });\n\n return useExternalStoreRuntime({\n threadId,\n isRunning,\n messages: threadMessages,\n onNew: (msg) => {\n if (msg.content.length !== 1 || msg.content[0]?.type !== \"text\")\n throw new Error(\"Only text messages are supported\");\n return handleSendMessage([\n {\n type: \"human\",\n content: msg.content[0].text,\n },\n ]);\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n await handleSendMessage([\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ]);\n },\n });\n};\n","\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\n\nexport const convertLangchainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ...(message.tool_calls?.map(\n (chunk): ToolCallContentPart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.args,\n argsText:\n message.tool_call_chunks?.find((c) => c.id === chunk.id)\n ?.args ?? JSON.stringify(chunk.args),\n }),\n ) ?? []),\n ],\n };\n case \"tool\":\n return {\n role: \"tool\",\n toolName: message.name,\n toolCallId: message.tool_call_id,\n result: message.content,\n };\n }\n};\n","import { useState, useCallback } from \"react\";\n\nexport const useLangGraphMessages = <TMessage>({\n stream,\n}: {\n stream: (messages: TMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}) => {\n const [messages, setMessages] = useState<TMessage[]>([]);\n\n const sendMessage = useCallback(\n async (messages: TMessage[]) => {\n if (messages.length > 0) {\n setMessages((currentMessages) => [...currentMessages, ...messages]);\n }\n\n const response = await stream(messages);\n\n const completeMessages: TMessage[] = [];\n let partialMessages: Map<string, TMessage> = new Map();\n for await (const chunk of response) {\n if (chunk.event === \"messages/partial\") {\n for (const message of chunk.data) {\n if (!message.id) throw new Error(\"Partial message missing id\");\n\n partialMessages.set(message.id, message);\n }\n } else if (chunk.event === \"messages/complete\") {\n for (const message of chunk.data) {\n if (!message.id) continue;\n partialMessages.delete(message.id);\n }\n\n completeMessages.push(...chunk.data);\n } else {\n continue;\n }\n\n setMessages([...completeMessages, ...partialMessages.values()]);\n }\n if (partialMessages.size > 0) {\n throw new Error(\"A partial message was not marked as complete\");\n }\n },\n [stream],\n );\n\n return { messages, sendMessage };\n};\n"],"mappings":"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","names":["import_react","messages","messages"]}
|
package/dist/index.mjs
CHANGED
|
@@ -57,23 +57,23 @@ var useLangGraphMessages = ({
|
|
|
57
57
|
}) => {
|
|
58
58
|
const [messages, setMessages] = useState([]);
|
|
59
59
|
const sendMessage = useCallback(
|
|
60
|
-
async (
|
|
61
|
-
if (
|
|
62
|
-
setMessages((currentMessages) => [...currentMessages,
|
|
60
|
+
async (messages2) => {
|
|
61
|
+
if (messages2.length > 0) {
|
|
62
|
+
setMessages((currentMessages) => [...currentMessages, ...messages2]);
|
|
63
63
|
}
|
|
64
|
-
const response = await stream(
|
|
64
|
+
const response = await stream(messages2);
|
|
65
65
|
const completeMessages = [];
|
|
66
66
|
let partialMessages = /* @__PURE__ */ new Map();
|
|
67
67
|
for await (const chunk of response) {
|
|
68
68
|
if (chunk.event === "messages/partial") {
|
|
69
|
-
for (const
|
|
70
|
-
if (!
|
|
71
|
-
partialMessages.set(
|
|
69
|
+
for (const message of chunk.data) {
|
|
70
|
+
if (!message.id) throw new Error("Partial message missing id");
|
|
71
|
+
partialMessages.set(message.id, message);
|
|
72
72
|
}
|
|
73
73
|
} else if (chunk.event === "messages/complete") {
|
|
74
|
-
for (const
|
|
75
|
-
if (!
|
|
76
|
-
partialMessages.delete(
|
|
74
|
+
for (const message of chunk.data) {
|
|
75
|
+
if (!message.id) continue;
|
|
76
|
+
partialMessages.delete(message.id);
|
|
77
77
|
}
|
|
78
78
|
completeMessages.push(...chunk.data);
|
|
79
79
|
} else {
|
|
@@ -91,7 +91,7 @@ var useLangGraphMessages = ({
|
|
|
91
91
|
};
|
|
92
92
|
|
|
93
93
|
// src/useLangGraphRuntime.ts
|
|
94
|
-
var
|
|
94
|
+
var useLangGraphRuntime = ({
|
|
95
95
|
threadId,
|
|
96
96
|
stream
|
|
97
97
|
}) => {
|
|
@@ -99,10 +99,10 @@ var useLangChainLangGraphRuntime = ({
|
|
|
99
99
|
stream
|
|
100
100
|
});
|
|
101
101
|
const [isRunning, setIsRunning] = useState2(false);
|
|
102
|
-
const handleSendMessage = async (
|
|
102
|
+
const handleSendMessage = async (messages2) => {
|
|
103
103
|
try {
|
|
104
104
|
setIsRunning(true);
|
|
105
|
-
await sendMessage(
|
|
105
|
+
await sendMessage(messages2);
|
|
106
106
|
} catch (error) {
|
|
107
107
|
console.error("Error streaming messages:", error);
|
|
108
108
|
} finally {
|
|
@@ -121,24 +121,28 @@ var useLangChainLangGraphRuntime = ({
|
|
|
121
121
|
onNew: (msg) => {
|
|
122
122
|
if (msg.content.length !== 1 || msg.content[0]?.type !== "text")
|
|
123
123
|
throw new Error("Only text messages are supported");
|
|
124
|
-
return handleSendMessage(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
return handleSendMessage([
|
|
125
|
+
{
|
|
126
|
+
type: "human",
|
|
127
|
+
content: msg.content[0].text
|
|
128
|
+
}
|
|
129
|
+
]);
|
|
128
130
|
},
|
|
129
131
|
onAddToolResult: async ({ toolCallId, toolName, result }) => {
|
|
130
|
-
await handleSendMessage(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
await handleSendMessage([
|
|
133
|
+
{
|
|
134
|
+
type: "tool",
|
|
135
|
+
name: toolName,
|
|
136
|
+
tool_call_id: toolCallId,
|
|
137
|
+
content: JSON.stringify(result)
|
|
138
|
+
}
|
|
139
|
+
]);
|
|
136
140
|
}
|
|
137
141
|
});
|
|
138
142
|
};
|
|
139
143
|
export {
|
|
140
144
|
convertLangchainMessages,
|
|
141
|
-
|
|
142
|
-
|
|
145
|
+
useLangGraphMessages,
|
|
146
|
+
useLangGraphRuntime
|
|
143
147
|
};
|
|
144
148
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const
|
|
1
|
+
{"version":3,"sources":["../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const useLangGraphRuntime = ({\n threadId,\n stream,\n}: {\n threadId?: string | undefined;\n stream: (messages: LangChainMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}): ExternalStoreRuntime => {\n const { messages, sendMessage } = useLangGraphMessages({\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (messages: LangChainMessage[]) => {\n try {\n setIsRunning(true);\n await sendMessage(messages);\n } catch (error) {\n console.error(\"Error streaming messages:\", error);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertLangchainMessages,\n messages,\n isRunning,\n });\n\n return useExternalStoreRuntime({\n threadId,\n isRunning,\n messages: threadMessages,\n onNew: (msg) => {\n if (msg.content.length !== 1 || msg.content[0]?.type !== \"text\")\n throw new Error(\"Only text messages are supported\");\n return handleSendMessage([\n {\n type: \"human\",\n content: msg.content[0].text,\n },\n ]);\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n await handleSendMessage([\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ]);\n },\n });\n};\n","\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\n\nexport const convertLangchainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ...(message.tool_calls?.map(\n (chunk): ToolCallContentPart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.args,\n argsText:\n message.tool_call_chunks?.find((c) => c.id === chunk.id)\n ?.args ?? JSON.stringify(chunk.args),\n }),\n ) ?? []),\n ],\n };\n case \"tool\":\n return {\n role: \"tool\",\n toolName: message.name,\n toolCallId: message.tool_call_id,\n result: message.content,\n };\n }\n};\n","import { useState, useCallback } from \"react\";\n\nexport const useLangGraphMessages = <TMessage>({\n stream,\n}: {\n stream: (messages: TMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}) => {\n const [messages, setMessages] = useState<TMessage[]>([]);\n\n const sendMessage = useCallback(\n async (messages: TMessage[]) => {\n if (messages.length > 0) {\n setMessages((currentMessages) => [...currentMessages, ...messages]);\n }\n\n const response = await stream(messages);\n\n const completeMessages: TMessage[] = [];\n let partialMessages: Map<string, TMessage> = new Map();\n for await (const chunk of response) {\n if (chunk.event === \"messages/partial\") {\n for (const message of chunk.data) {\n if (!message.id) throw new Error(\"Partial message missing id\");\n\n partialMessages.set(message.id, message);\n }\n } else if (chunk.event === \"messages/complete\") {\n for (const message of chunk.data) {\n if (!message.id) continue;\n partialMessages.delete(message.id);\n }\n\n completeMessages.push(...chunk.data);\n } else {\n continue;\n }\n\n setMessages([...completeMessages, ...partialMessages.values()]);\n }\n if (partialMessages.size > 0) {\n throw new Error(\"A partial message was not marked as complete\");\n }\n },\n [stream],\n );\n\n return { messages, sendMessage };\n};\n"],"mappings":";AAAA,SAAS,YAAAA,iBAAgB;AAEzB;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACCA,IAAM,2BAET,CAAC,YAAY;AACf,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACnD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACnD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,UAChB;AAAA,UACA,GAAI,QAAQ,YAAY;AAAA,YACtB,CAAC,WAAgC;AAAA,cAC/B,MAAM;AAAA,cACN,YAAY,MAAM;AAAA,cAClB,UAAU,MAAM;AAAA,cAChB,MAAM,MAAM;AAAA,cACZ,UACE,QAAQ,kBAAkB,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,GACnD,QAAQ,KAAK,UAAU,MAAM,IAAI;AAAA,YACzC;AAAA,UACF,KAAK,CAAC;AAAA,QACR;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,QAAQ;AAAA,QAClB,YAAY,QAAQ;AAAA,QACpB,QAAQ,QAAQ;AAAA,MAClB;AAAA,EACJ;AACF;;;ACpDA,SAAS,UAAU,mBAAmB;AAE/B,IAAM,uBAAuB,CAAW;AAAA,EAC7C;AACF,MAOM;AACJ,QAAM,CAAC,UAAU,WAAW,IAAI,SAAqB,CAAC,CAAC;AAEvD,QAAM,cAAc;AAAA,IAClB,OAAOC,cAAyB;AAC9B,UAAIA,UAAS,SAAS,GAAG;AACvB,oBAAY,CAAC,oBAAoB,CAAC,GAAG,iBAAiB,GAAGA,SAAQ,CAAC;AAAA,MACpE;AAEA,YAAM,WAAW,MAAM,OAAOA,SAAQ;AAEtC,YAAM,mBAA+B,CAAC;AACtC,UAAI,kBAAyC,oBAAI,IAAI;AACrD,uBAAiB,SAAS,UAAU;AAClC,YAAI,MAAM,UAAU,oBAAoB;AACtC,qBAAW,WAAW,MAAM,MAAM;AAChC,gBAAI,CAAC,QAAQ,GAAI,OAAM,IAAI,MAAM,4BAA4B;AAE7D,4BAAgB,IAAI,QAAQ,IAAI,OAAO;AAAA,UACzC;AAAA,QACF,WAAW,MAAM,UAAU,qBAAqB;AAC9C,qBAAW,WAAW,MAAM,MAAM;AAChC,gBAAI,CAAC,QAAQ,GAAI;AACjB,4BAAgB,OAAO,QAAQ,EAAE;AAAA,UACnC;AAEA,2BAAiB,KAAK,GAAG,MAAM,IAAI;AAAA,QACrC,OAAO;AACL;AAAA,QACF;AAEA,oBAAY,CAAC,GAAG,kBAAkB,GAAG,gBAAgB,OAAO,CAAC,CAAC;AAAA,MAChE;AACA,UAAI,gBAAgB,OAAO,GAAG;AAC5B,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,SAAO,EAAE,UAAU,YAAY;AACjC;;;AF1CO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AACF,MAQ4B;AAC1B,QAAM,EAAE,UAAU,YAAY,IAAI,qBAAqB;AAAA,IACrD;AAAA,EACF,CAAC;AAED,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,KAAK;AAChD,QAAM,oBAAoB,OAAOC,cAAiC;AAChE,QAAI;AACF,mBAAa,IAAI;AACjB,YAAM,YAAYA,SAAQ;AAAA,IAC5B,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,iBAAiB,4BAA4B;AAAA,IACjD,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,wBAAwB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,OAAO,CAAC,QAAQ;AACd,UAAI,IAAI,QAAQ,WAAW,KAAK,IAAI,QAAQ,CAAC,GAAG,SAAS;AACvD,cAAM,IAAI,MAAM,kCAAkC;AACpD,aAAO,kBAAkB;AAAA,QACvB;AAAA,UACE,MAAM;AAAA,UACN,SAAS,IAAI,QAAQ,CAAC,EAAE;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB,OAAO,EAAE,YAAY,UAAU,OAAO,MAAM;AAC3D,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,cAAc;AAAA,UACd,SAAS,KAAK,UAAU,MAAM;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;","names":["useState","messages","useState","messages"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-langgraph",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"zod": "^3.23.8"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@assistant-ui/react": "^0.5.
|
|
30
|
+
"@assistant-ui/react": "^0.5.51",
|
|
31
31
|
"@types/react": "*",
|
|
32
32
|
"react": "^18",
|
|
33
33
|
"react-hook-form": "^7.x.x"
|