opencode-navigator 0.19.1 → 0.19.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,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.19.3] - 2026-10-03
6
+
7
+ - Indent grouped Todo, Subagent, Skill, and MCP rows and align MCP server status indicators with their group headings.
8
+ - Place Skill, MCP, and Quick Action bookmarks before item names. Reveal unselected bookmarks on hover or keyboard focus, keep favorites visible, and keep labels steady.
9
+
10
+ ## [0.19.2] - 2026-10-02
11
+
12
+ - Show MCP group connection states with the same radio-style indicators as individual servers, without Connect/Disconnect labels on group headings.
13
+
5
14
  ## [0.19.1] - 2026-10-02
6
15
 
7
16
  - Remember the OpenCode 1.x auto-approve mode as a user-wide default for new sessions, including changes made through the host's permission toggle.
@@ -55,6 +64,8 @@
55
64
 
56
65
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
57
66
 
67
+ [0.19.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.2...v0.19.3
68
+ [0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2
58
69
  [0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1
59
70
  [0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0
60
71
  [0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2
package/README.md CHANGED
@@ -89,7 +89,9 @@ Click a group heading (including Favorites or Ungrouped), or focus it and press
89
89
  `Enter`, to connect its remaining eligible servers. Once none need connecting,
90
90
  the same control disconnects its connected servers. This affects the full group
91
91
  even when a filter or item limit hides some rows; failed operations retain the
92
- usual retry control.
92
+ usual retry control. The heading has no action label: its radio-style icon is
93
+ filled only when every server in the group is connected, empty if any still
94
+ needs connecting, and pending while the group changes.
93
95
 
94
96
  ![MCP group manager](https://raw.githubusercontent.com/St1ggy/opencode-navigator/main/screenshots/31-mcp-groups.png)
95
97
 
@@ -101,6 +103,12 @@ belong to each Skill's exact source path, so assignments survive when a Skill
101
103
  is absent from the current workspace. Filters and Search Everything also match
102
104
  group names; choosing a group heading never runs its Skills.
103
105
 
106
+ Rows beneath group headings are indented in Todo, Subagents, Skills, and MCP.
107
+ Skill, MCP, and Quick Action rows reserve a leading bookmark control: unselected
108
+ bookmarks appear on hover or keyboard focus, while favorites stay visible.
109
+ Labels do not shift when the control appears. MCP server status icons align with
110
+ their group status icons, including when a server has an error detail control.
111
+
104
112
  ![Skill group manager](https://raw.githubusercontent.com/St1ggy/opencode-navigator/main/screenshots/38-skill-groups.png)
105
113
 
106
114
  Search Everything preserves one query across Skills, Subagents, MCP, and Actions:
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,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 createEffect4,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect6,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect5,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 createEffect7,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect8,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect9,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect10,createMemo as createMemo9,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,createMemo as createMemo8,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect11,onCleanup as onCleanup13,createSignal as createSignal16,createEffect as createEffect12,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,createEffect as createEffect13,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal24,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,Show as Show13,createSignal as createSignal23,onCleanup as onCleanup17,For as For14,Show as Show16,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal25,createEffect as createEffect14,onCleanup as onCleanup18,For as For19,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For15,Show as Show17,createSignal as createSignal26,createEffect as createEffect15,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack5,For as For17,Show as Show20,createEffect as createEffect16,createMemo as createMemo17,createSignal as createSignal27,onCleanup as onCleanup20,untrack as untrack6,For as For16,Show as Show19,Show as Show18,Show as Show24,createEffect as createEffect17,createMemo as createMemo18,createSignal as createSignal28,onCleanup as onCleanup21,untrack as untrack7,For as For18,Show as Show22,Show as Show21,Show as Show23,createEffect as createEffect18,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack8,Show as Show25,createMemo as createMemo21,onCleanup as onCleanup24,createSignal as createSignal29,onCleanup as onCleanup25,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,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 createEffect4,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect6,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect5,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 createEffect7,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect8,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect9,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect10,createMemo as createMemo9,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,createMemo as createMemo8,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect11,onCleanup as onCleanup13,createSignal as createSignal16,createEffect as createEffect12,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,createEffect as createEffect13,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal25,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal23,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal24,onCleanup as onCleanup17,For as For14,Show as Show16,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal26,createEffect as createEffect14,onCleanup as onCleanup18,For as For19,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For15,Show as Show17,createSignal as createSignal27,createEffect as createEffect15,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack5,For as For17,Show as Show20,createEffect as createEffect16,createMemo as createMemo17,createSignal as createSignal28,onCleanup as onCleanup20,untrack as untrack6,For as For16,Show as Show19,Show as Show18,Show as Show24,createEffect as createEffect17,createMemo as createMemo18,createSignal as createSignal29,onCleanup as onCleanup21,untrack as untrack7,For as For18,Show as Show22,Show as Show21,Show as Show23,createEffect as createEffect18,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack8,Show as Show25,createMemo as createMemo21,onCleanup as onCleanup24,createSignal as createSignal30,onCleanup as onCleanup25,onMount as onMount7} from "solid-js"
7
7
  var SIDEBAR_SECTIONS=["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"
@@ -195,6 +195,12 @@ function mcpGroupToggleAction(items){if(items.some((item)=>mcpToggleAction2(item
195
195
  return "connect"
196
196
  return items.some((item)=>mcpToggleAction2(item.status)==="disconnect")?"disconnect":undefined
197
197
  }
198
+ function mcpGroupStatus(items,busy=false){if(busy)
199
+ return "pending"
200
+ if(items.length>0&&items.every((item)=>item.status==="connected"))
201
+ return "connected"
202
+ return items.find((item)=>item.status!=="connected"&&item.status!=="disabled")?.status??"disabled"
203
+ }
198
204
  function buildMcpGroupedView(items,favorites,assignments){return items.map((item)=>({...item,assignedGroup:assignments[item.name],bucket:favorites.has(item.name)?"Favorites":assignments[item.name]??"Ungrouped"
199
205
  })).sort((left,right)=>{const leftRank=BUCKET_RANK[left.bucket]??1
200
206
  const rightRank=BUCKET_RANK[right.bucket]??1
@@ -840,6 +846,7 @@ return _el$
840
846
 
841
847
 
842
848
 
849
+
843
850
  function IconControl(props){function mouseOver(event){props.onMouseOver?.()
844
851
  event.stopPropagation()
845
852
  }
@@ -867,7 +874,7 @@ function BookmarkControl(props){const icons=useIcons()
867
874
  return _$createComponent(IconControl,{ref(r$){var _ref$=props.ref
868
875
  typeof _ref$==="function"?_ref$(r$):props.ref=r$
869
876
  },get id(){return props.id
870
- },get icon(){return icons.icon(props.bookmarked?"bookmark":"bookmarkEmpty")
877
+ },get icon(){return _$memo(()=>props.visible?.()===false)()?" ":icons.icon(props.bookmarked?"bookmark":"bookmarkEmpty")
871
878
  },get backgroundColor(){return props.backgroundColor
872
879
  },get foregroundColor(){return props.foregroundColor
873
880
  },get onMouseOver(){return props.onMouseOver
@@ -5687,7 +5694,10 @@ const selected=props.controller.selectedPreset?.(target())
5687
5694
  return selected&&Object.hasOwn(presets,selected)?selected:matchingMcpPreset(list(),presets)
5688
5695
  })
5689
5696
  return{target,favorites,groups,grouped,list,groupNames(bucket){return groupItems(bucket).map((item)=>item.name)
5690
- },groupAction(bucket){return mcpGroupToggleAction(groupItems(bucket))
5697
+ },groupStatus(bucket){const items=groupItems(bucket)
5698
+ const operation=bulk()
5699
+ const busy=operation.status==="running"&&"group" in operation&&operation.group===bucket||items.some((item)=>["loading","refreshing"].includes(props.controller.serverState(item.name,target()).status))
5700
+ return mcpGroupStatus(items,busy)
5691
5701
  },filtered,visibility,active,state,bulk,bulkRunning,mutationRunning,connectable,disconnectable,errors,presetName
5692
5702
  }}
5693
5703
 
@@ -5780,15 +5790,26 @@ return _el$2
5780
5790
 
5781
5791
 
5782
5792
 
5783
-
5793
+ function mcpColor(api,status){const theme=api.theme.current
5794
+ if(status==="connected")
5795
+ return theme.success
5796
+ if(status==="failed"||status==="needs_client_registration")
5797
+ return theme.error
5798
+ if(status==="needs_auth")
5799
+ return theme.warning
5800
+ return theme.textMuted
5801
+ }
5802
+ function mcpToggle(status,busy){if(busy||status==="pending")
5803
+ return "pending"
5804
+ return status==="connected"?"connected":"disconnected"
5805
+ }
5784
5806
  function McpGroupHeader(props){const icons=useIcons()
5785
- const theme=()=>props.api.theme.current
5786
5807
  const id=()=>`${PLUGIN_ID}.mcp.group.${props.bucket}`
5787
- const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled||!props.action,activate:props.onToggle
5808
+ const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled,activate:props.onToggle
5788
5809
  })
5789
5810
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return id()
5790
5811
  },height:1,get marginTop(){return props.marginTop
5791
- },flexDirection:"row",justifyContent:"space-between",gap:1,get backgroundColor(){return item.backgroundColor()
5812
+ },flexDirection:"row",justifyContent:"space-between",gap:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5792
5813
  },get onMouseOver(){return item.onMouseOver
5793
5814
  },get onMouseOut(){return item.onMouseOut
5794
5815
  },onMouseUp:(event)=>{event.stopPropagation()
@@ -5802,15 +5823,14 @@ _$setProp(_el$,"wrapMode","none")
5802
5823
  _$setProp(_el$,"truncate",true)
5803
5824
  _$insert(_el$,()=>props.bucket,_el$2)
5804
5825
  _$insert(_el$,()=>props.count,_el$3)
5805
- _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():theme().textMuted,_$p))
5826
+ _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():props.api.theme.current.textMuted,_$p))
5806
5827
  return _el$
5807
- })(),(()=>{var _el$4=_$createElement("text")
5828
+ })(),(()=>{var _el$4=_$createElement("text"),_el$5=_$createElement("b")
5829
+ _$insertNode(_el$4,_el$5)
5808
5830
  _$setProp(_el$4,"flexShrink",0)
5809
5831
  _$setProp(_el$4,"wrapMode","none")
5810
- _$insert(_el$4,(()=>{var _c$=_$memo(()=>!!props.action)
5811
- return()=>_c$()?`${icons.icon(props.action === "connect" ? "connected" : "disconnected")} ${props.action === "connect" ? "Connect" : "Disconnect"}`:""
5812
- })())
5813
- _$effect((_$p)=>_$setProp(_el$4,"fg",item.focused()?item.foregroundColor():props.disabled?theme().textMuted:theme().accent,_$p))
5832
+ _$insert(_el$5,()=>icons.icon(mcpToggle(props.status,false)))
5833
+ _$effect((_$p)=>_$setProp(_el$4,"fg",item.focused()?item.foregroundColor():mcpColor(props.api,props.status),_$p))
5814
5834
  return _el$4
5815
5835
  })()]
5816
5836
  }})
@@ -5822,19 +5842,6 @@ return _el$4
5822
5842
 
5823
5843
 
5824
5844
 
5825
- function mcpColor(api,status){const theme=api.theme.current
5826
- if(status==="connected")
5827
- return theme.success
5828
- if(status==="failed"||status==="needs_client_registration")
5829
- return theme.error
5830
- if(status==="needs_auth")
5831
- return theme.warning
5832
- return theme.textMuted
5833
- }
5834
- function mcpToggle(status,busy){if(busy||status==="pending")
5835
- return "pending"
5836
- return status==="connected"?"connected":"disconnected"
5837
- }
5838
5845
 
5839
5846
 
5840
5847
 
@@ -5899,25 +5906,70 @@ return _el$8
5899
5906
  return _el$5
5900
5907
  })()
5901
5908
  }
