opencode-navigator 0.23.0 → 0.25.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,14 +3,13 @@ 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,Suspense as Suspense3,lazy as lazy3,For as For6,createMemo as createMemo4,onMount as onMount4,For as For5,createMemo as createMemo3,onMount as onMount3,Show as Show6,createEffect as createEffect9,createSignal as createSignal14,onCleanup as onCleanup11,Show as Show5,For as For4,For as For7,createEffect as createEffect10,createMemo as createMemo5,onCleanup as onCleanup12,createEffect as createEffect11,createMemo as createMemo6,untrack as untrack2,Suspense as Suspense4,lazy as lazy4,onCleanup as onCleanup13,createEffect as createEffect12,onCleanup as onCleanup14,createSignal as createSignal15,createMemo as createMemo7,createSignal as createSignal16,createSignal as createSignal17,lazy as lazy5,Show as Show9,For as For8,Show as Show8,Show as Show7,createEffect as createEffect13,onCleanup as onCleanup15,onMount as onMount5,onCleanup as onCleanup16,onMount as onMount6,For as For9,createSignal as createSignal18,createSignal as createSignal19,onCleanup as onCleanup17,createSignal as createSignal20,Show as Show10,createSignal as createSignal22,createSignal as createSignal21,onCleanup as onCleanup18,For as For10,Show as Show13,createMemo as createMemo9,createComputed,createMemo as createMemo8,createSignal as createSignal23,untrack as untrack3,Show as Show11,createComputed as createComputed2,untrack as untrack4,Show as Show12,createSignal as createSignal25,createEffect as createEffect14,createSignal as createSignal24,on,createMemo as createMemo11,createSignal as createSignal28,createMemo as createMemo10,For as For11,Show as Show17,Show as Show14,Show as Show15,createSignal as createSignal26,createContext as createContext3,useContext as useContext3,Show as Show16,createSignal as createSignal27,onCleanup as onCleanup19,Show as Show23,createSignal as createSignal29,untrack as untrack5,createSignal as createSignal30,createSignal as createSignal31,createEffect as createEffect15,For as For13,Show as Show18,For as For12,createSignal as createSignal32,Show as Show19,Show as Show20,Show as Show21,Show as Show22,For as For14,Show as Show25,createMemo as createMemo13,Show as Show24,createMemo as createMemo12,createSignal as createSignal33,createContext as createContext4,useContext as useContext4,Show as Show26,Suspense as Suspense5,createEffect as createEffect16,onCleanup as onCleanup20,untrack as untrack6,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup26,For as For15,Show as Show28,createMemo as createMemo15,createSignal as createSignal35,createEffect as createEffect17,createMemo as createMemo14,onCleanup as onCleanup21,untrack as untrack7,Show as Show27,createEffect as createEffect18,createSignal as createSignal34,onCleanup as onCleanup22,For as For16,Show as Show30,createSignal as createSignal36,createEffect as createEffect19,createMemo as createMemo16,onCleanup as onCleanup23,untrack as untrack8,Show as Show29,For as For18,Show as Show33,createEffect as createEffect20,createMemo as createMemo17,createSignal as createSignal37,onCleanup as onCleanup24,untrack as untrack9,For as For17,Show as Show32,Show as Show31,Show as Show38,createEffect as createEffect21,createMemo as createMemo18,createSignal as createSignal38,onCleanup as onCleanup25,untrack as untrack10,Show as Show34,For as For19,Show as Show36,Show as Show35,Show as Show37,createEffect as createEffect22,createMemo as createMemo20,onCleanup as onCleanup27,untrack as untrack11,Show as Show39,createMemo as createMemo21,onCleanup as onCleanup28,createEffect as createEffect23,createMemo as createMemo22,on as on2,onCleanup as onCleanup29,createRoot,createSignal as createSignal39,getOwner,createSignal as createSignal40,onCleanup as onCleanup30,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"
10
10
  }
11
11
  var DEFAULT_SECTION_EXPANSION={limits:true,todo:true,subagents:false,skills:false,quick_actions:false,lsp:false,mcp:false
12
12
  }
13
- var SECTION_DEFINITIONS=[{name:"limits",label:"Limits"},{name:"todo",label:"Todo"},{name:"subagents",label:"Subagents"},{name:"skills",label:"Skills"},{name:"quick_actions",label:"Quick actions"},{name:"lsp",label:"LSP"},{name:"mcp",label:"MCP"}]
14
13
  function parseQuickActionOrder(value){if(!Array.isArray(value))
15
14
  return
16
15
  const order=[...new Set(value.filter((id)=>QUICK_ACTION_IDS.includes(id)))]
@@ -500,7 +499,7 @@ return changeMany({action:state.action,...state.preset&&{preset:state.preset},..
500
499
 
501
500
 
502
501
 
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"," "]
502
+ 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
503
  }
505
504
  function uiIcon(name,style="nerd"){return ICONS[name][style==="text"?1:0]
506
505
  }
@@ -514,7 +513,7 @@ return icon?uiIcon(icon,style):key
514
513
  }
515
514
  function sectionIcon(section,style="nerd"){return uiIcon(section==="quick_actions"?"actions":section,style)
516
515
  }
517
- var SETTINGS_ICONS={sections:"sections",scope:"scope",presets:"presets",behavior:"settings",defaults:"reset"
516
+ var SETTINGS_ICONS={sections:"sections",scope:"scope",presets:"presets",behavior:"settings",defaults:"reset",about:"info"
518
517
  }
519
518
  function settingsTabIcon(tab,style="nerd"){return uiIcon(SETTINGS_ICONS[tab],style)
520
519
  }
@@ -738,40 +737,36 @@ renderer.requestRender()
738
737
 
739
738
 
740
739
 
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"
740
+ 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 TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes12,TextAttributes as TextAttributes14,ScrollBoxRenderable,TextAttributes as TextAttributes15} from "@opentui/core"
742
741
 
743
- function selectionBackdrop(node){for(let parent=node.parent;parent; parent=parent.parent){if(parent instanceof BoxRenderable&&parent.backgroundColor.a>0)
742
+ var transparent=RGBA.fromInts(0,0,0,0)
743
+ 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
744
  return parent.backgroundColor
745
745
  }
746
- return RGBA.fromValues(0,0,0,1)
746
+ return transparent
747
747
  }
748
+ function paintCorners(node,buffer,icons){const backdrop=selectionBackdrop(node)
749
+ if(node.backgroundColor.equals(backdrop))
750
+ return
751
+ const left=node.screenX
752
+ const right=left + node.width-1
753
+ const top=node.screenY
754
+ const bottom=top + node.height-1
755
+ const multiline=node.height>1
756
+ const positions=multiline?[[left,top,"selectionTopLeft"],[right,top,"selectionTopRight"],[left,bottom,"selectionBottomLeft"],[right,bottom,"selectionBottomRight"]]:[[left,top,"selectionLeft"],[right,top,"selectionRight"]]
757
+ for(const [x,y,icon] of positions){if(x<0||y<0||x>=buffer.width||y>=buffer.height)
758
+ continue
759
+ buffer.setCell(x,y,icons.icon(icon),multiline?backdrop:node.backgroundColor,multiline?node.backgroundColor:backdrop)
760
+ }}
748
761
  function SelectionBox(props){const icons=useIcons()
749
762
  const [local,boxProps]=splitProps(props,["ref","iconOnly"])
750
763
  let node
751
- let corners=[]
752
764
  createEffect2(()=>{icons.style()
753
765
  icons.multilineCorners()
754
766
  node?.requestRender()
755
767
  })
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
- }
768
+ function after(buffer,delta){if(!this.buffered&&this.width>=3&&this.height>=1&&this.backgroundColor.a>0&&(this.height===1||icons.multilineCorners()))
769
+ paintCorners(this,buffer,icons)
775
770
  props.renderAfter?.call(this,buffer,delta)
776
771
  }
777
772
  return(()=>{var _el$=_$createElement("box")
@@ -782,7 +777,6 @@ local.ref(value)
782
777
  },_el$)
783
778
  _$spread(_el$,_$mergeProps(boxProps,{get paddingLeft(){return props.paddingLeft??props.padding??(local.iconOnly&&icons.style()==="text"?0:1)
784
779
  },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
780
  },get renderAfter(){return _$memo(()=>icons.style()==="nerd")()?after:props.renderAfter
787
781
  }}),false)
788
782
  return _el$
@@ -823,7 +817,7 @@ _$setProp(_el$2,"wrapMode","none")
823
817
  _$setProp(_el$2,"truncate",true)
824
818
  _$setProp(_el$2,"height",1)
825
819
  _$setProp(_el$2,"flexGrow",1)
826
- _$insert(_el$2,()=>icons.icon("presets"),_el$3)
820
+ _$insert(_el$2,()=>icons.icon(props.icon??"presets"),_el$3)
827
821
  _$insert(_el$2,()=>props.title,null)
828
822
  _$setProp(_el$4,"flexShrink",0)
829
823
  _$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
