From 9a71195d62f186484fdf050378e9ae3a00161eb9 Mon Sep 17 00:00:00 2001 From: Ein Anderssono Date: Mon, 19 Oct 2026 12:03:41 +0200 Subject: [PATCH] Fix local AI checks and consent caching --- client/local-ai.js | 9 ++++++--- scripts/build-assets.mjs | 2 +- tests/local-ai.test.cjs | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/client/local-ai.js b/client/local-ai.js index ed2667b..541baa4 100644 --- a/client/local-ai.js +++ b/client/local-ai.js @@ -187,12 +187,15 @@ } localStorage.setItem(acceptanceKey(manifest), manifest.license.acceptance_id); enabled = true; localStorage.setItem('ai-spel-local-ai-enabled', 'true'); + if (!('indexedDB' in global)) return 'Ditt godkännande sparades. Webbläsaren saknar lokal lagring som krävs för Gemma, men spelet fungerar utan lokal AI.'; announce('Godkännandet sparades för det här kontot och den här versionen av villkoren. Hämtar nu modellen från static-servern.'); - try { await engine(); return 'Tack. Godkännandet sparades på den här enheten och modellen hämtas nu från static-servern.'; } - catch (_) { return 'Godkännandet sparades. Modellen kunde inte starta just nu; spelet fungerar fortfarande utan lokal AI.'; } + engine().catch(() => {}); + return 'Tack. Godkännandet sparades på den här enheten och modellen hämtas nu från static-servern.'; } if (normalized === 'lokal ai avvisa villkor') { - const manifest = await getManifest(); + let manifest; + try { manifest = await getManifest(); } + catch (_) { enabled = false; localStorage.setItem('ai-spel-local-ai-enabled', 'false'); return 'Static-servern kunde inte läsa villkorsversionen. Ingen Gemma-modell startas; spelet fungerar utan lokal AI.'; } localStorage.removeItem(acceptanceKey(manifest)); enabled = false; localStorage.setItem('ai-spel-local-ai-enabled', 'false'); downloadAbort?.abort(); loadedEngine?.instance.exit?.(); loadedEngine = undefined; diff --git a/scripts/build-assets.mjs b/scripts/build-assets.mjs index 8122f05..78e3f4d 100644 --- a/scripts/build-assets.mjs +++ b/scripts/build-assets.mjs @@ -130,7 +130,7 @@ for (const file of voiceFiles) { const downloaded = join(output, 'voices', file.path); if ((await stat(downloaded)).size !== file.size) throw new Error(`Missing verified voice file: ${file.path}`); } -console.log(`Static Piper assets prepared at ${output}`); +console.log(`Static voice and local AI assets prepared at ${output}`); async function downloadVerified(url, destination, expectedSize, expectedSha256) { await mkdir(join(destination, '..'), {recursive: true}); diff --git a/tests/local-ai.test.cjs b/tests/local-ai.test.cjs index 77f5818..13f5337 100644 --- a/tests/local-ai.test.cjs +++ b/tests/local-ai.test.cjs @@ -16,7 +16,7 @@ test('local assistance includes preflight, bounded continuity, and unsaved offli assert.match(source, /async function assist\(/); assert.match(source, /async function offline\(/); assert.match(source, /slice\(-12\)/); - assert.match(source, /Lokalt, osparat förslag/); + assert.match(source, /Jag kan inte skapa ett lokalt förslag/); }); test('local diagnostics are opt-in, stored in IndexedDB, exportable, and deletable', () => {