5902
- function McpRow(props){const icons=useIcons()
5903
- const dialogs=useDialogs(props.api)
5904
- const theme=()=>props.api.theme.current
5909
+
5910
+
5911
+
5912
+ function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5913
+ }=input
5914
+ const id=`${input.id}.favorite`
5915
+ const [rowHovered,setRowHovered]=createSignal23(false)
5916
+ const [controlHovered,setControlHovered]=createSignal23(false)
5917
+ const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5918
+ }),disabled,activate:()=>{onToggle()
5919
+ queueMicrotask(()=>interaction?.select(id))
5920
+ }},()=>api.theme.current.warning,"control")
5921
+ const visible=()=>favorite()||row.focused()||control.focused()||rowHovered()||controlHovered()
5922
+ return{onRowOver:()=>{row.onMouseOver()
5923
+ setRowHovered(true)
5924
+ },onRowOut:()=>{row.onMouseOut()
5925
+ setRowHovered(false)
5926
+ },render:()=>_$createComponent(BookmarkControl,{ref:(node)=>control.ref(node),id,get bookmarked(){return favorite()
5927
+ },visible,get backgroundColor(){return _$memo(()=>control.backgroundColor()==="transparent")()?row.backgroundColor():control.backgroundColor()
5928
+ },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():control.foregroundColor()
5929
+ },onMouseOver:()=>{control.onMouseOver()
5930
+ setControlHovered(true)
5931
+ },onMouseOut:()=>{control.onMouseOut()
5932
+ setControlHovered(false)
5933
+ },onMouseUp:(event)=>control.activate(event)
5934
+ })
5935
+ }}
5936
+
5937
+
5938
+
5939
+
5940
+
5941
+
5942
+ var Context=createContext3()
5943
+ function useSidebarList(){const value=useContext3(Context)
5944
+ if(!value)
5945
+ throw new Error("No sidebar list")
5946
+ return value
5947
+ }
5948
+ function SidebarRowList(props){return _$createComponent(Context.Provider,{get value(){return{api:props.api,interaction:props.interaction,grouped:props.grouped??(()=>false)
5949
+ }},get children(){var _el$=_$createElement("box")
5950
+ _$insert(_el$,()=>props.children)
5951
+ _$effect((_$p)=>_$setProp(_el$,"gap",props.density==="comfortable"?1:0,_$p))
5952
+ return _el$
5953
+ }})
5954
+ }
5955
+ function McpRow(props){const{api,interaction,grouped
5956
+ }=useSidebarList()
5957
+ const icons=useIcons()
5958
+ const dialogs=useDialogs(api)
5959
+ const theme=()=>api.theme.current
5905
5960
  const busy=()=>props.state.status==="loading"||props.state.status==="refreshing"
5906
5961
  const error=()=>props.state.error
5907
5962
  const disabled=()=>props.disabled||busy()
5908
5963
  const id=()=>`${PLUGIN_ID}.mcp.${props.item.name}`
5909
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>({...props.position,column:0
5964
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
5910
5965
  }),disabled,activate:props.onToggle
5911
5966
  })