@@ -1040,12 +1034,17 @@ function GuardedConfirmation(props){const dialogs=useDialogs(props.api)
1040
1034
  createEffect4(()=>{if(!props.current())
1041
1035
  dialogs.close()
1042
1036
  })
1043
- return _$createComponent(props.api.ui.DialogConfirm,{get title(){return props.title
1044
- },get message(){return props.message
1045
- },onConfirm:()=>{if(props.current())
1037
+ const confirm=()=>{if(props.current())
1046
1038
  props.onConfirm()
1047
- },get onCancel(){return dialogs.back
1039
+ }
1040
+ return _$createComponent(Show,{get when(){return props.render
1041
+ },get fallback(){return _$createComponent(props.api.ui.DialogConfirm,{get title(){return props.title
1042
+ },get message(){return props.message
1043
+ },onConfirm:confirm,get onCancel(){return dialogs.back
1048
1044
  }})
1045
+ },children:(render)=>render()({confirm,cancel:dialogs.back
1046
+ })
1047
+ })
1049
1048
  }
1050
1049
 
1051
1050
 
@@ -1071,7 +1070,7 @@ _$setProp(_el$2,"wrapMode","none")
1071
1070
  _$setProp(_el$2,"truncate",true)
1072
1071
  _$setProp(_el$2,"height",1)
1073
1072
  _$insert(_el$2,()=>local.children)
1074
- _$insert(_el$,_$createComponent(Show,{get when(){return local.count!==undefined
1073
+ _$insert(_el$,_$createComponent(Show2,{get when(){return local.count!==undefined
1075
1074
  },get children(){var _el$3=_$createElement("text")
1076
1075
  _$setProp(_el$3,"flexShrink",0)
1077
1076
  _$setProp(_el$3,"wrapMode","none")
@@ -1095,6 +1094,85 @@ return _el$
1095
1094
  }}))
1096
1095
  }
1097
1096
 
1097
+
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+ function SingleLinePrompt(props){const theme=()=>props.api.theme.current
1105
+ const [value,setValue]=useDialogState("prompt-value",props.value??"")
1106
+ const [active,setActive]=useDialogState("prompt-control",0)
1107
+ const [hovered,setHovered]=createSignal4()
1108
+ let input
1109
+ let actions
1110
+ const confirm=()=>props.onConfirm?.(value())
1111
+ const cancel=()=>props.onCancel?.()
1112
+ const focus=(index)=>{setActive(index)
1113
+ setHovered(undefined)
1114
+ if(index===0)
1115
+ input?.focus()
1116
+ else
1117
+ actions?.focus()
1118
+ }
1119
+ const prefix="opencode-navigator.prompt"
1120
+ createEffect5(()=>{const actionsFocused=active()>0
1121
+ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1100,commands:[{name:`${prefix}.next`,run:()=>focus((active() + 1)%3)
1122
+ },{name:`${prefix}.previous`,run:()=>focus((active() + 2)%3)
1123
+ },{name:`${prefix}.activate`,run:()=>active()===2?cancel():confirm()
1124
+ },{name:`${prefix}.horizontal`,enabled:()=>active()>0,run:()=>focus(active()===1?2:1)
1125
+ }],bindings:[{key:"tab",cmd:`${prefix}.next`
1126
+ },{key:"shift+tab",cmd:`${prefix}.previous`
1127
+ },{key:"return",cmd:`${prefix}.activate`
1128
+ },...actionsFocused?[{key:"left",cmd:`${prefix}.horizontal`
1129
+ },{key:"right",cmd:`${prefix}.horizontal`
1130
+ }]:[]]
1131
+ })
1132
+ onCleanup4(unregister)
1133
+ })
1134
+ onMount(()=>queueMicrotask(()=>input?.focus()))
1135
+ return _$createComponent(DialogSurface,{get api(){return props.api
1136
+ },get children(){return [_$createComponent(DialogHeader,{get api(){return props.api
1137
+ },get title(){return props.title
1138
+ },onBack:cancel
1139
+ }),_$memo(()=>props.description?.()),(()=>{var _el$=_$createElement("input")
1140
+ _$use((node)=>{input=node
1141
+ },_el$)
1142
+ _$setProp(_el$,"onInput",setValue)
1143
+ _$setProp(_el$,"on:focused",()=>setActive(0))
1144
+ _$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
1145
+ _v$!==_p$.e&&(_p$.e=_$setProp(_el$,"value",_v$,_p$.e))
1146
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"placeholder",_v$2,_p$.t))
1147
+ _v$3!==_p$.a&&(_p$.a=_$setProp(_el$,"textColor",_v$3,_p$.a))
1148
+ _v$4!==_p$.o&&(_p$.o=_$setProp(_el$,"focusedTextColor",_v$4,_p$.o))
1149
+ _v$5!==_p$.i&&(_p$.i=_$setProp(_el$,"backgroundColor",_v$5,_p$.i))
1150
+ _v$6!==_p$.n&&(_p$.n=_$setProp(_el$,"focusedBackgroundColor",_v$6,_p$.n))
1151
+ _v$7!==_p$.s&&(_p$.s=_$setProp(_el$,"cursorColor",_v$7,_p$.s))
1152
+ _v$8!==_p$.h&&(_p$.h=_$setProp(_el$,"placeholderColor",_v$8,_p$.h))
1153
+ return _p$
1154
+ },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined,h:undefined
1155
+ })
1156
+ return _el$
1157
+ })(),(()=>{var _el$2=_$createElement("box")
1158
+ _$use((node)=>{actions=node
1159
+ },_el$2)
1160
+ _$setProp(_el$2,"flexDirection","row")
1161
+ _$setProp(_el$2,"gap",1)
1162
+ _$setProp(_el$2,"focusable",true)
1163
+ _$insert(_el$2,_$createComponent(DialogAction,{get api(){return props.api
1164
+ },id:`${prefix}.save`,label:"Save",icon:"save",get selected(){return(hovered()??active())===1
1165
+ },onSelect:()=>setHovered(1),onActivate:confirm
1166
+ }),null)
1167
+ _$insert(_el$2,_$createComponent(DialogAction,{get api(){return props.api
1168
+ },id:`${prefix}.cancel`,label:"Cancel",icon:"close",get selected(){return(hovered()??active())===2
1169
+ },onSelect:()=>setHovered(2),onActivate:cancel
1170
+ }),null)
1171
+ return _el$2
1172
+ })()]
1173
+ }})
1174
+ }
1175
+
1098
1176
  function subtleLineColor(background,border){const from=parseColor(background)
1099
1177
  const to=parseColor(border)
1100
1178
  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 +1333,34 @@ function toolbarPinKey(pin){return pin.kind==="action"?`action:${pin.id}`:`skill
1255
1333
  }
1256
1334
  function identifier(value){return typeof value==="string"&&/^[a-z][a-z\d-]{0,47}$/u.test(value)
1257
1335
  }
1336
+ function iconList(value){return Array.isArray(value)&&value.length<=3&&value.every((item)=>identifier(item))
1337
+ }
1338
+ function validToolbarPinText(text){return text.length<=128&&[...text].every((character)=>{const point=character.codePointAt(0)??0
1339
+ return point>=32&&point!==127&&point!==8232&&point!==8233
1340
+ })
1341
+ }
1342
+ function toolbarPinIcons(pin,state){if(state&&pin.stateIconLists?.[state])
1343
+ return pin.stateIconLists[state]
1344
+ if(state&&pin.stateIcons?.[state])
1345
+ return [pin.stateIcons[state]]
1346
+ return pin.icons??[pin.icon]
1347
+ }
1258
1348
  function parsePin(value){if(!value||typeof value!=="object")
1259
1349
  return
1260
1350
  const input=value
1261
1351
  if(!identifier(input.icon))
1262
1352
  return
1353
+ if(input.icons!==undefined&&!iconList(input.icons))
1354
+ return
1355
+ const text=typeof input.text==="string"?input.text.trim():""
1356
+ if(!validToolbarPinText(text))
1357
+ return
1263
1358
  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}}
1359
+ const stateIconLists=Object.fromEntries(Object.entries(input.stateIconLists&&typeof input.stateIconLists==="object"?input.stateIconLists:{}).filter(([key,entry])=>identifier(key)&&iconList(entry)))
1360
+ const base=input.icons
1361
+ if(!text&&(base?.length===0||Object.values(stateIconLists).some((list)=>list.length===0)))
1362
+ return
1363
+ const icons={icon:input.icon,...base&&{icons:[...base]},...text&&{text},...Object.keys(stateIcons).length>0&&{stateIcons},...Object.keys(stateIconLists).length>0&&{stateIconLists}}
1265
1364
  if(input.kind==="action"&&QUICK_ACTION_IDS.includes(input.id))
1266
1365
  return{kind:"action",id:input.id,...icons}
1267
1366
  if(input.kind==="skill"&&typeof input.location==="string"&&input.location.trim()&&typeof input.name==="string"&&input.name.trim())
@@ -1278,6 +1377,31 @@ keys.add(toolbarPinKey(pin))
1278
1377
  return [pin]
1279
1378
  })
1280
1379
  }
1380
+ function configurePin(current,change){if(change.expected&&change.expected!==JSON.stringify(current))
1381
+ throw new Error("Pin changed; reopen its configuration")
1382
+ const stateIcons={...current.stateIcons}
1383
+ const stateIconLists={...current.stateIconLists}
1384
+ const lists=Object.entries(change.stateIconLists??{})
1385
+ for(const [state,values] of lists){if(!identifier(state)||values!==null&&!iconList(values))
1386
+ throw new Error("Choose zero to three state icons")
1387
+ if(values===null)
1388
+ delete stateIconLists[state]
1389
+ else
1390
+ stateIconLists[state]=[...values]
1391
+ }
1392
+ const changes=Object.entries(change.stateIcons??{})
1393
+ for(const [state,icon] of changes){if(!identifier(state)||icon!==null&&!identifier(icon))
1394
+ throw new Error("Invalid state icon")
1395
+ if(icon===null)
1396
+ delete stateIcons[state]
1397
+ else
1398
+ stateIcons[state]=icon
1399
+ }
1400
+ const pin=parsePin({...current,icon:change.icon,stateIcons,stateIconLists,...change.icons!==undefined&&{icons:change.icons??undefined},...change.text!==undefined&&{text:change.text??undefined}})
1401
+ if(!pin)
1402
+ throw new Error("Choose up to three icons and a single-line label")
1403
+ return pin
1404
+ }
1281
1405
  function changeToolbarPins(current=[],change){const pins=parseToolbarPins(current)
1282
1406
  if(change.operation==="pin"){const pin=parsePin(change.pin)
1283
1407
  if(!pin)
@@ -1293,21 +1417,7 @@ if(index===-1){if(change.operation==="configure")
1293
1417
  throw new Error("Pin no longer exists; reopen the toolbar manager")
1294
1418
  return pins
1295
1419
  }
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
1420
+ if(change.operation==="configure"){pins[index]=configurePin(pins[index],change)
1311
1421
  return pins
1312
1422
  }
1313
1423
  const [pin]=pins.splice(index,1)
@@ -1762,25 +1872,25 @@ return{sections:{...base?.sections,...session.sections},expanded:{...base?.expan
1762
1872
  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
1873
  },layout:{sections:defaults.sections,expanded:DEFAULT_SECTION_EXPANSION,order:defaults.sectionOrder??[...SIDEBAR_SECTIONS]
1764
1874
  },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)
1875
+ const [resolved,setResolved]=createSignal5(resolvePreferences({builtIns,pluginOptions:configured}))
1876
+ const [skippedSkills,setSkippedSkills]=createSignal5(new Set)
1877
+ const [onboardingCompleted,setOnboardingCompleted]=createSignal5(false)
1878
+ const [activeTarget,setActiveTarget]=createSignal5({kind:"global"})
1879
+ const [preferenceScope,setPreferenceScope]=createSignal5("global")
1880
+ const [layoutPresets,setLayoutPresets]=createSignal5(configured.layoutPresets??{})
1881
+ const [mcpPresets,setMcpPresets]=createSignal5(configured.mcpPresets??{})
1882
+ const [favoriteSkills,setFavoriteSkills]=createSignal5(new Set)
1883
+ const [favoriteMcpServers,setFavoriteMcpServers]=createSignal5(new Set)
1884
+ const [favoriteQuickActions,setFavoriteQuickActions]=createSignal5(new Set)
1885
+ const [recentSkills,setRecentSkills]=createSignal5([])
1886
+ const [recentQuickActions,setRecentQuickActions]=createSignal5([])
1887
+ const [mcpServerGroups,setMcpServerGroups]=createSignal5(configured.mcpServerGroups??{})
1888
+ const [skillGroups,setSkillGroups]=createSignal5({})
1889
+ const [autoApprovePermissions,setAutoApprovePermissions]=createSignal5()
1890
+ const [codexAccountBindings,setCodexAccountBindings]=createSignal5({})
1891
+ const [pendingResetAttempt,setPendingResetAttempt]=createSignal5()
1892
+ const [ready,setReady]=createSignal5(false)
1893
+ const [revision,setRevision]=createSignal5(0)
1784
1894
  const sessionLayouts=new Map
1785
1895
  const pendingUpdates=[]
1786
1896
  let document=emptyPreferencesDocument()
@@ -2291,7 +2401,7 @@ return{behavior,layout:{sections,expanded:{},...sectionOrder&&{order:sectionOrde
2291
2401
  function configuredDefaultsFromPluginOptions(options){return mergeConfiguredDefaults(legacyDefaults(pluginConfig(options)),parseConfiguredDefaults(options??{}))
2292
2402
  }
2293
2403
 
2294
- function createSkillController(api,source){const [skills,setSkills]=createSignal5({})
2404
+ function createSkillController(api,source){const [skills,setSkills]=createSignal6({})
2295
2405
  const refreshing=new Map
2296
2406
  const targets=new Map
2297
2407
  const requests=createRequestState(api.lifecycle.signal)
@@ -2513,7 +2623,7 @@ _$insertNode(_el$4,_el$5)
2513
2623
  _$setProp(_el$4,"flexDirection","row")
2514
2624
  _$setProp(_el$4,"gap",1)
2515
2625
  _$setProp(_el$4,"alignItems","center")
2516
- _$insert(_el$4,_$createComponent(Show2,{get when(){return props.onConfigure
2626
+ _$insert(_el$4,_$createComponent(Show3,{get when(){return props.onConfigure
2517
2627
  },get children(){return _$createComponent(IconControl,{get icon(){return terminalIcon("pin",icons.style())
2518
2628
  },get foregroundColor(){return _$memo(()=>props.active==="configure")()?theme().selectedListItemText:theme().textMuted
2519
2629
  },get backgroundColor(){return _$memo(()=>props.active==="configure")()?theme().primary:undefined
@@ -2586,7 +2696,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
2586
2696
  },{key:"return",cmd:`${PLUGIN_ID}.skill-dialog.submit`
2587
2697
  }]
2588
2698
  })
2589
- onCleanup4(unregister)
2699
+ onCleanup5(unregister)
2590
2700
  return _$createComponent(DialogSurface,{get api(){return props.api
2591
2701
  },get children(){return [_$createComponent(SkillDialogHeader,{get api(){return props.api
2592
2702
  },get name(){return props.skill.name
@@ -2656,7 +2766,7 @@ input.dialogs.open(()=>_$createComponent(SkillDialog,{get api(){return input.api
2656
2766
 
2657
2767
 
2658
2768
  function createSubagentHistory({now=Date.now}={}){const targets=new Map
2659
- const [revision,setRevision]=createSignal6(0)
2769
+ const [revision,setRevision]=createSignal7(0)
2660
2770
  function state(key){let value=targets.get(key)
2661
2771
  if(!value){value={known:new Set,active:new Map,recent:[]}
2662
2772
  targets.set(key,value)
@@ -2714,11 +2824,11 @@ function activeStatus(status){return status?.type==="busy"||status?.type==="retr
2714
2824
  function createSubagentController(api,options={}){const source=options.source
2715
2825
  const now=options.now??Date.now
2716
2826
  const history=createSubagentHistory({now})
2717
- const [children,setChildren]=createSignal7({})
2718
- const [statuses,setStatuses]=createSignal7({})
2827
+ const [children,setChildren]=createSignal8({})
2828
+ const [statuses,setStatuses]=createSignal8({})
2719
2829
  const refreshing=new Map
2720
2830
  const journals=new Set
2721
- const [unavailable,setUnavailable]=createSignal7({})
2831
+ const [unavailable,setUnavailable]=createSignal8({})
2722
2832
  const targets=new Map
2723
2833
  const remoteFailures=new Map
2724
2834
  const remoteRetryAt=new Map
@@ -2943,17 +3053,17 @@ else if(seconds>=60)
2943
3053
  value=`${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, "0")}s`
2944
3054
  return value
2945
3055
  }
2946
- function createSubagentClock(key){const [now,setNow]=createSignal8(Date.now())
2947
- createEffect5(()=>{if(key()===undefined)
3056
+ function createSubagentClock(key){const [now,setNow]=createSignal9(Date.now())
3057
+ createEffect6(()=>{if(key()===undefined)
2948
3058
  return
2949
3059
  setNow(Date.now())
2950
3060
  const timer=setInterval(()=>setNow(Date.now()),1000)
2951
- onCleanup5(()=>clearInterval(timer))
3061
+ onCleanup6(()=>clearInterval(timer))
2952
3062
  })
2953
3063
  return now
2954
3064
  }
2955
3065
 
2956
- function createTodoController(api){const [sessions,setSessions]=createSignal9({})
3066
+ function createTodoController(api){const [sessions,setSessions]=createSignal10({})
2957
3067
  const refreshing=new Map
2958
3068
  const revisions=new Map
2959
3069
  const requests=createRequestState(api.lifecycle.signal)
@@ -3070,10 +3180,10 @@ return action.label
3070
3180
  const command=api.keymap.getCommands?.({visibility:"registered"}).find((candidate)=>candidate.name===action.command)
3071
3181
  return typeof command?.title==="string"?command.title:action.label
3072
3182
  }
3073
- function createQuickActionRevision(api){const [revision,setRevision]=createSignal11(0)
3183
+ function createQuickActionRevision(api){const [revision,setRevision]=createSignal12(0)
3074
3184
  const unsubscribe=api.keymap.on?.("state",()=>setRevision((value)=>value + 1))
3075
3185
  if(unsubscribe)
3076
- onCleanup7(unsubscribe)
3186
+ onCleanup8(unsubscribe)
3077
3187
  return revision
3078
3188
  }
3079
3189
  function orderQuickActionIds(order,favorites){return [...order.filter((id)=>favorites.has(id)),...order.filter((id)=>!favorites.has(id))]
@@ -3189,7 +3299,7 @@ const [selectedID,setSelectedID]=useDialogState("selection",undefined)
3189
3299
  const [views]=useDialogState("tab-views",new Map)
3190
3300
  const tabViews=views()
3191
3301
  const [scrollTop,setScrollTop]=useDialogState("scroll",0)
3192
- const [refreshing,setRefreshing]=createSignal12(false)
3302
+ const [refreshing,setRefreshing]=createSignal13(false)
3193
3303
  const theme=()=>props.api.theme.current
3194
3304
  const icons=useIcons()
3195
3305
  const commandRevision=createQuickActionRevision(props.api)
@@ -3216,7 +3326,7 @@ body.scrollChildIntoView(`${prefix}.${position}`)
3216
3326
  setScrollTop(body.scrollTop)
3217
3327
  }
3218
3328
  renderer.on("frame",onFrame)
3219
- onCleanup8(()=>renderer.off("frame",onFrame))
3329
+ onCleanup9(()=>renderer.off("frame",onFrame))
3220
3330
  const sameContext=()=>searchContext(props.api).key===context.key
3221
3331
  const candidates=createMemo(()=>{commandRevision()
3222
3332
  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 +3432,14 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3322
3432
  },{key:"ctrl+r",cmd:`${prefix}.retry`
3323
3433
  }]
3324
3434
  })
3325
- onCleanup8(()=>{isDisposed=true
3435
+ onCleanup9(()=>{isDisposed=true
3326
3436
  unregister()
3327
3437
  })
3328
- onCleanup8(props.skills.activate?.(skillTarget)??(()=>{}))
3329
- onMount(()=>{input?.focus()
3438
+ onCleanup9(props.skills.activate?.(skillTarget)??(()=>{}))
3439
+ onMount2(()=>{input?.focus()
3330
3440
  refresh().catch(report)
3331
3441
  })
3332
- createEffect6(()=>{if(!sameContext())
3442
+ createEffect7(()=>{if(!sameContext())
3333
3443
  dialogs.close()
3334
3444
  })
3335
3445
  return{active,activeTab,activate,allErrors,byID,dialogs,errors,icons,loading,matches,prefix,query,queryScope,resultColors,results,selectTab,setBody(node){body=node
@@ -3492,7 +3602,7 @@ _$effect((_$p)=>_$setProp(_el$2,"fg",model.theme().error,_$p))
3492
3602
  return _el$2
3493
3603
  })()
3494
3604
  }),null)
3495
- _$insert(_el$,_$createComponent(Show3,{get when(){return model.results().length
3605
+ _$insert(_el$,_$createComponent(Show4,{get when(){return model.results().length
3496
3606
  },get fallback(){return(()=>{var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
3497
3607
  _$insertNode(_el$8,_el$9)
3498
3608
  _$insert(_el$8,()=>model.icons.icon(model.loading()?"pending":"search"),_el$9)
@@ -3500,7 +3610,7 @@ _$insert(_el$8,()=>model.loading()?"Loading sources\u2026":"No matching results"
3500
3610
  _$effect((_$p)=>_$setProp(_el$8,"fg",model.theme().textMuted,_$p))
3501
3611
  return _el$8
3502
3612
  })()
3503
- },get children(){return _$createComponent(Show3,{keyed:true,get when(){return model.queryScope()
3613
+ },get children(){return _$createComponent(Show4,{keyed:true,get when(){return model.queryScope()
3504
3614
  },children:(_scope)=>_$createComponent(For3,{get each(){return model.results().map((item)=>item.id)
3505
3615
  },children:(id)=>_$createComponent(SearchResultRow,{model,id
3506
3616
  })
@@ -3554,13 +3664,13 @@ timers.add(timer)
3554
3664
  }},{name:`${LEGACY_PLUGIN_ID}.search`,run(){props.api.keymap.dispatchCommand(SEARCH_COMMAND)
3555
3665
  }}]
3556
3666
  })
3557
- createEffect7(()=>{const key=props.preferences.searchKey()
3667
+ createEffect8(()=>{const key=props.preferences.searchKey()
3558
3668
  const remove=props.api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:SEARCH_COMMAND
3559
3669
  }]
3560
3670
  })
3561
- onCleanup9(remove)
3671
+ onCleanup10(remove)
3562
3672
  })
3563
- onCleanup9(()=>{isDisposed=true
3673
+ onCleanup10(()=>{isDisposed=true
3564
3674
  unregister()
3565
3675
  for(const timer of timers)
3566
3676
  clearTimeout(timer)
@@ -3592,274 +3702,16 @@ return value&&valid()&&!blocked()?controller.applyPreset(name,value,target):unde
3592
3702
 
3593
3703
 
3594
3704
 
3595
-
3596
-
3597
-
3598
-
3599
-
3600
- var ONBOARDING_STEPS=[{title:"A control center that stays compact",summary:"Navigator brings session state, search, and controls into OpenCode's existing sidebar.",icon:"help",features:[{icon:"sections",title:"Progressive disclosure",description:"Expand only the context you need right now."},{icon:"scope",title:"Current context",description:"Follow the active session, workspace, and worktree."},{icon:"actions",title:"Mouse and keyboard",description:"Use the same controls with either input method."}]
3601
- },{title:"Stay oriented while agents work",summary:"Keep current work visible without turning the sidebar into another dashboard.",icon:"todo",features:[{icon:"todo",title:"Todo filters",description:"Separate active, finished, and cancelled work."},{icon:"subagents",title:"Live subagents",description:"See running, retrying, recent, and failed child sessions; open them directly."
3602
- },{icon:"info",title:"Provider limits",description:"Link a matching Codex account for model quotas and confirmed banked resets."
3603
- }]
3604
- },{title:"Find anything and launch Skills safely",summary:"Search complete source lists without expanding every sidebar section.",icon:"search",features:[{icon:"search",title:"Search Everything",description:"Search Skills, Subagents, MCP, and Actions in shared tabs."
3605
- },{icon:"search",title:"Full source lists",description:"Search beyond sidebar visibility and item limits."},{icon:"skills",title:"Skill confirmation",description:"Review a skill and its source before inserting its command."
3606
- }]
3607
- },{title:"Run actions and check language tools",summary:"Keep frequent OpenCode commands and LSP health within one compact section.",icon:"actions",features:[{icon:"actions",title:"Quick Actions",description:"Rename, inspect timelines, copy, export, or compact the session."
3608
- },{icon:"lsp",title:"Compact LSP status",description:"Spot connected and failed language servers at a glance."
3609
- },{icon:"settings",title:"Configurable commands",description:"Choose action visibility, order, and shortcuts."
3610
- }]
3611
- },{title:"Control MCP without losing context",summary:"Manage individual servers or entire working sets directly from Navigator.",icon:"mcp",features:[{icon:"mcp",title:"Live server controls",description:"Connect, disconnect, filter, and favorite servers."},{icon:"actions",title:"Bulk operations",description:"Change eligible servers together and retry failures."
3612
- },{icon:"presets",title:"Safe presets",description:"Preview connections and disconnections before Apply."}]
3613
- },{title:"Make Navigator fit each workspace",summary:"Use the same controls with mouse or keyboard and keep only the context you need.",icon:"settings",features:[{icon:"sections",title:"Flexible layout",description:"Choose section visibility, order, expansion, and item limits."
3614
- },{icon:"presets",title:"Scoped presets",description:"Save layouts globally or for the current worktree."},{icon:"settings",title:"Accessible controls",description:"Change shortcuts or use Text fallback without a restart."
3615
- }]
3616
- }];
3617
-
3618
-
3619
-
3620
-
3621
-
3622
-
3623
-
3624
-
3625
-
3626
-
3627
- function OnboardingStep(props){const icons=useIcons()
3628
- const theme=()=>props.api.theme.current
3629
- return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createElement("text"),_el$5=_$createElement("box"),_el$6=_$createElement("text"),_el$7=_$createTextNode(`Toggle: `),_el$8=_$createTextNode(` \xB7 Focus: `),_el$9=_$createTextNode(` \xB7 Icons: `),_el$1=_$createElement("box")
3630
- _$insertNode(_el$,_el$2)
3631
- _$insertNode(_el$,_el$4)
3632
- _$insertNode(_el$,_el$5)
3633
- _$insertNode(_el$,_el$6)
3634
- _$insertNode(_el$,_el$1)
3635
- _$setProp(_el$,"gap",1)
3636
- _$insertNode(_el$2,_el$3)
3637
- _$insert(_el$2,()=>icons.icon(props.step.icon),_el$3)
3638
- _$insert(_el$2,()=>props.step.title,null)
3639
- _$setProp(_el$4,"wrapMode","word")
3640
- _$insert(_el$4,()=>props.step.summary)
3641
- _$setProp(_el$5,"border",["top","bottom"])
3642
- _$setProp(_el$5,"paddingTop",1)
3643
- _$setProp(_el$5,"paddingBottom",1)
3644
- _$setProp(_el$5,"gap",1)
3645
- _$insert(_el$5,_$createComponent(For4,{get each(){return props.step.features
3646
- },children:(feature)=>(()=>{var _el$14=_$createElement("box"),_el$15=_$createElement("text"),_el$16=_$createElement("text"),_el$17=_$createElement("b"),_el$18=_$createTextNode(` \xB7 `)
3647
- _$insertNode(_el$14,_el$15)
3648
- _$insertNode(_el$14,_el$16)
3649
- _$setProp(_el$14,"flexDirection","row")
3650
- _$setProp(_el$14,"gap",1)
3651
- _$setProp(_el$15,"flexShrink",0)
3652
- _$insert(_el$15,()=>icons.icon(feature.icon))
3653
- _$insertNode(_el$16,_el$17)
3654
- _$insertNode(_el$16,_el$18)
3655
- _$setProp(_el$16,"flexGrow",1)
3656
- _$setProp(_el$16,"minWidth",0)
3657
- _$setProp(_el$16,"wrapMode","word")
3658
- _$insert(_el$17,()=>feature.title)
3659
- _$insert(_el$16,()=>feature.description,null)
3660
- _$effect((_p$)=>{var _v$6=theme().accent,_v$7=theme().textMuted
3661
- _v$6!==_p$.e&&(_p$.e=_$setProp(_el$15,"fg",_v$6,_p$.e))
3662
- _v$7!==_p$.t&&(_p$.t=_$setProp(_el$16,"fg",_v$7,_p$.t))
3663
- return _p$
3664
- },{e:undefined,t:undefined
3665
- })
3666
- return _el$14
3667
- })()
3668
- }))
3669
- _$insertNode(_el$6,_el$7)
3670
- _$insertNode(_el$6,_el$8)
3671
- _$insertNode(_el$6,_el$9)
3672
- _$setProp(_el$6,"wrapMode","word")
3673
- _$insert(_el$6,()=>props.preferences.toggleKey(),_el$8)
3674
- _$insert(_el$6,()=>props.preferences.focusKey(),_el$9)
3675
- _$insert(_el$6,()=>icons.style()==="text"?"Text fallback":"Nerd Font",null)
3676
- _$setProp(_el$1,"flexDirection","row")
3677
- _$setProp(_el$1,"justifyContent","space-between")
3678
- _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3679
- props.onBack()
3680
- },get children(){var _el$10=_$createElement("text"),_el$11=_$createTextNode(` Back`)
3681
- _$insertNode(_el$10,_el$11)
3682
- _$insert(_el$10,()=>icons.icon("left"),_el$11)
3683
- _$effect((_$p)=>_$setProp(_el$10,"fg",theme().textMuted,_$p))
3684
- return _el$10
3685
- }}),null)
3686
- _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,get backgroundColor(){return theme().primary
3687
- },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3688
- props.onAdvance()
3689
- },get children(){var _el$12=_$createElement("text"),_el$13=_$createTextNode(` `)
3690
- _$insertNode(_el$12,_el$13)
3691
- _$insert(_el$12,()=>props.final?"Configure sidebar":"Next",_el$13)
3692
- _$insert(_el$12,()=>icons.icon("right"),null)
3693
- _$effect((_$p)=>_$setProp(_el$12,"fg",theme().selectedListItemText,_$p))
3694
- return _el$12
3695
- }}),null)
3696
- _$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes10.BOLD,_v$3=theme().textMuted,_v$4=theme().borderSubtle,_v$5=theme().textMuted
3697
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
3698
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
3699
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3700
- _v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"borderColor",_v$4,_p$.o))
3701
- _v$5!==_p$.i&&(_p$.i=_$setProp(_el$6,"fg",_v$5,_p$.i))
3702
- return _p$
3703
- },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined
3704
- })
3705
- return _el$
3706
- })()
3707
- }
3708
-
3709
-
3710
-
3711
-
3712
-
3713
-
3714
-
3715
-
3716
-
3717
-
3718
- function SectionConfig(props){const icons=useIcons()
3719
- const theme=()=>props.api.theme.current
3720
- const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
3721
- const finishIndex=sections.length
3722
- return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Choose your sidebar sections`),_el$4=_$createElement("text"),_el$6=_$createElement("box")
3723
- _$insertNode(_el$,_el$2)
3724
- _$insertNode(_el$,_el$4)
3725
- _$insertNode(_el$,_el$6)
3726
- _$setProp(_el$,"gap",1)
3727
- _$insertNode(_el$2,_el$3)
3728
- _$insert(_el$2,()=>icons.icon("sections"),_el$3)
3729
- _$insertNode(_el$4,_$createTextNode(`Select what appears now. You can change visibility, order, limits, scope, and presets later with the gear button.`))
3730
- _$setProp(_el$4,"wrapMode","word")
3731
- _$insert(_el$,_$createComponent(For5,{each:sections,children:(section,index)=>_$createComponent(SelectionBox,{flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>props.active===index())()?theme().backgroundElement:undefined
3732
- },onMouseOver:()=>props.onActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3733
- props.preferences.toggleSection(section.name)
3734
- },get children(){return [(()=>{var _el$1=_$createElement("text")
3735
- _$setProp(_el$1,"flexShrink",0)
3736
- _$insert(_el$1,()=>icons.icon(props.preferences.sections()[section.name]?"checked":"unchecked"))
3737
- _$effect((_$p)=>_$setProp(_el$1,"fg",props.preferences.sections()[section.name]?theme().accent:theme().textMuted,_$p))
3738
- return _el$1
3739
- })(),(()=>{var _el$10=_$createElement("text"),_el$11=_$createTextNode(` `)
3740
- _$insertNode(_el$10,_el$11)
3741
- _$insert(_el$10,()=>icons.section(section.name),_el$11)
3742
- _$insert(_el$10,()=>section.label,null)
3743
- _$effect((_$p)=>_$setProp(_el$10,"fg",props.active===index()?theme().text:theme().textMuted,_$p))
3744
- return _el$10
3745
- })()]
3705
+ var Content=lazy3(async ()=>{const path=import.meta.url.includes("/dist/")?"./onboarding.js":"./first-run-wizard-content"
3706
+ const module=await import(path)
3707
+ return{default:module.FirstRunWizard
3746
3708
  }})
3747
- }),_el$6)
3748
- _$setProp(_el$6,"flexDirection","row")
3749
- _$setProp(_el$6,"justifyContent","space-between")
3750
- _$insert(_el$6,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3751
- props.onBack()
3752
- },get children(){var _el$7=_$createElement("text"),_el$8=_$createTextNode(` Back`)
3753
- _$insertNode(_el$7,_el$8)
3754
- _$insert(_el$7,()=>icons.icon("left"),_el$8)
3755
- _$effect((_$p)=>_$setProp(_el$7,"fg",theme().textMuted,_$p))
3756
- return _el$7
3757
- }}),null)
3758
- _$insert(_el$6,_$createComponent(SelectionBox,{paddingLeft:2,paddingRight:2,get backgroundColor(){return _$memo(()=>props.active===finishIndex)()?theme().primary:undefined
3759
- },onMouseOver:()=>props.onActive(finishIndex),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3760
- props.onFinish()
3761
- },get children(){var _el$9=_$createElement("text"),_el$0=_$createTextNode(` Finish`)
3762
- _$insertNode(_el$9,_el$0)
3763
- _$insert(_el$9,()=>icons.icon("done"),_el$0)
3764
- _$effect((_$p)=>_$setProp(_el$9,"fg",props.active===finishIndex?theme().selectedListItemText:theme().textMuted,_$p))
3765
- return _el$9
3766
- }}),null)
3767
- _$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes11.BOLD,_v$3=theme().textMuted
3768
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
3769
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
3770
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3771
- return _p$
3772
- },{e:undefined,t:undefined,a:undefined
3773
- })
3709
+ function FirstRunWizard(props){return(()=>{var _el$=_$createElement("box")
3710
+ _$insert(_el$,_$createComponent(Suspense3,{get children(){return _$createComponent(Content,props)
3711
+ }}))
3774
3712
  return _el$
3775
3713
  })()
3776
3714
  }
