@@ -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+
1020export 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