@@ -11,6 +11,7 @@ export interface UserRow {
1111 created_at : string ;
1212 last_seen_at : string | null ;
1313 is_admin : number ;
14+ fluency_score_json : string | null ;
1415}
1516
1617export interface UploadRow {
@@ -29,6 +30,7 @@ export interface UploadRow {
2930 interactions : number ;
3031 schema_version : number ;
3132 uploaded_at : string ;
33+ fluency_json : string | null ;
3234}
3335
3436export interface UploadEntry {
@@ -43,6 +45,7 @@ export interface UploadEntry {
4345 inputTokens : number ;
4446 outputTokens : number ;
4547 interactions : number ;
48+ fluencyMetrics ?: Record < string , unknown > ;
4649}
4750
4851let _db : DatabaseSync | undefined ;
@@ -79,6 +82,7 @@ const UPLOADS_TABLE_DDL = `
7982 interactions INTEGER NOT NULL DEFAULT 0,
8083 schema_version INTEGER NOT NULL DEFAULT 3,
8184 uploaded_at TEXT DEFAULT (datetime('now')),
85+ fluency_json TEXT,
8286 UNIQUE(user_id, dataset_id, day, model, workspace_id, machine_id, editor)
8387 )` ;
8488
@@ -147,6 +151,22 @@ function initSchema(db: DatabaseSync): void {
147151 CREATE INDEX IF NOT EXISTS idx_uploads_user_day ON usage_uploads(user_id, day);
148152 CREATE INDEX IF NOT EXISTS idx_uploads_dataset ON usage_uploads(dataset_id, day);
149153 ` ) ;
154+
155+ // Add fluency_json column if it doesn't exist (migration for existing DBs)
156+ const cols = db
157+ . prepare ( "PRAGMA table_info(usage_uploads)" )
158+ . all ( ) as unknown as Array < { name : string } > ;
159+ if ( ! cols . some ( c => c . name === 'fluency_json' ) ) {
160+ db . exec ( 'ALTER TABLE usage_uploads ADD COLUMN fluency_json TEXT' ) ;
161+ }
162+
163+ // Add fluency_score_json column to users if it doesn't exist (migration for existing DBs)
164+ const userCols = db
165+ . prepare ( "PRAGMA table_info(users)" )
166+ . all ( ) as unknown as Array < { name : string } > ;
167+ if ( ! userCols . some ( c => c . name === 'fluency_score_json' ) ) {
168+ db . exec ( 'ALTER TABLE users ADD COLUMN fluency_score_json TEXT' ) ;
169+ }
150170}
151171
152172export function upsertUser (
@@ -178,17 +198,19 @@ export function getUserByGithubId(githubId: number): UserRow | undefined {
178198
179199export function upsertUpload ( userId : number , entry : UploadEntry ) : void {
180200 const editor = ( ( entry . editor ?? '' ) . trim ( ) || 'VS Code' ) . slice ( 0 , 100 ) ;
201+ const fluencyJson = entry . fluencyMetrics ? JSON . stringify ( entry . fluencyMetrics ) : null ;
181202 getDb ( ) . prepare ( `
182203 INSERT INTO usage_uploads
183204 (user_id, dataset_id, day, model, workspace_id, workspace_name, machine_id, machine_name,
184- editor, input_tokens, output_tokens, interactions)
185- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
205+ editor, input_tokens, output_tokens, interactions, fluency_json )
206+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
186207 ON CONFLICT(user_id, dataset_id, day, model, workspace_id, machine_id, editor) DO UPDATE SET
187208 workspace_name = excluded.workspace_name,
188209 machine_name = excluded.machine_name,
189210 input_tokens = excluded.input_tokens,
190211 output_tokens = excluded.output_tokens,
191212 interactions = excluded.interactions,
213+ fluency_json = excluded.fluency_json,
192214 uploaded_at = datetime('now')
193215 ` ) . run (
194216 userId ,
@@ -203,6 +225,7 @@ export function upsertUpload(userId: number, entry: UploadEntry): void {
203225 entry . inputTokens ,
204226 entry . outputTokens ,
205227 entry . interactions ,
228+ fluencyJson ,
206229 ) ;
207230}
208231
@@ -233,3 +256,14 @@ export function getUploadsForUser(userId: number, days = 30): UploadRow[] {
233256export function getAllUsers ( ) : UserRow [ ] {
234257 return getDb ( ) . prepare ( 'SELECT * FROM users ORDER BY created_at DESC' ) . all ( ) as unknown as UserRow [ ] ;
235258}
259+
260+ export function upsertUserFluencyScore ( userId : number , scoreJson : string ) : void {
261+ getDb ( ) . prepare ( `
262+ UPDATE users SET fluency_score_json = ? WHERE id = ?
263+ ` ) . run ( scoreJson , userId ) ;
264+ }
265+
266+ export function getUserFluencyScore ( userId : number ) : string | null {
267+ const row = getDb ( ) . prepare ( 'SELECT fluency_score_json FROM users WHERE id = ?' ) . get ( userId ) as unknown as { fluency_score_json : string | null } | undefined ;
268+ return row ?. fluency_score_json ?? null ;
269+ }
0 commit comments