@within-7/minto 0.1.6 → 0.2.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 (487) hide show
  1. package/cli.js +155 -37
  2. package/dist/Tool.js +38 -0
  3. package/dist/Tool.js.map +3 -3
  4. package/dist/commands/agents/AgentsCommand.js +52 -26
  5. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  6. package/dist/commands/agents/constants.js +1 -1
  7. package/dist/commands/agents/constants.js.map +1 -1
  8. package/dist/commands/agents/index.js +1 -1
  9. package/dist/commands/bug.js +74 -7
  10. package/dist/commands/bug.js.map +3 -3
  11. package/dist/commands/clear.js +3 -0
  12. package/dist/commands/clear.js.map +2 -2
  13. package/dist/commands/compact.js +37 -0
  14. package/dist/commands/compact.js.map +2 -2
  15. package/dist/commands/context.js +84 -0
  16. package/dist/commands/context.js.map +7 -0
  17. package/dist/commands/ctx_viz.js +18 -10
  18. package/dist/commands/ctx_viz.js.map +2 -2
  19. package/dist/commands/doctor.js +158 -12
  20. package/dist/commands/doctor.js.map +2 -2
  21. package/dist/commands/export.js +156 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +21 -12
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +6 -5
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +86 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/quit.js +3 -1
  30. package/dist/commands/quit.js.map +2 -2
  31. package/dist/commands/sandbox.js +104 -0
  32. package/dist/commands/sandbox.js.map +7 -0
  33. package/dist/commands/status.js +58 -0
  34. package/dist/commands/status.js.map +7 -0
  35. package/dist/commands/tasks.js +108 -0
  36. package/dist/commands/tasks.js.map +7 -0
  37. package/dist/commands/todos.js +123 -0
  38. package/dist/commands/todos.js.map +7 -0
  39. package/dist/commands.js +20 -2
  40. package/dist/commands.js.map +2 -2
  41. package/dist/components/AgentThinkingBlock.js +10 -18
  42. package/dist/components/AgentThinkingBlock.js.map +2 -2
  43. package/dist/components/BackgroundTasksPanel.js +78 -29
  44. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  45. package/dist/components/BashStreamingProgress.js +24 -0
  46. package/dist/components/BashStreamingProgress.js.map +7 -0
  47. package/dist/components/CollapsibleHint.js +14 -0
  48. package/dist/components/CollapsibleHint.js.map +7 -0
  49. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  50. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  51. package/dist/components/HotkeyHelpPanel.js +137 -0
  52. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  53. package/dist/components/Logo.js +5 -5
  54. package/dist/components/Logo.js.map +2 -2
  55. package/dist/components/Message.js +23 -7
  56. package/dist/components/Message.js.map +3 -3
  57. package/dist/components/ModelConfig.js +16 -3
  58. package/dist/components/ModelConfig.js.map +2 -2
  59. package/dist/components/ModelListManager.js +3 -3
  60. package/dist/components/ModelListManager.js.map +2 -2
  61. package/dist/components/ModelSelector/ModelSelector.js +1 -1
  62. package/dist/components/Onboarding.js +19 -14
  63. package/dist/components/Onboarding.js.map +2 -2
  64. package/dist/components/ProgressBar.js +74 -0
  65. package/dist/components/ProgressBar.js.map +7 -0
  66. package/dist/components/PromptInput.js +156 -46
  67. package/dist/components/PromptInput.js.map +2 -2
  68. package/dist/components/RequestStatusIndicator.js +194 -0
  69. package/dist/components/RequestStatusIndicator.js.map +7 -0
  70. package/dist/components/Spinner.js +92 -27
  71. package/dist/components/Spinner.js.map +2 -2
  72. package/dist/components/SpinnerSymbol.js +21 -27
  73. package/dist/components/SpinnerSymbol.js.map +2 -2
  74. package/dist/components/StreamingBashOutput.js +9 -8
  75. package/dist/components/StreamingBashOutput.js.map +2 -2
  76. package/dist/components/SubagentBlock.js +1 -1
  77. package/dist/components/SubagentBlock.js.map +1 -1
  78. package/dist/components/SubagentProgress.js +10 -11
  79. package/dist/components/SubagentProgress.js.map +2 -2
  80. package/dist/components/TaskCard.js +16 -13
  81. package/dist/components/TaskCard.js.map +2 -2
  82. package/dist/components/TodoChangeBlock.js +1 -1
  83. package/dist/components/TodoChangeBlock.js.map +2 -2
  84. package/dist/components/TodoPanel.js +120 -29
  85. package/dist/components/TodoPanel.js.map +3 -3
  86. package/dist/components/TokenCounter.js +74 -0
  87. package/dist/components/TokenCounter.js.map +7 -0
  88. package/dist/components/TokenWarning.js +2 -1
  89. package/dist/components/TokenWarning.js.map +2 -2
  90. package/dist/components/TreeConnector.js +25 -0
  91. package/dist/components/TreeConnector.js.map +7 -0
  92. package/dist/components/TurnCompletionIndicator.js +18 -0
  93. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  94. package/dist/components/messages/AssistantTextMessage.js +5 -2
  95. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  96. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  97. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  98. package/dist/components/messages/AssistantToolUseMessage.js +11 -8
  99. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  100. package/dist/components/messages/GroupRenderer.js +53 -0
  101. package/dist/components/messages/GroupRenderer.js.map +7 -0
  102. package/dist/components/messages/NestedTasksPreview.js +12 -0
  103. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  104. package/dist/components/messages/ParallelTasksGroupView.js +92 -0
  105. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  106. package/dist/components/messages/TaskInModuleView.js +198 -0
  107. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  108. package/dist/components/messages/TaskOutputContent.js +53 -0
  109. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  110. package/dist/components/messages/UserPromptMessage.js +1 -1
  111. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  112. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  113. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  114. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  115. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  116. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  117. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  118. package/dist/constants/colors.js +48 -0
  119. package/dist/constants/colors.js.map +2 -2
  120. package/dist/constants/formatRules.js +102 -0
  121. package/dist/constants/formatRules.js.map +7 -0
  122. package/dist/constants/prompts.js +12 -34
  123. package/dist/constants/prompts.js.map +2 -2
  124. package/dist/constants/symbols.js +64 -6
  125. package/dist/constants/symbols.js.map +2 -2
  126. package/dist/constants/timing.js +5 -0
  127. package/dist/constants/timing.js.map +2 -2
  128. package/dist/core/config/defaults.js +84 -0
  129. package/dist/core/config/defaults.js.map +7 -0
  130. package/dist/core/config/index.js +111 -0
  131. package/dist/core/config/index.js.map +7 -0
  132. package/dist/core/config/loader.js +221 -0
  133. package/dist/core/config/loader.js.map +7 -0
  134. package/dist/core/config/migrations.js +128 -0
  135. package/dist/core/config/migrations.js.map +7 -0
  136. package/dist/core/config/schema.js +178 -0
  137. package/dist/core/config/schema.js.map +7 -0
  138. package/dist/core/costTracker.js +138 -0
  139. package/dist/core/costTracker.js.map +7 -0
  140. package/dist/core/index.js +5 -0
  141. package/dist/core/index.js.map +7 -0
  142. package/dist/core/permissions/auditLog.js +204 -0
  143. package/dist/core/permissions/auditLog.js.map +7 -0
  144. package/dist/core/permissions/engine/index.js +3 -0
  145. package/dist/core/permissions/engine/index.js.map +7 -0
  146. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  147. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  148. package/dist/core/permissions/engine/types.js +1 -0
  149. package/dist/core/permissions/engine/types.js.map +7 -0
  150. package/dist/core/permissions/index.js +84 -0
  151. package/dist/core/permissions/index.js.map +7 -0
  152. package/dist/core/permissions/ruleEngine.js +259 -0
  153. package/dist/core/permissions/ruleEngine.js.map +7 -0
  154. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  155. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  156. package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
  157. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  158. package/dist/core/permissions/rules/index.js +46 -0
  159. package/dist/core/permissions/rules/index.js.map +7 -0
  160. package/dist/core/permissions/rules/planModeRule.js +55 -0
  161. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  162. package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
  163. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  164. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  165. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  166. package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
  167. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  168. package/dist/core/permissions/types.js +127 -0
  169. package/dist/core/permissions/types.js.map +7 -0
  170. package/dist/core/tools/executor.js +143 -0
  171. package/dist/core/tools/executor.js.map +7 -0
  172. package/dist/core/tools/index.js +15 -0
  173. package/dist/core/tools/index.js.map +7 -0
  174. package/dist/core/tools/registry.js +183 -0
  175. package/dist/core/tools/registry.js.map +7 -0
  176. package/dist/core/tools/types.js +1 -0
  177. package/dist/core/tools/types.js.map +7 -0
  178. package/dist/cost-tracker.js +23 -15
  179. package/dist/cost-tracker.js.map +2 -2
  180. package/dist/entrypoints/cli.js +43 -43
  181. package/dist/entrypoints/cli.js.map +2 -2
  182. package/dist/entrypoints/mcp.js +12 -4
  183. package/dist/entrypoints/mcp.js.map +2 -2
  184. package/dist/history.js +14 -3
  185. package/dist/history.js.map +2 -2
  186. package/dist/hooks/useAgentTranscripts.js +116 -0
  187. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  188. package/dist/hooks/useAnimationSync.js +53 -0
  189. package/dist/hooks/useAnimationSync.js.map +7 -0
  190. package/dist/hooks/useArrowKeyHistory.js +4 -2
  191. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  192. package/dist/hooks/useCanUseTool.js +3 -1
  193. package/dist/hooks/useCanUseTool.js.map +2 -2
  194. package/dist/hooks/useCancelRequest.js +4 -1
  195. package/dist/hooks/useCancelRequest.js.map +2 -2
  196. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  197. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  198. package/dist/hooks/useHookStatus.js +40 -0
  199. package/dist/hooks/useHookStatus.js.map +7 -0
  200. package/dist/hooks/useLogMessages.js +17 -1
  201. package/dist/hooks/useLogMessages.js.map +2 -2
  202. package/dist/hooks/useMessageGroups.js +43 -0
  203. package/dist/hooks/useMessageGroups.js.map +7 -0
  204. package/dist/hooks/useTerminalSize.js +62 -6
  205. package/dist/hooks/useTerminalSize.js.map +2 -2
  206. package/dist/hooks/useUnifiedCompletion.js +69 -0
  207. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  208. package/dist/i18n/index.js +109 -0
  209. package/dist/i18n/index.js.map +7 -0
  210. package/dist/i18n/locales/en.js +347 -0
  211. package/dist/i18n/locales/en.js.map +7 -0
  212. package/dist/i18n/locales/index.js +7 -0
  213. package/dist/i18n/locales/index.js.map +7 -0
  214. package/dist/i18n/locales/zh-CN.js +347 -0
  215. package/dist/i18n/locales/zh-CN.js.map +7 -0
  216. package/dist/i18n/types.js +8 -0
  217. package/dist/i18n/types.js.map +7 -0
  218. package/dist/query.js +175 -17
  219. package/dist/query.js.map +3 -3
  220. package/dist/screens/REPL.js +501 -192
  221. package/dist/screens/REPL.js.map +3 -3
  222. package/dist/services/adapters/chatCompletions.js +3 -1
  223. package/dist/services/adapters/chatCompletions.js.map +2 -2
  224. package/dist/services/adapters/messageNormalizer.js +354 -0
  225. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  226. package/dist/services/adapters/responsesAPI.js +6 -3
  227. package/dist/services/adapters/responsesAPI.js.map +2 -2
  228. package/dist/services/checkpointManager.js +386 -0
  229. package/dist/services/checkpointManager.js.map +7 -0
  230. package/dist/services/claude.js +138 -11
  231. package/dist/services/claude.js.map +3 -3
  232. package/dist/services/compressionService.js +50 -1
  233. package/dist/services/compressionService.js.map +2 -2
  234. package/dist/services/contextMonitor.js +162 -0
  235. package/dist/services/contextMonitor.js.map +7 -0
  236. package/dist/services/customCommands.js +60 -41
  237. package/dist/services/customCommands.js.map +2 -2
  238. package/dist/services/hookExecutor.js +173 -1
  239. package/dist/services/hookExecutor.js.map +2 -2
  240. package/dist/services/intelligentCompactor.js +281 -0
  241. package/dist/services/intelligentCompactor.js.map +7 -0
  242. package/dist/services/lspConfig.js +109 -0
  243. package/dist/services/lspConfig.js.map +7 -0
  244. package/dist/services/mcpClient.js +273 -34
  245. package/dist/services/mcpClient.js.map +2 -2
  246. package/dist/services/modelOrchestrator.js +310 -0
  247. package/dist/services/modelOrchestrator.js.map +7 -0
  248. package/dist/services/openai.js +8 -1
  249. package/dist/services/openai.js.map +2 -2
  250. package/dist/services/outputStyles.js +138 -0
  251. package/dist/services/outputStyles.js.map +7 -0
  252. package/dist/services/plugins/index.js +5 -0
  253. package/dist/services/plugins/index.js.map +7 -0
  254. package/dist/services/plugins/lspServers.js +188 -0
  255. package/dist/services/plugins/lspServers.js.map +7 -0
  256. package/dist/services/plugins/pluginRuntime.js +229 -0
  257. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  258. package/dist/services/plugins/pluginValidation.js +219 -0
  259. package/dist/services/plugins/pluginValidation.js.map +7 -0
  260. package/dist/services/plugins/skillMarketplace.js +556 -0
  261. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  262. package/dist/services/responseStateManager.js +37 -3
  263. package/dist/services/responseStateManager.js.map +2 -2
  264. package/dist/services/sandbox/filesystemBoundary.js +300 -0
  265. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  266. package/dist/services/sandbox/index.js +14 -0
  267. package/dist/services/sandbox/index.js.map +7 -0
  268. package/dist/services/sandbox/networkProxy.js +293 -0
  269. package/dist/services/sandbox/networkProxy.js.map +7 -0
  270. package/dist/services/sandbox/sandboxController.js +574 -0
  271. package/dist/services/sandbox/sandboxController.js.map +7 -0
  272. package/dist/services/sandbox/types.js +50 -0
  273. package/dist/services/sandbox/types.js.map +7 -0
  274. package/dist/services/sessionMemory.js +266 -0
  275. package/dist/services/sessionMemory.js.map +7 -0
  276. package/dist/services/taskRouter.js +324 -0
  277. package/dist/services/taskRouter.js.map +7 -0
  278. package/dist/tools/ArchitectTool/ArchitectTool.js +10 -3
  279. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  280. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
  281. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  282. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
  283. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  284. package/dist/tools/BaseTool.js +72 -0
  285. package/dist/tools/BaseTool.js.map +7 -0
  286. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  287. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  288. package/dist/tools/BashTool/BashTool.js +60 -3
  289. package/dist/tools/BashTool/BashTool.js.map +2 -2
  290. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  291. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  292. package/dist/tools/BashTool/OutputLine.js +54 -0
  293. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  294. package/dist/tools/BashTool/prompt.js +192 -3
  295. package/dist/tools/BashTool/prompt.js.map +2 -2
  296. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  297. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  298. package/dist/tools/FileReadTool/FileReadTool.js +23 -4
  299. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  300. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  301. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  302. package/dist/tools/GlobTool/GlobTool.js +14 -3
  303. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  304. package/dist/tools/GrepTool/GrepTool.js +41 -7
  305. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  306. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  307. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  308. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  309. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  310. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  311. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  312. package/dist/tools/LspTool/LspTool.js +664 -0
  313. package/dist/tools/LspTool/LspTool.js.map +7 -0
  314. package/dist/tools/LspTool/prompt.js +27 -0
  315. package/dist/tools/LspTool/prompt.js.map +7 -0
  316. package/dist/tools/MCPTool/MCPTool.js +11 -4
  317. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  318. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  319. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  320. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  321. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  322. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  323. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  324. package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
  325. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  326. package/dist/tools/NotebookReadTool/NotebookReadTool.js +8 -4
  327. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  328. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
  329. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  330. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
  331. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  332. package/dist/tools/PlanModeTool/prompt.js +94 -0
  333. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  334. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  335. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  336. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  337. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  338. package/dist/tools/SkillTool/SkillTool.js +14 -3
  339. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  340. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  341. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  342. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  343. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  344. package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
  345. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  346. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  347. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  348. package/dist/tools/TaskTool/TaskTool.js +321 -146
  349. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  350. package/dist/tools/TaskTool/prompt.js.map +2 -2
  351. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -73
  352. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  353. package/dist/tools/URLFetcherTool/URLFetcherTool.js +7 -1
  354. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  355. package/dist/tools/URLFetcherTool/cache.js +55 -8
  356. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  357. package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
  358. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  359. package/dist/tools.js +31 -2
  360. package/dist/tools.js.map +2 -2
  361. package/dist/types/hooks.js +4 -0
  362. package/dist/types/hooks.js.map +2 -2
  363. package/dist/types/marketplace.js.map +2 -2
  364. package/dist/types/messageGroup.js +36 -0
  365. package/dist/types/messageGroup.js.map +7 -0
  366. package/dist/types/plugin.js.map +2 -2
  367. package/dist/types/thinking.js +1 -0
  368. package/dist/types/thinking.js.map +7 -0
  369. package/dist/utils/BackgroundShellManager.js +136 -39
  370. package/dist/utils/BackgroundShellManager.js.map +2 -2
  371. package/dist/utils/MessageBatchBuffer.js +102 -0
  372. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  373. package/dist/utils/PersistentShell.js +151 -1
  374. package/dist/utils/PersistentShell.js.map +2 -2
  375. package/dist/utils/agentLoader.js +1 -23
  376. package/dist/utils/agentLoader.js.map +2 -2
  377. package/dist/utils/agentTranscripts.js +641 -0
  378. package/dist/utils/agentTranscripts.js.map +7 -0
  379. package/dist/utils/animationManager.js +213 -0
  380. package/dist/utils/animationManager.js.map +7 -0
  381. package/dist/utils/animationSync.js +110 -0
  382. package/dist/utils/animationSync.js.map +7 -0
  383. package/dist/utils/asyncFile.js +215 -0
  384. package/dist/utils/asyncFile.js.map +7 -0
  385. package/dist/utils/backgroundAgentManager.js +231 -0
  386. package/dist/utils/backgroundAgentManager.js.map +7 -0
  387. package/dist/utils/config.js +63 -7
  388. package/dist/utils/config.js.map +2 -2
  389. package/dist/utils/conversationRecovery.js +19 -0
  390. package/dist/utils/conversationRecovery.js.map +2 -2
  391. package/dist/utils/exit.js +73 -0
  392. package/dist/utils/exit.js.map +7 -0
  393. package/dist/utils/format.js +73 -5
  394. package/dist/utils/format.js.map +2 -2
  395. package/dist/utils/generators.js +76 -6
  396. package/dist/utils/generators.js.map +2 -2
  397. package/dist/utils/globalErrorHandler.js +149 -0
  398. package/dist/utils/globalErrorHandler.js.map +7 -0
  399. package/dist/utils/groupHandlers/index.js +8 -0
  400. package/dist/utils/groupHandlers/index.js.map +7 -0
  401. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  402. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  403. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  404. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  405. package/dist/utils/groupHandlers/types.js +1 -0
  406. package/dist/utils/groupHandlers/types.js.map +7 -0
  407. package/dist/utils/logRotation.js +224 -0
  408. package/dist/utils/logRotation.js.map +7 -0
  409. package/dist/utils/marketplaceManager.js +3 -5
  410. package/dist/utils/marketplaceManager.js.map +2 -2
  411. package/dist/utils/memSafety.js +264 -0
  412. package/dist/utils/memSafety.js.map +7 -0
  413. package/dist/utils/messageGroupManager.js +274 -0
  414. package/dist/utils/messageGroupManager.js.map +7 -0
  415. package/dist/utils/messages.js +13 -4
  416. package/dist/utils/messages.js.map +2 -2
  417. package/dist/utils/model.js +119 -15
  418. package/dist/utils/model.js.map +3 -3
  419. package/dist/utils/permissions/filesystem.js +157 -5
  420. package/dist/utils/permissions/filesystem.js.map +2 -2
  421. package/dist/utils/plan/planMode.js +143 -0
  422. package/dist/utils/plan/planMode.js.map +7 -0
  423. package/dist/utils/pluginLoader.js +17 -21
  424. package/dist/utils/pluginLoader.js.map +2 -2
  425. package/dist/utils/ripgrep.js +55 -2
  426. package/dist/utils/ripgrep.js.map +2 -2
  427. package/dist/utils/sanitizeInput.js +32 -0
  428. package/dist/utils/sanitizeInput.js.map +7 -0
  429. package/dist/utils/secureKeyStorage.js +312 -0
  430. package/dist/utils/secureKeyStorage.js.map +7 -0
  431. package/dist/utils/session/sessionPlugins.js +67 -0
  432. package/dist/utils/session/sessionPlugins.js.map +7 -0
  433. package/dist/utils/taskDisplayUtils.js +257 -0
  434. package/dist/utils/taskDisplayUtils.js.map +7 -0
  435. package/dist/utils/teamConfig.js +2 -1
  436. package/dist/utils/teamConfig.js.map +2 -2
  437. package/dist/utils/todoStorage.js +92 -2
  438. package/dist/utils/todoStorage.js.map +2 -2
  439. package/dist/utils/toolTimeout.js +136 -0
  440. package/dist/utils/toolTimeout.js.map +7 -0
  441. package/dist/utils/tooling/safeRender.js +115 -0
  442. package/dist/utils/tooling/safeRender.js.map +7 -0
  443. package/dist/utils/userFriendlyError.js +346 -0
  444. package/dist/utils/userFriendlyError.js.map +7 -0
  445. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  446. package/dist/version.js +2 -2
  447. package/dist/version.js.map +1 -1
  448. package/package.json +14 -4
  449. package/scripts/postinstall.js +128 -38
  450. package/dist/commands/agents.js +0 -2086
  451. package/dist/commands/agents.js.map +0 -7
  452. package/dist/commands/build.js +0 -74
  453. package/dist/commands/build.js.map +0 -7
  454. package/dist/commands/compression.js +0 -57
  455. package/dist/commands/compression.js.map +0 -7
  456. package/dist/commands/listen.js +0 -37
  457. package/dist/commands/listen.js.map +0 -7
  458. package/dist/commands/login.js +0 -37
  459. package/dist/commands/login.js.map +0 -7
  460. package/dist/commands/logout.js +0 -33
  461. package/dist/commands/logout.js.map +0 -7
  462. package/dist/commands/mcp.js +0 -40
  463. package/dist/commands/mcp.js.map +0 -7
  464. package/dist/commands/mcp_refresh.js +0 -40
  465. package/dist/commands/mcp_refresh.js.map +0 -7
  466. package/dist/commands/modelstatus.js +0 -21
  467. package/dist/commands/modelstatus.js.map +0 -7
  468. package/dist/commands/onboarding.js +0 -36
  469. package/dist/commands/onboarding.js.map +0 -7
  470. package/dist/commands/plugin-interactive.js +0 -446
  471. package/dist/commands/plugin-interactive.js.map +0 -7
  472. package/dist/commands/pr_comments.js +0 -61
  473. package/dist/commands/pr_comments.js.map +0 -7
  474. package/dist/commands/release-notes.js +0 -30
  475. package/dist/commands/release-notes.js.map +0 -7
  476. package/dist/commands/review.js +0 -51
  477. package/dist/commands/review.js.map +0 -7
  478. package/dist/components/Bug.js +0 -147
  479. package/dist/components/Bug.js.map +0 -7
  480. package/dist/components/ModelSelector.js +0 -2062
  481. package/dist/components/ModelSelector.js.map +0 -7
  482. package/dist/components/ModelStatusDisplay.js +0 -87
  483. package/dist/components/ModelStatusDisplay.js.map +0 -7
  484. package/dist/entrypoints/cli-wrapper.js +0 -61
  485. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  486. package/dist/screens/Doctor.js +0 -22
  487. package/dist/screens/Doctor.js.map +0 -7
