@@ -242,6 +242,7 @@ export interface OpenPgliteAgentDatabaseOptions {
242242 detectBillingMode : ( harness : string ) => string ;
243243 emit ?: ( sessionId : string ) => void ;
244244 extractTranscript ?: ( path : string ) => TranscriptExtract | null ;
245+ getUserIdentity ?: ( ) => { userId : string | null ; organizationId : string | null } | null ;
245246 log ?: ( message : string ) => void ;
246247 now ?: ( ) => string ;
247248 staleMinutes ?: number ;
@@ -285,6 +286,7 @@ export async function openPgliteAgentDatabase(
285286 detectBillingMode : options . detectBillingMode ,
286287 emit : options . emit ,
287288 extractTranscript : options . extractTranscript ,
289+ getUserIdentity : options . getUserIdentity ,
288290 log,
289291 now : nowFn ,
290292 staleMinutes : options . staleMinutes ,
@@ -335,7 +337,7 @@ function createPgliteSessionStore(db: PgliteClient) {
335337 s.*,
336338 COALESCE(ac.agent_count, 0)::int as agent_count,
337339 COALESCE(ec.event_count, 0)::int as event_count,
338- COALESCE(tt.total_tokens, 0)::int as total_tokens
340+ COALESCE(tt.total_tokens, 0) as total_tokens
339341 FROM sessions s
340342 LEFT JOIN agent_counts ac ON ac.session_id = s.id
341343 LEFT JOIN event_counts ec ON ec.session_id = s.id
@@ -350,7 +352,7 @@ function createPgliteSessionStore(db: PgliteClient) {
350352 s.*,
351353 COALESCE(ac.agent_count, 0)::int as agent_count,
352354 COALESCE(ec.event_count, 0)::int as event_count,
353- COALESCE(tt.total_tokens, 0)::int as total_tokens
355+ COALESCE(tt.total_tokens, 0) as total_tokens
354356 FROM sessions s
355357 LEFT JOIN agent_counts ac ON ac.session_id = s.id
356358 LEFT JOIN event_counts ec ON ec.session_id = s.id
@@ -369,7 +371,7 @@ function createPgliteSessionStore(db: PgliteClient) {
369371 s.*,
370372 COALESCE(ac.agent_count, 0)::int as agent_count,
371373 COALESCE(ec.event_count, 0)::int as event_count,
372- COALESCE(tt.total_tokens, 0)::int as total_tokens
374+ COALESCE(tt.total_tokens, 0) as total_tokens
373375 FROM sessions s
374376 LEFT JOIN agent_counts ac ON ac.session_id = s.id
375377 LEFT JOIN event_counts ec ON ec.session_id = s.id
@@ -398,7 +400,7 @@ function createPgliteSessionStore(db: PgliteClient) {
398400 s.*,
399401 COALESCE(ac.agent_count, 0)::int as agent_count,
400402 COALESCE(ec.event_count, 0)::int as event_count,
401- COALESCE(tt.total_tokens, 0)::int as total_tokens
403+ COALESCE(tt.total_tokens, 0) as total_tokens
402404 FROM sessions s
403405 LEFT JOIN agent_counts ac ON ac.session_id = s.id
404406 LEFT JOIN event_counts ec ON ec.session_id = s.id
@@ -670,7 +672,7 @@ function createPgliteDashboardQueries(db: PgliteClient) {
670672 count ( db , "SELECT COUNT(*)::int as count FROM agents" ) ,
671673 count ( db , "SELECT COUNT(*)::int as count FROM events" ) ,
672674 count ( db , "SELECT COUNT(DISTINCT event_type)::int as count FROM events" ) ,
673- scalarNumber ( db , "SELECT COALESCE(SUM(input_tokens + output_tokens), 0)::int as total FROM token_usage" , "total" ) ,
675+ scalarNumber ( db , "SELECT COALESCE(SUM(input_tokens::bigint + output_tokens::bigint ), 0) as total FROM token_usage" , "total" ) ,
674676 db . query < {
675677 id : string ;
676678 name : string | null ;
@@ -704,10 +706,10 @@ function createPgliteDashboardQueries(db: PgliteClient) {
704706 total_cache_read : number ;
705707 total_cache_write : number ;
706708 } > ( `
707- SELECT COALESCE(SUM(input_tokens), 0)::int as total_input,
708- COALESCE(SUM(output_tokens), 0)::int as total_output,
709- COALESCE(SUM(cache_read_tokens), 0)::int as total_cache_read,
710- COALESCE(SUM(cache_write_tokens), 0)::int as total_cache_write
709+ SELECT COALESCE(SUM(input_tokens), 0) as total_input,
710+ COALESCE(SUM(output_tokens), 0) as total_output,
711+ COALESCE(SUM(cache_read_tokens), 0) as total_cache_read,
712+ COALESCE(SUM(cache_write_tokens), 0) as total_cache_write
711713 FROM token_usage
712714 ` ) ;
713715 const byModel = await db . query < {
@@ -717,22 +719,22 @@ function createPgliteDashboardQueries(db: PgliteClient) {
717719 sessions : number ;
718720 } > ( `
719721 SELECT model,
720- SUM(input_tokens)::int as input_tokens,
721- SUM(output_tokens)::int as output_tokens,
722+ SUM(input_tokens) as input_tokens,
723+ SUM(output_tokens) as output_tokens,
722724 COUNT(DISTINCT session_id)::int as sessions
723725 FROM token_usage
724726 WHERE model IS NOT NULL
725727 GROUP BY model
726- ORDER BY SUM(input_tokens + output_tokens) DESC
728+ ORDER BY SUM(input_tokens::bigint + output_tokens::bigint ) DESC
727729 ` ) ;
728730 const byDay = await db . query < {
729731 day : string ;
730732 input_tokens : number ;
731733 output_tokens : number ;
732734 } > ( `
733735 SELECT (created_at::timestamp::date)::text as day,
734- SUM(input_tokens)::int as input_tokens,
735- SUM(output_tokens)::int as output_tokens
736+ SUM(input_tokens) as input_tokens,
737+ SUM(output_tokens) as output_tokens
736738 FROM token_usage
737739 WHERE created_at IS NOT NULL
738740 GROUP BY created_at::timestamp::date
@@ -1159,6 +1161,7 @@ function createPgliteLifecycle(
11591161 detectBillingMode : ( harness : string ) => string ;
11601162 emit ?: ( sessionId : string ) => void ;
11611163 extractTranscript ?: ( path : string ) => TranscriptExtract | null ;
1164+ getUserIdentity ?: ( ) => { userId : string | null ; organizationId : string | null } | null ;
11621165 log : ( message : string ) => void ;
11631166 now : ( ) => string ;
11641167 staleMinutes ?: number ;
@@ -1195,6 +1198,7 @@ function createPgliteLifecycle(
11951198 tokenUsage,
11961199 transcript,
11971200 detectBillingMode : deps . detectBillingMode ,
1201+ getUserIdentity : deps . getUserIdentity ,
11981202 } ) ;
11991203 } ) ;
12001204 return true ;
@@ -1229,11 +1233,12 @@ async function handleHook(
12291233 tokenUsage : ReturnType < typeof createPgliteTokenUsageStore > ;
12301234 transcript : TranscriptExtract | null ;
12311235 detectBillingMode : ( harness : string ) => string ;
1236+ getUserIdentity ?: ( ) => { userId : string | null ; organizationId : string | null } | null ;
12321237 } ,
12331238) : Promise < void > {
12341239 const { data, hookType, harness, now, sessionId } = options ;
12351240 const main = mainAgentId ( sessionId ) ;
1236- await ensureSession ( tx , sessionId , data , harness , now , options . detectBillingMode ) ;
1241+ await ensureSession ( tx , sessionId , data , harness , now , options . detectBillingMode , options . getUserIdentity ) ;
12371242 const session = await getSession ( tx , sessionId ) ;
12381243 if ( ! session ) {
12391244 return ;
@@ -1571,6 +1576,8 @@ async function loadPgliteSyncedSessions(
15711576 metadata : string | null ;
15721577 harness : string | null ;
15731578 billing_mode : string | null ;
1579+ user_id : string | null ;
1580+ organization_id : string | null ;
15741581 } > (
15751582 db ,
15761583 `
@@ -1586,7 +1593,9 @@ async function loadPgliteSyncedSessions(
15861593 awaiting_input_since,
15871594 metadata,
15881595 harness,
1589- billing_mode
1596+ billing_mode,
1597+ user_id,
1598+ organization_id
15901599 FROM sessions
15911600 WHERE id IN (__IDS__)
15921601 ` ,
@@ -1721,6 +1730,8 @@ async function loadPgliteSyncedSessions(
17211730 endedAt : row . ended_at ,
17221731 awaitingInputSince : row . awaiting_input_since ,
17231732 metadata : parseJsonObjectText ( row . metadata ) ,
1733+ ...( row . user_id ? { userId : row . user_id } : { } ) ,
1734+ ...( row . organization_id ? { organizationId : row . organization_id } : { } ) ,
17241735 ...( attribution ? { attribution } : { } ) ,
17251736 agents : ( agentsBySessionId . get ( id ) ?? [ ] ) . map ( ( agentRow ) => ( {
17261737 externalAgentId : agentRow . id ,
@@ -1848,7 +1859,7 @@ function sessionDetailsCtes(): string {
18481859 token_totals AS (
18491860 SELECT
18501861 session_id,
1851- COALESCE(SUM(COALESCE(input_tokens, 0) + COALESCE(output_tokens, 0)), 0)::int as total_tokens
1862+ COALESCE(SUM(COALESCE(input_tokens, 0)::bigint + COALESCE(output_tokens, 0)::bigint ), 0) as total_tokens
18521863 FROM token_usage
18531864 GROUP BY session_id
18541865 )
@@ -1987,14 +1998,19 @@ async function ensureSession(
19871998 harness : string ,
19881999 now : string ,
19892000 detectBillingMode : ( harness : string ) => string ,
2001+ getUserIdentity ?: ( ) => { userId : string | null ; organizationId : string | null } | null ,
19902002) : Promise < void > {
19912003 if ( await getSession ( tx , sessionId ) ) {
19922004 return ;
19932005 }
19942006 const billingMode = safe ( ( ) => detectBillingMode ( harness ) ) ?? "unknown" ;
2007+ const identity = safe ( ( ) => getUserIdentity ?.( ) ) ?? null ;
19952008 await tx . query (
1996- `INSERT INTO sessions (id, name, status, cwd, model, started_at, updated_at, harness, billing_mode)
1997- VALUES ($1, $2, 'active', $3, $4, $5, $5, $6, $7)` ,
2009+ `INSERT INTO sessions (
2010+ id, name, status, cwd, model, started_at, updated_at, harness,
2011+ billing_mode, user_id, organization_id
2012+ )
2013+ VALUES ($1, $2, 'active', $3, $4, $5, $5, $6, $7, $8, $9)` ,
19982014 [
19992015 sessionId ,
20002016 data . session_name ?? null ,
@@ -2003,6 +2019,8 @@ async function ensureSession(
20032019 now ,
20042020 harness ,
20052021 billingMode ,
2022+ identity ?. userId ?? null ,
2023+ identity ?. organizationId ?? null ,
20062024 ] ,
20072025 ) ;
20082026 await tx . query (
0 commit comments