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.
- package/CHANGELOG.md +14 -1
- package/README.md +101 -21
- package/dist/{chunk-d1bws32s.js → chunk-dz8cfnfs.js} +4 -3
- package/dist/chunk-qmntexwm.js +0 -0
- package/dist/chunk-v6bz59xn.js +20 -0
- package/dist/icon-picker.js +175 -0
- package/dist/layout-preset-actions.js +4 -20
- package/dist/navigator-updates.js +12 -4
- package/dist/project-profile.js +12 -4
- package/dist/provider-limits.js +34 -26
- package/dist/quick-actions-settings.js +5 -13
- package/dist/rpc.js +1 -0
- package/dist/runtime-dependencies.json +10 -0
- package/dist/server.js +16 -54
- package/dist/settings-import.js +4 -3
- package/dist/sidebar-settings.js +828 -0
- package/dist/sidebar-shortcuts.js +261 -0
- package/dist/toolbar-settings.js +161 -0
- package/dist/tui.js +955 -992
- package/package.json +8 -7
- package/scripts/snapshot-runtime.mjs +32 -0
- package/scripts/update-local-snapshot.mjs +14 -3
package/dist/tui.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {insert as _$insert,setProp as _$setProp,createElement as _$createElement,memo as _$memo,createComponent as _$createComponent,mergeProps as _$mergeProps,effect as _$effect,createTextNode as _$createTextNode,insertNode as _$insertNode,use as _$use,spread as _$spread,useTerminalDimensions,useTerminalDimensions as useTerminalDimensions2,useTerminalDimensions as useTerminalDimensions3,useTerminalDimensions as useTerminalDimensions4,useTerminalDimensions as useTerminalDimensions5,useTerminalDimensions as useTerminalDimensions6,useTerminalDimensions as useTerminalDimensions7} from "@opentui/solid"
|
|
1
|
+
import {insert as _$insert,setProp as _$setProp,createElement as _$createElement,memo as _$memo,createComponent as _$createComponent,mergeProps as _$mergeProps,effect as _$effect,createTextNode as _$createTextNode,insertNode as _$insertNode,use as _$use,spread as _$spread,useTerminalDimensions,useTerminalDimensions as useTerminalDimensions2,useTerminalDimensions as useTerminalDimensions3,useTerminalDimensions as useTerminalDimensions4,useTerminalDimensions as useTerminalDimensions5,useTerminalDimensions as useTerminalDimensions6,useTerminalDimensions as useTerminalDimensions7,useTerminalDimensions as useTerminalDimensions8,useTerminalDimensions as useTerminalDimensions9} from "@opentui/solid"
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,
|
|
6
|
+
import {createSignal as createSignal2,createSignal,createEffect,onCleanup,createContext,useContext,createContext as createContext2,createSignal as createSignal3,useContext as useContext2,createEffect as createEffect2,splitProps,untrack,splitProps as splitProps2,For,createEffect as createEffect3,onCleanup as onCleanup2,createEffect as createEffect4,Show,splitProps as splitProps3,Suspense,lazy,createSignal as createSignal4,createSignal as createSignal5,onCleanup as onCleanup3,Show as Show2,batch,createSignal as createSignal7,createSignal as createSignal6,createEffect as createEffect5,createSignal as createSignal8,onCleanup as onCleanup4,createSignal as createSignal9,createSignal as createSignal10,Suspense as Suspense2,lazy as lazy2,Index,onCleanup as onCleanup5,createSignal as createSignal11,onCleanup as onCleanup6,createEffect as createEffect7,onCleanup as onCleanup8,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal12,onCleanup as onCleanup7,onMount,For as For2,For as For3,Show as Show3,createMemo as createMemo2,Show as Show4,createSignal as createSignal13,onCleanup as onCleanup9,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 Show6,createEffect as createEffect8,createSignal as createSignal14,onCleanup as onCleanup10,Show as Show5,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup11,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,Suspense as Suspense3,lazy as lazy3,onCleanup as onCleanup12,createEffect as createEffect11,onCleanup as onCleanup13,createSignal as createSignal15,createMemo as createMemo7,createSignal as createSignal16,lazy as lazy4,Show as Show9,For as For10,Show as Show8,Show as Show7,createEffect as createEffect12,onCleanup as onCleanup14,onMount as onMount4,onCleanup as onCleanup15,onMount as onMount5,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show10,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show13,createMemo as createMemo9,createComputed,createMemo as createMemo8,createSignal as createSignal21,untrack as untrack3,Show as Show11,createComputed as createComputed2,untrack as untrack4,Show as Show12,createSignal as createSignal23,createEffect as createEffect13,createSignal as createSignal22,on,createMemo as createMemo11,createSignal as createSignal26,createMemo as createMemo10,For as For13,Show as Show17,Show as Show14,Show as Show15,createSignal as createSignal24,createContext as createContext3,useContext as useContext3,Show as Show16,createSignal as createSignal25,onCleanup as onCleanup17,Show as Show23,createSignal as createSignal27,untrack as untrack5,createSignal as createSignal28,createSignal as createSignal29,createEffect as createEffect14,For as For15,Show as Show18,For as For14,Show as Show19,Show as Show20,Show as Show21,Show as Show22,For as For16,Show as Show25,createMemo as createMemo13,Show as Show24,createMemo as createMemo12,createSignal as createSignal30,createContext as createContext4,useContext as useContext4,Show as Show26,Suspense as Suspense4,createEffect as createEffect15,onCleanup as onCleanup18,untrack as untrack6,For as For22,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup24,For as For17,Show as Show27,createMemo as createMemo15,createSignal as createSignal32,createEffect as createEffect16,createMemo as createMemo14,onCleanup as onCleanup19,untrack as untrack7,createEffect as createEffect17,createSignal as createSignal31,onCleanup as onCleanup20,For as For18,Show as Show29,createSignal as createSignal33,createEffect as createEffect18,createMemo as createMemo16,onCleanup as onCleanup21,untrack as untrack8,Show as Show28,For as For20,Show as Show32,createEffect as createEffect19,createMemo as createMemo17,createSignal as createSignal34,onCleanup as onCleanup22,untrack as untrack9,For as For19,Show as Show31,Show as Show30,Show as Show36,createEffect as createEffect20,createMemo as createMemo18,createSignal as createSignal35,onCleanup as onCleanup23,untrack as untrack10,For as For21,Show as Show34,Show as Show33,Show as Show35,createEffect as createEffect21,createMemo as createMemo20,onCleanup as onCleanup25,untrack as untrack11,Show as Show37,createMemo as createMemo21,onCleanup as onCleanup26,createEffect as createEffect22,createMemo as createMemo22,on as on2,onCleanup as onCleanup27,createSignal as createSignal36,onCleanup as onCleanup28,onMount as onMount6} from "solid-js"
|
|
7
7
|
var SIDEBAR_SECTIONS=["limits","todo","subagents","skills","quick_actions","lsp","mcp"]
|
|
8
8
|
var QUICK_ACTION_IDS=["session.rename","session.timeline","session.copy","session.export","session.compact","session.list","session.new","session.fork","messages.copy","session.first","session.last","session.messages_last_user","session.message.next","session.message.previous","permission.mode"]
|
|
9
9
|
function preferencesScope(path){return path.worktree||path.directory||"global"
|
|
@@ -77,7 +77,7 @@ var FOCUS_COMMAND=`${PLUGIN_ID}.focus`
|
|
|
77
77
|
var SEARCH_COMMAND=`${PLUGIN_ID}.search`
|
|
78
78
|
var DEFAULT_SEARCH_KEY="ctrl+shift+k";
|
|
79
79
|
function pluginConfig(options){const iconStyle=options?.icon_style==="nerd"||options?.icon_style==="text"?options.icon_style:options?.lsp_icon_style
|
|
80
|
-
return{toggleKey:typeof options?.toggle_key==="string"&&options.toggle_key.trim()?options.toggle_key.trim():"ctrl+shift+b",focusKey:typeof options?.focus_key==="string"&&options.focus_key.trim()?options.focus_key.trim():"ctrl+shift+f",searchKey:typeof options?.search_key==="string"&&options.search_key.trim()?options.search_key.trim():DEFAULT_SEARCH_KEY,persistMcp:options?.persist_mcp!==false,limitsRefreshMinutes:parseLimitsRefreshMinutes(options?.limits_refresh_minutes)??DEFAULT_LIMITS_REFRESH_MINUTES,startInChat:options?.start_in_chat===true,showSessionTitle:options?.show_session_title!==false,showSessionDate:options?.show_session_date!==false,cornerFont:options?.corner_font!==false,sections:parseSectionVisibility(options?.sections),sectionOrder:parseSectionOrder(options?.section_order)??[...SIDEBAR_SECTIONS],lspIconStyle:iconStyle==="text"?"text":"nerd",rowDensity:options?.row_density==="comfortable"?"comfortable":"compact",sectionItemLimits:parseSectionItemLimits(options?.section_item_limits),quickActionOrder:parseQuickActionOrder(options?.quick_action_order)??[...QUICK_ACTION_IDS],quickActionVisibility:parseQuickActionVisibility(options?.quick_action_visibility)
|
|
80
|
+
return{toggleKey:typeof options?.toggle_key==="string"&&options.toggle_key.trim()?options.toggle_key.trim():"ctrl+shift+b",focusKey:typeof options?.focus_key==="string"&&options.focus_key.trim()?options.focus_key.trim():"ctrl+shift+f",searchKey:typeof options?.search_key==="string"&&options.search_key.trim()?options.search_key.trim():DEFAULT_SEARCH_KEY,persistMcp:options?.persist_mcp!==false,limitsRefreshMinutes:parseLimitsRefreshMinutes(options?.limits_refresh_minutes)??DEFAULT_LIMITS_REFRESH_MINUTES,startInChat:options?.start_in_chat===true,showSessionTitle:options?.show_session_title!==false,showSessionDate:options?.show_session_date!==false,cornerFont:options?.corner_font!==false,sections:parseSectionVisibility(options?.sections),sectionOrder:parseSectionOrder(options?.section_order)??[...SIDEBAR_SECTIONS],lspIconStyle:iconStyle==="text"?"text":"nerd",rowDensity:options?.row_density==="comfortable"?"comfortable":"compact",toolbarOverflow:options?.toolbar_overflow==="wrap"?"wrap":"menu",sectionItemLimits:parseSectionItemLimits(options?.section_item_limits),quickActionOrder:parseQuickActionOrder(options?.quick_action_order)??[...QUICK_ACTION_IDS],quickActionVisibility:parseQuickActionVisibility(options?.quick_action_visibility)
|
|
81
81
|
}}
|
|
82
82
|
function currentLocation(api){const route=api.route.current
|
|
83
83
|
const params="params" in route?route.params:undefined
|
|
@@ -724,8 +724,13 @@ setPosition(body.scrollTop)
|
|
|
724
724
|
|
|
725
725
|
|
|
726
726
|
|
|
727
|
-
import {RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,
|
|
727
|
+
import {BoxRenderable,RGBA,TextAttributes,TextAttributes as TextAttributes2,TextAttributes as TextAttributes3,RGBA as RGBA2,parseColor,TextAttributes as TextAttributes4,TextAttributes as TextAttributes5,TextAttributes as TextAttributes6,TextAttributes as TextAttributes7,RGBA as RGBA3,parseColor as parseColor2,TextAttributes as TextAttributes8,TextAttributes as TextAttributes9,TextAttributes as TextAttributes12,TextAttributes as TextAttributes10,TextAttributes as TextAttributes11,TextAttributes as TextAttributes13,TextAttributes as TextAttributes14,TextAttributes as TextAttributes16,TextAttributes as TextAttributes15,TextAttributes as TextAttributes17,ScrollBoxRenderable,TextAttributes as TextAttributes18} from "@opentui/core"
|
|
728
728
|
|
|
729
|
+
function selectionBackdrop(node){for(let parent=node.parent;parent; parent=parent.parent){if(parent instanceof BoxRenderable&&parent.backgroundColor.a>0)
|
|
730
|
+
return parent.backgroundColor
|
|
731
|
+
}
|
|
732
|
+
return RGBA.fromValues(0,0,0,1)
|
|
733
|
+
}
|
|
729
734
|
function SelectionBox(props){const icons=useIcons()
|
|
730
735
|
const [local,boxProps]=splitProps(props,["ref","iconOnly"])
|
|
731
736
|
let node
|
|
@@ -743,11 +748,9 @@ const right=left + this.width-1
|
|
|
743
748
|
const top=this.screenY
|
|
744
749
|
const bottom=top + this.height-1
|
|
745
750
|
const positions=this.height===1?[[left,top,"selectionLeft"],[right,top,"selectionRight"]]:[[left,top,"selectionTopLeft"],[right,top,"selectionTopRight"],[left,bottom,"selectionBottomLeft"],[right,bottom,"selectionBottomRight"]]
|
|
746
|
-
const
|
|
751
|
+
const backdrop=selectionBackdrop(this)
|
|
747
752
|
for(const [x,y,icon] of positions){if(x<0||y<0||x>=buffer.width||y>=buffer.height)
|
|
748
753
|
continue
|
|
749
|
-
const offset=(y*buffer.width + x)*4
|
|
750
|
-
const backdrop=new RGBA(background.slice(offset,offset + 4))
|
|
751
754
|
if(!this.backgroundColor.equals(backdrop))
|
|
752
755
|
corners.push({x,y,icon,backdrop
|
|
753
756
|
})
|
|
@@ -921,9 +924,11 @@ return _el$
|
|
|
921
924
|
|
|
922
925
|
|
|
923
926
|
|
|
927
|
+
|
|
924
928
|
function SelectionMenu(props){const icons=useIcons()
|
|
925
929
|
const dialogs=useDialogs(props.api)
|
|
926
930
|
const scroll=useDialogScroll()
|
|
931
|
+
const dimensions=useTerminalDimensions2()
|
|
927
932
|
const [active,setActive]=useDialogState("selection",0)
|
|
928
933
|
const theme=()=>props.api.theme.current
|
|
929
934
|
let body
|
|
@@ -948,6 +953,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
|
|
|
948
953
|
})
|
|
949
954
|
onCleanup2(unregister)
|
|
950
955
|
return _$createComponent(DialogSurface,{get api(){return props.api
|
|
956
|
+
},get lift(){return props.lift
|
|
951
957
|
},get children(){return [(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createElement("text")
|
|
952
958
|
_$insertNode(_el$,_el$2)
|
|
953
959
|
_$insertNode(_el$,_el$4)
|
|
@@ -1000,7 +1006,7 @@ return _el$10
|
|
|
1000
1006
|
})()]
|
|
1001
1007
|
}})
|
|
1002
1008
|
}))
|
|
1003
|
-
_$effect((_p$)=>{var{restore:_v$5,save:_v$6}=scroll,_v$7=props.height??Math.min(props.options.length*3,15)
|
|
1009
|
+
_$effect((_p$)=>{var{restore:_v$5,save:_v$6}=scroll,_v$7=props.adaptive?Math.min(props.height??Math.min(props.options.length*3,15),Math.max(2,Math.floor(dimensions().height*0.75)-8)):props.height??Math.min(props.options.length*3,15)
|
|
1004
1010
|
_v$5!==_p$.e&&(_p$.e=_$setProp(_el$5,"renderBefore",_v$5,_p$.e))
|
|
1005
1011
|
_v$6!==_p$.t&&(_p$.t=_$setProp(_el$5,"renderAfter",_v$6,_p$.t))
|
|
1006
1012
|
_v$7!==_p$.a&&(_p$.a=_$setProp(_el$5,"height",_v$7,_p$.a))
|
|
@@ -1080,6 +1086,32 @@ return _p$
|
|
|
1080
1086
|
return _el$
|
|
1081
1087
|
}}))
|
|
1082
1088
|
}
|
|
1089
|
+
|
|
1090
|
+
function subtleLineColor(background,border){const from=parseColor(background)
|
|
1091
|
+
const to=parseColor(border)
|
|
1092
|
+
return RGBA2.fromValues(from.r + (to.r-from.r)*0.45,from.g + (to.g-from.g)*0.45,from.b + (to.b-from.b)*0.45)
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
var PickerComponent=lazy(async ()=>{const path=import.meta.url.includes("/dist/tui.js")?"./icon-picker.js":"./icon-picker/icon-picker"
|
|
1099
|
+
const module=await import(path)
|
|
1100
|
+
return{default:module.IconPicker
|
|
1101
|
+
}})
|
|
1102
|
+
function IconPicker(props){return(()=>{var _el$=_$createElement("box")
|
|
1103
|
+
_$insert(_el$,_$createComponent(Suspense,{get children(){return _$createComponent(PickerComponent,props)
|
|
1104
|
+
}}))
|
|
1105
|
+
return _el$
|
|
1106
|
+
})()
|
|
1107
|
+
}
|
|
1108
|
+
var glyphs={plus:["\uEA60","+"],check:["\uEAB2","v"],circle:["\uEAEE","o"],star:["\uEA6A","*"],pin:["\uEBAB","^"],bolt:["\uEA86","!"],book:["\uEAA4","B"],search:["\uEA6D","?"],code:["\uEAC4","#"],terminal:["\uEA85",">"],gear:["\uEB51","G"],shield:["\uEBB3","S"],lock:["\uEA75","L"],unlock:["\uEB74","U"],eye:["\uEA70","E"],clock:["\uEA82","T"],refresh:["\uEAF5","R"],history:["\uEA82","H"],copy:["\uEBCC","C"],export:["\uEBAC","X"],edit:["\uEA73","/"],fork:["\uEB9E","F"],list:["\uEBEB","="],play:["\uEB2C",">"],pause:["\uEAD1","|"],stop:["\uEAD7","s"],rocket:["\uEB44","r"],bug:["\uEAAF","b"],beaker:["\uEA79","t"],wand:["\uEAB6","w"],cloud:["\uEABA","c"],server:["\uEB50","s"],folder:["\uEA83","D"],file:["\uEA7B","f"],heart:["\uEB05","h"],lightbulb:["\uEA61","i"],"arrow-up":["\uEAA1","^"],"arrow-down":["\uEA9A","v"],warning:["\uEA6C","!"],close:["\uEA76","x"]
|
|
1109
|
+
}
|
|
1110
|
+
var terminalIconIDs=Object.keys(glyphs)
|
|
1111
|
+
function terminalIcon(id,style){return(glyphs[id]??glyphs.bolt)[style==="nerd"?0:1]
|
|
1112
|
+
}
|
|
1113
|
+
function terminalIconLabel(id){return id.replaceAll("-"," ")
|
|
1114
|
+
}
|
|
1083
1115
|
function McpErrorDialog(props){return _$createComponent(SelectionMenu,{get api(){return props.api
|
|
1084
1116
|
},get title(){return `MCP error \xB7 ${props.name}`
|
|
1085
1117
|
},height:12,get options(){return [{title:`Status \xB7 ${props.status}`,value:"error",description:props.error,icon:"error"
|
|
@@ -1187,22 +1219,95 @@ throw new Error(`Expected format ${PORTABLE_SETTINGS_FORMAT}`)
|
|
|
1187
1219
|
if(input.version!==1)
|
|
1188
1220
|
throw new Error(`Unsupported settings version ${String(input.version)}`)
|
|
1189
1221
|
const unsupported=[]
|
|
1190
|
-
unknownKeys(input,["format","version","layout","mcp"],"",unsupported)
|
|
1222
|
+
unknownKeys(input,["format","version","layout","mcp","behavior"],"",unsupported)
|
|
1191
1223
|
const hasLayout=Object.hasOwn(input,"layout")
|
|
1192
1224
|
const hasMcp=Object.hasOwn(input,"mcp")
|
|
1193
|
-
|
|
1225
|
+
const behavior={}
|
|
1226
|
+
if(input.behavior!==undefined){const raw=object(input.behavior,"/behavior")
|
|
1227
|
+
unknownKeys(raw,["toolbarOverflow"],"/behavior",unsupported)
|
|
1228
|
+
if(raw.toolbarOverflow!==undefined){if(raw.toolbarOverflow!=="menu"&&raw.toolbarOverflow!=="wrap")
|
|
1229
|
+
throw new Error("/behavior/toolbarOverflow must be menu or wrap")
|
|
1230
|
+
behavior.toolbarOverflow=raw.toolbarOverflow
|
|
1231
|
+
}}
|
|
1232
|
+
if(!hasLayout&&!hasMcp&&!behavior.toolbarOverflow)
|
|
1194
1233
|
throw new Error("Settings JSON contains no supported settings")
|
|
1195
|
-
const settings={format:PORTABLE_SETTINGS_FORMAT,version:1,...hasLayout&&{layout:parseLayout(input.layout,unsupported)},...hasMcp&&{mcp:parseMcp(input.mcp)}}
|
|
1234
|
+
const settings={format:PORTABLE_SETTINGS_FORMAT,version:1,...hasLayout&&{layout:parseLayout(input.layout,unsupported)},...hasMcp&&{mcp:parseMcp(input.mcp)},...behavior.toolbarOverflow&&{behavior}}
|
|
1196
1235
|
unsupported.sort()
|
|
1197
1236
|
return{settings,unsupported}}
|
|
1198
|
-
function serializePortableSettings(layout,mcp){return `${JSON.stringify({
|
|
1237
|
+
function serializePortableSettings(layout,mcp,behavior){return `${JSON.stringify({
|
|
1199
1238
|
format: PORTABLE_SETTINGS_FORMAT,
|
|
1200
1239
|
version: 1,
|
|
1201
1240
|
layout,
|
|
1241
|
+
...behavior && { behavior },
|
|
1202
1242
|
mcp: Object.fromEntries(Object.entries(mcp).sort(([left], [right]) => left.localeCompare(right)))
|
|
1203
1243
|
}, undefined, 2)}
|
|
1204
1244
|
`
|
|
1205
1245
|
}
|
|
1246
|
+
function toolbarPinKey(pin){return pin.kind==="action"?`action:${pin.id}`:`skill:${pin.location}`
|
|
1247
|
+
}
|
|
1248
|
+
function identifier(value){return typeof value==="string"&&/^[a-z][a-z\d-]{0,47}$/u.test(value)
|
|
1249
|
+
}
|
|
1250
|
+
function parsePin(value){if(!value||typeof value!=="object")
|
|
1251
|
+
return
|
|
1252
|
+
const input=value
|
|
1253
|
+
if(!identifier(input.icon))
|
|
1254
|
+
return
|
|
1255
|
+
const stateIcons=Object.fromEntries(Object.entries(input.stateIcons&&typeof input.stateIcons==="object"?input.stateIcons:{}).filter(([key,icon])=>identifier(key)&&identifier(icon)))
|
|
1256
|
+
const icons={icon:input.icon,...Object.keys(stateIcons).length>0&&{stateIcons}}
|
|
1257
|
+
if(input.kind==="action"&&QUICK_ACTION_IDS.includes(input.id))
|
|
1258
|
+
return{kind:"action",id:input.id,...icons}
|
|
1259
|
+
if(input.kind==="skill"&&typeof input.location==="string"&&input.location.trim()&&typeof input.name==="string"&&input.name.trim())
|
|
1260
|
+
return{kind:"skill",location:input.location,name:input.name.trim().slice(0,128),...icons}
|
|
1261
|
+
return
|
|
1262
|
+
}
|
|
1263
|
+
function parseToolbarPins(value){if(!Array.isArray(value))
|
|
1264
|
+
return []
|
|
1265
|
+
const keys=new Set
|
|
1266
|
+
return value.flatMap((candidate)=>{const pin=parsePin(candidate)
|
|
1267
|
+
if(!pin||keys.has(toolbarPinKey(pin))||keys.size>=100)
|
|
1268
|
+
return []
|
|
1269
|
+
keys.add(toolbarPinKey(pin))
|
|
1270
|
+
return [pin]
|
|
1271
|
+
})
|
|
1272
|
+
}
|
|
1273
|
+
function changeToolbarPins(current=[],change){const pins=parseToolbarPins(current)
|
|
1274
|
+
if(change.operation==="pin"){const pin=parsePin(change.pin)
|
|
1275
|
+
if(!pin)
|
|
1276
|
+
throw new Error("Invalid toolbar pin")
|
|
1277
|
+
if(pins.some((item)=>toolbarPinKey(item)===toolbarPinKey(pin)))
|
|
1278
|
+
throw new Error("This item is already pinned")
|
|
1279
|
+
if(pins.length>=100)
|
|
1280
|
+
throw new Error("You can pin at most 100 items")
|
|
1281
|
+
return [...pins,pin]
|
|
1282
|
+
}
|
|
1283
|
+
const index=pins.findIndex((pin)=>toolbarPinKey(pin)===change.key)
|
|
1284
|
+
if(index===-1){if(change.operation==="configure")
|
|
1285
|
+
throw new Error("Pin no longer exists; reopen the toolbar manager")
|
|
1286
|
+
return pins
|
|
1287
|
+
}
|
|
1288
|
+
if(change.operation==="configure"){if(change.expected&&change.expected!==JSON.stringify(pins[index]))
|
|
1289
|
+
throw new Error("Pin changed; reopen its configuration")
|
|
1290
|
+
const stateIcons={...pins[index].stateIcons}
|
|
1291
|
+
const changes=Object.entries(change.stateIcons??{})
|
|
1292
|
+
for(const [state,icon] of changes){if(!identifier(state)||icon!==null&&!identifier(icon))
|
|
1293
|
+
throw new Error("Invalid state icon")
|
|
1294
|
+
if(icon===null)
|
|
1295
|
+
delete stateIcons[state]
|
|
1296
|
+
else
|
|
1297
|
+
stateIcons[state]=icon
|
|
1298
|
+
}
|
|
1299
|
+
const pin=parsePin({...pins[index],icon:change.icon,stateIcons})
|
|
1300
|
+
if(!pin)
|
|
1301
|
+
throw new Error("Invalid toolbar icon")
|
|
1302
|
+
pins[index]=pin
|
|
1303
|
+
return pins
|
|
1304
|
+
}
|
|
1305
|
+
const [pin]=pins.splice(index,1)
|
|
1306
|
+
if(change.operation==="move"){const destination=pins.findIndex((item)=>toolbarPinKey(item)===change.before)
|
|
1307
|
+
pins.splice(destination===-1?pins.length:destination,0,pin)
|
|
1308
|
+
}
|
|
1309
|
+
return pins
|
|
1310
|
+
}
|
|
1206
1311
|
function record(value){if(!value||typeof value!=="object"||Array.isArray(value))
|
|
1207
1312
|
return
|
|
1208
1313
|
return value
|
|
@@ -1211,7 +1316,8 @@ function parsePluginSettings(value){const input=record(value)
|
|
|
1211
1316
|
if(!input)
|
|
1212
1317
|
return{}
|
|
1213
1318
|
return{...typeof input.toggleKey==="string"&&input.toggleKey.trim()&&{toggleKey:input.toggleKey.trim()},...typeof input.focusKey==="string"&&input.focusKey.trim()&&{focusKey:input.focusKey.trim()},...typeof input.searchKey==="string"&&input.searchKey.trim()&&{searchKey:input.searchKey.trim()},...typeof input.persistMcp==="boolean"&&{persistMcp:input.persistMcp},...parseLimitsRefreshMinutes(input.limitsRefreshMinutes)!==undefined&&{limitsRefreshMinutes:parseLimitsRefreshMinutes(input.limitsRefreshMinutes)
|
|
1214
|
-
},...typeof input.startInChat==="boolean"&&{startInChat:input.startInChat},...
|
|
1319
|
+
},...typeof input.startInChat==="boolean"&&{startInChat:input.startInChat},...(input.toolbarOverflow==="menu"||input.toolbarOverflow==="wrap")&&{toolbarOverflow:input.toolbarOverflow
|
|
1320
|
+
},...typeof input.showSessionTitle==="boolean"&&{showSessionTitle:input.showSessionTitle},...typeof input.showSessionDate==="boolean"&&{showSessionDate:input.showSessionDate},...typeof input.cornerFont==="boolean"&&{cornerFont:input.cornerFont},...(input.lspIconStyle==="nerd"||input.lspIconStyle==="text")&&{lspIconStyle:input.lspIconStyle},...(input.rowDensity==="compact"||input.rowDensity==="comfortable")&&{rowDensity:input.rowDensity
|
|
1215
1321
|
},...Object.keys(parseSectionItemLimits(input.sectionItemLimits)).length>0&&{sectionItemLimits:parseSectionItemLimits(input.sectionItemLimits)
|
|
1216
1322
|
},...parseQuickActionOrder(input.quickActionOrder)&&{quickActionOrder:parseQuickActionOrder(input.quickActionOrder)
|
|
1217
1323
|
},...Object.keys(parseQuickActionVisibility(input.quickActionVisibility)).length>0&&{quickActionVisibility:parseQuickActionVisibility(input.quickActionVisibility)
|
|
@@ -1317,7 +1423,8 @@ return{global:{...Object.keys(behavior).length>0&&{behavior},...layout&&{layout}
|
|
|
1317
1423
|
},...typeof userInput?.lastNavigatorVersion==="string"&&{lastNavigatorVersion:userInput.lastNavigatorVersion
|
|
1318
1424
|
},...typeof userInput?.previousNavigatorVersion==="string"&&{previousNavigatorVersion:userInput.previousNavigatorVersion
|
|
1319
1425
|
},...Object.keys(layoutPresets).length>0&&{layoutPresets},...Object.keys(mcpPresets).length>0&&{mcpPresets},...favoriteSkills&&{favoriteSkills},...favoriteMcpServers?.length&&{favoriteMcpServers},...favoriteQuickActions.length>0&&{favoriteQuickActions},...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups},...Object.keys(skillGroups).length>0&&{skillGroups},...Object.keys(codexAccountBindings).length>0&&{codexAccountBindings},...pendingResetAttempt&&{pendingResetAttempt},...typeof userInput?.autoApprovePermissions==="boolean"&&{autoApprovePermissions:userInput.autoApprovePermissions
|
|
1320
|
-
},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles}
|
|
1426
|
+
},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles},...parseToolbarPins(userInput?.toolbarPins).length>0&&{toolbarPins:parseToolbarPins(userInput?.toolbarPins)
|
|
1427
|
+
}}}}
|
|
1321
1428
|
function parseValues(value){if(!value)
|
|
1322
1429
|
return{}
|
|
1323
1430
|
return{behavior:parsePluginSettings(value.behavior),layout:{sections:parseSectionPreferences(value.layout?.sections),expanded:parseSectionPreferences(value.layout?.expanded),...parseSectionOrder(value.layout?.order)&&{order:parseSectionOrder(value.layout?.order)}},desiredMcpStates:parseDesiredMcpStates(value.desiredMcpStates)
|
|
@@ -1364,7 +1471,7 @@ delete profiles[layout]
|
|
|
1364
1471
|
}}
|
|
1365
1472
|
function applyPreferencesUpdate(current,update){const target=update.target??(update.mcp?.scope?targetForLegacyScope(update.mcp.scope):{kind:"global"})
|
|
1366
1473
|
const existing=targetPreferences(current,target)
|
|
1367
|
-
if(update.expectedScope&&update.expectedScope!==JSON.stringify({layout:existing.layout,mcp:existing.mcp})){throw new Error("Settings changed after this preview; reopen the import preview")
|
|
1474
|
+
if(update.expectedScope&&update.expectedScope!==JSON.stringify({layout:existing.layout,mcp:existing.mcp,behavior:existing.behavior})){throw new Error("Settings changed after this preview; reopen the import preview")
|
|
1368
1475
|
}
|
|
1369
1476
|
const behavior={...!update.clearBehavior&&existing.behavior,...parsePluginSettings(update.behavior)
|
|
1370
1477
|
}
|
|
@@ -1484,8 +1591,9 @@ favoriteSkills.splice(index,1)
|
|
|
1484
1591
|
favoriteSkills.sort()
|
|
1485
1592
|
}
|
|
1486
1593
|
const onboardingCompleted=typeof update.user?.onboardingCompleted==="boolean"?update.user.onboardingCompleted:current.user.onboardingCompleted
|
|
1594
|
+
const toolbarPins=update.user?.toolbarPin?changeToolbarPins(current.user.toolbarPins,update.user.toolbarPin):current.user.toolbarPins
|
|
1487
1595
|
return{global:target.kind==="global"?scope:current.global,worktrees,user:{...skippedSkillConfirmations.size>0&&{skippedSkillConfirmations:[...skippedSkillConfirmations].sort()
|
|
1488
|
-
},...typeof onboardingCompleted==="boolean"&&{onboardingCompleted},...(update.user?.lastNavigatorVersion??current.user.lastNavigatorVersion)&&{lastNavigatorVersion:update.user?.lastNavigatorVersion??current.user.lastNavigatorVersion
|
|
1596
|
+
},...typeof onboardingCompleted==="boolean"&&{onboardingCompleted},...toolbarPins?.length&&{toolbarPins},...(update.user?.lastNavigatorVersion??current.user.lastNavigatorVersion)&&{lastNavigatorVersion:update.user?.lastNavigatorVersion??current.user.lastNavigatorVersion
|
|
1489
1597
|
},...(update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion)&&{previousNavigatorVersion:update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion
|
|
1490
1598
|
},...Object.keys(parsedLayoutPresets).length>0&&{layoutPresets:parsedLayoutPresets},...Object.keys(parsedMcpPresets).length>0&&{mcpPresets:parsedMcpPresets},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles:parseWorkspaceProfiles(workspaceProfiles)
|
|
1491
1599
|
},...favoriteSkills.length>0&&{favoriteSkills},...favoriteMcpServers.size>0&&{favoriteMcpServers:[...favoriteMcpServers].sort()},...favoriteQuickActions.size>0&&{favoriteQuickActions:parseFavoriteQuickActions([...favoriteQuickActions])
|
|
@@ -1643,7 +1751,7 @@ return{behavior:scope.behavior,layout:scope.layout,desiredMcpStates:scope.mcp
|
|
|
1643
1751
|
}}
|
|
1644
1752
|
function mergeSessionLayout(base,session){const order=session.order??base?.order
|
|
1645
1753
|
return{sections:{...base?.sections,...session.sections},expanded:{...base?.expanded,...session.expanded},...order&&{order:[...order]}}}
|
|
1646
|
-
function createPreferencesController(api,defaults,store,configured={}){const builtIns={behavior:{toggleKey:defaults.toggleKey,focusKey:defaults.focusKey,searchKey:defaults.searchKey,persistMcp:defaults.persistMcp,limitsRefreshMinutes:defaults.limitsRefreshMinutes,startInChat:defaults.startInChat,showSessionTitle:defaults.showSessionTitle,showSessionDate:defaults.showSessionDate,cornerFont:defaults.cornerFont,lspIconStyle:defaults.lspIconStyle,rowDensity:defaults.rowDensity,sectionItemLimits:defaults.sectionItemLimits,quickActionOrder:defaults.quickActionOrder,quickActionVisibility:defaults.quickActionVisibility
|
|
1754
|
+
function createPreferencesController(api,defaults,store,configured={}){const builtIns={behavior:{toggleKey:defaults.toggleKey,focusKey:defaults.focusKey,searchKey:defaults.searchKey,persistMcp:defaults.persistMcp,limitsRefreshMinutes:defaults.limitsRefreshMinutes,startInChat:defaults.startInChat,showSessionTitle:defaults.showSessionTitle,showSessionDate:defaults.showSessionDate,cornerFont:defaults.cornerFont,lspIconStyle:defaults.lspIconStyle,rowDensity:defaults.rowDensity,toolbarOverflow:defaults.toolbarOverflow,sectionItemLimits:defaults.sectionItemLimits,quickActionOrder:defaults.quickActionOrder,quickActionVisibility:defaults.quickActionVisibility
|
|
1647
1755
|
},layout:{sections:defaults.sections,expanded:DEFAULT_SECTION_EXPANSION,order:defaults.sectionOrder??[...SIDEBAR_SECTIONS]
|
|
1648
1756
|
},desiredMcpStates:{}}
|
|
1649
1757
|
const [resolved,setResolved]=createSignal4(resolvePreferences({builtIns,pluginOptions:configured}))
|
|
@@ -1709,7 +1817,7 @@ return resolveTarget(selectedTarget())
|
|
|
1709
1817
|
function workspaceProfiles(){revision()
|
|
1710
1818
|
return{...configured.workspaceProfiles,...document.user.workspaceProfiles}}
|
|
1711
1819
|
function scopeSnapshot(target=selectedTarget()){const scope=target.kind==="global"?document.global:document.worktrees[target.key]
|
|
1712
|
-
return JSON.stringify({layout:scope?.layout,mcp:scope?.mcp})
|
|
1820
|
+
return JSON.stringify({layout:scope?.layout,mcp:scope?.mcp,behavior:scope?.behavior})
|
|
1713
1821
|
}
|
|
1714
1822
|
function update(change){updateRevision++
|
|
1715
1823
|
document=applyPreferencesUpdate(document,change)
|
|
@@ -1886,9 +1994,15 @@ next.add(id)
|
|
|
1886
1994
|
setFavoriteQuickActions(next)
|
|
1887
1995
|
update({user:{favoriteQuickAction:{id,favorite:next.has(id)}}})
|
|
1888
1996
|
}
|
|
1889
|
-
return{sections:()=>resolved().layout.sections,
|
|
1997
|
+
return{sections:()=>resolved().layout.sections,toolbarPins(){revision()
|
|
1998
|
+
return document.user.toolbarPins??[]
|
|
1999
|
+
},changeToolbarPin(change){requireHydration()
|
|
2000
|
+
update({user:{toolbarPin:change}})
|
|
2001
|
+
},expanded:()=>resolved().layout.expanded,sectionOrder:()=>resolved().layout.order,toggleKey:()=>resolved().behavior.toggleKey,focusKey:()=>resolved().behavior.focusKey,searchKey:()=>resolved().behavior.searchKey,persistMcp:()=>resolved().behavior.persistMcp,limitsRefreshMinutes:()=>resolved().behavior.limitsRefreshMinutes,showSessionTitle:()=>resolved().behavior.showSessionTitle,showSessionDate:()=>resolved().behavior.showSessionDate,startInChatForScope:(scope)=>{revision()
|
|
1890
2002
|
return resolveTarget(targetForScope(scope),false).behavior.startInChat
|
|
1891
|
-
},cornerFont:()=>resolved().behavior.cornerFont,lspIconStyle:()=>resolved().behavior.lspIconStyle,rowDensity:()=>resolved().behavior.rowDensity,
|
|
2003
|
+
},cornerFont:()=>resolved().behavior.cornerFont,lspIconStyle:()=>resolved().behavior.lspIconStyle,rowDensity:()=>resolved().behavior.rowDensity,toolbarOverflow:()=>resolved().behavior.toolbarOverflow,selectedToolbarOverflow:()=>selectedResolved().behavior.toolbarOverflow,toggleToolbarOverflow(){load()
|
|
2004
|
+
update({target:selectedTarget(),behavior:{toolbarOverflow:selectedResolved().behavior.toolbarOverflow==="menu"?"wrap":"menu"}})
|
|
2005
|
+
},selectedToggleKey:()=>selectedResolved().behavior.toggleKey,selectedFocusKey:()=>selectedResolved().behavior.focusKey,selectedSearchKey:()=>selectedResolved().behavior.searchKey,selectedPersistMcp:()=>selectedResolved().behavior.persistMcp,selectedLimitsRefreshMinutes:()=>selectedResolved().behavior.limitsRefreshMinutes,setLimitsRefreshMinutes(value){if(parseLimitsRefreshMinutes(value)===undefined)
|
|
1892
2006
|
throw new Error("Enter whole minutes (at least 1 minute, within the supported timer range)")
|
|
1893
2007
|
load()
|
|
1894
2008
|
update({target:selectedTarget(),behavior:{limitsRefreshMinutes:value}})
|
|
@@ -1906,23 +2020,24 @@ update({target:selectedTarget(),behavior:{quickActionOrder:order}})
|
|
|
1906
2020
|
throw new Error("Enter a non-negative whole number (0 for All)")
|
|
1907
2021
|
load()
|
|
1908
2022
|
update({target:selectedTarget(),behavior:{sectionItemLimits:{[section]:value}}})
|
|
1909
|
-
},selectedSections:()=>selectedLayoutResolved().layout.sections,selectedExpanded:()=>selectedLayoutResolved().layout.expanded,selectedSectionOrder:()=>selectedLayoutResolved().layout.order,layoutPresets,mcpPresets,workspaceProfiles,exportPortableSettings(){return serializePortableSettings(selectedLayoutResolved().layout,selectedResolved().desiredMcpStates)
|
|
2023
|
+
},selectedSections:()=>selectedLayoutResolved().layout.sections,selectedExpanded:()=>selectedLayoutResolved().layout.expanded,selectedSectionOrder:()=>selectedLayoutResolved().layout.order,layoutPresets,mcpPresets,workspaceProfiles,exportPortableSettings(){return serializePortableSettings(selectedLayoutResolved().layout,selectedResolved().desiredMcpStates,{toolbarOverflow:selectedResolved().behavior.toolbarOverflow
|
|
2024
|
+
})
|
|
1910
2025
|
},previewPortableSettings(source){requireHydration()
|
|
1911
2026
|
const parsed=parsePortableSettings(source)
|
|
1912
2027
|
const target=selectedTarget()
|
|
1913
2028
|
const current=selectedResolved()
|
|
1914
2029
|
const scope=target.kind==="global"?document.global:document.worktrees[target.key]??{}
|
|
1915
|
-
const imported={...scope,...parsed.settings.layout&&{layout:parsed.settings.layout},...parsed.settings.mcp&&{mcp:parsed.settings.mcp}}
|
|
2030
|
+
const imported={...scope,...parsed.settings.behavior&&{behavior:{...scope.behavior,...parsed.settings.behavior}},...parsed.settings.layout&&{layout:parsed.settings.layout},...parsed.settings.mcp&&{mcp:parsed.settings.mcp}}
|
|
1916
2031
|
const next=resolvePreferences({builtIns,pluginOptions:configured,global:values(target.kind==="global"?imported:document.global),worktree:target.kind==="worktree"?values(imported):undefined
|
|
1917
2032
|
})
|
|
1918
2033
|
const layoutChanged=Boolean(parsed.settings.layout&&JSON.stringify(next.layout)!==JSON.stringify(selectedLayoutResolved().layout))
|
|
1919
2034
|
const mcpChanged=Boolean(parsed.settings.mcp&&JSON.stringify(next.desiredMcpStates)!==JSON.stringify(current.desiredMcpStates))
|
|
1920
|
-
return{...parsed,target:targetKey(target),expectedScope:scopeSnapshot(target),layoutChanged,mcpChanged
|
|
2035
|
+
return{...parsed,target:targetKey(target),expectedScope:scopeSnapshot(target),layoutChanged,mcpChanged,behaviorChanged:Boolean(parsed.settings.behavior&&next.behavior.toolbarOverflow!==current.behavior.toolbarOverflow)
|
|
1921
2036
|
}},async applyPortableSettings(preview){await load()
|
|
1922
2037
|
const target=selectedTarget()
|
|
1923
2038
|
if(preview.target!==targetKey(target))
|
|
1924
2039
|
throw new Error("Preference scope changed; reopen the import preview")
|
|
1925
|
-
const change={target,expectedScope:preview.expectedScope,...preview.settings.layout&&{layout:preview.settings.layout,clearLayout:true},...preview.settings.mcp&&{mcp:{states:preview.settings.mcp},clearMcp:true}}
|
|
2040
|
+
const change={target,expectedScope:preview.expectedScope,...preview.settings.behavior&&{behavior:preview.settings.behavior},...preview.settings.layout&&{layout:preview.settings.layout,clearLayout:true},...preview.settings.mcp&&{mcp:{states:preview.settings.mcp},clearMcp:true}}
|
|
1926
2041
|
updateRevision++
|
|
1927
2042
|
await store.update(change)
|
|
1928
2043
|
document=await store.load()
|
|
@@ -2174,6 +2289,7 @@ const targets=new Map
|
|
|
2174
2289
|
const requests=createRequestState(api.lifecycle.signal)
|
|
2175
2290
|
const promptRequests=createRequestState(api.lifecycle.signal)
|
|
2176
2291
|
let activeTarget
|
|
2292
|
+
let leases=new Set
|
|
2177
2293
|
function target(){return currentLocation(api)
|
|
2178
2294
|
}
|
|
2179
2295
|
function list(current=target()){return skills()[current.key]??[]
|
|
@@ -2211,14 +2327,20 @@ if(activeTarget!==current.key){requests.abortAll()
|
|
|
2211
2327
|
promptRequests.abortAll()
|
|
2212
2328
|
refreshing.clear()
|
|
2213
2329
|
activeTarget=current.key
|
|
2330
|
+
leases=new Set
|
|
2331
|
+
targets.clear()
|
|
2332
|
+
targets.set(current.key,current)
|
|
2214
2333
|
}
|
|
2215
|
-
|
|
2334
|
+
const lease=Symbol(current.key)
|
|
2335
|
+
leases.add(lease)
|
|
2336
|
+
return()=>{if(activeTarget!==current.key||!leases.delete(lease)||leases.size>0)
|
|
2216
2337
|
return
|
|
2217
2338
|
activeTarget=undefined
|
|
2339
|
+
targets.delete(current.key)
|
|
2218
2340
|
requests.abortAll()
|
|
2219
2341
|
promptRequests.abortAll()
|
|
2220
2342
|
refreshing.clear()
|
|
2221
|
-
}},async use(current,name){if(activeTarget&&activeTarget!==current.key)
|
|
2343
|
+
}},async use(current,name){if(activeTarget&&activeTarget!==current.key||target().key!==current.key)
|
|
2222
2344
|
throw new DOMException("Sidebar context changed","AbortError")
|
|
2223
2345
|
const request=promptRequests.start(current.key,"insert skill",false,true)
|
|
2224
2346
|
if(!request)
|
|
@@ -2252,11 +2374,6 @@ return rank||left.bucket.localeCompare(right.bucket)||(left.bucket==="Favorites"
|
|
|
2252
2374
|
|
|
2253
2375
|
|
|
2254
2376
|
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
2377
|
function SkillConfirmation(props){const icons=useIcons()
|
|
2261
2378
|
const theme=()=>props.api.theme.current
|
|
2262
2379
|
return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Confirmation`),_el$4=_$createElement("box"),_el$5=_$createElement("text"),_el$6=_$createElement("text"),_el$8=_$createElement("text"),_el$9=_$createTextNode(`(`),_el$0=_$createTextNode(`)`),_el$1=_$createElement("box")
|
|
@@ -2321,7 +2438,7 @@ return _el$
|
|
|
2321
2438
|
|
|
2322
2439
|
|
|
2323
2440
|
function SkillDetails(props){const icons=useIcons()
|
|
2324
|
-
const dimensions=
|
|
2441
|
+
const dimensions=useTerminalDimensions3()
|
|
2325
2442
|
const theme=()=>props.api.theme.current
|
|
2326
2443
|
return(()=>{var _el$=_$createElement("scrollbox"),_el$2=_$createElement("box"),_el$3=_$createElement("box"),_el$4=_$createElement("text"),_el$5=_$createTextNode(` Description`),_el$6=_$createElement("text"),_el$7=_$createElement("box"),_el$8=_$createElement("text"),_el$9=_$createTextNode(` Source`),_el$0=_$createElement("text")
|
|
2327
2444
|
_$insertNode(_el$,_el$2)
|
|
@@ -2360,11 +2477,67 @@ return _p$
|
|
|
2360
2477
|
return _el$
|
|
2361
2478
|
})()
|
|
2362
2479
|
}
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2480
|
+
|
|
2481
|
+
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
|
|
2485
|
+
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
|
|
2489
|
+
|
|
2490
|
+
function SkillDialogHeader(props){const icons=useIcons()
|
|
2367
2491
|
const theme=()=>props.api.theme.current
|
|
2492
|
+
return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createElement("box"),_el$5=_$createElement("text")
|
|
2493
|
+
_$insertNode(_el$,_el$2)
|
|
2494
|
+
_$insertNode(_el$,_el$4)
|
|
2495
|
+
_$setProp(_el$,"flexDirection","row")
|
|
2496
|
+
_$setProp(_el$,"justifyContent","space-between")
|
|
2497
|
+
_$setProp(_el$,"alignItems","center")
|
|
2498
|
+
_$insertNode(_el$2,_el$3)
|
|
2499
|
+
_$setProp(_el$2,"truncate",true)
|
|
2500
|
+
_$setProp(_el$2,"wrapMode","none")
|
|
2501
|
+
_$setProp(_el$2,"flexGrow",1)
|
|
2502
|
+
_$insert(_el$2,()=>icons.icon("skills"),_el$3)
|
|
2503
|
+
_$insert(_el$2,()=>props.name,null)
|
|
2504
|
+
_$insertNode(_el$4,_el$5)
|
|
2505
|
+
_$setProp(_el$4,"flexDirection","row")
|
|
2506
|
+
_$setProp(_el$4,"gap",1)
|
|
2507
|
+
_$setProp(_el$4,"alignItems","center")
|
|
2508
|
+
_$insert(_el$4,_$createComponent(Show2,{get when(){return props.onConfigure
|
|
2509
|
+
},get children(){return _$createComponent(IconControl,{get icon(){return terminalIcon("pin",icons.style())
|
|
2510
|
+
},get foregroundColor(){return _$memo(()=>props.active==="configure")()?theme().selectedListItemText:theme().textMuted
|
|
2511
|
+
},get backgroundColor(){return _$memo(()=>props.active==="configure")()?theme().primary:undefined
|
|
2512
|
+
},onMouseOver:()=>props.onActive("configure"),onMouseUp:()=>props.onConfigure?.()
|
|
2513
|
+
})
|
|
2514
|
+
}}),_el$5)
|
|
2515
|
+
_$insert(_el$4,_$createComponent(BookmarkControl,{get bookmarked(){return props.favorite
|
|
2516
|
+
},get backgroundColor(){return _$memo(()=>props.active==="favorite")()?theme().primary:undefined
|
|
2517
|
+
},get foregroundColor(){return _$memo(()=>!!props.favoriteDisabled)()?theme().textMuted:_$memo(()=>props.active==="favorite")()?theme().selectedListItemText:theme().warning
|
|
2518
|
+
},onMouseOver:()=>{if(!props.favoriteDisabled)
|
|
2519
|
+
props.onActive("favorite")
|
|
2520
|
+
},onMouseUp:()=>{if(!props.favoriteDisabled)
|
|
2521
|
+
props.onFavorite()
|
|
2522
|
+
}}),_el$5)
|
|
2523
|
+
_$setProp(_el$5,"onMouseDown",(event)=>event.stopPropagation())
|
|
2524
|
+
_$setProp(_el$5,"onMouseUp",(event)=>{event.stopPropagation()
|
|
2525
|
+
props.onCancel()
|
|
2526
|
+
})
|
|
2527
|
+
_$insert(_el$5,()=>icons.key("esc"))
|
|
2528
|
+
_$effect((_p$)=>{var _v$=TextAttributes6.BOLD,_v$2=theme().text,_v$3=theme().textMuted
|
|
2529
|
+
_v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"attributes",_v$,_p$.e))
|
|
2530
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"fg",_v$2,_p$.t))
|
|
2531
|
+
_v$3!==_p$.a&&(_p$.a=_$setProp(_el$5,"fg",_v$3,_p$.a))
|
|
2532
|
+
return _p$
|
|
2533
|
+
},{e:undefined,t:undefined,a:undefined
|
|
2534
|
+
})
|
|
2535
|
+
return _el$
|
|
2536
|
+
})()
|
|
2537
|
+
}
|
|
2538
|
+
function SkillDialog(props){const dialogs=useDialogs(props.api)
|
|
2539
|
+
const [skipConfirmation,setSkipConfirmation]=useDialogState("skill-skip",false)
|
|
2540
|
+
const [active,setActive]=useDialogState("skill-action","accept")
|
|
2368
2541
|
let body
|
|
2369
2542
|
function accept(){const isSkip=skipConfirmation()
|
|
2370
2543
|
dialogs.close()
|
|
@@ -2373,6 +2546,8 @@ props.onAccept(isSkip)
|
|
|
2373
2546
|
function cancel(){dialogs.back()
|
|
2374
2547
|
}
|
|
2375
2548
|
function move(offset){const actions=props.favoriteDisabled?["accept","cancel"]:["accept","cancel","favorite"]
|
|
2549
|
+
if(props.onConfigure)
|
|
2550
|
+
actions.push("configure")
|
|
2376
2551
|
const index=actions.indexOf(active())
|
|
2377
2552
|
setActive(actions[(index + offset + actions.length)%actions.length])
|
|
2378
2553
|
}
|
|
@@ -2380,11 +2555,13 @@ function submit(){if(active()==="accept")
|
|
|
2380
2555
|
accept()
|
|
2381
2556
|
else if(active()==="cancel")
|
|
2382
2557
|
cancel()
|
|
2558
|
+
else if(active()==="configure")
|
|
2559
|
+
props.onConfigure?.(dialogs)
|
|
2383
2560
|
else if(!props.favoriteDisabled)
|
|
2384
2561
|
props.onToggleFavorite()
|
|
2385
2562
|
}
|
|
2386
2563
|
function confirmationAction(){const action=active()
|
|
2387
|
-
return action==="favorite"?undefined:action
|
|
2564
|
+
return action==="favorite"||action==="configure"?undefined:action
|
|
2388
2565
|
}
|
|
2389
2566
|
const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.skill-dialog.scroll-up`,run:()=>body?.scrollBy(-1)
|
|
2390
2567
|
},{name:`${PLUGIN_ID}.skill-dialog.scroll-down`,run:()=>body?.scrollBy(1)
|
|
@@ -2403,41 +2580,15 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
|
|
|
2403
2580
|
})
|
|
2404
2581
|
onCleanup3(unregister)
|
|
2405
2582
|
return _$createComponent(DialogSurface,{get api(){return props.api
|
|
2406
|
-
},get children(){return [
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
_$
|
|
2415
|
-
_$insertNode(_el$4,_el$5)
|
|
2416
|
-
_$setProp(_el$4,"flexDirection","row")
|
|
2417
|
-
_$setProp(_el$4,"gap",1)
|
|
2418
|
-
_$setProp(_el$4,"alignItems","center")
|
|
2419
|
-
_$insert(_el$4,_$createComponent(BookmarkControl,{get bookmarked(){return props.favorite
|
|
2420
|
-
},get backgroundColor(){return _$memo(()=>active()==="favorite")()?theme().primary:undefined
|
|
2421
|
-
},get foregroundColor(){return _$memo(()=>!!props.favoriteDisabled)()?theme().textMuted:_$memo(()=>active()==="favorite")()?theme().selectedListItemText:theme().warning
|
|
2422
|
-
},onMouseOver:()=>{if(!props.favoriteDisabled)
|
|
2423
|
-
setActive("favorite")
|
|
2424
|
-
},onMouseUp:()=>{if(!props.favoriteDisabled)
|
|
2425
|
-
props.onToggleFavorite()
|
|
2426
|
-
}}),_el$5)
|
|
2427
|
-
_$setProp(_el$5,"onMouseDown",(event)=>event.stopPropagation())
|
|
2428
|
-
_$setProp(_el$5,"onMouseUp",(event)=>{event.stopPropagation()
|
|
2429
|
-
cancel()
|
|
2430
|
-
})
|
|
2431
|
-
_$insert(_el$5,()=>icons.key("esc"))
|
|
2432
|
-
_$effect((_p$)=>{var _v$=TextAttributes6.BOLD,_v$2=theme().text,_v$3=theme().textMuted
|
|
2433
|
-
_v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"attributes",_v$,_p$.e))
|
|
2434
|
-
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"fg",_v$2,_p$.t))
|
|
2435
|
-
_v$3!==_p$.a&&(_p$.a=_$setProp(_el$5,"fg",_v$3,_p$.a))
|
|
2436
|
-
return _p$
|
|
2437
|
-
},{e:undefined,t:undefined,a:undefined
|
|
2438
|
-
})
|
|
2439
|
-
return _el$
|
|
2440
|
-
})(),_$createComponent(SkillDetails,{get api(){return props.api
|
|
2583
|
+
},get children(){return [_$createComponent(SkillDialogHeader,{get api(){return props.api
|
|
2584
|
+
},get name(){return props.skill.name
|
|
2585
|
+
},get favorite(){return props.favorite
|
|
2586
|
+
},get favoriteDisabled(){return props.favoriteDisabled
|
|
2587
|
+
},get active(){return active()
|
|
2588
|
+
},onActive:setActive,get onFavorite(){return props.onToggleFavorite
|
|
2589
|
+
},get onConfigure(){return props.onConfigure?()=>props.onConfigure?.(dialogs):undefined
|
|
2590
|
+
},onCancel:cancel
|
|
2591
|
+
}),_$createComponent(SkillDetails,{get api(){return props.api
|
|
2441
2592
|
},get skill(){return props.skill
|
|
2442
2593
|
},ref:(node)=>body=node
|
|
2443
2594
|
}),_$createComponent(SkillConfirmation,{get api(){return props.api
|
|
@@ -2447,10 +2598,53 @@ return _el$
|
|
|
2447
2598
|
})]
|
|
2448
2599
|
}})
|
|
2449
2600
|
}
|
|
2601
|
+
function skillUnavailable(controller,skill){const list=controller.list()
|
|
2602
|
+
if(list.every((item)=>!(item.name===skill.name&&item.location===skill.location)))
|
|
2603
|
+
return "Skill is unavailable in this workspace"
|
|
2604
|
+
if(list.filter((item)=>item.name===skill.name).length!==1)
|
|
2605
|
+
return "Multiple sources share this skill name"
|
|
2606
|
+
return
|
|
2607
|
+
}
|
|
2608
|
+
function activateSkill(input){const target=input.controller.target()
|
|
2609
|
+
const route=JSON.stringify(input.api.route.current)
|
|
2610
|
+
const current=()=>target.key===input.controller.target().key&&route===JSON.stringify(input.api.route.current)
|
|
2611
|
+
const report=(error)=>{if(!isAbortError(error))
|
|
2612
|
+
input.api.ui.toast({variant:"error",title:"Skills",message:String(error),duration:5000
|
|
2613
|
+
})
|
|
2614
|
+
}
|
|
2615
|
+
function check(){if(!current())
|
|
2616
|
+
throw new DOMException("Skill target changed; choose it again","AbortError")
|
|
2617
|
+
const reason=skillUnavailable(input.controller,input.skill)
|
|
2618
|
+
if(reason)
|
|
2619
|
+
throw new Error(reason)
|
|
2620
|
+
}
|
|
2621
|
+
async function insert(skip=false){try{check()
|
|
2622
|
+
if(skip)
|
|
2623
|
+
input.access.skipSkillConfirmation(input.skill)
|
|
2624
|
+
input.beforeInsert?.()
|
|
2625
|
+
if(await input.controller.use(target,input.skill.name))
|
|
2626
|
+
await input.access.recordSkillUse?.(input.skill)
|
|
2627
|
+
} catch(error){report(error)
|
|
2628
|
+
}}
|
|
2629
|
+
try{check()
|
|
2630
|
+
} catch(error){report(error)
|
|
2631
|
+
return
|
|
2632
|
+
}
|
|
2633
|
+
if(!input.access.shouldConfirmSkill(input.skill)){insert()
|
|
2634
|
+
return
|
|
2635
|
+
}
|
|
2636
|
+
input.dialogs.open(()=>_$createComponent(SkillDialog,{get api(){return input.api
|
|
2637
|
+
},get skill(){return input.skill
|
|
2638
|
+
},get favorite(){return input.access.isFavoriteSkill?.(input.skill)??false
|
|
2639
|
+
},get favoriteDisabled(){return input.access.ready?.()===false
|
|
2640
|
+
},onToggleFavorite:()=>input.access.toggleFavoriteSkill?.(input.skill),get onConfigure(){return input.onConfigure
|
|
2641
|
+
},onAccept:(skip)=>{insert(skip)
|
|
2642
|
+
}}))
|
|
2643
|
+
}
|
|
2450
2644
|
|
|
2451
2645
|
|
|
2452
2646
|
function createSubagentHistory({now=Date.now}={}){const targets=new Map
|
|
2453
|
-
const [revision,setRevision]=
|
|
2647
|
+
const [revision,setRevision]=createSignal6(0)
|
|
2454
2648
|
function state(key){let value=targets.get(key)
|
|
2455
2649
|
if(!value){value={known:new Set,active:new Map,recent:[]}
|
|
2456
2650
|
targets.set(key,value)
|
|
@@ -2507,11 +2701,11 @@ function activeStatus(status){return status?.type==="busy"||status?.type==="retr
|
|
|
2507
2701
|
}
|
|
2508
2702
|
function createSubagentController(api,options={}){const now=options.now??Date.now
|
|
2509
2703
|
const history=createSubagentHistory({now})
|
|
2510
|
-
const [children,setChildren]=
|
|
2511
|
-
const [statuses,setStatuses]=
|
|
2704
|
+
const [children,setChildren]=createSignal7({})
|
|
2705
|
+
const [statuses,setStatuses]=createSignal7({})
|
|
2512
2706
|
const refreshing=new Map
|
|
2513
2707
|
const journals=new Set
|
|
2514
|
-
const [unavailable,setUnavailable]=
|
|
2708
|
+
const [unavailable,setUnavailable]=createSignal7({})
|
|
2515
2709
|
const targets=new Map
|
|
2516
2710
|
const remoteFailures=new Map
|
|
2517
2711
|
const remoteRetryAt=new Map
|
|
@@ -2730,7 +2924,7 @@ else if(seconds>=60)
|
|
|
2730
2924
|
value=`${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, "0")}s`
|
|
2731
2925
|
return value
|
|
2732
2926
|
}
|
|
2733
|
-
function createSubagentClock(key){const [now,setNow]=
|
|
2927
|
+
function createSubagentClock(key){const [now,setNow]=createSignal8(Date.now())
|
|
2734
2928
|
createEffect5(()=>{if(key()===undefined)
|
|
2735
2929
|
return
|
|
2736
2930
|
setNow(Date.now())
|
|
@@ -2740,7 +2934,7 @@ onCleanup4(()=>clearInterval(timer))
|
|
|
2740
2934
|
return now
|
|
2741
2935
|
}
|
|
2742
2936
|
|
|
2743
|
-
function createTodoController(api){const [sessions,setSessions]=
|
|
2937
|
+
function createTodoController(api){const [sessions,setSessions]=createSignal9({})
|
|
2744
2938
|
const refreshing=new Map
|
|
2745
2939
|
const revisions=new Map
|
|
2746
2940
|
const requests=createRequestState(api.lifecycle.signal)
|
|
@@ -2794,107 +2988,7 @@ activeTarget=undefined
|
|
|
2794
2988
|
requests.abortAll()
|
|
2795
2989
|
refreshing.clear()
|
|
2796
2990
|
}}}}
|
|
2797
|
-
|
|
2798
|
-
return{todos:[],guidance:false}
|
|
2799
|
-
const state=value
|
|
2800
|
-
const statuses=new Set(["pending","in_progress","completed","cancelled"])
|
|
2801
|
-
const priorities=new Set(["high","medium","low"])
|
|
2802
|
-
const todos=Array.isArray(state.todos)?state.todos.filter((item)=>item&&typeof item.content==="string"&&item.content.trim().length>0&&item.content.length<=512&&statuses.has(item.status)).slice(0,100).map((item)=>({content:item.content.trim(),status:item.status,...priorities.has(item.priority??"")&&{priority:item.priority}})):[]
|
|
2803
|
-
return{todos,guidance:state.guidance===true}}
|
|
2804
|
-
|
|
2805
|
-
var item={type:"object",properties:{content:{type:"string",minLength:1,maxLength:512},status:{type:"string",enum:["pending","in_progress","completed","cancelled"]},priority:{type:"string",enum:["high","medium","low"]}},required:["content","status"],additionalProperties:false
|
|
2806
|
-
}
|
|
2807
|
-
var todos={type:"array",items:item,maxItems:100}
|
|
2808
|
-
var sessionID={type:"string",minLength:1}
|
|
2809
|
-
var output={type:"object",properties:{todos,guidance:{type:"boolean"}},required:["todos","guidance"],additionalProperties:false
|
|
2810
|
-
}
|
|
2811
|
-
var NavigatorTodoRpc={id:"opencode-navigator.todo",methods:{list:{input:{type:"object",properties:{sessionID},required:["sessionID"],additionalProperties:false},output
|
|
2812
|
-
},replace:{input:{type:"object",properties:{sessionID,todos},required:["sessionID","todos"],additionalProperties:false
|
|
2813
|
-
},output
|
|
2814
|
-
},guidance:{input:{type:"object",properties:{sessionID,enabled:{type:"boolean"}},required:["sessionID","enabled"],additionalProperties:false
|
|
2815
|
-
},output
|
|
2816
|
-
}},events:{updated:{schema:{type:"object",properties:{sessionID,todos,guidance:{type:"boolean"}},required:["sessionID","todos","guidance"],additionalProperties:false
|
|
2817
|
-
}}}};
|
|
2818
|
-
function isMissingServer(error){return typeof error==="object"&&error!==null&&"type" in error&&error.type==="rpc.unavailable"
|
|
2819
|
-
}
|
|
2820
|
-
function createNavigatorTodoController(context,api){const rpc=context.client.rpc(NavigatorTodoRpc)
|
|
2821
|
-
const [sessions,setSessions]=createSignal11({})
|
|
2822
|
-
const [saving,setSaving]=createSignal11({})
|
|
2823
|
-
const [errors,setErrors]=createSignal11({})
|
|
2824
|
-
const [missing,setMissing]=createSignal11({})
|
|
2825
|
-
const requests=createRequestState(api.lifecycle.signal)
|
|
2826
|
-
const refreshing=new Map
|
|
2827
|
-
const revisions=new Map
|
|
2828
|
-
let activeTarget
|
|
2829
|
-
function target(sessionID){const session=api.state.session.get(sessionID)
|
|
2830
|
-
const directory=session?.directory??api.state.path.directory
|
|
2831
|
-
const workspace=session?.workspaceID
|
|
2832
|
-
return{key:JSON.stringify([sessionID,directory,workspace??null]),sessionID,routing:{directory}}}
|
|
2833
|
-
function set(key,value){setSessions((current)=>({...current,[key]:normalizeTodoState(value)}))
|
|
2834
|
-
}
|
|
2835
|
-
function refresh(sessionID,force=false){const current=target(sessionID)
|
|
2836
|
-
const pending=refreshing.get(current.key)
|
|
2837
|
-
if(pending&&!force)
|
|
2838
|
-
return pending
|
|
2839
|
-
const revision=revisions.get(current.key)??0
|
|
2840
|
-
const requestState=requests.start(current.key,"refresh Navigator todos",current.key in sessions(),force)
|
|
2841
|
-
if(!requestState)
|
|
2842
|
-
return pending
|
|
2843
|
-
const request=rpc.list({sessionID},{location:current.routing,signal:requestState.signal}).then((value)=>{const state=normalizeTodoState(value)
|
|
2844
|
-
if(requestState.isCurrent()){setMissing((values)=>({...values,[current.key]:false}))
|
|
2845
|
-
if((revisions.get(current.key)??0)===revision)
|
|
2846
|
-
set(current.key,state)
|
|
2847
|
-
}
|
|
2848
|
-
requestState.succeed()
|
|
2849
|
-
return state
|
|
2850
|
-
}).catch((error)=>{if(requestState.isCurrent()&&!requestState.signal.aborted)
|
|
2851
|
-
setMissing((values)=>({...values,[current.key]:isMissingServer(error)}))
|
|
2852
|
-
requestState.fail(error)
|
|
2853
|
-
throw error
|
|
2854
|
-
}).finally(()=>{requestState.finish()
|
|
2855
|
-
if(refreshing.get(current.key)===request)
|
|
2856
|
-
refreshing.delete(current.key)
|
|
2857
|
-
})
|
|
2858
|
-
refreshing.set(current.key,request)
|
|
2859
|
-
return request
|
|
2860
|
-
}
|
|
2861
|
-
const unsubscribe=rpc.events.on("updated",(event)=>{const{sessionID}=event.data
|
|
2862
|
-
if(typeof sessionID!=="string")
|
|
2863
|
-
return
|
|
2864
|
-
const current=target(sessionID)
|
|
2865
|
-
if(event.location.directory!==current.routing.directory)
|
|
2866
|
-
return
|
|
2867
|
-
revisions.set(current.key,(revisions.get(current.key)??0) + 1)
|
|
2868
|
-
set(current.key,normalizeTodoState(event.data))
|
|
2869
|
-
})
|
|
2870
|
-
api.lifecycle.onDispose(unsubscribe)
|
|
2871
|
-
return{target,list(sessionID){return sessions()[target(sessionID).key]?.todos??[]
|
|
2872
|
-
},refresh,state(sessionID){return requests.state(target(sessionID).key)
|
|
2873
|
-
},missing(sessionID){return missing()[target(sessionID).key]??false
|
|
2874
|
-
},retry(sessionID){return refresh(sessionID,true)
|
|
2875
|
-
},guidance(sessionID){const key=target(sessionID).key
|
|
2876
|
-
return{enabled:sessions()[key]?.guidance??false,saving:saving()[key]??false,error:errors()[key],available:key in sessions()
|
|
2877
|
-
}},async setGuidance(sessionID,enabled){const current=target(sessionID)
|
|
2878
|
-
if(!(current.key in sessions())||saving()[current.key])
|
|
2879
|
-
return
|
|
2880
|
-
setSaving((value)=>({...value,[current.key]:true}))
|
|
2881
|
-
setErrors((value)=>({...value,[current.key]:undefined}))
|
|
2882
|
-
try{const state=await rpc.guidance({sessionID,enabled},{location:current.routing})
|
|
2883
|
-
revisions.set(current.key,(revisions.get(current.key)??0) + 1)
|
|
2884
|
-
set(current.key,normalizeTodoState(state))
|
|
2885
|
-
} catch(error){setErrors((value)=>({...value,[current.key]:error instanceof Error?error.message:String(error)}))
|
|
2886
|
-
} finally{setSaving((value)=>({...value,[current.key]:false}))
|
|
2887
|
-
}},activate(sessionID){const key=target(sessionID).key
|
|
2888
|
-
if(activeTarget!==key){requests.abortAll()
|
|
2889
|
-
refreshing.clear()
|
|
2890
|
-
activeTarget=key
|
|
2891
|
-
}
|
|
2892
|
-
return()=>{if(activeTarget!==key)
|
|
2893
|
-
return
|
|
2894
|
-
activeTarget=undefined
|
|
2895
|
-
requests.abortAll()
|
|
2896
|
-
refreshing.clear()
|
|
2897
|
-
}}}}
|
|
2991
|
+
|
|
2898
2992
|
function buildTodoView(todos,mode){const active=[...todos.filter((item)=>item.status==="in_progress"),...todos.filter((item)=>item.status==="pending")]
|
|
2899
2993
|
const completed=todos.filter((item)=>item.status==="completed")
|
|
2900
2994
|
const cancelled=todos.filter((item)=>item.status==="cancelled")
|
|
@@ -2907,38 +3001,31 @@ return{groups,rows:groups.flatMap((group)=>group.items.map((item)=>({item,group:
|
|
|
2907
3001
|
|
|
2908
3002
|
|
|
2909
3003
|
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
function KeyboardHelpDialog(props){
|
|
2915
|
-
|
|
2916
|
-
|
|
2917
|
-
return _$createComponent(DialogSurface,{get api(){return props.api
|
|
2918
|
-
},get children(){return [(()=>{var _el$=_$createElement("text"),_el$2=_$createTextNode(` Navigator keyboard help`)
|
|
2919
|
-
_$insertNode(_el$,_el$2)
|
|
2920
|
-
_$insert(_el$,()=>icons.icon("help"),_el$2)
|
|
2921
|
-
_$effect((_p$)=>{var _v$=TextAttributes7.BOLD,_v$2=theme().text
|
|
2922
|
-
_v$!==_p$.e&&(_p$.e=_$setProp(_el$,"attributes",_v$,_p$.e))
|
|
2923
|
-
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"fg",_v$2,_p$.t))
|
|
2924
|
-
return _p$
|
|
2925
|
-
},{e:undefined,t:undefined
|
|
2926
|
-
})
|
|
3004
|
+
var HelpView=lazy2(async ()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
|
|
3005
|
+
const module=await import(path)
|
|
3006
|
+
return{default:module.KeyboardHelpDialog
|
|
3007
|
+
}})
|
|
3008
|
+
function KeyboardHelpDialog(props){return(()=>{var _el$=_$createElement("box")
|
|
3009
|
+
_$insert(_el$,_$createComponent(Suspense2,{get children(){return _$createComponent(HelpView,props)
|
|
3010
|
+
}}))
|
|
2927
3011
|
return _el$
|
|
2928
|
-
})(),_$createComponent(Index,{get each(){return hints()
|
|
2929
|
-
},children:(hint)=>(()=>{var _el$3=_$createElement("text")
|
|
2930
|
-
_$setProp(_el$3,"wrapMode","word")
|
|
2931
|
-
_$insert(_el$3,hint)
|
|
2932
|
-
_$effect((_$p)=>_$setProp(_el$3,"fg",theme().textMuted,_$p))
|
|
2933
|
-
return _el$3
|
|
2934
3012
|
})()
|
|
2935
|
-
})]
|
|
2936
|
-
}})
|
|
2937
3013
|
}
|
|
2938
|
-
function openKeyboardHelp(api,iconStyle=()=>"nerd",multilineCorners=()=>true){createDialogStack(api,iconStyle,()=>true,multilineCorners).open(()=>_$createComponent(KeyboardHelpDialog,{api
|
|
3014
|
+
function openKeyboardHelp(api,iconStyle=()=>"nerd",multilineCorners=()=>true,shortcuts=[]){createDialogStack(api,iconStyle,()=>true,multilineCorners).open(()=>_$createComponent(KeyboardHelpDialog,{api,shortcuts
|
|
2939
3015
|
}))
|
|
2940
3016
|
}
|
|
2941
3017
|
|
|
3018
|
+
|
|
3019
|
+
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
|
|
2942
3029
|
var QUICK_ACTION_METADATA=[["\uEA73","Rename"],["\uEA82","Timeline"],["\uEBCC","Copy transcript"],["\uEBAC","Export"],["\uEAF5","Compact"],["\uEBEB","Switch session"],["\uEA60","New session"],["\uEB9E","Fork session"],["\uEBCC","Copy last response"],["\uEAA1","First message"],["\uEA9A","Last message"],["\uEA82","Last user message"],["\uEA9A","Next message"],["\uEAA1","Previous message"],["\uEBB3","Auto-approve permissions"]]
|
|
2943
3030
|
var QUICK_ACTIONS=QUICK_ACTION_IDS.map((command,index)=>({command,icon:QUICK_ACTION_METADATA[index][0],label:QUICK_ACTION_METADATA[index][1]
|
|
2944
3031
|
}))
|
|
@@ -2949,10 +3036,10 @@ return action.label
|
|
|
2949
3036
|
const command=api.keymap.getCommands?.({visibility:"registered"}).find((candidate)=>candidate.name===action.command)
|
|
2950
3037
|
return typeof command?.title==="string"?command.title:action.label
|
|
2951
3038
|
}
|
|
2952
|
-
function createQuickActionRevision(api){const [revision,setRevision]=
|
|
3039
|
+
function createQuickActionRevision(api){const [revision,setRevision]=createSignal11(0)
|
|
2953
3040
|
const unsubscribe=api.keymap.on?.("state",()=>setRevision((value)=>value + 1))
|
|
2954
3041
|
if(unsubscribe)
|
|
2955
|
-
|
|
3042
|
+
onCleanup6(unsubscribe)
|
|
2956
3043
|
return revision
|
|
2957
3044
|
}
|
|
2958
3045
|
function orderQuickActionIds(order,favorites){return [...order.filter((id)=>favorites.has(id)),...order.filter((id)=>!favorites.has(id))]
|
|
@@ -2971,6 +3058,29 @@ if(enabled===false||typeof enabled==="function"&&!enabled())
|
|
|
2971
3058
|
return "Unavailable in the current session"
|
|
2972
3059
|
return
|
|
2973
3060
|
}
|
|
3061
|
+
var sources=new WeakMap
|
|
3062
|
+
function setQuickActionStateSource(api,source){sources.set(api,source)
|
|
3063
|
+
}
|
|
3064
|
+
function currentPermissionMode(api){const title=api.keymap.getCommands?.({visibility:"registered"}).find((command)=>command.name==="permission.mode")?.title
|
|
3065
|
+
if(typeof title!=="string")
|
|
3066
|
+
return
|
|
3067
|
+
if(title.startsWith("Disable auto-approve permissions"))
|
|
3068
|
+
return true
|
|
3069
|
+
return title.startsWith("Enable auto-approve permissions")?false:undefined
|
|
3070
|
+
}
|
|
3071
|
+
function quickActionStates(api,id){if(id==="permission.mode"&¤tPermissionMode(api)!==undefined)
|
|
3072
|
+
return [{id:"on",label:"Auto-approve on"},{id:"off",label:"Auto-approve off"}]
|
|
3073
|
+
if(id==="session.compact"&&sources.has(api))
|
|
3074
|
+
return [{id:"idle",label:"Idle"},{id:"compacting",label:"Compacting"}]
|
|
3075
|
+
return []
|
|
3076
|
+
}
|
|
3077
|
+
function quickActionState(api,id){if(id==="permission.mode"){const mode=currentPermissionMode(api)
|
|
3078
|
+
if(mode===undefined)
|
|
3079
|
+
return
|
|
3080
|
+
return mode?"on":"off"
|
|
3081
|
+
}
|
|
3082
|
+
return sources.get(api)?.(id)
|
|
3083
|
+
}
|
|
2974
3084
|
var SEARCH_GROUPS=["Skills","Subagents","MCP","Actions"]
|
|
2975
3085
|
var SEARCH_SECTIONS={Skills:"skills",Subagents:"subagents",MCP:"mcp",Actions:"quick_actions"
|
|
2976
3086
|
}
|
|
@@ -3034,9 +3144,7 @@ return scored.map(({item})=>item)
|
|
|
3034
3144
|
|
|
3035
3145
|
|
|
3036
3146
|
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
function mixColor(from,to,amount){return RGBA2.fromValues(from.r + (to.r-from.r)*amount,from.g + (to.g-from.g)*amount,from.b + (to.b-from.b)*amount)
|
|
3147
|
+
function mixColor(from,to,amount){return RGBA3.fromValues(from.r + (to.r-from.r)*amount,from.g + (to.g-from.g)*amount,from.b + (to.b-from.b)*amount)
|
|
3040
3148
|
}
|
|
3041
3149
|
function createSearchDialogController(props){const context=searchContext(props.api)
|
|
3042
3150
|
const skillTarget=props.skills.target()
|
|
@@ -3047,16 +3155,16 @@ const [selectedID,setSelectedID]=useDialogState("selection",undefined)
|
|
|
3047
3155
|
const [views]=useDialogState("tab-views",new Map)
|
|
3048
3156
|
const tabViews=views()
|
|
3049
3157
|
const [scrollTop,setScrollTop]=useDialogState("scroll",0)
|
|
3050
|
-
const [refreshing,setRefreshing]=
|
|
3158
|
+
const [refreshing,setRefreshing]=createSignal12(false)
|
|
3051
3159
|
const theme=()=>props.api.theme.current
|
|
3052
3160
|
const icons=useIcons()
|
|
3053
3161
|
const commandRevision=createQuickActionRevision(props.api)
|
|
3054
3162
|
const dialogs=useDialogs(props.api)
|
|
3055
|
-
const resultColors=createMemo(()=>{const background=
|
|
3163
|
+
const resultColors=createMemo(()=>{const background=parseColor2(theme().backgroundPanel)
|
|
3056
3164
|
const contrast=background.r*0.299 + background.g*0.587 + background.b*0.114>0.5?0:1
|
|
3057
|
-
return{title:mixColor(
|
|
3165
|
+
return{title:mixColor(parseColor2(theme().text),RGBA3.fromValues(contrast,contrast,contrast),0.45),description:mixColor(parseColor2(theme().textMuted),background,0.4)
|
|
3058
3166
|
}})
|
|
3059
|
-
const dimensions=
|
|
3167
|
+
const dimensions=useTerminalDimensions5()
|
|
3060
3168
|
let input
|
|
3061
3169
|
let body
|
|
3062
3170
|
let pendingScroll=scrollTop()
|
|
@@ -3121,11 +3229,6 @@ return
|
|
|
3121
3229
|
props.api.ui.toast({title:"Search Everything",variant:"error",message:cause instanceof Error?cause.message:"Action failed",duration:4000
|
|
3122
3230
|
})
|
|
3123
3231
|
}
|
|
3124
|
-
async function insertSkill(skill){if(!sameContext())
|
|
3125
|
-
return
|
|
3126
|
-
if(await props.skills.use(skillTarget,skill.name))
|
|
3127
|
-
await props.preferences.recordSkillUse(skill)
|
|
3128
|
-
}
|
|
3129
3232
|
function activate(id=active()?.id){if(isDisposed||!sameContext())
|
|
3130
3233
|
return
|
|
3131
3234
|
const item=results().find((candidate)=>candidate.id===id)
|
|
@@ -3134,26 +3237,15 @@ return
|
|
|
3134
3237
|
setSelectedID(item.id)
|
|
3135
3238
|
if(body)
|
|
3136
3239
|
setScrollTop(body.scrollTop)
|
|
3137
|
-
if(item.group==="Skills"
|
|
3138
|
-
}
|
|
3139
|
-
},get favorite(){return props.preferences.isFavoriteSkill?.(item.skill)??false
|
|
3140
|
-
},get favoriteDisabled(){return _$memo(()=>!!props.preferences.ready)()?!props.preferences.ready():false
|
|
3141
|
-
},onToggleFavorite:()=>props.preferences.toggleFavoriteSkill?.(item.skill),onAccept:(skip)=>{if(!sameContext())
|
|
3142
|
-
return
|
|
3143
|
-
if(skip)
|
|
3144
|
-
props.preferences.skipSkillConfirmation(item.skill)
|
|
3145
|
-
insertSkill(item.skill).catch(report)
|
|
3146
|
-
}}))
|
|
3240
|
+
if(item.group==="Skills"){activateSkill({api:props.api,controller:props.skills,access:props.preferences,dialogs,skill:item.skill,beforeInsert:dialogs.close
|
|
3241
|
+
})
|
|
3147
3242
|
return
|
|
3148
3243
|
}
|
|
3149
3244
|
if(item.group==="MCP"){props.mcp.toggle(item.server).catch(report)
|
|
3150
3245
|
return
|
|
3151
3246
|
}
|
|
3152
3247
|
dialogs.close()
|
|
3153
|
-
switch(item.group){case "
|
|
3154
|
-
break
|
|
3155
|
-
}
|
|
3156
|
-
case "Subagents":{props.subagents.open(item.sessionID)
|
|
3248
|
+
switch(item.group){case "Subagents":{props.subagents.open(item.sessionID)
|
|
3157
3249
|
break
|
|
3158
3250
|
}
|
|
3159
3251
|
case "Actions":{const target=props.returnTarget?.parent&&!props.returnTarget.isDestroyed?props.returnTarget:null
|
|
@@ -3183,9 +3275,10 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
|
|
|
3183
3275
|
},{key:"ctrl+r",cmd:`${prefix}.retry`
|
|
3184
3276
|
}]
|
|
3185
3277
|
})
|
|
3186
|
-
|
|
3278
|
+
onCleanup7(()=>{isDisposed=true
|
|
3187
3279
|
unregister()
|
|
3188
3280
|
})
|
|
3281
|
+
onCleanup7(props.skills.activate?.(skillTarget)??(()=>{}))
|
|
3189
3282
|
onMount(()=>{input?.focus()
|
|
3190
3283
|
refresh().catch(report)
|
|
3191
3284
|
})
|
|
@@ -3362,7 +3455,7 @@ _$effect((_$p)=>_$setProp(_el$2,"fg",model.theme().error,_$p))
|
|
|
3362
3455
|
return _el$2
|
|
3363
3456
|
})()
|
|
3364
3457
|
}),null)
|
|
3365
|
-
_$insert(_el$,_$createComponent(
|
|
3458
|
+
_$insert(_el$,_$createComponent(Show3,{get when(){return model.results().length
|
|
3366
3459
|
},get fallback(){return(()=>{var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
|
|
3367
3460
|
_$insertNode(_el$8,_el$9)
|
|
3368
3461
|
_$insert(_el$8,()=>model.icons.icon(model.loading()?"pending":"search"),_el$9)
|
|
@@ -3370,7 +3463,7 @@ _$insert(_el$8,()=>model.loading()?"Loading sources\u2026":"No matching results"
|
|
|
3370
3463
|
_$effect((_$p)=>_$setProp(_el$8,"fg",model.theme().textMuted,_$p))
|
|
3371
3464
|
return _el$8
|
|
3372
3465
|
})()
|
|
3373
|
-
},get children(){return _$createComponent(
|
|
3466
|
+
},get children(){return _$createComponent(Show3,{keyed:true,get when(){return model.queryScope()
|
|
3374
3467
|
},children:(_scope)=>_$createComponent(For3,{get each(){return model.results().map((item)=>item.id)
|
|
3375
3468
|
},children:(id)=>_$createComponent(SearchResultRow,{model,id
|
|
3376
3469
|
})
|
|
@@ -3430,9 +3523,9 @@ createEffect7(()=>{const key=props.preferences.searchKey()
|
|
|
3430
3523
|
const remove=props.api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:SEARCH_COMMAND
|
|
3431
3524
|
}]
|
|
3432
3525
|
})
|
|
3433
|
-
|
|
3526
|
+
onCleanup8(remove)
|
|
3434
3527
|
})
|
|
3435
|
-
|
|
3528
|
+
onCleanup8(()=>{isDisposed=true
|
|
3436
3529
|
unregister()
|
|
3437
3530
|
for(const timer of timers)
|
|
3438
3531
|
clearTimeout(timer)
|
|
@@ -3663,8 +3756,8 @@ return _el$
|
|
|
3663
3756
|
}
|
|
3664
3757
|
function FirstRunWizard(props){const icons=useIcons()
|
|
3665
3758
|
const dialogs=useDialogs(props.api)
|
|
3666
|
-
const [active,setActive]=
|
|
3667
|
-
const [step,setStep]=
|
|
3759
|
+
const [active,setActive]=createSignal13(0)
|
|
3760
|
+
const [step,setStep]=createSignal13(0)
|
|
3668
3761
|
const theme=()=>props.api.theme.current
|
|
3669
3762
|
const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection(props.api,section.name))
|
|
3670
3763
|
const finishIndex=sections.length
|
|
@@ -3705,7 +3798,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
|
|
|
3705
3798
|
},{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
|
|
3706
3799
|
}]
|
|
3707
3800
|
})
|
|
3708
|
-
|
|
3801
|
+
onCleanup9(unregister)
|
|
3709
3802
|
return _$createComponent(DialogSurface,{get api(){return props.api
|
|
3710
3803
|
},get children(){return [(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Navigator setup`),_el$4=_$createElement("text"),_el$5=_$createTextNode(`Step `),_el$6=_$createTextNode(`/`),_el$7=_$createTextNode(` \xB7 `)
|
|
3711
3804
|
_$insertNode(_el$,_el$2)
|
|
@@ -3732,7 +3825,7 @@ return _p$
|
|
|
3732
3825
|
},{e:undefined,t:undefined,a:undefined
|
|
3733
3826
|
})
|
|
3734
3827
|
return _el$
|
|
3735
|
-
})(),_$createComponent(
|
|
3828
|
+
})(),_$createComponent(Show4,{get when(){return configuring()
|
|
3736
3829
|
},get fallback(){return _$createComponent(OnboardingStep,{get api(){return props.api
|
|
3737
3830
|
},get preferences(){return props.preferences
|
|
3738
3831
|
},get step(){return ONBOARDING_STEPS[step()]
|
|
@@ -3789,7 +3882,7 @@ _$insertNode(_el$,_el$6)
|
|
|
3789
3882
|
_$setProp(_el$,"flexDirection","row")
|
|
3790
3883
|
_$setProp(_el$,"justifyContent","space-between")
|
|
3791
3884
|
_$setProp(_el$2,"flexGrow",1)
|
|
3792
|
-
_$insert(_el$2,_$createComponent(
|
|
3885
|
+
_$insert(_el$2,_$createComponent(Show5,{get when(){return props.onRefresh
|
|
3793
3886
|
},get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Refresh (`),_el$5=_$createTextNode(`)`)
|
|
3794
3887
|
_$insertNode(_el$3,_el$4)
|
|
3795
3888
|
_$insertNode(_el$3,_el$5)
|
|
@@ -3850,9 +3943,9 @@ return _el$
|
|
|
3850
3943
|
function PresetPreviewFrame(props){const icons=useIcons()
|
|
3851
3944
|
const dialogs=useDialogs(props.api)
|
|
3852
3945
|
const theme=()=>props.api.theme.current
|
|
3853
|
-
const dimensions=
|
|
3946
|
+
const dimensions=useTerminalDimensions6()
|
|
3854
3947
|
const scroll=useDialogScroll()
|
|
3855
|
-
const [active,setActive]=
|
|
3948
|
+
const [active,setActive]=createSignal14("apply")
|
|
3856
3949
|
let body
|
|
3857
3950
|
const prefix=`${PLUGIN_ID}.preset-preview`
|
|
3858
3951
|
function activate(action){if(!props.valid()){dialogs.close()
|
|
@@ -3881,7 +3974,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
|
|
|
3881
3974
|
},{key:"ctrl+r",cmd:`${prefix}.refresh`
|
|
3882
3975
|
}]
|
|
3883
3976
|
})
|
|
3884
|
-
|
|
3977
|
+
onCleanup10(unregister)
|
|
3885
3978
|
createEffect8(()=>{if(!props.valid())
|
|
3886
3979
|
dialogs.close()
|
|
3887
3980
|
})
|
|
@@ -3929,7 +4022,7 @@ return _p$
|
|
|
3929
4022
|
},{e:undefined,t:undefined,a:undefined
|
|
3930
4023
|
})
|
|
3931
4024
|
return _el$5
|
|
3932
|
-
})(),_$createComponent(
|
|
4025
|
+
})(),_$createComponent(Show6,{get when(){return props.blocked||props.notice
|
|
3933
4026
|
},get children(){var _el$7=_$createElement("box"),_el$8=_$createElement("text"),_el$9=_$createElement("text")
|
|
3934
4027
|
_$insertNode(_el$7,_el$8)
|
|
3935
4028
|
_$insertNode(_el$7,_el$9)
|
|
@@ -4141,530 +4234,44 @@ dialogs.open(()=>_$createComponent(SelectionMenu,{api,title:"MCP presets",get op
|
|
|
4141
4234
|
|
|
4142
4235
|
|
|
4143
4236
|
|
|
4237
|
+
var Content=lazy3(async ()=>{const path=import.meta.url.includes("/dist/")?"./sidebar-settings.js":"./settings-dialog-content"
|
|
4238
|
+
const module=await import(path)
|
|
4239
|
+
return{default:module.SettingsDialog
|
|
4240
|
+
}})
|
|
4241
|
+
function SettingsDialog(props){return(()=>{var _el$=_$createElement("box")
|
|
4242
|
+
_$insert(_el$,_$createComponent(Suspense3,{get children(){return _$createComponent(Content,props)
|
|
4243
|
+
}}))
|
|
4244
|
+
return _el$
|
|
4245
|
+
})()
|
|
4246
|
+
}
|
|
4247
|
+
function openSettings(api,preferences,activeValue,mcp,skills){createDialogStack(api,preferences.lspIconStyle,()=>true,preferences.cornerFont).open(()=>_$createComponent(SettingsDialog,{api,preferences,mcp,skills,activeValue
|
|
4248
|
+
}),"xlarge")
|
|
4249
|
+
}
|
|
4144
4250
|
|
|
4145
4251
|
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
}
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
-
|
|
4163
|
-
|
|
4164
|
-
},{title:`${icons.icon("search")} Search Everything shortcut`,value:"search_key",description:preferences.selectedSearchKey?.()??DEFAULT_SEARCH_KEY
|
|
4165
|
-
},{title:`${icons.icon("retry")} Limits refresh interval`,value:"limits_refresh",description:`${preferences.selectedLimitsRefreshMinutes()} min \xB7 minimum 1 min`
|
|
4166
|
-
}]
|
|
4167
|
-
}
|
|
4168
|
-
function titleVisibilityOptions(api,preferences,icons){if(!supportsTitleVisibility(api))
|
|
4169
|
-
return []
|
|
4170
|
-
const title=preferences.selectedShowSessionTitle()
|
|
4171
|
-
const date=preferences.selectedShowSessionDate()
|
|
4172
|
-
return [{title:`${icons.icon(title ? "checked" : "unchecked")} Session title`,value:"session_title",description:title?"visible":"hidden"
|
|
4173
|
-
},{title:`${icons.icon(date ? "checked" : "unchecked")} Creation date`,value:"session_date",description:date?"visible":"hidden"
|
|
4174
|
-
}]
|
|
4252
|
+
async function load(input){const path=import.meta.url.includes("/dist/")?"./toolbar-settings.js":"./open-toolbar"
|
|
4253
|
+
try{return await import(path)
|
|
4254
|
+
} catch(error){input.api.ui.toast({variant:"error",title:"Toolbar",message:String(error)})
|
|
4255
|
+
return
|
|
4256
|
+
}}
|
|
4257
|
+
async function openToolbarManager(input){const route=JSON.stringify(input.api.route.current)
|
|
4258
|
+
const target=input.skills?.target().key
|
|
4259
|
+
const wasOpen=input.api.ui.dialog.open
|
|
4260
|
+
const module=await load(input)
|
|
4261
|
+
if(route===JSON.stringify(input.api.route.current)&&target===input.skills?.target().key&&(!wasOpen||input.api.ui.dialog.open)&&!input.api.lifecycle?.signal?.aborted)
|
|
4262
|
+
module?.openToolbarManager(input)
|
|
4263
|
+
}
|
|
4264
|
+
async function openToolbarPin(input){const route=JSON.stringify(input.api.route.current)
|
|
4265
|
+
const target=input.skills?.target().key
|
|
4266
|
+
const wasOpen=input.api.ui.dialog.open
|
|
4267
|
+
const module=await load(input)
|
|
4268
|
+
if(route===JSON.stringify(input.api.route.current)&&target===input.skills?.target().key&&(!wasOpen||input.api.ui.dialog.open)&&!input.api.lifecycle?.signal?.aborted)
|
|
4269
|
+
module?.openToolbarPin(input)
|
|
4175
4270
|
}
|
|
4176
|
-
function
|
|
4177
|
-
|
|
4178
|
-
},{
|
|
4179
|
-
}
|
|
4180
|
-
},{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"
|
|
4181
|
-
})),{title:`${icons.icon("add")} Save as\u2026`,value:"save_preset",description:"create a preset from the current layout"
|
|
4182
|
-
}]
|
|
4183
|
-
},{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)
|
|
4184
|
-
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"
|
|
4185
|
-
}})]
|
|
4186
|
-
},{id:"behavior",tab:"Behavior",title:"Behavior",options:behaviorSettingsOptions(api,preferences,icons)
|
|
4187
|
-
},{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`
|
|
4188
|
-
},{title:`${icons.icon("export")} Copy portable settings`,value:"export_settings",description:"versioned layout and MCP JSON"
|
|
4189
|
-
},{title:`${icons.icon("add")} Import portable settings\u2026`,value:"import_settings",description:"preview pasted JSON before applying"
|
|
4190
|
-
},{title:`${icons.icon("retry")} Reload settings from file`,value:"reload_settings",description:"sync saved changes from other OpenCode sessions"
|
|
4191
|
-
},{title:`${icons.icon("reset")} Restore configured layout`,value:"reset_sections",description:"visibility and expansion"
|
|
4192
|
-
},{title:`${icons.icon("reset")} Restore configured behavior`,value:"reset_settings",description:"startup, MCP memory, icons, shortcuts, limits, actions"
|
|
4193
|
-
},{title:`${icons.icon("reset")} Clear remembered MCP states`,value:"reset_mcp",description:`scope: ${preferences.preferenceScopeLabel()}`
|
|
4194
|
-
},{title:`${icons.section("skills")} Manage trusted skills`,value:"trusted_skills",description:`${preferences.skippedSkillCount()} trusted`
|
|
4195
|
-
},{title:`${icons.icon("help")} Open quick setup guide`,value:"wizard",description:"tips and section settings"
|
|
4196
|
-
}]
|
|
4197
|
-
}])
|
|
4198
|
-
const orderedGroups=createMemo7(()=>["sections","scope","presets","behavior","defaults"].map((id)=>groups().find((group)=>group.id===id)))
|
|
4199
|
-
return orderedGroups
|
|
4200
|
-
}
|
|
4201
|
-
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")
|
|
4202
|
-
return
|
|
4203
|
-
if(input.options()[input.active()]?.value==="mcp")
|
|
4204
|
-
input.openMcpGroups()
|
|
4205
|
-
if(input.options()[input.active()]?.value==="skills")
|
|
4206
|
-
input.openSkillGroups()
|
|
4207
|
-
}},{name:`${PLUGIN_ID}.settings.quick-actions`,run:()=>{if(input.activeGroup()==="sections"&&input.options()[input.active()]?.value==="quick_actions")
|
|
4208
|
-
input.openQuickActions()
|
|
4209
|
-
}},{name:`${PLUGIN_ID}.settings.item-limit`,run:()=>{const section=input.options()[input.active()]?.value
|
|
4210
|
-
if(input.activeGroup()==="sections"&&SIDEBAR_SECTIONS.includes(section))
|
|
4211
|
-
input.openLimitPrompt(section)
|
|
4212
|
-
}},{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`}]
|
|
4213
|
-
})
|
|
4214
|
-
}
|
|
4215
|
-
|
|
4216
|
-
|
|
4217
|
-
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
function openLimitsRefreshPrompt(api,preferences,dialogs){const scope=preferences.preferenceScopeLabel()
|
|
4227
|
-
dialogs.prompt({title:"Limits refresh interval",description:()=>(()=>{var _el$=_$createElement("text")
|
|
4228
|
-
_$insertNode(_el$,_$createTextNode(`Automatic refresh in minutes (minimum 1; default 5). Manual Refresh stays immediate.`))
|
|
4229
|
-
_$effect((_$p)=>_$setProp(_el$,"fg",api.theme.current.textMuted,_$p))
|
|
4230
|
-
return _el$
|
|
4231
|
-
})(),value:String(preferences.selectedLimitsRefreshMinutes()),onConfirm(value){if(preferences.preferenceScopeLabel()!==scope)
|
|
4232
|
-
throw new Error("Preference scope changed; reopen this setting")
|
|
4233
|
-
if(!/^\d+$/.test(value.trim()))
|
|
4234
|
-
throw new Error("Enter whole minutes (at least 1 minute)")
|
|
4235
|
-
preferences.setLimitsRefreshMinutes(Number(value))
|
|
4236
|
-
dialogs.back()
|
|
4237
|
-
}})
|
|
4238
|
-
}
|
|
4239
|
-
function createSettingsSelection(input){const dialogClosed=()=>("open" in input.api.ui.dialog)&&!input.api.ui.dialog.open
|
|
4240
|
-
function openLimitPrompt(section){const index=input.options().findIndex((option)=>option.value===section)
|
|
4241
|
-
if(index!==-1)
|
|
4242
|
-
input.setActive(index)
|
|
4243
|
-
input.dialogs.prompt({title:`${SECTION_DEFINITIONS.find((item) => item.name === section).label} item limit`,description:()=>(()=>{var _el$=_$createElement("text")
|
|
4244
|
-
_$insertNode(_el$,_$createTextNode(`Visible items before Show all. Enter 0 for All.`))
|
|
4245
|
-
_$effect((_$p)=>_$setProp(_el$,"fg",input.api.theme.current.textMuted,_$p))
|
|
4246
|
-
return _el$
|
|
4247
|
-
})(),value:String(input.preferences.selectedSectionItemLimit(section)),onConfirm(value){if(!/^\d+$/.test(value.trim()))
|
|
4248
|
-
throw new Error("Enter a non-negative whole number (0 for All)")
|
|
4249
|
-
input.preferences.setSectionItemLimit(section,Number(value))
|
|
4250
|
-
input.dialogs.back()
|
|
4251
|
-
}})
|
|
4252
|
-
}
|
|
4253
|
-
function openShortcut(value){const bindings={toggle_key:{title:"Sidebar shortcut",get:input.preferences.selectedToggleKey,set:input.preferences.setToggleKey
|
|
4254
|
-
},focus_key:{title:"Focus shortcut",get:input.preferences.selectedFocusKey,set:input.preferences.setFocusKey
|
|
4255
|
-
},search_key:{title:"Search Everything shortcut",get:input.preferences.selectedSearchKey,set:input.preferences.setSearchKey
|
|
4256
|
-
}}
|
|
4257
|
-
const binding=bindings[value]
|
|
4258
|
-
input.dialogs.prompt({title:binding.title,description:()=>(()=>{var _el$3=_$createElement("text")
|
|
4259
|
-
_$insertNode(_el$3,_$createTextNode(`Use OpenCode key syntax, for example alt+s.`))
|
|
4260
|
-
_$effect((_$p)=>_$setProp(_el$3,"fg",input.api.theme.current.textMuted,_$p))
|
|
4261
|
-
return _el$3
|
|
4262
|
-
})(),value:binding.get(),onConfirm(key){binding.set(key)
|
|
4263
|
-
input.dialogs.back()
|
|
4264
|
-
}})
|
|
4265
|
-
}
|
|
4266
|
-
function saveLayout(){input.preferences.saveLayoutAsDefault().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Current layout saved as default",duration:3000
|
|
4267
|
-
})).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
|
|
4268
|
-
}))
|
|
4269
|
-
}
|
|
4270
|
-
function exportSettings(){const copied=input.api.renderer.copyToClipboardOSC52(input.preferences.exportPortableSettings())
|
|
4271
|
-
input.api.ui.toast({variant:copied?"success":"warning",title:"Portable settings",message:copied?"Layout and MCP settings copied as JSON":"Terminal clipboard is unavailable",duration:4000
|
|
4272
|
-
})
|
|
4273
|
-
}
|
|
4274
|
-
function importSettings(){const path=import.meta.url.includes("/dist/tui.js")?"./settings-import.js":"../ui/settings-import-dialog"
|
|
4275
|
-
import(path).then((module)=>{if(!dialogClosed())
|
|
4276
|
-
module.openSettingsImport(input)
|
|
4277
|
-
}).catch((error)=>input.api.ui.toast({variant:"error",title:"Portable settings",message:String(error)
|
|
4278
|
-
}))
|
|
4279
|
-
}
|
|
4280
|
-
function select(value=input.options()[input.active()]?.value){if(!value)
|
|
4281
|
-
return
|
|
4282
|
-
const index=input.options().findIndex((option)=>option.value===value)
|
|
4283
|
-
if(index!==-1)
|
|
4284
|
-
input.setActive(index)
|
|
4285
|
-
if(value==="scope:global"||value==="scope:worktree")
|
|
4286
|
-
input.preferences.setPreferenceScope(value==="scope:global"?"global":"worktree")
|
|
4287
|
-
else if(value.startsWith("preset:custom:"))
|
|
4288
|
-
input.openPreset(decodeURIComponent(value.slice("preset:custom:".length)))
|
|
4289
|
-
else
|
|
4290
|
-
switch(value){case "save_preset":{input.promptPreset()
|
|
4291
|
-
break
|
|
4292
|
-
}
|
|
4293
|
-
case "save_layout":{saveLayout()
|
|
4294
|
-
break
|
|
4295
|
-
}
|
|
4296
|
-
case "export_settings":{exportSettings()
|
|
4297
|
-
break
|
|
4298
|
-
}
|
|
4299
|
-
case "import_settings":{importSettings()
|
|
4300
|
-
break
|
|
4301
|
-
}
|
|
4302
|
-
case "reload_settings":{input.preferences.reloadFromFile().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Saved settings reloaded",duration:3000
|
|
4303
|
-
})).catch((error)=>input.api.ui.toast({variant:"error",title:"Navigator settings",message:error instanceof Error?error.message:"Could not reload saved settings",duration:5000
|
|
4304
|
-
}))
|
|
4305
|
-
break
|
|
4306
|
-
}
|
|
4307
|
-
case "reset_sections":{input.preferences.resetSections()
|
|
4308
|
-
break
|
|
4309
|
-
}
|
|
4310
|
-
case "session_title":{input.preferences.toggleSessionTitleVisibility()
|
|
4311
|
-
break
|
|
4312
|
-
}
|
|
4313
|
-
case "session_date":{input.preferences.toggleSessionDateVisibility()
|
|
4314
|
-
break
|
|
4315
|
-
}
|
|
4316
|
-
case "persist_mcp":{input.preferences.toggleMcpPersistence()
|
|
4317
|
-
break
|
|
4318
|
-
}
|
|
4319
|
-
case "limits_refresh":{openLimitsRefreshPrompt(input.api,input.preferences,input.dialogs)
|
|
4320
|
-
break
|
|
4321
|
-
}
|
|
4322
|
-
case "start_in_chat":{input.preferences.toggleStartInChat()
|
|
4323
|
-
break
|
|
4324
|
-
}
|
|
4325
|
-
case "auto_approve_permissions":{input.preferences.setAutoApprovePermissions(input.preferences.autoApprovePermissions()!==true)
|
|
4326
|
-
break
|
|
4327
|
-
}
|
|
4328
|
-
case "lsp_icon_style":{input.preferences.toggleLspIconStyle()
|
|
4329
|
-
break
|
|
4330
|
-
}
|
|
4331
|
-
case "corner_font":{input.preferences.toggleCornerFont()
|
|
4332
|
-
break
|
|
4333
|
-
}
|
|
4334
|
-
case "row_density":{input.preferences.toggleRowDensity()
|
|
4335
|
-
break
|
|
4336
|
-
}
|
|
4337
|
-
case "toggle_key":{openShortcut("toggle_key")
|
|
4338
|
-
break
|
|
4339
|
-
}
|
|
4340
|
-
case "focus_key":{openShortcut("focus_key")
|
|
4341
|
-
break
|
|
4342
|
-
}
|
|
4343
|
-
case "search_key":{openShortcut("search_key")
|
|
4344
|
-
break
|
|
4345
|
-
}
|
|
4346
|
-
case "reset_settings":{input.preferences.resetPluginSettings()
|
|
4347
|
-
break
|
|
4348
|
-
}
|
|
4349
|
-
case "reset_mcp":{input.preferences.resetMcpStates()
|
|
4350
|
-
break
|
|
4351
|
-
}
|
|
4352
|
-
case "trusted_skills":{const path=import.meta.url.includes("/dist/tui.js")?"./trusted-skills.js":"../ui/trusted-skills-dialog"
|
|
4353
|
-
import(path).then((module)=>{if(dialogClosed())
|
|
4354
|
-
return
|
|
4355
|
-
const{TrustedSkillsDialog
|
|
4356
|
-
}=module
|
|
4357
|
-
input.dialogs.open(()=>_$createComponent(TrustedSkillsDialog,{get api(){return input.api
|
|
4358
|
-
},get preferences(){return input.preferences
|
|
4359
|
-
}}))
|
|
4360
|
-
}).catch((error)=>input.api.ui.toast({variant:"error",title:"Trusted skills",message:String(error)
|
|
4361
|
-
}))
|
|
4362
|
-
break
|
|
4363
|
-
}
|
|
4364
|
-
case "wizard":{input.dialogs.open(()=>_$createComponent(FirstRunWizard,{get api(){return input.api
|
|
4365
|
-
},get preferences(){return input.preferences
|
|
4366
|
-
}}))
|
|
4367
|
-
break
|
|
4368
|
-
}
|
|
4369
|
-
default:{input.preferences.toggleSelectedSection(value)
|
|
4370
|
-
}}}
|
|
4371
|
-
function openQuickActions(){input.setActive(input.options().findIndex((option)=>option.value==="quick_actions"))
|
|
4372
|
-
const path=import.meta.url.includes("/dist/tui.js")?"./quick-actions-settings.js":"../ui/quick-actions-dialog"
|
|
4373
|
-
import(path).then((module)=>{if(dialogClosed())
|
|
4374
|
-
return
|
|
4375
|
-
const{QuickActionsDialog
|
|
4376
|
-
}=module
|
|
4377
|
-
input.dialogs.open(()=>_$createComponent(QuickActionsDialog,{get api(){return input.api
|
|
4378
|
-
},get preferences(){return input.preferences
|
|
4379
|
-
}}))
|
|
4380
|
-
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"Quick actions",message:String(error),duration:4000
|
|
4381
|
-
})
|
|
4382
|
-
})
|
|
4383
|
-
}
|
|
4384
|
-
function openMcpGroups(){if(!input.mcp)
|
|
4385
|
-
return
|
|
4386
|
-
input.setActive(input.options().findIndex((option)=>option.value==="mcp"))
|
|
4387
|
-
const path=import.meta.url.includes("/dist/tui.js")?"./mcp-groups.js":"../ui/mcp-groups-dialog"
|
|
4388
|
-
import(path).then((module)=>{if(dialogClosed())
|
|
4389
|
-
return
|
|
4390
|
-
const{McpGroupsDialog
|
|
4391
|
-
}=module
|
|
4392
|
-
input.dialogs.open(()=>_$createComponent(McpGroupsDialog,{get api(){return input.api
|
|
4393
|
-
},get preferences(){return input.preferences
|
|
4394
|
-
},get mcp(){return input.mcp
|
|
4395
|
-
}}))
|
|
4396
|
-
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"MCP groups",message:String(error),duration:4000
|
|
4397
|
-
})
|
|
4398
|
-
})
|
|
4399
|
-
}
|
|
4400
|
-
function openSkillGroups(){if(!input.skills)
|
|
4401
|
-
return
|
|
4402
|
-
input.setActive(input.options().findIndex((option)=>option.value==="skills"))
|
|
4403
|
-
const path=import.meta.url.includes("/dist/tui.js")?"./skill-groups.js":"../ui/skill-groups-dialog"
|
|
4404
|
-
import(path).then((module)=>{if(dialogClosed())
|
|
4405
|
-
return
|
|
4406
|
-
const{SkillGroupsDialog
|
|
4407
|
-
}=module
|
|
4408
|
-
input.dialogs.open(()=>_$createComponent(SkillGroupsDialog,{get api(){return input.api
|
|
4409
|
-
},get preferences(){return input.preferences
|
|
4410
|
-
},get skills(){return input.skills
|
|
4411
|
-
}}))
|
|
4412
|
-
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"Skill groups",message:String(error),duration:4000
|
|
4413
|
-
})
|
|
4414
|
-
})
|
|
4415
|
-
}
|
|
4416
|
-
return{openLimitPrompt,openMcpGroups,openSkillGroups,openQuickActions,select
|
|
4417
|
-
}}
|
|
4418
|
-
function createSettingsDialogController(props){let body
|
|
4419
|
-
const theme=()=>props.api.theme.current
|
|
4420
|
-
const icons=useIcons()
|
|
4421
|
-
const dialogs=useDialogs(props.api)
|
|
4422
|
-
const scroll=useDialogScroll()
|
|
4423
|
-
const dimensions=useTerminalDimensions6()
|
|
4424
|
-
const bodyHeight=createMemo8(()=>Math.max(4,Math.floor(dimensions().height*0.75)-10))
|
|
4425
|
-
const orderedGroups=createSettingsGroups(props.api,props.preferences,icons)
|
|
4426
|
-
const initialGroup=orderedGroups().find((group)=>group.options.some((option)=>option.value===props.activeValue))
|
|
4427
|
-
const [activeGroup,setActiveGroup]=useDialogState("tab",initialGroup?.id??orderedGroups()[0].id)
|
|
4428
|
-
const options=createMemo8(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
|
|
4429
|
-
const optionId=(value)=>`${PLUGIN_ID}.settings.${value}`
|
|
4430
|
-
const initialActive=options().findIndex((option)=>option.value===props.activeValue)
|
|
4431
|
-
const [active,setActive]=useDialogState("selection",Math.max(0,initialActive))
|
|
4432
|
-
createEffect11(()=>{if(active()>=options().length)
|
|
4433
|
-
setActive(Math.max(0,options().length-1))
|
|
4434
|
-
})
|
|
4435
|
-
const contentHeight=createMemo8(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
|
|
4436
|
-
const footerHint=createMemo8(()=>{const common=`${icons.key("tab")} switch \xB7 ${icons.key("up/down")} navigate`
|
|
4437
|
-
if(activeGroup()==="sections")
|
|
4438
|
-
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`
|
|
4439
|
-
if(activeGroup()==="presets")
|
|
4440
|
-
return `${common} \xB7 ${icons.key("enter")} manage`
|
|
4441
|
-
if(activeGroup()==="behavior")
|
|
4442
|
-
return `${common} \xB7 ${icons.key("enter")} change`
|
|
4443
|
-
if(activeGroup()==="defaults")
|
|
4444
|
-
return `${common} \xB7 ${icons.key("enter")} run`
|
|
4445
|
-
return `${common} \xB7 ${icons.key("enter")} select`
|
|
4446
|
-
})
|
|
4447
|
-
onMount4(()=>{queueMicrotask(()=>{const option=options()[active()]
|
|
4448
|
-
if(option)
|
|
4449
|
-
body?.scrollChildIntoView(optionId(option.value))
|
|
4450
|
-
})
|
|
4451
|
-
})
|
|
4452
|
-
function move(offset){const next=(active() + offset + options().length)%options().length
|
|
4453
|
-
setActive(next)
|
|
4454
|
-
const option=options()[next]
|
|
4455
|
-
if(option)
|
|
4456
|
-
body?.scrollChildIntoView(optionId(option.value))
|
|
4457
|
-
}
|
|
4458
|
-
function switchGroup(offset){const index=orderedGroups().findIndex((group)=>group.id===activeGroup())
|
|
4459
|
-
const group=orderedGroups()[(index + offset + orderedGroups().length)%orderedGroups().length]
|
|
4460
|
-
setActiveGroup(group.id)
|
|
4461
|
-
setActive(0)
|
|
4462
|
-
queueMicrotask(()=>{const option=options()[0]
|
|
4463
|
-
if(option)
|
|
4464
|
-
body?.scrollChildIntoView(optionId(option.value))
|
|
4465
|
-
})
|
|
4466
|
-
}
|
|
4467
|
-
function reorder(value,direction){if(!value||!SIDEBAR_SECTIONS.includes(value))
|
|
4468
|
-
return
|
|
4469
|
-
props.preferences.moveSelectedSection(value,direction)
|
|
4470
|
-
queueMicrotask(()=>{const next=options().findIndex((candidate)=>candidate.value===value)
|
|
4471
|
-
if(next===-1)
|
|
4472
|
-
return
|
|
4473
|
-
setActive(next)
|
|
4474
|
-
body?.scrollChildIntoView(optionId(value))
|
|
4475
|
-
})
|
|
4476
|
-
}
|
|
4477
|
-
function runPresetAction(action,name){const path=import.meta.url.includes("/dist/tui.js")?"./layout-preset-actions.js":"./layout-preset-actions"
|
|
4478
|
-
import(path).then((module)=>{if("open" in props.api.ui.dialog&&!props.api.ui.dialog.open)
|
|
4479
|
-
return
|
|
4480
|
-
const factory=module.createLayoutPresetActions
|
|
4481
|
-
const actions=factory({api:props.api,preferences:props.preferences,mcp:props.mcp,dialogs
|
|
4482
|
-
})
|
|
4483
|
-
if(action==="open"&&name)
|
|
4484
|
-
actions.open(name)
|
|
4485
|
-
else
|
|
4486
|
-
actions.prompt()
|
|
4487
|
-
}).catch((error)=>props.api.ui.toast({variant:"error",title:"Layout presets",message:String(error)
|
|
4488
|
-
}))
|
|
4489
|
-
}
|
|
4490
|
-
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")
|
|
4491
|
-
})
|
|
4492
|
-
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
|
|
4493
|
-
})
|
|
4494
|
-
onCleanup11(unregister)
|
|
4495
|
-
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
|
|
4496
|
-
scroll.ref(node)
|
|
4497
|
-
},restoreScroll:scroll.restore,saveScroll:scroll.save,theme
|
|
4498
|
-
}}
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
4503
|
-
|
|
4504
|
-
|
|
4505
|
-
|
|
4506
|
-
|
|
4507
|
-
|
|
4508
|
-
|
|
4509
|
-
function SettingsOptionRow(props){const model=props.controller
|
|
4510
|
-
const index=()=>model.options().findIndex((candidate)=>candidate.value===props.option.value)
|
|
4511
|
-
const selected=()=>model.active()===index()
|
|
4512
|
-
const section=()=>props.option.value
|
|
4513
|
-
return _$createComponent(SelectionBox,{get id(){return model.optionId(props.option.value)
|
|
4514
|
-
},flexDirection:"row",gap:2,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo(()=>!!selected())()?model.theme().backgroundElement:undefined
|
|
4515
|
-
},onMouseOver:()=>model.setActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
4516
|
-
model.select(props.option.value)
|
|
4517
|
-
},get children(){return [(()=>{var _el$=_$createElement("text")
|
|
4518
|
-
_$setProp(_el$,"flexShrink",0)
|
|
4519
|
-
_$insert(_el$,()=>props.option.title)
|
|
4520
|
-
_$effect((_p$)=>{var _v$=selected()?TextAttributes15.BOLD:undefined,_v$2=model.theme().text
|
|
4521
|
-
_v$!==_p$.e&&(_p$.e=_$setProp(_el$,"attributes",_v$,_p$.e))
|
|
4522
|
-
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"fg",_v$2,_p$.t))
|
|
4523
|
-
return _p$
|
|
4524
|
-
},{e:undefined,t:undefined
|
|
4525
|
-
})
|
|
4526
|
-
return _el$
|
|
4527
|
-
})(),(()=>{var _el$2=_$createElement("text")
|
|
4528
|
-
_$setProp(_el$2,"flexGrow",1)
|
|
4529
|
-
_$insert(_el$2,()=>props.option.description)
|
|
4530
|
-
_$effect((_$p)=>_$setProp(_el$2,"fg",model.theme().borderSubtle,_$p))
|
|
4531
|
-
return _el$2
|
|
4532
|
-
})(),_$createComponent(Show6,{get when(){return SIDEBAR_SECTIONS.includes(section())
|
|
4533
|
-
},get children(){var _el$3=_$createElement("box"),_el$8=_$createElement("text"),_el$9=_$createTextNode(` Items: `),_el$0=_$createElement("text"),_el$1=_$createElement("text")
|
|
4534
|
-
_$insertNode(_el$3,_el$8)
|
|
4535
|
-
_$insertNode(_el$3,_el$0)
|
|
4536
|
-
_$insertNode(_el$3,_el$1)
|
|
4537
|
-
_$setProp(_el$3,"flexDirection","row")
|
|
4538
|
-
_$setProp(_el$3,"flexShrink",0)
|
|
4539
|
-
_$setProp(_el$3,"gap",1)
|
|
4540
|
-
_$insert(_el$3,_$createComponent(Show6,{get when(){return props.option.value==="quick_actions"
|
|
4541
|
-
},get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(` Actions`)
|
|
4542
|
-
_$insertNode(_el$4,_el$5)
|
|
4543
|
-
_$setProp(_el$4,"onMouseDown",(event)=>event.stopPropagation())
|
|
4544
|
-
_$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
|
|
4545
|
-
model.openQuickActions()
|
|
4546
|
-
})
|
|
4547
|
-
_$insert(_el$4,()=>model.icons.icon("actions"),_el$5)
|
|
4548
|
-
_$effect((_$p)=>_$setProp(_el$4,"fg",model.theme().accent,_$p))
|
|
4549
|
-
return _el$4
|
|
4550
|
-
}}),_el$8)
|
|
4551
|
-
_$insert(_el$3,_$createComponent(Show6,{get when(){return props.option.value==="mcp"||props.option.value==="skills"
|
|
4552
|
-
},get children(){var _el$6=_$createElement("text"),_el$7=_$createTextNode(` Groups`)
|
|
4553
|
-
_$insertNode(_el$6,_el$7)
|
|
4554
|
-
_$setProp(_el$6,"onMouseDown",(event)=>event.stopPropagation())
|
|
4555
|
-
_$setProp(_el$6,"onMouseUp",(event)=>{event.stopPropagation()
|
|
4556
|
-
if(props.option.value==="skills")
|
|
4557
|
-
model.openSkillGroups()
|
|
4558
|
-
else
|
|
4559
|
-
model.openMcpGroups()
|
|
4560
|
-
})
|
|
4561
|
-
_$insert(_el$6,()=>model.icons.icon("sections"),_el$7)
|
|
4562
|
-
_$effect((_$p)=>_$setProp(_el$6,"fg",model.theme().accent,_$p))
|
|
4563
|
-
return _el$6
|
|
4564
|
-
}}),_el$8)
|
|
4565
|
-
_$insertNode(_el$8,_el$9)
|
|
4566
|
-
_$setProp(_el$8,"onMouseDown",(event)=>event.stopPropagation())
|
|
4567
|
-
_$setProp(_el$8,"onMouseUp",(event)=>{event.stopPropagation()
|
|
4568
|
-
model.openLimitPrompt(section())
|
|
4569
|
-
})
|
|
4570
|
-
_$insert(_el$8,()=>model.icons.icon("todo"),_el$9)
|
|
4571
|
-
_$insert(_el$8,()=>props.preferences.selectedSectionItemLimit?.(section())||"All",null)
|
|
4572
|
-
_$setProp(_el$0,"onMouseDown",(event)=>{event.stopPropagation()
|
|
4573
|
-
model.reorder(props.option.value,-1)
|
|
4574
|
-
})
|
|
4575
|
-
_$insert(_el$0,()=>model.icons.icon("up"))
|
|
4576
|
-
_$setProp(_el$1,"onMouseDown",(event)=>{event.stopPropagation()
|
|
4577
|
-
model.reorder(props.option.value,1)
|
|
4578
|
-
})
|
|
4579
|
-
_$insert(_el$1,()=>model.icons.icon("down"))
|
|
4580
|
-
_$effect((_p$)=>{var _v$3=model.theme().accent,_v$4=model.theme().accent,_v$5=model.theme().accent
|
|
4581
|
-
_v$3!==_p$.e&&(_p$.e=_$setProp(_el$8,"fg",_v$3,_p$.e))
|
|
4582
|
-
_v$4!==_p$.t&&(_p$.t=_$setProp(_el$0,"fg",_v$4,_p$.t))
|
|
4583
|
-
_v$5!==_p$.a&&(_p$.a=_$setProp(_el$1,"fg",_v$5,_p$.a))
|
|
4584
|
-
return _p$
|
|
4585
|
-
},{e:undefined,t:undefined,a:undefined
|
|
4586
|
-
})
|
|
4587
|
-
return _el$3
|
|
4588
|
-
}})]
|
|
4589
|
-
}})
|
|
4590
|
-
}
|
|
4591
|
-
function SettingsDialog(props){const model=createSettingsDialogController(props)
|
|
4592
|
-
return _$createComponent(DialogSurface,{get api(){return props.api
|
|
4593
|
-
},get children(){return [(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` Navigator settings`),_el$4=_$createElement("text")
|
|
4594
|
-
_$insertNode(_el$,_el$2)
|
|
4595
|
-
_$insertNode(_el$,_el$4)
|
|
4596
|
-
_$setProp(_el$,"flexDirection","row")
|
|
4597
|
-
_$setProp(_el$,"justifyContent","space-between")
|
|
4598
|
-
_$insertNode(_el$2,_el$3)
|
|
4599
|
-
_$insert(_el$2,()=>model.icons.icon("settings"),_el$3)
|
|
4600
|
-
_$setProp(_el$4,"onMouseDown",(event)=>event.stopPropagation())
|
|
4601
|
-
_$setProp(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
|
|
4602
|
-
model.dialogs.back()
|
|
4603
|
-
})
|
|
4604
|
-
_$insert(_el$4,()=>model.icons.key("esc"))
|
|
4605
|
-
_$effect((_p$)=>{var _v$=TextAttributes16.BOLD,_v$2=model.theme().text,_v$3=model.theme().textMuted
|
|
4606
|
-
_v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"attributes",_v$,_p$.e))
|
|
4607
|
-
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"fg",_v$2,_p$.t))
|
|
4608
|
-
_v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
|
|
4609
|
-
return _p$
|
|
4610
|
-
},{e:undefined,t:undefined,a:undefined
|
|
4611
|
-
})
|
|
4612
|
-
return _el$
|
|
4613
|
-
})(),(()=>{var _el$5=_$createElement("text")
|
|
4614
|
-
_$insertNode(_el$5,_$createTextNode(`Adjust sections and behavior. Changes apply immediately.`))
|
|
4615
|
-
_$effect((_$p)=>_$setProp(_el$5,"fg",model.theme().textMuted,_$p))
|
|
4616
|
-
return _el$5
|
|
4617
|
-
})(),(()=>{var _el$7=_$createElement("box")
|
|
4618
|
-
_$setProp(_el$7,"flexDirection","row")
|
|
4619
|
-
_$setProp(_el$7,"gap",1)
|
|
4620
|
-
_$insert(_el$7,_$createComponent(For10,{get each(){return model.orderedGroups()
|
|
4621
|
-
},children:(group)=>_$createComponent(Tab,{get api(){return props.api
|
|
4622
|
-
},get selected(){return model.activeGroup()===group.id
|
|
4623
|
-
},paddingLeft:1,paddingRight:1,onMouseDown:()=>{model.setActiveGroup(group.id)
|
|
4624
|
-
model.setActive(0)
|
|
4625
|
-
},get children(){return [_$memo(()=>model.icons.tab(group.id))," ",_$memo(()=>group.tab)]
|
|
4626
|
-
}})
|
|
4627
|
-
}))
|
|
4628
|
-
return _el$7
|
|
4629
|
-
})(),(()=>{var _el$8=_$createElement("scrollbox"),_el$9=_$createElement("box")
|
|
4630
|
-
_$insertNode(_el$8,_el$9)
|
|
4631
|
-
var _ref$=model.setBody
|
|
4632
|
-
typeof _ref$==="function"?_$use(_ref$,_el$8):model.setBody=_el$8
|
|
4633
|
-
_$setProp(_el$8,"id",`${PLUGIN_ID}.settings.body`)
|
|
4634
|
-
_$setProp(_el$8,"scrollX",false)
|
|
4635
|
-
_$setProp(_el$8,"verticalScrollbarOptions",{visible:true
|
|
4636
|
-
})
|
|
4637
|
-
_$setProp(_el$8,"horizontalScrollbarOptions",{visible:false
|
|
4638
|
-
})
|
|
4639
|
-
_$setProp(_el$9,"gap",1)
|
|
4640
|
-
_$insert(_el$9,_$createComponent(For10,{get each(){return model.options()
|
|
4641
|
-
},children:(option)=>_$createComponent(SettingsOptionRow,{get preferences(){return props.preferences
|
|
4642
|
-
},controller:model,option
|
|
4643
|
-
})
|
|
4644
|
-
}))
|
|
4645
|
-
_$effect((_p$)=>{var{restoreScroll:_v$4,saveScroll:_v$5}=model,_v$6=model.contentHeight()
|
|
4646
|
-
_v$4!==_p$.e&&(_p$.e=_$setProp(_el$8,"renderBefore",_v$4,_p$.e))
|
|
4647
|
-
_v$5!==_p$.t&&(_p$.t=_$setProp(_el$8,"renderAfter",_v$5,_p$.t))
|
|
4648
|
-
_v$6!==_p$.a&&(_p$.a=_$setProp(_el$8,"height",_v$6,_p$.a))
|
|
4649
|
-
return _p$
|
|
4650
|
-
},{e:undefined,t:undefined,a:undefined
|
|
4651
|
-
})
|
|
4652
|
-
return _el$8
|
|
4653
|
-
})(),(()=>{var _el$0=_$createElement("text")
|
|
4654
|
-
_$insert(_el$0,()=>model.footerHint())
|
|
4655
|
-
_$effect((_$p)=>_$setProp(_el$0,"fg",model.theme().textMuted,_$p))
|
|
4656
|
-
return _el$0
|
|
4657
|
-
})()]
|
|
4658
|
-
}})
|
|
4659
|
-
}
|
|
4660
|
-
function openSettings(api,preferences,activeValue,mcp,skills){createDialogStack(api,preferences.lspIconStyle,()=>true,preferences.cornerFont).open(()=>_$createComponent(SettingsDialog,{api,preferences,mcp,skills,activeValue
|
|
4661
|
-
}),"xlarge")
|
|
4662
|
-
}
|
|
4663
|
-
|
|
4664
|
-
|
|
4665
|
-
function SettingsBinding(props){const unregister=props.api.keymap.registerLayer({mode:"base",commands:[{name:`${PLUGIN_ID}.settings`,title:"Navigator settings",category:"Navigator",namespace:"palette",enabled:()=>["home","session"].includes(props.api.route.current.name),run:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
|
|
4666
|
-
}],bindings:[{key:{name:",",ctrl:true
|
|
4667
|
-
},cmd:`${PLUGIN_ID}.settings`
|
|
4271
|
+
function SettingsBinding(props){const unregister=props.api.keymap.registerLayer({mode:"base",commands:[{name:`${PLUGIN_ID}.settings`,title:"Navigator settings",category:"Navigator",namespace:"palette",enabled:()=>["home","session"].includes(props.api.route.current.name),run:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
|
|
4272
|
+
},{name:`${PLUGIN_ID}.toolbar`,title:"Manage pinned toolbar",category:"Navigator",namespace:"palette",enabled:()=>["home","session"].includes(props.api.route.current.name),run:()=>{openToolbarManager(props)
|
|
4273
|
+
}}],bindings:[{key:{name:",",ctrl:true
|
|
4274
|
+
},cmd:`${PLUGIN_ID}.settings`
|
|
4668
4275
|
}]
|
|
4669
4276
|
})
|
|
4670
4277
|
onCleanup12(unregister)
|
|
@@ -4672,17 +4279,9 @@ return _$createElement("box")
|
|
|
4672
4279
|
}
|
|
4673
4280
|
|
|
4674
4281
|
|
|
4675
|
-
function currentPermissionMode(api){const title=api.keymap.getCommands?.({visibility:"registered"
|
|
4676
|
-
}).find((command)=>command.name==="permission.mode")?.title
|
|
4677
|
-
if(typeof title!=="string")
|
|
4678
|
-
return
|
|
4679
|
-
if(title.startsWith("Disable auto-approve permissions"))
|
|
4680
|
-
return true
|
|
4681
|
-
return title.startsWith("Enable auto-approve permissions")?false:undefined
|
|
4682
|
-
}
|
|
4683
4282
|
function PermissionModeBinding(props){let applying=false
|
|
4684
4283
|
let observed
|
|
4685
|
-
|
|
4284
|
+
createEffect11(()=>{if(!props.preferences.ready())
|
|
4686
4285
|
return
|
|
4687
4286
|
const preferred=props.preferences.autoApprovePermissions()
|
|
4688
4287
|
const current=currentPermissionMode(props.api)
|
|
@@ -4709,15 +4308,109 @@ return _$createElement("box")
|
|
|
4709
4308
|
|
|
4710
4309
|
|
|
4711
4310
|
|
|
4712
|
-
function SettingsFooterButton(props){const icons=useIcons()
|
|
4713
|
-
const [hovered,setHovered]=
|
|
4714
|
-
const theme=()=>props.api.theme.current
|
|
4715
|
-
return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon(){return icons.icon("settings")
|
|
4716
|
-
},get foregroundColor(){return _$memo(()=>!!hovered())()?theme().text:theme().textMuted
|
|
4717
|
-
},get backgroundColor(){return _$memo(()=>!!hovered())()?theme().backgroundElement:theme().backgroundPanel
|
|
4718
|
-
},onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),onMouseUp:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
|
|
4719
|
-
})
|
|
4720
|
-
}
|
|
4311
|
+
function SettingsFooterButton(props){const icons=useIcons()
|
|
4312
|
+
const [hovered,setHovered]=createSignal15(false)
|
|
4313
|
+
const theme=()=>props.api.theme.current
|
|
4314
|
+
return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon(){return icons.icon("settings")
|
|
4315
|
+
},get foregroundColor(){return _$memo(()=>!!hovered())()?theme().text:theme().textMuted
|
|
4316
|
+
},get backgroundColor(){return _$memo(()=>!!hovered())()?theme().backgroundElement:theme().backgroundPanel
|
|
4317
|
+
},onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),onMouseUp:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
|
|
4318
|
+
})
|
|
4319
|
+
}
|
|
4320
|
+
|
|
4321
|
+
|
|
4322
|
+
|
|
4323
|
+
var ACTIONS=[{key:"h",label:"Toggle sidebar",icon:"sections",group:"navigate",command:"session.sidebar.toggle",section:undefined
|
|
4324
|
+
},{key:"t",label:"Todo",icon:"todo",group:"navigate",command:`${PLUGIN_ID}.focus.todo`,section:"todo"},{key:"a",label:"Subagents",icon:"subagents",group:"navigate",command:`${PLUGIN_ID}.focus.subagents`,section:"subagents"
|
|
4325
|
+
},{key:"s",label:"Skills",icon:"skills",group:"navigate",command:`${PLUGIN_ID}.focus.skills`,section:"skills"
|
|
4326
|
+
},{key:"q",label:"Quick actions",icon:"actions",group:"navigate",command:`${PLUGIN_ID}.focus.quick_actions`,section:"quick_actions"
|
|
4327
|
+
},{key:"l",label:"LSP",icon:"lsp",group:"navigate",command:`${PLUGIN_ID}.focus.lsp`,section:"lsp"},{key:"m",label:"MCP",icon:"mcp",group:"navigate",command:`${PLUGIN_ID}.focus.mcp`,section:"mcp"},{key:"c",label:"Check update",icon:"search",group:"updates",command:`${PLUGIN_ID}.check-update`,section:undefined
|
|
4328
|
+
},{key:"u",label:"Update Navigator",icon:"update",group:"updates",command:`${PLUGIN_ID}.update-navigator`,section:undefined
|
|
4329
|
+
}]
|
|
4330
|
+
function sidebarShortcutActions(api){return ACTIONS.filter(({section})=>!section||supportsSidebarSection(api,section))
|
|
4331
|
+
}
|
|
4332
|
+
var ENTRY_COMMAND=`${PLUGIN_ID}.sidebar-shortcuts.enter`
|
|
4333
|
+
var CANCEL_COMMAND=`${PLUGIN_ID}.sidebar-shortcuts.cancel`
|
|
4334
|
+
var MODE=`${PLUGIN_ID}.sidebar-shortcuts`
|
|
4335
|
+
var DEFAULT_TIMEOUT_MS=5000
|
|
4336
|
+
function createSidebarShortcutMode(api,options={}){const actions=sidebarShortcutActions(api)
|
|
4337
|
+
const [active,setActive]=createSignal16(false)
|
|
4338
|
+
const timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS
|
|
4339
|
+
let shortcutKey=""
|
|
4340
|
+
let unregisterBinding
|
|
4341
|
+
let unregisterMode
|
|
4342
|
+
let leaveMode
|
|
4343
|
+
let timeout
|
|
4344
|
+
let disposed=false
|
|
4345
|
+
function cancel(){if(timeout)
|
|
4346
|
+
clearTimeout(timeout)
|
|
4347
|
+
timeout=undefined
|
|
4348
|
+
unregisterMode?.()
|
|
4349
|
+
unregisterMode=undefined
|
|
4350
|
+
leaveMode?.()
|
|
4351
|
+
leaveMode=undefined
|
|
4352
|
+
setActive(false)
|
|
4353
|
+
}
|
|
4354
|
+
function run(command){cancel()
|
|
4355
|
+
if(api.route.current.name!=="session"||api.ui?.dialog?.open)
|
|
4356
|
+
return
|
|
4357
|
+
return api.keymap.dispatchCommand(command)
|
|
4358
|
+
}
|
|
4359
|
+
function enter(){if(disposed||api.route.current.name!=="session"||api.ui?.dialog?.open)
|
|
4360
|
+
return false
|
|
4361
|
+
cancel()
|
|
4362
|
+
unregisterMode=api.keymap.registerLayer({mode:MODE,priority:2000,commands:[{name:ENTRY_COMMAND,run:enter},{name:CANCEL_COMMAND,run:cancel},...actions.map(({key,command})=>({name:`${MODE}.${key}`,run:()=>run(command)
|
|
4363
|
+
}))],bindings:[{key:"escape",cmd:CANCEL_COMMAND},{key:shortcutKey,cmd:ENTRY_COMMAND},...actions.map(({key})=>({key,cmd:`${MODE}.${key}`}))]
|
|
4364
|
+
})
|
|
4365
|
+
leaveMode=api.mode.push(MODE)
|
|
4366
|
+
timeout=setTimeout(cancel,timeoutMs)
|
|
4367
|
+
setActive(true)
|
|
4368
|
+
return true
|
|
4369
|
+
}
|
|
4370
|
+
const unregisterCommands=api.keymap.registerLayer({mode:"base",commands:[{name:TOGGLE_COMMAND,title:"Toggle sidebar",category:"Navigator",namespace:"palette",enabled:()=>api.route.current.name==="session"&&!api.ui?.dialog?.open,run:()=>api.keymap.dispatchCommand("session.sidebar.toggle")
|
|
4371
|
+
},{name:`${LEGACY_PLUGIN_ID}.toggle`,run:()=>api.keymap.dispatchCommand("session.sidebar.toggle")
|
|
4372
|
+
},{name:ENTRY_COMMAND,enabled:()=>api.route.current.name==="session"&&!api.ui?.dialog?.open,run:enter
|
|
4373
|
+
}]
|
|
4374
|
+
})
|
|
4375
|
+
return{active,actions,bind(key){cancel()
|
|
4376
|
+
unregisterBinding?.()
|
|
4377
|
+
shortcutKey=key
|
|
4378
|
+
unregisterBinding=api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:ENTRY_COMMAND}]
|
|
4379
|
+
})
|
|
4380
|
+
},enter,cancel,dispose(){disposed=true
|
|
4381
|
+
cancel()
|
|
4382
|
+
unregisterBinding?.()
|
|
4383
|
+
unregisterBinding=undefined
|
|
4384
|
+
unregisterCommands()
|
|
4385
|
+
}}}
|
|
4386
|
+
|
|
4387
|
+
var SidebarShortcutHint=lazy4(()=>{const path=import.meta.url.includes("/dist/tui.js")?"./sidebar-shortcuts.js":"../../../sidebar-shortcuts"
|
|
4388
|
+
return import(path)
|
|
4389
|
+
});
|
|
4390
|
+
|
|
4391
|
+
|
|
4392
|
+
|
|
4393
|
+
|
|
4394
|
+
|
|
4395
|
+
|
|
4396
|
+
|
|
4397
|
+
|
|
4398
|
+
|
|
4399
|
+
|
|
4400
|
+
|
|
4401
|
+
|
|
4402
|
+
|
|
4403
|
+
|
|
4404
|
+
|
|
4405
|
+
|
|
4406
|
+
|
|
4407
|
+
|
|
4408
|
+
|
|
4409
|
+
|
|
4410
|
+
|
|
4411
|
+
|
|
4412
|
+
|
|
4413
|
+
|
|
4721
4414
|
|
|
4722
4415
|
|
|
4723
4416
|
import {realpathSync} from "fs"
|
|
@@ -4783,14 +4476,14 @@ queueMicrotask(()=>void props.controller.start())
|
|
|
4783
4476
|
})
|
|
4784
4477
|
onCleanup14(unregister)
|
|
4785
4478
|
} else
|
|
4786
|
-
|
|
4479
|
+
createEffect12(()=>{if(!props.controller.enabled())
|
|
4787
4480
|
return
|
|
4788
4481
|
const unregister=props.api.keymap.registerLayer({mode:"global",priority:2001,commands:[{name:"session.new",title:"New session",category:"Session",namespace:"palette",enabled:props.controller.enabled,run:()=>void props.controller.start()
|
|
4789
4482
|
}]
|
|
4790
4483
|
})
|
|
4791
4484
|
onCleanup14(unregister)
|
|
4792
4485
|
})
|
|
4793
|
-
|
|
4486
|
+
onMount4(()=>void props.controller.initialize())
|
|
4794
4487
|
onCleanup14(props.controller.dispose)
|
|
4795
4488
|
return _$createElement("box")
|
|
4796
4489
|
}
|
|
@@ -4837,7 +4530,7 @@ return Bun.file(new URL("../../../../CHANGELOG.md",import.meta.url)).text()
|
|
|
4837
4530
|
|
|
4838
4531
|
|
|
4839
4532
|
|
|
4840
|
-
function UpgradeNotesDialog(props){const dimensions=
|
|
4533
|
+
function UpgradeNotesDialog(props){const dimensions=useTerminalDimensions9()
|
|
4841
4534
|
const dialogs=useDialogs(props.api)
|
|
4842
4535
|
const icons=useIcons()
|
|
4843
4536
|
const theme=()=>props.api.theme.current
|
|
@@ -4907,7 +4600,7 @@ return _el$8
|
|
|
4907
4600
|
}
|
|
4908
4601
|
function UpgradeNotesBinding(props){let pending
|
|
4909
4602
|
let disposed=false
|
|
4910
|
-
|
|
4603
|
+
onMount5(async ()=>{const previous=await props.preferences.claimNavigatorUpgrade(props.version)
|
|
4911
4604
|
if(!previous||disposed)
|
|
4912
4605
|
return
|
|
4913
4606
|
try{let show=function(){if(disposed||props.api.lifecycle.signal?.aborted)
|
|
@@ -5357,7 +5050,7 @@ _$setProp(_el$2,"flexShrink",0)
|
|
|
5357
5050
|
_$insert(_el$2,()=>lspIcon(props.id,props.iconStyle??icons.style()))
|
|
5358
5051
|
_$effect((_$p)=>_$setProp(_el$2,"fg",item.foregroundColor(),_$p))
|
|
5359
5052
|
return _el$2
|
|
5360
|
-
})(),_$createComponent(
|
|
5053
|
+
})(),_$createComponent(Show10,{get when(){return showName()
|
|
5361
5054
|
},get children(){var _el$3=_$createElement("text")
|
|
5362
5055
|
_$setProp(_el$3,"flexShrink",0)
|
|
5363
5056
|
_$setProp(_el$3,"wrapMode","none")
|
|
@@ -5378,7 +5071,7 @@ return _el$3
|
|
|
5378
5071
|
function createListVisibility(options){const [expanded,setExpanded]=createSignal21(false)
|
|
5379
5072
|
let previousKey
|
|
5380
5073
|
let previousLimit
|
|
5381
|
-
const canToggle=
|
|
5074
|
+
const canToggle=createMemo8(()=>options.limit()>0&&options.items().length>options.limit())
|
|
5382
5075
|
createComputed(()=>{const key=options.resetKey()
|
|
5383
5076
|
const limit=options.limit()
|
|
5384
5077
|
const isToggle=canToggle()
|
|
@@ -5387,7 +5080,7 @@ untrack3(()=>setExpanded(false))
|
|
|
5387
5080
|
previousKey=key
|
|
5388
5081
|
previousLimit=limit
|
|
5389
5082
|
})
|
|
5390
|
-
const visible=
|
|
5083
|
+
const visible=createMemo8(()=>!canToggle()||expanded()?options.items():options.items().slice(0,options.limit()))
|
|
5391
5084
|
return{visible,expanded,canToggle,hiddenCount:()=>options.items().length-visible().length,showAll:()=>setExpanded(canToggle()),showLess:()=>setExpanded(false)
|
|
5392
5085
|
}}
|
|
5393
5086
|
|
|
@@ -5412,7 +5105,7 @@ else
|
|
|
5412
5105
|
props.visibility.showAll()
|
|
5413
5106
|
queueMicrotask(()=>props.interaction?.select(id))
|
|
5414
5107
|
}})
|
|
5415
|
-
return _$createComponent(
|
|
5108
|
+
return _$createComponent(Show11,{get when(){return props.visibility.canToggle()
|
|
5416
5109
|
},get children(){return _$createComponent(SelectionBox,{ref(r$){var _ref$=item.ref
|
|
5417
5110
|
typeof _ref$==="function"?_ref$(r$):item.ref=r$
|
|
5418
5111
|
},id,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
|
|
@@ -5465,7 +5158,7 @@ return result + ellipsis
|
|
|
5465
5158
|
function SectionHeaderControl(props){const [width,setWidth]=createSignal22()
|
|
5466
5159
|
const control=useSidebarItem(props.api,props.interaction,{id:props.action.id,position:()=>props.position,disabled:props.action.disabled,activate:props.action.onActivate
|
|
5467
5160
|
},()=>props.api.theme.current.accent,"control")
|
|
5468
|
-
|
|
5161
|
+
createEffect13(on(()=>[props.action.label(),props.resetWidth],()=>setWidth(undefined)))
|
|
5469
5162
|
const label=()=>width()===undefined||props.iconOnly?props.action.label():truncateEnd(props.action.label(),width()-2)
|
|
5470
5163
|
return _$createComponent(SelectionBox,{ref:(node)=>control.ref(node),get id(){return props.action.id
|
|
5471
5164
|
},get iconOnly(){return props.iconOnly
|
|
@@ -5529,7 +5222,7 @@ _$setProp(_el$7,"flexGrow",1)
|
|
|
5529
5222
|
_$setProp(_el$7,"minWidth",0)
|
|
5530
5223
|
_$setProp(_el$7,"justifyContent","flex-end")
|
|
5531
5224
|
_$insert(_el$7,()=>props.headerControls,null)
|
|
5532
|
-
_$insert(_el$7,_$createComponent(
|
|
5225
|
+
_$insert(_el$7,_$createComponent(Show12,{get when(){return props.headerAction
|
|
5533
5226
|
},children:(action)=>_$createComponent(SectionHeaderControl,{get api(){return props.api
|
|
5534
5227
|
},get interaction(){return props.interaction
|
|
5535
5228
|
},get action(){return action()
|
|
@@ -5537,7 +5230,7 @@ _$insert(_el$7,_$createComponent(Show9,{get when(){return props.headerAction
|
|
|
5537
5230
|
},get position(){return{section:props.navigationSection??0,row:0,column:1
|
|
5538
5231
|
}}})
|
|
5539
5232
|
}),null)
|
|
5540
|
-
_$insert(_el$7,_$createComponent(
|
|
5233
|
+
_$insert(_el$7,_$createComponent(Show12,{get when(){return props.summary
|
|
5541
5234
|
},get children(){var _el$8=_$createElement("text")
|
|
5542
5235
|
_$setProp(_el$8,"wrapMode","none")
|
|
5543
5236
|
_$setProp(_el$8,"truncate",true)
|
|
@@ -5554,25 +5247,25 @@ return _el$8
|
|
|
5554
5247
|
return _el$7
|
|
5555
5248
|
})()]
|
|
5556
5249
|
}}),null)
|
|
5557
|
-
_$insert(_el$,_$createComponent(
|
|
5250
|
+
_$insert(_el$,_$createComponent(Show12,{get when(){return props.open
|
|
5558
5251
|
},get children(){return props.children
|
|
5559
5252
|
}}),null)
|
|
5560
5253
|
return _el$
|
|
5561
5254
|
})()
|
|
5562
5255
|
}
|
|
5563
5256
|
var SectionWithHeaderAction=Section;
|
|
5564
|
-
function LspSection(props){const list=
|
|
5257
|
+
function LspSection(props){const list=createMemo9(()=>[...props.api.state.lsp()].sort((a,b)=>Number(b.status==="error")-Number(a.status==="error")||a.id.localeCompare(b.id)||a.root.localeCompare(b.root)))
|
|
5565
5258
|
const visibility=createListVisibility({items:list,limit:()=>props.preferences.sectionItemLimit?.("lsp")??0,resetKey:()=>currentLocation(props.api).key
|
|
5566
5259
|
})
|
|
5567
|
-
const connected=
|
|
5568
|
-
const disabled=
|
|
5260
|
+
const connected=createMemo9(()=>list().filter((item)=>item.status==="connected").length)
|
|
5261
|
+
const disabled=createMemo9(()=>props.api.state.config.lsp===false)
|
|
5569
5262
|
const navigationSection=()=>props.navigationSection??5
|
|
5570
5263
|
return _$createComponent(Section,{get api(){return props.api
|
|
5571
5264
|
},get interaction(){return props.interaction
|
|
5572
5265
|
},sectionId:`${PLUGIN_ID}.section.lsp`,get navigationSection(){return navigationSection()
|
|
5573
5266
|
},title:"LSP",section:"lsp",get summary(){return `${connected()}/${list().length}`
|
|
5574
5267
|
},get open(){return props.preferences.expanded().lsp
|
|
5575
|
-
},onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(
|
|
5268
|
+
},onToggle:()=>props.preferences.toggleSectionExpanded("lsp"),get children(){return [_$createComponent(Show13,{get when(){return list().length>0
|
|
5576
5269
|
},get fallback(){return(()=>{var _el$2=_$createElement("text")
|
|
5577
5270
|
_$insert(_el$2,()=>disabled()?"LSP is disabled":"Activates as files are read")
|
|
5578
5271
|
_$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
|
|
@@ -5604,25 +5297,25 @@ return _el$
|
|
|
5604
5297
|
|
|
5605
5298
|
|
|
5606
5299
|
|
|
5607
|
-
function createMcpSectionModel(props,query){const target=
|
|
5608
|
-
const favorites=
|
|
5609
|
-
const groups=
|
|
5610
|
-
const grouped=
|
|
5611
|
-
const list=
|
|
5300
|
+
function createMcpSectionModel(props,query){const target=createMemo10(()=>props.controller.target())
|
|
5301
|
+
const favorites=createMemo10(()=>props.preferences.favoriteMcpServers?.()??new Set)
|
|
5302
|
+
const groups=createMemo10(()=>props.preferences.mcpServerGroups?.()??{})
|
|
5303
|
+
const grouped=createMemo10(()=>Object.keys(groups()).length>0)
|
|
5304
|
+
const list=createMemo10(()=>buildMcpGroupedView(props.controller.list(target()),favorites(),groups()))
|
|
5612
5305
|
const groupItems=(bucket)=>list().filter((item)=>item.bucket===bucket)
|
|
5613
|
-
const filtered=
|
|
5306
|
+
const filtered=createMemo10(()=>list().filter((item)=>matchesFilter(query(),`${item.name} ${item.assignedGroup ?? ""}`)))
|
|
5614
5307
|
const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("mcp")??0,resetKey:()=>JSON.stringify([target().key,query()])
|
|
5615
5308
|
})
|
|
5616
|
-
const active=
|
|
5617
|
-
const state=
|
|
5618
|
-
const bulk=
|
|
5309
|
+
const active=createMemo10(()=>list().filter((item)=>item.status==="connected").length)
|
|
5310
|
+
const state=createMemo10(()=>props.controller.state(target()))
|
|
5311
|
+
const bulk=createMemo10(()=>props.controller.bulkState?.(target())??{action:"connect",status:"idle",completed:0,total:0,failed:[]
|
|
5619
5312
|
})
|
|
5620
|
-
const bulkRunning=
|
|
5621
|
-
const mutationRunning=
|
|
5622
|
-
const connectable=
|
|
5623
|
-
const disconnectable=
|
|
5624
|
-
const errors=
|
|
5625
|
-
const presetName=
|
|
5313
|
+
const bulkRunning=createMemo10(()=>bulk().status==="running")
|
|
5314
|
+
const mutationRunning=createMemo10(()=>props.controller.mutating?.(target()))
|
|
5315
|
+
const connectable=createMemo10(()=>list().filter((item)=>mcpToggleAction2(item.status)==="connect").length)
|
|
5316
|
+
const disconnectable=createMemo10(()=>list().filter((item)=>mcpToggleAction2(item.status)==="disconnect").length)
|
|
5317
|
+
const errors=createMemo10(()=>list().filter((item)=>item.status==="failed"||item.status==="needs_auth"||item.status==="needs_client_registration").length)
|
|
5318
|
+
const presetName=createMemo10(()=>{const presets=props.preferences.mcpPresets?.()??{}
|
|
5626
5319
|
const selected=props.controller.selectedPreset?.(target())
|
|
5627
5320
|
return selected&&Object.hasOwn(presets,selected)?selected:matchingMcpPreset(list(),presets)
|
|
5628
5321
|
})
|
|
@@ -5697,7 +5390,7 @@ _$insert(_el$,_$createComponent(McpBulkAction,{get api(){return props.api
|
|
|
5697
5390
|
}),null)
|
|
5698
5391
|
_$effect((_$p)=>_$setProp(_el$,"paddingBottom",model.bulkRunning()||model.bulk().status==="error"?1:0,_$p))
|
|
5699
5392
|
return _el$
|
|
5700
|
-
})(),_$createComponent(
|
|
5393
|
+
})(),_$createComponent(Show14,{get when(){return model.bulkRunning()
|
|
5701
5394
|
},get children(){var _el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createTextNode(`/`),_el$5=_$createTextNode(`\u2026`)
|
|
5702
5395
|
_$insertNode(_el$2,_el$3)
|
|
5703
5396
|
_$insertNode(_el$2,_el$4)
|
|
@@ -5707,7 +5400,7 @@ _$insert(_el$2,()=>model.bulk().completed,_el$4)
|
|
|
5707
5400
|
_$insert(_el$2,()=>model.bulk().total,_el$5)
|
|
5708
5401
|
_$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
|
|
5709
5402
|
return _el$2
|
|
5710
|
-
}}),_$createComponent(
|
|
5403
|
+
}}),_$createComponent(Show14,{get when(){return model.bulk().status==="error"
|
|
5711
5404
|
},get children(){return _$createComponent(McpBulkAction,{get api(){return props.api
|
|
5712
5405
|
},get interaction(){return props.interaction
|
|
5713
5406
|
},id:`${PLUGIN_ID}.mcp.retry-all`,get position(){return{section:props.navigationSection,row:3,column:0
|
|
@@ -5787,7 +5480,7 @@ return _el$4
|
|
|
5787
5480
|
function RequestErrorRow(props){const icons=useIcons()
|
|
5788
5481
|
const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>props.position,disabled:()=>!props.state.error?.retryable||props.state.status==="loading"||props.state.status==="refreshing",activate:props.onRetry
|
|
5789
5482
|
})
|
|
5790
|
-
return _$createComponent(
|
|
5483
|
+
return _$createComponent(Show15,{get when(){return props.state.error
|
|
5791
5484
|
},children:(error)=>_$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return props.id
|
|
5792
5485
|
},flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
|
|
5793
5486
|
},get onMouseOver(){return item.onMouseOver
|
|
@@ -5802,7 +5495,7 @@ _$insert(_el$,()=>icons.icon("error"),_el$2)
|
|
|
5802
5495
|
_$insert(_el$,()=>error().message,null)
|
|
5803
5496
|
_$effect((_$p)=>_$setProp(_el$,"fg",item.focused()?item.foregroundColor():props.api.theme.current.error,_$p))
|
|
5804
5497
|
return _el$
|
|
5805
|
-
})(),_$createComponent(
|
|
5498
|
+
})(),_$createComponent(Show15,{get when(){return error().retryable
|
|
5806
5499
|
},get children(){var _el$3=_$createElement("text"),_el$4=_$createTextNode(` Retry`)
|
|
5807
5500
|
_$insertNode(_el$3,_el$4)
|
|
5808
5501
|
_$setProp(_el$3,"flexShrink",0)
|
|
@@ -5817,7 +5510,7 @@ function SectionRequestBody(props){const icons=useIcons()
|
|
|
5817
5510
|
const pending=()=>props.state.status==="loading"
|
|
5818
5511
|
return(()=>{var _el$5=_$createElement("box")
|
|
5819
5512
|
_$insert(_el$5,_$createComponent(RequestErrorRow,props),null)
|
|
5820
|
-
_$insert(_el$5,_$createComponent(
|
|
5513
|
+
_$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!pending())()&&!props.hasItems
|
|
5821
5514
|
},get children(){var _el$6=_$createElement("text"),_el$7=_$createTextNode(` `)
|
|
5822
5515
|
_$insertNode(_el$6,_el$7)
|
|
5823
5516
|
_$insert(_el$6,()=>icons.icon("pending"),_el$7)
|
|
@@ -5825,10 +5518,10 @@ _$insert(_el$6,()=>props.loading,null)
|
|
|
5825
5518
|
_$effect((_$p)=>_$setProp(_el$6,"fg",props.api.theme.current.textMuted,_$p))
|
|
5826
5519
|
return _el$6
|
|
5827
5520
|
}}),null)
|
|
5828
|
-
_$insert(_el$5,_$createComponent(
|
|
5521
|
+
_$insert(_el$5,_$createComponent(Show15,{get when(){return props.hasItems
|
|
5829
5522
|
},get children(){return props.children
|
|
5830
5523
|
}}),null)
|
|
5831
|
-
_$insert(_el$5,_$createComponent(
|
|
5524
|
+
_$insert(_el$5,_$createComponent(Show15,{get when(){return _$memo(()=>!!((props.state.status==="ready"||props.state.status==="refreshing")&&!props.hasItems))()&&!props.state.error
|
|
5832
5525
|
},get children(){var _el$8=_$createElement("text"),_el$9=_$createTextNode(` `)
|
|
5833
5526
|
_$insertNode(_el$8,_el$9)
|
|
5834
5527
|
_$insert(_el$8,()=>icons.icon("info"),_el$9)
|
|
@@ -6021,7 +5714,7 @@ return _p$
|
|
|
6021
5714
|
},{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined,n:undefined,s:undefined,h:undefined
|
|
6022
5715
|
})
|
|
6023
5716
|
return _el$2
|
|
6024
|
-
})(),_$createComponent(
|
|
5717
|
+
})(),_$createComponent(Show16,{get when(){return props.query
|
|
6025
5718
|
},get children(){var _el$3=_$createElement("text")
|
|
6026
5719
|
_$setProp(_el$3,"flexShrink",0)
|
|
6027
5720
|
_$setProp(_el$3,"onMouseDown",()=>props.onInput(""))
|
|
@@ -6050,7 +5743,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
|
|
|
6050
5743
|
}},get query(){return props.query
|
|
6051
5744
|
},placeholder:"Filter MCP...",get onInput(){return props.onQuery
|
|
6052
5745
|
}}),null)
|
|
6053
|
-
_$insert(_el$,_$createComponent(
|
|
5746
|
+
_$insert(_el$,_$createComponent(Show17,{get when(){return model.filtered().length>0
|
|
6054
5747
|
},get fallback(){return(()=>{var _el$2=_$createElement("text")
|
|
6055
5748
|
_$insertNode(_el$2,_$createTextNode(`No matching MCP servers`))
|
|
6056
5749
|
_$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
|
|
@@ -6061,7 +5754,7 @@ return _el$2
|
|
|
6061
5754
|
},get grouped(){return model.grouped
|
|
6062
5755
|
},get density(){return props.preferences.rowDensity?.()??"compact"
|
|
6063
5756
|
},get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
|
|
6064
|
-
},children:(item,index)=>[_$createComponent(
|
|
5757
|
+
},children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
|
|
6065
5758
|
},get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
|
|
6066
5759
|
},get interaction(){return props.interaction
|
|
6067
5760
|
},get bucket(){return item.bucket
|
|
@@ -6095,7 +5788,7 @@ function McpSection(props){const icons=useIcons()
|
|
|
6095
5788
|
const [query,setQuery]=createSignal26("")
|
|
6096
5789
|
const model=createMcpSectionModel(props,query)
|
|
6097
5790
|
const navigationSection=()=>props.navigationSection??6
|
|
6098
|
-
const summary=
|
|
5791
|
+
const summary=createMemo11(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
|
|
6099
5792
|
return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
|
|
6100
5793
|
},get interaction(){return props.interaction
|
|
6101
5794
|
},sectionId:`${PLUGIN_ID}.section.mcp`,get navigationSection(){return navigationSection()
|
|
@@ -6193,17 +5886,51 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
|
|
|
6193
5886
|
|
|
6194
5887
|
|
|
6195
5888
|
|
|
5889
|
+
|
|
5890
|
+
|
|
5891
|
+
var ToolbarContext=createContext4()
|
|
5892
|
+
var useToolbar=()=>useContext4(ToolbarContext)
|
|
5893
|
+
function ToolbarProvider(props){const value={pinned:(pin)=>Boolean(props.preferences.toolbarPins?.().some((item)=>toolbarPinKey(item)===toolbarPinKey(pin))),configure:(pin,dialogs)=>{if(pin.kind==="skill"&&!pin.location){props.api.ui.toast({variant:"warning",title:"Toolbar",message:"This Skill has no host-provided source location"
|
|
5894
|
+
})
|
|
5895
|
+
return
|
|
5896
|
+
}
|
|
5897
|
+
openToolbarPin({api:props.api,preferences:props.preferences,skills:props.skills,pin,dialogs
|
|
5898
|
+
})
|
|
5899
|
+
}}
|
|
5900
|
+
return _$createComponent(ToolbarContext.Provider,{value,get children(){return props.children
|
|
5901
|
+
}})
|
|
5902
|
+
}
|
|
5903
|
+
|
|
5904
|
+
function SidebarPinControl(props){const toolbar=useToolbar()
|
|
5905
|
+
const{api,interaction
|
|
5906
|
+
}=useSidebarList()
|
|
5907
|
+
const icons=useIcons()
|
|
5908
|
+
const item=useSidebarItem(api,interaction,{id:`${props.id}.pin`,position:()=>({...props.position,column:2
|
|
5909
|
+
}),activate:()=>toolbar?.configure(props.pin)
|
|
5910
|
+
},()=>toolbar?.pinned(props.pin)?api.theme.current.accent:api.theme.current.textMuted,"control")
|
|
5911
|
+
return _$createComponent(IconControl,{get id(){return `${props.id}.pin`
|
|
5912
|
+
},ref(r$){var _ref$=item.ref
|
|
5913
|
+
typeof _ref$==="function"?_ref$(r$):item.ref=r$
|
|
5914
|
+
},get icon(){return terminalIcon("pin",icons.style())
|
|
5915
|
+
},get backgroundColor(){return item.backgroundColor()
|
|
5916
|
+
},get foregroundColor(){return item.foregroundColor()
|
|
5917
|
+
},get onMouseOver(){return item.onMouseOver
|
|
5918
|
+
},get onMouseOut(){return item.onMouseOut
|
|
5919
|
+
},onMouseUp:(event)=>item.activate(event)
|
|
5920
|
+
})
|
|
5921
|
+
}
|
|
6196
5922
|
function QuickActionRow(props){const{api,interaction
|
|
6197
5923
|
}=useSidebarList()
|
|
6198
5924
|
const icons=useIcons()
|
|
5925
|
+
const toolbar=useToolbar()
|
|
6199
5926
|
const theme=()=>api.theme.current
|
|
6200
5927
|
const [width,setWidth]=createSignal30(0)
|
|
6201
|
-
const shortcut=
|
|
5928
|
+
const shortcut=createMemo12(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
|
|
6202
5929
|
})
|
|
6203
5930
|
return api.keys.formatBindings(bindings.get(props.action.command))
|
|
6204
5931
|
})
|
|
6205
|
-
const visibleShortcut=
|
|
6206
|
-
return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 8?value:undefined
|
|
5932
|
+
const visibleShortcut=createMemo12(()=>{const value=shortcut()
|
|
5933
|
+
return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + (toolbar?11:8)?value:undefined
|
|
6207
5934
|
})
|
|
6208
5935
|
function run(){if(props.action.command==="session.new"&&props.onNewSession?.())
|
|
6209
5936
|
return
|
|
@@ -6241,7 +5968,7 @@ _$insert(_el$2,()=>props.action.label)
|
|
|
6241
5968
|
_$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
|
|
6242
5969
|
return _el$2
|
|
6243
5970
|
})()
|
|
6244
|
-
},get metadata(){return _$createComponent(
|
|
5971
|
+
},get metadata(){return _$createComponent(Show24,{get when(){return visibleShortcut()
|
|
6245
5972
|
},children:(value)=>(()=>{var _el$3=_$createElement("text")
|
|
6246
5973
|
_$setProp(_el$3,"flexShrink",0)
|
|
6247
5974
|
_$setProp(_el$3,"wrapMode","none")
|
|
@@ -6250,7 +5977,12 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
|
|
|
6250
5977
|
return _el$3
|
|
6251
5978
|
})()
|
|
6252
5979
|
})
|
|
6253
|
-
},get
|
|
5980
|
+
},get trailing(){return _$createComponent(Show24,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
|
|
5981
|
+
},get position(){return props.position
|
|
5982
|
+
},get pin(){return{kind:"action",id:props.action.command,icon:"bolt"
|
|
5983
|
+
}}})
|
|
5984
|
+
}})
|
|
5985
|
+
},get details(){return _$createComponent(Show24,{get when(){return props.disabled
|
|
6254
5986
|
},children:(reason)=>(()=>{var _el$4=_$createElement("text")
|
|
6255
5987
|
_$setProp(_el$4,"wrapMode","word")
|
|
6256
5988
|
_$insert(_el$4,reason)
|
|
@@ -6261,7 +5993,7 @@ return _el$4
|
|
|
6261
5993
|
}})
|
|
6262
5994
|
}
|
|
6263
5995
|
function QuickActionsSection(props){const commandRevision=createQuickActionRevision(props.api)
|
|
6264
|
-
const actions=
|
|
5996
|
+
const actions=createMemo13(()=>{commandRevision()
|
|
6265
5997
|
return orderQuickActionIds(props.preferences.quickActionOrder?.()??QUICK_ACTIONS.map((action)=>action.command),props.preferences.favoriteQuickActions?.()??new Set).flatMap((id)=>{const action=QUICK_ACTIONS.find((candidate)=>candidate.command===id)
|
|
6266
5998
|
return action&&props.preferences.quickActionVisible?.(id)!==false?[{...action,label:quickActionLabel(props.api,action),disabled:quickActionDisabledReason(props.api,action)
|
|
6267
5999
|
}]:[]
|
|
@@ -6278,7 +6010,7 @@ return _$createComponent(Section,{get api(){return props.api
|
|
|
6278
6010
|
},onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
|
|
6279
6011
|
},get interaction(){return props.interaction
|
|
6280
6012
|
},get density(){return props.preferences.rowDensity?.()??"compact"
|
|
6281
|
-
},get children(){return [_$createComponent(
|
|
6013
|
+
},get children(){return [_$createComponent(Show25,{get when(){return actions().length===0
|
|
6282
6014
|
},get children(){var _el$=_$createElement("text")
|
|
6283
6015
|
_$insertNode(_el$,_$createTextNode(`No quick actions selected`))
|
|
6284
6016
|
_$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
|
|
@@ -6304,10 +6036,9 @@ return _el$
|
|
|
6304
6036
|
|
|
6305
6037
|
|
|
6306
6038
|
|
|
6307
|
-
|
|
6308
6039
|
function SectionBoundary(props){const dividerColor=()=>{const{backgroundPanel,borderSubtle
|
|
6309
6040
|
}=props.api.theme.current
|
|
6310
|
-
return
|
|
6041
|
+
return subtleLineColor(backgroundPanel,borderSubtle)
|
|
6311
6042
|
}
|
|
6312
6043
|
return(()=>{var _el$=_$createElement("box")
|
|
6313
6044
|
_$spread(_el$,_$mergeProps(()=>props.divided?{border:["bottom"],borderColor:dividerColor(),paddingBottom:1
|
|
@@ -6340,63 +6071,33 @@ item.activate(event)
|
|
|
6340
6071
|
}
|
|
6341
6072
|
|
|
6342
6073
|
|
|
6343
|
-
|
|
6344
|
-
|
|
6345
|
-
|
|
6346
|
-
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
const timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS
|
|
6351
|
-
let shortcutKey=""
|
|
6352
|
-
let unregisterBinding
|
|
6353
|
-
let unregisterMode
|
|
6354
|
-
let leaveMode
|
|
6355
|
-
let timeout
|
|
6356
|
-
let disposed=false
|
|
6357
|
-
function cancel(){if(timeout)
|
|
6358
|
-
clearTimeout(timeout)
|
|
6359
|
-
timeout=undefined
|
|
6360
|
-
unregisterMode?.()
|
|
6361
|
-
unregisterMode=undefined
|
|
6362
|
-
leaveMode?.()
|
|
6363
|
-
leaveMode=undefined
|
|
6364
|
-
}
|
|
6365
|
-
function run(command){cancel()
|
|
6366
|
-
return api.keymap.dispatchCommand(command)
|
|
6367
|
-
}
|
|
6368
|
-
function enter(){if(disposed||api.route.current.name!=="session"||api.ui?.dialog?.open)
|
|
6369
|
-
return false
|
|
6370
|
-
cancel()
|
|
6371
|
-
unregisterMode=api.keymap.registerLayer({mode:MODE,priority:2000,commands:[{name:ENTRY_COMMAND,run:enter},{name:CANCEL_COMMAND,run:cancel},...actions.map(({key,command})=>({name:`${MODE}.${key}`,run:()=>run(command)
|
|
6372
|
-
}))],bindings:[{key:"escape",cmd:CANCEL_COMMAND},{key:shortcutKey,cmd:ENTRY_COMMAND},...actions.map(({key})=>({key,cmd:`${MODE}.${key}`}))]
|
|
6373
|
-
})
|
|
6374
|
-
leaveMode=api.mode.push(MODE)
|
|
6375
|
-
timeout=setTimeout(cancel,timeoutMs)
|
|
6376
|
-
api.ui?.toast?.({variant:"info",title:"Navigator shortcuts",message:`${hints} | Esc cancel`,duration:timeoutMs
|
|
6377
|
-
})
|
|
6378
|
-
return true
|
|
6379
|
-
}
|
|
6380
|
-
const unregisterCommands=api.keymap.registerLayer({mode:"base",commands:[{name:TOGGLE_COMMAND,title:"Toggle sidebar",category:"Navigator",namespace:"palette",enabled:()=>api.route.current.name==="session"&&!api.ui?.dialog?.open,run:()=>api.keymap.dispatchCommand("session.sidebar.toggle")
|
|
6381
|
-
},{name:`${LEGACY_PLUGIN_ID}.toggle`,run:()=>api.keymap.dispatchCommand("session.sidebar.toggle")
|
|
6382
|
-
},{name:ENTRY_COMMAND,enabled:()=>api.route.current.name==="session"&&!api.ui?.dialog?.open,run:enter
|
|
6383
|
-
}]
|
|
6074
|
+
|
|
6075
|
+
|
|
6076
|
+
|
|
6077
|
+
|
|
6078
|
+
function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
|
|
6079
|
+
createEffect15(()=>{const key=props.preferences.toggleKey()
|
|
6080
|
+
untrack6(()=>shortcuts.bind(key))
|
|
6384
6081
|
})
|
|
6385
|
-
|
|
6386
|
-
|
|
6387
|
-
shortcutKey=key
|
|
6388
|
-
unregisterBinding=api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:ENTRY_COMMAND}]
|
|
6082
|
+
createEffect15(()=>{if(shortcuts.active()&&(props.api.route.current.name!=="session"||props.api.ui.dialog.open||props.api.mode.current()==="modal"))
|
|
6083
|
+
untrack6(shortcuts.cancel)
|
|
6389
6084
|
})
|
|
6390
|
-
},enter,cancel,dispose(){disposed=true
|
|
6391
|
-
cancel()
|
|
6392
|
-
unregisterBinding?.()
|
|
6393
|
-
unregisterBinding=undefined
|
|
6394
|
-
unregisterCommands()
|
|
6395
|
-
}}}
|
|
6396
|
-
function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
|
|
6397
|
-
createEffect16(()=>shortcuts.bind(props.preferences.toggleKey()))
|
|
6398
6085
|
onCleanup18(shortcuts.dispose)
|
|
6399
|
-
return _$createElement("box")
|
|
6086
|
+
return(()=>{var _el$=_$createElement("box")
|
|
6087
|
+
_$setProp(_el$,"position","absolute")
|
|
6088
|
+
_$setProp(_el$,"top",0)
|
|
6089
|
+
_$setProp(_el$,"left",0)
|
|
6090
|
+
_$setProp(_el$,"width","100%")
|
|
6091
|
+
_$setProp(_el$,"height","100%")
|
|
6092
|
+
_$insert(_el$,_$createComponent(Show26,{get when(){return shortcuts.active()
|
|
6093
|
+
},get children(){return _$createComponent(Suspense4,{get children(){return _$createComponent(SidebarShortcutHint,{get api(){return props.api
|
|
6094
|
+
},get actions(){return shortcuts.actions
|
|
6095
|
+
}})
|
|
6096
|
+
}})
|
|
6097
|
+
}}))
|
|
6098
|
+
_$effect((_$p)=>_$setProp(_el$,"visible",shortcuts.active(),_$p))
|
|
6099
|
+
return _el$
|
|
6100
|
+
})()
|
|
6400
6101
|
}
|
|
6401
6102
|
function SidebarFocusBinding(props){const commands=props.interaction.baseCommands()
|
|
6402
6103
|
const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,...commands.map(({name,run,enabled
|
|
@@ -6404,7 +6105,7 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
|
|
|
6404
6105
|
}))]
|
|
6405
6106
|
})
|
|
6406
6107
|
onCleanup18(unregisterCommands)
|
|
6407
|
-
|
|
6108
|
+
createEffect15(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
|
|
6408
6109
|
}]
|
|
6409
6110
|
})
|
|
6410
6111
|
onCleanup18(unregister)
|
|
@@ -6427,6 +6128,154 @@ return _$createElement("box")
|
|
|
6427
6128
|
|
|
6428
6129
|
|
|
6429
6130
|
|
|
6131
|
+
function toolbarLayout(keys,width,mode){const columns=Math.max(1,Math.floor((Math.max(3,width) + 1) / 4))
|
|
6132
|
+
const shown=mode==="wrap"||keys.length<=columns?keys.length:Math.max(0,columns-1)
|
|
6133
|
+
const visible=keys.slice(0,shown)
|
|
6134
|
+
const overflow=keys.slice(shown)
|
|
6135
|
+
const controls=[...visible,...overflow.length>0?["toolbar:more"]:[]]
|
|
6136
|
+
return{columns,overflow,rows:Array.from({length:Math.ceil(controls.length / columns)},(_,row)=>controls.slice(row*columns,(row + 1)*columns))
|
|
6137
|
+
}}
|
|
6138
|
+
|
|
6139
|
+
function createToolbarModel(props){const icons=useIcons()
|
|
6140
|
+
const revision=createQuickActionRevision(props.api)
|
|
6141
|
+
const pins=()=>props.preferences.toolbarPins?.()??[]
|
|
6142
|
+
const needsSkills=createMemo14(()=>pins().some((pin)=>pin.kind==="skill"))
|
|
6143
|
+
const target=createMemo14(()=>props.skills.target())
|
|
6144
|
+
createEffect16(()=>{if(!needsSkills())
|
|
6145
|
+
return
|
|
6146
|
+
const current=target()
|
|
6147
|
+
const release=untrack7(()=>props.skills.activate(current))
|
|
6148
|
+
onCleanup19(release)
|
|
6149
|
+
untrack7(()=>{props.skills.refresh(current).catch(()=>{})
|
|
6150
|
+
})
|
|
6151
|
+
})
|
|
6152
|
+
function view(pin){revision()
|
|
6153
|
+
if(pin.kind==="action"){const action=QUICK_ACTIONS.find((item)=>item.command===pin.id)
|
|
6154
|
+
const state=quickActionState(props.api,pin.id)
|
|
6155
|
+
const stateLabel=quickActionStates(props.api,pin.id).find((item)=>item.id===state)?.label
|
|
6156
|
+
return{label:quickActionLabel(props.api,action),stateLabel,icon:state?pin.stateIcons?.[state]??pin.icon:pin.icon,reason:quickActionDisabledReason(props.api,action)
|
|
6157
|
+
}}
|
|
6158
|
+
const skill=props.skills.list(target()).find((item)=>item.location===pin.location&&item.name===pin.name)
|
|
6159
|
+
const request=props.skills.state(target())
|
|
6160
|
+
const unavailable=request.status==="loading"?"Loading Skills":"Skill is unavailable in this workspace"
|
|
6161
|
+
return{label:pin.name,icon:pin.icon,stateLabel:undefined,reason:request.error?.message??(skill?skillUnavailable(props.skills,skill):unavailable)
|
|
6162
|
+
}}
|
|
6163
|
+
function run(key){const pin=pins().find((item)=>toolbarPinKey(item)===key)
|
|
6164
|
+
if(!pin)
|
|
6165
|
+
return
|
|
6166
|
+
const item=view(pin)
|
|
6167
|
+
if(item.reason){props.api.ui.toast({variant:"warning",title:item.label,message:item.reason})
|
|
6168
|
+
return
|
|
6169
|
+
}
|
|
6170
|
+
if(pin.kind==="action"){if(pin.id==="session.new"&&props.onNewSession?.())
|
|
6171
|
+
return
|
|
6172
|
+
const result=props.interaction.dispatchFromReturnTarget(pin.id)
|
|
6173
|
+
if(!result.ok)
|
|
6174
|
+
props.api.ui.toast({variant:"warning",title:item.label,message:`Command is ${result.reason}`})
|
|
6175
|
+
return
|
|
6176
|
+
}
|
|
6177
|
+
const skill=props.skills.list(target()).find((candidate)=>candidate.location===pin.location&&candidate.name===pin.name)
|
|
6178
|
+
if(!skill)
|
|
6179
|
+
return
|
|
6180
|
+
const route=JSON.stringify(props.api.route.current)
|
|
6181
|
+
const dialogs=createDialogStack(props.api,icons.style,()=>route===JSON.stringify(props.api.route.current),icons.multilineCorners)
|
|
6182
|
+
activateSkill({api:props.api,controller:props.skills,access:props.preferences,skill,dialogs})
|
|
6183
|
+
}
|
|
6184
|
+
return{pins,view,run}}
|
|
6185
|
+
|
|
6186
|
+
|
|
6187
|
+
|
|
6188
|
+
function ToolbarButton(props){const icons=useIcons()
|
|
6189
|
+
const [hovered,setHovered]=createSignal31(false)
|
|
6190
|
+
const item=useSidebarItem(props.api,props.interaction,{id:props.id,position:()=>({section:0,row:props.row + 1,column:props.column
|
|
6191
|
+
}),activate:props.onRun
|
|
6192
|
+
},()=>props.reason?props.api.theme.current.textMuted:props.api.theme.current.accent,"control")
|
|
6193
|
+
createEffect17(()=>props.onDetails(props.id,item.focused()||hovered()))
|
|
6194
|
+
onCleanup20(()=>props.onDetails(props.id,false))
|
|
6195
|
+
return _$createComponent(IconControl,{get id(){return props.id
|
|
6196
|
+
},ref(r$){var _ref$=item.ref
|
|
6197
|
+
typeof _ref$==="function"?_ref$(r$):item.ref=r$
|
|
6198
|
+
},get icon(){return terminalIcon(props.icon,icons.style())
|
|
6199
|
+
},get backgroundColor(){return item.backgroundColor()
|
|
6200
|
+
},get foregroundColor(){return _$memo(()=>!!props.reason)()?props.api.theme.current.textMuted:item.foregroundColor()
|
|
6201
|
+
},onMouseOver:()=>{item.onMouseOver()
|
|
6202
|
+
setHovered(true)
|
|
6203
|
+
},onMouseOut:()=>{item.onMouseOut()
|
|
6204
|
+
setHovered(false)
|
|
6205
|
+
},onMouseUp:(event)=>item.activate(event)
|
|
6206
|
+
})
|
|
6207
|
+
}
|
|
6208
|
+
function SidebarToolbar(props){const model=createToolbarModel(props)
|
|
6209
|
+
const icons=useIcons()
|
|
6210
|
+
const [width,setWidth]=createSignal32(3)
|
|
6211
|
+
const [detail,setDetail]=createSignal32()
|
|
6212
|
+
const keys=createMemo15(()=>model.pins().map((pin)=>toolbarPinKey(pin)))
|
|
6213
|
+
const layout=createMemo15(()=>toolbarLayout(keys(),width(),props.preferences.toolbarOverflow?.()??"menu"))
|
|
6214
|
+
const rows=createMemo15(()=>layout().rows.map((_,index)=>index))
|
|
6215
|
+
const byKey=createMemo15(()=>new Map(model.pins().map((pin)=>[toolbarPinKey(pin),pin])))
|
|
6216
|
+
const view=(key)=>{const pin=byKey().get(key)
|
|
6217
|
+
return pin&&model.view(pin)
|
|
6218
|
+
}
|
|
6219
|
+
const details=createMemo15(()=>{if(detail()==="toolbar:more")
|
|
6220
|
+
return "More pinned actions and Skills"
|
|
6221
|
+
const item=view(detail()??"")
|
|
6222
|
+
return item?[item.label,item.stateLabel,item.reason].filter(Boolean).join(" \xB7 "):undefined
|
|
6223
|
+
})
|
|
6224
|
+
function showMore(){const route=JSON.stringify(props.api.route.current)
|
|
6225
|
+
const dialogs=createDialogStack(props.api,icons.style,()=>route===JSON.stringify(props.api.route.current),icons.multilineCorners)
|
|
6226
|
+
dialogs.open(()=>_$createComponent(SelectionMenu,{get api(){return props.api
|
|
6227
|
+
},title:"More pinned buttons",height:16,get options(){return layout().overflow.flatMap((key)=>{const item=view(key)
|
|
6228
|
+
return item?[{title:item.label,value:key,description:item.reason??item.stateLabel??"Run pinned item"
|
|
6229
|
+
}]:[]
|
|
6230
|
+
})
|
|
6231
|
+
},onSelect:(option)=>{if(view(option.value)?.reason){model.run(option.value)
|
|
6232
|
+
return
|
|
6233
|
+
}
|
|
6234
|
+
dialogs.close()
|
|
6235
|
+
model.run(option.value)
|
|
6236
|
+
}}))
|
|
6237
|
+
}
|
|
6238
|
+
return _$createComponent(Show27,{get when(){return keys().length>0
|
|
6239
|
+
},get children(){var _el$=_$createElement("box")
|
|
6240
|
+
_$setProp(_el$,"id","opencode-navigator.toolbar")
|
|
6241
|
+
_$setProp(_el$,"onSizeChange",function(){setWidth(this.width)
|
|
6242
|
+
})
|
|
6243
|
+
_$insert(_el$,_$createComponent(For17,{get each(){return rows()
|
|
6244
|
+
},children:(row)=>(()=>{var _el$2=_$createElement("box")
|
|
6245
|
+
_$setProp(_el$2,"flexDirection","row")
|
|
6246
|
+
_$setProp(_el$2,"gap",1)
|
|
6247
|
+
_$insert(_el$2,_$createComponent(For17,{get each(){return layout().rows[row]
|
|
6248
|
+
},children:(key,column)=>_$createComponent(ToolbarButton,_$mergeProps(props,{id:`opencode-navigator.toolbar.${key}`,row,get column(){return column()
|
|
6249
|
+
},get label(){return view(key)?.label??"More"
|
|
6250
|
+
},get icon(){return key==="toolbar:more"?"list":view(key)?.icon??"bolt"
|
|
6251
|
+
},get reason(){return view(key)?.reason
|
|
6252
|
+
},onRun:()=>key==="toolbar:more"?showMore():model.run(key),onDetails:(_id,active)=>setDetail((current)=>active?key:current===key?undefined:current)
|
|
6253
|
+
}))
|
|
6254
|
+
}))
|
|
6255
|
+
return _el$2
|
|
6256
|
+
})()
|
|
6257
|
+
}),null)
|
|
6258
|
+
_$insert(_el$,_$createComponent(Show27,{get when(){return details()
|
|
6259
|
+
},children:(text)=>(()=>{var _el$3=_$createElement("text")
|
|
6260
|
+
_$setProp(_el$3,"height",1)
|
|
6261
|
+
_$setProp(_el$3,"truncate",true)
|
|
6262
|
+
_$setProp(_el$3,"wrapMode","none")
|
|
6263
|
+
_$insert(_el$3,text)
|
|
6264
|
+
_$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
|
|
6265
|
+
return _el$3
|
|
6266
|
+
})()
|
|
6267
|
+
}),null)
|
|
6268
|
+
return _el$
|
|
6269
|
+
}})
|
|
6270
|
+
}
|
|
6271
|
+
|
|
6272
|
+
|
|
6273
|
+
|
|
6274
|
+
|
|
6275
|
+
|
|
6276
|
+
|
|
6277
|
+
|
|
6278
|
+
|
|
6430
6279
|
|
|
6431
6280
|
|
|
6432
6281
|
function createSkillSectionModel(props,query){const target=createMemo16(()=>props.controller.target())
|
|
@@ -6438,10 +6287,10 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
|
|
|
6438
6287
|
const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
|
|
6439
6288
|
})
|
|
6440
6289
|
const state=createMemo16(()=>props.controller.state(target()))
|
|
6441
|
-
|
|
6442
|
-
const deactivate=
|
|
6443
|
-
|
|
6444
|
-
|
|
6290
|
+
createEffect18(()=>{const current=target()
|
|
6291
|
+
const deactivate=untrack8(()=>props.controller.activate?.(current)??(()=>{}))
|
|
6292
|
+
onCleanup21(deactivate)
|
|
6293
|
+
untrack8(()=>void props.controller.refresh(current).catch(()=>{}))
|
|
6445
6294
|
})
|
|
6446
6295
|
async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
|
|
6447
6296
|
if(isInserted)
|
|
@@ -6464,9 +6313,11 @@ return{target,recent,grouped,list,filtered,visibility,state,useSkill,skillGroup}
|
|
|
6464
6313
|
|
|
6465
6314
|
|
|
6466
6315
|
|
|
6316
|
+
|
|
6467
6317
|
function SkillRow(props){const{api,interaction,grouped
|
|
6468
6318
|
}=useSidebarList()
|
|
6469
6319
|
const icons=useIcons()
|
|
6320
|
+
const toolbar=useToolbar()
|
|
6470
6321
|
const id=()=>`${PLUGIN_ID}.skill.${props.item.location || props.item.name}`
|
|
6471
6322
|
const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
|
|
6472
6323
|
}),activate:props.onUse
|
|
@@ -6490,24 +6341,21 @@ _$insert(_el$,()=>props.item.name,null)
|
|
|
6490
6341
|
_$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
|
|
6491
6342
|
return _el$
|
|
6492
6343
|
})()
|
|
6344
|
+
},get trailing(){return _$createComponent(Show28,{when:toolbar,get children(){return _$createComponent(SidebarPinControl,{get id(){return id()
|
|
6345
|
+
},get position(){return props.position
|
|
6346
|
+
},get pin(){return{kind:"skill",name:props.item.name,location:props.item.location,icon:"book"
|
|
6347
|
+
}}})
|
|
6348
|
+
}})
|
|
6493
6349
|
}})
|
|
6494
6350
|
}
|
|
6495
6351
|
function SkillsSection(props){const dialogs=useDialogs(props.api)
|
|
6496
|
-
const
|
|
6352
|
+
const toolbar=useToolbar()
|
|
6353
|
+
const [query,setQuery]=createSignal33("")
|
|
6497
6354
|
const model=createSkillSectionModel(props,query)
|
|
6498
6355
|
const navigationSection=()=>props.navigationSection??3
|
|
6499
|
-
function selectSkill(item){
|
|
6500
|
-
|
|
6501
|
-
}
|
|
6502
|
-
showSkillDetails(item)
|
|
6503
|
-
}
|
|
6504
|
-
function showSkillDetails(item){dialogs.open(()=>_$createComponent(SkillDialog,{get api(){return props.api
|
|
6505
|
-
},skill:item,get favorite(){return props.preferences.isFavoriteSkill?.(item)??false
|
|
6506
|
-
},get favoriteDisabled(){return props.preferences.ready?.()===false
|
|
6507
|
-
},onToggleFavorite:()=>props.preferences.toggleFavoriteSkill?.(item),onAccept:(skipConfirmation)=>{if(skipConfirmation)
|
|
6508
|
-
props.preferences.skipSkillConfirmation(item)
|
|
6509
|
-
model.useSkill(item)
|
|
6510
|
-
}}))
|
|
6356
|
+
function selectSkill(item){activateSkill({api:props.api,controller:props.controller,access:props.preferences,dialogs,skill:item,onConfigure:toolbar?(navigation)=>toolbar.configure({kind:"skill",name:item.name,location:item.location,icon:"book"
|
|
6357
|
+
},navigation):undefined
|
|
6358
|
+
})
|
|
6511
6359
|
}
|
|
6512
6360
|
return _$createComponent(Section,{get api(){return props.api
|
|
6513
6361
|
},get interaction(){return props.interaction
|
|
@@ -6526,7 +6374,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
|
|
|
6526
6374
|
}},get query(){return query()
|
|
6527
6375
|
},placeholder:"Filter skills...",onInput:setQuery
|
|
6528
6376
|
}),null)
|
|
6529
|
-
_$insert(_el$,_$createComponent(
|
|
6377
|
+
_$insert(_el$,_$createComponent(Show29,{get when(){return model.filtered().length>0
|
|
6530
6378
|
},get fallback(){return(()=>{var _el$2=_$createElement("text")
|
|
6531
6379
|
_$insertNode(_el$2,_$createTextNode(`No matching skills`))
|
|
6532
6380
|
_$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
|
|
@@ -6536,8 +6384,8 @@ return _el$2
|
|
|
6536
6384
|
},get interaction(){return props.interaction
|
|
6537
6385
|
},get grouped(){return model.grouped
|
|
6538
6386
|
},get density(){return props.preferences.rowDensity?.()??"compact"
|
|
6539
|
-
},get children(){return _$createComponent(
|
|
6540
|
-
},children:(item,index)=>[_$createComponent(
|
|
6387
|
+
},get children(){return _$createComponent(For18,{get each(){return model.visibility.visible()
|
|
6388
|
+
},children:(item,index)=>[_$createComponent(Show29,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
|
|
6541
6389
|
},get children(){var _el$4=_$createElement("text")
|
|
6542
6390
|
_$setProp(_el$4,"height",1)
|
|
6543
6391
|
_$setProp(_el$4,"wrapMode","none")
|
|
@@ -6582,18 +6430,18 @@ return _el$
|
|
|
6582
6430
|
function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
|
|
6583
6431
|
const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
|
|
6584
6432
|
const rows=createMemo17(()=>buildSubagentView(list(),recent()))
|
|
6585
|
-
const [query,setQuery]=
|
|
6586
|
-
const [mode,setMode]=
|
|
6433
|
+
const [query,setQuery]=createSignal34("")
|
|
6434
|
+
const [mode,setMode]=createSignal34("all")
|
|
6587
6435
|
const counts=createMemo17(()=>countSubagentView(rows(),query()))
|
|
6588
6436
|
const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
|
|
6589
6437
|
const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
|
|
6590
6438
|
const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
|
|
6591
6439
|
const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
|
|
6592
|
-
|
|
6440
|
+
createEffect19(()=>{targetKey()
|
|
6593
6441
|
setQuery("")
|
|
6594
6442
|
setMode("all")
|
|
6595
6443
|
})
|
|
6596
|
-
|
|
6444
|
+
createEffect19(()=>{if(mode()!=="all"&&counts()[mode()]===0)
|
|
6597
6445
|
setMode("all")
|
|
6598
6446
|
})
|
|
6599
6447
|
const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
|
|
@@ -6603,11 +6451,11 @@ const now=createSubagentClock(clockKey)
|
|
|
6603
6451
|
const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
|
|
6604
6452
|
const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
|
|
6605
6453
|
const state=createMemo17(()=>props.controller.state(props.sessionID))
|
|
6606
|
-
|
|
6454
|
+
createEffect19(()=>{const sessionID=props.sessionID
|
|
6607
6455
|
targetKey()
|
|
6608
|
-
const deactivate=
|
|
6609
|
-
|
|
6610
|
-
|
|
6456
|
+
const deactivate=untrack9(()=>props.controller.activate?.(sessionID)??(()=>{}))
|
|
6457
|
+
onCleanup22(deactivate)
|
|
6458
|
+
untrack9(()=>void props.controller.refresh(sessionID).catch(()=>{}))
|
|
6611
6459
|
})
|
|
6612
6460
|
return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
|
|
6613
6461
|
}}
|
|
@@ -6664,7 +6512,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
|
|
|
6664
6512
|
_$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
|
|
6665
6513
|
return _el$3
|
|
6666
6514
|
})()
|
|
6667
|
-
},get details(){return [_$createComponent(
|
|
6515
|
+
},get details(){return [_$createComponent(Show30,{get when(){return props.item.run?.errorMessage
|
|
6668
6516
|
},get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
|
|
6669
6517
|
_$insertNode(_el$4,_el$5)
|
|
6670
6518
|
_$setProp(_el$4,"wrapMode","word")
|
|
@@ -6672,12 +6520,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
|
|
|
6672
6520
|
_$insert(_el$4,()=>props.item.run?.errorMessage,null)
|
|
6673
6521
|
_$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
|
|
6674
6522
|
return _el$4
|
|
6675
|
-
}}),_$createComponent(
|
|
6523
|
+
}}),_$createComponent(Show30,{get when(){return props.item.unavailable
|
|
6676
6524
|
},get children(){var _el$6=_$createElement("text")
|
|
6677
6525
|
_$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
|
|
6678
6526
|
_$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
|
|
6679
6527
|
return _el$6
|
|
6680
|
-
}}),_$createComponent(
|
|
6528
|
+
}}),_$createComponent(Show30,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
|
|
6681
6529
|
},children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
|
|
6682
6530
|
_$insertNode(_el$0,_el$1)
|
|
6683
6531
|
_$insertNode(_el$0,_el$10)
|
|
@@ -6689,7 +6537,7 @@ _$insert(_el$0,()=>status().message,null)
|
|
|
6689
6537
|
_$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
|
|
6690
6538
|
return _el$0
|
|
6691
6539
|
})()
|
|
6692
|
-
}),_$createComponent(
|
|
6540
|
+
}),_$createComponent(Show30,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
|
|
6693
6541
|
},get children(){var _el$8=_$createElement("text")
|
|
6694
6542
|
_$insertNode(_el$8,_$createTextNode(`Finished`))
|
|
6695
6543
|
_$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
|
|
@@ -6700,12 +6548,12 @@ return _el$8
|
|
|
6700
6548
|
function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
|
|
6701
6549
|
},get interaction(){return props.interaction
|
|
6702
6550
|
},get density(){return props.density
|
|
6703
|
-
},get children(){return _$createComponent(
|
|
6551
|
+
},get children(){return _$createComponent(For19,{get each(){return props.ids
|
|
6704
6552
|
},children:(id,index)=>{const initial=props.itemById(id)
|
|
6705
6553
|
const item=()=>props.itemById(id)??initial
|
|
6706
6554
|
const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
|
|
6707
6555
|
return(()=>{var _el$=_$createElement("box")
|
|
6708
|
-
_$insert(_el$,_$createComponent(
|
|
6556
|
+
_$insert(_el$,_$createComponent(Show31,{get when(){return startsGroup()
|
|
6709
6557
|
},get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
|
|
6710
6558
|
_$insertNode(_el$2,_el$3)
|
|
6711
6559
|
_$insert(_el$3,()=>item().group)
|
|
@@ -6731,7 +6579,7 @@ return _$createComponent(Section,{get api(){return props.api
|
|
|
6731
6579
|
},sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
|
|
6732
6580
|
},title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
|
|
6733
6581
|
},get open(){return props.preferences.expanded().subagents
|
|
6734
|
-
},onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(
|
|
6582
|
+
},onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show32,{get when(){return model.parentID()
|
|
6735
6583
|
},children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
|
|
6736
6584
|
},get interaction(){return props.interaction
|
|
6737
6585
|
},id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
|
|
@@ -6754,7 +6602,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
|
|
|
6754
6602
|
}}),_el$2)
|
|
6755
6603
|
_$setProp(_el$2,"flexDirection","row")
|
|
6756
6604
|
_$setProp(_el$2,"flexWrap","wrap")
|
|
6757
|
-
_$insert(_el$2,_$createComponent(
|
|
6605
|
+
_$insert(_el$2,_$createComponent(For20,{get each(){return model.tabs()
|
|
6758
6606
|
},children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
|
|
6759
6607
|
},get interaction(){return props.interaction
|
|
6760
6608
|
},id:`${PLUGIN_ID}.subagents.filter.${value}`,get position(){return{section:navigationSection(),row:4,column:index()
|
|
@@ -6765,7 +6613,7 @@ _$insert(_el$2,_$createComponent(For19,{get each(){return model.tabs()
|
|
|
6765
6613
|
},onActivate:()=>model.setMode(value)
|
|
6766
6614
|
})
|
|
6767
6615
|
}))
|
|
6768
|
-
_$insert(_el$,_$createComponent(
|
|
6616
|
+
_$insert(_el$,_$createComponent(Show32,{get when(){return model.filtered().length===0
|
|
6769
6617
|
},get children(){var _el$3=_$createElement("text")
|
|
6770
6618
|
_$insertNode(_el$3,_$createTextNode(`No matching subagents`))
|
|
6771
6619
|
_$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
|
|
@@ -6806,6 +6654,23 @@ return _el$
|
|
|
6806
6654
|
|
|
6807
6655
|
|
|
6808
6656
|
|
|
6657
|
+
function NativeTodoNotice(props){const icons=useIcons()
|
|
6658
|
+
return(()=>{var _el$=_$createElement("text"),_el$2=_$createTextNode(` Native OpenCode Todo. Edit tasks through chat and todowrite.`)
|
|
6659
|
+
_$insertNode(_el$,_el$2)
|
|
6660
|
+
_$setProp(_el$,"wrapMode","word")
|
|
6661
|
+
_$insert(_el$,()=>icons.icon("info"),_el$2)
|
|
6662
|
+
_$insert(_el$,()=>props.empty?" OpenCode 2.1 enables the tool through experimental.todo.":"",null)
|
|
6663
|
+
_$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
|
|
6664
|
+
return _el$
|
|
6665
|
+
})()
|
|
6666
|
+
}
|
|
6667
|
+
|
|
6668
|
+
|
|
6669
|
+
|
|
6670
|
+
|
|
6671
|
+
|
|
6672
|
+
|
|
6673
|
+
|
|
6809
6674
|
|
|
6810
6675
|
|
|
6811
6676
|
|
|
@@ -6849,7 +6714,7 @@ _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":
|
|
|
6849
6714
|
_$setProp(_el$3,"flexGrow",1)
|
|
6850
6715
|
_$setProp(_el$3,"wrapMode","word")
|
|
6851
6716
|
_$insert(_el$3,()=>props.item.content)
|
|
6852
|
-
_$insert(_el$,_$createComponent(
|
|
6717
|
+
_$insert(_el$,_$createComponent(Show33,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
|
|
6853
6718
|
},get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
|
|
6854
6719
|
_$insertNode(_el$4,_el$5)
|
|
6855
6720
|
_$setProp(_el$4,"width",2)
|
|
@@ -6876,7 +6741,7 @@ _$insertNode(_el$,_el$2)
|
|
|
6876
6741
|
_$setProp(_el$,"gap",1)
|
|
6877
6742
|
_$setProp(_el$2,"flexDirection","row")
|
|
6878
6743
|
_$setProp(_el$2,"flexWrap","wrap")
|
|
6879
|
-
_$insert(_el$2,_$createComponent(
|
|
6744
|
+
_$insert(_el$2,_$createComponent(For21,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
|
|
6880
6745
|
},get interaction(){return props.interaction
|
|
6881
6746
|
},id:`${PLUGIN_ID}.todo.filter.${value}`,get position(){return{section:navigationSection(),row:tabsRow(),column:index()
|
|
6882
6747
|
}},get label(){return value[0].toUpperCase() + value.slice(1)
|
|
@@ -6885,17 +6750,17 @@ _$insert(_el$2,_$createComponent(For20,{each:["all","active","finished"],childre
|
|
|
6885
6750
|
},onActivate:()=>props.setMode(value)
|
|
6886
6751
|
})
|
|
6887
6752
|
}))
|
|
6888
|
-
_$insert(_el$,_$createComponent(
|
|
6753
|
+
_$insert(_el$,_$createComponent(Show34,{get when(){return props.view.rows.length>0
|
|
6889
6754
|
},get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
|
|
6890
6755
|
},get mode(){return props.mode
|
|
6891
6756
|
}})
|
|
6892
6757
|
},get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
|
|
6893
6758
|
},get interaction(){return props.interaction
|
|
6894
6759
|
},get density(){return props.density
|
|
6895
|
-
},get children(){return _$createComponent(
|
|
6760
|
+
},get children(){return _$createComponent(For21,{get each(){return props.visibility.visible()
|
|
6896
6761
|
},children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
|
|
6897
6762
|
return(()=>{var _el$3=_$createElement("box")
|
|
6898
|
-
_$insert(_el$3,_$createComponent(
|
|
6763
|
+
_$insert(_el$3,_$createComponent(Show34,{get when(){return startsGroup()
|
|
6899
6764
|
},get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
|
|
6900
6765
|
_$insertNode(_el$4,_el$5)
|
|
6901
6766
|
_$insert(_el$5,()=>row.group)
|
|
@@ -6932,7 +6797,7 @@ return _el$6
|
|
|
6932
6797
|
|
|
6933
6798
|
|
|
6934
6799
|
function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
|
|
6935
|
-
return _$createComponent(
|
|
6800
|
+
return _$createComponent(Show35,{get when(){return state().available
|
|
6936
6801
|
},get children(){var _el$=_$createElement("box")
|
|
6937
6802
|
_$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
|
|
6938
6803
|
},get interaction(){return props.interaction
|
|
@@ -6942,7 +6807,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
|
|
|
6942
6807
|
},get disabled(){return state().saving
|
|
6943
6808
|
},onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
|
|
6944
6809
|
}),null)
|
|
6945
|
-
_$insert(_el$,_$createComponent(
|
|
6810
|
+
_$insert(_el$,_$createComponent(Show35,{get when(){return state().error
|
|
6946
6811
|
},children:(message)=>(()=>{var _el$2=_$createElement("text")
|
|
6947
6812
|
_$setProp(_el$2,"wrapMode","word")
|
|
6948
6813
|
_$insert(_el$2,message)
|
|
@@ -6957,33 +6822,41 @@ function TodoSection(props){const list=createMemo18(()=>props.controller.list(pr
|
|
|
6957
6822
|
const icons=useIcons()
|
|
6958
6823
|
const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
|
|
6959
6824
|
const managed=()=>("guidance" in props.controller)?props.controller:undefined
|
|
6960
|
-
const
|
|
6825
|
+
const native=()=>("source" in props.controller)&&props.controller.source==="native"
|
|
6826
|
+
const [mode,setMode]=createSignal35("all")
|
|
6961
6827
|
const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
|
|
6962
|
-
|
|
6828
|
+
createEffect20(()=>{targetKey()
|
|
6963
6829
|
setMode("all")
|
|
6964
6830
|
})
|
|
6965
6831
|
const view=createMemo18(()=>buildTodoView(list(),mode()))
|
|
6966
6832
|
const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
|
|
6967
6833
|
})
|
|
6968
6834
|
const state=createMemo18(()=>props.controller.state(props.sessionID))
|
|
6969
|
-
|
|
6835
|
+
createEffect20(()=>{const sessionID=props.sessionID
|
|
6970
6836
|
targetKey()
|
|
6971
6837
|
if(unavailable())
|
|
6972
6838
|
return
|
|
6973
|
-
const deactivate=
|
|
6974
|
-
|
|
6975
|
-
|
|
6839
|
+
const deactivate=untrack10(()=>props.controller.activate?.(sessionID)??(()=>{}))
|
|
6840
|
+
onCleanup23(deactivate)
|
|
6841
|
+
untrack10(()=>void props.controller.refresh(sessionID).catch(()=>{}))
|
|
6976
6842
|
})
|
|
6977
6843
|
const navigationSection=()=>props.navigationSection??1
|
|
6978
6844
|
return _$createComponent(Section,{get api(){return props.api
|
|
6979
6845
|
},get interaction(){return props.interaction
|
|
6980
6846
|
},sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
|
|
6981
6847
|
},title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
|
|
6848
|
+
},get headerAction(){return native()?{id:`${PLUGIN_ID}.todo.refresh`,label:()=>`${icons.icon("retry")} Refresh`,disabled:()=>state().status==="loading"||state().status==="refreshing",onActivate:()=>{props.controller.refresh(props.sessionID).catch(()=>{})
|
|
6849
|
+
}}:undefined
|
|
6982
6850
|
},get open(){return props.preferences.expanded().todo
|
|
6983
|
-
},onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(
|
|
6851
|
+
},onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show36,{get when(){return unavailable()
|
|
6984
6852
|
},get fallback(){return(()=>{var _el$=_$createElement("box")
|
|
6985
6853
|
_$setProp(_el$,"gap",1)
|
|
6986
|
-
_$insert(_el$,_$createComponent(
|
|
6854
|
+
_$insert(_el$,_$createComponent(Show36,{get when(){return native()
|
|
6855
|
+
},get children(){return _$createComponent(NativeTodoNotice,{get api(){return props.api
|
|
6856
|
+
},get empty(){return list().length===0
|
|
6857
|
+
}})
|
|
6858
|
+
}}),null)
|
|
6859
|
+
_$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.guidance(props.sessionID).available
|
|
6987
6860
|
},get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
|
|
6988
6861
|
},get controller(){return managed()
|
|
6989
6862
|
},get sessionID(){return props.sessionID
|
|
@@ -6991,7 +6864,7 @@ _$insert(_el$,_$createComponent(Show30,{get when(){return managed()?.guidance(pr
|
|
|
6991
6864
|
},get navigationSection(){return navigationSection()
|
|
6992
6865
|
}})
|
|
6993
6866
|
}}),null)
|
|
6994
|
-
_$insert(_el$,_$createComponent(
|
|
6867
|
+
_$insert(_el$,_$createComponent(Show36,{get when(){return managed()?.missing(props.sessionID)
|
|
6995
6868
|
},get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
|
|
6996
6869
|
},get interaction(){return props.interaction
|
|
6997
6870
|
},id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
|
|
@@ -7028,8 +6901,11 @@ return _el$4
|
|
|
7028
6901
|
}
|
|
7029
6902
|
function SidebarContent(props){const sections=props.preferences.sections
|
|
7030
6903
|
const visibleSections=createMemo19(()=>props.preferences.sectionOrder().filter((section)=>sections()[section]&&supportsSidebarSection(props.api,section)))
|
|
7031
|
-
|
|
7032
|
-
return(()
|
|
6904
|
+
onCleanup24(()=>props.interaction.setContentRoot(undefined))
|
|
6905
|
+
return _$createComponent(ToolbarProvider,{get api(){return props.api
|
|
6906
|
+
},get preferences(){return props.preferences
|
|
6907
|
+
},get skills(){return props.skills
|
|
6908
|
+
},get children(){var _el$=_$createElement("box")
|
|
7033
6909
|
_$use((node)=>props.interaction.setContentRoot(node),_el$)
|
|
7034
6910
|
_$setProp(_el$,"id",`${PLUGIN_ID}.root`)
|
|
7035
6911
|
_$setProp(_el$,"focusable",true)
|
|
@@ -7040,7 +6916,8 @@ event.preventDefault()
|
|
|
7040
6916
|
event.stopPropagation()
|
|
7041
6917
|
props.interaction.leave()
|
|
7042
6918
|
})
|
|
7043
|
-
_$insert(_el$,_$createComponent(
|
|
6919
|
+
_$insert(_el$,_$createComponent(SidebarToolbar,props),null)
|
|
6920
|
+
_$insert(_el$,_$createComponent(For22,{get each(){return visibleSections()
|
|
7044
6921
|
},children:(section,index)=>_$createComponent(SectionBoundary,{get api(){return props.api
|
|
7045
6922
|
},get divided(){return index()<visibleSections().length-1
|
|
7046
6923
|
},get children(){return _$createComponent(Switch,{get children(){return [_$createComponent(Match,{when:section==="limits",get children(){return props.limitsSection(index() + 1)
|
|
@@ -7063,7 +6940,7 @@ _$insert(_el$,_$createComponent(For21,{get each(){return visibleSections()
|
|
|
7063
6940
|
}})]
|
|
7064
6941
|
}})
|
|
7065
6942
|
}})
|
|
7066
|
-
}))
|
|
6943
|
+
}),null)
|
|
7067
6944
|
_$effect((_p$)=>{var _v$=props.interaction.syncFocus,_v$2=props.interaction.syncFocus
|
|
7068
6945
|
_v$!==_p$.e&&(_p$.e=_$setProp(_el$,"on:focused",_v$,_p$.e))
|
|
7069
6946
|
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$,"on:blurred",_v$2,_p$.t))
|
|
@@ -7071,12 +6948,12 @@ return _p$
|
|
|
7071
6948
|
},{e:undefined,t:undefined
|
|
7072
6949
|
})
|
|
7073
6950
|
return _el$
|
|
7074
|
-
})
|
|
6951
|
+
}})
|
|
7075
6952
|
}
|
|
7076
6953
|
|
|
7077
6954
|
|
|
7078
6955
|
function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
|
|
7079
|
-
|
|
6956
|
+
createEffect21(()=>{if(!props.api.state.ready)
|
|
7080
6957
|
return
|
|
7081
6958
|
persist()
|
|
7082
6959
|
const route=props.api.route.current
|
|
@@ -7084,20 +6961,20 @@ const params="params" in route?route.params:undefined
|
|
|
7084
6961
|
if(typeof params?.sessionID!=="string")
|
|
7085
6962
|
return
|
|
7086
6963
|
const current=props.controller.target()
|
|
7087
|
-
|
|
7088
|
-
|
|
6964
|
+
onCleanup25(()=>props.controller.deactivate(current))
|
|
6965
|
+
untrack11(()=>void props.controller.activate(current).catch(()=>{}))
|
|
7089
6966
|
})
|
|
7090
6967
|
return _$createElement("box")
|
|
7091
6968
|
}
|
|
7092
|
-
function PreferencesPersistence(props){
|
|
7093
|
-
|
|
6969
|
+
function PreferencesPersistence(props){createEffect21(()=>{const location=currentLocation(props.api)
|
|
6970
|
+
untrack11(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
|
|
7094
6971
|
})))
|
|
7095
6972
|
props.controller.load()
|
|
7096
6973
|
})
|
|
7097
6974
|
return _$createElement("box")
|
|
7098
6975
|
}
|
|
7099
6976
|
function FirstRunWizardPersistence(props){let isChecked=false
|
|
7100
|
-
|
|
6977
|
+
createEffect21(()=>{if(isChecked)
|
|
7101
6978
|
return
|
|
7102
6979
|
isChecked=true
|
|
7103
6980
|
showFirstRunWizard(props.api,props.preferences).catch(()=>{})
|
|
@@ -7124,7 +7001,7 @@ const settingsId=`${PLUGIN_ID}.settings`
|
|
|
7124
7001
|
const settings=useSidebarItem(props.api,props.interaction,{id:settingsId,position:{section:0,row:0,column:0
|
|
7125
7002
|
},activate:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
|
|
7126
7003
|
},()=>theme().textMuted,"control")
|
|
7127
|
-
|
|
7004
|
+
onCleanup26(()=>props.interaction.setTitleRoot(undefined))
|
|
7128
7005
|
return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("box"),_el$3=_$createElement("box")
|
|
7129
7006
|
_$insertNode(_el$,_el$2)
|
|
7130
7007
|
_$use((node)=>props.interaction.setTitleRoot(node),_el$)
|
|
@@ -7135,7 +7012,7 @@ _$setProp(_el$2,"flexDirection","row")
|
|
|
7135
7012
|
_$setProp(_el$2,"justifyContent","space-between")
|
|
7136
7013
|
_$setProp(_el$2,"gap",1)
|
|
7137
7014
|
_$setProp(_el$3,"flexGrow",1)
|
|
7138
|
-
_$insert(_el$3,_$createComponent(
|
|
7015
|
+
_$insert(_el$3,_$createComponent(Show37,{get when(){return props.preferences.showSessionTitle()
|
|
7139
7016
|
},get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
|
|
7140
7017
|
_$insertNode(_el$4,_el$5)
|
|
7141
7018
|
_$setProp(_el$4,"wrapMode","word")
|
|
@@ -7143,7 +7020,7 @@ _$insert(_el$5,()=>props.title)
|
|
|
7143
7020
|
_$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
|
|
7144
7021
|
return _el$4
|
|
7145
7022
|
}}),null)
|
|
7146
|
-
_$insert(_el$3,_$createComponent(
|
|
7023
|
+
_$insert(_el$3,_$createComponent(Show37,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
|
|
7147
7024
|
},children:(value)=>(()=>{var _el$6=_$createElement("text")
|
|
7148
7025
|
_$insert(_el$6,value)
|
|
7149
7026
|
_$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
|
|
@@ -7192,11 +7069,11 @@ function createLimitsRefresh(options,schedule=scheduleInterval){let disposed=fal
|
|
|
7192
7069
|
const selectedKey=createMemo22(()=>JSON.stringify(options.selectedModel?.()))
|
|
7193
7070
|
const targetKey=createMemo22(()=>JSON.stringify(options.controller.current().model))
|
|
7194
7071
|
const interval=createMemo22(()=>(parseLimitsRefreshMinutes(options.refreshMinutes?.())??DEFAULT_LIMITS_REFRESH_MINUTES)*60000)
|
|
7195
|
-
|
|
7072
|
+
createEffect22(on2(selectedKey,()=>{const model=options.selectedModel?.()
|
|
7196
7073
|
if(model&&options.accountSource)
|
|
7197
7074
|
options.accountSource.refresh(model).catch(()=>{})
|
|
7198
7075
|
}))
|
|
7199
|
-
|
|
7076
|
+
createEffect22(on2(targetKey,()=>{const{model,adapter}=options.controller.current()
|
|
7200
7077
|
if(model&&adapter)
|
|
7201
7078
|
options.controller.refresh()
|
|
7202
7079
|
}))
|
|
@@ -7209,9 +7086,9 @@ await options.accountSource.refresh(model)
|
|
|
7209
7086
|
if(!disposed&&target===targetKey())
|
|
7210
7087
|
await options.controller.refresh()
|
|
7211
7088
|
}
|
|
7212
|
-
|
|
7089
|
+
createEffect22(on2(interval,(milliseconds)=>{onCleanup27(schedule(()=>void refresh().catch(()=>{}),milliseconds))
|
|
7213
7090
|
}))
|
|
7214
|
-
|
|
7091
|
+
onCleanup27(()=>{disposed=true
|
|
7215
7092
|
})
|
|
7216
7093
|
}
|
|
7217
7094
|
function LimitsPersistence(props){createLimitsRefresh(props)
|
|
@@ -7243,9 +7120,24 @@ const data=Object.fromEntries(response.data.map((server)=>[server.name,server.st
|
|
|
7243
7120
|
return{data}},async connect(input,options={}){await context.client.mcp.connect({server:input.name,...location(input)},{signal:options.signal})
|
|
7244
7121
|
return{data:undefined}},async disconnect(input,options={}){await context.client.mcp.disconnect({server:input.name,...location(input)},{signal:options.signal})
|
|
7245
7122
|
return{data:undefined}}}}}}
|
|
7246
|
-
var
|
|
7123
|
+
var TERMINAL_EVENTS=new Set(["session.execution.succeeded","session.execution.failed","session.execution.interrupted"])
|
|
7124
|
+
function executionStatus(name,event){const sessionID=event.data.sessionID
|
|
7125
|
+
const started=event.type==="session.execution.started"
|
|
7126
|
+
if(typeof sessionID!=="string"||!started&&!TERMINAL_EVENTS.has(event.type))
|
|
7127
|
+
return
|
|
7128
|
+
if(name!=="session.status"&&(name!=="session.idle"||started))
|
|
7129
|
+
return
|
|
7130
|
+
const status=started?{type:"busy"}:{type:"idle"}
|
|
7131
|
+
return{sessionID,status,properties:{sessionID,...name==="session.status"&&{status}}}}
|
|
7132
|
+
var SESSION_UPDATE_EVENTS=new Set(["session.agent.selected","session.model.selected","session.moved","session.renamed","session.permissions","session.metadata.updated"])
|
|
7247
7133
|
function createV2EventAdapter(context,sessions){return{on(name,handler){let active=true
|
|
7248
7134
|
const unsubscribe=context.data.listen(({details})=>{const event=details
|
|
7135
|
+
const execution=executionStatus(name,event)
|
|
7136
|
+
if(execution){sessions.setStatus(execution.sessionID,execution.status)
|
|
7137
|
+
handler({type:name,properties:execution.properties
|
|
7138
|
+
})
|
|
7139
|
+
return
|
|
7140
|
+
}
|
|
7249
7141
|
if(name==="server.connected"&&event.type==="server.connected"){handler({type:name,properties:{}})
|
|
7250
7142
|
return
|
|
7251
7143
|
}
|
|
@@ -7299,8 +7191,8 @@ unsubscribe()
|
|
|
7299
7191
|
}}}}
|
|
7300
7192
|
|
|
7301
7193
|
|
|
7302
|
-
|
|
7303
|
-
|
|
7194
|
+
function enabled(value){return typeof value==="function"?value():value!==false
|
|
7195
|
+
}
|
|
7304
7196
|
function belongsTo2(renderable,ancestor){if(!renderable||!ancestor)
|
|
7305
7197
|
return false
|
|
7306
7198
|
for(let current=renderable;current; current=current.parent){if(current===ancestor)
|
|
@@ -7308,9 +7200,15 @@ return true
|
|
|
7308
7200
|
}
|
|
7309
7201
|
return false
|
|
7310
7202
|
}
|
|
7311
|
-
function
|
|
7203
|
+
function v2LayerCommands(id,layer,available,run,dispatch){const named=(layer.commands??[]).map((command)=>({id:command.name,bind:command.name==="session.new"?"<leader>n":undefined,title:command.title,description:command.desc,group:command.category,palette:command.namespace==="palette"?true:undefined,suggested:command.suggested,enabled:()=>available()&&enabled(command.enabled),run:(input,event)=>run(command,input,event)
|
|
7204
|
+
}))
|
|
7205
|
+
const bindings=(layer.bindings??[]).flatMap((binding,index)=>typeof binding.key==="string"?[{id:`${PLUGIN_ID}.v2-binding.${id}.${index}`,bind:binding.key,enabled:available,run:()=>dispatch(String(binding.cmd))
|
|
7206
|
+
}]:[])
|
|
7207
|
+
return [...named,...bindings]
|
|
7312
7208
|
}
|
|
7313
|
-
|
|
7209
|
+
var SETTINGS_COMMAND="opencode.settings"
|
|
7210
|
+
var PERMISSIONS_ACTION="permission.mode"
|
|
7211
|
+
function createV2Keymap(context){const [revision,setRevision]=createSignal36(0)
|
|
7314
7212
|
const layers=new Map
|
|
7315
7213
|
let sequence=0
|
|
7316
7214
|
function layerActive(layer){const mode=layer.mode??"base"
|
|
@@ -7334,16 +7232,11 @@ event.stopPropagation()
|
|
|
7334
7232
|
runV2(command,"",event)
|
|
7335
7233
|
}
|
|
7336
7234
|
context.renderer.keyInput.on("keypress",onKeypress)
|
|
7337
|
-
function
|
|
7338
|
-
const named=(layer.commands??[]).map((command)=>({id:command.name,bind:command.name==="session.new"?"<leader>n":undefined,title:command.title,description:command.desc,group:command.category,palette:command.namespace==="palette"?true:undefined,suggested:command.suggested,enabled:()=>available()&&enabled(command.enabled),run:(input,event)=>runV2(command,input,event)
|
|
7339
|
-
}))
|
|
7340
|
-
const bindings=(layer.bindings??[]).flatMap((binding,index)=>typeof binding.key==="string"?[{id:`${PLUGIN_ID}.v2-binding.${id}.${index}`,bind:binding.key,enabled:available,run:()=>{context.keymap.dispatch(String(binding.cmd))
|
|
7341
|
-
}}]:[])
|
|
7342
|
-
return [...named,...bindings]
|
|
7235
|
+
function layerCommands([id,layer]){return v2LayerCommands(id,layer,()=>layerActive(layer),runV2,context.keymap.dispatch)
|
|
7343
7236
|
}
|
|
7344
7237
|
function Bridge(){context.keymap.layer(()=>{revision()
|
|
7345
7238
|
const current=[...layers].sort(([leftID,left],[rightID,right])=>(right.priority??0)-(left.priority??0)||rightID-leftID)
|
|
7346
|
-
const commands=current.flatMap((
|
|
7239
|
+
const commands=current.flatMap((entry)=>layerCommands(entry))
|
|
7347
7240
|
const bindings=commands.flatMap((command)=>command.id?[command.id]:[])
|
|
7348
7241
|
return{mode:"global",priority:2000,commands,bindings
|
|
7349
7242
|
}})
|
|
@@ -7417,13 +7310,20 @@ return "opencode-navigator"
|
|
|
7417
7310
|
}}}
|
|
7418
7311
|
function legacyTheme(theme){return{primary:theme.hue.interactive[200],secondary:theme.categorical[0]?.[200]??theme.hue.accent[200],accent:theme.hue.accent[200],error:theme.text.feedback.error.base,warning:theme.text.feedback.warning.base,success:theme.text.feedback.success.base,info:theme.text.feedback.info.base,text:theme.text.base,textMuted:theme.text.muted,selectedListItemText:theme.text.action.primary.focused,background:theme.background.base,backgroundPanel:theme.background.raised.base,backgroundElement:theme.background.raised.high,backgroundMenu:theme.background.raised.max,border:theme.border.base,borderActive:theme.scrollbar.base,borderSubtle:theme.hue.neutral[500],diffAdded:theme.diff.text.added,diffRemoved:theme.diff.text.removed,diffContext:theme.diff.text.context,diffHunkHeader:theme.diff.text.hunkHeader,diffHighlightAdded:theme.diff.highlight.added,diffHighlightRemoved:theme.diff.highlight.removed,diffAddedBg:theme.diff.background.added,diffRemovedBg:theme.diff.background.removed,diffContextBg:theme.diff.background.context,diffLineNumber:theme.diff.lineNumber.text,diffAddedLineNumberBg:theme.diff.lineNumber.background.added,diffRemovedLineNumberBg:theme.diff.lineNumber.background.removed,markdownText:theme.markdown.text,markdownHeading:theme.markdown.heading,markdownLink:theme.markdown.link,markdownLinkText:theme.markdown.linkText,markdownCode:theme.markdown.code,markdownBlockQuote:theme.markdown.blockQuote,markdownEmph:theme.markdown.emphasis,markdownStrong:theme.markdown.strong,markdownHorizontalRule:theme.markdown.horizontalRule,markdownListItem:theme.markdown.listItem,markdownListEnumeration:theme.markdown.listEnumeration,markdownImage:theme.markdown.image,markdownImageText:theme.markdown.imageText,markdownCodeBlock:theme.markdown.codeBlock,syntaxComment:theme.syntax.comment,syntaxKeyword:theme.syntax.keyword,syntaxFunction:theme.syntax.function,syntaxVariable:theme.syntax.variable,syntaxString:theme.syntax.string,syntaxNumber:theme.syntax.number,syntaxType:theme.syntax.type,syntaxOperator:theme.syntax.operator,syntaxPunctuation:theme.syntax.punctuation,thinkingOpacity:0.6
|
|
7419
7312
|
}}
|
|
7313
|
+
function bindToolbarActionState(context,api){setQuickActionStateSource(api,(id)=>{const route=context.ui.router.current()
|
|
7314
|
+
if(id!=="session.compact"||route.type!=="session")
|
|
7315
|
+
return
|
|
7316
|
+
const revert=context.data.session.get(route.sessionID)?.revert?.messageID
|
|
7317
|
+
return context.data.session.message.list(route.sessionID).some((message)=>(!revert||message.id<revert)&&message.type==="compaction"&&message.status==="running")?"compacting":"idle"
|
|
7318
|
+
})
|
|
7319
|
+
}
|
|
7420
7320
|
|
|
7421
7321
|
|
|
7422
7322
|
function createV2UI(context){let dialogOpen=false
|
|
7423
7323
|
function DialogPrompt(props){let active=true
|
|
7424
|
-
|
|
7324
|
+
onCleanup28(()=>{active=false
|
|
7425
7325
|
})
|
|
7426
|
-
|
|
7326
|
+
onMount6(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
|
|
7427
7327
|
})
|
|
7428
7328
|
if(!active)
|
|
7429
7329
|
return
|
|
@@ -7435,9 +7335,9 @@ props.onConfirm?.(value)
|
|
|
7435
7335
|
return _$createElement("box")
|
|
7436
7336
|
}
|
|
7437
7337
|
function DialogConfirm(props){let active=true
|
|
7438
|
-
|
|
7338
|
+
onCleanup28(()=>{active=false
|
|
7439
7339
|
})
|
|
7440
|
-
|
|
7340
|
+
onMount6(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
|
|
7441
7341
|
})
|
|
7442
7342
|
if(!active)
|
|
7443
7343
|
return
|
|
@@ -7502,17 +7402,80 @@ context.ui.router.navigate({type:"plugin",name,data:params})
|
|
|
7502
7402
|
}
|
|
7503
7403
|
setHostCapabilities(api,{todo:true,lsp:false,titleVisibility:false,permissionMode:false
|
|
7504
7404
|
})
|
|
7405
|
+
bindToolbarActionState(context,api)
|
|
7505
7406
|
return{api,async dispose(){controller.abort()
|
|
7506
7407
|
for(let index=disposers.length-1;index>=0; index--)
|
|
7507
7408
|
await disposers[index]()
|
|
7508
7409
|
disposers.length=0
|
|
7509
7410
|
}}}
|
|
7411
|
+
var statuses=new Set(["pending","in_progress","completed","cancelled"])
|
|
7412
|
+
function parseTodos(value){if(!Array.isArray(value))
|
|
7413
|
+
return []
|
|
7414
|
+
return value.flatMap((item)=>{if(!item||typeof item!=="object"||!("content" in item)||typeof item.content!=="string"||!item.content)
|
|
7415
|
+
return []
|
|
7416
|
+
const status="status" in item&&typeof item.status==="string"&&statuses.has(item.status)?item.status:"pending"
|
|
7417
|
+
return [{content:item.content,status}]
|
|
7418
|
+
})
|
|
7419
|
+
}
|
|
7420
|
+
function nativeTodos(messages,boundary){const boundaryIndex=boundary?messages.findIndex((message)=>message.id===boundary):-1
|
|
7421
|
+
const end=boundaryIndex===-1?messages.length:boundaryIndex
|
|
7422
|
+
for(let index=end-1;index>=0; index--){const message=messages[index]
|
|
7423
|
+
if(message.type!=="assistant")
|
|
7424
|
+
continue
|
|
7425
|
+
for(let part=message.content.length-1;part>=0; part--){const item=message.content[part]
|
|
7426
|
+
if(item.type==="tool"&&item.name==="todowrite"&&item.state.status==="completed")
|
|
7427
|
+
return parseTodos(item.state.input.todos)
|
|
7428
|
+
}}
|
|
7429
|
+
return []
|
|
7430
|
+
}
|
|
7431
|
+
function createNativeTodoController(context,api){const requests=createRequestState(api.lifecycle.signal)
|
|
7432
|
+
const pending=new Map
|
|
7433
|
+
let activeTarget
|
|
7434
|
+
function target(sessionID){const session=api.state.session.get(sessionID)
|
|
7435
|
+
const directory=session?.directory??api.state.path.directory
|
|
7436
|
+
const workspace=session?.workspaceID
|
|
7437
|
+
return{key:JSON.stringify([sessionID,directory,workspace??null]),sessionID,routing:{directory,...workspace&&{workspace}}}}
|
|
7438
|
+
function list(sessionID){return nativeTodos(context.data.session.message.list(sessionID),context.data.session.get(sessionID)?.revert?.messageID)
|
|
7439
|
+
}
|
|
7440
|
+
function refresh(sessionID,force=false){if(api.lifecycle.signal.aborted)
|
|
7441
|
+
return Promise.resolve([])
|
|
7442
|
+
const current=target(sessionID)
|
|
7443
|
+
const existing=pending.get(current.key)
|
|
7444
|
+
if(existing&&!force)
|
|
7445
|
+
return existing
|
|
7446
|
+
const requestState=requests.start(current.key,"refresh native todos",context.data.session.message.list(sessionID).length>0,force)
|
|
7447
|
+
if(!requestState)
|
|
7448
|
+
return existing
|
|
7449
|
+
const request=Promise.try(()=>Promise.all([context.data.session.sync(sessionID),context.data.session.message.sync(sessionID)])).then(()=>{if(!requestState.isCurrent())
|
|
7450
|
+
return []
|
|
7451
|
+
requestState.succeed()
|
|
7452
|
+
return list(sessionID)
|
|
7453
|
+
}).catch((error)=>{requestState.fail(error)
|
|
7454
|
+
throw error
|
|
7455
|
+
}).finally(()=>{requestState.finish()
|
|
7456
|
+
if(pending.get(current.key)===request)
|
|
7457
|
+
pending.delete(current.key)
|
|
7458
|
+
})
|
|
7459
|
+
pending.set(current.key,request)
|
|
7460
|
+
return request
|
|
7461
|
+
}
|
|
7462
|
+
return{source:"native",target,list,refresh,state:(sessionID)=>requests.state(target(sessionID).key),retry:(sessionID)=>refresh(sessionID,true),activate(sessionID){const key=target(sessionID).key
|
|
7463
|
+
if(activeTarget!==key){requests.abortAll()
|
|
7464
|
+
pending.clear()
|
|
7465
|
+
activeTarget=key
|
|
7466
|
+
}
|
|
7467
|
+
return()=>{if(activeTarget!==key)
|
|
7468
|
+
return
|
|
7469
|
+
activeTarget=undefined
|
|
7470
|
+
requests.abortAll()
|
|
7471
|
+
pending.clear()
|
|
7472
|
+
}}}}
|
|
7510
7473
|
function loadNavigatorUpdates(){const path=import.meta.url.includes("/dist/tui.js")?"./navigator-updates.js":"../navigator-updates"
|
|
7511
7474
|
return import(path)
|
|
7512
7475
|
}
|
|
7513
|
-
async function setupNavigator(api,options,readProject,
|
|
7476
|
+
async function setupNavigator(api,options,readProject,todoController,hostContext){const config=pluginConfig(undefined)
|
|
7514
7477
|
const configured=await loadConfiguredDefaults(api,options,readProject)
|
|
7515
|
-
const todo=
|
|
7478
|
+
const todo=todoController??createTodoController(api)
|
|
7516
7479
|
const subagents=createSubagentController(api)
|
|
7517
7480
|
const skills=createSkillController(api)
|
|
7518
7481
|
const preferences=createPreferencesController(api,config,createPreferencesStore(api.state.path.state),configured)
|
|
@@ -7520,9 +7483,9 @@ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js"
|
|
|
7520
7483
|
const limitsModule=await import(limitsPath)
|
|
7521
7484
|
const LimitsSection=limitsModule.ProviderLimitsSection
|
|
7522
7485
|
const{controller:limits,codex,accountSource,selectModel,modelSelection
|
|
7523
|
-
}=limitsModule.createProviderQuotaIntegration(api,preferences,"0.
|
|
7486
|
+
}=limitsModule.createProviderQuotaIntegration(api,preferences,"0.22.0",hostContext)
|
|
7524
7487
|
const mcp=createMcpController(api,preferences.persistMcp,preferences)
|
|
7525
|
-
const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
|
|
7488
|
+
const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont,sidebarShortcutActions(api)))
|
|
7526
7489
|
const startup=createStartupSessionController(api,preferences)
|
|
7527
7490
|
api.lifecycle.onDispose(()=>preferences.flush())
|
|
7528
7491
|
api.lifecycle.onDispose(()=>limits.dispose())
|
|
@@ -7548,7 +7511,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
|
|
|
7548
7511
|
},interaction,skills,subagents,mcp
|
|
7549
7512
|
}),_$createComponent(FirstRunWizardPersistence,{api,preferences
|
|
7550
7513
|
}),_$createComponent(StartupSessionBinding,{api,controller:startup
|
|
7551
|
-
}),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.
|
|
7514
|
+
}),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.22.0"
|
|
7552
7515
|
}),_$createComponent(McpPersistence,{api,controller:mcp
|
|
7553
7516
|
})]
|
|
7554
7517
|
}})
|
|
@@ -7581,19 +7544,19 @@ return result.data?.type==="text"?result.data.content:undefined
|
|
|
7581
7544
|
})
|
|
7582
7545
|
const{createVersionStatus,createVersionUpdateActions,createOpenCodeV1VersionUpdater
|
|
7583
7546
|
}=await loadNavigatorUpdates()
|
|
7584
|
-
const versionStatus=createVersionStatus(api,"0.
|
|
7585
|
-
const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.
|
|
7547
|
+
const versionStatus=createVersionStatus(api,"0.22.0")
|
|
7548
|
+
const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.22.0"))
|
|
7586
7549
|
api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
|
|
7587
7550
|
},get multilineCorners(){return preferences.cornerFont
|
|
7588
7551
|
},get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
|
|
7589
|
-
},navigatorVersion:"0.
|
|
7552
|
+
},navigatorVersion:"0.22.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
|
|
7590
7553
|
},get onNavigatorUpdate(){return versionUpdates.navigator
|
|
7591
7554
|
}})
|
|
7592
7555
|
}})
|
|
7593
7556
|
}}})
|
|
7594
7557
|
}
|
|
7595
7558
|
var setupOpenCodeV2=async (context)=>{const adapter=createOpenCodeV2Api(context)
|
|
7596
|
-
const todo=
|
|
7559
|
+
const todo=createNativeTodoController(context,adapter.api)
|
|
7597
7560
|
const{mcp,skills,preferences
|
|
7598
7561
|
}=await setupNavigator(adapter.api,context.options,async ()=>{if(!context.client.file?.read)
|
|
7599
7562
|
return
|
|
@@ -7602,15 +7565,15 @@ return new TextDecoder().decode(await context.client.file.read({location:context
|
|
|
7602
7565
|
},todo,context)
|
|
7603
7566
|
const{createVersionStatus,createVersionUpdateActions,createOpenCodeV2VersionUpdater
|
|
7604
7567
|
}=await loadNavigatorUpdates()
|
|
7605
|
-
const versionStatus=createVersionStatus(adapter.api,"0.
|
|
7606
|
-
const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.
|
|
7568
|
+
const versionStatus=createVersionStatus(adapter.api,"0.22.0")
|
|
7569
|
+
const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.22.0"))
|
|
7607
7570
|
const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
|
|
7608
7571
|
},get multilineCorners(){return preferences.cornerFont
|
|
7609
7572
|
},get children(){var _el$=_$createElement("box")
|
|
7610
7573
|
_$setProp(_el$,"flexDirection","row")
|
|
7611
7574
|
_$setProp(_el$,"justifyContent","space-between")
|
|
7612
7575
|
_$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
|
|
7613
|
-
},navigatorVersion:"0.
|
|
7576
|
+
},navigatorVersion:"0.22.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
|
|
7614
7577
|
},get onNavigatorUpdate(){return versionUpdates.navigator
|
|
7615
7578
|
}}),null)
|
|
7616
7579
|
_$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
|
|
@@ -7625,5 +7588,5 @@ await adapter.dispose()
|
|
|
7625
7588
|
var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
|
|
7626
7589
|
}
|
|
7627
7590
|
var plugin_default=plugin
|
|
7628
|
-
export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,createDialogStack,createMcpController,createPreferencesController,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,plugin_default as default,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,showFirstRunWizard,useDialogScroll,useDialogState,useDialogs,useIcons
|
|
7591
|
+
export{DEFAULT_SECTION_EXPANSION,DialogAction,DialogHeader,DialogSurface,FOCUS_COMMAND,FirstRunWizard,GuardedConfirmation,IconControl,IconPicker,KeyboardHelpDialog,LspBadge,McpSection,SelectionMenu as PresetMenu,QUICK_ACTIONS,QUICK_ACTION_IDS,Section,SectionFilter,SelectionBox,SelectionMenu,SettingsDialog,SidebarFocusBinding,SidebarToggleBinding,SkillsSection,Tab,TodoSection,createDialogStack,createMcpController,createNativeTodoController,createPreferencesController,createQuickActionRevision,createSidebarInteraction,createSkillController,createSubagentController,createTodoController,currentPermissionMode,plugin_default as default,hostCapabilities,hostCapabilityUnavailable,isEffectivelyVisible,lspIcon,matchesFilter,openFirstRunWizard,openKeyboardHelp,openSettings,orderQuickActionIds,parseQuickActionOrder,parseQuickActionVisibility,quickActionDisabledReason,quickActionLabel,quickActionRequiresSession,quickActionState,quickActionStates,setHostCapabilities,setQuickActionStateSource,showFirstRunWizard,subtleLineColor,supportsPermissionMode,supportsSidebarSection,supportsTitleVisibility,terminalIcon,terminalIconIDs,terminalIconLabel,useDialogScroll,useDialogState,useDialogs,useIcons
|
|
7629
7592
|
}
|