@economic/agents-react 1.3.1 → 1.3.3

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/README.md CHANGED
@@ -196,3 +196,5 @@ The package also exports the handler types `AssistantActions`, `GetChatsHandler`
196
196
  ## Authentication
197
197
 
198
198
  Pass a JWT as `authToken`. It is sent both as an `Authorization: Bearer …` header and as a WebSocket subprotocol (`["bearer", token]`), matching the server-side [`getJwtAuthConfig`](../agents/README.md#authentication). When verification fails, the connection status becomes `"unauthorized"`.
199
+
200
+ .
package/dist/index.d.mts CHANGED
@@ -253,20 +253,24 @@ interface UseAgentOptions {
253
253
  onClose?: (event: CloseEvent) => void;
254
254
  onError?: (event: ErrorEvent) => void;
255
255
  }
256
- declare function useAgent(options: UseAgentOptions): Omit<PartySocket, "path"> & {
257
- agent: string;
258
- name: string;
259
- path: ReadonlyArray<{
256
+ declare function useAgent(options: UseAgentOptions): {
257
+ agent: Omit<PartySocket, "path"> & {
260
258
  agent: string;
261
259
  name: string;
262
- }>;
263
- identified: boolean;
264
- ready: Promise<void>;
265
- state: AgentConnectionState | undefined;
266
- setState: (state: AgentConnectionState) => void;
267
- call: <T = unknown>(method: string, args?: unknown[], options?: import("agents/client").CallOptions | import("agents/client").StreamOptions) => Promise<T>;
268
- stub: import("agents/client").UntypedAgentStub;
269
- getHttpUrl: () => string;
260
+ path: ReadonlyArray<{
261
+ agent: string;
262
+ name: string;
263
+ }>;
264
+ identified: boolean;
265
+ ready: Promise<void>;
266
+ state: AgentConnectionState | undefined;
267
+ setState: (state: AgentConnectionState) => void;
268
+ call: <T = unknown>(method: string, args?: unknown[], options?: import("agents/client").CallOptions | import("agents/client").StreamOptions) => Promise<T>;
269
+ stub: import("agents/client").UntypedAgentStub;
270
+ getHttpUrl: () => string;
271
+ };
272
+ status: AgentConnectionStatus;
273
+ type: AgentConnectionType | undefined;
270
274
  };
271
275
  //#endregion
272
276
  //#region src/useChat.d.ts
@@ -311,7 +315,9 @@ declare function useChat<ToolContext extends Record<string, unknown>>(options: U
311
315
  };
312
316
  //#endregion
313
317
  //#region src/useAssistant.d.ts
314
- interface UseAssistantOptions<ToolContext extends Record<string, unknown> = Record<string, unknown>> extends Omit<UseChatOptions<ToolContext>, "actorId" | "getInitialMessages"> {}
318
+ interface UseAssistantOptions<ToolContext extends Record<string, unknown> = Record<string, unknown>> extends Omit<UseChatOptions<ToolContext>, "actorId" | "getInitialMessages"> {
319
+ initialChatId?: string;
320
+ }
315
321
  declare function useAssistant<ToolContext extends Record<string, unknown>>(options: UseAssistantOptions<ToolContext>): {
316
322
  currentChatName: string | undefined;
317
323
  chats: ChatSummary[];
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { useAgent as useAgent$1 } from "agents/react";
2
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useAgent as useAgent$1 } from "agents/react";
3
3
  import { useAgentChat } from "@cloudflare/ai-chat/react";
4
4
  //#region src/util.ts
5
5
  function getTokenArgs(authToken) {
@@ -13,27 +13,49 @@ function getTokenArgs(authToken) {
13
13
  //#region src/useAgent.ts
14
14
  function useAgent(options) {
15
15
  const { enabled, host, agentName, actorId, name, sub, authToken, onError, onOpen, onClose } = options;
16
- return useAgent$1({
16
+ const [type, setType] = useState(void 0);
17
+ const [status, setStatus] = useState("connecting");
18
+ const agent = useAgent$1({
17
19
  enabled,
18
20
  host,
19
21
  agent: agentName,
20
22
  name: actorId ? `${actorId}:${name}` : name,
21
23
  sub,
22
- onOpen,
23
- onClose,
24
- onError,
24
+ onOpen: (event) => {
25
+ onOpen?.(event);
26
+ },
27
+ onClose: (event) => {
28
+ if (event.code >= 3e3) setStatus("unauthorized");
29
+ else setStatus("disconnected");
30
+ onClose?.(event);
31
+ },
32
+ onMessage: (event) => {
33
+ const msg = JSON.parse(event.data);
34
+ if (msg.type === "connection_status") {
35
+ if (msg.status === "unauthorized") agent.close(3e3);
36
+ setStatus(msg.status);
37
+ } else if (msg.type === "agent_type") setType(msg.agentType);
38
+ },
39
+ onError: (event) => {
40
+ setStatus("disconnected");
41
+ onError?.(event);
42
+ },
25
43
  ...getTokenArgs(authToken)
26
44
  });
45
+ return {
46
+ agent,
47
+ status,
48
+ type
49
+ };
27
50
  }
28
51
  //#endregion
29
52
  //#region src/useChat.ts
30
53
  function useChat(options) {
31
54
  const { toolContext, welcomeMessage, ...agentOptions } = options;
32
- const agent = useAgent({
55
+ const { agent, status } = useAgent({
33
56
  ...agentOptions,
34
57
  enabled: agentOptions.enabled ?? !!agentOptions.name
35
58
  });
36
- const status = agent.state?.status ?? "connecting";
37
59
  const chat = useAgentChat({
38
60
  agent,
39
61
  body: toolContext ?? {},
@@ -78,10 +100,10 @@ function useChat(options) {
78
100
  //#endregion
79
101
  //#region src/useAssistant.ts
80
102
  function useAssistant(options) {
81
- const { toolContext, welcomeMessage, ...agentOptions } = options;
82
- const [chatId, setChatId] = useState();
103
+ const { toolContext, welcomeMessage, initialChatId, ...agentOptions } = options;
104
+ const [chatId, setChatId] = useState(initialChatId);
83
105
  const [chats, setChats] = useState([]);
84
- const assistant = useAgent(agentOptions);
106
+ const { agent: assistant, status: assistantStatus } = useAgent(agentOptions);
85
107
  const refreshChats = useCallback(async () => {
86
108
  setChats((await assistant.call("getChats")).map((chat) => {
87
109
  const c = {
@@ -92,7 +114,6 @@ function useAssistant(options) {
92
114
  return c;
93
115
  }));
94
116
  }, [assistant]);
95
- const assistantStatus = assistant.state?.status;
96
117
  useEffect(() => {
97
118
  if (assistantStatus === "connected") refreshChats().catch(console.error);
98
119
  }, [assistantStatus, refreshChats]);
@@ -114,12 +135,14 @@ function useAssistant(options) {
114
135
  setChatId(void 0);
115
136
  await refreshChats();
116
137
  };
117
- const isChatReady = !!chatId && assistant.state?.status === "connected";
138
+ const subAgentName = assistant.state?.subAgentName ?? "";
139
+ const isChatEnabled = !!chatId && !!subAgentName;
140
+ const isChatReady = isChatEnabled && assistant.state?.status === "connected";
118
141
  const chat = useChat({
119
142
  ...agentOptions,
120
- enabled: !!chatId,
121
- sub: chatId ? [{
122
- agent: assistant.state?.subAgentName ?? "",
143
+ enabled: isChatEnabled,
144
+ sub: isChatEnabled ? [{
145
+ agent: subAgentName,
123
146
  name: chatId
124
147
  }] : void 0,
125
148
  getInitialMessages: isChatReady ? void 0 : null,
@@ -129,7 +152,7 @@ function useAssistant(options) {
129
152
  return {
130
153
  currentChatName: chatId,
131
154
  chats,
132
- status: (chatId ? chat.agent.state?.status : assistant.state?.status) ?? "connecting",
155
+ status: isChatEnabled && chat.status !== "connecting" ? chat.status : assistantStatus,
133
156
  assistant: {
134
157
  getChats,
135
158
  createChat,
package/dist/v1.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { useAgent } from "agents/react";
2
1
  import React from "react";
2
+ import { useAgent } from "agents/react";
3
3
  import { useAgentChat } from "@cloudflare/ai-chat/react";
4
4
  //#region src/v1/index.ts
5
5
  function agentNameToKebab(name) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@economic/agents-react",
3
- "version": "1.3.1",
3
+ "version": "1.3.3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist"