opencode-navigator 0.19.1 → 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,10 @@
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
+
5
9
  ## [0.19.1] - 2026-10-02
6
10
 
7
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.
@@ -55,6 +59,7 @@
55
59
 
56
60
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
57
61
 
62
+ [0.19.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.1...v0.19.2
58
63
  [0.19.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.19.0...v0.19.1
59
64
  [0.19.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.2...v0.19.0
60
65
  [0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2
package/README.md CHANGED
@@ -89,7 +89,9 @@ Click a group heading (including Favorites or Ungrouped), or focus it and press
89
89
  `Enter`, to connect its remaining eligible servers. Once none need connecting,
90
90
  the same control disconnects its connected servers. This affects the full group
91
91
  even when a filter or item limit hides some rows; failed operations retain the
92
- usual retry control.
92
+ usual retry control. The heading has no action label: its radio-style icon is
93
+ filled only when every server in the group is connected, empty if any still
94
+ needs connecting, and pending while the group changes.
93
95
 
94
96
  ![MCP group manager](https://raw.githubusercontent.com/St1ggy/opencode-navigator/main/screenshots/31-mcp-groups.png)
95
97
 
package/dist/tui.js CHANGED
@@ -195,6 +195,12 @@ function mcpGroupToggleAction(items){if(items.some((item)=>mcpToggleAction2(item
195
195
  return "connect"
196
196
  return items.some((item)=>mcpToggleAction2(item.status)==="disconnect")?"disconnect":undefined
197
197
  }
198
+ function mcpGroupStatus(items,busy=false){if(busy)
199
+ return "pending"
200
+ if(items.length>0&&items.every((item)=>item.status==="connected"))
201
+ return "connected"
202
+ return items.find((item)=>item.status!=="connected"&&item.status!=="disabled")?.status??"disabled"
203
+ }
198
204
  function buildMcpGroupedView(items,favorites,assignments){return items.map((item)=>({...item,assignedGroup:assignments[item.name],bucket:favorites.has(item.name)?"Favorites":assignments[item.name]??"Ungrouped"
199
205
  })).sort((left,right)=>{const leftRank=BUCKET_RANK[left.bucket]??1
200
206
  const rightRank=BUCKET_RANK[right.bucket]??1
@@ -5687,7 +5693,10 @@ const selected=props.controller.selectedPreset?.(target())
5687
5693
  return selected&&Object.hasOwn(presets,selected)?selected:matchingMcpPreset(list(),presets)
5688
5694
  })
5689
5695
  return{target,favorites,groups,grouped,list,groupNames(bucket){return groupItems(bucket).map((item)=>item.name)
5690
- },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)
5691
5700
  },filtered,visibility,active,state,bulk,bulkRunning,mutationRunning,connectable,disconnectable,errors,presetName
5692
5701
  }}
5693
5702
 
@@ -5780,11 +5789,22 @@ return _el$2
5780
5789
 
5781
5790
 
5782
5791
 
5783
-
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
+ }
5784
5805
  function McpGroupHeader(props){const icons=useIcons()
5785
- const theme=()=>props.api.theme.current
5786
5806
  const id=()=>`${PLUGIN_ID}.mcp.group.${props.bucket}`
5787
- const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled||!props.action,activate:props.onToggle
5807
+ const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,disabled:()=>props.disabled,activate:props.onToggle
5788
5808
  })
5789
5809
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return id()
5790
5810
  },height:1,get marginTop(){return props.marginTop
@@ -5802,15 +5822,14 @@ _$setProp(_el$,"wrapMode","none")
5802
5822
  _$setProp(_el$,"truncate",true)
5803
5823
  _$insert(_el$,()=>props.bucket,_el$2)
5804
5824
  _$insert(_el$,()=>props.count,_el$3)
5805
- _$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))
5806
5826
  return _el$
5807
- })(),(()=>{var _el$4=_$createElement("text")
5827
+ })(),(()=>{var _el$4=_$createElement("text"),_el$5=_$createElement("b")
5828
+ _$insertNode(_el$4,_el$5)
5808
5829
  _$setProp(_el$4,"flexShrink",0)
5809
5830
  _$setProp(_el$4,"wrapMode","none")
5810
- _$insert(_el$4,(()=>{var _c$=_$memo(()=>!!props.action)
5811
- return()=>_c$()?`${icons.icon(props.action === "connect" ? "connected" : "disconnected")} ${props.action === "connect" ? "Connect" : "Disconnect"}`:""
5812
- })())
5813
- _$effect((_$p)=>_$setProp(_el$4,"fg",item.focused()?item.foregroundColor():props.disabled?theme().textMuted:theme().accent,_$p))
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))
5814
5833
  return _el$4
