dexto 1.5.6 → 1.5.8

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.
Files changed (226) hide show
  1. package/README.md +13 -0
  2. package/dist/agents/coding-agent/coding-agent.yml +17 -0
  3. package/dist/agents/coding-agent/skills/code-review.md +46 -0
  4. package/dist/agents/explore-agent/explore-agent.yml +2 -0
  5. package/dist/analytics/events.d.ts +1 -1
  6. package/dist/analytics/events.d.ts.map +1 -1
  7. package/dist/api/server-hono.d.ts.map +1 -1
  8. package/dist/api/server-hono.js +55 -10
  9. package/dist/cli/assets/dexto-logo.svg +31 -0
  10. package/dist/cli/auth/api-client.d.ts +49 -0
  11. package/dist/cli/auth/api-client.d.ts.map +1 -0
  12. package/dist/cli/auth/api-client.js +127 -0
  13. package/dist/cli/auth/constants.d.ts +27 -0
  14. package/dist/cli/auth/constants.d.ts.map +1 -0
  15. package/dist/cli/auth/constants.js +28 -0
  16. package/dist/cli/auth/index.d.ts +5 -0
  17. package/dist/cli/auth/index.d.ts.map +1 -0
  18. package/dist/cli/auth/index.js +6 -0
  19. package/dist/cli/auth/oauth.d.ts +26 -0
  20. package/dist/cli/auth/oauth.d.ts.map +1 -0
  21. package/dist/cli/auth/oauth.js +327 -0
  22. package/dist/cli/auth/service.d.ts +20 -0
  23. package/dist/cli/auth/service.d.ts.map +1 -0
  24. package/dist/cli/auth/service.js +147 -0
  25. package/dist/cli/commands/auth/index.d.ts +4 -0
  26. package/dist/cli/commands/auth/index.d.ts.map +1 -0
  27. package/dist/cli/commands/auth/index.js +4 -0
  28. package/dist/cli/commands/auth/login.d.ts +9 -0
  29. package/dist/cli/commands/auth/login.d.ts.map +1 -0
  30. package/dist/cli/commands/auth/login.js +255 -0
  31. package/dist/cli/commands/auth/logout.d.ts +5 -0
  32. package/dist/cli/commands/auth/logout.d.ts.map +1 -0
  33. package/dist/cli/commands/auth/logout.js +51 -0
  34. package/dist/cli/commands/auth/status.d.ts +2 -0
  35. package/dist/cli/commands/auth/status.d.ts.map +1 -0
  36. package/dist/cli/commands/auth/status.js +22 -0
  37. package/dist/cli/commands/billing/index.d.ts +2 -0
  38. package/dist/cli/commands/billing/index.d.ts.map +1 -0
  39. package/dist/cli/commands/billing/index.js +2 -0
  40. package/dist/cli/commands/billing/status.d.ts +8 -0
  41. package/dist/cli/commands/billing/status.d.ts.map +1 -0
  42. package/dist/cli/commands/billing/status.js +82 -0
  43. package/dist/cli/commands/index.d.ts +3 -0
  44. package/dist/cli/commands/index.d.ts.map +1 -1
  45. package/dist/cli/commands/index.js +8 -0
  46. package/dist/cli/commands/interactive-commands/auth/index.d.ts +12 -0
  47. package/dist/cli/commands/interactive-commands/auth/index.d.ts.map +1 -0
  48. package/dist/cli/commands/interactive-commands/auth/index.js +20 -0
  49. package/dist/cli/commands/interactive-commands/command-parser.d.ts +5 -0
  50. package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
  51. package/dist/cli/commands/interactive-commands/command-parser.js +6 -0
  52. package/dist/cli/commands/interactive-commands/commands.d.ts +1 -0
  53. package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
  54. package/dist/cli/commands/interactive-commands/commands.js +8 -0
  55. package/dist/cli/commands/interactive-commands/mcp/index.d.ts +2 -2
  56. package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +1 -1
  57. package/dist/cli/commands/interactive-commands/mcp/index.js +4 -7
  58. package/dist/cli/commands/interactive-commands/model/index.d.ts +2 -2
  59. package/dist/cli/commands/interactive-commands/model/index.d.ts.map +1 -1
  60. package/dist/cli/commands/interactive-commands/model/index.js +4 -7
  61. package/dist/cli/commands/interactive-commands/plugin/index.d.ts +13 -0
  62. package/dist/cli/commands/interactive-commands/plugin/index.d.ts.map +1 -0
  63. package/dist/cli/commands/interactive-commands/plugin/index.js +18 -0
  64. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +3 -1
  65. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
  66. package/dist/cli/commands/interactive-commands/prompt-commands.js +88 -36
  67. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  68. package/dist/cli/commands/list-agents.js +3 -2
  69. package/dist/cli/commands/plugin.d.ts +161 -0
  70. package/dist/cli/commands/plugin.d.ts.map +1 -0
  71. package/dist/cli/commands/plugin.js +376 -0
  72. package/dist/cli/commands/setup.d.ts +9 -9
  73. package/dist/cli/commands/setup.d.ts.map +1 -1
  74. package/dist/cli/commands/setup.js +944 -176
  75. package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
  76. package/dist/cli/ink-cli/InkCLIRefactored.js +13 -2
  77. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +1 -1
  78. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
  79. package/dist/cli/ink-cli/components/ApprovalPrompt.js +80 -12
  80. package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts +18 -0
  81. package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts.map +1 -0
  82. package/dist/cli/ink-cli/components/BackgroundTasksPanel.js +48 -0
  83. package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
  84. package/dist/cli/ink-cli/components/Footer.d.ts +2 -1
  85. package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
  86. package/dist/cli/ink-cli/components/Footer.js +6 -2
  87. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
  88. package/dist/cli/ink-cli/components/ResourceAutocomplete.js +150 -41
  89. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +1 -1
  90. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +15 -7
  91. package/dist/cli/ink-cli/components/StatusBar.d.ts +7 -1
  92. package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
  93. package/dist/cli/ink-cli/components/StatusBar.js +18 -2
  94. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
  95. package/dist/cli/ink-cli/components/chat/MessageItem.js +23 -6
  96. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  97. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +5 -1
  98. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
  99. package/dist/cli/ink-cli/components/modes/StaticCLI.js +5 -1
  100. package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.js +1 -1
  101. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
  102. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +8 -4
  103. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +1 -0
  104. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -1
  105. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +31 -20
  106. package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts +20 -0
  107. package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.d.ts.map +1 -0
  108. package/dist/cli/ink-cli/components/overlays/MarketplaceAddPrompt.js +81 -0
  109. package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts +31 -0
  110. package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.d.ts.map +1 -0
  111. package/dist/cli/ink-cli/components/overlays/MarketplaceBrowser.js +297 -0
  112. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -1
  113. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +8 -2
  114. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +1 -1
  115. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -1
  116. package/dist/cli/ink-cli/components/overlays/McpServerActions.js +9 -0
  117. package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -1
  118. package/dist/cli/ink-cli/components/overlays/McpServerList.js +9 -2
  119. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +1 -0
  120. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  121. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +150 -34
  122. package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts +27 -0
  123. package/dist/cli/ink-cli/components/overlays/PluginActions.d.ts.map +1 -0
  124. package/dist/cli/ink-cli/components/overlays/PluginActions.js +66 -0
  125. package/dist/cli/ink-cli/components/overlays/PluginList.d.ts +21 -0
  126. package/dist/cli/ink-cli/components/overlays/PluginList.d.ts.map +1 -0
  127. package/dist/cli/ink-cli/components/overlays/PluginList.js +70 -0
  128. package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts +21 -0
  129. package/dist/cli/ink-cli/components/overlays/PluginManager.d.ts.map +1 -0
  130. package/dist/cli/ink-cli/components/overlays/PluginManager.js +63 -0
  131. package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -1
  132. package/dist/cli/ink-cli/components/overlays/PromptList.js +4 -1
  133. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +1 -0
  134. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -1
  135. package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +281 -39
  136. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +10 -1
  137. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
  138. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +87 -2
  139. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +4 -2
  140. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +1 -1
  141. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +4 -4
  142. package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
  143. package/dist/cli/ink-cli/containers/InputContainer.js +32 -5
  144. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
  145. package/dist/cli/ink-cli/containers/OverlayContainer.js +384 -28
  146. package/dist/cli/ink-cli/hooks/index.d.ts +1 -0
  147. package/dist/cli/ink-cli/hooks/index.d.ts.map +1 -1
  148. package/dist/cli/ink-cli/hooks/index.js +1 -0
  149. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
  150. package/dist/cli/ink-cli/hooks/useAgentEvents.js +61 -0
  151. package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
  152. package/dist/cli/ink-cli/hooks/useCLIState.js +5 -0
  153. package/dist/cli/ink-cli/hooks/useGitBranch.d.ts +13 -0
  154. package/dist/cli/ink-cli/hooks/useGitBranch.d.ts.map +1 -0
  155. package/dist/cli/ink-cli/hooks/useGitBranch.js +35 -0
  156. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -1
  157. package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +53 -6
  158. package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
  159. package/dist/cli/ink-cli/services/processStream.js +92 -12
  160. package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
  161. package/dist/cli/ink-cli/state/initialState.js +5 -0
  162. package/dist/cli/ink-cli/state/types.d.ts +12 -1
  163. package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
  164. package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +1 -1
  165. package/dist/cli/ink-cli/utils/commandOverlays.js +1 -0
  166. package/dist/cli/ink-cli/utils/llm-provider-display.d.ts +3 -0
  167. package/dist/cli/ink-cli/utils/llm-provider-display.d.ts.map +1 -0
  168. package/dist/cli/ink-cli/utils/llm-provider-display.js +22 -0
  169. package/dist/cli/ink-cli/utils/messageFormatting.d.ts +18 -7
  170. package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
  171. package/dist/cli/ink-cli/utils/messageFormatting.js +143 -15
  172. package/dist/cli/ink-cli/utils/toolUtils.d.ts +11 -0
  173. package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
  174. package/dist/cli/ink-cli/utils/toolUtils.js +17 -0
  175. package/dist/cli/mcp/index.d.ts +8 -0
  176. package/dist/cli/mcp/index.d.ts.map +1 -0
  177. package/dist/cli/mcp/index.js +7 -0
  178. package/dist/cli/mcp/oauth-factory.d.ts +6 -0
  179. package/dist/cli/mcp/oauth-factory.d.ts.map +1 -0
  180. package/dist/cli/mcp/oauth-factory.js +25 -0
  181. package/dist/cli/mcp/oauth-provider.d.ts +10 -0
  182. package/dist/cli/mcp/oauth-provider.d.ts.map +1 -0
  183. package/dist/cli/mcp/oauth-provider.js +77 -0
  184. package/dist/cli/mcp/oauth-redirect.d.ts +3 -0
  185. package/dist/cli/mcp/oauth-redirect.d.ts.map +1 -0
  186. package/dist/cli/mcp/oauth-redirect.js +4 -0
  187. package/dist/cli/mcp/oauth-server.d.ts +2 -0
  188. package/dist/cli/mcp/oauth-server.d.ts.map +1 -0
  189. package/dist/cli/mcp/oauth-server.js +70 -0
  190. package/dist/cli/mcp/oauth-store.d.ts +10 -0
  191. package/dist/cli/mcp/oauth-store.d.ts.map +1 -0
  192. package/dist/cli/mcp/oauth-store.js +27 -0
  193. package/dist/cli/mcp/oauth-ui.d.ts +2 -0
  194. package/dist/cli/mcp/oauth-ui.d.ts.map +1 -0
  195. package/dist/cli/mcp/oauth-ui.js +12 -0
  196. package/dist/cli/mcp/oauth-utils.d.ts +2 -0
  197. package/dist/cli/mcp/oauth-utils.d.ts.map +1 -0
  198. package/dist/cli/mcp/oauth-utils.js +17 -0
  199. package/dist/cli/utils/api-key-verification.d.ts.map +1 -1
  200. package/dist/cli/utils/api-key-verification.js +36 -0
  201. package/dist/cli/utils/config-validation.d.ts +3 -1
  202. package/dist/cli/utils/config-validation.d.ts.map +1 -1
  203. package/dist/cli/utils/config-validation.js +42 -19
  204. package/dist/cli/utils/dexto-auth-check.d.ts +53 -0
  205. package/dist/cli/utils/dexto-auth-check.d.ts.map +1 -0
  206. package/dist/cli/utils/dexto-auth-check.js +104 -0
  207. package/dist/cli/utils/dexto-setup.d.ts +8 -0
  208. package/dist/cli/utils/dexto-setup.d.ts.map +1 -0
  209. package/dist/cli/utils/dexto-setup.js +17 -0
  210. package/dist/cli/utils/options.d.ts.map +1 -1
  211. package/dist/cli/utils/options.js +5 -1
  212. package/dist/cli/utils/provider-setup.d.ts +5 -1
  213. package/dist/cli/utils/provider-setup.d.ts.map +1 -1
  214. package/dist/cli/utils/provider-setup.js +29 -1
  215. package/dist/config/cli-overrides.d.ts +17 -8
  216. package/dist/config/cli-overrides.d.ts.map +1 -1
  217. package/dist/config/cli-overrides.js +36 -22
  218. package/dist/config/effective-llm.d.ts +123 -0
  219. package/dist/config/effective-llm.d.ts.map +1 -0
  220. package/dist/config/effective-llm.js +171 -0
  221. package/dist/index.js +404 -99
  222. package/dist/webui/assets/index-C9JXwpvo.css +1 -0
  223. package/dist/webui/assets/{index-DVQWNLpT.js → index-Cz2z7NQ8.js} +218 -218
  224. package/dist/webui/index.html +2 -2
  225. package/package.json +9 -8
  226. package/dist/webui/assets/index-BglIVTSG.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/McpServerList.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAGpF,MAAM,MAAM,mBAAmB,GACzB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAoCD;;GAEG;AACH,QAAA,MAAM,aAAa,gGA4HjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"McpServerList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/McpServerList.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAGpF,MAAM,MAAM,mBAAmB,GACzB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAwCD;;GAEG;AACH,QAAA,MAAM,aAAa,gGA+HjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -16,6 +16,8 @@ function getStatusIcon(status) {