5912
- const bookmark=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:2
5913
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
5914
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
5915
- }},()=>theme().warning,"control")
5916
- const info=useSidebarItem(props.api,props.interaction,{id:`${id()}.info`,position:()=>({...props.position,column:1
5967
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
5968
+ })
5969
+ const info=useSidebarItem(api,interaction,{id:`${id()}.info`,position:()=>({...props.position,column:2
5917
5970
  }),activate:()=>{if(!props.item.error)
5918
5971
  return
5919
- dialogs.open(()=>_$createComponent(McpErrorDialog,{get api(){return props.api
5920
- },get name(){return props.item.name
5972
+ dialogs.open(()=>_$createComponent(McpErrorDialog,{api,get name(){return props.item.name
5921
5973
  },get status(){return props.item.status
5922
5974
  },get error(){return props.item.error
5923
5975
  }}),"medium")
@@ -5925,12 +5977,14 @@ dialogs.open(()=>_$createComponent(McpErrorDialog,{get api(){return props.api
5925
5977
  const nestedBackground=(background)=>background==="transparent"?row.backgroundColor():background
5926
5978
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
5927
5979
  },get backgroundColor(){return row.backgroundColor()
5928
- },paddingLeft:1,paddingRight:1,get paddingTop(){return error()?1:0
5980
+ },get paddingLeft(){return grouped()?0:1
5981
+ },paddingRight:1,contentGap:0,get paddingTop(){return error()?1:0
5929
5982
  },get paddingBottom(){return error()?1:0
5930
5983
  },get marginTop(){return props.separator?1:0
5931
- },get onMouseOver(){return row.onMouseOver
5932
- },get onMouseOut(){return row.onMouseOut
5933
- },onMouseDown:(event)=>row.activate(event),get content(){return(()=>{var _el$=_$createElement("text")
5984
+ },get onMouseOver(){return bookmark.onRowOver
5985
+ },get onMouseOut(){return bookmark.onRowOut
5986
+ },onMouseDown:(event)=>row.activate(event),get leading(){return bookmark.render()
5987
+ },get content(){return(()=>{var _el$=_$createElement("text")
5934
5988
  _$setProp(_el$,"flexGrow",1)
5935
5989
  _$setProp(_el$,"wrapMode","none")
5936
5990
  _$insert(_el$,()=>props.item.name)
@@ -5942,8 +5996,6 @@ _$insertNode(_el$2,_el$3)
5942
5996
  _$setProp(_el$2,"flexDirection","row")
5943
5997
  _$setProp(_el$2,"flexShrink",0)
5944
5998
  _$setProp(_el$2,"gap",1)
5945
- _$insertNode(_el$3,_el$4)
5946
- _$insert(_el$4,()=>icons.icon(mcpToggle(props.item.status,busy())))
5947
5999
  _$insert(_el$2,(()=>{var _c$=_$memo(()=>!!props.item.error)
5948
6000
  return()=>_c$()?_$createComponent(IconControl,{ref:(node)=>info.ref(node),get id(){return `${id()}.info`
5949
6001
  },get icon(){return icons.icon("info")
@@ -5953,21 +6005,13 @@ return()=>_c$()?_$createComponent(IconControl,{ref:(node)=>info.ref(node),get id
5953
6005
  },get onMouseOut(){return info.onMouseOut
5954
6006
  },onMouseUp:(event)=>info.activate(event)
5955
6007
  }):null
5956
- })(),null)
5957
- _$insert(_el$2,_$createComponent(BookmarkControl,{ref:(node)=>bookmark.ref(node),get id(){return `${id()}.favorite`
5958
- },get bookmarked(){return props.favorite
5959
- },get backgroundColor(){return nestedBackground(bookmark.backgroundColor())
5960
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():bookmark.foregroundColor()
5961
- },get onMouseOver(){return bookmark.onMouseOver
5962
- },get onMouseOut(){return bookmark.onMouseOut
5963
- },onMouseUp:(event)=>bookmark.activate(event)
5964
- }),null)
5965
- _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():mcpColor(props.api,props.item.status),_$p))
6008
+ })(),_el$3)
6009
+ _$insertNode(_el$3,_el$4)
6010
+ _$insert(_el$4,()=>icons.icon(mcpToggle(props.item.status,busy())))
6011
+ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():mcpColor(api,props.item.status),_$p))
5966
6012
  return _el$2
5967
6013
  })()
5968
- },get details(){return _$createComponent(RequestErrorRow,{get api(){return props.api
5969
- },get interaction(){return props.interaction
5970
- },get id(){return `${id()}.retry`
6014
+ },get details(){return _$createComponent(RequestErrorRow,{api,interaction,get id(){return `${id()}.retry`
5971
6015
  },get position(){return{...props.position,row:props.position.row + 1,column:0
5972
6016
  }},get state(){return props.state
5973
6017
  },get onRetry(){return props.onRetry
@@ -5985,7 +6029,7 @@ return _el$2
5985
6029
  function SectionFilter(props){const icons=useIcons()
5986
6030
  let input
5987
6031
  let unregisterInput
5988
- const [inputFocused,setInputFocused]=createSignal23(false)
6032
+ const [inputFocused,setInputFocused]=createSignal24(false)
5989
6033
  const theme=()=>props.api.theme.current
5990
6034
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5991
6035
  },activate:()=>{if(!input)
@@ -6054,16 +6098,6 @@ return _el$3
6054
6098
  }})]
6055
6099
  }})
6056
6100
  }
6057
-
6058
-
6059
-
6060
-
6061
- function SidebarRowList(props){return(()=>{var _el$=_$createElement("box")
6062
- _$insert(_el$,()=>props.children)
6063
- _$effect((_$p)=>_$setProp(_el$,"gap",props.density==="comfortable"?1:0,_$p))
6064
- return _el$
6065
- })()
6066
- }
6067
6101
  function McpSectionContent(props){const model=props.model
6068
6102
  return _$createComponent(SectionRequestBody,{get api(){return props.api
6069
6103
  },get interaction(){return props.interaction
@@ -6089,22 +6123,23 @@ _$insertNode(_el$2,_$createTextNode(`No matching MCP servers`))
6089
6123
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6090
6124
  return _el$2
6091
6125
  })()
6092
- },get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6126
+ },get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6127
+ },get interaction(){return props.interaction
6128
+ },get grouped(){return model.grouped
6129
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6093
6130
  },get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
6094
6131
  },children:(item,index)=>[_$createComponent(Show14,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6095
6132
  },get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
6096
6133
  },get interaction(){return props.interaction
6097
6134
  },get bucket(){return item.bucket
6098
6135
  },get count(){return model.groupNames(item.bucket).length
6099
- },get action(){return model.groupAction(item.bucket)
6136
+ },get status(){return model.groupStatus(item.bucket)
6100
6137
  },get disabled(){return model.bulkRunning()||model.mutationRunning()
6101
6138
  },get marginTop(){return index()>0?1:0
6102
6139
  },get position(){return{section:props.navigationSection,row:9 + index()*3,column:0
6103
6140
  }},onToggle:()=>void props.controller.toggleGroup(item.bucket,model.groupNames(item.bucket),model.target())
6104
6141
  })
6105
- }}),_$createComponent(McpRow,{get api(){return props.api
6106
- },get interaction(){return props.interaction
6107
- },item,get position(){return{section:props.navigationSection,row:10 + index()*3,column:0
6142
+ }}),_$createComponent(McpRow,{item,get position(){return{section:props.navigationSection,row:10 + index()*3,column:0
6108
6143
  }},get state(){return props.controller.serverState(item.name,model.target())
6109
6144
  },get disabled(){return model.bulkRunning()
6110
6145
  },onToggle:()=>void props.controller.toggle(item.name).catch(()=>{}),onRetry:()=>void props.controller.retryServer(item.name,model.target())?.catch(()=>{}),get favorite(){return model.favorites().has(item.name)
@@ -6124,7 +6159,7 @@ return _el$
6124
6159
  }})
6125
6160
  }
6126
6161
  function McpSection(props){const icons=useIcons()
6127
- const [query,setQuery]=createSignal24("")
6162
+ const [query,setQuery]=createSignal25("")
6128
6163
  const model=createMcpSectionModel(props,query)
6129
6164
  const navigationSection=()=>props.navigationSection??6
6130
6165
  const summary=createMemo13(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -6159,48 +6194,46 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6159
6194
 
6160
6195
 
6161
6196
 
6162
- function QuickActionRow(props){const icons=useIcons()
6163
- const theme=()=>props.api.theme.current
6164
- const [width,setWidth]=createSignal25(0)
6165
- const shortcut=createMemo14(()=>{const bindings=props.api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6197
+ function QuickActionRow(props){const{api,interaction
6198
+ }=useSidebarList()
6199
+ const icons=useIcons()
6200
+ const theme=()=>api.theme.current
6201
+ const [width,setWidth]=createSignal26(0)
6202
+ const shortcut=createMemo14(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6166
6203
  })
6167
- return props.api.keys.formatBindings(bindings.get(props.action.command))
6204
+ return api.keys.formatBindings(bindings.get(props.action.command))
6168
6205
  })
6169
6206
  const visibleShortcut=createMemo14(()=>{const value=shortcut()
6170
- return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 9?value:undefined
6207
+ return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 8?value:undefined
6171
6208
  })
6172
6209
  function run(){if(props.action.command==="session.new"&&props.onNewSession?.())
6173
6210
  return
6174
- const result=props.interaction?props.interaction.dispatchFromReturnTarget(props.action.command):props.api.keymap.dispatchCommand(props.action.command)
6211
+ const result=interaction?interaction.dispatchFromReturnTarget(props.action.command):api.keymap.dispatchCommand(props.action.command)
6175
6212
  if(result.ok)
6176
6213
  return
6177
- props.api.ui.toast({variant:"warning",title:props.action.label,message:`Command is ${result.reason}`,duration:3000
6214
+ api.ui.toast({variant:"warning",title:props.action.label,message:`Command is ${result.reason}`,duration:3000
6178
6215
  })
6179
6216
  }
6180
6217
  const id=()=>`${PLUGIN_ID}.quick-action.${props.action.command}`
6181
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,activate:run,disabled:()=>Boolean(props.disabled)
6218
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
6219
+ }),activate:run,disabled:()=>Boolean(props.disabled)
6220
+ })
6221
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
6182
6222
  })
6183
- const favorite=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:1
6184
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
6185
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
6186
- }},()=>theme().warning,"control")
6187
- const controlBackground=()=>{const background=favorite.backgroundColor()
6188
- return background==="transparent"?row.backgroundColor():background
6189
- }
6190
6223
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6191
6224
  },paddingLeft:1,paddingRight:1,get marginTop(){return props.separator?1:0
6192
6225
  },onSizeChange:function(){setWidth(this.width)
6193
6226
  },get backgroundColor(){return row.backgroundColor()
6194
- },get onMouseOver(){return row.onMouseOver
6195
- },get onMouseOut(){return row.onMouseOut
6227
+ },get onMouseOver(){return bookmark.onRowOver
6228
+ },get onMouseOut(){return bookmark.onRowOut
6196
6229
  },onMouseUp:(event)=>{event.stopPropagation()
6197
6230
  row.activate(event)
6198
- },get leading(){return(()=>{var _el$=_$createElement("text")
6231
+ },get leading(){return [_$memo(()=>bookmark.render()),(()=>{var _el$=_$createElement("text")
6199
6232
  _$setProp(_el$,"flexShrink",0)
6200
6233
  _$insert(_el$,()=>icons.action(props.action.command))
6201
6234
  _$effect((_$p)=>_$setProp(_el$,"fg",props.disabled?theme().textMuted:row.focused()?row.foregroundColor():theme().accent,_$p))
6202
6235
  return _el$
6203
- })()
6236
+ })()]
6204
6237
  },get content(){return(()=>{var _el$2=_$createElement("text")
6205
6238
  _$setProp(_el$2,"flexGrow",1)
6206
6239
  _$setProp(_el$2,"wrapMode","none")
@@ -6226,14 +6259,6 @@ _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():theme()
6226
6259
  return _el$4
6227
6260
  })()
6228
6261
  })