3777
- function FirstRunWizard(props){const icons=useIcons()
3778
- const dialogs=useDialogs(props.api)
3779
- const [active,setActive]=createSignal13(0)
3780
- const [step,setStep]=createSignal13(0)
3781
- const theme=()=>props.api.theme.current
3782
- const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
3783
- const finishIndex=sections.length
3784
- const stepCount=ONBOARDING_STEPS.length + 1
3785
- const configuring=()=>step()===ONBOARDING_STEPS.length
3786
- function finish(){dialogs.back()
3787
- }
3788
- function move(offset){if(configuring())
3789
- setActive((value)=>(value + offset + finishIndex + 1)%(finishIndex + 1))
3790
- else
3791
- setStep((value)=>Math.max(0,Math.min(ONBOARDING_STEPS.length,value + offset)))
3792
- }
3793
- function back(){setStep((value)=>Math.max(0,value-1))
3794
- }
3795
- function advance(){if(!configuring())
3796
- setStep((value)=>Math.min(ONBOARDING_STEPS.length,value + 1))
3797
- }
3798
- function select(){if(!configuring()){advance()
3799
- return
3800
- }
3801
- const index=active()
3802
- if(index===finishIndex)
3803
- finish()
3804
- else
3805
- props.preferences.toggleSection(sections[index].name)
3806
- }
3807
- const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.wizard.previous`,run(){move(-1)
3808
- }},{name:`${PLUGIN_ID}.wizard.next`,run(){move(1)
3809
- }},{name:`${PLUGIN_ID}.wizard.select`,run:select
3810
- },{name:`${PLUGIN_ID}.wizard.back`,run:back
3811
- },{name:`${PLUGIN_ID}.wizard.forward`,run:advance
3812
- }],bindings:[{key:"up",cmd:`${PLUGIN_ID}.wizard.previous`
3813
- },{key:"down",cmd:`${PLUGIN_ID}.wizard.next`
3814
- },{key:"tab",cmd:`${PLUGIN_ID}.wizard.next`
3815
- },{key:"left",cmd:`${PLUGIN_ID}.wizard.back`
3816
- },{key:"right",cmd:`${PLUGIN_ID}.wizard.forward`
3817
- },{key:"space",cmd:`${PLUGIN_ID}.wizard.select`
3818
- },{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
3819
- }]
3820
- })
3821
- onCleanup10(unregister)
3822
- return _$createComponent(DialogSurface,{get api(){return props.api
3823
- },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
- _$insertNode(_el$,_el$2)
3825
- _$insertNode(_el$,_el$4)
3826
- _$setProp(_el$,"flexDirection","row")
3827
- _$setProp(_el$,"justifyContent","space-between")
3828
- _$insertNode(_el$2,_el$3)
3829
- _$insert(_el$2,()=>icons.icon("help"),_el$3)
3830
- _$insertNode(_el$4,_el$5)
3831
- _$insertNode(_el$4,_el$6)
3832
- _$insertNode(_el$4,_el$7)
3833
- _$setProp(_el$4,"onMouseDown",(event)=>event.stopPropagation())
3834
- _$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
3835
- finish()
3836
- })
3837
- _$insert(_el$4,()=>step() + 1,_el$6)
3838
- _$insert(_el$4,stepCount,_el$7)
3839
- _$insert(_el$4,()=>icons.key("esc"),null)
3840
- _$effect((_p$)=>{var _v$=TextAttributes12.BOLD,_v$2=theme().text,_v$3=theme().textMuted
3841
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"attributes",_v$,_p$.e))
3842
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"fg",_v$2,_p$.t))
3843
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3844
- return _p$
3845
- },{e:undefined,t:undefined,a:undefined
3846
- })
3847
- return _el$
3848
- })(),_$createComponent(Show4,{get when(){return configuring()
3849
- },get fallback(){return _$createComponent(OnboardingStep,{get api(){return props.api
3850
- },get preferences(){return props.preferences
3851
- },get step(){return ONBOARDING_STEPS[step()]
3852
- },get final(){return step()===ONBOARDING_STEPS.length-1
3853
- },onBack:back,onAdvance:advance
3854
- })
3855
- },get children(){return _$createComponent(SectionConfig,{get api(){return props.api
3856
- },get preferences(){return props.preferences
3857
- },get active(){return active()
3858
- },onActive:setActive,onBack:back,onFinish:finish
3859
- })
3860
- }})]
3861
- }})
3862
- }
3863
3715
  function openFirstRunWizard(api,preferences){createDialogStack(api,preferences.lspIconStyle,()=>true,preferences.cornerFont).open(()=>_$createComponent(FirstRunWizard,{api,preferences
3864
3716
  }))
3865
3717
  }
@@ -3945,7 +3797,7 @@ return(()=>{var _el$=_$createElement("box")
3945
3797
  _$setProp(_el$,"flexDirection","row")
3946
3798
  _$setProp(_el$,"flexWrap","wrap")
3947
3799
  _$setProp(_el$,"gap",1)
3948
- _$insert(_el$,_$createComponent(For6,{get each(){return props.stats
3800
+ _$insert(_el$,_$createComponent(For4,{get each(){return props.stats
3949
3801
  },children:(stat)=>_$createComponent(SelectionBox,{height:1,get backgroundColor(){return theme().backgroundElement
3950
3802
  },paddingLeft:1,paddingRight:1,get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` `)
3951
3803
  _$insertNode(_el$2,_el$3)
@@ -3995,7 +3847,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3995
3847
  }]
3996
3848
  })
3997
3849
  onCleanup11(unregister)
3998
- createEffect8(()=>{if(!props.valid())
3850
+ createEffect9(()=>{if(!props.valid())
3999
3851
  dialogs.close()
4000
3852
  })
4001
3853
  return _$createComponent(DialogSurface,{get api(){return props.api
@@ -4102,7 +3954,7 @@ _$insertNode(_el$4,_el$5)
4102
3954
  _$setProp(_el$4,"flexShrink",0)
4103
3955
  _$insert(_el$4,()=>icons.icon(props.statusIcon),_el$5)
4104
3956
  _$insert(_el$4,()=>props.statusLabel,null)
4105
- _$effect((_p$)=>{var _v$=statusColor(),_v$2=emphasized()?theme().text:theme().textMuted,_v$3=emphasized()?TextAttributes13.BOLD:undefined,_v$4=statusColor(),_v$5=emphasized()?TextAttributes13.BOLD:undefined
3957
+ _$effect((_p$)=>{var _v$=statusColor(),_v$2=emphasized()?theme().text:theme().textMuted,_v$3=emphasized()?TextAttributes10.BOLD:undefined,_v$4=statusColor(),_v$5=emphasized()?TextAttributes10.BOLD:undefined
4106
3958
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
4107
3959
  _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
4108
3960
  _v$3!==_p$.a&&(_p$.a=_$setProp(_el$3,"attributes",_v$3,_p$.a))
@@ -4127,7 +3979,7 @@ return _el$6
4127
3979
  function McpPresetPreview(props){const dialogs=useDialogs(props.api)
4128
3980
  const icons=useIcons()
4129
3981
  const model=createMcpPresetPreview(props.controller,props.preferences,props.name)
4130
- onMount2(model.refresh)
3982
+ onMount3(model.refresh)
4131
3983
  const rows=createMemo3(()=>mcpPreviewRows(model,icons))
4132
3984
  const count=(change)=>model.preview().rows.filter((row)=>row.change===change).length
4133
3985
  return _$createComponent(PresetPreviewFrame,{get api(){return props.api
@@ -4148,7 +4000,7 @@ if(!request)
4148
4000
  return
4149
4001
  dialogs.close()
4150
4002
  reportMcpApplyError(props.api,request)
4151
- },get children(){return _$createComponent(For7,{get each(){return rows()
4003
+ },get children(){return _$createComponent(For5,{get each(){return rows()
4152
4004
  },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4153
4005
  }},row))
4154
4006
  })
@@ -4248,12 +4100,12 @@ dialogs.open(()=>_$createComponent(SelectionMenu,{api,title:"MCP presets",get op
4248
4100
 
4249
4101
 
4250
4102
 
4251
- var Content=lazy3(async ()=>{const path=import.meta.url.includes("/dist/")?"./sidebar-settings.js":"./settings-dialog-content"
4103
+ var Content2=lazy4(async ()=>{const path=import.meta.url.includes("/dist/")?"./sidebar-settings.js":"./settings-dialog-content"
4252
4104
  const module=await import(path)
4253
4105
  return{default:module.SettingsDialog
4254
4106
  }})
4255
4107
  function SettingsDialog(props){return(()=>{var _el$=_$createElement("box")
4256
- _$insert(_el$,_$createComponent(Suspense3,{get children(){return _$createComponent(Content,props)
4108
+ _$insert(_el$,_$createComponent(Suspense4,{get children(){return _$createComponent(Content2,props)
4257
4109
  }}))
4258
4110
  return _el$
4259
4111
  })()
@@ -4295,7 +4147,7 @@ return _$createElement("box")
4295
4147
 
4296
4148
  function PermissionModeBinding(props){let applying=false
4297
4149
  let observed
4298
- createEffect11(()=>{if(!props.preferences.ready())
4150
+ createEffect12(()=>{if(!props.preferences.ready())
4299
4151
  return
4300
4152
  const preferred=props.preferences.autoApprovePermissions()
4301
4153
  const current=currentPermissionMode(props.api)
@@ -4334,6 +4186,23 @@ return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon
4334
4186
 
4335
4187
 
4336
4188
 
4189
+ var services=new WeakMap
4190
+ function createSlot(){const [read,write]=createSignal16()
4191
+ return{read,write}}
4192
+ function slot(api){let entry=services.get(api)
4193
+ if(!entry){entry=createSlot()
4194
+ services.set(api,entry)
4195
+ }
4196
+ return entry
4197
+ }
4198
+ function registerNavigatorAboutServices(api,value){const entry=slot(api)
4199
+ entry.write(value)
4200
+ return()=>{if(entry.read()===value)
4201
+ entry.write(undefined)
4202
+ }}
4203
+ function getNavigatorAboutServices(api){return slot(api).read()
4204
+ }
4205
+
4337
4206
  var ACTIONS=[{key:"h",label:"Toggle sidebar",icon:"sections",group:"navigate",command:"session.sidebar.toggle",section:undefined
4338
4207
  },{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
4208
  },{key:"s",label:"Skills",icon:"skills",group:"navigate",command:`${PLUGIN_ID}.focus.skills`,section:"skills"
@@ -4348,7 +4217,7 @@ var CANCEL_COMMAND=`${PLUGIN_ID}.sidebar-shortcuts.cancel`
4348
4217
  var MODE=`${PLUGIN_ID}.sidebar-shortcuts`
4349
4218
  var DEFAULT_TIMEOUT_MS=5000
4350
4219
  function createSidebarShortcutMode(api,options={}){const actions=sidebarShortcutActions(api)
4351
- const [active,setActive]=createSignal16(false)
4220
+ const [active,setActive]=createSignal17(false)
4352
4221
  const timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS
4353
4222
  let shortcutKey=""
4354
4223
  let unregisterBinding
@@ -4398,7 +4267,7 @@ unregisterBinding=undefined
4398
4267
  unregisterCommands()
4399
4268
  }}}
4400
4269
 
4401
- var SidebarShortcutHint=lazy4(()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
4270
+ var SidebarShortcutHint=lazy5(()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
4402
4271
  return import(path)
4403
4272
  });
4404
4273
 
@@ -4490,131 +4359,23 @@ queueMicrotask(()=>void props.controller.start())
4490
4359
  })
4491
4360
  onCleanup15(unregister)
4492
4361
  } else
4493
- createEffect12(()=>{if(!props.controller.enabled())
4362
+ createEffect13(()=>{if(!props.controller.enabled())
4494
4363
  return
4495
4364
  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
4365
  }]
4497
4366
  })
4498
4367
  onCleanup15(unregister)
4499
4368
  })
4500
- onMount4(()=>void props.controller.initialize())
4369
+ onMount5(()=>void props.controller.initialize())
4501
4370
  onCleanup15(props.controller.dispose)
4502
4371
  return _$createElement("box")
4503
4372
  }
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
4373
 
4538
4374
 
4539
4375
 
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
4376
  function UpgradeNotesBinding(props){let pending
4616
4377
  let disposed=false
4617
- onMount5(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4378
+ onMount6(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4618
4379
  if(!previous||disposed)
4619
4380
  return
4620
4381
  try{let show=function(){if(disposed||props.api.lifecycle.signal?.aborted)
@@ -4627,6 +4388,9 @@ createDialogStack(props.api,props.preferences.lspIconStyle,()=>true,props.prefer
4627
4388
  },entries
4628
4389
  }),"large")
4629
4390
  }
4391
+ const path=import.meta.url.includes("/dist/")?"./upgrade-notes.js":"./upgrade-notes-content"
4392
+ const{changesSince,readBundledChangelog,UpgradeNotesDialog
4393
+ }=await import(path)
4630
4394
  const entries=changesSince(await (props.read??readBundledChangelog)(),previous,props.version)
4631
4395
  if(entries.length===0||disposed)
4632
4396
  return
@@ -4647,6 +4411,16 @@ return _$createElement("box")
4647
4411
 
4648
4412
 
4649
4413
 
4414
+
4415
+
4416
+
4417
+
4418
+
4419
+
4420
+
4421
+
4422
+
4423
+
4650
4424
 
4651
4425
 
4652
4426
 
@@ -4727,6 +4501,9 @@ return _el$
4727
4501
  })()
4728
4502
  }
4729
4503
 
4504
+
4505
+
4506
+
4730
4507
  function matchesFilter(query,...values){const needle=query.trim().toLocaleLowerCase()
4731
4508
  return !needle||values.some((value)=>value?.toLocaleLowerCase().includes(needle))
4732
4509
  }
@@ -4750,9 +4527,9 @@ return false
4750
4527
  return true
4751
4528
  }
4752
4529
  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)
4530
+ const [selectedId,setSelectedId]=createSignal20()
4531
+ const [focusWithin,setFocusWithin]=createSignal20(false)
4532
+ const [revision,setRevision]=createSignal20(0)
4756
4533
  let titleRoot
4757
4534
  let contentRoot
4758
4535
  let targetedRoot
@@ -5021,14 +4798,14 @@ else if(highlighted)
5021
4798
  foregroundColor=theme.selectedListItemText
5022
4799
  return{backgroundColor,foregroundColor}}
5023
4800
  function useSidebarItem(api,interaction,descriptor,normalColor=()=>api.theme.current.text,mode="row"){let unregister
5024
- const [hovered,setHovered]=createSignal19(false)
4801
+ const [hovered,setHovered]=createSignal21(false)
5025
4802
  const disabled=()=>descriptor.disabled?.()===true
5026
4803
  const focused=()=>Boolean(interaction?.ownsFocus()&&interaction.isSelected(descriptor.id))
5027
4804
  const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),hovered:hovered(),disabled:disabled()},normalColor(),mode)
5028
4805
  const ref=(renderable)=>{unregister?.()
5029
4806
  unregister=interaction?.register({...descriptor,renderable})
5030
4807
  }
5031
- onCleanup17(()=>unregister?.())
4808
+ onCleanup18(()=>unregister?.())
5032
4809
  return{ref,disabled,focused,backgroundColor:()=>colors().backgroundColor,foregroundColor:()=>colors().foregroundColor,onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),select(event){interaction?.mouseSelect(descriptor.id,event)
5033
4810
  },activate(event){if(interaction)
5034
4811
  return interaction.mouseActivate(descriptor.id,event)
@@ -5039,7 +4816,7 @@ return true
5039
4816
  }}}
5040
4817
  function LspBadge(props){const icons=useIcons()
5041
4818
  const isKnown=lspIconName(props.id)!==undefined
5042
- const [showName,setShowName]=createSignal20(false)
4819
+ const [showName,setShowName]=createSignal22(false)
5043
4820
  const statusColor=()=>props.status==="connected"?props.api.theme.current.success:props.api.theme.current.error
5044
4821
  if(!isKnown){return(()=>{var _el$=_$createElement("text")
5045
4822
  _$setProp(_el$,"flexShrink",1)
@@ -5082,7 +4859,7 @@ return _el$3
5082
4859
 
5083
4860
 
5084
4861
 
5085
- function createListVisibility(options){const [expanded,setExpanded]=createSignal21(false)
4862
+ function createListVisibility(options){const [expanded,setExpanded]=createSignal23(false)
5086
4863
  let previousKey
5087
4864
  let previousLimit
5088
4865
  const canToggle=createMemo8(()=>options.limit()>0&&options.items().length>options.limit())
@@ -5169,10 +4946,10 @@ result += segment
5169
4946
  }
5170
4947
  return result + ellipsis
5171
4948
  }
5172
- function SectionHeaderControl(props){const [width,setWidth]=createSignal22()
4949
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal24()
5173
4950
  const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
5174
4951
  },()=>props.api.theme.current.accent,"control")
5175
- createEffect13(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
4952
+ createEffect14(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
5176
4953
  const label=()=>width()===undefined||props.iconOnly?props.action.label():truncateEnd(props.action.label(),width()-2)
5177
4954
  return _$createComponent(SelectionBox,{ref:(node)=>control.ref(node),get id(){return props.action.id
5178
4955
  },get iconOnly(){return props.iconOnly
@@ -5194,7 +4971,7 @@ return _el$
5194
4971
  }})
5195
4972
  }
5196
4973
  function Section(props){const icons=useIcons()
5197
- const [headerWidth,setHeaderWidth]=createSignal23(0)
4974
+ const [headerWidth,setHeaderWidth]=createSignal25(0)
5198
4975
  const icon=()=>props.section?icons.section(props.section):props.icon
5199
4976
  const theme=()=>props.api.theme.current
5200
4977
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
@@ -5291,7 +5068,7 @@ _$setProp(_el$,"flexWrap","wrap")
5291
5068
  _$setProp(_el$,"gap",1)
5292
5069
  _$setProp(_el$,"paddingLeft",1)
5293
5070
  _$setProp(_el$,"paddingRight",1)
5294
- _$insert(_el$,_$createComponent(For12,{get each(){return visibility.visible()
5071
+ _$insert(_el$,_$createComponent(For10,{get each(){return visibility.visible()
5295
5072
  },children:(item,index)=>_$createComponent(LspBadge,{get api(){return props.api
5296
5073
  },get interaction(){return props.interaction
5297
5074
  },get id(){return item.id
@@ -5552,8 +5329,8 @@ return _el$5
5552
5329
  function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5553
5330
  }=input
5554
5331
  const id=`${input.id}.favorite`
5555
- const [rowHovered,setRowHovered]=createSignal24(false)
5556
- const [controlHovered,setControlHovered]=createSignal24(false)
5332
+ const [rowHovered,setRowHovered]=createSignal26(false)
5333
+ const [controlHovered,setControlHovered]=createSignal26(false)
5557
5334
  const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5558
5335
  }),disabled,activate:()=>{onToggle()
5559
5336
  queueMicrotask(()=>interaction?.select(id))
@@ -5669,7 +5446,7 @@ return _el$2
5669
5446
  function SectionFilter(props){const icons=useIcons()
5670
5447
  let input
5671
5448
  let unregisterInput
5672
- const [inputFocused,setInputFocused]=createSignal25(false)
5449
+ const [inputFocused,setInputFocused]=createSignal27(false)
5673
5450
  const theme=()=>props.api.theme.current
5674
5451
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5675
5452
  },activate:()=>{if(!input)
@@ -5690,7 +5467,7 @@ props.interaction.leaveFilter(input)
5690
5467
  else
5691
5468
  input?.blur()
5692
5469
  }
5693
- onCleanup18(()=>unregisterInput?.())
5470
+ onCleanup19(()=>unregisterInput?.())
5694
5471
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5695
5472
  },flexDirection:"row",gap:1,marginTop:1,marginBottom:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>!!highlighted())()?theme().primary:item.backgroundColor()
5696
5473
  },get onMouseOver(){return item.onMouseOver
@@ -5767,7 +5544,7 @@ return _el$2
5767
5544
  },get interaction(){return props.interaction
5768
5545
  },get grouped(){return model.grouped
5769
5546
  },get density(){return props.preferences.rowDensity?.()??"compact"
5770
- },get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
5547
+ },get children(){return _$createComponent(For11,{get each(){return model.visibility.visible()
5771
5548
  },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
5772
5549
  },get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
5773
5550
  },get interaction(){return props.interaction
@@ -5799,7 +5576,7 @@ return _el$
5799
5576
  }})
5800
5577
  }
5801
5578
  function McpSection(props){const icons=useIcons()
5802
- const [query,setQuery]=createSignal26("")
5579
+ const [query,setQuery]=createSignal28("")
5803
5580
  const model=createMcpSectionModel(props,query)
5804
5581
  const navigationSection=()=>props.navigationSection??6
5805
5582
  const summary=createMemo11(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -5939,7 +5716,7 @@ function QuickActionRow(props){const{api,interaction
5939
5716
  const icons=useIcons()
5940
5717
  const toolbar=useToolbar()
5941
5718
  const theme=()=>api.theme.current
5942
- const [width,setWidth]=createSignal31(0)
5719
+ const [width,setWidth]=createSignal33(0)
5943
5720
  const shortcut=createMemo12(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
5944
5721
  })
5945
5722
  return api.keys.formatBindings(bindings.get(props.action.command))
@@ -6030,13 +5807,14 @@ return _$createComponent(Section,{get api(){return props.api
6030
5807
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6031
5808
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6032
5809
  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
5810
+ }}),_$createComponent(For14,{get each(){return visibility.visible().map((action)=>action.command)
5811
+ },children:(id,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
5812
+ },get action(){return visibility.visible()[index()]
5813
+ },get disabled(){return visibility.visible()[index()].disabled
5814
+ },get favorite(){return props.preferences.favoriteQuickActions?.().has(id)??false
6037
5815
  },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
5816
+ },get separator(){return _$memo(()=>!!(index()>0&&(props.preferences.favoriteQuickActions?.().has(visibility.visible()[index()-1].command)??false)))()&&!(props.preferences.favoriteQuickActions?.().has(id)??false)
5817
+ },onToggleFavorite:()=>props.preferences.toggleFavoriteQuickAction?.(id),get position(){return{section:navigationSection(),row:10 + index(),column:0
6040
5818
  }}})
6041
5819
  })]
6042
5820
  }}),_$createComponent(ListVisibilityControl,{get api(){return props.api
@@ -6091,13 +5869,13 @@ item.activate(event)
6091
5869
 
6092
5870
 
6093
5871
  function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
6094
- createEffect15(()=>{const key=props.preferences.toggleKey()
5872
+ createEffect16(()=>{const key=props.preferences.toggleKey()
6095
5873
  untrack6(()=>shortcuts.bind(key))
6096
5874
  })
6097
- createEffect15(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
5875
+ createEffect16(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
6098
5876
  untrack6(shortcuts.cancel)
6099
5877
  })
6100
- onCleanup19(shortcuts.dispose)
5878
+ onCleanup20(shortcuts.dispose)
6101
5879
  return(()=>{var _el$=_$createElement("box")
6102
5880
  _$setProp(_el$,"position","absolute")
6103
5881
  _$setProp(_el$,"top",0)
@@ -6105,7 +5883,7 @@ _$setProp(_el$,"left",0)
6105
5883
  _$setProp(_el$,"width","100%")
6106
5884
  _$setProp(_el$,"height","100%")
6107
5885
  _$insert(_el$,_$createComponent(Show26,{get when(){return shortcuts.active()
6108
- },get children(){return _$createComponent(Suspense4,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
5886
+ },get children(){return _$createComponent(Suspense5,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
6109
5887
  },get actions(){return shortcuts.actions
6110
5888
  }})
6111
5889
  }})
@@ -6119,11 +5897,11 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6119
5897
  })=>({name:name.replace(PLUGIN_ID,()=>LEGACY_PLUGIN_ID),run,enabled
6120
5898
  }))]
6121
5899
  })
6122
- onCleanup19(unregisterCommands)
6123
- createEffect15(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
5900
+ onCleanup20(unregisterCommands)
5901
+ createEffect16(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6124
5902
  }]
6125
5903
  })
6126
- onCleanup19(unregister)
5904
+ onCleanup20(unregister)
6127
5905
  })
6128
5906
  return _$createElement("box")
6129
5907
  }
@@ -6143,24 +5921,53 @@ return _$createElement("box")
6143
5921
 
6144
5922
 
6145
5923
 
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
- }}
5924
+ function toolbarLayout(keys,width,mode,widths){const capacity=Math.max(3,Math.floor(width))
5925
+ const columns=Math.max(1,Math.floor((capacity + 1) / 4))
5926
+ const sizes={}
5927
+ const size=(key)=>Math.max(3,Math.min(capacity,widths?.get(key)??3))
5928
+ const rows=[]
5929
+ let overflow=[]
5930
+ if(mode==="wrap"){let used=0
5931
+ for(const key of keys){const value=size(key)
5932
+ if(rows.length===0||used>0&&used + 1 + value>capacity){rows.push([])
5933
+ used=0
5934
+ }
5935
+ rows.at(-1).push(key)
5936
+ sizes[key]=value
5937
+ used += (used?1:0) + value
5938
+ }} else if(keys.length>0){const fits=keys.reduce((total,key)=>total + size(key),0) + keys.length-1<=capacity
5939
+ const visible=[]
5940
+ let used=0
5941
+ for(const key of keys){const remaining=(fits?capacity:capacity-4)-used-(visible.length>0?1:0)
5942
+ if(remaining<3)
5943
+ break
5944
+ sizes[key]=Math.min(size(key),remaining)
5945
+ used += (visible.length>0?1:0) + sizes[key]
5946
+ visible.push(key)
5947
+ }
5948
+ overflow=keys.slice(visible.length)
5949
+ if(overflow.length>0){visible.push("toolbar:more")
5950
+ sizes["toolbar:more"]=3
5951
+ }
5952
+ rows.push(visible)
5953
+ }
5954
+ return{columns,overflow,rows,...widths&&{sizes}}}
6153
5955
 
5956
+ function toolbarPinWidth(pin){const states=Object.keys({...pin.stateIcons,...pin.stateIconLists})
5957
+ const count=Math.max(toolbarPinIcons(pin).length,...states.map((state)=>toolbarPinIcons(pin,state).length))
5958
+ const iconsWidth=Math.max(0,count*2-1)
5959
+ return 2 + Math.max(1,iconsWidth + (count&&pin.text?1:0) + Bun.stringWidth(pin.text??""))
5960
+ }
6154
5961
  function createToolbarModel(props){const icons=useIcons()
6155
5962
  const revision=createQuickActionRevision(props.api)
6156
5963
  const pins=()=>props.preferences.toolbarPins?.()??[]
6157
5964
  const needsSkills=createMemo14(()=>pins().some((pin)=>pin.kind==="skill"))
6158
5965
  const target=createMemo14(()=>props.skills.target())
6159
- createEffect16(()=>{if(!needsSkills())
5966
+ createEffect17(()=>{if(!needsSkills())
6160
5967
  return
6161
5968
  const current=target()
6162
5969
  const release=untrack7(()=>props.skills.activate(current))
6163
- onCleanup20(release)
5970
+ onCleanup21(release)
6164
5971
  untrack7(()=>{props.skills.refresh(current).catch(()=>{})
6165
5972
  })
6166
5973
  })
@@ -6168,12 +5975,12 @@ function view(pin){revision()
6168
5975
  if(pin.kind==="action"){const action=QUICK_ACTIONS.find((item)=>item.command===pin.id)
6169
5976
  const state=quickActionState(props.api,pin.id)
6170
5977
  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)
5978
+ return{label:quickActionLabel(props.api,action),stateLabel,icons:toolbarPinIcons(pin,state),text:pin.text,reason:quickActionDisabledReason(props.api,action)
6172
5979
  }}
6173
5980
  const skill=props.skills.list(target()).find((item)=>item.location===pin.location&&item.name===pin.name)
6174
5981
  const request=props.skills.state(target())
6175
5982
  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)
5983
+ return{label:pin.name,icons:toolbarPinIcons(pin),text:pin.text,stateLabel:undefined,reason:request.error?.message??(skill?skillUnavailable(props.skills,skill):unavailable)
6177
5984
  }}
6178
5985
  function run(key){const pin=pins().find((item)=>toolbarPinKey(item)===key)
6179
5986
  if(!pin)
@@ -6196,36 +6003,68 @@ const route=JSON.stringify(props.api.route.current)
6196
6003
  const dialogs=createDialogStack(props.api,icons.style,()=>route===JSON.stringify(props.api.route.current),icons.multilineCorners)
6197
6004
  activateSkill({api:props.api,controller:props.skills,access:props.preferences,skill,dialogs})
6198
6005
  }
6199
- return{pins,view,run}}
6006
+ return{pins,view,run,width:toolbarPinWidth}}
6007
+
6008
+
6009
+
6010
+
6200
6011
 
6201
6012
 
6202
6013
 
6203
6014
  function ToolbarButton(props){const icons=useIcons()
6204
- const [hovered,setHovered]=createSignal32(false)
6015
+ const foreground=()=>props.reason?props.api.theme.current.textMuted:item.foregroundColor()
6016
+ const [hovered,setHovered]=createSignal34(false)
6205
6017
  const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>({section:0,row:props.row + 1,column:props.column
6206
6018
  }),activate:props.onRun
6207
6019
  },()=>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
6020
+ const content=()=>[props.icons.map((icon)=>terminalIcon(icon,icons.style())).join(" "),props.text].filter(Boolean).join(" ")
6021
+ createEffect18(()=>props.onDetails(props.id,item.focused()||hovered()))
6022
+ onCleanup22(()=>props.onDetails(props.id,false))
6023
+ return _$createComponent(Show27,{get when(){return _$memo(()=>!!(props.width===3&&props.icons.length===1))()&&!props.text
6024
+ },get fallback(){return _$createComponent(SelectionBox,{get id(){return props.id
6025
+ },ref(r$){var _ref$2=item.ref
6026
+ typeof _ref$2==="function"?_ref$2(r$):item.ref=r$
6027
+ },get width(){return props.width
6028
+ },height:1,flexShrink:0,alignItems:"center",justifyContent:"center",get backgroundColor(){return item.backgroundColor()
6029
+ },onMouseOver:(event)=>{event.stopPropagation()
6030
+ item.onMouseOver()
6031
+ setHovered(true)
6032
+ },onMouseOut:(event)=>{event.stopPropagation()
6033
+ item.onMouseOut()
6034
+ setHovered(false)
6035
+ },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
6036
+ item.activate(event)
6037
+ },get children(){var _el$=_$createElement("text")
6038
+ _$setProp(_el$,"height",1)
6039
+ _$setProp(_el$,"minWidth",0)
6040
+ _$setProp(_el$,"maxWidth","100%")
6041
+ _$setProp(_el$,"truncate",true)
6042
+ _$setProp(_el$,"wrapMode","none")
6043
+ _$insert(_el$,content)
6044
+ _$effect((_$p)=>_$setProp(_el$,"fg",foreground(),_$p))
6045
+ return _el$
6046
+ }})
6047
+ },get children(){return _$createComponent(IconControl,{get id(){return props.id
6211
6048
  },ref(r$){var _ref$=item.ref
6212
6049
  typeof _ref$==="function"?_ref$(r$):item.ref=r$
6213
- },get icon(){return terminalIcon(props.icon,icons.style())
6050
+ },get icon(){return terminalIcon(props.icons[0]??"bolt",icons.style())
6214
6051
  },get backgroundColor(){return item.backgroundColor()
6215
- },get foregroundColor(){return _$memo(()=>!!props.reason)()?props.api.theme.current.textMuted:item.foregroundColor()
6052
+ },get foregroundColor(){return foreground()
6216
6053
  },onMouseOver:()=>{item.onMouseOver()
6217
6054
  setHovered(true)
6218
6055
  },onMouseOut:()=>{item.onMouseOut()
6219
6056
  setHovered(false)
6220
6057
  },onMouseUp:(event)=>item.activate(event)
6221
6058
  })
6059
+ }})
6222
6060
  }
6223
6061
  function SidebarToolbar(props){const model=createToolbarModel(props)
6224
6062
  const icons=useIcons()
6225
- const [width,setWidth]=createSignal33(3)
6226
- const [detail,setDetail]=createSignal33()
6063
+ const [width,setWidth]=createSignal35(3)
6064
+ const [detail,setDetail]=createSignal35()
6227
6065
  const keys=createMemo15(()=>model.pins().map((pin)=>toolbarPinKey(pin)))
6228
- const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu"))
6066
+ const widths=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),model.width(pin)])))
6067
+ const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu",widths()))
6229
6068
  const rows=createMemo15(()=>layout().rows.map((_,index)=>index))
6230
6069
  const byKey=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),pin])))
6231
6070
  const view=(key)=>{const pin=byKey().get(key)
@@ -6250,19 +6089,22 @@ dialogs.close()
6250
6089
  model.run(option.value)
6251
6090
  }}))
6252
6091
  }
6253
- return _$createComponent(Show27,{get when(){return keys().length>0
6092
+ return _$createComponent(Show28,{get when(){return keys().length>0
6254
6093
  },get children(){var _el$=_$createElement("box")
6255
6094
  _$setProp(_el$,"id","opencode-navigator.toolbar")
6095
+ _$setProp(_el$,"overflow","visible")
6256
6096
  _$setProp(_el$,"onSizeChange",function(){setWidth(this.width)
6257
6097
  })
6258
- _$insert(_el$,_$createComponent(For17,{get each(){return rows()
6098
+ _$insert(_el$,_$createComponent(For15,{get each(){return rows()
6259
6099
  },children:(row)=>(()=>{var _el$2=_$createElement("box")
6260
6100
  _$setProp(_el$2,"flexDirection","row")
6261
6101
  _$setProp(_el$2,"gap",1)
6262
- _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6102
+ _$insert(_el$2,_$createComponent(For15,{get each(){return layout().rows[row]
6263
6103
  },children:(key,column)=>_$createComponent(ToolbarButton,_$mergeProps(props,{id:`opencode-navigator.toolbar.${key}`,row,get column(){return column()
6264
6104
  },get label(){return view(key)?.label??"More"
6265
- },get icon(){return key==="toolbar:more"?"list":view(key)?.icon??"bolt"
6105
+ },get icons(){return key==="toolbar:more"?["list"]:view(key)?.icons??["bolt"]
6106
+ },get text(){return view(key)?.text
6107
+ },get width(){return layout().sizes?.[key]??3
6266
6108
  },get reason(){return view(key)?.reason
6267
6109
  },onRun:()=>key==="toolbar:more"?showMore():model.run(key),onDetails:(_id,active)=>setDetail((current)=>active?key:current===key?undefined:current)
6268
6110
  }))
@@ -6270,13 +6112,21 @@ _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6270
6112
  return _el$2
6271
6113
  })()
6272
6114
  }),null)
6273
- _$insert(_el$,_$createComponent(Show27,{get when(){return details()
6115
+ _$insert(_el$,_$createComponent(Show28,{get when(){return details()
6274
6116
  },children:(text)=>(()=>{var _el$3=_$createElement("text")
6117
+ _$setProp(_el$3,"position","absolute")
6118
+ _$setProp(_el$3,"left",0)
6119
+ _$setProp(_el$3,"width","100%")
6275
6120
  _$setProp(_el$3,"height",1)
6276
6121
  _$setProp(_el$3,"truncate",true)
6277
6122
  _$setProp(_el$3,"wrapMode","none")
6278
6123
  _$insert(_el$3,text)
6279
- _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
6124
+ _$effect((_p$)=>{var _v$=rows().length,_v$2=props.api.theme.current.textMuted
6125
+ _v$!==_p$.e&&(_p$.e=_$setProp(_el$3,"top",_v$,_p$.e))
6126
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
6127
+ return _p$
6128
+ },{e:undefined,t:undefined
6129
+ })
6280
6130
  return _el$3
6281
6131
  })()
6282
6132
  }),null)
@@ -6302,9 +6152,9 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
6302
6152
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
6303
6153
  })
6304
6154
  const state=createMemo16(()=>props.controller.state(target()))
6305
- createEffect18(()=>{const current=target()
6155
+ createEffect19(()=>{const current=target()
6306
6156
  const deactivate=untrack8(()=>props.controller.activate?.(current)??(()=>{}))
6307
- onCleanup22(deactivate)
6157
+ onCleanup23(deactivate)
6308
6158
  untrack8(()=>void props.controller.refresh(current).catch(()=>{}))
6309
6159
  })
6310
6160
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
@@ -6356,7 +6206,7 @@ _$insert(_el$,()=>props.item.name,null)
6356
6206
  _$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
6357
6207
  return _el$
6358
6208
  })()
6359
- },get trailing(){return _$createComponent(Show28,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6209
+ },get trailing(){return _$createComponent(Show29,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6360
6210
  },get position(){return props.position
6361
6211
  },get pin(){return{kind:"skill",name:props.item.name,location:props.item.location,icon:"book"
6362
6212
  }}})
@@ -6365,7 +6215,7 @@ return _el$
6365
6215
  }
6366
6216
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6367
6217
  const toolbar=useToolbar()
6368
- const [query,setQuery]=createSignal34("")
6218
+ const [query,setQuery]=createSignal36("")
6369
6219
  const model=createSkillSectionModel(props,query)
6370
6220
  const navigationSection=()=>props.navigationSection??3
6371
6221
  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 +6239,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6389
6239
  }},get query(){return query()
6390
6240
  },placeholder:"Filter skills...",onInput:setQuery
6391
6241
  }),null)
6392
- _$insert(_el$,_$createComponent(Show29,{get when(){return model.filtered().length>0
6242
+ _$insert(_el$,_$createComponent(Show30,{get when(){return model.filtered().length>0
6393
6243
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6394
6244
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6395
6245
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -6399,8 +6249,8 @@ return _el$2
6399
6249
  },get interaction(){return props.interaction
6400
6250
  },get grouped(){return model.grouped
6401
6251
  },get density(){return props.preferences.rowDensity?.()??"compact"
6402
- },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)
6252
+ },get children(){return _$createComponent(For16,{get each(){return model.visibility.visible()
6253
+ },children:(item,index)=>[_$createComponent(Show30,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6404
6254
  },get children(){var _el$4=_$createElement("text")
6405
6255
  _$setProp(_el$4,"height",1)
6406
6256
  _$setProp(_el$4,"wrapMode","none")
@@ -6445,18 +6295,18 @@ return _el$
6445
6295
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6446
6296
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6447
6297
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6448
- const [query,setQuery]=createSignal35("")
6449
- const [mode,setMode]=createSignal35("all")
6298
+ const [query,setQuery]=createSignal37("")
6299
+ const [mode,setMode]=createSignal37("all")
6450
6300
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6451
6301
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6452
6302
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
6453
6303
  const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
6454
6304
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6455
- createEffect19(()=>{targetKey()
6305
+ createEffect20(()=>{targetKey()
6456
6306
  setQuery("")
6457
6307
  setMode("all")
6458
6308
  })
6459
- createEffect19(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6309
+ createEffect20(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6460
6310
  setMode("all")
6461
6311
  })
6462
6312
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
@@ -6466,10 +6316,10 @@ const now=createSubagentClock(clockKey)
6466
6316
  const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
6467
6317
  const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
6468
6318
  const state=createMemo17(()=>props.controller.state(props.sessionID))
6469
- createEffect19(()=>{const sessionID=props.sessionID
6319
+ createEffect20(()=>{const sessionID=props.sessionID
6470
6320
  targetKey()
6471
6321
  const deactivate=untrack9(()=>props.controller.activate?.(sessionID)??(()=>{}))
6472
- onCleanup23(deactivate)
6322
+ onCleanup24(deactivate)
6473
6323
  untrack9(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6474
6324
  })
6475
6325
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
@@ -6527,7 +6377,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6527
6377
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6528
6378
  return _el$3
6529
6379
  })()
6530
- },get details(){return [_$createComponent(Show30,{get when(){return props.item.run?.errorMessage
6380
+ },get details(){return [_$createComponent(Show31,{get when(){return props.item.run?.errorMessage
6531
6381
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6532
6382
  _$insertNode(_el$4,_el$5)
6533
6383
  _$setProp(_el$4,"wrapMode","word")
@@ -6535,12 +6385,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6535
6385
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6536
6386
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6537
6387
  return _el$4
6538
- }}),_$createComponent(Show30,{get when(){return props.item.unavailable
6388
+ }}),_$createComponent(Show31,{get when(){return props.item.unavailable
6539
6389
  },get children(){var _el$6=_$createElement("text")
6540
6390
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6541
6391
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6542
6392
  return _el$6
6543
- }}),_$createComponent(Show30,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6393
+ }}),_$createComponent(Show31,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6544
6394
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6545
6395
  _$insertNode(_el$0,_el$1)
6546
6396
  _$insertNode(_el$0,_el$10)
@@ -6552,7 +6402,7 @@ _$insert(_el$0,()=>status().message,null)
6552
6402
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6553
6403
  return _el$0
6554
6404
  })()
6555
- }),_$createComponent(Show30,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6405
+ }),_$createComponent(Show31,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6556
6406
  },get children(){var _el$8=_$createElement("text")
6557
6407
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6558
6408
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6563,12 +6413,12 @@ return _el$8
6563
6413
  function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
6564
6414
  },get interaction(){return props.interaction
6565
6415
  },get density(){return props.density
6566
- },get children(){return _$createComponent(For19,{get each(){return props.ids
6416
+ },get children(){return _$createComponent(For17,{get each(){return props.ids
6567
6417
  },children:(id,index)=>{const initial=props.itemById(id)
6568
6418
  const item=()=>props.itemById(id)??initial
6569
6419
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6570
6420
  return(()=>{var _el$=_$createElement("box")
6571
- _$insert(_el$,_$createComponent(Show31,{get when(){return startsGroup()
6421
+ _$insert(_el$,_$createComponent(Show32,{get when(){return startsGroup()
6572
6422
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6573
6423
  _$insertNode(_el$2,_el$3)
6574
6424
  _$insert(_el$3,()=>item().group)
@@ -6594,7 +6444,7 @@ return _$createComponent(Section,{get api(){return props.api
6594
6444
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6595
6445
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6596
6446
  },get open(){return props.preferences.expanded().subagents
6597
- },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show32,{get when(){return model.parentID()
6447
+ },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show33,{get when(){return model.parentID()
6598
6448
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6599
6449
  },get interaction(){return props.interaction
6600
6450
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6617,7 +6467,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6617
6467
  }}),_el$2)
6618
6468
  _$setProp(_el$2,"flexDirection","row")
6619
6469
  _$setProp(_el$2,"flexWrap","wrap")
6620
- _$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
6470
+ _$insert(_el$2,_$createComponent(For18,{get each(){return model.tabs()
6621
6471
  },children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6622
6472
  },get interaction(){return props.interaction
6623
6473
  },id:`${PLUGIN_ID}.subagents.filter.${value}`,get position(){return{section:navigationSection(),row:4,column:index()
@@ -6628,7 +6478,7 @@ _$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
6628
6478
  },onActivate:()=>model.setMode(value)
6629
6479
  })
6630
6480
  }))
6631
- _$insert(_el$,_$createComponent(Show32,{get when(){return model.filtered().length===0
6481
+ _$insert(_el$,_$createComponent(Show33,{get when(){return model.filtered().length===0
6632
6482
  },get children(){var _el$3=_$createElement("text")
6633
6483
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6634
6484
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6669,13 +6519,36 @@ return _el$
6669
6519
 
6670
6520
 
6671
6521
 
6522
+
6523
+
6672
6524
  function NativeTodoNotice(props){const icons=useIcons()
6673
- return(()=>{var _el$=_$createElement("text"),_el$2=_$createTextNode(` Native OpenCode Todo. Edit tasks through chat and todowrite.`)
6525
+ const state=()=>props.setup?.state(props.sessionID)
6526
+ const failed=()=>state()?.status==="error"
6527
+ const disabled=()=>state()?.enabled===false
6528
+ const message=()=>{if(failed())
6529
+ return state()?.error
6530
+ if(state()?.status==="loading"&&state()?.enabled===undefined)
6531
+ return "Checking native Todo configuration\u2026"
6532
+ if(disabled())
6533
+ return "Native OpenCode Todo is disabled. Enable it to let the built-in todowrite tool manage tasks."
6534
+ return "Native OpenCode Todo. Edit tasks through chat and todowrite."
6535
+ }
6536
+ return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `)
6674
6537
  _$insertNode(_el$,_el$2)
