diff --git a/ui/index.html b/ui/index.html
index 28c2bbd..cc2c2f8 100644
--- a/ui/index.html
+++ b/ui/index.html
@@ -143,6 +143,34 @@
var r = e && e.reason;
logErr('unhandledrejection', r && (r.stack || r.message) ? r.stack || r.message : String(r));
});
+ // Mirror console.error / console.warn into the panel. The app catches its boot failures and
+ // surfaces them only as a toast (they never reach window.onerror); a temporary console.error
+ // at the app's handleError routes the real cause here, so the panel shows what actually threw.
+ function fmt(a) {
+ if (a && (a.stack || a.message)) return a.stack || a.message;
+ if (typeof a === 'object') {
+ try {
+ return JSON.stringify(a);
+ } catch (e) {
+ return String(a);
+ }
+ }
+ return String(a);
+ }
+ function wrapConsole(orig, label) {
+ return function () {
+ try {
+ var parts = [];
+ for (var i = 0; i < arguments.length; i++) parts.push(fmt(arguments[i]));
+ logErr('console.' + label, parts.join(' '));
+ } catch (e) {}
+ if (orig) return orig.apply(console, arguments);
+ };
+ }
+ if (window.console) {
+ console.error = wrapConsole(console.error, 'error');
+ console.warn = wrapConsole(console.warn, 'warn');
+ }
// ---- environment -----------------------------------------------------------------------
var ua = nav.userAgent || '(no userAgent)';
diff --git a/ui/src/lib/app.svelte.ts b/ui/src/lib/app.svelte.ts
index 07be39e..8e86829 100644
--- a/ui/src/lib/app.svelte.ts
+++ b/ui/src/lib/app.svelte.ts
@@ -283,6 +283,12 @@ export function markChatRead(gameId: string): void {
* failure — or anything raised while the app is mid-reconnect — is shown by the "Connecting…"
* header indicator (and auto-retried), never a red toast. */
export function handleError(err: unknown): void {
+ // TEMP (boot diagnostic): the toast is generic, so route the real caught error to the on-device
+ // BOOT-DIAG panel via console (it mirrors console.error). Mode-gated to keep it out of the mock
+ // e2e. Revert together with the index.html BOOT-DIAG block.
+ if (import.meta.env.MODE !== 'mock') {
+ console.error('[diag] handleError:', err instanceof Error ? err.stack || err.message : err);
+ }
const code = err instanceof GatewayError ? err.code : '';
if (code === 'session_invalid' || code === 'unauthenticated') {
void logout();