@astermind/cybernetic-chatbot-client 2.2.34 → 2.2.44

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
@@ -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 (SSE):
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 following endpoints are used:
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**: All authenticated endpoints require an `X-API-Key` header with a valid API key (prefixed with `am_`).
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
 
@@ -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":"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"}
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;AAaD;;;;;;;;;;;;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;IAalB;;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
  */
@@ -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"}