fluxy-bot 0.3.1 → 0.3.3
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/dist-fluxy/assets/fluxy-C6-vL18Q.js +37 -0
- package/dist-fluxy/assets/{globals-CnbiE5KJ.js → globals-Bu5tVsgN.js} +1 -1
- package/dist-fluxy/assets/{globals-CZf7hjQW.css → globals-DYOj4b0m.css} +1 -1
- package/dist-fluxy/assets/{onboard-B_QyBFoO.js → onboard-Bzu8G4yQ.js} +1 -1
- package/dist-fluxy/fluxy.html +3 -3
- package/dist-fluxy/onboard.html +3 -3
- package/package.json +1 -1
- package/supervisor/chat/fluxy-main.tsx +10 -2
- package/supervisor/chat/src/hooks/useFluxyChat.ts +6 -6
- package/supervisor/chat/src/lib/auth.ts +10 -2
- package/dist-fluxy/assets/fluxy-tSkoe-BG.js +0 -37
|
@@ -8,7 +8,7 @@ import { authFetch } from '../lib/auth';
|
|
|
8
8
|
* Loads/persists messages via the DB (worker API).
|
|
9
9
|
* Supports cross-device sync via chat:sync WS events.
|
|
10
10
|
*/
|
|
11
|
-
export function useFluxyChat(ws: WsClient | null, triggerReload?: number) {
|
|
11
|
+
export function useFluxyChat(ws: WsClient | null, triggerReload?: number, enabled = true) {
|
|
12
12
|
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
|
13
13
|
const [conversationId, setConversationId] = useState<string | null>(null);
|
|
14
14
|
const [streaming, setStreaming] = useState(false);
|
|
@@ -62,19 +62,19 @@ export function useFluxyChat(ws: WsClient | null, triggerReload?: number) {
|
|
|
62
62
|
} catch { /* worker not ready yet */ }
|
|
63
63
|
}, []);
|
|
64
64
|
|
|
65
|
-
// Load on mount
|
|
65
|
+
// Load on mount (only when enabled/authenticated)
|
|
66
66
|
useEffect(() => {
|
|
67
|
-
if (loaded.current) return;
|
|
67
|
+
if (!enabled || loaded.current) return;
|
|
68
68
|
loaded.current = true;
|
|
69
69
|
loadFromDb();
|
|
70
|
-
}, [loadFromDb]);
|
|
70
|
+
}, [enabled, loadFromDb]);
|
|
71
71
|
|
|
72
72
|
// Reload on reconnect (triggerReload changes)
|
|
73
73
|
useEffect(() => {
|
|
74
|
-
if (triggerReload && triggerReload > 0) {
|
|
74
|
+
if (enabled && triggerReload && triggerReload > 0) {
|
|
75
75
|
loadFromDb();
|
|
76
76
|
}
|
|
77
|
-
}, [triggerReload, loadFromDb]);
|
|
77
|
+
}, [enabled, triggerReload, loadFromDb]);
|
|
78
78
|
|
|
79
79
|
useEffect(() => {
|
|
80
80
|
if (!ws) return;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const TOKEN_KEY = 'fluxy_token';
|
|
2
2
|
|
|
3
|
+
let authFailureCallback: (() => void) | null = null;
|
|
4
|
+
|
|
3
5
|
export function getAuthToken(): string | null {
|
|
4
6
|
return localStorage.getItem(TOKEN_KEY);
|
|
5
7
|
}
|
|
@@ -12,6 +14,11 @@ export function clearAuthToken(): void {
|
|
|
12
14
|
localStorage.removeItem(TOKEN_KEY);
|
|
13
15
|
}
|
|
14
16
|
|
|
17
|
+
/** Register a callback for when a 401 is received (token expired mid-session) */
|
|
18
|
+
export function onAuthFailure(cb: () => void): void {
|
|
19
|
+
authFailureCallback = cb;
|
|
20
|
+
}
|
|
21
|
+
|
|
15
22
|
export async function authFetch(url: string, options: RequestInit = {}): Promise<Response> {
|
|
16
23
|
const token = getAuthToken();
|
|
17
24
|
const headers = new Headers(options.headers);
|
|
@@ -21,9 +28,10 @@ export async function authFetch(url: string, options: RequestInit = {}): Promise
|
|
|
21
28
|
|
|
22
29
|
const res = await fetch(url, { ...options, headers });
|
|
23
30
|
|
|
24
|
-
if (res.status === 401) {
|
|
31
|
+
if (res.status === 401 && token) {
|
|
32
|
+
// Token was present but rejected — it expired
|
|
25
33
|
clearAuthToken();
|
|
26
|
-
|
|
34
|
+
authFailureCallback?.();
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
return res;
|