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 +11 -0
- package/README.md +11 -3
- package/dist/tui.js +63 -34
- package/package.json +4 -4
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
|
|
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
|
|
314
|
-
|
|
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
|
|
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()
|
|
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.
|
|
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,()=>
|
|
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)=>
|
|
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
|
|
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
|
|
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]=
|
|
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]=
|
|
6471
|
-
const [mode,setMode]=
|
|
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]=
|
|
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
|
|
6874
|
-
},get
|
|
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]=
|
|
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(
|
|
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(){
|
|
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.
|
|
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.
|
|
7471
|
-
const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.
|
|
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.
|
|
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.
|
|
7490
|
-
const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.18.
|
|
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.
|
|
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.
|
|
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.
|
|
106
|
-
"@opencode-ai/sdk": "1.18.
|
|
107
|
-
"@opencode/plugin": "2.0.
|
|
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",
|