opencode-navigator 0.21.6 → 0.21.8

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.21.8] - 2026-10-09
6
+
7
+ - Make the unfilled part of Limits scales substantially quieter, matching the theme-derived sidebar-divider tone. Keep the filled segment, reset text, and remaining values readable in both icon modes and after theme changes.
8
+
9
+ ## [0.21.7] - 2026-10-09
10
+
11
+ - Remove the vertical guide and its reserved gutter from Limits in both icon modes. Keep full-width quota scales, reset-left/remaining-right details, and one blank row between quota windows.
12
+
5
13
  ## [0.21.6] - 2026-10-09
6
14
 
7
15
  - Refine Limits with a continuous muted guide, full-width thin-line quota scales, and reset-left/remaining-right details. Keep long reset text from overlapping the remaining value and preserve Text fallback, resize clipping, and existing controls.
@@ -104,6 +112,8 @@
104
112
 
105
113
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
106
114
 
115
+ [0.21.8]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.7...v0.21.8
116
+ [0.21.7]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.6...v0.21.7
107
117
  [0.21.6]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.5...v0.21.6
108
118
  [0.21.5]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.4...v0.21.5
109
119
  [0.21.4]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.3...v0.21.4
package/README.md CHANGED
@@ -432,13 +432,19 @@ Codex account** and **Unlink Codex account** for the outdated manual association
432
432
  bindings are reused; conflicting bindings remain isolated until a deliberate relink.
433
433
 
434
434
  Limits starts with **[Provider name] Model name · variant**. Activate the model or
435
- variant with the mouse or keyboard to open OpenCode's native selector. A muted
436
- vertical guide joins the quota windows, with one guide-only row between them
437
- (`|` in Text fallback). Each window uses two compact rows: a full-width adaptive
435
+ variant with the mouse or keyboard to open OpenCode's native selector. Quota
436
+ windows have one blank row between them, without a vertical guide or gutter.
437
+ Each window uses two compact rows: a full-width adaptive
438
438
  thin-line scale, then muted reset time on the left and remaining headroom aligned
439
439
  to the right. The remaining value keeps its own space; long reset text is clipped.
440
- Both rows stay within the sidebar's padding when it resizes. Healthy views omit
441
- account IDs, technical scope/window-duration suffixes, source explanations, and update timestamps. Account scope and native window durations remain in the data model;
440
+ Both rows stay within the sidebar's padding when it resizes.
441
+
442
+ The filled part of each scale uses muted text; the unfilled part uses the much
443
+ quieter, theme-derived sidebar-divider tone. Reset time and remaining values keep
444
+ their readable colors in both icon modes and when the theme changes.
445
+
446
+ Healthy views omit account IDs, technical scope/window-duration suffixes, source
447
+ explanations, and update timestamps. Account scope and native window durations remain in the data model;
442
448
  durations describe provider quota windows, not time remaining until reset. Balances retain their native
443
449
  currency or point unit; a missing total does not become a full progress scale.
444
450
 
@@ -365,7 +365,7 @@ import {insert as _$insert} from "@opentui/solid"
365
365
  import {setProp as _$setProp} from "@opentui/solid"
366
366
  import {createElement as _$createElement} from "@opentui/solid"
367
367
  import {createSignal as createSignal4} from "solid-js"
368
- import {useIcons} from "./tui.js"
368
+ import {subtleLineColor,useIcons} from "./tui.js"
369
369
  function measurement(window,remaining){if(remaining!==undefined)
370
370
  return `${remaining}${window.unit === "%" ? "" : " "}${window.unit} left`
371
371
  if(window.used!==undefined)
@@ -389,18 +389,20 @@ const [columns,setColumns]=createSignal4(0)
389
389
  const view=()=>quotaPresentation(props.window)
390
390
  const scale=()=>{const ratio=view().ratio
391
391
  if(ratio===undefined)
392
- return "Scale unknown"
392
+ return{filled:"Scale unknown",unfilled:""
393
+ }
393
394
  const width=columns()
394
395
  const filled=Math.round(ratio*width)
395
396
  const symbols=icons.style()==="text"?["=","-"]:["\u2501","\u2500"]
396
- return symbols[0].repeat(filled) + symbols[1].repeat(width-filled)
397
- }
397
+ return{filled:symbols[0].repeat(filled),unfilled:symbols[1].repeat(width-filled)
398
+ }}
399
+ const unfilledColor=()=>subtleLineColor(props.api.theme.current.backgroundPanel,props.api.theme.current.borderSubtle)
398
400
  const valueWidth=()=>Math.min(columns(),Bun.stringWidth(view().value))