@@ -8,7 +8,7 @@ const UI_ICONS = {
8
8
  loading: "\u25D0\u25D1\u25D2\u25D3"
9
9
  };
10
10
  const FOLDER_CONFIG = {
11
- FOLDER_NAME: ".claude",
11
+ FOLDER_NAME: ".minto",
12
12
  AGENTS_DIR: "agents"
13
13
  };
14
14
  const TOOL_CATEGORIES = {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/agents/constants.ts"],
4
- "sourcesContent": ["/**\n * Constants for the agents command\n */\nimport { AGENT_LOCATIONS } from './types'\n\n// Re-export for convenience\nexport { AGENT_LOCATIONS }\n\nexport const UI_ICONS = {\n pointer: '\u276F',\n checkboxOn: '\u2611',\n checkboxOff: '\u2610',\n warning: '\u26A0',\n separator: '\u2500',\n loading: '\u25D0\u25D1\u25D2\u25D3',\n} as const\n\nexport const FOLDER_CONFIG = {\n FOLDER_NAME: '.claude',\n AGENTS_DIR: 'agents',\n} as const\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'Glob', 'Grep', 'LS'],\n edit: ['Edit', 'MultiEdit', 'Write', 'NotebookEdit'],\n execution: ['Bash', 'BashOutput', 'KillBash'],\n web: ['WebFetch', 'WebSearch'],\n other: ['TodoWrite', 'ExitPlanMode', 'Task'],\n} as const\n\n// Agent color options\nexport const AGENT_COLORS = [\n { name: 'Default', value: null, color: undefined },\n { name: 'Blue', value: 'blue', color: 'blue' },\n { name: 'Green', value: 'green', color: 'green' },\n { name: 'Yellow', value: 'yellow', color: 'yellow' },\n { name: 'Red', value: 'red', color: 'red' },\n { name: 'Magenta', value: 'magenta', color: 'magenta' },\n { name: 'Cyan', value: 'cyan', color: 'cyan' },\n] as const\n\nexport const INITIAL_CREATE_STATE = {\n location: null,\n agentType: '',\n method: null,\n generationPrompt: '',\n whenToUse: '',\n selectedTools: [],\n selectedModel: null,\n selectedColor: null,\n systemPrompt: '',\n isGenerating: false,\n wasGenerated: false,\n isAIGenerated: false,\n error: null,\n warnings: [],\n agentTypeCursor: 0,\n whenToUseCursor: 0,\n promptCursor: 0,\n generationPromptCursor: 0,\n} as const\n"],
4
+ "sourcesContent": ["/**\n * Constants for the agents command\n */\nimport { AGENT_LOCATIONS } from './types'\n\n// Re-export for convenience\nexport { AGENT_LOCATIONS }\n\nexport const UI_ICONS = {\n pointer: '\u276F',\n checkboxOn: '\u2611',\n checkboxOff: '\u2610',\n warning: '\u26A0',\n separator: '\u2500',\n loading: '\u25D0\u25D1\u25D2\u25D3',\n} as const\n\nexport const FOLDER_CONFIG = {\n FOLDER_NAME: '.minto',\n AGENTS_DIR: 'agents',\n} as const\n\n// Tool categories for sophisticated selection\nexport const TOOL_CATEGORIES = {\n read: ['Read', 'Glob', 'Grep', 'LS'],\n edit: ['Edit', 'MultiEdit', 'Write', 'NotebookEdit'],\n execution: ['Bash', 'BashOutput', 'KillBash'],\n web: ['WebFetch', 'WebSearch'],\n other: ['TodoWrite', 'ExitPlanMode', 'Task'],\n} as const\n\n// Agent color options\nexport const AGENT_COLORS = [\n { name: 'Default', value: null, color: undefined },\n { name: 'Blue', value: 'blue', color: 'blue' },\n { name: 'Green', value: 'green', color: 'green' },\n { name: 'Yellow', value: 'yellow', color: 'yellow' },\n { name: 'Red', value: 'red', color: 'red' },\n { name: 'Magenta', value: 'magenta', color: 'magenta' },\n { name: 'Cyan', value: 'cyan', color: 'cyan' },\n] as const\n\nexport const INITIAL_CREATE_STATE = {\n location: null,\n agentType: '',\n method: null,\n generationPrompt: '',\n whenToUse: '',\n selectedTools: [],\n selectedModel: null,\n selectedColor: null,\n systemPrompt: '',\n isGenerating: false,\n wasGenerated: false,\n isAIGenerated: false,\n error: null,\n warnings: [],\n agentTypeCursor: 0,\n whenToUseCursor: 0,\n promptCursor: 0,\n generationPromptCursor: 0,\n} as const\n"],
5
5
  "mappings": "AAGA,SAAS,uBAAuB;AAKzB,MAAM,WAAW;AAAA,EACtB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEO,MAAM,gBAAgB;AAAA,EAC3B,aAAa;AAAA,EACb,YAAY;AACd;AAGO,MAAM,kBAAkB;AAAA,EAC7B,MAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EACnC,MAAM,CAAC,QAAQ,aAAa,SAAS,cAAc;AAAA,EACnD,WAAW,CAAC,QAAQ,cAAc,UAAU;AAAA,EAC5C,KAAK,CAAC,YAAY,WAAW;AAAA,EAC7B,OAAO,CAAC,aAAa,gBAAgB,MAAM;AAC7C;AAGO,MAAM,eAAe;AAAA,EAC1B,EAAE,MAAM,WAAW,OAAO,MAAM,OAAO,OAAU;AAAA,EACjD,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC7C,EAAE,MAAM,SAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,EAChD,EAAE,MAAM,UAAU,OAAO,UAAU,OAAO,SAAS;AAAA,EACnD,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM;AAAA,EAC1C,EAAE,MAAM,WAAW,OAAO,WAAW,OAAO,UAAU;AAAA,EACtD,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO;AAC/C;AAEO,MAAM,uBAAuB;AAAA,EAClC,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,OAAO;AAAA,EACP,UAAU,CAAC;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,wBAAwB;AAC1B;",
6
6
  "names": []
7
7
  }
