@within-7/minto 0.3.9 → 0.4.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 (383) hide show
  1. package/dist/Tool.js.map +2 -2
  2. package/dist/commands/agents/AgentsCommand.js +461 -657
  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/ctx_viz.js +1 -1
  13. package/dist/commands/effort.js +87 -0
  14. package/dist/commands/effort.js.map +7 -0
  15. package/dist/commands/export.js +684 -94
  16. package/dist/commands/export.js.map +2 -2
  17. package/dist/commands/ide.js +18 -0
  18. package/dist/commands/ide.js.map +7 -0
  19. package/dist/commands/language.js +19 -46
  20. package/dist/commands/language.js.map +2 -2
  21. package/dist/commands/mcp-interactive.js +425 -217
  22. package/dist/commands/mcp-interactive.js.map +2 -2
  23. package/dist/commands/memory.js +168 -0
  24. package/dist/commands/memory.js.map +7 -0
  25. package/dist/commands/model.js +457 -65
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/outputStyle.js +64 -0
  28. package/dist/commands/outputStyle.js.map +7 -0
  29. package/dist/commands/permissions.js +75 -49
  30. package/dist/commands/permissions.js.map +2 -2
  31. package/dist/commands/plugin/utils.js +33 -1
  32. package/dist/commands/plugin/utils.js.map +2 -2
  33. package/dist/commands/plugin.js +891 -185
  34. package/dist/commands/plugin.js.map +3 -3
  35. package/dist/commands/refreshCommands.js +2 -0
  36. package/dist/commands/refreshCommands.js.map +2 -2
  37. package/dist/commands/resume.js +1 -1
  38. package/dist/commands/resume.js.map +1 -1
  39. package/dist/commands/review.js +51 -0
  40. package/dist/commands/review.js.map +7 -0
  41. package/dist/commands/sandbox.js +168 -70
  42. package/dist/commands/sandbox.js.map +2 -2
  43. package/dist/commands/setup.js +593 -107
  44. package/dist/commands/setup.js.map +2 -2
  45. package/dist/commands/stats.js +188 -131
  46. package/dist/commands/stats.js.map +2 -2
  47. package/dist/commands/status.js +75 -13
  48. package/dist/commands/status.js.map +2 -2
  49. package/dist/commands/terminalSetup.js +6 -0
  50. package/dist/commands/terminalSetup.js.map +2 -2
  51. package/dist/commands/undo.js +146 -174
  52. package/dist/commands/undo.js.map +2 -2
  53. package/dist/commands/vim.js +22 -0
  54. package/dist/commands/vim.js.map +7 -0
  55. package/dist/commands.js +12 -0
  56. package/dist/commands.js.map +2 -2
  57. package/dist/components/Help.js +165 -32
  58. package/dist/components/Help.js.map +2 -2
  59. package/dist/components/HighlightedCode.js +1 -0
  60. package/dist/components/HighlightedCode.js.map +2 -2
  61. package/dist/components/InfoPanel/InfoPanel.js +123 -0
  62. package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
  63. package/dist/components/InfoPanel/index.js +5 -0
  64. package/dist/components/InfoPanel/index.js.map +7 -0
  65. package/dist/components/InfoPanel/types.js +1 -0
  66. package/dist/components/InfoPanel/types.js.map +7 -0
  67. package/dist/components/ModelSelector/BrandTextInput.js +43 -0
  68. package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
  69. package/dist/components/ModelSelector/ModelSelector.js +590 -565
  70. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  71. package/dist/components/ModelSelector/WizardContainer.js +45 -0
  72. package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
  73. package/dist/components/ModelSelector/index.js +1 -3
  74. package/dist/components/ModelSelector/index.js.map +2 -2
  75. package/dist/components/PromptInput.js +26 -11
  76. package/dist/components/PromptInput.js.map +2 -2
  77. package/dist/components/PulseLabel.js +44 -0
  78. package/dist/components/PulseLabel.js.map +7 -0
  79. package/dist/components/RequestStatusIndicator.js +1 -1
  80. package/dist/components/RequestStatusIndicator.js.map +1 -1
  81. package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
  82. package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
  83. package/dist/components/SimpleSelector/index.js +5 -0
  84. package/dist/components/SimpleSelector/index.js.map +7 -0
  85. package/dist/components/SimpleSelector/types.js +1 -0
  86. package/dist/components/SimpleSelector/types.js.map +7 -0
  87. package/dist/components/Spinner.js +12 -42
  88. package/dist/components/Spinner.js.map +3 -3
  89. package/dist/components/StartupStatus.js +57 -0
  90. package/dist/components/StartupStatus.js.map +7 -0
  91. package/dist/components/StatusOverlayContent.js +21 -0
  92. package/dist/components/StatusOverlayContent.js.map +7 -0
  93. package/dist/components/SubagentBlock.js +43 -6
  94. package/dist/components/SubagentBlock.js.map +2 -2
  95. package/dist/components/TabbedListView/ScrollableList.js +31 -5
  96. package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
  97. package/dist/components/TabbedListView/TabBar.js +13 -8
  98. package/dist/components/TabbedListView/TabBar.js.map +2 -2
  99. package/dist/components/TabbedListView/TabbedListView.js +123 -48
  100. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  101. package/dist/components/TodoPanel.js +1 -1
  102. package/dist/components/TodoPanel.js.map +1 -1
  103. package/dist/components/ToolUseLoader.js +5 -0
  104. package/dist/components/ToolUseLoader.js.map +2 -2
  105. package/dist/components/TrustDialog.js +0 -2
  106. package/dist/components/TrustDialog.js.map +2 -2
  107. package/dist/components/messages/TaskInModuleView.js +1 -1
  108. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  109. package/dist/components/messages/TaskToolMessage.js +1 -1
  110. package/dist/components/messages/TaskToolMessage.js.map +2 -2
  111. package/dist/components/messages/UserPromptMessage.js +6 -1
  112. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  113. package/dist/constants/modelCapabilities.js +103 -18
  114. package/dist/constants/modelCapabilities.js.map +2 -2
  115. package/dist/constants/product.js +2 -0
  116. package/dist/constants/product.js.map +2 -2
  117. package/dist/constants/prompts/agentPrompt.js +30 -0
  118. package/dist/constants/prompts/agentPrompt.js.map +7 -0
  119. package/dist/constants/prompts/codeConventions.js +27 -0
  120. package/dist/constants/prompts/codeConventions.js.map +7 -0
  121. package/dist/constants/prompts/doingTasks.js +15 -0
  122. package/dist/constants/prompts/doingTasks.js.map +7 -0
  123. package/dist/constants/prompts/envInfo.js +17 -0
  124. package/dist/constants/prompts/envInfo.js.map +7 -0
  125. package/dist/constants/prompts/executingWithCare.js +17 -0
  126. package/dist/constants/prompts/executingWithCare.js.map +7 -0
  127. package/dist/constants/prompts/identity.js +10 -0
  128. package/dist/constants/prompts/identity.js.map +7 -0
  129. package/dist/constants/prompts/index.js +78 -0
  130. package/dist/constants/prompts/index.js.map +7 -0
  131. package/dist/constants/prompts/taskManagement.js +60 -0
  132. package/dist/constants/prompts/taskManagement.js.map +7 -0
  133. package/dist/constants/prompts/toneAndStyle.js +62 -0
  134. package/dist/constants/prompts/toneAndStyle.js.map +7 -0
  135. package/dist/constants/prompts/toolUsagePolicy.js +38 -0
  136. package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
  137. package/dist/constants/prompts.js +5 -176
  138. package/dist/constants/prompts.js.map +2 -2
  139. package/dist/constants/providerRegistry.js +235 -0
  140. package/dist/constants/providerRegistry.js.map +7 -0
  141. package/dist/constants/providers.js +35 -0
  142. package/dist/constants/providers.js.map +7 -0
  143. package/dist/context/PermissionContext.js +0 -1
  144. package/dist/context/PermissionContext.js.map +2 -2
  145. package/dist/context.js +87 -31
  146. package/dist/context.js.map +2 -2
  147. package/dist/core/backupHook.js +29 -0
  148. package/dist/core/backupHook.js.map +7 -0
  149. package/dist/core/config/defaults.js +11 -2
  150. package/dist/core/config/defaults.js.map +2 -2
  151. package/dist/core/config/schema.js +21 -3
  152. package/dist/core/config/schema.js.map +2 -2
  153. package/dist/core/costTracker.js +18 -16
  154. package/dist/core/costTracker.js.map +2 -2
  155. package/dist/core/index.js +0 -1
  156. package/dist/core/index.js.map +2 -2
  157. package/dist/core/tokenStatsManager.js +22 -4
  158. package/dist/core/tokenStatsManager.js.map +2 -2
  159. package/dist/cost-tracker.js +0 -16
  160. package/dist/cost-tracker.js.map +2 -2
  161. package/dist/entrypoints/bootstrap.js +3 -1
  162. package/dist/entrypoints/bootstrap.js.map +2 -2
  163. package/dist/entrypoints/cli.js +81 -68
  164. package/dist/entrypoints/cli.js.map +2 -2
  165. package/dist/hooks/useAgentTokenStats.js +1 -1
  166. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  167. package/dist/hooks/useAgentTranscripts.js +2 -1
  168. package/dist/hooks/useAgentTranscripts.js.map +2 -2
  169. package/dist/hooks/useBackgroundShells.js +29 -0
  170. package/dist/hooks/useBackgroundShells.js.map +7 -0
  171. package/dist/hooks/useCanUseTool.js +1 -1
  172. package/dist/hooks/useCanUseTool.js.map +2 -2
  173. package/dist/hooks/useDeferredLoading.js +64 -0
  174. package/dist/hooks/useDeferredLoading.js.map +7 -0
  175. package/dist/hooks/useHookStatus.js +1 -1
  176. package/dist/hooks/useHookStatus.js.map +2 -2
  177. package/dist/hooks/useSessionTracking.js +55 -0
  178. package/dist/hooks/useSessionTracking.js.map +7 -0
  179. package/dist/hooks/useTerminalSize.js +21 -0
  180. package/dist/hooks/useTerminalSize.js.map +2 -2
  181. package/dist/hooks/useTextInput.js +1 -0
  182. package/dist/hooks/useTextInput.js.map +2 -2
  183. package/dist/hooks/useUnifiedCompletion.js +3 -2
  184. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  185. package/dist/i18n/locales/en.js +299 -1
  186. package/dist/i18n/locales/en.js.map +2 -2
  187. package/dist/i18n/locales/zh-CN.js +300 -2
  188. package/dist/i18n/locales/zh-CN.js.map +2 -2
  189. package/dist/i18n/types.js.map +1 -1
  190. package/dist/messages.js +41 -17
  191. package/dist/messages.js.map +2 -2
  192. package/dist/permissions.js +94 -1
  193. package/dist/permissions.js.map +2 -2
  194. package/dist/query.js +27 -19
  195. package/dist/query.js.map +2 -2
  196. package/dist/screens/REPL.js +83 -74
  197. package/dist/screens/REPL.js.map +2 -2
  198. package/dist/services/adapters/responsesAPI.js +6 -0
  199. package/dist/services/adapters/responsesAPI.js.map +2 -2
  200. package/dist/services/agentTeams/index.js +35 -0
  201. package/dist/services/agentTeams/index.js.map +7 -0
  202. package/dist/services/agentTeams/mailbox.js +114 -0
  203. package/dist/services/agentTeams/mailbox.js.map +7 -0
  204. package/dist/services/agentTeams/teamManager.js +149 -0
  205. package/dist/services/agentTeams/teamManager.js.map +7 -0
  206. package/dist/services/agentTeams/teamTaskStore.js +114 -0
  207. package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
  208. package/dist/services/agentTeams/teammateSpawner.js +80 -0
  209. package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
  210. package/dist/services/checkpointManager.js +16 -3
  211. package/dist/services/checkpointManager.js.map +2 -2
  212. package/dist/services/claude.js +19 -1728
  213. package/dist/services/claude.js.map +3 -3
  214. package/dist/services/customCommands.js +30 -8
  215. package/dist/services/customCommands.js.map +2 -2
  216. package/dist/services/gpt5ConnectionTest.js +4 -2
  217. package/dist/services/gpt5ConnectionTest.js.map +2 -2
  218. package/dist/services/hookExecutor.js +411 -127
  219. package/dist/services/hookExecutor.js.map +2 -2
  220. package/dist/services/llm/anthropicProvider.js +807 -0
  221. package/dist/services/llm/anthropicProvider.js.map +7 -0
  222. package/dist/services/llm/dispatch.js +218 -0
  223. package/dist/services/llm/dispatch.js.map +7 -0
  224. package/dist/services/llm/index.js +44 -0
  225. package/dist/services/llm/index.js.map +7 -0
  226. package/dist/services/llm/mintoContext.js +69 -0
  227. package/dist/services/llm/mintoContext.js.map +7 -0
  228. package/dist/services/llm/openaiProvider.js +622 -0
  229. package/dist/services/llm/openaiProvider.js.map +7 -0
  230. package/dist/services/llm/types.js +157 -0
  231. package/dist/services/llm/types.js.map +7 -0
  232. package/dist/services/mcpClient.js +183 -33
  233. package/dist/services/mcpClient.js.map +2 -2
  234. package/dist/services/notifier.js +14 -0
  235. package/dist/services/notifier.js.map +2 -2
  236. package/dist/services/oauth.js +4 -2
  237. package/dist/services/oauth.js.map +2 -2
  238. package/dist/services/openai.js +66 -56
  239. package/dist/services/openai.js.map +3 -3
  240. package/dist/services/outputStyles.js +102 -21
  241. package/dist/services/outputStyles.js.map +2 -2
  242. package/dist/services/plugins/lspServers.js +1 -1
  243. package/dist/services/plugins/lspServers.js.map +2 -2
  244. package/dist/services/plugins/pluginRuntime.js +2 -1
  245. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  246. package/dist/services/plugins/pluginValidation.js +10 -3
  247. package/dist/services/plugins/pluginValidation.js.map +2 -2
  248. package/dist/services/plugins/skillMarketplace.js +20 -9
  249. package/dist/services/plugins/skillMarketplace.js.map +2 -2
  250. package/dist/services/sentry.js +1 -1
  251. package/dist/services/sentry.js.map +2 -2
  252. package/dist/services/sessionMemory.js +16 -3
  253. package/dist/services/sessionMemory.js.map +2 -2
  254. package/dist/services/systemReminder.js +367 -9
  255. package/dist/services/systemReminder.js.map +2 -2
  256. package/dist/services/taskStore.js +19 -0
  257. package/dist/services/taskStore.js.map +2 -2
  258. package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
  259. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
  260. package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
  261. package/dist/tools/BashTool/BashTool.js +28 -0
  262. package/dist/tools/BashTool/BashTool.js.map +2 -2
  263. package/dist/tools/FileEditTool/FileEditTool.js +8 -1
  264. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  265. package/dist/tools/FileReadTool/FileReadTool.js +14 -0
  266. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  267. package/dist/tools/FileWriteTool/FileWriteTool.js +10 -1
  268. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  269. package/dist/tools/GlobTool/GlobTool.js.map +1 -1
  270. package/dist/tools/GrepTool/GrepTool.js.map +1 -1
  271. package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
  272. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  273. package/dist/tools/LspTool/LspTool.js +11 -2
  274. package/dist/tools/LspTool/LspTool.js.map +2 -2
  275. package/dist/tools/MCPTool/MCPTool.js.map +1 -1
  276. package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
  277. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  278. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
  279. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  280. package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
  281. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  282. package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
  283. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  284. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
  285. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
  286. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  287. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
  288. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  289. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
  290. package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
  291. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
  292. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
  293. package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
  294. package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
  295. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
  296. package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
  297. package/dist/tools/TaskTool/TaskTool.js +84 -11
  298. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  299. package/dist/tools/TaskTool/prompt.js +12 -6
  300. package/dist/tools/TaskTool/prompt.js.map +2 -2
  301. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
  302. package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
  303. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
  304. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
  305. package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
  306. package/dist/tools/WebSearchTool/searchProviders.js +2 -1
  307. package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
  308. package/dist/tools/lsTool/lsTool.js.map +2 -2
  309. package/dist/tools/lsTool/prompt.js.map +1 -1
  310. package/dist/tools.js +14 -3
  311. package/dist/tools.js.map +2 -2
  312. package/dist/types/PermissionMode.js +21 -1
  313. package/dist/types/PermissionMode.js.map +2 -2
  314. package/dist/types/agentTeams.js +1 -0
  315. package/dist/types/agentTeams.js.map +7 -0
  316. package/dist/types/hooks.js +8 -2
  317. package/dist/types/hooks.js.map +2 -2
  318. package/dist/types/plugin.js +3 -5
  319. package/dist/types/plugin.js.map +2 -2
  320. package/dist/utils/agentHookExecutor.js +1 -4
  321. package/dist/utils/agentHookExecutor.js.map +2 -2
  322. package/dist/utils/agentLoader.js +91 -15
  323. package/dist/utils/agentLoader.js.map +2 -2
  324. package/dist/utils/agentMemory.js.map +2 -2
  325. package/dist/utils/animationManager.js +1 -1
  326. package/dist/utils/animationManager.js.map +2 -2
  327. package/dist/utils/ask.js +1 -1
  328. package/dist/utils/async.js +5 -1
  329. package/dist/utils/async.js.map +2 -2
  330. package/dist/utils/autoCompactCore.js +60 -0
  331. package/dist/utils/autoCompactCore.js.map +2 -2
  332. package/dist/utils/claudeCodeSync.js +439 -0
  333. package/dist/utils/claudeCodeSync.js.map +7 -0
  334. package/dist/utils/config.js +27 -151
  335. package/dist/utils/config.js.map +2 -2
  336. package/dist/utils/configSchema.js +227 -0
  337. package/dist/utils/configSchema.js.map +7 -0
  338. package/dist/utils/debugLogger.js.map +2 -2
  339. package/dist/utils/env.js +4 -3
  340. package/dist/utils/env.js.map +2 -2
  341. package/dist/utils/envConfig.js +34 -0
  342. package/dist/utils/envConfig.js.map +3 -3
  343. package/dist/utils/execFileNoThrow.js +2 -1
  344. package/dist/utils/execFileNoThrow.js.map +2 -2
  345. package/dist/utils/gpt5.js +146 -0
  346. package/dist/utils/gpt5.js.map +7 -0
  347. package/dist/utils/hookManager.js +374 -140
  348. package/dist/utils/hookManager.js.map +2 -2
  349. package/dist/utils/markdown.js +47 -0
  350. package/dist/utils/markdown.js.map +2 -2
  351. package/dist/utils/marketplaceManager.js +80 -43
  352. package/dist/utils/marketplaceManager.js.map +2 -2
  353. package/dist/utils/memoizeWithTTL.js +25 -0
  354. package/dist/utils/memoizeWithTTL.js.map +7 -0
  355. package/dist/utils/messages.js +2 -2
  356. package/dist/utils/messages.js.map +2 -2
  357. package/dist/utils/model.js +34 -9
  358. package/dist/utils/model.js.map +2 -2
  359. package/dist/utils/pluginInstaller.js +68 -29
  360. package/dist/utils/pluginInstaller.js.map +2 -2
  361. package/dist/utils/pluginLoader.js +249 -57
  362. package/dist/utils/pluginLoader.js.map +2 -2
  363. package/dist/utils/repoFetcher.js +110 -0
  364. package/dist/utils/repoFetcher.js.map +7 -0
  365. package/dist/utils/safeFetch.js +45 -0
  366. package/dist/utils/safeFetch.js.map +7 -0
  367. package/dist/utils/skillLoader.js +77 -12
  368. package/dist/utils/skillLoader.js.map +2 -2
  369. package/dist/utils/streamingState.js +52 -0
  370. package/dist/utils/streamingState.js.map +7 -0
  371. package/dist/utils/stringSubstitution.js +4 -5
  372. package/dist/utils/stringSubstitution.js.map +2 -2
  373. package/dist/utils/style.js +6 -3
  374. package/dist/utils/style.js.map +2 -2
  375. package/dist/utils/teamConfig.js +162 -16
  376. package/dist/utils/teamConfig.js.map +2 -2
  377. package/dist/utils/terminal.js +1 -1
  378. package/dist/utils/terminal.js.map +2 -2
  379. package/dist/utils/toolRiskClassification.js +0 -6
  380. package/dist/utils/toolRiskClassification.js.map +2 -2
  381. package/dist/version.js +2 -2
  382. package/dist/version.js.map +1 -1
  383. package/package.json +7 -6
@@ -1,6 +1,7 @@
1
1
  const AGENT_LOCATIONS = {
2
2
  USER: "user",
3
3
  PROJECT: "project",
4
+ PLUGIN: "plugin",
4
5
  BUILT_IN: "built-in",
5
6
  ALL: "all"
6
7
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/agents/types.ts"],
4
- "sourcesContent": ["/**\n * Type definitions for the agents command\n */\nimport type { AgentConfig } from '@utils/agentLoader'\n\nexport const AGENT_LOCATIONS = {\n USER: 'user',\n PROJECT: 'project',\n BUILT_IN: 'built-in',\n ALL: 'all',\n} as const\n\nexport type AgentLocation =\n (typeof AGENT_LOCATIONS)[keyof typeof AGENT_LOCATIONS]\n\nexport type ModeType =\n | 'list-agents'\n | 'create-location'\n | 'create-method'\n | 'create-generate'\n | 'create-type'\n | 'create-description'\n | 'create-tools'\n | 'create-model'\n | 'create-color'\n | 'create-prompt'\n | 'create-confirm'\n | 'agent-menu'\n | 'view-agent'\n | 'edit-agent'\n | 'edit-tools'\n | 'edit-model'\n | 'edit-color'\n | 'delete-confirm'\n\nexport type ModeState = {\n mode: ModeType\n location?: AgentLocation\n selectedAgent?: AgentConfig\n previousMode?: ModeState\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\nexport type CreateState = {\n location: AgentLocation | null\n agentType: string\n method: 'generate' | 'manual' | null\n generationPrompt: string\n whenToUse: string\n selectedTools: string[]\n selectedModel: string | null\n selectedColor: string | null\n systemPrompt: string\n isGenerating: boolean\n wasGenerated: boolean\n isAIGenerated: boolean\n error: string | null\n warnings: string[]\n agentTypeCursor: number\n whenToUseCursor: number\n promptCursor: number\n generationPromptCursor: number\n}\n\nexport type Tool = {\n name: string\n description?: string | (() => Promise<string>)\n}\n\nexport type GeneratedAgent = {\n identifier: string\n whenToUse: string\n systemPrompt: string\n suggestedTools?: string[]\n suggestedModel?: string\n}\n"],
5
- "mappings": "AAKO,MAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AACP;",
4
+ "sourcesContent": ["/**\n * Type definitions for the agents command\n */\nimport type { AgentConfig } from '@utils/agentLoader'\n\nexport const AGENT_LOCATIONS = {\n USER: 'user',\n PROJECT: 'project',\n PLUGIN: 'plugin',\n BUILT_IN: 'built-in',\n ALL: 'all',\n} as const\n\nexport type AgentLocation =\n (typeof AGENT_LOCATIONS)[keyof typeof AGENT_LOCATIONS]\n\nexport type ModeType =\n | 'list-agents'\n | 'create-location'\n | 'create-method'\n | 'create-generate'\n | 'create-type'\n | 'create-description'\n | 'create-tools'\n | 'create-model'\n | 'create-color'\n | 'create-prompt'\n | 'create-confirm'\n | 'agent-menu'\n | 'view-agent'\n | 'edit-agent'\n | 'edit-tools'\n | 'edit-model'\n | 'edit-color'\n | 'delete-confirm'\n\nexport type ModeState = {\n mode: ModeType\n location?: AgentLocation\n selectedAgent?: AgentConfig\n previousMode?: ModeState\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n}\n\nexport type CreateState = {\n location: AgentLocation | null\n agentType: string\n method: 'generate' | 'manual' | null\n generationPrompt: string\n whenToUse: string\n selectedTools: string[]\n selectedModel: string | null\n selectedColor: string | null\n systemPrompt: string\n isGenerating: boolean\n wasGenerated: boolean\n isAIGenerated: boolean\n error: string | null\n warnings: string[]\n agentTypeCursor: number\n whenToUseCursor: number\n promptCursor: number\n generationPromptCursor: number\n}\n\nexport type Tool = {\n name: string\n description?: string | (() => Promise<string>)\n}\n\nexport type GeneratedAgent = {\n identifier: string\n whenToUse: string\n systemPrompt: string\n suggestedTools?: string[]\n suggestedModel?: string\n}\n"],
5
+ "mappings": "AAKO,MAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,KAAK;AACP;",
6
6
  "names": []
7
7
  }
