@economic/agents-react 1.3.1 → 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/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
@@ -205,11 +205,6 @@ declare class PartySocket extends ReconnectingWebSocket {
205
205
  //#region src/types.d.ts
206
206
  type AgentConnectionStatus = "connecting" | "connected" | "disconnected" | "unauthorized";
207
207
  type AgentConnectionType = "agent" | "chat" | "assistant";
208
- type AgentConnectionState = {
209
- status: AgentConnectionStatus;
210
- type: AgentConnectionType;
211
- subAgentName?: string;
212
- };
213
208
  type ChatSummary = {
214
209
  name: string;
215
210
  title?: string;
@@ -231,6 +226,7 @@ type CreateChatHandler = () => Promise<string>;
231
226
  type OpenChatHandler = (chatId: string) => void;
232
227
  type DeleteChatHandler = (chatId: string) => Promise<void>;
233
228
  interface AssistantActions {
229
+ state: unknown;
234
230
  getChats: GetChatsHandler;
235
231
  createChat: CreateChatHandler;
236
232
  openChat: OpenChatHandler;
@@ -252,21 +248,26 @@ interface UseAgentOptions {
252
248
  onOpen?: (event: Event) => void;
253
249
  onClose?: (event: CloseEvent) => void;
254
250
  onError?: (event: ErrorEvent) => void;
251
+ onMessage?: (event: MessageEvent) => void;
255
252
  }
256
- declare function useAgent(options: UseAgentOptions): Omit<PartySocket, "path"> & {
257
- agent: string;
258
- name: string;
259
- path: ReadonlyArray<{
253
+ declare function useAgent(options: UseAgentOptions): {
254
+ agent: Omit<PartySocket, "path"> & {
260
255
  agent: string;
261
256
  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;
257
+ path: ReadonlyArray<{
258
+ agent: string;
259
+ name: string;
260
+ }>;
261
+ identified: boolean;
262
+ ready: Promise<void>;
263
+ state: unknown;
264
+ setState: (state: unknown) => void;
265
+ call: <T = unknown>(method: string, args?: unknown[], options?: import("agents/client").CallOptions | import("agents/client").StreamOptions) => Promise<T>;
266
+ stub: import("agents/client").UntypedAgentStub;
267
+ getHttpUrl: () => string;
268
+ };
269
+ status: AgentConnectionStatus;
270
+ type: AgentConnectionType | undefined;
270
271
  };
271
272
  //#endregion
272
273
  //#region src/useChat.d.ts
@@ -286,8 +287,8 @@ declare function useChat<ToolContext extends Record<string, unknown>>(options: U
286
287
  }>;
287
288
  identified: boolean;
288
289
  ready: Promise<void>;
289
- state: AgentConnectionState | undefined;
290
- setState: (state: AgentConnectionState) => void;
290
+ state: unknown;
291
+ setState: (state: unknown) => void;
291
292
  call: <T = unknown>(method: string, args?: unknown[], options?: import("agents/client").CallOptions | import("agents/client").StreamOptions) => Promise<T>;
292
293
  stub: import("agents/client").UntypedAgentStub;
293
294
  getHttpUrl: () => string;
@@ -311,12 +312,15 @@ declare function useChat<ToolContext extends Record<string, unknown>>(options: U
311
312
  };
312
313
  //#endregion
313
314
  //#region src/useAssistant.d.ts
314
- interface UseAssistantOptions<ToolContext extends Record<string, unknown> = Record<string, unknown>> extends Omit<UseChatOptions<ToolContext>, "actorId" | "getInitialMessages"> {}
315
+ interface UseAssistantOptions<ToolContext extends Record<string, unknown> = Record<string, unknown>> extends Omit<UseChatOptions<ToolContext>, "actorId" | "getInitialMessages"> {
316
+ initialChatId?: string;
317
+ }
315
318
  declare function useAssistant<ToolContext extends Record<string, unknown>>(options: UseAssistantOptions<ToolContext>): {
316
319
  currentChatName: string | undefined;
317
320
  chats: ChatSummary[];
318
321
  status: AgentConnectionStatus;
319
322
  assistant: {
323
+ state: unknown;
320
324
  getChats: () => Promise<ChatSummary[]>;
321
325
  createChat: () => Promise<string>;
322
326
  openChat: (chatId: string) => void;
@@ -333,8 +337,8 @@ declare function useAssistant<ToolContext extends Record<string, unknown>>(optio
333
337
  }>;
334
338
  identified: boolean;
335
339
  ready: Promise<void>;
336
- state: AgentConnectionState | undefined;
337
- setState: (state: AgentConnectionState) => void;
340
+ state: unknown;
341
+ setState: (state: unknown) => void;
338
342
  call: <T = unknown>(method: string, args?: unknown[], options?: import("agents/client").CallOptions | import("agents/client").StreamOptions) => Promise<T>;
339
343
  stub: import("agents/client").UntypedAgentStub;
340
344
  getHttpUrl: () => string;
@@ -358,4 +362,4 @@ declare function useAssistant<ToolContext extends Record<string, unknown>>(optio
358
362
  };
359
363
  };
360
364
  //#endregion
361
- export { type AgentConnectionState, type AgentConnectionStatus, type AgentConnectionType, type AssistantActions, type ChatSummary, type CreateChatHandler, type DeleteChatHandler, type GetChatsHandler, type GetMessageFeedbackHandler, type MessageFeedback, type MessageFeedbackHandler, type OpenChatHandler, useAgent, useAssistant, useChat };
365
+ export { type AgentConnectionStatus, type AgentConnectionType, type AssistantActions, type ChatSummary, type CreateChatHandler, type DeleteChatHandler, type GetChatsHandler, type GetMessageFeedbackHandler, type MessageFeedback, type MessageFeedbackHandler, type OpenChatHandler, useAgent, useAssistant, useChat };
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) {
@@ -12,28 +12,51 @@ function getTokenArgs(authToken) {
12
12
  //#endregion
13
13
  //#region src/useAgent.ts
14
14
  function useAgent(options) {
15
- const { enabled, host, agentName, actorId, name, sub, authToken, onError, onOpen, onClose } = options;
16
- return useAgent$1({
15
+ const { enabled, host, agentName, actorId, name, sub, authToken, onError, onOpen, onClose, onMessage } = options;
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
+ onMessage?.(event);
39
+ },
40
+ onError: (event) => {
41
+ setStatus("disconnected");
42
+ onError?.(event);
43
+ },
25
44
  ...getTokenArgs(authToken)
26
45
  });
46
+ return {
47
+ agent,
48
+ status,
49
+ type
50
+ };
27
51
  }
28
52
  //#endregion
29
53
  //#region src/useChat.ts
30
54
  function useChat(options) {
31
55
  const { toolContext, welcomeMessage, ...agentOptions } = options;
32
- const agent = useAgent({
56
+ const { agent, status } = useAgent({
33
57
  ...agentOptions,
34
58
  enabled: agentOptions.enabled ?? !!agentOptions.name
35
59
  });
36
- const status = agent.state?.status ?? "connecting";
37
60
  const chat = useAgentChat({
38
61
  agent,
39
62
  body: toolContext ?? {},
@@ -78,10 +101,17 @@ function useChat(options) {
78
101
  //#endregion
79
102
  //#region src/useAssistant.ts
80
103
  function useAssistant(options) {
81
- const { toolContext, welcomeMessage, ...agentOptions } = options;
82
- const [chatId, setChatId] = useState();
104
+ const { toolContext, welcomeMessage, initialChatId, ...agentOptions } = options;
105
+ const [chatId, setChatId] = useState(initialChatId);
83
106
  const [chats, setChats] = useState([]);
84
- const assistant = useAgent(agentOptions);
107
+ const [subAgentName, setSubAgentName] = useState(void 0);
108
+ const { agent: assistant, status: assistantStatus } = useAgent({
109
+ ...agentOptions,
110
+ onMessage: (event) => {
111
+ const msg = JSON.parse(event.data);
112
+ if (msg.type === "sub_agent_name") setSubAgentName(msg.subAgentName);
113
+ }
114
+ });
85
115
  const refreshChats = useCallback(async () => {
86
116
  setChats((await assistant.call("getChats")).map((chat) => {
87
117
  const c = {
@@ -92,7 +122,6 @@ function useAssistant(options) {
92
122
  return c;
93
123
  }));
94
124
  }, [assistant]);
95
- const assistantStatus = assistant.state?.status;
96
125
  useEffect(() => {
97
126
  if (assistantStatus === "connected") refreshChats().catch(console.error);
98
127
  }, [assistantStatus, refreshChats]);
@@ -114,12 +143,13 @@ function useAssistant(options) {
114
143
  setChatId(void 0);
115
144
  await refreshChats();
116
145
  };
117
- const isChatReady = !!chatId && assistant.state?.status === "connected";
146
+ const isChatEnabled = !!chatId && !!subAgentName;
147
+ const isChatReady = isChatEnabled && assistantStatus === "connected";
118
148
  const chat = useChat({
119
149
  ...agentOptions,
120
- enabled: !!chatId,
121
- sub: chatId ? [{
122
- agent: assistant.state?.subAgentName ?? "",
150
+ enabled: isChatEnabled,
151
+ sub: isChatEnabled ? [{
152
+ agent: subAgentName,
123
153
  name: chatId
124
154
  }] : void 0,
125
155
  getInitialMessages: isChatReady ? void 0 : null,
@@ -129,8 +159,9 @@ function useAssistant(options) {
129
159
  return {
130
160
  currentChatName: chatId,
131
161
  chats,
132
- status: (chatId ? chat.agent.state?.status : assistant.state?.status) ?? "connecting",
162
+ status: isChatEnabled && chat.status !== "connecting" ? chat.status : assistantStatus,
133
163
  assistant: {
164
+ state: assistant.state,
134
165
  getChats,
135
166
  createChat,
136
167
  openChat,
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.4",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist"