@@ -34,6 +34,7 @@ import { ProviderError } from "@/provider/error"
3434import { iife } from "@/util/iife"
3535import { errorMessage } from "@/util/error"
3636import { isMedia } from "@/util/media"
37+ import { isRecord } from "@/util/record"
3738import type { SystemError } from "bun"
3839import type { Provider } from "@/provider/provider"
3940import { Effect , Schema } from "effect"
@@ -89,13 +90,28 @@ export const cursor = {
8990 } ,
9091}
9192
92- const info = ( row : typeof MessageTable . $inferSelect ) => {
93- const data = row . data as typeof row . data & { agent ?: unknown ; mode ?: unknown }
93+ function infoModel ( input : unknown ) : User [ "model" ] | undefined {
94+ if ( ! isRecord ( input ) || typeof input . providerID !== "string" ) return
95+ const modelID = typeof input . modelID === "string" ? input . modelID : typeof input . id === "string" ? input . id : undefined
96+ if ( ! modelID ) return
97+ return {
98+ providerID : ProviderV2 . ID . make ( input . providerID ) ,
99+ modelID : ProviderV2 . ModelID . make ( modelID ) ,
100+ ...( typeof input . variant === "string" ? { variant : input . variant } : { } ) ,
101+ }
102+ }
103+
104+ const legacyModel = ( input : unknown , fallback ?: User [ "model" ] ) =>
105+ infoModel ( input ) ?? fallback ?? { providerID : ProviderV2 . ID . make ( "unknown" ) , modelID : ProviderV2 . ModelID . make ( "unknown" ) }
106+
107+ const info = ( row : typeof MessageTable . $inferSelect , fallbackModel ?: User [ "model" ] ) => {
108+ const data = row . data as typeof row . data & { agent ?: unknown ; mode ?: unknown ; model ?: unknown }
94109 return {
95110 ...row . data ,
96111 id : row . id ,
97112 sessionID : row . session_id ,
98113 ...( typeof data . agent === "string" ? { } : { agent : typeof data . mode === "string" ? data . mode : "build" } ) ,
114+ ...( data . role === "user" ? { model : legacyModel ( data . model , fallbackModel ) } : { } ) ,
99115 } as Info
100116}
101117
@@ -113,6 +129,20 @@ const older = (row: Cursor) =>
113129function hydrate ( db : Database . Interface [ "db" ] , rows : ( typeof MessageTable . $inferSelect ) [ ] ) {
114130 const ids = rows . map ( ( row ) => row . id )
115131 const partByMessage = new Map < string , Part [ ] > ( )
132+ const modelByParent = new Map < string , User [ "model" ] > ( )
133+ for ( const row of rows ) {
134+ const data = row . data as typeof row . data & {
135+ modelID ?: unknown
136+ parentID ?: unknown
137+ providerID ?: unknown
138+ variant ?: unknown
139+ }
140+ if ( data . role !== "assistant" || typeof data . parentID !== "string" ) continue
141+ modelByParent . set (
142+ data . parentID ,
143+ legacyModel ( { providerID : data . providerID , modelID : data . modelID , variant : data . variant } ) ,
144+ )
145+ }
116146 return Effect . gen ( function * ( ) {
117147 if ( ids . length > 0 ) {
118148 const partRows = yield * db
@@ -131,7 +161,7 @@ function hydrate(db: Database.Interface["db"], rows: (typeof MessageTable.$infer
131161 }
132162
133163 return rows . map ( ( row ) => ( {
134- info : info ( row ) ,
164+ info : info ( row , modelByParent . get ( row . id ) ) ,
135165 parts : partByMessage . get ( row . id ) ?? [ ] ,
136166 } ) )
137167 } )
0 commit comments