@agntk/client 0.1.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.
@@ -0,0 +1,140 @@
1
+ // WebSocket client for streaming
2
+ import { createLogger } from '@agntk/logger';
3
+ import { WebSocketError } from './errors.js';
4
+ const log = createLogger('@agntk/client:ws');
5
+ export class AgentWebSocketClient {
6
+ ws = null;
7
+ config;
8
+ state = 'disconnected';
9
+ reconnectAttempts = 0;
10
+ reconnectTimer = null;
11
+ onStateChange;
12
+ constructor(config) {
13
+ this.config = {
14
+ reconnect: true,
15
+ reconnectInterval: 1000,
16
+ maxReconnectAttempts: 5,
17
+ ...config
18
+ };
19
+ log.debug('Created WebSocket client', { url: config.url });
20
+ }
21
+ getState() {
22
+ return this.state;
23
+ }
24
+ onConnectionStateChange(handler) {
25
+ this.onStateChange = handler;
26
+ }
27
+ setState(newState) {
28
+ if (this.state !== newState) {
29
+ this.state = newState;
30
+ this.onStateChange?.(newState);
31
+ log.debug('Connection state changed', { state: newState });
32
+ }
33
+ }
34
+ connect() {
35
+ if (this.state === 'connected')
36
+ return Promise.resolve();
37
+ this.setState('connecting');
38
+ log.debug('Connecting');
39
+ return new Promise((resolve, reject) => {
40
+ try {
41
+ this.ws = new WebSocket(this.config.url);
42
+ this.ws.onopen = () => {
43
+ log.info('Connected');
44
+ this.setState('connected');
45
+ this.reconnectAttempts = 0;
46
+ resolve();
47
+ };
48
+ this.ws.onclose = () => {
49
+ log.info('Connection closed');
50
+ if (this.state !== 'disconnected') {
51
+ this.handleReconnect();
52
+ }
53
+ };
54
+ this.ws.onerror = (error) => {
55
+ log.error('Connection failed', { error });
56
+ if (this.state === 'connecting') {
57
+ this.setState('disconnected');
58
+ reject(new WebSocketError('Connection failed'));
59
+ }
60
+ };
61
+ }
62
+ catch (error) {
63
+ this.setState('disconnected');
64
+ reject(new WebSocketError('Failed to create WebSocket'));
65
+ }
66
+ });
67
+ }
68
+ handleReconnect() {
69
+ if (!this.config.reconnect || this.state === 'disconnected')
70
+ return;
71
+ if (this.reconnectAttempts >= (this.config.maxReconnectAttempts || 5)) {
72
+ log.error('Max reconnect attempts reached');
73
+ this.setState('disconnected');
74
+ return;
75
+ }
76
+ this.setState('reconnecting');
77
+ this.reconnectAttempts++;
78
+ const delay = Math.min((this.config.reconnectInterval || 1000) * Math.pow(2, this.reconnectAttempts - 1), 30000);
79
+ log.info('Scheduling reconnect', { attempt: this.reconnectAttempts, delay });
80
+ if (this.reconnectTimer)
81
+ clearTimeout(this.reconnectTimer);
82
+ this.reconnectTimer = setTimeout(() => {
83
+ this.connect().catch(() => {
84
+ // Error handling is done in connect()
85
+ });
86
+ }, delay);
87
+ }
88
+ send(message, callbacks) {
89
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
90
+ throw new WebSocketError('WebSocket not connected');
91
+ }
92
+ log.debug('Sending message');
93
+ this.ws.send(JSON.stringify(message));
94
+ this.ws.onmessage = (event) => {
95
+ try {
96
+ const data = JSON.parse(event.data);
97
+ this.dispatch(data, callbacks);
98
+ }
99
+ catch (_err) {
100
+ callbacks.onError?.('Failed to parse message');
101
+ }
102
+ };
103
+ }
104
+ dispatch(event, callbacks) {
105
+ switch (event.type) {
106
+ case 'text-delta':
107
+ callbacks.onTextDelta?.(event.textDelta);
108
+ break;
109
+ case 'tool-call':
110
+ callbacks.onToolCall?.(event.toolCallId, event.toolName, event.args);
111
+ break;
112
+ case 'tool-result':
113
+ callbacks.onToolResult?.(event.toolCallId, event.toolName, event.result);
114
+ break;
115
+ case 'step-start':
116
+ callbacks.onStepStart?.(event.stepIndex);
117
+ break;
118
+ case 'step-finish':
119
+ callbacks.onStepFinish?.(event.stepIndex, event.finishReason);
120
+ break;
121
+ case 'finish':
122
+ callbacks.onComplete?.({ text: event.text, usage: event.usage });
123
+ break;
124
+ case 'error':
125
+ callbacks.onError?.(event.error);
126
+ break;
127
+ }
128
+ }
129
+ disconnect() {
130
+ log.debug('Disconnecting');
131
+ this.setState('disconnected');
132
+ if (this.reconnectTimer) {
133
+ clearTimeout(this.reconnectTimer);
134
+ this.reconnectTimer = null;
135
+ }
136
+ this.ws?.close();
137
+ this.ws = null;
138
+ }
139
+ }
140
+ //# sourceMappingURL=websocket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../src/websocket-client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@agntk/client",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "HTTP/WebSocket client for @agntk/server",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc && node ../../scripts/fix-esm-imports.mjs ./dist",
17
+ "typecheck": "tsc --noEmit",
18
+ "dev": "tsc --watch",
19
+ "test": "vitest",
20
+ "clean": "rm -rf dist"
21
+ },
22
+ "dependencies": {
23
+ "@agntk/logger": "workspace:*",
24
+ "ai": "6.0.77"
25
+ },
26
+ "devDependencies": {
27
+ "@agntk/config-typescript": "workspace:*",
28
+ "typescript": "^5.7.3",
29
+ "vitest": "^3.2.3",
30
+ "@types/node": "^20.17.19"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md",
35
+ "LICENSE"
36
+ ],
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/agntk/agntk.git",
40
+ "directory": "packages/sdk-client"
41
+ },
42
+ "homepage": "https://github.com/agntk/agntk#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/agntk/agntk/issues"
45
+ },
46
+ "engines": {
47
+ "node": ">=20.0.0"
48
+ },
49
+ "keywords": [
50
+ "ai",
51
+ "agent",
52
+ "client",
53
+ "http",
54
+ "websocket",
55
+ "sse"
56
+ ],
57
+ "license": "MIT"
58
+ }