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 +5 -0
- package/README.md +8 -2
- package/dist/provider-limits.js +31 -25
- package/dist/tui.js +19 -15
- package/package.json +1 -1
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.
|
|
441
|
-
|
|
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
|
|
package/dist/provider-limits.js
CHANGED
|
@@ -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
|
|
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
|
|
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("
|
|
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$
|
|
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
|
-
_$
|
|
418
|
-
_$insertNode(_el$
|
|
419
|
-
_$
|
|
420
|
-
_$setProp(_el$
|
|
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,"
|
|
427
|
-
_$setProp(_el$4,"
|
|
428
|
-
_$
|
|
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().
|
|
433
|
-
_$
|
|
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$
|
|
436
|
-
_v$3!==_p$.a&&(_p$.a=_$setProp(_el$
|
|
437
|
-
_v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"
|
|
438
|
-
_v$5!==_p$.i&&(_p$.i=_$setProp(_el$
|
|
439
|
-
_v$6!==_p$.n&&(_p$.n=_$setProp(_el$
|
|
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
|
|
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
|
|
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=
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
7585
|
-
const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.
|
|
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.
|
|
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.
|
|
7606
|
-
const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.
|
|
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.
|
|
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.
|
|
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",
|