Add Gemma license gate and publish local model assets
Build and publish static assets / publish (push) Failing after 2s

This commit is contained in:
Ein Anderssono
2026-10-19 12:02:45 +02:00
parent 440652214c
commit 73c0c0b8ba
16 changed files with 699 additions and 7 deletions
+41
View File
@@ -0,0 +1,41 @@
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const test = require('node:test');
const source = fs.readFileSync(path.join(__dirname, '..', 'client', 'local-ai.js'), 'utf8');
test('local AI runtime rejects assets outside the same-origin static service', () => {
assert.match(source, /parsed\.origin !== location\.origin/);
assert.match(source, /parsed\.pathname\.startsWith\('\/static\/'\)/);
assert.match(source, /\/static\/wllama-gemma3-v1\//);
assert.doesNotMatch(source, /huggingface\.co|registry\.npmjs\.org/);
});
test('local assistance includes preflight, bounded continuity, and unsaved offline guidance', () => {
assert.match(source, /async function assist\(/);
assert.match(source, /async function offline\(/);
assert.match(source, /slice\(-12\)/);
assert.match(source, /Lokalt, osparat förslag/);
});
test('local diagnostics are opt-in, stored in IndexedDB, exportable, and deletable', () => {
assert.match(source, /ai-spel-local-ai-logs/);
assert.match(source, /indexedDB\.open/);
assert.match(source, /lokal ai exportera loggar/);
assert.match(source, /lokal ai radera loggar/);
assert.match(source, /30 \* 24 \* 60 \* 60 \* 1000/);
});
test('Gemma model use is blocked until per-account acceptance of the exact terms revision', () => {
assert.match(source, /async function start\(currentAccountId\)/);
assert.match(source, /localStorage\.getItem\(key\) !== manifest\.license\.acceptance_id/);
assert.match(source, /lokal ai godkänn villkor/);
assert.match(source, /lokal ai avvisa villkor/);
assert.match(source, /rättslig behörighet att ingå avtalet/);
assert.match(source, /termsPresentedForAccount !== accountId/);
assert.match(source, /localStorage\.setItem\(acceptanceKey\(manifest\), manifest\.license\.acceptance_id\)/);
assert.match(source, /async function assist\([\s\S]*?!await isAccepted\(\)/);
assert.match(source, /async function offline\([\s\S]*?!await isAccepted\(\)/);
assert.match(source, /function stop\(\)/);
});