opencode-navigator 0.21.7 → 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,10 @@
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
+
5
9
  ## [0.21.7] - 2026-10-09
6
10
 
7
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.
@@ -108,6 +112,7 @@
108
112
 
109
113
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
110
114
 
115
+ [0.21.8]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.7...v0.21.8
111
116
  [0.21.7]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.6...v0.21.7
112
117
  [0.21.6]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.5...v0.21.6
113
118
  [0.21.5]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.4...v0.21.5
package/README.md CHANGED
@@ -437,8 +437,14 @@ windows have one blank row between them, without a vertical guide or gutter.
437
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
  })()
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
@@ -6304,10 +6309,9 @@ return _el$
6304
6309
 
6305
6310
 
6306
6311
 
6307
-
6308
6312
  function SectionBoundary(props){const dividerColor=()=>{const{backgroundPanel,borderSubtle
6309
6313
  }=props.api.theme.current
6310
- 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)
6311
6315
  }
6312
6316
  return(()=>{var _el$=_$createElement("box")
6313
6317
  _$spread(_el$,_$mergeProps(()=>props.divided?{border:["bottom"],borderColor:dividerColor(),paddingBottom:1
@@ -7520,7 +7524,7 @@ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js"
7520
7524
  const limitsModule=await import(limitsPath)
7521
7525
  const LimitsSection=limitsModule.ProviderLimitsSection
7522
7526
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7523
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.7",hostContext)
7527
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.8",hostContext)
7524
7528
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7525
7529
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7526
7530
  const startup=createStartupSessionController(api,preferences)
@@ -7548,7 +7552,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7548
7552
  },interaction,skills,subagents,mcp
7549
7553
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7550
7554
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7551
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.7"
7555
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.8"
7552
7556
  }),_$createComponent(McpPersistence,{api,controller:mcp
7553
7557
  })]
7554
7558
  }})
@@ -7581,12 +7585,12 @@ return result.data?.type==="text"?result.data.content:undefined
7581
7585
  })
7582
7586
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV1VersionUpdater
7583
7587
  }=await loadNavigatorUpdates()
7584
- const versionStatus=createVersionStatus(api,"0.21.7")
7585
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.7"))
7588
+ const versionStatus=createVersionStatus(api,"0.21.8")
7589
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.8"))
7586
7590
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7587
7591
  },get multilineCorners(){return preferences.cornerFont
7588
7592
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7589
- },navigatorVersion:"0.21.7",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7593
+ },navigatorVersion:"0.21.8",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7590
7594
  },get onNavigatorUpdate(){return versionUpdates.navigator
7591
7595
  }})
7592
7596
  }})
@@ -7602,15 +7606,15 @@ return new TextDecoder().decode(await context.client.file.read({location:context
7602
7606
  },todo,context)
7603
7607
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV2VersionUpdater
7604
7608
  }=await loadNavigatorUpdates()
7605
- const versionStatus=createVersionStatus(adapter.api,"0.21.7")
7606
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.7"))
7609
+ const versionStatus=createVersionStatus(adapter.api,"0.21.8")
7610
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.8"))
7607
7611
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7608
7612
  },get multilineCorners(){return preferences.cornerFont
7609
7613
  },get children(){var _el$=_$createElement("box")
7610
7614
  _$setProp(_el$,"flexDirection","row")
7611
7615
  _$setProp(_el$,"justifyContent","space-between")
7612
7616
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7613
- },navigatorVersion:"0.21.7",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7617
+ },navigatorVersion:"0.21.8",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7614
7618
  },get onNavigatorUpdate(){return versionUpdates.navigator
7615
7619
  }}),null)
7616
7620
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7625,5 +7629,5 @@ await adapter.dispose()
7625
7629
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7626
7630
  }
7627
7631
  var plugin_default=plugin
7628
- 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
7629
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.7",
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",