399
401
  const gap=()=>columns()>valueWidth()?1:0
400
402
  const resetWidth=()=>Math.max(0,columns()-valueWidth()-gap())
401
- return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createElement("box"),_el$4=_$createElement("text"),_el$5=_$createElement("text")
403
+ 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")
402
404
  _$insertNode(_el$,_el$2)
403
- _$insertNode(_el$,_el$3)
405
+ _$insertNode(_el$,_el$4)
404
406
  _$setProp(_el$,"width","100%")
405
407
  _$setProp(_el$,"minWidth",0)
406
408
  _$setProp(_el$,"flexShrink",1)
@@ -408,37 +410,41 @@ _$setProp(_el$,"height",2)
408
410
  _$setProp(_el$,"overflow","hidden")
409
411
  _$setProp(_el$,"onSizeChange",function(){setColumns(this.width)
410
412
  })
413
+ _$insertNode(_el$2,_el$3)
411
414
  _$setProp(_el$2,"width","100%")
412
415
  _$setProp(_el$2,"minWidth",0)
413
416
  _$setProp(_el$2,"height",1)
414
417
  _$setProp(_el$2,"wrapMode","none")
415
418
  _$setProp(_el$2,"truncate",true)
416
- _$insert(_el$2,scale)
417
- _$insertNode(_el$3,_el$4)
418
- _$insertNode(_el$3,_el$5)
419
- _$setProp(_el$3,"width","100%")
420
- _$setProp(_el$3,"minWidth",0)
421
- _$setProp(_el$3,"height",1)
422
- _$setProp(_el$3,"flexDirection","row")
423
- _$setProp(_el$3,"overflow","hidden")
419
+ _$insert(_el$2,()=>scale().filled,_el$3)
420
+ _$insert(_el$3,()=>scale().unfilled)
421
+ _$insertNode(_el$4,_el$5)
422
+ _$insertNode(_el$4,_el$6)
423
+ _$setProp(_el$4,"width","100%")
424
424
  _$setProp(_el$4,"minWidth",0)
425
425
  _$setProp(_el$4,"height",1)
426
- _$setProp(_el$4,"wrapMode","none")
427
- _$setProp(_el$4,"truncate",true)
428
- _$insert(_el$4,()=>view().reset)
426
+ _$setProp(_el$4,"flexDirection","row")
427
+ _$setProp(_el$4,"overflow","hidden")
428
+ _$setProp(_el$5,"minWidth",0)
429
429
  _$setProp(_el$5,"height",1)
430
430
  _$setProp(_el$5,"wrapMode","none")
431
431
  _$setProp(_el$5,"truncate",true)
432
- _$insert(_el$5,()=>view().value)
433
- _$effect((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2=resetWidth(),_v$3=props.api.theme.current.textMuted,_v$4=valueWidth(),_v$5=gap(),_v$6=props.api.theme.current.text
432
+ _$insert(_el$5,()=>view().reset)
433
+ _$setProp(_el$6,"height",1)
434
+ _$setProp(_el$6,"wrapMode","none")
435
+ _$setProp(_el$6,"truncate",true)
436
+ _$insert(_el$6,()=>view().value)
437
+ _$effect((_p$)=>{var _v$=props.api.theme.current.textMuted,_v$2={fg:unfilledColor()
438
+ },_v$3=resetWidth(),_v$4=props.api.theme.current.textMuted,_v$5=valueWidth(),_v$6=gap(),_v$7=props.api.theme.current.text
434
439
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
435
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$4,"width",_v$2,_p$.t))
436
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
437
- _v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"width",_v$4,_p$.o))
438
- _v$5!==_p$.i&&(_p$.i=_$setProp(_el$5,"marginLeft",_v$5,_p$.i))
439
- _v$6!==_p$.n&&(_p$.n=_$setProp(_el$5,"fg",_v$6,_p$.n))
440
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"style",_v$2,_p$.t))
441
+ _v$3!==_p$.a&&(_p$.a=_$setProp(_el$5,"width",_v$3,_p$.a))
442
+ _v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"fg",_v$4,_p$.o))
443
+ _v$5!==_p$.i&&(_p$.i=_$setProp(_el$6,"width",_v$5,_p$.i))
444
+ _v$6!==_p$.n&&(_p$.n=_$setProp(_el$6,"marginLeft",_v$6,_p$.n))
445
+ _v$7!==_p$.s&&(_p$.s=_$setProp(_el$6,"fg",_v$7,_p$.s))
440
446
  return _p$