5815
5834
  })()]
5816
5835
  }})
@@ -5822,19 +5841,6 @@ return _el$4
5822
5841
 
5823
5842
 
5824
5843
 
5825
- function mcpColor(api,status){const theme=api.theme.current
5826
- if(status==="connected")
5827
- return theme.success
5828
- if(status==="failed"||status==="needs_client_registration")
5829
- return theme.error
5830
- if(status==="needs_auth")
5831
- return theme.warning
5832
- return theme.textMuted
5833
- }
5834
- function mcpToggle(status,busy){if(busy||status==="pending")
5835
- return "pending"
5836
- return status==="connected"?"connected":"disconnected"
5837
- }
5838
5844
 
5839
5845
 
5840
5846
 
@@ -6096,7 +6102,7 @@ return _el$2
6096
6102
  },get interaction(){return props.interaction
6097
6103
  },get bucket(){return item.bucket
6098
6104
  },get count(){return model.groupNames(item.bucket).length
6099
- },get action(){return model.groupAction(item.bucket)
6105
+ },get status(){return model.groupStatus(item.bucket)
6100
6106
  },get disabled(){return model.bulkRunning()||model.mutationRunning()
6101
6107
  },get marginTop(){return index()>0?1:0
6102
6108
  },get position(){return{section:props.navigationSection,row:9 + index()*3,column:0
@@ -7549,7 +7555,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7549
7555
  },interaction,skills,subagents,mcp
7550
7556
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7551
7557
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7552
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.1"
7558
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.2"
7553
7559
  }),_$createComponent(McpPersistence,{api,controller:mcp
7554
7560
  })]
7555
7561
  }})
@@ -7579,12 +7585,12 @@ throw result.error
7579
7585
  }
7580
7586
  return result.data?.type==="text"?result.data.content:undefined
7581
7587
  })
7582
- const versionStatus=createVersionStatus(api,"0.19.1")
7583
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.1"))
7588
+ const versionStatus=createVersionStatus(api,"0.19.2")
7589
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7584
7590
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7585
7591
  },get multilineCorners(){return preferences.cornerFont
7586
7592
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7587
- },navigatorVersion:"0.19.1",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7593
+ },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7588
7594
  },get onNavigatorUpdate(){return versionUpdates.navigator
7589
7595
  }})
7590
7596
  }})
@@ -7598,15 +7604,15 @@ return
7598
7604
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7599
7605
  }))
7600
7606
  },todo)
7601
- const versionStatus=createVersionStatus(adapter.api,"0.19.1")
7602
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.1"))
7607
+ const versionStatus=createVersionStatus(adapter.api,"0.19.2")
7608
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7603
7609
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7604
7610
  },get multilineCorners(){return preferences.cornerFont
7605
7611
  },get children(){var _el$=_$createElement("box")
7606
7612
  _$setProp(_el$,"flexDirection","row")
7607
7613
  _$setProp(_el$,"justifyContent","space-between")
7608
7614
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7609
- },navigatorVersion:"0.19.1",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7615
+ },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7610
7616
  },get onNavigatorUpdate(){return versionUpdates.navigator
7611
7617
  }}),null)
7612
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.1",
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",