6229
- },get trailing(){return _$createComponent(BookmarkControl,{ref:(node)=>favorite.ref(node),get id(){return `${id()}.favorite`
6230
- },get bookmarked(){return props.favorite
6231
- },get backgroundColor(){return controlBackground()
6232
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():favorite.foregroundColor()
6233
- },get onMouseOver(){return favorite.onMouseOver
6234
- },get onMouseOut(){return favorite.onMouseOut
6235
- },onMouseUp:(event)=>favorite.activate(event)
6236
- })
6237
6262
  }})
6238
6263
  }
6239
6264
  function QuickActionsSection(props){const commandRevision=createQuickActionRevision(props.api)
@@ -6251,16 +6276,16 @@ return _$createComponent(Section,{get api(){return props.api
6251
6276
  },sectionId:`${PLUGIN_ID}.section.quick_actions`,get navigationSection(){return navigationSection()
6252
6277
  },title:"QUICK ACTIONS",section:"quick_actions",get summary(){return String(actions().length)
6253
6278
  },get open(){return props.preferences.expanded().quick_actions
6254
- },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6279
+ },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6280
+ },get interaction(){return props.interaction
6281
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6255
6282
  },get children(){return [_$createComponent(Show16,{get when(){return actions().length===0
6256
6283
  },get children(){var _el$=_$createElement("text")
6257
6284
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6258
6285
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6259
6286
  return _el$
6260
6287
  }}),_$createComponent(For14,{get each(){return visibility.visible()
6261
- },children:(action,index)=>_$createComponent(QuickActionRow,{get api(){return props.api
6262
- },get interaction(){return props.interaction
6263
- },get onNewSession(){return props.onNewSession
6288
+ },children:(action,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6264
6289
  },action,get disabled(){return action.disabled
6265
6290
  },get favorite(){return props.preferences.favoriteQuickActions?.().has(action.command)??false
6266
6291
  },get favoriteDisabled(){return _$memo(()=>!!props.preferences.ready)()?!props.preferences.ready():false
@@ -6439,49 +6464,36 @@ return{target,recent,grouped,list,filtered,visibility,state,useSkill,skillGroup}
6439
6464
 
6440
6465
 
6441
6466
 
6442
- function SkillRow(props){const icons=useIcons()
6443
- const theme=()=>props.api.theme.current
6467
+ function SkillRow(props){const{api,interaction,grouped
6468
+ }=useSidebarList()
6469
+ const icons=useIcons()
6444
6470
  const id=()=>`${PLUGIN_ID}.skill.${props.item.location || props.item.name}`
6445
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>({...props.position,column:0
6471
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
6446
6472
  }),activate:props.onUse
6447
6473
  })
6448
- const favorite=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:1
6449
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
6450
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
6451
- }},()=>theme().warning,"control")
6452
- const controlBackground=()=>{const background=favorite.backgroundColor()
6453
- return background==="transparent"?row.backgroundColor():background
6454
- }
6474
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
6475
+ })
6455
6476
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6456
- },paddingLeft:1,paddingRight:1,get marginTop(){return props.separator?1:0
6477
+ },get paddingLeft(){return grouped()?0:1
6478
+ },paddingRight:1,contentGap:0,get marginTop(){return props.separator?1:0
6457
6479
  },get backgroundColor(){return row.backgroundColor()
6458
- },get onMouseOver(){return row.onMouseOver
6459
- },get onMouseOut(){return row.onMouseOut
6460
- },onMouseUp:(event)=>row.activate(event),get leading(){return(()=>{var _el$=_$createElement("text")
6461
- _$setProp(_el$,"flexShrink",0)
6462
- _$insert(_el$,()=>icons.icon(props.recent?"recent":"skills"))
6463
- _$effect((_$p)=>_$setProp(_el$,"fg",row.focused()?row.foregroundColor():theme().accent,_$p))
6480
+ },get onMouseOver(){return bookmark.onRowOver
6481
+ },get onMouseOut(){return bookmark.onRowOut
6482
+ },onMouseUp:(event)=>row.activate(event),get leading(){return bookmark.render()
6483
+ },get content(){return(()=>{var _el$=_$createElement("text")
6484
+ _$setProp(_el$,"flexGrow",1)
6485
+ _$setProp(_el$,"wrapMode","word")
6486
+ _$insert(_el$,(()=>{var _c$=_$memo(()=>!!props.recent)
6487
+ return()=>_c$()?`${icons.icon("recent")} `:""
6488
+ })(),null)
6489
+ _$insert(_el$,()=>props.item.name,null)
6490
+ _$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
6464
6491
  return _el$
6465
6492
  })()
6466
- },get content(){return(()=>{var _el$2=_$createElement("text")
6467
- _$setProp(_el$2,"flexGrow",1)
6468
- _$setProp(_el$2,"wrapMode","word")
6469
- _$insert(_el$2,()=>props.item.name)
6470
- _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6471
- return _el$2
6472
- })()
6473
- },get trailing(){return _$createComponent(BookmarkControl,{ref:(node)=>favorite.ref(node),get id(){return `${id()}.favorite`
6474
- },get bookmarked(){return props.favorite
6475
- },get backgroundColor(){return controlBackground()
6476
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():favorite.foregroundColor()
6477
- },get onMouseOver(){return favorite.onMouseOver
6478
- },get onMouseOut(){return favorite.onMouseOut
6479
- },onMouseUp:(event)=>favorite.activate(event)
6480
- })
6481
6493
  }})
6482
6494
  }
6483
6495
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6484
- const [query,setQuery]=createSignal26("")
6496
+ const [query,setQuery]=createSignal27("")
6485
6497
  const model=createSkillSectionModel(props,query)
6486
6498
  const navigationSection=()=>props.navigationSection??3
6487
6499
  function selectSkill(item){if(!props.preferences.shouldConfirmSkill(item)){model.useSkill(item)
@@ -6520,7 +6532,10 @@ _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6520
6532
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6521
6533
  return _el$2
6522
6534
  })()
6523
- },get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6535
+ },get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6536
+ },get interaction(){return props.interaction
6537
+ },get grouped(){return model.grouped
6538
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6524
6539
  },get children(){return _$createComponent(For15,{get each(){return model.visibility.visible()
6525
6540
  },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6526
6541
  },get children(){var _el$4=_$createElement("text")
@@ -6535,9 +6550,7 @@ return _p$
6535
6550
  },{e:undefined,t:undefined
6536
6551
  })
6537
6552
  return _el$4
6538
- }}),_$createComponent(SkillRow,{get api(){return props.api
6539
- },get interaction(){return props.interaction
6540
- },item,get position(){return{section:navigationSection(),row:10 + index()*(model.grouped()?2:1),column:0
6553
+ }}),_$createComponent(SkillRow,{item,get position(){return{section:navigationSection(),row:10 + index()*(model.grouped()?2:1),column:0
6541
6554
  }},onUse:()=>selectSkill(item),get recent(){return model.recent().has(item.location)
6542
6555
  },get favorite(){return props.preferences.isFavoriteSkill?.(item)??false
6543
6556
  },get favoriteDisabled(){return props.preferences.ready?.()===false
@@ -6569,8 +6582,8 @@ return _el$
6569
6582
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6570
6583
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6571
6584
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6572
- const [query,setQuery]=createSignal27("")
6573
- const [mode,setMode]=createSignal27("all")
6585
+ const [query,setQuery]=createSignal28("")
6586
+ const [mode,setMode]=createSignal28("all")
6574
6587
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6575
6588
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6576
6589
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
@@ -6614,18 +6627,20 @@ return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentI
6614
6627
 
6615
6628
 
6616
6629
 
6617
- function SubagentRow(props){const icons=useIcons()
6618
- const theme=()=>props.api.theme.current
6630
+ function SubagentRow(props){const{api,interaction
6631
+ }=useSidebarList()
6632
+ const icons=useIcons()
6633
+ const theme=()=>api.theme.current
6619
6634
  const retrying=()=>props.item.status.type==="retry"
6620
6635
  const idle=()=>props.item.status.type==="idle"
6621
6636
  const failed=()=>props.item.run?.outcome==="error"
6622
6637
  const cancelled=()=>props.item.run?.outcome==="cancelled"
6623
6638
  const id=()=>`${PLUGIN_ID}.subagent.${props.item.session.id}`
6624
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,activate:props.onOpen
6639
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>props.position,activate:props.onOpen
6625
6640
  })
6626
6641
  const leadingColor=()=>row.focused()?row.foregroundColor():failed()?theme().error:retrying()||props.item.unavailable?theme().warning:idle()?theme().textMuted:theme().primary
6627
6642
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6628
- },paddingLeft:1,paddingRight:1,get backgroundColor(){return row.backgroundColor()
6643
+ },paddingLeft:2,paddingRight:1,get backgroundColor(){return row.backgroundColor()
6629
6644
  },get onMouseOver(){return row.onMouseOver
6630
6645
  },get onMouseOut(){return row.onMouseOut
6631
6646
  },onMouseDown:(event)=>row.activate(event),get leading(){return(()=>{var _el$=_$createElement("text")
@@ -6682,7 +6697,9 @@ return _el$8
6682
6697
  }})]
6683
6698
  }})
