opencode-navigator 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.19.2] - 2026-10-02
6
+
7
+ - Show MCP group connection states with the same radio-style indicators as individual servers, without Connect/Disconnect labels on group headings.
8
+
9
+ ## [0.19.1] - 2026-10-02
10
+
11
+ - Remember the OpenCode 1.x auto-approve mode as a user-wide default for new sessions, including changes made through the host's permission toggle.
12
+
5
13
  ## [0.19.0] - 2026-10-02
6
14
 
7
15
  - Connect or disconnect all eligible MCP servers in a group from its heading, including filtered-out items, with keyboard access and failed-only retry.
@@ -51,6 +59,8 @@
51
59
 
52
60
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
53
61
 
62
+ [0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2
63
+ [0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1
54
64
  [0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0
55
65
  [0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2
56
66
  [0.18.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.0...v0.18.1
package/README.md CHANGED
@@ -89,7 +89,9 @@ Click a group heading (including Favorites or Ungrouped), or focus it and press
89
89
  `Enter`, to connect its remaining eligible servers. Once none need connecting,
90
90
  the same control disconnects its connected servers. This affects the full group
91
91
  even when a filter or item limit hides some rows; failed operations retain the
92
- usual retry control.
92
+ usual retry control. The heading has no action label: its radio-style icon is
93
+ filled only when every server in the group is connected, empty if any still
94
+ needs connecting, and pending while the group changes.
93
95
 
94
96
  ![MCP group manager](https://raw.githubusercontent.com/St1ggy/opencode-navigator/main/screenshots/31-mcp-groups.png)
95
97
 
@@ -338,6 +340,15 @@ Search Everything. Usage never changes the order. Visibility remains independent
338
340
  so any action, including a bookmarked one, can be hidden from the sidebar while it
339
341
  remains searchable. Unavailable actions stay visible with a route- or host-specific reason.
340
342
 
343
+ In OpenCode 1.x, Navigator saves changes to the auto-approve mode as a user-wide
344
+ default, including changes made through OpenCode's own command palette. Set the
345
+ default under **Navigator Settings → Behavior → Default auto-approve permissions**;
346
+ new sessions restore it. Until you set a Navigator default, an explicit OpenCode
347
+ startup mode is respected. OpenCode 2.x owns this setting: use the host Settings
348
+ dialog for the current session and `session.permissions` in the user-wide
349
+ `cli.json` (`"prompt"` or `"autoaccept"`) for its startup default. Restart
350
+ OpenCode after changing `cli.json`.
351
+
341
352
  ## Configuration sources
342
353
 
343
354
  Navigator validates and deep-merges three simultaneous sources in this order:
package/dist/tui.js CHANGED
@@ -1,8 +1,9 @@
1
- import {insert as _$insert,setProp as _$setProp,createElement as _$createElement,createComponent as _$createComponent,mergeProps as _$mergeProps,effect as _$effect,createTextNode as _$createTextNode,insertNode as _$insertNode,memo as _$memo,use as _$use,spread as _$spread,useTerminalDimensions,useTerminalDimensions as useTerminalDimensions2,useTerminalDimensions as useTerminalDimensions3,useTerminalDimensions as useTerminalDimensions4,useTerminalDimensions as useTerminalDimensions5,useTerminalDimensions as useTerminalDimensions6,useTerminalDimensions as useTerminalDimensions7} from "@opentui/solid"
1
+ import {insert as _$insert,setProp as _$setProp,createElement as _$createElement,memo as _$memo,createComponent as _$createComponent,mergeProps as _$mergeProps,effect as _$effect,createTextNode as _$createTextNode,insertNode as _$insertNode,use as _$use,spread as _$spread,useTerminalDimensions,useTerminalDimensions as useTerminalDimensions2,useTerminalDimensions as useTerminalDimensions3,useTerminalDimensions as useTerminalDimensions4,useTerminalDimensions as useTerminalDimensions5,useTerminalDimensions as useTerminalDimensions6,useTerminalDimensions as useTerminalDimensions7} from "@opentui/solid"
2
2
 
3
3
 
4
4
 
5
- import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect4,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect6,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect5,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect7,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect8,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect9,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect10,createMemo as createMemo9,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,createMemo as createMemo8,Show as Show6,onCleanup as onCleanup12,createSignal as createSignal16,createEffect as createEffect11,onCleanup as onCleanup13,onMount as onMount5,onCleanup as onCleanup14,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup15,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createEffect as createEffect12,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal24,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,Show as Show13,createSignal as createSignal23,onCleanup as onCleanup16,For as For14,Show as Show16,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal25,createEffect as createEffect13,onCleanup as onCleanup17,For as For19,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup21,For as For15,Show as Show17,createSignal as createSignal26,createEffect as createEffect14,createMemo as createMemo16,onCleanup as onCleanup18,untrack as untrack5,For as For17,Show as Show20,createEffect as createEffect15,createMemo as createMemo17,createSignal as createSignal27,onCleanup as onCleanup19,untrack as untrack6,For as For16,Show as Show19,Show as Show18,Show as Show24,createEffect as createEffect16,createMemo as createMemo18,createSignal as createSignal28,onCleanup as onCleanup20,untrack as untrack7,For as For18,Show as Show22,Show as Show21,Show as Show23,createEffect as createEffect17,createMemo as createMemo20,onCleanup as onCleanup22,untrack as untrack8,Show as Show25,createMemo as createMemo21,onCleanup as onCleanup23,createSignal as createSignal29,onCleanup as onCleanup24,onMount as onMount7} from "solid-js"
5
+
6
+ import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect4,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect6,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect5,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect7,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect8,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect9,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect10,createMemo as createMemo9,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,createMemo as createMemo8,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect11,onCleanup as onCleanup13,createSignal as createSignal16,createEffect as createEffect12,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createEffect as createEffect13,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal24,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,Show as Show13,createSignal as createSignal23,onCleanup as onCleanup17,For as For14,Show as Show16,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal25,createEffect as createEffect14,onCleanup as onCleanup18,For as For19,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For15,Show as Show17,createSignal as createSignal26,createEffect as createEffect15,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack5,For as For17,Show as Show20,createEffect as createEffect16,createMemo as createMemo17,createSignal as createSignal27,onCleanup as onCleanup20,untrack as untrack6,For as For16,Show as Show19,Show as Show18,Show as Show24,createEffect as createEffect17,createMemo as createMemo18,createSignal as createSignal28,onCleanup as onCleanup21,untrack as untrack7,For as For18,Show as Show22,Show as Show21,Show as Show23,createEffect as createEffect18,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack8,Show as Show25,createMemo as createMemo21,onCleanup as onCleanup24,createSignal as createSignal29,onCleanup as onCleanup25,onMount as onMount7} from "solid-js"
6
7
  var SIDEBAR_SECTIONS=["todo","subagents","skills","quick_actions","lsp","mcp"]
7
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"]
8
9
  function preferencesScope(path){return path.worktree||path.directory||"global"
@@ -194,6 +195,12 @@ function mcpGroupToggleAction(items){if(items.some((item)=>mcpToggleAction2(item
194
195
  return "connect"
195
196
  return items.some((item)=>mcpToggleAction2(item.status)==="disconnect")?"disconnect":undefined
196
197
  }
198
+ function mcpGroupStatus(items,busy=false){if(busy)
199
+ return "pending"
200
+ if(items.length>0&&items.every((item)=>item.status==="connected"))
201
+ return "connected"
202
+ return items.find((item)=>item.status!=="connected"&&item.status!=="disabled")?.status??"disabled"
203
+ }
197
204
  function buildMcpGroupedView(items,favorites,assignments){return items.map((item)=>({...item,assignedGroup:assignments[item.name],bucket:favorites.has(item.name)?"Favorites":assignments[item.name]??"Ungrouped"
198
205
  })).sort((left,right)=>{const leftRank=BUCKET_RANK[left.bucket]??1
199
206
  const rightRank=BUCKET_RANK[right.bucket]??1
@@ -1252,7 +1259,8 @@ const workspaceProfiles=parseWorkspaceProfiles(userInput?.workspaceProfiles)
1252
1259
  return{global:{...Object.keys(behavior).length>0&&{behavior},...layout&&{layout},...Object.keys(globalMcp).length>0&&{mcp:globalMcp}},worktrees,user:{...skippedSkillConfirmations&&{skippedSkillConfirmations},...typeof userInput?.onboardingCompleted==="boolean"&&{onboardingCompleted:userInput.onboardingCompleted
1253
1260
  },...typeof userInput?.lastNavigatorVersion==="string"&&{lastNavigatorVersion:userInput.lastNavigatorVersion
1254
1261
  },...typeof userInput?.previousNavigatorVersion==="string"&&{previousNavigatorVersion:userInput.previousNavigatorVersion
1255
- },...Object.keys(layoutPresets).length>0&&{layoutPresets},...Object.keys(mcpPresets).length>0&&{mcpPresets},...favoriteSkills&&{favoriteSkills},...favoriteMcpServers?.length&&{favoriteMcpServers},...favoriteQuickActions.length>0&&{favoriteQuickActions},...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups},...Object.keys(skillGroups).length>0&&{skillGroups},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles}}}}
1262
+ },...Object.keys(layoutPresets).length>0&&{layoutPresets},...Object.keys(mcpPresets).length>0&&{mcpPresets},...favoriteSkills&&{favoriteSkills},...favoriteMcpServers?.length&&{favoriteMcpServers},...favoriteQuickActions.length>0&&{favoriteQuickActions},...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups},...Object.keys(skillGroups).length>0&&{skillGroups},...typeof userInput?.autoApprovePermissions==="boolean"&&{autoApprovePermissions:userInput.autoApprovePermissions
1263
+ },...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles}}}}
1256
1264
  function parseValues(value){if(!value)
1257
1265
  return{}
1258
1266
  return{behavior:parsePluginSettings(value.behavior),layout:{sections:parseSectionPreferences(value.layout?.sections),expanded:parseSectionPreferences(value.layout?.expanded),...parseSectionOrder(value.layout?.order)&&{order:parseSectionOrder(value.layout?.order)}},desiredMcpStates:parseDesiredMcpStates(value.desiredMcpStates)
@@ -1414,7 +1422,8 @@ return{global:target.kind==="global"?scope:current.global,worktrees,user:{...ski
1414
1422
  },...(update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion)&&{previousNavigatorVersion:update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion
1415
1423
  },...Object.keys(parsedLayoutPresets).length>0&&{layoutPresets:parsedLayoutPresets},...Object.keys(parsedMcpPresets).length>0&&{mcpPresets:parsedMcpPresets},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles:parseWorkspaceProfiles(workspaceProfiles)
1416
1424
  },...favoriteSkills.length>0&&{favoriteSkills},...favoriteMcpServers.size>0&&{favoriteMcpServers:[...favoriteMcpServers].sort()},...favoriteQuickActions.size>0&&{favoriteQuickActions:parseFavoriteQuickActions([...favoriteQuickActions])
1417
- },...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups:parseMcpServerGroups(mcpServerGroups)},...Object.keys(skillGroups).length>0&&{skillGroups:parseSkillGroups(skillGroups)}}}}
1425
+ },...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups:parseMcpServerGroups(mcpServerGroups)},...Object.keys(skillGroups).length>0&&{skillGroups:parseSkillGroups(skillGroups)},...typeof (update.user?.autoApprovePermissions??current.user.autoApprovePermissions)==="boolean"&&{autoApprovePermissions:update.user?.autoApprovePermissions??current.user.autoApprovePermissions
1426
+ }}}}
1418
1427
  function targetForLegacyScope(scope){return scope==="global"?{kind:"global"}:{kind:"worktree",key:scope}}
