opencode-navigator 0.27.3 → 0.27.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -134,7 +134,27 @@ return{...balance}})
134
134
  if(bankedResets&&(!Number.isSafeInteger(bankedResets.availableCount)||bankedResets.availableCount<0)){throw new Error("Invalid banked reset count")
135
135
  }
136
136
  return{...snapshot,windows,...balances&&{balances},...bankedResets&&{bankedResets:{availableCount:bankedResets.availableCount,...bankedResets.credits&&{credits:[...bankedResets.credits]}}}}}
137
- var CHATGPT_METHODS=new Set(["chatgpt-browser","chatgpt-headless"])
137
+ function remainingLabel(seconds){if(seconds===0)
138
+ return "Expired"
139
+ if(seconds<60)
140
+ return "Expires in less than a minute"
141
+ for(const [unit,duration] of [["day",86400],["hour",3600],["minute",60]]){if(seconds<duration)
142
+ continue
143
+ const count=Math.ceil(seconds / duration)
144
+ return `Expires in ${count} ${unit}${count === 1 ? "" : "s"}`
145
+ }
146
+ return "Expiry not supplied by the provider"
147
+ }
148
+ function resetCreditLifetime(credit,now){const expiry=credit.expiresAt
149
+ if(expiry===undefined)
150
+ return{label:"Expiry not supplied by the provider",remaining:undefined,expired:false}
151
+ if(!Number.isFinite(expiry)||expiry<=0||!Number.isFinite(new Date(expiry*1000).getTime()))
152
+ return{label:"Expiry date is invalid",remaining:undefined,expired:false}
153
+ const seconds=Math.max(0,expiry-now / 1000)
154
+ const lifetime=expiry-credit.grantedAt
155
+ const remaining=Number.isFinite(credit.grantedAt)&&credit.grantedAt>=0&&lifetime>0?Math.max(0,Math.min(1,seconds / lifetime)):undefined
156
+ return{label:remainingLabel(seconds),remaining,expired:seconds===0}}
157
+ var CHATGPT_METHODS=new Set(["chatgpt-browser","chatgpt-headless","chatgpt-token-sharing"])
138
158
  function providerAccountIdentity(provider,credentials){if(!provider.integrationID||provider.activation==="disabled")
139
159
  return{status:"unsupported"}
140
160
  const active=credentials.filter((entry)=>entry.integrationID===provider.integrationID&&entry.active)
@@ -438,13 +458,54 @@ input.api.ui.toast({variant:"warning",title:"Codex account",message:error instan
438
458
  }}
439
459
  return{link,busy
440
460
  }}
441
- import {effect as _$effect} from "@opentui/solid"
442
- import {insertNode as _$insertNode} from "@opentui/solid"
443
- import {insert as _$insert} from "@opentui/solid"
444
- import {setProp as _$setProp} from "@opentui/solid"
445
- import {createElement as _$createElement} from "@opentui/solid"
446
- import {createSignal as createSignal4} from "solid-js"
447
- import {subtleLineColor,useIcons} from "./tui.js"
461
+ import {effect as _$effect2} from "@opentui/solid"
462
+ import {insertNode as _$insertNode2} from "@opentui/solid"
463
+ import {insert as _$insert2} from "@opentui/solid"
464
+ import {createComponent as _$createComponent2} from "@opentui/solid"
465
+ import {memo as _$memo} from "@opentui/solid"
466
+ import {setProp as _$setProp2} from "@opentui/solid"
467
+ import {createElement as _$createElement2} from "@opentui/solid"
468
+ function duration(seconds){if(seconds<60)
469
+ return "<1m"
470
+ const minutes=Math.ceil(seconds / 60)
471
+ const days=Math.floor(minutes / 1440)
472
+ const hours=Math.floor(minutes%1440 / 60)
473
+ if(days)
474
+ return `${days}d ${hours}h`
475
+ if(hours)
476
+ return `${hours}h ${minutes % 60}m`
477
+ return `${minutes}m`
478
+ }
479
+ function quotaPeriod(window,now){const reset=window.resetsAt
480
+ const missing={ratio:undefined,seconds:undefined,active:false,countdown:"Reset time unknown",detail:"Period progress unknown"
481
+ }
482
+ if(reset===undefined)
483
+ return missing
484
+ if(!Number.isFinite(now)||!Number.isFinite(reset)||reset<=0||!Number.isFinite(new Date(reset*1000).getTime()))
485
+ return{...missing,countdown:"Reset date invalid"}
486
+ const seconds=reset-now / 1000
487
+ const countdown=seconds<=0?"Reset due; refresh to verify":`Reset in ${duration(seconds)}`
488
+ const dated={...missing,seconds,countdown}
489
+ const length=window.durationMinutes
490
+ if(length===undefined)
491
+ return{...dated,detail:"Period duration unknown"}
492
+ if(!Number.isFinite(length*60)||length<=0)
493
+ return{...dated,detail:"Period duration invalid"}
494
+ if(seconds>length*60)
495
+ return{...dated,detail:"Window has not started; progress unknown"}
496
+ const ratio=Math.max(0,Math.min(1,seconds / (length*60)))
497
+ return{...dated,ratio,active:seconds>0,detail:`${Math.round(ratio * 100)}%`}}
498
+ function quotaPace(quota,period){if(quota===undefined||!Number.isFinite(quota)||!period.active||period.ratio===undefined)
499
+ return "normal"
500
+ const deficit=Math.round((period.ratio-quota)*1e5) / 1000
501
+ if(deficit>=30)
502
+ return "red"
503
+ if(deficit>=15)
504
+ return "orange"
505
+ return deficit>0?"yellow":"normal"
506
+ }
507
+ var quotaPaceLabels={normal:"",yellow:"Above pace",orange:"High usage pace",red:"Critical usage pace"
508
+ };
448
509
  function measurement(window,remaining){if(remaining!==undefined)
449
510
  return `${remaining}${window.unit === "%" ? "" : " "}${window.unit} left`
450
511
  if(window.used!==undefined)
@@ -453,6 +514,8 @@ return `${window.total} ${window.unit} capacity`
453
514
  }
