dexto 1.5.7 → 1.6.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.
Files changed (178) hide show
  1. package/README.md +3 -3
  2. package/dist/agents/agent-template.yml +2 -2
  3. package/dist/agents/coding-agent/README.md +10 -10
  4. package/dist/agents/coding-agent/coding-agent.yml +81 -80
  5. package/dist/agents/default-agent.yml +32 -47
  6. package/dist/agents/explore-agent/explore-agent.yml +3 -6
  7. package/dist/agents/image-editor-agent/image-editor-agent.yml +1 -1
  8. package/dist/agents/nano-banana-agent/nano-banana-agent.yml +1 -1
  9. package/dist/agents/podcast-agent/podcast-agent.yml +1 -1
  10. package/dist/agents/product-name-researcher/product-name-researcher.yml +1 -1
  11. package/dist/agents/sora-video-agent/sora-video-agent.yml +4 -6
  12. package/dist/agents/triage-demo/triage-agent.yml +1 -1
  13. package/dist/analytics/events.d.ts +2 -2
  14. package/dist/analytics/events.d.ts.map +1 -1
  15. package/dist/api/mcp/tool-aggregation-handler.d.ts +2 -2
  16. package/dist/api/server-hono.d.ts +2 -2
  17. package/dist/api/server-hono.d.ts.map +1 -1
  18. package/dist/api/server-hono.js +37 -60
  19. package/dist/cli/approval/cli-approval-handler.d.ts +10 -3
  20. package/dist/cli/approval/cli-approval-handler.d.ts.map +1 -1
  21. package/dist/cli/approval/cli-approval-handler.js +1 -1
  22. package/dist/cli/auth/constants.d.ts +4 -0
  23. package/dist/cli/auth/constants.d.ts.map +1 -1
  24. package/dist/cli/auth/constants.js +4 -0
  25. package/dist/cli/commands/auth/logout.js +2 -2
  26. package/dist/cli/commands/billing/status.d.ts +3 -1
  27. package/dist/cli/commands/billing/status.d.ts.map +1 -1
  28. package/dist/cli/commands/billing/status.js +23 -1
  29. package/dist/cli/commands/create-app.d.ts +1 -11
  30. package/dist/cli/commands/create-app.d.ts.map +1 -1
  31. package/dist/cli/commands/create-app.js +21 -545
  32. package/dist/cli/commands/create-image.d.ts.map +1 -1
  33. package/dist/cli/commands/create-image.js +54 -53
  34. package/dist/cli/commands/image.d.ts +52 -0
  35. package/dist/cli/commands/image.d.ts.map +1 -0
  36. package/dist/cli/commands/image.js +118 -0
  37. package/dist/cli/commands/index.d.ts +2 -1
  38. package/dist/cli/commands/index.d.ts.map +1 -1
  39. package/dist/cli/commands/index.js +3 -1
  40. package/dist/cli/commands/init-app.d.ts +4 -8
  41. package/dist/cli/commands/init-app.d.ts.map +1 -1
  42. package/dist/cli/commands/init-app.js +37 -161
  43. package/dist/cli/commands/interactive-commands/command-parser.d.ts +2 -0
  44. package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
  45. package/dist/cli/commands/interactive-commands/commands.d.ts +1 -1
  46. package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
  47. package/dist/cli/commands/interactive-commands/commands.js +2 -2
  48. package/dist/cli/commands/interactive-commands/general-commands.js +2 -2
  49. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
  50. package/dist/cli/commands/interactive-commands/prompt-commands.js +13 -2
  51. package/dist/cli/commands/interactive-commands/session/index.d.ts +2 -1
  52. package/dist/cli/commands/interactive-commands/session/index.d.ts.map +1 -1
  53. package/dist/cli/commands/interactive-commands/session/index.js +2 -1
  54. package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +2 -2
  55. package/dist/cli/commands/interactive-commands/session/session-commands.js +2 -2
  56. package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
  57. package/dist/cli/commands/interactive-commands/system/system-commands.js +7 -29
  58. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  59. package/dist/cli/commands/list-agents.js +3 -2
  60. package/dist/cli/commands/plugin.d.ts +4 -4
  61. package/dist/cli/commands/setup.d.ts +5 -5
  62. package/dist/cli/commands/setup.d.ts.map +1 -1
  63. package/dist/cli/commands/setup.js +766 -207
  64. package/dist/cli/commands/sync-agents.d.ts +2 -12
  65. package/dist/cli/commands/sync-agents.d.ts.map +1 -1
  66. package/dist/cli/commands/sync-agents.js +2 -50
  67. package/dist/cli/ink-cli/InkCLIRefactored.d.ts +7 -1
  68. package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
  69. package/dist/cli/ink-cli/InkCLIRefactored.js +17 -7
  70. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +2 -2
  71. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
  72. package/dist/cli/ink-cli/components/ApprovalPrompt.js +15 -14
  73. package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts +18 -0
  74. package/dist/cli/ink-cli/components/BackgroundTasksPanel.d.ts.map +1 -0
  75. package/dist/cli/ink-cli/components/BackgroundTasksPanel.js +48 -0
  76. package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
  77. package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -1
  78. package/dist/cli/ink-cli/components/Footer.js +5 -6
  79. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
  80. package/dist/cli/ink-cli/components/ResourceAutocomplete.js +150 -41
  81. package/dist/cli/ink-cli/components/StatusBar.d.ts +3 -1
  82. package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
  83. package/dist/cli/ink-cli/components/StatusBar.js +27 -7
  84. package/dist/cli/ink-cli/components/TodoPanel.js +1 -1
  85. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
  86. package/dist/cli/ink-cli/components/chat/MessageItem.js +9 -5
  87. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +1 -1
  88. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +3 -1
  89. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -1
  90. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +3 -2
  91. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +3 -1
  92. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -1
  93. package/dist/cli/ink-cli/components/modes/StaticCLI.js +3 -2
  94. package/dist/cli/ink-cli/components/overlays/ContextStatsOverlay.js +1 -1
  95. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -1
  96. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +8 -4
  97. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +1 -1
  98. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +1 -1
  99. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +1 -0
  100. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  101. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +144 -41
  102. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +2 -1
  103. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -1
  104. package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +286 -44
  105. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +9 -1
  106. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -1
  107. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +35 -9
  108. package/dist/cli/ink-cli/constants/tips.js +1 -1
  109. package/dist/cli/ink-cli/containers/InputContainer.d.ts +4 -0
  110. package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
  111. package/dist/cli/ink-cli/containers/InputContainer.js +30 -8
  112. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +2 -0
  113. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
  114. package/dist/cli/ink-cli/containers/OverlayContainer.js +215 -59
  115. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
  116. package/dist/cli/ink-cli/hooks/useAgentEvents.js +73 -13
  117. package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -1
  118. package/dist/cli/ink-cli/hooks/useCLIState.js +3 -0
  119. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -1
  120. package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +8 -0
  121. package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -1
  122. package/dist/cli/ink-cli/hooks/useTokenCounter.js +7 -4
  123. package/dist/cli/ink-cli/services/CommandService.d.ts +1 -1
  124. package/dist/cli/ink-cli/services/CommandService.d.ts.map +1 -1
  125. package/dist/cli/ink-cli/services/CommandService.js +2 -2
  126. package/dist/cli/ink-cli/services/processStream.d.ts +2 -2
  127. package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -1
  128. package/dist/cli/ink-cli/services/processStream.js +55 -8
  129. package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
  130. package/dist/cli/ink-cli/state/initialState.js +3 -0
  131. package/dist/cli/ink-cli/state/types.d.ts +11 -2
  132. package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
  133. package/dist/cli/ink-cli/utils/llm-provider-display.d.ts +3 -0
  134. package/dist/cli/ink-cli/utils/llm-provider-display.d.ts.map +1 -0
  135. package/dist/cli/ink-cli/utils/llm-provider-display.js +22 -0
  136. package/dist/cli/ink-cli/utils/messageFormatting.d.ts +13 -9
  137. package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
  138. package/dist/cli/ink-cli/utils/messageFormatting.js +106 -151
  139. package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -1
  140. package/dist/cli/ink-cli/utils/toolUtils.js +2 -9
  141. package/dist/cli/utils/config-validation.d.ts +11 -11
  142. package/dist/cli/utils/config-validation.d.ts.map +1 -1
  143. package/dist/cli/utils/config-validation.js +56 -290
  144. package/dist/cli/utils/dexto-auth-check.d.ts +7 -7
  145. package/dist/cli/utils/dexto-auth-check.d.ts.map +1 -1
  146. package/dist/cli/utils/dexto-auth-check.js +16 -16
  147. package/dist/cli/utils/image-store.d.ts +16 -0
  148. package/dist/cli/utils/image-store.d.ts.map +1 -0
  149. package/dist/cli/utils/image-store.js +289 -0
  150. package/dist/cli/utils/options.js +1 -1
  151. package/dist/cli/utils/provider-setup.d.ts +2 -2
  152. package/dist/cli/utils/provider-setup.d.ts.map +1 -1
  153. package/dist/cli/utils/provider-setup.js +10 -2
  154. package/dist/cli/utils/scaffolding-utils.d.ts +5 -0
  155. package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -1
  156. package/dist/cli/utils/scaffolding-utils.js +46 -4
  157. package/dist/cli/utils/template-engine.d.ts +28 -16
  158. package/dist/cli/utils/template-engine.d.ts.map +1 -1
  159. package/dist/cli/utils/template-engine.js +339 -479
  160. package/dist/config/cli-overrides.d.ts +4 -3
  161. package/dist/config/cli-overrides.d.ts.map +1 -1
  162. package/dist/config/cli-overrides.js +8 -10
  163. package/dist/config/effective-llm.d.ts +4 -4
  164. package/dist/config/effective-llm.d.ts.map +1 -1
  165. package/dist/config/effective-llm.js +4 -4
  166. package/dist/index-main.d.ts +2 -0
  167. package/dist/index-main.d.ts.map +1 -0
  168. package/dist/index-main.js +1554 -0
  169. package/dist/index.js +2 -1580
  170. package/dist/utils/session-logger-factory.d.ts +3 -0
  171. package/dist/utils/session-logger-factory.d.ts.map +1 -0
  172. package/dist/utils/session-logger-factory.js +19 -0
  173. package/dist/webui/assets/{index-Dl3mj53P.js → index-DwtueA8l.js} +231 -231
  174. package/dist/webui/index.html +1 -1
  175. package/package.json +10 -7
  176. package/dist/cli/cli-subscriber.d.ts +0 -45
  177. package/dist/cli/cli-subscriber.d.ts.map +0 -1
  178. package/dist/cli/cli-subscriber.js +0 -204
@@ -10,10 +10,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
10
  */
11
11
  import { useState, useEffect, forwardRef, useImperativeHandle, useCallback, useRef, } from 'react';
12
12
  import { Box, Text } from 'ink';
13
- import { saveCustomModel, deleteCustomModel, CUSTOM_MODEL_PROVIDERS, saveProviderApiKey, getProviderKeyStatus, resolveApiKeyForProvider, determineApiKeyStorage, } from '@dexto/agent-management';
13
+ import { saveCustomModel, deleteCustomModel, saveProviderApiKey, getProviderKeyStatus, resolveApiKeyForProvider, determineApiKeyStorage, } from '@dexto/agent-management';
14
14
  import { logger } from '@dexto/core';
15
15
  // Import from new modular architecture
16
- import { getProviderConfig, getAvailableProviders, runAsyncValidation, } from './custom-model-wizard/provider-config.js';
16
+ import { getProviderConfig, getAvailableProviders, getProviderByMenuIndex, runAsyncValidation, } from './custom-model-wizard/provider-config.js';
17
17
  import { ProviderSelector, WizardStepInput, SetupInfoBanner, ApiKeyStep, } from './custom-model-wizard/shared/index.js';
18
18
  import LocalModelWizard from './custom-model-wizard/LocalModelWizard.js';
