@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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/stats.tsx"],
4
- "sourcesContent": ["/**\n * Stats Command\n *\n * Displays usage statistics including messages, sessions, tool calls,\n * and token usage with ASCII visualization charts.\n *\n * Usage:\n * /stats - Show today's statistics and overview\n * /stats --week - Show this week's statistics\n * /stats --month - Show this month's statistics\n * /stats --models - Show model usage details\n * /stats --tools - Show tool usage details\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport {\n getStats,\n getTodayStats,\n getStatsForDays,\n getModelUsageStats,\n getToolUsageStats,\n type DailyActivity,\n type ModelUsage,\n type ToolUsage,\n type StatsData,\n} from '@utils/stats'\nimport { PressEnterToContinue } from '@components/PressEnterToContinue'\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Render an ASCII progress bar\n */\nfunction renderProgressBar(\n value: number,\n max: number,\n width: number = 40,\n): string {\n if (max === 0) return '\u2591'.repeat(width)\n const filled = Math.min(Math.round((value / max) * width), width)\n const empty = width - filled\n return '\u2588'.repeat(filled) + '\u2591'.repeat(empty)\n}\n\n/**\n * Format number with thousands separator\n */\nfunction formatNumber(n: number): string {\n return n.toLocaleString()\n}\n\n/**\n * Format number with K/M suffix for large numbers\n */\nfunction formatCompactNumber(n: number): string {\n if (n >= 1_000_000) {\n return `${(n / 1_000_000).toFixed(1)}M`\n }\n if (n >= 1_000) {\n return `${(n / 1_000).toFixed(1)}K`\n }\n return n.toString()\n}\n\n/**\n * Format cost in USD\n */\nfunction formatCost(cost: number): string {\n if (cost < 0.01) {\n return `$${cost.toFixed(4)}`\n }\n return `$${cost.toFixed(2)}`\n}\n\n/**\n * Get today's date string in YYYY-MM-DD format\n */\nfunction getTodayString(): string {\n return new Date().toISOString().split('T')[0]!\n}\n\n/**\n * Calculate percentage safely (avoid division by zero)\n */\nfunction safePercentage(value: number, total: number): number {\n if (total === 0) return 0\n return Math.round((value / total) * 100)\n}\n\n/**\n * Sum daily stats for a period\n */\nfunction sumDailyStats(days: DailyActivity[]): DailyActivity {\n return days.reduce(\n (acc, day) => ({\n date: '',\n messageCount: acc.messageCount + day.messageCount,\n sessionCount: acc.sessionCount + day.sessionCount,\n toolCallCount: acc.toolCallCount + day.toolCallCount,\n tokensUsed: acc.tokensUsed + day.tokensUsed,\n costEstimate: acc.costEstimate + day.costEstimate,\n }),\n {\n date: '',\n messageCount: 0,\n sessionCount: 0,\n toolCallCount: 0,\n tokensUsed: 0,\n costEstimate: 0,\n },\n )\n}\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\ninterface StatRowProps {\n label: string\n value: number\n max: number\n barWidth?: number\n comparison?: number\n suffix?: string\n}\n\n/**\n * Render a single stat row with progress bar\n */\nfunction StatRow({\n label,\n value,\n max,\n barWidth = 20,\n comparison,\n suffix,\n}: StatRowProps) {\n const bar = renderProgressBar(value, max, barWidth)\n const formattedValue = formatNumber(value)\n const paddedLabel = label.padEnd(12)\n const paddedValue = formattedValue.padStart(8)\n\n return (\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>{paddedLabel}</Text>\n <Text color={SEMANTIC_COLORS.primary}>{paddedValue}</Text>\n <Text color={SEMANTIC_COLORS.dim}> </Text>\n <Text color={BRAND_GRADIENT.START}>{bar}</Text>\n {comparison !== undefined && comparison !== 0 && (\n <Text\n color={\n comparison > 0 ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error\n }\n >\n {' '}\n ({comparison > 0 ? '+' : ''}\n {comparison} {t('commands.stats.vsYesterday')})\n </Text>\n )}\n {suffix && <Text color={SEMANTIC_COLORS.dim}> {suffix}</Text>}\n </Box>\n )\n}\n\ninterface ModelRowProps {\n key?: string\n model: ModelUsage\n totalCalls: number\n barWidth?: number\n}\n\n/**\n * Render a model usage row\n */\nfunction ModelRow({ model, totalCalls, barWidth = 40 }: ModelRowProps) {\n const percentage = safePercentage(model.calls, totalCalls)\n const bar = renderProgressBar(model.calls, totalCalls, barWidth)\n const displayName =\n model.model.length > 14 ? model.model.slice(0, 11) + '...' : model.model\n\n return (\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>{displayName.padEnd(14)}</Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {String(percentage).padStart(3)}%\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> </Text>\n <Text color={BRAND_GRADIENT.MIDDLE}>{bar}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({formatNumber(model.calls)} {t('commands.stats.calls')})\n </Text>\n </Box>\n )\n}\n\ninterface ToolRowProps {\n key?: string\n tool: ToolUsage\n rank: number\n}\n\n/**\n * Render a tool usage row\n */\nfunction ToolRow({ tool, rank }: ToolRowProps) {\n const successRate = safePercentage(tool.successCount, tool.calls)\n const displayName =\n tool.toolName.length > 16\n ? tool.toolName.slice(0, 13) + '...'\n : tool.toolName\n\n return (\n <Box>\n <Text color={SEMANTIC_COLORS.dim}>{String(rank).padStart(2)}. </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{displayName.padEnd(16)}</Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(tool.calls).padStart(6)}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> {t('commands.stats.calls')}</Text>\n {tool.errorCount > 0 && (\n <Text color={SEMANTIC_COLORS.error}> ({successRate}% success)</Text>\n )}\n </Box>\n )\n}\n\ninterface StatsDisplayProps {\n stats: StatsData\n today: DailyActivity | null\n yesterday: DailyActivity | null\n weekStats: DailyActivity\n showWeek: boolean\n showMonth: boolean\n showModels: boolean\n showTools: boolean\n onClose: () => void\n}\n\n/**\n * Main stats display component\n */\nfunction StatsDisplay({\n stats,\n today,\n yesterday,\n weekStats,\n showWeek,\n showMonth,\n showModels,\n showTools,\n onClose,\n}: StatsDisplayProps) {\n useInput((_, key) => {\n if (key.return || key.escape) onClose()\n })\n\n const modelStats = getModelUsageStats()\n const toolStats = getToolUsageStats()\n const totalModelCalls = modelStats.reduce((sum, m) => sum + m.calls, 0)\n\n // Calculate comparison values\n const msgDiff =\n today && yesterday ? today.messageCount - yesterday.messageCount : undefined\n const sessionDiff =\n today && yesterday ? today.sessionCount - yesterday.sessionCount : undefined\n const toolDiff =\n today && yesterday\n ? today.toolCallCount - yesterday.toolCallCount\n : undefined\n const tokenDiff =\n today && yesterday ? today.tokensUsed - yesterday.tokensUsed : undefined\n\n // Find max values for progress bars\n const maxMsg = Math.max(\n today?.messageCount ?? 0,\n yesterday?.messageCount ?? 0,\n 1,\n )\n const maxSession = Math.max(\n today?.sessionCount ?? 0,\n yesterday?.sessionCount ?? 0,\n 1,\n )\n const maxTool = Math.max(\n today?.toolCallCount ?? 0,\n yesterday?.toolCallCount ?? 0,\n 1,\n )\n const maxToken = Math.max(\n today?.tokensUsed ?? 0,\n yesterday?.tokensUsed ?? 0,\n 1,\n )\n\n // Check if we have any data\n const hasData =\n stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0\n\n if (!hasData) {\n return (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n {t('commands.stats.title')}\n </Text>\n </Box>\n <Text color={SEMANTIC_COLORS.dim}>{t('commands.stats.noData')}</Text>\n <Box marginTop={1}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n {t('commands.stats.title')}\n </Text>\n </Box>\n\n {/* Divider */}\n <Text color={SEMANTIC_COLORS.dim}>{'\u2500'.repeat(65)}</Text>\n\n {/* Today's Stats */}\n {!showWeek && !showMonth && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>\n {t('commands.stats.today')} ({getTodayString()})\n </Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n <StatRow\n label={t('commands.stats.messages')}\n value={today?.messageCount ?? 0}\n max={maxMsg * 1.2}\n comparison={msgDiff}\n />\n <StatRow\n label={t('commands.stats.sessions')}\n value={today?.sessionCount ?? 0}\n max={maxSession * 1.2}\n comparison={sessionDiff}\n />\n <StatRow\n label={t('commands.stats.toolCalls')}\n value={today?.toolCallCount ?? 0}\n max={maxTool * 1.2}\n comparison={toolDiff}\n />\n <StatRow\n label={t('commands.stats.tokens')}\n value={today?.tokensUsed ?? 0}\n max={maxToken * 1.2}\n comparison={tokenDiff}\n />\n </Box>\n </Box>\n )}\n\n {/* Week Stats */}\n {(showWeek || !showMonth) && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>{t('commands.stats.thisWeek')}</Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalMessages').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(weekStats.messageCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalSessions').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(weekStats.sessionCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalTools').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(weekStats.toolCallCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.estCost').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatCost(weekStats.costEstimate)}\n </Text>\n </Box>\n </Box>\n </Box>\n )}\n\n {/* Month Stats */}\n {showMonth && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>{t('commands.stats.thisMonth')}</Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n {(() => {\n const monthStats = sumDailyStats(getStatsForDays(30))\n return (\n <>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalMessages').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(monthStats.messageCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalSessions').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(monthStats.sessionCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalTools').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(monthStats.toolCallCount)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.estCost').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatCost(monthStats.costEstimate)}\n </Text>\n </Box>\n </>\n )\n })()}\n </Box>\n </Box>\n )}\n\n {/* Model Usage */}\n {(showModels || (!showWeek && !showMonth && !showTools)) &&\n modelStats.length > 0 && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>{t('commands.stats.modelUsage')}</Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n {modelStats.slice(0, 5).map(model => (\n <ModelRow\n key={model.model}\n model={model}\n totalCalls={totalModelCalls}\n />\n ))}\n </Box>\n </Box>\n )}\n\n {/* Tool Usage */}\n {(showTools || (!showWeek && !showMonth && !showModels)) &&\n toolStats.length > 0 && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>{t('commands.stats.topTools')}</Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n {toolStats.slice(0, 5).map((tool, index) => (\n <ToolRow key={tool.toolName} tool={tool} rank={index + 1} />\n ))}\n </Box>\n </Box>\n )}\n\n {/* Lifetime Stats */}\n {!showWeek && !showMonth && !showModels && !showTools && (\n <Box flexDirection=\"column\" marginY={1}>\n <Box marginBottom={1}>\n <Text bold>{t('commands.stats.lifetime')}</Text>\n </Box>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalMessages').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(stats.lifetime.totalMessages)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalSessions').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(stats.lifetime.totalSessions)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.totalTools').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatNumber(stats.lifetime.totalToolCalls)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.tokens').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatCompactNumber(stats.lifetime.totalTokens)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.estCost').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.primary}>\n {formatCost(stats.lifetime.totalCost)}\n </Text>\n </Box>\n <Box>\n <Text color={SEMANTIC_COLORS.secondary}>\n {t('commands.stats.firstUsed').padEnd(16)}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {stats.lifetime.firstUsed.split('T')[0]}\n </Text>\n </Box>\n </Box>\n </Box>\n )}\n\n {/* Footer Divider */}\n <Text color={SEMANTIC_COLORS.dim}>{'\u2500'.repeat(65)}</Text>\n\n {/* Press Enter to continue */}\n <Box marginTop={1}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n}\n\n// ============================================================================\n// Command Definition\n// ============================================================================\n\ninterface ParsedArgs {\n week: boolean\n month: boolean\n models: boolean\n tools: boolean\n}\n\n/**\n * Parse command arguments\n */\nfunction parseArgs(args: string): ParsedArgs {\n const trimmed = args.trim().toLowerCase()\n return {\n week: trimmed.includes('--week') || trimmed.includes('-w'),\n month: trimmed.includes('--month') || trimmed.includes('-m'),\n models: trimmed.includes('--models'),\n tools: trimmed.includes('--tools'),\n }\n}\n\nconst command: Command = {\n name: 'stats',\n description: t('commands.stats.description'),\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n const parsedArgs = parseArgs(args ?? '')\n const stats = getStats()\n const today = getTodayStats()\n\n // Get yesterday's stats for comparison\n const recentDays = getStatsForDays(2)\n const yesterday = recentDays.length >= 2 ? (recentDays[1] ?? null) : null\n\n // Get week stats\n const weekStats = sumDailyStats(getStatsForDays(7))\n\n return (\n <StatsDisplay\n stats={stats}\n today={today}\n yesterday={yesterday}\n weekStats={weekStats}\n showWeek={parsedArgs.week}\n showMonth={parsedArgs.month}\n showModels={parsedArgs.models}\n showTools={parsedArgs.tools}\n onClose={onDone}\n />\n )\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Stats Command\n *\n * Displays usage statistics using InfoPanel for consistent UI.\n *\n * Usage:\n * /stats - Show today's statistics and overview\n * /stats --week - Show this week's statistics\n * /stats --month - Show this month's statistics\n * /stats --models - Show model usage details\n * /stats --tools - Show tool usage details\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport {\n getStats,\n getTodayStats,\n getStatsForDays,\n getModelUsageStats,\n getToolUsageStats,\n type DailyActivity,\n} from '@utils/stats'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction formatNumber(n: number): string {\n return n.toLocaleString()\n}\n\nfunction formatCompactNumber(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`\n return n.toString()\n}\n\nfunction formatCost(cost: number): string {\n if (cost < 0.01) return `$${cost.toFixed(4)}`\n return `$${cost.toFixed(2)}`\n}\n\nfunction getTodayString(): string {\n return new Date().toISOString().split('T')[0]!\n}\n\nfunction safePercentage(value: number, total: number): number {\n if (total === 0) return 0\n return Math.round((value / total) * 100)\n}\n\nfunction sumDailyStats(days: DailyActivity[]): DailyActivity {\n return days.reduce(\n (acc, day) => ({\n date: '',\n messageCount: acc.messageCount + day.messageCount,\n sessionCount: acc.sessionCount + day.sessionCount,\n toolCallCount: acc.toolCallCount + day.toolCallCount,\n tokensUsed: acc.tokensUsed + day.tokensUsed,\n costEstimate: acc.costEstimate + day.costEstimate,\n }),\n {\n date: '',\n messageCount: 0,\n sessionCount: 0,\n toolCallCount: 0,\n tokensUsed: 0,\n costEstimate: 0,\n },\n )\n}\n\n// ============================================================================\n// Section Builders\n// ============================================================================\n\nfunction buildTodaySection(\n today: DailyActivity | null,\n yesterday: DailyActivity | null,\n): InfoSection {\n const maxMsg = Math.max(\n today?.messageCount ?? 0,\n yesterday?.messageCount ?? 0,\n 1,\n )\n const maxSession = Math.max(\n today?.sessionCount ?? 0,\n yesterday?.sessionCount ?? 0,\n 1,\n )\n const maxTool = Math.max(\n today?.toolCallCount ?? 0,\n yesterday?.toolCallCount ?? 0,\n 1,\n )\n const maxToken = Math.max(\n today?.tokensUsed ?? 0,\n yesterday?.tokensUsed ?? 0,\n 1,\n )\n\n const msgDiff =\n today && yesterday ? today.messageCount - yesterday.messageCount : undefined\n const sessionDiff =\n today && yesterday ? today.sessionCount - yesterday.sessionCount : undefined\n const toolDiff =\n today && yesterday\n ? today.toolCallCount - yesterday.toolCallCount\n : undefined\n const tokenDiff =\n today && yesterday ? today.tokensUsed - yesterday.tokensUsed : undefined\n\n return {\n title: `${t('commands.stats.today')} (${getTodayString()})`,\n items: [\n {\n label: t('commands.stats.messages'),\n value: formatNumber(today?.messageCount ?? 0),\n progress: {\n percent: safePercentage(today?.messageCount ?? 0, maxMsg * 1.2),\n width: 20,\n },\n delta:\n msgDiff !== undefined\n ? { value: msgDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.sessions'),\n value: formatNumber(today?.sessionCount ?? 0),\n progress: {\n percent: safePercentage(today?.sessionCount ?? 0, maxSession * 1.2),\n width: 20,\n },\n delta:\n sessionDiff !== undefined\n ? { value: sessionDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.toolCalls'),\n value: formatNumber(today?.toolCallCount ?? 0),\n progress: {\n percent: safePercentage(today?.toolCallCount ?? 0, maxTool * 1.2),\n width: 20,\n },\n delta:\n toolDiff !== undefined\n ? { value: toolDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n {\n label: t('commands.stats.tokens'),\n value: formatNumber(today?.tokensUsed ?? 0),\n progress: {\n percent: safePercentage(today?.tokensUsed ?? 0, maxToken * 1.2),\n width: 20,\n },\n delta:\n tokenDiff !== undefined\n ? { value: tokenDiff, label: t('commands.stats.vsYesterday') }\n : undefined,\n },\n ],\n }\n}\n\nfunction buildPeriodSection(title: string, stats: DailyActivity): InfoSection {\n return {\n title,\n items: [\n {\n label: t('commands.stats.totalMessages'),\n value: formatNumber(stats.messageCount),\n },\n {\n label: t('commands.stats.totalSessions'),\n value: formatNumber(stats.sessionCount),\n },\n {\n label: t('commands.stats.totalTools'),\n value: formatNumber(stats.toolCallCount),\n },\n {\n label: t('commands.stats.estCost'),\n value: formatCost(stats.costEstimate),\n },\n ],\n }\n}\n\nfunction buildModelSection(): InfoSection | null {\n const modelStats = getModelUsageStats()\n if (modelStats.length === 0) return null\n\n const totalCalls = modelStats.reduce((sum, m) => sum + m.calls, 0)\n const items: InfoItem[] = modelStats.slice(0, 5).map(model => {\n const percentage = safePercentage(model.calls, totalCalls)\n const displayName =\n model.model.length > 14 ? model.model.slice(0, 11) + '...' : model.model\n return {\n label: displayName,\n value: `${formatNumber(model.calls)} ${t('commands.stats.calls')}`,\n progress: {\n percent: percentage,\n width: 20,\n color: BRAND_GRADIENT.MIDDLE,\n },\n }\n })\n\n return { title: t('commands.stats.modelUsage'), items }\n}\n\nfunction buildToolSection(): InfoSection | null {\n const toolStats = getToolUsageStats()\n if (toolStats.length === 0) return null\n\n const items: InfoItem[] = toolStats.slice(0, 5).map((tool, index) => {\n const successRate = safePercentage(tool.successCount, tool.calls)\n const displayName =\n tool.toolName.length > 16\n ? tool.toolName.slice(0, 13) + '...'\n : tool.toolName\n return {\n label: `${index + 1}. ${displayName}`,\n value: `${formatNumber(tool.calls)} ${t('commands.stats.calls')}${tool.errorCount > 0 ? ` (${successRate}% success)` : ''}`,\n }\n })\n\n return { title: t('commands.stats.topTools'), items }\n}\n\nfunction buildLifetimeSection(): InfoSection {\n const stats = getStats()\n return {\n title: t('commands.stats.lifetime'),\n items: [\n {\n label: t('commands.stats.totalMessages'),\n value: formatNumber(stats.lifetime.totalMessages),\n },\n {\n label: t('commands.stats.totalSessions'),\n value: formatNumber(stats.lifetime.totalSessions),\n },\n {\n label: t('commands.stats.totalTools'),\n value: formatNumber(stats.lifetime.totalToolCalls),\n },\n {\n label: t('commands.stats.tokens'),\n value: formatCompactNumber(stats.lifetime.totalTokens),\n },\n {\n label: t('commands.stats.estCost'),\n value: formatCost(stats.lifetime.totalCost),\n },\n {\n label: t('commands.stats.firstUsed'),\n value: stats.lifetime.firstUsed.split('T')[0] || '',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\n// ============================================================================\n// Command Definition\n// ============================================================================\n\ninterface ParsedArgs {\n week: boolean\n month: boolean\n models: boolean\n tools: boolean\n}\n\nfunction parseArgs(args: string): ParsedArgs {\n const trimmed = args.trim().toLowerCase()\n return {\n week: trimmed.includes('--week') || trimmed.includes('-w'),\n month: trimmed.includes('--month') || trimmed.includes('-m'),\n models: trimmed.includes('--models'),\n tools: trimmed.includes('--tools'),\n }\n}\n\nconst command: Command = {\n name: 'stats',\n description: t('commands.stats.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone, _context, args) {\n const parsedArgs = parseArgs(args ?? '')\n const stats = getStats()\n const today = getTodayStats()\n\n const hasData =\n stats.lifetime.totalMessages > 0 || stats.lifetime.totalSessions > 0\n\n if (!hasData) {\n return (\n <InfoPanel\n title={t('commands.stats.title')}\n sections={[\n {\n title: t('commands.stats.today'),\n items: [\n {\n label: '',\n value: t('commands.stats.noData'),\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n },\n ]}\n onClose={onDone}\n />\n )\n }\n\n const recentDays = getStatsForDays(2)\n const yesterday = recentDays.length >= 2 ? (recentDays[1] ?? null) : null\n const weekStats = sumDailyStats(getStatsForDays(7))\n\n const sections: InfoSection[] = []\n\n // Today's stats\n if (!parsedArgs.week && !parsedArgs.month) {\n sections.push(buildTodaySection(today, yesterday))\n }\n\n // Week stats\n if (parsedArgs.week || !parsedArgs.month) {\n sections.push(buildPeriodSection(t('commands.stats.thisWeek'), weekStats))\n }\n\n // Month stats\n if (parsedArgs.month) {\n const monthStats = sumDailyStats(getStatsForDays(30))\n sections.push(\n buildPeriodSection(t('commands.stats.thisMonth'), monthStats),\n )\n }\n\n // Model usage\n if (\n parsedArgs.models ||\n (!parsedArgs.week && !parsedArgs.month && !parsedArgs.tools)\n ) {\n const modelSection = buildModelSection()\n if (modelSection) sections.push(modelSection)\n }\n\n // Tool usage\n if (\n parsedArgs.tools ||\n (!parsedArgs.week && !parsedArgs.month && !parsedArgs.models)\n ) {\n const toolSection = buildToolSection()\n if (toolSection) sections.push(toolSection)\n }\n\n // Lifetime stats\n if (\n !parsedArgs.week &&\n !parsedArgs.month &&\n !parsedArgs.models &&\n !parsedArgs.tools\n ) {\n sections.push(buildLifetimeSection())\n }\n\n return (\n <InfoPanel\n title={t('commands.stats.title')}\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,19 +1,10 @@
1
1
  import React from "react";
2
- import { Box, Text, useInput } from "ink";
3
2
  import { getModelManager } from "../utils/model.js";
4
3
  import { getCwd } from "../utils/state.js";
5
4
  import { MACRO } from "../constants/macros.js";
6
5
  import { SEMANTIC_COLORS } from "../constants/colors.js";
7
- import { PressEnterToContinue } from "../components/PressEnterToContinue.js";
8
- const StatusDisplay = ({
9
- status,
10
- onClose
11
- }) => {
12
- useInput((_, key) => {
13
- if (key.return || key.escape) onClose();
14
- });
15
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: "cyan" }, "Minto Status")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Version Info"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Minto: "), /* @__PURE__ */ React.createElement(Text, { color: "green" }, "v", status.version)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Node.js: "), /* @__PURE__ */ React.createElement(Text, null, status.nodeVersion)), status.bunVersion && /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Bun: "), /* @__PURE__ */ React.createElement(Text, null, status.bunVersion)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Platform: "), /* @__PURE__ */ React.createElement(Text, null, status.platform)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Environment"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "CWD: "), /* @__PURE__ */ React.createElement(Text, null, status.cwd)))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Model Configuration"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, status.modelInfo ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Model: "), /* @__PURE__ */ React.createElement(Text, { color: "cyan" }, status.modelInfo.name)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Provider: "), /* @__PURE__ */ React.createElement(Text, null, status.modelInfo.provider)), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Context: "), /* @__PURE__ */ React.createElement(Text, null, (status.modelInfo.contextLength / 1e3).toFixed(0), "k tokens"))) : /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "No model configured"))), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "API Connection"), /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Status: "), status.apiConnected ? /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u25CF Connected") : /* @__PURE__ */ React.createElement(Text, { color: "red" }, "\u25CB Not connected")))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(PressEnterToContinue, null)));
16
- };
6
+ import { InfoPanel } from "../components/InfoPanel/index.js";
7
+ import { t } from "../i18n/index.js";
17
8
  async function getStatusInfo() {
18
9
  let modelInfo = null;
19
10
  let apiConnected = false;
@@ -44,18 +35,89 @@ async function getStatusInfo() {
44
35
  apiConnected
45
36
  };
46
37
  }