6675
- _$setProp(_el$,"wrapMode","word")
6676
- _$insert(_el$,()=>icons.icon("info"),_el$2)
6677
- _$insert(_el$,()=>props.empty?" OpenCode 2.1 enables the tool through experimental.todo.":"",null)
6678
- _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6538
+ _$insertNode(_el$2,_el$3)
6539
+ _$setProp(_el$2,"wrapMode","word")
6540
+ _$insert(_el$2,()=>icons.icon("info"),_el$3)
6541
+ _$insert(_el$2,message,null)
6542
+ _$insert(_el$,_$createComponent(Show34,{get when(){return _$memo(()=>!!props.setup)()&&(disabled()||failed())
6543
+ },get children(){return _$createComponent(SectionTab,{get api(){return props.api
6544
+ },get interaction(){return props.interaction
6545
+ },id:"opencode-navigator.todo.setup",get position(){return{section:props.navigationSection,row:2,column:0
6546
+ }},get label(){return failed()?"Retry Todo configuration":"Enable Todo\u2026"
6547
+ },selected:false,get disabled(){return state()?.status==="saving"
6548
+ },onActivate:()=>failed()?void props.setup?.refresh(props.sessionID):props.setup?.configure(props.sessionID)
6549
+ })
6550
+ }}),null)
6551
+ _$effect((_$p)=>_$setProp(_el$2,"fg",failed()?props.api.theme.current.warning:props.api.theme.current.textMuted,_$p))
6679
6552
  return _el$
