@within-7/minto 0.3.6 → 0.3.10

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 (238) hide show
  1. package/{cli.js → cli.cjs} +25 -23
  2. package/dist/commands/agents/AgentsCommand.js +459 -655
  3. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  4. package/dist/commands/agents/types.js +1 -0
  5. package/dist/commands/agents/types.js.map +2 -2
  6. package/dist/commands/agents/utils/fileOperations.js +96 -36
  7. package/dist/commands/agents/utils/fileOperations.js.map +3 -3
  8. package/dist/commands/agents/utils/index.js +3 -1
  9. package/dist/commands/agents/utils/index.js.map +2 -2
  10. package/dist/commands/context.js +54 -23
  11. package/dist/commands/context.js.map +2 -2
  12. package/dist/commands/export.js +673 -93
  13. package/dist/commands/export.js.map +2 -2
  14. package/dist/commands/language.js +110 -0
  15. package/dist/commands/language.js.map +7 -0
  16. package/dist/commands/mcp-interactive.js +419 -217
  17. package/dist/commands/mcp-interactive.js.map +2 -2
  18. package/dist/commands/model.js +415 -66
  19. package/dist/commands/model.js.map +2 -2
  20. package/dist/commands/new.js +56 -0
  21. package/dist/commands/new.js.map +7 -0
  22. package/dist/commands/permissions.js +75 -49
  23. package/dist/commands/permissions.js.map +2 -2
  24. package/dist/commands/plugin.js +882 -185
  25. package/dist/commands/plugin.js.map +3 -3
  26. package/dist/commands/resume.js +251 -16
  27. package/dist/commands/resume.js.map +2 -2
  28. package/dist/commands/sandbox.js +168 -70
  29. package/dist/commands/sandbox.js.map +2 -2
  30. package/dist/commands/sessions.js +224 -0
  31. package/dist/commands/sessions.js.map +7 -0
  32. package/dist/commands/setup.js +596 -109
  33. package/dist/commands/setup.js.map +2 -2
  34. package/dist/commands/stats.js +292 -0
  35. package/dist/commands/stats.js.map +7 -0
  36. package/dist/commands/status.js +75 -7
  37. package/dist/commands/status.js.map +2 -2
  38. package/dist/commands/undo.js +154 -180
  39. package/dist/commands/undo.js.map +2 -2
  40. package/dist/commands.js +6 -0
  41. package/dist/commands.js.map +2 -2
  42. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  43. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  44. package/dist/components/Config.js +9 -8
  45. package/dist/components/Config.js.map +2 -2
  46. package/dist/components/HeaderBar.js +2 -1
  47. package/dist/components/HeaderBar.js.map +2 -2
  48. package/dist/components/Help.js +166 -32
  49. package/dist/components/Help.js.map +2 -2
  50. package/dist/components/HotkeyHelpPanel.js +46 -44
  51. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  52. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  53. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  54. package/dist/components/InfoPanel/index.js +5 -0
  55. package/dist/components/InfoPanel/index.js.map +7 -0
  56. package/dist/components/InfoPanel/types.js +1 -0
  57. package/dist/components/InfoPanel/types.js.map +7 -0
  58. package/dist/components/Logo.js +5 -2
  59. package/dist/components/Logo.js.map +2 -2
  60. package/dist/components/MCPServerApprovalDialog.js +6 -5
  61. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  62. package/dist/components/MCPServerMultiselectDialog.js +5 -4
  63. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  64. package/dist/components/MessageSelector.js +4 -3
  65. package/dist/components/MessageSelector.js.map +2 -2
  66. package/dist/components/ModelConfig.js +13 -12
  67. package/dist/components/ModelConfig.js.map +2 -2
  68. package/dist/components/ModelListManager.js +4 -3
  69. package/dist/components/ModelListManager.js.map +2 -2
  70. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  71. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  72. package/dist/components/ModelSelector/ModelSelector.js +419 -501
  73. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  74. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  75. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  76. package/dist/components/ModelSelector/index.js +1 -3
  77. package/dist/components/ModelSelector/index.js.map +2 -2
  78. package/dist/components/PromptInput.js +77 -44
  79. package/dist/components/PromptInput.js.map +2 -2
  80. package/dist/components/SensitiveFileWarning.js +12 -8
  81. package/dist/components/SensitiveFileWarning.js.map +2 -2
  82. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  83. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  84. package/dist/components/SimpleSelector/index.js +5 -0
  85. package/dist/components/SimpleSelector/index.js.map +7 -0
  86. package/dist/components/SimpleSelector/types.js +1 -0
  87. package/dist/components/SimpleSelector/types.js.map +7 -0
  88. package/dist/components/StatusOverlayContent.js +21 -0
  89. package/dist/components/StatusOverlayContent.js.map +7 -0
  90. package/dist/components/TabbedListView/ScrollableList.js +117 -0
  91. package/dist/components/TabbedListView/ScrollableList.js.map +7 -0
  92. package/dist/components/TabbedListView/SearchInput.js +23 -0
  93. package/dist/components/TabbedListView/SearchInput.js.map +7 -0
  94. package/dist/components/TabbedListView/TabBar.js +20 -0
  95. package/dist/components/TabbedListView/TabBar.js.map +7 -0
  96. package/dist/components/TabbedListView/TabbedListView.js +246 -0
  97. package/dist/components/TabbedListView/TabbedListView.js.map +7 -0
  98. package/dist/components/TabbedListView/index.js +11 -0
  99. package/dist/components/TabbedListView/index.js.map +7 -0
  100. package/dist/components/TabbedListView/types.js +1 -0
  101. package/dist/components/TabbedListView/types.js.map +7 -0
  102. package/dist/components/TodoChangeBlock.js +6 -5
  103. package/dist/components/TodoChangeBlock.js.map +3 -3
  104. package/dist/components/TodoPanel.js +6 -3
  105. package/dist/components/TodoPanel.js.map +3 -3
  106. package/dist/components/TrustDialog.js +6 -5
  107. package/dist/components/TrustDialog.js.map +2 -2
  108. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +2 -1
  109. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +2 -2
  110. package/dist/constants/macros.js +1 -1
  111. package/dist/constants/macros.js.map +1 -1
  112. package/dist/constants/product.js +2 -2
  113. package/dist/constants/product.js.map +1 -1
  114. package/dist/constants/prompts.js +17 -0
  115. package/dist/constants/prompts.js.map +2 -2
  116. package/dist/constants/toolInputExamples.js +5 -1
  117. package/dist/constants/toolInputExamples.js.map +2 -2
  118. package/dist/core/backupHook.js +29 -0
  119. package/dist/core/backupHook.js.map +7 -0
  120. package/dist/core/config/defaults.js +8 -2
  121. package/dist/core/config/defaults.js.map +2 -2
  122. package/dist/core/config/schema.js +14 -2
  123. package/dist/core/config/schema.js.map +2 -2
  124. package/dist/core/costTracker.js +0 -16
  125. package/dist/core/costTracker.js.map +2 -2
  126. package/dist/core/tokenStatsManager.js +5 -0
  127. package/dist/core/tokenStatsManager.js.map +2 -2
  128. package/dist/cost-tracker.js +0 -16
  129. package/dist/cost-tracker.js.map +2 -2
  130. package/dist/entrypoints/bootstrap.js +56 -0
  131. package/dist/entrypoints/bootstrap.js.map +7 -0
  132. package/dist/entrypoints/cli.js +164 -23
  133. package/dist/entrypoints/cli.js.map +3 -3
  134. package/dist/history.js +75 -15
  135. package/dist/history.js.map +2 -2
  136. package/dist/i18n/index.js +2 -2
  137. package/dist/i18n/index.js.map +2 -2
  138. package/dist/i18n/locales/en.js +582 -1
  139. package/dist/i18n/locales/en.js.map +2 -2
  140. package/dist/i18n/locales/zh-CN.js +582 -1
  141. package/dist/i18n/locales/zh-CN.js.map +2 -2
  142. package/dist/i18n/types.js.map +1 -1
  143. package/dist/index.js +1 -1
  144. package/dist/index.js.map +2 -2
  145. package/dist/messages.js +11 -0
  146. package/dist/messages.js.map +2 -2
  147. package/dist/permissions.js.map +2 -2
  148. package/dist/query.js +9 -0
  149. package/dist/query.js.map +2 -2
  150. package/dist/screens/REPL.js +45 -7
  151. package/dist/screens/REPL.js.map +2 -2
  152. package/dist/services/customCommands.js +44 -16
  153. package/dist/services/customCommands.js.map +2 -2
  154. package/dist/services/plugins/lspServers.js +1 -1
  155. package/dist/services/plugins/lspServers.js.map +2 -2
  156. package/dist/services/plugins/pluginRuntime.js +2 -1
  157. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  158. package/dist/services/plugins/pluginValidation.js +10 -3
  159. package/dist/services/plugins/pluginValidation.js.map +2 -2
  160. package/dist/services/plugins/skillMarketplace.js +16 -8
  161. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  162. package/dist/services/systemReminder.js +17 -6
  163. package/dist/services/systemReminder.js.map +2 -2
  164. package/dist/tools/FileEditTool/FileEditTool.js +7 -0
  165. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  166. package/dist/tools/FileWriteTool/FileWriteTool.js +7 -0
  167. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  168. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  169. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  170. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  171. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  172. package/dist/tools/TaskTool/TaskTool.js +179 -1
  173. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  174. package/dist/tools/TodoWriteTool/prompt.js +21 -0
  175. package/dist/tools/TodoWriteTool/prompt.js.map +2 -2
  176. package/dist/tools/URLFetcherTool/prompt.js +14 -9
  177. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  178. package/dist/tools/WebSearchTool/prompt.js +12 -6
  179. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  180. package/dist/types/PermissionMode.js +30 -1
  181. package/dist/types/PermissionMode.js.map +2 -2
  182. package/dist/types/plugin.js +2 -4
  183. package/dist/types/plugin.js.map +2 -2
  184. package/dist/utils/agentHookExecutor.js +103 -0
  185. package/dist/utils/agentHookExecutor.js.map +7 -0
  186. package/dist/utils/agentLoader.js +272 -32
  187. package/dist/utils/agentLoader.js.map +2 -2
  188. package/dist/utils/agentMemory.js +134 -0
  189. package/dist/utils/agentMemory.js.map +7 -0
  190. package/dist/utils/claudeCodeSync.js +439 -0
  191. package/dist/utils/claudeCodeSync.js.map +7 -0
  192. package/dist/utils/config.js +52 -24
  193. package/dist/utils/config.js.map +2 -2
  194. package/dist/utils/configPaths.js +199 -0
  195. package/dist/utils/configPaths.js.map +7 -0
  196. package/dist/utils/execFileNoThrow.js +2 -1
  197. package/dist/utils/execFileNoThrow.js.map +2 -2
  198. package/dist/utils/historyManager.js +234 -0
  199. package/dist/utils/historyManager.js.map +7 -0
  200. package/dist/utils/marketplaceManager.js +80 -43
  201. package/dist/utils/marketplaceManager.js.map +2 -2
  202. package/dist/utils/messages.js +13 -8
  203. package/dist/utils/messages.js.map +2 -2
  204. package/dist/utils/migration/index.js +37 -0
  205. package/dist/utils/migration/index.js.map +7 -0
  206. package/dist/utils/migration/migrateHistory.js +273 -0
  207. package/dist/utils/migration/migrateHistory.js.map +7 -0
  208. package/dist/utils/migration/migrateTodos.js +323 -0
  209. package/dist/utils/migration/migrateTodos.js.map +7 -0
  210. package/dist/utils/pasteCache.js +309 -0
  211. package/dist/utils/pasteCache.js.map +7 -0
  212. package/dist/utils/pluginInstaller.js +34 -24
  213. package/dist/utils/pluginInstaller.js.map +2 -2
  214. package/dist/utils/pluginLoader.js +54 -28
  215. package/dist/utils/pluginLoader.js.map +2 -2
  216. package/dist/utils/repoFetcher.js +110 -0
  217. package/dist/utils/repoFetcher.js.map +7 -0
  218. package/dist/utils/sessionIndex.js +192 -0
  219. package/dist/utils/sessionIndex.js.map +7 -0
  220. package/dist/utils/sessionTracker.js +170 -0
  221. package/dist/utils/sessionTracker.js.map +7 -0
  222. package/dist/utils/skillLoader.js +103 -5
  223. package/dist/utils/skillLoader.js.map +2 -2
  224. package/dist/utils/stats.js +417 -0
  225. package/dist/utils/stats.js.map +7 -0
  226. package/dist/utils/stringSubstitution.js +106 -0
  227. package/dist/utils/stringSubstitution.js.map +7 -0
  228. package/dist/utils/teamConfig.js +156 -14
  229. package/dist/utils/teamConfig.js.map +2 -2
  230. package/dist/utils/terminal.js +1 -1
  231. package/dist/utils/terminal.js.map +2 -2
  232. package/dist/utils/todoStorage.js +51 -19
  233. package/dist/utils/todoStorage.js.map +2 -2
  234. package/dist/utils/tooling/safeRender.js.map +2 -2
  235. package/dist/version.js +2 -2
  236. package/dist/version.js.map +1 -1
  237. package/package.json +71 -28
  238. package/scripts/{postinstall.js → postinstall.cjs} +1 -1
@@ -1,87 +1,435 @@
1
- import React, { useState } from "react";
2
- import { Box, Text, useInput } from "ink";
3
- import { ModelConfig } from "../components/ModelConfig.js";
1
+ import React, { useState, useMemo, useCallback } from "react";
2
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
3
+ import { ModelSelector } from "../components/ModelSelector/index.js";
4
4
  import { enableConfigs } from "../utils/config.js";
5
+ import {
6
+ setModelPointer,
7
+ getGlobalConfig
8
+ } from "../utils/config.js";
9
+ import { getModelManager, reloadModelManager } from "../utils/model.js";
5
10
  import { triggerModelConfigChange } from "../messages.js";
6
- import { getModelManager } from "../utils/model.js";
7
- import { getTheme } from "../utils/theme.js";
8
- import { useExitOnCtrlCD } from "../hooks/useExitOnCtrlCD.js";
9
- import { SEMANTIC_COLORS } from "../constants/colors.js";
11
+ import { t } from "../i18n/index.js";
12
+ const ID_MANAGE_LIBRARY = "__manage_library__";
13
+ const ID_ADD_NEW = "__add_new__";
14
+ const ID_CLEAR = "__clear__";
15
+ const ID_DELETE = "__delete__";
16
+ const ID_BACK = "__back__";
17
+ const ID_CONFIRM_YES = "__yes__";
18
+ const ID_CONFIRM_NO = "__no__";
19
+ const POINTER_TYPES = [
20
+ "main",
21
+ "task",
22
+ "reasoning",
23
+ "quick",
24
+ "compact"
25
+ ];
26
+ const POINTER_LABELS = {
27
+ main: "Main",
28
+ task: "Task",
29
+ reasoning: "Reasoning",
30
+ quick: "Quick",
31
+ compact: "Compact"
32
+ };
33
+ function getPointerDescription(pointer) {
34
+ const key = `ui.modelConfig.${pointer}Description`;
35
+ return t(key);
36
+ }
10
37
  function ModelCommand({ onClose, abortController }) {
11
- const [mode, setMode] = useState("status");
12
- const theme = getTheme();
13
- const exitState = useExitOnCtrlCD(onClose);
14
- useInput(
15
- (input, key) => {
16
- if (key.return || input === "c" || input === "C") {
17
- enableConfigs();
18
- abortController?.abort?.();
19
- setMode("config");
20
- } else if (key.escape) {
21
- onClose();
22
- }
38
+ const [phase, setPhase] = useState({ type: "main" });
39
+ const [statusOverlay, setStatusOverlay] = useState(null);
40
+ const [refreshKey, setRefreshKey] = useState(0);
41
+ const refreshModels = useCallback(() => {
42
+ reloadModelManager();
43
+ triggerModelConfigChange();
44
+ setRefreshKey((prev) => prev + 1);
45
+ }, []);
46
+ const showSuccessAndGo = useCallback(
47
+ (message, nextPhase) => {
48
+ setStatusOverlay({ type: "success", message });
49
+ setTimeout(() => {
50
+ setStatusOverlay(null);
51
+ setPhase(nextPhase);
52
+ }, 800);
23
53
  },
24
- { isActive: mode === "status" }
54
+ []
25
55
  );
26
- if (mode === "config") {
56
+ if (phase.type === "main") {
27
57
  return /* @__PURE__ */ React.createElement(
28
- ModelConfig,
58
+ MainPhase,
29
59
  {
30
- onClose: () => {
31
- import("../utils/model.js").then(({ reloadModelManager }) => {
32
- reloadModelManager();
33
- triggerModelConfigChange();
34
- setMode("status");
35
- });
36
- }
60
+ refreshKey,
61
+ statusOverlay,
62
+ onSelectPointer: (pointer) => setPhase({ type: "assign", pointer }),
63
+ onManageLibrary: () => setPhase({ type: "library" }),
64
+ onClose
37
65
  }
38
66
  );
39
67
  }
40
- try {
41
- const modelManager = getModelManager();
42
- const pointers = ["main", "task", "reasoning", "quick", "compact"];
68
+ if (phase.type === "assign") {
69
+ return /* @__PURE__ */ React.createElement(
70
+ AssignPhase,
71
+ {
72
+ pointer: phase.pointer,
73
+ refreshKey,
74
+ statusOverlay,
75
+ onAssign: (pointer, modelName) => {
76
+ setModelPointer(pointer, modelName);
77
+ refreshModels();
78
+ showSuccessAndGo(
79
+ t("commands.model.pointerUpdated").replace(
80
+ "{pointer}",
81
+ POINTER_LABELS[pointer]
82
+ ),
83
+ { type: "main" }
84
+ );
85
+ },
86
+ onClear: (pointer) => {
87
+ setModelPointer(pointer, "");
88
+ refreshModels();
89
+ showSuccessAndGo(
90
+ t("commands.model.pointerCleared").replace(
91
+ "{pointer}",
92
+ POINTER_LABELS[pointer]
93
+ ),
94
+ { type: "main" }
95
+ );
96
+ },
97
+ onClose: () => setPhase({ type: "main" })
98
+ }
99
+ );
100
+ }
101
+ if (phase.type === "library") {
102
+ return /* @__PURE__ */ React.createElement(
103
+ LibraryPhase,
104
+ {
105
+ refreshKey,
106
+ statusOverlay,
107
+ onSelectModel: (modelName, modelLabel) => setPhase({ type: "model-actions", modelName, modelLabel }),
108
+ onAddNew: () => {
109
+ enableConfigs();
110
+ abortController?.abort?.();
111
+ setPhase({ type: "add-model" });
112
+ },
113
+ onClose: () => setPhase({ type: "main" })
114
+ }
115
+ );
116
+ }
117
+ if (phase.type === "model-actions") {
118
+ return /* @__PURE__ */ React.createElement(
119
+ ModelActionsPhase,
120
+ {
121
+ modelName: phase.modelName,
122
+ modelLabel: phase.modelLabel,
123
+ onDelete: () => setPhase({
124
+ type: "confirm-delete",
125
+ modelName: phase.modelName,
126
+ modelLabel: phase.modelLabel
127
+ }),
128
+ onClose: () => setPhase({ type: "library" })
129
+ }
130
+ );
131
+ }
132
+ if (phase.type === "confirm-delete") {
43
133
  return /* @__PURE__ */ React.createElement(
44
- Box,
134
+ ConfirmDeletePhase,
45
135
  {
46
- flexDirection: "column",
47
- borderStyle: "round",
48
- borderColor: theme.secondaryBorder,
49
- paddingX: 2,
50
- paddingY: 1
51
- },
52
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status", " ", exitState.pending ? `(press ${exitState.keyName} again to exit)` : ""),
53
- /* @__PURE__ */ React.createElement(Text, null, " "),
54
- pointers.map((pointer) => {
55
- try {
56
- const model2 = modelManager.getModel(pointer);
57
- if (model2 && model2.name && model2.provider) {
58
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", model2.name, " ", /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "(", model2.provider, ", ", model2.modelName || "unknown", ")")));
59
- } else {
60
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Not configured")));
136
+ modelName: phase.modelName,
137
+ modelLabel: phase.modelLabel,
138
+ statusOverlay,
139
+ onConfirm: () => {
140
+ try {
141
+ const modelManager = getModelManager();
142
+ modelManager.removeModel(phase.modelName);
143
+ refreshModels();
144
+ showSuccessAndGo(t("commands.model.modelDeleted"), {
145
+ type: "library"
146
+ });
147
+ } catch {
148
+ setStatusOverlay({
149
+ type: "error",
150
+ message: t("commands.model.deleteFailed")
151
+ });
152
+ setTimeout(() => {
153
+ setStatusOverlay(null);
154
+ setPhase({
155
+ type: "model-actions",
156
+ modelName: phase.modelName,
157
+ modelLabel: phase.modelLabel
158
+ });
159
+ }, 1500);
61
160
  }
62
- } catch {
63
- return /* @__PURE__ */ React.createElement(Box, { key: pointer }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.minto }, pointer.toUpperCase().padEnd(10)), " ", "\u2192 ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error")));
64
- }
65
- }),
66
- /* @__PURE__ */ React.createElement(Text, null, " "),
67
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " or ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "C"), " to configure models"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Esc"), " to close"))
161
+ },
162
+ onCancel: () => setPhase({
163
+ type: "model-actions",
164
+ modelName: phase.modelName,
165
+ modelLabel: phase.modelLabel
166
+ })
167
+ }
68
168
  );