6684
6699
  }
6685
- function SubagentList(props){return _$createComponent(SidebarRowList,{get density(){return props.density
6700
+ function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
6701
+ },get interaction(){return props.interaction
6702
+ },get density(){return props.density
6686
6703
  },get children(){return _$createComponent(For16,{get each(){return props.ids
6687
6704
  },children:(id,index)=>{const initial=props.itemById(id)
6688
6705
  const item=()=>props.itemById(id)??initial
@@ -6695,9 +6712,7 @@ _$insert(_el$3,()=>item().group)
6695
6712
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6696
6713
  return _el$2
6697
6714
  }}),null)
6698
- _$insert(_el$,_$createComponent(SubagentRow,{get api(){return props.api
6699
- },get interaction(){return props.interaction
6700
- },get item(){return item()
6715
+ _$insert(_el$,_$createComponent(SubagentRow,{get item(){return item()
6701
6716
  },get now(){return props.now
6702
6717
  },get position(){return{section:props.navigationSection,row:10 + index(),column:0
6703
6718
  }},onOpen:()=>props.controller.open(id)
@@ -6802,8 +6817,10 @@ return _el$
6802
6817
 
6803
6818
 
6804
6819
 
6805
- function TodoRow(props){const icons=useIcons()
6806
- const theme=()=>props.api.theme.current
6820
+ function TodoRow(props){const{api
6821
+ }=useSidebarList()
6822
+ const icons=useIcons()
6823
+ const theme=()=>api.theme.current
6807
6824
  const done=()=>props.item.status==="completed"
6808
6825
  const active=()=>props.item.status==="in_progress"
6809
6826
  const cancelled=()=>props.item.status==="cancelled"
@@ -6826,6 +6843,7 @@ _$insertNode(_el$,_el$2)
6826
6843
  _$insertNode(_el$,_el$3)
6827
6844
  _$setProp(_el$,"flexDirection","row")
6828
6845
  _$setProp(_el$,"gap",1)
6846
+ _$setProp(_el$,"paddingLeft",2)
6829
6847
  _$setProp(_el$2,"flexShrink",0)
6830
6848
  _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":"idle"))
6831
6849
  _$setProp(_el$3,"flexGrow",1)
@@ -6871,7 +6889,9 @@ _$insert(_el$,_$createComponent(Show22,{get when(){return props.view.rows.length
6871
6889
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6872
6890
  },get mode(){return props.mode
6873
6891
  }})
6874
- },get children(){return _$createComponent(SidebarRowList,{get density(){return props.density
6892
+ },get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
6893
+ },get interaction(){return props.interaction
6894
+ },get density(){return props.density
6875
6895
  },get children(){return _$createComponent(For18,{get each(){return props.visibility.visible()
6876
6896
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6877
6897
  return(()=>{var _el$3=_$createElement("box")
@@ -6882,8 +6902,7 @@ _$insert(_el$5,()=>row.group)
6882
6902
  _$effect((_$p)=>_$setProp(_el$4,"fg",props.api.theme.current.textMuted,_$p))
6883
6903
  return _el$4
6884
6904
  }}),null)
6885
- _$insert(_el$3,_$createComponent(TodoRow,{get api(){return props.api
6886
- },get item(){return row.item
6905
+ _$insert(_el$3,_$createComponent(TodoRow,{get item(){return row.item
6887
6906
  }}),null)
6888
6907
  _$effect((_$p)=>_$setProp(_el$3,"marginTop",index()>0&&startsGroup()?1:0,_$p))
6889
6908
  return _el$3
@@ -6938,7 +6957,7 @@ function TodoSection(props){const list=createMemo18(()=>props.controller.list(pr
6938
6957
  const icons=useIcons()
6939
6958
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6940
6959
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6941
- const [mode,setMode]=createSignal28("all")
6960
+ const [mode,setMode]=createSignal29("all")
6942
6961
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6943
6962
  createEffect17(()=>{targetKey()
6944
6963
  setMode("all")
@@ -7256,7 +7275,7 @@ return false
7256
7275
  }
7257
7276
  function enabled(value){return typeof value==="function"?value():value!==false
7258
7277
  }
7259
- function createV2Keymap(context){const [revision,setRevision]=createSignal29(0)
7278
+ function createV2Keymap(context){const [revision,setRevision]=createSignal30(0)
7260
7279
  const layers=new Map
7261
7280
  let sequence=0
7262
7281
  function layerActive(layer){const mode=layer.mode??"base"
@@ -7549,7 +7568,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7549
7568
  },interaction,skills,subagents,mcp
7550
7569
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7551
7570
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7552
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.1"
7571
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.3"
7553
7572
  }),_$createComponent(McpPersistence,{api,controller:mcp
7554
7573
  })]
7555
7574
  }})
@@ -7579,12 +7598,12 @@ throw result.error
7579
7598
  }
7580
7599
  return result.data?.type==="text"?result.data.content:undefined
7581
7600
  })
7582
- const versionStatus=createVersionStatus(api,"0.19.1")
7583
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.1"))
7601
+ const versionStatus=createVersionStatus(api,"0.19.3")
7602
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.3"))
7584
7603
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7585
7604
  },get multilineCorners(){return preferences.cornerFont
7586
7605
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7587
- },navigatorVersion:"0.19.1",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7606
+ },navigatorVersion:"0.19.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7588
7607
  },get onNavigatorUpdate(){return versionUpdates.navigator
7589
7608
  }})
7590
7609
  }})
@@ -7598,15 +7617,15 @@ return
7598
7617
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7599
7618
  }))
7600
7619
  },todo)
7601
- const versionStatus=createVersionStatus(adapter.api,"0.19.1")
7602
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.1"))
7620
+ const versionStatus=createVersionStatus(adapter.api,"0.19.3")
7621
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.3"))
7603
7622
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7604
7623
  },get multilineCorners(){return preferences.cornerFont
7605
7624
  },get children(){var _el$=_$createElement("box")
7606
7625
  _$setProp(_el$,"flexDirection","row")
7607
7626
  _$setProp(_el$,"justifyContent","space-between")
7608
7627
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7609
- },navigatorVersion:"0.19.1",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7628
+ },navigatorVersion:"0.19.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7610
7629
  },get onNavigatorUpdate(){return versionUpdates.navigator
7611
7630
  }}),null)
7612
7631
  _$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.19.1",
4
+ "version": "0.19.3",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",