@base44-preview/sdk 0.7.0-pr.26.ab75236 → 0.7.0-pr.27.2a9d388
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 +100 -549
- package/dist/client.d.ts +28 -55
- package/dist/client.js +31 -4
- package/dist/index.d.ts +0 -1
- package/dist/modules/agents.d.ts +14 -83
- package/dist/modules/agents.js +47 -243
- package/dist/modules/agents.types.d.ts +44 -0
- package/dist/modules/agents.types.js +1 -0
- package/dist/modules/auth.js +1 -0
- package/dist/utils/axios-client.d.ts +2 -1
- package/dist/utils/axios-client.js +2 -1
- package/dist/utils/socket-utils.d.ts +47 -0
- package/dist/utils/socket-utils.js +85 -0
- package/package.json +3 -2
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export type CreateClientOptions = {
|
|
2
|
+
onError?: (error: Error) => void;
|
|
3
|
+
};
|
|
2
4
|
/**
|
|
3
5
|
* Create a Base44 client instance
|
|
4
6
|
* @param {Object} config - Client configuration
|
|
@@ -7,7 +9,6 @@ import { AgentsModuleConfig } from "./modules/agents.js";
|
|
|
7
9
|
* @param {string} [config.token] - Authentication token
|
|
8
10
|
* @param {string} [config.serviceToken] - Service role authentication token
|
|
9
11
|
* @param {boolean} [config.requiresAuth=false] - Whether the app requires authentication
|
|
10
|
-
* @param {AgentsModuleConfig} [config.agents] - Configuration for agents module
|
|
11
12
|
* @returns {Object} Base44 client instance
|
|
12
13
|
*/
|
|
13
14
|
export declare function createClient(config: {
|
|
@@ -16,7 +17,7 @@ export declare function createClient(config: {
|
|
|
16
17
|
token?: string;
|
|
17
18
|
serviceToken?: string;
|
|
18
19
|
requiresAuth?: boolean;
|
|
19
|
-
|
|
20
|
+
options?: CreateClientOptions;
|
|
20
21
|
}): {
|
|
21
22
|
/**
|
|
22
23
|
* Set authentication token for all requests
|
|
@@ -42,19 +43,12 @@ export declare function createClient(config: {
|
|
|
42
43
|
invoke(functionName: string, data: Record<string, any>): Promise<import("axios").AxiosResponse<any, any>>;
|
|
43
44
|
};
|
|
44
45
|
agents: {
|
|
45
|
-
|
|
46
|
-
getConversation(conversationId: string)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
subscribeToConversation(conversationId: string, onUpdate: (conversation: import("./modules/agents.js").AgentConversation) => void): () => void;
|
|
52
|
-
getWebSocketStatus(): {
|
|
53
|
-
enabled: boolean;
|
|
54
|
-
connected: boolean;
|
|
55
|
-
};
|
|
56
|
-
connectWebSocket(): Promise<void>;
|
|
57
|
-
disconnectWebSocket(): void;
|
|
46
|
+
getConversations: () => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
47
|
+
getConversation: (conversationId: string) => Promise<import("./modules/agents.types.js").AgentConversation | undefined>;
|
|
48
|
+
listConversations: (filterParams: any) => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
49
|
+
createConversation: (conversation: any) => Promise<import("./modules/agents.types.js").AgentConversation>;
|
|
50
|
+
addMessage: (conversation: any, message: any) => Promise<import("./modules/agents.types.js").AgentMessage>;
|
|
51
|
+
subscribeToConversation: (conversationId: string, onUpdate: any) => () => void;
|
|
58
52
|
};
|
|
59
53
|
};
|
|
60
54
|
entities: {};
|
|
@@ -75,19 +69,12 @@ export declare function createClient(config: {
|
|
|
75
69
|
invoke(functionName: string, data: Record<string, any>): Promise<import("axios").AxiosResponse<any, any>>;
|
|
76
70
|
};
|
|
77
71
|
agents: {
|
|
78
|
-
|
|
79
|
-
getConversation(conversationId: string)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
subscribeToConversation(conversationId: string, onUpdate: (conversation: import("./modules/agents.js").AgentConversation) => void): () => void;
|
|
85
|
-
getWebSocketStatus(): {
|
|
86
|
-
enabled: boolean;
|
|
87
|
-
connected: boolean;
|
|
88
|
-
};
|
|
89
|
-
connectWebSocket(): Promise<void>;
|
|
90
|
-
disconnectWebSocket(): void;
|
|
72
|
+
getConversations: () => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
73
|
+
getConversation: (conversationId: string) => Promise<import("./modules/agents.types.js").AgentConversation | undefined>;
|
|
74
|
+
listConversations: (filterParams: any) => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
75
|
+
createConversation: (conversation: any) => Promise<import("./modules/agents.types.js").AgentConversation>;
|
|
76
|
+
addMessage: (conversation: any, message: any) => Promise<import("./modules/agents.types.js").AgentMessage>;
|
|
77
|
+
subscribeToConversation: (conversationId: string, onUpdate: any) => () => void;
|
|
91
78
|
};
|
|
92
79
|
};
|
|
93
80
|
export declare function createClientFromRequest(request: Request): {
|
|
@@ -115,19 +102,12 @@ export declare function createClientFromRequest(request: Request): {
|
|
|
115
102
|
invoke(functionName: string, data: Record<string, any>): Promise<import("axios").AxiosResponse<any, any>>;
|
|
116
103
|
};
|
|
117
104
|
agents: {
|
|
118
|
-
|
|
119
|
-
getConversation(conversationId: string)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
subscribeToConversation(conversationId: string, onUpdate: (conversation: import("./modules/agents.js").AgentConversation) => void): () => void;
|
|
125
|
-
getWebSocketStatus(): {
|
|
126
|
-
enabled: boolean;
|
|
127
|
-
connected: boolean;
|
|
128
|
-
};
|
|
129
|
-
connectWebSocket(): Promise<void>;
|
|
130
|
-
disconnectWebSocket(): void;
|
|
105
|
+
getConversations: () => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
106
|
+
getConversation: (conversationId: string) => Promise<import("./modules/agents.types.js").AgentConversation | undefined>;
|
|
107
|
+
listConversations: (filterParams: any) => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
108
|
+
createConversation: (conversation: any) => Promise<import("./modules/agents.types.js").AgentConversation>;
|
|
109
|
+
addMessage: (conversation: any, message: any) => Promise<import("./modules/agents.types.js").AgentMessage>;
|
|
110
|
+
subscribeToConversation: (conversationId: string, onUpdate: any) => () => void;
|
|
131
111
|
};
|
|
132
112
|
};
|
|
133
113
|
entities: {};
|
|
@@ -148,18 +128,11 @@ export declare function createClientFromRequest(request: Request): {
|
|
|
148
128
|
invoke(functionName: string, data: Record<string, any>): Promise<import("axios").AxiosResponse<any, any>>;
|
|
149
129
|
};
|
|
150
130
|
agents: {
|
|
151
|
-
|
|
152
|
-
getConversation(conversationId: string)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
subscribeToConversation(conversationId: string, onUpdate: (conversation: import("./modules/agents.js").AgentConversation) => void): () => void;
|
|
158
|
-
getWebSocketStatus(): {
|
|
159
|
-
enabled: boolean;
|
|
160
|
-
connected: boolean;
|
|
161
|
-
};
|
|
162
|
-
connectWebSocket(): Promise<void>;
|
|
163
|
-
disconnectWebSocket(): void;
|
|
131
|
+
getConversations: () => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
132
|
+
getConversation: (conversationId: string) => Promise<import("./modules/agents.types.js").AgentConversation | undefined>;
|
|
133
|
+
listConversations: (filterParams: any) => Promise<import("./modules/agents.types.js").AgentConversation[]>;
|
|
134
|
+
createConversation: (conversation: any) => Promise<import("./modules/agents.types.js").AgentConversation>;
|
|
135
|
+
addMessage: (conversation: any, message: any) => Promise<import("./modules/agents.types.js").AgentMessage>;
|
|
136
|
+
subscribeToConversation: (conversationId: string, onUpdate: any) => () => void;
|
|
164
137
|
};
|
|
165
138
|
};
|
package/dist/client.js
CHANGED
|
@@ -6,6 +6,7 @@ import { createSsoModule } from "./modules/sso.js";
|
|
|
6
6
|
import { getAccessToken } from "./utils/auth-utils.js";
|
|
7
7
|
import { createFunctionsModule } from "./modules/functions.js";
|
|
8
8
|
import { createAgentsModule } from "./modules/agents.js";
|
|
9
|
+
import { RoomsSocket } from "./utils/socket-utils.js";
|
|
9
10
|
/**
|
|
10
11
|
* Create a Base44 client instance
|
|
11
12
|
* @param {Object} config - Client configuration
|
|
@@ -14,11 +15,20 @@ import { createAgentsModule } from "./modules/agents.js";
|
|
|
14
15
|
* @param {string} [config.token] - Authentication token
|
|
15
16
|
* @param {string} [config.serviceToken] - Service role authentication token
|
|
16
17
|
* @param {boolean} [config.requiresAuth=false] - Whether the app requires authentication
|
|
17
|
-
* @param {AgentsModuleConfig} [config.agents] - Configuration for agents module
|
|
18
18
|
* @returns {Object} Base44 client instance
|
|
19
19
|
*/
|
|
20
20
|
export function createClient(config) {
|
|
21
|
-
const { serverUrl = "https://base44.app", appId, token, serviceToken, requiresAuth = false,
|
|
21
|
+
const { serverUrl = "https://base44.app", appId, token, serviceToken, requiresAuth = false, options, } = config;
|
|
22
|
+
const socketConfig = {
|
|
23
|
+
serverUrl,
|
|
24
|
+
mountPath: "/ws-user-apps/socket.io/",
|
|
25
|
+
transports: ["websocket"],
|
|
26
|
+
appId,
|
|
27
|
+
token,
|
|
28
|
+
};
|
|
29
|
+
const socket = RoomsSocket({
|
|
30
|
+
config: socketConfig,
|
|
31
|
+
});
|
|
22
32
|
const axiosClient = createAxiosClient({
|
|
23
33
|
baseURL: `${serverUrl}/api`,
|
|
24
34
|
headers: {
|
|
@@ -28,6 +38,7 @@ export function createClient(config) {
|
|
|
28
38
|
requiresAuth,
|
|
29
39
|
appId,
|
|
30
40
|
serverUrl,
|
|
41
|
+
onError: options === null || options === void 0 ? void 0 : options.onError,
|
|
31
42
|
});
|
|
32
43
|
const functionsAxiosClient = createAxiosClient({
|
|
33
44
|
baseURL: `${serverUrl}/api`,
|
|
@@ -39,6 +50,7 @@ export function createClient(config) {
|
|
|
39
50
|
appId,
|
|
40
51
|
serverUrl,
|
|
41
52
|
interceptResponses: false,
|
|
53
|
+
onError: options === null || options === void 0 ? void 0 : options.onError,
|
|
42
54
|
});
|
|
43
55
|
const serviceRoleAxiosClient = createAxiosClient({
|
|
44
56
|
baseURL: `${serverUrl}/api`,
|
|
@@ -48,6 +60,7 @@ export function createClient(config) {
|
|
|
48
60
|
token: serviceToken,
|
|
49
61
|
serverUrl,
|
|
50
62
|
appId,
|
|
63
|
+
onError: options === null || options === void 0 ? void 0 : options.onError,
|
|
51
64
|
});
|
|
52
65
|
const serviceRoleFunctionsAxiosClient = createAxiosClient({
|
|
53
66
|
baseURL: `${serverUrl}/api`,
|
|
@@ -64,14 +77,22 @@ export function createClient(config) {
|
|
|
64
77
|
integrations: createIntegrationsModule(axiosClient, appId),
|
|
65
78
|
auth: createAuthModule(axiosClient, functionsAxiosClient, appId),
|
|
66
79
|
functions: createFunctionsModule(functionsAxiosClient, appId),
|
|
67
|
-
agents: createAgentsModule(
|
|
80
|
+
agents: createAgentsModule({
|
|
81
|
+
axios: axiosClient,
|
|
82
|
+
socket,
|
|
83
|
+
appId,
|
|
84
|
+
}),
|
|
68
85
|
};
|
|
69
86
|
const serviceRoleModules = {
|
|
70
87
|
entities: createEntitiesModule(serviceRoleAxiosClient, appId),
|
|
71
88
|
integrations: createIntegrationsModule(serviceRoleAxiosClient, appId),
|
|
72
89
|
sso: createSsoModule(serviceRoleAxiosClient, appId, token),
|
|
73
90
|
functions: createFunctionsModule(serviceRoleFunctionsAxiosClient, appId),
|
|
74
|
-
agents: createAgentsModule(
|
|
91
|
+
agents: createAgentsModule({
|
|
92
|
+
axios: serviceRoleAxiosClient,
|
|
93
|
+
socket,
|
|
94
|
+
appId,
|
|
95
|
+
}),
|
|
75
96
|
};
|
|
76
97
|
// Always try to get token from localStorage or URL parameters
|
|
77
98
|
if (typeof window !== "undefined") {
|
|
@@ -79,6 +100,9 @@ export function createClient(config) {
|
|
|
79
100
|
const accessToken = token || getAccessToken();
|
|
80
101
|
if (accessToken) {
|
|
81
102
|
userModules.auth.setToken(accessToken);
|
|
103
|
+
socket.updateConfig({
|
|
104
|
+
token: accessToken,
|
|
105
|
+
});
|
|
82
106
|
}
|
|
83
107
|
}
|
|
84
108
|
// If authentication is required, verify token and redirect to login if needed
|
|
@@ -106,6 +130,9 @@ export function createClient(config) {
|
|
|
106
130
|
*/
|
|
107
131
|
setToken(newToken) {
|
|
108
132
|
userModules.auth.setToken(newToken);
|
|
133
|
+
socket.updateConfig({
|
|
134
|
+
token: newToken,
|
|
135
|
+
});
|
|
109
136
|
},
|
|
110
137
|
/**
|
|
111
138
|
* Get current configuration
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { createClient, createClientFromRequest } from "./client.js";
|
|
2
2
|
import { Base44Error } from "./utils/axios-client.js";
|
|
3
3
|
import { getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl } from "./utils/auth-utils.js";
|
|
4
|
-
export type { Message, AgentConversation, CreateConversationPayload, UpdateConversationPayload, FilterParams, AgentsModuleConfig, AgentsModule, } from "./modules/agents.js";
|
|
5
4
|
export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, };
|
package/dist/modules/agents.d.ts
CHANGED
|
@@ -1,85 +1,16 @@
|
|
|
1
|
+
import { RoomsSocket } from "../utils/socket-utils.js";
|
|
2
|
+
import { AgentConversation, AgentMessage } from "./agents.types.js";
|
|
1
3
|
import { AxiosInstance } from "axios";
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
messages: Message[];
|
|
15
|
-
metadata: Record<string, any>;
|
|
16
|
-
created_at?: string;
|
|
17
|
-
updated_at?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface CreateConversationPayload {
|
|
20
|
-
agent_name: string;
|
|
21
|
-
metadata?: Record<string, any>;
|
|
22
|
-
}
|
|
23
|
-
export interface UpdateConversationPayload {
|
|
24
|
-
metadata?: Record<string, any>;
|
|
25
|
-
}
|
|
26
|
-
export interface FilterParams {
|
|
27
|
-
query?: Record<string, any>;
|
|
28
|
-
sort?: Record<string, 1 | -1>;
|
|
29
|
-
limit?: number;
|
|
30
|
-
skip?: number;
|
|
31
|
-
}
|
|
32
|
-
export interface AgentsModuleConfig {
|
|
33
|
-
enableWebSocket?: boolean;
|
|
34
|
-
socketUrl?: string;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Create agents module for managing AI agent conversations
|
|
38
|
-
*/
|
|
39
|
-
export declare function createAgentsModule(axiosClient: AxiosInstance, appId: string, config?: AgentsModuleConfig): {
|
|
40
|
-
/**
|
|
41
|
-
* List all conversations for the current user
|
|
42
|
-
*/
|
|
43
|
-
listConversations(filterParams?: FilterParams): Promise<AgentConversation[]>;
|
|
44
|
-
/**
|
|
45
|
-
* Get a specific conversation by ID
|
|
46
|
-
*/
|
|
47
|
-
getConversation(conversationId: string): Promise<AgentConversation>;
|
|
48
|
-
/**
|
|
49
|
-
* Create a new agent conversation
|
|
50
|
-
*/
|
|
51
|
-
createConversation(payload: CreateConversationPayload): Promise<AgentConversation>;
|
|
52
|
-
/**
|
|
53
|
-
* Update conversation metadata
|
|
54
|
-
*/
|
|
55
|
-
updateConversation(conversationId: string, payload: UpdateConversationPayload): Promise<AgentConversation>;
|
|
56
|
-
/**
|
|
57
|
-
* Send a message to an agent and get response
|
|
58
|
-
*/
|
|
59
|
-
sendMessage(conversationId: string, message: Omit<Message, "id">): Promise<Message>;
|
|
60
|
-
/**
|
|
61
|
-
* Delete a message from a conversation
|
|
62
|
-
*/
|
|
63
|
-
deleteMessage(conversationId: string, messageId: string): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Subscribe to real-time updates for a conversation
|
|
66
|
-
* Requires WebSocket to be enabled in config
|
|
67
|
-
*/
|
|
68
|
-
subscribeToConversation(conversationId: string, onUpdate: (conversation: AgentConversation) => void): () => void;
|
|
69
|
-
/**
|
|
70
|
-
* Get WebSocket connection status
|
|
71
|
-
*/
|
|
72
|
-
getWebSocketStatus(): {
|
|
73
|
-
enabled: boolean;
|
|
74
|
-
connected: boolean;
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* Manually connect WebSocket
|
|
78
|
-
*/
|
|
79
|
-
connectWebSocket(): Promise<void>;
|
|
80
|
-
/**
|
|
81
|
-
* Disconnect WebSocket
|
|
82
|
-
*/
|
|
83
|
-
disconnectWebSocket(): void;
|
|
4
|
+
export type AgentsModuleConfig = {
|
|
5
|
+
axios: AxiosInstance;
|
|
6
|
+
socket: ReturnType<typeof RoomsSocket>;
|
|
7
|
+
appId: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function createAgentsModule({ axios, socket, appId, }: AgentsModuleConfig): {
|
|
10
|
+
getConversations: () => Promise<AgentConversation[]>;
|
|
11
|
+
getConversation: (conversationId: string) => Promise<AgentConversation | undefined>;
|
|
12
|
+
listConversations: (filterParams: any) => Promise<AgentConversation[]>;
|
|
13
|
+
createConversation: (conversation: any) => Promise<AgentConversation>;
|
|
14
|
+
addMessage: (conversation: any, message: any) => Promise<AgentMessage>;
|
|
15
|
+
subscribeToConversation: (conversationId: string, onUpdate: any) => () => void;
|
|
84
16
|
};
|
|
85
|
-
export type AgentsModule = ReturnType<typeof createAgentsModule>;
|
package/dist/modules/agents.js
CHANGED
|
@@ -1,251 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
this.token = token;
|
|
14
|
-
}
|
|
15
|
-
connect() {
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
var _a;
|
|
18
|
-
// Check if WebSocket is available (browser environment)
|
|
19
|
-
if (typeof WebSocket === "undefined") {
|
|
20
|
-
reject(new Error("WebSocket is not available in this environment"));
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
if (((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
|
|
24
|
-
resolve();
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
const wsUrl = new URL(this.socketUrl);
|
|
29
|
-
wsUrl.searchParams.set("appId", this.appId);
|
|
30
|
-
if (this.token) {
|
|
31
|
-
wsUrl.searchParams.set("token", this.token);
|
|
32
|
-
}
|
|
33
|
-
this.socket = new WebSocket(wsUrl.toString());
|
|
34
|
-
this.socket.onopen = () => {
|
|
35
|
-
this.reconnectAttempts = 0;
|
|
36
|
-
resolve();
|
|
37
|
-
};
|
|
38
|
-
this.socket.onmessage = (event) => {
|
|
39
|
-
try {
|
|
40
|
-
const data = JSON.parse(event.data);
|
|
41
|
-
this.handleMessage(data);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
console.error("Failed to parse WebSocket message:", error);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
this.socket.onclose = () => {
|
|
48
|
-
this.attemptReconnect();
|
|
49
|
-
};
|
|
50
|
-
this.socket.onerror = (error) => {
|
|
51
|
-
console.error("WebSocket error:", error);
|
|
52
|
-
reject(error);
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
reject(error);
|
|
57
|
-
}
|
|
1
|
+
export function createAgentsModule({ axios, socket, appId, }) {
|
|
2
|
+
let currentConversation = null;
|
|
3
|
+
const baseURL = `/apps/${appId}/agents`;
|
|
4
|
+
const getConversations = () => {
|
|
5
|
+
return axios.get(`${baseURL}/conversations`);
|
|
6
|
+
};
|
|
7
|
+
const getConversation = (conversationId) => {
|
|
8
|
+
return axios.get(`${baseURL}/conversations/${conversationId}`);
|
|
9
|
+
};
|
|
10
|
+
const listConversations = (filterParams) => {
|
|
11
|
+
return axios.get(`${baseURL}/conversations`, {
|
|
12
|
+
params: filterParams,
|
|
58
13
|
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
listeners.forEach((callback) => callback(parsedData));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
attemptReconnect() {
|
|
73
|
-
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
74
|
-
console.error("Max reconnection attempts reached");
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
this.reconnectAttempts++;
|
|
78
|
-
const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
79
|
-
setTimeout(() => {
|
|
80
|
-
console.log(`Attempting to reconnect (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
|
|
81
|
-
this.connect().catch((error) => {
|
|
82
|
-
console.error("Reconnection failed:", error);
|
|
83
|
-
});
|
|
84
|
-
}, delay);
|
|
85
|
-
}
|
|
86
|
-
subscribe(room, callback) {
|
|
87
|
-
if (!this.listeners.has(room)) {
|
|
88
|
-
this.listeners.set(room, new Set());
|
|
89
|
-
}
|
|
90
|
-
this.listeners.get(room).add(callback);
|
|
91
|
-
// Send subscription message if connected
|
|
92
|
-
if (typeof WebSocket !== "undefined" &&
|
|
93
|
-
this.socket &&
|
|
94
|
-
this.socket.readyState === WebSocket.OPEN &&
|
|
95
|
-
this.socket.send) {
|
|
96
|
-
this.socket.send(JSON.stringify({
|
|
97
|
-
type: "subscribe",
|
|
98
|
-
room: room,
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
// Return unsubscribe function
|
|
102
|
-
return () => {
|
|
103
|
-
const roomListeners = this.listeners.get(room);
|
|
104
|
-
if (roomListeners) {
|
|
105
|
-
roomListeners.delete(callback);
|
|
106
|
-
if (roomListeners.size === 0) {
|
|
107
|
-
this.listeners.delete(room);
|
|
108
|
-
// Send unsubscribe message if connected
|
|
109
|
-
if (typeof WebSocket !== "undefined" &&
|
|
110
|
-
this.socket &&
|
|
111
|
-
this.socket.readyState === WebSocket.OPEN &&
|
|
112
|
-
this.socket.send) {
|
|
113
|
-
this.socket.send(JSON.stringify({
|
|
114
|
-
type: "unsubscribe",
|
|
115
|
-
room: room,
|
|
116
|
-
}));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
disconnect() {
|
|
123
|
-
if (this.socket) {
|
|
124
|
-
this.socket.close();
|
|
125
|
-
this.socket = null;
|
|
14
|
+
};
|
|
15
|
+
const createConversation = (conversation) => {
|
|
16
|
+
return axios.post(`${baseURL}/conversations`, conversation);
|
|
17
|
+
};
|
|
18
|
+
const addMessage = (conversation, message) => {
|
|
19
|
+
// this whole trick with current conversation so that we can call the onUpdateModel with the latest messages
|
|
20
|
+
let convLatestMessages = null;
|
|
21
|
+
if (currentConversation && currentConversation.id === conversation.id) {
|
|
22
|
+
convLatestMessages = currentConversation.messages;
|
|
126
23
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
var _a;
|
|
131
|
-
if (typeof WebSocket === "undefined") {
|
|
132
|
-
return false;
|
|
24
|
+
else {
|
|
25
|
+
currentConversation = conversation;
|
|
26
|
+
convLatestMessages = conversation.messages;
|
|
133
27
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// Extract token from axios client if available
|
|
148
|
-
const token = (_b = (_a = axiosClient.defaults.headers.common) === null || _a === void 0 ? void 0 : _a.Authorization) === null || _b === void 0 ? void 0 : _b.toString().replace("Bearer ", "");
|
|
149
|
-
webSocketManager = new AgentWebSocketManager(socketUrl, appId, token);
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
/**
|
|
153
|
-
* List all conversations for the current user
|
|
154
|
-
*/
|
|
155
|
-
async listConversations(filterParams) {
|
|
156
|
-
const response = await axiosClient.get(`/apps/${appId}/agents/conversations`, {
|
|
157
|
-
params: filterParams,
|
|
158
|
-
});
|
|
159
|
-
return response.data;
|
|
160
|
-
},
|
|
161
|
-
/**
|
|
162
|
-
* Get a specific conversation by ID
|
|
163
|
-
*/
|
|
164
|
-
async getConversation(conversationId) {
|
|
165
|
-
const response = await axiosClient.get(`/apps/${appId}/agents/conversations/${conversationId}`);
|
|
166
|
-
return response.data;
|
|
167
|
-
},
|
|
168
|
-
/**
|
|
169
|
-
* Create a new agent conversation
|
|
170
|
-
*/
|
|
171
|
-
async createConversation(payload) {
|
|
172
|
-
const response = await axiosClient.post(`/apps/${appId}/agents/conversations`, payload);
|
|
173
|
-
return response.data;
|
|
174
|
-
},
|
|
175
|
-
/**
|
|
176
|
-
* Update conversation metadata
|
|
177
|
-
*/
|
|
178
|
-
async updateConversation(conversationId, payload) {
|
|
179
|
-
const response = await axiosClient.put(`/apps/${appId}/agents/conversations/${conversationId}`, payload);
|
|
180
|
-
return response.data;
|
|
181
|
-
},
|
|
182
|
-
/**
|
|
183
|
-
* Send a message to an agent and get response
|
|
184
|
-
*/
|
|
185
|
-
async sendMessage(conversationId, message) {
|
|
186
|
-
// Update current conversation for WebSocket tracking
|
|
187
|
-
if ((currentConversation === null || currentConversation === void 0 ? void 0 : currentConversation.id) === conversationId) {
|
|
188
|
-
currentConversation.messages = [
|
|
189
|
-
...currentConversation.messages,
|
|
190
|
-
{ ...message, id: "temp-" + Date.now() },
|
|
191
|
-
];
|
|
192
|
-
}
|
|
193
|
-
const response = await axiosClient.post(`/apps/${appId}/agents/conversations/${conversationId}/messages`, message);
|
|
194
|
-
return response.data;
|
|
195
|
-
},
|
|
196
|
-
/**
|
|
197
|
-
* Delete a message from a conversation
|
|
198
|
-
*/
|
|
199
|
-
async deleteMessage(conversationId, messageId) {
|
|
200
|
-
await axiosClient.delete(`/apps/${appId}/agents/conversations/${conversationId}/messages/${messageId}`);
|
|
201
|
-
},
|
|
202
|
-
/**
|
|
203
|
-
* Subscribe to real-time updates for a conversation
|
|
204
|
-
* Requires WebSocket to be enabled in config
|
|
205
|
-
*/
|
|
206
|
-
subscribeToConversation(conversationId, onUpdate) {
|
|
207
|
-
if (!webSocketManager) {
|
|
208
|
-
throw new Error("WebSocket is not enabled. Set enableWebSocket: true in agents config");
|
|
209
|
-
}
|
|
210
|
-
// Connect WebSocket if not already connected
|
|
211
|
-
if (!webSocketManager.isConnected()) {
|
|
212
|
-
webSocketManager.connect().catch((error) => {
|
|
213
|
-
console.error("Failed to connect WebSocket:", error);
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
return webSocketManager.subscribe(`/agent-conversations/${conversationId}`, (data) => {
|
|
217
|
-
// Update current conversation reference
|
|
218
|
-
if (data.id === conversationId) {
|
|
28
|
+
conversation.messages = [...convLatestMessages, message];
|
|
29
|
+
socket.handlers.update_model({
|
|
30
|
+
room: `/agent-conversations/${conversation.id}`,
|
|
31
|
+
data: JSON.stringify(conversation),
|
|
32
|
+
});
|
|
33
|
+
return axios.post(`${baseURL}/conversations/${conversation.id}/messages`, message);
|
|
34
|
+
};
|
|
35
|
+
const subscribeToConversation = (conversationId, onUpdate) => {
|
|
36
|
+
return socket.subscribeToRoom(`/agent-conversations/${conversationId}`, {
|
|
37
|
+
connect: () => { },
|
|
38
|
+
update_model: ({ data: jsonStr }) => {
|
|
39
|
+
const data = JSON.parse(jsonStr);
|
|
40
|
+
if (currentConversation && currentConversation.id === data.id) {
|
|
219
41
|
currentConversation = data;
|
|
220
42
|
}
|
|
221
43
|
onUpdate(data);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
},
|
|
233
|
-
/**
|
|
234
|
-
* Manually connect WebSocket
|
|
235
|
-
*/
|
|
236
|
-
async connectWebSocket() {
|
|
237
|
-
if (!webSocketManager) {
|
|
238
|
-
throw new Error("WebSocket is not enabled. Set enableWebSocket: true in agents config");
|
|
239
|
-
}
|
|
240
|
-
await webSocketManager.connect();
|
|
241
|
-
},
|
|
242
|
-
/**
|
|
243
|
-
* Disconnect WebSocket
|
|
244
|
-
*/
|
|
245
|
-
disconnectWebSocket() {
|
|
246
|
-
if (webSocketManager) {
|
|
247
|
-
webSocketManager.disconnect();
|
|
248
|
-
}
|
|
249
|
-
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
getConversations,
|
|
49
|
+
getConversation,
|
|
50
|
+
listConversations,
|
|
51
|
+
createConversation,
|
|
52
|
+
addMessage,
|
|
53
|
+
subscribeToConversation,
|
|
250
54
|
};
|
|
251
55
|
}
|