@astermind/cybernetic-chatbot-client 2.2.36 → 2.2.48
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 +102 -5
- package/dist/ApiClient.d.ts +4 -3
- package/dist/ApiClient.d.ts.map +1 -1
- package/dist/CyberneticClient.d.ts +11 -0
- package/dist/CyberneticClient.d.ts.map +1 -1
- package/dist/WebSocketTransport.d.ts +104 -0
- package/dist/WebSocketTransport.d.ts.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/cybernetic-chatbot-client-full.esm.js +713 -188
- package/dist/cybernetic-chatbot-client-full.esm.js.map +1 -1
- package/dist/cybernetic-chatbot-client-full.min.js +1 -1
- package/dist/cybernetic-chatbot-client-full.min.js.map +1 -1
- package/dist/cybernetic-chatbot-client-full.umd.js +713 -188
- package/dist/cybernetic-chatbot-client-full.umd.js.map +1 -1
- package/dist/cybernetic-chatbot-client.esm.js +740 -215
- package/dist/cybernetic-chatbot-client.esm.js.map +1 -1
- package/dist/cybernetic-chatbot-client.min.js +1 -1
- package/dist/cybernetic-chatbot-client.min.js.map +1 -1
- package/dist/cybernetic-chatbot-client.umd.js +742 -214
- package/dist/cybernetic-chatbot-client.umd.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/types.d.ts +36 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,8 +12,10 @@ Cybernetic Chatbot Client is the official JavaScript SDK for integrating [AsterM
|
|
|
12
12
|
|
|
13
13
|
## Key Features
|
|
14
14
|
|
|
15
|
+
- **Dual Transport** - WebSocket streaming for SaaS, REST+SSE for on-prem (auto-detected)
|
|
15
16
|
- **Offline-First Architecture** - IndexedDB caching with TF-IDF local search
|
|
16
|
-
- **SSE Streaming** - Real-time token-by-token responses
|
|
17
|
+
- **SSE Streaming** - Real-time token-by-token responses (REST fallback)
|
|
18
|
+
- **WebSocket Streaming** - Low-latency streaming via persistent connection (SaaS)
|
|
17
19
|
- **Session Management** - Multi-turn conversation continuity
|
|
18
20
|
- **Configurable Retry Logic** - Exponential backoff with customizable settings
|
|
19
21
|
- **Connection Status Monitoring** - Real-time online/offline detection
|
|
@@ -28,6 +30,7 @@ Cybernetic Chatbot Client is the official JavaScript SDK for integrating [AsterM
|
|
|
28
30
|
- [Licensing](#licensing)
|
|
29
31
|
- [Configuration](#configuration)
|
|
30
32
|
- [Features](#features)
|
|
33
|
+
- [WebSocket Transport (SaaS)](#websocket-transport-saas)
|
|
31
34
|
- [Offline-First Architecture](#offline-first-architecture)
|
|
32
35
|
- [Pre-computed Vector Export (Advanced)](#pre-computed-vector-export-advanced)
|
|
33
36
|
- [Streaming Responses](#streaming-responses)
|
|
@@ -333,6 +336,19 @@ interface CyberneticConfig {
|
|
|
333
336
|
/** API key for authentication - must start with 'am_' (required) */
|
|
334
337
|
apiKey: string;
|
|
335
338
|
|
|
339
|
+
/** WebSocket URL for SaaS streaming (auto-derived from apiUrl for known SaaS domains) */
|
|
340
|
+
wsUrl?: string;
|
|
341
|
+
|
|
342
|
+
/** Transport mode: 'auto' (default) tries WebSocket then REST, 'websocket' forces WS, 'rest' forces REST+SSE */
|
|
343
|
+
transport?: 'auto' | 'websocket' | 'rest';
|
|
344
|
+
|
|
345
|
+
/** WebSocket transport options */
|
|
346
|
+
websocket?: {
|
|
347
|
+
maxReconnectAttempts?: number; // Default: 3
|
|
348
|
+
reconnectDelay?: number; // Default: 1000ms (exponential backoff)
|
|
349
|
+
connectionTimeout?: number; // Default: 10000ms
|
|
350
|
+
};
|
|
351
|
+
|
|
336
352
|
/** License key (JWT token) from https://astermind.ai */
|
|
337
353
|
licenseKey?: string;
|
|
338
354
|
|
|
@@ -409,6 +425,70 @@ interface AgenticConfig {
|
|
|
409
425
|
|
|
410
426
|
## Features
|
|
411
427
|
|
|
428
|
+
### WebSocket Transport (SaaS)
|
|
429
|
+
|
|
430
|
+
When connecting to AsterMind's SaaS infrastructure, the client automatically uses WebSocket transport for streaming chat. This provides lower latency and access to the full RAG pipeline (RSF temporal scoring, hybrid reranking, Omega embeddings, BYOLLM).
|
|
431
|
+
|
|
432
|
+
**Auto-detection (zero config for SaaS users):**
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
const client = new CyberneticClient({
|
|
436
|
+
apiUrl: 'https://chatapi.astermind.ai',
|
|
437
|
+
apiKey: 'am_your_api_key',
|
|
438
|
+
// wsUrl auto-derived → wss://chatws.astermind.ai
|
|
439
|
+
});
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
The client auto-derives WebSocket URLs for known SaaS domains:
|
|
443
|
+
- `chatapi.astermind.ai` → `wss://chatws.astermind.ai`
|
|
444
|
+
- `chatapi-dev.astermind.ai` → `wss://chatws-dev.astermind.ai`
|
|
445
|
+
- `api.astermind.ai` → `wss://chatws.astermind.ai`
|
|
446
|
+
|
|
447
|
+
**Explicit configuration:**
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
const client = new CyberneticClient({
|
|
451
|
+
apiUrl: 'https://chatapi.astermind.ai',
|
|
452
|
+
apiKey: 'am_your_api_key',
|
|
453
|
+
wsUrl: 'wss://chatws.astermind.ai',
|
|
454
|
+
transport: 'websocket', // Force WebSocket only (no REST fallback)
|
|
455
|
+
});
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**On-prem (unchanged, REST+SSE):**
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
const client = new CyberneticClient({
|
|
462
|
+
apiUrl: 'http://localhost:3000',
|
|
463
|
+
apiKey: 'am_your_api_key',
|
|
464
|
+
// No wsUrl → uses REST+SSE as before
|
|
465
|
+
});
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
**Transport modes:**
|
|
469
|
+
- `'auto'` (default) — Uses WebSocket when available, falls back to REST+SSE on failure
|
|
470
|
+
- `'websocket'` — Forces WebSocket only, no REST fallback
|
|
471
|
+
- `'rest'` — Forces REST+SSE only, ignores WebSocket
|
|
472
|
+
|
|
473
|
+
**Environment variable support:**
|
|
474
|
+
|
|
475
|
+
```env
|
|
476
|
+
# Vite
|
|
477
|
+
VITE_ASTERMIND_RAG_WS_URL=wss://chatws.astermind.ai
|
|
478
|
+
|
|
479
|
+
# Node.js / CRA
|
|
480
|
+
ASTERMIND_RAG_WS_URL=wss://chatws.astermind.ai
|
|
481
|
+
REACT_APP_ASTERMIND_RAG_WS_URL=wss://chatws.astermind.ai
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Cleanup:**
|
|
485
|
+
|
|
486
|
+
Call `destroy()` when disposing the client to close the WebSocket connection:
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
client.destroy();
|
|
490
|
+
```
|
|
491
|
+
|
|
412
492
|
### Offline-First Architecture
|
|
413
493
|
|
|
414
494
|
The client includes **built-in offline fallback** with IndexedDB caching and TF-IDF local search—no additional setup required. When the server is unreachable, the client automatically serves cached responses:
|
|
@@ -576,7 +656,7 @@ This helps identify configuration issues without disrupting functionality.
|
|
|
576
656
|
|
|
577
657
|
### Streaming Responses
|
|
578
658
|
|
|
579
|
-
Real-time token streaming via Server-Sent Events (
|
|
659
|
+
Real-time token streaming via WebSocket (SaaS) or Server-Sent Events (on-prem):
|
|
580
660
|
|
|
581
661
|
```typescript
|
|
582
662
|
await client.askStream('Explain quantum computing', {
|
|
@@ -892,6 +972,9 @@ class CyberneticClient {
|
|
|
892
972
|
// Cache methods
|
|
893
973
|
syncCache(): Promise<void>;
|
|
894
974
|
clearCache(): Promise<void>;
|
|
975
|
+
|
|
976
|
+
// Cleanup
|
|
977
|
+
destroy(): void; // Close WebSocket connection and clean up resources
|
|
895
978
|
}
|
|
896
979
|
```
|
|
897
980
|
|
|
@@ -923,7 +1006,7 @@ interface StreamCallbacks {
|
|
|
923
1006
|
}
|
|
924
1007
|
|
|
925
1008
|
interface CyberneticError {
|
|
926
|
-
code: 'NETWORK_ERROR' | 'AUTH_ERROR' | 'RATE_LIMIT' | 'SERVER_ERROR' | 'CACHE_ERROR' | 'LOCAL_RAG_ERROR';
|
|
1009
|
+
code: 'NETWORK_ERROR' | 'AUTH_ERROR' | 'RATE_LIMIT' | 'SERVER_ERROR' | 'CACHE_ERROR' | 'LOCAL_RAG_ERROR' | 'WS_ERROR';
|
|
927
1010
|
message: string;
|
|
928
1011
|
retryAfter?: number;
|
|
929
1012
|
}
|
|
@@ -964,7 +1047,9 @@ Requires IndexedDB support for offline caching.
|
|
|
964
1047
|
|
|
965
1048
|
## Integration with Cybernetic Chatbot Backend
|
|
966
1049
|
|
|
967
|
-
This client is designed to work with the AsterMind Cybernetic Chatbot backend. The
|
|
1050
|
+
This client is designed to work with the AsterMind Cybernetic Chatbot backend. The client supports two transport modes:
|
|
1051
|
+
|
|
1052
|
+
**REST API Endpoints** (on-prem and supplementary):
|
|
968
1053
|
|
|
969
1054
|
| Endpoint | Method | Description |
|
|
970
1055
|
|----------|--------|-------------|
|
|
@@ -973,8 +1058,20 @@ This client is designed to work with the AsterMind Cybernetic Chatbot backend. T
|
|
|
973
1058
|
| `/api/external/docs` | GET | Fetch documents for offline caching |
|
|
974
1059
|
| `/api/external/status` | GET | Check API status, quota, and system settings |
|
|
975
1060
|
| `/api/external/health` | GET | Health check (no auth required) |
|
|
1061
|
+
| `/api/external/search` | GET | Search documents |
|
|
1062
|
+
| `/api/external/sitemap` | GET | Get document sitemap for navigation |
|
|
1063
|
+
| `/api/external/config` | GET | Get chatbot configuration |
|
|
1064
|
+
|
|
1065
|
+
**WebSocket Endpoint** (SaaS streaming):
|
|
1066
|
+
|
|
1067
|
+
| Endpoint | Description |
|
|
1068
|
+
|----------|-------------|
|
|
1069
|
+
| `wss://chatws.astermind.ai` | Production WebSocket streaming |
|
|
1070
|
+
| `wss://chatws-dev.astermind.ai` | Development WebSocket streaming |
|
|
1071
|
+
|
|
1072
|
+
WebSocket authentication uses an API key query parameter: `?apiKey=am_xxx`
|
|
976
1073
|
|
|
977
|
-
**Authentication**:
|
|
1074
|
+
**Authentication**: REST endpoints require an `X-API-Key` header with a valid API key (prefixed with `am_`). WebSocket endpoints use a `?apiKey=am_xxx` query parameter.
|
|
978
1075
|
|
|
979
1076
|
**Rate Limiting**: The backend enforces rate limits. The client handles 429 responses gracefully and includes `retryAfter` in responses when applicable.
|
|
980
1077
|
|
package/dist/ApiClient.d.ts
CHANGED
|
@@ -62,16 +62,17 @@ export declare class ApiClient {
|
|
|
62
62
|
*/
|
|
63
63
|
chatStream(message: string, options: ChatRequest & StreamCallbacks): Promise<void>;
|
|
64
64
|
/**
|
|
65
|
-
* Get general documents for caching
|
|
65
|
+
* Get general documents for caching.
|
|
66
|
+
* Normalizes field names from both canonical (title) and legacy (name) formats.
|
|
66
67
|
*/
|
|
67
68
|
getGeneralDocs(since?: string | null): Promise<Array<{
|
|
68
69
|
id: string;
|
|
69
70
|
title: string;
|
|
70
|
-
content: string;
|
|
71
71
|
updatedAt: string;
|
|
72
72
|
}>>;
|
|
73
73
|
/**
|
|
74
|
-
* Get API status, quota, and system settings
|
|
74
|
+
* Get API status, quota, and system settings.
|
|
75
|
+
* Normalizes response from both canonical and legacy backend formats.
|
|
75
76
|
*/
|
|
76
77
|
getStatus(): Promise<StatusResponse>;
|
|
77
78
|
/**
|
package/dist/ApiClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../src/ApiClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzD,UAAU,WAAW;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED,UAAU,YAAY;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE;YACZ,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;SACf,CAAC;KACL,CAAC;CACL;AAED,UAAU,eAAe;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACpC;AAED,UAAU,cAAc;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE;QACH,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAChD,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChD,CAAC;IACF,cAAc,CAAC,EAAE,cAAc,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../src/ApiClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzD,UAAU,WAAW;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACL;AAED,UAAU,YAAY;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE;YACZ,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;SACf,CAAC;KACL,CAAC;CACL;AAED,UAAU,eAAe;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACpC;AAED,UAAU,cAAc;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE;QACH,SAAS,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAChD,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChD,CAAC;IACF,cAAc,CAAC,EAAE,cAAc,CAAC;CACnC;AAqCD;;GAEG;AACH,qBAAa,SAAS;IAClB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C;;OAEG;IACG,IAAI,CACN,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,WAAW,GACtB,OAAO,CAAC,YAAY,CAAC;IA4BxB;;OAEG;IACG,UAAU,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GAAG,eAAe,GACvC,OAAO,CAAC,IAAI,CAAC;IAuEhB;;;OAGG;IACG,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QACvD,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IA0BH;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAiD1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CASjE"}
|
|
@@ -21,6 +21,7 @@ export interface AgenticCapabilities {
|
|
|
21
21
|
export declare class CyberneticClient {
|
|
22
22
|
private config;
|
|
23
23
|
private apiClient;
|
|
24
|
+
private wsTransport;
|
|
24
25
|
private cache;
|
|
25
26
|
private localRAG;
|
|
26
27
|
private status;
|
|
@@ -189,6 +190,11 @@ export declare class CyberneticClient {
|
|
|
189
190
|
* @param options - Optional request configuration
|
|
190
191
|
*/
|
|
191
192
|
askStream(message: string, callbacks: StreamCallbacks, options?: AskOptions): Promise<void>;
|
|
193
|
+
/**
|
|
194
|
+
* Stream chat via REST+SSE (original transport).
|
|
195
|
+
* Used as the primary transport for on-prem, or as fallback for SaaS WebSocket failures.
|
|
196
|
+
*/
|
|
197
|
+
private streamViaSSE;
|
|
192
198
|
/**
|
|
193
199
|
* Sync documents to local cache for offline use
|
|
194
200
|
*/
|
|
@@ -211,6 +217,11 @@ export declare class CyberneticClient {
|
|
|
211
217
|
* Clear local cache
|
|
212
218
|
*/
|
|
213
219
|
clearCache(): Promise<void>;
|
|
220
|
+
/**
|
|
221
|
+
* Clean up all resources (WebSocket connection, caches, event listeners).
|
|
222
|
+
* Call this when the client is no longer needed to prevent memory leaks.
|
|
223
|
+
*/
|
|
224
|
+
destroy(): void;
|
|
214
225
|
/**
|
|
215
226
|
* Manually check if backend is reachable
|
|
216
227
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CyberneticClient.d.ts","sourceRoot":"","sources":["../src/CyberneticClient.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"CyberneticClient.d.ts","sourceRoot":"","sources":["../src/CyberneticClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { StreamCallbacks, TransportState, WebSocketOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for a single WebSocket chat request
|
|
4
|
+
*/
|
|
5
|
+
interface WsChatOptions {
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
context?: {
|
|
8
|
+
currentPage?: string;
|
|
9
|
+
pageTitle?: string;
|
|
10
|
+
};
|
|
11
|
+
wordLimit?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* WebSocket transport for streaming chat.
|
|
15
|
+
*
|
|
16
|
+
* Maps the chat-handler Lambda WebSocket protocol to the client's StreamCallbacks:
|
|
17
|
+
* Server typing → ignored (UI has its own indicator)
|
|
18
|
+
* Server chunk → onToken(content)
|
|
19
|
+
* Server done → onSources(sources) + onComplete(response)
|
|
20
|
+
* Server error → onError(error)
|
|
21
|
+
*
|
|
22
|
+
* Connection is lazy — established on the first chatStream() call.
|
|
23
|
+
* Reuses the same connection across multiple messages.
|
|
24
|
+
* Reconnects with exponential backoff on close/error.
|
|
25
|
+
*/
|
|
26
|
+
export declare class WebSocketTransport {
|
|
27
|
+
private ws;
|
|
28
|
+
private wsUrl;
|
|
29
|
+
private apiKey;
|
|
30
|
+
private state;
|
|
31
|
+
private reconnectAttempts;
|
|
32
|
+
private maxReconnectAttempts;
|
|
33
|
+
private reconnectDelay;
|
|
34
|
+
private connectionTimeout;
|
|
35
|
+
private connectionPromise;
|
|
36
|
+
private activeCallbacks;
|
|
37
|
+
private activeFullText;
|
|
38
|
+
private activeSessionId;
|
|
39
|
+
private beforeUnloadHandler;
|
|
40
|
+
constructor(wsUrl: string, apiKey: string, options?: WebSocketOptions);
|
|
41
|
+
/**
|
|
42
|
+
* Current transport state
|
|
43
|
+
*/
|
|
44
|
+
getState(): TransportState;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the WebSocket is currently connected
|
|
47
|
+
*/
|
|
48
|
+
isConnected(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Connect to the WebSocket endpoint.
|
|
51
|
+
* Appends the API key as a query parameter for authentication.
|
|
52
|
+
* Returns a promise that resolves when the connection is open.
|
|
53
|
+
*/
|
|
54
|
+
connect(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Stream a chat message over WebSocket.
|
|
57
|
+
*
|
|
58
|
+
* Sends: { type: "sendMessage", message, sessionId?, wordLimit?, context? }
|
|
59
|
+
* Receives: typing → chunk × N → done (with sources and metadata)
|
|
60
|
+
*/
|
|
61
|
+
chatStream(message: string, options: WsChatOptions & StreamCallbacks): Promise<void>;
|
|
62
|
+
private _resolveStream;
|
|
63
|
+
private _rejectStream;
|
|
64
|
+
/**
|
|
65
|
+
* Disconnect and clean up the WebSocket connection
|
|
66
|
+
*/
|
|
67
|
+
disconnect(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Attempt reconnection with exponential backoff.
|
|
70
|
+
* Used internally after connection loss.
|
|
71
|
+
*/
|
|
72
|
+
reconnect(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Handle incoming WebSocket messages from the chat-handler Lambda.
|
|
75
|
+
*
|
|
76
|
+
* Protocol:
|
|
77
|
+
* { type: 'typing', status: boolean } → ignored
|
|
78
|
+
* { type: 'chunk', content: string } → onToken(content)
|
|
79
|
+
* { type: 'done', sessionId, sources, metadata, messageId } → onSources + onComplete
|
|
80
|
+
* { type: 'error', error: string } → onError
|
|
81
|
+
*/
|
|
82
|
+
private handleMessage;
|
|
83
|
+
/**
|
|
84
|
+
* Map sources from the chat-handler WebSocket format to the client Source interface.
|
|
85
|
+
*
|
|
86
|
+
* Chat-handler sends: { heading, content, score, documentId, documentName }
|
|
87
|
+
* Client expects: { title, snippet, relevance, documentId, documentName }
|
|
88
|
+
*/
|
|
89
|
+
private mapSources;
|
|
90
|
+
/**
|
|
91
|
+
* Clear active request state after completion or error
|
|
92
|
+
*/
|
|
93
|
+
private clearActiveRequest;
|
|
94
|
+
/**
|
|
95
|
+
* Register a beforeunload handler to close the WebSocket on page unload
|
|
96
|
+
*/
|
|
97
|
+
private registerCleanup;
|
|
98
|
+
/**
|
|
99
|
+
* Remove the beforeunload handler
|
|
100
|
+
*/
|
|
101
|
+
private unregisterCleanup;
|
|
102
|
+
}
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=WebSocketTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketTransport.d.ts","sourceRoot":"","sources":["../src/WebSocketTransport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,eAAe,EACf,cAAc,EACd,gBAAgB,EACnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,UAAU,aAAa;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAA8B;IAGvD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,eAAe,CAAqB;IAG5C,OAAO,CAAC,mBAAmB,CAA6B;gBAE5C,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAQrE;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmFxB;;;;;OAKG;IACG,UAAU,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,GAAG,eAAe,GACzC,OAAO,CAAC,IAAI,CAAC;IA6ChB,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAAyC;IAE9D;;OAEG;IACH,UAAU,IAAI,IAAI;IAelB;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BhC;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IA6DrB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAM5B"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import type { CyberneticConfig, ConfigOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Derive WebSocket URL from API URL for known SaaS domains.
|
|
4
|
+
* Maps REST API domains to their WebSocket counterparts:
|
|
5
|
+
* chatapi.astermind.ai → wss://chatws.astermind.ai
|
|
6
|
+
* chatapi-dev.astermind.ai → wss://chatws-dev.astermind.ai
|
|
7
|
+
* api.astermind.ai → wss://chatws.astermind.ai
|
|
8
|
+
*
|
|
9
|
+
* Returns undefined for non-SaaS (on-prem) URLs.
|
|
10
|
+
*/
|
|
11
|
+
export declare function deriveWsUrl(apiUrl: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the WebSocket URL for a given config.
|
|
14
|
+
* Priority: explicit wsUrl → env var → auto-derived from apiUrl
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveWsUrl(config: CyberneticConfig): string | undefined;
|
|
2
17
|
/**
|
|
3
18
|
* Validate configuration
|
|
4
19
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKlE;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,gBAAgB,CAoB1E;AAED;;GAEG;AACH,iBAAS,kBAAkB,IAAI,gBAAgB,GAAG,IAAI,CA+BrD;AAED;;;GAGG;AACH,iBAAS,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAmClD;AAED;;GAEG;AACH,iBAAS,oBAAoB,IAAI,gBAAgB,GAAG,IAAI,CAgBvD;AAED;;GAEG;AACH,iBAAS,wBAAwB,IAAI,gBAAgB,GAAG,IAAI,CAkB3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,gBAAgB,GAAG,IAAI,CA0C/E;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;CAKzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKlE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB9D;AA8CD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAazE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,gBAAgB,CAoB1E;AAED;;GAEG;AACH,iBAAS,kBAAkB,IAAI,gBAAgB,GAAG,IAAI,CA+BrD;AAED;;;GAGG;AACH,iBAAS,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAmClD;AAED;;GAEG;AACH,iBAAS,oBAAoB,IAAI,gBAAgB,GAAG,IAAI,CAgBvD;AAED;;GAEG;AACH,iBAAS,wBAAwB,IAAI,gBAAgB,GAAG,IAAI,CAkB3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,gBAAgB,GAAG,IAAI,CA0C/E;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;CAKzB,CAAC"}
|