454
515
  function resetTime(seconds,now){if(seconds===undefined)
455
516
  return "Reset time unknown"
517
+ if(!Number.isFinite(seconds)||seconds<=0||!Number.isFinite(new Date(seconds*1000).getTime()))
518
+ return "Reset date invalid"
456
519
  const date=new Date(seconds*1000)
457
520
  const clock=date.toLocaleTimeString(undefined,{hour:"2-digit",minute:"2-digit"})
458
521
  if(date.toDateString()===new Date(now).toDateString())
@@ -462,36 +525,42 @@ return `Resets ${date.toLocaleDateString(undefined, { month: "short", day: "nume
462
525
  function quotaPresentation(window,now=Date.now()){const total=window.unit==="%"?100:window.total
463
526
  const remaining=window.remaining??(total!==undefined&&window.used!==undefined?total-window.used:undefined)
464
527
  const ratio=remaining!==undefined&&total!==undefined&&total>0?Math.max(0,Math.min(1,remaining / total)):undefined
465
- return{value:measurement(window,remaining),ratio,reset:resetTime(window.resetsAt,now)}}
466
- function QuotaWindowRow(props){const icons=useIcons()
528
+ const period=quotaPeriod(window,now)
529
+ const pace=quotaPace(ratio,period)
530
+ const reset=resetTime(window.resetsAt,now)
531
+ const resetSummary=period.seconds!==undefined&&period.seconds>0?`${period.countdown} \xB7 ${reset}`:period.countdown
532
+ return{value:measurement(window,remaining),ratio,reset,resetSummary,period,pace,paceLabel:quotaPaceLabels[pace]
533
+ }}
534
+ var quotaColors={blue:"#42a5f5",yellow:"#c4a000",orange:"#ef8b2c",red:"#ef5350"};
535
+ import {effect as _$effect} from "@opentui/solid"
536
+ import {insertNode as _$insertNode} from "@opentui/solid"
537
+ import {insert as _$insert} from "@opentui/solid"
538
+ import {setProp as _$setProp} from "@opentui/solid"
539
+ import {createElement as _$createElement} from "@opentui/solid"
540
+ import {createSignal as createSignal4} from "solid-js"
541
+ import {subtleLineColor,useIcons} from "./tui.js"
542
+ function QuotaMeter(props){const icons=useIcons()
467
543
  const [columns,setColumns]=createSignal4(0)
468
- const view=()=>quotaPresentation(props.window)
469
- const scale=()=>{const ratio=view().ratio
470
- if(ratio===undefined)
471
- return{filled:"Scale unknown",unfilled:""
544
+ const scale=()=>{if(props.ratio===undefined)
545
+ return{filled:"",unfilled:"Scale unknown"
472
546
  }
473
- const width=columns()
474
- const filled=Math.round(ratio*width)
547
+ const filled=Math.round(props.ratio*columns())
475
548
  const symbols=icons.style()==="text"?["=","-"]:["\u2501","\u2500"]
476
- return{filled:symbols[0].repeat(filled),unfilled:symbols[1].repeat(width-filled)
549
+ return{filled:symbols[0].repeat(filled),unfilled:symbols[1].repeat(columns()-filled)
477
550
  }}
478
- const unfilledColor=()=>subtleLineColor(props.api.theme.current.backgroundPanel,props.api.theme.current.borderSubtle)
479
- const valueWidth=()=>Math.min(columns(),Bun.stringWidth(view().value))
551
+ const valueWidth=()=>Math.min(columns(),Bun.stringWidth(props.value))
480
552
  const gap=()=>columns()>valueWidth()?1:0
481
- const resetWidth=()=>Math.max(0,columns()-valueWidth()-gap())
482
553
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createElement("span"),_el$4=_$createElement("box"),_el$5=_$createElement("text"),_el$6=_$createElement("text")
483
554
  _$insertNode(_el$,_el$2)
484
555
  _$insertNode(_el$,_el$4)
485
556
  _$setProp(_el$,"width","100%")
486
557
  _$setProp(_el$,"minWidth",0)
487
- _$setProp(_el$,"flexShrink",1)
488
558
  _$setProp(_el$,"height",2)
489
559
  _$setProp(_el$,"overflow","hidden")
490
560
  _$setProp(_el$,"onSizeChange",function(){setColumns(this.width)
491
561
  })
492
562
  _$insertNode(_el$2,_el$3)
493
563
  _$setProp(_el$2,"width","100%")
494
- _$setProp(_el$2,"minWidth",0)
495
564
  _$setProp(_el$2,"height",1)
496
565
  _$setProp(_el$2,"wrapMode","none")
497
566
  _$setProp(_el$2,"truncate",true)
@@ -500,7 +569,6 @@ _$insert(_el$3,()=>scale().unfilled)
500
569
  _$insertNode(_el$4,_el$5)
501
570
  _$insertNode(_el$4,_el$6)
502
571
  _$setProp(_el$4,"width","100%")
503
- _$setProp(_el$4,"minWidth",0)
504
572
  _$setProp(_el$4,"height",1)
505
573
  _$setProp(_el$4,"flexDirection","row")
506
574
  _$setProp(_el$4,"overflow","hidden")
@@ -508,13 +576,13 @@ _$setProp(_el$5,"minWidth",0)
508
576
  _$setProp(_el$5,"height",1)
509
577
  _$setProp(_el$5,"wrapMode","none")
510
578
  _$setProp(_el$5,"truncate",true)
511
- _$insert(_el$5,()=>view().reset)
579
+ _$insert(_el$5,()=>props.label)
512
580
  _$setProp(_el$6,"height",1)
513
581
  _$setProp(_el$6,"wrapMode","none")
514
582
  _$setProp(_el$6,"truncate",true)
515
- _$insert(_el$6,()=>view().value)
516
- _$effect((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2={fg:unfilledColor()
517
- },_v$3=resetWidth(),_v$4=props.api.theme.current.textMuted,_v$5=valueWidth(),_v$6=gap(),_v$7=props.api.theme.current.text
583
+ _$insert(_el$6,()=>props.value)
584
+ _$effect((_p$)=>{var _v$=props.color,_v$2={fg:subtleLineColor(props.api.theme.current.backgroundPanel,props.api.theme.current.borderSubtle)
585
+ },_v$3=Math.max(0,columns()-valueWidth()-gap()),_v$4=props.api.theme.current.textMuted,_v$5=valueWidth(),_v$6=gap(),_v$7=props.api.theme.current.text
518
586
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
519
587
  _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"style",_v$2,_p$.t))
520
588
  _v$3!==_p$.a&&(_p$.a=_$setProp(_el$5,"width",_v$3,_p$.a))
@@ -528,10 +596,43 @@ return _p$
528
596
  return _el$
529
597
  })()
530
598
  }
531
- import {createComponent as _$createComponent3} from "@opentui/solid"
532
- import {createEffect} from "solid-js"
599
+ function QuotaWindowRow(props){const view=()=>quotaPresentation(props.window,props.now)
600
+ const color=()=>{const pace=view().pace
601
+ return pace==="normal"?props.api.theme.current.textMuted:quotaColors[pace]
602
+ }
603
+ return(()=>{var _el$=_$createElement2("box"),_el$2=_$createElement2("text")
604
+ _$insertNode2(_el$,_el$2)
605
+ _$setProp2(_el$,"width","100%")
606
+ _$setProp2(_el$,"minWidth",0)
607
+ _$setProp2(_el$,"flexShrink",1)
608
+ _$setProp2(_el$,"height",5)
609
+ _$setProp2(_el$,"overflow","hidden")
610
+ _$insert2(_el$,_$createComponent2(QuotaMeter,{get api(){return props.api
611
+ },get label(){return view().paceLabel||"Quota remaining"
612
+ },get value(){return view().value
613
+ },get ratio(){return view().ratio
614
+ },get color(){return color()
615
+ }}),_el$2)
616
+ _$insert2(_el$,_$createComponent2(QuotaMeter,{get api(){return props.api
617
+ },get label(){return _$memo(()=>view().period.ratio===undefined)()?view().period.detail:"Time remaining"
618
+ },get value(){return _$memo(()=>view().period.ratio===undefined)()?"":view().period.detail
619
+ },get ratio(){return view().period.ratio
620
+ },get color(){return quotaColors.blue
621
+ }}),_el$2)
622
+ _$setProp2(_el$2,"width","100%")
623
+ _$setProp2(_el$2,"height",1)
624
+ _$setProp2(_el$2,"wrapMode","none")
625
+ _$setProp2(_el$2,"truncate",true)
626
+ _$insert2(_el$2,()=>view().resetSummary)
627
+ _$effect2((_$p)=>_$setProp2(_el$2,"fg",props.api.theme.current.textMuted,_$p))
628
+ return _el$
629
+ })()
630
+ }
631
+ import {memo as _$memo4} from "@opentui/solid"
632
+ import {createComponent as _$createComponent6} from "@opentui/solid"
633
+ import {createEffect,createMemo,createSignal as createSignal6,onCleanup} from "solid-js"
533
634
  import {SelectionMenu,useDialogs} from "./tui.js"
534
- import {createComponent as _$createComponent2} from "@opentui/solid"
635
+ import {createComponent as _$createComponent3} from "@opentui/solid"
535
636
  import {randomUUID} from "crypto"
536
637
  import {GuardedConfirmation as GuardedConfirmation2,useDialogState} from "./tui.js"
537
638
  var resetCreditOutcomeMessage={reset:"Reset applied. Restart or continue your Codex session.",alreadyRedeemed:"This attempt was already redeemed; no second credit was used.",noCredit:"No reset credit is available.",nothingToReset:"There is no eligible usage window to reset."
@@ -584,9 +685,12 @@ input.dialogs.back()
584
685
  async function review(creditID){try{const snapshot=await model.review(creditID)
585
686
  if(!snapshot)
586
687
  return
587
- input.dialogs.open(()=>_$createComponent2(GuardedConfirmation2,{get api(){return input.api
688
+ const credit=snapshot.bankedResets?.credits?.find((item)=>item.id===creditID)
689
+ input.dialogs.open(()=>_$createComponent3(GuardedConfirmation2,{get api(){return input.api
588
690
  },get current(){return input.current
589
- },title:"Use one banked reset?",get message(){return `Account ${snapshot.accountId} \xB7 model ${input.model.modelID}. This may reset other eligible Codex windows.`
691
+ },title:"Use one banked reset?",get message(){return [`Account ${snapshot.accountId} \xB7 model ${input.model.modelID}. This may reset other eligible Codex windows.`,credit?.description].filter(Boolean).join(`
692
+
693
+ `)
590
694
  },onConfirm:()=>void consume(creditID)
591
695
  }))
592
696
  } catch(error){if(input.current())
@@ -594,6 +698,136 @@ warn(error instanceof Error?error.message:"Credit eligibility is unavailable")
594
698
  }}
595
699
  return{review,consume,busy
596
700
  }}
701
+ function resetCreditView(credit,now){const expired=resetCreditLifetime(credit,now).expired
702
+ const labels={available:"Available",redeeming:"In progress",redeemed:"Used",unknown:"Status unknown"}
703
+ const status=expired&&(credit.status==="available"||credit.status==="unknown")?"Expired":labels[credit.status]
704
+ return{title:credit.title||`Credit ${credit.id}`,status,canReview:credit.status==="available"&&!expired&&credit.type==="codexRateLimits"
705
+ }}
706
+ import {effect as _$effect4} from "@opentui/solid"
707
+ import {memo as _$memo3} from "@opentui/solid"
708
+ import {createComponent as _$createComponent5} from "@opentui/solid"
709
+ import {createTextNode as _$createTextNode2} from "@opentui/solid"
710
+ import {insertNode as _$insertNode4} from "@opentui/solid"
711
+ import {insert as _$insert4} from "@opentui/solid"
712
+ import {setProp as _$setProp4} from "@opentui/solid"
713
+ import {createElement as _$createElement4} from "@opentui/solid"
714
+ import {TextAttributes} from "@opentui/core"
715
+ import {useIcons as useIcons3} from "./tui.js"
716
+ import {memo as _$memo2} from "@opentui/solid"
717
+ import {createComponent as _$createComponent4} from "@opentui/solid"
718
+ import {effect as _$effect3} from "@opentui/solid"
719
+ import {createTextNode as _$createTextNode} from "@opentui/solid"
720
+ import {insertNode as _$insertNode3} from "@opentui/solid"
721
+ import {insert as _$insert3} from "@opentui/solid"
722
+ import {setProp as _$setProp3} from "@opentui/solid"
723
+ import {createElement as _$createElement3} from "@opentui/solid"
724
+ import {Show,createSignal as createSignal5} from "solid-js"
725
+ import {subtleLineColor as subtleLineColor2,useIcons as useIcons2} from "./tui.js"
726
+ function ResetCreditExpiry(props){const icons=useIcons2()
727
+ const [columns,setColumns]=createSignal5(0)
728
+ const lifetime=()=>resetCreditLifetime(props.credit,props.now)
729
+ const expiry=()=>{const timestamp=props.credit.expiresAt
730
+ if(timestamp===undefined||timestamp<=0)
731
+ return
732
+ const date=new Date(timestamp*1000)
733
+ return Number.isFinite(date.getTime())?date:undefined
734
+ }
735
+ const scale=()=>{const width=Math.max(0,Math.floor(columns()))
736
+ const filled=Math.round((lifetime().remaining??0)*width)
737
+ const symbols=icons.style()==="text"?["=","-"]:["\u2501","\u2500"]
738
+ return{filled:symbols[0].repeat(filled),unfilled:symbols[1].repeat(width-filled)
739
+ }}
740
+ return(()=>{var _el$=_$createElement3("box"),_el$2=_$createElement3("text"),_el$3=_$createTextNode(` `)
741
+ _$insertNode3(_el$,_el$2)
742
+ _$setProp3(_el$,"width","100%")
743
+ _$setProp3(_el$,"minWidth",0)
744
+ _$setProp3(_el$,"overflow","hidden")
745
+ _$setProp3(_el$,"onSizeChange",function(){setColumns(this.width)
746
+ })
747
+ _$insertNode3(_el$2,_el$3)
748
+ _$setProp3(_el$2,"wrapMode","word")
749
+ _$insert3(_el$2,()=>icons.icon("recent"),_el$3)
750
+ _$insert3(_el$2,()=>lifetime().label,null)
751
+ _$insert3(_el$,_$createComponent4(Show,{get when(){return lifetime().remaining!==undefined
752
+ },get children(){var _el$4=_$createElement3("text"),_el$5=_$createElement3("span")
753
+ _$insertNode3(_el$4,_el$5)
754
+ _$setProp3(_el$4,"height",1)
755
+ _$setProp3(_el$4,"width","100%")
756
+ _$setProp3(_el$4,"wrapMode","none")
757
+ _$setProp3(_el$4,"truncate",true)
758
+ _$insert3(_el$4,()=>scale().filled,_el$5)
759
+ _$insert3(_el$5,()=>scale().unfilled)
760
+ _$effect3((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2={fg:subtleLineColor2(props.api.theme.current.backgroundElement,props.api.theme.current.borderSubtle)
761
+ }
762
+ _v$!==_p$.e&&(_p$.e=_$setProp3(_el$4,"fg",_v$,_p$.e))
763
+ _v$2!==_p$.t&&(_p$.t=_$setProp3(_el$5,"style",_v$2,_p$.t))
764
+ return _p$
765
+ },{e:undefined,t:undefined
766
+ })
767
+ return _el$4
768
+ }}),null)
769
+ _$insert3(_el$,_$createComponent4(Show,{get when(){return expiry()
770
+ },children:(date)=>(()=>{var _el$8=_$createElement3("text")
771
+ _$setProp3(_el$8,"wrapMode","word")
772
+ _$insert3(_el$8,()=>`Expires ${date().toLocaleString(undefined, {
773
+ dateStyle: "medium",
774
+ timeStyle: "short"
775
+ })}`)
776
+ _$effect3((_$p)=>_$setProp3(_el$8,"fg",props.api.theme.current.textMuted,_$p))
777
+ return _el$8
778
+ })()
779
+ }),null)
780
+ _$insert3(_el$,_$createComponent4(Show,{get when(){return _$memo2(()=>lifetime().remaining===undefined)()&&expiry()
781
+ },get children(){var _el$6=_$createElement3("text")
782
+ _$insertNode3(_el$6,_$createTextNode(`Grant date unavailable or invalid; progress unknown`))
783
+ _$setProp3(_el$6,"wrapMode","word")
784
+ _$effect3((_$p)=>_$setProp3(_el$6,"fg",props.api.theme.current.textMuted,_$p))
785
+ return _el$6
786
+ }}),null)
787
+ _$effect3((_$p)=>_$setProp3(_el$2,"fg",props.api.theme.current.text,_$p))
788
+ return _el$
789
+ })()
790
+ }
791
+ function ResetCreditCard(props){const icons=useIcons3()
792
+ const view=()=>resetCreditView(props.credit,props.now)
793
+ return(()=>{var _el$=_$createElement4("box"),_el$2=_$createElement4("text"),_el$3=_$createTextNode2(` `),_el$4=_$createElement4("text"),_el$5=_$createTextNode2(` `),_el$6=_$createElement4("text")
794
+ _$insertNode4(_el$,_el$2)
795
+ _$insertNode4(_el$,_el$4)
796
+ _$insertNode4(_el$,_el$6)
797
+ _$setProp4(_el$,"width","100%")
798
+ _$setProp4(_el$,"minWidth",0)
799
+ _$setProp4(_el$,"border",true)
800
+ _$setProp4(_el$,"paddingLeft",1)
801
+ _$setProp4(_el$,"paddingRight",1)
802
+ _$insertNode4(_el$2,_el$3)
803
+ _$setProp4(_el$2,"wrapMode","word")
804
+ _$insert4(_el$2,()=>icons.icon("reset"),_el$3)
805
+ _$insert4(_el$2,()=>view().title,null)
806
+ _$insertNode4(_el$4,_el$5)
807
+ _$setProp4(_el$4,"wrapMode","word")
808
+ _$insert4(_el$4,()=>icons.icon(view().canReview?"done":"info"),_el$5)
809
+ _$insert4(_el$4,()=>view().status,null)
810
+ _$insert4(_el$,_$createComponent5(ResetCreditExpiry,{get api(){return props.api
811
+ },get credit(){return props.credit
812
+ },get now(){return props.now
813
+ }}),_el$6)
814
+ _$setProp4(_el$6,"wrapMode","word")
815
+ _$insert4(_el$6,(()=>{var _c$=_$memo3(()=>!!view().canReview)
816
+ return()=>_c$()?`${icons.icon("right")} ${props.disabled ? "Review unavailable" : "Review credit"}`:"Cannot use this credit"
817
+ })())
818
+ _$effect4((_p$)=>{var _v$=`opencode-navigator.reset-credit.${props.credit.id}`,_v$2=props.api.theme.current.borderSubtle,_v$3=TextAttributes.BOLD,_v$4=props.api.theme.current.text,_v$5=props.api.theme.current.textMuted,_v$6=props.disabled||!view().canReview?props.api.theme.current.textMuted:props.api.theme.current.primary
819
+ _v$!==_p$.e&&(_p$.e=_$setProp4(_el$,"id",_v$,_p$.e))
820
+ _v$2!==_p$.t&&(_p$.t=_$setProp4(_el$,"borderColor",_v$2,_p$.t))
821
+ _v$3!==_p$.a&&(_p$.a=_$setProp4(_el$2,"attributes",_v$3,_p$.a))
822
+ _v$4!==_p$.o&&(_p$.o=_$setProp4(_el$2,"fg",_v$4,_p$.o))
823
+ _v$5!==_p$.i&&(_p$.i=_$setProp4(_el$4,"fg",_v$5,_p$.i))
824
+ _v$6!==_p$.n&&(_p$.n=_$setProp4(_el$6,"fg",_v$6,_p$.n))
825
+ return _p$
826
+ },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined
827
+ })
828
+ return _el$
829
+ })()
830
+ }
597
831
  function ResetCreditDialog(props){const dialogs=useDialogs(props.api)
598
832
  const key=JSON.stringify(props.model)
599
833
  const current=()=>JSON.stringify(props.controller.current().model)===key
@@ -601,76 +835,94 @@ const pending=props.preferences.pendingResetAttempt
601
835
  const credits=()=>props.controller.snapshot()?.bankedResets
602
836
  const actions=createResetCreditActions({...props,dialogs,current
603
837
  })
838
+ const [now,setNow]=createSignal6(Date.now())
839
+ const timer=setInterval(()=>setNow(Date.now()),30000)
840
+ onCleanup(()=>clearInterval(timer))
604
841
  createEffect(()=>{if(!current())
605
842
  dialogs.close()
606
843
  })
607
- const options=()=>[...credits()?.credits?.map((credit)=>({title:credit.title??`Credit ${credit.id}`,value:`credit:${credit.id}`,icon:"presets",description:[credit.status,credit.description,credit.expiresAt&&`expires ${new Date(credit.expiresAt * 1000).toLocaleString()}`].filter(Boolean).join(" \xB7 ")
844
+ const options=createMemo(()=>[...credits()?.credits?.map((credit)=>({title:credit.title??`Credit ${credit.id}`,value:`credit:${credit.id}`,icon:"presets",description:""
608
845
  }))??[],...credits()?.availableCount&&(credits()?.credits?.length??0)<credits().availableCount?[{title:"Use next available credit",value:"credit:",icon:"presets",description:"Credit details unavailable"
609
846
  }]:[],...pending()?[{title:"Reconcile pending attempt",value:"retry",icon:"retry",description:"Reuse the previous idempotency key"
610
847
  }]:[],{title:"Cancel",value:"cancel",icon:"close",description:"No credit is used"
611
- }]
612
- return _$createComponent3(SelectionMenu,{get api(){return props.api
848
+ }])
849
+ return _$createComponent6(SelectionMenu,{get api(){return props.api
613
850
  },get title(){return `Banked resets \xB7 ${credits()?.availableCount ?? 0} available${actions.busy() ? " \xB7 pending" : ""}`
614
- },get options(){return options()
615
- },get height(){return Math.min(18,options().length*3)
851
+ },description:"Review a credit first. Nothing is used until you confirm.",get options(){return options()
852
+ },get height(){return Math.min(24,options().length*8)
853
+ },adaptive:true,renderOption:(option)=>{const credit=credits()?.credits?.find((item)=>option.value===`credit:${item.id}`)
854
+ return credit&&_$createComponent6(ResetCreditCard,{get api(){return props.api
855
+ },credit,get now(){return now()
856
+ },get disabled(){return actions.busy()||Boolean(pending())
857
+ }})
616
858
  },onSelect:(option)=>{if(option.value==="cancel")
617
859
  dialogs.back()
618
- else if(option.value==="retry")
860
+ else if(!actions.busy()){if(option.value==="retry")
619
861
  actions.consume(pending()?.creditID)
620
- else if(option.value.startsWith("credit:"))
621
- actions.review(option.value.slice("credit:".length)||undefined)
622
- }})
862
+ else if(!pending()&&option.value.startsWith("credit:")){const id=option.value.slice("credit:".length)||undefined
863
+ const credit=credits()?.credits?.find((item)=>item.id===id)
864
+ if(!credit||resetCreditView(credit,now()).canReview)
865
+ actions.review(id)
866
+ }}}})
623
867
  }
624
- import {createComponent as _$createComponent5} from "@opentui/solid"
625
- import {For as For2,Show} from "solid-js"
626
- import {effect as _$effect2} from "@opentui/solid"
627
- import {insertNode as _$insertNode2} from "@opentui/solid"
628
- import {insert as _$insert2} from "@opentui/solid"
629
- import {memo as _$memo} from "@opentui/solid"
630
- import {setProp as _$setProp2} from "@opentui/solid"
631
- import {createElement as _$createElement2} from "@opentui/solid"
632
- function QuotaBalanceRow(props){return(()=>{var _el$=_$createElement2("text"),_el$2=_$createElement2("span")
633
- _$insertNode2(_el$,_el$2)
634
- _$setProp2(_el$,"wrapMode","none")
635
- _$setProp2(_el$,"truncate",true)
636
- _$insert2(_el$2,(()=>{var _c$=_$memo(()=>!!props.balance.unlimited)
868
+ import {createComponent as _$createComponent8} from "@opentui/solid"
869
+ import {For as For2,Show as Show2} from "solid-js"
870
+ import {effect as _$effect5} from "@opentui/solid"
871
+ import {insertNode as _$insertNode5} from "@opentui/solid"
872
+ import {insert as _$insert5} from "@opentui/solid"
873
+ import {memo as _$memo5} from "@opentui/solid"
874
+ import {setProp as _$setProp5} from "@opentui/solid"
875
+ import {createElement as _$createElement5} from "@opentui/solid"
876
+ function QuotaBalanceRow(props){return(()=>{var _el$=_$createElement5("text"),_el$2=_$createElement5("span")
877
+ _$insertNode5(_el$,_el$2)
878
+ _$setProp5(_el$,"wrapMode","none")
879
+ _$setProp5(_el$,"truncate",true)
880
+ _$insert5(_el$2,(()=>{var _c$=_$memo5(()=>!!props.balance.unlimited)
637
881
  return()=>_c$()?"No configured cap":`${props.balance.amount} ${props.balance.unit ?? "(provider unit not specified)"}`
638
882
  })())
639
- _$insert2(_el$,()=>` \xB7 ${props.balance.scope} \xB7 ${props.balance.label}`,null)
640
- _$effect2((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2={fg:props.api.theme.current.text
883
+ _$insert5(_el$,()=>` \xB7 ${props.balance.scope} \xB7 ${props.balance.label}`,null)
884
+ _$effect5((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2={fg:props.api.theme.current.text
641
885
  }
642
- _v$!==_p$.e&&(_p$.e=_$setProp2(_el$,"fg",_v$,_p$.e))
643
- _v$2!==_p$.t&&(_p$.t=_$setProp2(_el$2,"style",_v$2,_p$.t))
886
+ _v$!==_p$.e&&(_p$.e=_$setProp5(_el$,"fg",_v$,_p$.e))
887
+ _v$2!==_p$.t&&(_p$.t=_$setProp5(_el$2,"style",_v$2,_p$.t))
644
888
  return _p$
645
889
  },{e:undefined,t:undefined
646
890
  })
647
891
  return _el$
648
892
  })()
649
893
  }
650
- import {insert as _$insert3} from "@opentui/solid"
651
- import {createComponent as _$createComponent4} from "@opentui/solid"
652
- import {setProp as _$setProp3} from "@opentui/solid"
653
- import {createElement as _$createElement3} from "@opentui/solid"
894
+ import {insert as _$insert6} from "@opentui/solid"
895
+ import {createComponent as _$createComponent7} from "@opentui/solid"
896
+ import {setProp as _$setProp6} from "@opentui/solid"
897
+ import {createElement as _$createElement6} from "@opentui/solid"
654
898
  import {For} from "solid-js"
655
- function QuotaWindowGroup(props){return(()=>{var _el$=_$createElement3("box")
656
- _$setProp3(_el$,"width","100%")
657
- _$setProp3(_el$,"minWidth",0)
658
- _$setProp3(_el$,"gap",1)
659
- _$setProp3(_el$,"overflow","hidden")
660
- _$insert3(_el$,_$createComponent4(For,{get each(){return props.windows.map((window)=>window.id)
661
- },children:(_,index)=>_$createComponent4(QuotaWindowRow,{get api(){return props.api
899
+ import {createSignal as createSignal7,onCleanup as onCleanup2} from "solid-js"
900
+ function createQuotaClock(){const [now,setNow]=createSignal7(Date.now())
901
+ const timer=setInterval(()=>setNow(Date.now()),30000)
902
+ onCleanup2(()=>clearInterval(timer))
903
+ return now
904
+ }
905
+ function QuotaWindowGroup(props){const now=createQuotaClock()
906
+ return(()=>{var _el$=_$createElement6("box")
907
+ _$setProp6(_el$,"width","100%")
908
+ _$setProp6(_el$,"minWidth",0)
909
+ _$setProp6(_el$,"gap",1)
910
+ _$setProp6(_el$,"overflow","hidden")
911
+ _$insert6(_el$,_$createComponent7(For,{get each(){return props.windows.map((window)=>window.id)
912
+ },children:(_,index)=>_$createComponent7(QuotaWindowRow,{get api(){return props.api
662
913
  },get window(){return props.windows[index()]
914
+ },get now(){return now()
663
915
  }})
664
916
  }))
665
917
  return _el$
666
918
  })()
667
919
  }
668
- function QuotaSnapshotRows(props){return [_$createComponent5(Show,{get when(){return props.snapshot.windows.length>0
669
- },get children(){return _$createComponent5(QuotaWindowGroup,{get api(){return props.api
920
+ function QuotaSnapshotRows(props){return [_$createComponent8(Show2,{get when(){return props.snapshot.windows.length>0
921
+ },get children(){return _$createComponent8(QuotaWindowGroup,{get api(){return props.api
670
922
  },get windows(){return props.snapshot.windows
671
923
  }})
672
- }}),_$createComponent5(For2,{get each(){return props.snapshot.balances
673
- },children:(balance)=>_$createComponent5(QuotaBalanceRow,{get api(){return props.api
924
+ }}),_$createComponent8(For2,{get each(){return props.snapshot.balances
925
+ },children:(balance)=>_$createComponent8(QuotaBalanceRow,{get api(){return props.api
674
926
  },balance
675
927
  })
676
928
  })]
@@ -720,8 +972,8 @@ function providerQuotaCapability(id,canonical){const key=aliases[canonical??id]?
720
972
  const found=PROVIDER_QUOTA_CAPABILITIES.find((entry)=>entry.id===key)
721
973
  return found??{id,name:id,sources:[],reason:"No independent quota/balance API or native counter semantics are verified for this provider.",documentation:["https://opencode.ai/docs/providers/"]
722
974
  }}
723
- import {createSignal as createSignal5} from "solid-js"
724
- function createOpenCodeUsageAdapter(context){const [revision,setRevision]=createSignal5(0)
975
+ import {createSignal as createSignal8} from "solid-js"
976
+ function createOpenCodeUsageAdapter(context){const [revision,setRevision]=createSignal8(0)
725
977
  let generation=0
726
978
  const location=()=>context.location??context.data.location.default()
727
979
  const provider=(model)=>context.data.location.provider?.list(location())?.find((item)=>item.id===model.providerID)
@@ -779,33 +1031,33 @@ return{model,providerId:model.providerID,providerName:activeProvider.name,fetche
779
1031
  dispose()
780
1032
  }}
781
1033
  return{adapter,target:(model)=>({...model,quotaContext:key()})}}
782
- import {insert as _$insert9} from "@opentui/solid"
1034
+ import {insert as _$insert12} from "@opentui/solid"
783
1035
  import {mergeProps as _$mergeProps} from "@opentui/solid"
784
- import {setProp as _$setProp10} from "@opentui/solid"
785
- import {effect as _$effect9} from "@opentui/solid"
786
- import {createTextNode as _$createTextNode4} from "@opentui/solid"
787
- import {insertNode as _$insertNode6} from "@opentui/solid"
788
- import {createElement as _$createElement10} from "@opentui/solid"
789
- import {memo as _$memo7} from "@opentui/solid"
790
- import {createComponent as _$createComponent13} from "@opentui/solid"
791
- import {Show as Show7} from "solid-js"
1036
+ import {setProp as _$setProp13} from "@opentui/solid"
1037
+ import {effect as _$effect12} from "@opentui/solid"
1038
+ import {createTextNode as _$createTextNode6} from "@opentui/solid"
1039
+ import {insertNode as _$insertNode9} from "@opentui/solid"
1040
+ import {createElement as _$createElement13} from "@opentui/solid"
1041
+ import {memo as _$memo11} from "@opentui/solid"
1042
+ import {createComponent as _$createComponent16} from "@opentui/solid"
1043
+ import {Show as Show8} from "solid-js"
792
1044
  import {useDialogs as useDialogs3} from "./tui.js"
793
- import {setProp as _$setProp5} from "@opentui/solid"
794
- import {effect as _$effect4} from "@opentui/solid"
795
- import {createTextNode as _$createTextNode} from "@opentui/solid"
796
- import {insertNode as _$insertNode3} from "@opentui/solid"
797
- import {createElement as _$createElement5} from "@opentui/solid"
798
- import {memo as _$memo2} from "@opentui/solid"
799
- import {createComponent as _$createComponent7} from "@opentui/solid"
800
- import {Show as Show2} from "solid-js"
801
- import {useDialogs as useDialogs2,useIcons as useIcons2} from "./tui.js"
802
- import {createComponent as _$createComponent6} from "@opentui/solid"
803
- import {effect as _$effect3} from "@opentui/solid"
804
- import {insert as _$insert4} from "@opentui/solid"
805
- import {setProp as _$setProp4} from "@opentui/solid"
806
- import {createElement as _$createElement4} from "@opentui/solid"
1045
+ import {setProp as _$setProp8} from "@opentui/solid"
1046
+ import {effect as _$effect7} from "@opentui/solid"
1047
+ import {createTextNode as _$createTextNode3} from "@opentui/solid"
1048
+ import {insertNode as _$insertNode6} from "@opentui/solid"
1049
+ import {createElement as _$createElement8} from "@opentui/solid"
1050
+ import {memo as _$memo6} from "@opentui/solid"
1051
+ import {createComponent as _$createComponent10} from "@opentui/solid"
1052
+ import {Show as Show3} from "solid-js"
1053
+ import {useDialogs as useDialogs2,useIcons as useIcons4} from "./tui.js"
1054
+ import {createComponent as _$createComponent9} from "@opentui/solid"
1055
+ import {effect as _$effect6} from "@opentui/solid"
1056
+ import {insert as _$insert7} from "@opentui/solid"
1057
+ import {setProp as _$setProp7} from "@opentui/solid"
1058
+ import {createElement as _$createElement7} from "@opentui/solid"
807
1059
  import {SelectionBox} from "./tui.js"
808
- import {createSignal as createSignal6,onCleanup} from "solid-js"
1060
+ import {createSignal as createSignal9,onCleanup as onCleanup3} from "solid-js"
809
1061
  function sidebarInteractiveColors(theme,state,normalColor=theme.text,mode="row"){const highlighted=!state.disabled&&(state.focused||mode==="control"&&state.hovered)
810
1062
  let backgroundColor=theme.backgroundPanel
811
1063
  let foregroundColor=normalColor
@@ -821,14 +1073,14 @@ else if(highlighted)
821
1073
  foregroundColor=theme.selectedListItemText
822
1074
  return{backgroundColor,foregroundColor}}
823
1075
  function useSidebarItem(api,interaction,descriptor,normalColor=()=>api.theme.current.text,mode="row"){let unregister
824
- const [hovered,setHovered]=createSignal6(false)
1076
+ const [hovered,setHovered]=createSignal9(false)
825
1077
  const disabled=()=>descriptor.disabled?.()===true
826
1078
  const focused=()=>Boolean(interaction?.ownsFocus()&&interaction.isSelected(descriptor.id))
827
1079
  const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),hovered:hovered(),disabled:disabled()},normalColor(),mode)
828
1080
  const ref=(renderable)=>{unregister?.()
829
1081
  unregister=interaction?.register({...descriptor,renderable})
830
1082
  }
831
- onCleanup(()=>unregister?.())
1083
+ onCleanup3(()=>unregister?.())
832
1084
  return{ref,disabled,focused,backgroundColor:()=>colors().backgroundColor,foregroundColor:()=>colors().foregroundColor,onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),select(event){interaction?.mouseSelect(descriptor.id,event)
833
1085
  },activate(event){if(interaction)
834
1086
  return interaction.mouseActivate(descriptor.id,event)
@@ -839,7 +1091,7 @@ return true
839
1091
  }}}
840
1092
  function LimitsAction(props){const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>props.position,disabled:()=>props.disabled===true,activate:props.onActivate
841
1093
  },()=>props.api.theme.current.text,props.inline?"control":"row")
842
- return _$createComponent6(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
1094
+ return _$createComponent9(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
843
1095
  },height:1,get flexGrow(){return props.flexGrow
844
1096
  },get maxWidth(){return props.maxWidth
845
1097
  },flexShrink:1,minWidth:3,get backgroundColor(){return item.backgroundColor()
@@ -847,48 +1099,48 @@ return _$createComponent6(SelectionBox,{ref:(node)=>item.ref(node),get id(){retu
847
1099
  },get onMouseOut(){return item.onMouseOut
848
1100
  },onMouseUp:(event)=>{event.stopPropagation()
849
1101
  item.activate(event)
850
- },get children(){var _el$=_$createElement4("text")
851
- _$setProp4(_el$,"wrapMode","none")
852
- _$setProp4(_el$,"truncate",true)
853
- _$insert4(_el$,()=>props.label)
854
- _$effect3((_$p)=>_$setProp4(_el$,"fg",item.foregroundColor(),_$p))
1102
+ },get children(){var _el$=_$createElement7("text")
1103
+ _$setProp7(_el$,"wrapMode","none")
1104
+ _$setProp7(_el$,"truncate",true)
1105
+ _$insert7(_el$,()=>props.label)
1106
+ _$effect6((_$p)=>_$setProp7(_el$,"fg",item.foregroundColor(),_$p))
855
1107
  return _el$
856
1108
  }})
857
1109
  }
858
- function CodexAccountControls(props){const icons=useIcons2()
1110
+ function CodexAccountControls(props){const icons=useIcons4()
859
1111
  const model=()=>props.controller.current().model
860
1112
  const accountLink=createCodexAccountLink({api:props.api,preferences:props.preferences,adapter:props.codex,model,dialogs:useDialogs2(props.api)
861
1113
  })
862
1114
  const eligible=()=>(props.model.providerID==="openai"||props.model.hostConnection?.providerID==="openai")&&props.model.hostConnection?.method!=="api"
863
- const action=(id,row,label,onActivate)=>_$createComponent7(LimitsAction,{get api(){return props.api
1115
+ const action=(id,row,label,onActivate)=>_$createComponent10(LimitsAction,{get api(){return props.api
864
1116
  },get interaction(){return props.interaction
865
1117
  },id:`${PLUGIN_ID}.limits.${id}`,get position(){return{section:props.navigationSection,row,column:0
866
1118
  }},label,onActivate,get disabled(){return accountLink.busy()
867
1119
  }})
868
- return _$createComponent7(Show2,{get when(){return eligible()
869
- },get children(){return [_$createComponent7(Show2,{get when(){return _$memo2(()=>!!!props.model.accountID)()&&(!props.model.hostConnection||props.model.hostConnection.status==="ready")
870
- },get children(){return [(()=>{var _el$=_$createElement5("text")
871
- _$insertNode3(_el$,_$createTextNode(`Link the matching Codex account once for this connection`))
872
- _$effect4((_$p)=>_$setProp5(_el$,"fg",props.api.theme.current.textMuted,_$p))
1120
+ return _$createComponent10(Show3,{get when(){return eligible()
1121
+ },get children(){return [_$createComponent10(Show3,{get when(){return _$memo6(()=>!!!props.model.accountID)()&&(!props.model.hostConnection||props.model.hostConnection.status==="ready")
1122
+ },get children(){return [(()=>{var _el$=_$createElement8("text")
1123
+ _$insertNode6(_el$,_$createTextNode3(`Link the matching Codex account once for this connection`))
1124
+ _$effect7((_$p)=>_$setProp8(_el$,"fg",props.api.theme.current.textMuted,_$p))
873
1125
  return _el$
874
- })(),_$memo2(()=>action("link",2,`${icons.icon("scope")} Link Codex CLI account`,()=>void accountLink.link()))]
875
- }}),_$createComponent7(Show2,{get when(){return _$memo2(()=>!!(props.model.accountID&&props.model.accountSource!=="host"))()&&props.controller.snapshot()?.availability==="unauthenticated"
876
- },get children(){return [_$memo2(()=>action("unlink",4,`${icons.icon("close")} Unlink Codex account`,()=>props.preferences.setCodexConnectionBinding(props.model.providerID,props.model.hostConnection?.id))),_$createComponent7(Show2,{get when(){return props.controller.snapshot()?.availability==="unauthenticated"
1126
+ })(),_$memo6(()=>action("link",2,`${icons.icon("scope")} Link Codex CLI account`,()=>void accountLink.link()))]
1127
+ }}),_$createComponent10(Show3,{get when(){return _$memo6(()=>!!(props.model.accountID&&props.model.accountSource!=="host"))()&&props.controller.snapshot()?.availability==="unauthenticated"
1128
+ },get children(){return [_$memo6(()=>action("unlink",4,`${icons.icon("close")} Unlink Codex account`,()=>props.preferences.setCodexConnectionBinding(props.model.providerID,props.model.hostConnection?.id))),_$createComponent10(Show3,{get when(){return props.controller.snapshot()?.availability==="unauthenticated"
877
1129
  },get children(){return action("relink",5,`${icons.icon("scope")} Relink Codex account`,()=>void accountLink.link())
878
1130
  }})]
879
1131
  }})]
880
1132
  }})
881
1133
  }
882
- import {createComponent as _$createComponent9} from "@opentui/solid"
883
- import {Show as Show3} from "solid-js"
884
- import {useIcons as useIcons3} from "./tui.js"
885
- import {createComponent as _$createComponent8} from "@opentui/solid"
886
- import {effect as _$effect5} from "@opentui/solid"
887
- import {insert as _$insert5} from "@opentui/solid"
888
- import {setProp as _$setProp6} from "@opentui/solid"
889
- import {createElement as _$createElement6} from "@opentui/solid"
890
- import {memo as _$memo3} from "@opentui/solid"
891
- import {createEffect as createEffect2,createSignal as createSignal7,on} from "solid-js"
1134
+ import {createComponent as _$createComponent12} from "@opentui/solid"
1135
+ import {Show as Show4} from "solid-js"
1136
+ import {useIcons as useIcons5} from "./tui.js"
1137
+ import {createComponent as _$createComponent11} from "@opentui/solid"
1138
+ import {effect as _$effect8} from "@opentui/solid"
1139
+ import {insert as _$insert8} from "@opentui/solid"
1140
+ import {setProp as _$setProp9} from "@opentui/solid"
1141
+ import {createElement as _$createElement9} from "@opentui/solid"
1142
+ import {memo as _$memo7} from "@opentui/solid"
1143
+ import {createEffect as createEffect2,createSignal as createSignal10,on} from "solid-js"
892
1144
  import {SelectionBox as SelectionBox2} from "./tui.js"
893
1145
  var graphemes=new Intl.Segmenter(undefined,{granularity:"grapheme"
894
1146
  })
@@ -905,12 +1157,12 @@ result += segment
905
1157
  }
906
1158
  return result + ellipsis
907
1159
  }
908
- function SectionHeaderControl(props){const [width,setWidth]=createSignal7()
1160
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal10()
909
1161
  const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
910
1162
  },()=>props.api.theme.current.accent,"control")
911
1163
  createEffect2(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
912
1164
  const label=()=>width()===undefined||props.iconOnly?props.action.label():truncateEnd(props.action.label(),width()-2)
913
- return _$createComponent8(SelectionBox2,{ref:(node)=>control.ref(node),get id(){return props.action.id
1165
+ return _$createComponent11(SelectionBox2,{ref:(node)=>control.ref(node),get id(){return props.action.id
914
1166
  },get iconOnly(){return props.iconOnly
915
1167
  },get width(){return props.iconOnly?3:undefined
916
1168
  },get flexShrink(){return props.iconOnly?0:1
@@ -921,42 +1173,42 @@ return _$createComponent8(SelectionBox2,{ref:(node)=>control.ref(node),get id(){
921
1173
  },get onMouseOut(){return control.onMouseOut
922
1174
  },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
923
1175
  control.activate(event)
924
- },get children(){var _el$=_$createElement6("text")
925
- _$setProp6(_el$,"wrapMode","none")
926
- _$setProp6(_el$,"height",1)
927
- _$insert5(_el$,label)
928
- _$effect5((_$p)=>_$setProp6(_el$,"fg",control.foregroundColor(),_$p))
1176
+ },get children(){var _el$=_$createElement9("text")
1177
+ _$setProp9(_el$,"wrapMode","none")
1178
+ _$setProp9(_el$,"height",1)
1179
+ _$insert8(_el$,label)
1180
+ _$effect8((_$p)=>_$setProp9(_el$,"fg",control.foregroundColor(),_$p))
929
1181
  return _el$
930
1182
  }})
931
1183
  }
932
- function LimitsHeaderControls(props){const icons=useIcons3()
933
- return [_$createComponent9(Show3,{get when(){return props.credits
934
- },get children(){return _$createComponent9(SectionHeaderControl,{get api(){return props.api
1184
+ function LimitsHeaderControls(props){const icons=useIcons5()
1185
+ return [_$createComponent12(Show4,{get when(){return props.credits
1186
+ },get children(){return _$createComponent12(SectionHeaderControl,{get api(){return props.api
935
1187
  },get interaction(){return props.interaction
936
1188
  },get position(){return{section:props.navigationSection,row:0,column:1
937
- }},get action(){return{id:`${PLUGIN_ID}.limits.credits`,label:()=>"Banked Resets",disabled:()=>false,onActivate:props.onCredits
1189
+ }},get action(){return{id:`${PLUGIN_ID}.limits.credits`,label:()=>typeof props.credits==="number"?`${props.credits} Banked Resets`:"Banked Resets",disabled:()=>false,onActivate:props.onCredits
938
1190
  }}})
939
- }}),_$createComponent9(SectionHeaderControl,{get api(){return props.api
1191
+ }}),_$createComponent12(SectionHeaderControl,{get api(){return props.api
940
1192
  },get interaction(){return props.interaction
941
1193
  },iconOnly:true,get position(){return{section:props.navigationSection,row:0,column:2
942
1194
  }},get action(){return{id:`${PLUGIN_ID}.limits.refresh`,label:()=>icons.icon(props.refreshing?"pending":"retry"),disabled:()=>props.refreshing||!props.canRefresh,onActivate:props.onRefresh
943
1195
  }}})]
944
1196
  }
945
- import {insert as _$insert6} from "@opentui/solid"
946
- import {effect as _$effect6} from "@opentui/solid"
947
- import {createTextNode as _$createTextNode2} from "@opentui/solid"
948
- import {insertNode as _$insertNode4} from "@opentui/solid"
949
- import {memo as _$memo4} from "@opentui/solid"
950
- import {createComponent as _$createComponent10} from "@opentui/solid"
951
- import {setProp as _$setProp7} from "@opentui/solid"
952
- import {createElement as _$createElement7} from "@opentui/solid"
953
- import {Show as Show4} from "solid-js"
1197
+ import {insert as _$insert9} from "@opentui/solid"
1198
+ import {effect as _$effect9} from "@opentui/solid"
1199
+ import {createTextNode as _$createTextNode4} from "@opentui/solid"
1200
+ import {insertNode as _$insertNode7} from "@opentui/solid"
1201
+ import {memo as _$memo8} from "@opentui/solid"
1202
+ import {createComponent as _$createComponent13} from "@opentui/solid"
1203
+ import {setProp as _$setProp10} from "@opentui/solid"
1204
+ import {createElement as _$createElement10} from "@opentui/solid"
1205
+ import {Show as Show5} from "solid-js"
954
1206
  function LimitsModelRow(props){const names=()=>props.selection?.names(props.model)??{provider:props.model.providerID,model:props.model.modelID
955
1207
  }
956
- return(()=>{var _el$=_$createElement7("box")
957
- _$setProp7(_el$,"flexDirection","row")
958
- _$setProp7(_el$,"minWidth",0)
959
- _$insert6(_el$,_$createComponent10(LimitsAction,{get api(){return props.api
1208
+ return(()=>{var _el$=_$createElement10("box")
1209
+ _$setProp10(_el$,"flexDirection","row")
1210
+ _$setProp10(_el$,"minWidth",0)
1211
+ _$insert9(_el$,_$createComponent13(LimitsAction,{get api(){return props.api
960
1212
  },get interaction(){return props.interaction
961
1213
  },inline:true,flexGrow:1,get maxWidth(){return Bun.stringWidth(`[${names().provider}] ${names().model}`) + 2
962
1214
  },id:`${PLUGIN_ID}.limits.model`,get position(){return{section:props.navigationSection,row:1,column:0
@@ -964,13 +1216,13 @@ _$insert6(_el$,_$createComponent10(LimitsAction,{get api(){return props.api
964
1216
  },get disabled(){return !props.selection?.canOpen("model",props.model)
965
1217
  },onActivate:()=>props.selection?.open("model",props.model)
966
1218
  }),null)
967
- _$insert6(_el$,_$createComponent10(Show4,{get when(){return props.model.variant||props.selection?.variants(props.model).length
968
- },get children(){return [(()=>{var _el$2=_$createElement7("text"),_el$3=_$createTextNode2(` \xB7 `)
969
- _$insertNode4(_el$2,_el$3)
970
- _$setProp7(_el$2,"flexShrink",0)
971
- _$effect6((_$p)=>_$setProp7(_el$2,"fg",props.api.theme.current.textMuted,_$p))
1219
+ _$insert9(_el$,_$createComponent13(Show5,{get when(){return props.model.variant||props.selection?.variants(props.model).length
1220
+ },get children(){return [(()=>{var _el$2=_$createElement10("text"),_el$3=_$createTextNode4(` \xB7 `)
1221
+ _$insertNode7(_el$2,_el$3)
1222
+ _$setProp10(_el$2,"flexShrink",0)
1223
+ _$effect9((_$p)=>_$setProp10(_el$2,"fg",props.api.theme.current.textMuted,_$p))
972
1224
  return _el$2
973
- })(),_$createComponent10(LimitsAction,{get api(){return props.api
1225
+ })(),_$createComponent13(LimitsAction,{get api(){return props.api
974
1226
  },get interaction(){return props.interaction
975
1227
  },inline:true,id:`${PLUGIN_ID}.limits.variant`,get position(){return{section:props.navigationSection,row:1,column:1
976
1228
  }},get label(){return props.model.variant??"Default"
@@ -981,15 +1233,15 @@ return _el$2
981
1233
  return _el$
982
1234
  })()
983
1235
  }
984
- import {effect as _$effect7} from "@opentui/solid"
985
- import {insert as _$insert7} from "@opentui/solid"
986
- import {setProp as _$setProp8} from "@opentui/solid"
987
- import {createElement as _$createElement8} from "@opentui/solid"
988
- import {createComponent as _$createComponent11} from "@opentui/solid"
989
- import {memo as _$memo5} from "@opentui/solid"
990
- import {Show as Show5} from "solid-js"
991
- import {createSignal as createSignal8} from "solid-js"
992
- function createProviderAccountSource(ports){const [connections,setConnections]=createSignal8({})
1236
+ import {effect as _$effect10} from "@opentui/solid"
1237
+ import {insert as _$insert10} from "@opentui/solid"
1238
+ import {setProp as _$setProp11} from "@opentui/solid"
1239
+ import {createElement as _$createElement11} from "@opentui/solid"
1240
+ import {createComponent as _$createComponent14} from "@opentui/solid"
1241
+ import {memo as _$memo9} from "@opentui/solid"
1242
+ import {Show as Show6} from "solid-js"
1243
+ import {createSignal as createSignal11} from "solid-js"
1244
+ function createProviderAccountSource(ports){const [connections,setConnections]=createSignal11({})
993
1245
  let generation=0
994
1246
  let disposed=false
995
1247
  let lastModel
@@ -1047,7 +1299,7 @@ return{...model,accountID:undefined,accountSource:undefined}
1047
1299
  const accountID=connection?.accountID??preferences?.codexAccountForConnection(model.providerID,connection?.id,model.modelID)
1048
1300
  const accountSource=connection?.accountID?"host":"binding"
1049
1301
  return{...model,accountID,accountSource:accountID?accountSource:undefined}}
1050
- import {createEffect as createEffect3,createMemo,on as on2,onCleanup as onCleanup2} from "solid-js"
1302
+ import {createEffect as createEffect3,createMemo as createMemo2,on as on2,onCleanup as onCleanup4} from "solid-js"
1051
1303
  function quotaStatusMessage(input){const{model,snapshot,state}=input
1052
1304
  if(state.status==="error")
1053
1305
  return snapshot?"Stale \xB7 refresh failed":"Quota read failed \xB7 refresh to retry"
@@ -1083,85 +1335,85 @@ function LimitsStatus(props){const message=()=>{const{model,adapter
1083
1335
  return quotaStatusMessage({model,snapshot:props.controller.snapshot(),state:props.controller.state(),hasAdapter:Boolean(adapter)
1084
1336
  })
1085
1337
  }
1086
- return _$createComponent11(Show5,{get when(){return _$memo5(()=>!!props.controller.current().model)()&&message()
1087
- },children:(value)=>(()=>{var _el$=_$createElement8("text")
1088
- _$setProp8(_el$,"wrapMode","word")
1089
- _$insert7(_el$,value)
1090
- _$effect7((_$p)=>_$setProp8(_el$,"fg",props.api.theme.current.textMuted,_$p))
1338
+ return _$createComponent14(Show6,{get when(){return _$memo9(()=>!!props.controller.current().model)()&&message()
1339
+ },children:(value)=>(()=>{var _el$=_$createElement11("text")
1340
+ _$setProp11(_el$,"wrapMode","word")
1341
+ _$insert10(_el$,value)
1342
+ _$effect10((_$p)=>_$setProp11(_el$,"fg",props.api.theme.current.textMuted,_$p))
1091
1343
  return _el$
1092
1344
  })()
1093
1345
  })
1094
1346
  }
1095
- import {createComponent as _$createComponent12} from "@opentui/solid"
1096
- import {effect as _$effect8} from "@opentui/solid"
1097
- import {createTextNode as _$createTextNode3} from "@opentui/solid"
1098
- import {insertNode as _$insertNode5} from "@opentui/solid"
1099
- import {memo as _$memo6} from "@opentui/solid"
1100
- import {insert as _$insert8} from "@opentui/solid"
1101
- import {setProp as _$setProp9} from "@opentui/solid"
1102
- import {createElement as _$createElement9} from "@opentui/solid"
1103
- import {Show as Show6,createSignal as createSignal9} from "solid-js"
1104
- import {SelectionBox as SelectionBox3,useIcons as useIcons4} from "./tui.js"
1105
- function Section(props){const icons=useIcons4()
1106
- const [headerWidth,setHeaderWidth]=createSignal9(0)
1347
+ import {createComponent as _$createComponent15} from "@opentui/solid"
1348
+ import {effect as _$effect11} from "@opentui/solid"
1349
+ import {createTextNode as _$createTextNode5} from "@opentui/solid"
1350
+ import {insertNode as _$insertNode8} from "@opentui/solid"
1351
+ import {memo as _$memo10} from "@opentui/solid"
1352
+ import {insert as _$insert11} from "@opentui/solid"
1353
+ import {setProp as _$setProp12} from "@opentui/solid"
1354
+ import {createElement as _$createElement12} from "@opentui/solid"
1355
+ import {Show as Show7,createSignal as createSignal12} from "solid-js"
1356
+ import {SelectionBox as SelectionBox3,useIcons as useIcons6} from "./tui.js"
1357
+ function Section(props){const icons=useIcons6()
1358
+ const [headerWidth,setHeaderWidth]=createSignal12(0)
1107
1359
  const icon=()=>props.section?icons.section(props.section):props.icon
1108
1360
  const theme=()=>props.api.theme.current
1109
1361
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
1110
1362
  }),activate:props.onToggle
1111
1363
  })
1112
- return(()=>{var _el$=_$createElement9("box")
1113
- _$setProp9(_el$,"gap",1)
1114
- _$insert8(_el$,_$createComponent12(SelectionBox3,{ref:(node)=>item.ref(node),get id(){return props.sectionId
1364
+ return(()=>{var _el$=_$createElement12("box")
1365
+ _$setProp12(_el$,"gap",1)
1366
+ _$insert11(_el$,_$createComponent15(SelectionBox3,{ref:(node)=>item.ref(node),get id(){return props.sectionId
1115
1367
  },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,get backgroundColor(){return item.backgroundColor()
1116
1368
  },get onMouseOver(){return item.onMouseOver
1117
1369
  },get onMouseOut(){return item.onMouseOut
1118
1370
  },onMouseDown:(event)=>item.activate(event),onSizeChange:function(){setHeaderWidth(this.width)
1119
- },get children(){return [(()=>{var _el$2=_$createElement9("text"),_el$3=_$createElement9("span"),_el$4=_$createTextNode3(` `),_el$5=_$createElement9("span"),_el$6=_$createElement9("b")
1120
- _$insertNode5(_el$2,_el$3)
1121
- _$insertNode5(_el$2,_el$4)
1122
- _$insertNode5(_el$2,_el$5)
1123
- _$insertNode5(_el$2,_el$6)
1124
- _$setProp9(_el$2,"flexShrink",0)
1125
- _$setProp9(_el$2,"wrapMode","none")
1126
- _$insert8(_el$3,()=>icons.icon(props.open?"expanded":"collapsed"))
1127
- _$insert8(_el$5,(()=>{var _c$=_$memo6(()=>!!icon())
1371
+ },get children(){return [(()=>{var _el$2=_$createElement12("text"),_el$3=_$createElement12("span"),_el$4=_$createTextNode5(` `),_el$5=_$createElement12("span"),_el$6=_$createElement12("b")
1372
+ _$insertNode8(_el$2,_el$3)
1373
+ _$insertNode8(_el$2,_el$4)
1374
+ _$insertNode8(_el$2,_el$5)
1375
+ _$insertNode8(_el$2,_el$6)
1376
+ _$setProp12(_el$2,"flexShrink",0)
1377
+ _$setProp12(_el$2,"wrapMode","none")
1378
+ _$insert11(_el$3,()=>icons.icon(props.open?"expanded":"collapsed"))
1379
+ _$insert11(_el$5,(()=>{var _c$=_$memo10(()=>!!icon())
1128
1380
  return()=>_c$()?`${icon()} `:""
1129
1381
  })())
1130
- _$insert8(_el$6,()=>props.title)
1131
- _$effect8((_p$)=>{var _v$=item.foregroundColor(),_v$2={fg:item.focused()?item.foregroundColor():theme().accent
1382
+ _$insert11(_el$6,()=>props.title)
1383
+ _$effect11((_p$)=>{var _v$=item.foregroundColor(),_v$2={fg:item.focused()?item.foregroundColor():theme().accent
1132
1384
  },_v$3={fg:item.focused()?item.foregroundColor():theme().accent
1133
1385
  }
1134
- _v$!==_p$.e&&(_p$.e=_$setProp9(_el$2,"fg",_v$,_p$.e))
1135
- _v$2!==_p$.t&&(_p$.t=_$setProp9(_el$3,"style",_v$2,_p$.t))
1136
- _v$3!==_p$.a&&(_p$.a=_$setProp9(_el$5,"style",_v$3,_p$.a))
1386
+ _v$!==_p$.e&&(_p$.e=_$setProp12(_el$2,"fg",_v$,_p$.e))
1387
+ _v$2!==_p$.t&&(_p$.t=_$setProp12(_el$3,"style",_v$2,_p$.t))
1388
+ _v$3!==_p$.a&&(_p$.a=_$setProp12(_el$5,"style",_v$3,_p$.a))
1137
1389
  return _p$
1138
1390
  },{e:undefined,t:undefined,a:undefined
1139
1391
  })
1140
1392
  return _el$2
1141
- })(),(()=>{var _el$7=_$createElement9("box")
1142
- _$setProp9(_el$7,"flexDirection","row")
1143
- _$setProp9(_el$7,"gap",1)
1144
- _$setProp9(_el$7,"flexGrow",1)
1145
- _$setProp9(_el$7,"minWidth",0)
1146
- _$setProp9(_el$7,"justifyContent","flex-end")
1147
- _$insert8(_el$7,()=>props.headerControls,null)
1148
- _$insert8(_el$7,_$createComponent12(Show6,{get when(){return props.headerAction
1149
- },children:(action)=>_$createComponent12(SectionHeaderControl,{get api(){return props.api
1393
+ })(),(()=>{var _el$7=_$createElement12("box")
1394
+ _$setProp12(_el$7,"flexDirection","row")
1395
+ _$setProp12(_el$7,"gap",1)
1396
+ _$setProp12(_el$7,"flexGrow",1)
1397
+ _$setProp12(_el$7,"minWidth",0)
1398
+ _$setProp12(_el$7,"justifyContent","flex-end")
1399
+ _$insert11(_el$7,()=>props.headerControls,null)
1400
+ _$insert11(_el$7,_$createComponent15(Show7,{get when(){return props.headerAction
1401
+ },children:(action)=>_$createComponent15(SectionHeaderControl,{get api(){return props.api
1150
1402
  },get interaction(){return props.interaction
1151
1403
  },get action(){return action()
1152
1404
  },get resetWidth(){return headerWidth()
1153
1405
  },get position(){return{section:props.navigationSection??0,row:0,column:1
1154
1406
  }}})
1155
1407
  }),null)
1156
- _$insert8(_el$7,_$createComponent12(Show6,{get when(){return props.summary
1157
- },get children(){var _el$8=_$createElement9("text")
1158
- _$setProp9(_el$8,"wrapMode","none")
1159
- _$setProp9(_el$8,"truncate",true)
1160
- _$setProp9(_el$8,"height",1)
1161
- _$insert8(_el$8,()=>props.summary)
1162
- _$effect8((_p$)=>{var _v$4=item.focused()?item.foregroundColor():theme().textMuted,_v$5=props.headerAction?0:1
1163
- _v$4!==_p$.e&&(_p$.e=_$setProp9(_el$8,"fg",_v$4,_p$.e))
1164
- _v$5!==_p$.t&&(_p$.t=_$setProp9(_el$8,"flexShrink",_v$5,_p$.t))
1408
+ _$insert11(_el$7,_$createComponent15(Show7,{get when(){return props.summary
1409
+ },get children(){var _el$8=_$createElement12("text")
1410
+ _$setProp12(_el$8,"wrapMode","none")
1411
+ _$setProp12(_el$8,"truncate",true)
1412
+ _$setProp12(_el$8,"height",1)
1413
+ _$insert11(_el$8,()=>props.summary)
1414
+ _$effect11((_p$)=>{var _v$4=item.focused()?item.foregroundColor():theme().textMuted,_v$5=props.headerAction?0:1
1415
+ _v$4!==_p$.e&&(_p$.e=_$setProp12(_el$8,"fg",_v$4,_p$.e))
1416
+ _v$5!==_p$.t&&(_p$.t=_$setProp12(_el$8,"flexShrink",_v$5,_p$.t))
1165
1417
  return _p$
1166
1418
  },{e:undefined,t:undefined
1167
1419
  })
@@ -1170,7 +1422,7 @@ return _el$8
1170
1422
  return _el$7
1171
1423
  })()]
1172
1424
  }}),null)
1173
- _$insert8(_el$,_$createComponent12(Show6,{get when(){return props.open
1425
+ _$insert11(_el$,_$createComponent15(Show7,{get when(){return props.open
1174
1426
  },get children(){return props.children
1175
1427
  }}),null)
1176
1428
  return _el$
@@ -1181,47 +1433,47 @@ const model=()=>props.controller.current().model
1181
1433
  const snapshot=props.controller.snapshot
1182
1434
  function openCredits(){const selected=model()
1183
1435
  if(selected)
1184
- dialogs.open(()=>_$createComponent13(ResetCreditDialog,{get api(){return props.api
1436
+ dialogs.open(()=>_$createComponent16(ResetCreditDialog,{get api(){return props.api
1185
1437
  },get preferences(){return props.preferences
1186
1438
  },get controller(){return props.controller
1187
1439
  },get adapter(){return props.codex
1188
1440
  },model:selected
1189
1441
  }))
1190
1442
  }
1191
- return _$createComponent13(Section,{get api(){return props.api
1443
+ return _$createComponent16(Section,{get api(){return props.api
1192
1444
  },get interaction(){return props.interaction
1193
1445
  },sectionId:`${PLUGIN_ID}.section.limits`,get navigationSection(){return props.navigationSection
1194
- },title:"LIMITS",section:"limits",summary:"",get headerControls(){return _$createComponent13(LimitsHeaderControls,{get api(){return props.api
1446
+ },title:"LIMITS",section:"limits",summary:"",get headerControls(){return _$createComponent16(LimitsHeaderControls,{get api(){return props.api
1195
1447
  },get interaction(){return props.interaction
1196
1448
  },get navigationSection(){return props.navigationSection
1197
- },get credits(){return(snapshot()?.bankedResets?.availableCount??0)>0||Boolean(props.preferences.pendingResetAttempt())
1449
+ },get credits(){return snapshot()?.bankedResets?.availableCount||Boolean(props.preferences.pendingResetAttempt())
1198
1450
  },get refreshing(){return ["loading","refreshing"].includes(props.controller.state().status)
1199
1451
  },get canRefresh(){return Boolean(model()&&(props.controller.current().adapter??model()?.hostConnection?.status==="unavailable"))
1200
1452
  },onCredits:openCredits,onRefresh:()=>void props.controller.refresh(true)
1201
1453
  })
1202
1454
  },get open(){return props.preferences.expanded().limits
1203
- },onToggle:()=>props.preferences.toggleSectionExpanded("limits"),get children(){return _$createComponent13(Show7,{get when(){return model()
1204
- },get fallback(){return(()=>{var _el$=_$createElement10("text")
1205
- _$insertNode6(_el$,_$createTextNode4(`Open a session to view model limits`))
1206
- _$effect9((_$p)=>_$setProp10(_el$,"fg",props.api.theme.current.textMuted,_$p))
1455
+ },onToggle:()=>props.preferences.toggleSectionExpanded("limits"),get children(){return _$createComponent16(Show8,{get when(){return model()
1456
+ },get fallback(){return(()=>{var _el$=_$createElement13("text")
1457
+ _$insertNode9(_el$,_$createTextNode6(`Open a session to view model limits`))
1458
+ _$effect12((_$p)=>_$setProp13(_el$,"fg",props.api.theme.current.textMuted,_$p))
1207
1459
  return _el$
1208
1460
  })()
1209
- },children:(selected)=>(()=>{var _el$3=_$createElement10("box")
1210
- _$setProp10(_el$3,"width","100%")
1211
- _$setProp10(_el$3,"minWidth",0)
1212
- _$setProp10(_el$3,"flexShrink",1)
1213
- _$setProp10(_el$3,"overflow","hidden")
1214
- _$insert9(_el$3,_$createComponent13(LimitsModelRow,_$mergeProps(props,{get model(){return selected()
1461
+ },children:(selected)=>(()=>{var _el$3=_$createElement13("box")
1462
+ _$setProp13(_el$3,"width","100%")
1463
+ _$setProp13(_el$3,"minWidth",0)
1464
+ _$setProp13(_el$3,"flexShrink",1)
1465
+ _$setProp13(_el$3,"overflow","hidden")
1466
+ _$insert12(_el$3,_$createComponent16(LimitsModelRow,_$mergeProps(props,{get model(){return selected()
1215
1467
  },get selection(){return props.modelSelection
1216
1468
  }})),null)
1217
- _$insert9(_el$3,_$createComponent13(CodexAccountControls,_$mergeProps(props,{get model(){return selected()
1469
+ _$insert12(_el$3,_$createComponent16(CodexAccountControls,_$mergeProps(props,{get model(){return selected()
1218
1470
  }})),null)
1219
- _$insert9(_el$3,_$createComponent13(Show7,{get when(){return _$memo7(()=>!!(snapshot()&&["ready","stale"].includes(snapshot().availability)))()?snapshot():undefined
1220
- },children:(quota)=>_$createComponent13(QuotaSnapshotRows,{get api(){return props.api
1471
+ _$insert12(_el$3,_$createComponent16(Show8,{get when(){return _$memo11(()=>!!(snapshot()&&["ready","stale"].includes(snapshot().availability)))()?snapshot():undefined
1472
+ },children:(quota)=>_$createComponent16(QuotaSnapshotRows,{get api(){return props.api
1221
1473
  },get snapshot(){return quota()
1222
1474
  }})
1223
1475
  }),null)
1224
- _$insert9(_el$3,_$createComponent13(LimitsStatus,{get api(){return props.api
1476
+ _$insert12(_el$3,_$createComponent16(LimitsStatus,{get api(){return props.api
1225
1477
  },get controller(){return props.controller
1226
1478
  }}),null)
1227
1479
  return _el$3