@schlessera/brain-ui-react 0.32.0 → 0.33.1

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
@@ -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
- <ChatPage />
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;AA6BzE,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,sCAkDA"}
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,6 @@
1
+ /**
2
+ * Synchronize the shell's file and full-screen view routes with ui-react's
3
+ * stores.
4
+ */
5
+ export declare function useHashRoutes(): void;
6
+ //# sourceMappingURL=use-hash-routes.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;IACzE,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,IAAK,OAA4B,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAaD,+EAA+E;AAC/E,MAAM,UAAU,uBAAuB,CAAC,EACtC,MAAM,EACN,aAAa,EAAE,eAAe,GAAG,aAAa,EAC9C,OAAO,GAAG,IAAI,EACd,MAAM,GACyB;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,MAAM,CAAa,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAElD,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;IAC7C,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACb,IACE,CAAC,OAAO;YACR,OAAO,SAAS,KAAK,WAAW;YAChC,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,EAC/B,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;QAC9C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;QAChD,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAA6B,CAAC;QAClE,IAAI,oBAKS,CAAC;QAEd,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,aAAa,CAAC,OAAO,IAAI,QAAQ;gBAAE,OAAO;YAC9C,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5D,CAAC,CAAC;QAEF,0EAA0E;QAC1E,mDAAmD;QACnD,MAAM,cAAc,GAAG,GAAG,EAAE;YAC1B,IAAI,aAAa,CAAC,OAAO,IAAI,QAAQ;gBAAE,OAAO;YAC9C,IAAI,IAAI,EAAE,EAAE,CAAC;gBACX,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;YACjC,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QACF,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;YAC1B,IAAI,gBAAgB,CAAC,OAAO;gBAAE,cAAc,EAAE,CAAC;QACjD,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;YAC9B,wEAAwE;YACxE,0DAA0D;YAC1D,IAAI,CAAC,cAAc,CAAC,OAAO;gBAAE,OAAO;YACpC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;QAEvE,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,CAAC,MAA4B,EAAE,EAAE;YACvD,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,OAAO;YAClD,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;oBAC7D,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YACtD,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,aAAa;aACV,QAAQ,CAAC,oBAAoB,CAAC;aAC9B,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;YACrB,IAAI,QAAQ;gBAAE,OAAO;YACrB,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACrE,YAAY,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC5D,oBAAoB,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QACzD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,CAAC,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YAC1E,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,oBAAoB,EAAE,CAAC;gBACzB,oBAAoB,CAAC,YAAY,CAAC,mBAAmB,CACnD,aAAa,EACb,oBAAoB,CAAC,aAAa,CACnC,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC;gBACtD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACtD,CAAC;YACD,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,0EAA0E;IAC1E,uEAAuE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAChC,CAAC"}
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";
@@ -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":"AA6BA,wBAAgB,YAAY;;;;EA6J3B"}
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":"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"}
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.32.0",
3
+ "version": "0.33.1",
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.32.0",
49
+ "@schlessera/brain-ui-sdk": "0.33.1",
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