16
16
  return '🟢';
17
17
  case 'disconnected':
18
18
  return '⚪';
19
+ case 'auth-required':
20
+ return '🔐';
19
21
  case 'error':
20
22
  return '🔴';
21
23
  }
@@ -29,6 +31,8 @@ function getStatusText(status) {
29
31
  return 'connected';
30
32
  case 'disconnected':
31
33
  return 'disabled';
34
+ case 'auth-required':
35
+ return 'auth required';
32
36
  case 'error':
33
37
  return 'failed';
34
38
  }
@@ -59,7 +63,8 @@ const McpServerList = forwardRef(function McpServerList({ isVisible, onAction, o
59
63
  const order = {
60
64
  connected: 0,
61
65
  disconnected: 1,
62
- error: 2,
66
+ 'auth-required': 2,
67
+ error: 3,
63
68
  };
64
69
  return order[a.status] - order[b.status];
65
70
  });
@@ -93,7 +98,9 @@ const McpServerList = forwardRef(function McpServerList({ isVisible, onAction, o
93
98
  ? 'green'
94
99
  : server.status === 'disconnected'
95
100
  ? 'gray'
96
- : 'red', children: ["[", statusText, "]"] })] }));
101
+ : server.status === 'auth-required'
102
+ ? 'yellow'
103
+ : 'red', children: ["[", statusText, "]"] })] }));
97
104
  };