38
+ function buildSections(status) {
39
+ const sections = [];
40
+ const versionItems = [
41
+ {
42
+ label: "Minto",
43
+ value: `v${status.version}`,
44
+ valueColor: SEMANTIC_COLORS.success
45
+ },
46
+ { label: "Node.js", value: status.nodeVersion }
47
+ ];
48
+ if (status.bunVersion) {
49
+ versionItems.push({ label: "Bun", value: status.bunVersion });
50
+ }
51
+ versionItems.push({ label: "Platform", value: status.platform });
52
+ sections.push({
53
+ title: t("commands.status.versionInfo"),
54
+ items: versionItems
55
+ });
56
+ sections.push({
57
+ title: t("commands.status.environment"),
58
+ items: [{ label: "CWD", value: status.cwd }]
59
+ });
60
+ if (status.modelInfo) {
61
+ sections.push({
62
+ title: t("commands.status.modelConfiguration"),
63
+ items: [
64
+ {
65
+ label: "Model",
66
+ value: status.modelInfo.name,
67
+ valueColor: SEMANTIC_COLORS.info
68
+ },
69
+ { label: "Provider", value: status.modelInfo.provider },
70
+ {
71
+ label: "Context",
72
+ value: `${(status.modelInfo.contextLength / 1e3).toFixed(0)}k tokens`
73
+ }
74
+ ]
75
+ });
76
+ } else {
77
+ sections.push({
78
+ title: t("commands.status.modelConfiguration"),
79
+ items: [
80
+ {
81
+ label: "Status",
82
+ value: t("commands.status.notConfigured"),
83
+ valueColor: "#FFB86C"
84
+ }
85
+ ]
86
+ });
87
+ }
88
+ sections.push({
89
+ title: t("commands.status.apiConnection"),
90
+ items: [
91
+ {
92
+ label: "Status",
93
+ value: status.apiConnected ? `\u25CF ${t("commands.status.connected")}` : `\u25CB ${t("commands.status.notConnected")}`,
94
+ valueColor: status.apiConnected ? SEMANTIC_COLORS.success : SEMANTIC_COLORS.error
95
+ }
96
+ ]
97
+ });
98
+ return sections;
99
+ }
47
100
  const command = {
48
101
  name: "status",
49
- description: "Display version and connection information",
102
+ description: t("commands.status.description"),
50
103
  isEnabled: true,
51
104
  isHidden: false,
105
+ hidePromptInput: true,
52
106
  type: "local-jsx",
53
107
  userFacingName() {
54
108
  return this.name;
55
109
  },
56
110
  async call(onDone) {
57
111
  const status = await getStatusInfo();
58
- return /* @__PURE__ */ React.createElement(StatusDisplay, { status, onClose: onDone });
112
+ const sections = buildSections(status);
113
+ return /* @__PURE__ */ React.createElement(
114
+ InfoPanel,
115
+ {
116
+ title: t("commands.status.title"),
117
+ sections,
118
+ onClose: onDone
119
+ }
120
+ );
59
121
  }
60
122
  };
61
123
  var status_default = command;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/status.tsx"],
4
- "sourcesContent": ["/**\n * Status Command\n *\n * Shows version information, connection status, and system health.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport type { Command } from '@commands'\nimport { getModelManager } from '@utils/model'\nimport { getCwd } from '@utils/state'\nimport { MACRO } from '@constants/macros'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { PressEnterToContinue } from '@components/PressEnterToContinue'\n\ninterface StatusInfo {\n version: string\n nodeVersion: string\n bunVersion: string | null\n platform: string\n cwd: string\n modelInfo: {\n name: string\n provider: string\n contextLength: number\n } | null\n apiConnected: boolean\n}\n\nconst StatusDisplay = ({\n status,\n onClose,\n}: {\n status: StatusInfo\n onClose: () => void\n}) => {\n useInput((_, key) => {\n if (key.return || key.escape) onClose()\n })\n\n return (\n <Box flexDirection=\"column\" marginY={1}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n Minto Status\n </Text>\n </Box>\n\n {/* Version info */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Version Info</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Minto: </Text>\n <Text color=\"green\">v{status.version}</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Node.js: </Text>\n <Text>{status.nodeVersion}</Text>\n </Text>\n {status.bunVersion && (\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Bun: </Text>\n <Text>{status.bunVersion}</Text>\n </Text>\n )}\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Platform: </Text>\n <Text>{status.platform}</Text>\n </Text>\n </Box>\n </Box>\n\n {/* Environment */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Environment</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>CWD: </Text>\n <Text>{status.cwd}</Text>\n </Text>\n </Box>\n </Box>\n\n {/* Model info */}\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>Model Configuration</Text>\n <Box paddingLeft={2} flexDirection=\"column\">\n {status.modelInfo ? (\n <>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Model: </Text>\n <Text color=\"cyan\">{status.modelInfo.name}</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Provider: </Text>\n <Text>{status.modelInfo.provider}</Text>\n </Text>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Context: </Text>\n <Text>\n {(status.modelInfo.contextLength / 1000).toFixed(0)}k tokens\n </Text>\n </Text>\n </>\n ) : (\n <Text color=\"yellow\">No model configured</Text>\n )}\n </Box>\n </Box>\n\n {/* API Status */}\n <Box flexDirection=\"column\">\n <Text bold>API Connection</Text>\n <Box paddingLeft={2}>\n <Text>\n <Text color={SEMANTIC_COLORS.dim}>Status: </Text>\n {status.apiConnected ? (\n <Text color=\"green\">\u25CF Connected</Text>\n ) : (\n <Text color=\"red\">\u25CB Not connected</Text>\n )}\n </Text>\n </Box>\n </Box>\n\n {/* Press Enter to continue */}\n <Box marginTop={1}>\n <PressEnterToContinue />\n </Box>\n </Box>\n )\n}\n\nasync function getStatusInfo(): Promise<StatusInfo> {\n let modelInfo: StatusInfo['modelInfo'] = null\n let apiConnected = false\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n modelInfo = {\n name: profile.name || profile.modelName,\n provider: profile.provider || 'anthropic',\n contextLength: profile.contextLength || 200_000,\n }\n apiConnected = true // If we can resolve model, API is configured\n }\n } catch {\n // Model not configured\n }\n\n // Check for Bun\n let bunVersion: string | null = null\n if (typeof Bun !== 'undefined') {\n bunVersion = Bun.version\n }\n\n return {\n version: MACRO.VERSION,\n nodeVersion: process.version,\n bunVersion,\n platform: `${process.platform} (${process.arch})`,\n cwd: getCwd(),\n modelInfo,\n apiConnected,\n }\n}\n\nconst command: Command = {\n name: 'status',\n description: 'Display version and connection information',\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const status = await getStatusInfo()\n\n return <StatusDisplay status={status} onClose={onDone} />\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Status Command\n *\n * Shows version information, connection status, and system health.\n * Uses InfoPanel for consistent UI.\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport { getModelManager } from '@utils/model'\nimport { getCwd } from '@utils/state'\nimport { MACRO } from '@constants/macros'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\ninterface StatusInfo {\n version: string\n nodeVersion: string\n bunVersion: string | null\n platform: string\n cwd: string\n modelInfo: {\n name: string\n provider: string\n contextLength: number\n } | null\n apiConnected: boolean\n}\n\nasync function getStatusInfo(): Promise<StatusInfo> {\n let modelInfo: StatusInfo['modelInfo'] = null\n let apiConnected = false\n\n try {\n const modelManager = getModelManager()\n const profile = modelManager.resolveModel('main')\n if (profile) {\n modelInfo = {\n name: profile.name || profile.modelName,\n provider: profile.provider || 'anthropic',\n contextLength: profile.contextLength || 200_000,\n }\n apiConnected = true\n }\n } catch {\n // Model not configured\n }\n\n let bunVersion: string | null = null\n if (typeof Bun !== 'undefined') {\n bunVersion = Bun.version\n }\n\n return {\n version: MACRO.VERSION,\n nodeVersion: process.version,\n bunVersion,\n platform: `${process.platform} (${process.arch})`,\n cwd: getCwd(),\n modelInfo,\n apiConnected,\n }\n}\n\nfunction buildSections(status: StatusInfo): InfoSection[] {\n const sections: InfoSection[] = []\n\n // Version Info\n const versionItems = [\n {\n label: 'Minto',\n value: `v${status.version}`,\n valueColor: SEMANTIC_COLORS.success,\n },\n { label: 'Node.js', value: status.nodeVersion },\n ]\n if (status.bunVersion) {\n versionItems.push({ label: 'Bun', value: status.bunVersion })\n }\n versionItems.push({ label: 'Platform', value: status.platform })\n sections.push({\n title: t('commands.status.versionInfo'),\n items: versionItems,\n })\n\n // Environment\n sections.push({\n title: t('commands.status.environment'),\n items: [{ label: 'CWD', value: status.cwd }],\n })\n\n // Model Configuration\n if (status.modelInfo) {\n sections.push({\n title: t('commands.status.modelConfiguration'),\n items: [\n {\n label: 'Model',\n value: status.modelInfo.name,\n valueColor: SEMANTIC_COLORS.info,\n },\n { label: 'Provider', value: status.modelInfo.provider },\n {\n label: 'Context',\n value: `${(status.modelInfo.contextLength / 1000).toFixed(0)}k tokens`,\n },\n ],\n })\n } else {\n sections.push({\n title: t('commands.status.modelConfiguration'),\n items: [\n {\n label: 'Status',\n value: t('commands.status.notConfigured'),\n valueColor: '#FFB86C',\n },\n ],\n })\n }\n\n // API Connection\n sections.push({\n title: t('commands.status.apiConnection'),\n items: [\n {\n label: 'Status',\n value: status.apiConnected\n ? `\\u25CF ${t('commands.status.connected')}`\n : `\\u25CB ${t('commands.status.notConnected')}`,\n valueColor: status.apiConnected\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error,\n },\n ],\n })\n\n return sections\n}\n\nconst command: Command = {\n name: 'status',\n description: t('commands.status.description'),\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n\n userFacingName() {\n return this.name\n },\n\n async call(onDone) {\n const status = await getStatusInfo()\n const sections = buildSections(status)\n\n return (\n <InfoPanel\n title={t('commands.status.title')}\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
  }
@@ -46,6 +46,12 @@ function handleHashCommand(interpreted) {
46
46
  const claudePath = join(cwd, "CLAUDE.md");
47
47
  const filesToUpdate = [];
48
48
  filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE });
49
+ const agentsPath = join(cwd, "AGENTS.md");
50
+ try {
51
+ readFileSync(agentsPath, "utf-8");
52
+ filesToUpdate.push({ path: agentsPath, name: "AGENTS.md" });
53
+ } catch {
54
+ }
49
55
  try {
50
56
  readFileSync(claudePath, "utf-8");
51
57
  filesToUpdate.push({ path: claudePath, name: "CLAUDE.md" });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/terminalSetup.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n '[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: true,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport { EOL, platform, homedir } from 'os'\nimport { execFileNoThrow } from '@utils/execFileNoThrow'\nimport chalk from 'chalk'\nimport { getTheme } from '@utils/theme'\nimport { env } from '@utils/env'\nimport { getGlobalConfig, saveGlobalConfig } from '@utils/config'\nimport { markProjectOnboardingComplete } from '@components/ProjectOnboarding'\nimport { readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\nimport { safeParseJSON } from '@utils/json'\nimport { logError } from '@utils/log'\nimport { PROJECT_FILE } from '@constants/product'\n\nconst terminalSetup: Command = {\n type: 'local',\n name: 'terminal-setup',\n userFacingName() {\n return 'terminal-setup'\n },\n description:\n '[Developer] Install Shift+Enter key binding for newlines (iTerm2 and VSCode only)',\n isEnabled:\n (platform() === 'darwin' && env.terminal === 'iTerm.app') ||\n env.terminal === 'vscode',\n isHidden: true,\n async call() {\n let result = ''\n\n switch (env.terminal) {\n case 'iTerm.app':\n result = await installBindingsForITerm2()\n break\n case 'vscode':\n result = installBindingsForVSCodeTerminal()\n break\n }\n\n // Update global config to indicate Shift+Enter key binding is installed\n const config = getGlobalConfig()\n config.shiftEnterKeyBindingInstalled = true\n saveGlobalConfig(config)\n\n // Mark onboarding as complete\n markProjectOnboardingComplete()\n\n return result\n },\n}\n\nexport function isShiftEnterKeyBindingInstalled(): boolean {\n return getGlobalConfig().shiftEnterKeyBindingInstalled === true\n}\n\nexport function handleHashCommand(interpreted: string): void {\n // Appends the AI-interpreted content to both MINTO.md and CLAUDE.md (if exists)\n try {\n const cwd = process.cwd()\n const codeContextPath = join(cwd, PROJECT_FILE)\n const claudePath = join(cwd, 'CLAUDE.md')\n\n // Check which files exist and update them\n const filesToUpdate = []\n\n // Always try to update MINTO.md (create if not exists)\n filesToUpdate.push({ path: codeContextPath, name: PROJECT_FILE })\n\n // Update AGENTS.md only if it exists\n const agentsPath = join(cwd, 'AGENTS.md')\n try {\n readFileSync(agentsPath, 'utf-8')\n filesToUpdate.push({ path: agentsPath, name: 'AGENTS.md' })\n } catch {\n // AGENTS.md doesn't exist, skip it\n }\n\n // Update CLAUDE.md only if it exists\n try {\n readFileSync(claudePath, 'utf-8')\n filesToUpdate.push({ path: claudePath, name: 'CLAUDE.md' })\n } catch {\n // CLAUDE.md doesn't exist, skip it\n }\n\n const now = new Date()\n const timezoneMatch = now.toString().match(/\\(([A-Z]+)\\)/)\n const timezone = timezoneMatch\n ? timezoneMatch[1]\n : now\n .toLocaleTimeString('en-us', { timeZoneName: 'short' })\n .split(' ')\n .pop()\n\n const timestamp = interpreted.includes(now.getFullYear().toString())\n ? ''\n : `\\n\\n_Added on ${now.toLocaleString()} ${timezone}_`\n\n const updatedFiles = []\n\n for (const file of filesToUpdate) {\n try {\n // Check if file exists, if not create it\n let existingContent = ''\n try {\n existingContent = readFileSync(file.path, 'utf-8').trim()\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n\n // Add a separator if the file already has content\n const separator = existingContent ? '\\n\\n' : ''\n\n // Combine everything and write to file\n const newContent = `${existingContent}${separator}${interpreted}${timestamp}`\n writeFileSync(file.path, newContent, 'utf-8')\n updatedFiles.push(file.name)\n } catch (error) {\n logError(error)\n console.error(\n chalk.hex(getTheme().error)(\n `Failed to update ${file.name}: ${error.message}`,\n ),\n )\n }\n }\n\n if (updatedFiles.length > 0) {\n console.log(\n chalk.hex(getTheme().success)(\n `Added note to ${updatedFiles.join(' and ')}`,\n ),\n )\n }\n } catch (e) {\n logError(e)\n console.error(\n chalk.hex(getTheme().error)(`Failed to add note: ${e.message}`),\n )\n }\n}\n\nexport default terminalSetup\n\nasync function installBindingsForITerm2(): Promise<string> {\n const { code } = await execFileNoThrow('defaults', [\n 'write',\n 'com.googlecode.iterm2',\n 'GlobalKeyMap',\n '-dict-add',\n '0xd-0x20000-0x24',\n `<dict>\n <key>Text</key>\n <string>\\\\n</string>\n <key>Action</key>\n <integer>12</integer>\n <key>Version</key>\n <integer>1</integer>\n <key>Keycode</key>\n <integer>13</integer>\n <key>Modifiers</key>\n <integer>131072</integer>\n </dict>`,\n ])\n\n if (code !== 0) {\n throw new Error('Failed to install iTerm2 Shift+Enter key binding')\n }\n\n return `${chalk.hex(getTheme().success)(\n 'Installed iTerm2 Shift+Enter key binding',\n )}${EOL}${chalk.dim('See iTerm2 \u2192 Preferences \u2192 Keys')}${EOL}`\n}\n\ntype VSCodeKeybinding = {\n key: string\n command: string\n args: { text: string }\n when: string\n}\n\nfunction installBindingsForVSCodeTerminal(): string {\n const vscodeKeybindingsPath = join(\n homedir(),\n platform() === 'win32'\n ? join('AppData', 'Roaming', 'Code', 'User')\n : platform() === 'darwin'\n ? join('Library', 'Application Support', 'Code', 'User')\n : join('.config', 'Code', 'User'),\n 'keybindings.json',\n )\n\n try {\n const content = readFileSync(vscodeKeybindingsPath, 'utf-8')\n const keybindings: VSCodeKeybinding[] =\n (safeParseJSON(content) as VSCodeKeybinding[]) ?? []\n\n // Check if keybinding already exists\n const existingBinding = keybindings.find(\n binding =>\n binding.key === 'shift+enter' &&\n binding.command === 'workbench.action.terminal.sendSequence' &&\n binding.when === 'terminalFocus',\n )\n if (existingBinding) {\n return `${chalk.hex(getTheme().warning)(\n 'Found existing VSCode terminal Shift+Enter key binding. Remove it to continue.',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n }\n\n // Add the keybinding\n keybindings.push({\n key: 'shift+enter',\n command: 'workbench.action.terminal.sendSequence',\n args: { text: '\\\\\\r\\n' },\n when: 'terminalFocus',\n })\n\n writeFileSync(\n vscodeKeybindingsPath,\n JSON.stringify(keybindings, null, 4),\n 'utf-8',\n )\n\n return `${chalk.hex(getTheme().success)(\n 'Installed VSCode terminal Shift+Enter key binding',\n )}${EOL}${chalk.dim(`See ${vscodeKeybindingsPath}`)}${EOL}`\n } catch (e) {\n logError(e)\n throw new Error('Failed to install VSCode terminal Shift+Enter key binding')\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,KAAK,UAAU,eAAe;AACvC,SAAS,uBAAuB;AAChC,OAAO,WAAW;AAClB,SAAS,gBAAgB;AACzB,SAAS,WAAW;AACpB,SAAS,iBAAiB,wBAAwB;AAClD,SAAS,qCAAqC;AAC9C,SAAS,cAAc,qBAAqB;AAC5C,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAE7B,MAAM,gBAAyB;AAAA,EAC7B,MAAM;AAAA,EACN,MAAM;AAAA,EACN,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,aACE;AAAA,EACF,WACG,SAAS,MAAM,YAAY,IAAI,aAAa,eAC7C,IAAI,aAAa;AAAA,EACnB,UAAU;AAAA,EACV,MAAM,OAAO;AACX,QAAI,SAAS;AAEb,YAAQ,IAAI,UAAU;AAAA,MACpB,KAAK;AACH,iBAAS,MAAM,yBAAyB;AACxC;AAAA,MACF,KAAK;AACH,iBAAS,iCAAiC;AAC1C;AAAA,IACJ;AAGA,UAAM,SAAS,gBAAgB;AAC/B,WAAO,gCAAgC;AACvC,qBAAiB,MAAM;AAGvB,kCAA8B;AAE9B,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kCAA2C;AACzD,SAAO,gBAAgB,EAAE,kCAAkC;AAC7D;AAEO,SAAS,kBAAkB,aAA2B;AAE3D,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,kBAAkB,KAAK,KAAK,YAAY;AAC9C,UAAM,aAAa,KAAK,KAAK,WAAW;AAGxC,UAAM,gBAAgB,CAAC;AAGvB,kBAAc,KAAK,EAAE,MAAM,iBAAiB,MAAM,aAAa,CAAC;AAGhE,UAAM,aAAa,KAAK,KAAK,WAAW;AACxC,QAAI;AACF,mBAAa,YAAY,OAAO;AAChC,oBAAc,KAAK,EAAE,MAAM,YAAY,MAAM,YAAY,CAAC;AAAA,IAC5D,QAAQ;AAAA,IAER;AAGA,QAAI;AACF,mBAAa,YAAY,OAAO;AAChC,oBAAc,KAAK,EAAE,MAAM,YAAY,MAAM,YAAY,CAAC;AAAA,IAC5D,QAAQ;AAAA,IAER;AAEA,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,gBAAgB,IAAI,SAAS,EAAE,MAAM,cAAc;AACzD,UAAM,WAAW,gBACb,cAAc,CAAC,IACf,IACG,mBAAmB,SAAS,EAAE,cAAc,QAAQ,CAAC,EACrD,MAAM,GAAG,EACT,IAAI;AAEX,UAAM,YAAY,YAAY,SAAS,IAAI,YAAY,EAAE,SAAS,CAAC,IAC/D,KACA;AAAA;AAAA,YAAiB,IAAI,eAAe,CAAC,IAAI,QAAQ;AAErD,UAAM,eAAe,CAAC;AAEtB,eAAW,QAAQ,eAAe;AAChC,UAAI;AAEF,YAAI,kBAAkB;AACtB,YAAI;AACF,4BAAkB,aAAa,KAAK,MAAM,OAAO,EAAE,KAAK;AAAA,QAC1D,SAAS,OAAO;AAAA,QAEhB;AAGA,cAAM,YAAY,kBAAkB,SAAS;AAG7C,cAAM,aAAa,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS;AAC3E,sBAAc,KAAK,MAAM,YAAY,OAAO;AAC5C,qBAAa,KAAK,KAAK,IAAI;AAAA,MAC7B,SAAS,OAAO;AACd,iBAAS,KAAK;AACd,gBAAQ;AAAA,UACN,MAAM,IAAI,SAAS,EAAE,KAAK;AAAA,YACxB,oBAAoB,KAAK,IAAI,KAAK,MAAM,OAAO;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ;AAAA,QACN,MAAM,IAAI,SAAS,EAAE,OAAO;AAAA,UAC1B,iBAAiB,aAAa,KAAK,OAAO,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,aAAS,CAAC;AACV,YAAQ;AAAA,MACN,MAAM,IAAI,SAAS,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE;AAAA,IAChE;AAAA,EACF;AACF;AAEA,IAAO,wBAAQ;AAEf,eAAe,2BAA4C;AACzD,QAAM,EAAE,KAAK,IAAI,MAAM,gBAAgB,YAAY;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,CAAC;AAED,MAAI,SAAS,GAAG;AACd,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,SAAO,GAAG,MAAM,IAAI,SAAS,EAAE,OAAO;AAAA,IACpC;AAAA,EACF,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,2CAAiC,CAAC,GAAG,GAAG;AAC9D;AASA,SAAS,mCAA2C;AAClD,QAAM,wBAAwB;AAAA,IAC5B,QAAQ;AAAA,IACR,SAAS,MAAM,UACX,KAAK,WAAW,WAAW,QAAQ,MAAM,IACzC,SAAS,MAAM,WACb,KAAK,WAAW,uBAAuB,QAAQ,MAAM,IACrD,KAAK,WAAW,QAAQ,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,uBAAuB,OAAO;AAC3D,UAAM,cACH,cAAc,OAAO,KAA4B,CAAC;AAGrD,UAAM,kBAAkB,YAAY;AAAA,MAClC,aACE,QAAQ,QAAQ,iBAChB,QAAQ,YAAY,4CACpB,QAAQ,SAAS;AAAA,IACrB;AACA,QAAI,iBAAiB;AACnB,aAAO,GAAG,MAAM,IAAI,SAAS,EAAE,OAAO;AAAA,QACpC;AAAA,MACF,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,OAAO,qBAAqB,EAAE,CAAC,GAAG,GAAG;AAAA,IAC3D;AAGA,gBAAY,KAAK;AAAA,MACf,KAAK;AAAA,MACL,SAAS;AAAA,MACT,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AAED;AAAA,MACE;AAAA,MACA,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,MACnC;AAAA,IACF;AAEA,WAAO,GAAG,MAAM,IAAI,SAAS,EAAE,OAAO;AAAA,MACpC;AAAA,IACF,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,OAAO,qBAAqB,EAAE,CAAC,GAAG,GAAG;AAAA,EAC3D,SAAS,GAAG;AACV,aAAS,CAAC;AACV,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACF;",
6
6
  "names": []
7
7
  }