opencode-navigator 0.19.3 → 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 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,createMemo as createMemo15,Show as Show15,createMemo as createMemo14,createSignal as createSignal26,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 createSignal27,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 createSignal28,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 createSignal29,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 createSignal30,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
  }
@@ -915,13 +917,13 @@ return _el$
915
917
 
916
918
 
917
919
 
918
- function PresetMenu(props){const icons=useIcons()
920
+ function SelectionMenu(props){const icons=useIcons()
919
921
  const dialogs=useDialogs(props.api)
920
922
  const scroll=useDialogScroll()
921
923
  const [active,setActive]=useDialogState("selection",0)
922
924
  const theme=()=>props.api.theme.current
923
925
  let body
924
- const prefix=`${PLUGIN_ID}.mcp-preset-menu`
926
+ const prefix=`${PLUGIN_ID}.selection-menu`
925
927
  createEffect3(()=>{if(active()>=props.options.length)
926
928
  setActive(Math.max(0,props.options.length-1))
927
929
  })
@@ -1016,6 +1018,19 @@ return _el$7
1016
1018
  }
1017
1019
 
1018
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
+
1019
1034
 
1020
1035
 
1021
1036
 
@@ -1061,7 +1076,7 @@ return _p$
1061
1076
  return _el$
1062
1077
  }}))
1063
1078
  }
1064
- function McpErrorDialog(props){return _$createComponent(PresetMenu,{get api(){return props.api
1079
+ function McpErrorDialog(props){return _$createComponent(SelectionMenu,{get api(){return props.api
1065
1080
  },get title(){return `MCP error \xB7 ${props.name}`
1066
1081
  },height:12,get options(){return [{title:`Status \xB7 ${props.status}`,value:"error",description:props.error,icon:"error"
1067
1082
  }]
@@ -1222,6 +1237,11 @@ return server.trim()&&group?[[server,group]]:[]
1222
1237
  }))
1223
1238
  }
1224
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}}}
1225
1245
  function parseWorkspaceProfiles(value){return Object.fromEntries(Object.entries(record(value)??{}).flatMap(([layout,rawMcp])=>{const layoutName=layout.trim().slice(0,64)
1226
1246
  const mcpName=typeof rawMcp==="string"?rawMcp.trim().slice(0,64):""
1227
1247
  return layoutName&&mcpName?[[layoutName,mcpName]]:[]
@@ -1256,11 +1276,13 @@ const recentSkills=parseRecentSkills(userInput?.recentSkills)
1256
1276
  const recentQuickActions=parseRecentQuickActions(userInput?.recentQuickActions)
1257
1277
  const mcpServerGroups=parseMcpServerGroups(userInput?.mcpServerGroups)
1258
1278
  const skillGroups=parseSkillGroups(userInput?.skillGroups)
1279
+ const codexAccountBindings=parseCodexAccountBindings(userInput?.codexAccountBindings)
1280
+ const pendingResetAttempt=parsePendingResetAttempt(userInput?.pendingResetAttempt)
1259
1281
  const workspaceProfiles=parseWorkspaceProfiles(userInput?.workspaceProfiles)
1260
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
1261
1283
  },...typeof userInput?.lastNavigatorVersion==="string"&&{lastNavigatorVersion:userInput.lastNavigatorVersion
1262
1284
  },...typeof userInput?.previousNavigatorVersion==="string"&&{previousNavigatorVersion:userInput.previousNavigatorVersion
1263
- },...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
1264
1286
  },...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles}}}}
1265
1287
  function parseValues(value){if(!value)
1266
1288
  return{}
@@ -1408,6 +1430,15 @@ const recentSkills=parseRecentSkills([...update.user?.recentSkill?[update.user.r
1408
1430
  const recentQuickActions=parseRecentQuickActions([...update.user?.recentQuickAction?[update.user.recentQuickAction]:[],...current.user.recentQuickActions??[]])
1409
1431
  const mcpServerGroups=assignGroup(current.user.mcpServerGroups,update.user?.mcpServerGroup?.name,update.user?.mcpServerGroup?.group)
1410
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
1411
1442
  const favoriteSkills=update.user?.favoriteSkills?parseSkillConfirmations(update.user.favoriteSkills):[...current.user.favoriteSkills??[]]
1412
1443
  const favoriteSkill=update.user?.favoriteSkill
1413
1444
  if(favoriteSkill?.location){const index=favoriteSkills.indexOf(favoriteSkill.location)
@@ -1423,7 +1454,8 @@ return{global:target.kind==="global"?scope:current.global,worktrees,user:{...ski
1423
1454
  },...(update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion)&&{previousNavigatorVersion:update.user?.previousNavigatorVersion??current.user.previousNavigatorVersion
1424
1455
  },...Object.keys(parsedLayoutPresets).length>0&&{layoutPresets:parsedLayoutPresets},...Object.keys(parsedMcpPresets).length>0&&{mcpPresets:parsedMcpPresets},...Object.keys(workspaceProfiles).length>0&&{workspaceProfiles:parseWorkspaceProfiles(workspaceProfiles)
1425
1456
  },...favoriteSkills.length>0&&{favoriteSkills},...favoriteMcpServers.size>0&&{favoriteMcpServers:[...favoriteMcpServers].sort()},...favoriteQuickActions.size>0&&{favoriteQuickActions:parseFavoriteQuickActions([...favoriteQuickActions])
1426
- },...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
1427
1459
  }}}}
1428
1460
  function targetForLegacyScope(scope){return scope==="global"?{kind:"global"}:{kind:"worktree",key:scope}}
1429
1461
  function createPreferencesStore(stateDirectory){const directory=join(stateDirectory,LEGACY_PLUGIN_ID)
@@ -1594,6 +1626,8 @@ const [recentQuickActions,setRecentQuickActions]=createSignal4([])
1594
1626
  const [mcpServerGroups,setMcpServerGroups]=createSignal4(configured.mcpServerGroups??{})
1595
1627
  const [skillGroups,setSkillGroups]=createSignal4({})
1596
1628
  const [autoApprovePermissions,setAutoApprovePermissions]=createSignal4()
1629
+ const [codexAccountBindings,setCodexAccountBindings]=createSignal4({})
1630
+ const [pendingResetAttempt,setPendingResetAttempt]=createSignal4()
1597
1631
  const [ready,setReady]=createSignal4(false)
1598
1632
  const [revision,setRevision]=createSignal4(0)
1599
1633
  const sessionLayouts=new Map
@@ -1663,6 +1697,8 @@ setRecentQuickActions(value.user.recentQuickActions??[])
1663
1697
  setMcpServerGroups({...configured.mcpServerGroups,...value.user.mcpServerGroups})
1664
1698
  setSkillGroups(value.user.skillGroups??{})
1665
1699
  setAutoApprovePermissions(value.user.autoApprovePermissions)
1700
+ setCodexAccountBindings(value.user.codexAccountBindings??{})
1701
+ setPendingResetAttempt(value.user.pendingResetAttempt)
1666
1702
  setReady(true)
1667
1703
  refreshResolved()
1668
1704
  }
@@ -1783,6 +1819,21 @@ return
1783
1819
  setAutoApprovePermissions(value)
1784
1820
  update({user:{autoApprovePermissions:value}})
1785
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
+ }
1786
1837
  function toggleFavoriteMcpServer(name){if(!isHydrated){load().then(()=>toggleFavoriteMcpServer(name))
1787
1838
  return
1788
1839
  }
@@ -1853,7 +1904,13 @@ throw new Error("MCP preset no longer exists")
1853
1904
  update({user:{workspaceProfile:{layout,mcp}}})
1854
1905
  },favoriteSkills,favoriteMcpServers,favoriteQuickActions,toggleFavoriteMcpServer,toggleFavoriteQuickAction,recentSkills,recentQuickActions,mcpServerGroups,setMcpServerGroup(name,value){setMcpServerGroups(assignGroup(mcpServerGroups(),name,value))
1855
1906
  update({user:{mcpServerGroup:{name,group:value}}})
1856
- },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()
1857
1914
  if(!skill.location)
1858
1915
  return
1859
1916
  setRecentSkills(parseRecentSkills([skill.location,...recentSkills()]))
@@ -2643,7 +2700,7 @@ value=`${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, "0")}s`
2643
2700
  return value
2644
2701
  }
2645
2702
  function createSubagentClock(key){const [now,setNow]=createSignal9(Date.now())
2646
- createEffect4(()=>{if(key()===undefined)
2703
+ createEffect5(()=>{if(key()===undefined)
2647
2704
  return
2648
2705
  setNow(Date.now())
2649
2706
  const timer=setInterval(()=>setNow(Date.now()),1000)
@@ -3101,7 +3158,7 @@ unregister()
3101
3158
  onMount(()=>{input?.focus()
3102
3159
  refresh().catch(report)
3103
3160
  })
3104
- createEffect5(()=>{if(!sameContext())
3161
+ createEffect6(()=>{if(!sameContext())
3105
3162
  dialogs.close()
3106
3163
  })
3107
3164
  return{active,activeTab,activate,allErrors,byID,dialogs,errors,icons,loading,matches,prefix,query,queryScope,resultColors,results,selectTab,setBody(node){body=node
@@ -3338,7 +3395,7 @@ timers.add(timer)
3338
3395
  }},{name:`${LEGACY_PLUGIN_ID}.search`,run(){props.api.keymap.dispatchCommand(SEARCH_COMMAND)
3339
3396
  }}]
3340
3397
  })
3341
- createEffect6(()=>{const key=props.preferences.searchKey()
3398
+ createEffect7(()=>{const key=props.preferences.searchKey()
3342
3399
  const remove=props.api.keymap.registerLayer({mode:"base",bindings:[{key,cmd:SEARCH_COMMAND
3343
3400
  }]
3344
3401
  })
@@ -3352,18 +3409,6 @@ clearTimeout(timer)
3352
3409
  return _$createElement("box")
3353
3410
  }
3354
3411
 
3355
- function createLayoutPresetPreview(preferences,name){const scope=preferences.selectedScopeKey()
3356
- const valid=()=>preferences.selectedScopeKey()===scope
3357
- const preset=createMemo2(()=>preferences.layoutPresets()[name])
3358
- const preview=createMemo2(()=>{const value=preset()
3359
- return value?preferences.previewLayoutPreset(value):undefined
3360
- })
3361
- return{valid,preview,scope:preferences.preferenceScopeLabel,blocked:()=>preset()?"":"Preset no longer exists.",apply(){const value=preset()
3362
- if(!valid()||!value)
3363
- return false
3364
- preferences.applyLayoutPreset(value)
3365
- return true
3366
- }}}
3367
3412
  function createMcpPresetPreview(controller,preferences,name){const target=controller.target()
3368
3413
  const valid=()=>{const current=controller.target()
3369
3414
  return current.key===target.key&&current.scope===target.scope
@@ -3409,8 +3454,8 @@ function supportsTitleVisibility(api){return hostCapabilities(api).titleVisibili
3409
3454
  function supportsPermissionMode(api){return hostCapabilities(api).permissionMode!==false
3410
3455
  }
3411
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."}]
3412
- },{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."
3413
- },{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."
3414
3459
  }]
3415
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."
3416
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."
@@ -3806,7 +3851,7 @@ const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,comm
3806
3851
  }]
3807
3852
  })
3808
3853
  onCleanup9(unregister)
3809
- createEffect7(()=>{if(!props.valid())
3854
+ createEffect8(()=>{if(!props.valid())
3810
3855
  dialogs.close()
3811
3856
  })
3812
3857
  return _$createComponent(DialogSurface,{get api(){return props.api
@@ -3980,55 +4025,6 @@ const description=row.desired?{missing:`Not available in this workspace \xB7 tar
3980
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"
3981
4026
  }}).sort((a,b)=>Number(b.changed)-Number(a.changed)||Number(b.skipped)-Number(a.skipped))
3982
4027
  }
3983
- function LayoutPresetPreview(props){const dialogs=useDialogs(props.api)
3984
- const icons=useIcons()
3985
- const model=createLayoutPresetPreview(props.preferences,props.name)
3986
- const linked=props.preferences.workspaceProfiles?.()[props.name]
3987
- const mcpModel=props.controller&&linked?createMcpPresetPreview(props.controller,props.preferences,linked):undefined
3988
- const rows=createMemo4(()=>model.preview()?.rows.map((row)=>{const changes=[]
3989
- if(row.visibility[0]!==row.visibility[1])
3990
- changes.push(`${row.visibility[0] ? "visible" : "hidden"} -> ${row.visibility[1] ? "visible" : "hidden"}`)
3991
- if(row.expansion[0]!==row.expansion[1])
3992
- changes.push(`${row.expansion[0] ? "expanded" : "collapsed"} -> ${row.expansion[1] ? "expanded" : "collapsed"}`)
3993
- if(row.position[0]!==row.position[1])
3994
- changes.push(`position ${row.position[0]} -> ${row.position[1]}`)
3995
- 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"
3996
- }}).sort((a,b)=>Number(b.changed)-Number(a.changed))??[])
3997
- const mcpRows=createMemo4(()=>mcpModel?mcpPreviewRows(mcpModel,icons):[])
3998
- const changed=()=>rows().filter((row)=>row.changed).length
3999
- onMount3(()=>mcpModel?.refresh())
4000
- return _$createComponent(PresetPreviewFrame,{get api(){return props.api
4001
- },get title(){return `${mcpModel ? "Workspace profile" : "Layout preview"}: ${props.name}`
4002
- },get scope(){return mcpModel?`${model.scope()} \xB7 MCP ${mcpModel.scope}`:model.scope()
4003
- },get stats(){return [{icon:"edit",label:`${changed()} layout changed`,tone:"accent"
4004
- },{icon:"done",label:`${rows().length - changed()} layout unchanged`,tone:"muted"
4005
- }]
4006
- },get rowCount(){return rows().length + mcpRows().length
4007
- },valid:()=>model.valid()&&(!mcpModel||mcpModel.valid()),get blocked(){return model.blocked()||mcpModel?.blocked()
4008
- },get onRefresh(){return mcpModel?.refresh
4009
- },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()
4010
- if(mcpModel&&!request)
4011
- return
4012
- if(!model.apply())
4013
- return
4014
- if(mcpModel)
4015
- dialogs.close()
4016
- else{dialogs.back()
4017
- dialogs.back()
4018
- }
4019
- props.api.ui.toast({variant:"success",title:mcpModel?"Workspace profile":"Layout presets",message:`${props.name} applied to ${model.scope()}`,duration:3000
4020
- })
4021
- if(request)
4022
- reportMcpApplyError(props.api,request)
4023
- },get children(){return [_$createComponent(For8,{get each(){return rows()
4024
- },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4025
- }},row))
4026
- }),_$createComponent(For8,{get each(){return mcpRows()
4027
- },children:(row)=>_$createComponent(PresetPreviewRow,_$mergeProps({get api(){return props.api
4028
- }},row))
4029
- })]
4030
- }})
4031
- }
4032
4028
 
4033
4029
 
4034
4030
 
@@ -4058,7 +4054,7 @@ if(renameFrom)
4058
4054
  dialogs.back()
4059
4055
  }})
4060
4056
  }
4061
- 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"
4062
4058
  },{title:"Update from current",value:"update",description:"replace the saved states",icon:"save"
4063
4059
  },{title:"Rename",value:"rename",description:"change the preset name",icon:"edit"
4064
4060
  },{title:"Delete",value:"delete",description:"remove this preset",icon:"delete"
@@ -4090,7 +4086,7 @@ notify(`Deleted ${name}`)
4090
4086
  dialogs.back()
4091
4087
  }}))
4092
4088
  }
4093
- 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"
4094
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`
4095
4091
  }))]
4096
4092
  },onSelect:(option)=>option.value==="save"?prompt():actions(option.value.slice("preset:".length))
@@ -4123,61 +4119,6 @@ dialogs.open(()=>_$createComponent(PresetMenu,{api,title:"MCP presets",get optio
4123
4119
 
4124
4120
 
4125
4121
 
4126
-
4127
-
4128
-
4129
-
4130
-
4131
-
4132
- function createLayoutPresetActions(input){function prompt(value="",renameFrom){input.dialogs.prompt({title:renameFrom?"Rename layout preset":"Save layout preset",description:()=>(()=>{var _el$=_$createElement("text")
4133
- _$insertNode(_el$,_$createTextNode(`Save the current visible, expanded, and ordered sections.`))
4134
- _$effect((_$p)=>_$setProp(_el$,"fg",input.api.theme.current.textMuted,_$p))
4135
- return _el$
4136
- })(),placeholder:"Preset name",value,onConfirm(nameInput){const name=renameFrom?input.preferences.renameLayoutPreset(renameFrom,nameInput):input.preferences.saveLayoutPreset(nameInput)
4137
- input.dialogs.back()
4138
- if(renameFrom)
4139
- input.dialogs.back()
4140
- input.api.ui.toast({variant:"success",title:"Layout presets",message:renameFrom?`Renamed to ${name}`:`Saved ${name}`,duration:3000
4141
- })
4142
- }})
4143
- }
4144
- function open(name){const linked=input.preferences.workspaceProfiles?.()[name]
4145
- 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)
4146
- input.dialogs.back()
4147
- input.dialogs.back()
4148
- }})
4149
- input.dialogs.open(()=>_$createComponent(PresetMenu,{get api(){return input.api
4150
- },title:name,get options(){return [{title:"Preview & apply",value:"apply",icon:"info",description:linked?`profile \xB7 ${linked}`:"review layout changes"
4151
- },{title:"Update from current",value:"update",icon:"save",description:"replace saved layout"
4152
- },{title:"Rename\u2026",value:"rename",description:"change preset name",icon:"edit"
4153
- },...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"
4154
- }]:[],{title:"Delete",value:"delete",description:"remove preset",icon:"delete"
4155
- }]
4156
- },onSelect:(option)=>{switch(option.value){case "apply":{input.dialogs.open(()=>_$createComponent(LayoutPresetPreview,{get api(){return input.api
4157
- },get preferences(){return input.preferences
4158
- },get controller(){return input.mcp
4159
- },name
4160
- }),"large")
4161
- break
4162
- }
4163
- case "update":{input.preferences.updateLayoutPreset(name)
4164
- input.dialogs.back()
4165
- input.api.ui.toast({variant:"success",title:"Layout presets",message:`Updated ${name}`,duration:3000
4166
- })
4167
- break
4168
- }
4169
- case "rename":{prompt(name,name)
4170
- break
4171
- }
4172
- case "link":{link()
4173
- break
4174
- }
4175
- default:{input.preferences.deleteLayoutPreset(name)
4176
- input.dialogs.back()
4177
- }}}}))
4178
- }
4179
- return{open,prompt
4180
- }}
4181
4122
 
4182
4123
  function titleVisibilityOptions(api,preferences,icons){if(!supportsTitleVisibility(api))
4183
4124
  return []
@@ -4246,25 +4187,6 @@ input.openLimitPrompt(section)
4246
4187
 
4247
4188
 
4248
4189
 
4249
-
4250
-
4251
- var RESET_ALL="__reset_all__"
4252
- function TrustedSkillsDialog(props){const options=createMemo8(()=>{const locations=props.preferences.trustedSkillLocations()
4253
- if(locations.length===0)
4254
- return [{title:"Every skill requires confirmation",value:"empty",description:"No trusted skills",icon:"info"
4255
- }]
4256
- return [{title:"Require confirmation for all",value:RESET_ALL,description:`Revoke trust for ${locations.length} skill${locations.length === 1 ? "" : "s"}`,icon:"reset"
4257
- },...locations.map((location)=>({title:location.split("/").at(-2)??location,value:location,description:location,icon:"checked"
4258
- }))]
4259
- })
4260
- return _$createComponent(PresetMenu,{get api(){return props.api
4261
- },title:"Trusted skills",get options(){return options()
4262
- },onSelect:(option)=>{if(option.value===RESET_ALL)
4263
- props.preferences.resetSkillConfirmations()
4264
- else if(option.value!=="empty")
4265
- props.preferences.revokeSkillConfirmation(option.value)
4266
- }})
4267
- }
4268
4190
  function createSettingsSelection(input){const dialogClosed=()=>("open" in input.api.ui.dialog)&&!input.api.ui.dialog.open
4269
4191
  function openLimitPrompt(section){const index=input.options().findIndex((option)=>option.value===section)
4270
4192
  if(index!==-1)
@@ -4300,36 +4222,11 @@ function exportSettings(){const copied=input.api.renderer.copyToClipboardOSC52(i
4300
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
4301
4223
  })
4302
4224
  }
4303
- function importSettings(){input.dialogs.prompt({title:"Import portable settings",description:()=>(()=>{var _el$5=_$createElement("text")
4304
- _$insertNode(_el$5,_$createTextNode(`Paste versioned Navigator JSON.`))
4305
- _$effect((_$p)=>_$setProp(_el$5,"fg",input.api.theme.current.textMuted,_$p))
4306
- return _el$5
4307
- })(),onConfirm(source){const preview=input.preferences.previewPortableSettings(source)
4308
- 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"
4309
- }]:[],...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"
4310
- }]:[],...preview.unsupported.map((path)=>({title:"Unsupported field \xB7 SKIPPED",value:"status",description:path,icon:"error"
4311
- })),...preview.layoutChanged||preview.mcpChanged?[{title:"Apply imported settings",value:"apply",description:preview.target,icon:"done"
4312
- }]:[],{title:"Cancel",value:"cancel",description:"return without changes",icon:"close"
4313
- }]
4314
- let applying=false
4315
- async function apply(){applying=true
4316
- try{await input.preferences.applyPortableSettings(preview)
4317
- input.api.ui.toast({variant:"success",title:"Portable settings",message:"Layout and MCP settings imported",duration:3000
4318
- })
4319
- input.dialogs.back()
4320
- } catch(error){applying=false
4321
- input.api.ui.toast({variant:"error",title:"Portable settings",message:error instanceof Error?error.message:"Could not import settings",duration:5000
4322
- })
4323
- }}
4324
- input.dialogs.replace(()=>_$createComponent(PresetMenu,{get api(){return input.api
4325
- },title:"Settings import preview",options,get height(){return Math.min(options.length*3,18)
4326
- },onSelect:(option)=>{if(option.value==="cancel")
4327
- input.dialogs.back()
4328
- if(option.value!=="apply"||applying)
4329
- return
4330
- apply()
4331
- }}))
4332
- }})
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
+ }))
4333
4230
  }
