opencode-navigator 0.18.0 → 0.18.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,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [0.18.2] - 2026-10-02
6
+
7
+ - Open the host Settings dialog from the OpenCode 2.x Permissions Quick Action, where the user can change between `prompt` and `auto accept`; keep the direct auto-approve toggle on OpenCode 1.x.
8
+
9
+ ## [0.18.1] - 2026-10-01
10
+
11
+ - Show calm Todo setup guidance in OpenCode 2.x when Navigator's server plugin is absent, without a request error or Retry control. Actual server failures still offer Retry.
12
+ - Keep Quick Action names readable in narrow sidebars by placing unavailable reasons below them and showing shortcuts only when they fit.
13
+
5
14
  ## [0.18.0] - 2026-10-01
6
15
 
7
16
  - Add durable per-session Todo lists to OpenCode 2.x through a separately configured Navigator server plugin and an agent Todo tool.
@@ -36,6 +45,8 @@
36
45
 
37
46
  Earlier release notes are available on [GitHub Releases](https://github.com/St1ggy/opencode-navigator/releases).
38
47
 
48
+ [0.18.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.1...v0.18.2
49
+ [0.18.1]: https://github.com/St1ggy/opencode-navigator/compare/v0.18.0...v0.18.1
39
50
  [0.18.0]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.3...v0.18.0
40
51
  [0.17.3]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.2...v0.17.3
41
52
  [0.17.2]: https://github.com/St1ggy/opencode-navigator/compare/v0.17.1...v0.17.2
package/README.md CHANGED
@@ -15,7 +15,7 @@ See the [changelog](CHANGELOG.md) for release-by-release changes.
15
15
  - Collapsible Todo section with status filters, grouped tasks, progress and priority indicators; OpenCode 2 adds session-owned tasks and optional model-context instructions
16
16
  - Active subagent list with live statuses and click-to-open navigation, including dev-team workers running in separate local processes
17
17
  - Compact, searchable workspace skill list with user-wide favorites, recent skills, source details, and click-to-confirm slash commands
18
- - Configurable host quick actions, including the auto-approve toggle, with user-wide bookmarks and availability reasons
18
+ - Configurable host quick actions, including OpenCode 1.x's auto-approve toggle and OpenCode 2.x's Permissions settings, with user-wide bookmarks and availability reasons
19
19
  - Live LSP connection status with error-first sorting and badges that reveal server names in place
20
20
  - Searchable MCP section with live radio-style connection controls
21
21
  - Click any MCP row to connect or disconnect it
@@ -189,6 +189,12 @@ and update in the sidebar when the agent calls `navigator_todo_write`. The
189
189
  starts **Off**: tasks and the agent tool work without adding Todo instructions
190
190
  to the model's context. OpenCode 1.x continues to show the host's Todo list.
191
191
 
192
+ If you use both OpenCode 1.x and 2.x with the same global `opencode.json`, keep
193
+ that shared server config compatible with 1.x. Place the server-plugin entry
194
+ in a separate JSON file and set `OPENCODE_CONFIG` to its path **only when
195
+ launching OpenCode 2.x**. The TUI configuration in `cli.json` remains separate;
196
+ the OpenCode 1.x launch must not load Navigator's 2.x server plugin.
197
+
192
198
  ### Install the corner font
193
199
 
194
200
  **Required for rounded multiline selections in Nerd Font mode.** Run the font
@@ -310,8 +316,10 @@ On the Quick Actions row, click `Actions` or press `A` to choose individual
310
316
  actions and their order. Enter toggles visibility; Left/Right or Shift+Up/Down
311
317
  reorders the selected action. Changes save in the selected Global or Current
312
318
  worktree scope. Escape returns to the Quick Actions row in Sections. Navigator
313
- keeps an explicit allowlist of argument-free host commands, including OpenCode's
314
- global `permission.mode` auto-approve toggle. Bookmarks are user-wide and move
319
+ keeps an explicit allowlist of argument-free host commands. On OpenCode 1.x,
320
+ `permission.mode` toggles auto-approve directly. On OpenCode 2.x, the same
321
+ Quick Action opens the host Settings dialog, where **Session → Permissions**
322
+ switches between `prompt` and `auto accept`. Bookmarks are user-wide and move
315
323
  selected actions to the front in their configured order in both the sidebar and
316
324
  Search Everything. Usage never changes the order. Visibility remains independent,
317
325
  so any action, including a bookmarked one, can be hidden from the sidebar while it
package/dist/tui.js CHANGED
@@ -2,7 +2,7 @@ import {insert as _$insert,setProp as _$setProp,createElement as _$createElement
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,For as For10,createEffect as createEffect9,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo6,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createSignal as createSignal16,createEffect as createEffect10,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 createMemo10,createComputed,createMemo as createMemo9,createSignal as createSignal21,untrack as untrack2,Show as Show8,createComputed as createComputed2,untrack as untrack3,Show as Show9,createEffect as createEffect11,createSignal as createSignal22,createMemo as createMemo12,createSignal as createSignal24,createMemo as createMemo11,For as For13,Show as Show13,Show as Show11,Show as Show12,createSignal as createSignal23,onCleanup as onCleanup16,For as For14,Show as Show15,createMemo as createMemo14,Show as Show14,createMemo as createMemo13,createEffect as createEffect12,onCleanup as onCleanup17,For as For19,Match,Switch,createMemo as createMemo18,onCleanup as onCleanup21,For as For15,Show as Show16,createSignal as createSignal25,createEffect as createEffect13,createMemo as createMemo15,onCleanup as onCleanup18,untrack as untrack4,For as For17,Show as Show19,createEffect as createEffect14,createMemo as createMemo16,createSignal as createSignal26,onCleanup as onCleanup19,untrack as untrack5,For as For16,Show as Show18,Show as Show17,Show as Show23,createEffect as createEffect15,createMemo as createMemo17,createSignal as createSignal27,onCleanup as onCleanup20,untrack as untrack6,For as For18,Show as Show21,Show as Show20,Show as Show22,createEffect as createEffect16,createMemo as createMemo19,onCleanup as onCleanup22,untrack as untrack7,Show as Show24,createMemo as createMemo20,onCleanup as onCleanup23,createSignal as createSignal28,onCleanup as onCleanup24,onMount as onMount7} from "solid-js"
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,For as For10,createEffect as createEffect9,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo6,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createSignal as createSignal16,createEffect as createEffect10,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 createMemo10,createComputed,createMemo as createMemo9,createSignal as createSignal21,untrack as untrack2,Show as Show8,createComputed as createComputed2,untrack as untrack3,Show as Show9,createEffect as createEffect11,createSignal as createSignal22,createMemo as createMemo12,createSignal as createSignal24,createMemo as createMemo11,For as For13,Show as Show13,Show as Show11,Show as Show12,createSignal as createSignal23,onCleanup as onCleanup16,For as For14,Show as Show15,createMemo as createMemo14,Show as Show14,createMemo as createMemo13,createSignal as createSignal25,createEffect as createEffect12,onCleanup as onCleanup17,For as For19,Match,Switch,createMemo as createMemo18,onCleanup as onCleanup21,For as For15,Show as Show16,createSignal as createSignal26,createEffect as createEffect13,createMemo as createMemo15,onCleanup as onCleanup18,untrack as untrack4,For as For17,Show as Show19,createEffect as createEffect14,createMemo as createMemo16,createSignal as createSignal27,onCleanup as onCleanup19,untrack as untrack5,For as For16,Show as Show18,Show as Show17,Show as Show23,createEffect as createEffect15,createMemo as createMemo17,createSignal as createSignal28,onCleanup as onCleanup20,untrack as untrack6,For as For18,Show as Show21,Show as Show20,Show as Show22,createEffect as createEffect16,createMemo as createMemo19,onCleanup as onCleanup22,untrack as untrack7,Show as Show24,createMemo as createMemo20,onCleanup as onCleanup23,createSignal as createSignal29,onCleanup as onCleanup24,onMount as onMount7} from "solid-js"
6
6
  var SIDEBAR_SECTIONS=["todo","subagents","skills","quick_actions","lsp","mcp"]
7
7
  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
8
  function preferencesScope(path){return path.worktree||path.directory||"global"
@@ -2640,10 +2640,13 @@ var NavigatorTodoRpc={id:"opencode-navigator.todo",methods:{list:{input:{type:"o
2640
2640
  },output
2641
2641
  }},events:{updated:{schema:{type:"object",properties:{sessionID,todos,guidance:{type:"boolean"}},required:["sessionID","todos","guidance"],additionalProperties:false
2642
2642
  }}}};
2643
+ function isMissingServer(error){return typeof error==="object"&&error!==null&&"type" in error&&error.type==="rpc.unavailable"
2644
+ }
2643
2645
  function createNavigatorTodoController(context,api){const rpc=context.client.rpc(NavigatorTodoRpc)
2644
2646
  const [sessions,setSessions]=createSignal11({})
2645
2647
  const [saving,setSaving]=createSignal11({})
2646
2648
  const [errors,setErrors]=createSignal11({})
2649
+ const [missing,setMissing]=createSignal11({})
2647
2650
  const requests=createRequestState(api.lifecycle.signal)
2648
2651
  const refreshing=new Map
2649
2652
  const revisions=new Map
@@ -2663,11 +2666,15 @@ const requestState=requests.start(current.key,"refresh Navigator todos",current.
2663
2666
  if(!requestState)
2664
2667
  return pending
2665
2668
  const request=rpc.list({sessionID},{location:current.routing,signal:requestState.signal}).then((value)=>{const state=normalizeTodoState(value)
2666
- if(requestState.isCurrent()&&(revisions.get(current.key)??0)===revision)
2669
+ if(requestState.isCurrent()){setMissing((values)=>({...values,[current.key]:false}))
2670
+ if((revisions.get(current.key)??0)===revision)
2667
2671
  set(current.key,state)
2672
+ }
2668
2673
  requestState.succeed()
2669
2674
  return state
2670
- }).catch((error)=>{requestState.fail(error)
2675
+ }).catch((error)=>{if(requestState.isCurrent()&&!requestState.signal.aborted)
2676
+ setMissing((values)=>({...values,[current.key]:isMissingServer(error)}))
2677
+ requestState.fail(error)
2671
2678
  throw error
2672
2679
  }).finally(()=>{requestState.finish()
2673
2680
  if(refreshing.get(current.key)===request)
@@ -2688,6 +2695,7 @@ set(current.key,normalizeTodoState(event.data))
2688
2695
  api.lifecycle.onDispose(unsubscribe)
2689
2696
  return{target,list(sessionID){return sessions()[target(sessionID).key]?.todos??[]
2690
2697
  },refresh,state(sessionID){return requests.state(target(sessionID).key)
2698
+ },missing(sessionID){return missing()[target(sessionID).key]??false
2691
2699
  },retry(sessionID){return refresh(sessionID,true)
2692
2700
  },guidance(sessionID){const key=target(sessionID).key
2693
2701
  return{enabled:sessions()[key]?.guidance??false,saving:saving()[key]??false,error:errors()[key],available:key in sessions()
@@ -4134,7 +4142,7 @@ _$setProp(_el$16,"flexGrow",1)
4134
4142
  _$insert(_el$16,()=>icons.icon(props.preferences.selectedQuickActionVisible(action.command)?"checked":"unchecked"),_el$17)
4135
4143
  _$insert(_el$16,()=>index() + 1,_el$18)
4136
4144
  _$insert(_el$16,()=>icons.action(action.command),_el$19)
4137
- _$insert(_el$16,()=>action.label,null)
4145
+ _$insert(_el$16,()=>quickActionLabel(props.api,action),null)
4138
4146
  _$effect((_$p)=>_$setProp(_el$16,"fg",theme().text,_$p))
4139
4147
  return _el$16
4140
4148
  })(),(()=>{var _el$20=_$createElement("text")
@@ -6083,10 +6091,14 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6083
6091
 
6084
6092
  function QuickActionRow(props){const icons=useIcons()
6085
6093
  const theme=()=>props.api.theme.current
6094
+ const [width,setWidth]=createSignal25(0)
6086
6095
  const shortcut=createMemo13(()=>{const bindings=props.api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6087
6096
  })
6088
6097
  return props.api.keys.formatBindings(bindings.get(props.action.command))
6089
6098
  })
6099
+ const visibleShortcut=createMemo13(()=>{const value=shortcut()
6100
+ return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 9?value:undefined
6101
+ })
6090
6102
  function run(){if(props.action.command==="session.new"&&props.onNewSession?.())
6091
6103
  return
6092
6104
  const result=props.interaction?props.interaction.dispatchFromReturnTarget(props.action.command):props.api.keymap.dispatchCommand(props.action.command)
@@ -6107,10 +6119,13 @@ return background==="transparent"?row.backgroundColor():background
6107
6119
  }
6108
6120
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6109
6121
  },paddingLeft:1,paddingRight:1,get marginTop(){return props.separator?1:0
6122
+ },onSizeChange:function(){setWidth(this.width)
6110
6123
  },get backgroundColor(){return row.backgroundColor()
6111
6124
  },get onMouseOver(){return row.onMouseOver
6112
6125
  },get onMouseOut(){return row.onMouseOut
6113
- },onMouseUp:(event)=>row.activate(event),get leading(){return(()=>{var _el$=_$createElement("text")
6126
+ },onMouseUp:(event)=>{event.stopPropagation()
6127
+ row.activate(event)
6128
+ },get leading(){return(()=>{var _el$=_$createElement("text")
6114
6129
  _$setProp(_el$,"flexShrink",0)
6115
6130
  _$insert(_el$,()=>icons.action(props.action.command))
6116
6131
  _$effect((_$p)=>_$setProp(_el$,"fg",props.disabled?theme().textMuted:row.focused()?row.foregroundColor():theme().accent,_$p))
@@ -6120,14 +6135,11 @@ return _el$
6120
6135
  _$setProp(_el$2,"flexGrow",1)
6121
6136
  _$setProp(_el$2,"wrapMode","none")
6122
6137
  _$setProp(_el$2,"truncate",true)
6123
- _$insert(_el$2,()=>props.action.label,null)
6124
- _$insert(_el$2,(()=>{var _c$=_$memo(()=>!!props.disabled)
6125
- return()=>_c$()?` \xB7 ${props.disabled}`:""
6126
- })(),null)
6138
+ _$insert(_el$2,()=>props.action.label)
6127
6139
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6128
6140
  return _el$2
6129
6141
  })()
6130
- },get metadata(){return _$createComponent(Show14,{get when(){return shortcut()
6142
+ },get metadata(){return _$createComponent(Show14,{get when(){return visibleShortcut()
6131
6143
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
6132
6144
  _$setProp(_el$3,"flexShrink",0)
6133
6145
  _$setProp(_el$3,"wrapMode","none")
@@ -6136,6 +6148,14 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
6136
6148
  return _el$3
6137
6149
  })()
6138
6150
  })
6151
+ },get details(){return _$createComponent(Show14,{get when(){return props.disabled
6152
+ },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6153
+ _$setProp(_el$4,"wrapMode","word")
6154
+ _$insert(_el$4,reason)
6155
+ _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6156
+ return _el$4
6157
+ })()
6158
+ })
6139
6159
  },get trailing(){return _$createComponent(BookmarkControl,{ref:(node)=>favorite.ref(node),get id(){return `${id()}.favorite`
6140
6160
  },get bookmarked(){return props.favorite
6141
6161
  },get backgroundColor(){return controlBackground()
@@ -6392,7 +6412,7 @@ return _el$2
6392
6412
  }})
6393
6413
  }
6394
6414
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6395
- const [query,setQuery]=createSignal25("")
6415
+ const [query,setQuery]=createSignal26("")
6396
6416
  const model=createSkillSectionModel(props,query)
6397
6417
  const navigationSection=()=>props.navigationSection??3
6398
6418
  function selectSkill(item){if(!props.preferences.shouldConfirmSkill(item)){model.useSkill(item)
@@ -6467,8 +6487,8 @@ return _el$
6467
6487
  function createSubagentSectionModel(props){const list=createMemo16(()=>props.controller.list(props.sessionID))
6468
6488
  const recent=createMemo16(()=>props.controller.recent?.(props.sessionID)??[])
6469
6489
  const rows=createMemo16(()=>buildSubagentView(list(),recent()))
6470
- const [query,setQuery]=createSignal26("")
6471
- const [mode,setMode]=createSignal26("all")
6490
+ const [query,setQuery]=createSignal27("")
6491
+ const [mode,setMode]=createSignal27("all")
6472
6492
  const counts=createMemo16(()=>countSubagentView(rows(),query()))
6473
6493
  const tabs=createMemo16(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6474
6494
  const filtered=createMemo16(()=>filterSubagentView(rows(),mode(),query()))
@@ -6836,7 +6856,7 @@ function TodoSection(props){const list=createMemo17(()=>props.controller.list(pr
6836
6856
  const icons=useIcons()
6837
6857
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6838
6858
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6839
- const [mode,setMode]=createSignal27("all")
6859
+ const [mode,setMode]=createSignal28("all")
6840
6860
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6841
6861
  createEffect15(()=>{targetKey()
6842
6862
  setMode("all")
@@ -6857,7 +6877,7 @@ const navigationSection=()=>props.navigationSection??1
6857
6877
  return _$createComponent(Section,{get api(){return props.api
6858
6878
  },get interaction(){return props.interaction
6859
6879
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6860
- },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!unavailable())()?"\u2014":`${view().counts.completed}/${list().length}`
6880
+ },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6861
6881
  },get open(){return props.preferences.expanded().todo
6862
6882
  },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show23,{get when(){return unavailable()
6863
6883
  },get fallback(){return(()=>{var _el$=_$createElement("box")
@@ -6870,14 +6890,8 @@ _$insert(_el$,_$createComponent(Show23,{get when(){return managed()?.guidance(pr
6870
6890
  },get navigationSection(){return navigationSection()
6871
6891
  }})
6872
6892
  }}),null)
6873
- _$insert(_el$,_$createComponent(Show23,{get when(){return _$memo(()=>!!(managed()&&state().error))()&&!managed()?.guidance(props.sessionID).available
6874
- },get children(){var _el$2=_$createElement("text")
6875
- _$insertNode(_el$2,_$createTextNode(`Add Navigator's server plugin to opencode.json; restart OpenCode to enable Todo.`))
6876
- _$setProp(_el$2,"wrapMode","word")
6877
- _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6878
- return _el$2
6879
- }}),null)
6880
- _$insert(_el$,_$createComponent(SectionRequestBody,{get api(){return props.api
6893
+ _$insert(_el$,_$createComponent(Show23,{get when(){return managed()?.missing(props.sessionID)
6894
+ },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6881
6895
  },get interaction(){return props.interaction
6882
6896
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
6883
6897
  }},get state(){return state()
@@ -6890,6 +6904,13 @@ _$insert(_el$,_$createComponent(SectionRequestBody,{get api(){return props.api
6890
6904
  },visibility,get density(){return props.preferences.rowDensity?.()??"compact"
6891
6905
  },get managed(){return Boolean(managed())
6892
6906
  }})
6907
+ }})
6908
+ },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.`)
6909
+ _$insertNode(_el$2,_el$3)
6910
+ _$setProp(_el$2,"wrapMode","word")
6911
+ _$insert(_el$2,()=>icons.icon("info"),_el$3)
6912
+ _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6913
+ return _el$2
6893
6914
  }}),null)
6894
6915
  return _el$
6895
6916
  })()
@@ -7142,6 +7163,8 @@ unsubscribe()
7142
7163
  }}}}
7143
7164
 
7144
7165
 
7166
+ var SETTINGS_COMMAND="opencode.settings"
7167
+ var PERMISSIONS_ACTION="permission.mode"
7145
7168
  function belongsTo2(renderable,ancestor){if(!renderable||!ancestor)
7146
7169
  return false
7147
7170
  for(let current=renderable;current; current=current.parent){if(current===ancestor)
@@ -7151,7 +7174,7 @@ return false
7151
7174
  }
7152
7175
  function enabled(value){return typeof value==="function"?value():value!==false
7153
7176
  }
7154
- function createV2Keymap(context){const [revision,setRevision]=createSignal28(0)
7177
+ function createV2Keymap(context){const [revision,setRevision]=createSignal29(0)
7155
7178
  const layers=new Map
7156
7179
  let sequence=0
7157
7180
  function layerActive(layer){const mode=layer.mode??"base"
@@ -7196,11 +7219,11 @@ setRevision((value)=>value + 1)
7196
7219
  return()=>{if(!layers.delete(id))
7197
7220
  return
7198
7221
  setRevision((value)=>value + 1)
7199
- }},dispatchCommand(name,options){const command=context.keymap.commands().find((candidate)=>candidate.id===name)
7222
+ }},dispatchCommand(name,options){const command=context.keymap.commands().find((candidate)=>candidate.id===(name===PERMISSIONS_ACTION?SETTINGS_COMMAND:name))
7200
7223
  if(command){if(!enabled(command.enabled))
7201
7224
  return{ok:false,reason:"disabled",command
7202
7225
  }
7203
- context.keymap.dispatch(name,typeof options?.payload==="string"?options.payload:undefined)
7226
+ context.keymap.dispatch(command.id,typeof options?.payload==="string"?options.payload:undefined)
7204
7227
  return{ok:true,command
7205
7228
  }}
7206
7229
  const fallback=legacyCommand(name)
@@ -7209,12 +7232,18 @@ return{ok:false,reason:"not-found"
7209
7232
  }
7210
7233
  run(fallback)
7211
7234
  return{ok:true,command:fallback
7212
- }},getCommands(){return context.keymap.commands().flatMap((command)=>{if(!command.id)
7235
+ }},getCommands(){const commands=context.keymap.commands()
7236
+ const result=commands.flatMap((command)=>{if(!command.id)
7213
7237
  return []
7214
7238
  const name=command.id
7215
7239
  return [{...command,name,run:()=>context.keymap.dispatch(name)
7216
7240
  }]
7217
7241
  })
7242
+ const settings=commands.find((command)=>command.id===SETTINGS_COMMAND)
7243
+ if(settings)
7244
+ result.push({...settings,id:PERMISSIONS_ACTION,name:PERMISSIONS_ACTION,title:"Permissions settings",run:()=>context.keymap.dispatch(SETTINGS_COMMAND)
7245
+ })
7246
+ return result
7218
7247
  },getCommandBindings(input){return new Map(input.commands.map((name)=>[name,[...context.keymap.shortcuts(name)]]))
7219
7248
  },parseKeySequence(value){return value.trim()?value.trim().split(/\s+/u):[]
7220
7249
  }}
@@ -7437,7 +7466,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7437
7466
  },interaction,skills,subagents,mcp
7438
7467
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7439
7468
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7440
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.18.0"
7469
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.18.2"
7441
7470
  }),_$createComponent(McpPersistence,{api,controller:mcp
7442
7471
  })]
7443
7472
  }})
@@ -7467,12 +7496,12 @@ throw result.error
7467
7496
  }
7468
7497
  return result.data?.type==="text"?result.data.content:undefined
7469
7498
  })
7470
- const versionStatus=createVersionStatus(api,"0.18.0")
7471
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.0"))
7499
+ const versionStatus=createVersionStatus(api,"0.18.2")
7500
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.2"))
7472
7501
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7473
7502
  },get multilineCorners(){return preferences.cornerFont
7474
7503
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7475
- },navigatorVersion:"0.18.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7504
+ },navigatorVersion:"0.18.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7476
7505
  },get onNavigatorUpdate(){return versionUpdates.navigator
7477
7506
  }})
7478
7507
  }})
@@ -7486,15 +7515,15 @@ return
7486
7515
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7487
7516
  }))
7488
7517
  },todo)
7489
- const versionStatus=createVersionStatus(adapter.api,"0.18.0")
7490
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.0"))
7518
+ const versionStatus=createVersionStatus(adapter.api,"0.18.2")
7519
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.2"))
7491
7520
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7492
7521
  },get multilineCorners(){return preferences.cornerFont
7493
7522
  },get children(){var _el$=_$createElement("box")
7494
7523
  _$setProp(_el$,"flexDirection","row")
7495
7524
  _$setProp(_el$,"justifyContent","space-between")
7496
7525
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7497
- },navigatorVersion:"0.18.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7526
+ },navigatorVersion:"0.18.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7498
7527
  },get onNavigatorUpdate(){return versionUpdates.navigator
7499
7528
  }}),null)
7500
7529
  _$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.18.0",
4
+ "version": "0.18.2",
5
5
  "description": "Search, navigate, and manage OpenCode sessions from the TUI",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.4.2",
@@ -102,9 +102,9 @@
102
102
  }
103
103
  },
104
104
  "devDependencies": {
105
- "@opencode-ai/plugin": "1.18.32",
106
- "@opencode-ai/sdk": "1.18.32",
107
- "@opencode/plugin": "2.0.16",
105
+ "@opencode-ai/plugin": "1.18.34",
106
+ "@opencode-ai/sdk": "1.18.34",
107
+ "@opencode/plugin": "2.0.21",
108
108
  "@opentui/core": "0.5.12",
109
109
  "@opentui/keymap": "0.5.12",
110
110
  "@opentui/solid": "0.5.12",