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 +5 -0
- package/PROVIDERS.md +1 -1
- package/README.md +6 -4
- package/dist/provider-limits.js +32 -25
- package/dist/tui.js +17 -16
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
432
|
-
|
|
433
|
-
|
|
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
|
package/dist/provider-limits.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
404
|
-
const
|
|
405
|
-
|
|
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
|
|
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]=
|
|
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
|
|
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]=
|
|
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
|
|
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]=
|
|
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,
|
|
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
|
|
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]=
|
|
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
|
|
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,
|
|
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]=
|
|
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]=
|
|
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]=
|
|
6603
|
-
const [mode,setMode]=
|
|
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]=
|
|
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]=
|
|
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.
|
|
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.
|
|
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.
|
|
7649
|
-
const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.
|
|
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.
|
|
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.
|
|
7668
|
-
const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.21.
|
|
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.
|
|
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.
|
|
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",
|