@schlessera/brain-ui-react 0.32.0 → 0.33.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.
- package/README.md +38 -1
- package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
- package/dist/components/chat/tool-call-timeline.js +2 -3
- package/dist/components/chat/tool-call-timeline.js.map +1 -1
- package/dist/hooks/use-hash-routes.d.ts +6 -0
- package/dist/hooks/use-hash-routes.d.ts.map +1 -0
- package/dist/hooks/use-hash-routes.js +92 -0
- package/dist/hooks/use-hash-routes.js.map +1 -0
- package/dist/hooks/use-service-worker-updates.d.ts +15 -0
- package/dist/hooks/use-service-worker-updates.d.ts.map +1 -0
- package/dist/hooks/use-service-worker-updates.js +116 -0
- package/dist/hooks/use-service-worker-updates.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/voice/use-dictation.d.ts.map +1 -1
- package/dist/voice/use-dictation.js +2 -2
- package/dist/voice/use-dictation.js.map +1 -1
- package/package.json +2 -2
- package/src/components/chat/tool-call-timeline.tsx +3 -4
- package/src/hooks/use-hash-routes.ts +102 -0
- package/src/hooks/use-service-worker-updates.ts +145 -0
- package/src/index.ts +6 -0
- package/src/voice/use-dictation.ts +3 -3
package/README.md
CHANGED
|
@@ -9,6 +9,13 @@ The deployment shell owns the document: `index.html`, the mount point, the
|
|
|
9
9
|
Vite/PWA build, the service worker, and the theme entry. This package ships
|
|
10
10
|
prebuilt JS + `.d.ts` plus its styles in two forms.
|
|
11
11
|
|
|
12
|
+
## React compatibility
|
|
13
|
+
|
|
14
|
+
The `react` and `react-dom` peer range remains `>=18`: React 18 and the current
|
|
15
|
+
React release are both covered by the packaging smoke test. It installs the
|
|
16
|
+
packed package with matching `@types/react` and `@types/react-dom`, imports the
|
|
17
|
+
entry point, and typechecks the emitted `.d.ts` against React 18's types.
|
|
18
|
+
|
|
12
19
|
## Usage
|
|
13
20
|
|
|
14
21
|
```tsx
|
|
@@ -17,21 +24,51 @@ import {
|
|
|
17
24
|
ConnectionGate,
|
|
18
25
|
AppShell,
|
|
19
26
|
ChatPage,
|
|
27
|
+
GraphPage,
|
|
28
|
+
ActivityPage,
|
|
29
|
+
useHashRoutes,
|
|
30
|
+
useUIStore,
|
|
20
31
|
} from "@schlessera/brain-ui-react";
|
|
21
32
|
|
|
22
33
|
configureBrainUi({ appName: "Brain UI" }); // optional; defaults shown
|
|
23
34
|
|
|
24
35
|
export function App() {
|
|
36
|
+
useHashRoutes();
|
|
37
|
+
const activeView = useUIStore((state) => state.activeView);
|
|
38
|
+
|
|
25
39
|
return (
|
|
26
40
|
<ConnectionGate>
|
|
27
41
|
<AppShell>
|
|
28
|
-
|
|
42
|
+
{/* Keep chat mounted so an in-flight turn survives a view switch.
|
|
43
|
+
`display: contents` rather than a plain wrapper: ChatPage is a
|
|
44
|
+
flex child of AppShell and its `flex-1` needs to reach the shell's
|
|
45
|
+
flex container, or the chat loses its viewport-filling layout and
|
|
46
|
+
bounded scrolling. */}
|
|
47
|
+
<div style={{ display: activeView === "chat" ? "contents" : "none" }}>
|
|
48
|
+
<ChatPage />
|
|
49
|
+
</div>
|
|
50
|
+
{activeView === "graph" && <GraphPage />}
|
|
51
|
+
{activeView === "activity" && <ActivityPage />}
|
|
29
52
|
</AppShell>
|
|
30
53
|
</ConnectionGate>
|
|
31
54
|
);
|
|
32
55
|
}
|
|
33
56
|
```
|
|
34
57
|
|
|
58
|
+
## Shell hooks
|
|
59
|
+
|
|
60
|
+
`useHashRoutes()` owns the generic client routes: `#/files/<path>` opens the
|
|
61
|
+
file panel, `#/graph` and `#/activity` select their full-screen views, activity
|
|
62
|
+
deep links keep their suffix, and store-driven view changes use
|
|
63
|
+
`history.replaceState` rather than adding browser-history entries.
|
|
64
|
+
|
|
65
|
+
`useServiceWorkerUpdates({ isBusy })` registers `/service-worker.js` and
|
|
66
|
+
reloads after an update takes control. It never reloads for a first install,
|
|
67
|
+
and an update takeover that happens while `isBusy` is true waits for the
|
|
68
|
+
transition back to idle. Non-empty text fields are treated as busy by default;
|
|
69
|
+
`hasUnsentText` can override that DOM probe. A Vite shell can preserve its
|
|
70
|
+
development gate with `enabled: import.meta.env.PROD`.
|
|
71
|
+
|
|
35
72
|
## Configuration
|
|
36
73
|
|
|
37
74
|
`configureBrainUi()` is this package's only configuration entry, and it must
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call-timeline.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-call-timeline.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAyBzE,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,IAAY,GACb,EAAE;IACD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,sCAqDA"}
|
|
@@ -13,9 +13,6 @@ import { useActivityStore, spanForTool, childSpans } from "../../stores/activity
|
|
|
13
13
|
import { useUIStore } from "../../stores/ui-store.js";
|
|
14
14
|
import { useNow } from "../../hooks/use-now.js";
|
|
15
15
|
import { SpanStatusDot } from "../activity/span-bits.js";
|
|
16
|
-
// Register the built-in renderer packs once. Registration is build-time; this
|
|
17
|
-
// runs on module load.
|
|
18
|
-
registerBuiltinRenderers();
|
|
19
16
|
// Sessions that predate backend stamping (old servers, cleared stores) scope
|
|
20
17
|
// to the shipped default backend.
|
|
21
18
|
const DEFAULT_BACKEND_ID = "claude";
|
|
@@ -25,6 +22,8 @@ function useBackendId() {
|
|
|
25
22
|
DEFAULT_BACKEND_ID);
|
|
26
23
|
}
|
|
27
24
|
export function ToolCallTimeline({ toolCalls, onApproval, live = false, }) {
|
|
25
|
+
// Resolution happens below during this render, before effects can run.
|
|
26
|
+
registerBuiltinRenderers();
|
|
28
27
|
// Collapse the whole run to a summary row once the turn is over. History
|
|
29
28
|
// messages mount collapsed; a live timeline collapses when streaming ends.
|
|
30
29
|
const [collapsed, setCollapsed] = useState(!live);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call-timeline.js","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-call-timeline.js","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hash-routes.d.ts","sourceRoot":"","sources":["../../src/hooks/use-hash-routes.ts"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAqEpC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { useFileStore } from "../stores/file-store.js";
|
|
3
|
+
import { useUIStore } from "../stores/ui-store.js";
|
|
4
|
+
const VIEW_ROUTES = [
|
|
5
|
+
{ view: "graph", prefixMatch: false },
|
|
6
|
+
{ view: "activity", prefixMatch: true },
|
|
7
|
+
];
|
|
8
|
+
function matchesViewRoute(hash, view, prefixMatch) {
|
|
9
|
+
const route = `#/${view}`;
|
|
10
|
+
return hash === route || (prefixMatch && hash.startsWith(`${route}/`));
|
|
11
|
+
}
|
|
12
|
+
function viewForHash(hash) {
|
|
13
|
+
for (const { view, prefixMatch } of VIEW_ROUTES) {
|
|
14
|
+
if (matchesViewRoute(hash, view, prefixMatch))
|
|
15
|
+
return view;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Synchronize the shell's file and full-screen view routes with ui-react's
|
|
21
|
+
* stores.
|
|
22
|
+
*/
|
|
23
|
+
export function useHashRoutes() {
|
|
24
|
+
const [hash, setHash] = useState(() => window.location.hash);
|
|
25
|
+
const syncingFromHash = useRef(false);
|
|
26
|
+
const activeView = useUIStore((state) => state.activeView);
|
|
27
|
+
const setActiveView = useUIStore((state) => state.setActiveView);
|
|
28
|
+
const setFilePanelOpen = useUIStore((state) => state.setFilePanelOpen);
|
|
29
|
+
const openFile = useFileStore((state) => state.openFile);
|
|
30
|
+
const openDir = useFileStore((state) => state.openDir);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const onHashChange = () => setHash(window.location.hash);
|
|
33
|
+
window.addEventListener("hashchange", onHashChange);
|
|
34
|
+
return () => window.removeEventListener("hashchange", onHashChange);
|
|
35
|
+
}, []);
|
|
36
|
+
/**
|
|
37
|
+
* Open the file panel + load a file when the URL hash points at
|
|
38
|
+
* `#/files/<path>`. This only runs on hashchange (or initial mount); it does
|
|
39
|
+
* not loop because the panel updates its hash with history.replaceState.
|
|
40
|
+
*/
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (!hash.startsWith("#/files"))
|
|
43
|
+
return;
|
|
44
|
+
const raw = hash.slice("#/files".length).replace(/^\/+/, "");
|
|
45
|
+
setFilePanelOpen(true);
|
|
46
|
+
if (!raw)
|
|
47
|
+
return;
|
|
48
|
+
if (raw.endsWith("/")) {
|
|
49
|
+
void openDir(raw.replace(/\/+$/, ""));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
void openFile(raw);
|
|
53
|
+
}
|
|
54
|
+
}, [hash, setFilePanelOpen, openFile, openDir]);
|
|
55
|
+
// The hash is the shareable entry point and the store is the source of
|
|
56
|
+
// truth. Activity accepts a suffix so push links such as
|
|
57
|
+
// `#/activity/<runId>` open the view without losing the deep link.
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
const view = viewForHash(hash);
|
|
60
|
+
if (!view)
|
|
61
|
+
return;
|
|
62
|
+
// Arm the suppression flag ONLY when this is a real view change. A hash
|
|
63
|
+
// that keeps the same view — `#/activity/one` to `#/activity/two`, which
|
|
64
|
+
// is every Activity deep link — makes setActiveView a no-op, so the effect
|
|
65
|
+
// below never runs and never clears the flag. It would then swallow the
|
|
66
|
+
// NEXT store-driven change, leaving the URL pointing at Activity while the
|
|
67
|
+
// app shows Chat, and a refresh would jump back.
|
|
68
|
+
if (useUIStore.getState().activeView === view)
|
|
69
|
+
return;
|
|
70
|
+
syncingFromHash.current = true;
|
|
71
|
+
setActiveView(view);
|
|
72
|
+
}, [hash, setActiveView]);
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
// A hash-driven store write and this effect are flushed together. Skip
|
|
75
|
+
// the stale pre-write render so it cannot rewrite the incoming hash.
|
|
76
|
+
if (syncingFromHash.current) {
|
|
77
|
+
syncingFromHash.current = false;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (activeView === "chat") {
|
|
81
|
+
if (viewForHash(window.location.hash)) {
|
|
82
|
+
history.replaceState(null, "", window.location.pathname);
|
|
83
|
+
}
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const config = VIEW_ROUTES.find((candidate) => candidate.view === activeView);
|
|
87
|
+
if (!matchesViewRoute(window.location.hash, config.view, config.prefixMatch)) {
|
|
88
|
+
history.replaceState(null, "", `#/${activeView}`);
|
|
89
|
+
}
|
|
90
|
+
}, [activeView]);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=use-hash-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hash-routes.js","sourceRoot":"","sources":["../../src/hooks/use-hash-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Default unsaved-text probe used by the service-worker reload guard. */
|
|
2
|
+
export declare function hasUnsentText(): boolean;
|
|
3
|
+
export interface UseServiceWorkerUpdatesOptions {
|
|
4
|
+
/** Store-backed work that a reload would interrupt. */
|
|
5
|
+
isBusy: boolean;
|
|
6
|
+
/** Override the DOM draft probe, primarily for deterministic tests. */
|
|
7
|
+
hasUnsentText?: () => boolean;
|
|
8
|
+
/** Shell-controlled production gate. Default true. */
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
/** Test hook for observing the one-shot reload without navigating. */
|
|
11
|
+
reload?: () => void;
|
|
12
|
+
}
|
|
13
|
+
/** Register the worker and reload once an update takeover can do so safely. */
|
|
14
|
+
export declare function useServiceWorkerUpdates({ isBusy, hasUnsentText: probeUnsentText, enabled, reload, }: UseServiceWorkerUpdatesOptions): void;
|
|
15
|
+
//# sourceMappingURL=use-service-worker-updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-service-worker-updates.d.ts","sourceRoot":"","sources":["../../src/hooks/use-service-worker-updates.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,wBAAgB,aAAa,IAAI,OAAO,CAOvC;AAED,MAAM,WAAW,8BAA8B;IAC7C,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAC9B,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,EACtC,MAAM,EACN,aAAa,EAAE,eAA+B,EAC9C,OAAc,EACd,MAAM,GACP,EAAE,8BAA8B,GAAG,IAAI,CAmHvC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
/** Default unsaved-text probe used by the service-worker reload guard. */
|
|
3
|
+
export function hasUnsentText() {
|
|
4
|
+
if (typeof document === "undefined")
|
|
5
|
+
return false;
|
|
6
|
+
const fields = document.querySelectorAll("textarea, input[type='text']");
|
|
7
|
+
for (const element of fields) {
|
|
8
|
+
if (element.value.trim().length > 0)
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
/** Register the worker and reload once an update takeover can do so safely. */
|
|
14
|
+
export function useServiceWorkerUpdates({ isBusy, hasUnsentText: probeUnsentText = hasUnsentText, enabled = true, reload, }) {
|
|
15
|
+
const isBusyRef = useRef(isBusy);
|
|
16
|
+
const probeUnsentTextRef = useRef(probeUnsentText);
|
|
17
|
+
const reloadRef = useRef(reload);
|
|
18
|
+
const updateReadyRef = useRef(false);
|
|
19
|
+
const reloadPendingRef = useRef(false);
|
|
20
|
+
const refreshingRef = useRef(false);
|
|
21
|
+
const tryReloadRef = useRef(() => { });
|
|
22
|
+
isBusyRef.current = isBusy;
|
|
23
|
+
probeUnsentTextRef.current = probeUnsentText;
|
|
24
|
+
reloadRef.current = reload;
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
if (!enabled ||
|
|
27
|
+
typeof navigator === "undefined" ||
|
|
28
|
+
!("serviceWorker" in navigator)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const serviceWorker = navigator.serviceWorker;
|
|
32
|
+
let disposed = false;
|
|
33
|
+
const trackedWorkers = new Set();
|
|
34
|
+
const workerStateListeners = new Map();
|
|
35
|
+
let registrationListener;
|
|
36
|
+
const busy = () => isBusyRef.current || probeUnsentTextRef.current();
|
|
37
|
+
const doReload = () => {
|
|
38
|
+
if (refreshingRef.current || disposed)
|
|
39
|
+
return;
|
|
40
|
+
refreshingRef.current = true;
|
|
41
|
+
(reloadRef.current ?? (() => window.location.reload()))();
|
|
42
|
+
};
|
|
43
|
+
// A reload never fires while busy. If takeover happens mid-work, latch it
|
|
44
|
+
// and fire on the transition back to idle instead.
|
|
45
|
+
const reloadWhenIdle = () => {
|
|
46
|
+
if (refreshingRef.current || disposed)
|
|
47
|
+
return;
|
|
48
|
+
if (busy()) {
|
|
49
|
+
reloadPendingRef.current = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
reloadPendingRef.current = false;
|
|
53
|
+
doReload();
|
|
54
|
+
};
|
|
55
|
+
tryReloadRef.current = () => {
|
|
56
|
+
if (reloadPendingRef.current)
|
|
57
|
+
reloadWhenIdle();
|
|
58
|
+
};
|
|
59
|
+
const onControllerChange = () => {
|
|
60
|
+
// A first install never reloads. Only a worker observed installing over
|
|
61
|
+
// an existing controller arms the update-takeover reload.
|
|
62
|
+
if (!updateReadyRef.current)
|
|
63
|
+
return;
|
|
64
|
+
reloadWhenIdle();
|
|
65
|
+
};
|
|
66
|
+
serviceWorker.addEventListener("controllerchange", onControllerChange);
|
|
67
|
+
// DOM drafts are component-local rather than store-backed. An input event
|
|
68
|
+
// supplies their transition-to-idle signal while a reload is pending.
|
|
69
|
+
const onInput = () => tryReloadRef.current();
|
|
70
|
+
document.addEventListener("input", onInput);
|
|
71
|
+
const trackInstalling = (worker) => {
|
|
72
|
+
if (!worker || trackedWorkers.has(worker))
|
|
73
|
+
return;
|
|
74
|
+
trackedWorkers.add(worker);
|
|
75
|
+
const onStateChange = () => {
|
|
76
|
+
if (worker.state === "installed" && serviceWorker.controller) {
|
|
77
|
+
updateReadyRef.current = true;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
worker.addEventListener("statechange", onStateChange);
|
|
81
|
+
workerStateListeners.set(worker, onStateChange);
|
|
82
|
+
};
|
|
83
|
+
serviceWorker
|
|
84
|
+
.register("/service-worker.js")
|
|
85
|
+
.then((registration) => {
|
|
86
|
+
if (disposed)
|
|
87
|
+
return;
|
|
88
|
+
trackInstalling(registration.installing);
|
|
89
|
+
const onUpdateFound = () => trackInstalling(registration.installing);
|
|
90
|
+
registration.addEventListener("updatefound", onUpdateFound);
|
|
91
|
+
registrationListener = { registration, onUpdateFound };
|
|
92
|
+
})
|
|
93
|
+
.catch((error) => {
|
|
94
|
+
if (!disposed)
|
|
95
|
+
console.error("[sw] Registration failed:", error);
|
|
96
|
+
});
|
|
97
|
+
return () => {
|
|
98
|
+
disposed = true;
|
|
99
|
+
serviceWorker.removeEventListener("controllerchange", onControllerChange);
|
|
100
|
+
document.removeEventListener("input", onInput);
|
|
101
|
+
if (registrationListener) {
|
|
102
|
+
registrationListener.registration.removeEventListener("updatefound", registrationListener.onUpdateFound);
|
|
103
|
+
}
|
|
104
|
+
for (const [worker, listener] of workerStateListeners) {
|
|
105
|
+
worker.removeEventListener("statechange", listener);
|
|
106
|
+
}
|
|
107
|
+
tryReloadRef.current = () => { };
|
|
108
|
+
};
|
|
109
|
+
}, [enabled]);
|
|
110
|
+
// Store-driven state changes rerender the caller. This is the normal idle
|
|
111
|
+
// transition; the input listener above covers the DOM-only equivalent.
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
tryReloadRef.current();
|
|
114
|
+
}, [isBusy, probeUnsentText]);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=use-service-worker-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-service-worker-updates.js","sourceRoot":"","sources":["../../src/hooks/use-service-worker-updates.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export { useProviderStore } from "./stores/provider-store.js";
|
|
|
26
26
|
export { useVoiceStore } from "./voice/voice-store.js";
|
|
27
27
|
export { ShareHarness } from "./components/dev/share-harness.js";
|
|
28
28
|
export { useVpnStatus } from "./hooks/use-vpn-status.js";
|
|
29
|
+
export { useHashRoutes } from "./hooks/use-hash-routes.js";
|
|
30
|
+
export { useServiceWorkerUpdates, hasUnsentText, type UseServiceWorkerUpdatesOptions, } from "./hooks/use-service-worker-updates.js";
|
|
29
31
|
export { useWebSocket, sendClientMessage, handleServerMessage, runStateForFrame, } from "./hooks/use-websocket.js";
|
|
30
32
|
export { useShareStore, hasPendingShare, type ShareIntakeState, } from "./stores/share-store.js";
|
|
31
33
|
export { ShareIntake } from "./components/chat/share-card.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7E,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAIpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAMvD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EACL,aAAa,EACb,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7E,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAIpE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAMvD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,aAAa,EACb,KAAK,8BAA8B,GACpC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EACL,aAAa,EACb,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAG9D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -39,6 +39,8 @@ export { useVoiceStore } from "./voice/voice-store.js";
|
|
|
39
39
|
export { ShareHarness } from "./components/dev/share-harness.js";
|
|
40
40
|
// Connectivity probes.
|
|
41
41
|
export { useVpnStatus } from "./hooks/use-vpn-status.js";
|
|
42
|
+
export { useHashRoutes } from "./hooks/use-hash-routes.js";
|
|
43
|
+
export { useServiceWorkerUpdates, hasUnsentText, } from "./hooks/use-service-worker-updates.js";
|
|
42
44
|
export { useWebSocket, sendClientMessage, handleServerMessage, runStateForFrame, } from "./hooks/use-websocket.js";
|
|
43
45
|
// Share intake. The shell needs `hasPendingShare` for its service-worker
|
|
44
46
|
// reload guard: reloading mid-intake would file a share twice or lose it.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AAE7E,yCAAyC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,yEAAyE;AACzE,6DAA6D;AAC7D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1D,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,wEAAwE;AACxE,iFAAiF;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,8EAA8E;AAC9E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GAOb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAoB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAmB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAkB,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,yEAAyE;AACzE,+EAA+E;AAC/E,0EAA0E;AAC1E,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,yEAAyE;AACzE,0EAA0E;AAC1E,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,yDAAyD;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sEAAsE;AACtE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AAE7E,yCAAyC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,yEAAyE;AACzE,6DAA6D;AAC7D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1D,2EAA2E;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEpE,wEAAwE;AACxE,iFAAiF;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,8EAA8E;AAC9E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GAOb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAoB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAmB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAkB,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,yEAAyE;AACzE,+EAA+E;AAC/E,0EAA0E;AAC1E,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,uBAAuB;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,aAAa,GAEd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,yEAAyE;AACzE,0EAA0E;AAC1E,OAAO,EACL,aAAa,EACb,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,yDAAyD;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dictation.d.ts","sourceRoot":"","sources":["../../src/voice/use-dictation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-dictation.d.ts","sourceRoot":"","sources":["../../src/voice/use-dictation.ts"],"names":[],"mappings":"AA0BA,wBAAgB,YAAY;;;;EAgK3B"}
|
|
@@ -3,8 +3,6 @@ import { useVoiceStore } from "./voice-store.js";
|
|
|
3
3
|
import { createAsrClient, speechUiHints, } from "@schlessera/brain-ui-sdk/client";
|
|
4
4
|
import { api } from "../lib/api-client.js";
|
|
5
5
|
import { registerAsrClients } from "./asr-clients.js";
|
|
6
|
-
// Register the built-in ASR clients once at module load.
|
|
7
|
-
registerAsrClients();
|
|
8
6
|
/** Apply pronunciation overrides client-side to a finalized transcript. */
|
|
9
7
|
function applyOverrides(text, overrides) {
|
|
10
8
|
if (overrides.length === 0)
|
|
@@ -19,6 +17,8 @@ function applyOverrides(text, overrides) {
|
|
|
19
17
|
return out;
|
|
20
18
|
}
|
|
21
19
|
export function useDictation() {
|
|
20
|
+
// start() may resolve a client before this hook's effects have run.
|
|
21
|
+
registerAsrClients();
|
|
22
22
|
const clientRef = useRef(null);
|
|
23
23
|
const overridesRef = useRef([]);
|
|
24
24
|
// Bumped on every start() and on every stop/cancel/unmount. A start that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-dictation.js","sourceRoot":"","sources":["../../src/voice/use-dictation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,aAAa,GAEd,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,
|
|
1
|
+
{"version":3,"file":"use-dictation.js","sourceRoot":"","sources":["../../src/voice/use-dictation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schlessera/brain-ui-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"description": "brain-kit chat-UI React components: chat surface, tool-call timeline, file browser, voice dictation, stores, and WebSocket transport",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"prepublishOnly": "bun ../../scripts/check-dist.ts"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@schlessera/brain-ui-sdk": "0.
|
|
49
|
+
"@schlessera/brain-ui-sdk": "0.33.0",
|
|
50
50
|
"@simplewebauthn/browser": "^13.2.2",
|
|
51
51
|
"clsx": "^2",
|
|
52
52
|
"framer-motion": "^12.38.0",
|
|
@@ -22,10 +22,6 @@ import { useUIStore } from "../../stores/ui-store.js";
|
|
|
22
22
|
import { useNow } from "../../hooks/use-now.js";
|
|
23
23
|
import { SpanStatusDot } from "../activity/span-bits.js";
|
|
24
24
|
|
|
25
|
-
// Register the built-in renderer packs once. Registration is build-time; this
|
|
26
|
-
// runs on module load.
|
|
27
|
-
registerBuiltinRenderers();
|
|
28
|
-
|
|
29
25
|
// Sessions that predate backend stamping (old servers, cleared stores) scope
|
|
30
26
|
// to the shipped default backend.
|
|
31
27
|
const DEFAULT_BACKEND_ID = "claude";
|
|
@@ -49,6 +45,9 @@ export function ToolCallTimeline({
|
|
|
49
45
|
/** Parent message still streaming — keep the timeline open while work runs. */
|
|
50
46
|
live?: boolean;
|
|
51
47
|
}) {
|
|
48
|
+
// Resolution happens below during this render, before effects can run.
|
|
49
|
+
registerBuiltinRenderers();
|
|
50
|
+
|
|
52
51
|
// Collapse the whole run to a summary row once the turn is over. History
|
|
53
52
|
// messages mount collapsed; a live timeline collapses when streaming ends.
|
|
54
53
|
const [collapsed, setCollapsed] = useState(!live);
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { useFileStore } from "../stores/file-store.js";
|
|
3
|
+
import { useUIStore, type ActiveView } from "../stores/ui-store.js";
|
|
4
|
+
|
|
5
|
+
const VIEW_ROUTES: ReadonlyArray<{
|
|
6
|
+
view: Exclude<ActiveView, "chat">;
|
|
7
|
+
prefixMatch: boolean;
|
|
8
|
+
}> = [
|
|
9
|
+
{ view: "graph", prefixMatch: false },
|
|
10
|
+
{ view: "activity", prefixMatch: true },
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
function matchesViewRoute(
|
|
14
|
+
hash: string,
|
|
15
|
+
view: Exclude<ActiveView, "chat">,
|
|
16
|
+
prefixMatch: boolean
|
|
17
|
+
): boolean {
|
|
18
|
+
const route = `#/${view}`;
|
|
19
|
+
return hash === route || (prefixMatch && hash.startsWith(`${route}/`));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function viewForHash(hash: string): Exclude<ActiveView, "chat"> | null {
|
|
23
|
+
for (const { view, prefixMatch } of VIEW_ROUTES) {
|
|
24
|
+
if (matchesViewRoute(hash, view, prefixMatch)) return view;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Synchronize the shell's file and full-screen view routes with ui-react's
|
|
31
|
+
* stores.
|
|
32
|
+
*/
|
|
33
|
+
export function useHashRoutes(): void {
|
|
34
|
+
const [hash, setHash] = useState(() => window.location.hash);
|
|
35
|
+
const syncingFromHash = useRef(false);
|
|
36
|
+
const activeView = useUIStore((state) => state.activeView);
|
|
37
|
+
const setActiveView = useUIStore((state) => state.setActiveView);
|
|
38
|
+
const setFilePanelOpen = useUIStore((state) => state.setFilePanelOpen);
|
|
39
|
+
const openFile = useFileStore((state) => state.openFile);
|
|
40
|
+
const openDir = useFileStore((state) => state.openDir);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
const onHashChange = () => setHash(window.location.hash);
|
|
44
|
+
window.addEventListener("hashchange", onHashChange);
|
|
45
|
+
return () => window.removeEventListener("hashchange", onHashChange);
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Open the file panel + load a file when the URL hash points at
|
|
50
|
+
* `#/files/<path>`. This only runs on hashchange (or initial mount); it does
|
|
51
|
+
* not loop because the panel updates its hash with history.replaceState.
|
|
52
|
+
*/
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!hash.startsWith("#/files")) return;
|
|
55
|
+
const raw = hash.slice("#/files".length).replace(/^\/+/, "");
|
|
56
|
+
setFilePanelOpen(true);
|
|
57
|
+
if (!raw) return;
|
|
58
|
+
if (raw.endsWith("/")) {
|
|
59
|
+
void openDir(raw.replace(/\/+$/, ""));
|
|
60
|
+
} else {
|
|
61
|
+
void openFile(raw);
|
|
62
|
+
}
|
|
63
|
+
}, [hash, setFilePanelOpen, openFile, openDir]);
|
|
64
|
+
|
|
65
|
+
// The hash is the shareable entry point and the store is the source of
|
|
66
|
+
// truth. Activity accepts a suffix so push links such as
|
|
67
|
+
// `#/activity/<runId>` open the view without losing the deep link.
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const view = viewForHash(hash);
|
|
70
|
+
if (!view) return;
|
|
71
|
+
// Arm the suppression flag ONLY when this is a real view change. A hash
|
|
72
|
+
// that keeps the same view — `#/activity/one` to `#/activity/two`, which
|
|
73
|
+
// is every Activity deep link — makes setActiveView a no-op, so the effect
|
|
74
|
+
// below never runs and never clears the flag. It would then swallow the
|
|
75
|
+
// NEXT store-driven change, leaving the URL pointing at Activity while the
|
|
76
|
+
// app shows Chat, and a refresh would jump back.
|
|
77
|
+
if (useUIStore.getState().activeView === view) return;
|
|
78
|
+
syncingFromHash.current = true;
|
|
79
|
+
setActiveView(view);
|
|
80
|
+
}, [hash, setActiveView]);
|
|
81
|
+
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
// A hash-driven store write and this effect are flushed together. Skip
|
|
84
|
+
// the stale pre-write render so it cannot rewrite the incoming hash.
|
|
85
|
+
if (syncingFromHash.current) {
|
|
86
|
+
syncingFromHash.current = false;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (activeView === "chat") {
|
|
91
|
+
if (viewForHash(window.location.hash)) {
|
|
92
|
+
history.replaceState(null, "", window.location.pathname);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const config = VIEW_ROUTES.find((candidate) => candidate.view === activeView)!;
|
|
98
|
+
if (!matchesViewRoute(window.location.hash, config.view, config.prefixMatch)) {
|
|
99
|
+
history.replaceState(null, "", `#/${activeView}`);
|
|
100
|
+
}
|
|
101
|
+
}, [activeView]);
|
|
102
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
/** Default unsaved-text probe used by the service-worker reload guard. */
|
|
4
|
+
export function hasUnsentText(): boolean {
|
|
5
|
+
if (typeof document === "undefined") return false;
|
|
6
|
+
const fields = document.querySelectorAll("textarea, input[type='text']");
|
|
7
|
+
for (const element of fields) {
|
|
8
|
+
if ((element as HTMLInputElement).value.trim().length > 0) return true;
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UseServiceWorkerUpdatesOptions {
|
|
14
|
+
/** Store-backed work that a reload would interrupt. */
|
|
15
|
+
isBusy: boolean;
|
|
16
|
+
/** Override the DOM draft probe, primarily for deterministic tests. */
|
|
17
|
+
hasUnsentText?: () => boolean;
|
|
18
|
+
/** Shell-controlled production gate. Default true. */
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
/** Test hook for observing the one-shot reload without navigating. */
|
|
21
|
+
reload?: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Register the worker and reload once an update takeover can do so safely. */
|
|
25
|
+
export function useServiceWorkerUpdates({
|
|
26
|
+
isBusy,
|
|
27
|
+
hasUnsentText: probeUnsentText = hasUnsentText,
|
|
28
|
+
enabled = true,
|
|
29
|
+
reload,
|
|
30
|
+
}: UseServiceWorkerUpdatesOptions): void {
|
|
31
|
+
const isBusyRef = useRef(isBusy);
|
|
32
|
+
const probeUnsentTextRef = useRef(probeUnsentText);
|
|
33
|
+
const reloadRef = useRef(reload);
|
|
34
|
+
const updateReadyRef = useRef(false);
|
|
35
|
+
const reloadPendingRef = useRef(false);
|
|
36
|
+
const refreshingRef = useRef(false);
|
|
37
|
+
const tryReloadRef = useRef<() => void>(() => {});
|
|
38
|
+
|
|
39
|
+
isBusyRef.current = isBusy;
|
|
40
|
+
probeUnsentTextRef.current = probeUnsentText;
|
|
41
|
+
reloadRef.current = reload;
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (
|
|
45
|
+
!enabled ||
|
|
46
|
+
typeof navigator === "undefined" ||
|
|
47
|
+
!("serviceWorker" in navigator)
|
|
48
|
+
) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const serviceWorker = navigator.serviceWorker;
|
|
53
|
+
let disposed = false;
|
|
54
|
+
const trackedWorkers = new Set<ServiceWorker>();
|
|
55
|
+
const workerStateListeners = new Map<ServiceWorker, () => void>();
|
|
56
|
+
let registrationListener:
|
|
57
|
+
| {
|
|
58
|
+
registration: ServiceWorkerRegistration;
|
|
59
|
+
onUpdateFound: () => void;
|
|
60
|
+
}
|
|
61
|
+
| undefined;
|
|
62
|
+
|
|
63
|
+
const busy = () => isBusyRef.current || probeUnsentTextRef.current();
|
|
64
|
+
const doReload = () => {
|
|
65
|
+
if (refreshingRef.current || disposed) return;
|
|
66
|
+
refreshingRef.current = true;
|
|
67
|
+
(reloadRef.current ?? (() => window.location.reload()))();
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// A reload never fires while busy. If takeover happens mid-work, latch it
|
|
71
|
+
// and fire on the transition back to idle instead.
|
|
72
|
+
const reloadWhenIdle = () => {
|
|
73
|
+
if (refreshingRef.current || disposed) return;
|
|
74
|
+
if (busy()) {
|
|
75
|
+
reloadPendingRef.current = true;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
reloadPendingRef.current = false;
|
|
79
|
+
doReload();
|
|
80
|
+
};
|
|
81
|
+
tryReloadRef.current = () => {
|
|
82
|
+
if (reloadPendingRef.current) reloadWhenIdle();
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const onControllerChange = () => {
|
|
86
|
+
// A first install never reloads. Only a worker observed installing over
|
|
87
|
+
// an existing controller arms the update-takeover reload.
|
|
88
|
+
if (!updateReadyRef.current) return;
|
|
89
|
+
reloadWhenIdle();
|
|
90
|
+
};
|
|
91
|
+
serviceWorker.addEventListener("controllerchange", onControllerChange);
|
|
92
|
+
|
|
93
|
+
// DOM drafts are component-local rather than store-backed. An input event
|
|
94
|
+
// supplies their transition-to-idle signal while a reload is pending.
|
|
95
|
+
const onInput = () => tryReloadRef.current();
|
|
96
|
+
document.addEventListener("input", onInput);
|
|
97
|
+
|
|
98
|
+
const trackInstalling = (worker: ServiceWorker | null) => {
|
|
99
|
+
if (!worker || trackedWorkers.has(worker)) return;
|
|
100
|
+
trackedWorkers.add(worker);
|
|
101
|
+
const onStateChange = () => {
|
|
102
|
+
if (worker.state === "installed" && serviceWorker.controller) {
|
|
103
|
+
updateReadyRef.current = true;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
worker.addEventListener("statechange", onStateChange);
|
|
107
|
+
workerStateListeners.set(worker, onStateChange);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
serviceWorker
|
|
111
|
+
.register("/service-worker.js")
|
|
112
|
+
.then((registration) => {
|
|
113
|
+
if (disposed) return;
|
|
114
|
+
trackInstalling(registration.installing);
|
|
115
|
+
const onUpdateFound = () => trackInstalling(registration.installing);
|
|
116
|
+
registration.addEventListener("updatefound", onUpdateFound);
|
|
117
|
+
registrationListener = { registration, onUpdateFound };
|
|
118
|
+
})
|
|
119
|
+
.catch((error) => {
|
|
120
|
+
if (!disposed) console.error("[sw] Registration failed:", error);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return () => {
|
|
124
|
+
disposed = true;
|
|
125
|
+
serviceWorker.removeEventListener("controllerchange", onControllerChange);
|
|
126
|
+
document.removeEventListener("input", onInput);
|
|
127
|
+
if (registrationListener) {
|
|
128
|
+
registrationListener.registration.removeEventListener(
|
|
129
|
+
"updatefound",
|
|
130
|
+
registrationListener.onUpdateFound
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
for (const [worker, listener] of workerStateListeners) {
|
|
134
|
+
worker.removeEventListener("statechange", listener);
|
|
135
|
+
}
|
|
136
|
+
tryReloadRef.current = () => {};
|
|
137
|
+
};
|
|
138
|
+
}, [enabled]);
|
|
139
|
+
|
|
140
|
+
// Store-driven state changes rerender the caller. This is the normal idle
|
|
141
|
+
// transition; the input listener above covers the DOM-only equivalent.
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
tryReloadRef.current();
|
|
144
|
+
}, [isBusy, probeUnsentText]);
|
|
145
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -56,6 +56,12 @@ export { ShareHarness } from "./components/dev/share-harness.js";
|
|
|
56
56
|
|
|
57
57
|
// Connectivity probes.
|
|
58
58
|
export { useVpnStatus } from "./hooks/use-vpn-status.js";
|
|
59
|
+
export { useHashRoutes } from "./hooks/use-hash-routes.js";
|
|
60
|
+
export {
|
|
61
|
+
useServiceWorkerUpdates,
|
|
62
|
+
hasUnsentText,
|
|
63
|
+
type UseServiceWorkerUpdatesOptions,
|
|
64
|
+
} from "./hooks/use-service-worker-updates.js";
|
|
59
65
|
export {
|
|
60
66
|
useWebSocket,
|
|
61
67
|
sendClientMessage,
|
|
@@ -9,9 +9,6 @@ import type { PronunciationOverride } from "@schlessera/brain-ui-sdk/protocol";
|
|
|
9
9
|
import { api } from "../lib/api-client.js";
|
|
10
10
|
import { registerAsrClients } from "./asr-clients.js";
|
|
11
11
|
|
|
12
|
-
// Register the built-in ASR clients once at module load.
|
|
13
|
-
registerAsrClients();
|
|
14
|
-
|
|
15
12
|
/** Apply pronunciation overrides client-side to a finalized transcript. */
|
|
16
13
|
function applyOverrides(
|
|
17
14
|
text: string,
|
|
@@ -28,6 +25,9 @@ function applyOverrides(
|
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
export function useDictation() {
|
|
28
|
+
// start() may resolve a client before this hook's effects have run.
|
|
29
|
+
registerAsrClients();
|
|
30
|
+
|
|
31
31
|
const clientRef = useRef<AsrClient | null>(null);
|
|
32
32
|
const overridesRef = useRef<PronunciationOverride[]>([]);
|
|
33
33
|
// Bumped on every start() and on every stop/cancel/unmount. A start that
|