@schlessera/brain-ui-react 0.14.0 → 0.16.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.
Files changed (73) hide show
  1. package/README.md +25 -0
  2. package/dist/components/chat/brain-markdown.js +2 -2
  3. package/dist/components/chat/brain-markdown.js.map +1 -1
  4. package/dist/components/chat/chat-page.d.ts.map +1 -1
  5. package/dist/components/chat/chat-page.js +4 -0
  6. package/dist/components/chat/chat-page.js.map +1 -1
  7. package/dist/components/files/file-viewer-binary.js +2 -2
  8. package/dist/components/files/file-viewer-binary.js.map +1 -1
  9. package/dist/components/files/file-viewer.js +2 -2
  10. package/dist/components/files/file-viewer.js.map +1 -1
  11. package/dist/components/graph/graph-page.js +3 -3
  12. package/dist/components/graph/graph-page.js.map +1 -1
  13. package/dist/components/images/mask-editor.js +2 -2
  14. package/dist/components/images/mask-editor.js.map +1 -1
  15. package/dist/config.d.ts +37 -4
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +29 -0
  18. package/dist/config.js.map +1 -1
  19. package/dist/hooks/use-websocket.d.ts +2 -2
  20. package/dist/hooks/use-websocket.d.ts.map +1 -1
  21. package/dist/hooks/use-websocket.js +49 -5
  22. package/dist/hooks/use-websocket.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/api-client.js +2 -2
  28. package/dist/lib/api-client.js.map +1 -1
  29. package/dist/lib/backend.d.ts +3 -3
  30. package/dist/lib/backend.d.ts.map +1 -1
  31. package/dist/lib/backend.js +16 -15
  32. package/dist/lib/backend.js.map +1 -1
  33. package/dist/lib/share-intake.js +2 -2
  34. package/dist/lib/share-intake.js.map +1 -1
  35. package/dist/lib/share.js +2 -2
  36. package/dist/lib/share.js.map +1 -1
  37. package/dist/stores/chat-store.d.ts +13 -0
  38. package/dist/stores/chat-store.d.ts.map +1 -1
  39. package/dist/stores/chat-store.js +36 -8
  40. package/dist/stores/chat-store.js.map +1 -1
  41. package/dist/stores/connection-store.d.ts +18 -0
  42. package/dist/stores/connection-store.d.ts.map +1 -1
  43. package/dist/stores/connection-store.js +3 -0
  44. package/dist/stores/connection-store.js.map +1 -1
  45. package/dist/stores/file-store.d.ts.map +1 -1
  46. package/dist/stores/file-store.js +15 -5
  47. package/dist/stores/file-store.js.map +1 -1
  48. package/dist/stores/graph-store.d.ts.map +1 -1
  49. package/dist/stores/graph-store.js +8 -7
  50. package/dist/stores/graph-store.js.map +1 -1
  51. package/package.json +2 -2
  52. package/src/components/chat/brain-markdown.tsx +2 -2
  53. package/src/components/chat/chat-page.tsx +4 -0
  54. package/src/components/files/file-viewer-binary.tsx +2 -2
  55. package/src/components/files/file-viewer.tsx +2 -2
  56. package/src/components/graph/graph-page.tsx +3 -3
  57. package/src/components/images/mask-editor.tsx +2 -2
  58. package/src/config.ts +63 -4
  59. package/src/hooks/use-websocket.ts +55 -6
  60. package/src/index.ts +1 -1
  61. package/src/lib/api-client.ts +2 -2
  62. package/src/lib/backend.ts +16 -15
  63. package/src/lib/share-intake.ts +2 -2
  64. package/src/lib/share.ts +2 -2
  65. package/src/stores/chat-store.ts +50 -8
  66. package/src/stores/connection-store.ts +22 -0
  67. package/src/stores/file-store.ts +13 -5
  68. package/src/stores/graph-store.ts +7 -7
  69. package/dist/lib/ws-client.d.ts +0 -26
  70. package/dist/lib/ws-client.d.ts.map +0 -1
  71. package/dist/lib/ws-client.js +0 -93
  72. package/dist/lib/ws-client.js.map +0 -1
  73. package/src/lib/ws-client.ts +0 -109