6680
6553
  })()
6681
6554
  }
@@ -6729,7 +6602,7 @@ _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":
6729
6602
  _$setProp(_el$3,"flexGrow",1)
6730
6603
  _$setProp(_el$3,"wrapMode","word")
6731
6604
  _$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"
6605
+ _$insert(_el$,_$createComponent(Show35,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6733
6606
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
6734
6607
  _$insertNode(_el$4,_el$5)
6735
6608
  _$setProp(_el$4,"width",2)
@@ -6739,7 +6612,7 @@ _$insert(_el$5,priorityLabel,null)
6739
6612
  _$effect((_$p)=>_$setProp(_el$4,"fg",priorityColor(),_$p))
6740
6613
  return _el$4
6741
6614
  }}),null)
6742
- _$effect((_p$)=>{var _v$=active()?theme().warning:done()?theme().success:cancelled()?theme().error:theme().textMuted,_v$2=active()?theme().primary:theme().textMuted,_v$3=done()?TextAttributes18.STRIKETHROUGH:active()?TextAttributes18.BOLD:undefined
6615
+ _$effect((_p$)=>{var _v$=active()?theme().warning:done()?theme().success:cancelled()?theme().error:theme().textMuted,_v$2=active()?theme().primary:theme().textMuted,_v$3=done()?TextAttributes15.STRIKETHROUGH:active()?TextAttributes15.BOLD:undefined
6743
6616
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
6744
6617
  _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
6745
6618
  _v$3!==_p$.a&&(_p$.a=_$setProp(_el$3,"attributes",_v$3,_p$.a))
@@ -6750,13 +6623,13 @@ return _el$
6750
6623
  })()
6751
6624
  }
6752
6625
  function TodoContents(props){const navigationSection=()=>props.navigationSection??1
6753
- const tabsRow=()=>props.managed?3:2
6626
+ const tabsRow=()=>(props.managed?3:2) + (props.navigationOffset??0)
6754
6627
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box")
6755
6628
  _$insertNode(_el$,_el$2)
6756
6629
  _$setProp(_el$,"gap",1)
6757
6630
  _$setProp(_el$2,"flexDirection","row")
6758
6631
  _$setProp(_el$2,"flexWrap","wrap")
6759
- _$insert(_el$2,_$createComponent(For21,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6632
+ _$insert(_el$2,_$createComponent(For19,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6760
6633
  },get interaction(){return props.interaction
6761
6634
  },id:`${PLUGIN_ID}.todo.filter.${value}`,get position(){return{section:navigationSection(),row:tabsRow(),column:index()
6762
6635
  }},get label(){return value[0].toUpperCase() + value.slice(1)
@@ -6765,17 +6638,17 @@ _$insert(_el$2,_$createComponent(For21,{each:["all","active","finished"],childre
6765
6638
  },onActivate:()=>props.setMode(value)
6766
6639
  })
6767
6640
  }))
6768
- _$insert(_el$,_$createComponent(Show34,{get when(){return props.view.rows.length>0
6641
+ _$insert(_el$,_$createComponent(Show36,{get when(){return props.view.rows.length>0
6769
6642
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6770
6643
  },get mode(){return props.mode
6771
6644
  }})
6772
6645
  },get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
6773
6646
  },get interaction(){return props.interaction
6774
6647
  },get density(){return props.density
6775
- },get children(){return _$createComponent(For21,{get each(){return props.visibility.visible()
6648
+ },get children(){return _$createComponent(For19,{get each(){return props.visibility.visible()
6776
6649
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6777
6650
  return(()=>{var _el$3=_$createElement("box")
6778
- _$insert(_el$3,_$createComponent(Show34,{get when(){return startsGroup()
6651
+ _$insert(_el$3,_$createComponent(Show36,{get when(){return startsGroup()
6779
6652
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
6780
6653
  _$insertNode(_el$4,_el$5)
6781
6654
  _$insert(_el$5,()=>row.group)
@@ -6812,7 +6685,7 @@ return _el$6
6812
6685
 
6813
6686
 
6814
6687
  function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
6815
- return _$createComponent(Show35,{get when(){return state().available
6688
+ return _$createComponent(Show37,{get when(){return state().available
6816
6689
  },get children(){var _el$=_$createElement("box")
6817
6690
  _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6818
6691
  },get interaction(){return props.interaction
@@ -6822,7 +6695,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6822
6695
  },get disabled(){return state().saving
6823
6696
  },onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
6824
6697
  }),null)
6825
- _$insert(_el$,_$createComponent(Show35,{get when(){return state().error
6698
+ _$insert(_el$,_$createComponent(Show37,{get when(){return state().error
6826
6699
  },children:(message)=>(()=>{var _el$2=_$createElement("text")
6827
6700
  _$setProp(_el$2,"wrapMode","word")
6828
6701
  _$insert(_el$2,message)
@@ -6838,22 +6711,25 @@ const icons=useIcons()
6838
6711
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6839
6712
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6840
6713
  const native=()=>("source" in props.controller)&&props.controller.source==="native"
6841
- const [mode,setMode]=createSignal36("all")
6714
+ const setup=()=>("setup" in props.controller)?props.controller.setup:undefined
6715
+ const setupState=()=>setup()?.state(props.sessionID)
6716
+ const [mode,setMode]=createSignal38("all")
6842
6717
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6843
- createEffect20(()=>{targetKey()
6718
+ createEffect21(()=>{targetKey()
6844
6719
  setMode("all")
6845
6720
  })
6846
6721
  const view=createMemo18(()=>buildTodoView(list(),mode()))
6847
6722
  const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
6848
6723
  })
6849
6724
  const state=createMemo18(()=>props.controller.state(props.sessionID))
6850
- createEffect20(()=>{const sessionID=props.sessionID
6725
+ createEffect21(()=>{const sessionID=props.sessionID
6851
6726
  targetKey()
6852
6727
  if(unavailable())
6853
6728
  return
6854
6729
  const deactivate=untrack10(()=>props.controller.activate?.(sessionID)??(()=>{}))
6855
- onCleanup24(deactivate)
6730
+ onCleanup25(deactivate)
6856
6731
  untrack10(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6732
+ untrack10(()=>void setup()?.refresh(sessionID).catch(()=>{}))
6857
6733
  })
6858
6734
  const navigationSection=()=>props.navigationSection??1
6859
6735
  return _$createComponent(Section,{get api(){return props.api
@@ -6861,17 +6737,21 @@ return _$createComponent(Section,{get api(){return props.api
6861
6737
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6862
6738
  },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6863
6739
  },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(()=>{})
6740
+ setup()?.refresh(props.sessionID).catch(()=>{})
6864
6741
  }}:undefined
6865
6742
  },get open(){return props.preferences.expanded().todo
6866
- },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show36,{get when(){return unavailable()
6743
+ },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show38,{get when(){return unavailable()
6867
6744
  },get fallback(){return(()=>{var _el$=_$createElement("box")
6868
6745
  _$setProp(_el$,"gap",1)
6869
- _$insert(_el$,_$createComponent(Show36,{get when(){return native()
6746
+ _$insert(_el$,_$createComponent(Show38,{get when(){return native()
6870
6747
  },get children(){return _$createComponent(NativeTodoNotice,{get api(){return props.api
6871
- },get empty(){return list().length===0
6748
+ },get setup(){return setup()
6749
+ },get sessionID(){return props.sessionID
6750
+ },get interaction(){return props.interaction
6751
+ },get navigationSection(){return navigationSection()
6872
6752
  }})
6873
6753
  }}),null)
6874
- _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.guidance(props.sessionID).available
6754
+ _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.guidance(props.sessionID).available
6875
6755
  },get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
6876
6756
  },get controller(){return managed()
6877
6757
  },get sessionID(){return props.sessionID
@@ -6879,7 +6759,7 @@ _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.guidance(pr
6879
6759
  },get navigationSection(){return navigationSection()
6880
6760
  }})
6881
6761
  }}),null)
6882
- _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.missing(props.sessionID)
6762
+ _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.missing(props.sessionID)
6883
6763
  },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6884
6764
  },get interaction(){return props.interaction
6885
6765
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6892,6 +6772,7 @@ _$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.missing(pro
6892
6772
  },setMode,get view(){return view()
6893
6773
  },visibility,get density(){return props.preferences.rowDensity?.()??"compact"
6894
6774
  },get managed(){return Boolean(managed())
6775
+ },get navigationOffset(){return setupState()?.enabled===false||setupState()?.status==="error"?1:0
6895
6776
  }})
6896
6777
  }})
6897
6778
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` Navigator Todo needs a separate OpenCode 2 server plugin. See the README setup steps and restart OpenCode.`)
@@ -6916,7 +6797,7 @@ return _el$4
6916
6797
  }
6917
6798
  function SidebarContent(props){const sections=props.preferences.sections
6918
6799
  const visibleSections=createMemo19(()=>props.preferences.sectionOrder().filter((section)=>sections()[section]&&supportsSidebarSection(props.api,section)))
6919
- onCleanup25(()=>props.interaction.setContentRoot(undefined))
6800
+ onCleanup26(()=>props.interaction.setContentRoot(undefined))
6920
6801
  return _$createComponent(ToolbarProvider,{get api(){return props.api
6921
6802
  },get preferences(){return props.preferences
6922
6803
  },get skills(){return props.skills
@@ -6932,7 +6813,7 @@ event.stopPropagation()
6932
6813
  props.interaction.leave()
6933
6814
  })
6934
6815
  _$insert(_el$,_$createComponent(SidebarToolbar,props),null)
6935
- _$insert(_el$,_$createComponent(For22,{get each(){return visibleSections()
6816
+ _$insert(_el$,_$createComponent(For20,{get each(){return visibleSections()
6936
6817
  },children:(section,index)=>_$createComponent(SectionBoundary,{get api(){return props.api
6937
6818
  },get divided(){return index()<visibleSections().length-1
6938
6819
  },get children(){return _$createComponent(Switch,{get children(){return [_$createComponent(Match,{when:section==="limits",get children(){return props.limitsSection(index() + 1)
@@ -6968,7 +6849,7 @@ return _el$
6968
6849
 
6969
6850
 
6970
6851
  function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
6971
- createEffect21(()=>{if(!props.api.state.ready)
6852
+ createEffect22(()=>{if(!props.api.state.ready)
6972
6853
  return
6973
6854
  persist()
6974
6855
  const route=props.api.route.current
@@ -6976,12 +6857,12 @@ const params="params" in route?route.params:undefined
6976
6857
  if(typeof params?.sessionID!=="string")
6977
6858
  return
6978
6859
  const current=props.controller.target()
6979
- onCleanup26(()=>props.controller.deactivate(current))
6860
+ onCleanup27(()=>props.controller.deactivate(current))
6980
6861
  untrack11(()=>void props.controller.activate(current).catch(()=>{}))
6981
6862
  })
6982
6863
  return _$createElement("box")
6983
6864
  }
6984
- function PreferencesPersistence(props){createEffect21(()=>{const location=currentLocation(props.api)
6865
+ function PreferencesPersistence(props){createEffect22(()=>{const location=currentLocation(props.api)
6985
6866
  untrack11(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
6986
6867
  })))
6987
6868
  props.controller.load()
@@ -6989,7 +6870,7 @@ props.controller.load()
6989
6870
  return _$createElement("box")
6990
6871
  }
6991
6872
  function FirstRunWizardPersistence(props){let isChecked=false
6992
- createEffect21(()=>{if(isChecked)
6873
+ createEffect22(()=>{if(isChecked)
6993
6874
  return
6994
6875
  isChecked=true
6995
6876
  showFirstRunWizard(props.api,props.preferences).catch(()=>{})
@@ -7016,7 +6897,7 @@ const settingsId=`${PLUGIN_ID}.settings`
7016
6897
  const settings=useSidebarItem(props.api,props.interaction,{id:settingsId,position:{section:0,row:0,column:0
7017
6898
  },activate:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
7018
6899
  },()=>theme().textMuted,"control")
7019
- onCleanup27(()=>props.interaction.setTitleRoot(undefined))
6900
+ onCleanup28(()=>props.interaction.setTitleRoot(undefined))
7020
6901
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box"),_el$3=_$createElement("box")
7021
6902
  _$insertNode(_el$,_el$2)
7022
6903
  _$use((node)=>props.interaction.setTitleRoot(node),_el$)
@@ -7027,7 +6908,7 @@ _$setProp(_el$2,"flexDirection","row")
7027
6908
  _$setProp(_el$2,"justifyContent","space-between")
7028
6909
  _$setProp(_el$2,"gap",1)
7029
6910
  _$setProp(_el$3,"flexGrow",1)
7030
- _$insert(_el$3,_$createComponent(Show37,{get when(){return props.preferences.showSessionTitle()
6911
+ _$insert(_el$3,_$createComponent(Show39,{get when(){return props.preferences.showSessionTitle()
7031
6912
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
7032
6913
  _$insertNode(_el$4,_el$5)
7033
6914
  _$setProp(_el$4,"wrapMode","word")
@@ -7035,7 +6916,7 @@ _$insert(_el$5,()=>props.title)
7035
6916
  _$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
7036
6917
  return _el$4
7037
6918
  }}),null)
7038
- _$insert(_el$3,_$createComponent(Show37,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
6919
+ _$insert(_el$3,_$createComponent(Show39,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7039
6920
  },children:(value)=>(()=>{var _el$6=_$createElement("text")
7040
6921
  _$insert(_el$6,value)
7041
6922
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
@@ -7084,11 +6965,11 @@ function createLimitsRefresh(options,schedule=scheduleInterval){let disposed=fal
7084
6965
  const selectedKey=createMemo22(()=>JSON.stringify(options.selectedModel?.()))
7085
6966
  const targetKey=createMemo22(()=>JSON.stringify(options.controller.current().model))
7086
6967
  const interval=createMemo22(()=>(parseLimitsRefreshMinutes(options.refreshMinutes?.())??DEFAULT_LIMITS_REFRESH_MINUTES)*60000)
7087
- createEffect22(on2(selectedKey,()=>{const model=options.selectedModel?.()
6968
+ createEffect23(on2(selectedKey,()=>{const model=options.selectedModel?.()
7088
6969
  if(model&&options.accountSource)
7089
6970
  options.accountSource.refresh(model).catch(()=>{})
7090
6971
  }))
7091
- createEffect22(on2(targetKey,()=>{const{model,adapter}=options.controller.current()
6972
+ createEffect23(on2(targetKey,()=>{const{model,adapter}=options.controller.current()
7092
6973
  if(model&&adapter)
7093
6974
  options.controller.refresh()
7094
6975
  }))
@@ -7101,14 +6982,21 @@ await options.accountSource.refresh(model)
7101
6982
  if(!disposed&&target===targetKey())
7102
6983
  await options.controller.refresh()
7103
6984
  }
7104
- createEffect22(on2(interval,(milliseconds)=>{onCleanup28(schedule(()=>void refresh().catch(()=>{}),milliseconds))
6985
+ createEffect23(on2(interval,(milliseconds)=>{onCleanup29(schedule(()=>void refresh().catch(()=>{}),milliseconds))
7105
6986
  }))
7106
- onCleanup28(()=>{disposed=true
6987
+ onCleanup29(()=>{disposed=true
7107
6988
  })
7108
6989
  }
7109
6990
  function LimitsPersistence(props){createLimitsRefresh(props)
7110
6991
  return _$createElement("box")
7111
6992
  }
6993
+ function bindNavigatorAbout(api,status,updates,notes){const dispose=registerNavigatorAboutServices(api,{navigatorVersion:"0.25.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()
6994
+ if(target)
6995
+ updates.navigator(target,dialogs)
6996
+ },changelog:async ()=>notes.parseChangelog(await notes.readBundledChangelog())
6997
+ })
6998
+ api.lifecycle.onDispose(dispose)
6999
+ }
7112
7000
  import {homedir} from "os"
7113
7001
 
7114
7002
  function location(input){return input.directory?{location:{directory:input.directory}}:{}}
@@ -7238,7 +7126,7 @@ context.keymap.dispatch(command.id)
7238
7126
  context.renderer.keyInput.on("keypress",onKeypress)
7239
7127
  const keymap={registerLayer(layer){const id=++sequence
7240
7128
  const owner=getOwner()
7241
- const [active,setActive]=createSignal37(true)
7129
+ const [active,setActive]=createSignal39(true)
7242
7130
  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
7131
  }))
7244
7132
  }
@@ -7283,7 +7171,7 @@ cleanups.clear()
7283
7171
  context.renderer.keyInput.off("keypress",onKeypress)
7284
7172
  }}}
7285
7173
 
7286
- function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal38({})
7174
+ function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal40({})
7287
7175
  const projections=new WeakMap
7288
7176
  function normalize(info){const directory=info.location.directory
7289
7177
  const workspaceID=context.location?.directory===directory?context.location.workspaceID:undefined
@@ -7346,25 +7234,16 @@ return context.data.session.message.list(route.sessionID).some((message)=>(!reve
7346
7234
  }
7347
7235
 
7348
7236
 
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")
7237
+
7238
+
7239
+ function createV2UI(context,api){let dialogOpen=false
7240
+ function DialogPrompt(props){return _$createComponent(SingleLinePrompt,_$mergeProps({get api(){return api()
7241
+ }},props))
7363
7242
  }
7364
7243
  function DialogConfirm(props){let active=true
7365
- onCleanup29(()=>{active=false
7244
+ onCleanup30(()=>{active=false
7366
7245
  })
7367
- onMount6(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7246
+ onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7368
7247
  })
7369
7248
  if(!active)
7370
7249
  return
@@ -7404,7 +7283,7 @@ const keymap=createV2Keymap(context)
7404
7283
  disposers.push(keymap.dispose)
7405
7284
  const sessions=createV2SessionAdapter(context)
7406
7285
  const remote=createV2ClientAdapter(context)
7407
- const ui=createV2UI(context)
7286
+ const ui=createV2UI(context,()=>api)
7408
7287
  const onDispose=(dispose)=>{disposers.push(dispose)
7409
7288
  return()=>{const index=disposers.indexOf(dispose)
7410
7289
  if(index!==-1)
@@ -7427,7 +7306,7 @@ context.ui.router.navigate({type:"plugin",name,data:params})
7427
7306
  },attention:context.attention,lifecycle:{signal:controller.signal,onDispose},slots:createV2Slots(context,(dispose)=>{onDispose(dispose)
7428
7307
  })
7429
7308
  }
7430
- setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false,commandsReachableOnly:true
7309
+ setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false,commandsReachableOnly:true,nativeTodo:true
7431
7310
  })
7432
7311
  bindToolbarActionState(context,api)
7433
7312
  return{api,async dispose(){controller.abort()
@@ -7568,11 +7447,15 @@ const subagents=createSubagentController(api,{source:nativeSources?.subagents
7568
7447
  })
7569
7448
  const skills=createSkillController(api,nativeSources?.skills)
7570
7449
  const preferences=createPreferencesController(api,config,createPreferencesStore(api.state.path.state),configured)
7450
+ if(hostContext){const setupPath=import.meta.url.includes("/dist/tui.js")?"./native-todo-setup.js":"../native-todo-setup"
7451
+ const setup=await import(setupPath)
7452
+ todo.setup=setup.createOpenCodeV2TodoSetup(hostContext,api,preferences,todo.target)
7453
+ }
7571
7454
  const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js":"../provider-limits"
7572
7455
  const limitsModule=await import(limitsPath)
7573
7456
  const LimitsSection=limitsModule.ProviderLimitsSection
7574
7457
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7575
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.23.0",hostContext)
7458
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.25.0",hostContext)
7576
7459
  const mcp=createMcpController(api,preferences.persistMcp,preferences,nativeSources?.mcp)
7577
7460
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont,sidebarShortcutActions(api)))
7578
7461
  const startup=createStartupSessionController(api,preferences)
@@ -7601,7 +7484,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7601
7484
  },interaction,skills,subagents,mcp
7602
7485
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7603
7486
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7604
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.23.0"
7487
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.25.0"
7605
7488
  }),_$createComponent(McpPersistence,{api,controller:mcp
7606
7489
  })]
7607
7490
  }})
@@ -7632,14 +7515,16 @@ throw result.error
7632
7515
  }
7633
7516
  return result.data?.type==="text"?result.data.content:undefined
7634
7517
  })
7518
+ const updateServices=await loadNavigatorUpdates()
7635
7519
  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"))
7520
+ }=updateServices
7521
+ const versionStatus=createVersionStatus(api,"0.25.0")
7522
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.25.0"))
7523
+ bindNavigatorAbout(api,versionStatus,versionUpdates,updateServices)
7639
7524
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7640
7525
  },get multilineCorners(){return preferences.cornerFont
7641
7526
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7642
- },navigatorVersion:"0.23.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7527
+ },navigatorVersion:"0.25.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7643
7528
  },get onNavigatorUpdate(){return versionUpdates.navigator
7644
7529
  }})
7645
7530
  }})
@@ -7653,17 +7538,19 @@ return
7653
7538
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7654
7539
  }))
7655
7540
  },todo,context)
7541
+ const updateServices=await loadNavigatorUpdates()
7656
7542
  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"))
7543
+ }=updateServices
7544
+ const versionStatus=createVersionStatus(adapter.api,"0.25.0")
7545
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.25.0"))
7546
+ bindNavigatorAbout(adapter.api,versionStatus,versionUpdates,updateServices)
7660
7547
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7661
7548
  },get multilineCorners(){return preferences.cornerFont
7662
7549
  },get children(){var _el$=_$createElement("box")
7663
7550
  _$setProp(_el$,"flexDirection","row")
7664
7551
  _$setProp(_el$,"justifyContent","space-between")
7665
7552
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7666
- },navigatorVersion:"0.23.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7553
+ },navigatorVersion:"0.25.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7667
7554
  },get onNavigatorUpdate(){return versionUpdates.navigator
7668
7555
  }}),null)
7669
7556
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7678,5 +7565,5 @@ await adapter.dispose()
7678
7565
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7679
7566
  }
7680
7567
  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
7568
+ 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
7569
  }