@@ -3,11 +3,13 @@ import {
3
3
  unlinkSync,
4
4
  mkdirSync,
5
5
  existsSync,
6
- renameSync
6
+ renameSync,
7
+ openSync,
8
+ closeSync
7
9
  } from "fs";
8
10
  import { join, resolve, relative, isAbsolute } from "path";
9
- import { homedir } from "os";
10
- import { spawn } from "child_process";
11
+ import { homedir, tmpdir } from "os";
12
+ import { spawnSync } from "child_process";
11
13
  import { getCwd } from "../../../utils/state.js";
12
14
  import { AGENT_LOCATIONS, FOLDER_CONFIG } from "../constants.js";
13
15
  function getAgentDirectory(location) {
@@ -24,6 +26,9 @@ function getAgentFilePath(agent) {
24
26
  if (agent.location === "built-in") {
25
27
  throw new Error("Cannot get file path for built-in agents");
26
28
  }
29
+ if (agent.sourcePath) {
30
+ return agent.sourcePath;
31
+ }
27
32
  const dir = getAgentDirectory(agent.location);
28
33
  return join(dir, `${agent.agentType}.md`);
29
34
  }
@@ -103,7 +108,7 @@ async function deleteAgent(agent) {
103
108
  const filePath = getAgentFilePath(agent);
104
109
  unlinkSync(filePath);
105
110
  }
106
- async function openInEditor(filePath) {
111
+ function openInEditor(filePath) {
107
112
  const resolvedPath = resolve(filePath);
108
113
  const projectDir = process.cwd();
109
114
  const homeDir = homedir();
@@ -120,41 +125,95 @@ async function openInEditor(filePath) {
120
125
  if (!resolvedPath.endsWith(".md")) {
121
126
  throw new Error("Invalid file type: Only .md files are allowed");
122
127
  }
123
- return new Promise((resolve2, reject) => {
124
- const platform = process.platform;
125
- let command;
126
- let args;
127
- switch (platform) {
128
- case "darwin":
129
- command = "open";
130
- args = [resolvedPath];
131
- break;
132
- case "win32":
133
- command = "cmd";
134
- args = ["/c", "start", "", resolvedPath];
135
- break;
136
- default:
137
- command = "xdg-open";
138
- args = [resolvedPath];
139
- break;
140
- }
141
- const child = spawn(command, args, {
142
- detached: true,
143
- stdio: "ignore",
128
+ if (!existsSync(resolvedPath)) {
129
+ throw new Error(`File not found: ${resolvedPath}`);
130
+ }
131
+ const editor = process.env.VISUAL || process.env.EDITOR || "vi";
132
+ let ttyFd;
133
+ try {
134
+ ttyFd = openSync("/dev/tty", "r");
135
+ } catch {
136
+ ttyFd = void 0;
137
+ }
138
+ if (typeof process.stdin.setRawMode === "function") {
139
+ process.stdin.setRawMode(false);
140
+ }
141
+ process.stdin.pause();
142
+ try {
143
+ const result = spawnSync(editor, [resolvedPath], {
144
+ stdio: [ttyFd ?? "inherit", "inherit", "inherit"],
144
145
  shell: false
145
146
  });
146
- child.unref();
147
- child.on("error", (error) => {
148
- reject(new Error(`Failed to open editor: ${error.message}`));
149
- });
150
- child.on("exit", (code) => {
151
- if (code === 0) {
152
- resolve2();
153
- } else {
154
- reject(new Error(`Editor exited with code ${code}`));
147
+ if (result.error) {
148
+ throw new Error(`Failed to open editor: ${result.error.message}`);
149
+ }
150
+ if (result.status !== 0) {
151
+ throw new Error(`Editor exited with code ${result.status}`);
152
+ }
153
+ } finally {
154
+ if (ttyFd !== void 0) {
155
+ try {
156
+ closeSync(ttyFd);
157
+ } catch {
155
158
  }
159
+ }
160
+ process.stdin.resume();
161
+ if (typeof process.stdin.setRawMode === "function") {
162
+ process.stdin.setRawMode(true);
163
+ }
164
+ process.stdout.emit("resize");
165
+ }
166
+ }
167
+ function viewInPager(agent) {
168
+ const content = generateAgentFileContent(
169
+ agent.agentType,
170
+ agent.whenToUse,
171
+ agent.tools,
172
+ agent.systemPrompt,
173
+ agent.model_name,
174
+ agent.color
175
+ );
176
+ const filePath = join(
177
+ tmpdir(),
178
+ `minto-agent-${agent.agentType}-${Date.now()}.md`
179
+ );
180
+ writeFileSync(filePath, content, "utf-8");
181
+ const pager = process.env.PAGER || "less";
182
+ let ttyFd;
183
+ try {
184
+ ttyFd = openSync("/dev/tty", "r");
185
+ } catch {
186
+ ttyFd = void 0;
187
+ }
188
+ if (typeof process.stdin.setRawMode === "function") {
189
+ process.stdin.setRawMode(false);
190
+ }
191
+ process.stdin.pause();
192
+ try {
193
+ const result = spawnSync(pager, [filePath], {
194
+ stdio: [ttyFd ?? "inherit", "inherit", "inherit"],
195
+ shell: false
156
196
  });
157
- });
197
+ if (result.error) {
198
+ throw new Error(`Failed to open pager: ${result.error.message}`);
199
+ }
200
+ } finally {
201
+ if (ttyFd !== void 0) {
202
+ try {
203
+ closeSync(ttyFd);
204
+ } catch {
205
+ }
206
+ }
207
+ try {
208
+ unlinkSync(filePath);
209
+ } catch {
210
+ }
211
+ process.stdin.resume();
212
+ if (typeof process.stdin.setRawMode === "function") {
213
+ process.stdin.setRawMode(true);
214
+ }
215
+ process.stdout.emit("resize");
216
+ }
158
217
  }
159
218
  async function updateAgent(agent, description, tools, systemPrompt, color, model) {
160
219
  if (agent.location === "built-in") {
@@ -180,6 +239,7 @@ export {
180
239
  getAgentFilePath,
181
240
  openInEditor,
182
241
  saveAgent,
183
- updateAgent
242
+ updateAgent,
243
+ viewInPager
184
244
  };
185
245
  //# sourceMappingURL=fileOperations.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/commands/agents/utils/fileOperations.ts"],
4
- "sourcesContent": ["/**\n * File system operations for agents\n */\nimport {\n writeFileSync,\n unlinkSync,\n mkdirSync,\n existsSync,\n renameSync,\n} from 'fs'\nimport { join, resolve, relative, isAbsolute } from 'path'\nimport { homedir } from 'os'\nimport { spawn } from 'child_process'\nimport { getCwd } from '@utils/state'\nimport type { AgentConfig } from '@utils/agentLoader'\nimport { AGENT_LOCATIONS, FOLDER_CONFIG } from '../constants'\nimport type { AgentLocation } from '../types'\n\n/**\n * Get the directory path for agents of a specific location\n */\nexport function getAgentDirectory(location: AgentLocation): string {\n if (\n location === AGENT_LOCATIONS.BUILT_IN ||\n location === AGENT_LOCATIONS.ALL\n ) {\n throw new Error(`Cannot get directory path for ${location} agents`)\n }\n\n if (location === AGENT_LOCATIONS.USER) {\n return join(homedir(), FOLDER_CONFIG.FOLDER_NAME, FOLDER_CONFIG.AGENTS_DIR)\n } else {\n return join(getCwd(), FOLDER_CONFIG.FOLDER_NAME, FOLDER_CONFIG.AGENTS_DIR)\n }\n}\n\n/**\n * Get the file path for an agent\n */\nexport function getAgentFilePath(agent: AgentConfig): string {\n if (agent.location === 'built-in') {\n throw new Error('Cannot get file path for built-in agents')\n }\n const dir = getAgentDirectory(agent.location as AgentLocation)\n return join(dir, `${agent.agentType}.md`)\n}\n\n/**\n * Ensure the agent directory exists\n */\nexport function ensureDirectoryExists(location: AgentLocation): string {\n const dir = getAgentDirectory(location)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\n/**\n * Generate agent file content in markdown format with YAML frontmatter\n */\nexport function generateAgentFileContent(\n agentType: string,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n model?: string,\n color?: string,\n): string {\n // Use YAML multi-line string for description to avoid escaping issues\n const descriptionLines = description.split('\\n')\n const formattedDescription =\n descriptionLines.length > 1\n ? `|\\n ${descriptionLines.join('\\n ')}`\n : JSON.stringify(description)\n\n const lines = [\n '---',\n `name: ${agentType}`,\n `description: ${formattedDescription}`,\n ]\n\n if (tools) {\n if (tools === '*') {\n lines.push(`tools: \"*\"`)\n } else if (Array.isArray(tools) && tools.length > 0) {\n lines.push(`tools: [${tools.map(t => `\"${t}\"`).join(', ')}]`)\n }\n }\n\n if (model) {\n lines.push(`model: ${model}`)\n }\n\n if (color) {\n lines.push(`color: ${color}`)\n }\n\n lines.push('---', '', systemPrompt)\n return lines.join('\\n')\n}\n\n/**\n * Save an agent to file\n */\nexport async function saveAgent(\n location: AgentLocation,\n agentType: string,\n description: string,\n tools: string[],\n systemPrompt: string,\n model?: string,\n color?: string,\n throwIfExists: boolean = true,\n): Promise<void> {\n if (location === AGENT_LOCATIONS.BUILT_IN) {\n throw new Error('Cannot save built-in agents')\n }\n\n ensureDirectoryExists(location)\n\n const filePath = join(getAgentDirectory(location), `${agentType}.md`)\n const tempFile = `${filePath}.tmp.${Date.now()}.${Math.random().toString(36).substr(2, 9)}`\n\n // Ensure tools is properly typed for file saving\n const toolsForFile: string[] | '*' =\n Array.isArray(tools) && tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n try {\n // Write to temp file first using 'wx' to avoid overwriting\n writeFileSync(tempFile, content, { encoding: 'utf-8', flag: 'wx' })\n\n // Atomic check if target file exists\n if (throwIfExists && existsSync(filePath)) {\n // Clean up temp file\n try {\n unlinkSync(tempFile)\n } catch {\n // Ignore cleanup errors\n }\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n // Atomic rename (on most filesystems, rename is atomic)\n renameSync(tempFile, filePath)\n } catch (error) {\n // Ensure temp file is cleaned up\n try {\n if (existsSync(tempFile)) {\n unlinkSync(tempFile)\n }\n } catch (cleanupError) {\n console.warn('Failed to cleanup temp file:', cleanupError)\n }\n throw error\n }\n}\n\n/**\n * Delete an agent file\n */\nexport async function deleteAgent(agent: AgentConfig): Promise<void> {\n if (agent.location === 'built-in') {\n throw new Error('Cannot delete built-in agents')\n }\n\n const filePath = getAgentFilePath(agent)\n unlinkSync(filePath)\n}\n\n/**\n * Open file in system editor - secure version to prevent command injection\n */\nexport async function openInEditor(filePath: string): Promise<void> {\n // Security validation: ensure path is in allowed directories\n const resolvedPath = resolve(filePath)\n const projectDir = process.cwd()\n const homeDir = homedir()\n\n const isSub = (base: string, target: string) => {\n const rel = relative(resolve(base), resolve(target))\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n }\n\n if (!isSub(projectDir, resolvedPath) && !isSub(homeDir, resolvedPath)) {\n throw new Error('Access denied: File path outside allowed directories')\n }\n\n // Validate file extension\n if (!resolvedPath.endsWith('.md')) {\n throw new Error('Invalid file type: Only .md files are allowed')\n }\n\n return new Promise((resolve, reject) => {\n const platform = process.platform\n let command: string\n let args: string[]\n\n // Use spawn instead of exec to avoid shell injection\n switch (platform) {\n case 'darwin':\n command = 'open'\n args = [resolvedPath]\n break\n case 'win32':\n command = 'cmd'\n args = ['/c', 'start', '', resolvedPath]\n break\n default:\n command = 'xdg-open'\n args = [resolvedPath]\n break\n }\n\n // Use spawn instead of exec to avoid shell interpretation\n const child = spawn(command, args, {\n detached: true,\n stdio: 'ignore',\n shell: false,\n })\n\n child.unref()\n\n child.on('error', error => {\n reject(new Error(`Failed to open editor: ${error.message}`))\n })\n\n child.on('exit', code => {\n if (code === 0) {\n resolve()\n } else {\n reject(new Error(`Editor exited with code ${code}`))\n }\n })\n })\n}\n\n/**\n * Update an existing agent\n */\nexport async function updateAgent(\n agent: AgentConfig,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n color?: string,\n model?: string,\n): Promise<void> {\n if (agent.location === 'built-in') {\n throw new Error('Cannot update built-in agents')\n }\n\n const toolsForFile = tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agent.agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n const filePath = getAgentFilePath(agent)\n\n writeFileSync(filePath, content, { encoding: 'utf-8', flag: 'w' })\n}\n"],
5
- "mappings": "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",
6
- "names": ["resolve"]
4
+ "sourcesContent": ["/**\n * File system operations for agents\n */\nimport {\n writeFileSync,\n unlinkSync,\n mkdirSync,\n existsSync,\n renameSync,\n openSync,\n closeSync,\n} from 'fs'\nimport { join, resolve, relative, isAbsolute } from 'path'\nimport { homedir, tmpdir } from 'os'\nimport { spawnSync } from 'child_process'\nimport { getCwd } from '@utils/state'\nimport type { AgentConfig } from '@utils/agentLoader'\nimport { AGENT_LOCATIONS, FOLDER_CONFIG } from '../constants'\nimport type { AgentLocation } from '../types'\n\n/**\n * Get the directory path for agents of a specific location\n */\nexport function getAgentDirectory(location: AgentLocation): string {\n if (\n location === AGENT_LOCATIONS.BUILT_IN ||\n location === AGENT_LOCATIONS.ALL\n ) {\n throw new Error(`Cannot get directory path for ${location} agents`)\n }\n\n if (location === AGENT_LOCATIONS.USER) {\n return join(homedir(), FOLDER_CONFIG.FOLDER_NAME, FOLDER_CONFIG.AGENTS_DIR)\n } else {\n return join(getCwd(), FOLDER_CONFIG.FOLDER_NAME, FOLDER_CONFIG.AGENTS_DIR)\n }\n}\n\n/**\n * Get the file path for an agent\n */\nexport function getAgentFilePath(agent: AgentConfig): string {\n if (agent.location === 'built-in') {\n throw new Error('Cannot get file path for built-in agents')\n }\n // Use sourcePath if available (works for user/project/plugin agents)\n if (agent.sourcePath) {\n return agent.sourcePath\n }\n const dir = getAgentDirectory(agent.location as AgentLocation)\n return join(dir, `${agent.agentType}.md`)\n}\n\n/**\n * Ensure the agent directory exists\n */\nexport function ensureDirectoryExists(location: AgentLocation): string {\n const dir = getAgentDirectory(location)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\n/**\n * Generate agent file content in markdown format with YAML frontmatter\n */\nexport function generateAgentFileContent(\n agentType: string,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n model?: string,\n color?: string,\n): string {\n // Use YAML multi-line string for description to avoid escaping issues\n const descriptionLines = description.split('\\n')\n const formattedDescription =\n descriptionLines.length > 1\n ? `|\\n ${descriptionLines.join('\\n ')}`\n : JSON.stringify(description)\n\n const lines = [\n '---',\n `name: ${agentType}`,\n `description: ${formattedDescription}`,\n ]\n\n if (tools) {\n if (tools === '*') {\n lines.push(`tools: \"*\"`)\n } else if (Array.isArray(tools) && tools.length > 0) {\n lines.push(`tools: [${tools.map(t => `\"${t}\"`).join(', ')}]`)\n }\n }\n\n if (model) {\n lines.push(`model: ${model}`)\n }\n\n if (color) {\n lines.push(`color: ${color}`)\n }\n\n lines.push('---', '', systemPrompt)\n return lines.join('\\n')\n}\n\n/**\n * Save an agent to file\n */\nexport async function saveAgent(\n location: AgentLocation,\n agentType: string,\n description: string,\n tools: string[],\n systemPrompt: string,\n model?: string,\n color?: string,\n throwIfExists: boolean = true,\n): Promise<void> {\n if (location === AGENT_LOCATIONS.BUILT_IN) {\n throw new Error('Cannot save built-in agents')\n }\n\n ensureDirectoryExists(location)\n\n const filePath = join(getAgentDirectory(location), `${agentType}.md`)\n const tempFile = `${filePath}.tmp.${Date.now()}.${Math.random().toString(36).substr(2, 9)}`\n\n // Ensure tools is properly typed for file saving\n const toolsForFile: string[] | '*' =\n Array.isArray(tools) && tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n\n try {\n // Write to temp file first using 'wx' to avoid overwriting\n writeFileSync(tempFile, content, { encoding: 'utf-8', flag: 'wx' })\n\n // Atomic check if target file exists\n if (throwIfExists && existsSync(filePath)) {\n // Clean up temp file\n try {\n unlinkSync(tempFile)\n } catch {\n // Ignore cleanup errors\n }\n throw new Error(`Agent file already exists: ${filePath}`)\n }\n\n // Atomic rename (on most filesystems, rename is atomic)\n renameSync(tempFile, filePath)\n } catch (error) {\n // Ensure temp file is cleaned up\n try {\n if (existsSync(tempFile)) {\n unlinkSync(tempFile)\n }\n } catch (cleanupError) {\n console.warn('Failed to cleanup temp file:', cleanupError)\n }\n throw error\n }\n}\n\n/**\n * Delete an agent file\n */\nexport async function deleteAgent(agent: AgentConfig): Promise<void> {\n if (agent.location === 'built-in') {\n throw new Error('Cannot delete built-in agents')\n }\n\n const filePath = getAgentFilePath(agent)\n unlinkSync(filePath)\n}\n\n/**\n * Open file in terminal editor (vim/vi) inline.\n * Uses $VISUAL / $EDITOR env vars with fallback to vi.\n * Runs synchronously \u2014 blocks until the editor exits.\n */\nexport function openInEditor(filePath: string): void {\n // Security validation: ensure path is in allowed directories\n const resolvedPath = resolve(filePath)\n const projectDir = process.cwd()\n const homeDir = homedir()\n\n const isSub = (base: string, target: string) => {\n const rel = relative(resolve(base), resolve(target))\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n }\n\n if (!isSub(projectDir, resolvedPath) && !isSub(homeDir, resolvedPath)) {\n throw new Error('Access denied: File path outside allowed directories')\n }\n\n // Validate file extension\n if (!resolvedPath.endsWith('.md')) {\n throw new Error('Invalid file type: Only .md files are allowed')\n }\n\n // Ensure the file exists before opening (agent may have been created in-memory)\n if (!existsSync(resolvedPath)) {\n throw new Error(`File not found: ${resolvedPath}`)\n }\n\n const editor = process.env.VISUAL || process.env.EDITOR || 'vi'\n\n // Open /dev/tty directly so the editor gets a fresh fd for keyboard input,\n // bypassing Node/Ink's stdin listeners which would otherwise consume keystrokes.\n let ttyFd: number | undefined\n try {\n ttyFd = openSync('/dev/tty', 'r')\n } catch {\n ttyFd = undefined\n }\n\n // Release terminal from Ink's raw mode so the editor gets normal input\n if (typeof process.stdin.setRawMode === 'function') {\n process.stdin.setRawMode(false)\n }\n process.stdin.pause()\n\n try {\n const result = spawnSync(editor, [resolvedPath], {\n stdio: [ttyFd ?? 'inherit', 'inherit', 'inherit'],\n shell: false,\n })\n if (result.error) {\n throw new Error(`Failed to open editor: ${result.error.message}`)\n }\n if (result.status !== 0) {\n throw new Error(`Editor exited with code ${result.status}`)\n }\n } finally {\n // Close the tty fd if we opened one\n if (ttyFd !== undefined) {\n try {\n closeSync(ttyFd)\n } catch {\n // Ignore close errors\n }\n }\n // Restore stdin for Ink: resume + raw mode\n process.stdin.resume()\n if (typeof process.stdin.setRawMode === 'function') {\n process.stdin.setRawMode(true)\n }\n // Do NOT clearScreen() here \u2014 editors (vi/vim/nano) use the alternate\n // screen buffer, which automatically restores the original terminal\n // content on exit. clearScreen() would destroy that restored UI.\n // Emit resize to let Ink recalculate layout in case terminal was resized.\n process.stdout.emit('resize')\n }\n}\n\n/**\n * View agent details in a terminal pager (less/more).\n * Always generates a temp file from in-memory config \u2014 works for all\n * agent locations (built-in, plugin, user, project) regardless of\n * whether the physical .md file exists.\n * Runs synchronously \u2014 blocks until the pager exits.\n */\nexport function viewInPager(agent: AgentConfig): void {\n // Generate temp file from in-memory config for all agent types\n const content = generateAgentFileContent(\n agent.agentType,\n agent.whenToUse,\n agent.tools,\n agent.systemPrompt,\n agent.model_name,\n agent.color,\n )\n const filePath = join(\n tmpdir(),\n `minto-agent-${agent.agentType}-${Date.now()}.md`,\n )\n writeFileSync(filePath, content, 'utf-8')\n\n const pager = process.env.PAGER || 'less'\n\n // Open /dev/tty directly so the pager gets a fresh fd for keyboard input,\n // bypassing Node/Ink's stdin listeners which would otherwise consume keystrokes.\n let ttyFd: number | undefined\n try {\n ttyFd = openSync('/dev/tty', 'r')\n } catch {\n // Fallback: if /dev/tty is not available, try inheriting stdin\n ttyFd = undefined\n }\n\n // Release terminal from Ink's raw mode\n if (typeof process.stdin.setRawMode === 'function') {\n process.stdin.setRawMode(false)\n }\n process.stdin.pause()\n\n try {\n const result = spawnSync(pager, [filePath], {\n stdio: [ttyFd ?? 'inherit', 'inherit', 'inherit'],\n shell: false,\n })\n if (result.error) {\n throw new Error(`Failed to open pager: ${result.error.message}`)\n }\n } finally {\n // Close the tty fd if we opened one\n if (ttyFd !== undefined) {\n try {\n closeSync(ttyFd)\n } catch {\n // Ignore close errors\n }\n }\n // Clean up temp file\n try {\n unlinkSync(filePath)\n } catch {\n // Ignore cleanup errors\n }\n // Restore stdin for Ink: resume + raw mode\n process.stdin.resume()\n if (typeof process.stdin.setRawMode === 'function') {\n process.stdin.setRawMode(true)\n }\n // Do NOT clearScreen() here \u2014 less uses the alternate screen buffer,\n // which automatically restores the original terminal content on exit.\n // clearScreen() would destroy that restored UI.\n // Emit resize to let Ink recalculate layout in case terminal was resized.\n process.stdout.emit('resize')\n }\n}\n\n/**\n * Update an existing agent\n */\nexport async function updateAgent(\n agent: AgentConfig,\n description: string,\n tools: string[] | '*',\n systemPrompt: string,\n color?: string,\n model?: string,\n): Promise<void> {\n if (agent.location === 'built-in') {\n throw new Error('Cannot update built-in agents')\n }\n\n const toolsForFile = tools.length === 1 && tools[0] === '*' ? '*' : tools\n const content = generateAgentFileContent(\n agent.agentType,\n description,\n toolsForFile,\n systemPrompt,\n model,\n color,\n )\n const filePath = getAgentFilePath(agent)\n\n writeFileSync(filePath, content, { encoding: 'utf-8', flag: 'w' })\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
@@ -6,6 +6,7 @@ import {
6
6
  saveAgent,
7
7
  deleteAgent,
8
8
  openInEditor,
9
+ viewInPager,
9
10
  updateAgent
10
11
  } from "./fileOperations.js";
11
12
  export {
@@ -16,6 +17,7 @@ export {
16
17
  getAgentFilePath,
17
18
  openInEditor,
18
19
  saveAgent,
19
- updateAgent
20
+ updateAgent,
21
+ viewInPager
20
22
  };
21
23
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/commands/agents/utils/index.ts"],
4
- "sourcesContent": ["/**\n * Utility exports for the agents command\n */\nexport {\n getAgentDirectory,\n getAgentFilePath,\n ensureDirectoryExists,\n generateAgentFileContent,\n saveAgent,\n deleteAgent,\n openInEditor,\n updateAgent,\n} from './fileOperations'\n"],
5
- "mappings": "AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
4
+ "sourcesContent": ["/**\n * Utility exports for the agents command\n */\nexport {\n getAgentDirectory,\n getAgentFilePath,\n ensureDirectoryExists,\n generateAgentFileContent,\n saveAgent,\n deleteAgent,\n openInEditor,\n viewInPager,\n updateAgent,\n} from './fileOperations'\n"],
5
+ "mappings": "AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
6
  "names": []
7
7
  }
@@ -1,21 +1,10 @@
1
1
  import React from "react";
2
- import { Box, Text } from "ink";
3
2
  import { getMessagesGetter } from "../messages.js";
4
3
  import { countTokens } from "../utils/tokens.js";
5
4
  import { getModelManager } from "../utils/model.js";
6
5
  import { SEMANTIC_COLORS } from "../constants/colors.js";
7
- function createProgressBar(percent, width = 30) {
8
- const filled = Math.round(percent / 100 * width);
9
- const empty = width - filled;
10
- const filledChar = "\u2588";
11
- const emptyChar = "\u2591";
12
- return filledChar.repeat(filled) + emptyChar.repeat(empty);
13
- }
14
- function getUsageColor(percent) {
15
- if (percent < 50) return "green";
16
- if (percent < 80) return "yellow";
17
- return "red";
18
- }
6
+ import { InfoPanel } from "../components/InfoPanel/index.js";
7
+ import { t } from "../i18n/index.js";
19
8
  function formatTokens(tokens) {
20
9
  if (tokens >= 1e6) {
21
10
  return `${(tokens / 1e6).toFixed(1)}M`;
@@ -31,24 +20,59 @@ function estimateRemainingTurns(usedTokens, maxTokens, messageCount) {
31
20
  const remaining = maxTokens - usedTokens;
32
21
  return Math.max(0, Math.floor(remaining / avgPerTurn));
33
22
  }
34
- const ContextVisualizer = ({
35
- tokenInfo
36
- }) => {
23
+ function buildSections(tokenInfo) {
37
24
  const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo;
38
25
  const percent = Math.min(100, usedTokens / maxTokens * 100);
39
- const color = getUsageColor(percent);
40
26
  const remainingTurns = estimateRemainingTurns(
41
27
  usedTokens,
42
28
  maxTokens,
43
29
  messageCount
44
30
  );
45
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Context Usage"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " (", modelName, ")")), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color }, createProgressBar(percent)), /* @__PURE__ */ React.createElement(Text, null, " ", percent.toFixed(1), "%")), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Tokens:"), " ", formatTokens(usedTokens), " /", " ", formatTokens(maxTokens))), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Remaining:"), " ", formatTokens(maxTokens - usedTokens), " ", "tokens")), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Messages:"), " ", messageCount)), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Est. turns remaining:"), " ~", remainingTurns)), percent >= 70 && percent < 95 && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "\u26A0 Context usage is high. Consider using /compact to free up space.")), percent >= 95 && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u26A0 Context is nearly full! Run /compact now to avoid auto-compaction.")));
46
- };
31
+ const items = [
32
+ {
33
+ label: t("commands.context.tokens"),
34
+ value: `${formatTokens(usedTokens)} / ${formatTokens(maxTokens)}`,
35
+ progress: { percent, width: 20 }
36
+ },
37
+ {
38
+ label: t("commands.context.remaining"),
39
+ value: `${formatTokens(maxTokens - usedTokens)} tokens`
40
+ },
41
+ {
42
+ label: t("commands.context.messages"),
43
+ value: String(messageCount)
44
+ },
45
+ {
46
+ label: t("commands.context.estTurns"),
47
+ value: `~${remainingTurns}`
48
+ }
49
+ ];
50
+ if (percent >= 95) {
51
+ items.push({
52
+ label: "\u26A0",
53
+ value: t("commands.context.criticalUsage"),
54
+ valueColor: SEMANTIC_COLORS.error
55
+ });
56
+ } else if (percent >= 70) {
57
+ items.push({
58
+ label: "\u26A0",
59
+ value: t("commands.context.highUsage"),
60
+ valueColor: "#FFB86C"
61
+ });
62
+ }
63
+ return [
64
+ {
65
+ title: t("commands.context.contextUsage"),
66
+ items
67
+ }
68
+ ];
69
+ }
47
70
  const command = {
48
71
  name: "context",
49
72
  description: "Visualize current context usage with token counts and estimates",
50
73
  isEnabled: true,
51
74
  isHidden: false,
75
+ hidePromptInput: true,
52
76
  type: "local-jsx",
53
77
  aliases: ["ctx"],
54
78
  userFacingName() {
@@ -68,14 +92,21 @@ const command = {
68
92
  }
69
93
  } catch {
70
94
  }
71
- const tokenInfo = {
95
+ const sections = buildSections({
72
96
  usedTokens,
73
97
  maxTokens,
74
98
  messageCount: messages.length,
75
99
  modelName
76
- };
77
- setTimeout(() => onDone(), 100);
78
- return /* @__PURE__ */ React.createElement(ContextVisualizer, { tokenInfo });
100
+ });
101
+ return /* @__PURE__ */ React.createElement(
102
+ InfoPanel,
103
+ {
104
+ title: t("commands.context.title"),
105
+ subtitle: modelName,
106
+ sections,
107
+ onClose: onDone
108
+ }
109
+ );
79
110
  }
80
111
  };
81
112
  var context_default = command;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/context.tsx"],
4
- "sourcesContent": ["/**\n * Context Visualization Command\n *\n * Shows a visual representation of current context usage\n * with token counts, progress bars, and estimates.\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport { getMessagesGetter } from '@messages'\nimport { countTokens } from '@utils/tokens'\nimport { getModelManager } from '@utils/model'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\n/**\n * Create a visual progress bar\n */\nfunction createProgressBar(percent: number, width: number = 30): string {\n const filled = Math.round((percent / 100) * width)\n const empty = width - filled\n const filledChar = '\u2588'\n const emptyChar = '\u2591'\n\n return filledChar.repeat(filled) + emptyChar.repeat(empty)\n}\n\n/**\n * Get color based on usage percentage\n */\nfunction getUsageColor(percent: number): 'green' | 'yellow' | 'red' {\n if (percent < 50) return 'green'\n if (percent < 80) return 'yellow'\n return 'red'\n}\n\n/**\n * Format token count with k/M suffix\n */\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`\n }\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\n/**\n * Estimate remaining turns based on average token usage\n */\nfunction estimateRemainingTurns(\n usedTokens: number,\n maxTokens: number,\n messageCount: number,\n): number {\n if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2000) // Default estimate\n const avgPerTurn = usedTokens / (messageCount / 2) // Divide by 2 for user/assistant pairs\n const remaining = maxTokens - usedTokens\n return Math.max(0, Math.floor(remaining / avgPerTurn))\n}\n\nconst ContextVisualizer = ({\n tokenInfo,\n}: {\n tokenInfo: {\n usedTokens: number\n maxTokens: number\n messageCount: number\n modelName: string\n }\n}) => {\n const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo\n const percent = Math.min(100, (usedTokens / maxTokens) * 100)\n const color = getUsageColor(percent)\n const remainingTurns = estimateRemainingTurns(\n usedTokens,\n maxTokens,\n messageCount,\n )\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>Context Usage</Text>\n <Text color={SEMANTIC_COLORS.dim}> ({modelName})</Text>\n </Box>\n\n {/* Progress bar */}\n <Box>\n <Text color={color}>{createProgressBar(percent)}</Text>\n <Text> {percent.toFixed(1)}%</Text>\n </Box>\n\n {/* Token counts */}\n <Box marginTop={1}>\n <Text>\n <Text bold>Tokens:</Text> {formatTokens(usedTokens)} /{' '}\n {formatTokens(maxTokens)}\n </Text>\n </Box>\n\n {/* Remaining capacity */}\n <Box>\n <Text>\n <Text bold>Remaining:</Text> {formatTokens(maxTokens - usedTokens)}{' '}\n tokens\n </Text>\n </Box>\n\n {/* Message count */}\n <Box>\n <Text>\n <Text bold>Messages:</Text> {messageCount}\n </Text>\n </Box>\n\n {/* Estimated turns */}\n <Box>\n <Text>\n <Text bold>Est. turns remaining:</Text> ~{remainingTurns}\n </Text>\n </Box>\n\n {/* Warning if usage is high */}\n {percent >= 70 && percent < 95 && (\n <Box marginTop={1}>\n <Text color=\"yellow\">\n \u26A0 Context usage is high. Consider using /compact to free up space.\n </Text>\n </Box>\n )}\n {percent >= 95 && (\n <Box marginTop={1}>\n <Text color=\"red\">\n \u26A0 Context is nearly full! Run /compact now to avoid\n auto-compaction.\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\nconst command: Command = {\n name: 'context',\n description:\n 'Visualize current context usage with token counts and estimates',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n aliases: ['ctx'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const messages = getMessagesGetter()()\n const usedTokens = countTokens(messages)\n\n // Get max context from current model\n let maxTokens = 200_000 // Default for Claude\n let modelName = 'unknown'\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n maxTokens = profile.contextLength || maxTokens\n modelName = profile.name || profile.modelName\n }\n } catch {\n // Use defaults\n }\n\n const tokenInfo = {\n usedTokens,\n maxTokens,\n messageCount: messages.length,\n modelName,\n }\n\n // Render and immediately complete\n setTimeout(() => onDone(), 100)\n\n return <ContextVisualizer tokenInfo={tokenInfo} />\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Context Visualization Command\n *\n * Shows a visual representation of current context usage\n * with token counts, progress bars, and estimates.\n * Uses InfoPanel for consistent UI.\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport { getMessagesGetter } from '@messages'\nimport { countTokens } from '@utils/tokens'\nimport { getModelManager } from '@utils/model'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\n/**\n * Format token count with k/M suffix\n */\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`\n }\n if (tokens >= 1000) {\n return `${(tokens / 1000).toFixed(1)}k`\n }\n return tokens.toString()\n}\n\n/**\n * Estimate remaining turns based on average token usage\n */\nfunction estimateRemainingTurns(\n usedTokens: number,\n maxTokens: number,\n messageCount: number,\n): number {\n if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2000)\n const avgPerTurn = usedTokens / (messageCount / 2)\n const remaining = maxTokens - usedTokens\n return Math.max(0, Math.floor(remaining / avgPerTurn))\n}\n\nfunction buildSections(tokenInfo: {\n usedTokens: number\n maxTokens: number\n messageCount: number\n modelName: string\n}): InfoSection[] {\n const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo\n const percent = Math.min(100, (usedTokens / maxTokens) * 100)\n const remainingTurns = estimateRemainingTurns(\n usedTokens,\n maxTokens,\n messageCount,\n )\n\n const items: InfoItem[] = [\n {\n label: t('commands.context.tokens'),\n value: `${formatTokens(usedTokens)} / ${formatTokens(maxTokens)}`,\n progress: { percent, width: 20 },\n },\n {\n label: t('commands.context.remaining'),\n value: `${formatTokens(maxTokens - usedTokens)} tokens`,\n },\n {\n label: t('commands.context.messages'),\n value: String(messageCount),\n },\n {\n label: t('commands.context.estTurns'),\n value: `~${remainingTurns}`,\n },\n ]\n\n // Warning items\n if (percent >= 95) {\n items.push({\n label: '\\u26A0',\n value: t('commands.context.criticalUsage'),\n valueColor: SEMANTIC_COLORS.error,\n })\n } else if (percent >= 70) {\n items.push({\n label: '\\u26A0',\n value: t('commands.context.highUsage'),\n valueColor: '#FFB86C',\n })\n }\n\n return [\n {\n title: t('commands.context.contextUsage'),\n items,\n },\n ]\n}\n\nconst command: Command = {\n name: 'context',\n description:\n 'Visualize current context usage with token counts and estimates',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n aliases: ['ctx'],\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const messages = getMessagesGetter()()\n const usedTokens = countTokens(messages)\n\n let maxTokens = 200_000\n let modelName = 'unknown'\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n maxTokens = profile.contextLength || maxTokens\n modelName = profile.name || profile.modelName\n }\n } catch {\n // Use defaults\n }\n\n const sections = buildSections({\n usedTokens,\n maxTokens,\n messageCount: messages.length,\n modelName,\n })\n\n return (\n <InfoPanel\n title={t('commands.context.title')}\n subtitle={modelName}\n sections={sections}\n onClose={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  import { getToolDescriptionAsync } from "../Tool.js";
2
2
  import Table from "cli-table3";
3
- import { getSystemPrompt } from "../constants/prompts.js";
3
+ import { getSystemPrompt } from "../constants/prompts/index.js";
4
4
  import { getContext } from "../context.js";
5
5
  import { zodToJsonSchema } from "zod-to-json-schema";
6
6
  import { getMessagesGetter } from "../messages.js";
@@ -0,0 +1,87 @@
1
+ import React, { useMemo, useCallback } from "react";
2
+ import { SimpleSelector } from "../components/SimpleSelector/index.js";
3
+ import { getModelManager, reloadModelManager } from "../utils/model.js";
4
+ const EFFORT_CONFIG = {
5
+ low: {
6
+ reasoningEffort: "low",
7
+ maxThinkingTokens: 0,
8
+ description: "Fast responses, minimal reasoning"
9
+ },
10
+ medium: {
11
+ reasoningEffort: "medium",
12
+ maxThinkingTokens: 4e3,
13
+ description: "Balanced speed and depth"
14
+ },
15
+ high: {
16
+ reasoningEffort: "high",
17
+ maxThinkingTokens: 1e4,
18
+ description: "Deep reasoning for complex tasks"
19
+ },
20
+ max: {
21
+ reasoningEffort: "high",
22
+ maxThinkingTokens: 32767,
23
+ description: "Maximum reasoning depth"
24
+ }
25
+ };
26
+ function EffortSelector({
27
+ onClose
28
+ }) {
29
+ const items = useMemo(() => {
30
+ const modelManager = getModelManager();
31
+ const mainModel = modelManager.getModel("main");
32
+ const currentEffort = mainModel?.reasoningEffort || "medium";
33
+ return Object.entries(EFFORT_CONFIG).map(([level, config]) => ({
34
+ id: level,
35
+ label: level.charAt(0).toUpperCase() + level.slice(1),
36
+ description: config.description,
37
+ isCurrent: level === currentEffort || level === "medium" && !currentEffort
38
+ }));
39
+ }, []);
40
+ const handleSelect = useCallback(
41
+ (item) => {
42
+ const level = item.id;
43
+ const config = EFFORT_CONFIG[level];
44
+ try {
45
+ const modelManager = getModelManager();
46
+ const mainModelName = modelManager.getModelName("main");
47
+ if (mainModelName) {
48
+ modelManager.updateModel(mainModelName, {
49
+ reasoningEffort: config.reasoningEffort
50
+ });
51
+ reloadModelManager();
52
+ }
53
+ } catch {
54
+ }
55
+ onClose(`Reasoning effort set to ${level} (${config.description})`);
56
+ },
57
+ [onClose]
58
+ );
59
+ return /* @__PURE__ */ React.createElement(
60
+ SimpleSelector,
61
+ {
62
+ title: "Reasoning Effort",
63
+ items,
64
+ onSelect: handleSelect,
65
+ onClose: () => onClose()
66
+ }
67
+ );
68
+ }
69
+ const effort = {
70
+ name: "effort",
71
+ description: "Set reasoning effort level",
72
+ isEnabled: true,
73
+ isHidden: false,
74
+ hidePromptInput: true,
75
+ type: "local-jsx",
76
+ userFacingName() {
77
+ return "effort";
78
+ },
79
+ async call(onDone) {
80
+ return /* @__PURE__ */ React.createElement(EffortSelector, { onClose: onDone });
81
+ }
82
+ };
83
+ var effort_default = effort;
84
+ export {
85
+ effort_default as default
86
+ };
87
+ //# sourceMappingURL=effort.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/commands/effort.tsx"],
4
+ "sourcesContent": ["/**\n * /effort command\n *\n * Interactive reasoning depth selector.\n * Maps effort levels to reasoningEffort + maxThinkingTokens.\n */\n\nimport React, { useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem } from '@components/SimpleSelector'\nimport { getModelManager, reloadModelManager } from '@utils/model'\nimport type { Command } from '../commands'\n\ntype EffortLevel = 'low' | 'medium' | 'high' | 'max'\n\nconst EFFORT_CONFIG: Record<\n EffortLevel,\n {\n reasoningEffort: 'low' | 'medium' | 'high'\n maxThinkingTokens: number\n description: string\n }\n> = {\n low: {\n reasoningEffort: 'low',\n maxThinkingTokens: 0,\n description: 'Fast responses, minimal reasoning',\n },\n medium: {\n reasoningEffort: 'medium',\n maxThinkingTokens: 4000,\n description: 'Balanced speed and depth',\n },\n high: {\n reasoningEffort: 'high',\n maxThinkingTokens: 10000,\n description: 'Deep reasoning for complex tasks',\n },\n max: {\n reasoningEffort: 'high',\n maxThinkingTokens: 32767,\n description: 'Maximum reasoning depth',\n },\n}\n\nfunction EffortSelector({\n onClose,\n}: {\n onClose: (result?: string) => void\n}): React.ReactNode {\n const items = useMemo((): SelectorItem[] => {\n const modelManager = getModelManager()\n const mainModel = modelManager.getModel('main')\n const currentEffort = mainModel?.reasoningEffort || 'medium'\n\n return (\n Object.entries(EFFORT_CONFIG) as [\n EffortLevel,\n (typeof EFFORT_CONFIG)[EffortLevel],\n ][]\n ).map(([level, config]) => ({\n id: level,\n label: level.charAt(0).toUpperCase() + level.slice(1),\n description: config.description,\n isCurrent:\n level === currentEffort || (level === 'medium' && !currentEffort),\n }))\n }, [])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n const level = item.id as EffortLevel\n const config = EFFORT_CONFIG[level]\n\n try {\n const modelManager = getModelManager()\n const mainModelName = modelManager.getModelName('main')\n\n if (mainModelName) {\n modelManager.updateModel(mainModelName, {\n reasoningEffort: config.reasoningEffort,\n })\n reloadModelManager()\n }\n } catch {\n // Model update not available\n }\n\n onClose(`Reasoning effort set to ${level} (${config.description})`)\n },\n [onClose],\n )\n\n return (\n <SimpleSelector\n title=\"Reasoning Effort\"\n items={items}\n onSelect={handleSelect}\n onClose={() => onClose()}\n />\n )\n}\n\nconst effort: Command = {\n name: 'effort',\n description: 'Set reasoning effort level',\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'effort'\n },\n async call(onDone) {\n return <EffortSelector onClose={onDone} />\n },\n}\n\nexport default effort\n"],
5
+ "mappings": "AAOA,OAAO,SAAS,SAAS,mBAAmB;AAC5C,SAAS,sBAAsB;AAE/B,SAAS,iBAAiB,0BAA0B;AAKpD,MAAM,gBAOF;AAAA,EACF,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EACA,KAAK;AAAA,IACH,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,aAAa;AAAA,EACf;AACF;AAEA,SAAS,eAAe;AAAA,EACtB;AACF,GAEoB;AAClB,QAAM,QAAQ,QAAQ,MAAsB;AAC1C,UAAM,eAAe,gBAAgB;AACrC,UAAM,YAAY,aAAa,SAAS,MAAM;AAC9C,UAAM,gBAAgB,WAAW,mBAAmB;AAEpD,WACE,OAAO,QAAQ,aAAa,EAI5B,IAAI,CAAC,CAAC,OAAO,MAAM,OAAO;AAAA,MAC1B,IAAI;AAAA,MACJ,OAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAAA,MACpD,aAAa,OAAO;AAAA,MACpB,WACE,UAAU,iBAAkB,UAAU,YAAY,CAAC;AAAA,IACvD,EAAE;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,cAAc,KAAK;AAElC,UAAI;AACF,cAAM,eAAe,gBAAgB;AACrC,cAAM,gBAAgB,aAAa,aAAa,MAAM;AAEtD,YAAI,eAAe;AACjB,uBAAa,YAAY,eAAe;AAAA,YACtC,iBAAiB,OAAO;AAAA,UAC1B,CAAC;AACD,6BAAmB;AAAA,QACrB;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,cAAQ,2BAA2B,KAAK,KAAK,OAAO,WAAW,GAAG;AAAA,IACpE;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV,SAAS,MAAM,QAAQ;AAAA;AAAA,EACzB;AAEJ;AAEA,MAAM,SAAkB;AAAA,EACtB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,KAAK,QAAQ;AACjB,WAAO,oCAAC,kBAAe,SAAS,QAAQ;AAAA,EAC1C;AACF;AAEA,IAAO,iBAAQ;",
6
+ "names": []
7
+ }