4334
4231
  function select(value=input.options()[input.active()]?.value){if(!value)
4335
4232
  return
@@ -4400,9 +4297,16 @@ break
4400
4297
  case "reset_mcp":{input.preferences.resetMcpStates()
4401
4298
  break
4402
4299
  }
4403
- 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
4404
4306
  },get preferences(){return input.preferences
4405
4307
  }}))
4308
+ }).catch((error)=>input.api.ui.toast({variant:"error",title:"Trusted skills",message:String(error)
4309
+ }))
4406
4310
  break
4407
4311
  }
4408
4312
  case "wizard":{input.dialogs.open(()=>_$createComponent(FirstRunWizard,{get api(){return input.api
@@ -4465,19 +4369,19 @@ const icons=useIcons()
4465
4369
  const dialogs=useDialogs(props.api)
4466
4370
  const scroll=useDialogScroll()
4467
4371
  const dimensions=useTerminalDimensions6()
4468
- 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))
4469
4373
  const orderedGroups=createSettingsGroups(props.api,props.preferences,icons)
4470
4374
  const initialGroup=orderedGroups().find((group)=>group.options.some((option)=>option.value===props.activeValue))
4471
4375
  const [activeGroup,setActiveGroup]=useDialogState("tab",initialGroup?.id??orderedGroups()[0].id)
4472
- const options=createMemo9(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
4376
+ const options=createMemo8(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
4473
4377
  const optionId=(value)=>`${PLUGIN_ID}.settings.${value}`
4474
4378
  const initialActive=options().findIndex((option)=>option.value===props.activeValue)
4475
4379
  const [active,setActive]=useDialogState("selection",Math.max(0,initialActive))
4476
- createEffect10(()=>{if(active()>=options().length)
4380
+ createEffect11(()=>{if(active()>=options().length)
4477
4381
  setActive(Math.max(0,options().length-1))
4478
4382
  })
4479
- const contentHeight=createMemo9(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
4480
- 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`
4481
4385
  if(activeGroup()==="sections")
4482
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`
4483
4387
  if(activeGroup()==="presets")
@@ -4518,9 +4422,20 @@ setActive(next)
4518
4422
  body?.scrollChildIntoView(optionId(value))
4519
4423
  })
4520
4424
  }
4521
- 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
4522
4430
  })
4523
- 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")
4524
4439
  })
4525
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
4526
4441
  })
