opencode-navigator 0.24.0 → 0.26.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,Show,createEffect as createEffect4,Show as Show2,splitProps as splitProps3,createEffect as createEffect5,createSignal as createSignal4,onCleanup as onCleanup4,onMount,Suspense,lazy,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup5,Show as Show3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect6,createSignal as createSignal9,onCleanup as onCleanup6,createSignal as createSignal10,createSignal as createSignal11,Suspense as Suspense2,lazy as lazy2,Index,onCleanup as onCleanup7,createSignal as createSignal12,onCleanup as onCleanup8,createEffect as createEffect8,onCleanup as onCleanup10,batch as batch2,createEffect as createEffect7,createMemo,createSignal as createSignal13,onCleanup as onCleanup9,onMount as onMount2,For as For2,For as For3,Show as Show4,createMemo as createMemo2,Show as Show5,createSignal as createSignal14,onCleanup as onCleanup11,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount4,For as For7,createMemo as createMemo3,onMount as onMount3,Show as Show7,createEffect as createEffect9,createSignal as createSignal15,onCleanup as onCleanup12,Show as Show6,For as For6,For as For9,createEffect as createEffect10,createMemo as createMemo5,onCleanup as onCleanup13,createEffect as createEffect11,createMemo as createMemo6,untrack as untrack2,Suspense as Suspense3,lazy as lazy3,onCleanup as onCleanup14,createEffect as createEffect12,onCleanup as onCleanup15,createSignal as createSignal16,createMemo as createMemo7,createSignal as createSignal17,createSignal as createSignal18,lazy as lazy4,Show as Show10,For as For10,Show as Show9,Show as Show8,createEffect as createEffect13,onCleanup as onCleanup16,onMount as onMount5,onCleanup as onCleanup17,onMount as onMount6,For as For11,createSignal as createSignal19,createSignal as createSignal20,onCleanup as onCleanup18,createSignal as createSignal21,Show as Show11,createSignal as createSignal23,createSignal as createSignal22,onCleanup as onCleanup19,For as For12,Show as Show14,createMemo as createMemo9,createComputed,createMemo as createMemo8,createSignal as createSignal24,untrack as untrack3,Show as Show12,createComputed as createComputed2,untrack as untrack4,Show as Show13,createSignal as createSignal26,createEffect as createEffect14,createSignal as createSignal25,on,createMemo as createMemo11,createSignal as createSignal29,createMemo as createMemo10,For as For13,Show as Show18,Show as Show15,Show as Show16,createSignal as createSignal27,createContext as createContext3,useContext as useContext3,Show as Show17,createSignal as createSignal28,onCleanup as onCleanup20,Show as Show24,createSignal as createSignal30,untrack as untrack5,createSignal as createSignal31,createSignal as createSignal32,createEffect as createEffect15,For as For15,Show as Show19,For as For14,createSignal as createSignal33,Show as Show20,Show as Show21,Show as Show22,Show as Show23,For as For16,Show as Show26,createMemo as createMemo13,Show as Show25,createMemo as createMemo12,createSignal as createSignal34,createContext as createContext4,useContext as useContext4,Show as Show27,Suspense as Suspense4,createEffect as createEffect16,onCleanup as onCleanup21,untrack as untrack6,For as For22,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup27,For as For17,Show as Show29,createMemo as createMemo15,createSignal as createSignal36,createEffect as createEffect17,createMemo as createMemo14,onCleanup as onCleanup22,untrack as untrack7,Show as Show28,createEffect as createEffect18,createSignal as createSignal35,onCleanup as onCleanup23,For as For18,Show as Show31,createSignal as createSignal37,createEffect as createEffect19,createMemo as createMemo16,onCleanup as onCleanup24,untrack as untrack8,Show as Show30,For as For20,Show as Show34,createEffect as createEffect20,createMemo as createMemo17,createSignal as createSignal38,onCleanup as onCleanup25,untrack as untrack9,For as For19,Show as Show33,Show as Show32,Show as Show38,createEffect as createEffect21,createMemo as createMemo18,createSignal as createSignal39,onCleanup as onCleanup26,untrack as untrack10,For as For21,Show as Show36,Show as Show35,Show as Show37,createEffect as createEffect22,createMemo as createMemo20,onCleanup as onCleanup28,untrack as untrack11,Show as Show39,createMemo as createMemo21,onCleanup as onCleanup29,createEffect as createEffect23,createMemo as createMemo22,on as on2,onCleanup as onCleanup30,createRoot,createSignal as createSignal40,getOwner,createSignal as createSignal41,onCleanup as onCleanup31,onMount as onMount7} from "solid-js"
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)))]
@@ -180,10 +179,14 @@ setStates((values)=>({...values,[target]:{status:"error",error:requestError(caus
180
179
  return{state,start,abort,abortAll}}
181
180
  function wait(delay,signal){return new Promise((resolve,reject)=>{if(signal?.aborted)
182
181
  return reject(signal.reason??new DOMException("Aborted","AbortError"))
183
- const timer=setTimeout(resolve,delay)
184
- signal?.addEventListener("abort",()=>{clearTimeout(timer)
185
- reject(signal.reason??new DOMException("Aborted","AbortError"))
186
- },{once:true})
182
+ const abort=()=>{clearTimeout(timer)
183
+ signal?.removeEventListener("abort",abort)
184
+ reject(signal?.reason??new DOMException("Aborted","AbortError"))
185
+ }
186
+ const timer=setTimeout(()=>{signal?.removeEventListener("abort",abort)
187
+ resolve()
188
+ },delay)
189
+ signal?.addEventListener("abort",abort,{once:true})
187
190
  })
188
191
  }
189
192
  async function retryBackgroundRefresh(refresh,options={}){const delays=options.delays??[250,1000]
@@ -738,7 +741,7 @@ renderer.requestRender()
738
741
 
739
742
 
740
743
 
741
- import {RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes6,TextAttributes as TextAttributes7,RGBA as RGBA3,parseColor as parseColor2,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,TextAttributes as TextAttributes18} from "@opentui/core"
744
+ 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
745
 
743
746
  var transparent=RGBA.fromInts(0,0,0,0)
744
747
  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))
@@ -1605,7 +1608,7 @@ behavior.quickActionVisibility=quickActionVisibility
1605
1608
  const mcpUpdate={...update.mcp?.states,...update.mcp?.name&&update.mcp.state&&{[update.mcp.name]:update.mcp.state}}
1606
1609
  const mcp=parseDesiredMcpStates({...!update.clearMcp&&existing.mcp,...mcpUpdate
1607
1610
  })
1608
- const scope={...Object.keys(behavior).length>0&&{behavior},...(update.layout||!update.clearLayout&&existing.layout)&&{layout:parseSectionLayout(update.layout??existing.layout)
1611
+ const scope={...Object.keys(behavior).length>0&&{behavior},...(update.layout??(!update.clearLayout&&existing.layout))&&{layout:parseSectionLayout(update.layout??existing.layout)
1609
1612
  },...Object.keys(mcp).length>0&&{mcp}}
1610
1613
  const worktrees={...current.worktrees}
1611
1614
  if(target.kind==="worktree"){if(isEmptyScope(scope))
@@ -1787,10 +1790,13 @@ await unlink(recovery).catch((error)=>{if(!errno(error,"ENOENT"))
1787
1790
  throw error
1788
1791
  })
1789
1792
  }}
1790
- async function tryAcquireLock(){const token=randomUUID()
1793
+ async function tryAcquireLock(deadline){const token=randomUUID()
1791
1794
  const candidate=`${lock}.${token}.candidate`
1795
+ let acquired=false
1796
+ let handedOff=false
1792
1797
  await writeFile(candidate,JSON.stringify({token,pid:process.pid}),{flag:"wx",mode:384})
1793
1798
  try{try{await link(candidate,lock)
1799
+ acquired=true
1794
1800
  } catch(error){if(!errno(error,"EEXIST"))
1795
1801
  throw error
1796
1802
  const owner=await readLockOwner()
@@ -1802,22 +1808,29 @@ return
1802
1808
  while(true){const markers=await liveRecoveryMarkers()
1803
1809
  if(markers.length===0)
1804
1810
  break
1811
+ if(Date.now()>=deadline)
1812
+ return
1805
1813
  await delay(10)
1806
1814
  }
1807
1815
  const currentOwner=await readLockOwner()
1808
1816
  if(currentOwner?.token!==token)
1809
1817
  return
1818
+ handedOff=true
1810
1819
  return async ()=>{const current=await readLockOwner()
1811
1820
  if(current?.token!==token)
1812
1821
  throw new Error("Refusing to release a preferences lock owned by another process")
1813
1822
  await moveLockToTombstone("released")
1814
- }} finally{await unlink(candidate).catch((error)=>{if(!errno(error,"ENOENT"))
1823
+ }} finally{if(acquired&&!handedOff){const current=await readLockOwner()
1824
+ if(current?.token===token)
1825
+ await moveLockToTombstone("released")
1826
+ }
1827
+ await unlink(candidate).catch((error)=>{if(!errno(error,"ENOENT"))
1815
1828
  throw error
1816
1829
  })
1817
1830
  }}
1818
1831
  async function acquireLock(){await mkdir(directory,{recursive:true,mode:448})
1819
1832
  const deadline=Date.now() + LOCK_TIMEOUT_MS
1820
- while(true){const release=await tryAcquireLock()
1833
+ while(true){const release=await tryAcquireLock(deadline)
1821
1834
  if(release)
1822
1835
  return release
1823
1836
  if(Date.now()>=deadline)
@@ -2776,7 +2789,7 @@ return value
2776
2789
  }
2777
2790
  function changed(){setRevision((value)=>value + 1)
2778
2791
  }
2779
- return{observeStatus(key,sessionID,status,at=now()){const value=state(key)
2792
+ return{observeStatus(key,sessionID,status,at=now(),nativeStart){const value=state(key)
2780
2793
  const run=value.active.get(sessionID)
2781
2794
  const isKnown=value.known.has(sessionID)
2782
2795
  value.known.add(sessionID)
@@ -2784,10 +2797,17 @@ if(status.type==="idle"){if(!run)
2784
2797
  return
2785
2798
  value.active.delete(sessionID)
2786
2799
  value.recent=[{...run,finishedAt:Math.max(at,run.startedAt),outcome:run.outcome??"finished"},...value.recent].sort((a,b)=>b.finishedAt-a.finishedAt||a.sessionID.localeCompare(b.sessionID)).slice(0,10)
2787
- } else{if(run)
2800
+ } else{const exact=typeof nativeStart==="number"&&Number.isFinite(nativeStart)&&nativeStart>0&&nativeStart<=at?nativeStart:undefined
2801
+ if(run){if(exact===undefined||run.nativeStartedAt!==undefined&&exact<=run.nativeStartedAt)
2788
2802
  return
2803
+ const next=exact>run.startedAt?{sessionID}:run
2804
+ value.active.set(sessionID,{...next,startedAt:exact,nativeStartedAt:exact,startedBeforeObservation:false
2805
+ })
2806
+ changed()
2807
+ return
2808
+ }
2789
2809
  value.recent=value.recent.filter((item)=>item.sessionID!==sessionID)
2790
- value.active.set(sessionID,{sessionID,startedAt:at,startedBeforeObservation:!isKnown})
2810
+ value.active.set(sessionID,{sessionID,startedAt:exact??at,startedBeforeObservation:exact===undefined&&!isKnown,...exact!==undefined&&{nativeStartedAt:exact}})
2791
2811
  }
2792
2812
  changed()
2793
2813
  },observeError(key,sessionID,error,at=now()){if(!sessionID)
@@ -2858,12 +2878,13 @@ journal.sessions.push(mutation)
2858
2878
  if(!source)
2859
2879
  setChildren((current)=>Object.fromEntries(Object.entries(current).map(([key,items])=>[key,applySession(items,targets.get(key).parentID,mutation)])))
2860
2880
  }
2861
- function recordStatus(input){const mutation={...input,at:now(),observed:new Set}
2881
+ function recordStatus(input){const mutation={...input,at:now(),startedAt:source?.startedAt?.(input.sessionID),observed:new Set
2882
+ }
2862
2883
  for(const journal of journals)
2863
2884
  journal.statuses.push(mutation)
2864
2885
  batch(()=>{for(const [key,items] of Object.entries(snapshots())){if(items.every((item)=>item.id!==mutation.sessionID))
2865
2886
  continue
2866
- history.observeStatus(key,mutation.sessionID,mutation.status,mutation.at)
2887
+ history.observeStatus(key,mutation.sessionID,mutation.status,mutation.at,mutation.startedAt)
2867
2888
  mutation.observed.add(key)
2868
2889
  }
2869
2890
  if(!source)
@@ -2898,7 +2919,7 @@ for(const mutation of journal.sessions)
2898
2919
  nextChildren=applySession(nextChildren,current.parentID,mutation)
2899
2920
  let nextStatuses={...statusResult.data}
2900
2921
  const missing={}
2901
- const remoteStatuses=source?[]:await Promise.all(nextChildren.map((session)=>{const key=JSON.stringify([current.key,session.id])
2922
+ const remoteStatuses=source?[]:await Promise.all(nextChildren.map(async (session)=>{const key=JSON.stringify([current.key,session.id])
2902
2923
  return(remoteRetryAt.get(key)??0)<=now()?fetchDevTeamStatus(session,requestState.signal):{sessionID:session.id,failed:true,cooldown:true,status:undefined}}))
2903
2924
  if(!requestState.isCurrent())
2904
2925
  return
@@ -2927,10 +2948,10 @@ for(const mutation of journal.statuses)
2927
2948
  nextStatuses=applyStatus(nextStatuses,mutation)
2928
2949
  if(requestState.isCurrent()){batch(()=>{for(const session of nextChildren){const mutations=journal.statuses.filter((mutation)=>mutation.sessionID===session.id)
2929
2950
  if(mutations.length>0){for(const mutation of mutations){if(!mutation.observed.has(current.key))
2930
- history.observeStatus(current.key,session.id,mutation.status,mutation.at)
2951
+ history.observeStatus(current.key,session.id,mutation.status,mutation.at,mutation.startedAt)
2931
2952
  }} else if(!missing[session.id]){const status=nextStatuses[session.id]??{type:"idle"}
2932
2953
  nextStatuses[session.id]=status
2933
- history.observeStatus(current.key,session.id,status)
2954
+ history.observeStatus(current.key,session.id,status,now(),source?.startedAt?.(session.id))
2934
2955
  }
2935
2956
  for(const mutation of journal.errors){if(mutation.sessionID===session.id&&!mutation.observed.has(current.key))
2936
2957
  history.observeError(current.key,session.id,mutation.error,mutation.at)
@@ -3703,274 +3724,16 @@ return value&&valid()&&!blocked()?controller.applyPreset(name,value,target):unde
3703
3724
 
3704
3725
 
3705
3726
 
3706
-
3707
-
3708
-
3709
-
3710
-
3711
- 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."}]
3712
- },{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."
3713
- },{icon:"info",title:"Provider limits",description:"Link a matching Codex account for model quotas and confirmed banked resets."
3714
- }]
3715
- },{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."
3716
- },{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."
3717
- }]
3718
- },{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."
3719
- },{icon:"lsp",title:"Compact LSP status",description:"Spot connected and failed language servers at a glance."
3720
- },{icon:"settings",title:"Configurable commands",description:"Choose action visibility, order, and shortcuts."
3721
- }]
3722
- },{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."
3723
- },{icon:"presets",title:"Safe presets",description:"Preview connections and disconnections before Apply."}]
3724
- },{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."
3725
- },{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."
3726
- }]
3727
- }];
3728
-
3729
-
3730
-
3731
-
3732
-
3733
-
3734
-
3735
-
3736
-
3737
-
3738
- function OnboardingStep(props){const icons=useIcons()
3739
- const theme=()=>props.api.theme.current
3740
- 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")
3741
- _$insertNode(_el$,_el$2)
3742
- _$insertNode(_el$,_el$4)
3743
- _$insertNode(_el$,_el$5)
3744
- _$insertNode(_el$,_el$6)
3745
- _$insertNode(_el$,_el$1)
3746
- _$setProp(_el$,"gap",1)
3747
- _$insertNode(_el$2,_el$3)
3748
- _$insert(_el$2,()=>icons.icon(props.step.icon),_el$3)
3749
- _$insert(_el$2,()=>props.step.title,null)
3750
- _$setProp(_el$4,"wrapMode","word")
3751
- _$insert(_el$4,()=>props.step.summary)
3752
- _$setProp(_el$5,"border",["top","bottom"])
3753
- _$setProp(_el$5,"paddingTop",1)
3754
- _$setProp(_el$5,"paddingBottom",1)
3755
- _$setProp(_el$5,"gap",1)
3756
- _$insert(_el$5,_$createComponent(For4,{get each(){return props.step.features
3757
- },children:(feature)=>(()=>{var _el$14=_$createElement("box"),_el$15=_$createElement("text"),_el$16=_$createElement("text"),_el$17=_$createElement("b"),_el$18=_$createTextNode(` \xB7 `)
3758
- _$insertNode(_el$14,_el$15)
3759
- _$insertNode(_el$14,_el$16)
3760
- _$setProp(_el$14,"flexDirection","row")
3761
- _$setProp(_el$14,"gap",1)
3762
- _$setProp(_el$15,"flexShrink",0)
3763
- _$insert(_el$15,()=>icons.icon(feature.icon))
3764
- _$insertNode(_el$16,_el$17)
3765
- _$insertNode(_el$16,_el$18)
3766
- _$setProp(_el$16,"flexGrow",1)
3767
- _$setProp(_el$16,"minWidth",0)
3768
- _$setProp(_el$16,"wrapMode","word")
3769
- _$insert(_el$17,()=>feature.title)
3770
- _$insert(_el$16,()=>feature.description,null)
3771
- _$effect((_p$)=>{var _v$6=theme().accent,_v$7=theme().textMuted
3772
- _v$6!==_p$.e&&(_p$.e=_$setProp(_el$15,"fg",_v$6,_p$.e))
3773
- _v$7!==_p$.t&&(_p$.t=_$setProp(_el$16,"fg",_v$7,_p$.t))
3774
- return _p$
3775
- },{e:undefined,t:undefined
3776
- })
3777
- return _el$14
3778
- })()
3779
- }))
3780
- _$insertNode(_el$6,_el$7)
3781
- _$insertNode(_el$6,_el$8)
3782
- _$insertNode(_el$6,_el$9)
3783
- _$setProp(_el$6,"wrapMode","word")
3784
- _$insert(_el$6,()=>props.preferences.toggleKey(),_el$8)
3785
- _$insert(_el$6,()=>props.preferences.focusKey(),_el$9)
3786
- _$insert(_el$6,()=>icons.style()==="text"?"Text fallback":"Nerd Font",null)
3787
- _$setProp(_el$1,"flexDirection","row")
3788
- _$setProp(_el$1,"justifyContent","space-between")
3789
- _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3790
- props.onBack()
3791
- },get children(){var _el$10=_$createElement("text"),_el$11=_$createTextNode(` Back`)
3792
- _$insertNode(_el$10,_el$11)
3793
- _$insert(_el$10,()=>icons.icon("left"),_el$11)
3794
- _$effect((_$p)=>_$setProp(_el$10,"fg",theme().textMuted,_$p))
3795
- return _el$10
3796
- }}),null)
3797
- _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,get backgroundColor(){return theme().primary
3798
- },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3799
- props.onAdvance()
3800
- },get children(){var _el$12=_$createElement("text"),_el$13=_$createTextNode(` `)
3801
- _$insertNode(_el$12,_el$13)
3802
- _$insert(_el$12,()=>props.final?"Configure sidebar":"Next",_el$13)
3803
- _$insert(_el$12,()=>icons.icon("right"),null)
3804
- _$effect((_$p)=>_$setProp(_el$12,"fg",theme().selectedListItemText,_$p))
3805
- return _el$12
3806
- }}),null)
3807
- _$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes10.BOLD,_v$3=theme().textMuted,_v$4=theme().borderSubtle,_v$5=theme().textMuted
3808
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
3809
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
3810
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3811
- _v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"borderColor",_v$4,_p$.o))
3812
- _v$5!==_p$.i&&(_p$.i=_$setProp(_el$6,"fg",_v$5,_p$.i))
3813
- return _p$
3814
- },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined
3815
- })
3816
- return _el$
3817
- })()
3818
- }
3819
-
3820
-
3821
-
3822
-
3823
-
3824
-
3825
-
3826
-
3827
-
3828
-
3829
- function SectionConfig(props){const icons=useIcons()
3830
- const theme=()=>props.api.theme.current
3831
- const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
3832
- const finishIndex=sections.length
3833
- return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Choose your sidebar sections`),_el$4=_$createElement("text"),_el$6=_$createElement("box")
3834
- _$insertNode(_el$,_el$2)
3835
- _$insertNode(_el$,_el$4)
3836
- _$insertNode(_el$,_el$6)
3837
- _$setProp(_el$,"gap",1)
3838
- _$insertNode(_el$2,_el$3)
3839
- _$insert(_el$2,()=>icons.icon("sections"),_el$3)
3840
- _$insertNode(_el$4,_$createTextNode(`Select what appears now. You can change visibility, order, limits, scope, and presets later with the gear button.`))
3841
- _$setProp(_el$4,"wrapMode","word")
3842
- _$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
3843
- },onMouseOver:()=>props.onActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3844
- props.preferences.toggleSection(section.name)
3845
- },get children(){return [(()=>{var _el$1=_$createElement("text")
3846
- _$setProp(_el$1,"flexShrink",0)
3847
- _$insert(_el$1,()=>icons.icon(props.preferences.sections()[section.name]?"checked":"unchecked"))
3848
- _$effect((_$p)=>_$setProp(_el$1,"fg",props.preferences.sections()[section.name]?theme().accent:theme().textMuted,_$p))
3849
- return _el$1
3850
- })(),(()=>{var _el$10=_$createElement("text"),_el$11=_$createTextNode(` `)
3851
- _$insertNode(_el$10,_el$11)
3852
- _$insert(_el$10,()=>icons.section(section.name),_el$11)
3853
- _$insert(_el$10,()=>section.label,null)
3854
- _$effect((_$p)=>_$setProp(_el$10,"fg",props.active===index()?theme().text:theme().textMuted,_$p))
3855
- return _el$10
3856
- })()]
3727
+ var Content=lazy3(async ()=>{const path=import.meta.url.includes("/dist/")?"./onboarding.js":"./first-run-wizard-content"
3728
+ const module=await import(path)
3729
+ return{default:module.FirstRunWizard
3857
3730
  }})
3858
- }),_el$6)
3859
- _$setProp(_el$6,"flexDirection","row")
3860
- _$setProp(_el$6,"justifyContent","space-between")
3861
- _$insert(_el$6,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3862
- props.onBack()
3863
- },get children(){var _el$7=_$createElement("text"),_el$8=_$createTextNode(` Back`)
3864
- _$insertNode(_el$7,_el$8)
3865
- _$insert(_el$7,()=>icons.icon("left"),_el$8)
3866
- _$effect((_$p)=>_$setProp(_el$7,"fg",theme().textMuted,_$p))
3867
- return _el$7
3868
- }}),null)
3869
- _$insert(_el$6,_$createComponent(SelectionBox,{paddingLeft:2,paddingRight:2,get backgroundColor(){return _$memo(()=>props.active===finishIndex)()?theme().primary:undefined
3870
- },onMouseOver:()=>props.onActive(finishIndex),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
3871
- props.onFinish()
3872
- },get children(){var _el$9=_$createElement("text"),_el$0=_$createTextNode(` Finish`)
3873
- _$insertNode(_el$9,_el$0)
3874
- _$insert(_el$9,()=>icons.icon("done"),_el$0)
3875
- _$effect((_$p)=>_$setProp(_el$9,"fg",props.active===finishIndex?theme().selectedListItemText:theme().textMuted,_$p))
3876
- return _el$9
3877
- }}),null)
3878
- _$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes11.BOLD,_v$3=theme().textMuted
3879
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
3880
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
3881
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3882
- return _p$
3883
- },{e:undefined,t:undefined,a:undefined
3884
- })
3731
+ function FirstRunWizard(props){return(()=>{var _el$=_$createElement("box")
3732
+ _$insert(_el$,_$createComponent(Suspense3,{get children(){return _$createComponent(Content,props)
3733
+ }}))
3885
3734
  return _el$
3886
3735
  })()
3887
3736
  }
3888
- function FirstRunWizard(props){const icons=useIcons()
3889
- const dialogs=useDialogs(props.api)
3890
- const [active,setActive]=createSignal14(0)
3891
- const [step,setStep]=createSignal14(0)
3892
- const theme=()=>props.api.theme.current
3893
- const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
3894
- const finishIndex=sections.length
3895
- const stepCount=ONBOARDING_STEPS.length + 1
3896
- const configuring=()=>step()===ONBOARDING_STEPS.length
3897
- function finish(){dialogs.back()
3898
- }
3899
- function move(offset){if(configuring())
3900
- setActive((value)=>(value + offset + finishIndex + 1)%(finishIndex + 1))
3901
- else
3902
- setStep((value)=>Math.max(0,Math.min(ONBOARDING_STEPS.length,value + offset)))
3903
- }
3904
- function back(){setStep((value)=>Math.max(0,value-1))
3905
- }
3906
- function advance(){if(!configuring())
3907
- setStep((value)=>Math.min(ONBOARDING_STEPS.length,value + 1))
3908
- }
3909
- function select(){if(!configuring()){advance()
3910
- return
3911
- }
3912
- const index=active()
3913
- if(index===finishIndex)
3914
- finish()
3915
- else
3916
- props.preferences.toggleSection(sections[index].name)
3917
- }
3918
- const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.wizard.previous`,run(){move(-1)
3919
- }},{name:`${PLUGIN_ID}.wizard.next`,run(){move(1)
3920
- }},{name:`${PLUGIN_ID}.wizard.select`,run:select
3921
- },{name:`${PLUGIN_ID}.wizard.back`,run:back
3922
- },{name:`${PLUGIN_ID}.wizard.forward`,run:advance
3923
- }],bindings:[{key:"up",cmd:`${PLUGIN_ID}.wizard.previous`
3924
- },{key:"down",cmd:`${PLUGIN_ID}.wizard.next`
3925
- },{key:"tab",cmd:`${PLUGIN_ID}.wizard.next`
3926
- },{key:"left",cmd:`${PLUGIN_ID}.wizard.back`
3927
- },{key:"right",cmd:`${PLUGIN_ID}.wizard.forward`
3928
- },{key:"space",cmd:`${PLUGIN_ID}.wizard.select`
3929
- },{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
3930
- }]
3931
- })
3932
- onCleanup11(unregister)
3933
- return _$createComponent(DialogSurface,{get api(){return props.api
3934
- },get children(){return [(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Navigator setup`),_el$4=_$createElement("text"),_el$5=_$createTextNode(`Step `),_el$6=_$createTextNode(`/`),_el$7=_$createTextNode(` \xB7 `)
3935
- _$insertNode(_el$,_el$2)
3936
- _$insertNode(_el$,_el$4)
3937
- _$setProp(_el$,"flexDirection","row")
3938
- _$setProp(_el$,"justifyContent","space-between")
3939
- _$insertNode(_el$2,_el$3)
3940
- _$insert(_el$2,()=>icons.icon("help"),_el$3)
3941
- _$insertNode(_el$4,_el$5)
3942
- _$insertNode(_el$4,_el$6)
3943
- _$insertNode(_el$4,_el$7)
3944
- _$setProp(_el$4,"onMouseDown",(event)=>event.stopPropagation())
3945
- _$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
3946
- finish()
3947
- })
3948
- _$insert(_el$4,()=>step() + 1,_el$6)
3949
- _$insert(_el$4,stepCount,_el$7)
3950
- _$insert(_el$4,()=>icons.key("esc"),null)
3951
- _$effect((_p$)=>{var _v$=TextAttributes12.BOLD,_v$2=theme().text,_v$3=theme().textMuted
3952
- _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"attributes",_v$,_p$.e))
3953
- _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"fg",_v$2,_p$.t))
3954
- _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
3955
- return _p$
3956
- },{e:undefined,t:undefined,a:undefined
3957
- })
3958
- return _el$
3959
- })(),_$createComponent(Show5,{get when(){return configuring()
3960
- },get fallback(){return _$createComponent(OnboardingStep,{get api(){return props.api
3961
- },get preferences(){return props.preferences
3962
- },get step(){return ONBOARDING_STEPS[step()]
3963
- },get final(){return step()===ONBOARDING_STEPS.length-1
3964
- },onBack:back,onAdvance:advance
3965
- })
3966
- },get children(){return _$createComponent(SectionConfig,{get api(){return props.api
3967
- },get preferences(){return props.preferences
3968
- },get active(){return active()
3969
- },onActive:setActive,onBack:back,onFinish:finish
3970
- })
3971
- }})]
3972
- }})
3973
- }
3974
3737
  function openFirstRunWizard(api,preferences){createDialogStack(api,preferences.lspIconStyle,()=>true,preferences.cornerFont).open(()=>_$createComponent(FirstRunWizard,{api,preferences
3975
3738
  }))
3976
3739
  }
@@ -4013,7 +3776,7 @@ _$insertNode(_el$,_el$6)
4013
3776
  _$setProp(_el$,"flexDirection","row")
4014
3777
  _$setProp(_el$,"justifyContent","space-between")
4015
3778
  _$setProp(_el$2,"flexGrow",1)
4016
- _$insert(_el$2,_$createComponent(Show6,{get when(){return props.onRefresh
3779
+ _$insert(_el$2,_$createComponent(Show5,{get when(){return props.onRefresh
4017
3780
  },get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Refresh (`),_el$5=_$createTextNode(`)`)
4018
3781
  _$insertNode(_el$3,_el$4)
4019
3782
  _$insertNode(_el$3,_el$5)
@@ -4056,7 +3819,7 @@ return(()=>{var _el$=_$createElement("box")
4056
3819
  _$setProp(_el$,"flexDirection","row")
4057
3820
  _$setProp(_el$,"flexWrap","wrap")
4058
3821
  _$setProp(_el$,"gap",1)
4059
- _$insert(_el$,_$createComponent(For6,{get each(){return props.stats
3822
+ _$insert(_el$,_$createComponent(For4,{get each(){return props.stats
4060
3823
  },children:(stat)=>_$createComponent(SelectionBox,{height:1,get backgroundColor(){return theme().backgroundElement
4061
3824
  },paddingLeft:1,paddingRight:1,get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` `)
4062
3825
  _$insertNode(_el$2,_el$3)
@@ -4076,7 +3839,7 @@ const dialogs=useDialogs(props.api)
4076
3839
  const theme=()=>props.api.theme.current
4077
3840
  const dimensions=useTerminalDimensions6()
4078
3841
  const scroll=useDialogScroll()
4079
- const [active,setActive]=createSignal15("apply")
3842
+ const [active,setActive]=createSignal14("apply")
4080
3843
  let body
4081
3844
  const prefix=`${PLUGIN_ID}.preset-preview`
4082
3845
  function activate(action){if(!props.valid()){dialogs.close()
@@ -4105,7 +3868,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
4105
3868
  },{key:"ctrl+r",cmd:`${prefix}.refresh`
4106
3869
  }]
4107
3870
  })
4108
- onCleanup12(unregister)
3871
+ onCleanup11(unregister)
4109
3872
  createEffect9(()=>{if(!props.valid())
4110
3873
  dialogs.close()
4111
3874
  })
@@ -4147,7 +3910,7 @@ _$setProp(_el$6,"gap",1)
4147
3910
  _$insert(_el$6,()=>props.children)
4148
3911
  _$effect((_$p)=>_$setProp(_el$5,"height",Math.min(Math.max(2,Math.floor(dimensions().height*0.75)-14),Math.max(1,props.rowCount*3-1)),_$p))
4149
3912
  return _el$5
4150
- })(),_$createComponent(Show7,{get when(){return props.blocked||props.notice
3913
+ })(),_$createComponent(Show6,{get when(){return props.blocked||props.notice
4151
3914
  },get children(){var _el$7=_$createElement("box"),_el$8=_$createElement("text"),_el$9=_$createElement("text")
4152
3915
  _$insertNode(_el$7,_el$8)
4153
3916
  _$insertNode(_el$7,_el$9)
@@ -4213,7 +3976,7 @@ _$insertNode(_el$4,_el$5)
4213
3976
  _$setProp(_el$4,"flexShrink",0)
4214
3977
  _$insert(_el$4,()=>icons.icon(props.statusIcon),_el$5)
4215
3978
  _$insert(_el$4,()=>props.statusLabel,null)
4216
- _$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
3979
+ _$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
4217
3980
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
4218
3981
  _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
4219
3982
  _v$3!==_p$.a&&(_p$.a=_$setProp(_el$3,"attributes",_v$3,_p$.a))
@@ -4259,7 +4022,7 @@ if(!request)
4259
4022
  return
4260
4023
  dialogs.close()
4261
4024
  reportMcpApplyError(props.api,request)
4262
- },get children(){return _$createComponent(For7,{get each(){return rows()
4025
+ },get children(){return _$createComponent(For5,{get each(){return rows()
4263
4026
  },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4264
4027
  }},row))
4265
4028
  })
@@ -4359,12 +4122,12 @@ dialogs.open(()=>_$createComponent(SelectionMenu,{api,title:"MCP presets",get op
4359
4122
 
4360
4123
 
4361
4124
 
4362
- var Content=lazy3(async ()=>{const path=import.meta.url.includes("/dist/")?"./sidebar-settings.js":"./settings-dialog-content"
4125
+ var Content2=lazy4(async ()=>{const path=import.meta.url.includes("/dist/")?"./sidebar-settings.js":"./settings-dialog-content"
4363
4126
  const module=await import(path)
4364
4127
  return{default:module.SettingsDialog
4365
4128
  }})
4366
4129
  function SettingsDialog(props){return(()=>{var _el$=_$createElement("box")
4367
- _$insert(_el$,_$createComponent(Suspense3,{get children(){return _$createComponent(Content,props)
4130
+ _$insert(_el$,_$createComponent(Suspense4,{get children(){return _$createComponent(Content2,props)
4368
4131
  }}))
4369
4132
  return _el$
4370
4133
  })()
@@ -4399,7 +4162,7 @@ function SettingsBinding(props){const unregister=props.api.keymap.registerLayer(
4399
4162
  },cmd:`${PLUGIN_ID}.settings`
4400
4163
  }]
4401
4164
  })
4402
- onCleanup14(unregister)
4165
+ onCleanup13(unregister)
4403
4166
  return _$createElement("box")
4404
4167
  }
4405
4168
 
@@ -4427,14 +4190,14 @@ observed=current
4427
4190
  props.preferences.setAutoApprovePermissions(current)
4428
4191
  })
4429
4192
  if(unsubscribe)
4430
- onCleanup15(unsubscribe)
4193
+ onCleanup14(unsubscribe)
4431
4194
  return _$createElement("box")
4432
4195
  }
4433
4196
 
4434
4197
 
4435
4198
 
4436
4199
  function SettingsFooterButton(props){const icons=useIcons()
4437
- const [hovered,setHovered]=createSignal16(false)
4200
+ const [hovered,setHovered]=createSignal15(false)
4438
4201
  const theme=()=>props.api.theme.current
4439
4202
  return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon(){return icons.icon("settings")
4440
4203
  },get foregroundColor(){return _$memo(()=>!!hovered())()?theme().text:theme().textMuted
@@ -4446,7 +4209,7 @@ return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon
4446
4209
 
4447
4210
 
4448
4211
  var services=new WeakMap
4449
- function createSlot(){const [read,write]=createSignal17()
4212
+ function createSlot(){const [read,write]=createSignal16()
4450
4213
  return{read,write}}
4451
4214
  function slot(api){let entry=services.get(api)
4452
4215
  if(!entry){entry=createSlot()
@@ -4476,7 +4239,7 @@ var CANCEL_COMMAND=`${PLUGIN_ID}.sidebar-shortcuts.cancel`
4476
4239
  var MODE=`${PLUGIN_ID}.sidebar-shortcuts`
4477
4240
  var DEFAULT_TIMEOUT_MS=5000
4478
4241
  function createSidebarShortcutMode(api,options={}){const actions=sidebarShortcutActions(api)
4479
- const [active,setActive]=createSignal18(false)
4242
+ const [active,setActive]=createSignal17(false)
4480
4243
  const timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS
4481
4244
  let shortcutKey=""
4482
4245
  let unregisterBinding
@@ -4526,7 +4289,7 @@ unregisterBinding=undefined
4526
4289
  unregisterCommands()
4527
4290
  }}}
4528
4291
 
4529
- var SidebarShortcutHint=lazy4(()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
4292
+ var SidebarShortcutHint=lazy5(()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
4530
4293
  return import(path)
4531
4294
  });
4532
4295
 
@@ -4616,17 +4379,17 @@ function StartupSessionBinding(props){if(props.api.keymap.on){const unregister=p
4616
4379
  return
4617
4380
  queueMicrotask(()=>void props.controller.start())
4618
4381
  })
4619
- onCleanup16(unregister)
4382
+ onCleanup15(unregister)
4620
4383
  } else
4621
4384
  createEffect13(()=>{if(!props.controller.enabled())
4622
4385
  return
4623
4386
  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()
4624
4387
  }]
4625
4388
  })
4626
- onCleanup16(unregister)
4389
+ onCleanup15(unregister)
4627
4390
  })
4628
4391
  onMount5(()=>void props.controller.initialize())
4629
- onCleanup16(props.controller.dispose)
4392
+ onCleanup15(props.controller.dispose)
4630
4393
  return _$createElement("box")
4631
4394
  }
4632
4395
 
@@ -4634,7 +4397,7 @@ return _$createElement("box")
4634
4397
 
4635
4398
  function UpgradeNotesBinding(props){let pending
4636
4399
  let disposed=false
4637
- onMount6(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4400
+ async function load(){const previous=await props.preferences.claimNavigatorUpgrade(props.version)
4638
4401
  if(!previous||disposed)
4639
4402
  return
4640
4403
  try{let show=function(){if(disposed||props.api.lifecycle.signal?.aborted)
@@ -4654,8 +4417,9 @@ const entries=changesSince(await (props.read??readBundledChangelog)(),previous,p
4654
4417
  if(entries.length===0||disposed)
4655
4418
  return
4656
4419
  show()
4657
- } catch{}})
4658
- onCleanup17(()=>{disposed=true
4420
+ } catch{}}
4421
+ onMount6(()=>void load().catch(()=>{}))
4422
+ onCleanup16(()=>{disposed=true
4659
4423
  clearTimeout(pending)
4660
4424
  })
4661
4425
  return _$createElement("box")
@@ -4786,9 +4550,9 @@ return false
4786
4550
  return true
4787
4551
  }
4788
4552
  function createSidebarInteraction(api,showHelp=()=>openKeyboardHelp(api)){const descriptors=new Map
4789
- const [selectedId,setSelectedId]=createSignal21()
4790
- const [focusWithin,setFocusWithin]=createSignal21(false)
4791
- const [revision,setRevision]=createSignal21(0)
4553
+ const [selectedId,setSelectedId]=createSignal20()
4554
+ const [focusWithin,setFocusWithin]=createSignal20(false)
4555
+ const [revision,setRevision]=createSignal20(0)
4792
4556
  let titleRoot
4793
4557
  let contentRoot
4794
4558
  let targetedRoot
@@ -5057,14 +4821,14 @@ else if(highlighted)
5057
4821
  foregroundColor=theme.selectedListItemText
5058
4822
  return{backgroundColor,foregroundColor}}
5059
4823
  function useSidebarItem(api,interaction,descriptor,normalColor=()=>api.theme.current.text,mode="row"){let unregister
5060
- const [hovered,setHovered]=createSignal22(false)
4824
+ const [hovered,setHovered]=createSignal21(false)
5061
4825
  const disabled=()=>descriptor.disabled?.()===true
5062
4826
  const focused=()=>Boolean(interaction?.ownsFocus()&&interaction.isSelected(descriptor.id))
5063
4827
  const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),hovered:hovered(),disabled:disabled()},normalColor(),mode)
5064
4828
  const ref=(renderable)=>{unregister?.()
5065
4829
  unregister=interaction?.register({...descriptor,renderable})
5066
4830
  }
5067
- onCleanup19(()=>unregister?.())
4831
+ onCleanup18(()=>unregister?.())
5068
4832
  return{ref,disabled,focused,backgroundColor:()=>colors().backgroundColor,foregroundColor:()=>colors().foregroundColor,onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),select(event){interaction?.mouseSelect(descriptor.id,event)
5069
4833
  },activate(event){if(interaction)
5070
4834
  return interaction.mouseActivate(descriptor.id,event)
@@ -5075,7 +4839,7 @@ return true
5075
4839
  }}}
5076
4840
  function LspBadge(props){const icons=useIcons()
5077
4841
  const isKnown=lspIconName(props.id)!==undefined
5078
- const [showName,setShowName]=createSignal23(false)
4842
+ const [showName,setShowName]=createSignal22(false)
5079
4843
  const statusColor=()=>props.status==="connected"?props.api.theme.current.success:props.api.theme.current.error
5080
4844
  if(!isKnown){return(()=>{var _el$=_$createElement("text")
5081
4845
  _$setProp(_el$,"flexShrink",1)
@@ -5100,7 +4864,7 @@ _$setProp(_el$2,"flexShrink",0)
5100
4864
  _$insert(_el$2,()=>lspIcon(props.id,props.iconStyle??icons.style()))
5101
4865
  _$effect((_$p)=>_$setProp(_el$2,"fg",item.foregroundColor(),_$p))
5102
4866
  return _el$2
5103
- })(),_$createComponent(Show11,{get when(){return showName()
4867
+ })(),_$createComponent(Show10,{get when(){return showName()
5104
4868
  },get children(){var _el$3=_$createElement("text")
5105
4869
  _$setProp(_el$3,"flexShrink",0)
5106
4870
  _$setProp(_el$3,"wrapMode","none")
@@ -5118,7 +4882,7 @@ return _el$3
5118
4882
 
5119
4883
 
5120
4884
 
5121
- function createListVisibility(options){const [expanded,setExpanded]=createSignal24(false)
4885
+ function createListVisibility(options){const [expanded,setExpanded]=createSignal23(false)
5122
4886
  let previousKey
5123
4887
  let previousLimit
5124
4888
  const canToggle=createMemo8(()=>options.limit()>0&&options.items().length>options.limit())
@@ -5155,7 +4919,7 @@ else
5155
4919
  props.visibility.showAll()
5156
4920
  queueMicrotask(()=>props.interaction?.select(id))
5157
4921
  }})
5158
- return _$createComponent(Show12,{get when(){return props.visibility.canToggle()
4922
+ return _$createComponent(Show11,{get when(){return props.visibility.canToggle()
5159
4923
  },get children(){return _$createComponent(SelectionBox,{ref(r$){var _ref$=item.ref
5160
4924
  typeof _ref$==="function"?_ref$(r$):item.ref=r$
5161
4925
  },id,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
@@ -5205,7 +4969,7 @@ result += segment
5205
4969
  }
5206
4970
  return result + ellipsis
5207
4971
  }
5208
- function SectionHeaderControl(props){const [width,setWidth]=createSignal25()
4972
+ function SectionHeaderControl(props){const [width,setWidth]=createSignal24()
5209
4973
  const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
5210
4974
  },()=>props.api.theme.current.accent,"control")
5211
4975
  createEffect14(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
@@ -5230,7 +4994,7 @@ return _el$
5230
4994
  }})
5231
4995
  }
5232
4996
  function Section(props){const icons=useIcons()
5233
- const [headerWidth,setHeaderWidth]=createSignal26(0)
4997
+ const [headerWidth,setHeaderWidth]=createSignal25(0)
5234
4998
  const icon=()=>props.section?icons.section(props.section):props.icon
5235
4999
  const theme=()=>props.api.theme.current
5236
5000
  const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`section.${props.title}`,position:()=>({section:props.navigationSection??0,row:0,column:0
@@ -5272,7 +5036,7 @@ _$setProp(_el$7,"flexGrow",1)
5272
5036
  _$setProp(_el$7,"minWidth",0)
5273
5037
  _$setProp(_el$7,"justifyContent","flex-end")
5274
5038
  _$insert(_el$7,()=>props.headerControls,null)
5275
- _$insert(_el$7,_$createComponent(Show13,{get when(){return props.headerAction
5039
+ _$insert(_el$7,_$createComponent(Show12,{get when(){return props.headerAction
5276
5040
  },children:(action)=>_$createComponent(SectionHeaderControl,{get api(){return props.api
5277
5041
  },get interaction(){return props.interaction
5278
5042
  },get action(){return action()
@@ -5280,7 +5044,7 @@ _$insert(_el$7,_$createComponent(Show13,{get when(){return props.headerAction
5280
5044
  },get position(){return{section:props.navigationSection??0,row:0,column:1
5281
5045
  }}})
5282
5046
  }),null)
5283
- _$insert(_el$7,_$createComponent(Show13,{get when(){return props.summary
5047
+ _$insert(_el$7,_$createComponent(Show12,{get when(){return props.summary
5284
5048
  },get children(){var _el$8=_$createElement("text")
5285
5049
  _$setProp(_el$8,"wrapMode","none")
5286
5050
  _$setProp(_el$8,"truncate",true)
@@ -5297,7 +5061,7 @@ return _el$8
5297
5061
  return _el$7
5298
5062
  })()]
5299
5063
  }}),null)
5300
- _$insert(_el$,_$createComponent(Show13,{get when(){return props.open
5064
+ _$insert(_el$,_$createComponent(Show12,{get when(){return props.open
5301
5065
  },get children(){return props.children
5302
5066
  }}),null)
5303
5067
  return _el$
@@ -5315,7 +5079,7 @@ return _$createComponent(Section,{get api(){return props.api
5315
5079
  },sectionId:`${PLUGIN_ID}.section.lsp`,get navigationSection(){return navigationSection()
5316
5080
  },title:"LSP",section:"lsp",get summary(){return `${connected()}/${list().length}`
5317
5081
  },get open(){return props.preferences.expanded().lsp
5318
- },onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(Show14,{get when(){return list().length>0
5082
+ },onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(Show13,{get when(){return list().length>0
5319
5083
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
5320
5084
  _$insert(_el$2,()=>disabled()?"LSP is disabled":"Activates as files are read")
5321
5085
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -5327,7 +5091,7 @@ _$setProp(_el$,"flexWrap","wrap")
5327
5091
  _$setProp(_el$,"gap",1)
5328
5092
  _$setProp(_el$,"paddingLeft",1)
5329
5093
  _$setProp(_el$,"paddingRight",1)
5330
- _$insert(_el$,_$createComponent(For12,{get each(){return visibility.visible()
5094
+ _$insert(_el$,_$createComponent(For10,{get each(){return visibility.visible()
5331
5095
  },children:(item,index)=>_$createComponent(LspBadge,{get api(){return props.api
5332
5096
  },get interaction(){return props.interaction
5333
5097
  },get id(){return item.id
@@ -5440,7 +5204,7 @@ _$insert(_el$,_$createComponent(McpBulkAction,{get api(){return props.api
5440
5204
  }),null)
5441
5205
  _$effect((_$p)=>_$setProp(_el$,"paddingBottom",model.bulkRunning()||model.bulk().status==="error"?1:0,_$p))
5442
5206
  return _el$
5443
- })(),_$createComponent(Show15,{get when(){return model.bulkRunning()
5207
+ })(),_$createComponent(Show14,{get when(){return model.bulkRunning()
5444
5208
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createTextNode(`/`),_el$5=_$createTextNode(`\u2026`)
5445
5209
  _$insertNode(_el$2,_el$3)
5446
5210
  _$insertNode(_el$2,_el$4)
@@ -5450,7 +5214,7 @@ _$insert(_el$2,()=>model.bulk().completed,_el$4)
5450
5214
  _$insert(_el$2,()=>model.bulk().total,_el$5)
5451
5215
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
5452
5216
  return _el$2
5453
- }}),_$createComponent(Show15,{get when(){return model.bulk().status==="error"
5217
+ }}),_$createComponent(Show14,{get when(){return model.bulk().status==="error"
5454
5218
  },get children(){return _$createComponent(McpBulkAction,{get api(){return props.api
5455
5219
  },get interaction(){return props.interaction
5456
5220
  },id:`${PLUGIN_ID}.mcp.retry-all`,get position(){return{section:props.navigationSection,row:3,column:0
@@ -5530,7 +5294,7 @@ return _el$4
5530
5294
  function RequestErrorRow(props){const icons=useIcons()
5531
5295
  const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>props.position,disabled:()=>!props.state.error?.retryable||props.state.status==="loading"||props.state.status==="refreshing",activate:props.onRetry
5532
5296
  })
5533
- return _$createComponent(Show16,{get when(){return props.state.error
5297
+ return _$createComponent(Show15,{get when(){return props.state.error
5534
5298
  },children:(error)=>_$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5535
5299
  },flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5536
5300
  },get onMouseOver(){return item.onMouseOver
@@ -5545,7 +5309,7 @@ _$insert(_el$,()=>icons.icon("error"),_el$2)
5545
5309
  _$insert(_el$,()=>error().message,null)
5546
5310
  _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():props.api.theme.current.error,_$p))
5547
5311
  return _el$
5548
- })(),_$createComponent(Show16,{get when(){return error().retryable
5312
+ })(),_$createComponent(Show15,{get when(){return error().retryable
5549
5313
  },get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Retry`)
5550
5314
  _$insertNode(_el$3,_el$4)
5551
5315
  _$setProp(_el$3,"flexShrink",0)
@@ -5560,7 +5324,7 @@ function SectionRequestBody(props){const icons=useIcons()
5560
5324
  const pending=()=>props.state.status==="loading"
5561
5325
  return(()=>{var _el$5=_$createElement("box")
5562
5326
  _$insert(_el$5,_$createComponent(RequestErrorRow,props),null)
5563
- _$insert(_el$5,_$createComponent(Show16,{get when(){return _$memo(()=>!!pending())()&&!props.hasItems
5327
+ _$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!pending())()&&!props.hasItems
5564
5328
  },get children(){var _el$6=_$createElement("text"),_el$7=_$createTextNode(` `)
5565
5329
  _$insertNode(_el$6,_el$7)
5566
5330
  _$insert(_el$6,()=>icons.icon("pending"),_el$7)
@@ -5568,10 +5332,10 @@ _$insert(_el$6,()=>props.loading,null)
5568
5332
  _$effect((_$p)=>_$setProp(_el$6,"fg",props.api.theme.current.textMuted,_$p))
5569
5333
  return _el$6
5570
5334
  }}),null)
5571
- _$insert(_el$5,_$createComponent(Show16,{get when(){return props.hasItems
5335
+ _$insert(_el$5,_$createComponent(Show15,{get when(){return props.hasItems
5572
5336
  },get children(){return props.children
5573
5337
  }}),null)
5574
- _$insert(_el$5,_$createComponent(Show16,{get when(){return _$memo(()=>!!((props.state.status==="ready"||props.state.status==="refreshing")&&!props.hasItems))()&&!props.state.error
5338
+ _$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!((props.state.status==="ready"||props.state.status==="refreshing")&&!props.hasItems))()&&!props.state.error
5575
5339
  },get children(){var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
5576
5340
  _$insertNode(_el$8,_el$9)
5577
5341
  _$insert(_el$8,()=>icons.icon("info"),_el$9)
@@ -5588,8 +5352,8 @@ return _el$5
5588
5352
  function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5589
5353
  }=input
5590
5354
  const id=`${input.id}.favorite`
5591
- const [rowHovered,setRowHovered]=createSignal27(false)
5592
- const [controlHovered,setControlHovered]=createSignal27(false)
5355
+ const [rowHovered,setRowHovered]=createSignal26(false)
5356
+ const [controlHovered,setControlHovered]=createSignal26(false)
5593
5357
  const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5594
5358
  }),disabled,activate:()=>{onToggle()
5595
5359
  queueMicrotask(()=>interaction?.select(id))
@@ -5705,7 +5469,7 @@ return _el$2
5705
5469
  function SectionFilter(props){const icons=useIcons()
5706
5470
  let input
5707
5471
  let unregisterInput
5708
- const [inputFocused,setInputFocused]=createSignal28(false)
5472
+ const [inputFocused,setInputFocused]=createSignal27(false)
5709
5473
  const theme=()=>props.api.theme.current
5710
5474
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5711
5475
  },activate:()=>{if(!input)
@@ -5726,7 +5490,7 @@ props.interaction.leaveFilter(input)
5726
5490
  else
5727
5491
  input?.blur()
5728
5492
  }
5729
- onCleanup20(()=>unregisterInput?.())
5493
+ onCleanup19(()=>unregisterInput?.())
5730
5494
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5731
5495
  },flexDirection:"row",gap:1,marginTop:1,marginBottom:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>!!highlighted())()?theme().primary:item.backgroundColor()
5732
5496
  },get onMouseOver(){return item.onMouseOver
@@ -5764,7 +5528,7 @@ return _p$
5764
5528
  },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined,h:undefined
5765
5529
  })
5766
5530
  return _el$2
5767
- })(),_$createComponent(Show17,{get when(){return props.query
5531
+ })(),_$createComponent(Show16,{get when(){return props.query
5768
5532
  },get children(){var _el$3=_$createElement("text")
5769
5533
  _$setProp(_el$3,"flexShrink",0)
5770
5534
  _$setProp(_el$3,"onMouseDown",()=>props.onInput(""))
@@ -5793,7 +5557,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
5793
5557
  }},get query(){return props.query
5794
5558
  },placeholder:"Filter MCP...",get onInput(){return props.onQuery
5795
5559
  }}),null)
5796
- _$insert(_el$,_$createComponent(Show18,{get when(){return model.filtered().length>0
5560
+ _$insert(_el$,_$createComponent(Show17,{get when(){return model.filtered().length>0
5797
5561
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
5798
5562
  _$insertNode(_el$2,_$createTextNode(`No matching MCP servers`))
5799
5563
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -5803,8 +5567,8 @@ return _el$2
5803
5567
  },get interaction(){return props.interaction
5804
5568
  },get grouped(){return model.grouped
5805
5569
  },get density(){return props.preferences.rowDensity?.()??"compact"
5806
- },get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
5807
- },children:(item,index)=>[_$createComponent(Show18,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
5570
+ },get children(){return _$createComponent(For11,{get each(){return model.visibility.visible()
5571
+ },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
5808
5572
  },get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
5809
5573
  },get interaction(){return props.interaction
5810
5574
  },get bucket(){return item.bucket
@@ -5835,7 +5599,7 @@ return _el$
5835
5599
  }})
5836
5600
  }
5837
5601
  function McpSection(props){const icons=useIcons()
5838
- const [query,setQuery]=createSignal29("")
5602
+ const [query,setQuery]=createSignal28("")
5839
5603
  const model=createMcpSectionModel(props,query)
5840
5604
  const navigationSection=()=>props.navigationSection??6
5841
5605
  const summary=createMemo11(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -5975,7 +5739,7 @@ function QuickActionRow(props){const{api,interaction
5975
5739
  const icons=useIcons()
5976
5740
  const toolbar=useToolbar()
5977
5741
  const theme=()=>api.theme.current
5978
- const [width,setWidth]=createSignal34(0)
5742
+ const [width,setWidth]=createSignal33(0)
5979
5743
  const shortcut=createMemo12(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
5980
5744
  })
5981
5745
  return api.keys.formatBindings(bindings.get(props.action.command))
@@ -6019,7 +5783,7 @@ _$insert(_el$2,()=>props.action.label)
6019
5783
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6020
5784
  return _el$2
6021
5785
  })()
6022
- },get metadata(){return _$createComponent(Show25,{get when(){return visibleShortcut()
5786
+ },get metadata(){return _$createComponent(Show24,{get when(){return visibleShortcut()
6023
5787
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
6024
5788
  _$setProp(_el$3,"flexShrink",0)
6025
5789
  _$setProp(_el$3,"wrapMode","none")
@@ -6028,12 +5792,12 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
6028
5792
  return _el$3
6029
5793
  })()
6030
5794
  })
6031
- },get trailing(){return _$createComponent(Show25,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
5795
+ },get trailing(){return _$createComponent(Show24,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6032
5796
  },get position(){return props.position
6033
5797
  },get pin(){return{kind:"action",id:props.action.command,icon:"bolt"
6034
5798
  }}})
6035
5799
  }})
6036
- },get details(){return _$createComponent(Show25,{get when(){return props.disabled
5800
+ },get details(){return _$createComponent(Show24,{get when(){return props.disabled
6037
5801
  },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6038
5802
  _$setProp(_el$4,"wrapMode","word")
6039
5803
  _$insert(_el$4,reason)
@@ -6061,12 +5825,12 @@ return _$createComponent(Section,{get api(){return props.api
6061
5825
  },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6062
5826
  },get interaction(){return props.interaction
6063
5827
  },get density(){return props.preferences.rowDensity?.()??"compact"
6064
- },get children(){return [_$createComponent(Show26,{get when(){return actions().length===0
5828
+ },get children(){return [_$createComponent(Show25,{get when(){return actions().length===0
6065
5829
  },get children(){var _el$=_$createElement("text")
6066
5830
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6067
5831
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6068
5832
  return _el$
6069
- }}),_$createComponent(For16,{get each(){return visibility.visible().map((action)=>action.command)
5833
+ }}),_$createComponent(For14,{get each(){return visibility.visible().map((action)=>action.command)
6070
5834
  },children:(id,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6071
5835
  },get action(){return visibility.visible()[index()]
6072
5836
  },get disabled(){return visibility.visible()[index()].disabled
@@ -6134,15 +5898,15 @@ untrack6(()=>shortcuts.bind(key))
6134
5898
  createEffect16(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
6135
5899
  untrack6(shortcuts.cancel)
6136
5900
  })
6137
- onCleanup21(shortcuts.dispose)
5901
+ onCleanup20(shortcuts.dispose)
6138
5902
  return(()=>{var _el$=_$createElement("box")
6139
5903
  _$setProp(_el$,"position","absolute")
6140
5904
  _$setProp(_el$,"top",0)
6141
5905
  _$setProp(_el$,"left",0)
6142
5906
  _$setProp(_el$,"width","100%")
6143
5907
  _$setProp(_el$,"height","100%")
6144
- _$insert(_el$,_$createComponent(Show27,{get when(){return shortcuts.active()
6145
- },get children(){return _$createComponent(Suspense4,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
5908
+ _$insert(_el$,_$createComponent(Show26,{get when(){return shortcuts.active()
5909
+ },get children(){return _$createComponent(Suspense5,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
6146
5910
  },get actions(){return shortcuts.actions
6147
5911
  }})
6148
5912
  }})
@@ -6156,11 +5920,11 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6156
5920
  })=>({name:name.replace(PLUGIN_ID,()=>LEGACY_PLUGIN_ID),run,enabled
6157
5921
  }))]
6158
5922
  })
6159
- onCleanup21(unregisterCommands)
5923
+ onCleanup20(unregisterCommands)
6160
5924
  createEffect16(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6161
5925
  }]
6162
5926
  })
6163
- onCleanup21(unregister)
5927
+ onCleanup20(unregister)
6164
5928
  })
6165
5929
  return _$createElement("box")
6166
5930
  }
@@ -6226,7 +5990,7 @@ createEffect17(()=>{if(!needsSkills())
6226
5990
  return
6227
5991
  const current=target()
6228
5992
  const release=untrack7(()=>props.skills.activate(current))
6229
- onCleanup22(release)
5993
+ onCleanup21(release)
6230
5994
  untrack7(()=>{props.skills.refresh(current).catch(()=>{})
6231
5995
  })
6232
5996
  })
@@ -6272,14 +6036,14 @@ return{pins,view,run,width:toolbarPinWidth}}
6272
6036
 
6273
6037
  function ToolbarButton(props){const icons=useIcons()
6274
6038
  const foreground=()=>props.reason?props.api.theme.current.textMuted:item.foregroundColor()
6275
- const [hovered,setHovered]=createSignal35(false)
6039
+ const [hovered,setHovered]=createSignal34(false)
6276
6040
  const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>({section:0,row:props.row + 1,column:props.column
6277
6041
  }),activate:props.onRun
6278
6042
  },()=>props.reason?props.api.theme.current.textMuted:props.api.theme.current.accent,"control")
6279
6043
  const content=()=>[props.icons.map((icon)=>terminalIcon(icon,icons.style())).join(" "),props.text].filter(Boolean).join(" ")
6280
6044
  createEffect18(()=>props.onDetails(props.id,item.focused()||hovered()))
6281
- onCleanup23(()=>props.onDetails(props.id,false))
6282
- return _$createComponent(Show28,{get when(){return _$memo(()=>!!(props.width===3&&props.icons.length===1))()&&!props.text
6045
+ onCleanup22(()=>props.onDetails(props.id,false))
6046
+ return _$createComponent(Show27,{get when(){return _$memo(()=>!!(props.width===3&&props.icons.length===1))()&&!props.text
6283
6047
  },get fallback(){return _$createComponent(SelectionBox,{get id(){return props.id
6284
6048
  },ref(r$){var _ref$2=item.ref
6285
6049
  typeof _ref$2==="function"?_ref$2(r$):item.ref=r$
@@ -6319,8 +6083,8 @@ setHovered(false)
6319
6083
  }
6320
6084
  function SidebarToolbar(props){const model=createToolbarModel(props)
6321
6085
  const icons=useIcons()
6322
- const [width,setWidth]=createSignal36(3)
6323
- const [detail,setDetail]=createSignal36()
6086
+ const [width,setWidth]=createSignal35(3)
6087
+ const [detail,setDetail]=createSignal35()
6324
6088
  const keys=createMemo15(()=>model.pins().map((pin)=>toolbarPinKey(pin)))
6325
6089
  const widths=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),model.width(pin)])))
6326
6090
  const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu",widths()))
@@ -6348,17 +6112,17 @@ dialogs.close()
6348
6112
  model.run(option.value)
6349
6113
  }}))
6350
6114
  }
6351
- return _$createComponent(Show29,{get when(){return keys().length>0
6115
+ return _$createComponent(Show28,{get when(){return keys().length>0
6352
6116
  },get children(){var _el$=_$createElement("box")
6353
6117
  _$setProp(_el$,"id","opencode-navigator.toolbar")
6354
6118
  _$setProp(_el$,"overflow","visible")
6355
6119
  _$setProp(_el$,"onSizeChange",function(){setWidth(this.width)
6356
6120
  })
6357
- _$insert(_el$,_$createComponent(For17,{get each(){return rows()
6121
+ _$insert(_el$,_$createComponent(For15,{get each(){return rows()
6358
6122
  },children:(row)=>(()=>{var _el$2=_$createElement("box")
6359
6123
  _$setProp(_el$2,"flexDirection","row")
6360
6124
  _$setProp(_el$2,"gap",1)
6361
- _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6125
+ _$insert(_el$2,_$createComponent(For15,{get each(){return layout().rows[row]
6362
6126
  },children:(key,column)=>_$createComponent(ToolbarButton,_$mergeProps(props,{id:`opencode-navigator.toolbar.${key}`,row,get column(){return column()
6363
6127
  },get label(){return view(key)?.label??"More"
6364
6128
  },get icons(){return key==="toolbar:more"?["list"]:view(key)?.icons??["bolt"]
@@ -6371,7 +6135,7 @@ _$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
6371
6135
  return _el$2
6372
6136
  })()
6373
6137
  }),null)
6374
- _$insert(_el$,_$createComponent(Show29,{get when(){return details()
6138
+ _$insert(_el$,_$createComponent(Show28,{get when(){return details()
6375
6139
  },children:(text)=>(()=>{var _el$3=_$createElement("text")
6376
6140
  _$setProp(_el$3,"position","absolute")
6377
6141
  _$setProp(_el$3,"left",0)
@@ -6413,7 +6177,7 @@ const visibility=createListVisibility({items:filtered,limit:()=>props.preference
6413
6177
  const state=createMemo16(()=>props.controller.state(target()))
6414
6178
  createEffect19(()=>{const current=target()
6415
6179
  const deactivate=untrack8(()=>props.controller.activate?.(current)??(()=>{}))
6416
- onCleanup24(deactivate)
6180
+ onCleanup23(deactivate)
6417
6181
  untrack8(()=>void props.controller.refresh(current).catch(()=>{}))
6418
6182
  })
6419
6183
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
@@ -6465,7 +6229,7 @@ _$insert(_el$,()=>props.item.name,null)
6465
6229
  _$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
6466
6230
  return _el$
6467
6231
  })()
6468
- },get trailing(){return _$createComponent(Show30,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6232
+ },get trailing(){return _$createComponent(Show29,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
6469
6233
  },get position(){return props.position
6470
6234
  },get pin(){return{kind:"skill",name:props.item.name,location:props.item.location,icon:"book"
6471
6235
  }}})
@@ -6474,7 +6238,7 @@ return _el$
6474
6238
  }
6475
6239
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6476
6240
  const toolbar=useToolbar()
6477
- const [query,setQuery]=createSignal37("")
6241
+ const [query,setQuery]=createSignal36("")
6478
6242
  const model=createSkillSectionModel(props,query)
6479
6243
  const navigationSection=()=>props.navigationSection??3
6480
6244
  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"
@@ -6498,7 +6262,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6498
6262
  }},get query(){return query()
6499
6263
  },placeholder:"Filter skills...",onInput:setQuery
6500
6264
  }),null)
6501
- _$insert(_el$,_$createComponent(Show31,{get when(){return model.filtered().length>0
6265
+ _$insert(_el$,_$createComponent(Show30,{get when(){return model.filtered().length>0
6502
6266
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6503
6267
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6504
6268
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -6508,8 +6272,8 @@ return _el$2
6508
6272
  },get interaction(){return props.interaction
6509
6273
  },get grouped(){return model.grouped
6510
6274
  },get density(){return props.preferences.rowDensity?.()??"compact"
6511
- },get children(){return _$createComponent(For18,{get each(){return model.visibility.visible()
6512
- },children:(item,index)=>[_$createComponent(Show31,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6275
+ },get children(){return _$createComponent(For16,{get each(){return model.visibility.visible()
6276
+ },children:(item,index)=>[_$createComponent(Show30,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6513
6277
  },get children(){var _el$4=_$createElement("text")
6514
6278
  _$setProp(_el$4,"height",1)
6515
6279
  _$setProp(_el$4,"wrapMode","none")
@@ -6554,8 +6318,8 @@ return _el$
6554
6318
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6555
6319
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6556
6320
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6557
- const [query,setQuery]=createSignal38("")
6558
- const [mode,setMode]=createSignal38("all")
6321
+ const [query,setQuery]=createSignal37("")
6322
+ const [mode,setMode]=createSignal37("all")
6559
6323
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6560
6324
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6561
6325
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
@@ -6578,7 +6342,7 @@ const state=createMemo17(()=>props.controller.state(props.sessionID))
6578
6342
  createEffect20(()=>{const sessionID=props.sessionID
6579
6343
  targetKey()
6580
6344
  const deactivate=untrack9(()=>props.controller.activate?.(sessionID)??(()=>{}))
6581
- onCleanup25(deactivate)
6345
+ onCleanup24(deactivate)
6582
6346
  untrack9(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6583
6347
  })
6584
6348
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
@@ -6636,7 +6400,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6636
6400
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6637
6401
  return _el$3
6638
6402
  })()
6639
- },get details(){return [_$createComponent(Show32,{get when(){return props.item.run?.errorMessage
6403
+ },get details(){return [_$createComponent(Show31,{get when(){return props.item.run?.errorMessage
6640
6404
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6641
6405
  _$insertNode(_el$4,_el$5)
6642
6406
  _$setProp(_el$4,"wrapMode","word")
@@ -6644,12 +6408,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6644
6408
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6645
6409
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6646
6410
  return _el$4
6647
- }}),_$createComponent(Show32,{get when(){return props.item.unavailable
6411
+ }}),_$createComponent(Show31,{get when(){return props.item.unavailable
6648
6412
  },get children(){var _el$6=_$createElement("text")
6649
6413
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6650
6414
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6651
6415
  return _el$6
6652
- }}),_$createComponent(Show32,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6416
+ }}),_$createComponent(Show31,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6653
6417
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6654
6418
  _$insertNode(_el$0,_el$1)
6655
6419
  _$insertNode(_el$0,_el$10)
@@ -6661,7 +6425,7 @@ _$insert(_el$0,()=>status().message,null)
6661
6425
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6662
6426
  return _el$0
6663
6427
  })()
6664
- }),_$createComponent(Show32,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6428
+ }),_$createComponent(Show31,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6665
6429
  },get children(){var _el$8=_$createElement("text")
6666
6430
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6667
6431
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6672,12 +6436,12 @@ return _el$8
6672
6436
  function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
6673
6437
  },get interaction(){return props.interaction
6674
6438
  },get density(){return props.density
6675
- },get children(){return _$createComponent(For19,{get each(){return props.ids
6439
+ },get children(){return _$createComponent(For17,{get each(){return props.ids
6676
6440
  },children:(id,index)=>{const initial=props.itemById(id)
6677
6441
  const item=()=>props.itemById(id)??initial
6678
6442
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6679
6443
  return(()=>{var _el$=_$createElement("box")
6680
- _$insert(_el$,_$createComponent(Show33,{get when(){return startsGroup()
6444
+ _$insert(_el$,_$createComponent(Show32,{get when(){return startsGroup()
6681
6445
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6682
6446
  _$insertNode(_el$2,_el$3)
6683
6447
  _$insert(_el$3,()=>item().group)
@@ -6703,7 +6467,7 @@ return _$createComponent(Section,{get api(){return props.api
6703
6467
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6704
6468
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6705
6469
  },get open(){return props.preferences.expanded().subagents
6706
- },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show34,{get when(){return model.parentID()
6470
+ },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show33,{get when(){return model.parentID()
6707
6471
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6708
6472
  },get interaction(){return props.interaction
6709
6473
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6726,7 +6490,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6726
6490
  }}),_el$2)
6727
6491
  _$setProp(_el$2,"flexDirection","row")
6728
6492
  _$setProp(_el$2,"flexWrap","wrap")
6729
- _$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
6493
+ _$insert(_el$2,_$createComponent(For18,{get each(){return model.tabs()
6730
6494
  },children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6731
6495
  },get interaction(){return props.interaction
6732
6496
  },id:`${PLUGIN_ID}.subagents.filter.${value}`,get position(){return{section:navigationSection(),row:4,column:index()
@@ -6737,7 +6501,7 @@ _$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
6737
6501
  },onActivate:()=>model.setMode(value)
6738
6502
  })
6739
6503
  }))
6740
- _$insert(_el$,_$createComponent(Show34,{get when(){return model.filtered().length===0
6504
+ _$insert(_el$,_$createComponent(Show33,{get when(){return model.filtered().length===0
6741
6505
  },get children(){var _el$3=_$createElement("text")
6742
6506
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6743
6507
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6778,13 +6542,36 @@ return _el$
6778
6542
 
6779
6543
 
6780
6544
 
6545
+
6546
+
6781
6547
  function NativeTodoNotice(props){const icons=useIcons()
6782
- return(()=>{var _el$=_$createElement("text"),_el$2=_$createTextNode(` Native OpenCode Todo. Edit tasks through chat and todowrite.`)
6548
+ const state=()=>props.setup?.state(props.sessionID)
6549
+ const failed=()=>state()?.status==="error"
6550
+ const disabled=()=>state()?.enabled===false
6551
+ const message=()=>{if(failed())
6552
+ return state()?.error
6553
+ if(state()?.status==="loading"&&state()?.enabled===undefined)
6554
+ return "Checking native Todo configuration\u2026"
6555
+ if(disabled())
6556
+ return "Native OpenCode Todo is disabled. Enable it to let the built-in todowrite tool manage tasks."
6557
+ return "Native OpenCode Todo. Edit tasks through chat and todowrite."
6558
+ }
6559
+ return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `)
6783
6560
  _$insertNode(_el$,_el$2)
6784
- _$setProp(_el$,"wrapMode","word")
6785
- _$insert(_el$,()=>icons.icon("info"),_el$2)
6786
- _$insert(_el$,()=>props.empty?" OpenCode 2.1 enables the tool through experimental.todo.":"",null)
6787
- _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6561
+ _$insertNode(_el$2,_el$3)
6562
+ _$setProp(_el$2,"wrapMode","word")
6563
+ _$insert(_el$2,()=>icons.icon("info"),_el$3)
6564
+ _$insert(_el$2,message,null)
6565
+ _$insert(_el$,_$createComponent(Show34,{get when(){return _$memo(()=>!!props.setup)()&&(disabled()||failed())
6566
+ },get children(){return _$createComponent(SectionTab,{get api(){return props.api
6567
+ },get interaction(){return props.interaction
6568
+ },id:"opencode-navigator.todo.setup",get position(){return{section:props.navigationSection,row:2,column:0
6569
+ }},get label(){return failed()?"Retry Todo configuration":"Enable Todo\u2026"
6570
+ },selected:false,get disabled(){return state()?.status==="saving"
6571
+ },onActivate:()=>failed()?void props.setup?.refresh(props.sessionID):props.setup?.configure(props.sessionID)
6572
+ })
6573
+ }}),null)
6574
+ _$effect((_$p)=>_$setProp(_el$2,"fg",failed()?props.api.theme.current.warning:props.api.theme.current.textMuted,_$p))
6788
6575
  return _el$
6789
6576
  })()
6790
6577
  }
@@ -6848,7 +6635,7 @@ _$insert(_el$5,priorityLabel,null)
6848
6635
  _$effect((_$p)=>_$setProp(_el$4,"fg",priorityColor(),_$p))
6849
6636
  return _el$4
6850
6637
  }}),null)
6851
- _$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
6638
+ _$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
6852
6639
  _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
6853
6640
  _v$2!==_p$.t&&(_p$.t=_$setProp(_el$3,"fg",_v$2,_p$.t))
6854
6641
  _v$3!==_p$.a&&(_p$.a=_$setProp(_el$3,"attributes",_v$3,_p$.a))
@@ -6859,13 +6646,13 @@ return _el$
6859
6646
  })()
6860
6647
  }
6861
6648
  function TodoContents(props){const navigationSection=()=>props.navigationSection??1
6862
- const tabsRow=()=>props.managed?3:2
6649
+ const tabsRow=()=>(props.managed?3:2) + (props.navigationOffset??0)
6863
6650
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box")
6864
6651
  _$insertNode(_el$,_el$2)
6865
6652
  _$setProp(_el$,"gap",1)
6866
6653
  _$setProp(_el$2,"flexDirection","row")
6867
6654
  _$setProp(_el$2,"flexWrap","wrap")
6868
- _$insert(_el$2,_$createComponent(For21,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6655
+ _$insert(_el$2,_$createComponent(For19,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6869
6656
  },get interaction(){return props.interaction
6870
6657
  },id:`${PLUGIN_ID}.todo.filter.${value}`,get position(){return{section:navigationSection(),row:tabsRow(),column:index()
6871
6658
  }},get label(){return value[0].toUpperCase() + value.slice(1)
@@ -6881,7 +6668,7 @@ _$insert(_el$,_$createComponent(Show36,{get when(){return props.view.rows.length
6881
6668
  },get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
6882
6669
  },get interaction(){return props.interaction
6883
6670
  },get density(){return props.density
6884
- },get children(){return _$createComponent(For21,{get each(){return props.visibility.visible()
6671
+ },get children(){return _$createComponent(For19,{get each(){return props.visibility.visible()
6885
6672
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6886
6673
  return(()=>{var _el$3=_$createElement("box")
6887
6674
  _$insert(_el$3,_$createComponent(Show36,{get when(){return startsGroup()
@@ -6947,7 +6734,9 @@ const icons=useIcons()
6947
6734
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6948
6735
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6949
6736
  const native=()=>("source" in props.controller)&&props.controller.source==="native"
6950
- const [mode,setMode]=createSignal39("all")
6737
+ const setup=()=>("setup" in props.controller)?props.controller.setup:undefined
6738
+ const setupState=()=>setup()?.state(props.sessionID)
6739
+ const [mode,setMode]=createSignal38("all")
6951
6740
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6952
6741
  createEffect21(()=>{targetKey()
6953
6742
  setMode("all")
@@ -6961,8 +6750,9 @@ targetKey()
6961
6750
  if(unavailable())
6962
6751
  return
6963
6752
  const deactivate=untrack10(()=>props.controller.activate?.(sessionID)??(()=>{}))
6964
- onCleanup26(deactivate)
6753
+ onCleanup25(deactivate)
6965
6754
  untrack10(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6755
+ untrack10(()=>void setup()?.refresh(sessionID).catch(()=>{}))
6966
6756
  })
6967
6757
  const navigationSection=()=>props.navigationSection??1
6968
6758
  return _$createComponent(Section,{get api(){return props.api
@@ -6970,6 +6760,7 @@ return _$createComponent(Section,{get api(){return props.api
6970
6760
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6971
6761
  },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6972
6762
  },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(()=>{})
6763
+ setup()?.refresh(props.sessionID).catch(()=>{})
6973
6764
  }}:undefined
6974
6765
  },get open(){return props.preferences.expanded().todo
6975
6766
  },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show38,{get when(){return unavailable()
@@ -6977,7 +6768,10 @@ return _$createComponent(Section,{get api(){return props.api
6977
6768
  _$setProp(_el$,"gap",1)
6978
6769
  _$insert(_el$,_$createComponent(Show38,{get when(){return native()
6979
6770
  },get children(){return _$createComponent(NativeTodoNotice,{get api(){return props.api
6980
- },get empty(){return list().length===0
6771
+ },get setup(){return setup()
6772
+ },get sessionID(){return props.sessionID
6773
+ },get interaction(){return props.interaction
6774
+ },get navigationSection(){return navigationSection()
6981
6775
  }})
6982
6776
  }}),null)
6983
6777
  _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.guidance(props.sessionID).available
@@ -7001,6 +6795,7 @@ _$insert(_el$,_$createComponent(Show38,{get when(){return managed()?.missing(pro
7001
6795
  },setMode,get view(){return view()
7002
6796
  },visibility,get density(){return props.preferences.rowDensity?.()??"compact"
7003
6797
  },get managed(){return Boolean(managed())
6798
+ },get navigationOffset(){return setupState()?.enabled===false||setupState()?.status==="error"?1:0
7004
6799
  }})
7005
6800
  }})
7006
6801
  },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.`)
@@ -7025,7 +6820,7 @@ return _el$4
7025
6820
  }
7026
6821
  function SidebarContent(props){const sections=props.preferences.sections
7027
6822
  const visibleSections=createMemo19(()=>props.preferences.sectionOrder().filter((section)=>sections()[section]&&supportsSidebarSection(props.api,section)))
7028
- onCleanup27(()=>props.interaction.setContentRoot(undefined))
6823
+ onCleanup26(()=>props.interaction.setContentRoot(undefined))
7029
6824
  return _$createComponent(ToolbarProvider,{get api(){return props.api
7030
6825
  },get preferences(){return props.preferences
7031
6826
  },get skills(){return props.skills
@@ -7041,7 +6836,7 @@ event.stopPropagation()
7041
6836
  props.interaction.leave()
7042
6837
  })
7043
6838
  _$insert(_el$,_$createComponent(SidebarToolbar,props),null)
7044
- _$insert(_el$,_$createComponent(For22,{get each(){return visibleSections()
6839
+ _$insert(_el$,_$createComponent(For20,{get each(){return visibleSections()
7045
6840
  },children:(section,index)=>_$createComponent(SectionBoundary,{get api(){return props.api
7046
6841
  },get divided(){return index()<visibleSections().length-1
7047
6842
  },get children(){return _$createComponent(Switch,{get children(){return [_$createComponent(Match,{when:section==="limits",get children(){return props.limitsSection(index() + 1)
@@ -7085,7 +6880,7 @@ const params="params" in route?route.params:undefined
7085
6880
  if(typeof params?.sessionID!=="string")
7086
6881
  return
7087
6882
  const current=props.controller.target()
7088
- onCleanup28(()=>props.controller.deactivate(current))
6883
+ onCleanup27(()=>props.controller.deactivate(current))
7089
6884
  untrack11(()=>void props.controller.activate(current).catch(()=>{}))
7090
6885
  })
7091
6886
  return _$createElement("box")
@@ -7125,7 +6920,7 @@ const settingsId=`${PLUGIN_ID}.settings`
7125
6920
  const settings=useSidebarItem(props.api,props.interaction,{id:settingsId,position:{section:0,row:0,column:0
7126
6921
  },activate:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
7127
6922
  },()=>theme().textMuted,"control")
7128
- onCleanup29(()=>props.interaction.setTitleRoot(undefined))
6923
+ onCleanup28(()=>props.interaction.setTitleRoot(undefined))
7129
6924
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box"),_el$3=_$createElement("box")
7130
6925
  _$insertNode(_el$,_el$2)
7131
6926
  _$use((node)=>props.interaction.setTitleRoot(node),_el$)
@@ -7210,15 +7005,15 @@ await options.accountSource.refresh(model)
7210
7005
  if(!disposed&&target===targetKey())
7211
7006
  await options.controller.refresh()
7212
7007
  }
7213
- createEffect23(on2(interval,(milliseconds)=>{onCleanup30(schedule(()=>void refresh().catch(()=>{}),milliseconds))
7008
+ createEffect23(on2(interval,(milliseconds)=>{onCleanup29(schedule(()=>void refresh().catch(()=>{}),milliseconds))
7214
7009
  }))
7215
- onCleanup30(()=>{disposed=true
7010
+ onCleanup29(()=>{disposed=true
7216
7011
  })
7217
7012
  }
7218
7013
  function LimitsPersistence(props){createLimitsRefresh(props)
7219
7014
  return _$createElement("box")
7220
7015
  }
7221
- function bindNavigatorAbout(api,status,updates,notes){const dispose=registerNavigatorAboutServices(api,{navigatorVersion:"0.24.0",openCodeVersion:api.app.version,checkState:()=>status.navigatorCheckState?.()??{status:"idle"},checking:()=>status.navigatorCheckState?.().status==="checking",updating:updates.navigatorUpdating,installed:updates.navigatorInstalled,check:()=>status.refreshNavigator?.()??Promise.resolve("unavailable"),update(dialogs){const target=status.navigatorUpdate()
7016
+ function bindNavigatorAbout(api,status,updates,notes){const dispose=registerNavigatorAboutServices(api,{navigatorVersion:"0.26.0",openCodeVersion:api.app.version,checkState:()=>status.navigatorCheckState?.()??{status:"idle"},checking:()=>status.navigatorCheckState?.().status==="checking",updating:updates.navigatorUpdating,installed:updates.navigatorInstalled,check:()=>status.refreshNavigator?.()??Promise.resolve("unavailable"),update(dialogs){const target=status.navigatorUpdate()
7222
7017
  if(target)
7223
7018
  updates.navigator(target,dialogs)
7224
7019
  },changelog:async ()=>notes.parseChangelog(await notes.readBundledChangelog())
@@ -7241,11 +7036,11 @@ const candidates=context.data.location.skill.list({directory})?.filter((skill)=>
7241
7036
  const id=candidates.length===1?candidates[0].id:undefined
7242
7037
  if(route.type!=="session"||session?.location.directory!==directory||!id)
7243
7038
  return{data:false}
7244
- await context.client.session.skill({sessionID:route.sessionID,id},{signal:options.signal})
7039
+ await context.client.experimental.session.skill({sessionID:route.sessionID,id},{signal:options.signal})
7245
7040
  return{data:true}}},mcp:{async status(input,options={}){const response=await context.client.mcp.list(location(input),{signal:options.signal})
7246
7041
  const data=Object.fromEntries(response.data.map((server)=>[server.name,server.status]))
7247
- return{data}},async connect(input,options={}){await context.client.mcp.connect({server:input.name,...location(input)},{signal:options.signal})
7248
- return{data:undefined}},async disconnect(input,options={}){await context.client.mcp.disconnect({server:input.name,...location(input)},{signal:options.signal})
7042
+ return{data}},async connect(input,options={}){await context.client.experimental.mcp.connect({server:input.name,...location(input)},{signal:options.signal})
7043
+ return{data:undefined}},async disconnect(input,options={}){await context.client.experimental.mcp.disconnect({server:input.name,...location(input)},{signal:options.signal})
7249
7044
  return{data:undefined}}}}}}
7250
7045
  var TERMINAL_EVENTS=new Set(["session.execution.succeeded","session.execution.failed","session.execution.interrupted"])
7251
7046
  function executionStatus(name,event){const sessionID=event.data.sessionID
@@ -7265,7 +7060,7 @@ return ["session.status","session.retry.scheduled",...executions]
7265
7060
  if(name==="session.idle")
7266
7061
  return ["session.idle",...executions.slice(1)]
7267
7062
  if(name==="session.error")
7268
- return ["session.execution.failed"]
7063
+ return ["session.execution.failed","session.execution.interrupted"]
7269
7064
  if(name==="mcp.tools.changed")
7270
7065
  return ["mcp.status.changed","mcp.resources.changed"]
7271
7066
  if(["session.created","session.deleted","server.connected","installation.update-available"].includes(name))
@@ -7310,7 +7105,7 @@ if(name==="session.deleted"){emit({sessionID})
7310
7105
  return
7311
7106
  }
7312
7107
  if(name==="session.error"){const error=data.error
7313
- emit({sessionID,error:error&&{name:error.type??"Error",data:{message:error.message??"Session error"}}})
7108
+ emit({sessionID,error:event.type==="session.execution.interrupted"?{name:"MessageAbortedError",data:{message:"Session aborted"}}:error&&{name:error.type??"Error",data:{message:error.message??"Session error"}}})
7314
7109
  return
7315
7110
  }
7316
7111
  const info=context.data.session.get(sessionID)
@@ -7354,7 +7149,7 @@ context.keymap.dispatch(command.id)
7354
7149
  context.renderer.keyInput.on("keypress",onKeypress)
7355
7150
  const keymap={registerLayer(layer){const id=++sequence
7356
7151
  const owner=getOwner()
7357
- const [active,setActive]=createSignal40(true)
7152
+ const [active,setActive]=createSignal39(true)
7358
7153
  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)
7359
7154
  }))
7360
7155
  }
@@ -7399,7 +7194,7 @@ cleanups.clear()
7399
7194
  context.renderer.keyInput.off("keypress",onKeypress)
7400
7195
  }}}
7401
7196
 
7402
- function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal41({})
7197
+ function createV2SessionAdapter(context){const [retryDetails,setRetryDetails]=createSignal40({})
7403
7198
  const projections=new WeakMap
7404
7199
  function normalize(info){const directory=info.location.directory
7405
7200
  const workspaceID=context.location?.directory===directory?context.location.workspaceID:undefined
@@ -7469,9 +7264,9 @@ function DialogPrompt(props){return _$createComponent(SingleLinePrompt,_$mergePr
7469
7264
  }},props))
7470
7265
  }
7471
7266
  function DialogConfirm(props){let active=true
7472
- onCleanup31(()=>{active=false
7267
+ onCleanup30(()=>{active=false
7473
7268
  })
7474
- onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7269
+ async function confirm(){const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7475
7270
  })
7476
7271
  if(!active)
7477
7272
  return
@@ -7479,6 +7274,10 @@ if(confirmed)
7479
7274
  props.onConfirm?.()
7480
7275
  else
7481
7276
  props.onCancel?.()
7277
+ }
7278
+ onMount7(()=>{confirm().catch(()=>{if(active)
7279
+ props.onCancel?.()
7280
+ })
7482
7281
  })
7483
7282
  return _$createElement("box")
7484
7283
  }
@@ -7534,7 +7333,7 @@ context.ui.router.navigate({type:"plugin",name,data:params})
7534
7333
  },attention:context.attention,lifecycle:{signal:controller.signal,onDispose},slots:createV2Slots(context,(dispose)=>{onDispose(dispose)
7535
7334
  })
7536
7335
  }
7537
- setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false,commandsReachableOnly:true
7336
+ setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false,commandsReachableOnly:true,nativeTodo:true
7538
7337
  })
7539
7338
  bindToolbarActionState(context,api)
7540
7339
  return{api,async dispose(){controller.abort()
@@ -7648,12 +7447,18 @@ const session=route.type==="session"&&context.data.session.get(route.sessionID)
7648
7447
  const actual=list(target).find((item)=>item.id===skill.id&&item.location===skill.location)
7649
7448
  if(route.type!=="session"||!session||session.location.directory!==target.routing.directory||!actual?.id)
7650
7449
  throw new Error("Skill target changed; select the source again")
7651
- await context.client.session.skill({sessionID:route.sessionID,id:actual.id},{signal})
7450
+ await context.client.experimental.session.skill({sessionID:route.sessionID,id:actual.id},{signal})
7652
7451
  return !signal.aborted
7653
7452
  }}}
7654
7453
  function createV2SubagentSource(context,api){return{list:(parentID)=>context.data.session.list().filter((item)=>item.parentID===parentID).flatMap((item)=>{const value=api.state.session.get(item.id)
7655
7454
  return value?[value]:[]
7656
- }),status:(id)=>api.state.session.status(id)??{type:"idle"},async refresh(parentID,signal){signal.throwIfAborted()
7455
+ }),status:(id)=>api.state.session.status(id)??{type:"idle"},startedAt(id){if(context.data.session.status(id)!=="running")
7456
+ return
7457
+ const time=context.data.session.get(id)?.time
7458
+ if(!time?.busy||time.idle!==undefined&&time.idle>=time.busy)
7459
+ return
7460
+ return time.busy
7461
+ },async refresh(parentID,signal){signal.throwIfAborted()
7657
7462
  let cursor
7658
7463
  do{const page=await context.client.session.list(cursor?{cursor,limit:100}:{parentID,limit:100},{signal
7659
7464
  })
@@ -7675,11 +7480,15 @@ const subagents=createSubagentController(api,{source:nativeSources?.subagents
7675
7480
  })
7676
7481
  const skills=createSkillController(api,nativeSources?.skills)
7677
7482
  const preferences=createPreferencesController(api,config,createPreferencesStore(api.state.path.state),configured)
7483
+ if(hostContext){const setupPath=import.meta.url.includes("/dist/tui.js")?"./native-todo-setup.js":"../native-todo-setup"
7484
+ const setup=await import(setupPath)
7485
+ todo.setup=setup.createOpenCodeV2TodoSetup(hostContext,api,preferences,todo.target)
7486
+ }
7678
7487
  const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js":"../provider-limits"
7679
7488
  const limitsModule=await import(limitsPath)
7680
7489
  const LimitsSection=limitsModule.ProviderLimitsSection
7681
7490
  const{controller:limits,codex,accountSource,selectModel,modelSelection
7682
- }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.24.0",hostContext)
7491
+ }=limitsModule.createProviderQuotaIntegration(api,preferences,"0.26.0",hostContext)
7683
7492
  const mcp=createMcpController(api,preferences.persistMcp,preferences,nativeSources?.mcp)
7684
7493
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont,sidebarShortcutActions(api)))
7685
7494
  const startup=createStartupSessionController(api,preferences)
@@ -7708,7 +7517,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7708
7517
  },interaction,skills,subagents,mcp
7709
7518
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7710
7519
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7711
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.24.0"
7520
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.26.0"
7712
7521
  }),_$createComponent(McpPersistence,{api,controller:mcp
7713
7522
  })]
7714
7523
  }})
@@ -7742,13 +7551,13 @@ return result.data?.type==="text"?result.data.content:undefined
7742
7551
  const updateServices=await loadNavigatorUpdates()
7743
7552
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV1VersionUpdater
7744
7553
  }=updateServices
7745
- const versionStatus=createVersionStatus(api,"0.24.0")
7746
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.24.0"))
7554
+ const versionStatus=createVersionStatus(api,"0.26.0")
7555
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.26.0"))
7747
7556
  bindNavigatorAbout(api,versionStatus,versionUpdates,updateServices)
7748
7557
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7749
7558
  },get multilineCorners(){return preferences.cornerFont
7750
7559
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7751
- },navigatorVersion:"0.24.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7560
+ },navigatorVersion:"0.26.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7752
7561
  },get onNavigatorUpdate(){return versionUpdates.navigator
7753
7562
  }})
7754
7563
  }})
@@ -7765,8 +7574,8 @@ return new TextDecoder().decode(await context.client.file.read({location:context
7765
7574
  const updateServices=await loadNavigatorUpdates()
7766
7575
  const{createVersionStatus,createVersionUpdateActions,createOpenCodeV2VersionUpdater
7767
7576
  }=updateServices
7768
- const versionStatus=createVersionStatus(adapter.api,"0.24.0")
7769
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.24.0"))
7577
+ const versionStatus=createVersionStatus(adapter.api,"0.26.0")
7578
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.26.0"))
7770
7579
  bindNavigatorAbout(adapter.api,versionStatus,versionUpdates,updateServices)
7771
7580
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7772
7581
  },get multilineCorners(){return preferences.cornerFont
@@ -7774,7 +7583,7 @@ const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$create
7774
7583
  _$setProp(_el$,"flexDirection","row")
7775
7584
  _$setProp(_el$,"justifyContent","space-between")
7776
7585
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7777
- },navigatorVersion:"0.24.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7586
+ },navigatorVersion:"0.26.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7778
7587
  },get onNavigatorUpdate(){return versionUpdates.navigator
7779
7588
  }}),null)
7780
7589
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api