opencode-navigator 0.23.0 → 0.24.0

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/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,onCleanup as onCleanup2,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup3,createEffect as createEffect4,Show,splitProps as splitProps3,Suspense,lazy,createSignal as createSignal4,createSignal as createSignal5,onCleanup as onCleanup4,Show as Show2,batch,createSignal as createSignal7,createSignal as createSignal6,createEffect as createEffect5,createSignal as createSignal8,onCleanup as onCleanup5,createSignal as createSignal9,createSignal as createSignal10,Suspense as Suspense2,lazy as lazy2,Index,onCleanup as onCleanup6,createSignal as createSignal11,onCleanup as onCleanup7,createEffect as createEffect7,onCleanup as onCleanup9,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal12,onCleanup as onCleanup8,onMount,For as For2,For as For3,Show as Show3,createMemo as createMemo2,Show as Show4,createSignal as createSignal13,onCleanup as onCleanup10,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 Show6,createEffect as createEffect8,createSignal as createSignal14,onCleanup as onCleanup11,Show as Show5,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup12,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,Suspense as Suspense3,lazy as lazy3,onCleanup as onCleanup13,createEffect as createEffect11,onCleanup as onCleanup14,createSignal as createSignal15,createMemo as createMemo7,createSignal as createSignal16,lazy as lazy4,Show as Show9,For as For10,Show as Show8,Show as Show7,createEffect as createEffect12,onCleanup as onCleanup15,onMount as onMount4,onCleanup as onCleanup16,onMount as onMount5,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show10,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup17,For as For12,Show as Show13,createMemo as createMemo9,createComputed,createMemo as createMemo8,createSignal as createSignal21,untrack as untrack3,Show as Show11,createComputed as createComputed2,untrack as untrack4,Show as Show12,createSignal as createSignal23,createEffect as createEffect13,createSignal as createSignal22,on,createMemo as createMemo11,createSignal as createSignal26,createMemo as createMemo10,For as For13,Show as Show17,Show as Show14,Show as Show15,createSignal as createSignal24,createContext as createContext3,useContext as useContext3,Show as Show16,createSignal as createSignal25,onCleanup as onCleanup18,Show as Show23,createSignal as createSignal27,untrack as untrack5,createSignal as createSignal28,createSignal as createSignal29,createEffect as createEffect14,For as For15,Show as Show18,For as For14,createSignal as createSignal30,Show as Show19,Show as Show20,Show as Show21,Show as Show22,For as For16,Show as Show25,createMemo as createMemo13,Show as Show24,createMemo as createMemo12,createSignal as createSignal31,createContext as createContext4,useContext as useContext4,Show as Show26,Suspense as Suspense4,createEffect as createEffect15,onCleanup as onCleanup19,untrack as untrack6,For as For22,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup25,For as For17,Show as Show27,createMemo as createMemo15,createSignal as createSignal33,createEffect as createEffect16,createMemo as createMemo14,onCleanup as onCleanup20,untrack as untrack7,createEffect as createEffect17,createSignal as createSignal32,onCleanup as onCleanup21,For as For18,Show as Show29,createSignal as createSignal34,createEffect as createEffect18,createMemo as createMemo16,onCleanup as onCleanup22,untrack as untrack8,Show as Show28,For as For20,Show as Show32,createEffect as createEffect19,createMemo as createMemo17,createSignal as createSignal35,onCleanup as onCleanup23,untrack as untrack9,For as For19,Show as Show31,Show as Show30,Show as Show36,createEffect as createEffect20,createMemo as createMemo18,createSignal as createSignal36,onCleanup as onCleanup24,untrack as untrack10,For as For21,Show as Show34,Show as Show33,Show as Show35,createEffect as createEffect21,createMemo as createMemo20,onCleanup as onCleanup26,untrack as untrack11,Show as Show37,createMemo as createMemo21,onCleanup as onCleanup27,createEffect as createEffect22,createMemo as createMemo22,on as on2,onCleanup as onCleanup28,createRoot,createSignal as createSignal37,getOwner,createSignal as createSignal38,onCleanup as onCleanup29,onMount as onMount6} from "solid-js"
6
+ import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,onCleanup as onCleanup2,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup3,Show,createEffect as createEffect4,Show as Show2,splitProps as splitProps3,createEffect as createEffect5,createSignal as createSignal4,onCleanup as onCleanup4,onMount,Suspense,lazy,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup5,Show as Show3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect6,createSignal as createSignal9,onCleanup as onCleanup6,createSignal as createSignal10,createSignal as createSignal11,Suspense as Suspense2,lazy as lazy2,Index,onCleanup as onCleanup7,createSignal as createSignal12,onCleanup as onCleanup8,createEffect as createEffect8,onCleanup as onCleanup10,batch as batch2,createEffect as createEffect7,createMemo,createSignal as createSignal13,onCleanup as onCleanup9,onMount as onMount2,For as For2,For as For3,Show as Show4,createMemo as createMemo2,Show as Show5,createSignal as createSignal14,onCleanup as onCleanup11,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount4,For as For7,createMemo as createMemo3,onMount as onMount3,Show as Show7,createEffect as createEffect9,createSignal as createSignal15,onCleanup as onCleanup12,Show as Show6,For as For6,For as For9,createEffect as createEffect10,createMemo as createMemo5,onCleanup as onCleanup13,createEffect as createEffect11,createMemo as createMemo6,untrack as untrack2,Suspense as Suspense3,lazy as lazy3,onCleanup as onCleanup14,createEffect as createEffect12,onCleanup as onCleanup15,createSignal as createSignal16,createMemo as createMemo7,createSignal as createSignal17,createSignal as createSignal18,lazy as lazy4,Show as Show10,For as For10,Show as Show9,Show as Show8,createEffect as createEffect13,onCleanup as onCleanup16,onMount as onMount5,onCleanup as onCleanup17,onMount as onMount6,For as For11,createSignal as createSignal19,createSignal as createSignal20,onCleanup as onCleanup18,createSignal as createSignal21,Show as Show11,createSignal as createSignal23,createSignal as createSignal22,onCleanup as onCleanup19,For as For12,Show as Show14,createMemo as createMemo9,createComputed,createMemo as createMemo8,createSignal as createSignal24,untrack as untrack3,Show as Show12,createComputed as createComputed2,untrack as untrack4,Show as Show13,createSignal as createSignal26,createEffect as createEffect14,createSignal as createSignal25,on,createMemo as createMemo11,createSignal as createSignal29,createMemo as createMemo10,For as For13,Show as Show18,Show as Show15,Show as Show16,createSignal as createSignal27,createContext as createContext3,useContext as useContext3,Show as Show17,createSignal as createSignal28,onCleanup as onCleanup20,Show as Show24,createSignal as createSignal30,untrack as untrack5,createSignal as createSignal31,createSignal as createSignal32,createEffect as createEffect15,For as For15,Show as Show19,For as For14,createSignal as createSignal33,Show as Show20,Show as Show21,Show as Show22,Show as Show23,For as For16,Show as Show26,createMemo as createMemo13,Show as Show25,createMemo as createMemo12,createSignal as createSignal34,createContext as createContext4,useContext as useContext4,Show as Show27,Suspense as Suspense4,createEffect as createEffect16,onCleanup as onCleanup21,untrack as untrack6,For as For22,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup27,For as For17,Show as Show29,createMemo as createMemo15,createSignal as createSignal36,createEffect as createEffect17,createMemo as createMemo14,onCleanup as onCleanup22,untrack as untrack7,Show as Show28,createEffect as createEffect18,createSignal as createSignal35,onCleanup as onCleanup23,For as For18,Show as Show31,createSignal as createSignal37,createEffect as createEffect19,createMemo as createMemo16,onCleanup as onCleanup24,untrack as untrack8,Show as Show30,For as For20,Show as Show34,createEffect as createEffect20,createMemo as createMemo17,createSignal as createSignal38,onCleanup as onCleanup25,untrack as untrack9,For as For19,Show as Show33,Show as Show32,Show as Show38,createEffect as createEffect21,createMemo as createMemo18,createSignal as createSignal39,onCleanup as onCleanup26,untrack as untrack10,For as For21,Show as Show36,Show as Show35,Show as Show37,createEffect as createEffect22,createMemo as createMemo20,onCleanup as onCleanup28,untrack as untrack11,Show as Show39,createMemo as createMemo21,onCleanup as onCleanup29,createEffect as createEffect23,createMemo as createMemo22,on as on2,onCleanup as onCleanup30,createRoot,createSignal as createSignal40,getOwner,createSignal as createSignal41,onCleanup as onCleanup31,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"
@@ -500,7 +500,7 @@ return changeMany({action:state.action,...state.preset&&{preset:state.preset},..
500
500
 
501
501
 
502
502
 
503
- var ICONS={limits:["\uDB80\uDE9A","%"],todo:["\uEAB3","[T]"],subagents:["\uEA7E","[A]"],skills:["\uEAA4","[S]"],actions:["\uEB9E","[Q]"],lsp:["\uEAC4","{}"],mcp:["\uEB2D","[M]"],sections:["\uEBEB","[]"],scope:["\uEB01","@"],presets:["\uEBD2","#"],settings:["\uEAF8","[=]"],reset:["\uEB37","R"],save:["\uEB4B","S"],add:["\uEA60","+"],edit:["\uEA73","[R]"],history:["\uEA82","[T]"],copy:["\uEBCC","[C]"],export:["\uEBAC","[E]"],compact:["\uEAF5","[-]"],checked:["\uEBB3","[x]"],unchecked:["\uEBB5","[ ]"],selected:["\uEAB6",">"],expanded:["\uEAB4","v"],collapsed:["\uEAB6",">"],radioOn:["\uEA71","(*)"],radioOff:["\uEABC","( )"],done:["\uEAB2","v"],busy:["\uEA71","*"],idle:["\uEABC","-"],close:["\uEA76","x"],error:["\uEA87","!"],retry:["\uEA77","~"],pending:["\uDB86\uDD78","..."],connected:["\uDB81\uDC3E","(*)"],disconnected:["\uDB81\uDC3D","( )"],favorite:["\uEB59","*"],favoriteEmpty:["\uEA6A","+"],bookmark:["\uDB80\uDCC0","*"],bookmarkEmpty:["\uDB80\uDCC3","+"],mcpFavorite:["\uDB80\uDCC0","*"],mcpFavoriteEmpty:["\uDB80\uDCC3","+"],recent:["\uEA82","~"],info:["\uEA74","i"],search:["\uEA6D","/"],update:["\uDB80\uDC5F","^"],up:["\uEAA1","^"],down:["\uEA9A","v"],left:["\uEA9B","<"],right:["\uEA9C",">"],keyEnter:["\uEBEA","enter"],keyTab:["\uDB80\uDF12","tab"],keyEscape:["\uDB84\uDEB7","esc"],keySpace:["\uDB84\uDC50","space"],delete:["\uEA81","del"],priorityMedium:["\uEA71","-"],help:["\uEB32","?"],selectionLeft:["\uE0B6"," "],selectionRight:["\uE0B4"," "],selectionTopLeft:["\uDBFC\uDC04"," "],selectionTopRight:["\uDBFC\uDC05"," "],selectionBottomLeft:["\uDBFC\uDC06"," "],selectionBottomRight:["\uDBFC\uDC07"," "]
503
+ var ICONS={limits:["\uDB80\uDE9A","%"],todo:["\uEAB3","[T]"],subagents:["\uEA7E","[A]"],skills:["\uEAA4","[S]"],actions:["\uEB9E","[Q]"],lsp:["\uEAC4","{}"],mcp:["\uEB2D","[M]"],sections:["\uEBEB","[]"],scope:["\uEB01","@"],presets:["\uEBD2","#"],settings:["\uEAF8","[=]"],reset:["\uEB37","R"],save:["\uEB4B","S"],add:["\uEA60","+"],edit:["\uEA73","[R]"],history:["\uEA82","[T]"],copy:["\uEBCC","[C]"],export:["\uEBAC","[E]"],compact:["\uEAF5","[-]"],checked:["\uEBB3","[x]"],unchecked:["\uEBB5","[ ]"],selected:["\uEAB6",">"],expanded:["\uEAB4","v"],collapsed:["\uEAB6",">"],radioOn:["\uEA71","(*)"],radioOff:["\uEABC","( )"],done:["\uEAB2","v"],busy:["\uEA71","*"],idle:["\uEABC","-"],close:["\uEA76","x"],error:["\uEA87","!"],retry:["\uEA77","~"],pending:["\uDB86\uDD78","..."],connected:["\uDB81\uDC3E","(*)"],disconnected:["\uDB81\uDC3D","( )"],favorite:["\uEB59","*"],favoriteEmpty:["\uEA6A","+"],bookmark:["\uDB80\uDCC0","*"],bookmarkEmpty:["\uDB80\uDCC3","+"],mcpFavorite:["\uDB80\uDCC0","*"],mcpFavoriteEmpty:["\uDB80\uDCC3","+"],recent:["\uEA82","~"],info:["\uEA74","i"],bug:["\uEAAF","b"],search:["\uEA6D","/"],update:["\uDB80\uDC5F","^"],up:["\uEAA1","^"],down:["\uEA9A","v"],left:["\uEA9B","<"],right:["\uEA9C",">"],keyEnter:["\uEBEA","enter"],keyTab:["\uDB80\uDF12","tab"],keyEscape:["\uDB84\uDEB7","esc"],keySpace:["\uDB84\uDC50","space"],delete:["\uEA81","del"],priorityMedium:["\uEA71","-"],help:["\uEB32","?"],selectionLeft:["\uE0B6"," "],selectionRight:["\uE0B4"," "],selectionTopLeft:["\uDBFC\uDC04"," "],selectionTopRight:["\uDBFC\uDC05"," "],selectionBottomLeft:["\uDBFC\uDC06"," "],selectionBottomRight:["\uDBFC\uDC07"," "]
504
504
  }
505
505
  function uiIcon(name,style="nerd"){return ICONS[name][style==="text"?1:0]
506
506
  }
@@ -514,7 +514,7 @@ return icon?uiIcon(icon,style):key
514
514
  }
515
515
  function sectionIcon(section,style="nerd"){return uiIcon(section==="quick_actions"?"actions":section,style)
516
516
  }
517
- var SETTINGS_ICONS={sections:"sections",scope:"scope",presets:"presets",behavior:"settings",defaults:"reset"
517
+ var SETTINGS_ICONS={sections:"sections",scope:"scope",presets:"presets",behavior:"settings",defaults:"reset",about:"info"
518
518
  }
519
519
  function settingsTabIcon(tab,style="nerd"){return uiIcon(SETTINGS_ICONS[tab],style)
520
520
  }
@@ -738,40 +738,36 @@ renderer.requestRender()
738
738
 
739
739
 
740
740
 
741
- import {BoxRenderable,RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes6,TextAttributes as TextAttributes7,RGBA as RGBA3,parseColor as parseColor2,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,TextAttributes as TextAttributes18} from "@opentui/core"
741
+ import {RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes6,TextAttributes as TextAttributes7,RGBA as RGBA3,parseColor as parseColor2,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,TextAttributes as TextAttributes18} from "@opentui/core"
742
742
 
743
- function selectionBackdrop(node){for(let parent=node.parent;parent; parent=parent.parent){if(parent instanceof BoxRenderable&&parent.backgroundColor.a>0)
743
+ var transparent=RGBA.fromInts(0,0,0,0)
744
+ function selectionBackdrop(node){for(let parent=node.parent;parent; parent=parent.parent){if("backgroundColor" in parent&&parent.backgroundColor instanceof RGBA&&parent.backgroundColor.a>0&&(!("shouldFill" in parent)||parent.shouldFill!==false))
744
745
  return parent.backgroundColor
745
746
  }
746
- return RGBA.fromValues(0,0,0,1)
747
+ return transparent
747
748
  }
749
+ function paintCorners(node,buffer,icons){const backdrop=selectionBackdrop(node)
750
+ if(node.backgroundColor.equals(backdrop))
751
+ return
752
+ const left=node.screenX
753
+ const right=left + node.width-1
754
+ const top=node.screenY
755
+ const bottom=top + node.height-1
756
+ const multiline=node.height>1
757
+ const positions=multiline?[[left,top,"selectionTopLeft"],[right,top,"selectionTopRight"],[left,bottom,"selectionBottomLeft"],[right,bottom,"selectionBottomRight"]]:[[left,top,"selectionLeft"],[right,top,"selectionRight"]]
758
+ for(const [x,y,icon] of positions){if(x<0||y<0||x>=buffer.width||y>=buffer.height)
759
+ continue
760
+ buffer.setCell(x,y,icons.icon(icon),multiline?backdrop:node.backgroundColor,multiline?node.backgroundColor:backdrop)
761
+ }}
748
762
  function SelectionBox(props){const icons=useIcons()
749
763
  const [local,boxProps]=splitProps(props,["ref","iconOnly"])
750
764
  let node
751
- let corners=[]
752
765
  createEffect2(()=>{icons.style()
753
766
  icons.multilineCorners()
754
767
  node?.requestRender()
755
768
  })
756
- function before(buffer,delta){props.renderBefore?.call(this,buffer,delta)
757
- corners=[]
758
- if(this.buffered||this.width<3||this.height<1||this.backgroundColor.a===0||this.height>1&&!icons.multilineCorners())
759
- return
760
- const left=this.screenX
761
- const right=left + this.width-1
762
- const top=this.screenY
763
- const bottom=top + this.height-1
764
- const positions=this.height===1?[[left,top,"selectionLeft"],[right,top,"selectionRight"]]:[[left,top,"selectionTopLeft"],[right,top,"selectionTopRight"],[left,bottom,"selectionBottomLeft"],[right,bottom,"selectionBottomRight"]]
765
- const backdrop=selectionBackdrop(this)
766
- for(const [x,y,icon] of positions){if(x<0||y<0||x>=buffer.width||y>=buffer.height)
767
- continue
768
- if(!this.backgroundColor.equals(backdrop))
769
- corners.push({x,y,icon,backdrop
770
- })
771
- }}
772
- function after(buffer,delta){for(const corner of corners){const multiline=this.height>1
773
- buffer.setCell(corner.x,corner.y,icons.icon(corner.icon),multiline?corner.backdrop:this.backgroundColor,multiline?this.backgroundColor:corner.backdrop)
774
- }
769
+ function after(buffer,delta){if(!this.buffered&&this.width>=3&&this.height>=1&&this.backgroundColor.a>0&&(this.height===1||icons.multilineCorners()))
770
+ paintCorners(this,buffer,icons)
775
771
  props.renderAfter?.call(this,buffer,delta)
776
772
  }
777
773
  return(()=>{var _el$=_$createElement("box")
@@ -782,7 +778,6 @@ local.ref(value)
782
778
  },_el$)
783
779
  _$spread(_el$,_$mergeProps(boxProps,{get paddingLeft(){return props.paddingLeft??props.padding??(local.iconOnly&&icons.style()==="text"?0:1)
784
780
  },get paddingRight(){return props.paddingRight??props.padding??(local.iconOnly&&icons.style()==="text"?0:1)
785
- },get renderBefore(){return _$memo(()=>icons.style()==="nerd")()?before:props.renderBefore
786
781
  },get renderAfter(){return _$memo(()=>icons.style()==="nerd")()?after:props.renderAfter
787
782
  }}),false)
788
783
  return _el$
@@ -823,7 +818,7 @@ _$setProp(_el$2,"wrapMode","none")
823
818
  _$setProp(_el$2,"truncate",true)
824
819
  _$setProp(_el$2,"height",1)
825
820
  _$setProp(_el$2,"flexGrow",1)
826
- _$insert(_el$2,()=>icons.icon("presets"),_el$3)
821
+ _$insert(_el$2,()=>icons.icon(props.icon??"presets"),_el$3)
827
822
  _$insert(_el$2,()=>props.title,null)
828
823
  _$setProp(_el$4,"flexShrink",0)
829
824
  _$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
@@ -1040,12 +1035,17 @@ function GuardedConfirmation(props){const dialogs=useDialogs(props.api)
1040
1035
  createEffect4(()=>{if(!props.current())
1041
1036
  dialogs.close()
1042
1037
  })
1043
- return _$createComponent(props.api.ui.DialogConfirm,{get title(){return props.title
1044
- },get message(){return props.message
1045
- },onConfirm:()=>{if(props.current())
1038
+ const confirm=()=>{if(props.current())
1046
1039
  props.onConfirm()
1047
- },get onCancel(){return dialogs.back
1040
+ }
1041
+ return _$createComponent(Show,{get when(){return props.render
1042
+ },get fallback(){return _$createComponent(props.api.ui.DialogConfirm,{get title(){return props.title
1043
+ },get message(){return props.message
1044
+ },onConfirm:confirm,get onCancel(){return dialogs.back
1048
1045
  }})
1046
+ },children:(render)=>render()({confirm,cancel:dialogs.back
1047
+ })
1048
+ })
1049
1049
  }
1050
1050
 
1051
1051
 
@@ -1071,7 +1071,7 @@ _$setProp(_el$2,"wrapMode","none")
1071
1071
  _$setProp(_el$2,"truncate",true)
1072
1072
  _$setProp(_el$2,"height",1)
1073
1073
  _$insert(_el$2,()=>local.children)
1074
- _$insert(_el$,_$createComponent(Show,{get when(){return local.count!==undefined
1074
+ _$insert(_el$,_$createComponent(Show2,{get when(){return local.count!==undefined
1075
1075
  },get children(){var _el$3=_$createElement("text")
1076
1076
  _$setProp(_el$3,"flexShrink",0)
1077
1077
  _$setProp(_el$3,"wrapMode","none")
@@ -1095,6 +1095,85 @@ return _el$
1095
1095
  }}))
1096
1096
  }
1097
1097
 
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+ function SingleLinePrompt(props){const theme=()=>props.api.theme.current
1106
+ const [value,setValue]=useDialogState("prompt-value",props.value??"")
1107
+ const [active,setActive]=useDialogState("prompt-control",0)
1108
+ const [hovered,setHovered]=createSignal4()
1109
+ let input
1110
+ let actions
1111
+ const confirm=()=>props.onConfirm?.(value())
1112
+ const cancel=()=>props.onCancel?.()
1113
+ const focus=(index)=>{setActive(index)
1114
+ setHovered(undefined)
1115
+ if(index===0)
1116
+ input?.focus()
1117
+ else
1118
+ actions?.focus()
1119
+ }
1120
+ const prefix="opencode-navigator.prompt"
1121
+ createEffect5(()=>{const actionsFocused=active()>0
1122
+ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1100,commands:[{name:`${prefix}.next`,run:()=>focus((active() + 1)%3)
1123
+ },{name:`${prefix}.previous`,run:()=>focus((active() + 2)%3)
1124
+ },{name:`${prefix}.activate`,run:()=>active()===2?cancel():confirm()
1125
+ },{name:`${prefix}.horizontal`,enabled:()=>active()>0,run:()=>focus(active()===1?2:1)
1126
+ }],bindings:[{key:"tab",cmd:`${prefix}.next`
1127
+ },{key:"shift+tab",cmd:`${prefix}.previous`
1128
+ },{key:"return",cmd:`${prefix}.activate`
1129
+ },...actionsFocused?[{key:"left",cmd:`${prefix}.horizontal`
1130
+ },{key:"right",cmd:`${prefix}.horizontal`
1131
+ }]:[]]
1132
+ })
1133
+ onCleanup4(unregister)
1134
+ })
1135
+ onMount(()=>queueMicrotask(()=>input?.focus()))
1136
+ return _$createComponent(DialogSurface,{get api(){return props.api
1137
+ },get children(){return [_$createComponent(DialogHeader,{get api(){return props.api
1138
+ },get title(){return props.title
1139
+ },onBack:cancel
1140
+ }),_$memo(()=>props.description?.()),(()=>{var _el$=_$createElement("input")
1141
+ _$use((node)=>{input=node
1142
+ },_el$)
1143
+ _$setProp(_el$,"onInput",setValue)
1144
+ _$setProp(_el$,"on:focused",()=>setActive(0))
1145
+ _$effect((_p$)=>{var _v$=value(),_v$2=props.placeholder,_v$3=theme().text,_v$4=theme().text,_v$5=theme().backgroundPanel,_v$6=theme().backgroundElement,_v$7=theme().primary,_v$8=theme().textMuted
1146
+ _v$!==_p$.e&&(_p$.e=_$setProp(_el$,"value",_v$,_p$.e))
1147
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"placeholder",_v$2,_p$.t))
1148
+ _v$3!==_p$.a&&(_p$.a=_$setProp(_el$,"textColor",_v$3,_p$.a))
1149
+ _v$4!==_p$.o&&(_p$.o=_$setProp(_el$,"focusedTextColor",_v$4,_p$.o))
1150
+ _v$5!==_p$.i&&(_p$.i=_$setProp(_el$,"backgroundColor",_v$5,_p$.i))
1151
+ _v$6!==_p$.n&&(_p$.n=_$setProp(_el$,"focusedBackgroundColor",_v$6,_p$.n))
1152
+ _v$7!==_p$.s&&(_p$.s=_$setProp(_el$,"cursorColor",_v$7,_p$.s))
1153
+ _v$8!==_p$.h&&(_p$.h=_$setProp(_el$,"placeholderColor",_v$8,_p$.h))
1154
+ return _p$
1155
+ },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined,h:undefined
1156
+ })
1157
+ return _el$
1158
+ })(),(()=>{var _el$2=_$createElement("box")
1159
+ _$use((node)=>{actions=node
1160
+ },_el$2)
1161
+ _$setProp(_el$2,"flexDirection","row")
1162
+ _$setProp(_el$2,"gap",1)
1163
+ _$setProp(_el$2,"focusable",true)
1164
+ _$insert(_el$2,_$createComponent(DialogAction,{get api(){return props.api
1165
+ },id:`${prefix}.save`,label:"Save",icon:"save",get selected(){return(hovered()??active())===1
1166
+ },onSelect:()=>setHovered(1),onActivate:confirm
1167
+ }),null)
1168
+ _$insert(_el$2,_$createComponent(DialogAction,{get api(){return props.api
1169
+ },id:`${prefix}.cancel`,label:"Cancel",icon:"close",get selected(){return(hovered()??active())===2
1170
+ },onSelect:()=>setHovered(2),onActivate:cancel
1171
+ }),null)
1172
+ return _el$2
1173
+ })()]
1174
+ }})
1175
+ }
1176
+
1098
1177
  function subtleLineColor(background,border){const from=parseColor(background)
1099
1178
  const to=parseColor(border)
1100
1179
  return RGBA2.fromValues(from.r + (to.r-from.r)*0.45,from.g + (to.g-from.g)*0.45,from.b + (to.b-from.b)*0.45)
@@ -1255,13 +1334,34 @@ function toolbarPinKey(pin){return pin.kind==="action"?`action:${pin.id}`:`skill
1255
1334
  }
1256
1335
  function identifier(value){return typeof value==="string"&&/^[a-z][a-z\d-]{0,47}$/u.test(value)
1257
1336
  }
1337
+ function iconList(value){return Array.isArray(value)&&value.length<=3&&value.every((item)=>identifier(item))
1338
+ }
1339
+ function validToolbarPinText(text){return text.length<=128&&[...text].every((character)=>{const point=character.codePointAt(0)??0
1340
+ return point>=32&&point!==127&&point!==8232&&point!==8233
1341
+ })
1342
+ }
1343
+ function toolbarPinIcons(pin,state){if(state&&pin.stateIconLists?.[state])
1344
+ return pin.stateIconLists[state]
1345
+ if(state&&pin.stateIcons?.[state])
1346
+ return [pin.stateIcons[state]]
1347
+ return pin.icons??[pin.icon]
1348
+ }
1258
1349
  function parsePin(value){if(!value||typeof value!=="object")
1259
1350
  return
1260
1351
  const input=value
1261
1352
  if(!identifier(input.icon))
1262
1353
  return
1354
+ if(input.icons!==undefined&&!iconList(input.icons))
1355
+ return
1356
+ const text=typeof input.text==="string"?input.text.trim():""
1357
+ if(!validToolbarPinText(text))
1358
+ return
1263
1359
  const stateIcons=Object.fromEntries(Object.entries(input.stateIcons&&typeof input.stateIcons==="object"?input.stateIcons:{}).filter(([key,icon])=>identifier(key)&&identifier(icon)))
1264
- const icons={icon:input.icon,...Object.keys(stateIcons).length>0&&{stateIcons}}
1360
+ const stateIconLists=Object.fromEntries(Object.entries(input.stateIconLists&&typeof input.stateIconLists==="object"?input.stateIconLists:{}).filter(([key,entry])=>identifier(key)&&iconList(entry)))
1361
+ const base=input.icons
1362
+ if(!text&&(base?.length===0||Object.values(stateIconLists).some((list)=>list.length===0)))
1363
+ return
1364
+ const icons={icon:input.icon,...base&&{icons:[...base]},...text&&{text},...Object.keys(stateIcons).length>0&&{stateIcons},...Object.keys(stateIconLists).length>0&&{stateIconLists}}
1265
1365
  if(input.kind==="action"&&QUICK_ACTION_IDS.includes(input.id))
1266
1366
  return{kind:"action",id:input.id,...icons}
1267
1367
  if(input.kind==="skill"&&typeof input.location==="string"&&input.location.trim()&&typeof input.name==="string"&&input.name.trim())
@@ -1278,6 +1378,31 @@ keys.add(toolbarPinKey(pin))
1278
1378
  return [pin]
1279
1379
  })
1280
1380
  }
1381
+ function configurePin(current,change){if(change.expected&&change.expected!==JSON.stringify(current))
1382
+ throw new Error("Pin changed; reopen its configuration")
1383
+ const stateIcons={...current.stateIcons}
1384
+ const stateIconLists={...current.stateIconLists}
1385
+ const lists=Object.entries(change.stateIconLists??{})
1386
+ for(const [state,values] of lists){if(!identifier(state)||values!==null&&!iconList(values))
1387
+ throw new Error("Choose zero to three state icons")
1388
+ if(values===null)
1389
+ delete stateIconLists[state]
1390
+ else
1391
+ stateIconLists[state]=[...values]
1392
+ }
1393
+ const changes=Object.entries(change.stateIcons??{})
1394
+ for(const [state,icon] of changes){if(!identifier(state)||icon!==null&&!identifier(icon))
1395
+ throw new Error("Invalid state icon")
1396
+ if(icon===null)
1397
+ delete stateIcons[state]
1398
+ else
1399
+ stateIcons[state]=icon
1400
+ }
1401
+ const pin=parsePin({...current,icon:change.icon,stateIcons,stateIconLists,...change.icons!==undefined&&{icons:change.icons??undefined},...change.text!==undefined&&{text:change.text??undefined}})
1402
+ if(!pin)
1403
+ throw new Error("Choose up to three icons and a single-line label")
1404
+ return pin
1405
+ }
1281
1406
  function changeToolbarPins(current=[],change){const pins=parseToolbarPins(current)
1282
1407
  if(change.operation==="pin"){const pin=parsePin(change.pin)
1283
1408
  if(!pin)
@@ -1293,21 +1418,7 @@ if(index===-1){if(change.operation==="configure")
1293
1418
  throw new Error("Pin no longer exists; reopen the toolbar manager")
1294
1419
  return pins
1295
1420
  }
1296
- if(change.operation==="configure"){if(change.expected&&change.expected!==JSON.stringify(pins[index]))
1297
- throw new Error("Pin changed; reopen its configuration")
1298
- const stateIcons={...pins[index].stateIcons}
1299
- const changes=Object.entries(change.stateIcons??{})
1300
- for(const [state,icon] of changes){if(!identifier(state)||icon!==null&&!identifier(icon))
1301
- throw new Error("Invalid state icon")
1302
- if(icon===null)
1303
- delete stateIcons[state]
1304
- else
1305
- stateIcons[state]=icon
1306
- }
1307
- const pin=parsePin({...pins[index],icon:change.icon,stateIcons})
1308
- if(!pin)
1309
- throw new Error("Invalid toolbar icon")
1310
- pins[index]=pin
1421
+ if(change.operation==="configure"){pins[index]=configurePin(pins[index],change)
1311
1422
  return pins
1312
1423
  }
1313
1424
  const [pin]=pins.splice(index,1)
@@ -1762,25 +1873,25 @@ return{sections:{...base?.sections,...session.sections},expanded:{...base?.expan
1762
1873
  function createPreferencesController(api,defaults,store,configured={}){const builtIns={behavior:{toggleKey:defaults.toggleKey,focusKey:defaults.focusKey,searchKey:defaults.searchKey,persistMcp:defaults.persistMcp,limitsRefreshMinutes:defaults.limitsRefreshMinutes,startInChat:defaults.startInChat,showSessionTitle:defaults.showSessionTitle,showSessionDate:defaults.showSessionDate,cornerFont:defaults.cornerFont,lspIconStyle:defaults.lspIconStyle,rowDensity:defaults.rowDensity,toolbarOverflow:defaults.toolbarOverflow,sectionItemLimits:defaults.sectionItemLimits,quickActionOrder:defaults.quickActionOrder,quickActionVisibility:defaults.quickActionVisibility
1763
1874
  },layout:{sections:defaults.sections,expanded:DEFAULT_SECTION_EXPANSION,order:defaults.sectionOrder??[...SIDEBAR_SECTIONS]
1764
1875
  },desiredMcpStates:{}}
1765
- const [resolved,setResolved]=createSignal4(resolvePreferences({builtIns,pluginOptions:configured}))
1766
- const [skippedSkills,setSkippedSkills]=createSignal4(new Set)
1767
- const [onboardingCompleted,setOnboardingCompleted]=createSignal4(false)
1768
- const [activeTarget,setActiveTarget]=createSignal4({kind:"global"})
1769
- const [preferenceScope,setPreferenceScope]=createSignal4("global")
1770
- const [layoutPresets,setLayoutPresets]=createSignal4(configured.layoutPresets??{})
1771
- const [mcpPresets,setMcpPresets]=createSignal4(configured.mcpPresets??{})
1772
- const [favoriteSkills,setFavoriteSkills]=createSignal4(new Set)
1773
- const [favoriteMcpServers,setFavoriteMcpServers]=createSignal4(new Set)
1774
- const [favoriteQuickActions,setFavoriteQuickActions]=createSignal4(new Set)
1775
- const [recentSkills,setRecentSkills]=createSignal4([])
1776
- const [recentQuickActions,setRecentQuickActions]=createSignal4([])
1777
- const [mcpServerGroups,setMcpServerGroups]=createSignal4(configured.mcpServerGroups??{})
1778
- const [skillGroups,setSkillGroups]=createSignal4({})
1779
- const [autoApprovePermissions,setAutoApprovePermissions]=createSignal4()
1780
- const [codexAccountBindings,setCodexAccountBindings]=createSignal4({})
1781
- const [pendingResetAttempt,setPendingResetAttempt]=createSignal4()
1782
- const [ready,setReady]=createSignal4(false)
1783
- const [revision,setRevision]=createSignal4(0)
1876
+ const [resolved,setResolved]=createSignal5(resolvePreferences({builtIns,pluginOptions:configured}))
1877
+ const [skippedSkills,setSkippedSkills]=createSignal5(new Set)
1878
+ const [onboardingCompleted,setOnboardingCompleted]=createSignal5(false)
1879
+ const [activeTarget,setActiveTarget]=createSignal5({kind:"global"})
1880
+ const [preferenceScope,setPreferenceScope]=createSignal5("global")
1881
+ const [layoutPresets,setLayoutPresets]=createSignal5(configured.layoutPresets??{})
1882
+ const [mcpPresets,setMcpPresets]=createSignal5(configured.mcpPresets??{})
1883
+ const [favoriteSkills,setFavoriteSkills]=createSignal5(new Set)
1884
+ const [favoriteMcpServers,setFavoriteMcpServers]=createSignal5(new Set)
1885
+ const [favoriteQuickActions,setFavoriteQuickActions]=createSignal5(new Set)
1886
+ const [recentSkills,setRecentSkills]=createSignal5([])
1887
+ const [recentQuickActions,setRecentQuickActions]=createSignal5([])
1888
+ const [mcpServerGroups,setMcpServerGroups]=createSignal5(configured.mcpServerGroups??{})
1889
+ const [skillGroups,setSkillGroups]=createSignal5({})
1890
+ const [autoApprovePermissions,setAutoApprovePermissions]=createSignal5()
1891
+ const [codexAccountBindings,setCodexAccountBindings]=createSignal5({})
1892
+ const [pendingResetAttempt,setPendingResetAttempt]=createSignal5()
1893
+ const [ready,setReady]=createSignal5(false)
1894
+ const [revision,setRevision]=createSignal5(0)
1784
1895
  const sessionLayouts=new Map
1785
1896
  const pendingUpdates=[]
1786
1897
  let document=emptyPreferencesDocument()
@@ -2291,7 +2402,7 @@ return{behavior,layout:{sections,expanded:{},...sectionOrder&&{order:sectionOrde
2291
2402
  function configuredDefaultsFromPluginOptions(options){return mergeConfiguredDefaults(legacyDefaults(pluginConfig(options)),parseConfiguredDefaults(options??{}))
2292
2403
  }
2293
2404
 
2294
- function createSkillController(api,source){const [skills,setSkills]=createSignal5({})
2405
+ function createSkillController(api,source){const [skills,setSkills]=createSignal6({})
2295
2406
  const refreshing=new Map
2296
2407
  const targets=new Map
2297
2408
  const requests=createRequestState(api.lifecycle.signal)
@@ -2513,7 +2624,7 @@ _$insertNode(_el$4,_el$5)
2513
2624
  _$setProp(_el$4,"flexDirection","row")
2514
2625
  _$setProp(_el$4,"gap",1)
2515
2626
  _$setProp(_el$4,"alignItems","center")
2516
- _$insert(_el$4,_$createComponent(Show2,{get when(){return props.onConfigure
2627
+ _$insert(_el$4,_$createComponent(Show3,{get when(){return props.onConfigure
2517
2628
  },get children(){return _$createComponent(IconControl,{get icon(){return terminalIcon("pin",icons.style())
2518
2629
  },get foregroundColor(){return _$memo(()=>props.active==="configure")()?theme().selectedListItemText:theme().textMuted
2519
2630
  },get backgroundColor(){return _$memo(()=>props.active==="configure")()?theme().primary:undefined
@@ -2586,7 +2697,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
2586
2697
  },{key:"return",cmd:`${PLUGIN_ID}.skill-dialog.submit`
2587
2698
  }]
2588
2699
  })
2589
- onCleanup4(unregister)
2700
+ onCleanup5(unregister)
2590
2701
  return _$createComponent(DialogSurface,{get api(){return props.api
2591
2702
  },get children(){return [_$createComponent(SkillDialogHeader,{get api(){return props.api
2592
2703
  },get name(){return props.skill.name
@@ -2656,7 +2767,7 @@ input.dialogs.open(()=>_$createComponent(SkillDialog,{get api(){return input.api
2656
2767
 
2657
2768
 
2658
2769
  function createSubagentHistory({now=Date.now}={}){const targets=new Map
2659
- const [revision,setRevision]=createSignal6(0)
2770
+ const [revision,setRevision]=createSignal7(0)
2660
2771
  function state(key){let value=targets.get(key)
2661
2772
  if(!value){value={known:new Set,active:new Map,recent:[]}
2662
2773
  targets.set(key,value)
@@ -2714,11 +2825,11 @@ function activeStatus(status){return status?.type==="busy"||status?.type==="retr
2714
2825
  function createSubagentController(api,options={}){const source=options.source
2715
2826
  const now=options.now??Date.now
2716
2827
  const history=createSubagentHistory({now})
2717
- const [children,setChildren]=createSignal7({})
2718
- const [statuses,setStatuses]=createSignal7({})
2828
+ const [children,setChildren]=createSignal8({})
2829
+ const [statuses,setStatuses]=createSignal8({})
2719
2830
  const refreshing=new Map
2720
2831
  const journals=new Set
2721
- const [unavailable,setUnavailable]=createSignal7({})
2832
+ const [unavailable,setUnavailable]=createSignal8({})
2722
2833
  const targets=new Map
2723
2834
  const remoteFailures=new Map
2724
2835
  const remoteRetryAt=new Map
@@ -2943,17 +3054,17 @@ else if(seconds>=60)
2943
3054
  value=`${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, "0")}s`
2944
3055
  return value
2945
3056
  }
2946
- function createSubagentClock(key){const [now,setNow]=createSignal8(Date.now())
2947
- createEffect5(()=>{if(key()===undefined)
3057
+ function createSubagentClock(key){const [now,setNow]=createSignal9(Date.now())
3058
+ createEffect6(()=>{if(key()===undefined)
2948
3059
  return
2949
3060
  setNow(Date.now())
2950
3061
  const timer=setInterval(()=>setNow(Date.now()),1000)
2951
- onCleanup5(()=>clearInterval(timer))
3062
+ onCleanup6(()=>clearInterval(timer))
2952
3063
  })
2953
3064
  return now
2954
3065
  }
2955
3066
 
2956
- function createTodoController(api){const [sessions,setSessions]=createSignal9({})
3067
+ function createTodoController(api){const [sessions,setSessions]=createSignal10({})
2957
3068
  const refreshing=new Map
2958
3069
  const revisions=new Map
2959
3070
  const requests=createRequestState(api.lifecycle.signal)
@@ -3070,10 +3181,10 @@ return action.label
3070
3181
  const command=api.keymap.getCommands?.({visibility:"registered"}).find((candidate)=>candidate.name===action.command)
3071
3182
  return typeof command?.title==="string"?command.title:action.label
3072
3183
  }
3073
- function createQuickActionRevision(api){const [revision,setRevision]=createSignal11(0)
3184
+ function createQuickActionRevision(api){const [revision,setRevision]=createSignal12(0)
3074
3185
  const unsubscribe=api.keymap.on?.("state",()=>setRevision((value)=>value + 1))
3075
3186
  if(unsubscribe)
3076
- onCleanup7(unsubscribe)
3187
+ onCleanup8(unsubscribe)
3077
3188
  return revision
3078
3189
  }
3079
3190
  function orderQuickActionIds(order,favorites){return [...order.filter((id)=>favorites.has(id)),...order.filter((id)=>!favorites.has(id))]
@@ -3189,7 +3300,7 @@ const [selectedID,setSelectedID]=useDialogState("selection",undefined)
3189
3300
  const [views]=useDialogState("tab-views",new Map)
3190
3301
  const tabViews=views()
3191
3302
  const [scrollTop,setScrollTop]=useDialogState("scroll",0)
3192
- const [refreshing,setRefreshing]=createSignal12(false)
3303
+ const [refreshing,setRefreshing]=createSignal13(false)
3193
3304
  const theme=()=>props.api.theme.current
3194
3305
  const icons=useIcons()
3195
3306
  const commandRevision=createQuickActionRevision(props.api)
@@ -3216,7 +3327,7 @@ body.scrollChildIntoView(`${prefix}.${position}`)
3216
3327
  setScrollTop(body.scrollTop)
3217
3328
  }
3218
3329
  renderer.on("frame",onFrame)
3219
- onCleanup8(()=>renderer.off("frame",onFrame))
3330
+ onCleanup9(()=>renderer.off("frame",onFrame))
3220
3331
  const sameContext=()=>searchContext(props.api).key===context.key
3221
3332
  const candidates=createMemo(()=>{commandRevision()
3222
3333
  return buildSearchCandidates({skills:props.skills.list(skillTarget),subagents:context.sessionID?buildSubagentView(props.subagents.list(context.sessionID),props.subagents.recent(context.sessionID)):[],mcp:props.mcp.list(mcpTarget),actionOrder:props.preferences.quickActionOrder?.()??QUICK_ACTION_IDS,favoriteQuickActions:props.preferences.favoriteQuickActions?.()??new Set,favoriteSkills:props.preferences.favoriteSkills(),skillGroups:props.preferences.skillGroups?.()??{},recentSkills:props.preferences.recentSkills(),favoriteMcp:props.preferences.favoriteMcpServers(),mcpGroups:props.preferences.mcpServerGroups?.()??{},hasSession:Boolean(context.sessionID),mcpBusy:props.mcp.mutating(mcpTarget)||props.mcp.bulkState(mcpTarget).status==="running",actionDisabledReason:(action)=>quickActionDisabledReason(props.api,action),actionLabel:(action)=>quickActionLabel(props.api,action)
@@ -3322,14 +3433,14 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3322
3433
  },{key:"ctrl+r",cmd:`${prefix}.retry`
3323
3434
  }]
3324
3435
  })
3325
- onCleanup8(()=>{isDisposed=true
3436
+ onCleanup9(()=>{isDisposed=true
3326
3437
  unregister()
3327
3438
  })
3328
- onCleanup8(props.skills.activate?.(skillTarget)??(()=>{}))
3329
- onMount(()=>{input?.focus()
3439
+ onCleanup9(props.skills.activate?.(skillTarget)??(()=>{}))
3440
+ onMount2(()=>{input?.focus()
3330
3441
  refresh().catch(report)
3331
3442
  })
3332
- createEffect6(()=>{if(!sameContext())
3443
+ createEffect7(()=>{if(!sameContext())
3333
3444
  dialogs.close()
3334
3445
  })
3335
3446
  return{active,activeTab,activate,allErrors,byID,dialogs,errors,icons,loading,matches,prefix,query,queryScope,resultColors,results,selectTab,setBody(node){body=node
@@ -3492,7 +3603,7 @@ _$effect((_$p)=>_$setProp(_el$2,"fg",model.theme().error,_$p))
3492
3603
  return _el$2
3493
3604
  })()
3494
3605
  }),null)
3495
- _$insert(_el$,_$createComponent(Show3,{get when(){return model.results().length
3606
+ _$insert(_el$,_$createComponent(Show4,{get when(){return model.results().length
3496
3607
  },get fallback(){return(()=>{var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
3497
3608
  _$insertNode(_el$8,_el$9)
3498
3609
  _$insert(_el$8,()=>model.icons.icon(model.loading()?"pending":"search"),_el$9)
@@ -3500,7 +3611,7 @@ _$insert(_el$8,()=>model.loading()?"Loading sources\u2026":"No matching results"
3500
3611
  _$effect((_$p)=>_$setProp(_el$8,"fg",model.theme().textMuted,_$p))
3501
3612
  return _el$8
3502
3613
  })()
3503
- },get children(){return _$createComponent(Show3,{keyed:true,get when(){return model.queryScope()
3614
+ },get children(){return _$createComponent(Show4,{keyed:true,get when(){return model.queryScope()
3504
3615
  },children:(_scope)=>_$createComponent(For3,{get each(){return model.results().map((item)=>item.id)
3505
3616
  },children:(id)=>_$createComponent(SearchResultRow,{model,id
3506
3617
  })
@@ -3554,13 +3665,13 @@ timers.add(timer)
3554
3665
  }},{name:`${LEGACY_PLUGIN_ID}.search`,run(){props.api.keymap.dispatchCommand(SEARCH_COMMAND)
3555
3666
  }}]
3556
3667
  })
3557
- createEffect7(()=>{const key=props.preferences.searchKey()
3668
+ createEffect8(()=>{const key=props.preferences.searchKey()
3558
3669
  const remove=props.api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:SEARCH_COMMAND
3559
3670
  }]
3560
3671
  })
3561
- onCleanup9(remove)
3672
+ onCleanup10(remove)
3562
3673
  })
3563
- onCleanup9(()=>{isDisposed=true
3674
+ onCleanup10(()=>{isDisposed=true
3564
3675
  unregister()
3565
3676
  for(const timer of timers)
3566
3677
  clearTimeout(timer)
@@ -3776,8 +3887,8 @@ return _el$
3776
3887
  }
3777
3888
  function FirstRunWizard(props){const icons=useIcons()
3778
3889
  const dialogs=useDialogs(props.api)
3779
- const [active,setActive]=createSignal13(0)
3780
- const [step,setStep]=createSignal13(0)
3890
+ const [active,setActive]=createSignal14(0)
3891
+ const [step,setStep]=createSignal14(0)
3781
3892
  const theme=()=>props.api.theme.current
3782
3893
  const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
3783
3894
  const finishIndex=sections.length
@@ -3818,7 +3929,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3818
3929
  },{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
3819
3930
  }]
3820
3931
  })
3821
- onCleanup10(unregister)
3932
+ onCleanup11(unregister)
3822
3933
  return _$createComponent(DialogSurface,{get api(){return props.api
3823
3934
  },get children(){return [(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Navigator setup`),_el$4=_$createElement("text"),_el$5=_$createTextNode(`Step `),_el$6=_$createTextNode(`/`),_el$7=_$createTextNode(` \xB7 `)
3824
3935
  _$insertNode(_el$,_el$2)
@@ -3845,7 +3956,7 @@ return _p$
3845
3956
  },{e:undefined,t:undefined,a:undefined
3846
3957
  })
3847
3958
  return _el$
3848
- })(),_$createComponent(Show4,{get when(){return configuring()
3959
+ })(),_$createComponent(Show5,{get when(){return configuring()
3849
3960
  },get fallback(){return _$createComponent(OnboardingStep,{get api(){return props.api
3850
3961
  },get preferences(){return props.preferences
3851
3962
  },get step(){return ONBOARDING_STEPS[step()]
@@ -3902,7 +4013,7 @@ _$insertNode(_el$,_el$6)
3902
4013
  _$setProp(_el$,"flexDirection","row")
3903
4014
  _$setProp(_el$,"justifyContent","space-between")
3904
4015
  _$setProp(_el$2,"flexGrow",1)
3905
- _$insert(_el$2,_$createComponent(Show5,{get when(){return props.onRefresh
4016
+ _$insert(_el$2,_$createComponent(Show6,{get when(){return props.onRefresh
3906
4017
  },get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Refresh (`),_el$5=_$createTextNode(`)`)
3907
4018
  _$insertNode(_el$3,_el$4)
3908
4019
  _$insertNode(_el$3,_el$5)
@@ -3965,7 +4076,7 @@ const dialogs=useDialogs(props.api)
3965
4076
  const theme=()=>props.api.theme.current
3966
4077
  const dimensions=useTerminalDimensions6()
3967
4078
  const scroll=useDialogScroll()
3968
- const [active,setActive]=createSignal14("apply")
4079
+ const [active,setActive]=createSignal15("apply")
3969
4080
  let body
3970
4081
  const prefix=`${PLUGIN_ID}.preset-preview`
3971
4082
  function activate(action){if(!props.valid()){dialogs.close()
@@ -3994,8 +4105,8 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3994
4105
  },{key:"ctrl+r",cmd:`${prefix}.refresh`
3995
4106
  }]
3996
4107
  })
3997
- onCleanup11(unregister)
3998
- createEffect8(()=>{if(!props.valid())
4108
+ onCleanup12(unregister)
4109
+ createEffect9(()=>{if(!props.valid())
3999
4110
  dialogs.close()
4000
4111
  })
4001
4112
  return _$createComponent(DialogSurface,{get api(){return props.api
@@ -4036,7 +4147,7 @@ _$setProp(_el$6,"gap",1)
4036
4147
  _$insert(_el$6,()=>props.children)
4037
4148
  _$effect((_$p)=>_$setProp(_el$5,"height",Math.min(Math.max(2,Math.floor(dimensions().height*0.75)-14),Math.max(1,props.rowCount*3-1)),_$p))
4038
4149
  return _el$5
4039
- })(),_$createComponent(Show6,{get when(){return props.blocked||props.notice
4150
+ })(),_$createComponent(Show7,{get when(){return props.blocked||props.notice
4040
4151
  },get children(){var _el$7=_$createElement("box"),_el$8=_$createElement("text"),_el$9=_$createElement("text")
4041
4152
  _$insertNode(_el$7,_el$8)
4042
4153
  _$insertNode(_el$7,_el$9)
@@ -4127,7 +4238,7 @@ return _el$6
4127
4238
  function McpPresetPreview(props){const dialogs=useDialogs(props.api)
4128
4239
  const icons=useIcons()
4129
4240
  const model=createMcpPresetPreview(props.controller,props.preferences,props.name)
4130
- onMount2(model.refresh)
4241
+ onMount3(model.refresh)
4131
4242
  const rows=createMemo3(()=>mcpPreviewRows(model,icons))
4132
4243
  const count=(change)=>model.preview().rows.filter((row)=>row.change===change).length
4133
4244
  return _$createComponent(PresetPreviewFrame,{get api(){return props.api
@@ -4288,14 +4399,14 @@ function SettingsBinding(props){const unregister=props.api.keymap.registerLayer(
4288
4399
  },cmd:`${PLUGIN_ID}.settings`
4289
4400
  }]
4290
4401
  })
4291
- onCleanup13(unregister)
4402
+ onCleanup14(unregister)
4292
4403
  return _$createElement("box")
4293
4404
  }
4294
4405
 
4295
4406
 
4296
4407
  function PermissionModeBinding(props){let applying=false
4297
4408
  let observed
4298
- createEffect11(()=>{if(!props.preferences.ready())
4409
+ createEffect12(()=>{if(!props.preferences.ready())
4299
4410
  return
4300
4411
  const preferred=props.preferences.autoApprovePermissions()
4301
4412
  const current=currentPermissionMode(props.api)
@@ -4316,14 +4427,14 @@ observed=current
4316
4427
  props.preferences.setAutoApprovePermissions(current)
4317
4428
  })
4318
4429
  if(unsubscribe)
4319
- onCleanup14(unsubscribe)
4430
+ onCleanup15(unsubscribe)
4320
4431
  return _$createElement("box")
4321
4432
  }
4322
4433
 
4323
4434
 
4324
4435
 
4325
4436
  function SettingsFooterButton(props){const icons=useIcons()
4326
- const [hovered,setHovered]=createSignal15(false)
4437
+ const [hovered,setHovered]=createSignal16(false)
4327
4438
  const theme=()=>props.api.theme.current
4328
4439
  return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon(){return icons.icon("settings")
4329
4440
  },get foregroundColor(){return _$memo(()=>!!hovered())()?theme().text:theme().textMuted
@@ -4334,6 +4445,23 @@ return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon
4334
4445
 
4335
4446
 
4336
4447
 
4448
+ var services=new WeakMap
4449
+ function createSlot(){const [read,write]=createSignal17()
4450
+ return{read,write}}
4451
+ function slot(api){let entry=services.get(api)
4452
+ if(!entry){entry=createSlot()
4453
+ services.set(api,entry)
4454
+ }
4455
+ return entry
4456
+ }
4457
+ function registerNavigatorAboutServices(api,value){const entry=slot(api)
4458
+ entry.write(value)
4459
+ return()=>{if(entry.read()===value)
4460
+ entry.write(undefined)
4461
+ }}
4462
+ function getNavigatorAboutServices(api){return slot(api).read()
4463
+ }
4464
+
4337
4465
  var ACTIONS=[{key:"h",label:"Toggle sidebar",icon:"sections",group:"navigate",command:"session.sidebar.toggle",section:undefined
4338
4466
  },{key:"t",label:"Todo",icon:"todo",group:"navigate",command:`${PLUGIN_ID}.focus.todo`,section:"todo"},{key:"a",label:"Subagents",icon:"subagents",group:"navigate",command:`${PLUGIN_ID}.focus.subagents`,section:"subagents"
4339
4467
  },{key:"s",label:"Skills",icon:"skills",group:"navigate",command:`${PLUGIN_ID}.focus.skills`,section:"skills"
@@ -4348,7 +4476,7 @@ var CANCEL_COMMAND=`${PLUGIN_ID}.sidebar-shortcuts.cancel`
4348
4476
  var MODE=`${PLUGIN_ID}.sidebar-shortcuts`
4349
4477
  var DEFAULT_TIMEOUT_MS=5000
4350
4478
  function createSidebarShortcutMode(api,options={}){const actions=sidebarShortcutActions(api)
4351
- const [active,setActive]=createSignal16(false)
4479
+ const [active,setActive]=createSignal18(false)
4352
4480
  const timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS
4353
4481
  let shortcutKey=""
4354
4482
  let unregisterBinding
@@ -4488,133 +4616,25 @@ function StartupSessionBinding(props){if(props.api.keymap.on){const unregister=p
4488
4616
  return
4489
4617
  queueMicrotask(()=>void props.controller.start())
4490
4618
  })
4491
- onCleanup15(unregister)
4619
+ onCleanup16(unregister)
4492
4620
  } else
4493
- createEffect12(()=>{if(!props.controller.enabled())
4621
+ createEffect13(()=>{if(!props.controller.enabled())
4494
4622
  return
4495
4623
  const unregister=props.api.keymap.registerLayer({mode:"global",priority:2001,commands:[{name:"session.new",title:"New session",category:"Session",namespace:"palette",enabled:props.controller.enabled,run:()=>void props.controller.start()
4496
4624
  }]
4497
4625
  })
4498
- onCleanup15(unregister)
4626
+ onCleanup16(unregister)
4499
4627
  })
4500
- onMount4(()=>void props.controller.initialize())
4501
- onCleanup15(props.controller.dispose)
4628
+ onMount5(()=>void props.controller.initialize())
4629
+ onCleanup16(props.controller.dispose)
4502
4630
  return _$createElement("box")
4503
4631
  }
4504
- function versionParts(value){const match=/^v?(\d+)\.(\d+)\.(\d+)(?:-([^+]+))?/.exec(value)
4505
- return match?{numbers:match.slice(1,4).map(Number),prerelease:match[4]||undefined}:undefined
4506
- }
4507
- function isNewerVersion(latest,current){const next=versionParts(latest)
4508
- const installed=versionParts(current)
4509
- if(!next||!installed)
4510
- return false
4511
- for(let index=0;index<3; index++){if(next.numbers[index]!==installed.numbers[index])
4512
- return next.numbers[index]>installed.numbers[index]
4513
- }
4514
- return installed.prerelease!==undefined&&next.prerelease===undefined
4515
- }
4516
- function changesSince(source,previous,current){const entries=[]
4517
- let entry
4518
- for(const line of source.split(/\r?\n/)){const heading=/^## \[(\d+\.\d+\.\d+(?:-[\w.-]+)?)\]/.exec(line)
4519
- if(heading){entry=isNewerVersion(heading[1],previous)&&!isNewerVersion(heading[1],current)?{version:heading[1],changes:[]}:undefined
4520
- if(entry)
4521
- entries.push(entry)
4522
- continue
4523
- }
4524
- if(entry&&line.startsWith("- "))
4525
- entry.changes.push(line.slice(2))
4526
- }
4527
- return entries.filter((candidate)=>candidate.changes.length>0)
4528
- }
4529
- async function readBundledChangelog(){const packaged=Bun.file(new URL("../CHANGELOG.md",import.meta.url))
4530
- if(await packaged.exists())
4531
- return packaged.text()
4532
- return Bun.file(new URL("../../../../CHANGELOG.md",import.meta.url)).text()
4533
- }
4534
-
4535
-
4536
-
4537
4632
 
4538
4633
 
4539
4634
 
4540
-
4541
-
4542
-
4543
-
4544
-
4545
-
4546
-
4547
- function UpgradeNotesDialog(props){const dimensions=useTerminalDimensions9()
4548
- const dialogs=useDialogs(props.api)
4549
- const icons=useIcons()
4550
- const theme=()=>props.api.theme.current
4551
- return _$createComponent(DialogSurface,{get api(){return props.api
4552
- },lift:true,get children(){return [(()=>{var _el$=_$createElement("text"),_el$2=_$createTextNode(` Navigator updated`)
4553
- _$insertNode(_el$,_el$2)
4554
- _$insert(_el$,()=>icons.icon("update"),_el$2)
4555
- _$effect((_p$)=>{var _v$=theme().text,_v$2=TextAttributes17.BOLD
4556
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$,"fg",_v$,_p$.e))
4557
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"attributes",_v$2,_p$.t))
4558
- return _p$
4559
- },{e:undefined,t:undefined
4560
- })
4561
- return _el$
4562
- })(),(()=>{var _el$3=_$createElement("text"),_el$4=_$createTextNode(`Changes from `),_el$5=_$createTextNode(` to `)
4563
- _$insertNode(_el$3,_el$4)
4564
- _$insertNode(_el$3,_el$5)
4565
- _$insert(_el$3,()=>props.previous,_el$5)
4566
- _$insert(_el$3,()=>props.current,null)
4567
- _$effect((_$p)=>_$setProp(_el$3,"fg",theme().textMuted,_$p))
4568
- return _el$3
4569
- })(),(()=>{var _el$6=_$createElement("scrollbox"),_el$7=_$createElement("box")
4570
- _$insertNode(_el$6,_el$7)
4571
- _$setProp(_el$6,"scrollX",false)
4572
- _$setProp(_el$6,"horizontalScrollbarOptions",{visible:false
4573
- })
4574
- _$setProp(_el$6,"verticalScrollbarOptions",{visible:true
4575
- })
4576
- _$setProp(_el$7,"gap",1)
4577
- _$setProp(_el$7,"paddingRight",1)
4578
- _$insert(_el$7,_$createComponent(For11,{get each(){return props.entries
4579
- },children:(entry)=>(()=>{var _el$0=_$createElement("box"),_el$1=_$createElement("text"),_el$10=_$createTextNode(`Navigator `)
4580
- _$insertNode(_el$0,_el$1)
4581
- _$setProp(_el$0,"gap",1)
4582
- _$insertNode(_el$1,_el$10)
4583
- _$insert(_el$1,()=>entry.version,null)
4584
- _$insert(_el$0,_$createComponent(For11,{get each(){return entry.changes
4585
- },children:(change)=>(()=>{var _el$11=_$createElement("text"),_el$12=_$createTextNode(` `)
4586
- _$insertNode(_el$11,_el$12)
4587
- _$setProp(_el$11,"wrapMode","word")
4588
- _$insert(_el$11,()=>icons.icon("selected"),_el$12)
4589
- _$insert(_el$11,change,null)
4590
- _$effect((_$p)=>_$setProp(_el$11,"fg",theme().text,_$p))
4591
- return _el$11
4592
- })()
4593
- }),null)
4594
- _$effect((_p$)=>{var _v$3=theme().accent,_v$4=TextAttributes17.BOLD
4595
- _v$3!==_p$.e&&(_p$.e=_$setProp(_el$1,"fg",_v$3,_p$.e))
4596
- _v$4!==_p$.t&&(_p$.t=_$setProp(_el$1,"attributes",_v$4,_p$.t))
4597
- return _p$
4598
- },{e:undefined,t:undefined
4599
- })
4600
- return _el$0
4601
- })()
4602
- }))
4603
- _$effect((_$p)=>_$setProp(_el$6,"height",Math.max(4,Math.min(16,Math.floor(dimensions().height / 2))),_$p))
4604
- return _el$6
4605
- })(),_$createComponent(SelectionBox,{get backgroundColor(){return theme().primary
4606
- },paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
4607
- dialogs.back()
4608
- },get children(){var _el$8=_$createElement("text")
4609
- _$insertNode(_el$8,_$createTextNode(`Continue`))
4610
- _$effect((_$p)=>_$setProp(_el$8,"fg",theme().selectedListItemText,_$p))
4611
- return _el$8
4612
- }})]
4613
- }})
4614
- }
4615
4635
  function UpgradeNotesBinding(props){let pending
4616
4636
  let disposed=false
4617
- onMount5(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4637
+ onMount6(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4618
4638
  if(!previous||disposed)
4619
4639
  return
4620
4640
  try{let show=function(){if(disposed||props.api.lifecycle.signal?.aborted)
@@ -4627,12 +4647,15 @@ createDialogStack(props.api,props.preferences.lspIconStyle,()=>true,props.prefer
4627
4647
  },entries
4628
4648
  }),"large")
4629
4649
  }
4650
+ const path=import.meta.url.includes("/dist/")?"./upgrade-notes.js":"./upgrade-notes-content"
4651
+ const{changesSince,readBundledChangelog,UpgradeNotesDialog
4652
+ }=await import(path)
4630
4653
  const entries=changesSince(await (props.read??readBundledChangelog)(),previous,props.version)
4631
4654
  if(entries.length===0||disposed)
4632
4655
  return
4633
4656
  show()
4634
4657
  } catch{}})
4635
- onCleanup16(()=>{disposed=true
4658
+ onCleanup17(()=>{disposed=true
4636
4659
  clearTimeout(pending)
4637
4660
  })
4638
4661
  return _$createElement("box")
@@ -4647,6 +4670,16 @@ return _$createElement("box")
4647
4670
 
4648
4671
 
4649
4672
 
4673
+
4674
+
4675
+
4676
+
4677
+
4678
+
4679
+
4680
+
4681
+
4682
+
4650
4683
 
4651
4684
 
4652
4685
 
@@ -4727,6 +4760,9 @@ return _el$
4727
4760
  })()
4728
4761
  }
4729
4762
 
4763
+
4764
+
4765
+
4730
4766
  function matchesFilter(query,...values){const needle=query.trim().toLocaleLowerCase()
4731
4767
  return !needle||values.some((value)=>value?.toLocaleLowerCase().includes(needle))
4732
4768
  }
@@ -4750,9 +4786,9 @@ return false
4750
4786
  return true
4751
4787
  }
4752
4788
  function createSidebarInteraction(api,showHelp=()=>openKeyboardHelp(api)){const descriptors=new Map
4753
- const [selectedId,setSelectedId]=createSignal18()
4754
- const [focusWithin,setFocusWithin]=createSignal18(false)
4755
- const [revision,setRevision]=createSignal18(0)
4789
+ const [selectedId,setSelectedId]=createSignal21()
4790
+ const [focusWithin,setFocusWithin]=createSignal21(false)
4791
+ const [revision,setRevision]=createSignal21(0)
4756
4792
  let titleRoot
4757
4793
  let contentRoot
4758
4794
  let targetedRoot
@@ -5021,14 +5057,14 @@ else if(highlighted)
5021
5057
  foregroundColor=theme.selectedListItemText
5022
5058
  return{backgroundColor,foregroundColor}}
5023
5059
  function useSidebarItem(api,interaction,descriptor,normalColor=()=>api.theme.current.text,mode="row"){let unregister
5024
- const [hovered,setHovered]=createSignal19(false)
5060
+ const [hovered,setHovered]=createSignal22(false)
5025
5061
  const disabled=()=>descriptor.disabled?.()===true
5026
5062
  const focused=()=>Boolean(interaction?.ownsFocus()&&interaction.isSelected(descriptor.id))
5027
5063
  const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),hovered:hovered(),disabled:disabled()},normalColor(),mode)
5028
5064
  const ref=(renderable)=>{unregister?.()
5029
5065
  unregister=interaction?.register({...descriptor,renderable})
5030
5066
  }
5031
- onCleanup17(()=>unregister?.())
5067
+ onCleanup19(()=>unregister?.())
5032
5068
  return{ref,disabled,focused,backgroundColor:()=>colors().backgroundColor,foregroundColor:()=>colors().foregroundColor,onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),select(event){interaction?.mouseSelect(descriptor.id,event)
5033
5069
  },activate(event){if(interaction)
5034
5070
  return interaction.mouseActivate(descriptor.id,event)
@@ -5039,7 +5075,7 @@ return true
5039
5075
  }}}
5040
5076
  function LspBadge(props){const icons=useIcons()
5041
5077
  const isKnown=lspIconName(props.id)!==undefined
5042
- const [showName,setShowName]=createSignal20(false)
5078
+ const [showName,setShowName]=createSignal23(false)
5043
5079
  const statusColor=()=>props.status==="connected"?props.api.theme.current.success:props.api.theme.current.error
5044
5080
  if(!isKnown){return(()=>{var _el$=_$createElement("text")
5045
5081
  _$setProp(_el$,"flexShrink",1)
@@ -5064,7 +5100,7 @@ _$setProp(_el$2,"flexShrink",0)
5064
5100
  _$insert(_el$2,()=>lspIcon(props.id,props.iconStyle??icons.style()))
5065
5101
  _$effect((_$p)=>_$setProp(_el$2,"fg",item.foregroundColor(),_$p))
5066
5102
  return _el$2
5067
- })(),_$createComponent(Show10,{get when(){return showName()
5103
+ })(),_$createComponent(Show11,{get when(){return showName()
5068
5104
  },get children(){var _el$3=_$createElement("text")
5069
5105
  _$setProp(_el$3,"flexShrink",0)
5070
5106
  _$setProp(_el$3,"wrapMode","none")
@@ -5082,7 +5118,7 @@ return _el$3
5082
5118
 
5083
5119
 
5084
5120
 
5085
- function createListVisibility(options){const [expanded,setExpanded]=createSignal21(false)
5121
+ function createListVisibility(options){const [expanded,setExpanded]=createSignal24(false)
5086
5122
  let previousKey
5087
5123
  let previousLimit
5088
5124
  const canToggle=createMemo8(()=>options.limit()>0&&options.items().length>options.limit())
@@ -5119,7 +5155,7 @@ else
5119
5155
  props.visibility.showAll()
5120
5156
  queueMicrotask(()=>props.interaction?.select(id))
5121
5157
  }})
5122
- return _$createComponent(Show11,{get when(){return props.visibility.canToggle()
5158
+ return _$createComponent(Show12,{get when(){return props.visibility.canToggle()
5123
5159
  },get children(){return _$createComponent(SelectionBox,{ref(r$){var _ref$=item.ref
5124
5160
  typeof _ref$==="function"?_ref$(r$):item.ref=r$
5125
5161
  },id,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
@@ -5169,10 +5205,10 @@ result += segment
5169
5205
  }
5170
5206
  return result + ellipsis
5171
5207
  }
5172
- function SectionHeaderControl(props){const [width,setWidth]=createSignal22()
5208
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal25()
5173
5209
  const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
5174
5210
  },()=>props.api.theme.current.accent,"control")
5175
- createEffect13(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
5211
+ createEffect14(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
5176
5212
  const label=()=>width()===undefined||props.iconOnly?props.action.label():truncateEnd(props.action.label(),width()-2)
5177
5213
  return _$createComponent(SelectionBox,{ref:(node)=>control.ref(node),get id(){return props.action.id
5178
5214
  },get iconOnly(){return props.iconOnly
@@ -5194,7 +5230,7 @@ return _el$
5194
5230
  }})
5195
5231
  }
5196
5232
  function Section(props){const icons=useIcons()
5197
- const [headerWidth,setHeaderWidth]=createSignal23(0)
5233
+ const [headerWidth,setHeaderWidth]=createSignal26(0)
5198
5234
  const icon=()=>props.section?icons.section(props.section):props.icon
5199
5235
  const theme=()=>props.api.theme.current
5200
5236
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
@@ -5236,7 +5272,7 @@ _$setProp(_el$7,"flexGrow",1)
5236
5272
  _$setProp(_el$7,"minWidth",0)
5237
5273
  _$setProp(_el$7,"justifyContent","flex-end")
5238
5274
  _$insert(_el$7,()=>props.headerControls,null)
5239
- _$insert(_el$7,_$createComponent(Show12,{get when(){return props.headerAction
5275
+ _$insert(_el$7,_$createComponent(Show13,{get when(){return props.headerAction
5240
5276
  },children:(action)=>_$createComponent(SectionHeaderControl,{get api(){return props.api
5241
5277
  },get interaction(){return props.interaction
5242
5278
  },get action(){return action()
@@ -5244,7 +5280,7 @@ _$insert(_el$7,_$createComponent(Show12,{get when(){return props.headerAction
5244
5280
  },get position(){return{section:props.navigationSection??0,row:0,column:1
5245
5281
  }}})
5246
5282
  }),null)
5247
- _$insert(_el$7,_$createComponent(Show12,{get when(){return props.summary
5283
+ _$insert(_el$7,_$createComponent(Show13,{get when(){return props.summary
5248
5284
  },get children(){var _el$8=_$createElement("text")
5249
5285
  _$setProp(_el$8,"wrapMode","none")
5250
5286
  _$setProp(_el$8,"truncate",true)
@@ -5261,7 +5297,7 @@ return _el$8
5261
5297
  return _el$7
5262
5298
  })()]
5263
5299
  }}),null)
5264
- _$insert(_el$,_$createComponent(Show12,{get when(){return props.open
5300
+ _$insert(_el$,_$createComponent(Show13,{get when(){return props.open
5265
5301
  },get children(){return props.children
5266
5302
  }}),null)
5267
5303
  return _el$
@@ -5279,7 +5315,7 @@ return _$createComponent(Section,{get api(){return props.api
5279
5315
  },sectionId:`${PLUGIN_ID}.section.lsp`,get navigationSection(){return navigationSection()
5280
5316
  },title:"LSP",section:"lsp",get summary(){return `${connected()}/${list().length}`
5281
5317
  },get open(){return props.preferences.expanded().lsp
5282
- },onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(Show13,{get when(){return list().length>0
5318
+ },onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(Show14,{get when(){return list().length>0
5283
5319
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
5284
5320
  _$insert(_el$2,()=>disabled()?"LSP is disabled":"Activates as files are read")
5285
5321
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -5404,7 +5440,7 @@ _$insert(_el$,_$createComponent(McpBulkAction,{get api(){return props.api
5404
5440
  }),null)
5405
5441
  _$effect((_$p)=>_$setProp(_el$,"paddingBottom",model.bulkRunning()||model.bulk().status==="error"?1:0,_$p))
5406
5442
  return _el$
5407
- })(),_$createComponent(Show14,{get when(){return model.bulkRunning()
5443
+ })(),_$createComponent(Show15,{get when(){return model.bulkRunning()
5408
5444
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createTextNode(`/`),_el$5=_$createTextNode(`\u2026`)
5409
5445
  _$insertNode(_el$2,_el$3)
5410
5446
  _$insertNode(_el$2,_el$4)
@@ -5414,7 +5450,7 @@ _$insert(_el$2,()=>model.bulk().completed,_el$4)
5414
5450
  _$insert(_el$2,()=>model.bulk().total,_el$5)
5415
5451
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
5416
5452
  return _el$2
5417
- }}),_$createComponent(Show14,{get when(){return model.bulk().status==="error"
5453
+ }}),_$createComponent(Show15,{get when(){return model.bulk().status==="error"
5418
5454
  },get children(){return _$createComponent(McpBulkAction,{get api(){return props.api
5419
5455
  },get interaction(){return props.interaction
5420
5456
  },id:`${PLUGIN_ID}.mcp.retry-all`,get position(){return{section:props.navigationSection,row:3,column:0
@@ -5494,7 +5530,7 @@ return _el$4
5494
5530
  function RequestErrorRow(props){const icons=useIcons()
5495
5531
  const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>props.position,disabled:()=>!props.state.error?.retryable||props.state.status==="loading"||props.state.status==="refreshing",activate:props.onRetry
5496
5532
  })
5497
- return _$createComponent(Show15,{get when(){return props.state.error
5533
+ return _$createComponent(Show16,{get when(){return props.state.error
5498
5534
  },children:(error)=>_$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5499
5535
  },flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5500
5536
  },get onMouseOver(){return item.onMouseOver
@@ -5509,7 +5545,7 @@ _$insert(_el$,()=>icons.icon("error"),_el$2)
5509
5545
  _$insert(_el$,()=>error().message,null)
5510
5546
  _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():props.api.theme.current.error,_$p))
5511
5547
  return _el$
5512
- })(),_$createComponent(Show15,{get when(){return error().retryable
5548
+ })(),_$createComponent(Show16,{get when(){return error().retryable
5513
5549
  },get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Retry`)
5514
5550
  _$insertNode(_el$3,_el$4)
5515
5551
  _$setProp(_el$3,"flexShrink",0)
@@ -5524,7 +5560,7 @@ function SectionRequestBody(props){const icons=useIcons()
5524
5560
  const pending=()=>props.state.status==="loading"
5525
5561
  return(()=>{var _el$5=_$createElement("box")
5526
5562
  _$insert(_el$5,_$createComponent(RequestErrorRow,props),null)
5527
- _$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!pending())()&&!props.hasItems
5563
+ _$insert(_el$5,_$createComponent(Show16,{get when(){return _$memo(()=>!!pending())()&&!props.hasItems
5528
5564
  },get children(){var _el$6=_$createElement("text"),_el$7=_$createTextNode(` `)
5529
5565
  _$insertNode(_el$6,_el$7)
5530
5566
  _$insert(_el$6,()=>icons.icon("pending"),_el$7)
@@ -5532,10 +5568,10 @@ _$insert(_el$6,()=>props.loading,null)
5532
5568
  _$effect((_$p)=>_$setProp(_el$6,"fg",props.api.theme.current.textMuted,_$p))
5533
5569
  return _el$6
5534
5570
  }}),null)
5535
- _$insert(_el$5,_$createComponent(Show15,{get when(){return props.hasItems
5571
+ _$insert(_el$5,_$createComponent(Show16,{get when(){return props.hasItems
5536
5572
  },get children(){return props.children
5537
5573
  }}),null)
5538
- _$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!((props.state.status==="ready"||props.state.status==="refreshing")&&!props.hasItems))()&&!props.state.error
5574
+ _$insert(_el$5,_$createComponent(Show16,{get when(){return _$memo(()=>!!((props.state.status==="ready"||props.state.status==="refreshing")&&!props.hasItems))()&&!props.state.error
5539
5575
  },get children(){var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
5540
5576
  _$insertNode(_el$8,_el$9)
5541
5577
  _$insert(_el$8,()=>icons.icon("info"),_el$9)
@@ -5552,8 +5588,8 @@ return _el$5
5552
5588
  function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5553
5589
  }=input
5554
5590
  const id=`${input.id}.favorite`
5555
- const [rowHovered,setRowHovered]=createSignal24(false)
5556
- const [controlHovered,setControlHovered]=createSignal24(false)
5591
+ const [rowHovered,setRowHovered]=createSignal27(false)
5592
+ const [controlHovered,setControlHovered]=createSignal27(false)
5557
5593
  const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5558
5594
  }),disabled,activate:()=>{onToggle()
5559
5595
  queueMicrotask(()=>interaction?.select(id))
@@ -5669,7 +5705,7 @@ return _el$2
5669
5705
  function SectionFilter(props){const icons=useIcons()
5670
5706
  let input
5671
5707
  let unregisterInput
5672
- const [inputFocused,setInputFocused]=createSignal25(false)
5708
+ const [inputFocused,setInputFocused]=createSignal28(false)
5673
5709
  const theme=()=>props.api.theme.current
5674
5710
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5675
5711
  },activate:()=>{if(!input)
@@ -5690,7 +5726,7 @@ props.interaction.leaveFilter(input)
5690
5726
  else
5691
5727
  input?.blur()
5692
5728
  }
5693
- onCleanup18(()=>unregisterInput?.())
5729
+ onCleanup20(()=>unregisterInput?.())
5694
5730
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5695
5731
  },flexDirection:"row",gap:1,marginTop:1,marginBottom:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>!!highlighted())()?theme().primary:item.backgroundColor()
5696
5732
  },get onMouseOver(){return item.onMouseOver
@@ -5728,7 +5764,7 @@ return _p$
5728
5764
  },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined,h:undefined
5729
5765
  })
5730
5766
  return _el$2
5731
- })(),_$createComponent(Show16,{get when(){return props.query
5767
+ })(),_$createComponent(Show17,{get when(){return props.query
5732
5768
  },get children(){var _el$3=_$createElement("text")
5733
5769
  _$setProp(_el$3,"flexShrink",0)
5734
5770
  _$setProp(_el$3,"onMouseDown",()=>props.onInput(""))
@@ -5757,7 +5793,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
5757
5793
  }},get query(){return props.query
5758
5794
  },placeholder:"Filter MCP...",get onInput(){return props.onQuery
5759
5795
  }}),null)
5760
- _$insert(_el$,_$createComponent(Show17,{get when(){return model.filtered().length>0
5796
+ _$insert(_el$,_$createComponent(Show18,{get when(){return model.filtered().length>0
5761
5797
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
5762
5798
  _$insertNode(_el$2,_$createTextNode(`No matching MCP servers`))
5763
5799
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -5768,7 +5804,7 @@ return _el$2
5768
5804
  },get grouped(){return model.grouped
5769
5805
  },get density(){return props.preferences.rowDensity?.()??"compact"
5770
5806
  },get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
5771
- },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
5807
+ },children:(item,index)=>[_$createComponent(Show18,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
5772
5808
  },get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
5773
5809
  },get interaction(){return props.interaction
5774
5810
  },get bucket(){return item.bucket
@@ -5799,7 +5835,7 @@ return _el$
5799
5835
  }})
5800
5836
  }
5801
5837
  function McpSection(props){const icons=useIcons()
5802
- const [query,setQuery]=createSignal26("")
5838
+ const [query,setQuery]=createSignal29("")
5803
5839
  const model=createMcpSectionModel(props,query)
5804
5840
  const navigationSection=()=>props.navigationSection??6
5805
5841
  const summary=createMemo11(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -5939,7 +5975,7 @@ function QuickActionRow(props){const{api,interaction
5939
5975
  const icons=useIcons()
5940
5976
  const toolbar=useToolbar()
5941
5977
  const theme=()=>api.theme.current
5942
- const [width,setWidth]=createSignal31(0)
5978
+ const [width,setWidth]=createSignal34(0)
5943
5979
  const shortcut=createMemo12(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
5944
5980
  })
5945
5981
  return api.keys.formatBindings(bindings.get(props.action.command))
@@ -5983,7 +6019,7 @@ _$insert(_el$2,()=>props.action.label)
5983
6019
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
5984
6020
  return _el$2
5985
6021
  })()
5986
- },get metadata(){return _$createComponent(Show24,{get when(){return visibleShortcut()
6022
+ },get metadata(){return _$createComponent(Show25,{get when(){return visibleShortcut()
5987
6023
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
5988
6024
  _$setProp(_el$3,"flexShrink",0)
5989
6025
  _$setProp(_el$3,"wrapMode","none")
@@ -5992,12 +6028,12 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
5992
6028
  return _el$3
5993
6029
  })()
5994
6030
  })
5995
- },get trailing(){return _$createComponent(Show24,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6031
+ },get trailing(){return _$createComponent(Show25,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
5996
6032
  },get position(){return props.position
5997
6033
  },get pin(){return{kind:"action",id:props.action.command,icon:"bolt"
5998
6034
  }}})
5999
6035
  }})
6000
- },get details(){return _$createComponent(Show24,{get when(){return props.disabled
6036
+ },get details(){return _$createComponent(Show25,{get when(){return props.disabled
6001
6037
  },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6002
6038
  _$setProp(_el$4,"wrapMode","word")
6003
6039
  _$insert(_el$4,reason)
@@ -6025,18 +6061,19 @@ return _$createComponent(Section,{get api(){return props.api
6025
6061
  },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6026
6062
  },get interaction(){return props.interaction
6027
6063
  },get density(){return props.preferences.rowDensity?.()??"compact"
6028
- },get children(){return [_$createComponent(Show25,{get when(){return actions().length===0
6064
+ },get children(){return [_$createComponent(Show26,{get when(){return actions().length===0
6029
6065
  },get children(){var _el$=_$createElement("text")
6030
6066
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6031
6067
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6032
6068
  return _el$
6033
- }}),_$createComponent(For16,{get each(){return visibility.visible()
6034
- },children:(action,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6035
- },action,get disabled(){return action.disabled
6036
- },get favorite(){return props.preferences.favoriteQuickActions?.().has(action.command)??false
6069
+ }}),_$createComponent(For16,{get each(){return visibility.visible().map((action)=>action.command)
6070
+ },children:(id,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6071
+ },get action(){return visibility.visible()[index()]
6072
+ },get disabled(){return visibility.visible()[index()].disabled
6073
+ },get favorite(){return props.preferences.favoriteQuickActions?.().has(id)??false
6037
6074
  },get favoriteDisabled(){return _$memo(()=>!!props.preferences.ready)()?!props.preferences.ready():false
6038
- },get separator(){return _$memo(()=>!!(index()>0&&(props.preferences.favoriteQuickActions?.().has(visibility.visible()[index()-1].command)??false)))()&&!(props.preferences.favoriteQuickActions?.().has(action.command)??false)
6039
- },onToggleFavorite:()=>props.preferences.toggleFavoriteQuickAction?.(action.command),get position(){return{section:navigationSection(),row:10 + index(),column:0
6075
+ },get separator(){return _$memo(()=>!!(index()>0&&(props.preferences.favoriteQuickActions?.().has(visibility.visible()[index()-1].command)??false)))()&&!(props.preferences.favoriteQuickActions?.().has(id)??false)
6076
+ },onToggleFavorite:()=>props.preferences.toggleFavoriteQuickAction?.(id),get position(){return{section:navigationSection(),row:10 + index(),column:0
6040
6077
  }}})
6041
6078
  })]
6042
6079
  }}),_$createComponent(ListVisibilityControl,{get api(){return props.api
@@ -6091,20 +6128,20 @@ item.activate(event)
6091
6128
 
6092
6129
 
6093
6130
  function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
6094
- createEffect15(()=>{const key=props.preferences.toggleKey()
6131
+ createEffect16(()=>{const key=props.preferences.toggleKey()
6095
6132
  untrack6(()=>shortcuts.bind(key))
6096
6133
  })
6097
- createEffect15(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
6134
+ createEffect16(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
6098
6135
  untrack6(shortcuts.cancel)
6099
6136
  })
6100
- onCleanup19(shortcuts.dispose)
6137
+ onCleanup21(shortcuts.dispose)
6101
6138
  return(()=>{var _el$=_$createElement("box")
6102
6139
  _$setProp(_el$,"position","absolute")
6103
6140
  _$setProp(_el$,"top",0)
6104
6141
  _$setProp(_el$,"left",0)
6105
6142
  _$setProp(_el$,"width","100%")
6106
6143
  _$setProp(_el$,"height","100%")
6107
- _$insert(_el$,_$createComponent(Show26,{get when(){return shortcuts.active()
6144
+ _$insert(_el$,_$createComponent(Show27,{get when(){return shortcuts.active()
6108
6145
  },get children(){return _$createComponent(Suspense4,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
6109
6146
  },get actions(){return shortcuts.actions
6110
6147
  }})
@@ -6119,11 +6156,11 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6119
6156
  })=>({name:name.replace(PLUGIN_ID,()=>LEGACY_PLUGIN_ID),run,enabled
6120
6157
  }))]
6121
6158
  })
6122
- onCleanup19(unregisterCommands)
6123
- createEffect15(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6159
+ onCleanup21(unregisterCommands)
6160
+ createEffect16(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6124
6161
  }]
6125
6162
  })
6126
- onCleanup19(unregister)
6163
+ onCleanup21(unregister)
6127
6164
  })
6128
6165
  return _$createElement("box")
6129
6166
  }
@@ -6143,24 +6180,53 @@ return _$createElement("box")
6143
6180
 
6144
6181
 
6145
6182
 
6146
- function toolbarLayout(keys,width,mode){const columns=Math.max(1,Math.floor((Math.max(3,width) + 1) / 4))
6147
- const shown=mode==="wrap"||keys.length<=columns?keys.length:Math.max(0,columns-1)
6148
- const visible=keys.slice(0,shown)
6149
- const overflow=keys.slice(shown)
6150
- const controls=[...visible,...overflow.length>0?["toolbar:more"]:[]]
6151
- return{columns,overflow,rows:Array.from({length:Math.ceil(controls.length / columns)},(_,row)=>controls.slice(row*columns,(row + 1)*columns))
6152
- }}
6183
+ function toolbarLayout(keys,width,mode,widths){const capacity=Math.max(3,Math.floor(width))
6184
+ const columns=Math.max(1,Math.floor((capacity + 1) / 4))
6185
+ const sizes={}
6186
+ const size=(key)=>Math.max(3,Math.min(capacity,widths?.get(key)??3))
6187
+ const rows=[]
6188
+ let overflow=[]
6189
+ if(mode==="wrap"){let used=0
6190
+ for(const key of keys){const value=size(key)
6191
+ if(rows.length===0||used>0&&used + 1 + value>capacity){rows.push([])
6192
+ used=0
6193
+ }
6194
+ rows.at(-1).push(key)
6195
+ sizes[key]=value
6196
+ used += (used?1:0) + value
6197
+ }} else if(keys.length>0){const fits=keys.reduce((total,key)=>total + size(key),0) + keys.length-1<=capacity
6198
+ const visible=[]
6199
+ let used=0
6200
+ for(const key of keys){const remaining=(fits?capacity:capacity-4)-used-(visible.length>0?1:0)
6201
+ if(remaining<3)
6202
+ break
6203
+ sizes[key]=Math.min(size(key),remaining)
6204
+ used += (visible.length>0?1:0) + sizes[key]
6205
+ visible.push(key)
6206
+ }
6207
+ overflow=keys.slice(visible.length)
6208
+ if(overflow.length>0){visible.push("toolbar:more")
6209
+ sizes["toolbar:more"]=3
6210
+ }
6211
+ rows.push(visible)
6212
+ }
6213
+ return{columns,overflow,rows,...widths&&{sizes}}}
6153
6214
 
6215
+ function toolbarPinWidth(pin){const states=Object.keys({...pin.stateIcons,...pin.stateIconLists})
6216
+ const count=Math.max(toolbarPinIcons(pin).length,...states.map((state)=>toolbarPinIcons(pin,state).length))
6217
+ const iconsWidth=Math.max(0,count*2-1)
6218
+ return 2 + Math.max(1,iconsWidth + (count&&pin.text?1:0) + Bun.stringWidth(pin.text??""))
6219
+ }
6154
6220
  function createToolbarModel(props){const icons=useIcons()
6155
6221
  const revision=createQuickActionRevision(props.api)
6156
6222
  const pins=()=>props.preferences.toolbarPins?.()??[]
6157
6223
  const needsSkills=createMemo14(()=>pins().some((pin)=>pin.kind==="skill"))
6158
6224
  const target=createMemo14(()=>props.skills.target())
6159
- createEffect16(()=>{if(!needsSkills())
6225
+ createEffect17(()=>{if(!needsSkills())
6160
6226
  return
6161
6227
  const current=target()
6162
6228
  const release=untrack7(()=>props.skills.activate(current))
6163
- onCleanup20(release)
6229
+ onCleanup22(release)
6164
6230
  untrack7(()=>{props.skills.refresh(current).catch(()=>{})
6165
6231
  })
6166
6232
  })
@@ -6168,12 +6234,12 @@ function view(pin){revision()
6168
6234
  if(pin.kind==="action"){const action=QUICK_ACTIONS.find((item)=>item.command===pin.id)
6169
6235
  const state=quickActionState(props.api,pin.id)
6170
6236
  const stateLabel=quickActionStates(props.api,pin.id).find((item)=>item.id===state)?.label
6171
- return{label:quickActionLabel(props.api,action),stateLabel,icon:state?pin.stateIcons?.[state]??pin.icon:pin.icon,reason:quickActionDisabledReason(props.api,action)
6237
+ return{label:quickActionLabel(props.api,action),stateLabel,icons:toolbarPinIcons(pin,state),text:pin.text,reason:quickActionDisabledReason(props.api,action)
6172
6238
  }}
6173
6239
  const skill=props.skills.list(target()).find((item)=>item.location===pin.location&&item.name===pin.name)
6174
6240
  const request=props.skills.state(target())
6175
6241
  const unavailable=request.status==="loading"?"Loading Skills":"Skill is unavailable in this workspace"
6176
- return{label:pin.name,icon:pin.icon,stateLabel:undefined,reason:request.error?.message??(skill?skillUnavailable(props.skills,skill):unavailable)
6242
+ return{label:pin.name,icons:toolbarPinIcons(pin),text:pin.text,stateLabel:undefined,reason:request.error?.message??(skill?skillUnavailable(props.skills,skill):unavailable)
6177
6243
  }}
6178
6244
  function run(key){const pin=pins().find((item)=>toolbarPinKey(item)===key)
6179
6245
  if(!pin)
@@ -6196,36 +6262,68 @@ const route=JSON.stringify(props.api.route.current)
6196
6262
  const dialogs=createDialogStack(props.api,icons.style,()=>route===JSON.stringify(props.api.route.current),icons.multilineCorners)
6197
6263
  activateSkill({api:props.api,controller:props.skills,access:props.preferences,skill,dialogs})
6198
6264
  }
6199
- return{pins,view,run}}
6265
+ return{pins,view,run,width:toolbarPinWidth}}
6266
+
6267
+
6268
+
6269
+
6200
6270
 
6201
6271
 
6202
6272
 
6203
6273
  function ToolbarButton(props){const icons=useIcons()
6204
- const [hovered,setHovered]=createSignal32(false)
6274
+ const foreground=()=>props.reason?props.api.theme.current.textMuted:item.foregroundColor()
6275
+ const [hovered,setHovered]=createSignal35(false)
6205
6276
  const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>({section:0,row:props.row + 1,column:props.column
6206
6277
  }),activate:props.onRun
6207
6278
  },()=>props.reason?props.api.theme.current.textMuted:props.api.theme.current.accent,"control")
6208
- createEffect17(()=>props.onDetails(props.id,item.focused()||hovered()))
6209
- onCleanup21(()=>props.onDetails(props.id,false))
6210
- return _$createComponent(IconControl,{get id(){return props.id
6279
+ const content=()=>[props.icons.map((icon)=>terminalIcon(icon,icons.style())).join(" "),props.text].filter(Boolean).join(" ")
6280
+ createEffect18(()=>props.onDetails(props.id,item.focused()||hovered()))
6281
+ onCleanup23(()=>props.onDetails(props.id,false))
6282
+ return _$createComponent(Show28,{get when(){return _$memo(()=>!!(props.width===3&&props.icons.length===1))()&&!props.text
6283
+ },get fallback(){return _$createComponent(SelectionBox,{get id(){return props.id
6284
+ },ref(r$){var _ref$2=item.ref
6285
+ typeof _ref$2==="function"?_ref$2(r$):item.ref=r$
6286
+ },get width(){return props.width
6287
+ },height:1,flexShrink:0,alignItems:"center",justifyContent:"center",get backgroundColor(){return item.backgroundColor()
6288
+ },onMouseOver:(event)=>{event.stopPropagation()
6289
+ item.onMouseOver()
6290
+ setHovered(true)
6291
+ },onMouseOut:(event)=>{event.stopPropagation()
6292
+ item.onMouseOut()
6293
+ setHovered(false)
6294
+ },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
6295
+ item.activate(event)
6296
+ },get children(){var _el$=_$createElement("text")
6297
+ _$setProp(_el$,"height",1)
6298
+ _$setProp(_el$,"minWidth",0)
6299
+ _$setProp(_el$,"maxWidth","100%")
6300
+ _$setProp(_el$,"truncate",true)
6301
+ _$setProp(_el$,"wrapMode","none")
6302
+ _$insert(_el$,content)
6303
+ _$effect((_$p)=>_$setProp(_el$,"fg",foreground(),_$p))
6304
+ return _el$
6305
+ }})
6306
+ },get children(){return _$createComponent(IconControl,{get id(){return props.id
6211
6307
  },ref(r$){var _ref$=item.ref
6212
6308
  typeof _ref$==="function"?_ref$(r$):item.ref=r$
6213
- },get icon(){return terminalIcon(props.icon,icons.style())
6309
+ },get icon(){return terminalIcon(props.icons[0]??"bolt",icons.style())
6214
6310
  },get backgroundColor(){return item.backgroundColor()
6215
- },get foregroundColor(){return _$memo(()=>!!props.reason)()?props.api.theme.current.textMuted:item.foregroundColor()
6311
+ },get foregroundColor(){return foreground()
6216
6312
  },onMouseOver:()=>{item.onMouseOver()
6217
6313
  setHovered(true)
6218
6314
  },onMouseOut:()=>{item.onMouseOut()
6219
6315
  setHovered(false)
6220
6316
  },onMouseUp:(event)=>item.activate(event)
6221
6317
  })
6318
+ }})
6222
6319
  }
6223
6320
  function SidebarToolbar(props){const model=createToolbarModel(props)
6224
6321
  const icons=useIcons()
6225
- const [width,setWidth]=createSignal33(3)
6226
- const [detail,setDetail]=createSignal33()
6322
+ const [width,setWidth]=createSignal36(3)
6323
+ const [detail,setDetail]=createSignal36()
6227
6324
  const keys=createMemo15(()=>model.pins().map((pin)=>toolbarPinKey(pin)))
6228
- const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu"))
6325
+ const widths=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),model.width(pin)])))
6326
+ const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu",widths()))
6229
6327
  const rows=createMemo15(()=>layout().rows.map((_,index)=>index))
6230
6328
  const byKey=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),pin])))
6231
6329
  const view=(key)=>{const pin=byKey().get(key)
@@ -6250,9 +6348,10 @@ dialogs.close()
6250
6348
  model.run(option.value)
6251
6349
  }}))
6252
6350
  }
6253
- return _$createComponent(Show27,{get when(){return keys().length>0
6351
+ return _$createComponent(Show29,{get when(){return keys().length>0
6254
6352
  },get children(){var _el$=_$createElement("box")
6255
6353
  _$setProp(_el$,"id","opencode-navigator.toolbar")
6354
+ _$setProp(_el$,"overflow","visible")
6256
6355
  _$setProp(_el$,"onSizeChange",function(){setWidth(this.width)
6257
6356
  })
6258
6357
  _$insert(_el$,_$createComponent(For17,{get each(){return rows()
@@ -6262,7 +6361,9 @@ _$setProp(_el$2,"gap",1)
6262
6361
  _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6263
6362
  },children:(key,column)=>_$createComponent(ToolbarButton,_$mergeProps(props,{id:`opencode-navigator.toolbar.${key}`,row,get column(){return column()
6264
6363
  },get label(){return view(key)?.label??"More"
6265
- },get icon(){return key==="toolbar:more"?"list":view(key)?.icon??"bolt"
6364
+ },get icons(){return key==="toolbar:more"?["list"]:view(key)?.icons??["bolt"]
6365
+ },get text(){return view(key)?.text
6366
+ },get width(){return layout().sizes?.[key]??3
6266
6367
  },get reason(){return view(key)?.reason
6267
6368
  },onRun:()=>key==="toolbar:more"?showMore():model.run(key),onDetails:(_id,active)=>setDetail((current)=>active?key:current===key?undefined:current)
6268
6369
  }))
@@ -6270,13 +6371,21 @@ _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6270
6371
  return _el$2
6271
6372
  })()
6272
6373
  }),null)
6273
- _$insert(_el$,_$createComponent(Show27,{get when(){return details()
6374
+ _$insert(_el$,_$createComponent(Show29,{get when(){return details()
6274
6375
  },children:(text)=>(()=>{var _el$3=_$createElement("text")
6376
+ _$setProp(_el$3,"position","absolute")
6377
+ _$setProp(_el$3,"left",0)
6378
+ _$setProp(_el$3,"width","100%")
6275
6379
  _$setProp(_el$3,"height",1)
6276
6380
  _$setProp(_el$3,"truncate",true)
6277
6381
  _$setProp(_el$3,"wrapMode","none")
6278
6382
  _$insert(_el$3,text)
6279
- _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
6383
+ _$effect((_p$)=>{var _v$=rows().length,_v$2=props.api.theme.current.textMuted
6384
+ _v$!==_p$.e&&(_p$.e=_$setProp(_el$3,"top",_v$,_p$.e))
6385
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
6386
+ return _p$
6387
+ },{e:undefined,t:undefined
6388
+ })
6280
6389
  return _el$3
6281
6390
  })()
6282
6391
  }),null)
@@ -6302,9 +6411,9 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
6302
6411
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
6303
6412
  })
6304
6413
  const state=createMemo16(()=>props.controller.state(target()))
6305
- createEffect18(()=>{const current=target()
6414
+ createEffect19(()=>{const current=target()
6306
6415
  const deactivate=untrack8(()=>props.controller.activate?.(current)??(()=>{}))
6307
- onCleanup22(deactivate)
6416
+ onCleanup24(deactivate)
6308
6417
  untrack8(()=>void props.controller.refresh(current).catch(()=>{}))
6309
6418
  })
6310
6419
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
@@ -6356,7 +6465,7 @@ _$insert(_el$,()=>props.item.name,null)
6356
6465
  _$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
6357
6466
  return _el$
6358
6467
  })()
6359
- },get trailing(){return _$createComponent(Show28,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6468
+ },get trailing(){return _$createComponent(Show30,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6360
6469
  },get position(){return props.position
6361
6470
  },get pin(){return{kind:"skill",name:props.item.name,location:props.item.location,icon:"book"
6362
6471
  }}})
@@ -6365,7 +6474,7 @@ return _el$
6365
6474
  }
6366
6475
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6367
6476
  const toolbar=useToolbar()
6368
- const [query,setQuery]=createSignal34("")
6477
+ const [query,setQuery]=createSignal37("")
6369
6478
  const model=createSkillSectionModel(props,query)
6370
6479
  const navigationSection=()=>props.navigationSection??3
6371
6480
  function selectSkill(item){activateSkill({api:props.api,controller:props.controller,access:props.preferences,dialogs,skill:item,onConfigure:toolbar?(navigation)=>toolbar.configure({kind:"skill",name:item.name,location:item.location,icon:"book"
@@ -6389,7 +6498,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6389
6498
  }},get query(){return query()
6390
6499
  },placeholder:"Filter skills...",onInput:setQuery
6391
6500
  }),null)
6392
- _$insert(_el$,_$createComponent(Show29,{get when(){return model.filtered().length>0
6501
+ _$insert(_el$,_$createComponent(Show31,{get when(){return model.filtered().length>0
6393
6502
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6394
6503
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6395
6504
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -6400,7 +6509,7 @@ return _el$2
6400
6509
  },get grouped(){return model.grouped
6401
6510
  },get density(){return props.preferences.rowDensity?.()??"compact"
6402
6511
  },get children(){return _$createComponent(For18,{get each(){return model.visibility.visible()
6403
- },children:(item,index)=>[_$createComponent(Show29,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6512
+ },children:(item,index)=>[_$createComponent(Show31,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6404
6513
  },get children(){var _el$4=_$createElement("text")
6405
6514
  _$setProp(_el$4,"height",1)
6406
6515
  _$setProp(_el$4,"wrapMode","none")
@@ -6445,18 +6554,18 @@ return _el$
6445
6554
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6446
6555
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6447
6556
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6448
- const [query,setQuery]=createSignal35("")
6449
- const [mode,setMode]=createSignal35("all")
6557
+ const [query,setQuery]=createSignal38("")
6558
+ const [mode,setMode]=createSignal38("all")
6450
6559
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6451
6560
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6452
6561
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
6453
6562
  const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
6454
6563
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6455
- createEffect19(()=>{targetKey()
6564
+ createEffect20(()=>{targetKey()
6456
6565
  setQuery("")
6457
6566
  setMode("all")
6458
6567
  })
6459
- createEffect19(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6568
+ createEffect20(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6460
6569
  setMode("all")
6461
6570
  })
6462
6571
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
@@ -6466,10 +6575,10 @@ const now=createSubagentClock(clockKey)
6466
6575
  const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
6467
6576
  const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
6468
6577
  const state=createMemo17(()=>props.controller.state(props.sessionID))
6469
- createEffect19(()=>{const sessionID=props.sessionID
6578
+ createEffect20(()=>{const sessionID=props.sessionID
6470
6579
  targetKey()
6471
6580
  const deactivate=untrack9(()=>props.controller.activate?.(sessionID)??(()=>{}))
6472
- onCleanup23(deactivate)
6581
+ onCleanup25(deactivate)
6473
6582
  untrack9(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6474
6583
  })
6475
6584
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
@@ -6527,7 +6636,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6527
6636
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6528
6637
  return _el$3
6529
6638
  })()
6530
- },get details(){return [_$createComponent(Show30,{get when(){return props.item.run?.errorMessage
6639
+ },get details(){return [_$createComponent(Show32,{get when(){return props.item.run?.errorMessage
6531
6640
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6532
6641
  _$insertNode(_el$4,_el$5)
6533
6642
  _$setProp(_el$4,"wrapMode","word")
@@ -6535,12 +6644,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6535
6644
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6536
6645
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6537
6646
  return _el$4
6538
- }}),_$createComponent(Show30,{get when(){return props.item.unavailable
6647
+ }}),_$createComponent(Show32,{get when(){return props.item.unavailable
6539
6648
  },get children(){var _el$6=_$createElement("text")
6540
6649
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6541
6650
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6542
6651
  return _el$6
6543
- }}),_$createComponent(Show30,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6652
+ }}),_$createComponent(Show32,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6544
6653
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6545
6654
  _$insertNode(_el$0,_el$1)
6546
6655
  _$insertNode(_el$0,_el$10)
@@ -6552,7 +6661,7 @@ _$insert(_el$0,()=>status().message,null)
6552
6661
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6553
6662
  return _el$0
6554
6663
  })()
6555
- }),_$createComponent(Show30,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6664
+ }),_$createComponent(Show32,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6556
6665
  },get children(){var _el$8=_$createElement("text")
6557
6666
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6558
6667
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6568,7 +6677,7 @@ function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){
6568
6677
  const item=()=>props.itemById(id)??initial
6569
6678
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6570
6679
  return(()=>{var _el$=_$createElement("box")
6571
- _$insert(_el$,_$createComponent(Show31,{get when(){return startsGroup()
6680
+ _$insert(_el$,_$createComponent(Show33,{get when(){return startsGroup()
6572
6681
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6573
6682
  _$insertNode(_el$2,_el$3)
6574
6683
  _$insert(_el$3,()=>item().group)
@@ -6594,7 +6703,7 @@ return _$createComponent(Section,{get api(){return props.api
6594
6703
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6595
6704
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6596
6705
  },get open(){return props.preferences.expanded().subagents
6597
- },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show32,{get when(){return model.parentID()
6706
+ },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show34,{get when(){return model.parentID()
6598
6707
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6599
6708
  },get interaction(){return props.interaction
6600
6709
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6628,7 +6737,7 @@ _$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
6628
6737
  },onActivate:()=>model.setMode(value)
6629
6738
  })
6630
6739
  }))
6631
- _$insert(_el$,_$createComponent(Show32,{get when(){return model.filtered().length===0
6740
+ _$insert(_el$,_$createComponent(Show34,{get when(){return model.filtered().length===0
6632
6741
  },get children(){var _el$3=_$createElement("text")
6633
6742
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6634
6743
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6729,7 +6838,7 @@ _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":
6729
6838
  _$setProp(_el$3,"flexGrow",1)
6730
6839
  _$setProp(_el$3,"wrapMode","word")
6731
6840
  _$insert(_el$3,()=>props.item.content)
6732
- _$insert(_el$,_$createComponent(Show33,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6841
+ _$insert(_el$,_$createComponent(Show35,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6733
6842
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
6734
6843
  _$insertNode(_el$4,_el$5)
6735
6844
  _$setProp(_el$4,"width",2)
@@ -6765,7 +6874,7 @@ _$insert(_el$2,_$createComponent(For21,{each:["all","active","finished"],childre
6765
6874
  },onActivate:()=>props.setMode(value)
6766
6875
  })
6767
6876
  }))
6768
- _$insert(_el$,_$createComponent(Show34,{get when(){return props.view.rows.length>0
6877
+ _$insert(_el$,_$createComponent(Show36,{get when(){return props.view.rows.length>0
6769
6878
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6770
6879
  },get mode(){return props.mode
6771
6880
  }})
@@ -6775,7 +6884,7 @@ _$insert(_el$,_$createComponent(Show34,{get when(){return props.view.rows.length
6775
6884
  },get children(){return _$createComponent(For21,{get each(){return props.visibility.visible()
6776
6885
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6777
6886
  return(()=>{var _el$3=_$createElement("box")
6778
- _$insert(_el$3,_$createComponent(Show34,{get when(){return startsGroup()
6887
+ _$insert(_el$3,_$createComponent(Show36,{get when(){return startsGroup()
6779
6888
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
6780
6889
  _$insertNode(_el$4,_el$5)
6781
6890
  _$insert(_el$5,()=>row.group)
@@ -6812,7 +6921,7 @@ return _el$6
6812
6921
 
6813
6922
 
6814
6923
  function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
6815
- return _$createComponent(Show35,{get when(){return state().available
6924
+ return _$createComponent(Show37,{get when(){return state().available
6816
6925
  },get children(){var _el$=_$createElement("box")
6817
6926
  _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6818
6927
  },get interaction(){return props.interaction
@@ -6822,7 +6931,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6822
6931
  },get disabled(){return state().saving
6823
6932
  },onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
6824
6933
  }),null)
6825
- _$insert(_el$,_$createComponent(Show35,{get when(){return state().error
6934
+ _$insert(_el$,_$createComponent(Show37,{get when(){return state().error
6826
6935
  },children:(message)=>(()=>{var _el$2=_$createElement("text")
6827
6936
  _$setProp(_el$2,"wrapMode","word")
6828
6937
  _$insert(_el$2,message)
@@ -6838,21 +6947,21 @@ const icons=useIcons()
6838
6947
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6839
6948
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6840
6949
  const native=()=>("source" in props.controller)&&props.controller.source==="native"
6841
- const [mode,setMode]=createSignal36("all")
6950
+ const [mode,setMode]=createSignal39("all")
6842
6951
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6843
- createEffect20(()=>{targetKey()
6952
+ createEffect21(()=>{targetKey()
6844
6953
  setMode("all")
6845
6954
  })
6846
6955
  const view=createMemo18(()=>buildTodoView(list(),mode()))
6847
6956
  const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
6848
6957
  })
6849
6958
  const state=createMemo18(()=>props.controller.state(props.sessionID))
6850
- createEffect20(()=>{const sessionID=props.sessionID
6959
+ createEffect21(()=>{const sessionID=props.sessionID
6851
6960
  targetKey()
6852
6961
  if(unavailable())
6853
6962
  return
6854
6963
  const deactivate=untrack10(()=>props.controller.activate?.(sessionID)??(()=>{}))
6855
- onCleanup24(deactivate)
6964
+ onCleanup26(deactivate)
6856
6965
  untrack10(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6857
6966
  })
6858
6967
  const navigationSection=()=>props.navigationSection??1
@@ -6863,15 +6972,15 @@ return _$createComponent(Section,{get api(){return props.api
6863
6972
  },get headerAction(){return native()?{id:`${PLUGIN_ID}.todo.refresh`,label:()=>`${icons.icon("retry")} Refresh`,disabled:()=>state().status==="loading"||state().status==="refreshing",onActivate:()=>{props.controller.refresh(props.sessionID).catch(()=>{})
6864
6973
  }}:undefined
6865
6974
  },get open(){return props.preferences.expanded().todo
6866
- },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show36,{get when(){return unavailable()
6975
+ },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show38,{get when(){return unavailable()
6867
6976
  },get fallback(){return(()=>{var _el$=_$createElement("box")
6868
6977
  _$setProp(_el$,"gap",1)
6869
- _$insert(_el$,_$createComponent(Show36,{get when(){return native()
6978
+ _$insert(_el$,_$createComponent(Show38,{get when(){return native()
6870
6979
  },get children(){return _$createComponent(NativeTodoNotice,{get api(){return props.api
6871
6980
  },get empty(){return list().length===0
6872
6981
  }})
6873
6982
  }}),null)
6874
- _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.guidance(props.sessionID).available
6983
+ _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.guidance(props.sessionID).available
6875
6984
  },get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
6876
6985
  },get controller(){return managed()
6877
6986
  },get sessionID(){return props.sessionID
@@ -6879,7 +6988,7 @@ _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.guidance(pr
6879
6988
  },get navigationSection(){return navigationSection()
6880
6989
  }})
6881
6990
  }}),null)
6882
- _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.missing(props.sessionID)
6991
+ _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.missing(props.sessionID)
6883
6992
  },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6884
6993
  },get interaction(){return props.interaction
6885
6994
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6916,7 +7025,7 @@ return _el$4
6916
7025
  }
6917
7026
  function SidebarContent(props){const sections=props.preferences.sections
6918
7027
  const visibleSections=createMemo19(()=>props.preferences.sectionOrder().filter((section)=>sections()[section]&&supportsSidebarSection(props.api,section)))
6919
- onCleanup25(()=>props.interaction.setContentRoot(undefined))
7028
+ onCleanup27(()=>props.interaction.setContentRoot(undefined))
6920
7029
  return _$createComponent(ToolbarProvider,{get api(){return props.api
6921
7030
  },get preferences(){return props.preferences
6922
7031
  },get skills(){return props.skills
@@ -6968,7 +7077,7 @@ return _el$
6968
7077
 
6969
7078
 
6970
7079
  function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
6971
- createEffect21(()=>{if(!props.api.state.ready)
7080
+ createEffect22(()=>{if(!props.api.state.ready)
6972
7081
  return
6973
7082
  persist()
6974
7083
  const route=props.api.route.current
@@ -6976,12 +7085,12 @@ const params="params" in route?route.params:undefined
6976
7085
  if(typeof params?.sessionID!=="string")
6977
7086
  return
6978
7087
  const current=props.controller.target()
6979
- onCleanup26(()=>props.controller.deactivate(current))
7088
+ onCleanup28(()=>props.controller.deactivate(current))
6980
7089
  untrack11(()=>void props.controller.activate(current).catch(()=>{}))
6981
7090
  })
6982
7091
  return _$createElement("box")
6983
7092
  }
6984
- function PreferencesPersistence(props){createEffect21(()=>{const location=currentLocation(props.api)
7093
+ function PreferencesPersistence(props){createEffect22(()=>{const location=currentLocation(props.api)
6985
7094
  untrack11(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
6986
7095
  })))
6987
7096
  props.controller.load()
@@ -6989,7 +7098,7 @@ props.controller.load()
6989
7098
  return _$createElement("box")
6990
7099
  }
6991
7100
  function FirstRunWizardPersistence(props){let isChecked=false
6992
- createEffect21(()=>{if(isChecked)
7101
+ createEffect22(()=>{if(isChecked)
6993
7102
  return
6994
7103
  isChecked=true
6995
7104
  showFirstRunWizard(props.api,props.preferences).catch(()=>{})
@@ -7016,7 +7125,7 @@ const settingsId=`${PLUGIN_ID}.settings`
7016
7125
  const settings=useSidebarItem(props.api,props.interaction,{id:settingsId,position:{section:0,row:0,column:0
7017
7126
  },activate:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
7018
7127
  },()=>theme().textMuted,"control")
7019
- onCleanup27(()=>props.interaction.setTitleRoot(undefined))
7128
+ onCleanup29(()=>props.interaction.setTitleRoot(undefined))
7020
7129
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box"),_el$3=_$createElement("box")
7021
7130
  _$insertNode(_el$,_el$2)
7022
7131
  _$use((node)=>props.interaction.setTitleRoot(node),_el$)
@@ -7027,7 +7136,7 @@ _$setProp(_el$2,"flexDirection","row")
7027
7136
  _$setProp(_el$2,"justifyContent","space-between")
7028
7137
  _$setProp(_el$2,"gap",1)
7029
7138
  _$setProp(_el$3,"flexGrow",1)
7030
- _$insert(_el$3,_$createComponent(Show37,{get when(){return props.preferences.showSessionTitle()
7139
+ _$insert(_el$3,_$createComponent(Show39,{get when(){return props.preferences.showSessionTitle()
7031
7140
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
7032
7141
  _$insertNode(_el$4,_el$5)
7033
7142
  _$setProp(_el$4,"wrapMode","word")
@@ -7035,7 +7144,7 @@ _$insert(_el$5,()=>props.title)
7035
7144
  _$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
7036
7145
  return _el$4
7037
7146
  }}),null)
7038
- _$insert(_el$3,_$createComponent(Show37,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7147
+ _$insert(_el$3,_$createComponent(Show39,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7039
7148
  },children:(value)=>(()=>{var _el$6=_$createElement("text")
7040
7149
  _$insert(_el$6,value)
7041
7150
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
@@ -7084,11 +7193,11 @@ function createLimitsRefresh(options,schedule=scheduleInterval){let disposed=fal
7084
7193
  const selectedKey=createMemo22(()=>JSON.stringify(options.selectedModel?.()))
7085
7194
  const targetKey=createMemo22(()=>JSON.stringify(options.controller.current().model))
7086
7195
  const interval=createMemo22(()=>(parseLimitsRefreshMinutes(options.refreshMinutes?.())??DEFAULT_LIMITS_REFRESH_MINUTES)*60000)
7087
- createEffect22(on2(selectedKey,()=>{const model=options.selectedModel?.()
7196
+ createEffect23(on2(selectedKey,()=>{const model=options.selectedModel?.()
7088
7197
  if(model&&options.accountSource)
7089
7198
  options.accountSource.refresh(model).catch(()=>{})
7090
7199
  }))
7091
- createEffect22(on2(targetKey,()=>{const{model,adapter}=options.controller.current()
7200
+ createEffect23(on2(targetKey,()=>{const{model,adapter}=options.controller.current()
7092
7201
  if(model&&adapter)
7093
7202
  options.controller.refresh()
7094
7203
  }))
@@ -7101,14 +7210,21 @@ await options.accountSource.refresh(model)
7101
7210
  if(!disposed&&target===targetKey())
7102
7211
  await options.controller.refresh()
7103
7212
  }
7104
- createEffect22(on2(interval,(milliseconds)=>{onCleanup28(schedule(()=>void refresh().catch(()=>{}),milliseconds))
7213
+ createEffect23(on2(interval,(milliseconds)=>{onCleanup30(schedule(()=>void refresh().catch(()=>{}),milliseconds))
7105
7214
  }))
7106
- onCleanup28(()=>{disposed=true
7215
+ onCleanup30(()=>{disposed=true
7107
7216
  })
7108
7217
  }
7109
7218
  function LimitsPersistence(props){createLimitsRefresh(props)
7110
7219
  return _$createElement("box")
7111
7220
  }
7221
+ function bindNavigatorAbout(api,status,updates,notes){const dispose=registerNavigatorAboutServices(api,{navigatorVersion:"0.24.0",openCodeVersion:api.app.version,checkState:()=>status.navigatorCheckState?.()??{status:"idle"},checking:()=>status.navigatorCheckState?.().status==="checking",updating:updates.navigatorUpdating,installed:updates.navigatorInstalled,check:()=>status.refreshNavigator?.()??Promise.resolve("unavailable"),update(dialogs){const target=status.navigatorUpdate()
7222
+ if(target)
7223
+ updates.navigator(target,dialogs)
7224
+ },changelog:async ()=>notes.parseChangelog(await notes.readBundledChangelog())
7225
+ })
7226
+ api.lifecycle.onDispose(dispose)
7227
+ }
7112
7228
  import {homedir} from "os"
7113
7229
 
7114
7230
  function location(input){return input.directory?{location:{directory:input.directory}}:{}}
@@ -7238,7 +7354,7 @@ context.keymap.dispatch(command.id)
7238
7354
  context.renderer.keyInput.on("keypress",onKeypress)
7239
7355
  const keymap={registerLayer(layer){const id=++sequence
7240
7356
  const owner=getOwner()
7241
- const [active,setActive]=createSignal37(true)
7357
+ const [active,setActive]=createSignal40(true)
7242
7358
  const install=()=>{context.keymap.layer(()=>({mode:typeof layer.mode==="string"?layer.mode:"base",priority:layer.priority,enabled:()=>active()&&enabled(layer.enabled),target:layer.target?()=>layer.target:undefined,commands:v2LayerCommands(id,layer,()=>true,run,context.keymap.dispatch)
7243
7359
  }))
7244
7360
  }
@@ -7283,7 +7399,7 @@ cleanups.clear()
7283
7399
  context.renderer.keyInput.off("keypress",onKeypress)
7284
7400
  }}}
7285
7401
 
7286
- function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal38({})
7402
+ function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal41({})
7287
7403
  const projections=new WeakMap
7288
7404
  function normalize(info){const directory=info.location.directory
7289
7405
  const workspaceID=context.location?.directory===directory?context.location.workspaceID:undefined
@@ -7346,25 +7462,16 @@ return context.data.session.message.list(route.sessionID).some((message)=>(!reve
7346
7462
  }
7347
7463
 
7348
7464
 
7349
- function createV2UI(context){let dialogOpen=false
7350
- function DialogPrompt(props){let active=true
7351
- onCleanup29(()=>{active=false
7352
- })
7353
- onMount6(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7354
- })
7355
- if(!active)
7356
- return
7357
- if(value===undefined)
7358
- props.onCancel?.()
7359
- else
7360
- props.onConfirm?.(value)
7361
- })
7362
- return _$createElement("box")
7465
+
7466
+
7467
+ function createV2UI(context,api){let dialogOpen=false
7468
+ function DialogPrompt(props){return _$createComponent(SingleLinePrompt,_$mergeProps({get api(){return api()
7469
+ }},props))
7363
7470
  }
7364
7471
  function DialogConfirm(props){let active=true
7365
- onCleanup29(()=>{active=false
7472
+ onCleanup31(()=>{active=false
7366
7473
  })
7367
- onMount6(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7474
+ onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7368
7475
  })
7369
7476
  if(!active)
7370
7477
  return
@@ -7404,7 +7511,7 @@ const keymap=createV2Keymap(context)
7404
7511
  disposers.push(keymap.dispose)
7405
7512
  const sessions=createV2SessionAdapter(context)
7406
7513
  const remote=createV2ClientAdapter(context)
7407
- const ui=createV2UI(context)
7514
+ const ui=createV2UI(context,()=>api)
7408
7515
  const onDispose=(dispose)=>{disposers.push(dispose)
7409
7516
  return()=>{const index=disposers.indexOf(dispose)
7410
7517
  if(index!==-1)
@@ -7572,7 +7679,7 @@ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js"
7572
7679
  const limitsModule=await import(limitsPath)
7573
7680
  const LimitsSection=limitsModule.ProviderLimitsSection
7574
7681
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7575
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.23.0",hostContext)
7682
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.24.0",hostContext)
7576
7683
  const mcp=createMcpController(api,preferences.persistMcp,preferences,nativeSources?.mcp)
7577
7684
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont,sidebarShortcutActions(api)))
7578
7685
  const startup=createStartupSessionController(api,preferences)
@@ -7601,7 +7708,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7601
7708
  },interaction,skills,subagents,mcp
7602
7709
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7603
7710
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7604
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.23.0"
7711
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.24.0"
7605
7712
  }),_$createComponent(McpPersistence,{api,controller:mcp
7606
7713
  })]
7607
7714
  }})
@@ -7632,14 +7739,16 @@ throw result.error
7632
7739
  }
7633
7740
  return result.data?.type==="text"?result.data.content:undefined
7634
7741
  })
7742
+ const updateServices=await loadNavigatorUpdates()
7635
7743
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV1VersionUpdater
7636
- }=await loadNavigatorUpdates()
7637
- const versionStatus=createVersionStatus(api,"0.23.0")
7638
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.23.0"))
7744
+ }=updateServices
7745
+ const versionStatus=createVersionStatus(api,"0.24.0")
7746
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.24.0"))
7747
+ bindNavigatorAbout(api,versionStatus,versionUpdates,updateServices)
7639
7748
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7640
7749
  },get multilineCorners(){return preferences.cornerFont
7641
7750
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7642
- },navigatorVersion:"0.23.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7751
+ },navigatorVersion:"0.24.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7643
7752
  },get onNavigatorUpdate(){return versionUpdates.navigator
7644
7753
  }})
7645
7754
  }})
@@ -7653,17 +7762,19 @@ return
7653
7762
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7654
7763
  }))
7655
7764
  },todo,context)
7765
+ const updateServices=await loadNavigatorUpdates()
7656
7766
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV2VersionUpdater
7657
- }=await loadNavigatorUpdates()
7658
- const versionStatus=createVersionStatus(adapter.api,"0.23.0")
7659
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.23.0"))
7767
+ }=updateServices
7768
+ const versionStatus=createVersionStatus(adapter.api,"0.24.0")
7769
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.24.0"))
7770
+ bindNavigatorAbout(adapter.api,versionStatus,versionUpdates,updateServices)
7660
7771
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7661
7772
  },get multilineCorners(){return preferences.cornerFont
7662
7773
  },get children(){var _el$=_$createElement("box")
7663
7774
  _$setProp(_el$,"flexDirection","row")
7664
7775
  _$setProp(_el$,"justifyContent","space-between")
7665
7776
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7666
- },navigatorVersion:"0.23.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7777
+ },navigatorVersion:"0.24.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7667
7778
  },get onNavigatorUpdate(){return versionUpdates.navigator
7668
7779
  }}),null)
7669
7780
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7678,5 +7789,5 @@ await adapter.dispose()
7678
7789
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7679
7790
  }
7680
7791
  var plugin_default=plugin
7681
- export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,IconControl,IconPicker,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,QUICK_ACTION_IDS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,Tab,TodoSection,createDialogStack,createMcpController,createNativeTodoController,createPreferencesController,createQuickActionRevision,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,currentPermissionMode,plugin_default as default,hostCapabilities,hostCapabilityUnavailable,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,orderQuickActionIds,parseQuickActionOrder,parseQuickActionVisibility,quickActionDisabledReason,quickActionLabel,quickActionRequiresSession,quickActionState,quickActionStates,setHostCapabilities,setQuickActionStateSource,showFirstRunWizard,subtleLineColor,supportsPermissionMode,supportsSidebarSection,supportsTitleVisibility,terminalIcon,terminalIconIDs,terminalIconLabel,useDialogScroll,useDialogState,useDialogs,useIcons
7792
+ export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,IconControl,IconPicker,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,QUICK_ACTION_IDS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,Tab,TodoSection,createDialogStack,createMcpController,createNativeTodoController,createPreferencesController,createQuickActionRevision,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,currentPermissionMode,plugin_default as default,getNavigatorAboutServices,hostCapabilities,hostCapabilityUnavailable,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,orderQuickActionIds,parseQuickActionOrder,parseQuickActionVisibility,quickActionDisabledReason,quickActionLabel,quickActionRequiresSession,quickActionState,quickActionStates,registerNavigatorAboutServices,setHostCapabilities,setQuickActionStateSource,showFirstRunWizard,subtleLineColor,supportsPermissionMode,supportsSidebarSection,supportsTitleVisibility,terminalIcon,terminalIconIDs,terminalIconLabel,useDialogScroll,useDialogState,useDialogs,useIcons
7682
7793
  }