98
105
  // Handle selection
99
106
  const handleSelect = (item) => {
@@ -11,6 +11,7 @@ type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
11
11
  interface ModelSelectorProps {
12
12
  isVisible: boolean;
13
13
  onSelectModel: (provider: LLMProvider, model: string, displayName?: string, baseURL?: string, reasoningEffort?: ReasoningEffort) => void;
14
+ onSetDefaultModel: (provider: LLMProvider, model: string, displayName?: string, baseURL?: string, reasoningEffort?: ReasoningEffort) => Promise<void>;
14
15
  onClose: () => void;
15
16
  onAddCustomModel: () => void;
16
17
  onEditCustomModel: (model: CustomModel) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,EAIH,KAAK,WAAW,EACnB,MAAM,yBAAyB,CAAC;AAEjC,KAAK,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhF,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,KAChC,IAAI,CAAC;IACV,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAiDD;;GAEG;AACH,QAAA,MAAM,aAAa,oHA4rBjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ModelSelectorRefactored.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ModelSelectorRefactored.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,EAMH,KAAK,WAAW,EACnB,MAAM,yBAAyB,CAAC;AAGjC,KAAK,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhF,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,KAChC,IAAI,CAAC;IACV,iBAAiB,EAAE,CACf,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,eAAe,KAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAoDD;;GAEG;AACH,QAAA,MAAM,aAAa,oHAq3BjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -8,7 +8,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
8
8
  import { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, useCallback, } from 'react';
9
9
  import { Box, Text } from 'ink';
10
10
  import { listOllamaModels, DEFAULT_OLLAMA_URL, getLocalModelById, isReasoningCapableModel, } from '@dexto/core';
11
- import { loadCustomModels, deleteCustomModel, getAllInstalledModels, } from '@dexto/agent-management';
11
+ import { loadCustomModels, deleteCustomModel, getAllInstalledModels, loadGlobalPreferences, isDextoAuthEnabled, } from '@dexto/agent-management';
12
+ import { getLLMProviderDisplayName } from '../../utils/llm-provider-display.js';
12
13
  function isAddCustomOption(item) {
13
14
  return 'type' in item && item.type === 'add-custom';
14
15
  }
@@ -34,7 +35,7 @@ const REASONING_EFFORT_OPTIONS = [
34
35
  /**
35
36
  * Model selector with search and custom model support
36
37
  */
37
- const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectModel, onClose, onAddCustomModel, onEditCustomModel, agent }, ref) {
38
+ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectModel, onSetDefaultModel, onClose, onAddCustomModel, onEditCustomModel, agent, }, ref) {
38
39
  const [models, setModels] = useState([]);
39
40
  const [customModels, setCustomModels] = useState([]);
40
41
  const [isLoading, setIsLoading] = useState(false);
@@ -48,6 +49,8 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
48
49
  // Reasoning effort sub-step state
49
50
  const [pendingReasoningModel, setPendingReasoningModel] = useState(null);
50
51
  const [reasoningEffortIndex, setReasoningEffortIndex] = useState(0); // Default to 'Auto' (index 0)
52
+ const [isSettingDefault, setIsSettingDefault] = useState(false); // Track if setting as default vs normal selection
53
+ const [refreshVersion, setRefreshVersion] = useState(0);
51
54
  // Keep ref in sync
52
55
  selectedIndexRef.current = selectedIndex;
53
56
  // Clear delete confirmation timeout on unmount
@@ -70,6 +73,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
70
73
  setCustomModelAction(null);
71
74
  setPendingDeleteConfirm(false);
72
75
  setPendingReasoningModel(null);
76
+ setIsSettingDefault(false);
73
77
  setReasoningEffortIndex(0); // Default to 'Auto'
74
78
  if (deleteTimeoutRef.current) {
75
79
  clearTimeout(deleteTimeoutRef.current);
@@ -77,13 +81,18 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
77
81
  }
78
82
  const fetchModels = async () => {
79
83
  try {
80
- const [allModels, providers, currentConfig, loadedCustomModels] = await Promise.all([
84
+ const [allModels, providers, currentConfig, loadedCustomModels, preferences] = await Promise.all([
81
85
  Promise.resolve(agent.getSupportedModels()),
82
86
  Promise.resolve(agent.getSupportedProviders()),
83
87
  Promise.resolve(agent.getCurrentLLMConfig()),
84
88
  loadCustomModels(),
89
+ loadGlobalPreferences().catch(() => null),
85
90
  ]);
86
91
  const modelList = [];
92
+ const defaultProvider = preferences?.llm.provider;
93
+ const defaultModel = preferences?.llm.model;
94
+ const defaultBaseURL = preferences?.llm.baseURL;
95
+ const defaultReasoningEffort = preferences?.llm.reasoningEffort;
87
96
  // Fetch dynamic models for local providers
88
97
  let ollamaModels = [];
89
98
  let localModels = [];
@@ -109,8 +118,8 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
109
118
  provider: customProvider,
110
119
  name: custom.name,
111
120
  displayName: custom.displayName || custom.name,
112
- maxInputTokens: custom.maxInputTokens || 128000,
113
- isDefault: false,
121
+ maxInputTokens: custom.maxInputTokens ?? 128000,
122
+ isDefault: customProvider === defaultProvider && custom.name === defaultModel,
114
123
  isCurrent: currentConfig.provider === customProvider &&
115
124
  currentConfig.model === custom.name,
116
125
  isCustom: true,
@@ -118,6 +127,9 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
118
127
  if (custom.baseURL) {
119
128
  modelOption.baseURL = custom.baseURL;
120
129
  }
130
+ if (custom.reasoningEffort) {
131
+ modelOption.reasoningEffort = custom.reasoningEffort;
132
+ }
121
133
  modelList.push(modelOption);
122
134
  }
123
135
  // Add registry models
@@ -134,17 +146,36 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
134
146
  if (provider === 'ollama' || provider === 'local' || provider === 'vertex') {
135
147
  continue;
136
148
  }
149
+ // Skip dexto-nova provider when feature is not enabled
150
+ if (provider === 'dexto-nova' && !isDextoAuthEnabled()) {
151
+ continue;
152
+ }
137
153
  const providerModels = allModels[provider];
138
154
  for (const model of providerModels) {
155
+ // For dexto-nova provider, models have originalProvider field
156
+ // showing which provider the model originally came from
157
+ const originalProvider = 'originalProvider' in model ? model.originalProvider : undefined;
139
158
  modelList.push({
140
159
  provider,
141
160
  name: model.name,
142
161
  displayName: model.displayName,
143
162
  maxInputTokens: model.maxInputTokens,
144
- isDefault: model.isDefault,
163
+ isDefault: provider === defaultProvider && model.name === defaultModel,
145
164
  isCurrent: provider === currentConfig.provider &&
146
165
  model.name === currentConfig.model,
147
166
  isCustom: false,
167
+ ...(defaultReasoningEffort &&
168
+ provider === defaultProvider &&
169
+ model.name === defaultModel
170
+ ? { reasoningEffort: defaultReasoningEffort }
171
+ : {}),
172
+ ...(defaultBaseURL &&
173
+ provider === defaultProvider &&
174
+ model.name === defaultModel
175
+ ? { baseURL: defaultBaseURL }
176
+ : {}),
177
+ // Store original provider for display purposes
178
+ ...(originalProvider && { originalProvider }),
148
179
  });
149
180
  }
150
181
  }
@@ -155,7 +186,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
155
186
  name: ollamaModel.name,
156
187
  displayName: ollamaModel.name,
157
188
  maxInputTokens: 128000, // Default, actual varies by model
158
- isDefault: false,
189
+ isDefault: defaultProvider === 'ollama' && defaultModel === ollamaModel.name,
159
190
  isCurrent: currentConfig.provider === 'ollama' &&
160
191
  currentConfig.model === ollamaModel.name,
161
192
  isCustom: false,
@@ -172,7 +203,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
172
203
  name: localModel.id,
173
204
  displayName,
174
205
  maxInputTokens,
175
- isDefault: false,
206
+ isDefault: defaultProvider === 'local' && defaultModel === localModel.id,
176
207
  isCurrent: currentConfig.provider === 'local' &&
177
208
  currentConfig.model === localModel.id,
178
209
  isCustom: false,
@@ -187,10 +218,15 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
187
218
  name: model.name,
188
219
  displayName: model.displayName,
189
220
  maxInputTokens: model.maxInputTokens,
190
- isDefault: model.isDefault,
221
+ isDefault: defaultProvider === 'vertex' && defaultModel === model.name,
191
222
  isCurrent: currentConfig.provider === 'vertex' &&
192
223
  currentConfig.model === model.name,
193
224
  isCustom: false,
225
+ ...(defaultReasoningEffort &&
226
+ defaultProvider === 'vertex' &&
227
+ defaultModel === model.name
228
+ ? { reasoningEffort: defaultReasoningEffort }
229
+ : {}),
194
230
  });
195
231
  }