441
- },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined
447
+ },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined
442
448
  })
443
449
  return _el$
444
450
  })()
@@ -549,41 +555,21 @@ return _p$
549
555
  return _el$
550
556
  })()
551
557
  }
552
- import {effect as _$effect3} from "@opentui/solid"
553
- import {insertNode as _$insertNode3} from "@opentui/solid"
554
- import {createComponent as _$createComponent4} from "@opentui/solid"
555
558
  import {insert as _$insert3} from "@opentui/solid"
559
+ import {createComponent as _$createComponent4} from "@opentui/solid"
556
560
  import {setProp as _$setProp3} from "@opentui/solid"
557
561
  import {createElement as _$createElement3} from "@opentui/solid"
558
562
  import {For} from "solid-js"
559
- import {useIcons as useIcons2} from "./tui.js"
560
- function QuotaWindowGroup(props){const icons=useIcons2()
561
- const guide=()=>Array.from({length:Math.max(0,props.windows.length*3-1)
562
- },()=>icons.style()==="text"?"|":"\u2502").join(`
563
- `)
564
- return(()=>{var _el$=_$createElement3("box"),_el$2=_$createElement3("text"),_el$3=_$createElement3("box")
565
- _$insertNode3(_el$,_el$2)
566
- _$insertNode3(_el$,_el$3)
563
+ function QuotaWindowGroup(props){return(()=>{var _el$=_$createElement3("box")
567
564
  _$setProp3(_el$,"width","100%")
568
565
  _$setProp3(_el$,"minWidth",0)
569
- _$setProp3(_el$,"flexDirection","row")
566
+ _$setProp3(_el$,"gap",1)
570
567
  _$setProp3(_el$,"overflow","hidden")
571
- _$setProp3(_el$2,"width",1)
572
- _$setProp3(_el$2,"marginRight",1)
573
- _$setProp3(_el$2,"flexShrink",0)
574
- _$setProp3(_el$2,"wrapMode","none")
575
- _$insert3(_el$2,guide)
576
- _$setProp3(_el$3,"width","100%")
577
- _$setProp3(_el$3,"flexGrow",1)
578
- _$setProp3(_el$3,"flexShrink",1)
579
- _$setProp3(_el$3,"minWidth",0)
580
- _$setProp3(_el$3,"gap",1)
581
- _$insert3(_el$3,_$createComponent4(For,{get each(){return props.windows
568
+ _$insert3(_el$,_$createComponent4(For,{get each(){return props.windows
582
569
  },children:(window)=>_$createComponent4(QuotaWindowRow,{get api(){return props.api
583
570
  },window
584
571
  })
585
572
  }))
586
- _$effect3((_$p)=>_$setProp3(_el$2,"fg",props.api.theme.current.textMuted,_$p))
587
573
  return _el$
588
574
  })()
589
575
  }
@@ -645,25 +631,25 @@ return found??{id,name:id,sources:[],reason:"No independent quota/balance API or
645
631
  import {insert as _$insert9} from "@opentui/solid"
646
632
  import {mergeProps as _$mergeProps} from "@opentui/solid"
647
633
  import {setProp as _$setProp10} from "@opentui/solid"
648
- import {effect as _$effect10} from "@opentui/solid"
634
+ import {effect as _$effect9} from "@opentui/solid"
649
635
  import {createTextNode as _$createTextNode4} from "@opentui/solid"
650
- import {insertNode as _$insertNode7} from "@opentui/solid"
636
+ import {insertNode as _$insertNode6} from "@opentui/solid"
651
637
  import {createElement as _$createElement10} from "@opentui/solid"
652
638
  import {memo as _$memo7} from "@opentui/solid"
653
639
  import {createComponent as _$createComponent13} from "@opentui/solid"
654
640
  import {Show as Show7} from "solid-js"
655
641
  import {useDialogs as useDialogs3} from "./tui.js"
656
642
  import {setProp as _$setProp5} from "@opentui/solid"
657
- import {effect as _$effect5} from "@opentui/solid"
643
+ import {effect as _$effect4} from "@opentui/solid"
658
644
  import {createTextNode as _$createTextNode} from "@opentui/solid"
659
- import {insertNode as _$insertNode4} from "@opentui/solid"
645
+ import {insertNode as _$insertNode3} from "@opentui/solid"
660
646
  import {createElement as _$createElement5} from "@opentui/solid"
661
647
  import {memo as _$memo2} from "@opentui/solid"
662
648
  import {createComponent as _$createComponent7} from "@opentui/solid"
663
649
  import {Show as Show2} from "solid-js"
664
- import {useDialogs as useDialogs2,useIcons as useIcons3} from "./tui.js"
650
+ import {useDialogs as useDialogs2,useIcons as useIcons2} from "./tui.js"
665
651
  import {createComponent as _$createComponent6} from "@opentui/solid"
666
- import {effect as _$effect4} from "@opentui/solid"
652
+ import {effect as _$effect3} from "@opentui/solid"
667
653
  import {insert as _$insert4} from "@opentui/solid"
668
654
  import {setProp as _$setProp4} from "@opentui/solid"
669
655
  import {createElement as _$createElement4} from "@opentui/solid"
@@ -714,11 +700,11 @@ item.activate(event)
714
700
  _$setProp4(_el$,"wrapMode","none")
715
701
  _$setProp4(_el$,"truncate",true)
716
702
  _$insert4(_el$,()=>props.label)
717
- _$effect4((_$p)=>_$setProp4(_el$,"fg",item.foregroundColor(),_$p))
703
+ _$effect3((_$p)=>_$setProp4(_el$,"fg",item.foregroundColor(),_$p))
718
704
  return _el$
719
705
  }})
720
706
  }
721
- function CodexAccountControls(props){const icons=useIcons3()
707
+ function CodexAccountControls(props){const icons=useIcons2()
722
708
  const model=()=>props.controller.current().model
723
709
  const accountLink=createCodexAccountLink({api:props.api,preferences:props.preferences,adapter:props.codex,model,dialogs:useDialogs2(props.api)
724
710
  })
@@ -731,8 +717,8 @@ const action=(id,row,label,onActivate)=>_$createComponent7(LimitsAction,{get api
731
717
  return _$createComponent7(Show2,{get when(){return eligible()
732
718
  },get children(){return [_$createComponent7(Show2,{get when(){return _$memo2(()=>!!!props.model.accountID)()&&(!props.model.hostConnection||props.model.hostConnection.status==="ready")
733
719
  },get children(){return [(()=>{var _el$=_$createElement5("text")
734
- _$insertNode4(_el$,_$createTextNode(`Link the matching Codex account once for this connection`))
735
- _$effect5((_$p)=>_$setProp5(_el$,"fg",props.api.theme.current.textMuted,_$p))
720
+ _$insertNode3(_el$,_$createTextNode(`Link the matching Codex account once for this connection`))
721
+ _$effect4((_$p)=>_$setProp5(_el$,"fg",props.api.theme.current.textMuted,_$p))
736
722
  return _el$
737
723
  })(),_$memo2(()=>action("link",2,`${icons.icon("scope")} Link Codex CLI account`,()=>void accountLink.link()))]
738
724
  }}),_$createComponent7(Show2,{get when(){return _$memo2(()=>!!(props.model.accountID&&props.model.accountSource!=="host"))()&&props.controller.snapshot()?.availability==="unauthenticated"
@@ -744,9 +730,9 @@ return _el$
744
730
  }
745
731
  import {createComponent as _$createComponent9} from "@opentui/solid"
746
732
  import {Show as Show3} from "solid-js"
747
- import {useIcons as useIcons4} from "./tui.js"
733
+ import {useIcons as useIcons3} from "./tui.js"
748
734
  import {createComponent as _$createComponent8} from "@opentui/solid"
749
- import {effect as _$effect6} from "@opentui/solid"
735
+ import {effect as _$effect5} from "@opentui/solid"
750
736
  import {insert as _$insert5} from "@opentui/solid"
751
737
  import {setProp as _$setProp6} from "@opentui/solid"
752
738
  import {createElement as _$createElement6} from "@opentui/solid"
@@ -788,11 +774,11 @@ control.activate(event)
788
774
  _$setProp6(_el$,"wrapMode","none")
789
775
  _$setProp6(_el$,"height",1)
790
776
  _$insert5(_el$,label)
791
- _$effect6((_$p)=>_$setProp6(_el$,"fg",control.foregroundColor(),_$p))
777
+ _$effect5((_$p)=>_$setProp6(_el$,"fg",control.foregroundColor(),_$p))
792
778
  return _el$
793
779
  }})
794
780
  }
795
- function LimitsHeaderControls(props){const icons=useIcons4()
781
+ function LimitsHeaderControls(props){const icons=useIcons3()
796
782
  return [_$createComponent9(Show3,{get when(){return props.credits
797
783
  },get children(){return _$createComponent9(SectionHeaderControl,{get api(){return props.api
798
784
  },get interaction(){return props.interaction
@@ -806,9 +792,9 @@ return [_$createComponent9(Show3,{get when(){return props.credits
806
792
  }}})]
807
793
  }
808
794
  import {insert as _$insert6} from "@opentui/solid"
809
- import {effect as _$effect7} from "@opentui/solid"
795
+ import {effect as _$effect6} from "@opentui/solid"
810
796
  import {createTextNode as _$createTextNode2} from "@opentui/solid"
811
- import {insertNode as _$insertNode5} from "@opentui/solid"
797
+ import {insertNode as _$insertNode4} from "@opentui/solid"
812
798
  import {memo as _$memo4} from "@opentui/solid"
813
799
  import {createComponent as _$createComponent10} from "@opentui/solid"
814
800
  import {setProp as _$setProp7} from "@opentui/solid"
@@ -829,9 +815,9 @@ _$insert6(_el$,_$createComponent10(LimitsAction,{get api(){return props.api
829
815
  }),null)
830
816
  _$insert6(_el$,_$createComponent10(Show4,{get when(){return props.model.variant||props.selection?.variants(props.model).length
831
817
  },get children(){return [(()=>{var _el$2=_$createElement7("text"),_el$3=_$createTextNode2(` \xB7 `)
832
- _$insertNode5(_el$2,_el$3)
818
+ _$insertNode4(_el$2,_el$3)
833
819
  _$setProp7(_el$2,"flexShrink",0)
834
- _$effect7((_$p)=>_$setProp7(_el$2,"fg",props.api.theme.current.textMuted,_$p))
820
+ _$effect6((_$p)=>_$setProp7(_el$2,"fg",props.api.theme.current.textMuted,_$p))
835
821
  return _el$2
836
822
  })(),_$createComponent10(LimitsAction,{get api(){return props.api
837
823
  },get interaction(){return props.interaction
@@ -844,7 +830,7 @@ return _el$2
844
830
  return _el$
845
831
  })()
846
832
  }
847
- import {effect as _$effect8} from "@opentui/solid"
833
+ import {effect as _$effect7} from "@opentui/solid"
848
834
  import {insert as _$insert7} from "@opentui/solid"
849
835
  import {setProp as _$setProp8} from "@opentui/solid"
850
836
  import {createElement as _$createElement8} from "@opentui/solid"
@@ -884,22 +870,22 @@ return _$createComponent11(Show5,{get when(){return _$memo5(()=>!!props.controll
884
870
  },children:(value)=>(()=>{var _el$=_$createElement8("text")
885
871
  _$setProp8(_el$,"wrapMode","word")
886
872
  _$insert7(_el$,value)
887
- _$effect8((_$p)=>_$setProp8(_el$,"fg",props.api.theme.current.textMuted,_$p))
873
+ _$effect7((_$p)=>_$setProp8(_el$,"fg",props.api.theme.current.textMuted,_$p))
888
874
  return _el$
889
875
  })()
890
876
  })
891
877
  }
892
878
  import {createComponent as _$createComponent12} from "@opentui/solid"
893
- import {effect as _$effect9} from "@opentui/solid"
879
+ import {effect as _$effect8} from "@opentui/solid"
894
880
  import {createTextNode as _$createTextNode3} from "@opentui/solid"
895
- import {insertNode as _$insertNode6} from "@opentui/solid"
881
+ import {insertNode as _$insertNode5} from "@opentui/solid"
896
882
  import {memo as _$memo6} from "@opentui/solid"
897
883
  import {insert as _$insert8} from "@opentui/solid"
898
884
  import {setProp as _$setProp9} from "@opentui/solid"
899
885
  import {createElement as _$createElement9} from "@opentui/solid"
900
886
  import {Show as Show6,createSignal as createSignal7} from "solid-js"
901
- import {SelectionBox as SelectionBox3,useIcons as useIcons5} from "./tui.js"
902
- function Section(props){const icons=useIcons5()
887
+ import {SelectionBox as SelectionBox3,useIcons as useIcons4} from "./tui.js"
888
+ function Section(props){const icons=useIcons4()
903
889
  const [headerWidth,setHeaderWidth]=createSignal7(0)
904
890
  const icon=()=>props.section?icons.section(props.section):props.icon
905
891
  const theme=()=>props.api.theme.current
@@ -914,10 +900,10 @@ _$insert8(_el$,_$createComponent12(SelectionBox3,{ref:(node)=>item.ref(node),get
914
900
  },get onMouseOut(){return item.onMouseOut
915
901
  },onMouseDown:(event)=>item.activate(event),onSizeChange:function(){setHeaderWidth(this.width)
916
902
  },get children(){return [(()=>{var _el$2=_$createElement9("text"),_el$3=_$createElement9("span"),_el$4=_$createTextNode3(` `),_el$5=_$createElement9("span"),_el$6=_$createElement9("b")
917
- _$insertNode6(_el$2,_el$3)
918
- _$insertNode6(_el$2,_el$4)
919
- _$insertNode6(_el$2,_el$5)
920
- _$insertNode6(_el$2,_el$6)
903
+ _$insertNode5(_el$2,_el$3)
904
+ _$insertNode5(_el$2,_el$4)
905
+ _$insertNode5(_el$2,_el$5)
906
+ _$insertNode5(_el$2,_el$6)
921
907
  _$setProp9(_el$2,"flexShrink",0)
922
908
  _$setProp9(_el$2,"wrapMode","none")
923
909
  _$insert8(_el$3,()=>icons.icon(props.open?"expanded":"collapsed"))
@@ -925,7 +911,7 @@ _$insert8(_el$5,(()=>{var _c$=_$memo6(()=>!!icon())
925
911
  return()=>_c$()?`${icon()} `:""
926
912
  })())
927
913
  _$insert8(_el$6,()=>props.title)
928
- _$effect9((_p$)=>{var _v$=item.foregroundColor(),_v$2={fg:item.focused()?item.foregroundColor():theme().accent
914
+ _$effect8((_p$)=>{var _v$=item.foregroundColor(),_v$2={fg:item.focused()?item.foregroundColor():theme().accent
929
915
  },_v$3={fg:item.focused()?item.foregroundColor():theme().accent
930
916
  }
931
917
  _v$!==_p$.e&&(_p$.e=_$setProp9(_el$2,"fg",_v$,_p$.e))
@@ -956,7 +942,7 @@ _$setProp9(_el$8,"wrapMode","none")
956
942
  _$setProp9(_el$8,"truncate",true)
957
943
  _$setProp9(_el$8,"height",1)
958
944
  _$insert8(_el$8,()=>props.summary)
959
- _$effect9((_p$)=>{var _v$4=item.focused()?item.foregroundColor():theme().textMuted,_v$5=props.headerAction?0:1
945
+ _$effect8((_p$)=>{var _v$4=item.focused()?item.foregroundColor():theme().textMuted,_v$5=props.headerAction?0:1
960
946
  _v$4!==_p$.e&&(_p$.e=_$setProp9(_el$8,"fg",_v$4,_p$.e))
961
947
  _v$5!==_p$.t&&(_p$.t=_$setProp9(_el$8,"flexShrink",_v$5,_p$.t))
962
948
  return _p$
@@ -999,8 +985,8 @@ return _$createComponent13(Section,{get api(){return props.api
999
985
  },get open(){return props.preferences.expanded().limits
1000
986
  },onToggle:()=>props.preferences.toggleSectionExpanded("limits"),get children(){return _$createComponent13(Show7,{get when(){return model()
1001
987
  },get fallback(){return(()=>{var _el$=_$createElement10("text")
1002
- _$insertNode7(_el$,_$createTextNode4(`Open a session to view model limits`))
1003
- _$effect10((_$p)=>_$setProp10(_el$,"fg",props.api.theme.current.textMuted,_$p))
988
+ _$insertNode6(_el$,_$createTextNode4(`Open a session to view model limits`))
989
+ _$effect9((_$p)=>_$setProp10(_el$,"fg",props.api.theme.current.textMuted,_$p))
1004
990
  return _el$
1005
991
  })()
1006
992
  },children:(selected)=>(()=>{var _el$3=_$createElement10("box")
package/dist/tui.js CHANGED
@@ -724,7 +724,7 @@ setPosition(body.scrollTop)
724
724
 
725
725
 
726
726
 
727
- import {RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,TextAttributes as TextAttributes6,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes7,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,RGBA as RGBA3,TextAttributes as TextAttributes18} from "@opentui/core"
727
+ import {RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes6,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes7,RGBA as RGBA3,parseColor as parseColor2,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,TextAttributes as TextAttributes18} from "@opentui/core"
728
728
 
729
729
  function SelectionBox(props){const icons=useIcons()
730
730
  const [local,boxProps]=splitProps(props,["ref","iconOnly"])
@@ -1080,6 +1080,11 @@ return _p$
1080
1080
  return _el$
1081
1081
  }}))
1082
1082
  }
1083
+
1084
+ function subtleLineColor(background,border){const from=parseColor(background)
1085
+ const to=parseColor(border)
1086
+ return RGBA2.fromValues(from.r + (to.r-from.r)*0.45,from.g + (to.g-from.g)*0.45,from.b + (to.b-from.b)*0.45)
1087
+ }
1083
1088
  function McpErrorDialog(props){return _$createComponent(SelectionMenu,{get api(){return props.api
1084
1089
  },get title(){return `MCP error \xB7 ${props.name}`
1085
1090
  },height:12,get options(){return [{title:`Status \xB7 ${props.status}`,value:"error",description:props.error,icon:"error"
@@ -3036,7 +3041,7 @@ return scored.map(({item})=>item)
3036
3041
 
3037
3042
 
3038
3043
 
3039
- function mixColor(from,to,amount){return RGBA2.fromValues(from.r + (to.r-from.r)*amount,from.g + (to.g-from.g)*amount,from.b + (to.b-from.b)*amount)
3044
+ function mixColor(from,to,amount){return RGBA3.fromValues(from.r + (to.r-from.r)*amount,from.g + (to.g-from.g)*amount,from.b + (to.b-from.b)*amount)
3040
3045
  }
3041
3046
  function createSearchDialogController(props){const context=searchContext(props.api)
3042
3047
  const skillTarget=props.skills.target()
@@ -3052,9 +3057,9 @@ const theme=()=>props.api.theme.current
3052
3057
  const icons=useIcons()
3053
3058
  const commandRevision=createQuickActionRevision(props.api)
3054
3059
  const dialogs=useDialogs(props.api)
3055
- const resultColors=createMemo(()=>{const background=parseColor(theme().backgroundPanel)
3060
+ const resultColors=createMemo(()=>{const background=parseColor2(theme().backgroundPanel)
3056
3061
  const contrast=background.r*0.299 + background.g*0.587 + background.b*0.114>0.5?0:1
3057
- return{title:mixColor(parseColor(theme().text),RGBA2.fromValues(contrast,contrast,contrast),0.45),description:mixColor(parseColor(theme().textMuted),background,0.4)
3062
+ return{title:mixColor(parseColor2(theme().text),RGBA3.fromValues(contrast,contrast,contrast),0.45),description:mixColor(parseColor2(theme().textMuted),background,0.4)
3058
3063
  }})
3059
3064
  const dimensions=useTerminalDimensions3()
3060
3065
  let input
@@ -6190,8 +6195,6 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6190
6195
 
6191
6196
 
6192
6197
 
6193
-
6194
-
6195
6198
 
6196
6199
 
6197
6200
 
@@ -6306,10 +6309,9 @@ return _el$
6306
6309
 
6307
6310
 
6308
6311
 
6309
-
6310
6312
  function SectionBoundary(props){const dividerColor=()=>{const{backgroundPanel,borderSubtle
6311
6313
  }=props.api.theme.current
6312
- return RGBA3.fromValues(backgroundPanel.r + (borderSubtle.r-backgroundPanel.r)*0.45,backgroundPanel.g + (borderSubtle.g-backgroundPanel.g)*0.45,backgroundPanel.b + (borderSubtle.b-backgroundPanel.b)*0.45)
6314
+ return subtleLineColor(backgroundPanel,borderSubtle)
6313
6315
  }
6314
6316
  return(()=>{var _el$=_$createElement("box")
6315
6317
  _$spread(_el$,_$mergeProps(()=>props.divided?{border:["bottom"],borderColor:dividerColor(),paddingBottom:1
@@ -7522,7 +7524,7 @@ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js"
7522
7524
  const limitsModule=await import(limitsPath)
7523
7525
  const LimitsSection=limitsModule.ProviderLimitsSection
7524
7526
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7525
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.6",hostContext)
7527
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.8",hostContext)
7526
7528
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7527
7529
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7528
7530
  const startup=createStartupSessionController(api,preferences)
@@ -7550,7 +7552,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7550
7552
  },interaction,skills,subagents,mcp
7551
7553
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7552
7554
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7553
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.6"
7555
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.8"
7554
7556
  }),_$createComponent(McpPersistence,{api,controller:mcp
7555
7557
  })]
7556
7558
  }})
@@ -7583,12 +7585,12 @@ return result.data?.type==="text"?result.data.content:undefined
7583
7585
  })
7584
7586
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV1VersionUpdater
7585
7587
  }=await loadNavigatorUpdates()
7586
- const versionStatus=createVersionStatus(api,"0.21.6")
7587
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.6"))
7588
+ const versionStatus=createVersionStatus(api,"0.21.8")
7589
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.8"))
7588
7590
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7589
7591
  },get multilineCorners(){return preferences.cornerFont
7590
7592
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7591
- },navigatorVersion:"0.21.6",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7593
+ },navigatorVersion:"0.21.8",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7592
7594
  },get onNavigatorUpdate(){return versionUpdates.navigator
7593
7595
  }})
7594
7596
  }})
@@ -7604,15 +7606,15 @@ return new TextDecoder().decode(await context.client.file.read({location:context
7604
7606
  },todo,context)
7605
7607
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV2VersionUpdater
7606
7608
  }=await loadNavigatorUpdates()
7607
- const versionStatus=createVersionStatus(adapter.api,"0.21.6")
7608
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.6"))
7609
+ const versionStatus=createVersionStatus(adapter.api,"0.21.8")
7610
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.8"))
7609
7611
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7610
7612
  },get multilineCorners(){return preferences.cornerFont
7611
7613
  },get children(){var _el$=_$createElement("box")
7612
7614
  _$setProp(_el$,"flexDirection","row")
7613
7615
  _$setProp(_el$,"justifyContent","space-between")
7614
7616
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7615
- },navigatorVersion:"0.21.6",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7617
+ },navigatorVersion:"0.21.8",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7616
7618
  },get onNavigatorUpdate(){return versionUpdates.navigator
7617
7619
  }}),null)
7618
7620
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7627,5 +7629,5 @@ await adapter.dispose()
7627
7629
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7628
7630
  }
7629
7631
  var plugin_default=plugin
7630
- export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,createDialogStack,createMcpController,createPreferencesController,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,plugin_default as default,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,showFirstRunWizard,useDialogScroll,useDialogState,useDialogs,useIcons
7632
+ export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,createDialogStack,createMcpController,createPreferencesController,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,plugin_default as default,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,showFirstRunWizard,subtleLineColor,useDialogScroll,useDialogState,useDialogs,useIcons
7631
7633
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-navigator",
4
- "version": "0.21.6",
4
+ "version": "0.21.8",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",