opencode-navigator 0.19.2 → 0.20.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/dist/tui.js CHANGED
@@ -3,14 +3,14 @@ import {insert as _$insert,setProp as _$setProp,createElement as _$createElement
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,Show,splitProps as splitProps3,createSignal as createSignal4,createSignal as createSignal5,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect4,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect6,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect5,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect7,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect8,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect9,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect10,createMemo as createMemo9,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,createMemo as createMemo8,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect11,onCleanup as onCleanup13,createSignal as createSignal16,createEffect as createEffect12,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createEffect as createEffect13,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal24,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,Show as Show13,createSignal as createSignal23,onCleanup as onCleanup17,For as For14,Show as Show16,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal25,createEffect as createEffect14,onCleanup as onCleanup18,For as For19,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For15,Show as Show17,createSignal as createSignal26,createEffect as createEffect15,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack5,For as For17,Show as Show20,createEffect as createEffect16,createMemo as createMemo17,createSignal as createSignal27,onCleanup as onCleanup20,untrack as untrack6,For as For16,Show as Show19,Show as Show18,Show as Show24,createEffect as createEffect17,createMemo as createMemo18,createSignal as createSignal28,onCleanup as onCleanup21,untrack as untrack7,For as For18,Show as Show22,Show as Show21,Show as Show23,createEffect as createEffect18,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack8,Show as Show25,createMemo as createMemo21,onCleanup as onCleanup24,createSignal as createSignal29,onCleanup as onCleanup25,onMount as onMount7} from "solid-js"
7
- var SIDEBAR_SECTIONS=["todo","subagents","skills","quick_actions","lsp","mcp"]
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,createSignal as createSignal6,onCleanup as onCleanup3,batch,createSignal as createSignal8,createSignal as createSignal7,createEffect as createEffect5,createSignal as createSignal9,onCleanup as onCleanup4,createSignal as createSignal10,createSignal as createSignal11,Index,createSignal as createSignal12,onCleanup as onCleanup5,createEffect as createEffect7,onCleanup as onCleanup7,batch as batch2,createEffect as createEffect6,createMemo,createSignal as createSignal13,onCleanup as onCleanup6,onMount,For as For2,For as For3,Show as Show2,createMemo as createMemo2,Show as Show3,createSignal as createSignal14,onCleanup as onCleanup8,For as For4,For as For5,For as For8,createMemo as createMemo4,onMount as onMount3,For as For7,createMemo as createMemo3,onMount as onMount2,Show as Show5,createEffect as createEffect8,createSignal as createSignal15,onCleanup as onCleanup9,Show as Show4,For as For6,For as For9,createEffect as createEffect9,createMemo as createMemo5,onCleanup as onCleanup10,createEffect as createEffect10,createMemo as createMemo6,untrack as untrack2,For as For10,createEffect as createEffect11,createMemo as createMemo8,onCleanup as onCleanup11,onMount as onMount4,createMemo as createMemo7,Show as Show6,onCleanup as onCleanup12,createEffect as createEffect12,onCleanup as onCleanup13,createSignal as createSignal16,createMemo as createMemo9,createEffect as createEffect13,onCleanup as onCleanup14,onMount as onMount5,onCleanup as onCleanup15,onMount as onMount6,For as For11,createSignal as createSignal17,createSignal as createSignal18,Show as Show7,createSignal as createSignal20,createSignal as createSignal19,onCleanup as onCleanup16,For as For12,Show as Show10,createMemo as createMemo11,createComputed,createMemo as createMemo10,createSignal as createSignal21,untrack as untrack3,Show as Show8,createComputed as createComputed2,untrack as untrack4,Show as Show9,createEffect as createEffect14,createSignal as createSignal22,createMemo as createMemo13,createSignal as createSignal25,createMemo as createMemo12,For as For13,Show as Show14,Show as Show11,Show as Show12,createSignal as createSignal23,createContext as createContext3,useContext as useContext3,Show as Show13,createSignal as createSignal24,onCleanup as onCleanup17,For as For14,Show as Show16,createSignal as createSignal26,untrack as untrack5,createSignal as createSignal27,createEffect as createEffect15,Show as Show15,For as For15,Show as Show18,createMemo as createMemo15,Show as Show17,createMemo as createMemo14,createSignal as createSignal28,createEffect as createEffect16,onCleanup as onCleanup18,For as For20,Match,Switch,createMemo as createMemo19,onCleanup as onCleanup22,For as For16,Show as Show19,createSignal as createSignal29,createEffect as createEffect17,createMemo as createMemo16,onCleanup as onCleanup19,untrack as untrack6,For as For18,Show as Show22,createEffect as createEffect18,createMemo as createMemo17,createSignal as createSignal30,onCleanup as onCleanup20,untrack as untrack7,For as For17,Show as Show21,Show as Show20,Show as Show26,createEffect as createEffect19,createMemo as createMemo18,createSignal as createSignal31,onCleanup as onCleanup21,untrack as untrack8,For as For19,Show as Show24,Show as Show23,Show as Show25,createEffect as createEffect20,createMemo as createMemo20,onCleanup as onCleanup23,untrack as untrack9,Show as Show27,createMemo as createMemo21,onCleanup as onCleanup24,createEffect as createEffect21,onCleanup as onCleanup25,untrack as untrack10,createSignal as createSignal32,onCleanup as onCleanup26,onMount as onMount7} from "solid-js"
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"
10
10
  }
11
- var DEFAULT_SECTION_EXPANSION={todo:true,subagents:false,skills:false,quick_actions:false,lsp:false,mcp:false
11
+ var DEFAULT_SECTION_EXPANSION={limits:true,todo:true,subagents:false,skills:false,quick_actions:false,lsp:false,mcp:false
12
12
  }
13
- var SECTION_DEFINITIONS=[{name:"todo",label:"Todo"},{name:"subagents",label:"Subagents"},{name:"skills",label:"Skills"},{name:"quick_actions",label:"Quick actions"},{name:"lsp",label:"LSP"},{name:"mcp",label:"MCP"}]
13
+ var SECTION_DEFINITIONS=[{name:"limits",label:"Limits"},{name:"todo",label:"Todo"},{name:"subagents",label:"Subagents"},{name:"skills",label:"Skills"},{name:"quick_actions",label:"Quick actions"},{name:"lsp",label:"LSP"},{name:"mcp",label:"MCP"}]
14
14
  function parseQuickActionOrder(value){if(!Array.isArray(value))
15
15
  return
16
16
  const order=[...new Set(value.filter((id)=>QUICK_ACTION_IDS.includes(id)))]
@@ -30,9 +30,11 @@ continue
30
30
  seen.add(candidate)
31
31
  order.push(candidate)
32
32
  }
33
- for(const section of SIDEBAR_SECTIONS){if(!seen.has(section))
33
+ for(const section of SIDEBAR_SECTIONS){if(!seen.has(section)){if(section==="limits")
34
+ order.unshift(section)
35
+ else
34
36
  order.push(section)
35
- }
37
+ }}
36
38
  return order
37
39
  }
38
40
  function parseSectionPreferences(value){if(!value||typeof value!=="object"||Array.isArray(value))
@@ -61,7 +63,7 @@ return defaults
61
63
  const input=value
62
64
  return Object.fromEntries(Object.entries(defaults).map(([name,visible])=>[name,typeof input[name]==="boolean"?input[name]:visible]))
63
65
  }