1419
1428
  function createPreferencesStore(stateDirectory){const directory=join(stateDirectory,LEGACY_PLUGIN_ID)
1420
1429
  const file=join(directory,"preferences.json")
@@ -1583,6 +1592,7 @@ const [recentSkills,setRecentSkills]=createSignal4([])
1583
1592
  const [recentQuickActions,setRecentQuickActions]=createSignal4([])
1584
1593
  const [mcpServerGroups,setMcpServerGroups]=createSignal4(configured.mcpServerGroups??{})
1585
1594
  const [skillGroups,setSkillGroups]=createSignal4({})
1595
+ const [autoApprovePermissions,setAutoApprovePermissions]=createSignal4()
1586
1596
  const [ready,setReady]=createSignal4(false)
1587
1597
  const [revision,setRevision]=createSignal4(0)
1588
1598
  const sessionLayouts=new Map
@@ -1651,6 +1661,7 @@ setRecentSkills(value.user.recentSkills??[])
1651
1661
  setRecentQuickActions(value.user.recentQuickActions??[])
1652
1662
  setMcpServerGroups({...configured.mcpServerGroups,...value.user.mcpServerGroups})
1653
1663
  setSkillGroups(value.user.skillGroups??{})
1664
+ setAutoApprovePermissions(value.user.autoApprovePermissions)
1654
1665
  setReady(true)
1655
1666
  refreshResolved()
1656
1667
  }