196
232
  }
@@ -217,7 +253,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
217
253
  return () => {
218
254
  cancelled = true;
219
255
  };
220
- }, [isVisible, agent]);
256
+ }, [isVisible, agent, refreshVersion]);
221
257
  // Filter models based on search query
222
258
  const filteredItems = useMemo(() => {
223
259
  const addCustomOption = { type: 'add-custom' };
@@ -284,6 +320,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
284
320
  if (key.escape) {
285
321
  // Go back to model selection
286
322
  setPendingReasoningModel(null);
323
+ setIsSettingDefault(false);
287
324
  return true;
288
325
  }
289
326
  if (key.upArrow) {
@@ -297,8 +334,21 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
297
334
  if (key.return) {
298
335
  const selectedOption = REASONING_EFFORT_OPTIONS[reasoningEffortIndex];
299
336
  const reasoningEffort = selectedOption?.value === 'auto' ? undefined : selectedOption?.value;
300
- onSelectModel(pendingReasoningModel.provider, pendingReasoningModel.name, pendingReasoningModel.displayName, pendingReasoningModel.baseURL, reasoningEffort);
337
+ if (isSettingDefault) {
338
+ // Setting as default model
339
+ clearActionState();
340
+ void (async () => {
341
+ await onSetDefaultModel(pendingReasoningModel.provider, pendingReasoningModel.name, pendingReasoningModel.displayName, pendingReasoningModel.baseURL, reasoningEffort);
342
+ setRefreshVersion((prev) => prev + 1);
343
+ onClose(); // Close overlay after setting default
344
+ })();
345
+ }
346
+ else {
347
+ // Normal model selection
348
+ onSelectModel(pendingReasoningModel.provider, pendingReasoningModel.name, pendingReasoningModel.displayName, pendingReasoningModel.baseURL, reasoningEffort);
349
+ }
301
350
  setPendingReasoningModel(null);
351
+ setIsSettingDefault(false);
302
352
  return true;
303
353
  }
304
354
  return true; // Consume all input in reasoning effort mode
@@ -315,26 +365,50 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
315
365
  }
316
366
  const itemsLength = filteredItems.length;
317
367
  const currentItem = filteredItems[selectedIndexRef.current];
318
- const isOnCustomModel = currentItem && !isAddCustomOption(currentItem) && currentItem.isCustom;
319
- // Right arrow - enter/advance action mode for custom models
368
+ const isCustomActionItem = currentItem && !isAddCustomOption(currentItem) && currentItem.isCustom;
369
+ const isSelectableItem = currentItem && !isAddCustomOption(currentItem);
370
+ const isOnActionItem = isCustomActionItem || isSelectableItem;
371
+ // Right arrow - enter/advance action mode for custom or selectable models
320
372
  if (key.rightArrow) {
321
- if (!isOnCustomModel)
373
+ if (!isOnActionItem)
322
374
  return false;
323
375
  if (customModelAction === null) {
324
- // Enter edit mode
325
- setCustomModelAction('edit');
376
+ if (isCustomActionItem) {
377
+ setCustomModelAction('edit');
378
+ }
379
+ else {
380
+ setCustomModelAction('default');
381
+ }
326
382
  return true;
327
383
  }
328
- else if (customModelAction === 'edit') {
329
- // Advance to delete mode
330
- setCustomModelAction('delete');
331
- setPendingDeleteConfirm(false);
384
+ if (customModelAction === 'edit') {
385
+ setCustomModelAction('default');
332
386
  return true;
333
387
  }
334
- else if (customModelAction === 'delete') {
335
- // In delete mode, right arrow confirms deletion
388
+ if (customModelAction === 'default') {
389
+ if (isCustomActionItem) {
390
+ setCustomModelAction('delete');
391
+ setPendingDeleteConfirm(false);
392
+ return true;
393
+ }
394
+ const actionItem = currentItem;
395
+ // Check if reasoning-capable, show reasoning effort selection
396
+ if (isReasoningCapableModel(actionItem.name)) {
397
+ setPendingReasoningModel(actionItem);
398
+ setIsSettingDefault(true);
399
+ setReasoningEffortIndex(0); // Default to 'Auto'
400
+ return true;
401
+ }
402
+ clearActionState();
403
+ void (async () => {
404
+ await onSetDefaultModel(actionItem.provider, actionItem.name, actionItem.displayName, actionItem.baseURL, actionItem.reasoningEffort);
405
+ setRefreshVersion((prev) => prev + 1);
406
+ onClose(); // Close overlay after setting default
407
+ })();
408
+ return true;
409
+ }
410
+ if (customModelAction === 'delete') {
336
411
  if (pendingDeleteConfirm) {
337
- // Second press - actually delete
338
412
  if (deleteTimeoutRef.current) {
339
413
  clearTimeout(deleteTimeoutRef.current);
340
414
  deleteTimeoutRef.current = null;
@@ -343,7 +417,6 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
343
417
  void handleDeleteCustomModel(currentItem);
344
418
  }
345
419
  else {
346
- // First press in delete mode - set pending confirmation
347
420
  setPendingDeleteConfirm(true);
348
421
  if (deleteTimeoutRef.current) {
349
422
  clearTimeout(deleteTimeoutRef.current);
@@ -351,7 +424,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
351
424
  deleteTimeoutRef.current = setTimeout(() => {
352
425
  setPendingDeleteConfirm(false);
353
426
  deleteTimeoutRef.current = null;
354
- }, 3000); // 3 second timeout
427
+ }, 3000);
355
428
  }
356
429
  return true;
357
430
  }
@@ -359,7 +432,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
359
432
  // Left arrow - go back in action mode
360
433
  if (key.leftArrow) {
361
434
  if (customModelAction === 'delete') {
362
- setCustomModelAction('edit');
435
+ setCustomModelAction('default');
363
436
  setPendingDeleteConfirm(false);
364
437
  if (deleteTimeoutRef.current) {
365
438
  clearTimeout(deleteTimeoutRef.current);
@@ -367,7 +440,16 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
367
440
  }
368
441
  return true;
369
442
  }
370
- else if (customModelAction === 'edit') {
443
+ if (customModelAction === 'default') {
444
+ if (isCustomActionItem) {
445
+ setCustomModelAction('edit');
446
+ }
447
+ else {
448
+ setCustomModelAction(null);
449
+ }
450
+ return true;
451
+ }
452
+ if (customModelAction === 'edit') {
371
453
  setCustomModelAction(null);
372
454
  return true;
373
455
  }
@@ -436,6 +518,22 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
436
518
  }
437
519
  return true;
438
520
  }
521
+ if (customModelAction === 'default') {
522
+ // Check if reasoning-capable, show reasoning effort selection
523
+ if (isReasoningCapableModel(item.name)) {
524
+ setPendingReasoningModel(item);
525
+ setIsSettingDefault(true);
526
+ setReasoningEffortIndex(0); // Default to 'Auto'
527
+ return true;
528
+ }
529
+ clearActionState();
530
+ void (async () => {
531
+ await onSetDefaultModel(item.provider, item.name, item.displayName, item.baseURL, item.reasoningEffort);
532
+ setRefreshVersion((prev) => prev + 1);
533
+ onClose(); // Close overlay after setting default
534
+ })();
535
+ return true;
536
+ }
439
537
  if (customModelAction === 'delete' && item.isCustom) {
440
538
  if (pendingDeleteConfirm) {
441
539
  // Already confirmed, delete
@@ -473,6 +571,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
473
571
  filteredItems,
474
572
  onClose,
475
573
  onSelectModel,
574
+ onSetDefaultModel,
476
575
  onAddCustomModel,
477
576
  onEditCustomModel,
478
577
  customModelAction,
@@ -481,6 +580,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
481
580
  handleDeleteCustomModel,
482
581
  pendingReasoningModel,
483
582
  reasoningEffortIndex,
583
+ isSettingDefault,
484
584
  ]);
485
585
  if (!isVisible)
486
586
  return null;
@@ -489,26 +589,42 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
489
589
  }
490
590
  // Reasoning effort sub-step UI
491
591
  if (pendingReasoningModel) {
492
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "cyan", bold: true, children: "Configure Reasoning Effort" }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", children: ["for ", pendingReasoningModel.displayName || pendingReasoningModel.name] }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc back" }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), REASONING_EFFORT_OPTIONS.map((option, index) => {
592
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "cyan", bold: true, children: ["Configure Reasoning Effort", isSettingDefault && _jsx(Text, { color: "gray", children: " (Setting as Default)" })] }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", children: ["for ", pendingReasoningModel.displayName || pendingReasoningModel.name] }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc back" }) }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), REASONING_EFFORT_OPTIONS.map((option, index) => {
493
593
  const isSelected = index === reasoningEffortIndex;
494
594
  return (_jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsxs(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: [isSelected ? '› ' : ' ', option.label] }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [' ', "- ", option.description] })] }, option.value));
