char-slop/berry
multipurpose self-modifiable agentic harness
git clone https://git.t4t.associates/char-slop/berry
aa0b468
main
1import { assert , assertEquals } from "@std/assert" ; 2import { subscriptionUsage , usageWindows } from "./usage.ts" ; 3 4const token = ( account :string ) => 5`header. ${ 6btoa ( JSON . stringify ({ 7"https://api.openai.com/auth" : { chatgpt_account_id : account }, 8})) 9} .signature` ; 10const oauth = ( apiKey = "secret" ) => ({ source :"OAuth" , auth :{ apiKey} }); 11const claude = { five_hour :{ utilization :42 , resets_at :"2026-04-01T12:00:00Z" } }; 12 13Deno . test ( "subscription windows preserve zero usage, scoped limits, and unknown reset times" , () => { 14assertEquals ( 15usageWindows ( "anthropic" , { 16five_hour :{ utilization :0 , resets_at :null }, 17seven_day :{ utilization :73.4 , resets_at :"2026-04-02T00:00:00+00:00" }, 18seven_day_opus :null , 19seven_day_sonnet :{ utilization :"42" , resets_at :"bad" }, 20limits :[ 21{ percent :12 , resets_at :"bad" , scope :{ model :{ display_name :"Fable" } } }, 22{ percent :90 , is_active :false , scope :{ model :{ display_name :"Inactive" } } }, 23null , 24], 25}), 26[ 27{ label :"5 hours" , usedPercent :0 , resetsAt :null }, 28{ label :"Weekly" , usedPercent :73.4 , resetsAt :"2026-04-02T00:00:00.000Z" }, 29{ label :"Weekly · Fable" , usedPercent :12 , resetsAt :null }, 30], 31); 32assertEquals ( 33usageWindows ( "openai-codex" , { 34rate_limit :{ 35primary_window :{ used_percent :90 , reset_at :1775044800 , limit_window_seconds :18000 }, 36secondary_window :{ used_percent :0 , reset_at :null , limit_window_seconds :604800 }, 37}, 38additional_rate_limits :[ 39{ limit_name :"Spark" , rate_limit :{ primary_window :{ used_percent :15 } } }, 40{ limit_name :"Invalid" , rate_limit :{ primary_window :{ used_percent :- 1 } } }, 41null , 42], 43}), 44[ 45{ label :"5 hours" , usedPercent :90 , resetsAt :"2026-04-01T12:00:00.000Z" }, 46{ label :"7 days" , usedPercent :0 , resetsAt :null }, 47{ label :"Spark · Session" , usedPercent :15 , resetsAt :null }, 48], 49); 50for ( const invalid of [ null , [], 42 , {}, { rate_limit :"bad" }]) { 51assertEquals ( usageWindows ( "openai" , invalid ), []); 52} 53}); 54 55Deno . test ( "usage requests are coalesced, cached, and authenticated only at the provider endpoint" , async () => { 56let now = 1775044800000 ; 57let requests = 0 ; 58const gate = Promise . withResolvers < void >(); 59const usage = subscriptionUsage ({ 60now :() => now , 61auth :() => Promise . resolve ( oauth ()), 62fetch :async ( url , init ) => { 63requests ++ ; 64assertEquals ( url , "https://api.anthropic.com/api/oauth/usage" ); 65const headers = new Headers ( init ?. headers ); 66assertEquals ( headers . get ( "authorization" ), "Bearer secret" ); 67assertEquals ( headers . get ( "anthropic-beta" ), "oauth-2025-04-20" ); 68assertEquals ( init ?. redirect , "error" ); 69assert ( init ?. signal ); 70await gate . promise ; 71return Response . json ({ ...claude , account_id :"private" , other_secret :"private" }); 72}, 73}); 74const first = usage ( "anthropic" ); 75const second = usage ( "anthropic" ); 76assertEquals ( first , second ); 77gate . resolve (); 78const result = await first ; 79assertEquals ( result , { 80status :"ok" , 81fetchedAt :"2026-04-01T12:00:00.000Z" , 82windows :[{ label :"5 hours" , usedPercent :42 , resetsAt :"2026-04-01T12:00:00.000Z" }], 83}); 84assertEquals ( await usage ( "anthropic" ), result ); 85assertEquals ( requests , 1 ); 86now += 61_000 ; 87await usage ( "anthropic" ); 88assertEquals ( requests , 2 ); 89}); 90 91Deno . test ( "ChatGPT OAuth and legacy Codex send the selected account and invalidate cache after login changes" , async () => { 92let account = "account-one" ; 93const accounts :string [] = []; 94const usage = subscriptionUsage ({ 95auth :() => Promise . resolve ( oauth ( token ( account ))), 96fetch :( url , init ) => { 97assertEquals ( url , "https://chatgpt.com/backend-api/wham/usage" ); 98const headers = new Headers ( init ?. headers ); 99accounts . push ( headers . get ( "ChatGPT-Account-Id" ) ! ); 100assertEquals ( headers . get ( "authorization" ), `Bearer ${ token ( account )} ` ); 101return Promise . resolve ( 102Response . json ({ rate_limit :{ primary_window :{ used_percent :5 } } }), 103); 104}, 105}); 106await usage ( "openai" ); 107await usage ( "openai-codex" ); 108await usage ( "openai" ); 109account = "account-two" ; 110await usage ( "openai" ); 111assertEquals ( accounts , [ "account-one" , "account-one" , "account-two" ]); 112}); 113 114Deno . test ( "OpenCode Go API keys load all allowance windows and are isolated from OAuth providers" , async () => { 115const now = Date . parse ( "2026-04-01T12:00:00Z" ); 116let key :string | undefined = "go-key" ; 117const keys :string [] = []; 118const usage = subscriptionUsage ({ 119now :() => now , 120auth :( provider ) => { 121assertEquals ( provider , "opencode-go" ); 122return Promise . resolve ( 123key ?{ source :"stored credential" , auth :{ apiKey :key } } :undefined , 124); 125}, 126fetch :( url , init ) => { 127assertEquals ( url , "https://opencode.ai/inference/go/v1/usage" ); 128const headers = new Headers ( init ?. headers ); 129keys . push ( headers . get ( "authorization" ) ! ); 130assertEquals ( headers . get ( "ChatGPT-Account-Id" ), null ); 131assertEquals ( headers . get ( "anthropic-beta" ), null ); 132assertEquals ( init ?. redirect , "error" ); 133return Promise . resolve ( Response . json ({ 134usage :{ 135rolling :{ status :"ok" , percent :0 , resetsAt :"2026-04-01T17:00:00Z" }, 136weekly :{ status :"ok" , percent :25.5 , resetsAt :"2026-04-08T12:00:00Z" }, 137monthly :{ status :"rate-limited" , percent :100 , resetsAt :"2026-05-01T12:00:00Z" }, 138}, 139})); 140}, 141}); 142const result = await usage ( "opencode-go" ); 143assertEquals ( result , { 144status :"ok" , 145fetchedAt :"2026-04-01T12:00:00.000Z" , 146windows :[ 147{ label :"5 hours" , usedPercent :0 , resetsAt :"2026-04-01T17:00:00.000Z" }, 148{ label :"Weekly" , usedPercent :25.5 , resetsAt :"2026-04-08T12:00:00.000Z" }, 149{ label :"Monthly" , usedPercent :100 , resetsAt :"2026-05-01T12:00:00.000Z" }, 150], 151}); 152assertEquals ( await usage ( "opencode-go" ), result ); 153key = "replacement-key" ; 154await usage ( "opencode-go" ); 155key = undefined ; 156assertEquals (( await usage ( "opencode-go" )). status , "unavailable" ); 157assertEquals ( keys , [ "Bearer go-key" , "Bearer replacement-key" ]); 158}); 159 160Deno . test ( "Go preserves legacy relative resets and skips malformed windows without losing valid ones" , () => { 161assertEquals ( 162usageWindows ( "opencode-go" , { 163rollingUsage :{ usagePercent :12 , resetInSec :1800 }, 164weeklyUsage :{ usagePercent :30 , resetInSec :null }, 165monthlyUsage :{ usagePercent :"wrong" , resetInSec :100 }, 166}, Date . parse ( "2026-04-01T12:00:00Z" )), 167[ 168{ label :"5 hours" , usedPercent :12 , resetsAt :"2026-04-01T12:30:00.000Z" }, 169{ label :"Weekly" , usedPercent :30 , resetsAt :null }, 170], 171); 172assertEquals ( 173usageWindows ( "opencode-go" , { 174usage :{ 175rolling :{ percent :- 1 , resetsAt :null }, 176weekly :{ percent :20 , resetsAt :"bad" }, 177monthly :null , 178}, 179}), 180[{ label :"Weekly" , usedPercent :20 , resetsAt :null }], 181); 182}); 183 184Deno . test ( "Claude API keys and missing logins never go to the subscription endpoint" , async () => { 185for ( 186const resolved of [ undefined , { source :"stored credential" , auth :{ apiKey :"api-key" } }] 187) { 188const usage = subscriptionUsage ({ 189auth :() => Promise . resolve ( resolved ), 190fetch :() => { 191throw new Error ( "must not request usage" ); 192}, 193}); 194assertEquals (( await usage ( "anthropic" )). status , "unavailable" ); 195} 196}); 197 198Deno . test ( "rate limits honor Retry-After and provider errors never expose response bodies or tokens" , async () => { 199let now = 1775044800000 ; 200let requests = 0 ; 201const usage = subscriptionUsage ({ 202now :() => now , 203auth :() => Promise . resolve ( oauth ()), 204fetch :() => { 205requests ++ ; 206return Promise . resolve ( 207new Response ( "secret upstream body" , { 208status :429 , 209headers :{ "retry-after" :"600" }, 210}), 211); 212}, 213}); 214const result = await usage ( "anthropic" ); 215assertEquals ( result . status , "error" ); 216assert ( ! JSON . stringify ( result ). includes ( "secret" )); 217now += 301_000 ; 218await usage ( "anthropic" ); 219assertEquals ( requests , 1 ); 220now += 300_000 ; 221await usage ( "anthropic" ); 222assertEquals ( requests , 2 ); 223const failed = subscriptionUsage ({ 224auth :() => Promise . resolve ( oauth ()), 225fetch :() => Promise . resolve ( new Response ( "secret" , { status :500 })), 226}); 227const error = await failed ( "anthropic" ); 228assertEquals ( error . status , "error" ); 229assert ( ! JSON . stringify ( error ). includes ( "secret" )); 230const refreshFailure = subscriptionUsage ({ 231auth :() => Promise . reject ( new Error ( "secret refresh error" )), 232}); 233assert ( ! JSON . stringify ( await refreshFailure ( "anthropic" )). includes ( "secret" )); 234}); 235 236Deno . test ( "malformed account tokens, usage JSON, and reset dates fail without losing valid windows" , async () => { 237for ( const apiKey of [ "not-a-jwt" , `header. ${ btoa ( "{}" )} .signature` ]) { 238let requested = false ; 239const usage = subscriptionUsage ({ 240auth :() => Promise . resolve ( oauth ( apiKey )), 241fetch :() => { 242requested = true ; 243return Promise . resolve ( Response . json ({})); 244}, 245}); 246assertEquals (( await usage ( "openai" )). status , "error" ); 247assertEquals ( requested , false ); 248} 249const malformed = subscriptionUsage ({ 250auth :() => Promise . resolve ( oauth ()), 251fetch :() => Promise . resolve ( new Response ( "not json" )), 252}); 253assertEquals (( await malformed ( "anthropic" )). status , "error" ); 254assertEquals ( 255usageWindows ( "openai" , { 256rate_limit :{ primary_window :{ used_percent :10 , reset_at :1e50 } }, 257}), 258[{ label :"Session" , usedPercent :10 , resetsAt :null }], 259); 260});