@@ -1763,6 +1774,14 @@ return
1763
1774
  setSkillGroups(assignGroup(skillGroups(),location,value))
1764
1775
  update({user:{skillGroup:{location,group:value}}})
1765
1776
  }
1777
+ function changeAutoApprovePermissions(value){if(!isHydrated){load().then(()=>changeAutoApprovePermissions(value))
1778
+ return
1779
+ }
1780
+ if(autoApprovePermissions()===value)
1781
+ return
1782
+ setAutoApprovePermissions(value)
1783
+ update({user:{autoApprovePermissions:value}})
1784
+ }
1766
1785
  function toggleFavoriteMcpServer(name){if(!isHydrated){load().then(()=>toggleFavoriteMcpServer(name))
1767
1786
  return
1768
1787
  }
@@ -1833,7 +1852,7 @@ throw new Error("MCP preset no longer exists")
1833
1852
  update({user:{workspaceProfile:{layout,mcp}}})
1834
1853
  },favoriteSkills,favoriteMcpServers,favoriteQuickActions,toggleFavoriteMcpServer,toggleFavoriteQuickAction,recentSkills,recentQuickActions,mcpServerGroups,setMcpServerGroup(name,value){setMcpServerGroups(assignGroup(mcpServerGroups(),name,value))
1835
1854
  update({user:{mcpServerGroup:{name,group:value}}})
1836
- },skillGroups,setSkillGroup:changeSkillGroup,async recordSkillUse(skill){await load()
1855
+ },skillGroups,setSkillGroup:changeSkillGroup,autoApprovePermissions,setAutoApprovePermissions:changeAutoApprovePermissions,async recordSkillUse(skill){await load()
1837
1856
  if(!skill.location)
1838
1857
  return
1839
1858
  setRecentSkills(parseRecentSkills([skill.location,...recentSkills()]))
@@ -3386,6 +3405,8 @@ return section!=="todo"&&section!=="lsp"?true:current[section]
3386
3405
  }
3387
3406
  function supportsTitleVisibility(api){return hostCapabilities(api).titleVisibility!==false
3388
3407
  }
3408
+ function supportsPermissionMode(api){return hostCapabilities(api).permissionMode!==false
3409
+ }
3389
3410
  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."}]
