opencode-navigator 0.21.2 → 0.21.3

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.3] - 2026-10-06
6
+
7
+ - Replace block quota meters with full-width adaptive thin-line scales and keep quota rows inside the sidebar's padding after resize. Show only reset time below each meter, removing technical account and window-duration suffixes.
8
+
5
9
  ## [0.21.2] - 2026-10-06
6
10
 
7
11
  - Make Limits compact with clickable provider/model and variant controls, remaining-headroom progress rows, and muted reset times. Move Refresh and Banked Resets into the section header, remove the section counter and Provider sources action, and keep reset consumption behind a separate confirmation.
@@ -86,6 +90,7 @@
86
90
 
87
91
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
88
92
 
93
+ [0.21.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.2...v0.21.3
89
94
  [0.21.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.1...v0.21.2
90
95
  [0.21.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.21.0...v0.21.1
91
96
  [0.21.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.20.0...v0.21.0
package/PROVIDERS.md CHANGED
@@ -14,7 +14,7 @@ permissions, region, transport, and supported host APIs.
14
14
 
15
15
  | Provider | Native source | Scope and prerequisites | Reference |
16
16
  | --- | --- | --- | --- |
17
- | OpenAI / Codex ChatGPT | Codex app-server account/rate-limit RPC and manual reset credits | Verified account identity; ordinary `codex` quota explicitly labelled account-scoped even with null model metadata; separate model buckets need explicit association | [Codex protocol](https://github.com/openai/codex/tree/main/codex-rs/app-server-protocol) |
17
+ | OpenAI / Codex ChatGPT | Codex app-server account/rate-limit RPC and manual reset credits | Verified account identity; ordinary `codex` quota is account-scoped even with null model metadata; separate model buckets need explicit association; native durations describe quota windows, not time until reset | [Codex protocol](https://github.com/openai/codex/tree/main/codex-rs/app-server-protocol) |
18
18
  | OpenAI API | HTTP request/token/project-token rate-limit headers | Actual response for the selected model/account; HTTP transport | [Rate limits](https://developers.openai.com/api/docs/guides/rate-limits) |
19
19
  | Anthropic API | Native response headers and organization rate-limits API | Per-model headers; configured limits need an eligible org/admin credential and explicit model association | [Rate limits API](https://platform.claude.com/docs/en/manage-claude/rate-limits-api) |
20
20
  | Azure OpenAI | Native remaining request/token headers | Actual deployment response; does not expose a ChatGPT subscription | [Quotas and limits](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/quotas-limits) |
package/README.md CHANGED
@@ -365,7 +365,7 @@ Codex 0.160.0 protocol also exposes the separate
365
365
  `account/rateLimitResetCredit/consume` RPC. Navigator requires explicit
366
366
  confirmation before using it and never redeems credits in the background.
367
367
  Limits follows the model and verified connection selected in the current OpenCode
368
- session. Codex's ordinary `codex` windows appear as **Codex account** quota, shared
368
+ session. Codex's ordinary `codex` windows describe verified account quota shared
369
369
  across models. The protocol can return `normalModelSlug: null` for this ordinary
370
370
  bucket; that field is display metadata for quota aliases, not a prerequisite for
371
371
  account usage. Separate model-specific buckets require explicit model association.
@@ -428,9 +428,11 @@ bindings are reused; conflicting bindings remain isolated until a deliberate rel
428
428
 
429
429
  Limits starts with **[Provider name] Model name · variant**. Activate the model or
430
430
  variant with the mouse or keyboard to open OpenCode's native selector. Each quota
431
- window uses two compact rows: remaining headroom with a muted progress scale,
432
- then a muted reset time and short scope/window label. Healthy views omit account
433
- IDs, source explanations, and update timestamps. Balances retain their native
431
+ window uses two compact rows: remaining headroom with an adaptive muted thin-line
432
+ scale spanning the available sidebar content width, then a muted reset time.
433
+ Both rows stay within the sidebar's padding when it resizes. Healthy views omit
434
+ account IDs, technical scope/window-duration suffixes, source explanations, and update timestamps. Account scope and native window durations remain in the data model;
435
+ durations describe provider quota windows, not time remaining until reset. Balances retain their native
434
436
  currency or point unit; a missing total does not become a full progress scale.
435
437
 
436
438
  The header has no section counter. Its compact **Refresh** control requests a
@@ -364,15 +364,8 @@ import {insertNode as _$insertNode} from "@opentui/solid"
364
364
  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
+ import {createSignal as createSignal4} from "solid-js"
367
368
  import {useIcons} from "./tui.js"
368
- function duration(minutes){if(minutes%10080===0)
369
- return `${minutes / 10080}w`
370
- if(minutes%1440===0)
371
- return `${minutes / 1440}d`
372
- if(minutes%60===0)
373
- return `${minutes / 60}h`
374
- return `${minutes}m`
375
- }
376
369
  function measurement(window,remaining){if(remaining!==undefined)
377
370
  return `${remaining}${window.unit === "%" ? "" : " "}${window.unit} left`
378
371
  if(window.used!==undefined)
@@ -390,28 +383,38 @@ return `Resets ${date.toLocaleDateString(undefined, { month: "short", day: "nume
390
383
  function quotaPresentation(window,now=Date.now()){const total=window.unit==="%"?100:window.total
391
384
  const remaining=window.remaining??(total!==undefined&&window.used!==undefined?total-window.used:undefined)
392
385
  const ratio=remaining!==undefined&&total!==undefined&&total>0?Math.max(0,Math.min(1,remaining / total)):undefined
393
- const account=window.scope==="account"?"Account":undefined
394
- const scope=window.kind==="rate_limit"?"API":account
395
- const period=window.durationMinutes?duration(window.durationMinutes):undefined
396
- const context=[scope,window.kind?window.label:period??window.label,window.kind?period:undefined].filter(Boolean).join(" \xB7 ")
397
- return{value:measurement(window,remaining),ratio,reset:`${resetTime(window.resetsAt, now)} \xB7 ${context}`}}
386
+ return{value:measurement(window,remaining),ratio,reset:resetTime(window.resetsAt,now)}}
398
387
  function QuotaWindowRow(props){const icons=useIcons()
388
+ const [columns,setColumns]=createSignal4(0)
399
389
  const view=()=>quotaPresentation(props.window)
400
390
  const scale=()=>{const ratio=view().ratio
401
391
  if(ratio===undefined)
402
392
  return " \xB7 scale unknown"
403
- const filled=Math.round(ratio*10)
404
- const symbols=icons.style()==="text"?["#","-"]:["\u2588","\u2591"]
405
- return ` [${symbols[0].repeat(filled)}${symbols[1].repeat(10 - filled)}]`
393
+ const width=Math.max(0,columns()-Bun.stringWidth(view().value)-1)
394
+ const filled=Math.round(ratio*width)
395
+ const symbols=icons.style()==="text"?["=","-"]:["\u2501","\u2500"]
396
+ return width?` ${symbols[0].repeat(filled)}${symbols[1].repeat(width - filled)}`:""
406
397
  }
407
398
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createElement("span"),_el$4=_$createElement("text")
408
399
  _$insertNode(_el$,_el$2)
409
400
  _$insertNode(_el$,_el$4)
401
+ _$setProp(_el$,"width","100%")
402
+ _$setProp(_el$,"minWidth",0)
403
+ _$setProp(_el$,"flexShrink",1)
404
+ _$setProp(_el$,"overflow","hidden")
405
+ _$setProp(_el$,"onSizeChange",function(){setColumns(this.width)
406
+ })
410
407
  _$insertNode(_el$2,_el$3)
408
+ _$setProp(_el$2,"width","100%")
409
+ _$setProp(_el$2,"minWidth",0)
410
+ _$setProp(_el$2,"height",1)
411
411
  _$setProp(_el$2,"wrapMode","none")
412
412
  _$setProp(_el$2,"truncate",true)
413
413
  _$insert(_el$3,()=>view().value)
414
414
  _$insert(_el$2,scale,null)
415
+ _$setProp(_el$4,"width","100%")
416
+ _$setProp(_el$4,"minWidth",0)
417
+ _$setProp(_el$4,"height",1)
415
418
  _$setProp(_el$4,"wrapMode","none")
416
419
  _$setProp(_el$4,"truncate",true)
417
420
  _$insert(_el$4,()=>view().reset)
@@ -613,7 +616,7 @@ import {insert as _$insert3} from "@opentui/solid"
613
616
  import {setProp as _$setProp3} from "@opentui/solid"
614
617
  import {createElement as _$createElement3} from "@opentui/solid"
615
618
  import {SelectionBox} from "./tui.js"
616
- import {createSignal as createSignal4,onCleanup} from "solid-js"
619
+ import {createSignal as createSignal5,onCleanup} from "solid-js"
617
620
  function sidebarInteractiveColors(theme,state,normalColor=theme.text,mode="row"){const highlighted=!state.disabled&&(state.focused||mode==="control"&&state.hovered)
618
621
  let backgroundColor=theme.backgroundPanel
619
622
  let foregroundColor=normalColor
@@ -629,7 +632,7 @@ else if(highlighted)
629
632
  foregroundColor=theme.selectedListItemText
630
633
  return{backgroundColor,foregroundColor}}
631
634
  function useSidebarItem(api,interaction,descriptor,normalColor=()=>api.theme.current.text,mode="row"){let unregister
632
- const [hovered,setHovered]=createSignal4(false)
635
+ const [hovered,setHovered]=createSignal5(false)
633
636
  const disabled=()=>descriptor.disabled?.()===true
634
637
  const focused=()=>Boolean(interaction?.ownsFocus()&&interaction.isSelected(descriptor.id))
635
638
  const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),hovered:hovered(),disabled:disabled()},normalColor(),mode)
@@ -696,7 +699,7 @@ import {insert as _$insert4} from "@opentui/solid"
696
699
  import {setProp as _$setProp5} from "@opentui/solid"
697
700
  import {createElement as _$createElement5} from "@opentui/solid"
698
701
  import {memo as _$memo3} from "@opentui/solid"
699
- import {createEffect as createEffect2,createSignal as createSignal5,on} from "solid-js"
702
+ import {createEffect as createEffect2,createSignal as createSignal6,on} from "solid-js"
700
703
  import {SelectionBox as SelectionBox2} from "./tui.js"
701
704
  var graphemes=new Intl.Segmenter(undefined,{granularity:"grapheme"
702
705
  })
@@ -713,7 +716,7 @@ result += segment
713
716
  }
714
717
  return result + ellipsis
715
718
  }
716
- function SectionHeaderControl(props){const [width,setWidth]=createSignal5()
719
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal6()
717
720
  const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
718
721
  },()=>props.api.theme.current.accent,"control")
719
722
  createEffect2(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
@@ -842,10 +845,10 @@ import {memo as _$memo6} from "@opentui/solid"
842
845
  import {insert as _$insert7} from "@opentui/solid"
843
846
  import {setProp as _$setProp8} from "@opentui/solid"
844
847
  import {createElement as _$createElement8} from "@opentui/solid"
845
- import {Show as Show5,createSignal as createSignal6} from "solid-js"
848
+ import {Show as Show5,createSignal as createSignal7} from "solid-js"
846
849
  import {SelectionBox as SelectionBox3,useIcons as useIcons4} from "./tui.js"
847
850
  function Section(props){const icons=useIcons4()
848
- const [headerWidth,setHeaderWidth]=createSignal6(0)
851
+ const [headerWidth,setHeaderWidth]=createSignal7(0)
849
852
  const icon=()=>props.section?icons.section(props.section):props.icon
850
853
  const theme=()=>props.api.theme.current
851
854
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
@@ -854,7 +857,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`sect
854
857
  return(()=>{var _el$=_$createElement8("box")
855
858
  _$setProp8(_el$,"gap",1)
856
859
  _$insert7(_el$,_$createComponent11(SelectionBox3,{ref:(node)=>item.ref(node),get id(){return props.sectionId
857
- },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
860
+ },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,get backgroundColor(){return item.backgroundColor()
858
861
  },get onMouseOver(){return item.onMouseOver
859
862
  },get onMouseOut(){return item.onMouseOut
860
863
  },onMouseDown:(event)=>item.activate(event),onSizeChange:function(){setHeaderWidth(this.width)
@@ -949,6 +952,10 @@ _$effect9((_$p)=>_$setProp9(_el$,"fg",props.api.theme.current.textMuted,_$p))
949
952
  return _el$
950
953
  })()
951
954
  },children:(selected)=>(()=>{var _el$3=_$createElement9("box")
955
+ _$setProp9(_el$3,"width","100%")
956
+ _$setProp9(_el$3,"minWidth",0)
957
+ _$setProp9(_el$3,"flexShrink",1)
958
+ _$setProp9(_el$3,"overflow","hidden")
952
959
  _$insert8(_el$3,_$createComponent12(LimitsModelRow,_$mergeProps(props,{get model(){return selected()
953
960
  },get selection(){return props.modelSelection
954
961
  }})),null)
@@ -975,7 +982,7 @@ const model=api.state.session.get(sessionID)?.model
975
982
  if(!model)
976
983
  return
977
984
  return{sessionID,providerID:model.providerID,modelID:model.id,...model.variant&&{variant:model.variant}}}
978
- import {createSignal as createSignal7,untrack as untrack2} from "solid-js"
985
+ import {createSignal as createSignal8,untrack as untrack2} from "solid-js"
979
986
  var CHATGPT_METHODS=new Set(["chatgpt-browser","chatgpt-headless"])
980
987
  function providerAccountIdentity(provider,credentials){if(!provider.integrationID||provider.activation==="disabled")
981
988
  return{status:"unsupported"}
@@ -997,7 +1004,7 @@ const header=Object.entries(provider.headers??{}).find(([name])=>name.toLowerCas
997
1004
  if(accountID&&header&&header!==accountID)
998
1005
  return{status:"loading"}
999
1006
  return{status:"ready",id,method:"oauth",providerID,...accountID&&{accountID}}}
1000
- function createOpenCodeV2AccountSource(context,lifecycle){const [connections,setConnections]=createSignal7({})
1007
+ function createOpenCodeV2AccountSource(context,lifecycle){const [connections,setConnections]=createSignal8({})
1001
1008
  let generation=0
1002
1009
  let disposed=false
1003
1010
  let lastModel
package/dist/tui.js CHANGED
@@ -3,7 +3,7 @@ import {insert as _$insert,setProp as _$setProp,createElement as _$createElement
3
3
 
4
4
 
5
5
 
6
- import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect5,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect7,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect8,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect11,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect12,onCleanup as onCleanup13,createSignal as createSignal16,createMemo as createMemo9,createEffect as createEffect13,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createSignal as createSignal23,createEffect as createEffect14,createSignal as createSignal22,on,createMemo as createMemo13,createSignal as createSignal26,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal24,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal25,onCleanup as onCleanup17,Show as Show19,createSignal as createSignal27,untrack as untrack5,createSignal as createSignal28,createEffect as createEffect15,For as For14,Show as Show15,Show as Show16,Show as Show17,Show as Show18,For as For15,Show as Show21,createMemo as createMemo15,Show as Show20,createMemo as createMemo14,createSignal as createSignal29,createEffect as createEffect16,onCleanup as onCleanup18,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For16,Show as Show22,createSignal as createSignal30,createEffect as createEffect17,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack6,For as For18,Show as Show25,createEffect as createEffect18,createMemo as createMemo17,createSignal as createSignal31,onCleanup as onCleanup20,untrack as untrack7,For as For17,Show as Show24,Show as Show23,Show as Show29,createEffect as createEffect19,createMemo as createMemo18,createSignal as createSignal32,onCleanup as onCleanup21,untrack as untrack8,For as For19,Show as Show27,Show as Show26,Show as Show28,createEffect as createEffect20,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack9,Show as Show30,createMemo as createMemo21,onCleanup as onCleanup24,createEffect as createEffect21,onCleanup as onCleanup25,untrack as untrack10,createSignal as createSignal33,onCleanup as onCleanup26,onMount as onMount7} from "solid-js"
6
+ import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect5,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect7,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect8,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect11,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect12,onCleanup as onCleanup13,createSignal as createSignal16,createMemo as createMemo9,createEffect as createEffect13,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createSignal as createSignal23,createEffect as createEffect14,createSignal as createSignal22,on,createMemo as createMemo13,createSignal as createSignal26,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal24,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal25,onCleanup as onCleanup17,Show as Show19,createSignal as createSignal27,untrack as untrack5,createSignal as createSignal28,createSignal as createSignal29,createEffect as createEffect15,For as For14,Show as Show15,Show as Show16,Show as Show17,Show as Show18,For as For15,Show as Show21,createMemo as createMemo15,Show as Show20,createMemo as createMemo14,createSignal as createSignal30,createEffect as createEffect16,onCleanup as onCleanup18,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For16,Show as Show22,createSignal as createSignal31,createEffect as createEffect17,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack6,For as For18,Show as Show25,createEffect as createEffect18,createMemo as createMemo17,createSignal as createSignal32,onCleanup as onCleanup20,untrack as untrack7,For as For17,Show as Show24,Show as Show23,Show as Show29,createEffect as createEffect19,createMemo as createMemo18,createSignal as createSignal33,onCleanup as onCleanup21,untrack as untrack8,For as For19,Show as Show27,Show as Show26,Show as Show28,createEffect as createEffect20,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack9,Show as Show30,createMemo as createMemo21,onCleanup as onCleanup24,createEffect as createEffect21,onCleanup as onCleanup25,untrack as untrack10,createSignal as createSignal34,onCleanup as onCleanup26,onMount as onMount7} from "solid-js"
7
7
  var SIDEBAR_SECTIONS=["limits","todo","subagents","skills","quick_actions","lsp","mcp"]
8
8
  var QUICK_ACTION_IDS=["session.rename","session.timeline","session.copy","session.export","session.compact","session.list","session.new","session.fork","messages.copy","session.first","session.last","session.messages_last_user","session.message.next","session.message.previous","permission.mode"]
9
9
  function preferencesScope(path){return path.worktree||path.directory||"global"
@@ -5520,7 +5520,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`sect
5520
5520
  return(()=>{var _el$=_$createElement("box")
5521
5521
  _$setProp(_el$,"gap",1)
5522
5522
  _$insert(_el$,_$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.sectionId
5523
- },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5523
+ },flexDirection:"row",height:1,justifyContent:"space-between",gap:1,get backgroundColor(){return item.backgroundColor()
5524
5524
  },get onMouseOver(){return item.onMouseOver
5525
5525
  },get onMouseOut(){return item.onMouseOut
5526
5526
  },onMouseDown:(event)=>item.activate(event),onSizeChange:function(){setHeaderWidth(this.width)
@@ -6209,13 +6209,14 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6209
6209
 
6210
6210
 
6211
6211
 
6212
+
6212
6213
 
6213
6214
 
6214
6215
  function QuickActionRow(props){const{api,interaction
6215
6216
  }=useSidebarList()
6216
6217
  const icons=useIcons()
6217
6218
  const theme=()=>api.theme.current
6218
- const [width,setWidth]=createSignal29(0)
6219
+ const [width,setWidth]=createSignal30(0)
6219
6220
  const shortcut=createMemo14(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6220
6221
  })
6221
6222
  return api.keys.formatBindings(bindings.get(props.action.command))
@@ -6510,7 +6511,7 @@ return _el$
6510
6511
  }})
6511
6512
  }
6512
6513
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6513
- const [query,setQuery]=createSignal30("")
6514
+ const [query,setQuery]=createSignal31("")
6514
6515
  const model=createSkillSectionModel(props,query)
6515
6516
  const navigationSection=()=>props.navigationSection??3
6516
6517
  function selectSkill(item){if(!props.preferences.shouldConfirmSkill(item)){model.useSkill(item)
@@ -6599,8 +6600,8 @@ return _el$
6599
6600
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6600
6601
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6601
6602
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6602
- const [query,setQuery]=createSignal31("")
6603
- const [mode,setMode]=createSignal31("all")
6603
+ const [query,setQuery]=createSignal32("")
6604
+ const [mode,setMode]=createSignal32("all")
6604
6605
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6605
6606
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6606
6607
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
@@ -6974,7 +6975,7 @@ function TodoSection(props){const list=createMemo18(()=>props.controller.list(pr
6974
6975
  const icons=useIcons()
6975
6976
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6976
6977
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6977
- const [mode,setMode]=createSignal32("all")
6978
+ const [mode,setMode]=createSignal33("all")
6978
6979
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6979
6980
  createEffect19(()=>{targetKey()
6980
6981
  setMode("all")
@@ -7313,7 +7314,7 @@ return false
7313
7314
  }
7314
7315
  function enabled(value){return typeof value==="function"?value():value!==false
7315
7316
  }
7316
- function createV2Keymap(context){const [revision,setRevision]=createSignal33(0)
7317
+ function createV2Keymap(context){const [revision,setRevision]=createSignal34(0)
7317
7318
  const layers=new Map
7318
7319
  let sequence=0
7319
7320
  function layerActive(layer){const mode=layer.mode??"base"
@@ -7586,7 +7587,7 @@ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js"
7586
7587
  const limitsModule=await import(limitsPath)
7587
7588
  const LimitsSection=limitsModule.ProviderLimitsSection
7588
7589
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7589
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.2",hostContext)
7590
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.21.3",hostContext)
7590
7591
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7591
7592
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7592
7593
  const startup=createStartupSessionController(api,preferences)
@@ -7614,7 +7615,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7614
7615
  },interaction,skills,subagents,mcp
7615
7616
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7616
7617
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7617
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.2"
7618
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.21.3"
7618
7619
  }),_$createComponent(McpPersistence,{api,controller:mcp
7619
7620
  })]
7620
7621
  }})
@@ -7645,12 +7646,12 @@ throw result.error
7645
7646
  }
7646
7647
  return result.data?.type==="text"?result.data.content:undefined
7647
7648
  })
7648
- const versionStatus=createVersionStatus(api,"0.21.2")
7649
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.2"))
7649
+ const versionStatus=createVersionStatus(api,"0.21.3")
7650
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.3"))
7650
7651
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7651
7652
  },get multilineCorners(){return preferences.cornerFont
7652
7653
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7653
- },navigatorVersion:"0.21.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7654
+ },navigatorVersion:"0.21.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7654
7655
  },get onNavigatorUpdate(){return versionUpdates.navigator
7655
7656
  }})
7656
7657
  }})
@@ -7664,15 +7665,15 @@ return
7664
7665
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7665
7666
  }))
7666
7667
  },todo,context)
7667
- const versionStatus=createVersionStatus(adapter.api,"0.21.2")
7668
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.2"))
7668
+ const versionStatus=createVersionStatus(adapter.api,"0.21.3")
7669
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.3"))
7669
7670
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7670
7671
  },get multilineCorners(){return preferences.cornerFont
7671
7672
  },get children(){var _el$=_$createElement("box")
7672
7673
  _$setProp(_el$,"flexDirection","row")
7673
7674
  _$setProp(_el$,"justifyContent","space-between")
7674
7675
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7675
- },navigatorVersion:"0.21.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7676
+ },navigatorVersion:"0.21.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7676
7677
  },get onNavigatorUpdate(){return versionUpdates.navigator
7677
7678
  }}),null)
7678
7679
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
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.2",
4
+ "version": "0.21.3",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",