Skip to content

Commit 8dc978f

Browse files
fix: prompt download when maia3 cache is missing
1 parent 5c85e46 commit 8dc978f

2 files changed

Lines changed: 33 additions & 30 deletions

File tree

public/maia-worker.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ const DB_NAME = 'MaiaModels'
2424
const STORE_NAME = 'models'
2525
const MODEL_KEY = 'maia-rapid-model'
2626

27+
function isCompatibleModelCache(data, expectedUrl, expectedVersion) {
28+
return data.url === expectedUrl && data.version === expectedVersion
29+
}
30+
2731
function openDB() {
2832
return new Promise((resolve, reject) => {
2933
const request = indexedDB.open(DB_NAME, 1)
@@ -51,7 +55,7 @@ async function getCachedModel(modelUrl, modelVersion) {
5155

5256
if (!data) return null
5357

54-
if (data.version && data.version !== modelVersion) {
58+
if (!isCompatibleModelCache(data, modelUrl, modelVersion)) {
5559
const rwTx = db.transaction([STORE_NAME], 'readwrite')
5660
rwTx.objectStore(STORE_NAME).delete(MODEL_KEY)
5761
return null

src/lib/engine/storage.ts

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ interface ModelStorage {
77
size: number
88
}
99

10+
const MODEL_STORAGE_KEY = 'maia-rapid-model'
11+
12+
function isCompatibleModelCache(
13+
modelData: ModelStorage,
14+
modelUrl: string,
15+
modelVersion: string,
16+
): boolean {
17+
return modelData.version === modelVersion && modelData.url === modelUrl
18+
}
19+
1020
export class MaiaModelStorage {
1121
private dbName = 'MaiaModels'
1222
private storeName = 'models'
@@ -46,7 +56,7 @@ export class MaiaModelStorage {
4656
const store = transaction.objectStore(this.storeName)
4757

4858
const modelData: ModelStorage = {
49-
id: 'maia-rapid-model',
59+
id: MODEL_STORAGE_KEY,
5060
url: modelUrl,
5161
version: modelVersion,
5262
data: new Blob([buffer]),
@@ -82,7 +92,7 @@ export class MaiaModelStorage {
8292
console.log('Storage: Requesting model data...')
8393
const modelData = await new Promise<ModelStorage | null>(
8494
(resolve, reject) => {
85-
const request = store.get('maia-rapid-model')
95+
const request = store.get(MODEL_STORAGE_KEY)
8696
request.onsuccess = () => {
8797
console.log(
8898
'Storage: IndexedDB request successful, result:',
@@ -104,36 +114,25 @@ export class MaiaModelStorage {
104114
return null
105115
}
106116

107-
// Version mismatch = genuinely new model, must re-download.
108-
if (modelData.version && modelData.version !== modelVersion) {
109-
console.log('Storage: Model version changed, clearing old cache')
110-
console.log('Storage: Cached version:', modelData.version)
117+
// Maia cache records must match both the expected model version and URL.
118+
// Legacy Maia-2 downloads may not include a version field; treating those
119+
// as incompatible forces the download modal to appear instead of leaving
120+
// analysis in a broken "loaded old model" state.
121+
if (!isCompatibleModelCache(modelData, modelUrl, modelVersion)) {
122+
console.log(
123+
'Storage: Cached Maia model is incompatible, clearing old cache',
124+
)
125+
console.log('Storage: Cached URL:', modelData.url || '(missing)')
126+
console.log(
127+
'Storage: Cached version:',
128+
modelData.version || '(missing)',
129+
)
130+
console.log('Storage: Required URL:', modelUrl)
111131
console.log('Storage: Required version:', modelVersion)
112132
await this.deleteModel()
113133
return null
114134
}
115135

116-
// URL changed but same version (e.g. moved hosts) — keep the cache,
117-
// just update the stored URL so future loads match immediately.
118-
if (modelData.url !== modelUrl || modelData.version !== modelVersion) {
119-
console.log('Storage: Updating stored URL/version')
120-
try {
121-
const rwTx = db.transaction([this.storeName], 'readwrite')
122-
const rwStore = rwTx.objectStore(this.storeName)
123-
await new Promise<void>((resolve, reject) => {
124-
const req = rwStore.put({
125-
...modelData,
126-
url: modelUrl,
127-
version: modelVersion,
128-
})
129-
req.onsuccess = () => resolve()
130-
req.onerror = () => reject(req.error)
131-
})
132-
} catch (e) {
133-
console.warn('Storage: Failed to update stored URL/version:', e)
134-
}
135-
}
136-
137136
console.log('Storage: Converting Blob to ArrayBuffer...')
138137
// Convert Blob back to ArrayBuffer
139138
const buffer = await modelData.data.arrayBuffer()
@@ -156,7 +155,7 @@ export class MaiaModelStorage {
156155
const store = transaction.objectStore(this.storeName)
157156

158157
await new Promise<void>((resolve, reject) => {
159-
const request = store.delete('maia-rapid-model')
158+
const request = store.delete(MODEL_STORAGE_KEY)
160159
request.onsuccess = () => resolve()
161160
request.onerror = () => reject(request.error)
162161
})
@@ -193,7 +192,7 @@ export class MaiaModelStorage {
193192

194193
const modelData = await new Promise<ModelStorage | null>(
195194
(resolve, reject) => {
196-
const request = store.get('maia-rapid-model')
195+
const request = store.get(MODEL_STORAGE_KEY)
197196
request.onsuccess = () => resolve(request.result || null)
198197
request.onerror = () => reject(request.error)
199198
},

0 commit comments

Comments
 (0)