3390
3411
  },{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."
3391
3412
  },{icon:"history",title:"Direct navigation",description:"Open a child session without leaving your workflow."
@@ -4166,6 +4187,11 @@ return [{title:`${icons.icon(title ? "checked" : "unchecked")} Session title`,va
4166
4187
  }]
4167
4188
  }
4168
4189
  function createSettingsGroups(api,preferences,icons){const supportedSections=()=>SIDEBAR_SECTIONS.filter((name)=>supportsSidebarSection(api,name))
4190
+ const permissionDefaultDescription=()=>{const value=preferences.autoApprovePermissions()
4191
+ if(value===undefined)
4192
+ return "follow OpenCode startup mode"
4193
+ return value?"on for new sessions":"off for new sessions"
4194
+ }
4169
4195
  const groups=createMemo7(()=>[{id:"scope",tab:"Scope",title:"Preference scope",options:[{title:`${icons.icon(preferences.preferenceScope() === "global" ? "radioOn" : "radioOff")} Global`,value:"scope:global",description:"applies to every worktree"
4170
4196
  },{title:`${icons.icon(preferences.preferenceScope() === "worktree" ? "radioOn" : "radioOff")} Current worktree`,value:"scope:worktree",description:preferences.canUseWorktreeScope()?preferences.preferenceScopeLabel():"unavailable outside a worktree"
4171
4197
  }]
@@ -4175,7 +4201,8 @@ const groups=createMemo7(()=>[{id:"scope",tab:"Scope",title:"Preference scope",o
4175
4201
  },{id:"sections",tab:"Sections",title:"Sections & order",options:[...titleVisibilityOptions(api,preferences,icons),...preferences.selectedSectionOrder().filter((name)=>supportsSidebarSection(api,name)).map((name,index)=>{const section=SECTION_DEFINITIONS.find((candidate)=>candidate.name===name)
4176
4202
  return{title:`${icons.icon(preferences.selectedSections()[section.name] ? "checked" : "unchecked")} ${index + 1}. ${icons.section(section.name)} ${section.label}`,value:section.name,description:preferences.selectedSections()[section.name]?"visible":"hidden"
4177
4203
  }})]
4178
- },{id:"behavior",tab:"Behavior",title:"Behavior",options:[{title:`${icons.icon(preferences.selectedStartInChat() ? "checked" : "unchecked")} Start new sessions in chat`,value:"start_in_chat",description:preferences.selectedStartInChat()?"skip Home \xB7 on":"show Home \xB7 off"
4204
+ },{id:"behavior",tab:"Behavior",title:"Behavior",options:[...supportsPermissionMode(api)?[{title:`${icons.icon(preferences.autoApprovePermissions() === true ? "checked" : "unchecked")} Default auto-approve permissions`,value:"auto_approve_permissions",description:permissionDefaultDescription()
4205
+ }]:[],{title:`${icons.icon(preferences.selectedStartInChat() ? "checked" : "unchecked")} Start new sessions in chat`,value:"start_in_chat",description:preferences.selectedStartInChat()?"skip Home \xB7 on":"show Home \xB7 off"
4179
4206
  },{title:`${icons.icon(preferences.selectedPersistMcp() ? "checked" : "unchecked")} Remember MCP states`,value:"persist_mcp",description:preferences.selectedPersistMcp()?"on":"off"
4180
4207
  },{title:`${icons.icon("settings")} Icon style`,value:"lsp_icon_style",description:preferences.selectedLspIconStyle()==="nerd"?"Nerd Font":"Text fallback"
4181
4208
  },{title:`${icons.icon(preferences.selectedCornerFont() ? "checked" : "unchecked")} Multiline corner font`,value:"corner_font",description:preferences.selectedCornerFont()?"Installed":"Not installed \xB7 rectangular highlights"
@@ -4345,6 +4372,9 @@ break
4345
4372
  case "start_in_chat":{input.preferences.toggleStartInChat()
4346
4373
  break
4347
4374
  }
4375
+ case "auto_approve_permissions":{input.preferences.setAutoApprovePermissions(input.preferences.autoApprovePermissions()!==true)
4376
+ break
4377
+ }
4348
4378
  case "lsp_icon_style":{input.preferences.toggleLspIconStyle()
4349
4379
  break
4350
4380
  }
@@ -4674,6 +4704,42 @@ return _$createElement("box")
4674
4704
  }
4675
4705
 
4676
4706
 
4707
+ function currentPermissionMode(api){const title=api.keymap.getCommands?.({visibility:"registered"
4708
+ }).find((command)=>command.name==="permission.mode")?.title
4709
+ if(typeof title!=="string")
4710
+ return
4711
+ if(title.startsWith("Disable auto-approve permissions"))
4712
+ return true
4713
+ return title.startsWith("Enable auto-approve permissions")?false:undefined
4714
+ }
4715
+ function PermissionModeBinding(props){let applying=false
4716
+ let observed
4717
+ createEffect11(()=>{if(!props.preferences.ready())
4718
+ return
4719
+ const preferred=props.preferences.autoApprovePermissions()
4720
+ const current=currentPermissionMode(props.api)
4721
+ observed=current
4722
+ if(preferred===undefined||current===undefined||current===preferred)
4723
+ return
4724
+ applying=true
4725
+ try{props.api.keymap.dispatchCommand("permission.mode")
4726
+ observed=currentPermissionMode(props.api)
4727
+ } finally{applying=false
4728
+ }})
4729
+ const unsubscribe=props.api.keymap.on?.("state",()=>{if(applying||!props.preferences.ready())
4730
+ return
4731
+ const current=currentPermissionMode(props.api)
4732
+ if(current===undefined||current===observed)
4733
+ return
4734
+ observed=current
4735
+ props.preferences.setAutoApprovePermissions(current)
4736
+ })
4737
+ if(unsubscribe)
4738
+ onCleanup13(unsubscribe)
4739
+ return _$createElement("box")
4740
+ }
4741
+
4742
+
4677
4743
 
4678
4744
  function SettingsFooterButton(props){const icons=useIcons()
4679
4745
  const [hovered,setHovered]=createSignal16(false)
@@ -4745,17 +4811,17 @@ function StartupSessionBinding(props){if(props.api.keymap.on){const unregister=p
4745
4811
  return
4746
4812
  queueMicrotask(()=>void props.controller.start())
4747
4813
  })
4748
- onCleanup13(unregister)
4814
+ onCleanup14(unregister)
4749
4815
  } else
4750
- createEffect11(()=>{if(!props.controller.enabled())
4816
+ createEffect12(()=>{if(!props.controller.enabled())
4751
4817
  return
4752
4818
  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()
4753
4819
  }]
4754
4820
  })
4755
- onCleanup13(unregister)
4821
+ onCleanup14(unregister)
4756
4822
  })
4757
4823
  onMount5(()=>void props.controller.initialize())
4758
- onCleanup13(props.controller.dispose)
4824
+ onCleanup14(props.controller.dispose)
4759
4825
  return _$createElement("box")
4760
4826
  }
4761
4827
  function versionParts(value){const match=/^v?(\d+)\.(\d+)\.(\d+)(?:-([^+]+))?/.exec(value)
@@ -4889,7 +4955,7 @@ if(entries.length===0||disposed)
4889
4955
  return
4890
4956
  show()
4891
4957
  } catch{}})
4892
- onCleanup14(()=>{disposed=true
4958
+ onCleanup15(()=>{disposed=true
4893
4959
  clearTimeout(pending)
4894
4960
  })
4895
4961
  return _$createElement("box")
@@ -5339,7 +5405,7 @@ const colors=()=>sidebarInteractiveColors(api.theme.current,{focused:focused(),h
5339
5405
  const ref=(renderable)=>{unregister?.()
5340
5406
  unregister=interaction?.register({...descriptor,renderable})
5341
5407
  }
5342
- onCleanup15(()=>unregister?.())
5408
+ onCleanup16(()=>unregister?.())
5343
5409
  return{ref,disabled,focused,backgroundColor:()=>colors().backgroundColor,foregroundColor:()=>colors().foregroundColor,onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),select(event){interaction?.mouseSelect(descriptor.id,event)
5344
5410
  },activate(event){if(interaction)
5345
5411
  return interaction.mouseActivate(descriptor.id,event)
@@ -5484,7 +5550,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`sect
5484
5550
  const action=props.headerAction?useSidebarItem(props.api,props.interaction,{id:props.headerAction.id,position:()=>({section:props.navigationSection??0,row:0,column:1
5485
5551
  }),disabled:props.headerAction.disabled,activate:props.headerAction.onActivate
5486
5552
  },()=>theme().accent,"control"):undefined
5487
- createEffect12(()=>{props.headerAction?.label()
5553
+ createEffect13(()=>{props.headerAction?.label()
5488
5554
  setActionWidth(undefined)
5489
5555
  })
5490
5556
  const actionLabel=()=>{const label=props.headerAction?.label()??""
@@ -5627,7 +5693,10 @@ const selected=props.controller.selectedPreset?.(target())
5627
5693
  return selected&&Object.hasOwn(presets,selected)?selected:matchingMcpPreset(list(),presets)
5628
5694
  })
5629
5695
  return{target,favorites,groups,grouped,list,groupNames(bucket){return groupItems(bucket).map((item)=>item.name)
5630
- },groupAction(bucket){return mcpGroupToggleAction(groupItems(bucket))
5696
+ },groupStatus(bucket){const items=groupItems(bucket)
5697
+ const operation=bulk()
5698
+ const busy=operation.status==="running"&&"group" in operation&&operation.group===bucket||items.some((item)=>["loading","refreshing"].includes(props.controller.serverState(item.name,target()).status))
5699
+ return mcpGroupStatus(items,busy)
5631
5700
  },filtered,visibility,active,state,bulk,bulkRunning,mutationRunning,connectable,disconnectable,errors,presetName
5632
5701
  }}
5633
5702
 
@@ -5720,11 +5789,22 @@ return _el$2
5720
5789
 
5721
5790
 
5722
5791
 
5723
-
5792
+ function mcpColor(api,status){const theme=api.theme.current
5793
+ if(status==="connected")
5794
+ return theme.success
5795
+ if(status==="failed"||status==="needs_client_registration")
5796
+ return theme.error
5797
+ if(status==="needs_auth")
5798
+ return theme.warning
5799
+ return theme.textMuted
5800
+ }
5801
+ function mcpToggle(status,busy){if(busy||status==="pending")
5802
+ return "pending"
5803
+ return status==="connected"?"connected":"disconnected"
5804
+ }
5724
5805
  function McpGroupHeader(props){const icons=useIcons()
5725
- const theme=()=>props.api.theme.current
5726
5806
  const id=()=>`${PLUGIN_ID}.mcp.group.${props.bucket}`
5727
- const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled||!props.action,activate:props.onToggle
5807
+ const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled,activate:props.onToggle
5728
5808
  })
5729
5809
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return id()
5730
5810
  },height:1,get marginTop(){return props.marginTop
@@ -5742,15 +5822,14 @@ _$setProp(_el$,"wrapMode","none")
5742
5822
  _$setProp(_el$,"truncate",true)
5743
5823
  _$insert(_el$,()=>props.bucket,_el$2)
5744
5824
  _$insert(_el$,()=>props.count,_el$3)
5745
- _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():theme().textMuted,_$p))
5825
+ _$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():props.api.theme.current.textMuted,_$p))
5746
5826
  return _el$
5747
- })(),(()=>{var _el$4=_$createElement("text")
5827
+ })(),(()=>{var _el$4=_$createElement("text"),_el$5=_$createElement("b")
5828
+ _$insertNode(_el$4,_el$5)
5748
5829
  _$setProp(_el$4,"flexShrink",0)
5749
5830
  _$setProp(_el$4,"wrapMode","none")
5750
- _$insert(_el$4,(()=>{var _c$=_$memo(()=>!!props.action)
5751
- return()=>_c$()?`${icons.icon(props.action === "connect" ? "connected" : "disconnected")} ${props.action === "connect" ? "Connect" : "Disconnect"}`:""
5752
- })())
5753
- _$effect((_$p)=>_$setProp(_el$4,"fg",item.focused()?item.foregroundColor():props.disabled?theme().textMuted:theme().accent,_$p))
5831
+ _$insert(_el$5,()=>icons.icon(mcpToggle(props.status,false)))
5832
+ _$effect((_$p)=>_$setProp(_el$4,"fg",item.focused()?item.foregroundColor():mcpColor(props.api,props.status),_$p))
5754
5833
  return _el$4
5755
5834
  })()]
5756
5835
  }})
@@ -5762,19 +5841,6 @@ return _el$4
5762
5841
 
5763
5842
 
5764
5843
 
5765
- function mcpColor(api,status){const theme=api.theme.current
5766
- if(status==="connected")
5767
- return theme.success
5768
- if(status==="failed"||status==="needs_client_registration")
5769
- return theme.error
5770
- if(status==="needs_auth")
5771
- return theme.warning
5772
- return theme.textMuted
5773
- }
5774
- function mcpToggle(status,busy){if(busy||status==="pending")
5775
- return "pending"
5776
- return status==="connected"?"connected":"disconnected"
5777
- }
5778
5844
 
5779
5845
 
5780
5846
 
@@ -5946,7 +6012,7 @@ props.interaction.leaveFilter(input)
5946
6012
  else
5947
6013
  input?.blur()
5948
6014
  }
5949
- onCleanup16(()=>unregisterInput?.())
6015
+ onCleanup17(()=>unregisterInput?.())
5950
6016
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
5951
6017
  },flexDirection:"row",gap:1,marginTop:1,marginBottom:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>!!highlighted())()?theme().primary:item.backgroundColor()
5952
6018
  },get onMouseOver(){return item.onMouseOver
@@ -6036,7 +6102,7 @@ return _el$2
6036
6102
  },get interaction(){return props.interaction
6037
6103
  },get bucket(){return item.bucket
6038
6104
  },get count(){return model.groupNames(item.bucket).length
6039
- },get action(){return model.groupAction(item.bucket)
6105
+ },get status(){return model.groupStatus(item.bucket)
6040
6106
  },get disabled(){return model.bulkRunning()||model.mutationRunning()
6041
6107
  },get marginTop(){return index()>0?1:0
6042
6108
  },get position(){return{section:props.navigationSection,row:9 + index()*3,column:0
@@ -6309,8 +6375,8 @@ unregisterBinding=undefined
6309
6375
  unregisterCommands()
6310
6376
  }}}
6311
6377
  function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
6312
- createEffect13(()=>shortcuts.bind(props.preferences.toggleKey()))
6313
- onCleanup17(shortcuts.dispose)
6378
+ createEffect14(()=>shortcuts.bind(props.preferences.toggleKey()))
6379
+ onCleanup18(shortcuts.dispose)
6314
6380
  return _$createElement("box")
6315
6381
  }
6316
6382
  function SidebarFocusBinding(props){const commands=props.interaction.baseCommands()
@@ -6318,11 +6384,11 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6318
6384
  })=>({name:name.replace(PLUGIN_ID,()=>LEGACY_PLUGIN_ID),run,enabled
6319
6385
  }))]
6320
6386
  })
6321
- onCleanup17(unregisterCommands)
6322
- createEffect13(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6387
+ onCleanup18(unregisterCommands)
6388
+ createEffect14(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6323
6389
  }]
6324
6390
  })
6325
- onCleanup17(unregister)
6391
+ onCleanup18(unregister)
6326
6392
  })
6327
6393
  return _$createElement("box")
6328
6394
  }
@@ -6353,9 +6419,9 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
6353
6419
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
6354
6420
  })
6355
6421
  const state=createMemo16(()=>props.controller.state(target()))
6356
- createEffect14(()=>{const current=target()
6422
+ createEffect15(()=>{const current=target()
6357
6423
  const deactivate=untrack5(()=>props.controller.activate?.(current)??(()=>{}))
6358
- onCleanup18(deactivate)
6424
+ onCleanup19(deactivate)
6359
6425
  untrack5(()=>void props.controller.refresh(current).catch(()=>{}))
6360
6426
  })
6361
6427
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
@@ -6516,11 +6582,11 @@ const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["erro
6516
6582
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
6517
6583
  const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
6518
6584
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6519
- createEffect15(()=>{targetKey()
6585
+ createEffect16(()=>{targetKey()
6520
6586
  setQuery("")
6521
6587
  setMode("all")
6522
6588
  })
6523
- createEffect15(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6589
+ createEffect16(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6524
6590
  setMode("all")
6525
6591
  })
6526
6592
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
@@ -6530,10 +6596,10 @@ const now=createSubagentClock(clockKey)
6530
6596
  const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
6531
6597
  const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
6532
6598
  const state=createMemo17(()=>props.controller.state(props.sessionID))
6533
- createEffect15(()=>{const sessionID=props.sessionID
6599
+ createEffect16(()=>{const sessionID=props.sessionID
6534
6600
  targetKey()
6535
6601
  const deactivate=untrack6(()=>props.controller.activate?.(sessionID)??(()=>{}))
6536
- onCleanup19(deactivate)
6602
+ onCleanup20(deactivate)
6537
6603
  untrack6(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6538
6604
  })
6539
6605
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
@@ -6880,19 +6946,19 @@ const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6880
6946
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6881
6947
  const [mode,setMode]=createSignal28("all")
6882
6948
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6883
- createEffect16(()=>{targetKey()
6949
+ createEffect17(()=>{targetKey()
6884
6950
  setMode("all")
6885
6951
  })
6886
6952
  const view=createMemo18(()=>buildTodoView(list(),mode()))
6887
6953
  const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
6888
6954
  })
6889
6955
  const state=createMemo18(()=>props.controller.state(props.sessionID))
6890
- createEffect16(()=>{const sessionID=props.sessionID
6956
+ createEffect17(()=>{const sessionID=props.sessionID
6891
6957
  targetKey()
6892
6958
  if(unavailable())
6893
6959
  return
6894
6960
  const deactivate=untrack7(()=>props.controller.activate?.(sessionID)??(()=>{}))
6895
- onCleanup20(deactivate)
6961
+ onCleanup21(deactivate)
6896
6962
  untrack7(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6897
6963
  })
6898
6964
  const navigationSection=()=>props.navigationSection??1
@@ -6949,7 +7015,7 @@ return _el$4
6949
7015
  }
6950
7016
  function SidebarContent(props){const sections=props.preferences.sections
6951
7017
  const visibleSections=createMemo19(()=>props.preferences.sectionOrder().filter((section)=>sections()[section]&&supportsSidebarSection(props.api,section)))
6952
- onCleanup21(()=>props.interaction.setContentRoot(undefined))
7018
+ onCleanup22(()=>props.interaction.setContentRoot(undefined))
6953
7019
  return(()=>{var _el$=_$createElement("box")
6954
7020
  _$use((node)=>props.interaction.setContentRoot(node),_el$)
6955
7021
  _$setProp(_el$,"id",`${PLUGIN_ID}.root`)
@@ -6996,7 +7062,7 @@ return _el$
6996
7062
 
6997
7063
 
6998
7064
  function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
6999
- createEffect17(()=>{if(!props.api.state.ready)
7065
+ createEffect18(()=>{if(!props.api.state.ready)
7000
7066
  return
7001
7067
  persist()
7002
7068
  const route=props.api.route.current
@@ -7004,12 +7070,12 @@ const params="params" in route?route.params:undefined
7004
7070
  if(typeof params?.sessionID!=="string")
7005
7071
  return
7006
7072
  const current=props.controller.target()
7007
- onCleanup22(()=>props.controller.deactivate(current))
7073
+ onCleanup23(()=>props.controller.deactivate(current))
7008
7074
  untrack8(()=>void props.controller.activate(current).catch(()=>{}))
7009
7075
  })
7010
7076
  return _$createElement("box")
7011
7077
  }
7012
- function PreferencesPersistence(props){createEffect17(()=>{const location=currentLocation(props.api)
7078
+ function PreferencesPersistence(props){createEffect18(()=>{const location=currentLocation(props.api)
7013
7079
  untrack8(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
7014
7080
  })))
7015
7081
  props.controller.load()
@@ -7017,7 +7083,7 @@ props.controller.load()
7017
7083
  return _$createElement("box")
7018
7084
  }
7019
7085
  function FirstRunWizardPersistence(props){let isChecked=false
7020
- createEffect17(()=>{if(isChecked)
7086
+ createEffect18(()=>{if(isChecked)
7021
7087
  return
7022
7088
  isChecked=true
7023
7089
  showFirstRunWizard(props.api,props.preferences).catch(()=>{})
@@ -7044,7 +7110,7 @@ const settingsId=`${PLUGIN_ID}.settings`
7044
7110
  const settings=useSidebarItem(props.api,props.interaction,{id:settingsId,position:{section:0,row:0,column:0
7045
7111
  },activate:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
7046
7112
  },()=>theme().textMuted,"control")
7047
- onCleanup23(()=>props.interaction.setTitleRoot(undefined))
7113
+ onCleanup24(()=>props.interaction.setTitleRoot(undefined))
7048
7114
  return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box"),_el$3=_$createElement("box")
7049
7115
  _$insertNode(_el$,_el$2)
7050
7116
  _$use((node)=>props.interaction.setTitleRoot(node),_el$)
@@ -7307,7 +7373,7 @@ function legacyTheme(theme){return{primary:theme.hue.interactive[200],secondary:
7307
7373
 
7308
7374
  function createV2UI(context){let dialogOpen=false
7309
7375
  function DialogPrompt(props){let active=true
7310
- onCleanup24(()=>{active=false
7376
+ onCleanup25(()=>{active=false
7311
7377
  })
7312
7378
  onMount7(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7313
7379
  })
@@ -7321,7 +7387,7 @@ props.onConfirm?.(value)
7321
7387
  return _$createElement("box")
7322
7388
  }
7323
7389
  function DialogConfirm(props){let active=true
7324
- onCleanup24(()=>{active=false
7390
+ onCleanup25(()=>{active=false
7325
7391
  })
7326
7392
  onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7327
7393
  })
@@ -7386,7 +7452,7 @@ context.ui.router.navigate({type:"plugin",name,data:params})
7386
7452
  },attention:context.attention,lifecycle:{signal:controller.signal,onDispose}}
7387
7453
  api.slots=createV2Slots(context,keymap,(dispose)=>{onDispose(dispose)
7388
7454
  })
7389
- setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false
7455
+ setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false
7390
7456
  })
7391
7457
  return{api,async dispose(){controller.abort()
7392
7458
  for(let index=disposers.length-1;index>=0; index--)
@@ -7481,14 +7547,15 @@ api.lifecycle.onDispose(unsubscribeConnected)
7481
7547
  api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7482
7548
  },get multilineCorners(){return preferences.cornerFont
7483
7549
  },get children(){return [_$createComponent(PreferencesPersistence,{api,controller:preferences
7484
- }),_$createComponent(SettingsBinding,{api,preferences,mcp,skills
7550
+ }),_$memo(()=>_$memo(()=>!!supportsPermissionMode(api))()&&_$createComponent(PermissionModeBinding,{api,preferences
7551
+ })),_$createComponent(SettingsBinding,{api,preferences,mcp,skills
7485
7552
  }),_$createComponent(SidebarToggleBinding,{api,preferences
7486
7553
  }),_$createComponent(SidebarFocusBinding,{api,preferences,interaction
7487
7554
  }),_$createComponent(SearchBinding,{api,preferences,get onNewSession(){return startup.handleNewSession
7488
7555
  },interaction,skills,subagents,mcp
7489
7556
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7490
7557
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7491
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.0"
7558
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.2"
7492
7559
  }),_$createComponent(McpPersistence,{api,controller:mcp
7493
7560
  })]
7494
7561
  }})
@@ -7518,12 +7585,12 @@ throw result.error
7518
7585
  }
7519
7586
  return result.data?.type==="text"?result.data.content:undefined
7520
7587
  })
7521
- const versionStatus=createVersionStatus(api,"0.19.0")
7522
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.0"))
7588
+ const versionStatus=createVersionStatus(api,"0.19.2")
7589
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7523
7590
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7524
7591
  },get multilineCorners(){return preferences.cornerFont
7525
7592
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7526
- },navigatorVersion:"0.19.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7593
+ },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7527
7594
  },get onNavigatorUpdate(){return versionUpdates.navigator
7528
7595
  }})
7529
7596
  }})
@@ -7537,15 +7604,15 @@ return
7537
7604
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7538
7605
  }))
7539
7606
  },todo)
7540
- const versionStatus=createVersionStatus(adapter.api,"0.19.0")
7541
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.0"))
7607
+ const versionStatus=createVersionStatus(adapter.api,"0.19.2")
7608
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7542
7609
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7543
7610
  },get multilineCorners(){return preferences.cornerFont
7544
7611
  },get children(){var _el$=_$createElement("box")
7545
7612
  _$setProp(_el$,"flexDirection","row")
7546
7613
  _$setProp(_el$,"justifyContent","space-between")
7547
7614
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7548
- },navigatorVersion:"0.19.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7615
+ },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7549
7616
  },get onNavigatorUpdate(){return versionUpdates.navigator
7550
7617
  }}),null)
7551
7618
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-navigator",
4
- "version": "0.19.0",
4
+ "version": "0.19.2",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",