opencode-navigator 0.21.7 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,828 @@
1
+ import {SIDEBAR_SECTIONS,SECTION_DEFINITIONS,PLUGIN_ID,DEFAULT_SEARCH_KEY
2
+ } from "./chunk-dz8cfnfs.js"
3
+ import"./chunk-qmntexwm.js";
4
+ import {memo as _$memo4} from "@opentui/solid"
5
+ import {use as _$use} from "@opentui/solid"
6
+ import {createComponent as _$createComponent6} from "@opentui/solid"
7
+ import {effect as _$effect7} from "@opentui/solid"
8
+ import {createTextNode as _$createTextNode7} from "@opentui/solid"
9
+ import {insertNode as _$insertNode7} from "@opentui/solid"
10
+ import {insert as _$insert5} from "@opentui/solid"
11
+ import {setProp as _$setProp7} from "@opentui/solid"
12
+ import {createElement as _$createElement7} from "@opentui/solid"
13
+ import {TextAttributes as TextAttributes5} from "@opentui/core"
14
+ import {For as For3} from "solid-js"
15
+ import {DialogSurface as DialogSurface2,Tab} from "./tui.js"
16
+ import {useTerminalDimensions} from "@opentui/solid"
17
+ import {createEffect,createMemo as createMemo2,onCleanup as onCleanup2,onMount} from "solid-js"
18
+ import {useDialogScroll,useDialogState,useDialogs as useDialogs2,useIcons as useIcons4} from "./tui.js"
19
+ import {createMemo} from "solid-js"
20
+ import {supportsSidebarSection} from "./tui.js"
21
+ import {supportsPermissionMode} from "./tui.js"
22
+ function behaviorSettingsOptions(api,preferences,icons){const permission=preferences.autoApprovePermissions()
23
+ const permissionDescription=permission?"on for new sessions":"off for new sessions"
24
+ return [...supportsPermissionMode(api)?[{title:`${icons.icon(permission === true ? "checked" : "unchecked")} Default auto-approve permissions`,value:"auto_approve_permissions",description:permission===undefined?"follow OpenCode startup mode":permissionDescription
25
+ }]:[],{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"
26
+ },{title:`${icons.icon(preferences.selectedPersistMcp() ? "checked" : "unchecked")} Remember MCP states`,value:"persist_mcp",description:preferences.selectedPersistMcp()?"on":"off"
27
+ },{title:`${icons.icon("settings")} Icon style`,value:"lsp_icon_style",description:preferences.selectedLspIconStyle()==="nerd"?"Nerd Font":"Text fallback"
28
+ },{title:`${icons.icon(preferences.selectedCornerFont() ? "checked" : "unchecked")} Multiline corner font`,value:"corner_font",description:preferences.selectedCornerFont()?"Installed":"Not installed \xB7 rectangular highlights"
29
+ },{title:`${icons.icon("sections")} Row density`,value:"row_density",description:preferences.selectedRowDensity()==="compact"?"Compact":"Comfortable"
30
+ },{title:`${icons.icon("sections")} Sidebar shortcut`,value:"toggle_key",description:preferences.selectedToggleKey()
31
+ },{title:`${icons.icon("selected")} Focus shortcut`,value:"focus_key",description:preferences.selectedFocusKey()
32
+ },{title:`${icons.icon("search")} Search Everything shortcut`,value:"search_key",description:preferences.selectedSearchKey?.()??DEFAULT_SEARCH_KEY
33
+ },{title:`${icons.icon("retry")} Limits refresh interval`,value:"limits_refresh",description:`${preferences.selectedLimitsRefreshMinutes()} min \xB7 minimum 1 min`
34
+ },{title:`${icons.icon("sections")} Toolbar overflow`,value:"toolbar_overflow",description:preferences.selectedToolbarOverflow?.()==="wrap"?"Wrap into rows":"Single row with More menu"
35
+ },{title:`${icons.icon("edit")} Pinned toolbar\u2026`,value:"toolbar_manager",description:"Add, reorder, or configure action and Skill buttons"
36
+ }]
37
+ }
38
+ import {supportsTitleVisibility} from "./tui.js"
39
+ function titleVisibilityOptions(api,preferences,icons){if(!supportsTitleVisibility(api))
40
+ return []
41
+ const title=preferences.selectedShowSessionTitle()
42
+ const date=preferences.selectedShowSessionDate()
43
+ return [{title:`${icons.icon(title ? "checked" : "unchecked")} Session title`,value:"session_title",description:title?"visible":"hidden"
44
+ },{title:`${icons.icon(date ? "checked" : "unchecked")} Creation date`,value:"session_date",description:date?"visible":"hidden"
45
+ }]
46
+ }
47
+ function createSettingsGroups(api,preferences,icons){const supportedSections=()=>SIDEBAR_SECTIONS.filter((name)=>supportsSidebarSection(api,name))
48
+ const groups=createMemo(()=>[{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"
49
+ },{title:`${icons.icon(preferences.preferenceScope() === "worktree" ? "radioOn" : "radioOff")} Current worktree`,value:"scope:worktree",description:preferences.canUseWorktreeScope()?preferences.preferenceScopeLabel():"unavailable outside a worktree"
50
+ }]
51
+ },{id:"presets",tab:"Presets",title:"Layout presets",options:[...Object.keys(preferences.layoutPresets()).sort((left,right)=>left.localeCompare(right)).map((name)=>({title:`${icons.icon("presets")} ${name}`,value:`preset:custom:${encodeURIComponent(name)}`,description:preferences.workspaceProfiles?.()[name]?`profile \xB7 ${preferences.workspaceProfiles()[name]}`:"enter to apply or edit"
52
+ })),{title:`${icons.icon("add")} Save as\u2026`,value:"save_preset",description:"create a preset from the current layout"
53
+ }]
54
+ },{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)
55
+ 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"
56
+ }})]
57
+ },{id:"behavior",tab:"Behavior",title:"Behavior",options:behaviorSettingsOptions(api,preferences,icons)
58
+ },{id:"defaults",tab:"Defaults",title:"Defaults & help",options:[{title:`${icons.icon("save")} Save current layout as default`,value:"save_layout",description:`${supportedSections().filter((name) => preferences.selectedSections()[name]).length} visible \xB7 ${supportedSections().filter((name) => preferences.selectedExpanded()[name]).length} expanded`
59
+ },{title:`${icons.icon("export")} Copy portable settings`,value:"export_settings",description:"versioned layout and MCP JSON"
60
+ },{title:`${icons.icon("add")} Import portable settings\u2026`,value:"import_settings",description:"preview pasted JSON before applying"
61
+ },{title:`${icons.icon("retry")} Reload settings from file`,value:"reload_settings",description:"sync saved changes from other OpenCode sessions"
62
+ },{title:`${icons.icon("reset")} Restore configured layout`,value:"reset_sections",description:"visibility and expansion"
63
+ },{title:`${icons.icon("reset")} Restore configured behavior`,value:"reset_settings",description:"startup, MCP memory, icons, shortcuts, limits, actions"
64
+ },{title:`${icons.icon("reset")} Clear remembered MCP states`,value:"reset_mcp",description:`scope: ${preferences.preferenceScopeLabel()}`
65
+ },{title:`${icons.section("skills")} Manage trusted skills`,value:"trusted_skills",description:`${preferences.skippedSkillCount()} trusted`
66
+ },{title:`${icons.icon("help")} Open quick setup guide`,value:"wizard",description:"tips and section settings"
67
+ }]
68
+ }])
69
+ const orderedGroups=createMemo(()=>["sections","scope","presets","behavior","defaults"].map((id)=>groups().find((group)=>group.id===id)))
70
+ return orderedGroups
71
+ }
72
+ function registerSettingsKeymap(input){return input.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.settings.previous`,run:()=>input.move(-1)},{name:`${PLUGIN_ID}.settings.next`,run:()=>input.move(1)},{name:`${PLUGIN_ID}.settings.select`,run:()=>input.select()},{name:`${PLUGIN_ID}.settings.groups`,run:()=>{if(input.activeGroup()!=="sections")
73
+ return
74
+ if(input.options()[input.active()]?.value==="mcp")
75
+ input.openMcpGroups()
76
+ if(input.options()[input.active()]?.value==="skills")
77
+ input.openSkillGroups()
78
+ }},{name:`${PLUGIN_ID}.settings.quick-actions`,run:()=>{if(input.activeGroup()==="sections"&&input.options()[input.active()]?.value==="quick_actions")
79
+ input.openQuickActions()
80
+ }},{name:`${PLUGIN_ID}.settings.item-limit`,run:()=>{const section=input.options()[input.active()]?.value
81
+ if(input.activeGroup()==="sections"&&SIDEBAR_SECTIONS.includes(section))
82
+ input.openLimitPrompt(section)
83
+ }},{name:`${PLUGIN_ID}.settings.previous-tab`,run:()=>input.switchGroup(-1)},{name:`${PLUGIN_ID}.settings.next-tab`,run:()=>input.switchGroup(1)},{name:`${PLUGIN_ID}.settings.move-up`,run:()=>input.reorder(input.options()[input.active()]?.value,-1)},{name:`${PLUGIN_ID}.settings.move-down`,run:()=>input.reorder(input.options()[input.active()]?.value,1)}],bindings:[{key:"up",cmd:`${PLUGIN_ID}.settings.previous`},{key:"down",cmd:`${PLUGIN_ID}.settings.next`},{key:"tab",cmd:`${PLUGIN_ID}.settings.next-tab`},{key:"shift+tab",cmd:`${PLUGIN_ID}.settings.previous-tab`},{key:"space",cmd:`${PLUGIN_ID}.settings.select`},{key:"return",cmd:`${PLUGIN_ID}.settings.select`},{key:"l",cmd:`${PLUGIN_ID}.settings.item-limit`},{key:"a",cmd:`${PLUGIN_ID}.settings.quick-actions`},{key:"g",cmd:`${PLUGIN_ID}.settings.groups`},{key:"left",cmd:`${PLUGIN_ID}.settings.move-up`},{key:"right",cmd:`${PLUGIN_ID}.settings.move-down`},{key:"shift+up",cmd:`${PLUGIN_ID}.settings.move-up`},{key:"shift+down",cmd:`${PLUGIN_ID}.settings.move-down`}]
84
+ })
85
+ }
86
+ import {createComponent as _$createComponent4} from "@opentui/solid"
87
+ import {setProp as _$setProp5} from "@opentui/solid"
88
+ import {effect as _$effect5} from "@opentui/solid"
89
+ import {createTextNode as _$createTextNode5} from "@opentui/solid"
90
+ import {insertNode as _$insertNode5} from "@opentui/solid"
91
+ import {createElement as _$createElement5} from "@opentui/solid"
92
+ import {createComponent as _$createComponent3} from "@opentui/solid"
93
+ import {effect as _$effect3} from "@opentui/solid"
94
+ import {createTextNode as _$createTextNode3} from "@opentui/solid"
95
+ import {insertNode as _$insertNode3} from "@opentui/solid"
96
+ import {insert as _$insert3} from "@opentui/solid"
97
+ import {setProp as _$setProp3} from "@opentui/solid"
98
+ import {createElement as _$createElement3} from "@opentui/solid"
99
+ import {TextAttributes as TextAttributes3} from "@opentui/core"
100
+ import {Show,createSignal,onCleanup} from "solid-js"
101
+ import {supportsSidebarSection as supportsSidebarSection3} from "./tui.js"
102
+ import {DialogSurface,createDialogStack,useDialogs,useIcons as useIcons3} from "./tui.js"
103
+ 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."}]
104
+ },{title:"Stay oriented while agents work",summary:"Keep current work visible without turning the sidebar into another dashboard.",icon:"todo",features:[{icon:"todo",title:"Todo filters",description:"Separate active, finished, and cancelled work."},{icon:"subagents",title:"Live subagents",description:"See running, retrying, recent, and failed child sessions; open them directly."
105
+ },{icon:"info",title:"Provider limits",description:"Link a matching Codex account for model quotas and confirmed banked resets."
106
+ }]
107
+ },{title:"Find anything and launch Skills safely",summary:"Search complete source lists without expanding every sidebar section.",icon:"search",features:[{icon:"search",title:"Search Everything",description:"Search Skills, Subagents, MCP, and Actions in shared tabs."
108
+ },{icon:"search",title:"Full source lists",description:"Search beyond sidebar visibility and item limits."},{icon:"skills",title:"Skill confirmation",description:"Review a skill and its source before inserting its command."
109
+ }]
110
+ },{title:"Run actions and check language tools",summary:"Keep frequent OpenCode commands and LSP health within one compact section.",icon:"actions",features:[{icon:"actions",title:"Quick Actions",description:"Rename, inspect timelines, copy, export, or compact the session."
111
+ },{icon:"lsp",title:"Compact LSP status",description:"Spot connected and failed language servers at a glance."
112
+ },{icon:"settings",title:"Configurable commands",description:"Choose action visibility, order, and shortcuts."
113
+ }]
114
+ },{title:"Control MCP without losing context",summary:"Manage individual servers or entire working sets directly from Navigator.",icon:"mcp",features:[{icon:"mcp",title:"Live server controls",description:"Connect, disconnect, filter, and favorite servers."},{icon:"actions",title:"Bulk operations",description:"Change eligible servers together and retry failures."
115
+ },{icon:"presets",title:"Safe presets",description:"Preview connections and disconnections before Apply."}]
116
+ },{title:"Make Navigator fit each workspace",summary:"Use the same controls with mouse or keyboard and keep only the context you need.",icon:"settings",features:[{icon:"sections",title:"Flexible layout",description:"Choose section visibility, order, expansion, and item limits."
117
+ },{icon:"presets",title:"Scoped presets",description:"Save layouts globally or for the current worktree."},{icon:"settings",title:"Accessible controls",description:"Change shortcuts or use Text fallback without a restart."
118
+ }]
119
+ }];
120
+ import {effect as _$effect} from "@opentui/solid"
121
+ import {memo as _$memo} from "@opentui/solid"
122
+ import {createComponent as _$createComponent} from "@opentui/solid"
123
+ import {createTextNode as _$createTextNode} from "@opentui/solid"
124
+ import {insertNode as _$insertNode} from "@opentui/solid"
125
+ import {insert as _$insert} from "@opentui/solid"
126
+ import {setProp as _$setProp} from "@opentui/solid"
127
+ import {createElement as _$createElement} from "@opentui/solid"
128
+ import {TextAttributes} from "@opentui/core"
129
+ import {For} from "solid-js"
130
+ import {SelectionBox,useIcons} from "./tui.js"
131
+ function OnboardingStep(props){const icons=useIcons()
132
+ const theme=()=>props.api.theme.current
133
+ return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createElement("text"),_el$5=_$createElement("box"),_el$6=_$createElement("text"),_el$7=_$createTextNode(`Toggle: `),_el$8=_$createTextNode(` \xB7 Focus: `),_el$9=_$createTextNode(` \xB7 Icons: `),_el$1=_$createElement("box")
134
+ _$insertNode(_el$,_el$2)
135
+ _$insertNode(_el$,_el$4)
136
+ _$insertNode(_el$,_el$5)
137
+ _$insertNode(_el$,_el$6)
138
+ _$insertNode(_el$,_el$1)
139
+ _$setProp(_el$,"gap",1)
140
+ _$insertNode(_el$2,_el$3)
141
+ _$insert(_el$2,()=>icons.icon(props.step.icon),_el$3)
142
+ _$insert(_el$2,()=>props.step.title,null)
143
+ _$setProp(_el$4,"wrapMode","word")
144
+ _$insert(_el$4,()=>props.step.summary)
145
+ _$setProp(_el$5,"border",["top","bottom"])
146
+ _$setProp(_el$5,"paddingTop",1)
147
+ _$setProp(_el$5,"paddingBottom",1)
148
+ _$setProp(_el$5,"gap",1)
149
+ _$insert(_el$5,_$createComponent(For,{get each(){return props.step.features
150
+ },children:(feature)=>(()=>{var _el$14=_$createElement("box"),_el$15=_$createElement("text"),_el$16=_$createElement("text"),_el$17=_$createElement("b"),_el$18=_$createTextNode(` \xB7 `)
151
+ _$insertNode(_el$14,_el$15)
152
+ _$insertNode(_el$14,_el$16)
153
+ _$setProp(_el$14,"flexDirection","row")
154
+ _$setProp(_el$14,"gap",1)
155
+ _$setProp(_el$15,"flexShrink",0)
156
+ _$insert(_el$15,()=>icons.icon(feature.icon))
157
+ _$insertNode(_el$16,_el$17)
158
+ _$insertNode(_el$16,_el$18)
159
+ _$setProp(_el$16,"flexGrow",1)
160
+ _$setProp(_el$16,"minWidth",0)
161
+ _$setProp(_el$16,"wrapMode","word")
162
+ _$insert(_el$17,()=>feature.title)
163
+ _$insert(_el$16,()=>feature.description,null)
164
+ _$effect((_p$)=>{var _v$6=theme().accent,_v$7=theme().textMuted
165
+ _v$6!==_p$.e&&(_p$.e=_$setProp(_el$15,"fg",_v$6,_p$.e))
166
+ _v$7!==_p$.t&&(_p$.t=_$setProp(_el$16,"fg",_v$7,_p$.t))
167
+ return _p$
168
+ },{e:undefined,t:undefined
169
+ })
170
+ return _el$14
171
+ })()
172
+ }))
173
+ _$insertNode(_el$6,_el$7)
174
+ _$insertNode(_el$6,_el$8)
175
+ _$insertNode(_el$6,_el$9)
176
+ _$setProp(_el$6,"wrapMode","word")
177
+ _$insert(_el$6,()=>props.preferences.toggleKey(),_el$8)
178
+ _$insert(_el$6,()=>props.preferences.focusKey(),_el$9)
179
+ _$insert(_el$6,()=>icons.style()==="text"?"Text fallback":"Nerd Font",null)
180
+ _$setProp(_el$1,"flexDirection","row")
181
+ _$setProp(_el$1,"justifyContent","space-between")
182
+ _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
183
+ props.onBack()
184
+ },get children(){var _el$10=_$createElement("text"),_el$11=_$createTextNode(` Back`)
185
+ _$insertNode(_el$10,_el$11)
186
+ _$insert(_el$10,()=>icons.icon("left"),_el$11)
187
+ _$effect((_$p)=>_$setProp(_el$10,"fg",theme().textMuted,_$p))
188
+ return _el$10
189
+ }}),null)
190
+ _$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,get backgroundColor(){return theme().primary
191
+ },onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
192
+ props.onAdvance()
193
+ },get children(){var _el$12=_$createElement("text"),_el$13=_$createTextNode(` `)
194
+ _$insertNode(_el$12,_el$13)
195
+ _$insert(_el$12,()=>props.final?"Configure sidebar":"Next",_el$13)
196
+ _$insert(_el$12,()=>icons.icon("right"),null)
197
+ _$effect((_$p)=>_$setProp(_el$12,"fg",theme().selectedListItemText,_$p))
198
+ return _el$12
199
+ }}),null)
200
+ _$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes.BOLD,_v$3=theme().textMuted,_v$4=theme().borderSubtle,_v$5=theme().textMuted
201
+ _v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
202
+ _v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
203
+ _v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
204
+ _v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"borderColor",_v$4,_p$.o))
205
+ _v$5!==_p$.i&&(_p$.i=_$setProp(_el$6,"fg",_v$5,_p$.i))
206
+ return _p$
207
+ },{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined
208
+ })
209
+ return _el$
210
+ })()
211
+ }
212
+ import {memo as _$memo2} from "@opentui/solid"
213
+ import {effect as _$effect2} from "@opentui/solid"
214
+ import {createComponent as _$createComponent2} from "@opentui/solid"
215
+ import {createTextNode as _$createTextNode2} from "@opentui/solid"
216
+ import {insertNode as _$insertNode2} from "@opentui/solid"
217
+ import {insert as _$insert2} from "@opentui/solid"
218
+ import {setProp as _$setProp2} from "@opentui/solid"
219
+ import {createElement as _$createElement2} from "@opentui/solid"
220
+ import {TextAttributes as TextAttributes2} from "@opentui/core"
221
+ import {For as For2} from "solid-js"
222
+ import {supportsSidebarSection as supportsSidebarSection2} from "./tui.js"
223
+ import {SelectionBox as SelectionBox2,useIcons as useIcons2} from "./tui.js"
224
+ function SectionConfig(props){const icons=useIcons2()
225
+ const theme=()=>props.api.theme.current
226
+ const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection2(props.api,section.name))
227
+ const finishIndex=sections.length
228
+ return(()=>{var _el$=_$createElement2("box"),_el$2=_$createElement2("text"),_el$3=_$createTextNode2(` Choose your sidebar sections`),_el$4=_$createElement2("text"),_el$6=_$createElement2("box")
229
+ _$insertNode2(_el$,_el$2)
230
+ _$insertNode2(_el$,_el$4)
231
+ _$insertNode2(_el$,_el$6)
232
+ _$setProp2(_el$,"gap",1)
233
+ _$insertNode2(_el$2,_el$3)
234
+ _$insert2(_el$2,()=>icons.icon("sections"),_el$3)
235
+ _$insertNode2(_el$4,_$createTextNode2(`Select what appears now. You can change visibility, order, limits, scope, and presets later with the gear button.`))
236
+ _$setProp2(_el$4,"wrapMode","word")
237
+ _$insert2(_el$,_$createComponent2(For2,{each:sections,children:(section,index)=>_$createComponent2(SelectionBox2,{flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo2(()=>props.active===index())()?theme().backgroundElement:undefined
238
+ },onMouseOver:()=>props.onActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
239
+ props.preferences.toggleSection(section.name)
240
+ },get children(){return [(()=>{var _el$1=_$createElement2("text")
241
+ _$setProp2(_el$1,"flexShrink",0)
242
+ _$insert2(_el$1,()=>icons.icon(props.preferences.sections()[section.name]?"checked":"unchecked"))
243
+ _$effect2((_$p)=>_$setProp2(_el$1,"fg",props.preferences.sections()[section.name]?theme().accent:theme().textMuted,_$p))
244
+ return _el$1
245
+ })(),(()=>{var _el$10=_$createElement2("text"),_el$11=_$createTextNode2(` `)
246
+ _$insertNode2(_el$10,_el$11)
247
+ _$insert2(_el$10,()=>icons.section(section.name),_el$11)
248
+ _$insert2(_el$10,()=>section.label,null)
249
+ _$effect2((_$p)=>_$setProp2(_el$10,"fg",props.active===index()?theme().text:theme().textMuted,_$p))
250
+ return _el$10
251
+ })()]
252
+ }})
253
+ }),_el$6)
254
+ _$setProp2(_el$6,"flexDirection","row")
255
+ _$setProp2(_el$6,"justifyContent","space-between")
256
+ _$insert2(_el$6,_$createComponent2(SelectionBox2,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
257
+ props.onBack()
258
+ },get children(){var _el$7=_$createElement2("text"),_el$8=_$createTextNode2(` Back`)
259
+ _$insertNode2(_el$7,_el$8)
260
+ _$insert2(_el$7,()=>icons.icon("left"),_el$8)
261
+ _$effect2((_$p)=>_$setProp2(_el$7,"fg",theme().textMuted,_$p))
262
+ return _el$7
263
+ }}),null)
264
+ _$insert2(_el$6,_$createComponent2(SelectionBox2,{paddingLeft:2,paddingRight:2,get backgroundColor(){return _$memo2(()=>props.active===finishIndex)()?theme().primary:undefined
265
+ },onMouseOver:()=>props.onActive(finishIndex),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
266
+ props.onFinish()
267
+ },get children(){var _el$9=_$createElement2("text"),_el$0=_$createTextNode2(` Finish`)
268
+ _$insertNode2(_el$9,_el$0)
269
+ _$insert2(_el$9,()=>icons.icon("done"),_el$0)
270
+ _$effect2((_$p)=>_$setProp2(_el$9,"fg",props.active===finishIndex?theme().selectedListItemText:theme().textMuted,_$p))
271
+ return _el$9
272
+ }}),null)
273
+ _$effect2((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes2.BOLD,_v$3=theme().textMuted
274
+ _v$!==_p$.e&&(_p$.e=_$setProp2(_el$2,"fg",_v$,_p$.e))
275
+ _v$2!==_p$.t&&(_p$.t=_$setProp2(_el$2,"attributes",_v$2,_p$.t))
276
+ _v$3!==_p$.a&&(_p$.a=_$setProp2(_el$4,"fg",_v$3,_p$.a))
277
+ return _p$
278
+ },{e:undefined,t:undefined,a:undefined
279
+ })
280
+ return _el$
281
+ })()
282
+ }
283
+ function FirstRunWizard(props){const icons=useIcons3()
284
+ const dialogs=useDialogs(props.api)
285
+ const [active,setActive]=createSignal(0)
286
+ const [step,setStep]=createSignal(0)
287
+ const theme=()=>props.api.theme.current
288
+ const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection3(props.api,section.name))
289
+ const finishIndex=sections.length
290
+ const stepCount=ONBOARDING_STEPS.length + 1
291
+ const configuring=()=>step()===ONBOARDING_STEPS.length
292
+ function finish(){dialogs.back()
293
+ }
294
+ function move(offset){if(configuring())
295
+ setActive((value)=>(value + offset + finishIndex + 1)%(finishIndex + 1))
296
+ else
297
+ setStep((value)=>Math.max(0,Math.min(ONBOARDING_STEPS.length,value + offset)))
298
+ }
299
+ function back(){setStep((value)=>Math.max(0,value-1))
300
+ }
301
+ function advance(){if(!configuring())
302
+ setStep((value)=>Math.min(ONBOARDING_STEPS.length,value + 1))
303
+ }
304
+ function select(){if(!configuring()){advance()
305
+ return
306
+ }
307
+ const index=active()
308
+ if(index===finishIndex)
309
+ finish()
310
+ else
311
+ props.preferences.toggleSection(sections[index].name)
312
+ }
313
+ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.wizard.previous`,run(){move(-1)
314
+ }},{name:`${PLUGIN_ID}.wizard.next`,run(){move(1)
315
+ }},{name:`${PLUGIN_ID}.wizard.select`,run:select
316
+ },{name:`${PLUGIN_ID}.wizard.back`,run:back
317
+ },{name:`${PLUGIN_ID}.wizard.forward`,run:advance
318
+ }],bindings:[{key:"up",cmd:`${PLUGIN_ID}.wizard.previous`
319
+ },{key:"down",cmd:`${PLUGIN_ID}.wizard.next`
320
+ },{key:"tab",cmd:`${PLUGIN_ID}.wizard.next`
321
+ },{key:"left",cmd:`${PLUGIN_ID}.wizard.back`
322
+ },{key:"right",cmd:`${PLUGIN_ID}.wizard.forward`
323
+ },{key:"space",cmd:`${PLUGIN_ID}.wizard.select`
324
+ },{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
325
+ }]
326
+ })
327
+ onCleanup(unregister)
328
+ return _$createComponent3(DialogSurface,{get api(){return props.api
329
+ },get children(){return [(()=>{var _el$=_$createElement3("box"),_el$2=_$createElement3("text"),_el$3=_$createTextNode3(` Navigator setup`),_el$4=_$createElement3("text"),_el$5=_$createTextNode3(`Step `),_el$6=_$createTextNode3(`/`),_el$7=_$createTextNode3(` \xB7 `)
330
+ _$insertNode3(_el$,_el$2)
331
+ _$insertNode3(_el$,_el$4)
332
+ _$setProp3(_el$,"flexDirection","row")
333
+ _$setProp3(_el$,"justifyContent","space-between")
334
+ _$insertNode3(_el$2,_el$3)
335
+ _$insert3(_el$2,()=>icons.icon("help"),_el$3)
336
+ _$insertNode3(_el$4,_el$5)
337
+ _$insertNode3(_el$4,_el$6)
338
+ _$insertNode3(_el$4,_el$7)
339
+ _$setProp3(_el$4,"onMouseDown",(event)=>event.stopPropagation())
340
+ _$setProp3(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
341
+ finish()
342
+ })
343
+ _$insert3(_el$4,()=>step() + 1,_el$6)
344
+ _$insert3(_el$4,stepCount,_el$7)
345
+ _$insert3(_el$4,()=>icons.key("esc"),null)
346
+ _$effect3((_p$)=>{var _v$=TextAttributes3.BOLD,_v$2=theme().text,_v$3=theme().textMuted
347
+ _v$!==_p$.e&&(_p$.e=_$setProp3(_el$2,"attributes",_v$,_p$.e))
348
+ _v$2!==_p$.t&&(_p$.t=_$setProp3(_el$2,"fg",_v$2,_p$.t))
349
+ _v$3!==_p$.a&&(_p$.a=_$setProp3(_el$4,"fg",_v$3,_p$.a))
350
+ return _p$
351
+ },{e:undefined,t:undefined,a:undefined
352
+ })
353
+ return _el$
354
+ })(),_$createComponent3(Show,{get when(){return configuring()
355
+ },get fallback(){return _$createComponent3(OnboardingStep,{get api(){return props.api
356
+ },get preferences(){return props.preferences
357
+ },get step(){return ONBOARDING_STEPS[step()]
358
+ },get final(){return step()===ONBOARDING_STEPS.length-1
359
+ },onBack:back,onAdvance:advance
360
+ })
361
+ },get children(){return _$createComponent3(SectionConfig,{get api(){return props.api
362
+ },get preferences(){return props.preferences
363
+ },get active(){return active()
364
+ },onActive:setActive,onBack:back,onFinish:finish
365
+ })
366
+ }})]
367
+ }})
368
+ }
369
+ import {setProp as _$setProp4} from "@opentui/solid"
370
+ import {effect as _$effect4} from "@opentui/solid"
371
+ import {createTextNode as _$createTextNode4} from "@opentui/solid"
372
+ import {insertNode as _$insertNode4} from "@opentui/solid"
373
+ import {createElement as _$createElement4} from "@opentui/solid"
374
+ function openLimitsRefreshPrompt(api,preferences,dialogs){const scope=preferences.preferenceScopeLabel()
375
+ dialogs.prompt({title:"Limits refresh interval",description:()=>(()=>{var _el$=_$createElement4("text")
376
+ _$insertNode4(_el$,_$createTextNode4(`Automatic refresh in minutes (minimum 1; default 5). Manual Refresh stays immediate.`))
377
+ _$effect4((_$p)=>_$setProp4(_el$,"fg",api.theme.current.textMuted,_$p))
378
+ return _el$
379
+ })(),value:String(preferences.selectedLimitsRefreshMinutes()),onConfirm(value){if(preferences.preferenceScopeLabel()!==scope)
380
+ throw new Error("Preference scope changed; reopen this setting")
381
+ if(!/^\d+$/.test(value.trim()))
382
+ throw new Error("Enter whole minutes (at least 1 minute)")
383
+ preferences.setLimitsRefreshMinutes(Number(value))
384
+ dialogs.back()
385
+ }})
386
+ }
387
+ async function load(input){const path=import.meta.url.includes("/dist/")?"./toolbar-settings.js":"./open-toolbar"
388
+ try{return await import(path)
389
+ } catch(error){input.api.ui.toast({variant:"error",title:"Toolbar",message:String(error)})
390
+ return
391
+ }}
392
+ async function openToolbarManager(input){const route=JSON.stringify(input.api.route.current)
393
+ const target=input.skills?.target().key
394
+ const wasOpen=input.api.ui.dialog.open
395
+ const module=await load(input)
396
+ if(route===JSON.stringify(input.api.route.current)&&target===input.skills?.target().key&&(!wasOpen||input.api.ui.dialog.open)&&!input.api.lifecycle?.signal?.aborted)
397
+ module?.openToolbarManager(input)
398
+ }
399
+ function createSettingsSelection(input){const dialogClosed=()=>("open" in input.api.ui.dialog)&&!input.api.ui.dialog.open
400
+ function openLimitPrompt(section){const index=input.options().findIndex((option)=>option.value===section)
401
+ if(index!==-1)
402
+ input.setActive(index)
403
+ input.dialogs.prompt({title:`${SECTION_DEFINITIONS.find((item) => item.name === section).label} item limit`,description:()=>(()=>{var _el$=_$createElement5("text")
404
+ _$insertNode5(_el$,_$createTextNode5(`Visible items before Show all. Enter 0 for All.`))
405
+ _$effect5((_$p)=>_$setProp5(_el$,"fg",input.api.theme.current.textMuted,_$p))
406
+ return _el$
407
+ })(),value:String(input.preferences.selectedSectionItemLimit(section)),onConfirm(value){if(!/^\d+$/.test(value.trim()))
408
+ throw new Error("Enter a non-negative whole number (0 for All)")
409
+ input.preferences.setSectionItemLimit(section,Number(value))
410
+ input.dialogs.back()
411
+ }})
412
+ }
413
+ function openShortcut(value){const bindings={toggle_key:{title:"Sidebar shortcut",get:input.preferences.selectedToggleKey,set:input.preferences.setToggleKey
414
+ },focus_key:{title:"Focus shortcut",get:input.preferences.selectedFocusKey,set:input.preferences.setFocusKey
415
+ },search_key:{title:"Search Everything shortcut",get:input.preferences.selectedSearchKey,set:input.preferences.setSearchKey
416
+ }}
417
+ const binding=bindings[value]
418
+ input.dialogs.prompt({title:binding.title,description:()=>(()=>{var _el$3=_$createElement5("text")
419
+ _$insertNode5(_el$3,_$createTextNode5(`Use OpenCode key syntax, for example alt+s.`))
420
+ _$effect5((_$p)=>_$setProp5(_el$3,"fg",input.api.theme.current.textMuted,_$p))
421
+ return _el$3
422
+ })(),value:binding.get(),onConfirm(key){binding.set(key)
423
+ input.dialogs.back()
424
+ }})
425
+ }
426
+ function saveLayout(){input.preferences.saveLayoutAsDefault().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Current layout saved as default",duration:3000
427
+ })).catch((error)=>input.api.ui.toast({variant:"error",title:"Navigator settings",message:error instanceof Error?error.message:"Failed to save the default layout",duration:5000
428
+ }))
429
+ }
430
+ function exportSettings(){const copied=input.api.renderer.copyToClipboardOSC52(input.preferences.exportPortableSettings())
431
+ input.api.ui.toast({variant:copied?"success":"warning",title:"Portable settings",message:copied?"Layout, MCP, and toolbar overflow copied as JSON":"Terminal clipboard is unavailable",duration:4000
432
+ })
433
+ }
434
+ function importSettings(){const path=import.meta.url.includes("/dist/")?"./settings-import.js":"../ui/settings-import-dialog"
435
+ import(path).then((module)=>{if(!dialogClosed())
436
+ module.openSettingsImport(input)
437
+ }).catch((error)=>input.api.ui.toast({variant:"error",title:"Portable settings",message:String(error)
438
+ }))
439
+ }
440
+ function select(value=input.options()[input.active()]?.value){if(!value)
441
+ return
442
+ const index=input.options().findIndex((option)=>option.value===value)
443
+ if(index!==-1)
444
+ input.setActive(index)
445
+ if(value==="scope:global"||value==="scope:worktree")
446
+ input.preferences.setPreferenceScope(value==="scope:global"?"global":"worktree")
447
+ else if(value.startsWith("preset:custom:"))
448
+ input.openPreset(decodeURIComponent(value.slice("preset:custom:".length)))
449
+ else
450
+ switch(value){case "toolbar_manager":{openToolbarManager(input)
451
+ break
452
+ }
453
+ case "toolbar_overflow":{input.preferences.toggleToolbarOverflow()
454
+ break
455
+ }
456
+ case "save_preset":{input.promptPreset()
457
+ break
458
+ }
459
+ case "save_layout":{saveLayout()
460
+ break
461
+ }
462
+ case "export_settings":{exportSettings()
463
+ break
464
+ }
465
+ case "import_settings":{importSettings()
466
+ break
467
+ }
468
+ case "reload_settings":{input.preferences.reloadFromFile().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Saved settings reloaded",duration:3000
469
+ })).catch((error)=>input.api.ui.toast({variant:"error",title:"Navigator settings",message:error instanceof Error?error.message:"Could not reload saved settings",duration:5000
470
+ }))
471
+ break
472
+ }
473
+ case "reset_sections":{input.preferences.resetSections()
474
+ break
475
+ }
476
+ case "session_title":{input.preferences.toggleSessionTitleVisibility()
477
+ break
478
+ }
479
+ case "session_date":{input.preferences.toggleSessionDateVisibility()
480
+ break
481
+ }
482
+ case "persist_mcp":{input.preferences.toggleMcpPersistence()
483
+ break
484
+ }
485
+ case "limits_refresh":{openLimitsRefreshPrompt(input.api,input.preferences,input.dialogs)
486
+ break
487
+ }
488
+ case "start_in_chat":{input.preferences.toggleStartInChat()
489
+ break
490
+ }
491
+ case "auto_approve_permissions":{input.preferences.setAutoApprovePermissions(input.preferences.autoApprovePermissions()!==true)
492
+ break
493
+ }
494
+ case "lsp_icon_style":{input.preferences.toggleLspIconStyle()
495
+ break
496
+ }
497
+ case "corner_font":{input.preferences.toggleCornerFont()
498
+ break
499
+ }
500
+ case "row_density":{input.preferences.toggleRowDensity()
501
+ break
502
+ }
503
+ case "toggle_key":{openShortcut("toggle_key")
504
+ break
505
+ }
506
+ case "focus_key":{openShortcut("focus_key")
507
+ break
508
+ }
509
+ case "search_key":{openShortcut("search_key")
510
+ break
511
+ }
512
+ case "reset_settings":{input.preferences.resetPluginSettings()
513
+ break
514
+ }
515
+ case "reset_mcp":{input.preferences.resetMcpStates()
516
+ break
517
+ }
518
+ case "trusted_skills":{const path=import.meta.url.includes("/dist/")?"./trusted-skills.js":"../ui/trusted-skills-dialog"
519
+ import(path).then((module)=>{if(dialogClosed())
520
+ return
521
+ const{TrustedSkillsDialog
522
+ }=module
523
+ input.dialogs.open(()=>_$createComponent4(TrustedSkillsDialog,{get api(){return input.api
524
+ },get preferences(){return input.preferences
525
+ }}))
526
+ }).catch((error)=>input.api.ui.toast({variant:"error",title:"Trusted skills",message:String(error)
527
+ }))
528
+ break
529
+ }
530
+ case "wizard":{input.dialogs.open(()=>_$createComponent4(FirstRunWizard,{get api(){return input.api
531
+ },get preferences(){return input.preferences
532
+ }}))
533
+ break
534
+ }
535
+ default:{input.preferences.toggleSelectedSection(value)
536
+ }}}
537
+ function openQuickActions(){input.setActive(input.options().findIndex((option)=>option.value==="quick_actions"))
538
+ const path=import.meta.url.includes("/dist/")?"./quick-actions-settings.js":"../ui/quick-actions-dialog"
539
+ import(path).then((module)=>{if(dialogClosed())
540
+ return
541
+ const{QuickActionsDialog
542
+ }=module
543
+ input.dialogs.open(()=>_$createComponent4(QuickActionsDialog,{get api(){return input.api
544
+ },get preferences(){return input.preferences
545
+ }}))
546
+ }).catch((error)=>{input.api.ui.toast({variant:"error",title:"Quick actions",message:String(error),duration:4000
547
+ })
548
+ })
549
+ }
550
+ function openMcpGroups(){if(!input.mcp)
551
+ return
552
+ input.setActive(input.options().findIndex((option)=>option.value==="mcp"))
553
+ const path=import.meta.url.includes("/dist/")?"./mcp-groups.js":"../ui/mcp-groups-dialog"
554
+ import(path).then((module)=>{if(dialogClosed())
555
+ return
556
+ const{McpGroupsDialog
557
+ }=module
558
+ input.dialogs.open(()=>_$createComponent4(McpGroupsDialog,{get api(){return input.api
559
+ },get preferences(){return input.preferences
560
+ },get mcp(){return input.mcp
561
+ }}))
562
+ }).catch((error)=>{input.api.ui.toast({variant:"error",title:"MCP groups",message:String(error),duration:4000
563
+ })
564
+ })
565
+ }
566
+ function openSkillGroups(){if(!input.skills)
567
+ return
568
+ input.setActive(input.options().findIndex((option)=>option.value==="skills"))
569
+ const path=import.meta.url.includes("/dist/")?"./skill-groups.js":"../ui/skill-groups-dialog"
570
+ import(path).then((module)=>{if(dialogClosed())
571
+ return
572
+ const{SkillGroupsDialog
573
+ }=module
574
+ input.dialogs.open(()=>_$createComponent4(SkillGroupsDialog,{get api(){return input.api
575
+ },get preferences(){return input.preferences
576
+ },get skills(){return input.skills
577
+ }}))
578
+ }).catch((error)=>{input.api.ui.toast({variant:"error",title:"Skill groups",message:String(error),duration:4000
579
+ })
580
+ })
581
+ }
582
+ return{openLimitPrompt,openMcpGroups,openSkillGroups,openQuickActions,select
583
+ }}
584
+ function createSettingsDialogController(props){let body
585
+ const theme=()=>props.api.theme.current
586
+ const icons=useIcons4()
587
+ const dialogs=useDialogs2(props.api)
588
+ const scroll=useDialogScroll()
589
+ const dimensions=useTerminalDimensions()
590
+ const bodyHeight=createMemo2(()=>Math.max(4,Math.floor(dimensions().height*0.75)-10))
591
+ const orderedGroups=createSettingsGroups(props.api,props.preferences,icons)
592
+ const initialGroup=orderedGroups().find((group)=>group.options.some((option)=>option.value===props.activeValue))
593
+ const [activeGroup,setActiveGroup]=useDialogState("tab",initialGroup?.id??orderedGroups()[0].id)
594
+ const options=createMemo2(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
595
+ const optionId=(value)=>`${PLUGIN_ID}.settings.${value}`
596
+ const initialActive=options().findIndex((option)=>option.value===props.activeValue)
597
+ const [active,setActive]=useDialogState("selection",Math.max(0,initialActive))
598
+ createEffect(()=>{if(active()>=options().length)
599
+ setActive(Math.max(0,options().length-1))
600
+ })
601
+ const contentHeight=createMemo2(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
602
+ const footerHint=createMemo2(()=>{const common=`${icons.key("tab")} switch \xB7 ${icons.key("up/down")} navigate`
603
+ if(activeGroup()==="sections")
604
+ return `${common} \xB7 ${icons.key("enter")} toggle \xB7 l item limit${options()[active()]?.value === "quick_actions" ? " \xB7 a actions" : ""}${["mcp", "skills"].includes(options()[active()]?.value ?? "") ? " \xB7 g groups" : ""} \xB7 ${icons.key("left/right")} or ${icons.key("shift+up/down")} reorder`
605
+ if(activeGroup()==="presets")
606
+ return `${common} \xB7 ${icons.key("enter")} manage`
607
+ if(activeGroup()==="behavior")
608
+ return `${common} \xB7 ${icons.key("enter")} change`
609
+ if(activeGroup()==="defaults")
610
+ return `${common} \xB7 ${icons.key("enter")} run`
611
+ return `${common} \xB7 ${icons.key("enter")} select`
612
+ })
613
+ onMount(()=>{queueMicrotask(()=>{const option=options()[active()]
614
+ if(option)
615
+ body?.scrollChildIntoView(optionId(option.value))
616
+ })
617
+ })
618
+ function move(offset){const next=(active() + offset + options().length)%options().length
619
+ setActive(next)
620
+ const option=options()[next]
621
+ if(option)
622
+ body?.scrollChildIntoView(optionId(option.value))
623
+ }
624
+ function switchGroup(offset){const index=orderedGroups().findIndex((group)=>group.id===activeGroup())
625
+ const group=orderedGroups()[(index + offset + orderedGroups().length)%orderedGroups().length]
626
+ setActiveGroup(group.id)
627
+ setActive(0)
628
+ queueMicrotask(()=>{const option=options()[0]
629
+ if(option)
630
+ body?.scrollChildIntoView(optionId(option.value))
631
+ })
632
+ }
633
+ function reorder(value,direction){if(!value||!SIDEBAR_SECTIONS.includes(value))
634
+ return
635
+ props.preferences.moveSelectedSection(value,direction)
636
+ queueMicrotask(()=>{const next=options().findIndex((candidate)=>candidate.value===value)
637
+ if(next===-1)
638
+ return
639
+ setActive(next)
640
+ body?.scrollChildIntoView(optionId(value))
641
+ })
642
+ }
643
+ function runPresetAction(action,name){const path=import.meta.url.includes("/dist/")?"./layout-preset-actions.js":"./layout-preset-actions"
644
+ import(path).then((module)=>{if("open" in props.api.ui.dialog&&!props.api.ui.dialog.open)
645
+ return
646
+ const factory=module.createLayoutPresetActions
647
+ const actions=factory({api:props.api,preferences:props.preferences,mcp:props.mcp,dialogs
648
+ })
649
+ if(action==="open"&&name)
650
+ actions.open(name)
651
+ else
652
+ actions.prompt()
653
+ }).catch((error)=>props.api.ui.toast({variant:"error",title:"Layout presets",message:String(error)
654
+ }))
655
+ }
656
+ const selection=createSettingsSelection({api:props.api,preferences:props.preferences,mcp:props.mcp,skills:props.skills,dialogs,options,active,setActive,openPreset:(name)=>runPresetAction("open",name),promptPreset:()=>runPresetAction("prompt")
657
+ })
658
+ const unregister=registerSettingsKeymap({api:props.api,active,activeGroup,options,move,switchGroup,reorder,select:selection.select,openQuickActions:selection.openQuickActions,openMcpGroups:selection.openMcpGroups,openSkillGroups:selection.openSkillGroups,openLimitPrompt:selection.openLimitPrompt
659
+ })
660
+ onCleanup2(unregister)
661
+ return{active,activeGroup,contentHeight,dialogs,footerHint,icons,openLimitPrompt:selection.openLimitPrompt,openQuickActions:selection.openQuickActions,openMcpGroups:selection.openMcpGroups,openSkillGroups:selection.openSkillGroups,options,optionId,orderedGroups,reorder,select:selection.select,setActive,setActiveGroup,setBody(node){body=node
662
+ scroll.ref(node)
663
+ },restoreScroll:scroll.restore,saveScroll:scroll.save,theme
664
+ }}
665
+ import {createComponent as _$createComponent5} from "@opentui/solid"
666
+ import {createTextNode as _$createTextNode6} from "@opentui/solid"
667
+ import {insertNode as _$insertNode6} from "@opentui/solid"
668
+ import {effect as _$effect6} from "@opentui/solid"
669
+ import {insert as _$insert4} from "@opentui/solid"
670
+ import {setProp as _$setProp6} from "@opentui/solid"
671
+ import {createElement as _$createElement6} from "@opentui/solid"
672
+ import {memo as _$memo3} from "@opentui/solid"
673
+ import {TextAttributes as TextAttributes4} from "@opentui/core"
674
+ import {Show as Show2} from "solid-js"
675
+ import {SelectionBox as SelectionBox3} from "./tui.js"
676
+ function SettingsOptionRow(props){const model=props.controller
677
+ const index=()=>model.options().findIndex((candidate)=>candidate.value===props.option.value)
678
+ const selected=()=>model.active()===index()
679
+ const section=()=>props.option.value
680
+ return _$createComponent5(SelectionBox3,{get id(){return model.optionId(props.option.value)
681
+ },flexDirection:"row",gap:2,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo3(()=>!!selected())()?model.theme().backgroundElement:undefined
682
+ },onMouseOver:()=>model.setActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
683
+ model.select(props.option.value)
684
+ },get children(){return [(()=>{var _el$=_$createElement6("text")
685
+ _$setProp6(_el$,"flexShrink",0)
686
+ _$insert4(_el$,()=>props.option.title)
687
+ _$effect6((_p$)=>{var _v$=selected()?TextAttributes4.BOLD:undefined,_v$2=model.theme().text
688
+ _v$!==_p$.e&&(_p$.e=_$setProp6(_el$,"attributes",_v$,_p$.e))
689
+ _v$2!==_p$.t&&(_p$.t=_$setProp6(_el$,"fg",_v$2,_p$.t))
690
+ return _p$
691
+ },{e:undefined,t:undefined
692
+ })
693
+ return _el$
694
+ })(),(()=>{var _el$2=_$createElement6("text")
695
+ _$setProp6(_el$2,"flexGrow",1)
696
+ _$insert4(_el$2,()=>props.option.description)
697
+ _$effect6((_$p)=>_$setProp6(_el$2,"fg",model.theme().borderSubtle,_$p))
698
+ return _el$2
699
+ })(),_$createComponent5(Show2,{get when(){return SIDEBAR_SECTIONS.includes(section())
700
+ },get children(){var _el$3=_$createElement6("box"),_el$8=_$createElement6("text"),_el$9=_$createTextNode6(` Items: `),_el$0=_$createElement6("text"),_el$1=_$createElement6("text")
701
+ _$insertNode6(_el$3,_el$8)
702
+ _$insertNode6(_el$3,_el$0)
703
+ _$insertNode6(_el$3,_el$1)
704
+ _$setProp6(_el$3,"flexDirection","row")
705
+ _$setProp6(_el$3,"flexShrink",0)
706
+ _$setProp6(_el$3,"gap",1)
707
+ _$insert4(_el$3,_$createComponent5(Show2,{get when(){return props.option.value==="quick_actions"
708
+ },get children(){var _el$4=_$createElement6("text"),_el$5=_$createTextNode6(` Actions`)
709
+ _$insertNode6(_el$4,_el$5)
710
+ _$setProp6(_el$4,"onMouseDown",(event)=>event.stopPropagation())
711
+ _$setProp6(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
712
+ model.openQuickActions()
713
+ })
714
+ _$insert4(_el$4,()=>model.icons.icon("actions"),_el$5)
715
+ _$effect6((_$p)=>_$setProp6(_el$4,"fg",model.theme().accent,_$p))
716
+ return _el$4
717
+ }}),_el$8)
718
+ _$insert4(_el$3,_$createComponent5(Show2,{get when(){return props.option.value==="mcp"||props.option.value==="skills"
719
+ },get children(){var _el$6=_$createElement6("text"),_el$7=_$createTextNode6(` Groups`)
720
+ _$insertNode6(_el$6,_el$7)
721
+ _$setProp6(_el$6,"onMouseDown",(event)=>event.stopPropagation())
722
+ _$setProp6(_el$6,"onMouseUp",(event)=>{event.stopPropagation()
723
+ if(props.option.value==="skills")
724
+ model.openSkillGroups()
725
+ else
726
+ model.openMcpGroups()
727
+ })
728
+ _$insert4(_el$6,()=>model.icons.icon("sections"),_el$7)
729
+ _$effect6((_$p)=>_$setProp6(_el$6,"fg",model.theme().accent,_$p))
730
+ return _el$6
731
+ }}),_el$8)
732
+ _$insertNode6(_el$8,_el$9)
733
+ _$setProp6(_el$8,"onMouseDown",(event)=>event.stopPropagation())
734
+ _$setProp6(_el$8,"onMouseUp",(event)=>{event.stopPropagation()
735
+ model.openLimitPrompt(section())
736
+ })
737
+ _$insert4(_el$8,()=>model.icons.icon("todo"),_el$9)
738
+ _$insert4(_el$8,()=>props.preferences.selectedSectionItemLimit?.(section())||"All",null)
739
+ _$setProp6(_el$0,"onMouseDown",(event)=>{event.stopPropagation()
740
+ model.reorder(props.option.value,-1)
741
+ })
742
+ _$insert4(_el$0,()=>model.icons.icon("up"))
743
+ _$setProp6(_el$1,"onMouseDown",(event)=>{event.stopPropagation()
744
+ model.reorder(props.option.value,1)
745
+ })
746
+ _$insert4(_el$1,()=>model.icons.icon("down"))
747
+ _$effect6((_p$)=>{var _v$3=model.theme().accent,_v$4=model.theme().accent,_v$5=model.theme().accent
748
+ _v$3!==_p$.e&&(_p$.e=_$setProp6(_el$8,"fg",_v$3,_p$.e))
749
+ _v$4!==_p$.t&&(_p$.t=_$setProp6(_el$0,"fg",_v$4,_p$.t))
750
+ _v$5!==_p$.a&&(_p$.a=_$setProp6(_el$1,"fg",_v$5,_p$.a))
751
+ return _p$
752
+ },{e:undefined,t:undefined,a:undefined
753
+ })
754
+ return _el$3
755
+ }})]
756
+ }})
757
+ }
758
+ function SettingsDialog(props){const model=createSettingsDialogController(props)
759
+ return _$createComponent6(DialogSurface2,{get api(){return props.api
760
+ },get children(){return [(()=>{var _el$=_$createElement7("box"),_el$2=_$createElement7("text"),_el$3=_$createTextNode7(` Navigator settings`),_el$4=_$createElement7("text")
761
+ _$insertNode7(_el$,_el$2)
762
+ _$insertNode7(_el$,_el$4)
763
+ _$setProp7(_el$,"flexDirection","row")
764
+ _$setProp7(_el$,"justifyContent","space-between")
765
+ _$insertNode7(_el$2,_el$3)
766
+ _$insert5(_el$2,()=>model.icons.icon("settings"),_el$3)
767
+ _$setProp7(_el$4,"onMouseDown",(event)=>event.stopPropagation())
768
+ _$setProp7(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
769
+ model.dialogs.back()
770
+ })
771
+ _$insert5(_el$4,()=>model.icons.key("esc"))
772
+ _$effect7((_p$)=>{var _v$=TextAttributes5.BOLD,_v$2=model.theme().text,_v$3=model.theme().textMuted
773
+ _v$!==_p$.e&&(_p$.e=_$setProp7(_el$2,"attributes",_v$,_p$.e))
774
+ _v$2!==_p$.t&&(_p$.t=_$setProp7(_el$2,"fg",_v$2,_p$.t))
775
+ _v$3!==_p$.a&&(_p$.a=_$setProp7(_el$4,"fg",_v$3,_p$.a))
776
+ return _p$
777
+ },{e:undefined,t:undefined,a:undefined
778
+ })
779
+ return _el$
780
+ })(),(()=>{var _el$5=_$createElement7("text")
781
+ _$insertNode7(_el$5,_$createTextNode7(`Adjust sections and behavior. Changes apply immediately.`))
782
+ _$effect7((_$p)=>_$setProp7(_el$5,"fg",model.theme().textMuted,_$p))
783
+ return _el$5
784
+ })(),(()=>{var _el$7=_$createElement7("box")
785
+ _$setProp7(_el$7,"flexDirection","row")
786
+ _$setProp7(_el$7,"gap",1)
787
+ _$insert5(_el$7,_$createComponent6(For3,{get each(){return model.orderedGroups()
788
+ },children:(group)=>_$createComponent6(Tab,{get api(){return props.api
789
+ },get selected(){return model.activeGroup()===group.id
790
+ },paddingLeft:1,paddingRight:1,onMouseDown:()=>{model.setActiveGroup(group.id)
791
+ model.setActive(0)
792
+ },get children(){return [_$memo4(()=>model.icons.tab(group.id))," ",_$memo4(()=>group.tab)]
793
+ }})
794
+ }))
795
+ return _el$7
796
+ })(),(()=>{var _el$8=_$createElement7("scrollbox"),_el$9=_$createElement7("box")
797
+ _$insertNode7(_el$8,_el$9)
798
+ var _ref$=model.setBody
799
+ typeof _ref$==="function"?_$use(_ref$,_el$8):model.setBody=_el$8
800
+ _$setProp7(_el$8,"id",`${PLUGIN_ID}.settings.body`)
801
+ _$setProp7(_el$8,"scrollX",false)
802
+ _$setProp7(_el$8,"verticalScrollbarOptions",{visible:true
803
+ })
804
+ _$setProp7(_el$8,"horizontalScrollbarOptions",{visible:false
805
+ })
806
+ _$setProp7(_el$9,"gap",1)
807
+ _$insert5(_el$9,_$createComponent6(For3,{get each(){return model.options()
808
+ },children:(option)=>_$createComponent6(SettingsOptionRow,{get preferences(){return props.preferences
809
+ },controller:model,option
810
+ })
811
+ }))
812
+ _$effect7((_p$)=>{var{restoreScroll:_v$4,saveScroll:_v$5}=model,_v$6=model.contentHeight()
813
+ _v$4!==_p$.e&&(_p$.e=_$setProp7(_el$8,"renderBefore",_v$4,_p$.e))
814
+ _v$5!==_p$.t&&(_p$.t=_$setProp7(_el$8,"renderAfter",_v$5,_p$.t))
815
+ _v$6!==_p$.a&&(_p$.a=_$setProp7(_el$8,"height",_v$6,_p$.a))
816
+ return _p$
817
+ },{e:undefined,t:undefined,a:undefined
818
+ })
819
+ return _el$8
820
+ })(),(()=>{var _el$0=_$createElement7("text")
821
+ _$insert5(_el$0,()=>model.footerHint())
822
+ _$effect7((_$p)=>_$setProp7(_el$0,"fg",model.theme().textMuted,_$p))
823
+ return _el$0
824
+ })()]
825
+ }})
826
+ }
827
+ export{SettingsDialog
828
+ }