@gnsx/genesys.agent.client 0.3.3 → 0.4.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/README.md CHANGED
@@ -1,119 +1,119 @@
1
- # Genesys Agent Client
2
-
3
- ## Summary
4
-
5
- The Genesys Agent Client (`@gnsx/genesys.agent.client`) is a TypeScript/JavaScript library for integrating AI-powered development agents into web applications and browser-based tools. It provides a WebSocket-based client for real-time communication with Genesys Agent Server instances.
6
-
7
- ### Key Features
8
-
9
- - **Real-Time Communication**: WebSocket-based connection for instant bidirectional communication with agent servers
10
- - **Session Management**: Automatic session creation, connection, and lifecycle management
11
- - **Event-Driven Architecture**: Comprehensive event system for handling agent messages, tool calls, and state changes
12
- - **Auto-Reconnection**: Built-in automatic reconnection with exponential backoff and configurable retry limits
13
- - **Full TypeScript Support**: Complete type definitions for all APIs, events, and messages
14
- - **Browser & Node.js Compatible**: Works in both browser and Node.js environments
15
- - **Lightweight**: Minimal dependencies, optimized for web applications
16
-
17
- ## Installation
18
-
19
- ### Prerequisites
20
-
21
- - **Node.js**: Version 18 or higher (for development)
22
- - **Browser**: Modern browser with WebSocket support (for runtime)
23
- - **Package Manager**: npm, yarn, or pnpm
24
-
25
- ### Installation
26
-
27
- Install the client library using your preferred package manager:
28
-
29
- **npm:**
30
- ```bash
31
- npm install @gnsx/genesys.agent.client
32
- ```
33
-
34
- **pnpm:**
35
- ```bash
36
- pnpm add @gnsx/genesys.agent.client
37
- ```
38
-
39
- **yarn:**
40
- ```bash
41
- yarn add @gnsx/genesys.agent.client
42
- ```
43
-
44
- ## Usage
45
-
46
- ### Basic Example
47
-
48
- ```typescript
49
- import { GenesysAgentClient, ClientEventType, AgentEventType } from '@gnsx/genesys.agent.client';
50
-
51
- const client = new GenesysAgentClient({ autoReconnect: true });
52
-
53
- // Connect to server
54
- await client.connect({
55
- serverAddress: 'http://localhost:3000',
56
- specPath: 'coder.yaml'
57
- });
58
-
59
- // Listen for agent responses
60
- client.on(ClientEventType.SERVER_MESSAGE, (message) => {
61
- if (message.type === 'agentEvent') {
62
- switch (message.event.type) {
63
- case AgentEventType.AGENT_MESSAGE:
64
- console.log('Agent:', message.event.data.message);
65
- break;
66
- case AgentEventType.STREAM_CHUNK:
67
- console.log('Chunk:', message.event.data.chunk);
68
- break;
69
- case AgentEventType.TOOL_CALL:
70
- console.log('Tool:', message.event.data.toolName);
71
- break;
72
- }
73
- }
74
- });
75
-
76
- // Send messages
77
- client.sendInput('Write a hello world function');
78
-
79
- // Disconnect when done
80
- client.disconnect();
81
- ```
82
-
83
- ### Configuration Options
84
-
85
- ```typescript
86
- const client = new GenesysAgentClient({
87
- autoReconnect: true, // Enable automatic reconnection (default: true)
88
- maxReconnectAttempts: 5, // Max reconnection attempts (default: 5)
89
- reconnectInterval: 1000, // Initial interval in ms, uses exponential backoff (default: 1000)
90
- debug: false // Enable debug logging (default: false)
91
- });
92
-
93
- await client.connect({
94
- serverAddress: 'http://localhost:3000', // Agent server HTTP address
95
- specPath: 'coder.yaml' // Agent specification file path
96
- });
97
- ```
98
-
99
- ### Error Handling
100
-
101
- ```typescript
102
- try {
103
- await client.connect(config);
104
- } catch (error) {
105
- console.error('Connection failed:', error);
106
- }
107
-
108
- client.on(ClientEventType.DISCONNECTED, (reason) => {
109
- console.log('Disconnected:', reason);
110
- });
111
- ```
112
-
113
- ### Event Types
114
-
115
- The client emits events for:
116
- - **SERVER_MESSAGE** - All messages from the server (agent responses, tool calls, errors, etc.)
117
- - **STATE_CHANGE** - Connection state changes (connecting, connected, reconnecting, disconnected)
118
- - **DISCONNECTED** - Connection closed
119
- - **CONTROL_MESSAGE** - Status messages (e.g., reconnection attempts)
1
+ # Genesys Agent Client
2
+
3
+ ## Summary
4
+
5
+ The Genesys Agent Client (`@gnsx/genesys.agent.client`) is a TypeScript/JavaScript library for integrating AI-powered development agents into web applications and browser-based tools. It provides a WebSocket-based client for real-time communication with Genesys Agent Server instances.
6
+
7
+ ### Key Features
8
+
9
+ - **Real-Time Communication**: WebSocket-based connection for instant bidirectional communication with agent servers
10
+ - **Session Management**: Automatic session creation, connection, and lifecycle management
11
+ - **Event-Driven Architecture**: Comprehensive event system for handling agent messages, tool calls, and state changes
12
+ - **Auto-Reconnection**: Built-in automatic reconnection with exponential backoff and configurable retry limits
13
+ - **Full TypeScript Support**: Complete type definitions for all APIs, events, and messages
14
+ - **Browser & Node.js Compatible**: Works in both browser and Node.js environments
15
+ - **Lightweight**: Minimal dependencies, optimized for web applications
16
+
17
+ ## Installation
18
+
19
+ ### Prerequisites
20
+
21
+ - **Node.js**: Version 18 or higher (for development)
22
+ - **Browser**: Modern browser with WebSocket support (for runtime)
23
+ - **Package Manager**: npm, yarn, or pnpm
24
+
25
+ ### Installation
26
+
27
+ Install the client library using your preferred package manager:
28
+
29
+ **npm:**
30
+ ```bash
31
+ npm install @gnsx/genesys.agent.client
32
+ ```
33
+
34
+ **pnpm:**
35
+ ```bash
36
+ pnpm add @gnsx/genesys.agent.client
37
+ ```
38
+
39
+ **yarn:**
40
+ ```bash
41
+ yarn add @gnsx/genesys.agent.client
42
+ ```
43
+
44
+ ## Usage
45
+
46
+ ### Basic Example
47
+
48
+ ```typescript
49
+ import { GenesysAgentClient, ClientEventType, AgentEventType } from '@gnsx/genesys.agent.client';
50
+
51
+ const client = new GenesysAgentClient({ autoReconnect: true });
52
+
53
+ // Connect to server
54
+ await client.connect({
55
+ serverAddress: 'http://localhost:3000',
56
+ specPath: 'coder.yaml'
57
+ });
58
+
59
+ // Listen for agent responses
60
+ client.on(ClientEventType.SERVER_MESSAGE, (message) => {
61
+ if (message.type === 'agentEvent') {
62
+ switch (message.event.type) {
63
+ case AgentEventType.AGENT_MESSAGE:
64
+ console.log('Agent:', message.event.data.message);
65
+ break;
66
+ case AgentEventType.STREAM_CHUNK:
67
+ console.log('Chunk:', message.event.data.chunk);
68
+ break;
69
+ case AgentEventType.TOOL_CALL:
70
+ console.log('Tool:', message.event.data.toolName);
71
+ break;
72
+ }
73
+ }
74
+ });
75
+
76
+ // Send messages
77
+ client.sendInput('Write a hello world function');
78
+
79
+ // Disconnect when done
80
+ client.disconnect();
81
+ ```
82
+
83
+ ### Configuration Options
84
+
85
+ ```typescript
86
+ const client = new GenesysAgentClient({
87
+ autoReconnect: true, // Enable automatic reconnection (default: true)
88
+ maxReconnectAttempts: 5, // Max reconnection attempts (default: 5)
89
+ reconnectInterval: 1000, // Initial interval in ms, uses exponential backoff (default: 1000)
90
+ debug: false // Enable debug logging (default: false)
91
+ });
92
+
93
+ await client.connect({
94
+ serverAddress: 'http://localhost:3000', // Agent server HTTP address
95
+ specPath: 'coder.yaml' // Agent specification file path
96
+ });
97
+ ```
98
+
99
+ ### Error Handling
100
+
101
+ ```typescript
102
+ try {
103
+ await client.connect(config);
104
+ } catch (error) {
105
+ console.error('Connection failed:', error);
106
+ }
107
+
108
+ client.on(ClientEventType.DISCONNECTED, (reason) => {
109
+ console.log('Disconnected:', reason);
110
+ });
111
+ ```
112
+
113
+ ### Event Types
114
+
115
+ The client emits events for:
116
+ - **SERVER_MESSAGE** - All messages from the server (agent responses, tool calls, errors, etc.)
117
+ - **STATE_CHANGE** - Connection state changes (connecting, connected, reconnecting, disconnected)
118
+ - **DISCONNECTED** - Connection closed
119
+ - **CONTROL_MESSAGE** - Status messages (e.g., reconnection attempts)
@@ -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.cjs","sourcesContent":["import type { AgentEvent } from './events.js';\r\n\r\nexport interface SessionInfo {\r\n sessionId: string;\r\n specName?: string;\r\n model?: string;\r\n}\r\n\r\nexport enum ServerMessageType {\r\n PING = 'ping',\r\n AGENT_EVENT = 'agent_event',\r\n CONNECTION_ESTABLISHED = 'connection_established',\r\n REQUEST_INPUT = 'request_input',\r\n ERROR = 'error',\r\n SESSION_INFO = 'session_info',\r\n SESSION_RESTORED = 'session_restored',\r\n}\r\n\r\nexport enum ClientMessageType {\r\n PONG = 'pong',\r\n INPUT = 'input',\r\n}\r\n\r\nexport enum ServerErrorCode {\r\n GENERIC = 'generic',\r\n SESSION_NOT_FOUND = 'session_not_found',\r\n INVALID_CLIENT_MESSAGE = 'invalid_client_message',\r\n AGENT_INITIALIZATION_FAILED = 'agent_initialization_failed',\r\n}\r\n\r\nexport type ServerMessage = AgentEventMessage | ConnectionEstablishedMessage | RequestInputMessage | ErrorMessage |\r\n SessionInfoMessage | SessionRestoredMessage | InputMessage | PingMessage;\r\n\r\nexport type ClientMessage = InputMessage | { type: ClientMessageType.PONG };\r\n\r\nexport interface AgentEventMessage {\r\n type: ServerMessageType.AGENT_EVENT;\r\n event: AgentEvent;\r\n}\r\n\r\nexport interface ConnectionEstablishedMessage {\r\n type: ServerMessageType.CONNECTION_ESTABLISHED;\r\n specName: string;\r\n model: string;\r\n sessionId: string;\r\n}\r\n\r\nexport interface RequestInputMessage {\r\n type: ServerMessageType.REQUEST_INPUT;\r\n}\r\n\r\nexport interface ErrorMessage {\r\n type: ServerMessageType.ERROR;\r\n message: string;\r\n code: ServerErrorCode;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: ServerMessageType.PING;\r\n}\r\n\r\nexport interface SessionInfoMessage {\r\n type: ServerMessageType.SESSION_INFO;\r\n sessionInfo: SessionInfo;\r\n}\r\n\r\nexport interface SessionRestoredMessage {\r\n type: ServerMessageType.SESSION_RESTORED;\r\n sessionId: string;\r\n specName: string;\r\n model: string;\r\n}\r\n\r\nexport interface InputMessage {\r\n type: ClientMessageType.INPUT;\r\n text: string;\r\n}\r\n","export enum AgentEventType {\r\n USER_MESSAGE = 'user_message',\r\n AGENT_MESSAGE = 'agent_message',\r\n STREAM_CHUNK = 'stream_chunk',\r\n TOOL_CALL = 'tool_call',\r\n TOOL_RESULT = 'tool_result',\r\n TOOL_ERROR = 'tool_error',\r\n REASONING = 'reasoning',\r\n TOKEN_USAGE = 'token_usage',\r\n TODO_LIST = 'todo_list',\r\n SEND_DATA = 'send_data',\r\n ERROR = 'error',\r\n MESSAGES_CLEARED = 'messages_cleared',\r\n MODEL_UPDATED = 'model_updated',\r\n ROUND_FINISHED = 'round_finished',\r\n}\r\n\r\nexport interface UserMessageEvent {\r\n type: AgentEventType.USER_MESSAGE;\r\n data: {\r\n message: string;\r\n };\r\n}\r\n\r\nexport interface AgentMessageEvent {\r\n type: AgentEventType.AGENT_MESSAGE;\r\n data: {\r\n message: string;\r\n streaming?: boolean;\r\n };\r\n}\r\n\r\nexport interface StreamChunkEvent {\r\n type: AgentEventType.STREAM_CHUNK;\r\n data: {\r\n chunk: string;\r\n };\r\n}\r\n\r\nexport interface ToolCallEvent {\r\n type: AgentEventType.TOOL_CALL;\r\n data: {\r\n toolCallId: string;\r\n toolName: string;\r\n input: any;\r\n };\r\n}\r\n\r\nexport interface ToolResultEvent {\r\n type: AgentEventType.TOOL_RESULT;\r\n data: {\r\n toolCallId: string;\r\n toolName: string;\r\n result: any;\r\n };\r\n}\r\n\r\nexport interface ToolErrorEvent {\r\n type: AgentEventType.TOOL_ERROR;\r\n data: {\r\n toolCallId?: string;\r\n toolName: string;\r\n error: any;\r\n };\r\n}\r\nexport interface ReasoningEvent {\r\n type: AgentEventType.REASONING;\r\n data: {\r\n text: string;\r\n };\r\n}\r\n\r\nexport interface TokenUsageEvent {\r\n type: AgentEventType.TOKEN_USAGE;\r\n data: {\r\n roundIndex: number;\r\n currentInputTokens: number;\r\n currentOutputTokens: number;\r\n currentReasoningTokens: number;\r\n currentCachedInputTokens: number;\r\n increasedInputTokens: number;\r\n increasedOutputTokens: number;\r\n accumulatedInputTokens: number;\r\n accumulatedOutputTokens: number;\r\n accumulatedReasoningTokens: number;\r\n accumulatedCachedInputTokens: number;\r\n currentInputCost: number;\r\n currentOutputCost: number;\r\n currentTotalCost: number;\r\n accumulatedInputCost: number;\r\n accumulatedOutputCost: number;\r\n accumulatedTotalCost: number;\r\n };\r\n}\r\n\r\nexport enum TodoStatus {\r\n PENDING = 'pending',\r\n IN_PROGRESS = 'in_progress',\r\n COMPLETED = 'completed',\r\n}\r\n\r\nexport enum TodoPriority {\r\n HIGH = 'high',\r\n MEDIUM = 'medium',\r\n LOW = 'low',\r\n}\r\n\r\nexport interface TodoItem {\r\n content: string;\r\n status: TodoStatus;\r\n priority: TodoPriority;\r\n id: string;\r\n}\r\n\r\nexport interface TodoListEvent {\r\n type: AgentEventType.TODO_LIST;\r\n data: {\r\n todos: TodoItem[];\r\n };\r\n}\r\n\r\nexport interface SendDataEvent {\r\n type: AgentEventType.SEND_DATA;\r\n data: {\r\n data: string;\r\n };\r\n}\r\n\r\nexport interface ErrorEvent {\r\n type: AgentEventType.ERROR;\r\n data: {\r\n error: any\r\n }\r\n}\r\n\r\nexport interface MessagesClearedEvent {\r\n type: AgentEventType.MESSAGES_CLEARED;\r\n}\r\n\r\nexport interface ModelUpdatedEvent {\r\n type: AgentEventType.MODEL_UPDATED;\r\n data: {\r\n oldModel: string;\r\n newModel: string;\r\n };\r\n}\r\n\r\nexport interface RoundFinishedEvent {\r\n type: AgentEventType.ROUND_FINISHED;\r\n data: {\r\n roundIndex: number;\r\n };\r\n}\r\n\r\nexport type AgentEvent = UserMessageEvent | AgentMessageEvent | StreamChunkEvent | ToolCallEvent | ToolErrorEvent | ToolResultEvent |\r\n ReasoningEvent | TokenUsageEvent| TodoListEvent | SendDataEvent | ErrorEvent | MessagesClearedEvent | ModelUpdatedEvent | RoundFinishedEvent;\r\n","// Browser-compatible exports from shared package\r\n// Only exports types and constants, no Node.js dependencies\r\n\r\nexport * from './types.js';\r\nexport * from './events.js';\r\n\r\n// Browser-safe constants (no Node.js dependencies)\r\n\r\n// Server configuration\r\nexport const DEFAULT_PORT = 4400;\r\nexport const DEFAULT_SESSION_DIR = '/tmp/agent-sessions';\r\nexport const DEFAULT_SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\r\nexport const DEFAULT_MAX_SESSIONS = 100;\r\n\r\n// File upload limits\r\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\r\n\r\n// WebSocket configuration\r\nexport const WS_HEARTBEAT_INTERVAL = 20000; // 20 seconds\r\n\r\n// System context\r\nexport const SYSTEM_CONTEXT_PLACEHOLDER = '{systemContext}';\r\nexport const PROJECT_LAYOUT_PLACEHOLDER = '{projectLayout}';\r\n\r\n","import type { ServerMessage } from '@gnsx/genesys.agent.shared/browser';\r\n\r\nexport interface ClientOptions {\r\n autoReconnect?: boolean;\r\n maxReconnectAttempts?: number;\r\n reconnectInterval?: number;\r\n debug?: boolean;\r\n}\r\n\r\nexport interface SessionConfig {\r\n serverAddress: string;\r\n specPath: string;\r\n}\r\n\r\nexport interface ControlMessage {\r\n message: string;\r\n isError: boolean;\r\n}\r\n\r\nexport enum ClientState {\r\n DISCONNECTED = 'disconnected',\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n RECONNECTING = 'reconnecting'\r\n}\r\n\r\nexport enum ClientEventType {\r\n SERVER_MESSAGE = 'serverMessage',\r\n DISCONNECTED = 'disconnected',\r\n STATE_CHANGE = 'stateChange',\r\n CONTROL_MESSAGE = 'controlMessage',\r\n}\r\n\r\nexport interface ClientEventMap {\r\n [ClientEventType.SERVER_MESSAGE]: (message: ServerMessage) => void;\r\n [ClientEventType.DISCONNECTED]: (reason?: string) => void;\r\n [ClientEventType.STATE_CHANGE]: (state: ClientState) => void;\r\n [ClientEventType.CONTROL_MESSAGE]: (message: ControlMessage) => void;\r\n}\r\n","import { AgentEventType, ClientMessageType, ServerErrorCode, ServerMessageType } from '@gnsx/genesys.agent.shared/browser';\r\n\r\nimport { ClientEventType, ClientState } from './types.js';\r\n\r\nimport type { ClientEventMap , ClientOptions, SessionConfig } from './types.js';\r\nimport type { ClientMessage, ErrorMessage, ServerMessage} from '@gnsx/genesys.agent.shared/browser';\r\n\r\nconst LOG_PREFIX = '[GenesysAgentClient]';\r\n\r\nexport class GenesysAgentClient {\r\n protected ws: WebSocket | null = null;\r\n protected sessionId: string | null = null;\r\n protected wsUrl: string | null = null;\r\n protected state: ClientState = ClientState.DISCONNECTED;\r\n protected reconnectAttempts = 0;\r\n protected reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\r\n protected intentionalClose = false;\r\n\r\n protected eventListeners: Map<ClientEventType, Set<Function>> = new Map();\r\n\r\n protected serverAddress: string | null = null;\r\n\r\n protected config: SessionConfig | null = null;\r\n\r\n constructor(readonly options: ClientOptions = {}) {\r\n this.options.autoReconnect = this.options.autoReconnect ?? true;\r\n this.options.maxReconnectAttempts = this.options.maxReconnectAttempts ?? 5;\r\n this.options.reconnectInterval = this.options.reconnectInterval ?? 1000;\r\n this.options.debug = this.options.debug ?? false;\r\n }\r\n\r\n public async connect(config: SessionConfig): Promise<void> {\r\n if (this.state === ClientState.CONNECTED || this.state === ClientState.CONNECTING) {\r\n throw new Error('Already connected or connecting');\r\n }\r\n\r\n if (!config.serverAddress) {\r\n throw new Error('Server address is required');\r\n }\r\n\r\n // save the config in case we need to connect again\r\n this.config = config;\r\n\r\n // Remove trailing slash from server address\r\n this.serverAddress = config.serverAddress.replace(/\\/+$/, '');\r\n\r\n this.setState(ClientState.CONNECTING);\r\n this.intentionalClose = false;\r\n\r\n try {\r\n // Create session via HTTP\r\n const response = await fetch(`${this.serverAddress}/sessions`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ specPath: config.specPath })\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({ error: 'Failed to create session' }));\r\n throw new Error(errorData.error ?? 'Failed to create session');\r\n }\r\n\r\n const sessionInfo: { sessionId: string; wsUrl: string } = await response.json();\r\n this.sessionId = sessionInfo.sessionId;\r\n this.wsUrl = sessionInfo.wsUrl;\r\n if (!this.sessionId) {\r\n throw new Error('Session ID is required');\r\n }\r\n if (!this.wsUrl) {\r\n throw new Error('WebSocket URL is required');\r\n }\r\n\r\n // Connect WebSocket\r\n await this.connectWebSocket(false);\r\n } catch (error) {\r\n this.setState(ClientState.DISCONNECTED);\r\n throw error;\r\n }\r\n }\r\n\r\n protected async connectWebSocket(isReconnecting: boolean): Promise<void> {\r\n if (!this.wsUrl) {\r\n throw new Error('No WebSocket URL available');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.ws = new WebSocket(this.wsUrl!);\r\n\r\n this.ws.onopen = () => {\r\n this.setState(ClientState.CONNECTED);\r\n this.reconnectAttempts = 0;\r\n resolve();\r\n };\r\n\r\n this.ws.onmessage = (event) => {\r\n try {\r\n const message: ServerMessage = JSON.parse(event.data);\r\n this.handleServerMessage(message);\r\n } catch (error) {\r\n this.debug('Failed to parse message:', error);\r\n }\r\n };\r\n\r\n this.ws.onclose = () => {\r\n this.setState(ClientState.DISCONNECTED);\r\n if (!isReconnecting) {\r\n this.emit(ClientEventType.DISCONNECTED, this.intentionalClose ? 'User disconnected' : 'Connection lost');\r\n\r\n if (!this.intentionalClose && this.options.autoReconnect && this.sessionId) {\r\n this.attemptReconnect();\r\n }\r\n }\r\n };\r\n\r\n this.ws.onerror = (error) => {\r\n this.debug('WebSocket error:', error);\r\n reject(error);\r\n };\r\n });\r\n }\r\n\r\n protected handleServerMessage(message: ServerMessage): void {\r\n if (message.type === ServerMessageType.AGENT_EVENT) {\r\n switch (message.event.type) {\r\n case AgentEventType.USER_MESSAGE:\r\n this.debug('USER_MESSAGE:\\n', message.event.data.message);\r\n break;\r\n case AgentEventType.AGENT_MESSAGE:\r\n this.debug('AGENT_MESSAGE:\\n', message.event.data.message);\r\n break;\r\n case AgentEventType.STREAM_CHUNK:\r\n this.debug('STREAM_CHUNK:\\n', message.event.data.chunk);\r\n break;\r\n case AgentEventType.TOOL_CALL:\r\n this.debug('TOOL_CALL:\\n', message.event.data.toolName, message.event.data.input);\r\n break;\r\n case AgentEventType.TOOL_RESULT:\r\n this.debug('TOOL_RESULT:\\n', message.event.data.toolName, message.event.data.result);\r\n break;\r\n case AgentEventType.TOOL_ERROR:\r\n console.error(LOG_PREFIX, 'TOOL_ERROR:\\n', message.event.data.toolName, message.event.data.error);\r\n break;\r\n case AgentEventType.REASONING:\r\n this.debug('REASONING:\\n', message.event.data.text);\r\n break;\r\n case AgentEventType.TOKEN_USAGE:\r\n this.debug('TOKEN_USAGE:\\n', message.event.data);\r\n break;\r\n case AgentEventType.TODO_LIST:\r\n this.debug('TODO_LIST:\\n', message.event.data.todos);\r\n break;\r\n case AgentEventType.SEND_DATA:\r\n this.debug('SEND_DATA:\\n', message.event.data.data);\r\n break;\r\n case AgentEventType.ERROR:\r\n console.error(LOG_PREFIX, 'AGENT_ERROR:\\n', message.event.data.error);\r\n break;\r\n case AgentEventType.MESSAGES_CLEARED:\r\n this.debug('MESSAGES_CLEARED:\\n');\r\n break;\r\n default:\r\n console.error(LOG_PREFIX, 'Unknown agent event:\\n', message.event);\r\n break;\r\n }\r\n } else {\r\n this.debug('handleServerMessage:', message);\r\n }\r\n\r\n if (message.type === ServerMessageType.ERROR) {\r\n this.handleServerError(message);\r\n }\r\n this.emit(ClientEventType.SERVER_MESSAGE, message);\r\n }\r\n\r\n public sendInput(text: string): void {\r\n if (this.state !== ClientState.CONNECTED) {\r\n throw new Error('Not connected');\r\n }\r\n\r\n this.send({\r\n type: ClientMessageType.INPUT,\r\n text\r\n });\r\n }\r\n\r\n public abort(): void {\r\n if (this.state !== ClientState.CONNECTED) {\r\n throw new Error('Not connected');\r\n }\r\n\r\n throw new Error('Not implemented');\r\n }\r\n\r\n public disconnect(): void {\r\n this.intentionalClose = true;\r\n\r\n if (this.reconnectTimeout) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n\r\n this.sessionId = null;\r\n this.wsUrl = null;\r\n this.setState(ClientState.DISCONNECTED);\r\n }\r\n\r\n protected attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts!) {\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Failed to reconnect after ${this.options.maxReconnectAttempts} attempts`, isError: true });\r\n this.sessionId = null;\r\n this.wsUrl = null;\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n const delay = Math.min(5000, this.options.reconnectInterval! * Math.pow(1.5, this.reconnectAttempts - 1));\r\n\r\n this.setState(ClientState.RECONNECTING);\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Reconnect attempt ${this.reconnectAttempts}/${this.options.maxReconnectAttempts}...`, isError: false });\r\n\r\n this.reconnectTimeout = setTimeout(async () => {\r\n try {\r\n await this.connectWebSocket(true);\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: 'Reconnected to server', isError: false });\r\n } catch {\r\n this.attemptReconnect();\r\n }\r\n }, delay);\r\n }\r\n\r\n protected send(message: ClientMessage): void {\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n\r\n protected setState(state: ClientState): void {\r\n if (this.state !== state) {\r\n this.state = state;\r\n this.emit(ClientEventType.STATE_CHANGE, state);\r\n }\r\n }\r\n\r\n public getState(): ClientState {\r\n return this.state;\r\n }\r\n\r\n public isConnected(): boolean {\r\n return this.state === ClientState.CONNECTED;\r\n }\r\n\r\n public getSessionId(): string | null {\r\n return this.sessionId;\r\n }\r\n\r\n // Event emitter methods\r\n public on(event: ClientEventType, listener: ClientEventMap[ClientEventType]): ClientEventMap[ClientEventType] {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, new Set());\r\n }\r\n this.eventListeners.get(event)!.add(listener);\r\n return listener;\r\n }\r\n\r\n public off(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.delete(listener);\r\n }\r\n }\r\n\r\n public once(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\r\n const onceListener = ((...args: Parameters<ClientEventMap[ClientEventType]>) => {\r\n this.off(event, onceListener);\r\n (listener as Function)(...args);\r\n }) as ClientEventMap[ClientEventType];\r\n\r\n this.on(event, onceListener);\r\n }\r\n\r\n protected emit(event: ClientEventType, ...args: Parameters<ClientEventMap[ClientEventType]>): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.forEach(listener => {\r\n try {\r\n (listener as Function)(...args);\r\n } catch (error) {\r\n this.debug(`Error in ${event} listener:`, error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected debug(...args: unknown[]): void {\r\n if (this.options.debug) {\r\n console.log(LOG_PREFIX, ...args);\r\n }\r\n }\r\n\r\n\r\n protected async handleServerError(message: ErrorMessage): Promise<void> {\r\n if (message.code === ServerErrorCode.SESSION_NOT_FOUND) {\r\n // reconnect to get a new session\r\n try {\r\n console.warn('SESSION_NOT_FOUND, reconnecting to get a new session');\r\n this.disconnect();\r\n await this.connect(this.config!);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n}\r\n"]}
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.cjs","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"]}
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';\r\n\r\nexport interface SessionInfo {\r\n sessionId: string;\r\n specName?: string;\r\n model?: string;\r\n}\r\n\r\nexport enum ServerMessageType {\r\n PING = 'ping',\r\n AGENT_EVENT = 'agent_event',\r\n CONNECTION_ESTABLISHED = 'connection_established',\r\n REQUEST_INPUT = 'request_input',\r\n ERROR = 'error',\r\n SESSION_INFO = 'session_info',\r\n SESSION_RESTORED = 'session_restored',\r\n}\r\n\r\nexport enum ClientMessageType {\r\n PONG = 'pong',\r\n INPUT = 'input',\r\n}\r\n\r\nexport enum ServerErrorCode {\r\n GENERIC = 'generic',\r\n SESSION_NOT_FOUND = 'session_not_found',\r\n INVALID_CLIENT_MESSAGE = 'invalid_client_message',\r\n AGENT_INITIALIZATION_FAILED = 'agent_initialization_failed',\r\n}\r\n\r\nexport type ServerMessage = AgentEventMessage | ConnectionEstablishedMessage | RequestInputMessage | ErrorMessage |\r\n SessionInfoMessage | SessionRestoredMessage | InputMessage | PingMessage;\r\n\r\nexport type ClientMessage = InputMessage | { type: ClientMessageType.PONG };\r\n\r\nexport interface AgentEventMessage {\r\n type: ServerMessageType.AGENT_EVENT;\r\n event: AgentEvent;\r\n}\r\n\r\nexport interface ConnectionEstablishedMessage {\r\n type: ServerMessageType.CONNECTION_ESTABLISHED;\r\n specName: string;\r\n model: string;\r\n sessionId: string;\r\n}\r\n\r\nexport interface RequestInputMessage {\r\n type: ServerMessageType.REQUEST_INPUT;\r\n}\r\n\r\nexport interface ErrorMessage {\r\n type: ServerMessageType.ERROR;\r\n message: string;\r\n code: ServerErrorCode;\r\n}\r\n\r\nexport interface PingMessage {\r\n type: ServerMessageType.PING;\r\n}\r\n\r\nexport interface SessionInfoMessage {\r\n type: ServerMessageType.SESSION_INFO;\r\n sessionInfo: SessionInfo;\r\n}\r\n\r\nexport interface SessionRestoredMessage {\r\n type: ServerMessageType.SESSION_RESTORED;\r\n sessionId: string;\r\n specName: string;\r\n model: string;\r\n}\r\n\r\nexport interface InputMessage {\r\n type: ClientMessageType.INPUT;\r\n text: string;\r\n}\r\n","export enum AgentEventType {\r\n USER_MESSAGE = 'user_message',\r\n AGENT_MESSAGE = 'agent_message',\r\n STREAM_CHUNK = 'stream_chunk',\r\n TOOL_CALL = 'tool_call',\r\n TOOL_RESULT = 'tool_result',\r\n TOOL_ERROR = 'tool_error',\r\n REASONING = 'reasoning',\r\n TOKEN_USAGE = 'token_usage',\r\n TODO_LIST = 'todo_list',\r\n SEND_DATA = 'send_data',\r\n ERROR = 'error',\r\n MESSAGES_CLEARED = 'messages_cleared',\r\n MODEL_UPDATED = 'model_updated',\r\n ROUND_FINISHED = 'round_finished',\r\n}\r\n\r\nexport interface UserMessageEvent {\r\n type: AgentEventType.USER_MESSAGE;\r\n data: {\r\n message: string;\r\n };\r\n}\r\n\r\nexport interface AgentMessageEvent {\r\n type: AgentEventType.AGENT_MESSAGE;\r\n data: {\r\n message: string;\r\n streaming?: boolean;\r\n };\r\n}\r\n\r\nexport interface StreamChunkEvent {\r\n type: AgentEventType.STREAM_CHUNK;\r\n data: {\r\n chunk: string;\r\n };\r\n}\r\n\r\nexport interface ToolCallEvent {\r\n type: AgentEventType.TOOL_CALL;\r\n data: {\r\n toolCallId: string;\r\n toolName: string;\r\n input: any;\r\n };\r\n}\r\n\r\nexport interface ToolResultEvent {\r\n type: AgentEventType.TOOL_RESULT;\r\n data: {\r\n toolCallId: string;\r\n toolName: string;\r\n result: any;\r\n };\r\n}\r\n\r\nexport interface ToolErrorEvent {\r\n type: AgentEventType.TOOL_ERROR;\r\n data: {\r\n toolCallId?: string;\r\n toolName: string;\r\n error: any;\r\n };\r\n}\r\nexport interface ReasoningEvent {\r\n type: AgentEventType.REASONING;\r\n data: {\r\n text: string;\r\n };\r\n}\r\n\r\nexport interface TokenUsageEvent {\r\n type: AgentEventType.TOKEN_USAGE;\r\n data: {\r\n roundIndex: number;\r\n currentInputTokens: number;\r\n currentOutputTokens: number;\r\n currentReasoningTokens: number;\r\n currentCachedInputTokens: number;\r\n increasedInputTokens: number;\r\n increasedOutputTokens: number;\r\n accumulatedInputTokens: number;\r\n accumulatedOutputTokens: number;\r\n accumulatedReasoningTokens: number;\r\n accumulatedCachedInputTokens: number;\r\n currentInputCost: number;\r\n currentOutputCost: number;\r\n currentTotalCost: number;\r\n accumulatedInputCost: number;\r\n accumulatedOutputCost: number;\r\n accumulatedTotalCost: number;\r\n };\r\n}\r\n\r\nexport enum TodoStatus {\r\n PENDING = 'pending',\r\n IN_PROGRESS = 'in_progress',\r\n COMPLETED = 'completed',\r\n}\r\n\r\nexport enum TodoPriority {\r\n HIGH = 'high',\r\n MEDIUM = 'medium',\r\n LOW = 'low',\r\n}\r\n\r\nexport interface TodoItem {\r\n content: string;\r\n status: TodoStatus;\r\n priority: TodoPriority;\r\n id: string;\r\n}\r\n\r\nexport interface TodoListEvent {\r\n type: AgentEventType.TODO_LIST;\r\n data: {\r\n todos: TodoItem[];\r\n };\r\n}\r\n\r\nexport interface SendDataEvent {\r\n type: AgentEventType.SEND_DATA;\r\n data: {\r\n data: string;\r\n };\r\n}\r\n\r\nexport interface ErrorEvent {\r\n type: AgentEventType.ERROR;\r\n data: {\r\n error: any\r\n }\r\n}\r\n\r\nexport interface MessagesClearedEvent {\r\n type: AgentEventType.MESSAGES_CLEARED;\r\n}\r\n\r\nexport interface ModelUpdatedEvent {\r\n type: AgentEventType.MODEL_UPDATED;\r\n data: {\r\n oldModel: string;\r\n newModel: string;\r\n };\r\n}\r\n\r\nexport interface RoundFinishedEvent {\r\n type: AgentEventType.ROUND_FINISHED;\r\n data: {\r\n roundIndex: number;\r\n };\r\n}\r\n\r\nexport type AgentEvent = UserMessageEvent | AgentMessageEvent | StreamChunkEvent | ToolCallEvent | ToolErrorEvent | ToolResultEvent |\r\n ReasoningEvent | TokenUsageEvent| TodoListEvent | SendDataEvent | ErrorEvent | MessagesClearedEvent | ModelUpdatedEvent | RoundFinishedEvent;\r\n","// Browser-compatible exports from shared package\r\n// Only exports types and constants, no Node.js dependencies\r\n\r\nexport * from './types.js';\r\nexport * from './events.js';\r\n\r\n// Browser-safe constants (no Node.js dependencies)\r\n\r\n// Server configuration\r\nexport const DEFAULT_PORT = 4400;\r\nexport const DEFAULT_SESSION_DIR = '/tmp/agent-sessions';\r\nexport const DEFAULT_SESSION_TIMEOUT = 30 * 60 * 1000; // 30 minutes\r\nexport const DEFAULT_MAX_SESSIONS = 100;\r\n\r\n// File upload limits\r\nexport const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\r\n\r\n// WebSocket configuration\r\nexport const WS_HEARTBEAT_INTERVAL = 20000; // 20 seconds\r\n\r\n// System context\r\nexport const SYSTEM_CONTEXT_PLACEHOLDER = '{systemContext}';\r\nexport const PROJECT_LAYOUT_PLACEHOLDER = '{projectLayout}';\r\n\r\n","import type { ServerMessage } from '@gnsx/genesys.agent.shared/browser';\r\n\r\nexport interface ClientOptions {\r\n autoReconnect?: boolean;\r\n maxReconnectAttempts?: number;\r\n reconnectInterval?: number;\r\n debug?: boolean;\r\n}\r\n\r\nexport interface SessionConfig {\r\n serverAddress: string;\r\n specPath: string;\r\n}\r\n\r\nexport interface ControlMessage {\r\n message: string;\r\n isError: boolean;\r\n}\r\n\r\nexport enum ClientState {\r\n DISCONNECTED = 'disconnected',\r\n CONNECTING = 'connecting',\r\n CONNECTED = 'connected',\r\n RECONNECTING = 'reconnecting'\r\n}\r\n\r\nexport enum ClientEventType {\r\n SERVER_MESSAGE = 'serverMessage',\r\n DISCONNECTED = 'disconnected',\r\n STATE_CHANGE = 'stateChange',\r\n CONTROL_MESSAGE = 'controlMessage',\r\n}\r\n\r\nexport interface ClientEventMap {\r\n [ClientEventType.SERVER_MESSAGE]: (message: ServerMessage) => void;\r\n [ClientEventType.DISCONNECTED]: (reason?: string) => void;\r\n [ClientEventType.STATE_CHANGE]: (state: ClientState) => void;\r\n [ClientEventType.CONTROL_MESSAGE]: (message: ControlMessage) => void;\r\n}\r\n","import { AgentEventType, ClientMessageType, ServerErrorCode, ServerMessageType } from '@gnsx/genesys.agent.shared/browser';\r\n\r\nimport { ClientEventType, ClientState } from './types.js';\r\n\r\nimport type { ClientEventMap , ClientOptions, SessionConfig } from './types.js';\r\nimport type { ClientMessage, ErrorMessage, ServerMessage} from '@gnsx/genesys.agent.shared/browser';\r\n\r\nconst LOG_PREFIX = '[GenesysAgentClient]';\r\n\r\nexport class GenesysAgentClient {\r\n protected ws: WebSocket | null = null;\r\n protected sessionId: string | null = null;\r\n protected wsUrl: string | null = null;\r\n protected state: ClientState = ClientState.DISCONNECTED;\r\n protected reconnectAttempts = 0;\r\n protected reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\r\n protected intentionalClose = false;\r\n\r\n protected eventListeners: Map<ClientEventType, Set<Function>> = new Map();\r\n\r\n protected serverAddress: string | null = null;\r\n\r\n protected config: SessionConfig | null = null;\r\n\r\n constructor(readonly options: ClientOptions = {}) {\r\n this.options.autoReconnect = this.options.autoReconnect ?? true;\r\n this.options.maxReconnectAttempts = this.options.maxReconnectAttempts ?? 5;\r\n this.options.reconnectInterval = this.options.reconnectInterval ?? 1000;\r\n this.options.debug = this.options.debug ?? false;\r\n }\r\n\r\n public async connect(config: SessionConfig): Promise<void> {\r\n if (this.state === ClientState.CONNECTED || this.state === ClientState.CONNECTING) {\r\n throw new Error('Already connected or connecting');\r\n }\r\n\r\n if (!config.serverAddress) {\r\n throw new Error('Server address is required');\r\n }\r\n\r\n // save the config in case we need to connect again\r\n this.config = config;\r\n\r\n // Remove trailing slash from server address\r\n this.serverAddress = config.serverAddress.replace(/\\/+$/, '');\r\n\r\n this.setState(ClientState.CONNECTING);\r\n this.intentionalClose = false;\r\n\r\n try {\r\n // Create session via HTTP\r\n const response = await fetch(`${this.serverAddress}/sessions`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ specPath: config.specPath })\r\n });\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({ error: 'Failed to create session' }));\r\n throw new Error(errorData.error ?? 'Failed to create session');\r\n }\r\n\r\n const sessionInfo: { sessionId: string; wsUrl: string } = await response.json();\r\n this.sessionId = sessionInfo.sessionId;\r\n this.wsUrl = sessionInfo.wsUrl;\r\n if (!this.sessionId) {\r\n throw new Error('Session ID is required');\r\n }\r\n if (!this.wsUrl) {\r\n throw new Error('WebSocket URL is required');\r\n }\r\n\r\n // Connect WebSocket\r\n await this.connectWebSocket(false);\r\n } catch (error) {\r\n this.setState(ClientState.DISCONNECTED);\r\n throw error;\r\n }\r\n }\r\n\r\n protected async connectWebSocket(isReconnecting: boolean): Promise<void> {\r\n if (!this.wsUrl) {\r\n throw new Error('No WebSocket URL available');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.ws = new WebSocket(this.wsUrl!);\r\n\r\n this.ws.onopen = () => {\r\n this.setState(ClientState.CONNECTED);\r\n this.reconnectAttempts = 0;\r\n resolve();\r\n };\r\n\r\n this.ws.onmessage = (event) => {\r\n try {\r\n const message: ServerMessage = JSON.parse(event.data);\r\n this.handleServerMessage(message);\r\n } catch (error) {\r\n this.debug('Failed to parse message:', error);\r\n }\r\n };\r\n\r\n this.ws.onclose = () => {\r\n this.setState(ClientState.DISCONNECTED);\r\n if (!isReconnecting) {\r\n this.emit(ClientEventType.DISCONNECTED, this.intentionalClose ? 'User disconnected' : 'Connection lost');\r\n\r\n if (!this.intentionalClose && this.options.autoReconnect && this.sessionId) {\r\n this.attemptReconnect();\r\n }\r\n }\r\n };\r\n\r\n this.ws.onerror = (error) => {\r\n this.debug('WebSocket error:', error);\r\n reject(error);\r\n };\r\n });\r\n }\r\n\r\n protected handleServerMessage(message: ServerMessage): void {\r\n if (message.type === ServerMessageType.AGENT_EVENT) {\r\n switch (message.event.type) {\r\n case AgentEventType.USER_MESSAGE:\r\n this.debug('USER_MESSAGE:\\n', message.event.data.message);\r\n break;\r\n case AgentEventType.AGENT_MESSAGE:\r\n this.debug('AGENT_MESSAGE:\\n', message.event.data.message);\r\n break;\r\n case AgentEventType.STREAM_CHUNK:\r\n this.debug('STREAM_CHUNK:\\n', message.event.data.chunk);\r\n break;\r\n case AgentEventType.TOOL_CALL:\r\n this.debug('TOOL_CALL:\\n', message.event.data.toolName, message.event.data.input);\r\n break;\r\n case AgentEventType.TOOL_RESULT:\r\n this.debug('TOOL_RESULT:\\n', message.event.data.toolName, message.event.data.result);\r\n break;\r\n case AgentEventType.TOOL_ERROR:\r\n console.error(LOG_PREFIX, 'TOOL_ERROR:\\n', message.event.data.toolName, message.event.data.error);\r\n break;\r\n case AgentEventType.REASONING:\r\n this.debug('REASONING:\\n', message.event.data.text);\r\n break;\r\n case AgentEventType.TOKEN_USAGE:\r\n this.debug('TOKEN_USAGE:\\n', message.event.data);\r\n break;\r\n case AgentEventType.TODO_LIST:\r\n this.debug('TODO_LIST:\\n', message.event.data.todos);\r\n break;\r\n case AgentEventType.SEND_DATA:\r\n this.debug('SEND_DATA:\\n', message.event.data.data);\r\n break;\r\n case AgentEventType.ERROR:\r\n console.error(LOG_PREFIX, 'AGENT_ERROR:\\n', message.event.data.error);\r\n break;\r\n case AgentEventType.MESSAGES_CLEARED:\r\n this.debug('MESSAGES_CLEARED:\\n');\r\n break;\r\n default:\r\n console.error(LOG_PREFIX, 'Unknown agent event:\\n', message.event);\r\n break;\r\n }\r\n } else {\r\n this.debug('handleServerMessage:', message);\r\n }\r\n\r\n if (message.type === ServerMessageType.ERROR) {\r\n this.handleServerError(message);\r\n }\r\n this.emit(ClientEventType.SERVER_MESSAGE, message);\r\n }\r\n\r\n public sendInput(text: string): void {\r\n if (this.state !== ClientState.CONNECTED) {\r\n throw new Error('Not connected');\r\n }\r\n\r\n this.send({\r\n type: ClientMessageType.INPUT,\r\n text\r\n });\r\n }\r\n\r\n public abort(): void {\r\n if (this.state !== ClientState.CONNECTED) {\r\n throw new Error('Not connected');\r\n }\r\n\r\n throw new Error('Not implemented');\r\n }\r\n\r\n public disconnect(): void {\r\n this.intentionalClose = true;\r\n\r\n if (this.reconnectTimeout) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n\r\n this.sessionId = null;\r\n this.wsUrl = null;\r\n this.setState(ClientState.DISCONNECTED);\r\n }\r\n\r\n protected attemptReconnect(): void {\r\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts!) {\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Failed to reconnect after ${this.options.maxReconnectAttempts} attempts`, isError: true });\r\n this.sessionId = null;\r\n this.wsUrl = null;\r\n return;\r\n }\r\n\r\n this.reconnectAttempts++;\r\n const delay = Math.min(5000, this.options.reconnectInterval! * Math.pow(1.5, this.reconnectAttempts - 1));\r\n\r\n this.setState(ClientState.RECONNECTING);\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: `Reconnect attempt ${this.reconnectAttempts}/${this.options.maxReconnectAttempts}...`, isError: false });\r\n\r\n this.reconnectTimeout = setTimeout(async () => {\r\n try {\r\n await this.connectWebSocket(true);\r\n this.emit(ClientEventType.CONTROL_MESSAGE, { message: 'Reconnected to server', isError: false });\r\n } catch {\r\n this.attemptReconnect();\r\n }\r\n }, delay);\r\n }\r\n\r\n protected send(message: ClientMessage): void {\r\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n }\r\n\r\n protected setState(state: ClientState): void {\r\n if (this.state !== state) {\r\n this.state = state;\r\n this.emit(ClientEventType.STATE_CHANGE, state);\r\n }\r\n }\r\n\r\n public getState(): ClientState {\r\n return this.state;\r\n }\r\n\r\n public isConnected(): boolean {\r\n return this.state === ClientState.CONNECTED;\r\n }\r\n\r\n public getSessionId(): string | null {\r\n return this.sessionId;\r\n }\r\n\r\n // Event emitter methods\r\n public on(event: ClientEventType, listener: ClientEventMap[ClientEventType]): ClientEventMap[ClientEventType] {\r\n if (!this.eventListeners.has(event)) {\r\n this.eventListeners.set(event, new Set());\r\n }\r\n this.eventListeners.get(event)!.add(listener);\r\n return listener;\r\n }\r\n\r\n public off(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.delete(listener);\r\n }\r\n }\r\n\r\n public once(event: ClientEventType, listener: ClientEventMap[ClientEventType]): void {\r\n const onceListener = ((...args: Parameters<ClientEventMap[ClientEventType]>) => {\r\n this.off(event, onceListener);\r\n (listener as Function)(...args);\r\n }) as ClientEventMap[ClientEventType];\r\n\r\n this.on(event, onceListener);\r\n }\r\n\r\n protected emit(event: ClientEventType, ...args: Parameters<ClientEventMap[ClientEventType]>): void {\r\n const listeners = this.eventListeners.get(event);\r\n if (listeners) {\r\n listeners.forEach(listener => {\r\n try {\r\n (listener as Function)(...args);\r\n } catch (error) {\r\n this.debug(`Error in ${event} listener:`, error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected debug(...args: unknown[]): void {\r\n if (this.options.debug) {\r\n console.log(LOG_PREFIX, ...args);\r\n }\r\n }\r\n\r\n\r\n protected async handleServerError(message: ErrorMessage): Promise<void> {\r\n if (message.code === ServerErrorCode.SESSION_NOT_FOUND) {\r\n // reconnect to get a new session\r\n try {\r\n console.warn('SESSION_NOT_FOUND, reconnecting to get a new session');\r\n this.disconnect();\r\n await this.connect(this.config!);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n }\r\n}\r\n"]}
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"]}