@@ -4715,7 +4630,7 @@ return title.startsWith("Enable auto-approve permissions")?false:undefined
4715
4630
  }
4716
4631
  function PermissionModeBinding(props){let applying=false
4717
4632
  let observed
4718
- createEffect11(()=>{if(!props.preferences.ready())
4633
+ createEffect12(()=>{if(!props.preferences.ready())
4719
4634
  return
4720
4635
  const preferred=props.preferences.autoApprovePermissions()
4721
4636
  const current=currentPermissionMode(props.api)
@@ -4751,6 +4666,8 @@ return _$createComponent(IconControl,{id:`${PLUGIN_ID}.settings.footer`,get icon
4751
4666
  },onMouseOver:()=>setHovered(true),onMouseOut:()=>setHovered(false),onMouseUp:()=>openSettings(props.api,props.preferences,undefined,props.mcp,props.skills)
4752
4667
  })
4753
4668
  }
4669
+
4670
+
4754
4671
  import {realpathSync} from "fs"
4755
4672
  function routeKey(api){const route=api.route.current
4756
4673
  return `${route.name}:${"params" in route ? route.params?.sessionID ?? "" : ""}`
@@ -4814,7 +4731,7 @@ queueMicrotask(()=>void props.controller.start())
4814
4731
  })
4815
4732
  onCleanup14(unregister)
4816
4733
  } else
4817
- createEffect12(()=>{if(!props.controller.enabled())
4734
+ createEffect13(()=>{if(!props.controller.enabled())
4818
4735
  return
4819
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()
4820
4737
  }]
@@ -5112,7 +5029,7 @@ return !needle||values.some((value)=>value?.toLocaleLowerCase().includes(needle)
5112
5029
 
5113
5030
  function position(descriptor){return typeof descriptor.position==="function"?descriptor.position():descriptor.position
5114
5031
  }
5115
- 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"}]
5116
5033
  function belongsTo(renderable,ancestor){if(!renderable||!ancestor)
5117
5034
  return false
5118
5035
  for(let current=renderable;current; current=current.parent){if(current===ancestor)
@@ -5551,7 +5468,7 @@ const item=useSidebarItem(props.api,props.interaction,{id:props.sectionId??`sect
5551
5468
  const action=props.headerAction?useSidebarItem(props.api,props.interaction,{id:props.headerAction.id,position:()=>({section:props.navigationSection??0,row:0,column:1
5552
5469
  }),disabled:props.headerAction.disabled,activate:props.headerAction.onActivate
5553
5470
  },()=>theme().accent,"control"):undefined
5554
- createEffect13(()=>{props.headerAction?.label()
5471
+ createEffect14(()=>{props.headerAction?.label()
5555
5472
  setActionWidth(undefined)
5556
5473
  })
5557
5474
  const actionLabel=()=>{const label=props.headerAction?.label()??""
@@ -6194,11 +6111,44 @@ return _$createComponent(SectionWithHeaderAction,{get api(){return props.api
6194
6111
 
6195
6112
 
6196
6113
 
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
+
6197
6147
  function QuickActionRow(props){const{api,interaction
6198
6148
  }=useSidebarList()
6199
6149
  const icons=useIcons()
6200
6150
  const theme=()=>api.theme.current
6201
- const [width,setWidth]=createSignal26(0)
6151
+ const [width,setWidth]=createSignal28(0)
6202
6152
  const shortcut=createMemo14(()=>{const bindings=api.keymap.getCommandBindings({visibility:"registered",commands:[props.action.command]
6203
6153
  })
6204
6154
  return api.keys.formatBindings(bindings.get(props.action.command))
@@ -6242,7 +6192,7 @@ _$insert(_el$2,()=>props.action.label)
6242
6192
  _$effect((_$p)=>_$setProp(_el$2,"fg",row.foregroundColor(),_$p))
6243
6193
  return _el$2
6244
6194
  })()
6245
- },get metadata(){return _$createComponent(Show15,{get when(){return visibleShortcut()
6195
+ },get metadata(){return _$createComponent(Show17,{get when(){return visibleShortcut()
6246
6196
  },children:(value)=>(()=>{var _el$3=_$createElement("text")
6247
6197
  _$setProp(_el$3,"flexShrink",0)
6248
6198
  _$setProp(_el$3,"wrapMode","none")
@@ -6251,7 +6201,7 @@ _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme()
6251
6201
  return _el$3
6252
6202
  })()
6253
6203
  })
6254
- },get details(){return _$createComponent(Show15,{get when(){return props.disabled
6204
+ },get details(){return _$createComponent(Show17,{get when(){return props.disabled
6255
6205
  },children:(reason)=>(()=>{var _el$4=_$createElement("text")
6256
6206
  _$setProp(_el$4,"wrapMode","word")
6257
6207
  _$insert(_el$4,reason)
@@ -6279,12 +6229,12 @@ return _$createComponent(Section,{get api(){return props.api
6279
6229
  },onToggle:()=>props.preferences.toggleSectionExpanded("quick_actions"),get children(){return [_$createComponent(SidebarRowList,{get api(){return props.api
6280
6230
  },get interaction(){return props.interaction
6281
6231
  },get density(){return props.preferences.rowDensity?.()??"compact"
6282
- },get children(){return [_$createComponent(Show16,{get when(){return actions().length===0
6232
+ },get children(){return [_$createComponent(Show18,{get when(){return actions().length===0
6283
6233
  },get children(){var _el$=_$createElement("text")
6284
6234
  _$insertNode(_el$,_$createTextNode(`No quick actions selected`))
6285
6235
  _$effect((_$p)=>_$setProp(_el$,"fg",props.api.theme.current.textMuted,_$p))
6286
6236
  return _el$
6287
- }}),_$createComponent(For14,{get each(){return visibility.visible()
6237
+ }}),_$createComponent(For15,{get each(){return visibility.visible()
6288
6238
  },children:(action,index)=>_$createComponent(QuickActionRow,{get onNewSession(){return props.onNewSession
6289
6239
  },action,get disabled(){return action.disabled
6290
6240
  },get favorite(){return props.preferences.favoriteQuickActions?.().has(action.command)??false
@@ -6394,7 +6344,7 @@ unregisterBinding=undefined
6394
6344
  unregisterCommands()
6395
6345
  }}}
6396
6346
  function SidebarToggleBinding(props){const shortcuts=createSidebarShortcutMode(props.api)
6397
- createEffect14(()=>shortcuts.bind(props.preferences.toggleKey()))
6347
+ createEffect16(()=>shortcuts.bind(props.preferences.toggleKey()))
6398
6348
  onCleanup18(shortcuts.dispose)
6399
6349
  return _$createElement("box")
6400
6350
  }
@@ -6404,7 +6354,7 @@ const unregisterCommands=props.api.keymap.registerLayer({commands:[...commands,.
6404
6354
  }))]
6405
6355
  })
6406
6356
  onCleanup18(unregisterCommands)
6407
- 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
6408
6358
  }]
6409
6359
  })
6410
6360
  onCleanup18(unregister)
@@ -6438,10 +6388,10 @@ const filtered=createMemo16(()=>list().filter((item)=>matchesFilter(query(),item
6438
6388
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("skills")??0,resetKey:()=>JSON.stringify([target().key,query()])
6439
6389
  })
6440
6390
  const state=createMemo16(()=>props.controller.state(target()))
6441
- createEffect15(()=>{const current=target()
6442
- const deactivate=untrack5(()=>props.controller.activate?.(current)??(()=>{}))
6391
+ createEffect17(()=>{const current=target()
6392
+ const deactivate=untrack6(()=>props.controller.activate?.(current)??(()=>{}))
6443
6393
  onCleanup19(deactivate)
6444
- untrack5(()=>void props.controller.refresh(current).catch(()=>{}))
6394
+ untrack6(()=>void props.controller.refresh(current).catch(()=>{}))
6445
6395
  })
6446
6396
  async function useSkill(item){try{const isInserted=await props.controller.use(target(),item.name)
6447
6397
  if(isInserted)
@@ -6493,7 +6443,7 @@ return _el$
6493
6443
  }})
6494
6444
  }
6495
6445
  function SkillsSection(props){const dialogs=useDialogs(props.api)
6496
- const [query,setQuery]=createSignal27("")
6446
+ const [query,setQuery]=createSignal29("")
6497
6447
  const model=createSkillSectionModel(props,query)
6498
6448
  const navigationSection=()=>props.navigationSection??3
6499
6449
  function selectSkill(item){if(!props.preferences.shouldConfirmSkill(item)){model.useSkill(item)
@@ -6526,7 +6476,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6526
6476
  }},get query(){return query()
6527
6477
  },placeholder:"Filter skills...",onInput:setQuery
6528
6478
  }),null)
6529
- _$insert(_el$,_$createComponent(Show17,{get when(){return model.filtered().length>0
6479
+ _$insert(_el$,_$createComponent(Show19,{get when(){return model.filtered().length>0
6530
6480
  },get fallback(){return(()=>{var _el$2=_$createElement("text")
6531
6481
  _$insertNode(_el$2,_$createTextNode(`No matching skills`))
6532
6482
  _$effect((_$p)=>_$setProp(_el$2,"fg",props.api.theme.current.textMuted,_$p))
@@ -6536,8 +6486,8 @@ return _el$2
6536
6486
  },get interaction(){return props.interaction
6537
6487
  },get grouped(){return model.grouped
6538
6488
  },get density(){return props.preferences.rowDensity?.()??"compact"
6539
- },get children(){return _$createComponent(For15,{get each(){return model.visibility.visible()
6540
- },children:(item,index)=>[_$createComponent(Show17,{get when(){return _$memo(()=>!!model.grouped())()&&(index()===0||model.visibility.visible()[index()-1]?.bucket!==item.bucket)
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)
6541
6491
  },get children(){var _el$4=_$createElement("text")
6542
6492
  _$setProp(_el$4,"height",1)
6543
6493
  _$setProp(_el$4,"wrapMode","none")
@@ -6582,18 +6532,18 @@ return _el$
6582
6532
  function createSubagentSectionModel(props){const list=createMemo17(()=>props.controller.list(props.sessionID))
6583
6533
  const recent=createMemo17(()=>props.controller.recent?.(props.sessionID)??[])
6584
6534
  const rows=createMemo17(()=>buildSubagentView(list(),recent()))
6585
- const [query,setQuery]=createSignal28("")
6586
- const [mode,setMode]=createSignal28("all")
6535
+ const [query,setQuery]=createSignal30("")
6536
+ const [mode,setMode]=createSignal30("all")
6587
6537
  const counts=createMemo17(()=>countSubagentView(rows(),query()))
6588
6538
  const tabs=createMemo17(()=>["all","active","recent",...counts().errors>0?["errors"]:[]])
6589
6539
  const filtered=createMemo17(()=>filterSubagentView(rows(),mode(),query()))
6590
6540
  const parentID=createMemo17(()=>props.api.state?.session?.get(props.sessionID)?.parentID)
6591
6541
  const targetKey=createMemo17(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6592
- createEffect16(()=>{targetKey()
6542
+ createEffect18(()=>{targetKey()
6593
6543
  setQuery("")
6594
6544
  setMode("all")
6595
6545
  })
6596
- createEffect16(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6546
+ createEffect18(()=>{if(mode()!=="all"&&counts()[mode()]===0)
6597
6547
  setMode("all")
6598
6548
  })
6599
6549
  const visibility=createListVisibility({items:filtered,limit:()=>props.preferences.sectionItemLimit?.("subagents")??0,resetKey:()=>JSON.stringify([targetKey(),query(),mode()])
@@ -6603,11 +6553,11 @@ const now=createSubagentClock(clockKey)
6603
6553
  const byId=createMemo17(()=>new Map(visibility.visible().map((item)=>[item.session.id,item])))
6604
6554
  const ids=createMemo17(()=>visibility.visible().map((item)=>item.session.id))
6605
6555
  const state=createMemo17(()=>props.controller.state(props.sessionID))
6606
- createEffect16(()=>{const sessionID=props.sessionID
6556
+ createEffect18(()=>{const sessionID=props.sessionID
6607
6557
  targetKey()
6608
- const deactivate=untrack6(()=>props.controller.activate?.(sessionID)??(()=>{}))
6558
+ const deactivate=untrack7(()=>props.controller.activate?.(sessionID)??(()=>{}))
6609
6559
  onCleanup20(deactivate)
6610
- untrack6(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6560
+ untrack7(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6611
6561
  })
6612
6562
  return{list,recent,rows,query,setQuery,mode,setMode,counts,tabs,filtered,parentID,visibility,now,byId,ids,state
6613
6563
  }}
@@ -6664,7 +6614,7 @@ return()=>_c$()?`${props.item.run.startedBeforeObservation ? `${icons.icon("rece
6664
6614
  _$effect((_$p)=>_$setProp(_el$3,"fg",row.focused()?row.foregroundColor():theme().textMuted,_$p))
6665
6615
  return _el$3
6666
6616
  })()
6667
- },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
6668
6618
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createTextNode(`: `)
6669
6619
  _$insertNode(_el$4,_el$5)
6670
6620
  _$setProp(_el$4,"wrapMode","word")
@@ -6672,12 +6622,12 @@ _$insert(_el$4,()=>cancelled()?"Cancelled":"Error",_el$5)
6672
6622
  _$insert(_el$4,()=>props.item.run?.errorMessage,null)
6673
6623
  _$effect((_$p)=>_$setProp(_el$4,"fg",row.focused()?row.foregroundColor():failed()?theme().error:theme().textMuted,_$p))
6674
6624
  return _el$4
6675
- }}),_$createComponent(Show18,{get when(){return props.item.unavailable
6625
+ }}),_$createComponent(Show20,{get when(){return props.item.unavailable
6676
6626
  },get children(){var _el$6=_$createElement("text")
6677
6627
  _$insertNode(_el$6,_$createTextNode(`Worker status unavailable`))
6678
6628
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().warning,_$p))
6679
6629
  return _el$6
6680
- }}),_$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
6681
6631
  },children:(status)=>(()=>{var _el$0=_$createElement("text"),_el$1=_$createTextNode(`Retry #`),_el$10=_$createTextNode(` \xB7 `),_el$11=_$createTextNode(`s \xB7 `)
6682
6632
  _$insertNode(_el$0,_el$1)
6683
6633
  _$insertNode(_el$0,_el$10)
@@ -6689,7 +6639,7 @@ _$insert(_el$0,()=>status().message,null)
6689
6639
  _$effect((_$p)=>_$setProp(_el$0,"fg",row.focused()?row.foregroundColor():theme().warning,_$p))
6690
6640
  return _el$0
6691
6641
  })()
6692
- }),_$createComponent(Show18,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6642
+ }),_$createComponent(Show20,{get when(){return _$memo(()=>!!idle())()&&!props.item.run?.errorMessage
6693
6643
  },get children(){var _el$8=_$createElement("text")
6694
6644
  _$insertNode(_el$8,_$createTextNode(`Finished`))
6695
6645
  _$effect((_$p)=>_$setProp(_el$8,"fg",theme().textMuted,_$p))
@@ -6700,12 +6650,12 @@ return _el$8
6700
6650
  function SubagentList(props){return _$createComponent(SidebarRowList,{get api(){return props.api
6701
6651
  },get interaction(){return props.interaction
6702
6652
  },get density(){return props.density
6703
- },get children(){return _$createComponent(For16,{get each(){return props.ids
6653
+ },get children(){return _$createComponent(For17,{get each(){return props.ids
6704
6654
  },children:(id,index)=>{const initial=props.itemById(id)
6705
6655
  const item=()=>props.itemById(id)??initial
6706
6656
  const startsGroup=()=>index()===0||props.visible[index()-1]?.group!==item().group
6707
6657
  return(()=>{var _el$=_$createElement("box")
6708
- _$insert(_el$,_$createComponent(Show19,{get when(){return startsGroup()
6658
+ _$insert(_el$,_$createComponent(Show21,{get when(){return startsGroup()
6709
6659
  },get children(){var _el$2=_$createElement("text"),_el$3=_$createElement("b")
6710
6660
  _$insertNode(_el$2,_el$3)
6711
6661
  _$insert(_el$3,()=>item().group)
@@ -6731,7 +6681,7 @@ return _$createComponent(Section,{get api(){return props.api
6731
6681
  },sectionId:`${PLUGIN_ID}.section.subagents`,get navigationSection(){return navigationSection()
6732
6682
  },title:"SUBAGENTS",section:"subagents",get summary(){return `${model.list().length} active \xB7 ${model.recent().length} recent`
6733
6683
  },get open(){return props.preferences.expanded().subagents
6734
- },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()
6735
6685
  },children:(id)=>_$createComponent(McpBulkAction,{get api(){return props.api
6736
6686
  },get interaction(){return props.interaction
6737
6687
  },id:`${PLUGIN_ID}.subagents.parent`,get position(){return{section:navigationSection(),row:1,column:0
@@ -6754,7 +6704,7 @@ _$insert(_el$,_$createComponent(SectionFilter,{get api(){return props.api
6754
6704
  }}),_el$2)
6755
6705
  _$setProp(_el$2,"flexDirection","row")
6756
6706
  _$setProp(_el$2,"flexWrap","wrap")
6757
- _$insert(_el$2,_$createComponent(For17,{get each(){return model.tabs()
6707
+ _$insert(_el$2,_$createComponent(For18,{get each(){return model.tabs()
6758
6708
  },children:(value,index)=>_$createComponent(SectionTab,{get api(){return props.api
6759
6709
  },get interaction(){return props.interaction
6760
6710
  },id:`${PLUGIN_ID}.subagents.filter.${value}`,get position(){return{section:navigationSection(),row:4,column:index()
@@ -6765,7 +6715,7 @@ _$insert(_el$2,_$createComponent(For17,{get each(){return model.tabs()
6765
6715
  },onActivate:()=>model.setMode(value)
6766
6716
  })
6767
6717
  }))
6768
- _$insert(_el$,_$createComponent(Show20,{get when(){return model.filtered().length===0
6718
+ _$insert(_el$,_$createComponent(Show22,{get when(){return model.filtered().length===0
6769
6719
  },get children(){var _el$3=_$createElement("text")
6770
6720
  _$insertNode(_el$3,_$createTextNode(`No matching subagents`))
6771
6721
  _$effect((_$p)=>_$setProp(_el$3,"fg",props.api.theme.current.textMuted,_$p))
@@ -6849,7 +6799,7 @@ _$insert(_el$2,()=>icons.icon(done()?"done":active()?"busy":cancelled()?"close":
6849
6799
  _$setProp(_el$3,"flexGrow",1)
6850
6800
  _$setProp(_el$3,"wrapMode","word")
6851
6801
  _$insert(_el$3,()=>props.item.content)
6852
- _$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"
6853
6803
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b"),_el$6=_$createTextNode(` `)
6854
6804
  _$insertNode(_el$4,_el$5)
6855
6805
  _$setProp(_el$4,"width",2)
@@ -6876,7 +6826,7 @@ _$insertNode(_el$,_el$2)
6876
6826
  _$setProp(_el$,"gap",1)
6877
6827
  _$setProp(_el$2,"flexDirection","row")
6878
6828
  _$setProp(_el$2,"flexWrap","wrap")
6879
- _$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
6880
6830
  },get interaction(){return props.interaction
6881
6831
  },id:`${PLUGIN_ID}.todo.filter.${value}`,get position(){return{section:navigationSection(),row:tabsRow(),column:index()
6882
6832
  }},get label(){return value[0].toUpperCase() + value.slice(1)
@@ -6885,17 +6835,17 @@ _$insert(_el$2,_$createComponent(For18,{each:["all","active","finished"],childre
6885
6835
  },onActivate:()=>props.setMode(value)
6886
6836
  })
6887
6837
  }))
6888
- _$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
6889
6839
  },get fallback(){return _$createComponent(EmptyTodo,{get api(){return props.api
6890
6840
  },get mode(){return props.mode
6891
6841
  }})
6892
6842
  },get children(){return _$createComponent(SidebarRowList,{get api(){return props.api
6893
6843
  },get interaction(){return props.interaction
6894
6844
  },get density(){return props.density
6895
- },get children(){return _$createComponent(For18,{get each(){return props.visibility.visible()
6845
+ },get children(){return _$createComponent(For19,{get each(){return props.visibility.visible()
6896
6846
  },children:(row,index)=>{const startsGroup=()=>index()===0||props.visibility.visible()[index()-1].group!==row.group
6897
6847
  return(()=>{var _el$3=_$createElement("box")
6898
- _$insert(_el$3,_$createComponent(Show22,{get when(){return startsGroup()
6848
+ _$insert(_el$3,_$createComponent(Show24,{get when(){return startsGroup()
6899
6849
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
6900
6850
  _$insertNode(_el$4,_el$5)
6901
6851
  _$insert(_el$5,()=>row.group)
@@ -6932,7 +6882,7 @@ return _el$6
6932
6882
 
6933
6883
 
6934
6884
  function TodoGuidanceControl(props){const state=()=>props.controller.guidance(props.sessionID)
6935
- return _$createComponent(Show23,{get when(){return state().available
6885
+ return _$createComponent(Show25,{get when(){return state().available
6936
6886
  },get children(){var _el$=_$createElement("box")
6937
6887
  _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6938
6888
  },get interaction(){return props.interaction
@@ -6942,7 +6892,7 @@ _$insert(_el$,_$createComponent(SectionTab,{get api(){return props.api
6942
6892
  },get disabled(){return state().saving
6943
6893
  },onActivate:()=>void props.controller.setGuidance(props.sessionID,!state().enabled)
6944
6894
  }),null)
6945
- _$insert(_el$,_$createComponent(Show23,{get when(){return state().error
6895
+ _$insert(_el$,_$createComponent(Show25,{get when(){return state().error
6946
6896
  },children:(message)=>(()=>{var _el$2=_$createElement("text")
6947
6897
  _$setProp(_el$2,"wrapMode","word")
6948
6898
  _$insert(_el$2,message)
@@ -6957,22 +6907,22 @@ function TodoSection(props){const list=createMemo18(()=>props.controller.list(pr
6957
6907
  const icons=useIcons()
6958
6908
  const unavailable=()=>hostCapabilityUnavailable(props.api,"todo")
6959
6909
  const managed=()=>("guidance" in props.controller)?props.controller:undefined
6960
- const [mode,setMode]=createSignal29("all")
6910
+ const [mode,setMode]=createSignal31("all")
6961
6911
  const targetKey=createMemo18(()=>props.controller.target?.(props.sessionID).key??props.sessionID)
6962
- createEffect17(()=>{targetKey()
6912
+ createEffect19(()=>{targetKey()
6963
6913
  setMode("all")
6964
6914
  })
6965
6915
  const view=createMemo18(()=>buildTodoView(list(),mode()))
6966
6916
  const visibility=createListVisibility({items:()=>view().rows,limit:()=>props.preferences.sectionItemLimit?.("todo")??0,resetKey:()=>JSON.stringify([targetKey(),mode()])
6967
6917
  })
6968
6918
  const state=createMemo18(()=>props.controller.state(props.sessionID))
6969
- createEffect17(()=>{const sessionID=props.sessionID
6919
+ createEffect19(()=>{const sessionID=props.sessionID
6970
6920
  targetKey()
6971
6921
  if(unavailable())
6972
6922
  return
6973
- const deactivate=untrack7(()=>props.controller.activate?.(sessionID)??(()=>{}))
6923
+ const deactivate=untrack8(()=>props.controller.activate?.(sessionID)??(()=>{}))
6974
6924
  onCleanup21(deactivate)
6975
- untrack7(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6925
+ untrack8(()=>void props.controller.refresh(sessionID).catch(()=>{}))
6976
6926
  })
6977
6927
  const navigationSection=()=>props.navigationSection??1
6978
6928
  return _$createComponent(Section,{get api(){return props.api
@@ -6980,10 +6930,10 @@ return _$createComponent(Section,{get api(){return props.api
6980
6930
  },sectionId:`${PLUGIN_ID}.section.todo`,get navigationSection(){return navigationSection()
6981
6931
  },title:"TODO",section:"todo",get summary(){return _$memo(()=>!!(unavailable()||managed()?.missing(props.sessionID)))()?"\u2014":`${view().counts.completed}/${list().length}`
6982
6932
  },get open(){return props.preferences.expanded().todo
6983
- },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()
6984
6934
  },get fallback(){return(()=>{var _el$=_$createElement("box")
6985
6935
  _$setProp(_el$,"gap",1)
6986
- _$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
6987
6937
  },get children(){return _$createComponent(TodoGuidanceControl,{get api(){return props.api
6988
6938
  },get controller(){return managed()
6989
6939
  },get sessionID(){return props.sessionID
@@ -6991,7 +6941,7 @@ _$insert(_el$,_$createComponent(Show24,{get when(){return managed()?.guidance(pr
6991
6941
  },get navigationSection(){return navigationSection()
6992
6942
  }})
6993
6943
  }}),null)
6994
- _$insert(_el$,_$createComponent(Show24,{get when(){return managed()?.missing(props.sessionID)
6944
+ _$insert(_el$,_$createComponent(Show26,{get when(){return managed()?.missing(props.sessionID)
6995
6945
  },get fallback(){return _$createComponent(SectionRequestBody,{get api(){return props.api
6996
6946
  },get interaction(){return props.interaction
6997
6947
  },id:`${PLUGIN_ID}.retry.todo`,get position(){return{section:navigationSection(),row:1,column:0
@@ -7040,10 +6990,11 @@ event.preventDefault()
7040
6990
  event.stopPropagation()
7041
6991
  props.interaction.leave()
7042
6992
  })
7043
- _$insert(_el$,_$createComponent(For19,{get each(){return visibleSections()
6993
+ _$insert(_el$,_$createComponent(For20,{get each(){return visibleSections()
7044
6994
  },children:(section,index)=>_$createComponent(SectionBoundary,{get api(){return props.api
7045
6995
  },get divided(){return index()<visibleSections().length-1
7046
- },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
7047
6998
  },get controller(){return props.todo
7048
6999
  }}))
7049
7000
  }}),_$createComponent(Match,{when:section==="subagents",get children(){return _$createComponent(SubagentSection,_$mergeProps(props,{get navigationSection(){return index() + 1
@@ -7075,7 +7026,7 @@ return _el$
7075
7026
 
7076
7027
 
7077
7028
  function McpPersistence(props){const persist=createMemo20(()=>props.controller.persist())
7078
- createEffect18(()=>{if(!props.api.state.ready)
7029
+ createEffect20(()=>{if(!props.api.state.ready)
7079
7030
  return
7080
7031
  persist()
7081
7032
  const route=props.api.route.current
@@ -7084,19 +7035,19 @@ if(typeof params?.sessionID!=="string")
7084
7035
  return
7085
7036
  const current=props.controller.target()
7086
7037
  onCleanup23(()=>props.controller.deactivate(current))
7087
- untrack8(()=>void props.controller.activate(current).catch(()=>{}))
7038
+ untrack9(()=>void props.controller.activate(current).catch(()=>{}))
7088
7039
  })
7089
7040
  return _$createElement("box")
7090
7041
  }
7091
- function PreferencesPersistence(props){createEffect18(()=>{const location=currentLocation(props.api)
7092
- 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
7093
7044
  })))
7094
7045
  props.controller.load()
7095
7046
  })
7096
7047
  return _$createElement("box")
7097
7048
  }
7098
7049
  function FirstRunWizardPersistence(props){let isChecked=false
7099
- createEffect18(()=>{if(isChecked)
7050
+ createEffect20(()=>{if(isChecked)
7100
7051
  return
7101
7052
  isChecked=true
7102
7053
  showFirstRunWizard(props.api,props.preferences).catch(()=>{})
@@ -7134,7 +7085,7 @@ _$setProp(_el$2,"flexDirection","row")
7134
7085
  _$setProp(_el$2,"justifyContent","space-between")
7135
7086
  _$setProp(_el$2,"gap",1)
7136
7087
  _$setProp(_el$3,"flexGrow",1)
7137
- _$insert(_el$3,_$createComponent(Show25,{get when(){return props.preferences.showSessionTitle()
7088
+ _$insert(_el$3,_$createComponent(Show27,{get when(){return props.preferences.showSessionTitle()
7138
7089
  },get children(){var _el$4=_$createElement("text"),_el$5=_$createElement("b")
7139
7090
  _$insertNode(_el$4,_el$5)
7140
7091
  _$setProp(_el$4,"wrapMode","word")
@@ -7142,7 +7093,7 @@ _$insert(_el$5,()=>props.title)
7142
7093
  _$effect((_$p)=>_$setProp(_el$4,"fg",theme().text,_$p))
7143
7094
  return _el$4
7144
7095
  }}),null)
7145
- _$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()
7146
7097
  },children:(value)=>(()=>{var _el$6=_$createElement("text")
7147
7098
  _$insert(_el$6,value)
7148
7099
  _$effect((_$p)=>_$setProp(_el$6,"fg",theme().textMuted,_$p))
@@ -7182,6 +7133,17 @@ return
7182
7133
  const [user,project]=await Promise.all([safe(userPath?readSource(userPath,()=>readFile2(userPath,"utf8")):undefined),safe(readProject?readSource(".opencode/navigator.json",readProject):undefined)])
7183
7134
  return mergeConfiguredDefaults(configuredDefaultsFromPluginOptions(options),user,project)
7184
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
+ }
7185
7147
  import {homedir,homedir as homedir2} from "os"
7186
7148
 
7187
7149
  function location(input){return input.directory?{location:{directory:input.directory}}:{}}
@@ -7275,7 +7237,7 @@ return false
7275
7237
  }
7276
7238
  function enabled(value){return typeof value==="function"?value():value!==false
7277
7239
  }
7278
- function createV2Keymap(context){const [revision,setRevision]=createSignal30(0)
7240
+ function createV2Keymap(context){const [revision,setRevision]=createSignal32(0)
7279
7241
  const layers=new Map
7280
7242
  let sequence=0
7281
7243
  function layerActive(layer){const mode=layer.mode??"base"
@@ -7386,7 +7348,7 @@ function legacyTheme(theme){return{primary:theme.hue.interactive[200],secondary:
7386
7348
 
7387
7349
  function createV2UI(context){let dialogOpen=false
7388
7350
  function DialogPrompt(props){let active=true
7389
- onCleanup25(()=>{active=false
7351
+ onCleanup26(()=>{active=false
7390
7352
  })
7391
7353
  onMount7(async ()=>{const value=await context.ui.dialog.prompt({title:props.title,placeholder:props.placeholder,value:props.value
7392
7354
  })
@@ -7400,7 +7362,7 @@ props.onConfirm?.(value)
7400
7362
  return _$createElement("box")
7401
7363
  }
7402
7364
  function DialogConfirm(props){let active=true
7403
- onCleanup25(()=>{active=false
7365
+ onCleanup26(()=>{active=false
7404
7366
  })
7405
7367
  onMount7(async ()=>{const confirmed=await context.ui.dialog.confirm({title:props.title,message:props.message
7406
7368
  })
@@ -7472,6 +7434,11 @@ for(let index=disposers.length-1;index>=0; index--)
7472
7434
  await disposers[index]()
7473
7435
  disposers.length=0
7474
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}}}
7475
7442
 
7476
7443
 
7477
7444
  import {fileURLToPath} from "url"
@@ -7538,16 +7505,28 @@ if(item.source.target.startsWith("."))
7538
7505
  throw new Error("Unrecognized local Navigator source")
7539
7506
  await context.client.plugin.update({location:response.location,targets:[item.source.target]})
7540
7507
  }}}
7541
- async function setupNavigator(api,options,readProject,managedTodo){const config=pluginConfig(undefined)
7508
+ async function setupNavigator(api,options,readProject,managedTodo,selectedModel){const config=pluginConfig(undefined)
7542
7509
  const configured=await loadConfiguredDefaults(api,options,readProject)
7543
7510
  const todo=managedTodo??createTodoController(api)
7544
7511
  const subagents=createSubagentController(api)
7545
7512
  const skills=createSkillController(api)
7546
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)
7547
7525
  const mcp=createMcpController(api,preferences.persistMcp,preferences)
7548
7526
  const interaction=createSidebarInteraction(api,()=>openKeyboardHelp(api,preferences.lspIconStyle,preferences.cornerFont))
7549
7527
  const startup=createStartupSessionController(api,preferences)
7550
7528
  api.lifecycle.onDispose(()=>preferences.flush())
7529
+ api.lifecycle.onDispose(()=>limits.dispose())
7551
7530
  api.lifecycle.onDispose(()=>interaction.dispose())
7552
7531
  const unsubscribeMcp=api.event.on("mcp.tools.changed",()=>{mcp.refresh().catch(()=>{})
7553
7532
  })
@@ -7560,6 +7539,7 @@ api.lifecycle.onDispose(unsubscribeConnected)
7560
7539
  api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7561
7540
  },get multilineCorners(){return preferences.cornerFont
7562
7541
  },get children(){return [_$createComponent(PreferencesPersistence,{api,controller:preferences
7542
+ }),_$createComponent(LimitsPersistence,{controller:limits
7563
7543
  }),_$memo(()=>_$memo(()=>!!supportsPermissionMode(api))()&&_$createComponent(PermissionModeBinding,{api,preferences
7564
7544
  })),_$createComponent(SettingsBinding,{api,preferences,mcp,skills
7565
7545
  }),_$createComponent(SidebarToggleBinding,{api,preferences
@@ -7568,7 +7548,7 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7568
7548
  },interaction,skills,subagents,mcp
7569
7549
  }),_$createComponent(FirstRunWizardPersistence,{api,preferences
7570
7550
  }),_$createComponent(StartupSessionBinding,{api,controller:startup
7571
- }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.19.3"
7551
+ }),_$createComponent(UpgradeNotesBinding,{api,preferences,version:"0.20.0"
7572
7552
  }),_$createComponent(McpPersistence,{api,controller:mcp
7573
7553
  })]
7574
7554
  }})
@@ -7581,7 +7561,8 @@ api.slots.register({order:100,slots:{app(){return _$createComponent(IconProvider
7581
7561
  },sidebar_content(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7582
7562
  },get multilineCorners(){return preferences.cornerFont
7583
7563
  },get children(){return _$createComponent(SidebarContent,{api,get onNewSession(){return startup.handleNewSession
7584
- },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
7585
7566
  }})
7586
7567
  }})
7587
7568
  }}})
@@ -7598,12 +7579,12 @@ throw result.error
7598
7579
  }
7599
7580
  return result.data?.type==="text"?result.data.content:undefined
7600
7581
  })
7601
- const versionStatus=createVersionStatus(api,"0.19.3")
7602
- const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.3"))
7582
+ const versionStatus=createVersionStatus(api,"0.20.0")
7583
+ const versionUpdates=createVersionUpdateActions(api,versionStatus,createOpenCodeV1VersionUpdater(api,meta),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.20.0"))
7603
7584
  api.slots.register({order:90,slots:{sidebar_footer(_context,props){return _$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7604
7585
  },get multilineCorners(){return preferences.cornerFont
7605
7586
  },get children(){return _$createComponent(VersionFooter,{api,get sessionID(){return props.session_id
7606
- },navigatorVersion:"0.19.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7587
+ },navigatorVersion:"0.20.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7607
7588
  },get onNavigatorUpdate(){return versionUpdates.navigator
7608
7589
  }})
7609
7590
  }})
@@ -7616,16 +7597,16 @@ const{mcp,skills,preferences
7616
7597
  return
7617
7598
  return new TextDecoder().decode(await context.client.file.read({location:context.location,path:".opencode/navigator.json"
7618
7599
  }))
7619
- },todo)
7620
- const versionStatus=createVersionStatus(adapter.api,"0.19.3")
7621
- const versionUpdates=createVersionUpdateActions(adapter.api,versionStatus,createOpenCodeV2VersionUpdater(context),()=>preferences.rememberNavigatorVersionBeforeUpdate("0.19.3"))
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"))
7622
7603
  const disposeFooter=context.ui.slot({append:"sidebar.footer",render:()=>_$createComponent(IconProvider,{get style(){return preferences.lspIconStyle
7623
7604
  },get multilineCorners(){return preferences.cornerFont
7624
7605
  },get children(){var _el$=_$createElement("box")
7625
7606
  _$setProp(_el$,"flexDirection","row")
7626
7607
  _$setProp(_el$,"justifyContent","space-between")
7627
7608
  _$insert(_el$,_$createComponent(VersionSummary,{get api(){return adapter.api
7628
- },navigatorVersion:"0.19.3",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7609
+ },navigatorVersion:"0.20.0",status:versionStatus,get onOpenCodeUpdate(){return versionUpdates.openCode
7629
7610
  },get onNavigatorUpdate(){return versionUpdates.navigator
7630
7611
  }}),null)
7631
7612
  _$insert(_el$,_$createComponent(SettingsFooterButton,{get api(){return adapter.api
@@ -7640,5 +7621,5 @@ await adapter.dispose()
7640
7621
  var plugin={id:PLUGIN_ID,tui:setupOpenCodeV1,setup:setupOpenCodeV2
7641
7622
  }
7642
7623
  var plugin_default=plugin
7643
- 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
7644
7625
  }