495
595
  })] }));
496
596
  }
497
597
  const visibleItems = filteredItems.slice(scrollOffset, scrollOffset + MAX_VISIBLE_ITEMS);
498
598
  const hasCustomModels = customModels.length > 0;
499
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "cyan", bold: true, children: ["Select Model (", selectedIndex + 1, "/", filteredItems.length, ")"] }) }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc close" }), hasCustomModels && _jsx(Text, { color: "gray", children: ", \u2192\u2190 for custom actions" })] }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\uD83D\uDD0D " }), _jsx(Text, { color: searchQuery ? 'white' : 'gray', children: searchQuery || 'Type to search...' }), _jsx(Text, { color: "cyan", children: "\u258C" })] }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), visibleItems.map((item, visibleIndex) => {
599
+ const hasActionableItems = filteredItems.some((item) => !isAddCustomOption(item));
600
+ const selectedItem = filteredItems[selectedIndex];
601
+ const isSelectedCustom = selectedItem && !isAddCustomOption(selectedItem) && selectedItem.isCustom;
602
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "cyan", bold: true, children: ["Select Model (", selectedIndex + 1, "/", filteredItems.length, ")"] }) }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\u2191\u2193 navigate, Enter select, Esc close" }), hasActionableItems && _jsx(Text, { color: "gray", children: ", \u2192\u2190 for actions" })] }), _jsxs(Box, { paddingX: 0, paddingY: 0, children: [_jsx(Text, { color: "gray", children: "\uD83D\uDD0D " }), _jsx(Text, { color: searchQuery ? 'white' : 'gray', children: searchQuery || 'Type to search...' }), _jsx(Text, { color: "cyan", children: "\u258C" })] }), _jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "gray", children: '─'.repeat(50) }) }), visibleItems.map((item, visibleIndex) => {
500
603
  const actualIndex = scrollOffset + visibleIndex;