69
- } catch (error) {
169
+ }
170
+ if (phase.type === "add-model") {
70
171
  return /* @__PURE__ */ React.createElement(
71
- Box,
172
+ ModelSelector,
72
173
  {
73
- flexDirection: "column",
74
- borderStyle: "round",
75
- borderColor: theme.error,
76
- paddingX: 2,
77
- paddingY: 1
78
- },
79
- /* @__PURE__ */ React.createElement(Text, { bold: true }, "\u{1F4CA} Model Status Error"),
80
- /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error reading model status: ", String(error)),
81
- /* @__PURE__ */ React.createElement(Text, null, " "),
82
- /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "Enter"), " to configure models")
174
+ onDone: () => {
175
+ refreshModels();
176
+ setPhase({ type: "library" });
177
+ },
178
+ onCancel: () => setPhase({ type: "library" }),
179
+ skipModelType: true,
180
+ isOnboarding: false,
181
+ abortController: new AbortController()
182
+ }
83
183
  );
84
184
  }
185
+ return null;
186
+ }
187
+ function MainPhase({
188
+ refreshKey,
189
+ statusOverlay,
190
+ onSelectPointer,
191
+ onManageLibrary,
192
+ onClose
193
+ }) {
194
+ const items = useMemo(() => {
195
+ const config = getGlobalConfig();
196
+ const modelManager = getModelManager();
197
+ const models = modelManager.getAvailableModels();
198
+ const pointerItems = POINTER_TYPES.map((pointer) => {
199
+ const assignedModelName = config.modelPointers?.[pointer] || "";
200
+ const model2 = models.find((m) => m.modelName === assignedModelName);
201
+ const description = model2 ? `${model2.name} (${model2.provider})` : getPointerDescription(pointer);
202
+ return {
203
+ id: pointer,
204
+ label: POINTER_LABELS[pointer],
205
+ description,
206
+ category: t("commands.model.pointersCategory"),
207
+ statusIcon: model2 ? "\u2713" : void 0,
208
+ statusColor: model2 ? "#4EBA65" : void 0
209
+ };
210
+ });
211
+ const actionItems = [
212
+ {
213
+ id: ID_MANAGE_LIBRARY,
214
+ label: t("commands.model.modelLibrary"),
215
+ description: t("commands.model.modelLibrarySubtitle"),
216
+ category: t("commands.model.actionsCategory")
217
+ }
218
+ ];
219
+ return [...pointerItems, ...actionItems];
220
+ }, [refreshKey]);
221
+ const handleSelect = useCallback(
222
+ (item) => {
223
+ if (item.id === ID_MANAGE_LIBRARY) {
224
+ onManageLibrary();
225
+ } else {
226
+ onSelectPointer(item.id);
227
+ }
228
+ },
229
+ [onSelectPointer, onManageLibrary]
230
+ );
231
+ return /* @__PURE__ */ React.createElement(
232
+ SimpleSelector,
233
+ {
234
+ title: t("commands.model.title"),
235
+ items,
236
+ onSelect: handleSelect,
237
+ onClose,
238
+ groupByCategory: true,
239
+ statusOverlay
240
+ }
241
+ );
242
+ }
243
+ function AssignPhase({
244
+ pointer,
245
+ refreshKey,
246
+ statusOverlay,
247
+ onAssign,
248
+ onClear,
249
+ onClose
250
+ }) {
251
+ const items = useMemo(() => {
252
+ const config = getGlobalConfig();
253
+ const modelManager = getModelManager();
254
+ const models = modelManager.getAvailableModels();
255
+ const currentAssignment = config.modelPointers?.[pointer] || "";
256
+ const modelItems = models.map((model2) => ({
257
+ id: model2.modelName,
258
+ label: model2.name,
259
+ description: `${model2.provider}: ${model2.modelName}`,
260
+ isCurrent: model2.modelName === currentAssignment
261
+ }));
262
+ if (currentAssignment) {
263
+ modelItems.push({
264
+ id: ID_CLEAR,
265
+ label: t("commands.model.clearAssignment"),
266
+ statusIcon: "\u2715",
267
+ statusColor: "#FF6B80"
268
+ });
269
+ }
270
+ return modelItems;
271
+ }, [pointer, refreshKey]);
272
+ const handleSelect = useCallback(
273
+ (item) => {
274
+ if (item.id === ID_CLEAR) {
275
+ onClear(pointer);
276
+ } else {
277
+ onAssign(pointer, item.id);
278
+ }
279
+ },
280
+ [pointer, onAssign, onClear]
281
+ );
282
+ return /* @__PURE__ */ React.createElement(
283
+ SimpleSelector,
284
+ {
285
+ title: t("commands.model.selectModel").replace(
286
+ "{pointer}",
287
+ POINTER_LABELS[pointer]
288
+ ),
289
+ items,
290
+ onSelect: handleSelect,
291
+ onClose,
292
+ statusOverlay
293
+ }
294
+ );
295
+ }
296
+ function LibraryPhase({
297
+ refreshKey,
298
+ statusOverlay,
299
+ onSelectModel,
300
+ onAddNew,
301
+ onClose
302
+ }) {
303
+ const items = useMemo(() => {
304
+ const config = getGlobalConfig();
305
+ const modelManager = getModelManager();
306
+ const models = modelManager.getAvailableModels();
307
+ const modelItems = models.map((model2) => {
308
+ const usedBy = [];
309
+ POINTER_TYPES.forEach((p) => {
310
+ if (config.modelPointers?.[p] === model2.modelName) {
311
+ usedBy.push(POINTER_LABELS[p]);
312
+ }
313
+ });
314
+ const usageDesc = usedBy.length > 0 ? `[${usedBy.join(", ")}]` : "";
315
+ return {
316
+ id: model2.modelName,
317
+ label: model2.name,
318
+ description: `${model2.provider}${usageDesc ? " " + usageDesc : ""}`,
319
+ statusIcon: usedBy.length > 0 ? "\u2713" : void 0,
320
+ statusColor: usedBy.length > 0 ? "#4EBA65" : void 0,
321
+ data: { modelLabel: model2.name }
322
+ };
323
+ });
324
+ modelItems.push({
325
+ id: ID_ADD_NEW,
326
+ label: t("commands.model.addNewModel")
327
+ });
328
+ return modelItems;
329
+ }, [refreshKey]);
330
+ const handleSelect = useCallback(
331
+ (item) => {
332
+ if (item.id === ID_ADD_NEW) {
333
+ onAddNew();
334
+ } else {
335
+ const data = item.data;
336
+ onSelectModel(item.id, data?.modelLabel || item.label);
337
+ }
338
+ },
339
+ [onSelectModel, onAddNew]
340
+ );
341
+ return /* @__PURE__ */ React.createElement(
342
+ SimpleSelector,
343
+ {
344
+ title: t("commands.model.modelLibrary"),
345
+ subtitle: t("commands.model.modelLibrarySubtitle"),
346
+ items,
347
+ onSelect: handleSelect,
348
+ onClose,
349
+ statusOverlay
350
+ }
351
+ );
352
+ }
353
+ function ModelActionsPhase({
354
+ modelName,
355
+ modelLabel,
356
+ onDelete,
357
+ onClose
358
+ }) {
359
+ const items = [
360
+ {
361
+ id: ID_DELETE,
362
+ label: t("common.delete"),
363
+ statusIcon: "\u2715",
364
+ statusColor: "#FF6B80"
365
+ },
366
+ {
367
+ id: ID_BACK,
368
+ label: t("common.back")
369
+ }
370
+ ];
371
+ const handleSelect = useCallback(
372
+ (item) => {
373
+ if (item.id === ID_DELETE) {
374
+ onDelete();
375
+ } else {
376
+ onClose();
377
+ }
378
+ },
379
+ [onDelete, onClose]
380
+ );
381
+ return /* @__PURE__ */ React.createElement(
382
+ SimpleSelector,
383
+ {
384
+ title: t("commands.model.modelActions").replace("{model}", modelLabel),
385
+ items,
386
+ onSelect: handleSelect,
387
+ onClose
388
+ }
389
+ );
390
+ }
391
+ function ConfirmDeletePhase({
392
+ modelName,
393
+ modelLabel,
394
+ statusOverlay,
395
+ onConfirm,
396
+ onCancel
397
+ }) {
398
+ const items = [
399
+ {
400
+ id: ID_CONFIRM_YES,
401
+ label: t("commands.model.confirmDeleteYes"),
402
+ statusIcon: "\u2715",
403
+ statusColor: "#FF6B80"
404
+ },
405
+ {
406
+ id: ID_CONFIRM_NO,
407
+ label: t("commands.model.confirmDeleteNo")
408
+ }
409
+ ];
410
+ const handleSelect = useCallback(
411
+ (item) => {
412
+ if (item.id === ID_CONFIRM_YES) {
413
+ onConfirm();
414
+ } else {
415
+ onCancel();
416
+ }
417
+ },
418
+ [onConfirm, onCancel]
419
+ );
420
+ return /* @__PURE__ */ React.createElement(
421
+ SimpleSelector,
422
+ {
423
+ title: t("commands.model.confirmDeleteTitle").replace(
424
+ "{model}",
425
+ modelLabel
426
+ ),
427
+ items,
428
+ onSelect: handleSelect,
429
+ onClose: onCancel,
430
+ statusOverlay
431
+ }
432
+ );
85
433
  }