@@ -1,93 +0,0 @@
1
- export class WSClient {
2
- ws = null;
3
- url;
4
- onMessage;
5
- onStatusChange;
6
- reconnectAttempt = 0;
7
- reconnectTimer = null;
8
- closed = false;
9
- constructor(url, onMessage, onStatusChange) {
10
- this.url = url;
11
- this.onMessage = onMessage;
12
- this.onStatusChange = onStatusChange;
13
- }
14
- connect() {
15
- this.closed = false;
16
- this.onStatusChange("connecting");
17
- try {
18
- this.ws = new WebSocket(this.url);
19
- this.ws.onopen = () => {
20
- this.reconnectAttempt = 0;
21
- this.onStatusChange("connected");
22
- };
23
- this.ws.onmessage = (evt) => {
24
- try {
25
- const msg = JSON.parse(evt.data);
26
- this.onMessage(msg);
27
- }
28
- catch {
29
- console.error("[ws] Failed to parse message:", evt.data);
30
- }
31
- };
32
- this.ws.onclose = () => {
33
- this.onStatusChange("disconnected");
34
- if (!this.closed) {
35
- this.scheduleReconnect();
36
- }
37
- };
38
- this.ws.onerror = () => {
39
- // onclose will fire after onerror
40
- };
41
- }
42
- catch {
43
- this.onStatusChange("disconnected");
44
- if (!this.closed) {
45
- this.scheduleReconnect();
46
- }
47
- }
48
- }
49
- send(msg) {
50
- if (this.ws?.readyState === WebSocket.OPEN) {
51
- this.ws.send(JSON.stringify(msg));
52
- }
53
- }
54
- close() {
55
- this.closed = true;
56
- if (this.reconnectTimer) {
57
- clearTimeout(this.reconnectTimer);
58
- this.reconnectTimer = null;
59
- }
60
- this.ws?.close();
61
- this.ws = null;
62
- }
63
- get isConnected() {
64
- return this.ws?.readyState === WebSocket.OPEN;
65
- }
66
- /**
67
- * Skip the remaining backoff and reconnect immediately (e.g. when the
68
- * browser fires an `online` event). No-op if open/connecting or closed
69
- * deliberately.
70
- */
71
- reconnectNow() {
72
- if (this.closed)
73
- return;
74
- const state = this.ws?.readyState;
75
- if (state === WebSocket.OPEN || state === WebSocket.CONNECTING)
76
- return;
77
- if (this.reconnectTimer) {
78
- clearTimeout(this.reconnectTimer);
79
- this.reconnectTimer = null;
80
- }
81
- this.reconnectAttempt = 0;
82
- this.connect();
83
- }
84
- scheduleReconnect() {
85
- const delay = Math.min(1000 * 2 ** this.reconnectAttempt, 30000);
86
- this.reconnectAttempt++;
87
- this.reconnectTimer = setTimeout(() => {
88
- this.reconnectTimer = null;
89
- this.connect();
90
- }, delay);
91
- }
92
- }
93
- //# sourceMappingURL=ws-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/lib/ws-client.ts"],"names":[],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- import type { ClientMessage, ServerMessage } from "@schlessera/brain-ui-sdk/protocol";
2
-
3
- type MessageHandler = (msg: ServerMessage) => void;
4
- type StatusHandler = (status: "connecting" | "connected" | "disconnected") => void;
5
-
6
- export class WSClient {
7
- private ws: WebSocket | null = null;
8
- private url: string;
9
- private onMessage: MessageHandler;
10
- private onStatusChange: StatusHandler;
11
- private reconnectAttempt = 0;
12
- private reconnectTimer: ReturnType<typeof setTimeout> | null = null;
13
- private closed = false;
14
-
15
- constructor(
16
- url: string,
17
- onMessage: MessageHandler,
18
- onStatusChange: StatusHandler
19
- ) {
20
- this.url = url;
21
- this.onMessage = onMessage;
22
- this.onStatusChange = onStatusChange;
23
- }
24
-
25
- connect() {
26
- this.closed = false;
27
- this.onStatusChange("connecting");
28
-
29
- try {
30
- this.ws = new WebSocket(this.url);
31
-
32
- this.ws.onopen = () => {
33
- this.reconnectAttempt = 0;
34
- this.onStatusChange("connected");
35
- };
36
-
37
- this.ws.onmessage = (evt) => {
38
- try {
39
- const msg = JSON.parse(evt.data) as ServerMessage;
40
- this.onMessage(msg);
41
- } catch {
42
- console.error("[ws] Failed to parse message:", evt.data);
43
- }
44
- };
45
-
46
- this.ws.onclose = () => {
47
- this.onStatusChange("disconnected");
48
- if (!this.closed) {
49
- this.scheduleReconnect();
50
- }
51
- };
52
-
53
- this.ws.onerror = () => {
54
- // onclose will fire after onerror
55
- };
56
- } catch {
57
- this.onStatusChange("disconnected");
58
- if (!this.closed) {
59
- this.scheduleReconnect();
60
- }
61
- }
62
- }
63
-
64
- send(msg: ClientMessage) {
65
- if (this.ws?.readyState === WebSocket.OPEN) {
66
- this.ws.send(JSON.stringify(msg));
67
- }
68
- }
69
-
70
- close() {
71
- this.closed = true;
72
- if (this.reconnectTimer) {
73
- clearTimeout(this.reconnectTimer);
74
- this.reconnectTimer = null;
75
- }
76
- this.ws?.close();
77
- this.ws = null;
78
- }
79
-
80
- get isConnected(): boolean {
81
- return this.ws?.readyState === WebSocket.OPEN;
82
- }
83
-
84
- /**
85
- * Skip the remaining backoff and reconnect immediately (e.g. when the
86
- * browser fires an `online` event). No-op if open/connecting or closed
87
- * deliberately.
88
- */
89
- reconnectNow() {
90
- if (this.closed) return;
91
- const state = this.ws?.readyState;
92
- if (state === WebSocket.OPEN || state === WebSocket.CONNECTING) return;
93
- if (this.reconnectTimer) {
94
- clearTimeout(this.reconnectTimer);
95
- this.reconnectTimer = null;
96
- }
97
- this.reconnectAttempt = 0;
98
- this.connect();
99
- }
100
-
101
- private scheduleReconnect() {
102
- const delay = Math.min(1000 * 2 ** this.reconnectAttempt, 30000);
103
- this.reconnectAttempt++;
104
- this.reconnectTimer = setTimeout(() => {
105
- this.reconnectTimer = null;
106
- this.connect();
107
- }, delay);
108
- }
109
- }