501
604
  const isSelected = actualIndex === selectedIndex;
502
605
  if (isAddCustomOption(item)) {
503
606
  return (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: isSelected ? 'green' : 'gray', bold: isSelected, children: "\u2795 Add custom model..." }) }, "add-custom"));
504
607
  }
505
608
  // Show action buttons for selected custom models
506
- const showActions = isSelected && item.isCustom;
507
- return (_jsxs(Box, { paddingX: 0, paddingY: 0, children: [item.isCustom && _jsx(Text, { color: isSelected ? 'orange' : 'gray', children: "\u2605 " }), _jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: item.displayName || item.name }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [" (", item.provider, ")"] }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [' ', "\u2022 ", item.maxInputTokens.toLocaleString(), " tokens"] }), item.isDefault && (_jsx(Text, { color: isSelected ? 'white' : 'gray', children: " [DEFAULT]" })), item.isCurrent && !showActions && (_jsxs(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: [' ', "\u2190 Current"] })), showActions && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'edit' ? 'green' : 'gray', bold: customModelAction === 'edit', inverse: customModelAction === 'edit', children: [' ', "Edit", ' '] }), _jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'delete' ? 'red' : 'gray', bold: customModelAction === 'delete', inverse: customModelAction === 'delete', children: [' ', "Delete", ' '] })] }))] }, `${item.provider}-${item.name}`));
508
- }), filteredItems.length > MAX_VISIBLE_ITEMS && (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", children: [scrollOffset > 0 ? '↑ more above' : '', scrollOffset > 0 && scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
509
- ? ' | '
609
+ const showActions = isSelected && !isAddCustomOption(item);
610
+ // Keep the UI label simple: show the actual provider being selected.
611
+ // Gateway routing details are intentionally hidden from the main picker.
612
+ const providerDisplay = getLLMProviderDisplayName(item.provider);
613
+ return (_jsxs(Box, { paddingX: 0, paddingY: 0, children: [item.isCustom && _jsx(Text, { color: isSelected ? 'orange' : 'gray', children: "\u2605 " }), _jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: item.displayName || item.name }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [" (", providerDisplay, ")"] }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', children: [' ', "\u2022 ", item.maxInputTokens.toLocaleString(), " tokens"] }), item.isDefault && (_jsx(Text, { color: isSelected ? 'white' : 'gray', children: " [DEFAULT]" })), item.isCurrent && !showActions && (_jsxs(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: [' ', "\u2190 Current"] })), showActions && (_jsxs(_Fragment, { children: [item.isCustom && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'edit' ? 'green' : 'gray', bold: customModelAction === 'edit', inverse: customModelAction === 'edit', children: [' ', "Edit", ' '] })] })), _jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'default' ? 'cyan' : 'gray', bold: customModelAction === 'default', inverse: customModelAction === 'default', children: [' ', "Set as Default", ' '] }), item.isCustom && (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsxs(Text, { color: customModelAction === 'delete' ? 'red' : 'gray', bold: customModelAction === 'delete', inverse: customModelAction === 'delete', children: [' ', "Delete", ' '] })] }))] }))] }, `${item.provider}-${item.name}-${item.isCustom ? 'custom' : 'registry'}`));
614
+ }), filteredItems.length > MAX_VISIBLE_ITEMS && (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsxs(Text, { color: "gray", wrap: "truncate", children: [scrollOffset > 0 ? '↑ more above' : '', scrollOffset > 0 && scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
615
+ ? ' • '
510
616
  : '', scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
511
617
  ? '↓ more below'
512
- : ''] }) })), customModelAction === 'delete' && pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsx(Text, { color: "yellowBright", children: "\u26A0\uFE0F Press \u2192 or Enter again to confirm delete" }) })), customModelAction && !pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["\u2190 ", customModelAction === 'edit' ? 'deselect' : 'edit', " | \u2192", ' ', customModelAction === 'edit' ? 'delete' : 'confirm', " | Enter", ' ', customModelAction] }) }))] }));
618
+ : ''] }) })), customModelAction === 'delete' && pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsx(Text, { color: "yellowBright", children: "\u26A0\uFE0F Press \u2192 or Enter again to confirm delete" }) })), customModelAction && !pendingDeleteConfirm && (_jsx(Box, { paddingX: 0, paddingY: 0, marginTop: 1, children: _jsxs(Text, { color: "gray", children: ["\u2190", ' ', customModelAction === 'edit'
619
+ ? 'deselect'
620
+ : isSelectedCustom
621
+ ? 'edit'
622
+ : 'deselect', ' ', "| \u2192", ' ', customModelAction === 'edit'
623
+ ? 'default'
624
+ : customModelAction === 'default'
625
+ ? isSelectedCustom
626
+ ? 'delete'
627
+ : 'confirm'
628
+ : 'confirm', ' ', "| Enter ", customModelAction] }) }))] }));
513
629
  });