86
434
  const model = {
87
435
  name: "model",
@@ -89,6 +437,7 @@ const model = {
89
437
  aliases: ["ms", "modelstatus", "model-status"],
90
438
  isEnabled: true,
91
439
  isHidden: false,
440
+ hidePromptInput: true,
92
441
  type: "local-jsx",
93
442
  userFacingName() {
94
443
  return "model";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/model.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n // Only listen for input when in status mode\n // When in config mode, ModelConfig handles its own input\n useInput(\n (input, key) => {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n },\n { isActive: mode === 'status' },\n )\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick', 'compact'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Model Command\n *\n * Interactive model configuration using SimpleSelector phase state machine.\n *\n * Phase flow:\n * main \u2192 (select pointer) \u2192 assign \u2192 (select model) \u2192 main\n * main \u2192 (Manage Library) \u2192 library \u2192 (select model) \u2192 model-actions\n * \u2193\n * confirm-delete \u2192 library\n * library \u2192 (+ Add New) \u2192 add-model \u2192 library\n */\n\nimport React, { useState, useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem, StatusOverlay } from '@components/SimpleSelector'\nimport { ModelSelector } from '@components/ModelSelector'\nimport { enableConfigs } from '@utils/config'\nimport {\n ModelPointerType,\n setModelPointer,\n getGlobalConfig,\n} from '@utils/config'\nimport { getModelManager, reloadModelManager } from '@utils/model'\nimport { triggerModelConfigChange } from '@messages'\nimport { t } from '@i18n'\nimport type { Command } from '@commands'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype ModelPhase =\n | { type: 'main' }\n | { type: 'assign'; pointer: ModelPointerType }\n | { type: 'library' }\n | { type: 'model-actions'; modelName: string; modelLabel: string }\n | { type: 'confirm-delete'; modelName: string; modelLabel: string }\n | { type: 'add-model' }\n\n// Special item IDs\nconst ID_MANAGE_LIBRARY = '__manage_library__'\nconst ID_ADD_NEW = '__add_new__'\nconst ID_CLEAR = '__clear__'\nconst ID_DELETE = '__delete__'\nconst ID_BACK = '__back__'\nconst ID_CONFIRM_YES = '__yes__'\nconst ID_CONFIRM_NO = '__no__'\n\nconst POINTER_TYPES: ModelPointerType[] = [\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n 'compact',\n]\n\nconst POINTER_LABELS: Record<ModelPointerType, string> = {\n main: 'Main',\n task: 'Task',\n reasoning: 'Reasoning',\n quick: 'Quick',\n compact: 'Compact',\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getPointerDescription(pointer: ModelPointerType): string {\n const key = `ui.modelConfig.${pointer}Description` as const\n return t(key)\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [phase, setPhase] = useState<ModelPhase>({ type: 'main' })\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [refreshKey, setRefreshKey] = useState(0)\n\n // Reload models and trigger config change\n const refreshModels = useCallback(() => {\n reloadModelManager()\n triggerModelConfigChange()\n setRefreshKey(prev => prev + 1)\n }, [])\n\n // Show a temporary success overlay then transition\n const showSuccessAndGo = useCallback(\n (message: string, nextPhase: ModelPhase) => {\n setStatusOverlay({ type: 'success', message })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase(nextPhase)\n }, 800)\n },\n [],\n )\n\n // \u2500\u2500\u2500 Phase: main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'main') {\n return (\n <MainPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectPointer={pointer => setPhase({ type: 'assign', pointer })}\n onManageLibrary={() => setPhase({ type: 'library' })}\n onClose={onClose}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: assign \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'assign') {\n return (\n <AssignPhase\n pointer={phase.pointer}\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onAssign={(pointer, modelName) => {\n setModelPointer(pointer, modelName)\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerUpdated').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClear={pointer => {\n setModelPointer(pointer, '')\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerCleared').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: library \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'library') {\n return (\n <LibraryPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectModel={(modelName, modelLabel) =>\n setPhase({ type: 'model-actions', modelName, modelLabel })\n }\n onAddNew={() => {\n enableConfigs()\n abortController?.abort?.()\n setPhase({ type: 'add-model' })\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: model-actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'model-actions') {\n return (\n <ModelActionsPhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n onDelete={() =>\n setPhase({\n type: 'confirm-delete',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n onClose={() => setPhase({ type: 'library' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: confirm-delete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'confirm-delete') {\n return (\n <ConfirmDeletePhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n statusOverlay={statusOverlay}\n onConfirm={() => {\n try {\n const modelManager = getModelManager()\n modelManager.removeModel(phase.modelName)\n refreshModels()\n showSuccessAndGo(t('commands.model.modelDeleted'), {\n type: 'library',\n })\n } catch {\n setStatusOverlay({\n type: 'error',\n message: t('commands.model.deleteFailed'),\n })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }, 1500)\n }\n }}\n onCancel={() =>\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: add-model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'add-model') {\n return (\n <ModelSelector\n onDone={() => {\n refreshModels()\n setPhase({ type: 'library' })\n }}\n onCancel={() => setPhase({ type: 'library' })}\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n />\n )\n }\n\n // Fallback (shouldn't happen)\n return null\n}\n\n// =============================================================================\n// Phase Components\n// =============================================================================\n\nfunction MainPhase({\n refreshKey,\n statusOverlay,\n onSelectPointer,\n onManageLibrary,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectPointer: (pointer: ModelPointerType) => void\n onManageLibrary: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const pointerItems: SelectorItem[] = POINTER_TYPES.map(pointer => {\n const assignedModelName = config.modelPointers?.[pointer] || ''\n const model = models.find(m => m.modelName === assignedModelName)\n const description = model\n ? `${model.name} (${model.provider})`\n : getPointerDescription(pointer)\n\n return {\n id: pointer,\n label: POINTER_LABELS[pointer],\n description,\n category: t('commands.model.pointersCategory'),\n statusIcon: model ? '\\u2713' : undefined,\n statusColor: model ? '#4EBA65' : undefined,\n }\n })\n\n const actionItems: SelectorItem[] = [\n {\n id: ID_MANAGE_LIBRARY,\n label: t('commands.model.modelLibrary'),\n description: t('commands.model.modelLibrarySubtitle'),\n category: t('commands.model.actionsCategory'),\n },\n ]\n\n return [...pointerItems, ...actionItems]\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_MANAGE_LIBRARY) {\n onManageLibrary()\n } else {\n onSelectPointer(item.id as ModelPointerType)\n }\n },\n [onSelectPointer, onManageLibrary],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.title')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n groupByCategory={true}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction AssignPhase({\n pointer,\n refreshKey,\n statusOverlay,\n onAssign,\n onClear,\n onClose,\n}: {\n pointer: ModelPointerType\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onAssign: (pointer: ModelPointerType, modelName: string) => void\n onClear: (pointer: ModelPointerType) => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n const currentAssignment = config.modelPointers?.[pointer] || ''\n\n const modelItems: SelectorItem[] = models.map(model => ({\n id: model.modelName,\n label: model.name,\n description: `${model.provider}: ${model.modelName}`,\n isCurrent: model.modelName === currentAssignment,\n }))\n\n // Add \"Clear Assignment\" option if there's a current assignment\n if (currentAssignment) {\n modelItems.push({\n id: ID_CLEAR,\n label: t('commands.model.clearAssignment'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n })\n }\n\n return modelItems\n }, [pointer, refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CLEAR) {\n onClear(pointer)\n } else {\n onAssign(pointer, item.id)\n }\n },\n [pointer, onAssign, onClear],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.selectModel').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction LibraryPhase({\n refreshKey,\n statusOverlay,\n onSelectModel,\n onAddNew,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectModel: (modelName: string, modelLabel: string) => void\n onAddNew: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const modelItems: SelectorItem[] = models.map(model => {\n // Find which pointers use this model\n const usedBy: string[] = []\n POINTER_TYPES.forEach(p => {\n if (config.modelPointers?.[p] === model.modelName) {\n usedBy.push(POINTER_LABELS[p])\n }\n })\n const usageDesc = usedBy.length > 0 ? `[${usedBy.join(', ')}]` : ''\n\n return {\n id: model.modelName,\n label: model.name,\n description: `${model.provider}${usageDesc ? ' ' + usageDesc : ''}`,\n statusIcon: usedBy.length > 0 ? '\\u2713' : undefined,\n statusColor: usedBy.length > 0 ? '#4EBA65' : undefined,\n data: { modelLabel: model.name },\n }\n })\n\n modelItems.push({\n id: ID_ADD_NEW,\n label: t('commands.model.addNewModel'),\n })\n\n return modelItems\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_ADD_NEW) {\n onAddNew()\n } else {\n const data = item.data as { modelLabel: string } | undefined\n onSelectModel(item.id, data?.modelLabel || item.label)\n }\n },\n [onSelectModel, onAddNew],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelLibrary')}\n subtitle={t('commands.model.modelLibrarySubtitle')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction ModelActionsPhase({\n modelName,\n modelLabel,\n onDelete,\n onClose,\n}: {\n modelName: string\n modelLabel: string\n onDelete: () => void\n onClose: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_DELETE,\n label: t('common.delete'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_BACK,\n label: t('common.back'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_DELETE) {\n onDelete()\n } else {\n onClose()\n }\n },\n [onDelete, onClose],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelActions').replace('{model}', modelLabel)}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n />\n )\n}\n\nfunction ConfirmDeletePhase({\n modelName,\n modelLabel,\n statusOverlay,\n onConfirm,\n onCancel,\n}: {\n modelName: string\n modelLabel: string\n statusOverlay: StatusOverlay | null\n onConfirm: () => void\n onCancel: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_CONFIRM_YES,\n label: t('commands.model.confirmDeleteYes'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_CONFIRM_NO,\n label: t('commands.model.confirmDeleteNo'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CONFIRM_YES) {\n onConfirm()\n } else {\n onCancel()\n }\n },\n [onConfirm, onCancel],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.confirmDeleteTitle').replace(\n '{model}',\n modelLabel,\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onCancel}\n statusOverlay={statusOverlay}\n />\n )\n}\n\n// =============================================================================\n// Command Export\n// =============================================================================\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
5
+ "mappings": "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",
6
6
  "names": ["model"]
7
7
  }
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import { render } from "ink";
3
+ import { t } from "../i18n/index.js";
4
+ import { dateToFilename } from "../utils/log.js";
5
+ import { isDefaultSlowAndCapableModel } from "../utils/model.js";
6
+ import { prepareTerminalForREPL } from "../utils/terminal.js";
7
+ import { REPL } from "../screens/REPL.js";
8
+ import { clearConversation } from "./clear.js";
9
+ var new_default = {
10
+ type: "local-jsx",
11
+ name: "new",
12
+ description: t("commands.new.description"),
13
+ isEnabled: true,
14
+ isHidden: false,
15
+ aliases: ["n"],
16
+ userFacingName() {
17
+ return "new";
18
+ },
19
+ async call(onDone, context) {
20
+ const { commands = [], tools = [], verbose = false } = context.options || {};
21
+ const unmount = context.unmount;
22
+ await clearConversation(context);
23
+ const isDefaultModel = await isDefaultSlowAndCapableModel();
24
+ const messageLogName = dateToFilename(/* @__PURE__ */ new Date());
25
+ onDone();
26
+ if (unmount) {
27
+ unmount();
28
+ }
29
+ await prepareTerminalForREPL();
30
+ render(
31
+ /* @__PURE__ */ React.createElement(
32
+ REPL,
33
+ {
34
+ messageLogName,
35
+ initialPrompt: "",
36
+ shouldShowPromptInput: true,
37
+ verbose,
38
+ commands,
39
+ tools,
40
+ initialMessages: [],
41
+ initialForkNumber: 1,
42
+ isDefaultModel,
43
+ isResumedConversation: false
44
+ }
45
+ ),
46
+ {
47
+ exitOnCtrlC: false
48
+ }
49
+ );
50
+ return null;
51
+ }
52
+ };
53
+ export {
54
+ new_default as default
55
+ };
56
+ //# sourceMappingURL=new.js.map