@gnsx/genesys.agent.client 0.4.2 → 1.0.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.
- package/dist/client.d.ts +82 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +321 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +4 -70
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -344
- package/dist/index.js.map +1 -1
- package/dist/protocol.d.ts +95 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +10 -0
- package/dist/protocol.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/uuid.d.ts +6 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +15 -0
- package/dist/uuid.js.map +1 -0
- package/package.json +9 -35
- package/src/client.ts +394 -0
- package/src/index.ts +22 -53
- package/src/protocol.ts +100 -0
- package/src/types.ts +49 -27
- package/src/uuid.ts +14 -0
- package/README.md +0 -119
- package/dist/index.cjs +0 -357
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -70
- package/src/GenesysAgentClient.ts +0 -318
package/dist/index.js
CHANGED
|
@@ -1,345 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
var ServerMessageType;
|
|
3
|
-
(function(ServerMessageType2) {
|
|
4
|
-
ServerMessageType2["PING"] = "ping";
|
|
5
|
-
ServerMessageType2["AGENT_EVENT"] = "agent_event";
|
|
6
|
-
ServerMessageType2["CONNECTION_ESTABLISHED"] = "connection_established";
|
|
7
|
-
ServerMessageType2["REQUEST_INPUT"] = "request_input";
|
|
8
|
-
ServerMessageType2["ERROR"] = "error";
|
|
9
|
-
ServerMessageType2["SESSION_INFO"] = "session_info";
|
|
10
|
-
ServerMessageType2["SESSION_RESTORED"] = "session_restored";
|
|
11
|
-
})(ServerMessageType || (ServerMessageType = {}));
|
|
12
|
-
var ClientMessageType;
|
|
13
|
-
(function(ClientMessageType2) {
|
|
14
|
-
ClientMessageType2["PONG"] = "pong";
|
|
15
|
-
ClientMessageType2["INPUT"] = "input";
|
|
16
|
-
})(ClientMessageType || (ClientMessageType = {}));
|
|
17
|
-
var ServerErrorCode;
|
|
18
|
-
(function(ServerErrorCode2) {
|
|
19
|
-
ServerErrorCode2["GENERIC"] = "generic";
|
|
20
|
-
ServerErrorCode2["SESSION_NOT_FOUND"] = "session_not_found";
|
|
21
|
-
ServerErrorCode2["INVALID_CLIENT_MESSAGE"] = "invalid_client_message";
|
|
22
|
-
ServerErrorCode2["AGENT_INITIALIZATION_FAILED"] = "agent_initialization_failed";
|
|
23
|
-
})(ServerErrorCode || (ServerErrorCode = {}));
|
|
24
|
-
|
|
25
|
-
// ../shared/dist/events.js
|
|
26
|
-
var AgentEventType;
|
|
27
|
-
(function(AgentEventType2) {
|
|
28
|
-
AgentEventType2["USER_MESSAGE"] = "user_message";
|
|
29
|
-
AgentEventType2["AGENT_MESSAGE"] = "agent_message";
|
|
30
|
-
AgentEventType2["STREAM_CHUNK"] = "stream_chunk";
|
|
31
|
-
AgentEventType2["TOOL_CALL"] = "tool_call";
|
|
32
|
-
AgentEventType2["TOOL_RESULT"] = "tool_result";
|
|
33
|
-
AgentEventType2["TOOL_ERROR"] = "tool_error";
|
|
34
|
-
AgentEventType2["REASONING"] = "reasoning";
|
|
35
|
-
AgentEventType2["TOKEN_USAGE"] = "token_usage";
|
|
36
|
-
AgentEventType2["TODO_LIST"] = "todo_list";
|
|
37
|
-
AgentEventType2["SEND_DATA"] = "send_data";
|
|
38
|
-
AgentEventType2["ERROR"] = "error";
|
|
39
|
-
AgentEventType2["MESSAGES_CLEARED"] = "messages_cleared";
|
|
40
|
-
AgentEventType2["MODEL_UPDATED"] = "model_updated";
|
|
41
|
-
AgentEventType2["ROUND_FINISHED"] = "round_finished";
|
|
42
|
-
})(AgentEventType || (AgentEventType = {}));
|
|
43
|
-
var TodoStatus;
|
|
44
|
-
(function(TodoStatus2) {
|
|
45
|
-
TodoStatus2["PENDING"] = "pending";
|
|
46
|
-
TodoStatus2["IN_PROGRESS"] = "in_progress";
|
|
47
|
-
TodoStatus2["COMPLETED"] = "completed";
|
|
48
|
-
})(TodoStatus || (TodoStatus = {}));
|
|
49
|
-
var TodoPriority;
|
|
50
|
-
(function(TodoPriority2) {
|
|
51
|
-
TodoPriority2["HIGH"] = "high";
|
|
52
|
-
TodoPriority2["MEDIUM"] = "medium";
|
|
53
|
-
TodoPriority2["LOW"] = "low";
|
|
54
|
-
})(TodoPriority || (TodoPriority = {}));
|
|
55
|
-
|
|
56
|
-
// ../shared/dist/browser.js
|
|
57
|
-
var DEFAULT_PORT = 4400;
|
|
58
|
-
var DEFAULT_SESSION_DIR = "/tmp/agent-sessions";
|
|
59
|
-
var DEFAULT_SESSION_TIMEOUT = 30 * 60 * 1e3;
|
|
60
|
-
var DEFAULT_MAX_SESSIONS = 100;
|
|
61
|
-
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
62
|
-
var WS_HEARTBEAT_INTERVAL = 2e4;
|
|
63
|
-
var SYSTEM_CONTEXT_PLACEHOLDER = "{systemContext}";
|
|
64
|
-
var PROJECT_LAYOUT_PLACEHOLDER = "{projectLayout}";
|
|
65
|
-
|
|
66
|
-
// src/types.ts
|
|
67
|
-
var ClientState = /* @__PURE__ */ ((ClientState2) => {
|
|
68
|
-
ClientState2["DISCONNECTED"] = "disconnected";
|
|
69
|
-
ClientState2["CONNECTING"] = "connecting";
|
|
70
|
-
ClientState2["CONNECTED"] = "connected";
|
|
71
|
-
ClientState2["RECONNECTING"] = "reconnecting";
|
|
72
|
-
return ClientState2;
|
|
73
|
-
})(ClientState || {});
|
|
74
|
-
var ClientEventType = /* @__PURE__ */ ((ClientEventType2) => {
|
|
75
|
-
ClientEventType2["SERVER_MESSAGE"] = "serverMessage";
|
|
76
|
-
ClientEventType2["DISCONNECTED"] = "disconnected";
|
|
77
|
-
ClientEventType2["STATE_CHANGE"] = "stateChange";
|
|
78
|
-
ClientEventType2["CONTROL_MESSAGE"] = "controlMessage";
|
|
79
|
-
return ClientEventType2;
|
|
80
|
-
})(ClientEventType || {});
|
|
81
|
-
|
|
82
|
-
// src/GenesysAgentClient.ts
|
|
83
|
-
var LOG_PREFIX = "[GenesysAgentClient]";
|
|
84
|
-
var GenesysAgentClient = class {
|
|
85
|
-
constructor(options = {}) {
|
|
86
|
-
this.options = options;
|
|
87
|
-
this.options.autoReconnect = this.options.autoReconnect ?? true;
|
|
88
|
-
this.options.maxReconnectAttempts = this.options.maxReconnectAttempts ?? 5;
|
|
89
|
-
this.options.reconnectInterval = this.options.reconnectInterval ?? 1e3;
|
|
90
|
-
this.options.debug = this.options.debug ?? false;
|
|
91
|
-
}
|
|
92
|
-
ws = null;
|
|
93
|
-
sessionId = null;
|
|
94
|
-
wsUrl = null;
|
|
95
|
-
state = "disconnected" /* DISCONNECTED */;
|
|
96
|
-
reconnectAttempts = 0;
|
|
97
|
-
reconnectTimeout = null;
|
|
98
|
-
intentionalClose = false;
|
|
99
|
-
eventListeners = /* @__PURE__ */ new Map();
|
|
100
|
-
serverAddress = null;
|
|
101
|
-
config = null;
|
|
102
|
-
async connect(config) {
|
|
103
|
-
if (this.state === "connected" /* CONNECTED */ || this.state === "connecting" /* CONNECTING */) {
|
|
104
|
-
throw new Error("Already connected or connecting");
|
|
105
|
-
}
|
|
106
|
-
if (!config.serverAddress) {
|
|
107
|
-
throw new Error("Server address is required");
|
|
108
|
-
}
|
|
109
|
-
this.config = config;
|
|
110
|
-
this.serverAddress = config.serverAddress.replace(/\/+$/, "");
|
|
111
|
-
this.setState("connecting" /* CONNECTING */);
|
|
112
|
-
this.intentionalClose = false;
|
|
113
|
-
try {
|
|
114
|
-
const response = await fetch(`${this.serverAddress}/sessions`, {
|
|
115
|
-
method: "POST",
|
|
116
|
-
headers: { "Content-Type": "application/json" },
|
|
117
|
-
body: JSON.stringify({ specPath: config.specPath })
|
|
118
|
-
});
|
|
119
|
-
if (!response.ok) {
|
|
120
|
-
const errorData = await response.json().catch(() => ({ error: "Failed to create session" }));
|
|
121
|
-
throw new Error(errorData.error ?? "Failed to create session");
|
|
122
|
-
}
|
|
123
|
-
const sessionInfo = await response.json();
|
|
124
|
-
this.sessionId = sessionInfo.sessionId;
|
|
125
|
-
this.wsUrl = sessionInfo.wsUrl;
|
|
126
|
-
if (!this.sessionId) {
|
|
127
|
-
throw new Error("Session ID is required");
|
|
128
|
-
}
|
|
129
|
-
if (!this.wsUrl) {
|
|
130
|
-
throw new Error("WebSocket URL is required");
|
|
131
|
-
}
|
|
132
|
-
await this.connectWebSocket(false);
|
|
133
|
-
} catch (error) {
|
|
134
|
-
this.setState("disconnected" /* DISCONNECTED */);
|
|
135
|
-
throw error;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
async connectWebSocket(isReconnecting) {
|
|
139
|
-
if (!this.wsUrl) {
|
|
140
|
-
throw new Error("No WebSocket URL available");
|
|
141
|
-
}
|
|
142
|
-
return new Promise((resolve, reject) => {
|
|
143
|
-
this.ws = new WebSocket(this.wsUrl);
|
|
144
|
-
this.ws.onopen = () => {
|
|
145
|
-
this.setState("connected" /* CONNECTED */);
|
|
146
|
-
this.reconnectAttempts = 0;
|
|
147
|
-
resolve();
|
|
148
|
-
};
|
|
149
|
-
this.ws.onmessage = (event) => {
|
|
150
|
-
try {
|
|
151
|
-
const message = JSON.parse(event.data);
|
|
152
|
-
this.handleServerMessage(message);
|
|
153
|
-
} catch (error) {
|
|
154
|
-
this.debug("Failed to parse message:", error);
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
this.ws.onclose = () => {
|
|
158
|
-
this.setState("disconnected" /* DISCONNECTED */);
|
|
159
|
-
if (!isReconnecting) {
|
|
160
|
-
this.emit("disconnected" /* DISCONNECTED */, this.intentionalClose ? "User disconnected" : "Connection lost");
|
|
161
|
-
if (!this.intentionalClose && this.options.autoReconnect && this.sessionId) {
|
|
162
|
-
this.attemptReconnect();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
this.ws.onerror = (error) => {
|
|
167
|
-
this.debug("WebSocket error:", error);
|
|
168
|
-
reject(error);
|
|
169
|
-
};
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
handleServerMessage(message) {
|
|
173
|
-
if (message.type === ServerMessageType.AGENT_EVENT) {
|
|
174
|
-
switch (message.event.type) {
|
|
175
|
-
case AgentEventType.USER_MESSAGE:
|
|
176
|
-
this.debug("USER_MESSAGE:\n", message.event.data.message);
|
|
177
|
-
break;
|
|
178
|
-
case AgentEventType.AGENT_MESSAGE:
|
|
179
|
-
this.debug("AGENT_MESSAGE:\n", message.event.data.message);
|
|
180
|
-
break;
|
|
181
|
-
case AgentEventType.STREAM_CHUNK:
|
|
182
|
-
this.debug("STREAM_CHUNK:\n", message.event.data.chunk);
|
|
183
|
-
break;
|
|
184
|
-
case AgentEventType.TOOL_CALL:
|
|
185
|
-
this.debug("TOOL_CALL:\n", message.event.data.toolName, message.event.data.input);
|
|
186
|
-
break;
|
|
187
|
-
case AgentEventType.TOOL_RESULT:
|
|
188
|
-
this.debug("TOOL_RESULT:\n", message.event.data.toolName, message.event.data.result);
|
|
189
|
-
break;
|
|
190
|
-
case AgentEventType.TOOL_ERROR:
|
|
191
|
-
console.error(LOG_PREFIX, "TOOL_ERROR:\n", message.event.data.toolName, message.event.data.error);
|
|
192
|
-
break;
|
|
193
|
-
case AgentEventType.REASONING:
|
|
194
|
-
this.debug("REASONING:\n", message.event.data.text);
|
|
195
|
-
break;
|
|
196
|
-
case AgentEventType.TOKEN_USAGE:
|
|
197
|
-
this.debug("TOKEN_USAGE:\n", message.event.data);
|
|
198
|
-
break;
|
|
199
|
-
case AgentEventType.TODO_LIST:
|
|
200
|
-
this.debug("TODO_LIST:\n", message.event.data.todos);
|
|
201
|
-
break;
|
|
202
|
-
case AgentEventType.SEND_DATA:
|
|
203
|
-
this.debug("SEND_DATA:\n", message.event.data.data);
|
|
204
|
-
break;
|
|
205
|
-
case AgentEventType.ERROR:
|
|
206
|
-
console.error(LOG_PREFIX, "AGENT_ERROR:\n", message.event.data.error);
|
|
207
|
-
break;
|
|
208
|
-
case AgentEventType.MESSAGES_CLEARED:
|
|
209
|
-
this.debug("MESSAGES_CLEARED:\n");
|
|
210
|
-
break;
|
|
211
|
-
default:
|
|
212
|
-
console.error(LOG_PREFIX, "Unknown agent event:\n", message.event);
|
|
213
|
-
break;
|
|
214
|
-
}
|
|
215
|
-
} else {
|
|
216
|
-
this.debug("handleServerMessage:", message);
|
|
217
|
-
}
|
|
218
|
-
if (message.type === ServerMessageType.ERROR) {
|
|
219
|
-
this.handleServerError(message);
|
|
220
|
-
}
|
|
221
|
-
this.emit("serverMessage" /* SERVER_MESSAGE */, message);
|
|
222
|
-
}
|
|
223
|
-
sendInput(text) {
|
|
224
|
-
if (this.state !== "connected" /* CONNECTED */) {
|
|
225
|
-
throw new Error("Not connected");
|
|
226
|
-
}
|
|
227
|
-
this.send({
|
|
228
|
-
type: ClientMessageType.INPUT,
|
|
229
|
-
text
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
abort() {
|
|
233
|
-
if (this.state !== "connected" /* CONNECTED */) {
|
|
234
|
-
throw new Error("Not connected");
|
|
235
|
-
}
|
|
236
|
-
throw new Error("Not implemented");
|
|
237
|
-
}
|
|
238
|
-
disconnect() {
|
|
239
|
-
this.intentionalClose = true;
|
|
240
|
-
if (this.reconnectTimeout) {
|
|
241
|
-
clearTimeout(this.reconnectTimeout);
|
|
242
|
-
this.reconnectTimeout = null;
|
|
243
|
-
}
|
|
244
|
-
if (this.ws) {
|
|
245
|
-
this.ws.close();
|
|
246
|
-
this.ws = null;
|
|
247
|
-
}
|
|
248
|
-
this.sessionId = null;
|
|
249
|
-
this.wsUrl = null;
|
|
250
|
-
this.setState("disconnected" /* DISCONNECTED */);
|
|
251
|
-
}
|
|
252
|
-
attemptReconnect() {
|
|
253
|
-
if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {
|
|
254
|
-
this.emit("controlMessage" /* CONTROL_MESSAGE */, { message: `Failed to reconnect after ${this.options.maxReconnectAttempts} attempts`, isError: true });
|
|
255
|
-
this.sessionId = null;
|
|
256
|
-
this.wsUrl = null;
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
this.reconnectAttempts++;
|
|
260
|
-
const delay = Math.min(5e3, this.options.reconnectInterval * Math.pow(1.5, this.reconnectAttempts - 1));
|
|
261
|
-
this.setState("reconnecting" /* RECONNECTING */);
|
|
262
|
-
this.emit("controlMessage" /* CONTROL_MESSAGE */, { message: `Reconnect attempt ${this.reconnectAttempts}/${this.options.maxReconnectAttempts}...`, isError: false });
|
|
263
|
-
this.reconnectTimeout = setTimeout(async () => {
|
|
264
|
-
try {
|
|
265
|
-
await this.connectWebSocket(true);
|
|
266
|
-
this.emit("controlMessage" /* CONTROL_MESSAGE */, { message: "Reconnected to server", isError: false });
|
|
267
|
-
} catch {
|
|
268
|
-
this.attemptReconnect();
|
|
269
|
-
}
|
|
270
|
-
}, delay);
|
|
271
|
-
}
|
|
272
|
-
send(message) {
|
|
273
|
-
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
274
|
-
this.ws.send(JSON.stringify(message));
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
setState(state) {
|
|
278
|
-
if (this.state !== state) {
|
|
279
|
-
this.state = state;
|
|
280
|
-
this.emit("stateChange" /* STATE_CHANGE */, state);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
getState() {
|
|
284
|
-
return this.state;
|
|
285
|
-
}
|
|
286
|
-
isConnected() {
|
|
287
|
-
return this.state === "connected" /* CONNECTED */;
|
|
288
|
-
}
|
|
289
|
-
getSessionId() {
|
|
290
|
-
return this.sessionId;
|
|
291
|
-
}
|
|
292
|
-
// Event emitter methods
|
|
293
|
-
on(event, listener) {
|
|
294
|
-
if (!this.eventListeners.has(event)) {
|
|
295
|
-
this.eventListeners.set(event, /* @__PURE__ */ new Set());
|
|
296
|
-
}
|
|
297
|
-
this.eventListeners.get(event).add(listener);
|
|
298
|
-
return listener;
|
|
299
|
-
}
|
|
300
|
-
off(event, listener) {
|
|
301
|
-
const listeners = this.eventListeners.get(event);
|
|
302
|
-
if (listeners) {
|
|
303
|
-
listeners.delete(listener);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
once(event, listener) {
|
|
307
|
-
const onceListener = ((...args) => {
|
|
308
|
-
this.off(event, onceListener);
|
|
309
|
-
listener(...args);
|
|
310
|
-
});
|
|
311
|
-
this.on(event, onceListener);
|
|
312
|
-
}
|
|
313
|
-
emit(event, ...args) {
|
|
314
|
-
const listeners = this.eventListeners.get(event);
|
|
315
|
-
if (listeners) {
|
|
316
|
-
listeners.forEach((listener) => {
|
|
317
|
-
try {
|
|
318
|
-
listener(...args);
|
|
319
|
-
} catch (error) {
|
|
320
|
-
this.debug(`Error in ${event} listener:`, error);
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
debug(...args) {
|
|
326
|
-
if (this.options.debug) {
|
|
327
|
-
console.log(LOG_PREFIX, ...args);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
async handleServerError(message) {
|
|
331
|
-
if (message.code === ServerErrorCode.SESSION_NOT_FOUND) {
|
|
332
|
-
try {
|
|
333
|
-
console.warn("SESSION_NOT_FOUND, reconnecting to get a new session");
|
|
334
|
-
this.disconnect();
|
|
335
|
-
await this.connect(this.config);
|
|
336
|
-
} catch (error) {
|
|
337
|
-
console.error(error);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
export { AgentEventType, ClientEventType, ClientMessageType, ClientState, DEFAULT_MAX_SESSIONS, DEFAULT_PORT, DEFAULT_SESSION_DIR, DEFAULT_SESSION_TIMEOUT, GenesysAgentClient, MAX_FILE_SIZE, PROJECT_LAYOUT_PLACEHOLDER, SYSTEM_CONTEXT_PLACEHOLDER, ServerErrorCode, ServerMessageType, TodoPriority, TodoStatus, WS_HEARTBEAT_INTERVAL };
|
|
344
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { GenesysAgentClient } from './client.js';
|
|
345
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../shared/src/types.ts","../../shared/src/events.ts","../../shared/src/browser.ts","../src/types.ts","../src/GenesysAgentClient.ts"],"names":["ServerMessageType","ClientMessageType","ServerErrorCode","AgentEventType","TodoStatus","TodoPriority","ClientState","ClientEventType"],"mappings":"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","file":"index.js","sourcesContent":["import type { AgentEvent } from './events.js';\n\nexport interface SessionInfo {\n sessionId: string;\n specName?: string;\n model?: string;\n}\n\nexport enum ServerMessageType {\n PING = 'ping',\n AGENT_EVENT = 'agent_event',\n CONNECTION_ESTABLISHED = 'connection_established',\n REQUEST_INPUT = 'request_input',\n ERROR = 'error',\n SESSION_INFO = 'session_info',\n SESSION_RESTORED = 'session_restored',\n}\n\nexport enum ClientMessageType {\n PONG = 'pong',\n INPUT = 'input',\n}\n\nexport enum ServerErrorCode {\n GENERIC = 'generic',\n SESSION_NOT_FOUND = 'session_not_found',\n INVALID_CLIENT_MESSAGE = 'invalid_client_message',\n AGENT_INITIALIZATION_FAILED = 'agent_initialization_failed',\n}\n\nexport type ServerMessage = AgentEventMessage | ConnectionEstablishedMessage | RequestInputMessage | ErrorMessage |\n SessionInfoMessage | SessionRestoredMessage | InputMessage | PingMessage;\n\nexport type ClientMessage = InputMessage | { type: ClientMessageType.PONG };\n\nexport interface AgentEventMessage {\n type: ServerMessageType.AGENT_EVENT;\n event: AgentEvent;\n}\n\nexport interface ConnectionEstablishedMessage {\n type: ServerMessageType.CONNECTION_ESTABLISHED;\n specName: string;\n model: string;\n sessionId: string;\n}\n\nexport interface RequestInputMessage {\n type: ServerMessageType.REQUEST_INPUT;\n}\n\nexport interface ErrorMessage {\n type: ServerMessageType.ERROR;\n message: string;\n code: ServerErrorCode;\n}\n\nexport interface PingMessage {\n type: ServerMessageType.PING;\n}\n\nexport interface SessionInfoMessage {\n type: ServerMessageType.SESSION_INFO;\n sessionInfo: SessionInfo;\n}\n\nexport interface SessionRestoredMessage {\n type: ServerMessageType.SESSION_RESTORED;\n sessionId: string;\n specName: string;\n model: string;\n}\n\nexport interface InputMessage {\n type: ClientMessageType.INPUT;\n text: string;\n}\n","export enum AgentEventType {\n USER_MESSAGE = 'user_message',\n AGENT_MESSAGE = 'agent_message',\n STREAM_CHUNK = 'stream_chunk',\n TOOL_CALL = 'tool_call',\n TOOL_RESULT = 'tool_result',\n TOOL_ERROR = 'tool_error',\n REASONING = 'reasoning',\n TOKEN_USAGE = 'token_usage',\n TODO_LIST = 'todo_list',\n SEND_DATA = 'send_data',\n ERROR = 'error',\n MESSAGES_CLEARED = 'messages_cleared',\n MODEL_UPDATED = 'model_updated',\n ROUND_FINISHED = 'round_finished',\n}\n\nexport interface UserMessageEvent {\n type: AgentEventType.USER_MESSAGE;\n data: {\n message: string;\n };\n}\n\nexport interface AgentMessageEvent {\n type: AgentEventType.AGENT_MESSAGE;\n data: {\n message: string;\n streaming?: boolean;\n };\n}\n\nexport interface StreamChunkEvent {\n type: AgentEventType.STREAM_CHUNK;\n data: {\n chunk: string;\n };\n}\n\nexport interface ToolCallEvent {\n type: AgentEventType.TOOL_CALL;\n data: {\n toolCallId: string;\n toolName: string;\n input: any;\n };\n}\n\nexport interface ToolResultEvent {\n type: AgentEventType.TOOL_RESULT;\n data: {\n toolCallId: string;\n toolName: string;\n result: any;\n };\n}\n\nexport interface ToolErrorEvent {\n type: AgentEventType.TOOL_ERROR;\n data: {\n toolCallId?: string;\n toolName: string;\n error: any;\n };\n}\nexport interface ReasoningEvent {\n type: AgentEventType.REASONING;\n data: {\n text: string;\n };\n}\n\nexport interface TokenUsageEvent {\n type: AgentEventType.TOKEN_USAGE;\n data: {\n roundIndex: number;\n currentInputTokens: number;\n currentOutputTokens: number;\n currentReasoningTokens: number;\n currentCachedInputTokens: number;\n increasedInputTokens: number;\n increasedOutputTokens: number;\n accumulatedInputTokens: number;\n accumulatedOutputTokens: number;\n accumulatedReasoningTokens: number;\n accumulatedCachedInputTokens: number;\n currentInputCost: number;\n currentOutputCost: number;\n currentTotalCost: number;\n accumulatedInputCost: number;\n accumulatedOutputCost: number;\n accumulatedTotalCost: number;\n };\n}\n\nexport enum TodoStatus {\n PENDING = 'pending',\n IN_PROGRESS = 'in_progress',\n COMPLETED = 'completed',\n}\n\nexport enum TodoPriority {\n HIGH = 'high',\n MEDIUM = 'medium',\n LOW = 'low',\n}\n\nexport interface TodoItem {\n content: string;\n status: TodoStatus;\n priority: TodoPriority;\n id: string;\n}\n\nexport interface TodoListEvent {\n type: AgentEventType.TODO_LIST;\n data: {\n todos: TodoItem[];\n };\n}\n\nexport interface SendDataEvent {\n type: AgentEventType.SEND_DATA;\n data: {\n data: string;\n };\n}\n\nexport interface ErrorEvent {\n type: AgentEventType.ERROR;\n data: {\n error: any\n }\n}\n\nexport interface MessagesClearedEvent {\n type: AgentEventType.MESSAGES_CLEARED;\n}\n\nexport interface ModelUpdatedEvent {\n type: AgentEventType.MODEL_UPDATED;\n data: {\n oldModel: string;\n newModel: string;\n };\n}\n\nexport interface RoundFinishedEvent {\n type: AgentEventType.ROUND_FINISHED;\n data: {\n roundIndex: number;\n };\n}\n\nexport type AgentEvent = UserMessageEvent | AgentMessageEvent | StreamChunkEvent | ToolCallEvent | ToolErrorEvent | ToolResultEvent |\n ReasoningEvent | TokenUsageEvent| TodoListEvent | SendDataEvent | ErrorEvent | MessagesClearedEvent | ModelUpdatedEvent | RoundFinishedEvent;\n","// Browser-compatible exports from shared package\n// Only exports types and constants, no Node.js dependencies\n\nexport * from './types.js';\nexport * from './events.js';\n\n// Browser-safe constants (no Node.js dependencies)\n\n// Server configuration\nexport const DEFAULT_PORT = 4400;\nexport const DEFAULT_SESSION_DIR = '/tmp/agent-sessions';\nexport const DEFAULT_SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\nexport const DEFAULT_MAX_SESSIONS = 100;\n\n// File upload limits\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\n\n// WebSocket configuration\nexport const WS_HEARTBEAT_INTERVAL = 20000; // 20 seconds\n\n// System context\nexport const SYSTEM_CONTEXT_PLACEHOLDER = '{systemContext}';\nexport const PROJECT_LAYOUT_PLACEHOLDER = '{projectLayout}';\n\n","import type { ServerMessage } from '@gnsx/genesys.agent.shared/browser';\n\nexport interface ClientOptions {\n autoReconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectInterval?: number;\n debug?: boolean;\n}\n\nexport interface SessionConfig {\n serverAddress: string;\n specPath: string;\n}\n\nexport interface ControlMessage {\n message: string;\n isError: boolean;\n}\n\nexport enum ClientState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n RECONNECTING = 'reconnecting'\n}\n\nexport enum ClientEventType {\n SERVER_MESSAGE = 'serverMessage',\n DISCONNECTED = 'disconnected',\n STATE_CHANGE = 'stateChange',\n CONTROL_MESSAGE = 'controlMessage',\n}\n\nexport interface ClientEventMap {\n [ClientEventType.SERVER_MESSAGE]: (message: ServerMessage) => void;\n [ClientEventType.DISCONNECTED]: (reason?: string) => void;\n [ClientEventType.STATE_CHANGE]: (state: ClientState) => void;\n [ClientEventType.CONTROL_MESSAGE]: (message: ControlMessage) => void;\n}\n","import { AgentEventType, ClientMessageType, ServerErrorCode, ServerMessageType } from '@gnsx/genesys.agent.shared/browser';\n\nimport { ClientEventType, ClientState } from './types.js';\n\nimport type { ClientEventMap , ClientOptions, SessionConfig } from './types.js';\nimport type { ClientMessage, ErrorMessage, ServerMessage} from '@gnsx/genesys.agent.shared/browser';\n\nconst LOG_PREFIX = '[GenesysAgentClient]';\n\nexport class GenesysAgentClient {\n protected ws: WebSocket | null = null;\n protected sessionId: string | null = null;\n protected wsUrl: string | null = null;\n protected state: ClientState = ClientState.DISCONNECTED;\n protected reconnectAttempts = 0;\n protected reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n protected intentionalClose = false;\n\n protected eventListeners: Map<ClientEventType, Set<Function>> = new Map();\n\n protected serverAddress: string | null = null;\n\n protected config: SessionConfig | null = null;\n\n constructor(readonly options: ClientOptions = {}) {\n this.options.autoReconnect = this.options.autoReconnect ?? true;\n this.options.maxReconnectAttempts = this.options.maxReconnectAttempts ?? 5;\n this.options.reconnectInterval = this.options.reconnectInterval ?? 1000;\n this.options.debug = this.options.debug ?? false;\n }\n\n public async connect(config: SessionConfig): Promise<void> {\n if (this.state === ClientState.CONNECTED || this.state === ClientState.CONNECTING) {\n throw new Error('Already connected or connecting');\n }\n\n if (!config.serverAddress) {\n throw new Error('Server address is required');\n }\n\n // save the config in case we need to connect again\n this.config = config;\n\n // Remove trailing slash from server address\n this.serverAddress = config.serverAddress.replace(/\\/+$/, '');\n\n this.setState(ClientState.CONNECTING);\n this.intentionalClose = false;\n\n try {\n // Create session via HTTP\n const response = await fetch(`${this.serverAddress}/sessions`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ specPath: config.specPath })\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Failed to create session' }));\n throw new Error(errorData.error ?? 'Failed to create session');\n }\n\n const sessionInfo: { sessionId: string; wsUrl: string } = await response.json();\n this.sessionId = sessionInfo.sessionId;\n this.wsUrl = sessionInfo.wsUrl;\n if (!this.sessionId) {\n throw new Error('Session ID is required');\n }\n if (!this.wsUrl) {\n throw new Error('WebSocket URL is required');\n }\n\n // Connect WebSocket\n await this.connectWebSocket(false);\n } catch (error) {\n this.setState(ClientState.DISCONNECTED);\n throw error;\n }\n }\n\n protected async connectWebSocket(isReconnecting: boolean): Promise<void> {\n if (!this.wsUrl) {\n throw new Error('No WebSocket URL available');\n }\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.wsUrl!);\n\n this.ws.onopen = () => {\n this.setState(ClientState.CONNECTED);\n this.reconnectAttempts = 0;\n resolve();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message: ServerMessage = JSON.parse(event.data);\n this.handleServerMessage(message);\n } catch (error) {\n this.debug('Failed to parse message:', error);\n }\n };\n\n this.ws.onclose = () => {\n this.setState(ClientState.DISCONNECTED);\n if (!isReconnecting) {\n this.emit(ClientEventType.DISCONNECTED, this.intentionalClose ? 'User disconnected' : 'Connection lost');\n\n if (!this.intentionalClose && this.options.autoReconnect && this.sessionId) {\n this.attemptReconnect();\n }\n }\n };\n\n this.ws.onerror = (error) => {\n this.debug('WebSocket error:', error);\n reject(error);\n };\n });\n }\n\n protected handleServerMessage(message: ServerMessage): void {\n if (message.type === ServerMessageType.AGENT_EVENT) {\n switch (message.event.type) {\n case AgentEventType.USER_MESSAGE:\n this.debug('USER_MESSAGE:\\n', message.event.data.message);\n break;\n case AgentEventType.AGENT_MESSAGE:\n this.debug('AGENT_MESSAGE:\\n', message.event.data.message);\n break;\n case AgentEventType.STREAM_CHUNK:\n this.debug('STREAM_CHUNK:\\n', message.event.data.chunk);\n break;\n case AgentEventType.TOOL_CALL:\n this.debug('TOOL_CALL:\\n', message.event.data.toolName, message.event.data.input);\n break;\n case AgentEventType.TOOL_RESULT:\n this.debug('TOOL_RESULT:\\n', message.event.data.toolName, message.event.data.result);\n break;\n case AgentEventType.TOOL_ERROR:\n console.error(LOG_PREFIX, 'TOOL_ERROR:\\n', message.event.data.toolName, message.event.data.error);\n break;\n case AgentEventType.REASONING:\n this.debug('REASONING:\\n', message.event.data.text);\n break;\n case AgentEventType.TOKEN_USAGE:\n this.debug('TOKEN_USAGE:\\n', message.event.data);\n break;\n case AgentEventType.TODO_LIST:\n this.debug('TODO_LIST:\\n', message.event.data.todos);\n break;\n case AgentEventType.SEND_DATA:\n this.debug('SEND_DATA:\\n', message.event.data.data);\n break;\n case AgentEventType.ERROR:\n console.error(LOG_PREFIX, 'AGENT_ERROR:\\n', message.event.data.error);\n break;\n case AgentEventType.MESSAGES_CLEARED:\n this.debug('MESSAGES_CLEARED:\\n');\n break;\n default:\n console.error(LOG_PREFIX, 'Unknown agent event:\\n', message.event);\n break;\n }\n } else {\n this.debug('handleServerMessage:', message);\n }\n\n if (message.type === ServerMessageType.ERROR) {\n this.handleServerError(message);\n }\n this.emit(ClientEventType.SERVER_MESSAGE, message);\n }\n\n public sendInput(text: string): void {\n if (this.state !== ClientState.CONNECTED) {\n throw new Error('Not connected');\n }\n\n this.send({\n type: ClientMessageType.INPUT,\n text\n });\n }\n\n public abort(): void {\n if (this.state !== ClientState.CONNECTED) {\n throw new Error('Not connected');\n }\n\n throw new Error('Not implemented');\n }\n\n public disconnect(): void {\n this.intentionalClose = true;\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.sessionId = null;\n this.wsUrl = null;\n this.setState(ClientState.DISCONNECTED);\n }\n\n protected attemptReconnect(): void {\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts!) {\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Failed to reconnect after ${this.options.maxReconnectAttempts} attempts`, isError: true });\n this.sessionId = null;\n this.wsUrl = null;\n return;\n }\n\n this.reconnectAttempts++;\n const delay = Math.min(5000, this.options.reconnectInterval! * Math.pow(1.5, this.reconnectAttempts - 1));\n\n this.setState(ClientState.RECONNECTING);\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Reconnect attempt ${this.reconnectAttempts}/${this.options.maxReconnectAttempts}...`, isError: false });\n\n this.reconnectTimeout = setTimeout(async () => {\n try {\n await this.connectWebSocket(true);\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: 'Reconnected to server', isError: false });\n } catch {\n this.attemptReconnect();\n }\n }, delay);\n }\n\n protected send(message: ClientMessage): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n protected setState(state: ClientState): void {\n if (this.state !== state) {\n this.state = state;\n this.emit(ClientEventType.STATE_CHANGE, state);\n }\n }\n\n public getState(): ClientState {\n return this.state;\n }\n\n public isConnected(): boolean {\n return this.state === ClientState.CONNECTED;\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n // Event emitter methods\n public on(event: ClientEventType, listener: ClientEventMap[ClientEventType]): ClientEventMap[ClientEventType] {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener);\n return listener;\n }\n\n public off(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n public once(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\n const onceListener = ((...args: Parameters<ClientEventMap[ClientEventType]>) => {\n this.off(event, onceListener);\n (listener as Function)(...args);\n }) as ClientEventMap[ClientEventType];\n\n this.on(event, onceListener);\n }\n\n protected emit(event: ClientEventType, ...args: Parameters<ClientEventMap[ClientEventType]>): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n (listener as Function)(...args);\n } catch (error) {\n this.debug(`Error in ${event} listener:`, error);\n }\n });\n }\n }\n\n protected debug(...args: unknown[]): void {\n if (this.options.debug) {\n console.log(LOG_PREFIX, ...args);\n }\n }\n\n\n protected async handleServerError(message: ErrorMessage): Promise<void> {\n if (message.code === ServerErrorCode.SESSION_NOT_FOUND) {\n // reconnect to get a new session\n try {\n console.warn('SESSION_NOT_FOUND, reconnecting to get a new session');\n this.disconnect();\n await this.connect(this.config!);\n } catch (error) {\n console.error(error);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire types shared between the Genesys Agent v2 server and this client.
|
|
3
|
+
*
|
|
4
|
+
* Kept as a standalone file (no server imports) so the client package stays
|
|
5
|
+
* browser-compatible with zero Node.js dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Keep in sync with packages/server/src/protocol.ts.
|
|
8
|
+
*/
|
|
9
|
+
export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
10
|
+
export interface ImageContent {
|
|
11
|
+
type: 'image';
|
|
12
|
+
mimeType: string;
|
|
13
|
+
data: string;
|
|
14
|
+
}
|
|
15
|
+
export type WsCommand = {
|
|
16
|
+
id?: string;
|
|
17
|
+
type: 'prompt';
|
|
18
|
+
message: string;
|
|
19
|
+
images?: ImageContent[];
|
|
20
|
+
streamingBehavior?: 'steer' | 'followUp';
|
|
21
|
+
} | {
|
|
22
|
+
id?: string;
|
|
23
|
+
type: 'abort';
|
|
24
|
+
} | {
|
|
25
|
+
id?: string;
|
|
26
|
+
type: 'new_session';
|
|
27
|
+
} | {
|
|
28
|
+
id?: string;
|
|
29
|
+
type: 'get_state';
|
|
30
|
+
} | {
|
|
31
|
+
id?: string;
|
|
32
|
+
type: 'set_model';
|
|
33
|
+
provider: string;
|
|
34
|
+
modelId: string;
|
|
35
|
+
} | {
|
|
36
|
+
id?: string;
|
|
37
|
+
type: 'get_available_models';
|
|
38
|
+
} | {
|
|
39
|
+
id?: string;
|
|
40
|
+
type: 'set_thinking_level';
|
|
41
|
+
level: ThinkingLevel;
|
|
42
|
+
} | {
|
|
43
|
+
id?: string;
|
|
44
|
+
type: 'compact';
|
|
45
|
+
customInstructions?: string;
|
|
46
|
+
} | {
|
|
47
|
+
id?: string;
|
|
48
|
+
type: 'get_messages';
|
|
49
|
+
};
|
|
50
|
+
/** A pi AgentSessionEvent forwarded verbatim */
|
|
51
|
+
export interface WsEvent {
|
|
52
|
+
type: 'event';
|
|
53
|
+
event: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
/** Successful command response */
|
|
56
|
+
export interface WsResponse {
|
|
57
|
+
type: 'response';
|
|
58
|
+
id?: string;
|
|
59
|
+
command: string;
|
|
60
|
+
success: true;
|
|
61
|
+
data?: unknown;
|
|
62
|
+
}
|
|
63
|
+
/** Error command response */
|
|
64
|
+
export interface WsError {
|
|
65
|
+
type: 'response';
|
|
66
|
+
id?: string;
|
|
67
|
+
command: string;
|
|
68
|
+
success: false;
|
|
69
|
+
error: string;
|
|
70
|
+
}
|
|
71
|
+
export type WsServerMessage = WsEvent | WsResponse | WsError;
|
|
72
|
+
export interface WsSessionState {
|
|
73
|
+
sessionId: string;
|
|
74
|
+
sessionFile?: string;
|
|
75
|
+
model?: {
|
|
76
|
+
provider: string;
|
|
77
|
+
id: string;
|
|
78
|
+
};
|
|
79
|
+
thinkingLevel: ThinkingLevel;
|
|
80
|
+
isStreaming: boolean;
|
|
81
|
+
isCompacting: boolean;
|
|
82
|
+
messageCount: number;
|
|
83
|
+
}
|
|
84
|
+
/** Response from POST /sessions */
|
|
85
|
+
export interface CreateSessionResponse {
|
|
86
|
+
sessionId: string;
|
|
87
|
+
wsUrl: string;
|
|
88
|
+
}
|
|
89
|
+
/** Response from GET /sessions/:id */
|
|
90
|
+
export interface SessionInfoResponse {
|
|
91
|
+
sessionId: string;
|
|
92
|
+
createdAt: number;
|
|
93
|
+
isConnected: boolean;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire types shared between the Genesys Agent v2 server and this client.
|
|
3
|
+
*
|
|
4
|
+
* Kept as a standalone file (no server imports) so the client package stays
|
|
5
|
+
* browser-compatible with zero Node.js dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Keep in sync with packages/server/src/protocol.ts.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { WsEvent, WsServerMessage } from './protocol.js';
|
|
2
|
+
export type { WsCommand, WsServerMessage, WsEvent, WsError, WsResponse, CreateSessionResponse, SessionInfoResponse, ThinkingLevel, ImageContent, WsSessionState } from './protocol.js';
|
|
3
|
+
export type ClientState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
|
|
4
|
+
export interface ClientOptions {
|
|
5
|
+
/** Base reconnect delay in ms. Exponential backoff is applied. Default: 1000 */
|
|
6
|
+
reconnectDelay?: number;
|
|
7
|
+
/** Max reconnect attempts before giving up. Default: 5 */
|
|
8
|
+
maxReconnectAttempts?: number;
|
|
9
|
+
/** Disable auto-reconnect entirely. Default: false */
|
|
10
|
+
noAutoReconnect?: boolean;
|
|
11
|
+
/** Log debug messages to console. Default: false */
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Listener for pi AgentSessionEvents forwarded from the server */
|
|
15
|
+
export type AgentEventListener = (event: WsEvent['event']) => void;
|
|
16
|
+
/** Listener for raw server messages (events + responses) */
|
|
17
|
+
export type MessageListener = (message: WsServerMessage) => void;
|
|
18
|
+
/** Listener for connection state changes */
|
|
19
|
+
export type StateChangeListener = (state: ClientState) => void;
|
|
20
|
+
export interface ClientEventMap {
|
|
21
|
+
/** Every pi AgentSessionEvent the server forwards */
|
|
22
|
+
event: AgentEventListener;
|
|
23
|
+
/** Every raw WsServerMessage (events + responses) */
|
|
24
|
+
message: MessageListener;
|
|
25
|
+
/** Connection state transitions */
|
|
26
|
+
state_change: StateChangeListener;
|
|
27
|
+
}
|
|
28
|
+
export type ClientEventType = keyof ClientEventMap;
|
|
29
|
+
export interface ModelInfo {
|
|
30
|
+
provider: string;
|
|
31
|
+
id: string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAE9E,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EACpE,qBAAqB,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EACvE,cAAc,EAAE,MAAM,eAAe,CAAC;AAMxC,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAMvF,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAMD,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;AAEnE,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;AAEjE,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,eAAe,CAAC;IACzB,mCAAmC;IACnC,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/uuid.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CASnC"}
|
package/dist/uuid.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser + Node.js compatible UUID v4 generator.
|
|
3
|
+
* Uses the native crypto.randomUUID() where available (Node 14.17+, all modern browsers).
|
|
4
|
+
*/
|
|
5
|
+
export function randomUUID() {
|
|
6
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
7
|
+
return crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
// Fallback for environments without crypto.randomUUID
|
|
10
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
11
|
+
const r = (Math.random() * 16) | 0;
|
|
12
|
+
return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=uuid.js.map
|
package/dist/uuid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.js","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IACD,sDAAsD;IACtD,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
|