514
630
  export default ModelSelector;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PluginActions Component
3
+ * Clean action menu for a selected plugin
4
+ */
5
+ import React from 'react';
6
+ import type { Key } from '../../hooks/useInputOrchestrator.js';
7
+ import type { ListedPlugin } from '@dexto/agent-management';
8
+ export type PluginActionType = 'uninstall' | 'back';
9
+ export interface PluginActionResult {
10
+ type: PluginActionType;
11
+ plugin: ListedPlugin;
12
+ }
13
+ interface PluginActionsProps {
14
+ isVisible: boolean;
15
+ plugin: ListedPlugin | null;
16
+ onAction: (action: PluginActionResult) => void;
17
+ onClose: () => void;
18
+ }
19
+ export interface PluginActionsHandle {
20
+ handleInput: (input: string, key: Key) => boolean;
21
+ }
22
+ /**
23
+ * Plugin Actions - action menu for a specific plugin
24
+ */
25
+ declare const PluginActions: React.ForwardRefExoticComponent<PluginActionsProps & React.RefAttributes<PluginActionsHandle>>;
26
+ export default PluginActions;
27
+ //# sourceMappingURL=PluginActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginActions.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/PluginActions.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACxB;AAED,UAAU,kBAAkB;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAUD;;GAEG;AACH,QAAA,MAAM,aAAa,gGA+FjB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PluginActions Component
4
+ * Clean action menu for a selected plugin
5
+ */
6
+ import { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, } from 'react';
7
+ import { Box, Text } from 'ink';
8
+ import { BaseSelector } from '../base/BaseSelector.js';
9
+ /**
10
+ * Plugin Actions - action menu for a specific plugin
11
+ */
12
+ const PluginActions = forwardRef(function PluginActions({ isVisible, plugin, onAction, onClose }, ref) {
13
+ const baseSelectorRef = useRef(null);
14
+ const [selectedIndex, setSelectedIndex] = useState(0);
15
+ // Forward handleInput to BaseSelector
16
+ useImperativeHandle(ref, () => ({
17
+ handleInput: (input, key) => {
18
+ return baseSelectorRef.current?.handleInput(input, key) ?? false;
19
+ },
20
+ }), []);
21
+ // Reset selection when becoming visible or plugin changes
22
+ useEffect(() => {
23
+ if (isVisible) {
24
+ setSelectedIndex(0);
25
+ }
26
+ }, [isVisible, plugin]);
27
+ // Build action items
28
+ const items = useMemo(() => {
29
+ if (!plugin)
30
+ return [];
31
+ return [
32
+ {
33
+ id: 'back',
34
+ type: 'back',
35
+ label: 'Back to list',
36
+ icon: '←',
37
+ color: 'gray',
38
+ },
39
+ {
40
+ id: 'uninstall',
41
+ type: 'uninstall',
42
+ label: 'Uninstall',
43
+ icon: '🗑',
44
+ color: 'red',
45
+ },
46
+ ];
47
+ }, [plugin]);
48
+ // Format item for display - clean single line
49
+ const formatItem = (item, isSelected) => {
50
+ const isBack = item.type === 'back';
51
+ return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', children: isSelected ? '▸ ' : ' ' }), _jsxs(Text, { color: isBack ? 'gray' : isSelected ? item.color : 'gray', children: [item.icon, " "] }), _jsx(Text, { color: isBack ? (isSelected ? 'white' : 'gray') : isSelected ? item.color : 'white', bold: isSelected && !isBack, children: item.label })] }));
52
+ };
53
+ // Handle selection
54
+ const handleSelect = (item) => {
55
+ if (!plugin)
56
+ return;
57
+ onAction({ type: item.type, plugin });
58
+ };
59
+ if (!plugin)
60
+ return null;
61
+ const version = plugin.version || 'unknown';
62
+ const scopeBadge = plugin.scope ? ` [${plugin.scope}]` : '';
63
+ const title = `📦 ${plugin.name}@${version}${scopeBadge}`;
64
+ return (_jsx(BaseSelector, { ref: baseSelectorRef, items: items, isVisible: isVisible, isLoading: false, selectedIndex: selectedIndex, onSelectIndex: setSelectedIndex, onSelect: handleSelect, onClose: onClose, formatItem: formatItem, title: title, borderColor: "magenta", emptyMessage: "No actions available" }));
65
+ });
66
+ export default PluginActions;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * PluginList Component
3
+ * Clean table-like view of installed plugins
4
+ */
5
+ import React from 'react';
6
+ import { type ListedPlugin } from '@dexto/agent-management';
7
+ import type { Key } from '../../hooks/useInputOrchestrator.js';
8
+ interface PluginListProps {
9
+ isVisible: boolean;
10
+ onPluginSelect: (plugin: ListedPlugin) => void;
11
+ onClose: () => void;
12
+ }
13
+ export interface PluginListHandle {
14
+ handleInput: (input: string, key: Key) => boolean;
15
+ }
16
+ /**
17
+ * Plugin list overlay - shows installed plugins in clean table format
18
+ */
19
+ declare const PluginList: React.ForwardRefExoticComponent<PluginListProps & React.RefAttributes<PluginListHandle>>;
20
+ export default PluginList;
21
+ //# sourceMappingURL=PluginList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginList.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/PluginList.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAG/D,UAAU,eAAe;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAaD;;GAEG;AACH,QAAA,MAAM,UAAU,0FA0Hd,CAAC;AAEH,eAAe,UAAU,CAAC"}