64
- function parseSectionVisibility(value){return resolveSectionVisibility({todo:true,subagents:true,skills:true,quick_actions:true,lsp:true,mcp:true
66
+ function parseSectionVisibility(value){return resolveSectionVisibility({limits:true,todo:true,subagents:true,skills:true,quick_actions:true,lsp:true,mcp:true
65
67
  },value)
66
68
  }
67
69
  var PLUGIN_ID="opencode-navigator"
@@ -495,7 +497,7 @@ return changeMany({action:state.action,...state.preset&&{preset:state.preset},..
495
497
 
496
498
 
497
499
 
498
- var ICONS={todo:["\uEAB3","[T]"],subagents:["\uEA7E","[A]"],skills:["\uEAA4","[S]"],actions:["\uEB9E","[Q]"],lsp:["\uEAC4","{}"],mcp:["\uEB2D","[M]"],sections:["\uEBEB","[]"],scope:["\uEB01","@"],presets:["\uEBD2","#"],settings:["\uEAF8","[=]"],reset:["\uEB37","R"],save:["\uEB4B","S"],add:["\uEA60","+"],edit:["\uEA73","[R]"],history:["\uEA82","[T]"],copy:["\uEBCC","[C]"],export:["\uEBAC","[E]"],compact:["\uEAF5","[-]"],checked:["\uEBB3","[x]"],unchecked:["\uEBB5","[ ]"],selected:["\uEAB6",">"],expanded:["\uEAB4","v"],collapsed:["\uEAB6",">"],radioOn:["\uEA71","(*)"],radioOff:["\uEABC","( )"],done:["\uEAB2","v"],busy:["\uEA71","*"],idle:["\uEABC","-"],close:["\uEA76","x"],error:["\uEA87","!"],retry:["\uEA77","~"],pending:["\uDB86\uDD78","..."],connected:["\uDB81\uDC3E","(*)"],disconnected:["\uDB81\uDC3D","( )"],favorite:["\uEB59","*"],favoriteEmpty:["\uEA6A","+"],bookmark:["\uDB80\uDCC0","*"],bookmarkEmpty:["\uDB80\uDCC3","+"],mcpFavorite:["\uDB80\uDCC0","*"],mcpFavoriteEmpty:["\uDB80\uDCC3","+"],recent:["\uEA82","~"],info:["\uEA74","i"],search:["\uEA6D","/"],update:["\uDB80\uDC5F","^"],up:["\uEAA1","^"],down:["\uEA9A","v"],left:["\uEA9B","<"],right:["\uEA9C",">"],keyEnter:["\uEBEA","enter"],keyTab:["\uDB80\uDF12","tab"],keyEscape:["\uDB84\uDEB7","esc"],keySpace:["\uDB84\uDC50","space"],delete:["\uEA81","del"],priorityMedium:["\uEA71","-"],help:["\uEB32","?"],selectionLeft:["\uE0B6"," "],selectionRight:["\uE0B4"," "],selectionTopLeft:["\uDBFC\uDC04"," "],selectionTopRight:["\uDBFC\uDC05"," "],selectionBottomLeft:["\uDBFC\uDC06"," "],selectionBottomRight:["\uDBFC\uDC07"," "]
500
+ var ICONS={limits:["\uDB80\uDE9A","%"],todo:["\uEAB3","[T]"],subagents:["\uEA7E","[A]"],skills:["\uEAA4","[S]"],actions:["\uEB9E","[Q]"],lsp:["\uEAC4","{}"],mcp:["\uEB2D","[M]"],sections:["\uEBEB","[]"],scope:["\uEB01","@"],presets:["\uEBD2","#"],settings:["\uEAF8","[=]"],reset:["\uEB37","R"],save:["\uEB4B","S"],add:["\uEA60","+"],edit:["\uEA73","[R]"],history:["\uEA82","[T]"],copy:["\uEBCC","[C]"],export:["\uEBAC","[E]"],compact:["\uEAF5","[-]"],checked:["\uEBB3","[x]"],unchecked:["\uEBB5","[ ]"],selected:["\uEAB6",">"],expanded:["\uEAB4","v"],collapsed:["\uEAB6",">"],radioOn:["\uEA71","(*)"],radioOff:["\uEABC","( )"],done:["\uEAB2","v"],busy:["\uEA71","*"],idle:["\uEABC","-"],close:["\uEA76","x"],error:["\uEA87","!"],retry:["\uEA77","~"],pending:["\uDB86\uDD78","..."],connected:["\uDB81\uDC3E","(*)"],disconnected:["\uDB81\uDC3D","( )"],favorite:["\uEB59","*"],favoriteEmpty:["\uEA6A","+"],bookmark:["\uDB80\uDCC0","*"],bookmarkEmpty:["\uDB80\uDCC3","+"],mcpFavorite:["\uDB80\uDCC0","*"],mcpFavoriteEmpty:["\uDB80\uDCC3","+"],recent:["\uEA82","~"],info:["\uEA74","i"],search:["\uEA6D","/"],update:["\uDB80\uDC5F","^"],up:["\uEAA1","^"],down:["\uEA9A","v"],left:["\uEA9B","<"],right:["\uEA9C",">"],keyEnter:["\uEBEA","enter"],keyTab:["\uDB80\uDF12","tab"],keyEscape:["\uDB84\uDEB7","esc"],keySpace:["\uDB84\uDC50","space"],delete:["\uEA81","del"],priorityMedium:["\uEA71","-"],help:["\uEB32","?"],selectionLeft:["\uE0B6"," "],selectionRight:["\uE0B4"," "],selectionTopLeft:["\uDBFC\uDC04"," "],selectionTopRight:["\uDBFC\uDC05"," "],selectionBottomLeft:["\uDBFC\uDC06"," "],selectionBottomRight:["\uDBFC\uDC07"," "]
499
501
  }
500
502
  function uiIcon(name,style="nerd"){return ICONS[name][style==="text"?1:0]
501
503
  }
@@ -846,6 +848,7 @@ return _el$
846
848
 
847
849
 
848
850
 
851
+
849
852
  function IconControl(props){function mouseOver(event){props.onMouseOver?.()
850
853
  event.stopPropagation()
851
854
  }
@@ -873,7 +876,7 @@ function BookmarkControl(props){const icons=useIcons()
873
876
  return _$createComponent(IconControl,{ref(r$){var _ref$=props.ref
874
877
  typeof _ref$==="function"?_ref$(r$):props.ref=r$
875
878
  },get id(){return props.id
876
- },get icon(){return icons.icon(props.bookmarked?"bookmark":"bookmarkEmpty")
879
+ },get icon(){return _$memo(()=>props.visible?.()===false)()?" ":icons.icon(props.bookmarked?"bookmark":"bookmarkEmpty")
877
880
  },get backgroundColor(){return props.backgroundColor
878
881
  },get foregroundColor(){return props.foregroundColor
879
882
  },get onMouseOver(){return props.onMouseOver
@@ -914,13 +917,13 @@ return _el$
914
917
 
915
918
 
916
919
 
917
- function PresetMenu(props){const icons=useIcons()
920
+ function SelectionMenu(props){const icons=useIcons()
918
921
  const dialogs=useDialogs(props.api)
919
922
  const scroll=useDialogScroll()
920
923
  const [active,setActive]=useDialogState("selection",0)
921
924
  const theme=()=>props.api.theme.current
922
925
  let body
923
- const prefix=`${PLUGIN_ID}.mcp-preset-menu`
926
+ const prefix=`${PLUGIN_ID}.selection-menu`
924
927
  createEffect3(()=>{if(active()>=props.options.length)
925
928
  setActive(Math.max(0,props.options.length-1))
926
929
  })
@@ -1015,6 +1018,19 @@ return _el$7
1015
1018
  }
1016
1019
 
1017
1020
 
1021
+ function GuardedConfirmation(props){const dialogs=useDialogs(props.api)
1022
+ createEffect4(()=>{if(!props.current())
1023
+ dialogs.close()
1024
+ })
1025
+ return _$createComponent(props.api.ui.DialogConfirm,{get title(){return props.title
1026
+ },get message(){return props.message
1027
+ },onConfirm:()=>{if(props.current())
1028
+ props.onConfirm()
1029
+ },get onCancel(){return dialogs.back
1030
+ }})
1031
+ }
1032
+
1033
+
1018
1034
 
1019
1035
 
1020
1036
 
@@ -1060,7 +1076,7 @@ return _p$
1060
1076
  return _el$
1061
1077
  }}))
1062
1078
  }
1063
- function McpErrorDialog(props){return _$createComponent(PresetMenu,{get api(){return props.api
1079
+ function McpErrorDialog(props){return _$createComponent(SelectionMenu,{get api(){return props.api
1064
1080
  },get title(){return `MCP error \xB7 ${props.name}`
1065
1081
  },height:12,get options(){return [{title:`Status \xB7 ${props.status}`,value:"error",description:props.error,icon:"error"
1066
1082
  }]
@@ -1221,6 +1237,11 @@ return server.trim()&&group?[[server,group]]:[]
1221
1237
  }))
1222
1238
  }
1223
1239
  var parseSkillGroups=parseMcpServerGroups
1240
+ var parseCodexAccountBindings=parseMcpServerGroups
1241
+ function parsePendingResetAttempt(value){const input=record(value)
1242
+ if(!input||typeof input.providerID!=="string"||typeof input.modelID!=="string"||typeof input.accountID!=="string"||typeof input.idempotencyKey!=="string"||!/^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/iu.test(input.idempotencyKey)||typeof input.createdAt!=="number"||!Number.isFinite(input.createdAt)||input.creditID!==undefined&&typeof input.creditID!=="string")
1243
+ return
1244
+ return{providerID:input.providerID,modelID:input.modelID,accountID:input.accountID,idempotencyKey:input.idempotencyKey,createdAt:input.createdAt,...input.creditID&&{creditID:input.creditID}}}
1224
1245
  function parseWorkspaceProfiles(value){return Object.fromEntries(Object.entries(record(value)??{}).flatMap(([layout,rawMcp])=>{const layoutName=layout.trim().slice(0,64)
1225
1246
  const mcpName=typeof rawMcp==="string"?rawMcp.trim().slice(0,64):""
1226
1247
  return layoutName&&mcpName?[[layoutName,mcpName]]:[]
@@ -1255,11 +1276,13 @@ const recentSkills=parseRecentSkills(userInput?.recentSkills)
1255
1276
  const recentQuickActions=parseRecentQuickActions(userInput?.recentQuickActions)
1256
1277
  const mcpServerGroups=parseMcpServerGroups(userInput?.mcpServerGroups)
1257
1278
  const skillGroups=parseSkillGroups(userInput?.skillGroups)
1279
+ const codexAccountBindings=parseCodexAccountBindings(userInput?.codexAccountBindings)
1280
+ const pendingResetAttempt=parsePendingResetAttempt(userInput?.pendingResetAttempt)
1258
1281
  const workspaceProfiles=parseWorkspaceProfiles(userInput?.workspaceProfiles)
1259
1282
  return{global:{...Object.keys(behavior).length>0&&{behavior},...layout&&{layout},...Object.keys(globalMcp).length>0&&{mcp:globalMcp}},worktrees,user:{...skippedSkillConfirmations&&{skippedSkillConfirmations},...typeof userInput?.onboardingCompleted==="boolean"&&{onboardingCompleted:userInput.onboardingCompleted
1260
1283
  },...typeof userInput?.lastNavigatorVersion==="string"&&{lastNavigatorVersion:userInput.lastNavigatorVersion
1261
1284
  },...typeof userInput?.previousNavigatorVersion==="string"&&{previousNavigatorVersion:userInput.previousNavigatorVersion
1262
- },...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},...typeof userInput?.autoApprovePermissions==="boolean"&&{autoApprovePermissions:userInput.autoApprovePermissions
1285
+ },...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
1263
1286
  },...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles}}}}
1264
1287
  function parseValues(value){if(!value)
1265
1288
  return{}
@@ -1407,6 +1430,15 @@ const recentSkills=parseRecentSkills([...update.user?.recentSkill?[update.user.r
1407
1430
  const recentQuickActions=parseRecentQuickActions([...update.user?.recentQuickAction?[update.user.recentQuickAction]:[],...current.user.recentQuickActions??[]])
1408
1431
  const mcpServerGroups=assignGroup(current.user.mcpServerGroups,update.user?.mcpServerGroup?.name,update.user?.mcpServerGroup?.group)
1409
1432
  const skillGroups=assignGroup(current.user.skillGroups,update.user?.skillGroup?.location,update.user?.skillGroup?.group)
1433
+ const binding=update.user?.codexAccountBinding
1434
+ const codexAccountBindings=assignGroup(current.user.codexAccountBindings,binding?.providerID&&binding.modelID?JSON.stringify([binding.providerID,binding.modelID]):undefined,binding?.accountID)
1435
+ const pendingUpdate=update.user?.pendingResetAttempt
1436
+ const currentAttempt=current.user.pendingResetAttempt
1437
+ if(pendingUpdate&&currentAttempt&&currentAttempt.idempotencyKey!==pendingUpdate.idempotencyKey){throw new Error("Another reset attempt is still unresolved")
1438
+ }
1439
+ if(update.user?.clearPendingResetAttempt&&currentAttempt?.idempotencyKey!==update.user.clearPendingResetAttempt){throw new Error("Reset attempt changed; refresh before retrying")
1440
+ }
1441
+ const pendingResetAttempt=update.user?.clearPendingResetAttempt?undefined:pendingUpdate??currentAttempt
1410
1442
  const favoriteSkills=update.user?.favoriteSkills?parseSkillConfirmations(update.user.favoriteSkills):[...current.user.favoriteSkills??[]]
1411
1443
  const favoriteSkill=update.user?.favoriteSkill
1412
1444
  if(favoriteSkill?.location){const index=favoriteSkills.indexOf(favoriteSkill.location)
@@ -1422,7 +1454,8 @@ return{global:target.kind==="global"?scope:current.global,worktrees,user:{...ski
1422
1454
  },...(update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion)&&{previousNavigatorVersion:update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion
1423
1455
  },...Object.keys(parsedLayoutPresets).length>0&&{layoutPresets:parsedLayoutPresets},...Object.keys(parsedMcpPresets).length>0&&{mcpPresets:parsedMcpPresets},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles:parseWorkspaceProfiles(workspaceProfiles)
1424
1456
  },...favoriteSkills.length>0&&{favoriteSkills},...favoriteMcpServers.size>0&&{favoriteMcpServers:[...favoriteMcpServers].sort()},...favoriteQuickActions.size>0&&{favoriteQuickActions:parseFavoriteQuickActions([...favoriteQuickActions])
1425
- },...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups:parseMcpServerGroups(mcpServerGroups)},...Object.keys(skillGroups).length>0&&{skillGroups:parseSkillGroups(skillGroups)},...typeof (update.user?.autoApprovePermissions??current.user.autoApprovePermissions)==="boolean"&&{autoApprovePermissions:update.user?.autoApprovePermissions??current.user.autoApprovePermissions
1457
+ },...recentSkills.length>0&&{recentSkills},...recentQuickActions.length>0&&{recentQuickActions},...Object.keys(mcpServerGroups).length>0&&{mcpServerGroups:parseMcpServerGroups(mcpServerGroups)},...Object.keys(skillGroups).length>0&&{skillGroups:parseSkillGroups(skillGroups)},...Object.keys(codexAccountBindings).length>0&&{codexAccountBindings:parseCodexAccountBindings(codexAccountBindings)
1458
+ },...pendingResetAttempt&&{pendingResetAttempt},...typeof (update.user?.autoApprovePermissions??current.user.autoApprovePermissions)==="boolean"&&{autoApprovePermissions:update.user?.autoApprovePermissions??current.user.autoApprovePermissions
1426
1459
  }}}}
1427
1460
  function targetForLegacyScope(scope){return scope==="global"?{kind:"global"}:{kind:"worktree",key:scope}}
1428
1461
  function createPreferencesStore(stateDirectory){const directory=join(stateDirectory,LEGACY_PLUGIN_ID)
@@ -1593,6 +1626,8 @@ const [recentQuickActions,setRecentQuickActions]=createSignal4([])
1593
1626
  const [mcpServerGroups,setMcpServerGroups]=createSignal4(configured.mcpServerGroups??{})
1594
1627
  const [skillGroups,setSkillGroups]=createSignal4({})
1595
1628
  const [autoApprovePermissions,setAutoApprovePermissions]=createSignal4()
1629
+ const [codexAccountBindings,setCodexAccountBindings]=createSignal4({})
1630
+ const [pendingResetAttempt,setPendingResetAttempt]=createSignal4()
1596
1631
  const [ready,setReady]=createSignal4(false)
1597
1632
  const [revision,setRevision]=createSignal4(0)
1598
1633
  const sessionLayouts=new Map
@@ -1662,6 +1697,8 @@ setRecentQuickActions(value.user.recentQuickActions??[])
1662
1697
  setMcpServerGroups({...configured.mcpServerGroups,...value.user.mcpServerGroups})
1663
1698
  setSkillGroups(value.user.skillGroups??{})
1664
1699
  setAutoApprovePermissions(value.user.autoApprovePermissions)
1700
+ setCodexAccountBindings(value.user.codexAccountBindings??{})
1701
+ setPendingResetAttempt(value.user.pendingResetAttempt)
1665
1702
  setReady(true)
1666
1703
  refreshResolved()
1667
1704
  }
@@ -1782,6 +1819,21 @@ return
1782
1819
  setAutoApprovePermissions(value)
1783
1820
  update({user:{autoApprovePermissions:value}})
1784
1821
  }
1822
+ function changeCodexAccountBinding(providerID,modelID,accountID){if(!isHydrated){load().then(()=>changeCodexAccountBinding(providerID,modelID,accountID))
1823
+ return
1824
+ }
1825
+ if(!providerID||!modelID)
1826
+ return
1827
+ const key=JSON.stringify([providerID,modelID])
1828
+ setCodexAccountBindings((currentBindings)=>{const next={...currentBindings}
1829
+ if(accountID)
1830
+ next[key]=accountID
1831
+ else
1832
+ delete next[key]
1833
+ return next
1834
+ })
1835
+ update({user:{codexAccountBinding:{providerID,modelID,accountID}}})
1836
+ }
1785
1837
  function toggleFavoriteMcpServer(name){if(!isHydrated){load().then(()=>toggleFavoriteMcpServer(name))
1786
1838
  return
1787
1839
  }
@@ -1852,7 +1904,13 @@ throw new Error("MCP preset no longer exists")
1852
1904
  update({user:{workspaceProfile:{layout,mcp}}})
1853
1905
  },favoriteSkills,favoriteMcpServers,favoriteQuickActions,toggleFavoriteMcpServer,toggleFavoriteQuickAction,recentSkills,recentQuickActions,mcpServerGroups,setMcpServerGroup(name,value){setMcpServerGroups(assignGroup(mcpServerGroups(),name,value))
1854
1906
  update({user:{mcpServerGroup:{name,group:value}}})
1855
- },skillGroups,setSkillGroup:changeSkillGroup,autoApprovePermissions,setAutoApprovePermissions:changeAutoApprovePermissions,async recordSkillUse(skill){await load()
1907
+ },skillGroups,setSkillGroup:changeSkillGroup,autoApprovePermissions,setAutoApprovePermissions:changeAutoApprovePermissions,codexAccountForModel:(providerID,modelID)=>codexAccountBindings()[JSON.stringify([providerID,modelID])],setCodexAccountBinding:changeCodexAccountBinding,pendingResetAttempt,async beginResetAttempt(attempt){await load()
1908
+ await store.update({user:{pendingResetAttempt:attempt}})
1909
+ const current=await store.load()
1910
+ setPendingResetAttempt(current.user.pendingResetAttempt)
1911
+ },async finishResetAttempt(idempotencyKey){await store.update({user:{clearPendingResetAttempt:idempotencyKey}})
1912
+ setPendingResetAttempt(undefined)
1913
+ },async recordSkillUse(skill){await load()
1856
1914
  if(!skill.location)
1857
1915
  return
1858
1916
  setRecentSkills(parseRecentSkills([skill.location,...recentSkills()]))
@@ -2642,7 +2700,7 @@ value=`${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, "0")}s`
2642
2700
  return value
2643
2701
  }
2644
2702
  function createSubagentClock(key){const [now,setNow]=createSignal9(Date.now())
2645
- createEffect4(()=>{if(key()===undefined)
2703
+ createEffect5(()=>{if(key()===undefined)
2646
2704
  return
2647
2705
  setNow(Date.now())
2648
2706
  const timer=setInterval(()=>setNow(Date.now()),1000)
@@ -3100,7 +3158,7 @@ unregister()
3100
3158
  onMount(()=>{input?.focus()
3101
3159
  refresh().catch(report)
3102
3160
  })
3103
- createEffect5(()=>{if(!sameContext())
3161
+ createEffect6(()=>{if(!sameContext())
3104
3162
  dialogs.close()
3105
3163
  })
3106
3164
  return{active,activeTab,activate,allErrors,byID,dialogs,errors,icons,loading,matches,prefix,query,queryScope,resultColors,results,selectTab,setBody(node){body=node
@@ -3337,7 +3395,7 @@ timers.add(timer)
3337
3395
  }},{name:`${LEGACY_PLUGIN_ID}.search`,run(){props.api.keymap.dispatchCommand(SEARCH_COMMAND)
3338
3396
  }}]
3339
3397
  })
3340
- createEffect6(()=>{const key=props.preferences.searchKey()
3398
+ createEffect7(()=>{const key=props.preferences.searchKey()
3341
3399
  const remove=props.api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:SEARCH_COMMAND
3342
3400
  }]
3343
3401
  })
@@ -3351,18 +3409,6 @@ clearTimeout(timer)
3351
3409
  return _$createElement("box")
3352
3410
  }
3353
3411
 
3354
- function createLayoutPresetPreview(preferences,name){const scope=preferences.selectedScopeKey()
3355
- const valid=()=>preferences.selectedScopeKey()===scope
3356
- const preset=createMemo2(()=>preferences.layoutPresets()[name])
3357
- const preview=createMemo2(()=>{const value=preset()
3358
- return value?preferences.previewLayoutPreset(value):undefined
3359
- })
3360
- return{valid,preview,scope:preferences.preferenceScopeLabel,blocked:()=>preset()?"":"Preset no longer exists.",apply(){const value=preset()
3361
- if(!valid()||!value)
3362
- return false
3363
- preferences.applyLayoutPreset(value)
3364
- return true
3365
- }}}
3366
3412
  function createMcpPresetPreview(controller,preferences,name){const target=controller.target()
3367
3413
  const valid=()=>{const current=controller.target()
3368
3414
  return current.key===target.key&&current.scope===target.scope
@@ -3408,8 +3454,8 @@ function supportsTitleVisibility(api){return hostCapabilities(api).titleVisibili
3408
3454
  function supportsPermissionMode(api){return hostCapabilities(api).permissionMode!==false
3409
3455
  }
3410
3456
  var ONBOARDING_STEPS=[{title:"A control center that stays compact",summary:"Navigator brings session state, search, and controls into OpenCode's existing sidebar.",icon:"help",features:[{icon:"sections",title:"Progressive disclosure",description:"Expand only the context you need right now."},{icon:"scope",title:"Current context",description:"Follow the active session, workspace, and worktree."},{icon:"actions",title:"Mouse and keyboard",description:"Use the same controls with either input method."}]
3411
- },{title:"Stay oriented while agents work",summary:"Keep current work visible without turning the sidebar into another dashboard.",icon:"todo",features:[{icon:"todo",title:"Todo filters",description:"Separate active, finished, and cancelled work."},{icon:"subagents",title:"Live subagents",description:"See running, retrying, recent, and failed child sessions."
3412
- },{icon:"history",title:"Direct navigation",description:"Open a child session without leaving your workflow."
3457
+ },{title:"Stay oriented while agents work",summary:"Keep current work visible without turning the sidebar into another dashboard.",icon:"todo",features:[{icon:"todo",title:"Todo filters",description:"Separate active, finished, and cancelled work."},{icon:"subagents",title:"Live subagents",description:"See running, retrying, recent, and failed child sessions; open them directly."
3458
+ },{icon:"info",title:"Provider limits",description:"Link a matching Codex account for model quotas and confirmed banked resets."
3413
3459
  }]
3414
3460
  },{title:"Find anything and launch Skills safely",summary:"Search complete source lists without expanding every sidebar section.",icon:"search",features:[{icon:"search",title:"Search Everything",description:"Search Skills, Subagents, MCP, and Actions in shared tabs."
3415
3461
  },{icon:"search",title:"Full source lists",description:"Search beyond sidebar visibility and item limits."},{icon:"skills",title:"Skill confirmation",description:"Review a skill and its source before inserting its command."
@@ -3805,7 +3851,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3805
3851
  }]
3806
3852
  })
3807
3853
  onCleanup9(unregister)
3808
- createEffect7(()=>{if(!props.valid())
3854
+ createEffect8(()=>{if(!props.valid())
3809
3855
  dialogs.close()
3810
3856
  })
3811
3857
  return _$createComponent(DialogSurface,{get api(){return props.api
@@ -3979,55 +4025,6 @@ const description=row.desired?{missing:`Not available in this workspace \xB7 tar
3979
4025
  return{icon:icons.icon("mcp"),title:row.name,description,changed:row.change==="connect"||row.change==="disconnect",skipped:row.change==="missing"||row.change==="unavailable",status:row.change==="connect"||row.change==="disconnect"?"changed":row.change==="missing"||row.change==="unavailable"?"skipped":"unchanged",statusIcon:row.change==="connect"?"connected":row.change==="disconnect"?"disconnected":row.change==="missing"||row.change==="unavailable"?"pending":"done",statusLabel:row.change==="connect"?"CONNECT":row.change==="disconnect"?"DISCONNECT":row.change==="missing"||row.change==="unavailable"?"SKIPPED":"UNCHANGED"
3980
4026
  }}).sort((a,b)=>Number(b.changed)-Number(a.changed)||Number(b.skipped)-Number(a.skipped))
3981
4027
  }
3982
- function LayoutPresetPreview(props){const dialogs=useDialogs(props.api)
3983
- const icons=useIcons()
3984
- const model=createLayoutPresetPreview(props.preferences,props.name)
3985
- const linked=props.preferences.workspaceProfiles?.()[props.name]
3986
- const mcpModel=props.controller&&linked?createMcpPresetPreview(props.controller,props.preferences,linked):undefined
3987
- const rows=createMemo4(()=>model.preview()?.rows.map((row)=>{const changes=[]
3988
- if(row.visibility[0]!==row.visibility[1])
3989
- changes.push(`${row.visibility[0] ? "visible" : "hidden"} -> ${row.visibility[1] ? "visible" : "hidden"}`)
3990
- if(row.expansion[0]!==row.expansion[1])
3991
- changes.push(`${row.expansion[0] ? "expanded" : "collapsed"} -> ${row.expansion[1] ? "expanded" : "collapsed"}`)
3992
- if(row.position[0]!==row.position[1])
3993
- changes.push(`position ${row.position[0]} -> ${row.position[1]}`)
3994
- return{icon:icons.section(row.section),title:`${row.position[1]}. ${SECTION_DEFINITIONS.find((section) => section.name === row.section).label}`,description:changes.join(" \xB7 ")||"No changes",changed:changes.length>0,status:changes.length>0?"changed":"unchanged",statusIcon:changes.length>0?"edit":"done",statusLabel:changes.length>0?"CHANGED":"UNCHANGED"
3995
- }}).sort((a,b)=>Number(b.changed)-Number(a.changed))??[])
3996
- const mcpRows=createMemo4(()=>mcpModel?mcpPreviewRows(mcpModel,icons):[])
3997
- const changed=()=>rows().filter((row)=>row.changed).length
3998
- onMount3(()=>mcpModel?.refresh())
3999
- return _$createComponent(PresetPreviewFrame,{get api(){return props.api
4000
- },get title(){return `${mcpModel ? "Workspace profile" : "Layout preview"}: ${props.name}`
4001
- },get scope(){return mcpModel?`${model.scope()} \xB7 MCP ${mcpModel.scope}`:model.scope()
4002
- },get stats(){return [{icon:"edit",label:`${changed()} layout changed`,tone:"accent"
4003
- },{icon:"done",label:`${rows().length - changed()} layout unchanged`,tone:"muted"
4004
- }]
4005
- },get rowCount(){return rows().length + mcpRows().length
4006
- },valid:()=>model.valid()&&(!mcpModel||mcpModel.valid()),get blocked(){return model.blocked()||mcpModel?.blocked()
4007
- },get onRefresh(){return mcpModel?.refresh
4008
- },notice:mcpModel?"Applies both presets; layout stays session-only.":"Applies layout changes. Save current layout as default to persist them.",onApply:()=>{const request=mcpModel?.apply()
4009
- if(mcpModel&&!request)
4010
- return
4011
- if(!model.apply())
4012
- return
4013
- if(mcpModel)
4014
- dialogs.close()
4015
- else{dialogs.back()
4016
- dialogs.back()
4017
- }
4018
- props.api.ui.toast({variant:"success",title:mcpModel?"Workspace profile":"Layout presets",message:`${props.name} applied to ${model.scope()}`,duration:3000
4019
- })
4020
- if(request)
4021
- reportMcpApplyError(props.api,request)
4022
- },get children(){return [_$createComponent(For8,{get each(){return rows()
4023
- },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4024
- }},row))
4025
- }),_$createComponent(For8,{get each(){return mcpRows()
4026
- },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4027
- }},row))
4028
- })]
4029
- }})
4030
- }
4031
4028
 
4032
4029
 
4033
4030
 
@@ -4057,7 +4054,7 @@ if(renameFrom)
4057
4054
  dialogs.back()
4058
4055
  }})
4059
4056
  }
4060
- function actions(name){dialogs.open(()=>_$createComponent(PresetMenu,{api,title:name,options:[{title:"Preview & apply",value:"apply",description:"review server changes before applying",icon:"info"
4057
+ function actions(name){dialogs.open(()=>_$createComponent(SelectionMenu,{api,title:name,options:[{title:"Preview & apply",value:"apply",description:"review server changes before applying",icon:"info"
4061
4058
  },{title:"Update from current",value:"update",description:"replace the saved states",icon:"save"
4062
4059
  },{title:"Rename",value:"rename",description:"change the preset name",icon:"edit"
4063
4060
  },{title:"Delete",value:"delete",description:"remove this preset",icon:"delete"
@@ -4089,7 +4086,7 @@ notify(`Deleted ${name}`)
4089
4086
  dialogs.back()
4090
4087
  }}))
4091
4088
  }
4092
- dialogs.open(()=>_$createComponent(PresetMenu,{api,title:"MCP presets",get options(){return [{title:"Save current",value:"save",description:"Create a preset from the current server states",icon:"save"
4089
+ dialogs.open(()=>_$createComponent(SelectionMenu,{api,title:"MCP presets",get options(){return [{title:"Save current",value:"save",description:"Create a preset from the current server states",icon:"save"
4093
4090
  },...Object.entries(preferences.mcpPresets()).map(([name,states])=>({title:name,value:`preset:${name}`,icon:"presets",description:`${Object.values(states).filter((state) => state === "enabled").length}/${Object.keys(states).length} enabled`
4094
4091
  }))]
4095
4092
  },onSelect:(option)=>option.value==="save"?prompt():actions(option.value.slice("preset:".length))
@@ -4122,61 +4119,6 @@ dialogs.open(()=>_$createComponent(PresetMenu,{api,title:"MCP presets",get optio
4122
4119
 
4123
4120
 
4124
4121
 
4125
-
4126
-
4127
-
4128
-
4129
-
4130
-
4131
- function createLayoutPresetActions(input){function prompt(value="",renameFrom){input.dialogs.prompt({title:renameFrom?"Rename layout preset":"Save layout preset",description:()=>(()=>{var _el$=_$createElement("text")
4132
- _$insertNode(_el$,_$createTextNode(`Save the current visible, expanded, and ordered sections.`))
4133
- _$effect((_$p)=>_$setProp(_el$,"fg",input.api.theme.current.textMuted,_$p))
4134
- return _el$
4135
- })(),placeholder:"Preset name",value,onConfirm(nameInput){const name=renameFrom?input.preferences.renameLayoutPreset(renameFrom,nameInput):input.preferences.saveLayoutPreset(nameInput)
4136
- input.dialogs.back()
4137
- if(renameFrom)
4138
- input.dialogs.back()
4139
- input.api.ui.toast({variant:"success",title:"Layout presets",message:renameFrom?`Renamed to ${name}`:`Saved ${name}`,duration:3000
4140
- })
4141
- }})
4142
- }
4143
- function open(name){const linked=input.preferences.workspaceProfiles?.()[name]
4144
- const link=()=>input.dialogs.prompt({title:`Link MCP \xB7 ${name}`,placeholder:"Preset; empty unlinks",value:linked??"",onConfirm(value){input.preferences.linkWorkspaceProfile?.(name,value.trim()||undefined)
4145
- input.dialogs.back()
4146
- input.dialogs.back()
4147
- }})
4148
- input.dialogs.open(()=>_$createComponent(PresetMenu,{get api(){return input.api
4149
- },title:name,get options(){return [{title:"Preview & apply",value:"apply",icon:"info",description:linked?`profile \xB7 ${linked}`:"review layout changes"
4150
- },{title:"Update from current",value:"update",icon:"save",description:"replace saved layout"
4151
- },{title:"Rename\u2026",value:"rename",description:"change preset name",icon:"edit"
4152
- },...input.mcp?[{title:linked?"Change MCP link\u2026":"Link MCP preset\u2026",value:"link",icon:"mcp",description:linked?`${linked} \xB7 empty unlinks`:"pair layout and MCP"
4153
- }]:[],{title:"Delete",value:"delete",description:"remove preset",icon:"delete"
4154
- }]
4155
- },onSelect:(option)=>{switch(option.value){case "apply":{input.dialogs.open(()=>_$createComponent(LayoutPresetPreview,{get api(){return input.api
4156
- },get preferences(){return input.preferences
4157
- },get controller(){return input.mcp
4158
- },name
4159
- }),"large")
4160
- break
4161
- }
4162
- case "update":{input.preferences.updateLayoutPreset(name)
4163
- input.dialogs.back()
4164
- input.api.ui.toast({variant:"success",title:"Layout presets",message:`Updated ${name}`,duration:3000
4165
- })
4166
- break
4167
- }
4168
- case "rename":{prompt(name,name)
4169
- break
4170
- }
4171
- case "link":{link()
4172
- break
4173
- }
4174
- default:{input.preferences.deleteLayoutPreset(name)
4175
- input.dialogs.back()
4176
- }}}}))
4177
- }
4178
- return{open,prompt
4179
- }}
4180
4122
 
4181
4123
  function titleVisibilityOptions(api,preferences,icons){if(!supportsTitleVisibility(api))
4182
4124
  return []
@@ -4245,25 +4187,6 @@ input.openLimitPrompt(section)
4245
4187
 
4246
4188
 
4247
4189
 
4248
-
4249
-
4250
- var RESET_ALL="__reset_all__"
4251
- function TrustedSkillsDialog(props){const options=createMemo8(()=>{const locations=props.preferences.trustedSkillLocations()
4252
- if(locations.length===0)
4253
- return [{title:"Every skill requires confirmation",value:"empty",description:"No trusted skills",icon:"info"
4254
- }]
4255
- return [{title:"Require confirmation for all",value:RESET_ALL,description:`Revoke trust for ${locations.length} skill${locations.length === 1 ? "" : "s"}`,icon:"reset"
4256
- },...locations.map((location)=>({title:location.split("/").at(-2)??location,value:location,description:location,icon:"checked"
4257
- }))]
4258
- })
4259
- return _$createComponent(PresetMenu,{get api(){return props.api
4260
- },title:"Trusted skills",get options(){return options()
4261
- },onSelect:(option)=>{if(option.value===RESET_ALL)
4262
- props.preferences.resetSkillConfirmations()
4263
- else if(option.value!=="empty")
4264
- props.preferences.revokeSkillConfirmation(option.value)
4265
- }})
4266
- }
4267
4190
  function createSettingsSelection(input){const dialogClosed=()=>("open" in input.api.ui.dialog)&&!input.api.ui.dialog.open
4268
4191
  function openLimitPrompt(section){const index=input.options().findIndex((option)=>option.value===section)
4269
4192
  if(index!==-1)
@@ -4299,36 +4222,11 @@ function exportSettings(){const copied=input.api.renderer.copyToClipboardOSC52(i
4299
4222
  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
4300
4223
  })
4301
4224
  }
4302
- function importSettings(){input.dialogs.prompt({title:"Import portable settings",description:()=>(()=>{var _el$5=_$createElement("text")
4303
- _$insertNode(_el$5,_$createTextNode(`Paste versioned Navigator JSON.`))
4304
- _$effect((_$p)=>_$setProp(_el$5,"fg",input.api.theme.current.textMuted,_$p))
4305
- return _el$5
4306
- })(),onConfirm(source){const preview=input.preferences.previewPortableSettings(source)
4307
- const options=[...preview.settings.layout?[{title:`Layout \xB7 ${preview.layoutChanged ? "CHANGED" : "UNCHANGED"}`,value:"status",description:`${Object.keys(preview.settings.layout.sections).length} visibility \xB7 ${Object.keys(preview.settings.layout.expanded).length} expansion values`,icon:preview.layoutChanged?"edit":"done"
4308
- }]:[],...preview.settings.mcp?[{title:`MCP \xB7 ${preview.mcpChanged ? "CHANGED" : "UNCHANGED"}`,value:"status",description:`${Object.keys(preview.settings.mcp).length} remembered server states`,icon:preview.mcpChanged?"edit":"done"
4309
- }]:[],...preview.unsupported.map((path)=>({title:"Unsupported field \xB7 SKIPPED",value:"status",description:path,icon:"error"
4310
- })),...preview.layoutChanged||preview.mcpChanged?[{title:"Apply imported settings",value:"apply",description:preview.target,icon:"done"
4311
- }]:[],{title:"Cancel",value:"cancel",description:"return without changes",icon:"close"
4312
- }]
4313
- let applying=false
4314
- async function apply(){applying=true
4315
- try{await input.preferences.applyPortableSettings(preview)
4316
- input.api.ui.toast({variant:"success",title:"Portable settings",message:"Layout and MCP settings imported",duration:3000
4317
- })
4318
- input.dialogs.back()
4319
- } catch(error){applying=false
4320
- input.api.ui.toast({variant:"error",title:"Portable settings",message:error instanceof Error?error.message:"Could not import settings",duration:5000
4321
- })
4322
- }}
4323
- input.dialogs.replace(()=>_$createComponent(PresetMenu,{get api(){return input.api
4324
- },title:"Settings import preview",options,get height(){return Math.min(options.length*3,18)
4325
- },onSelect:(option)=>{if(option.value==="cancel")
4326
- input.dialogs.back()
4327
- if(option.value!=="apply"||applying)
4328
- return
4329
- apply()
4330
- }}))
4331
- }})
4225
+ function importSettings(){const path=import.meta.url.includes("/dist/tui.js")?"./settings-import.js":"../ui/settings-import-dialog"
4226
+ import(path).then((module)=>{if(!dialogClosed())
4227
+ module.openSettingsImport(input)
4228
+ }).catch((error)=>input.api.ui.toast({variant:"error",title:"Portable settings",message:String(error)
4229
+ }))
4332
4230
  }
4333
4231
  function select(value=input.options()[input.active()]?.value){if(!value)
4334
4232
  return
@@ -4399,9 +4297,16 @@ break
4399
4297
  case "reset_mcp":{input.preferences.resetMcpStates()
4400
4298
  break
4401
4299
  }
4402
- case "trusted_skills":{input.dialogs.open(()=>_$createComponent(TrustedSkillsDialog,{get api(){return input.api
4300
+ case "trusted_skills":{const path=import.meta.url.includes("/dist/tui.js")?"./trusted-skills.js":"../ui/trusted-skills-dialog"
4301
+ import(path).then((module)=>{if(dialogClosed())
4302
+ return
4303
+ const{TrustedSkillsDialog
4304
+ }=module
4305
+ input.dialogs.open(()=>_$createComponent(TrustedSkillsDialog,{get api(){return input.api
4403
4306
  },get preferences(){return input.preferences
4404
4307
  }}))
4308
+ }).catch((error)=>input.api.ui.toast({variant:"error",title:"Trusted skills",message:String(error)
4309
+ }))
4405
4310
  break
4406
4311
  }
4407
4312
  case "wizard":{input.dialogs.open(()=>_$createComponent(FirstRunWizard,{get api(){return input.api
@@ -4464,19 +4369,19 @@ const icons=useIcons()
4464
4369
  const dialogs=useDialogs(props.api)
4465
4370
  const scroll=useDialogScroll()
4466
4371
  const dimensions=useTerminalDimensions6()
4467
- const bodyHeight=createMemo9(()=>Math.max(4,Math.floor(dimensions().height*0.75)-10))
4372
+ const bodyHeight=createMemo8(()=>Math.max(4,Math.floor(dimensions().height*0.75)-10))
4468
4373
  const orderedGroups=createSettingsGroups(props.api,props.preferences,icons)
4469
4374
  const initialGroup=orderedGroups().find((group)=>group.options.some((option)=>option.value===props.activeValue))
4470
4375
  const [activeGroup,setActiveGroup]=useDialogState("tab",initialGroup?.id??orderedGroups()[0].id)
4471
- const options=createMemo9(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
4376
+ const options=createMemo8(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
4472
4377
  const optionId=(value)=>`${PLUGIN_ID}.settings.${value}`
4473
4378
  const initialActive=options().findIndex((option)=>option.value===props.activeValue)
4474
4379
  const [active,setActive]=useDialogState("selection",Math.max(0,initialActive))
4475
- createEffect10(()=>{if(active()>=options().length)
4380
+ createEffect11(()=>{if(active()>=options().length)
4476
4381
  setActive(Math.max(0,options().length-1))
4477
4382
  })
4478
- const contentHeight=createMemo9(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
4479
- const footerHint=createMemo9(()=>{const common=`${icons.key("tab")} switch \xB7 ${icons.key("up/down")} navigate`
4383
+ const contentHeight=createMemo8(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
4384
+ const footerHint=createMemo8(()=>{const common=`${icons.key("tab")} switch \xB7 ${icons.key("up/down")} navigate`
4480
4385
  if(activeGroup()==="sections")
4481
4386
  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`
4482
4387
  if(activeGroup()==="presets")
@@ -4517,9 +4422,20 @@ setActive(next)
4517
4422
  body?.scrollChildIntoView(optionId(value))
4518
4423
  })
4519
4424
  }
4520
- const presetActions=createLayoutPresetActions({api:props.api,preferences:props.preferences,mcp:props.mcp,dialogs
4425
+ function runPresetAction(action,name){const path=import.meta.url.includes("/dist/tui.js")?"./layout-preset-actions.js":"./layout-preset-actions"
4426
+ import(path).then((module)=>{if("open" in props.api.ui.dialog&&!props.api.ui.dialog.open)
4427
+ return
4428
+ const factory=module.createLayoutPresetActions
4429
+ const actions=factory({api:props.api,preferences:props.preferences,mcp:props.mcp,dialogs
4521
4430
  })
4522
- const selection=createSettingsSelection({api:props.api,preferences:props.preferences,mcp:props.mcp,skills:props.skills,dialogs,options,active,setActive,openPreset:presetActions.open,promptPreset:presetActions.prompt
4431
+ if(action==="open"&&name)
4432
+ actions.open(name)
4433
+ else
4434
+ actions.prompt()
4435
+ }).catch((error)=>props.api.ui.toast({variant:"error",title:"Layout presets",message:String(error)
4436
+ }))
4437
+ }
4438
+ 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")
4523
4439
  })
4524
4440
  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
4525
4441
  })
@@ -4714,7 +4630,7 @@ return title.startsWith("Enable auto-approve permissions")?false:undefined
4714
4630
  }
4715
4631
  function PermissionModeBinding(props){let applying=false
4716
4632
  let observed
4717
- createEffect11(()=>{if(!props.preferences.ready())
4633
+ createEffect12(()=>{if(!props.preferences.ready())
4718
4634
  return
4719
4635
  const preferred=props.preferences.autoApprovePermissions()
4720
4636
  const current=currentPermissionMode(props.api)
@@ -4750,6 +4666,8 @@ return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon
4750
4666
  },onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),onMouseUp:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
4751
4667
  })
4752
4668
  }
4669
+
4670
+
4753
4671
  import {realpathSync} from "fs"
4754
4672
  function routeKey(api){const route=api.route.current
4755
4673
  return `${route.name}:${"params" in route ? route.params?.sessionID ?? "" : ""}`
@@ -4813,7 +4731,7 @@ queueMicrotask(()=>void props.controller.start())
4813
4731
  })
4814
4732
  onCleanup14(unregister)
4815
4733
  } else
4816
- createEffect12(()=>{if(!props.controller.enabled())
4734
+ createEffect13(()=>{if(!props.controller.enabled())
4817
4735
  return
4818
4736
  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()
4819
4737
  }]
@@ -5111,7 +5029,7 @@ return !needle||values.some((value)=>value?.toLocaleLowerCase().includes(needle)
5111
5029
 
5112
5030
  function position(descriptor){return typeof descriptor.position==="function"?descriptor.position():descriptor.position
5113
5031
  }
5114
- var SECTION_COMMANDS=[{section:"todo",title:"Focus Todo"},{section:"subagents",title:"Focus Subagents"},{section:"skills",title:"Focus Skills"},{section:"quick_actions",title:"Focus Quick Actions"},{section:"lsp",title:"Focus LSP"},{section:"mcp",title:"Focus MCP"}]
5032
+ var SECTION_COMMANDS=[{section:"limits",title:"Focus Limits"},{section:"todo",title:"Focus Todo"},{section:"subagents",title:"Focus Subagents"},{section:"skills",title:"Focus Skills"},{section:"quick_actions",title:"Focus Quick Actions"},{section:"lsp",title:"Focus LSP"},{section:"mcp",title:"Focus MCP"}]
5115
5033
  function belongsTo(renderable,ancestor){if(!renderable||!ancestor)
5116
5034
  return false
5117
5035
  for(let current=renderable;current; current=current.parent){if(current===ancestor)
@@ -5550,7 +5468,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`sect
5550
5468
  const action=props.headerAction?useSidebarItem(props.api,props.interaction,{id:props.headerAction.id,position:()=>({section:props.navigationSection??0,row:0,column:1
5551
5469
  }),disabled:props.headerAction.disabled,activate:props.headerAction.onActivate
5552
5470
  },()=>theme().accent,"control"):undefined
5553
- createEffect13(()=>{props.headerAction?.label()
5471
+ createEffect14(()=>{props.headerAction?.label()
5554
5472
  setActionWidth(undefined)
5555
5473
  })
5556
5474
  const actionLabel=()=>{const label=props.headerAction?.label()??""
@@ -5808,7 +5726,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>prop
5808
5726
  })
5809
5727
  return _$createComponent(SelectionBox,{ref:(node)=>item.ref(node),get id(){return id()
5810
5728
  },height:1,get marginTop(){return props.marginTop
5811
- },flexDirection:"row",justifyContent:"space-between",gap:1,get backgroundColor(){return item.backgroundColor()
5729
+ },flexDirection:"row",justifyContent:"space-between",gap:1,paddingRight:1,get backgroundColor(){return item.backgroundColor()
5812
5730
  },get onMouseOver(){return item.onMouseOver
5813
5731
  },get onMouseOut(){return item.onMouseOut
5814
5732
  },onMouseUp:(event)=>{event.stopPropagation()
@@ -5905,25 +5823,70 @@ return _el$8
5905
5823
  return _el$5
5906
5824
  })()
5907
5825
  }
5908
- function McpRow(props){const icons=useIcons()
5909
- const dialogs=useDialogs(props.api)
5910
- const theme=()=>props.api.theme.current
5826
+
5827
+
5828
+
5829
+ function createSidebarBookmark(input){const{api,interaction,row,position,favorite,disabled,onToggle
5830
+ }=input
5831
+ const id=`${input.id}.favorite`
5832
+ const [rowHovered,setRowHovered]=createSignal23(false)
5833
+ const [controlHovered,setControlHovered]=createSignal23(false)
5834
+ const control=useSidebarItem(api,interaction,{id,position:()=>({...position(),column:0
5835
+ }),disabled,activate:()=>{onToggle()
5836
+ queueMicrotask(()=>interaction?.select(id))
5837
+ }},()=>api.theme.current.warning,"control")
5838
+ const visible=()=>favorite()||row.focused()||control.focused()||rowHovered()||controlHovered()
5839
+ return{onRowOver:()=>{row.onMouseOver()
5840
+ setRowHovered(true)
5841
+ },onRowOut:()=>{row.onMouseOut()
5842
+ setRowHovered(false)
5843
+ },render:()=>_$createComponent(BookmarkControl,{ref:(node)=>control.ref(node),id,get bookmarked(){return favorite()
5844
+ },visible,get backgroundColor(){return _$memo(()=>control.backgroundColor()==="transparent")()?row.backgroundColor():control.backgroundColor()
5845
+ },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():control.foregroundColor()
5846
+ },onMouseOver:()=>{control.onMouseOver()
5847
+ setControlHovered(true)
5848
+ },onMouseOut:()=>{control.onMouseOut()
5849
+ setControlHovered(false)
5850
+ },onMouseUp:(event)=>control.activate(event)
5851
+ })
5852
+ }}
5853
+
5854
+
5855
+
5856
+
5857
+
5858
+
5859
+ var Context=createContext3()
5860
+ function useSidebarList(){const value=useContext3(Context)
5861
+ if(!value)
5862
+ throw new Error("No sidebar list")
5863
+ return value
5864
+ }
5865
+ function SidebarRowList(props){return _$createComponent(Context.Provider,{get value(){return{api:props.api,interaction:props.interaction,grouped:props.grouped??(()=>false)
5866
+ }},get children(){var _el$=_$createElement("box")
5867
+ _$insert(_el$,()=>props.children)
5868
+ _$effect((_$p)=>_$setProp(_el$,"gap",props.density==="comfortable"?1:0,_$p))
5869
+ return _el$
5870
+ }})
5871
+ }
5872
+ function McpRow(props){const{api,interaction,grouped
5873
+ }=useSidebarList()
5874
+ const icons=useIcons()
5875
+ const dialogs=useDialogs(api)
5876
+ const theme=()=>api.theme.current
5911
5877
  const busy=()=>props.state.status==="loading"||props.state.status==="refreshing"
5912
5878
  const error=()=>props.state.error
5913
5879
  const disabled=()=>props.disabled||busy()
5914
5880
  const id=()=>`${PLUGIN_ID}.mcp.${props.item.name}`
5915
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>({...props.position,column:0
5881
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
5916
5882
  }),disabled,activate:props.onToggle
5917
5883
  })
5918
- const bookmark=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:2
5919
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
5920
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
5921
- }},()=>theme().warning,"control")
5922
- const info=useSidebarItem(props.api,props.interaction,{id:`${id()}.info`,position:()=>({...props.position,column:1
5884
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
5885
+ })
5886
+ const info=useSidebarItem(api,interaction,{id:`${id()}.info`,position:()=>({...props.position,column:2
5923
5887
  }),activate:()=>{if(!props.item.error)
5924
5888
  return
5925
- dialogs.open(()=>_$createComponent(McpErrorDialog,{get api(){return props.api
5926
- },get name(){return props.item.name
5889
+ dialogs.open(()=>_$createComponent(McpErrorDialog,{api,get name(){return props.item.name
5927
5890
  },get status(){return props.item.status
5928
5891
  },get error(){return props.item.error
5929
5892
  }}),"medium")
@@ -5931,12 +5894,14 @@ dialogs.open(()=>_$createComponent(McpErrorDialog,{get api(){return props.api
5931
5894
  const nestedBackground=(background)=>background==="transparent"?row.backgroundColor():background
5932
5895
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
5933
5896
  },get backgroundColor(){return row.backgroundColor()
5934
- },paddingLeft:1,paddingRight:1,get paddingTop(){return error()?1:0
5897
+ },get paddingLeft(){return grouped()?0:1
5898
+ },paddingRight:1,contentGap:0,get paddingTop(){return error()?1:0
5935
5899
  },get paddingBottom(){return error()?1:0
5936
5900
  },get marginTop(){return props.separator?1:0
5937
- },get onMouseOver(){return row.onMouseOver
5938
- },get onMouseOut(){return row.onMouseOut
5939
- },onMouseDown:(event)=>row.activate(event),get content(){return(()=>{var _el$=_$createElement("text")
5901
+ },get onMouseOver(){return bookmark.onRowOver
5902
+ },get onMouseOut(){return bookmark.onRowOut
5903
+ },onMouseDown:(event)=>row.activate(event),get leading(){return bookmark.render()
5904
+ },get content(){return(()=>{var _el$=_$createElement("text")
5940
5905
  _$setProp(_el$,"flexGrow",1)
5941
5906
  _$setProp(_el$,"wrapMode","none")
5942
5907
  _$insert(_el$,()=>props.item.name)
@@ -5948,8 +5913,6 @@ _$insertNode(_el$2,_el$3)
5948
5913
  _$setProp(_el$2,"flexDirection","row")
5949
5914
  _$setProp(_el$2,"flexShrink",0)
5950
5915
  _$setProp(_el$2,"gap",1)
5951
- _$insertNode(_el$3,_el$4)
5952
- _$insert(_el$4,()=>icons.icon(mcpToggle(props.item.status,busy())))
5953
5916
  _$insert(_el$2,(()=>{var _c$=_$memo(()=>!!props.item.error)
5954
5917
  return()=>_c$()?_$createComponent(IconControl,{ref:(node)=>info.ref(node),get id(){return `${id()}.info`
5955
5918
  },get icon(){return icons.icon("info")
@@ -5959,21 +5922,13 @@ return()=>_c$()?_$createComponent(IconControl,{ref:(node)=>info.ref(node),get id
5959
5922
  },get onMouseOut(){return info.onMouseOut
5960
5923
  },onMouseUp:(event)=>info.activate(event)
5961
5924
  }):null
5962
- })(),null)
5963
- _$insert(_el$2,_$createComponent(BookmarkControl,{ref:(node)=>bookmark.ref(node),get id(){return `${id()}.favorite`
5964
- },get bookmarked(){return props.favorite
5965
- },get backgroundColor(){return nestedBackground(bookmark.backgroundColor())
5966
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():bookmark.foregroundColor()
5967
- },get onMouseOver(){return bookmark.onMouseOver
5968
- },get onMouseOut(){return bookmark.onMouseOut
5969
- },onMouseUp:(event)=>bookmark.activate(event)
5970
- }),null)
5971
- _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():mcpColor(props.api,props.item.status),_$p))
5925
+ })(),_el$3)
5926
+ _$insertNode(_el$3,_el$4)
5927
+ _$insert(_el$4,()=>icons.icon(mcpToggle(props.item.status,busy())))
5928
+ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():mcpColor(api,props.item.status),_$p))
5972
5929
  return _el$2
5973
5930
  })()
5974
- },get details(){return _$createComponent(RequestErrorRow,{get api(){return props.api
5975
- },get interaction(){return props.interaction
5976
- },get id(){return `${id()}.retry`
5931
+ },get details(){return _$createComponent(RequestErrorRow,{api,interaction,get id(){return `${id()}.retry`
5977
5932
  },get position(){return{...props.position,row:props.position.row + 1,column:0
5978
5933
  }},get state(){return props.state
5979
5934
  },get onRetry(){return props.onRetry
@@ -5991,7 +5946,7 @@ return _el$2
5991
5946
  function SectionFilter(props){const icons=useIcons()
5992
5947
  let input
5993
5948
  let unregisterInput
5994
- const [inputFocused,setInputFocused]=createSignal23(false)
5949
+ const [inputFocused,setInputFocused]=createSignal24(false)
5995
5950
  const theme=()=>props.api.theme.current
5996
5951
  const item=useSidebarItem(props.api,props.interaction,{id:props.id??`filter.${props.placeholder}`,position:()=>props.position??{section:0,row:0,column:0
5997
5952
  },activate:()=>{if(!input)
@@ -6060,16 +6015,6 @@ return _el$3
6060
6015
  }})]
6061
6016
  }})
6062
6017
  }
6063
-
6064
-
6065
-
6066
-
6067
- function SidebarRowList(props){return(()=>{var _el$=_$createElement("box")
6068
- _$insert(_el$,()=>props.children)
6069
- _$effect((_$p)=>_$setProp(_el$,"gap",props.density==="comfortable"?1:0,_$p))
6070
- return _el$
6071
- })()
6072
- }
6073
6018
  function McpSectionContent(props){const model=props.model
6074
6019
  return _$createComponent(SectionRequestBody,{get api(){return props.api
6075
6020
  },get interaction(){return props.interaction
@@ -6095,7 +6040,10 @@ _$insertNode(_el$2,_$createTextNode(`No matching MCP servers`))
6095
6040
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6096
6041
  return _el$2
6097
6042
  })()
6098
- },get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6043
+ },get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6044
+ },get interaction(){return props.interaction
6045
+ },get grouped(){return model.grouped
6046
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6099
6047
  },get children(){return _$createComponent(For13,{get each(){return model.visibility.visible()
6100
6048
  },children:(item,index)=>[_$createComponent(Show14,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6101
6049
  },get children(){return _$createComponent(McpGroupHeader,{get api(){return props.api
@@ -6108,9 +6056,7 @@ return _el$2
6108
6056
  },get position(){return{section:props.navigationSection,row:9 + index()*3,column:0
6109
6057
  }},onToggle:()=>void props.controller.toggleGroup(item.bucket,model.groupNames(item.bucket),model.target())
6110
6058
  })
6111
- }}),_$createComponent(McpRow,{get api(){return props.api
6112
- },get interaction(){return props.interaction
6113
- },item,get position(){return{section:props.navigationSection,row:10 + index()*3,column:0
6059
+ }}),_$createComponent(McpRow,{item,get position(){return{section:props.navigationSection,row:10 + index()*3,column:0
6114
6060
  }},get state(){return props.controller.serverState(item.name,model.target())
6115
6061
  },get disabled(){return model.bulkRunning()
6116
6062
  },onToggle:()=>void props.controller.toggle(item.name).catch(()=>{}),onRetry:()=>void props.controller.retryServer(item.name,model.target())?.catch(()=>{}),get favorite(){return model.favorites().has(item.name)
@@ -6130,7 +6076,7 @@ return _el$
6130
6076
  }})
6131
6077
  }
6132
6078
  function McpSection(props){const icons=useIcons()
6133
- const [query,setQuery]=createSignal24("")
6079
+ const [query,setQuery]=createSignal25("")
6134
6080
  const model=createMcpSectionModel(props,query)
6135
6081
  const navigationSection=()=>props.navigationSection??6
6136
6082
  const summary=createMemo13(()=>`${model.active()}/${model.list().length}${model.errors() ? ` \xB7 ${model.errors()} ${icons.icon("error")}` : ""}`)
@@ -6165,48 +6111,79 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6165
6111
 
6166
6112
 
6167
6113
 
6168
- function QuickActionRow(props){const icons=useIcons()
6169
- const theme=()=>props.api.theme.current
6170
- const [width,setWidth]=createSignal25(0)
6171
- const shortcut=createMemo14(()=>{const bindings=props.api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6114
+
6115
+
6116
+
6117
+
6118
+
6119
+
6120
+
6121
+
6122
+
6123
+
6124
+
6125
+
6126
+
6127
+
6128
+
6129
+
6130
+
6131
+
6132
+
6133
+
6134
+
6135
+
6136
+
6137
+
6138
+
6139
+
6140
+
6141
+
6142
+
6143
+
6144
+
6145
+
6146
+
6147
+ function QuickActionRow(props){const{api,interaction
6148
+ }=useSidebarList()
6149
+ const icons=useIcons()
6150
+ const theme=()=>api.theme.current
6151
+ const [width,setWidth]=createSignal28(0)
6152
+ const shortcut=createMemo14(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6172
6153
  })
6173
- return props.api.keys.formatBindings(bindings.get(props.action.command))
6154
+ return api.keys.formatBindings(bindings.get(props.action.command))
6174
6155
  })
6175
6156
  const visibleShortcut=createMemo14(()=>{const value=shortcut()
6176
- return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 9?value:undefined
6157
+ return value&&width()>=Bun.stringWidth(props.action.label) + Bun.stringWidth(value) + 8?value:undefined
6177
6158
  })
6178
6159
  function run(){if(props.action.command==="session.new"&&props.onNewSession?.())
6179
6160
  return
6180
- const result=props.interaction?props.interaction.dispatchFromReturnTarget(props.action.command):props.api.keymap.dispatchCommand(props.action.command)
6161
+ const result=interaction?interaction.dispatchFromReturnTarget(props.action.command):api.keymap.dispatchCommand(props.action.command)
6181
6162
  if(result.ok)
6182
6163
  return
6183
- props.api.ui.toast({variant:"warning",title:props.action.label,message:`Command is ${result.reason}`,duration:3000
6164
+ api.ui.toast({variant:"warning",title:props.action.label,message:`Command is ${result.reason}`,duration:3000
6184
6165
  })
6185
6166
  }
6186
6167
  const id=()=>`${PLUGIN_ID}.quick-action.${props.action.command}`
6187
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,activate:run,disabled:()=>Boolean(props.disabled)
6168
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
6169
+ }),activate:run,disabled:()=>Boolean(props.disabled)
6170
+ })
6171
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
6188
6172
  })
6189
- const favorite=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:1
6190
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
6191
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
6192
- }},()=>theme().warning,"control")
6193
- const controlBackground=()=>{const background=favorite.backgroundColor()
6194
- return background==="transparent"?row.backgroundColor():background
6195
- }
6196
6173
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6197
6174
  },paddingLeft:1,paddingRight:1,get marginTop(){return props.separator?1:0
6198
6175
  },onSizeChange:function(){setWidth(this.width)
6199
6176
  },get backgroundColor(){return row.backgroundColor()
6200
- },get onMouseOver(){return row.onMouseOver
6201
- },get onMouseOut(){return row.onMouseOut
6177
+ },get onMouseOver(){return bookmark.onRowOver
6178
+ },get onMouseOut(){return bookmark.onRowOut
6202
6179
  },onMouseUp:(event)=>{event.stopPropagation()
6203
6180
  row.activate(event)
6204
- },get leading(){return(()=>{var _el$=_$createElement("text")
6181
+ },get leading(){return [_$memo(()=>bookmark.render()),(()=>{var _el$=_$createElement("text")
6205
6182
  _$setProp(_el$,"flexShrink",0)
6206
6183
  _$insert(_el$,()=>icons.action(props.action.command))
6207
6184
  _$effect((_$p)=>_$setProp(_el$,"fg",props.disabled?theme().textMuted:row.focused()?row.foregroundColor():theme().accent,_$p))
6208
6185
  return _el$
6209
- })()
6186
+ })()]
6210
6187
  },get content(){return(()=>{var _el$2=_$createElement("text")
6211
6188
  _$setProp(_el$2,"flexGrow",1)
6212
6189
  _$setProp(_el$2,"wrapMode","none")
@@ -6215,7 +6192,7 @@ _$insert(_el$2,()=>props.action.label)
6215
6192
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6216
6193
  return _el$2
6217
6194
  })()
6218
- },get metadata(){return _$createComponent(Show15,{get when(){return visibleShortcut()
6195
+ },get metadata(){return _$createComponent(Show17,{get when(){return visibleShortcut()
6219
6196
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
6220
6197
  _$setProp(_el$3,"flexShrink",0)
6221
6198
  _$setProp(_el$3,"wrapMode","none")
@@ -6224,7 +6201,7 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
6224
6201
  return _el$3
6225
6202
  })()
6226
6203
  })
6227
- },get details(){return _$createComponent(Show15,{get when(){return props.disabled
6204
+ },get details(){return _$createComponent(Show17,{get when(){return props.disabled
6228
6205
  },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6229
6206
  _$setProp(_el$4,"wrapMode","word")
6230
6207
  _$insert(_el$4,reason)
@@ -6232,14 +6209,6 @@ _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():theme()
6232
6209
  return _el$4
6233
6210
  })()
6234
6211
  })
6235
- },get trailing(){return _$createComponent(BookmarkControl,{ref:(node)=>favorite.ref(node),get id(){return `${id()}.favorite`
6236
- },get bookmarked(){return props.favorite
6237
- },get backgroundColor(){return controlBackground()
6238
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():favorite.foregroundColor()
6239
- },get onMouseOver(){return favorite.onMouseOver
6240
- },get onMouseOut(){return favorite.onMouseOut
6241
- },onMouseUp:(event)=>favorite.activate(event)
6242
- })
6243
6212
  }})
6244
6213
  }
6245
6214
  function QuickActionsSection(props){const commandRevision=createQuickActionRevision(props.api)
@@ -6257,16 +6226,16 @@ return _$createComponent(Section,{get api(){return props.api
6257
6226
  },sectionId:`${PLUGIN_ID}.section.quick_actions`,get navigationSection(){return navigationSection()
6258
6227
  },title:"QUICK ACTIONS",section:"quick_actions",get summary(){return String(actions().length)
6259
6228
  },get open(){return props.preferences.expanded().quick_actions
6260
- },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6261
- },get children(){return [_$createComponent(Show16,{get when(){return actions().length===0
6229
+ },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6230
+ },get interaction(){return props.interaction
6231
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6232
+ },get children(){return [_$createComponent(Show18,{get when(){return actions().length===0
6262
6233
  },get children(){var _el$=_$createElement("text")
6263
6234
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6264
6235
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6265
6236
  return _el$
6266
- }}),_$createComponent(For14,{get each(){return visibility.visible()
6267
- },children:(action,index)=>_$createComponent(QuickActionRow,{get api(){return props.api
6268
- },get interaction(){return props.interaction
6269
- },get onNewSession(){return props.onNewSession
6237
+ }}),_$createComponent(For15,{get each(){return visibility.visible()
6238
+ },children:(action,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6270
6239
  },action,get disabled(){return action.disabled
6271
6240
  },get favorite(){return props.preferences.favoriteQuickActions?.().has(action.command)??false
6272
6241
  },get favoriteDisabled(){return _$memo(()=>!!props.preferences.ready)()?!props.preferences.ready():false
@@ -6375,7 +6344,7 @@ unregisterBinding=undefined
6375
6344
  unregisterCommands()
6376
6345
  }}}
6377
6346
  function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
6378
- createEffect14(()=>shortcuts.bind(props.preferences.toggleKey()))
6347
+ createEffect16(()=>shortcuts.bind(props.preferences.toggleKey()))
6379
6348
  onCleanup18(shortcuts.dispose)
6380
6349
  return _$createElement("box")
6381
6350
  }
@@ -6385,7 +6354,7 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6385
6354
  }))]
6386
6355
  })
6387
6356
  onCleanup18(unregisterCommands)
6388
- createEffect14(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6357
+ createEffect16(()=>{const unregister=props.api.keymap.registerLayer({bindings:[{key:props.preferences.focusKey(),cmd:FOCUS_COMMAND
6389
6358
  }]
6390
6359
  })
6391
6360
  onCleanup18(unregister)
@@ -6419,10 +6388,10 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
6419
6388
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
6420
6389
  })
6421
6390
  const state=createMemo16(()=>props.controller.state(target()))
6422
- createEffect15(()=>{const current=target()
6423
- const deactivate=untrack5(()=>props.controller.activate?.(current)??(()=>{}))
6391
+ createEffect17(()=>{const current=target()
6392
+ const deactivate=untrack6(()=>props.controller.activate?.(current)??(()=>{}))
6424
6393
  onCleanup19(deactivate)
6425
- untrack5(()=>void props.controller.refresh(current).catch(()=>{}))
6394
+ untrack6(()=>void props.controller.refresh(current).catch(()=>{}))
6426
6395
  })
6427
6396
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
6428
6397
  if(isInserted)
@@ -6445,49 +6414,36 @@ return{target,recent,grouped,list,filtered,visibility,state,useSkill,skillGroup}
6445
6414
 
6446
6415
 
6447
6416
 
6448
- function SkillRow(props){const icons=useIcons()
6449
- const theme=()=>props.api.theme.current
6417
+ function SkillRow(props){const{api,interaction,grouped
6418
+ }=useSidebarList()
6419
+ const icons=useIcons()
6450
6420
  const id=()=>`${PLUGIN_ID}.skill.${props.item.location || props.item.name}`
6451
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>({...props.position,column:0
6421
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>({...props.position,column:1
6452
6422
  }),activate:props.onUse
6453
6423
  })
6454
- const favorite=useSidebarItem(props.api,props.interaction,{id:`${id()}.favorite`,position:()=>({...props.position,column:1
6455
- }),disabled:()=>props.favoriteDisabled,activate:()=>{props.onToggleFavorite()
6456
- queueMicrotask(()=>props.interaction?.select(`${id()}.favorite`))
6457
- }},()=>theme().warning,"control")
6458
- const controlBackground=()=>{const background=favorite.backgroundColor()
6459
- return background==="transparent"?row.backgroundColor():background
6460
- }
6424
+ const bookmark=createSidebarBookmark({api,interaction,id:id(),position:()=>props.position,row,favorite:()=>props.favorite,disabled:()=>props.favoriteDisabled,onToggle:props.onToggleFavorite
6425
+ })
6461
6426
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6462
- },paddingLeft:1,paddingRight:1,get marginTop(){return props.separator?1:0
6427
+ },get paddingLeft(){return grouped()?0:1
6428
+ },paddingRight:1,contentGap:0,get marginTop(){return props.separator?1:0
6463
6429
  },get backgroundColor(){return row.backgroundColor()
6464
- },get onMouseOver(){return row.onMouseOver
6465
- },get onMouseOut(){return row.onMouseOut
6466
- },onMouseUp:(event)=>row.activate(event),get leading(){return(()=>{var _el$=_$createElement("text")
6467
- _$setProp(_el$,"flexShrink",0)
6468
- _$insert(_el$,()=>icons.icon(props.recent?"recent":"skills"))
6469
- _$effect((_$p)=>_$setProp(_el$,"fg",row.focused()?row.foregroundColor():theme().accent,_$p))
6430
+ },get onMouseOver(){return bookmark.onRowOver
6431
+ },get onMouseOut(){return bookmark.onRowOut
6432
+ },onMouseUp:(event)=>row.activate(event),get leading(){return bookmark.render()
6433
+ },get content(){return(()=>{var _el$=_$createElement("text")
6434
+ _$setProp(_el$,"flexGrow",1)
6435
+ _$setProp(_el$,"wrapMode","word")
6436
+ _$insert(_el$,(()=>{var _c$=_$memo(()=>!!props.recent)
6437
+ return()=>_c$()?`${icons.icon("recent")} `:""
6438
+ })(),null)
6439
+ _$insert(_el$,()=>props.item.name,null)
6440
+ _$effect((_$p)=>_$setProp(_el$,"fg",row.foregroundColor(),_$p))
6470
6441
  return _el$
6471
6442
  })()
6472
- },get content(){return(()=>{var _el$2=_$createElement("text")
6473
- _$setProp(_el$2,"flexGrow",1)
6474
- _$setProp(_el$2,"wrapMode","word")
6475
- _$insert(_el$2,()=>props.item.name)
6476
- _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6477
- return _el$2
6478
- })()
6479
- },get trailing(){return _$createComponent(BookmarkControl,{ref:(node)=>favorite.ref(node),get id(){return `${id()}.favorite`
6480
- },get bookmarked(){return props.favorite
6481
- },get backgroundColor(){return controlBackground()
6482
- },get foregroundColor(){return _$memo(()=>!!row.focused())()?row.foregroundColor():favorite.foregroundColor()
6483
- },get onMouseOver(){return favorite.onMouseOver
6484
- },get onMouseOut(){return favorite.onMouseOut
6485
- },onMouseUp:(event)=>favorite.activate(event)
6486
- })
6487
6443
  }})
6488
6444
  }
6489
6445
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6490
- const [query,setQuery]=createSignal26("")
6446
+ const [query,setQuery]=createSignal29("")
6491
6447
  const model=createSkillSectionModel(props,query)
6492
6448
  const navigationSection=()=>props.navigationSection??3
6493
6449
  function selectSkill(item){if(!props.preferences.shouldConfirmSkill(item)){model.useSkill(item)
@@ -6520,15 +6476,18 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6520
6476
  }},get query(){return query()
6521
6477
  },placeholder:"Filter skills...",onInput:setQuery
6522
6478
  }),null)
6523
- _$insert(_el$,_$createComponent(Show17,{get when(){return model.filtered().length>0
6479
+ _$insert(_el$,_$createComponent(Show19,{get when(){return model.filtered().length>0
6524
6480
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6525
6481
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6526
6482
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6527
6483
  return _el$2
6528
6484
  })()
6529
- },get children(){return [_$createComponent(SidebarRowList,{get density(){return props.preferences.rowDensity?.()??"compact"
6530
- },get children(){return _$createComponent(For15,{get each(){return model.visibility.visible()
6531
- },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6485
+ },get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6486
+ },get interaction(){return props.interaction
6487
+ },get grouped(){return model.grouped
6488
+ },get density(){return props.preferences.rowDensity?.()??"compact"
6489
+ },get children(){return _$createComponent(For16,{get each(){return model.visibility.visible()
6490
+ },children:(item,index)=>[_$createComponent(Show19,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
6532
6491
  },get children(){var _el$4=_$createElement("text")
6533
6492
  _$setProp(_el$4,"height",1)
6534
6493
  _$setProp(_el$4,"wrapMode","none")
@@ -6541,9 +6500,7 @@ return _p$
6541
6500
  },{e:undefined,t:undefined
6542
6501
  })
6543
6502
  return _el$4
6544
- }}),_$createComponent(SkillRow,{get api(){return props.api
6545
- },get interaction(){return props.interaction
6546
- },item,get position(){return{section:navigationSection(),row:10 + index()*(model.grouped()?2:1),column:0
6503
+ }}),_$createComponent(SkillRow,{item,get position(){return{section:navigationSection(),row:10 + index()*(model.grouped()?2:1),column:0
6547
6504
  }},onUse:()=>selectSkill(item),get recent(){return model.recent().has(item.location)
6548
6505
  },get favorite(){return props.preferences.isFavoriteSkill?.(item)??false
6549
6506
  },get favoriteDisabled(){return props.preferences.ready?.()===false
@@ -6575,18 +6532,18 @@ return _el$
6575
6532
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6576
6533
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6577
6534
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6578
- const [query,setQuery]=createSignal27("")
6579
- const [mode,setMode]=createSignal27("all")
6535
+ const [query,setQuery]=createSignal30("")
6536
+ const [mode,setMode]=createSignal30("all")
6580
6537
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6581
6538
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6582
6539
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
6583
6540
  const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
6584
6541
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6585
- createEffect16(()=>{targetKey()
6542
+ createEffect18(()=>{targetKey()
6586
6543
  setQuery("")
6587
6544
  setMode("all")
6588
6545
  })
6589
- createEffect16(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6546
+ createEffect18(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6590
6547
  setMode("all")
6591
6548
  })
6592
6549
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
@@ -6596,11 +6553,11 @@ const now=createSubagentClock(clockKey)
6596
6553
  const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
6597
6554
  const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
6598
6555
  const state=createMemo17(()=>props.controller.state(props.sessionID))
6599
- createEffect16(()=>{const sessionID=props.sessionID
6556
+ createEffect18(()=>{const sessionID=props.sessionID
6600
6557
  targetKey()
6601
- const deactivate=untrack6(()=>props.controller.activate?.(sessionID)??(()=>{}))
6558
+ const deactivate=untrack7(()=>props.controller.activate?.(sessionID)??(()=>{}))
6602
6559
  onCleanup20(deactivate)
6603
- untrack6(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6560
+ untrack7(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6604
6561
  })
6605
6562
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
6606
6563
  }}
@@ -6620,18 +6577,20 @@ return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentI
6620
6577
 
6621
6578
 
6622
6579
 
6623
- function SubagentRow(props){const icons=useIcons()
6624
- const theme=()=>props.api.theme.current
6580
+ function SubagentRow(props){const{api,interaction
6581
+ }=useSidebarList()
6582
+ const icons=useIcons()
6583
+ const theme=()=>api.theme.current
6625
6584
  const retrying=()=>props.item.status.type==="retry"
6626
6585
  const idle=()=>props.item.status.type==="idle"
6627
6586
  const failed=()=>props.item.run?.outcome==="error"
6628
6587
  const cancelled=()=>props.item.run?.outcome==="cancelled"
6629
6588
  const id=()=>`${PLUGIN_ID}.subagent.${props.item.session.id}`
6630
- const row=useSidebarItem(props.api,props.interaction,{id:id(),position:()=>props.position,activate:props.onOpen
6589
+ const row=useSidebarItem(api,interaction,{id:id(),position:()=>props.position,activate:props.onOpen
6631
6590
  })
6632
6591
  const leadingColor=()=>row.focused()?row.foregroundColor():failed()?theme().error:retrying()||props.item.unavailable?theme().warning:idle()?theme().textMuted:theme().primary
6633
6592
  return _$createComponent(ListRow,{ref:(node)=>row.ref(node),get id(){return id()
6634
- },paddingLeft:1,paddingRight:1,get backgroundColor(){return row.backgroundColor()
6593
+ },paddingLeft:2,paddingRight:1,get backgroundColor(){return row.backgroundColor()
6635
6594
  },get onMouseOver(){return row.onMouseOver
6636
6595
  },get onMouseOut(){return row.onMouseOut
6637
6596
  },onMouseDown:(event)=>row.activate(event),get leading(){return(()=>{var _el$=_$createElement("text")
@@ -6655,7 +6614,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6655
6614
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6656
6615
  return _el$3
6657
6616
  })()
6658
- },get details(){return [_$createComponent(Show18,{get when(){return props.item.run?.errorMessage
6617
+ },get details(){return [_$createComponent(Show20,{get when(){return props.item.run?.errorMessage
6659
6618
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6660
6619
  _$insertNode(_el$4,_el$5)
6661
6620
  _$setProp(_el$4,"wrapMode","word")
@@ -6663,12 +6622,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6663
6622
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6664
6623
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6665
6624
  return _el$4
6666
- }}),_$createComponent(Show18,{get when(){return props.item.unavailable
6625
+ }}),_$createComponent(Show20,{get when(){return props.item.unavailable
6667
6626
  },get children(){var _el$6=_$createElement("text")
6668
6627
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6669
6628
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6670
6629
  return _el$6
6671
- }}),_$createComponent(Show18,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6630
+ }}),_$createComponent(Show20,{get when(){return _$memo(()=>props.item.status.type==="retry")()?props.item.status:undefined
6672
6631
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6673
6632
  _$insertNode(_el$0,_el$1)
6674
6633
  _$insertNode(_el$0,_el$10)
@@ -6680,7 +6639,7 @@ _$insert(_el$0,()=>status().message,null)
6680
6639
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6681
6640
  return _el$0
6682
6641
  })()
6683
- }),_$createComponent(Show18,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6642
+ }),_$createComponent(Show20,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6684
6643
  },get children(){var _el$8=_$createElement("text")
6685
6644
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6686
6645
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6688,22 +6647,22 @@ return _el$8
6688
6647
  }})]
6689
6648
  }})
6690
6649
  }
6691
- function SubagentList(props){return _$createComponent(SidebarRowList,{get density(){return props.density
6692
- },get children(){return _$createComponent(For16,{get each(){return props.ids
6650
+ function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
6651
+ },get interaction(){return props.interaction
6652
+ },get density(){return props.density
6653
+ },get children(){return _$createComponent(For17,{get each(){return props.ids
6693
6654
  },children:(id,index)=>{const initial=props.itemById(id)
6694
6655
  const item=()=>props.itemById(id)??initial
6695
6656
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6696
6657
  return(()=>{var _el$=_$createElement("box")
6697
- _$insert(_el$,_$createComponent(Show19,{get when(){return startsGroup()
6658
+ _$insert(_el$,_$createComponent(Show21,{get when(){return startsGroup()
6698
6659
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6699
6660
  _$insertNode(_el$2,_el$3)
6700
6661
  _$insert(_el$3,()=>item().group)
6701
6662
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
6702
6663
  return _el$2
6703
6664
  }}),null)
6704
- _$insert(_el$,_$createComponent(SubagentRow,{get api(){return props.api
6705
- },get interaction(){return props.interaction
6706
- },get item(){return item()
6665
+ _$insert(_el$,_$createComponent(SubagentRow,{get item(){return item()
6707
6666
  },get now(){return props.now
6708
6667
  },get position(){return{section:props.navigationSection,row:10 + index(),column:0
6709
6668
  }},onOpen:()=>props.controller.open(id)
@@ -6722,7 +6681,7 @@ return _$createComponent(Section,{get api(){return props.api
6722
6681
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6723
6682
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6724
6683
  },get open(){return props.preferences.expanded().subagents
6725
- },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show20,{get when(){return model.parentID()
6684
+ },onToggle:()=>props.preferences.toggleSectionExpanded("subagents"),get children(){return [_$createComponent(Show22,{get when(){return model.parentID()
6726
6685
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6727
6686
  },get interaction(){return props.interaction
6728
6687
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6745,7 +6704,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6745
6704
  }}),_el$2)
6746
6705
  _$setProp(_el$2,"flexDirection","row")
6747
6706
  _$setProp(_el$2,"flexWrap","wrap")
6748
- _$insert(_el$2,_$createComponent(For17,{get each(){return model.tabs()
6707
+ _$insert(_el$2,_$createComponent(For18,{get each(){return model.tabs()
6749
6708
  },children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6750
6709
  },get interaction(){return props.interaction
6751
6710
  },id:`${PLUGIN_ID}.subagents.filter.${value}`,get position(){return{section:navigationSection(),row:4,column:index()
@@ -6756,7 +6715,7 @@ _$insert(_el$2,_$createComponent(For17,{get each(){return model.tabs()
6756
6715
  },onActivate:()=>model.setMode(value)
6757
6716
  })
6758
6717
  }))
6759
- _$insert(_el$,_$createComponent(Show20,{get when(){return model.filtered().length===0
6718
+ _$insert(_el$,_$createComponent(Show22,{get when(){return model.filtered().length===0
6760
6719
  },get children(){var _el$3=_$createElement("text")
6761
6720
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6762
6721
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6808,8 +6767,10 @@ return _el$
6808
6767
 
6809
6768
 
6810
6769
 
6811
- function TodoRow(props){const icons=useIcons()
6812
- const theme=()=>props.api.theme.current
6770
+ function TodoRow(props){const{api
6771
+ }=useSidebarList()
6772
+ const icons=useIcons()
6773
+ const theme=()=>api.theme.current
6813
6774
  const done=()=>props.item.status==="completed"
6814
6775
  const active=()=>props.item.status==="in_progress"
6815
6776
  const cancelled=()=>props.item.status==="cancelled"
@@ -6832,12 +6793,13 @@ _$insertNode(_el$,_el$2)
6832
6793
  _$insertNode(_el$,_el$3)
6833
6794
  _$setProp(_el$,"flexDirection","row")
6834
6795
  _$setProp(_el$,"gap",1)
6796
+ _$setProp(_el$,"paddingLeft",2)
6835
6797
  _$setProp(_el$2,"flexShrink",0)
6836
6798
  _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":"idle"))
6837
6799
  _$setProp(_el$3,"flexGrow",1)
6838
6800
  _$setProp(_el$3,"wrapMode","word")
6839
6801
  _$insert(_el$3,()=>props.item.content)
6840
- _$insert(_el$,_$createComponent(Show21,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6802
+ _$insert(_el$,_$createComponent(Show23,{get when(){return props.item.priority==="high"||props.item.priority==="medium"||props.item.priority==="low"
6841
6803
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
6842
6804
  _$insertNode(_el$4,_el$5)
6843
6805
  _$setProp(_el$4,"width",2)
@@ -6864,7 +6826,7 @@ _$insertNode(_el$,_el$2)
6864
6826
  _$setProp(_el$,"gap",1)
6865
6827
  _$setProp(_el$2,"flexDirection","row")
6866
6828
  _$setProp(_el$2,"flexWrap","wrap")
6867
- _$insert(_el$2,_$createComponent(For18,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6829
+ _$insert(_el$2,_$createComponent(For19,{each:["all","active","finished"],children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6868
6830
  },get interaction(){return props.interaction
6869
6831
  },id:`${PLUGIN_ID}.todo.filter.${value}`,get position(){return{section:navigationSection(),row:tabsRow(),column:index()
6870
6832
  }},get label(){return value[0].toUpperCase() + value.slice(1)
@@ -6873,23 +6835,24 @@ _$insert(_el$2,_$createComponent(For18,{each:["all","active","finished"],childre
6873
6835
  },onActivate:()=>props.setMode(value)
6874
6836
  })
6875
6837
  }))
6876
- _$insert(_el$,_$createComponent(Show22,{get when(){return props.view.rows.length>0
6838
+ _$insert(_el$,_$createComponent(Show24,{get when(){return props.view.rows.length>0
6877
6839
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6878
6840
  },get mode(){return props.mode
6879
6841
  }})
6880
- },get children(){return _$createComponent(SidebarRowList,{get density(){return props.density
6881
- },get children(){return _$createComponent(For18,{get each(){return props.visibility.visible()
6842
+ },get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
6843
+ },get interaction(){return props.interaction
6844
+ },get density(){return props.density
6845
+ },get children(){return _$createComponent(For19,{get each(){return props.visibility.visible()
6882
6846
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6883
6847
  return(()=>{var _el$3=_$createElement("box")
6884
- _$insert(_el$3,_$createComponent(Show22,{get when(){return startsGroup()
6848
+ _$insert(_el$3,_$createComponent(Show24,{get when(){return startsGroup()
6885
6849
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
6886
6850
  _$insertNode(_el$4,_el$5)
6887
6851
  _$insert(_el$5,()=>row.group)
6888
6852
  _$effect((_$p)=>_$setProp(_el$4,"fg",props.api.theme.current.textMuted,_$p))
6889
6853
  return _el$4
6890
6854
  }}),null)
6891
- _$insert(_el$3,_$createComponent(TodoRow,{get api(){return props.api
6892
- },get item(){return row.item
6855
+ _$insert(_el$3,_$createComponent(TodoRow,{get item(){return row.item
6893
6856
  }}),null)
6894
6857
  _$effect((_$p)=>_$setProp(_el$3,"marginTop",index()>0&&startsGroup()?1:0,_$p))
6895
6858
  return _el$3
@@ -6919,7 +6882,7 @@ return _el$6
6919
6882
 
6920
6883
 
6921
6884
  function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
6922
- return _$createComponent(Show23,{get when(){return state().available
6885
+ return _$createComponent(Show25,{get when(){return state().available
6923
6886
  },get children(){var _el$=_$createElement("box")
6924
6887
  _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6925
6888
  },get interaction(){return props.interaction
@@ -6929,7 +6892,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6929
6892
  },get disabled(){return state().saving
6930
6893
  },onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
6931
6894
  }),null)
6932
- _$insert(_el$,_$createComponent(Show23,{get when(){return state().error
6895
+ _$insert(_el$,_$createComponent(Show25,{get when(){return state().error
6933
6896
  },children:(message)=>(()=>{var _el$2=_$createElement("text")
6934
6897
  _$setProp(_el$2,"wrapMode","word")
6935
6898
  _$insert(_el$2,message)
@@ -6944,22 +6907,22 @@ function TodoSection(props){const list=createMemo18(()=>props.controller.list(pr
6944
6907
  const icons=useIcons()
6945
6908
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6946
6909
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6947
- const [mode,setMode]=createSignal28("all")
6910
+ const [mode,setMode]=createSignal31("all")
6948
6911
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6949
- createEffect17(()=>{targetKey()
6912
+ createEffect19(()=>{targetKey()
6950
6913
  setMode("all")
6951
6914
  })
6952
6915
  const view=createMemo18(()=>buildTodoView(list(),mode()))
6953
6916
  const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
6954
6917
  })
6955
6918
  const state=createMemo18(()=>props.controller.state(props.sessionID))
6956
- createEffect17(()=>{const sessionID=props.sessionID
6919
+ createEffect19(()=>{const sessionID=props.sessionID
6957
6920
  targetKey()
6958
6921
  if(unavailable())
6959
6922
  return
6960
- const deactivate=untrack7(()=>props.controller.activate?.(sessionID)??(()=>{}))
6923
+ const deactivate=untrack8(()=>props.controller.activate?.(sessionID)??(()=>{}))
6961
6924
  onCleanup21(deactivate)
6962
- untrack7(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6925
+ untrack8(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6963
6926
  })
6964
6927
  const navigationSection=()=>props.navigationSection??1
6965
6928
  return _$createComponent(Section,{get api(){return props.api
@@ -6967,10 +6930,10 @@ return _$createComponent(Section,{get api(){return props.api
6967
6930
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6968
6931
  },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6969
6932
  },get open(){return props.preferences.expanded().todo
6970
- },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show24,{get when(){return unavailable()
6933
+ },onToggle:()=>props.preferences.toggleSectionExpanded("todo"),get children(){return _$createComponent(Show26,{get when(){return unavailable()
6971
6934
  },get fallback(){return(()=>{var _el$=_$createElement("box")
6972
6935
  _$setProp(_el$,"gap",1)
6973
- _$insert(_el$,_$createComponent(Show24,{get when(){return managed()?.guidance(props.sessionID).available
6936
+ _$insert(_el$,_$createComponent(Show26,{get when(){return managed()?.guidance(props.sessionID).available
6974
6937
  },get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
6975
6938
  },get controller(){return managed()
6976
6939
  },get sessionID(){return props.sessionID
@@ -6978,7 +6941,7 @@ _$insert(_el$,_$createComponent(Show24,{get when(){return managed()?.guidance(pr
6978
6941
  },get navigationSection(){return navigationSection()
6979
6942
  }})
6980
6943
  }}),null)
6981
- _$insert(_el$,_$createComponent(Show24,{get when(){return managed()?.missing(props.sessionID)
6944
+ _$insert(_el$,_$createComponent(Show26,{get when(){return managed()?.missing(props.sessionID)
6982
6945
  },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6983
6946
  },get interaction(){return props.interaction
6984
6947
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
@@ -7027,10 +6990,11 @@ event.preventDefault()
7027
6990
  event.stopPropagation()
7028
6991
  props.interaction.leave()
7029
6992
  })
7030
- _$insert(_el$,_$createComponent(For19,{get each(){return visibleSections()
6993
+ _$insert(_el$,_$createComponent(For20,{get each(){return visibleSections()
7031
6994
  },children:(section,index)=>_$createComponent(SectionBoundary,{get api(){return props.api
7032
6995
  },get divided(){return index()<visibleSections().length-1
7033
- },get children(){return _$createComponent(Switch,{get children(){return [_$createComponent(Match,{when:section==="todo",get children(){return _$createComponent(TodoSection,_$mergeProps(props,{get navigationSection(){return index() + 1
6996
+ },get children(){return _$createComponent(Switch,{get children(){return [_$createComponent(Match,{when:section==="limits",get children(){return props.limitsSection(index() + 1)
6997
+ }}),_$createComponent(Match,{when:section==="todo",get children(){return _$createComponent(TodoSection,_$mergeProps(props,{get navigationSection(){return index() + 1
7034
6998
  },get controller(){return props.todo
7035
6999
  }}))
7036
7000
  }}),_$createComponent(Match,{when:section==="subagents",get children(){return _$createComponent(SubagentSection,_$mergeProps(props,{get navigationSection(){return index() + 1
@@ -7062,7 +7026,7 @@ return _el$
7062
7026
 
7063
7027
 
7064
7028
  function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
7065
- createEffect18(()=>{if(!props.api.state.ready)
7029
+ createEffect20(()=>{if(!props.api.state.ready)
7066
7030
  return
7067
7031
  persist()
7068
7032
  const route=props.api.route.current
@@ -7071,19 +7035,19 @@ if(typeof params?.sessionID!=="string")
7071
7035
  return
7072
7036
  const current=props.controller.target()
7073
7037
  onCleanup23(()=>props.controller.deactivate(current))
7074
- untrack8(()=>void props.controller.activate(current).catch(()=>{}))
7038
+ untrack9(()=>void props.controller.activate(current).catch(()=>{}))
7075
7039
  })
7076
7040
  return _$createElement("box")
7077
7041
  }
7078
- function PreferencesPersistence(props){createEffect18(()=>{const location=currentLocation(props.api)
7079
- untrack8(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
7042
+ function PreferencesPersistence(props){createEffect20(()=>{const location=currentLocation(props.api)
7043
+ untrack9(()=>props.controller.setActiveScope(preferencesScope({directory:location.routing.directory,worktree:props.api.state.path.worktree
7080
7044
  })))
7081
7045
  props.controller.load()
7082
7046
  })
7083
7047
  return _$createElement("box")
7084
7048
  }
7085
7049
  function FirstRunWizardPersistence(props){let isChecked=false
7086
- createEffect18(()=>{if(isChecked)
7050
+ createEffect20(()=>{if(isChecked)
7087
7051
  return
7088
7052
  isChecked=true
7089
7053
  showFirstRunWizard(props.api,props.preferences).catch(()=>{})
@@ -7121,7 +7085,7 @@ _$setProp(_el$2,"flexDirection","row")
7121
7085
  _$setProp(_el$2,"justifyContent","space-between")
7122
7086
  _$setProp(_el$2,"gap",1)
7123
7087
  _$setProp(_el$3,"flexGrow",1)
7124
- _$insert(_el$3,_$createComponent(Show25,{get when(){return props.preferences.showSessionTitle()
7088
+ _$insert(_el$3,_$createComponent(Show27,{get when(){return props.preferences.showSessionTitle()
7125
7089
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
7126
7090
  _$insertNode(_el$4,_el$5)
7127
7091
  _$setProp(_el$4,"wrapMode","word")
@@ -7129,7 +7093,7 @@ _$insert(_el$5,()=>props.title)
7129
7093
  _$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
7130
7094
  return _el$4
7131
7095
  }}),null)
7132
- _$insert(_el$3,_$createComponent(Show25,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7096
+ _$insert(_el$3,_$createComponent(Show27,{get when(){return _$memo(()=>!!props.preferences.showSessionDate())()&&created()
7133
7097
  },children:(value)=>(()=>{var _el$6=_$createElement("text")
7134
7098
  _$insert(_el$6,value)
7135
7099
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
@@ -7169,6 +7133,17 @@ return
7169
7133
  const [user,project]=await Promise.all([safe(userPath?readSource(userPath,()=>readFile2(userPath,"utf8")):undefined),safe(readProject?readSource(".opencode/navigator.json",readProject):undefined)])
7170
7134
  return mergeConfiguredDefaults(configuredDefaultsFromPluginOptions(options),user,project)
7171
7135
  }
7136
+
7137
+
7138
+ function LimitsPersistence(props){createEffect21(()=>{const{model,adapter
7139
+ }=props.controller.current()
7140
+ if(model&&adapter)
7141
+ untrack10(()=>void props.controller.refresh(true))
7142
+ })
7143
+ const timer=setInterval(()=>void props.controller.refresh(),5000)
7144
+ onCleanup25(()=>clearInterval(timer))
7145
+ return _$createElement("box")
7146
+ }
7172
7147
  import {homedir,homedir as homedir2} from "os"
7173
7148
 
7174
7149
  function location(input){return input.directory?{location:{directory:input.directory}}:{}}
@@ -7262,7 +7237,7 @@ return false
7262
7237
  }
7263
7238
  function enabled(value){return typeof value==="function"?value():value!==false
7264
7239
  }
7265
- function createV2Keymap(context){const [revision,setRevision]=createSignal29(0)
7240
+ function createV2Keymap(context){const [revision,setRevision]=createSignal32(0)
7266
7241
  const layers=new Map
7267
7242
  let sequence=0
7268
7243
  function layerActive(layer){const mode=layer.mode??"base"
@@ -7373,7 +7348,7 @@ function legacyTheme(theme){return{primary:theme.hue.interactive[200],secondary:
7373
7348
 
7374
7349
  function createV2UI(context){let dialogOpen=false
7375
7350
  function DialogPrompt(props){let active=true
7376
- onCleanup25(()=>{active=false
7351
+ onCleanup26(()=>{active=false
7377
7352
  })
7378
7353
  onMount7(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7379
7354
  })
@@ -7387,7 +7362,7 @@ props.onConfirm?.(value)
7387
7362
  return _$createElement("box")
7388
7363
  }
7389
7364
  function DialogConfirm(props){let active=true
7390
- onCleanup25(()=>{active=false
7365
+ onCleanup26(()=>{active=false
7391
7366
  })
7392
7367
  onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7393
7368
  })
@@ -7459,6 +7434,11 @@ for(let index=disposers.length-1;index>=0; index--)
7459
7434
  await disposers[index]()
7460
7435
  disposers.length=0
7461
7436
  }}}
7437
+ function selectedV2Model(context){const route=context.ui.router.current()
7438
+ const model=context.ui.model.current()
7439
+ if(route.type!=="session"||!model)
7440
+ return
7441
+ return{sessionID:route.sessionID,providerID:model.providerID,modelID:model.modelID,...model.variant&&{variant:model.variant}}}
7462
7442
 
7463
7443
 
7464
7444
  import {fileURLToPath} from "url"
@@ -7525,16 +7505,28 @@ if(item.source.target.startsWith("."))
7525
7505
  throw new Error("Unrecognized local Navigator source")
7526
7506
  await context.client.plugin.update({location:response.location,targets:[item.source.target]})
7527
7507
  }}}
7528
- async function setupNavigator(api,options,readProject,managedTodo){const config=pluginConfig(undefined)
7508
+ async function setupNavigator(api,options,readProject,managedTodo,selectedModel){const config=pluginConfig(undefined)
7529
7509
  const configured=await loadConfiguredDefaults(api,options,readProject)
7530
7510
  const todo=managedTodo??createTodoController(api)
7531
7511
  const subagents=createSubagentController(api)
7532
7512
  const skills=createSkillController(api)
7533
7513
  const preferences=createPreferencesController(api,config,createPreferencesStore(api.state.path.state),configured)
7514
+ const limitsPath=import.meta.url.includes("/dist/tui.js")?"./provider-limits.js":"../provider-limits"
7515
+ const limitsModule=await import(limitsPath)
7516
+ const codex=limitsModule.createCodexQuotaAdapter(limitsModule.createCodexAppServerClient({version:"0.20.0"
7517
+ }))
7518
+ const LimitsSection=limitsModule.ProviderLimitsSection
7519
+ const limits=limitsModule.createProviderLimitsController([codex],()=>{const model=selectedModel?.()??limitsModule.selectedV1Model(api)
7520
+ if(!model)
7521
+ return
7522
+ const accountID=preferences.codexAccountForModel(model.providerID,model.modelID)
7523
+ return{...model,...accountID&&{accountID
7524
+ }}},api.lifecycle.signal)
7534
7525
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7535
7526
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7536
7527
  const startup=createStartupSessionController(api,preferences)
7537
7528
  api.lifecycle.onDispose(()=>preferences.flush())
7529
+ api.lifecycle.onDispose(()=>limits.dispose())
7538
7530
  api.lifecycle.onDispose(()=>interaction.dispose())
7539
7531
  const unsubscribeMcp=api.event.on("mcp.tools.changed",()=>{mcp.refresh().catch(()=>{})
7540
7532
  })
@@ -7547,6 +7539,7 @@ api.lifecycle.onDispose(unsubscribeConnected)
7547
7539
  api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7548
7540
  },get multilineCorners(){return preferences.cornerFont
7549
7541
  },get children(){return [_$createComponent(PreferencesPersistence,{api,controller:preferences
7542
+ }),_$createComponent(LimitsPersistence,{controller:limits
7550
7543
  }),_$memo(()=>_$memo(()=>!!supportsPermissionMode(api))()&&_$createComponent(PermissionModeBinding,{api,preferences
7551
7544
  })),_$createComponent(SettingsBinding,{api,preferences,mcp,skills
7552
7545
  }),_$createComponent(SidebarToggleBinding,{api,preferences
@@ -7555,7 +7548,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7555
7548
  },interaction,skills,subagents,mcp
7556
7549
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7557
7550
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7558
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.2"
7551
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.20.0"
7559
7552
  }),_$createComponent(McpPersistence,{api,controller:mcp
7560
7553
  })]
7561
7554
  }})
@@ -7568,7 +7561,8 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7568
7561
  },sidebar_content(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7569
7562
  },get multilineCorners(){return preferences.cornerFont
7570
7563
  },get children(){return _$createComponent(SidebarContent,{api,get onNewSession(){return startup.handleNewSession
7571
- },mcp,todo,subagents,skills,preferences,interaction,get sessionID(){return props.session_id
7564
+ },mcp,limitsSection:(navigationSection)=>_$createComponent(LimitsSection,{api,preferences,interaction,controller:limits,codex,navigationSection
7565
+ }),todo,subagents,skills,preferences,interaction,get sessionID(){return props.session_id
7572
7566
  }})
7573
7567
  }})
7574
7568
  }}})
@@ -7585,12 +7579,12 @@ throw result.error
7585
7579
  }
7586
7580
  return result.data?.type==="text"?result.data.content:undefined
7587
7581
  })
7588
- const versionStatus=createVersionStatus(api,"0.19.2")
7589
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7582
+ const versionStatus=createVersionStatus(api,"0.20.0")
7583
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.20.0"))
7590
7584
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7591
7585
  },get multilineCorners(){return preferences.cornerFont
7592
7586
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7593
- },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7587
+ },navigatorVersion:"0.20.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7594
7588
  },get onNavigatorUpdate(){return versionUpdates.navigator
7595
7589
  }})
7596
7590
  }})
@@ -7603,16 +7597,16 @@ const{mcp,skills,preferences
7603
7597
  return
7604
7598
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7605
7599
  }))
7606
- },todo)
7607
- const versionStatus=createVersionStatus(adapter.api,"0.19.2")
7608
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.2"))
7600
+ },todo,()=>selectedV2Model(context))
7601
+ const versionStatus=createVersionStatus(adapter.api,"0.20.0")
7602
+ const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.20.0"))
7609
7603
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7610
7604
  },get multilineCorners(){return preferences.cornerFont
7611
7605
  },get children(){var _el$=_$createElement("box")
7612
7606
  _$setProp(_el$,"flexDirection","row")
7613
7607
  _$setProp(_el$,"justifyContent","space-between")
7614
7608
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7615
- },navigatorVersion:"0.19.2",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7609
+ },navigatorVersion:"0.20.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7616
7610
  },get onNavigatorUpdate(){return versionUpdates.navigator
7617
7611
  }}),null)
7618
7612
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7627,5 +7621,5 @@ await adapter.dispose()
7627
7621
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7628
7622
  }
7629
7623
  var plugin_default=plugin
7630
- export{DEFAULT_SECTION_EXPANSION,DialogSurface,FOCUS_COMMAND,FirstRunWizard,KeyboardHelpDialog,LspBadge,McpSection,PresetMenu,QUICK_ACTIONS,Section,SectionFilter,SelectionBox,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
7624
+ 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
7631
7625
  }