19
19
  /**
@@ -54,6 +54,7 @@ const CustomModelWizard = forwardRef(function CustomModelWizard({ isVisible, onC
54
54
  if (initialModel) {
55
55
  // Editing mode - pre-populate from initialModel
56
56
  const provider = initialModel.provider ?? 'openai-compatible';
57
+ const providers = getAvailableProviders();
57
58
  setSelectedProvider(provider);
58
59
  setOriginalName(initialModel.name);
59
60
  setValues({
@@ -61,11 +62,14 @@ const CustomModelWizard = forwardRef(function CustomModelWizard({ isVisible, onC
61
62
  baseURL: initialModel.baseURL ?? '',
62
63
  displayName: initialModel.displayName ?? '',
63
64
  maxInputTokens: initialModel.maxInputTokens?.toString() ?? '',
65
+ reasoningEffort: initialModel.reasoningEffort ?? '',
64
66
  apiKey: initialModel.apiKey ?? '',
67
+ filePath: initialModel.filePath ?? '',
65
68
  });
66
69
  setCurrentStep(0);
67
70
  setCurrentInput(initialModel.name);
68
- setProviderIndex(CUSTOM_MODEL_PROVIDERS.indexOf(provider));
71
+ const idx = providers.indexOf(provider);
72
+ setProviderIndex(idx >= 0 ? idx : 0);
69
73
  }
70
74
  else {
71
75
  // Adding mode - reset everything
@@ -82,7 +86,7 @@ const CustomModelWizard = forwardRef(function CustomModelWizard({ isVisible, onC
82
86
  }
83
87
  }, [isVisible, initialModel]);
84
88
  const handleProviderSelect = useCallback(() => {
85
- const provider = CUSTOM_MODEL_PROVIDERS[providerIndex];
89
+ const provider = getProviderByMenuIndex(providerIndex);
86
90
  if (provider) {
87
91
  setSelectedProvider(provider);
88
92
  setCurrentStep(0);
@@ -8,7 +8,7 @@ import { Box, Text } from 'ink';
8
8
  import { BaseSelector } from '../base/BaseSelector.js';
9
9
  // Log levels matching DextoLogger's supported levels
10
10
  const LOG_LEVELS = [
11
- { level: 'error', description: 'Errors only', icon: '' },
11
+ { level: 'error', description: 'Errors only', icon: '!' },
12
12
  { level: 'warn', description: 'Warnings and above', icon: '⚠️' },
13
13
  { level: 'info', description: 'Info and above (default)', icon: 'ℹ️' },
14
14
  { level: 'debug', description: 'Debug information', icon: '🔍' },
@@ -47,7 +47,7 @@ const McpRemoveSelector = forwardRef(function McpRemoveSelector({ isVisible, onS
47
47
  case 'auth-required':
48
48
  return '🔐';
49
49
  case 'error':
50
- return '';
50
+ return '!';
51
51
  }
52
52
  };
53
53
  // Get display text for status
@@ -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,EAKH,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;AAmDD;;GAEG;AACH,QAAA,MAAM,aAAa,oHAitBjB,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, isDextoAuthEnabled, } 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,13 +146,13 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
134
146
  if (provider === 'ollama' || provider === 'local' || provider === 'vertex') {
135
147
  continue;
136
148
  }
137
- // Skip dexto provider when feature is not enabled
138
- if (provider === 'dexto' && !isDextoAuthEnabled()) {
149
+ // Skip dexto-nova provider when feature is not enabled
150
+ if (provider === 'dexto-nova' && !isDextoAuthEnabled()) {
139
151
  continue;
140
152
  }
141
153
  const providerModels = allModels[provider];
142
154
  for (const model of providerModels) {
143
- // For dexto provider, models have originalProvider field
155
+ // For dexto-nova provider, models have originalProvider field
144
156
  // showing which provider the model originally came from
145
157
  const originalProvider = 'originalProvider' in model ? model.originalProvider : undefined;
146
158
  modelList.push({
@@ -148,10 +160,20 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
148
160
  name: model.name,
149
161
  displayName: model.displayName,
150
162
  maxInputTokens: model.maxInputTokens,
151
- isDefault: model.isDefault,
163
+ isDefault: provider === defaultProvider && model.name === defaultModel,
152
164
  isCurrent: provider === currentConfig.provider &&
153
165
  model.name === currentConfig.model,
154
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
+ : {}),
155
177
  // Store original provider for display purposes
156
178
  ...(originalProvider && { originalProvider }),
157
179
  });
@@ -164,7 +186,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
164
186
  name: ollamaModel.name,
165
187
  displayName: ollamaModel.name,
166
188
  maxInputTokens: 128000, // Default, actual varies by model
167
- isDefault: false,
189
+ isDefault: defaultProvider === 'ollama' && defaultModel === ollamaModel.name,
168
190
  isCurrent: currentConfig.provider === 'ollama' &&
169
191
  currentConfig.model === ollamaModel.name,
170
192
  isCustom: false,
@@ -181,7 +203,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
181
203
  name: localModel.id,
182
204
  displayName,
183
205
  maxInputTokens,
184
- isDefault: false,
206
+ isDefault: defaultProvider === 'local' && defaultModel === localModel.id,
185
207
  isCurrent: currentConfig.provider === 'local' &&
186
208
  currentConfig.model === localModel.id,
187
209
  isCustom: false,
@@ -196,10 +218,15 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
196
218
  name: model.name,
197
219
  displayName: model.displayName,
198
220
  maxInputTokens: model.maxInputTokens,
199
- isDefault: model.isDefault,
221
+ isDefault: defaultProvider === 'vertex' && defaultModel === model.name,
200
222
  isCurrent: currentConfig.provider === 'vertex' &&
201
223
  currentConfig.model === model.name,
202
224
  isCustom: false,
225
+ ...(defaultReasoningEffort &&
226
+ defaultProvider === 'vertex' &&
227
+ defaultModel === model.name
228
+ ? { reasoningEffort: defaultReasoningEffort }
229
+ : {}),
203
230
  });
204
231
  }
205
232
  }
@@ -226,7 +253,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
226
253
  return () => {
227
254
  cancelled = true;
228
255
  };
229
- }, [isVisible, agent]);
256
+ }, [isVisible, agent, refreshVersion]);
230
257
  // Filter models based on search query
231
258
  const filteredItems = useMemo(() => {
232
259
  const addCustomOption = { type: 'add-custom' };
@@ -293,6 +320,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
293
320
  if (key.escape) {
294
321
  // Go back to model selection
295
322
  setPendingReasoningModel(null);
323
+ setIsSettingDefault(false);
296
324
  return true;
297
325
  }
298
326
  if (key.upArrow) {
@@ -306,8 +334,21 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
306
334
  if (key.return) {
307
335
  const selectedOption = REASONING_EFFORT_OPTIONS[reasoningEffortIndex];
308
336
  const reasoningEffort = selectedOption?.value === 'auto' ? undefined : selectedOption?.value;
309
- 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
+ }
310
350
  setPendingReasoningModel(null);
351
+ setIsSettingDefault(false);
311
352
  return true;
312
353
  }
313
354
  return true; // Consume all input in reasoning effort mode
@@ -324,26 +365,50 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
324
365
  }
325
366
  const itemsLength = filteredItems.length;
326
367
  const currentItem = filteredItems[selectedIndexRef.current];
327
- const isOnCustomModel = currentItem && !isAddCustomOption(currentItem) && currentItem.isCustom;
328
- // 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
329
372
  if (key.rightArrow) {
330
- if (!isOnCustomModel)
373
+ if (!isOnActionItem)
331
374
  return false;
332
375
  if (customModelAction === null) {
333
- // Enter edit mode
334
- setCustomModelAction('edit');
376
+ if (isCustomActionItem) {
377
+ setCustomModelAction('edit');
378
+ }
379
+ else {
380
+ setCustomModelAction('default');
381
+ }
335
382
  return true;
336
383
  }
337
- else if (customModelAction === 'edit') {
338
- // Advance to delete mode
339
- setCustomModelAction('delete');
340
- setPendingDeleteConfirm(false);
384
+ if (customModelAction === 'edit') {
385
+ setCustomModelAction('default');
341
386
  return true;
342
387
  }
343
- else if (customModelAction === 'delete') {
344
- // 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') {
345
411
  if (pendingDeleteConfirm) {
346
- // Second press - actually delete
347
412
  if (deleteTimeoutRef.current) {
348
413
  clearTimeout(deleteTimeoutRef.current);
349
414
  deleteTimeoutRef.current = null;
@@ -352,7 +417,6 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
352
417
  void handleDeleteCustomModel(currentItem);
353
418
  }
354
419
  else {
355
- // First press in delete mode - set pending confirmation
356
420
  setPendingDeleteConfirm(true);
357
421
  if (deleteTimeoutRef.current) {
358
422
  clearTimeout(deleteTimeoutRef.current);
@@ -360,7 +424,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
360
424
  deleteTimeoutRef.current = setTimeout(() => {
361
425
  setPendingDeleteConfirm(false);
362
426
  deleteTimeoutRef.current = null;
363
- }, 3000); // 3 second timeout
427
+ }, 3000);
364
428
  }
365
429
  return true;
366
430
  }
@@ -368,7 +432,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
368
432
  // Left arrow - go back in action mode
369
433
  if (key.leftArrow) {
370
434
  if (customModelAction === 'delete') {
371
- setCustomModelAction('edit');
435
+ setCustomModelAction('default');
372
436
  setPendingDeleteConfirm(false);
373
437
  if (deleteTimeoutRef.current) {
374
438
  clearTimeout(deleteTimeoutRef.current);
@@ -376,7 +440,16 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
376
440
  }
377
441
  return true;
378
442
  }
379
- 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') {
380
453
  setCustomModelAction(null);
381
454
  return true;
382
455
  }
@@ -445,6 +518,22 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
445
518
  }
446
519
  return true;
447
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
+ }
448
537
  if (customModelAction === 'delete' && item.isCustom) {
449
538
  if (pendingDeleteConfirm) {
450
539
  // Already confirmed, delete
@@ -482,6 +571,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
482
571
  filteredItems,
483
572
  onClose,
484
573
  onSelectModel,
574
+ onSetDefaultModel,
485
575
  onAddCustomModel,
486
576
  onEditCustomModel,
487
577
  customModelAction,
@@ -490,6 +580,7 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
490
580
  handleDeleteCustomModel,
491
581
  pendingReasoningModel,
492
582
  reasoningEffortIndex,
583
+ isSettingDefault,
493
584
  ]);
494
585
  if (!isVisible)
495
586
  return null;
@@ -498,30 +589,42 @@ const ModelSelector = forwardRef(function ModelSelector({ isVisible, onSelectMod
498
589
  }
499
590
  // Reasoning effort sub-step UI
500
591
  if (pendingReasoningModel) {
501
- 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) => {
502
593
  const isSelected = index === reasoningEffortIndex;
503
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));
504
595
  })] }));
505
596
  }
506
597
  const visibleItems = filteredItems.slice(scrollOffset, scrollOffset + MAX_VISIBLE_ITEMS);
507
598
  const hasCustomModels = customModels.length > 0;
508
- 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) => {
509
603
  const actualIndex = scrollOffset + visibleIndex;
510
604
  const isSelected = actualIndex === selectedIndex;
511
605
  if (isAddCustomOption(item)) {
512
606
  return (_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: isSelected ? 'green' : 'gray', bold: isSelected, children: "\u2795 Add custom model..." }) }, "add-custom"));
513
607
  }
514
608
  // Show action buttons for selected custom models
515
- const showActions = isSelected && item.isCustom;
516
- // Show original provider for gateway models (e.g., dexto showing openai models)
517
- const providerDisplay = item.originalProvider
518
- ? `${item.originalProvider} via ${item.provider}`
519
- : item.provider;
520
- 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: [_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}-${item.isCustom ? 'custom' : 'registry'}`));
521
- }), 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
522
- ? ' | '
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
+ ? ' '
523
616
  : '', scrollOffset + MAX_VISIBLE_ITEMS < filteredItems.length
524
617
  ? '↓ more below'
525
- : ''] }) })), 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] }) }))] }));
526
629
  });
527
630
  export default ModelSelector;
@@ -4,7 +4,7 @@
4
4
  * Features:
5
5
  * - Search/filter tools by name
6
6
  * - View tool details (description, schema)
7
- * - Shows source (MCP server or Internal)
7
+ * - Shows source (MCP server or Local)
8
8
  */
9
9
  import React from 'react';
10
10
  import type { Key } from '../../hooks/useInputOrchestrator.js';
@@ -13,6 +13,7 @@ interface ToolBrowserProps {
13
13
  isVisible: boolean;
14
14
  onClose: () => void;
15
15
  agent: DextoAgent;
16
+ sessionId: string | null;
16
17
  }
17
18
  export interface ToolBrowserHandle {
18
19
  handleInput: (input: string, key: Key) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolBrowser.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ToolBrowser.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,UAAU,gBAAgB;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAeD;;GAEG;AACH,QAAA,MAAM,WAAW,4FAoWf,CAAC;AAyQH,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ToolBrowser.d.ts","sourceRoot":"","sources":["../../../../../src/cli/ink-cli/components/overlays/ToolBrowser.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,UAAU,gBAAgB;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CACrD;AAmBD;;GAEG;AACH,QAAA,MAAM,WAAW,4FAspBf,CAAC;AAyZH,eAAe,WAAW,CAAC"}