@@ -16,7 +16,7 @@ import {
16
16
  deleteAgent,
17
17
  openInEditor,
18
18
  updateAgent
19
- } from "./utils.js";
19
+ } from "./utils/index.js";
20
20
  export {
21
21
  AGENT_COLORS,
22
22
  AGENT_LOCATIONS,
@@ -1,14 +1,81 @@
1
- import { Bug } from "../components/Bug.js";
2
- import * as React from "react";
1
+ import { getGlobalConfig, getCurrentProjectConfig } from "../utils/config.js";
2
+ import { getModelManager } from "../utils/model.js";
3
+ import { listMCPServers } from "../services/mcpClient.js";
4
+ import { MACRO } from "../constants/macros.js";
5
+ function collectSystemInfo() {
6
+ return {
7
+ "Minto Version": MACRO.VERSION,
8
+ "Node.js Version": process.version,
9
+ Platform: `${process.platform} ${process.arch}`,
10
+ "Working Directory": process.cwd(),
11
+ Shell: process.env.SHELL || "unknown",
12
+ Terminal: process.env.TERM || "unknown"
13
+ };
14
+ }
15
+ function collectConfigInfo() {
16
+ const globalConfig = getGlobalConfig();
17
+ const projectConfig = getCurrentProjectConfig();
18
+ const modelManager = getModelManager();
19
+ const mcpServers = listMCPServers();
20
+ return {
21
+ "Model Profiles": String(modelManager.getAllConfiguredModels().length),
22
+ "Active Models": String(modelManager.getAvailableModels().length),
23
+ "Current Model": modelManager.getCurrentModel() || "none",
24
+ "MCP Servers": String(Object.keys(mcpServers).length),
25
+ "Has Project Config": String(Object.keys(projectConfig).length > 1),
26
+ Theme: globalConfig.theme || "default",
27
+ "Verbose Mode": String(globalConfig.verbose || false)
28
+ };
29
+ }
30
+ function generateBugReport() {
31
+ const systemInfo = collectSystemInfo();
32
+ const configInfo = collectConfigInfo();
33
+ const lines = [];
34
+ lines.push("# Bug Report for Minto\n");
35
+ lines.push("## Description");
36
+ lines.push("<!-- Please describe the bug you encountered -->");
37
+ lines.push("\n");
38
+ lines.push("## Steps to Reproduce");
39
+ lines.push("1. <!-- Step 1 -->");
40
+ lines.push("2. <!-- Step 2 -->");
41
+ lines.push("3. <!-- Step 3 -->");
42
+ lines.push("\n");
43
+ lines.push("## Expected Behavior");
44
+ lines.push("<!-- What did you expect to happen? -->");
45
+ lines.push("\n");
46
+ lines.push("## Actual Behavior");
47
+ lines.push("<!-- What actually happened? -->");
48
+ lines.push("\n");
49
+ lines.push("## System Information");
50
+ lines.push("```");
51
+ for (const [key, value] of Object.entries(systemInfo)) {
52
+ lines.push(`${key}: ${value}`);
53
+ }
54
+ lines.push("```");
55
+ lines.push("\n");
56
+ lines.push("## Configuration");
57
+ lines.push("```");
58
+ for (const [key, value] of Object.entries(configInfo)) {
59
+ lines.push(`${key}: ${value}`);
60
+ }
61
+ lines.push("```");
62
+ lines.push("\n");
63
+ lines.push("## Additional Context");
64
+ lines.push("<!-- Add any other context about the problem here -->");
65
+ lines.push("\n");
66
+ lines.push("---");
67
+ lines.push("Report issues at: https://github.com/anthropics/minto/issues/new");
68
+ lines.push("\nCopy this template and fill in the details above.");
69
+ return lines.join("\n");
70
+ }
3
71
  const bug = {
4
- type: "local-jsx",
72
+ type: "local",
5
73
  name: "bug",
6
- description: `Report bugs or submit feedback via GitHub Issues`,
74
+ description: "Generate a bug report template with system information",
7
75
  isEnabled: true,
8
76
  isHidden: false,
9
- aliases: ["feedback", "report"],
10
- async call(onDone) {
11
- return /* @__PURE__ */ React.createElement(Bug, { onDone });
77
+ async call() {
78
+ return generateBugReport();
12
79
  },
13
80
  userFacingName() {
14
81
  return "bug";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/commands/bug.tsx"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { Bug } from '@components/Bug'\nimport * as React from 'react'\nimport { PRODUCT_NAME } from '@constants/product'\n\nconst bug = {\n type: 'local-jsx',\n name: 'bug',\n description: `Report bugs or submit feedback via GitHub Issues`,\n isEnabled: true,\n isHidden: false,\n aliases: ['feedback', 'report'],\n async call(onDone) {\n return <Bug onDone={onDone} />\n },\n userFacingName() {\n return 'bug'\n },\n} satisfies Command\n\nexport default bug\n"],
5
- "mappings": "AACA,SAAS,WAAW;AACpB,YAAY,WAAW;AAGvB,MAAM,MAAM;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS,CAAC,YAAY,QAAQ;AAAA,EAC9B,MAAM,KAAK,QAAQ;AACjB,WAAO,oCAAC,OAAI,QAAgB;AAAA,EAC9B;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,cAAQ;",
3
+ "sources": ["../../src/commands/bug.ts"],
4
+ "sourcesContent": ["import type { Command } from '@commands'\nimport { getGlobalConfig, getCurrentProjectConfig } from '@utils/config'\nimport { getModelManager } from '@utils/model'\nimport { listMCPServers } from '@services/mcpClient'\nimport { MACRO } from '@constants/macros'\n\n/**\n * Bug report command\n * Collects system information and generates a bug report template\n */\n\nfunction collectSystemInfo(): Record<string, string> {\n return {\n 'Minto Version': MACRO.VERSION,\n 'Node.js Version': process.version,\n Platform: `${process.platform} ${process.arch}`,\n 'Working Directory': process.cwd(),\n Shell: process.env.SHELL || 'unknown',\n Terminal: process.env.TERM || 'unknown',\n }\n}\n\nfunction collectConfigInfo(): Record<string, string> {\n const globalConfig = getGlobalConfig()\n const projectConfig = getCurrentProjectConfig()\n const modelManager = getModelManager()\n const mcpServers = listMCPServers()\n\n return {\n 'Model Profiles': String(modelManager.getAllConfiguredModels().length),\n 'Active Models': String(modelManager.getAvailableModels().length),\n 'Current Model': modelManager.getCurrentModel() || 'none',\n 'MCP Servers': String(Object.keys(mcpServers).length),\n 'Has Project Config': String(Object.keys(projectConfig).length > 1),\n Theme: globalConfig.theme || 'default',\n 'Verbose Mode': String(globalConfig.verbose || false),\n }\n}\n\nfunction generateBugReport(): string {\n const systemInfo = collectSystemInfo()\n const configInfo = collectConfigInfo()\n\n const lines: string[] = []\n\n lines.push('# Bug Report for Minto\\n')\n\n lines.push('## Description')\n lines.push('<!-- Please describe the bug you encountered -->')\n lines.push('\\n')\n\n lines.push('## Steps to Reproduce')\n lines.push('1. <!-- Step 1 -->')\n lines.push('2. <!-- Step 2 -->')\n lines.push('3. <!-- Step 3 -->')\n lines.push('\\n')\n\n lines.push('## Expected Behavior')\n lines.push('<!-- What did you expect to happen? -->')\n lines.push('\\n')\n\n lines.push('## Actual Behavior')\n lines.push('<!-- What actually happened? -->')\n lines.push('\\n')\n\n lines.push('## System Information')\n lines.push('```')\n for (const [key, value] of Object.entries(systemInfo)) {\n lines.push(`${key}: ${value}`)\n }\n lines.push('```')\n lines.push('\\n')\n\n lines.push('## Configuration')\n lines.push('```')\n for (const [key, value] of Object.entries(configInfo)) {\n lines.push(`${key}: ${value}`)\n }\n lines.push('```')\n lines.push('\\n')\n\n lines.push('## Additional Context')\n lines.push('<!-- Add any other context about the problem here -->')\n lines.push('\\n')\n\n lines.push('---')\n lines.push('Report issues at: https://github.com/anthropics/minto/issues/new')\n lines.push('\\nCopy this template and fill in the details above.')\n\n return lines.join('\\n')\n}\n\nconst bug = {\n type: 'local',\n name: 'bug',\n description: 'Generate a bug report template with system information',\n isEnabled: true,\n isHidden: false,\n async call() {\n return generateBugReport()\n },\n userFacingName() {\n return 'bug'\n },\n} satisfies Command\n\nexport default bug\n"],
5
+ "mappings": "AACA,SAAS,iBAAiB,+BAA+B;AACzD,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,aAAa;AAOtB,SAAS,oBAA4C;AACnD,SAAO;AAAA,IACL,iBAAiB,MAAM;AAAA,IACvB,mBAAmB,QAAQ;AAAA,IAC3B,UAAU,GAAG,QAAQ,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC7C,qBAAqB,QAAQ,IAAI;AAAA,IACjC,OAAO,QAAQ,IAAI,SAAS;AAAA,IAC5B,UAAU,QAAQ,IAAI,QAAQ;AAAA,EAChC;AACF;AAEA,SAAS,oBAA4C;AACnD,QAAM,eAAe,gBAAgB;AACrC,QAAM,gBAAgB,wBAAwB;AAC9C,QAAM,eAAe,gBAAgB;AACrC,QAAM,aAAa,eAAe;AAElC,SAAO;AAAA,IACL,kBAAkB,OAAO,aAAa,uBAAuB,EAAE,MAAM;AAAA,IACrE,iBAAiB,OAAO,aAAa,mBAAmB,EAAE,MAAM;AAAA,IAChE,iBAAiB,aAAa,gBAAgB,KAAK;AAAA,IACnD,eAAe,OAAO,OAAO,KAAK,UAAU,EAAE,MAAM;AAAA,IACpD,sBAAsB,OAAO,OAAO,KAAK,aAAa,EAAE,SAAS,CAAC;AAAA,IAClE,OAAO,aAAa,SAAS;AAAA,IAC7B,gBAAgB,OAAO,aAAa,WAAW,KAAK;AAAA,EACtD;AACF;AAEA,SAAS,oBAA4B;AACnC,QAAM,aAAa,kBAAkB;AACrC,QAAM,aAAa,kBAAkB;AAErC,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,0BAA0B;AAErC,QAAM,KAAK,gBAAgB;AAC3B,QAAM,KAAK,kDAAkD;AAC7D,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,yCAAyC;AACpD,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,KAAK;AAChB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,UAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,EAC/B;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,kBAAkB;AAC7B,QAAM,KAAK,KAAK;AAChB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,UAAM,KAAK,GAAG,GAAG,KAAK,KAAK,EAAE;AAAA,EAC/B;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,uBAAuB;AAClC,QAAM,KAAK,uDAAuD;AAClE,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,kEAAkE;AAC7E,QAAM,KAAK,qDAAqD;AAEhE,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,MAAM,MAAM;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,OAAO;AACX,WAAO,kBAAkB;AAAA,EAC3B;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,cAAQ;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,7 @@ import { clearTerminal } from "../utils/terminal.js";
5
5
  import { getOriginalCwd, setCwd } from "../utils/state.js";
6
6
  import { resetReminderSession } from "../services/systemReminder.js";
7
7
  import { resetFileFreshnessSession } from "../services/fileFreshness.js";
8
+ import { clearTodos, deleteSessionTodos } from "../utils/todoStorage.js";
8
9
  async function clearConversation(context) {
9
10
  await clearTerminal();
10
11
  getMessagesSetter()([]);
@@ -14,6 +15,8 @@ async function clearConversation(context) {
14
15
  await setCwd(getOriginalCwd());
15
16
  resetReminderSession();
16
17
  resetFileFreshnessSession();
18
+ clearTodos();
19
+ deleteSessionTodos();
17
20
  }
18
21
  const clear = {
19
22
  type: "local",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/clear.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { getMessagesSetter } from '@messages'\nimport { getContext } from '@context'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { getOriginalCwd, setCwd } from '@utils/state'\nimport { Message } from '@query'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\n\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n}) {\n await clearTerminal()\n getMessagesSetter()([])\n context.setForkConvoWithMessagesOnTheNextRender([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n await setCwd(getOriginalCwd())\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n resetFileFreshnessSession()\n}\n\nconst clear = {\n type: 'local',\n name: 'clear',\n description: 'Clear conversation history and free up context',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n clearConversation(context)\n return ''\n },\n userFacingName() {\n return 'clear'\n },\n} satisfies Command\n\nexport default clear\n"],
5
- "mappings": "AACA,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB,cAAc;AAEvC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAE1C,eAAsB,kBAAkB,SAIrC;AACD,QAAM,cAAc;AACpB,oBAAkB,EAAE,CAAC,CAAC;AACtB,UAAQ,wCAAwC,CAAC,CAAC;AAClD,aAAW,MAAM,QAAQ;AACzB,eAAa,MAAM,QAAQ;AAC3B,QAAM,OAAO,eAAe,CAAC;AAG7B,uBAAqB;AACrB,4BAA0B;AAC5B;AAEA,MAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,sBAAkB,OAAO;AACzB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport { getMessagesSetter } from '@messages'\nimport { getContext } from '@context'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { getOriginalCwd, setCwd } from '@utils/state'\nimport { Message } from '@query'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { clearTodos, deleteSessionTodos } from '@utils/todoStorage'\n\nexport async function clearConversation(context: {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n}) {\n await clearTerminal()\n getMessagesSetter()([])\n context.setForkConvoWithMessagesOnTheNextRender([])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n await setCwd(getOriginalCwd())\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n resetFileFreshnessSession()\n\n // Clear todos when clearing conversation - user is abandoning the current task\n clearTodos()\n deleteSessionTodos()\n}\n\nconst clear = {\n type: 'local',\n name: 'clear',\n description: 'Clear conversation history and free up context',\n isEnabled: true,\n isHidden: false,\n async call(_, context) {\n clearConversation(context)\n return ''\n },\n userFacingName() {\n return 'clear'\n },\n} satisfies Command\n\nexport default clear\n"],
5
+ "mappings": "AACA,SAAS,yBAAyB;AAClC,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB,cAAc;AAEvC,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,YAAY,0BAA0B;AAE/C,eAAsB,kBAAkB,SAIrC;AACD,QAAM,cAAc;AACpB,oBAAkB,EAAE,CAAC,CAAC;AACtB,UAAQ,wCAAwC,CAAC,CAAC;AAClD,aAAW,MAAM,QAAQ;AACzB,eAAa,MAAM,QAAQ;AAC3B,QAAM,OAAO,eAAe,CAAC;AAG7B,uBAAqB;AACrB,4BAA0B;AAG1B,aAAW;AACX,qBAAmB;AACrB;AAEA,MAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KAAK,GAAG,SAAS;AACrB,sBAAkB,OAAO;AACzB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,gBAAQ;",
6
6
  "names": []
7
7
  }
@@ -11,6 +11,9 @@ import {
11
11
  getCompressionMode,
12
12
  getCompressionModeDescription
13
13
  } from "../utils/compressionMode.js";
14
+ import { getIntelligentCompactor } from "../services/intelligentCompactor.js";
15
+ import { createSessionMemory } from "../services/sessionMemory.js";
16
+ import { getContextMonitor } from "../services/contextMonitor.js";
14
17
  const compact = {
15
18
  type: "local",
16
19
  name: "compact",
@@ -26,6 +29,12 @@ const compact = {
26
29
  const compressionMode = getCompressionMode();
27
30
  const compressionPrompt = getCompressionPrompt(compressionMode);
28
31
  const modeDescription = getCompressionModeDescription(compressionMode);
32
+ const compactor = getIntelligentCompactor();
33
+ const compactResult = await compactor.compact(messages, {
34
+ preserveDecisions: true,
35
+ preserveCodeChanges: true,
36
+ summarizeTools: true
37
+ });
29
38
  const summaryRequest = createUserMessage(compressionPrompt);
30
39
  const summaryResponse = await queryLLM(
31
40
  normalizeMessagesForAPI([...messages, summaryRequest]),
@@ -57,6 +66,33 @@ const compact = {
57
66
  cache_creation_input_tokens: 0,
58
67
  cache_read_input_tokens: 0
59
68
  };
69
+ try {
70
+ const cwd = process.cwd();
71
+ const sessionMemory = createSessionMemory(cwd);
72
+ sessionMemory.saveMemory(
73
+ {
74
+ summary,
75
+ decisions: compactResult.decisions,
76
+ codeChanges: compactResult.codeChanges,
77
+ toolUsageSummary: compactResult.toolSummaries.reduce(
78
+ (acc, t) => ({ ...acc, [t.toolName]: t.invocationCount }),
79
+ {}
80
+ ),
81
+ focusAreas: compactResult.focusSummary ? [compactResult.focusSummary] : [],
82
+ preservedContext: []
83
+ },
84
+ {
85
+ projectPath: cwd,
86
+ messageCount: messages.length,
87
+ compressedAt: Date.now(),
88
+ compressionRatio: compactResult.compressionRatio
89
+ }
90
+ );
91
+ sessionMemory.saveConversation(messages);
92
+ sessionMemory.cleanupOldSessions(5);
93
+ } catch (e) {
94
+ console.error("Failed to save session memory:", e);
95
+ }
60
96
  await clearTerminal();
61
97
  getMessagesSetter()([]);
62
98
  setForkConvoWithMessagesOnTheNextRender([
@@ -69,6 +105,7 @@ const compact = {
69
105
  getCodeStyle.cache.clear?.();
70
106
  resetFileFreshnessSession();
71
107
  resetReminderSession();
108
+ getContextMonitor().resetCooldown();
72
109
  return "";
73
110
  },
74
111
  userFacingName() {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/compact.ts"],
4
- "sourcesContent": ["import { Command } from '@commands'\nimport { getContext } from '@context'\nimport { getMessagesGetter, getMessagesSetter } from '@messages'\nimport { API_ERROR_MESSAGE_PREFIX, queryLLM } from '@services/claude'\nimport { createUserMessage, normalizeMessagesForAPI } from '@utils/messages'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { getCompressionPrompt } from '@constants/compressionPrompts'\nimport {\n getCompressionMode,\n getCompressionModeDescription,\n} from '@utils/compressionMode'\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n // Get the compression prompt based on current mode (business or code)\n const compressionMode = getCompressionMode()\n const compressionPrompt = getCompressionPrompt(compressionMode)\n const modeDescription = getCompressionModeDescription(compressionMode)\n\n const summaryRequest = createUserMessage(compressionPrompt)\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: 'main', // \u4F7F\u7528\u6A21\u578B\u6307\u9488\uFF0C\u8BA9queryLLM\u7EDF\u4E00\u89E3\u6790\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,\n )\n } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n throw new Error(summary)\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n await clearTerminal()\n getMessagesSetter()([])\n setForkConvoWithMessagesOnTheNextRender([\n createUserMessage(\n `Context has been compressed using ${compressionMode === 'business' ? '9-section Business Consulting' : '8-section Code Development'} algorithm. Mode: ${modeDescription}. All essential information has been preserved for seamless continuation.`,\n ),\n summaryResponse,\n ])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n\n return '' // not used, just for typesafety. TODO: avoid this hack\n },\n userFacingName() {\n return 'compact'\n },\n} satisfies Command\n\nexport default compact\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB,yBAAyB;AACrD,SAAS,0BAA0B,gBAAgB;AACnD,SAAS,mBAAmB,+BAA+B;AAC3D,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AACrC,SAAS,iCAAiC;AAC1C,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,MAAM,UAAU;AAAA,EACd,MAAM;AAAA,EACN,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,MAAM,KACJ,GACA;AAAA,IACE,SAAS,EAAE,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,EACF,GACA;AACA,UAAM,WAAW,kBAAkB,EAAE;AAGrC,UAAM,kBAAkB,mBAAmB;AAC3C,UAAM,oBAAoB,qBAAqB,eAAe;AAC9D,UAAM,kBAAkB,8BAA8B,eAAe;AAErE,UAAM,iBAAiB,kBAAkB,iBAAiB;AAE1D,UAAM,kBAAkB,MAAM;AAAA,MAC5B,wBAAwB,CAAC,GAAG,UAAU,cAAc,CAAC;AAAA,MACrD;AAAA,QACE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,QACE,UAAU;AAAA,QACV,OAAO;AAAA;AAAA,QACP,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB,QAAQ;AACxC,UAAM,UACJ,OAAO,YAAY,WACf,UACA,QAAQ,SAAS,KAAK,QAAQ,CAAC,GAAG,SAAS,SACzC,QAAQ,CAAC,EAAE,OACX;AAER,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,2FAA2F,eAAe;AAAA,MAC5G;AAAA,IACF,WAAW,QAAQ,WAAW,wBAAwB,GAAG;AACvD,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,oBAAgB,QAAQ,QAAQ;AAAA,MAC9B,cAAc;AAAA,MACd,eAAe,gBAAgB,QAAQ,MAAM;AAAA,MAC7C,6BAA6B;AAAA,MAC7B,yBAAyB;AAAA,IAC3B;AAEA,UAAM,cAAc;AACpB,sBAAkB,EAAE,CAAC,CAAC;AACtB,4CAAwC;AAAA,MACtC;AAAA,QACE,qCAAqC,oBAAoB,aAAa,kCAAkC,4BAA4B,qBAAqB,eAAe;AAAA,MAC1K;AAAA,MACA;AAAA,IACF,CAAC;AACD,eAAW,MAAM,QAAQ;AACzB,iBAAa,MAAM,QAAQ;AAC3B,8BAA0B;AAG1B,yBAAqB;AAErB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAEA,IAAO,kBAAQ;",
4
+ "sourcesContent": ["import { Command } from '@commands'\nimport { getContext } from '@context'\nimport { getMessagesGetter, getMessagesSetter } from '@messages'\nimport { API_ERROR_MESSAGE_PREFIX, queryLLM } from '@services/claude'\nimport { createUserMessage, normalizeMessagesForAPI } from '@utils/messages'\nimport { getCodeStyle } from '@utils/style'\nimport { clearTerminal } from '@utils/terminal'\nimport { resetReminderSession } from '@services/systemReminder'\nimport { resetFileFreshnessSession } from '@services/fileFreshness'\nimport { getCompressionPrompt } from '@constants/compressionPrompts'\nimport {\n getCompressionMode,\n getCompressionModeDescription,\n} from '@utils/compressionMode'\nimport { getIntelligentCompactor } from '@services/intelligentCompactor'\nimport { createSessionMemory } from '@services/sessionMemory'\nimport { getContextMonitor } from '@services/contextMonitor'\n\nconst compact = {\n type: 'local',\n name: 'compact',\n description: 'Clear conversation history but keep a summary in context',\n isEnabled: true,\n isHidden: false,\n async call(\n _,\n {\n options: { tools },\n abortController,\n setForkConvoWithMessagesOnTheNextRender,\n },\n ) {\n const messages = getMessagesGetter()()\n\n // Get the compression prompt based on current mode (business or code)\n const compressionMode = getCompressionMode()\n const compressionPrompt = getCompressionPrompt(compressionMode)\n const modeDescription = getCompressionModeDescription(compressionMode)\n\n // Use intelligent compactor to extract decisions and code changes\n const compactor = getIntelligentCompactor()\n const compactResult = await compactor.compact(messages, {\n preserveDecisions: true,\n preserveCodeChanges: true,\n summarizeTools: true,\n })\n\n const summaryRequest = createUserMessage(compressionPrompt)\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n tools,\n abortController.signal,\n {\n safeMode: false,\n model: 'main', // \u4F7F\u7528\u6A21\u578B\u6307\u9488\uFF0C\u8BA9queryLLM\u7EDF\u4E00\u89E3\u6790\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n `Failed to generate conversation summary - response did not contain valid text content - ${summaryResponse}`,\n )\n } else if (summary.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n throw new Error(summary)\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n // Save session memory for persistence\n try {\n const cwd = process.cwd()\n const sessionMemory = createSessionMemory(cwd)\n sessionMemory.saveMemory(\n {\n summary,\n decisions: compactResult.decisions,\n codeChanges: compactResult.codeChanges,\n toolUsageSummary: compactResult.toolSummaries.reduce(\n (acc, t) => ({ ...acc, [t.toolName]: t.invocationCount }),\n {} as Record<string, number>,\n ),\n focusAreas: compactResult.focusSummary\n ? [compactResult.focusSummary]\n : [],\n preservedContext: [],\n },\n {\n projectPath: cwd,\n messageCount: messages.length,\n compressedAt: Date.now(),\n compressionRatio: compactResult.compressionRatio,\n },\n )\n // Optionally save full conversation for debugging/recovery\n sessionMemory.saveConversation(messages)\n // Cleanup old sessions (keep last 5)\n sessionMemory.cleanupOldSessions(5)\n } catch (e) {\n // Non-critical: session memory save failure should not block compression\n console.error('Failed to save session memory:', e)\n }\n\n await clearTerminal()\n getMessagesSetter()([])\n setForkConvoWithMessagesOnTheNextRender([\n createUserMessage(\n `Context has been compressed using ${compressionMode === 'business' ? '9-section Business Consulting' : '8-section Code Development'} algorithm. Mode: ${modeDescription}. All essential information has been preserved for seamless continuation.`,\n ),\n summaryResponse,\n ])\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n // Reset reminder and file freshness sessions to clean up state\n resetReminderSession()\n\n // Reset context monitor cooldown after manual compact\n getContextMonitor().resetCooldown()\n\n return '' // not used, just for typesafety. TODO: avoid this hack\n },\n userFacingName() {\n return 'compact'\n },\n} satisfies Command\n\nexport default compact\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,84 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { getMessagesGetter } from "../messages.js";
4
+ import { countTokens } from "../utils/tokens.js";
5
+ import { getModelManager } from "../utils/model.js";
6
+ function createProgressBar(percent, width = 30) {
7
+ const filled = Math.round(percent / 100 * width);
8
+ const empty = width - filled;
9
+ const filledChar = "\u2588";
10
+ const emptyChar = "\u2591";
11
+ return filledChar.repeat(filled) + emptyChar.repeat(empty);
12
+ }
13
+ function getUsageColor(percent) {
14
+ if (percent < 50) return "green";
15
+ if (percent < 80) return "yellow";
16
+ return "red";
17
+ }
18
+ function formatTokens(tokens) {
19
+ if (tokens >= 1e6) {
20
+ return `${(tokens / 1e6).toFixed(1)}M`;
21
+ }
22
+ if (tokens >= 1e3) {
23
+ return `${(tokens / 1e3).toFixed(1)}k`;
24
+ }
25
+ return tokens.toString();
26
+ }
27
+ function estimateRemainingTurns(usedTokens, maxTokens, messageCount) {
28
+ if (messageCount < 2) return Math.floor((maxTokens - usedTokens) / 2e3);
29
+ const avgPerTurn = usedTokens / (messageCount / 2);
30
+ const remaining = maxTokens - usedTokens;
31
+ return Math.max(0, Math.floor(remaining / avgPerTurn));
32
+ }
33
+ const ContextVisualizer = ({
34
+ tokenInfo
35
+ }) => {
36
+ const { usedTokens, maxTokens, messageCount, modelName } = tokenInfo;
37
+ const percent = Math.min(100, usedTokens / maxTokens * 100);
38
+ const color = getUsageColor(percent);
39
+ const remainingTurns = estimateRemainingTurns(
40
+ usedTokens,
41
+ maxTokens,
42
+ messageCount
43
+ );
44
+ 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, { dimColor: true }, " (", 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.")));
45
+ };
46
+ const command = {
47
+ name: "context",
48
+ description: "Visualize current context usage with token counts and estimates",
49
+ isEnabled: true,
50
+ isHidden: false,
51
+ type: "local-jsx",
52
+ aliases: ["ctx"],
53
+ userFacingName() {
54
+ return this.name;
55
+ },
56
+ async call(onDone) {
57
+ const messages = getMessagesGetter()();
58
+ const usedTokens = countTokens(messages);
59
+ let maxTokens = 2e5;
60
+ let modelName = "unknown";
61
+ try {
62
+ const modelManager = getModelManager();
63
+ const profile = modelManager.resolveModel("main");
64
+ if (profile) {
65
+ maxTokens = profile.contextLength || maxTokens;
66
+ modelName = profile.name || profile.modelName;
67
+ }
68
+ } catch {
69
+ }
70
+ const tokenInfo = {
71
+ usedTokens,
72
+ maxTokens,
73
+ messageCount: messages.length,
74
+ modelName
75
+ };
76
+ setTimeout(() => onDone(), 100);
77
+ return /* @__PURE__ */ React.createElement(ContextVisualizer, { tokenInfo });
78
+ }
79
+ };
80
+ var context_default = command;
81
+ export {
82
+ context_default as default
83
+ };
84
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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'\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 dimColor> ({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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",
6
+ "names": []
7
+ }
@@ -1,3 +1,4 @@
1
+ import { getToolDescriptionAsync } from "../Tool.js";
1
2
  import Table from "cli-table3";
2
3
  import { getSystemPrompt } from "../constants/prompts.js";
3
4
  import { getContext } from "../context.js";
@@ -153,19 +154,26 @@ const command = {
153
154
  systemPrompt += `
154
155
  <context name="${name}">${content}</context>`;
155
156
  }
156
- const tools = rawTools.map((t) => {
157
- const fullPrompt = t.prompt({ safeMode: false });
158
- const schema = JSON.stringify(
159
- "inputJSONSchema" in t && t.inputJSONSchema ? t.inputJSONSchema : zodToJsonSchema(t.inputSchema)
160
- );
161
- return {
162
- name: t.name,
163
- description: `${fullPrompt}
157
+ const tools = await Promise.all(
158
+ rawTools.map(async (t) => {
159
+ const [fullPrompt, description] = await Promise.all([
160
+ t.prompt({ safeMode: false }),
161
+ getToolDescriptionAsync(t)
162
+ ]);
163
+ const schema = JSON.stringify(
164
+ "inputJSONSchema" in t && t.inputJSONSchema ? t.inputJSONSchema : zodToJsonSchema(t.inputSchema)
165
+ );
166
+ return {
167
+ name: t.name,
168
+ description: `${description}
169
+
170
+ ${fullPrompt}
164
171
 
165
172
  Schema:
166
173
  ${schema}`
167
- };
168
- });
174
+ };
175
+ })
176
+ );
169
177
  const messages = getMessagesGetter()();
170
178
  const actualMessageTokens = countTokens(messages);
171
179
  const sections = getContextSections(systemPrompt);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/ctx_viz.ts"],
4
- "sourcesContent": ["import type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport Table from 'cli-table3'\nimport { getSystemPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getMessagesGetter } from '@messages'\nimport { PROJECT_FILE } from '@constants/product'\nimport { countTokens } from '@utils/tokens'\n\n/**\n * Estimate token count for a string.\n * Uses a heuristic that accounts for different character types:\n * - ASCII/Latin: ~4 characters per token\n * - CJK (Chinese/Japanese/Korean): ~1.5 characters per token\n * - Mixed content: weighted average\n */\nfunction estimateStringTokens(text: string): number {\n if (!text) return 0\n\n // Count CJK characters (Chinese, Japanese, Korean)\n const cjkPattern = /[\\u4e00-\\u9fff\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af]/g\n const cjkMatches = text.match(cjkPattern)\n const cjkCount = cjkMatches ? cjkMatches.length : 0\n const nonCjkCount = text.length - cjkCount\n\n // Estimate tokens: CJK ~1.5 chars/token, ASCII ~4 chars/token\n const cjkTokens = cjkCount / 1.5\n const nonCjkTokens = nonCjkCount / 4\n\n return Math.ceil(cjkTokens + nonCjkTokens)\n}\n\ninterface Section {\n title: string\n content: string\n}\n\ninterface ToolSummary {\n name: string\n description: string\n}\n\nfunction getContextSections(text: string): Section[] {\n const sections: Section[] = []\n\n // Find first <context> tag\n const firstContextIndex = text.indexOf('<context')\n\n // Everything before first tag is Core Sysprompt\n if (firstContextIndex > 0) {\n const coreSysprompt = text.slice(0, firstContextIndex).trim()\n if (coreSysprompt) {\n sections.push({\n title: 'Core Sysprompt',\n content: coreSysprompt,\n })\n }\n }\n\n let currentPos = firstContextIndex\n let nonContextContent = ''\n\n const regex = /<context\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/context>/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(text)) !== null) {\n // Collect text between context tags\n if (match.index > currentPos) {\n nonContextContent += text.slice(currentPos, match.index)\n }\n\n const [, name = 'Unnamed Section', content = ''] = match\n sections.push({\n title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,\n content: content.trim(),\n })\n\n currentPos = match.index + match[0].length\n }\n\n // Collect remaining text after last tag\n if (currentPos < text.length) {\n nonContextContent += text.slice(currentPos)\n }\n\n // Add non-contextualized content if present\n const trimmedNonContext = nonContextContent.trim()\n if (trimmedNonContext) {\n sections.push({\n title: 'Non-contextualized Content',\n content: trimmedNonContext,\n })\n }\n\n return sections\n}\n\nfunction formatTokenCount(tokens: number): string {\n if (tokens < 1000) {\n return `${tokens}`\n }\n const k = tokens / 1000\n return `${Math.round(k * 10) / 10}k`\n}\n\nfunction formatByteCount(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes}b`\n }\n const kb = bytes / 1024\n return `${Math.round(kb * 10) / 10}kb`\n}\n\nfunction createSummaryTable(\n systemText: string,\n systemSections: Section[],\n tools: ToolSummary[],\n messages: unknown,\n actualMessageTokens: number,\n): string {\n const table = new Table({\n head: ['Component', 'Tokens (est.)', 'Size', '% Tokens'],\n style: { head: ['bold'] },\n chars: {\n mid: '\u2500',\n 'left-mid': '\u251C',\n 'mid-mid': '\u253C',\n 'right-mid': '\u2524',\n },\n })\n\n const messagesStr = JSON.stringify(messages)\n const toolsStr = JSON.stringify(tools)\n\n // Estimate tokens for each component\n const systemTokens = estimateStringTokens(systemText)\n const toolsTokens = estimateStringTokens(toolsStr)\n // Use actual token count for messages if available, otherwise estimate\n const messageTokens =\n actualMessageTokens > 0\n ? actualMessageTokens\n : estimateStringTokens(messagesStr)\n\n // Calculate total tokens for percentages\n const totalTokens = systemTokens + toolsTokens + messageTokens\n const getPercentage = (tokens: number) =>\n totalTokens > 0 ? `${Math.round((tokens / totalTokens) * 100)}%` : '0%'\n\n // System prompt and its sections\n table.push([\n 'System prompt',\n formatTokenCount(systemTokens),\n formatByteCount(systemText.length),\n getPercentage(systemTokens),\n ])\n for (const section of systemSections) {\n const sectionTokens = estimateStringTokens(section.content)\n table.push([\n ` ${section.title}`,\n formatTokenCount(sectionTokens),\n formatByteCount(section.content.length),\n getPercentage(sectionTokens),\n ])\n }\n\n // Tools\n table.push([\n 'Tool definitions',\n formatTokenCount(toolsTokens),\n formatByteCount(toolsStr.length),\n getPercentage(toolsTokens),\n ])\n for (const tool of tools) {\n const toolTokens = estimateStringTokens(tool.description)\n table.push([\n ` ${tool.name}`,\n formatTokenCount(toolTokens),\n formatByteCount(tool.description.length),\n getPercentage(toolTokens),\n ])\n }\n\n // Messages and total\n const messageLabel =\n actualMessageTokens > 0 ? 'Messages (actual)' : 'Messages (est.)'\n table.push(\n [\n messageLabel,\n formatTokenCount(messageTokens),\n formatByteCount(messagesStr.length),\n getPercentage(messageTokens),\n ],\n [\n 'Total',\n formatTokenCount(totalTokens),\n formatByteCount(systemText.length + toolsStr.length + messagesStr.length),\n '100%',\n ],\n )\n\n return table.toString()\n}\n\nconst command: Command = {\n name: 'ctx-viz',\n description:\n '[Developer] Show token usage breakdown for the current conversation context',\n isEnabled: true,\n isHidden: true,\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {\n // Get tools and system prompt with injected context\n const [systemPromptRaw, sysContext] = await Promise.all([\n getSystemPrompt(),\n getContext(),\n ])\n\n const rawTools = cmdContext.options.tools\n\n // Full system prompt with context sections injected\n let systemPrompt = systemPromptRaw.join('\\n')\n for (const [name, content] of Object.entries(sysContext)) {\n systemPrompt += `\\n<context name=\"${name}\">${content}</context>`\n }\n\n // Get full tool definitions including prompts and schemas\n const tools = rawTools.map(t => {\n // Get full prompt and schema\n const fullPrompt = t.prompt({ safeMode: false })\n const schema = JSON.stringify(\n 'inputJSONSchema' in t && t.inputJSONSchema\n ? t.inputJSONSchema\n : zodToJsonSchema(t.inputSchema),\n )\n\n return {\n name: t.name,\n description: `${fullPrompt}\\n\\nSchema:\\n${schema}`,\n }\n })\n\n // Get current messages from REPL\n const messages = getMessagesGetter()()\n\n // Get actual token count from API usage if available\n const actualMessageTokens = countTokens(messages)\n\n const sections = getContextSections(systemPrompt)\n return createSummaryTable(\n systemPrompt,\n sections,\n tools,\n messages,\n actualMessageTokens,\n )\n },\n}\n\nexport default command\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Command } from '@commands'\nimport type { Tool } from '@tool'\nimport { getToolDescriptionAsync } from '@tool'\nimport Table from 'cli-table3'\nimport { getSystemPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { getMessagesGetter } from '@messages'\nimport { PROJECT_FILE } from '@constants/product'\nimport { countTokens } from '@utils/tokens'\n\n/**\n * Estimate token count for a string.\n * Uses a heuristic that accounts for different character types:\n * - ASCII/Latin: ~4 characters per token\n * - CJK (Chinese/Japanese/Korean): ~1.5 characters per token\n * - Mixed content: weighted average\n */\nfunction estimateStringTokens(text: string): number {\n if (!text) return 0\n\n // Count CJK characters (Chinese, Japanese, Korean)\n const cjkPattern = /[\\u4e00-\\u9fff\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af]/g\n const cjkMatches = text.match(cjkPattern)\n const cjkCount = cjkMatches ? cjkMatches.length : 0\n const nonCjkCount = text.length - cjkCount\n\n // Estimate tokens: CJK ~1.5 chars/token, ASCII ~4 chars/token\n const cjkTokens = cjkCount / 1.5\n const nonCjkTokens = nonCjkCount / 4\n\n return Math.ceil(cjkTokens + nonCjkTokens)\n}\n\ninterface Section {\n title: string\n content: string\n}\n\ninterface ToolSummary {\n name: string\n description: string\n}\n\nfunction getContextSections(text: string): Section[] {\n const sections: Section[] = []\n\n // Find first <context> tag\n const firstContextIndex = text.indexOf('<context')\n\n // Everything before first tag is Core Sysprompt\n if (firstContextIndex > 0) {\n const coreSysprompt = text.slice(0, firstContextIndex).trim()\n if (coreSysprompt) {\n sections.push({\n title: 'Core Sysprompt',\n content: coreSysprompt,\n })\n }\n }\n\n let currentPos = firstContextIndex\n let nonContextContent = ''\n\n const regex = /<context\\s+name=\"([^\"]*)\">([\\s\\S]*?)<\\/context>/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(text)) !== null) {\n // Collect text between context tags\n if (match.index > currentPos) {\n nonContextContent += text.slice(currentPos, match.index)\n }\n\n const [, name = 'Unnamed Section', content = ''] = match\n sections.push({\n title: name === 'codeStyle' ? `CodeStyle + ${PROJECT_FILE}'s` : name,\n content: content.trim(),\n })\n\n currentPos = match.index + match[0].length\n }\n\n // Collect remaining text after last tag\n if (currentPos < text.length) {\n nonContextContent += text.slice(currentPos)\n }\n\n // Add non-contextualized content if present\n const trimmedNonContext = nonContextContent.trim()\n if (trimmedNonContext) {\n sections.push({\n title: 'Non-contextualized Content',\n content: trimmedNonContext,\n })\n }\n\n return sections\n}\n\nfunction formatTokenCount(tokens: number): string {\n if (tokens < 1000) {\n return `${tokens}`\n }\n const k = tokens / 1000\n return `${Math.round(k * 10) / 10}k`\n}\n\nfunction formatByteCount(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes}b`\n }\n const kb = bytes / 1024\n return `${Math.round(kb * 10) / 10}kb`\n}\n\nfunction createSummaryTable(\n systemText: string,\n systemSections: Section[],\n tools: ToolSummary[],\n messages: unknown,\n actualMessageTokens: number,\n): string {\n const table = new Table({\n head: ['Component', 'Tokens (est.)', 'Size', '% Tokens'],\n style: { head: ['bold'] },\n chars: {\n mid: '\u2500',\n 'left-mid': '\u251C',\n 'mid-mid': '\u253C',\n 'right-mid': '\u2524',\n },\n })\n\n const messagesStr = JSON.stringify(messages)\n const toolsStr = JSON.stringify(tools)\n\n // Estimate tokens for each component\n const systemTokens = estimateStringTokens(systemText)\n const toolsTokens = estimateStringTokens(toolsStr)\n // Use actual token count for messages if available, otherwise estimate\n const messageTokens =\n actualMessageTokens > 0\n ? actualMessageTokens\n : estimateStringTokens(messagesStr)\n\n // Calculate total tokens for percentages\n const totalTokens = systemTokens + toolsTokens + messageTokens\n const getPercentage = (tokens: number) =>\n totalTokens > 0 ? `${Math.round((tokens / totalTokens) * 100)}%` : '0%'\n\n // System prompt and its sections\n table.push([\n 'System prompt',\n formatTokenCount(systemTokens),\n formatByteCount(systemText.length),\n getPercentage(systemTokens),\n ])\n for (const section of systemSections) {\n const sectionTokens = estimateStringTokens(section.content)\n table.push([\n ` ${section.title}`,\n formatTokenCount(sectionTokens),\n formatByteCount(section.content.length),\n getPercentage(sectionTokens),\n ])\n }\n\n // Tools\n table.push([\n 'Tool definitions',\n formatTokenCount(toolsTokens),\n formatByteCount(toolsStr.length),\n getPercentage(toolsTokens),\n ])\n for (const tool of tools) {\n const toolTokens = estimateStringTokens(tool.description)\n table.push([\n ` ${tool.name}`,\n formatTokenCount(toolTokens),\n formatByteCount(tool.description.length),\n getPercentage(toolTokens),\n ])\n }\n\n // Messages and total\n const messageLabel =\n actualMessageTokens > 0 ? 'Messages (actual)' : 'Messages (est.)'\n table.push(\n [\n messageLabel,\n formatTokenCount(messageTokens),\n formatByteCount(messagesStr.length),\n getPercentage(messageTokens),\n ],\n [\n 'Total',\n formatTokenCount(totalTokens),\n formatByteCount(systemText.length + toolsStr.length + messagesStr.length),\n '100%',\n ],\n )\n\n return table.toString()\n}\n\nconst command: Command = {\n name: 'ctx-viz',\n description:\n '[Developer] Show token usage breakdown for the current conversation context',\n isEnabled: true,\n isHidden: true,\n type: 'local',\n\n userFacingName() {\n return this.name\n },\n\n async call(_args: string, cmdContext: { options: { tools: Tool[] } }) {\n // Get tools and system prompt with injected context\n const [systemPromptRaw, sysContext] = await Promise.all([\n getSystemPrompt(),\n getContext(),\n ])\n\n const rawTools = cmdContext.options.tools\n\n // Full system prompt with context sections injected\n let systemPrompt = systemPromptRaw.join('\\n')\n for (const [name, content] of Object.entries(sysContext)) {\n systemPrompt += `\\n<context name=\"${name}\">${content}</context>`\n }\n\n // Get full tool definitions including prompts and schemas\n const tools = await Promise.all(\n rawTools.map(async t => {\n // Get full prompt and schema (properly await async calls)\n const [fullPrompt, description] = await Promise.all([\n t.prompt({ safeMode: false }),\n getToolDescriptionAsync(t),\n ])\n const schema = JSON.stringify(\n 'inputJSONSchema' in t && t.inputJSONSchema\n ? t.inputJSONSchema\n : zodToJsonSchema(t.inputSchema),\n )\n\n return {\n name: t.name,\n description: `${description}\\n\\n${fullPrompt}\\n\\nSchema:\\n${schema}`,\n }\n }),\n )\n\n // Get current messages from REPL\n const messages = getMessagesGetter()()\n\n // Get actual token count from API usage if available\n const actualMessageTokens = countTokens(messages)\n\n const sections = getContextSections(systemPrompt)\n return createSummaryTable(\n systemPrompt,\n sections,\n tools,\n messages,\n actualMessageTokens,\n )\n },\n}\n\nexport default command\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }