@within-7/minto 0.1.7 → 0.3.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 (601) 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 +73 -49
  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 +85 -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 +157 -0
  22. package/dist/commands/export.js.map +7 -0
  23. package/dist/commands/mcp-interactive.js +28 -18
  24. package/dist/commands/mcp-interactive.js.map +2 -2
  25. package/dist/commands/model.js +9 -7
  26. package/dist/commands/model.js.map +2 -2
  27. package/dist/commands/permissions.js +87 -0
  28. package/dist/commands/permissions.js.map +7 -0
  29. package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
  30. package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
  31. package/dist/commands/plugin/ConfirmDialog.js +2 -1
  32. package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
  33. package/dist/commands/plugin/ErrorView.js +2 -1
  34. package/dist/commands/plugin/ErrorView.js.map +2 -2
  35. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
  36. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
  37. package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
  38. package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
  39. package/dist/commands/plugin/MainMenu.js +2 -1
  40. package/dist/commands/plugin/MainMenu.js.map +2 -2
  41. package/dist/commands/plugin/MarketplaceManager.js +5 -4
  42. package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
  43. package/dist/commands/plugin/MarketplaceSelector.js +4 -3
  44. package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
  45. package/dist/commands/plugin/PlaceholderScreen.js +3 -2
  46. package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
  47. package/dist/commands/plugin/PluginBrowser.js +6 -5
  48. package/dist/commands/plugin/PluginBrowser.js.map +2 -2
  49. package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
  50. package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
  51. package/dist/commands/plugin/PluginDetailsManage.js +4 -3
  52. package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
  53. package/dist/commands/plugin.js +16 -15
  54. package/dist/commands/plugin.js.map +2 -2
  55. package/dist/commands/quit.js +3 -1
  56. package/dist/commands/quit.js.map +2 -2
  57. package/dist/commands/sandbox.js +105 -0
  58. package/dist/commands/sandbox.js.map +7 -0
  59. package/dist/commands/setup.js +2 -1
  60. package/dist/commands/setup.js.map +2 -2
  61. package/dist/commands/status.js +59 -0
  62. package/dist/commands/status.js.map +7 -0
  63. package/dist/commands/tasks.js +108 -0
  64. package/dist/commands/tasks.js.map +7 -0
  65. package/dist/commands/todos.js +123 -0
  66. package/dist/commands/todos.js.map +7 -0
  67. package/dist/commands/undo.js +245 -0
  68. package/dist/commands/undo.js.map +7 -0
  69. package/dist/commands.js +22 -2
  70. package/dist/commands.js.map +2 -2
  71. package/dist/components/AgentThinkingBlock.js +10 -18
  72. package/dist/components/AgentThinkingBlock.js.map +2 -2
  73. package/dist/components/AsciiLogo.js +7 -8
  74. package/dist/components/AsciiLogo.js.map +2 -2
  75. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
  76. package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
  77. package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
  78. package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
  79. package/dist/components/BackgroundTasksPanel.js +78 -29
  80. package/dist/components/BackgroundTasksPanel.js.map +2 -2
  81. package/dist/components/BashStreamingProgress.js +24 -0
  82. package/dist/components/BashStreamingProgress.js.map +7 -0
  83. package/dist/components/CollapsibleHint.js +15 -0
  84. package/dist/components/CollapsibleHint.js.map +7 -0
  85. package/dist/components/Config.js +3 -2
  86. package/dist/components/Config.js.map +2 -2
  87. package/dist/components/ConsoleOAuthFlow.js +2 -1
  88. package/dist/components/ConsoleOAuthFlow.js.map +2 -2
  89. package/dist/components/Cost.js +2 -1
  90. package/dist/components/Cost.js.map +2 -2
  91. package/dist/components/FileEditToolUpdatedMessage.js +1 -1
  92. package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
  93. package/dist/components/HeaderBar.js +13 -8
  94. package/dist/components/HeaderBar.js.map +2 -2
  95. package/dist/components/HistorySearchOverlay.js +4 -3
  96. package/dist/components/HistorySearchOverlay.js.map +2 -2
  97. package/dist/components/HotkeyHelpPanel.js +134 -0
  98. package/dist/components/HotkeyHelpPanel.js.map +7 -0
  99. package/dist/components/InvalidConfigDialog.js +2 -1
  100. package/dist/components/InvalidConfigDialog.js.map +2 -2
  101. package/dist/components/Logo.js +24 -68
  102. package/dist/components/Logo.js.map +2 -2
  103. package/dist/components/MCPServerApprovalDialog.js +2 -1
  104. package/dist/components/MCPServerApprovalDialog.js.map +2 -2
  105. package/dist/components/MCPServerDialogCopy.js +2 -1
  106. package/dist/components/MCPServerDialogCopy.js.map +2 -2
  107. package/dist/components/MCPServerMultiselectDialog.js +2 -1
  108. package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
  109. package/dist/components/Message.js +23 -7
  110. package/dist/components/Message.js.map +3 -3
  111. package/dist/components/MessageSelector.js +4 -3
  112. package/dist/components/MessageSelector.js.map +2 -2
  113. package/dist/components/ModeIndicator.js +2 -1
  114. package/dist/components/ModeIndicator.js.map +2 -2
  115. package/dist/components/ModelConfig.js +20 -6
  116. package/dist/components/ModelConfig.js.map +2 -2
  117. package/dist/components/ModelListManager.js +7 -6
  118. package/dist/components/ModelListManager.js.map +2 -2
  119. package/dist/components/ModelSelector/ModelSelector.js +27 -14
  120. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  121. package/dist/components/Onboarding.js +22 -16
  122. package/dist/components/Onboarding.js.map +2 -2
  123. package/dist/components/OperationSummary.js +130 -0
  124. package/dist/components/OperationSummary.js.map +7 -0
  125. package/dist/components/ProgressBar.js +74 -0
  126. package/dist/components/ProgressBar.js.map +7 -0
  127. package/dist/components/PromptInput.js +210 -87
  128. package/dist/components/PromptInput.js.map +2 -2
  129. package/dist/components/RequestStatusIndicator.js +194 -0
  130. package/dist/components/RequestStatusIndicator.js.map +7 -0
  131. package/dist/components/SensitiveFileWarning.js +31 -0
  132. package/dist/components/SensitiveFileWarning.js.map +7 -0
  133. package/dist/components/Spinner.js +141 -27
  134. package/dist/components/Spinner.js.map +2 -2
  135. package/dist/components/SpinnerSymbol.js +21 -27
  136. package/dist/components/SpinnerSymbol.js.map +2 -2
  137. package/dist/components/StreamingBashOutput.js +9 -8
  138. package/dist/components/StreamingBashOutput.js.map +2 -2
  139. package/dist/components/StructuredDiff.js +6 -8
  140. package/dist/components/StructuredDiff.js.map +2 -2
  141. package/dist/components/SubagentBlock.js +5 -3
  142. package/dist/components/SubagentBlock.js.map +2 -2
  143. package/dist/components/SubagentProgress.js +17 -15
  144. package/dist/components/SubagentProgress.js.map +2 -2
  145. package/dist/components/TaskCard.js +30 -24
  146. package/dist/components/TaskCard.js.map +2 -2
  147. package/dist/components/TextInput.js +9 -1
  148. package/dist/components/TextInput.js.map +2 -2
  149. package/dist/components/TodoChangeBlock.js +1 -1
  150. package/dist/components/TodoChangeBlock.js.map +2 -2
  151. package/dist/components/TodoPanel.js +140 -31
  152. package/dist/components/TodoPanel.js.map +3 -3
  153. package/dist/components/TokenCounter.js +74 -0
  154. package/dist/components/TokenCounter.js.map +7 -0
  155. package/dist/components/TokenWarning.js +2 -1
  156. package/dist/components/TokenWarning.js.map +2 -2
  157. package/dist/components/ToolUseLoader.js +2 -2
  158. package/dist/components/ToolUseLoader.js.map +2 -2
  159. package/dist/components/TreeConnector.js +26 -0
  160. package/dist/components/TreeConnector.js.map +7 -0
  161. package/dist/components/TrustDialog.js +2 -1
  162. package/dist/components/TrustDialog.js.map +2 -2
  163. package/dist/components/TurnCompletionIndicator.js +18 -0
  164. package/dist/components/TurnCompletionIndicator.js.map +7 -0
  165. package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
  166. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
  167. package/dist/components/messages/AssistantTextMessage.js +20 -9
  168. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  169. package/dist/components/messages/AssistantThinkingMessage.js +18 -3
  170. package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
  171. package/dist/components/messages/AssistantToolUseMessage.js +17 -10
  172. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  173. package/dist/components/messages/GroupRenderer.js +54 -0
  174. package/dist/components/messages/GroupRenderer.js.map +7 -0
  175. package/dist/components/messages/NestedTasksPreview.js +24 -0
  176. package/dist/components/messages/NestedTasksPreview.js.map +7 -0
  177. package/dist/components/messages/ParallelTasksGroupView.js +93 -0
  178. package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
  179. package/dist/components/messages/TaskInModuleView.js +218 -0
  180. package/dist/components/messages/TaskInModuleView.js.map +7 -0
  181. package/dist/components/messages/TaskOutputContent.js +56 -0
  182. package/dist/components/messages/TaskOutputContent.js.map +7 -0
  183. package/dist/components/messages/UserPromptMessage.js +2 -2
  184. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  185. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
  186. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  187. package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
  188. package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
  189. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
  190. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
  191. package/dist/constants/colors.js +120 -54
  192. package/dist/constants/colors.js.map +2 -2
  193. package/dist/constants/formatRules.js +102 -0
  194. package/dist/constants/formatRules.js.map +7 -0
  195. package/dist/constants/prompts.js +12 -34
  196. package/dist/constants/prompts.js.map +2 -2
  197. package/dist/constants/symbols.js +64 -6
  198. package/dist/constants/symbols.js.map +2 -2
  199. package/dist/constants/timing.js +5 -0
  200. package/dist/constants/timing.js.map +2 -2
  201. package/dist/constants/toolInputExamples.js +84 -0
  202. package/dist/constants/toolInputExamples.js.map +7 -0
  203. package/dist/core/backupManager.js +321 -0
  204. package/dist/core/backupManager.js.map +7 -0
  205. package/dist/core/config/defaults.js +84 -0
  206. package/dist/core/config/defaults.js.map +7 -0
  207. package/dist/core/config/index.js +111 -0
  208. package/dist/core/config/index.js.map +7 -0
  209. package/dist/core/config/loader.js +221 -0
  210. package/dist/core/config/loader.js.map +7 -0
  211. package/dist/core/config/migrations.js +128 -0
  212. package/dist/core/config/migrations.js.map +7 -0
  213. package/dist/core/config/schema.js +178 -0
  214. package/dist/core/config/schema.js.map +7 -0
  215. package/dist/core/costTracker.js +129 -0
  216. package/dist/core/costTracker.js.map +7 -0
  217. package/dist/core/gitAutoCommit.js +287 -0
  218. package/dist/core/gitAutoCommit.js.map +7 -0
  219. package/dist/core/index.js +8 -0
  220. package/dist/core/index.js.map +7 -0
  221. package/dist/core/operationTracker.js +212 -0
  222. package/dist/core/operationTracker.js.map +7 -0
  223. package/dist/core/permissions/auditLog.js +204 -0
  224. package/dist/core/permissions/auditLog.js.map +7 -0
  225. package/dist/core/permissions/engine/index.js +3 -0
  226. package/dist/core/permissions/engine/index.js.map +7 -0
  227. package/dist/core/permissions/engine/permissionEngine.js +106 -0
  228. package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
  229. package/dist/core/permissions/engine/types.js +1 -0
  230. package/dist/core/permissions/engine/types.js.map +7 -0
  231. package/dist/core/permissions/index.js +84 -0
  232. package/dist/core/permissions/index.js.map +7 -0
  233. package/dist/core/permissions/ruleEngine.js +259 -0
  234. package/dist/core/permissions/ruleEngine.js.map +7 -0
  235. package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
  236. package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
  237. package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
  238. package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
  239. package/dist/core/permissions/rules/index.js +46 -0
  240. package/dist/core/permissions/rules/index.js.map +7 -0
  241. package/dist/core/permissions/rules/planModeRule.js +55 -0
  242. package/dist/core/permissions/rules/planModeRule.js.map +7 -0
  243. package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
  244. package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
  245. package/dist/core/permissions/rules/safeModeRule.js +65 -0
  246. package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
  247. package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
  248. package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
  249. package/dist/core/permissions/types.js +127 -0
  250. package/dist/core/permissions/types.js.map +7 -0
  251. package/dist/core/tokenStats.js +9 -0
  252. package/dist/core/tokenStats.js.map +7 -0
  253. package/dist/core/tokenStatsManager.js +331 -0
  254. package/dist/core/tokenStatsManager.js.map +7 -0
  255. package/dist/core/tools/executor.js +143 -0
  256. package/dist/core/tools/executor.js.map +7 -0
  257. package/dist/core/tools/index.js +15 -0
  258. package/dist/core/tools/index.js.map +7 -0
  259. package/dist/core/tools/registry.js +183 -0
  260. package/dist/core/tools/registry.js.map +7 -0
  261. package/dist/core/tools/types.js +1 -0
  262. package/dist/core/tools/types.js.map +7 -0
  263. package/dist/cost-tracker.js +23 -15
  264. package/dist/cost-tracker.js.map +2 -2
  265. package/dist/entrypoints/cli.js +158 -130
  266. package/dist/entrypoints/cli.js.map +2 -2
  267. package/dist/entrypoints/mcp.js +12 -4
  268. package/dist/entrypoints/mcp.js.map +2 -2
  269. package/dist/history.js +14 -3
  270. package/dist/history.js.map +2 -2
  271. package/dist/hooks/useAgentTokenStats.js +72 -0
  272. package/dist/hooks/useAgentTokenStats.js.map +7 -0
  273. package/dist/hooks/useAgentTranscripts.js +140 -0
  274. package/dist/hooks/useAgentTranscripts.js.map +7 -0
  275. package/dist/hooks/useAnimationSync.js +53 -0
  276. package/dist/hooks/useAnimationSync.js.map +7 -0
  277. package/dist/hooks/useArrowKeyHistory.js +4 -2
  278. package/dist/hooks/useArrowKeyHistory.js.map +2 -2
  279. package/dist/hooks/useCanUseTool.js +3 -1
  280. package/dist/hooks/useCanUseTool.js.map +2 -2
  281. package/dist/hooks/useExitOnCtrlCD.js +9 -5
  282. package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
  283. package/dist/hooks/useHookStatus.js +40 -0
  284. package/dist/hooks/useHookStatus.js.map +7 -0
  285. package/dist/hooks/useLogMessages.js +29 -2
  286. package/dist/hooks/useLogMessages.js.map +2 -2
  287. package/dist/hooks/useMessageGroups.js +43 -0
  288. package/dist/hooks/useMessageGroups.js.map +7 -0
  289. package/dist/hooks/useTerminalSize.js +62 -6
  290. package/dist/hooks/useTerminalSize.js.map +2 -2
  291. package/dist/hooks/useUnifiedCompletion.js +69 -0
  292. package/dist/hooks/useUnifiedCompletion.js.map +2 -2
  293. package/dist/i18n/index.js +109 -0
  294. package/dist/i18n/index.js.map +7 -0
  295. package/dist/i18n/locales/en.js +348 -0
  296. package/dist/i18n/locales/en.js.map +7 -0
  297. package/dist/i18n/locales/index.js +7 -0
  298. package/dist/i18n/locales/index.js.map +7 -0
  299. package/dist/i18n/locales/zh-CN.js +348 -0
  300. package/dist/i18n/locales/zh-CN.js.map +7 -0
  301. package/dist/i18n/types.js +8 -0
  302. package/dist/i18n/types.js.map +7 -0
  303. package/dist/permissions.js +28 -1
  304. package/dist/permissions.js.map +2 -2
  305. package/dist/query.js +253 -21
  306. package/dist/query.js.map +3 -3
  307. package/dist/screens/REPL.js +523 -194
  308. package/dist/screens/REPL.js.map +3 -3
  309. package/dist/services/adapters/chatCompletions.js +3 -1
  310. package/dist/services/adapters/chatCompletions.js.map +2 -2
  311. package/dist/services/adapters/messageNormalizer.js +354 -0
  312. package/dist/services/adapters/messageNormalizer.js.map +7 -0
  313. package/dist/services/adapters/responsesAPI.js +6 -3
  314. package/dist/services/adapters/responsesAPI.js.map +2 -2
  315. package/dist/services/checkpointManager.js +386 -0
  316. package/dist/services/checkpointManager.js.map +7 -0
  317. package/dist/services/claude.js +192 -14
  318. package/dist/services/claude.js.map +3 -3
  319. package/dist/services/compressionService.js +50 -1
  320. package/dist/services/compressionService.js.map +2 -2
  321. package/dist/services/contextMonitor.js +162 -0
  322. package/dist/services/contextMonitor.js.map +7 -0
  323. package/dist/services/customCommands.js +60 -41
  324. package/dist/services/customCommands.js.map +2 -2
  325. package/dist/services/hookExecutor.js +173 -1
  326. package/dist/services/hookExecutor.js.map +2 -2
  327. package/dist/services/intelligentCompactor.js +281 -0
  328. package/dist/services/intelligentCompactor.js.map +7 -0
  329. package/dist/services/lspConfig.js +109 -0
  330. package/dist/services/lspConfig.js.map +7 -0
  331. package/dist/services/mcpClient.js +338 -43
  332. package/dist/services/mcpClient.js.map +2 -2
  333. package/dist/services/modelOrchestrator.js +310 -0
  334. package/dist/services/modelOrchestrator.js.map +7 -0
  335. package/dist/services/openai.js +8 -1
  336. package/dist/services/openai.js.map +2 -2
  337. package/dist/services/outputStyles.js +138 -0
  338. package/dist/services/outputStyles.js.map +7 -0
  339. package/dist/services/plugins/index.js +5 -0
  340. package/dist/services/plugins/index.js.map +7 -0
  341. package/dist/services/plugins/lspServers.js +188 -0
  342. package/dist/services/plugins/lspServers.js.map +7 -0
  343. package/dist/services/plugins/pluginRuntime.js +229 -0
  344. package/dist/services/plugins/pluginRuntime.js.map +7 -0
  345. package/dist/services/plugins/pluginValidation.js +219 -0
  346. package/dist/services/plugins/pluginValidation.js.map +7 -0
  347. package/dist/services/plugins/skillMarketplace.js +556 -0
  348. package/dist/services/plugins/skillMarketplace.js.map +7 -0
  349. package/dist/services/responseStateManager.js +37 -3
  350. package/dist/services/responseStateManager.js.map +2 -2
  351. package/dist/services/sandbox/filesystemBoundary.js +341 -0
  352. package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
  353. package/dist/services/sandbox/index.js +14 -0
  354. package/dist/services/sandbox/index.js.map +7 -0
  355. package/dist/services/sandbox/networkProxy.js +293 -0
  356. package/dist/services/sandbox/networkProxy.js.map +7 -0
  357. package/dist/services/sandbox/sandboxController.js +574 -0
  358. package/dist/services/sandbox/sandboxController.js.map +7 -0
  359. package/dist/services/sandbox/types.js +50 -0
  360. package/dist/services/sandbox/types.js.map +7 -0
  361. package/dist/services/sessionMemory.js +266 -0
  362. package/dist/services/sessionMemory.js.map +7 -0
  363. package/dist/services/taskRouter.js +324 -0
  364. package/dist/services/taskRouter.js.map +7 -0
  365. package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
  366. package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
  367. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
  368. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  369. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
  370. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  371. package/dist/tools/BaseTool.js +72 -0
  372. package/dist/tools/BaseTool.js.map +7 -0
  373. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
  374. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
  375. package/dist/tools/BashTool/BashTool.js +79 -3
  376. package/dist/tools/BashTool/BashTool.js.map +2 -2
  377. package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
  378. package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
  379. package/dist/tools/BashTool/OutputLine.js +54 -0
  380. package/dist/tools/BashTool/OutputLine.js.map +2 -2
  381. package/dist/tools/BashTool/prompt.js +336 -3
  382. package/dist/tools/BashTool/prompt.js.map +2 -2
  383. package/dist/tools/FileEditTool/FileEditTool.js +29 -4
  384. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  385. package/dist/tools/FileEditTool/prompt.js +6 -3
  386. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  387. package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
  388. package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
  389. package/dist/tools/FileWriteTool/prompt.js +4 -2
  390. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  391. package/dist/tools/GlobTool/GlobTool.js +4 -2
  392. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  393. package/dist/tools/GrepTool/GrepTool.js +36 -7
  394. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  395. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
  396. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
  397. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
  398. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
  399. package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
  400. package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
  401. package/dist/tools/LspTool/LspTool.js +664 -0
  402. package/dist/tools/LspTool/LspTool.js.map +7 -0
  403. package/dist/tools/LspTool/prompt.js +27 -0
  404. package/dist/tools/LspTool/prompt.js.map +7 -0
  405. package/dist/tools/MCPTool/MCPTool.js +9 -1
  406. package/dist/tools/MCPTool/MCPTool.js.map +2 -2
  407. package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
  408. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
  409. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
  410. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
  411. package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
  412. package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
  413. package/dist/tools/MultiEditTool/prompt.js +5 -3
  414. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  415. package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
  416. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  417. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
  418. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
  419. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
  420. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
  421. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
  422. package/dist/tools/PlanModeTool/prompt.js +94 -0
  423. package/dist/tools/PlanModeTool/prompt.js.map +7 -0
  424. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
  425. package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
  426. package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
  427. package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
  428. package/dist/tools/SkillTool/SkillTool.js +10 -4
  429. package/dist/tools/SkillTool/SkillTool.js.map +2 -2
  430. package/dist/tools/SkillTool/prompt.js +1 -1
  431. package/dist/tools/SkillTool/prompt.js.map +1 -1
  432. package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
  433. package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
  434. package/dist/tools/SlashCommandTool/prompt.js +35 -0
  435. package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
  436. package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
  437. package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
  438. package/dist/tools/TaskOutputTool/prompt.js +15 -0
  439. package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
  440. package/dist/tools/TaskTool/TaskTool.js +310 -104
  441. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  442. package/dist/tools/TaskTool/prompt.js.map +2 -2
  443. package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
  444. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
  445. package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
  446. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  447. package/dist/tools/URLFetcherTool/cache.js +55 -8
  448. package/dist/tools/URLFetcherTool/cache.js.map +2 -2
  449. package/dist/tools.js +31 -2
  450. package/dist/tools.js.map +2 -2
  451. package/dist/types/hooks.js +4 -0
  452. package/dist/types/hooks.js.map +2 -2
  453. package/dist/types/marketplace.js.map +2 -2
  454. package/dist/types/messageGroup.js +36 -0
  455. package/dist/types/messageGroup.js.map +7 -0
  456. package/dist/types/plugin.js.map +2 -2
  457. package/dist/types/thinking.js +1 -0
  458. package/dist/types/thinking.js.map +7 -0
  459. package/dist/utils/BackgroundShellManager.js +136 -39
  460. package/dist/utils/BackgroundShellManager.js.map +2 -2
  461. package/dist/utils/CircuitBreaker.js +242 -0
  462. package/dist/utils/CircuitBreaker.js.map +7 -0
  463. package/dist/utils/MessageBatchBuffer.js +102 -0
  464. package/dist/utils/MessageBatchBuffer.js.map +7 -0
  465. package/dist/utils/PersistentShell.js +151 -1
  466. package/dist/utils/PersistentShell.js.map +2 -2
  467. package/dist/utils/agentLoader.js +1 -23
  468. package/dist/utils/agentLoader.js.map +2 -2
  469. package/dist/utils/agentTranscripts.js +641 -0
  470. package/dist/utils/agentTranscripts.js.map +7 -0
  471. package/dist/utils/animationManager.js +213 -0
  472. package/dist/utils/animationManager.js.map +7 -0
  473. package/dist/utils/animationSync.js +110 -0
  474. package/dist/utils/animationSync.js.map +7 -0
  475. package/dist/utils/ask.js +2 -0
  476. package/dist/utils/ask.js.map +2 -2
  477. package/dist/utils/asyncFile.js +215 -0
  478. package/dist/utils/asyncFile.js.map +7 -0
  479. package/dist/utils/backgroundAgentManager.js +231 -0
  480. package/dist/utils/backgroundAgentManager.js.map +7 -0
  481. package/dist/utils/config.js +108 -10
  482. package/dist/utils/config.js.map +2 -2
  483. package/dist/utils/conversationRecovery.js +19 -0
  484. package/dist/utils/conversationRecovery.js.map +2 -2
  485. package/dist/utils/credentials/CredentialStore.js +1 -0
  486. package/dist/utils/credentials/CredentialStore.js.map +7 -0
  487. package/dist/utils/credentials/EncryptedFileStore.js +157 -0
  488. package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
  489. package/dist/utils/credentials/index.js +37 -0
  490. package/dist/utils/credentials/index.js.map +7 -0
  491. package/dist/utils/credentials/migration.js +82 -0
  492. package/dist/utils/credentials/migration.js.map +7 -0
  493. package/dist/utils/exit.js +73 -0
  494. package/dist/utils/exit.js.map +7 -0
  495. package/dist/utils/format.js +73 -5
  496. package/dist/utils/format.js.map +2 -2
  497. package/dist/utils/generators.js +76 -6
  498. package/dist/utils/generators.js.map +2 -2
  499. package/dist/utils/globalErrorHandler.js +149 -0
  500. package/dist/utils/globalErrorHandler.js.map +7 -0
  501. package/dist/utils/groupHandlers/index.js +8 -0
  502. package/dist/utils/groupHandlers/index.js.map +7 -0
  503. package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
  504. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
  505. package/dist/utils/groupHandlers/taskHandler.js +104 -0
  506. package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
  507. package/dist/utils/groupHandlers/types.js +1 -0
  508. package/dist/utils/groupHandlers/types.js.map +7 -0
  509. package/dist/utils/logRotation.js +224 -0
  510. package/dist/utils/logRotation.js.map +7 -0
  511. package/dist/utils/markdown.js +13 -1
  512. package/dist/utils/markdown.js.map +2 -2
  513. package/dist/utils/marketplaceManager.js +3 -5
  514. package/dist/utils/marketplaceManager.js.map +2 -2
  515. package/dist/utils/memSafety.js +264 -0
  516. package/dist/utils/memSafety.js.map +7 -0
  517. package/dist/utils/messageGroupManager.js +274 -0
  518. package/dist/utils/messageGroupManager.js.map +7 -0
  519. package/dist/utils/messages.js +13 -4
  520. package/dist/utils/messages.js.map +2 -2
  521. package/dist/utils/model.js +119 -15
  522. package/dist/utils/model.js.map +3 -3
  523. package/dist/utils/permissions/filesystem.js +162 -6
  524. package/dist/utils/permissions/filesystem.js.map +2 -2
  525. package/dist/utils/plan/planMode.js +143 -0
  526. package/dist/utils/plan/planMode.js.map +7 -0
  527. package/dist/utils/pluginLoader.js +17 -21
  528. package/dist/utils/pluginLoader.js.map +2 -2
  529. package/dist/utils/ripgrep.js +55 -2
  530. package/dist/utils/ripgrep.js.map +2 -2
  531. package/dist/utils/safePath.js +132 -0
  532. package/dist/utils/safePath.js.map +7 -0
  533. package/dist/utils/sanitizeInput.js +32 -0
  534. package/dist/utils/sanitizeInput.js.map +7 -0
  535. package/dist/utils/secureKeyStorage.js +312 -0
  536. package/dist/utils/secureKeyStorage.js.map +7 -0
  537. package/dist/utils/sensitiveFiles.js +125 -0
  538. package/dist/utils/sensitiveFiles.js.map +7 -0
  539. package/dist/utils/session/sessionPlugins.js +67 -0
  540. package/dist/utils/session/sessionPlugins.js.map +7 -0
  541. package/dist/utils/taskDisplayUtils.js +257 -0
  542. package/dist/utils/taskDisplayUtils.js.map +7 -0
  543. package/dist/utils/teamConfig.js +2 -1
  544. package/dist/utils/teamConfig.js.map +2 -2
  545. package/dist/utils/theme.js +6 -6
  546. package/dist/utils/theme.js.map +1 -1
  547. package/dist/utils/todoStorage.js +92 -2
  548. package/dist/utils/todoStorage.js.map +2 -2
  549. package/dist/utils/toolRiskClassification.js +207 -0
  550. package/dist/utils/toolRiskClassification.js.map +7 -0
  551. package/dist/utils/toolTimeout.js +136 -0
  552. package/dist/utils/toolTimeout.js.map +7 -0
  553. package/dist/utils/tooling/safeRender.js +116 -0
  554. package/dist/utils/tooling/safeRender.js.map +7 -0
  555. package/dist/utils/userFriendlyError.js +346 -0
  556. package/dist/utils/userFriendlyError.js.map +7 -0
  557. package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
  558. package/dist/version.js +2 -2
  559. package/dist/version.js.map +1 -1
  560. package/package.json +17 -5
  561. package/scripts/postinstall.js +128 -38
  562. package/dist/commands/agents.js +0 -2086
  563. package/dist/commands/agents.js.map +0 -7
  564. package/dist/commands/build.js +0 -74
  565. package/dist/commands/build.js.map +0 -7
  566. package/dist/commands/compression.js +0 -57
  567. package/dist/commands/compression.js.map +0 -7
  568. package/dist/commands/listen.js +0 -37
  569. package/dist/commands/listen.js.map +0 -7
  570. package/dist/commands/login.js +0 -37
  571. package/dist/commands/login.js.map +0 -7
  572. package/dist/commands/logout.js +0 -33
  573. package/dist/commands/logout.js.map +0 -7
  574. package/dist/commands/mcp.js +0 -40
  575. package/dist/commands/mcp.js.map +0 -7
  576. package/dist/commands/mcp_refresh.js +0 -40
  577. package/dist/commands/mcp_refresh.js.map +0 -7
  578. package/dist/commands/modelstatus.js +0 -21
  579. package/dist/commands/modelstatus.js.map +0 -7
  580. package/dist/commands/onboarding.js +0 -36
  581. package/dist/commands/onboarding.js.map +0 -7
  582. package/dist/commands/plugin-interactive.js +0 -446
  583. package/dist/commands/plugin-interactive.js.map +0 -7
  584. package/dist/commands/pr_comments.js +0 -61
  585. package/dist/commands/pr_comments.js.map +0 -7
  586. package/dist/commands/release-notes.js +0 -30
  587. package/dist/commands/release-notes.js.map +0 -7
  588. package/dist/commands/review.js +0 -51
  589. package/dist/commands/review.js.map +0 -7
  590. package/dist/components/Bug.js +0 -147
  591. package/dist/components/Bug.js.map +0 -7
  592. package/dist/components/ModelSelector.js +0 -2062
  593. package/dist/components/ModelSelector.js.map +0 -7
  594. package/dist/components/ModelStatusDisplay.js +0 -87
  595. package/dist/components/ModelStatusDisplay.js.map +0 -7
  596. package/dist/entrypoints/cli-wrapper.js +0 -61
  597. package/dist/entrypoints/cli-wrapper.js.map +0 -7
  598. package/dist/hooks/useCancelRequest.js +0 -28
  599. package/dist/hooks/useCancelRequest.js.map +0 -7
  600. package/dist/screens/Doctor.js +0 -22
  601. package/dist/screens/Doctor.js.map +0 -7
@@ -14,7 +14,8 @@ import { StructuredDiff } from "./StructuredDiff.js";
14
14
  import { getTheme } from "../utils/theme.js";
15
15
  import { clearTerminal } from "../utils/terminal.js";
16
16
  import { PressEnterToContinue } from "./PressEnterToContinue.js";
17
- import { ModelSelector } from "./ModelSelector.js";
17
+ import { ModelSelector } from "./ModelSelector/index.js";
18
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
18
19
  function Onboarding({ onDone }) {
19
20
  const [currentStepIndex, setCurrentStepIndex] = useState(0);
20
21
  const [showModelSelector, setShowModelSelector] = useState(false);
@@ -45,21 +46,26 @@ function Onboarding({ onDone }) {
45
46
  function handleModelSelectionDone() {
46
47
  onDone();
47
48
  }
48
- const exitState = useExitOnCtrlCD(() => process.exit(0));
49
- useInput(async (_, key) => {
50
- const currentStep = steps[currentStepIndex];
51
- if (key.return && currentStep && ["usage", "providers", "model"].includes(currentStep.id)) {
52
- if (currentStep.id === "model") {
53
- setShowModelSelector(true);
54
- } else if (currentStepIndex === steps.length - 1) {
55
- onDone();
56
- } else {
57
- await clearTerminal();
58
- goToNextStep();
59
- }
60
- }
49
+ const exitState = useExitOnCtrlCD(() => process.exit(0), {
50
+ isActive: !showModelSelector
61
51
  });
62
- const themeStep = /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", gap: 1, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Let's get started."), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Choose the option that looks best when you select it:"), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "To change this later, run /config")), /* @__PURE__ */ React.createElement(
52
+ useInput(
53
+ async (_, key) => {
54
+ const currentStep = steps[currentStepIndex];
55
+ if (key.return && currentStep && ["usage", "providers", "model"].includes(currentStep.id)) {
56
+ if (currentStep.id === "model") {
57
+ setShowModelSelector(true);
58
+ } else if (currentStepIndex === steps.length - 1) {
59
+ onDone();
60
+ } else {
61
+ await clearTerminal();
62
+ goToNextStep();
63
+ }
64
+ }
65
+ },
66
+ { isActive: !showModelSelector }
67
+ );
68
+ const themeStep = /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", gap: 1, paddingLeft: 1 }, /* @__PURE__ */ React.createElement(Text, null, "Let's get started."), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Choose the option that looks best when you select it:"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "To change this later, run /config")), /* @__PURE__ */ React.createElement(
63
69
  Select,
64
70
  {
65
71
  options: [
@@ -83,7 +89,7 @@ function Onboarding({ onDone }) {
83
89
  paddingLeft: 1,
84
90
  marginRight: 1,
85
91
  borderStyle: "round",
86
- borderColor: "gray",
92
+ borderColor: SEMANTIC_COLORS.dim,
87
93
  flexDirection: "column"
88
94
  },
89
95
  /* @__PURE__ */ React.createElement(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/Onboarding.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react'\nimport { PRODUCT_NAME } from '@constants/product'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n DEFAULT_GLOBAL_CONFIG,\n ProviderType,\n} from '@utils/config'\nimport { OrderedList } from '@inkjs/ui'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { MIN_LOGO_WIDTH } from './Logo'\nimport { Select } from './CustomSelect/select'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme, type ThemeNames } from '@utils/theme'\nimport { clearTerminal } from '@utils/terminal'\nimport { PressEnterToContinue } from './PressEnterToContinue'\nimport { ModelSelector } from './ModelSelector'\ntype StepId = 'theme' | 'usage' | 'providers' | 'model'\n\ninterface OnboardingStep {\n id: StepId\n component: React.ReactNode\n}\n\ntype Props = {\n onDone(): void\n}\n\nexport function Onboarding({ onDone }: Props): React.ReactNode {\n const [currentStepIndex, setCurrentStepIndex] = useState(0)\n const [showModelSelector, setShowModelSelector] = useState(false)\n const config = getGlobalConfig()\n\n const [selectedTheme, setSelectedTheme] = useState(\n DEFAULT_GLOBAL_CONFIG.theme,\n )\n const theme = getTheme()\n function goToNextStep() {\n if (currentStepIndex < steps.length - 1) {\n const nextIndex = currentStepIndex + 1\n setCurrentStepIndex(nextIndex)\n }\n }\n\n function handleThemeSelection(newTheme: string) {\n saveGlobalConfig({\n ...config,\n theme: newTheme as ThemeNames,\n })\n goToNextStep()\n }\n\n function handleThemePreview(newTheme: string) {\n setSelectedTheme(newTheme as ThemeNames)\n }\n\n function handleProviderSelectionDone() {\n // After model selection is done, go to the next step\n goToNextStep()\n }\n\n function handleModelSelectionDone() {\n // After final model selection is done, complete onboarding\n onDone()\n }\n\n const exitState = useExitOnCtrlCD(() => process.exit(0))\n\n useInput(async (_, key) => {\n const currentStep = steps[currentStepIndex]\n if (\n key.return &&\n currentStep &&\n ['usage', 'providers', 'model'].includes(currentStep.id)\n ) {\n if (currentStep.id === 'model') {\n // Navigate to ModelSelector component\n setShowModelSelector(true)\n } else if (currentStepIndex === steps.length - 1) {\n onDone()\n } else {\n // HACK: for some reason there's now a jump here otherwise :(\n await clearTerminal()\n goToNextStep()\n }\n }\n })\n\n // Define all onboarding steps\n const themeStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text>Let&apos;s get started.</Text>\n <Box flexDirection=\"column\">\n <Text bold>Choose the option that looks best when you select it:</Text>\n <Text dimColor>To change this later, run /config</Text>\n </Box>\n <Select\n options={[\n { label: 'Light text', value: 'dark' },\n { label: 'Dark text', value: 'light' },\n {\n label: 'Light text (colorblind-friendly)',\n value: 'dark-daltonized',\n },\n {\n label: 'Dark text (colorblind-friendly)',\n value: 'light-daltonized',\n },\n ]}\n onFocus={handleThemePreview}\n onChange={handleThemeSelection}\n />\n <Box flexDirection=\"column\">\n <Box\n paddingLeft={1}\n marginRight={1}\n borderStyle=\"round\"\n borderColor=\"gray\"\n flexDirection=\"column\"\n >\n <StructuredDiff\n patch={{\n oldStart: 1,\n newStart: 1,\n oldLines: 3,\n newLines: 3,\n lines: [\n 'function greet() {',\n '- console.log(\"Hello, World!\");',\n '+ console.log(\"Hello, anon!\");',\n '}',\n ],\n }}\n dim={false}\n width={40}\n overrideTheme={selectedTheme}\n />\n </Box>\n </Box>\n </Box>\n )\n\n const providersStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Next, let's select your preferred AI provider and model.\n </Text>\n </Box>\n <ModelSelector\n onDone={handleProviderSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n </Box>\n )\n\n const usageStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Using {PRODUCT_NAME} effectively:</Text>\n <Box flexDirection=\"column\" width={70}>\n <OrderedList children={[]}>\n <OrderedList.Item children={[]}>\n <Text>\n Start in your project directory\n <Newline />\n <Text color={theme.secondaryText}>\n Files are automatically added to context when needed.\n </Text>\n <Newline />\n </Text>\n </OrderedList.Item>\n <OrderedList.Item children={[]}>\n <Text>\n Use {PRODUCT_NAME} as a development partner\n <Newline />\n <Text color={theme.secondaryText}>\n Get help with file analysis, editing, bash commands,\n <Newline />\n and git history.\n <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n <OrderedList.Item children={[]}>\n <Text>\n Provide clear context\n <Newline />\n <Text color={theme.secondaryText}>\n Be as specific as you would with another engineer. <Newline />\n The better the context, the better the results. <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n </OrderedList>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const modelStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Configure your models:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text>\n You can customize which models {PRODUCT_NAME} uses for different\n tasks.\n <Newline />\n <Text color={theme.secondaryText}>\n Let's set up your preferred models for large and small tasks.\n </Text>\n </Text>\n <Box marginTop={1}>\n <Text>\n Press <Text color={theme.suggestion}>Enter</Text> to continue to the\n model selection screen.\n </Text>\n </Box>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const steps: OnboardingStep[] = []\n steps.push({ id: 'theme', component: themeStep })\n steps.push({ id: 'usage', component: usageStep })\n\n steps.push({ id: 'model', component: modelStep })\n\n // If we're showing the model selector screen, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={handleModelSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n )\n }\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n {PRODUCT_NAME}{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n {steps[currentStepIndex]?.component}\n </Box>\n </>\n </Box>\n )\n}\n\nexport function WelcomeBox(): React.ReactNode {\n const theme = getTheme()\n return (\n <Box\n borderColor={theme.minto}\n borderStyle=\"round\"\n paddingX={1}\n width={MIN_LOGO_WIDTH}\n >\n <Text>\n <Text color={theme.minto}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> research preview!\n </Text>\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { useState } from 'react'\nimport { PRODUCT_NAME } from '@constants/product'\nimport { Box, Newline, Text, useInput } from 'ink'\nimport {\n getGlobalConfig,\n saveGlobalConfig,\n DEFAULT_GLOBAL_CONFIG,\n ProviderType,\n} from '@utils/config'\nimport { OrderedList } from '@inkjs/ui'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport { MIN_LOGO_WIDTH } from './Logo'\nimport { Select } from './CustomSelect/select'\nimport { StructuredDiff } from './StructuredDiff'\nimport { getTheme, type ThemeNames } from '@utils/theme'\nimport { clearTerminal } from '@utils/terminal'\nimport { PressEnterToContinue } from './PressEnterToContinue'\nimport { ModelSelector } from './ModelSelector'\nimport { SEMANTIC_COLORS } from '@constants/colors'\ntype StepId = 'theme' | 'usage' | 'providers' | 'model'\n\ninterface OnboardingStep {\n id: StepId\n component: React.ReactNode\n}\n\ntype Props = {\n onDone(): void\n}\n\nexport function Onboarding({ onDone }: Props): React.ReactNode {\n const [currentStepIndex, setCurrentStepIndex] = useState(0)\n const [showModelSelector, setShowModelSelector] = useState(false)\n const config = getGlobalConfig()\n\n const [selectedTheme, setSelectedTheme] = useState(\n DEFAULT_GLOBAL_CONFIG.theme,\n )\n const theme = getTheme()\n function goToNextStep() {\n if (currentStepIndex < steps.length - 1) {\n const nextIndex = currentStepIndex + 1\n setCurrentStepIndex(nextIndex)\n }\n }\n\n function handleThemeSelection(newTheme: string) {\n saveGlobalConfig({\n ...config,\n theme: newTheme as ThemeNames,\n })\n goToNextStep()\n }\n\n function handleThemePreview(newTheme: string) {\n setSelectedTheme(newTheme as ThemeNames)\n }\n\n function handleProviderSelectionDone() {\n // After model selection is done, go to the next step\n goToNextStep()\n }\n\n function handleModelSelectionDone() {\n // After final model selection is done, complete onboarding\n onDone()\n }\n\n // Disable exit handler when showing ModelSelector to prevent listener accumulation\n const exitState = useExitOnCtrlCD(() => process.exit(0), {\n isActive: !showModelSelector,\n })\n\n // Only listen when not showing ModelSelector\n useInput(\n async (_, key) => {\n const currentStep = steps[currentStepIndex]\n if (\n key.return &&\n currentStep &&\n ['usage', 'providers', 'model'].includes(currentStep.id)\n ) {\n if (currentStep.id === 'model') {\n // Navigate to ModelSelector component\n setShowModelSelector(true)\n } else if (currentStepIndex === steps.length - 1) {\n onDone()\n } else {\n // HACK: for some reason there's now a jump here otherwise :(\n await clearTerminal()\n goToNextStep()\n }\n }\n },\n { isActive: !showModelSelector },\n )\n\n // Define all onboarding steps\n const themeStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text>Let&apos;s get started.</Text>\n <Box flexDirection=\"column\">\n <Text bold>Choose the option that looks best when you select it:</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n To change this later, run /config\n </Text>\n </Box>\n <Select\n options={[\n { label: 'Light text', value: 'dark' },\n { label: 'Dark text', value: 'light' },\n {\n label: 'Light text (colorblind-friendly)',\n value: 'dark-daltonized',\n },\n {\n label: 'Dark text (colorblind-friendly)',\n value: 'light-daltonized',\n },\n ]}\n onFocus={handleThemePreview}\n onChange={handleThemeSelection}\n />\n <Box flexDirection=\"column\">\n <Box\n paddingLeft={1}\n marginRight={1}\n borderStyle=\"round\"\n borderColor={SEMANTIC_COLORS.dim}\n flexDirection=\"column\"\n >\n <StructuredDiff\n patch={{\n oldStart: 1,\n newStart: 1,\n oldLines: 3,\n newLines: 3,\n lines: [\n 'function greet() {',\n '- console.log(\"Hello, World!\");',\n '+ console.log(\"Hello, anon!\");',\n '}',\n ],\n }}\n dim={false}\n width={40}\n overrideTheme={selectedTheme}\n />\n </Box>\n </Box>\n </Box>\n )\n\n const providersStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Box flexDirection=\"column\" width={70}>\n <Text color={theme.secondaryText}>\n Next, let's select your preferred AI provider and model.\n </Text>\n </Box>\n <ModelSelector\n onDone={handleProviderSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n </Box>\n )\n\n const usageStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Using {PRODUCT_NAME} effectively:</Text>\n <Box flexDirection=\"column\" width={70}>\n <OrderedList children={[]}>\n <OrderedList.Item children={[]}>\n <Text>\n Start in your project directory\n <Newline />\n <Text color={theme.secondaryText}>\n Files are automatically added to context when needed.\n </Text>\n <Newline />\n </Text>\n </OrderedList.Item>\n <OrderedList.Item children={[]}>\n <Text>\n Use {PRODUCT_NAME} as a development partner\n <Newline />\n <Text color={theme.secondaryText}>\n Get help with file analysis, editing, bash commands,\n <Newline />\n and git history.\n <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n <OrderedList.Item children={[]}>\n <Text>\n Provide clear context\n <Newline />\n <Text color={theme.secondaryText}>\n Be as specific as you would with another engineer. <Newline />\n The better the context, the better the results. <Newline />\n </Text>\n </Text>\n </OrderedList.Item>\n </OrderedList>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const modelStep = (\n <Box flexDirection=\"column\" gap={1} paddingLeft={1}>\n <Text bold>Configure your models:</Text>\n <Box flexDirection=\"column\" width={70}>\n <Text>\n You can customize which models {PRODUCT_NAME} uses for different\n tasks.\n <Newline />\n <Text color={theme.secondaryText}>\n Let's set up your preferred models for large and small tasks.\n </Text>\n </Text>\n <Box marginTop={1}>\n <Text>\n Press <Text color={theme.suggestion}>Enter</Text> to continue to the\n model selection screen.\n </Text>\n </Box>\n </Box>\n <PressEnterToContinue />\n </Box>\n )\n\n const steps: OnboardingStep[] = []\n steps.push({ id: 'theme', component: themeStep })\n steps.push({ id: 'usage', component: usageStep })\n\n steps.push({ id: 'model', component: modelStep })\n\n // If we're showing the model selector screen, render it directly\n if (showModelSelector) {\n return (\n <ModelSelector\n onDone={handleModelSelectionDone}\n skipModelType={true}\n isOnboarding={true}\n />\n )\n }\n\n return (\n <Box flexDirection=\"column\" gap={1}>\n <>\n <Box flexDirection=\"column\" gap={1}>\n <Text bold>\n {PRODUCT_NAME}{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n {steps[currentStepIndex]?.component}\n </Box>\n </>\n </Box>\n )\n}\n\nexport function WelcomeBox(): React.ReactNode {\n const theme = getTheme()\n return (\n <Box\n borderColor={theme.minto}\n borderStyle=\"round\"\n paddingX={1}\n width={MIN_LOGO_WIDTH}\n >\n <Text>\n <Text color={theme.minto}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> research preview!\n </Text>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,130 @@
1
+ import React, { memo } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { SEMANTIC_COLORS } from "../constants/colors.js";
4
+ const Section = memo(function Section2({
5
+ icon,
6
+ title,
7
+ count,
8
+ hint,
9
+ children
10
+ }) {
11
+ if (count === 0) return null;
12
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, icon, " "), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, title), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.brand }, " ", count), hint && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, " (", hint, ")")), children);
13
+ });
14
+ const FileList = memo(function FileList2({ files, maxToShow }) {
15
+ const displayFiles = files.slice(0, maxToShow);
16
+ const remaining = files.length - maxToShow;
17
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, displayFiles.map((file, idx) => /* @__PURE__ */ React.createElement(React.Fragment, { key: `${file}-${idx}` }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, formatFilePath(file)))), remaining > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "...and ", remaining, " more"));
18
+ });
19
+ const ModifiedFileList = memo(function ModifiedFileList2({
20
+ files,
21
+ maxToShow
22
+ }) {
23
+ const displayFiles = files.slice(0, maxToShow);
24
+ const remaining = files.length - maxToShow;
25
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, displayFiles.map((file, idx) => /* @__PURE__ */ React.createElement(Box, { key: `${file.path}-${idx}`, flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, formatFilePath(file.path), " "), (file.added > 0 || file.removed > 0) && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "(", file.added > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.success }, "+", file.added), file.added > 0 && file.removed > 0 && /* @__PURE__ */ React.createElement(Text, null, "/"), file.removed > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.error }, "-", file.removed), ")"))), remaining > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "...and ", remaining, " more"));
26
+ });
27
+ const CommandList = memo(function CommandList2({
28
+ commands,
29
+ maxToShow
30
+ }) {
31
+ const displayCommands = commands.slice(0, maxToShow);
32
+ const remaining = commands.length - maxToShow;
33
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, displayCommands.map((cmd, idx) => /* @__PURE__ */ React.createElement(React.Fragment, { key: `cmd-${idx}` }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, truncateCommand(cmd, 60)))), remaining > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "...and ", remaining, " more"));
34
+ });
35
+ function formatFilePath(filePath) {
36
+ const parts = filePath.split("/");
37
+ if (parts.length <= 2) return filePath;
38
+ return ".../" + parts.slice(-2).join("/");
39
+ }
40
+ function truncateCommand(command, maxLength) {
41
+ const normalized = command.replace(/\s+/g, " ").trim();
42
+ if (normalized.length <= maxLength) return normalized;
43
+ return normalized.slice(0, maxLength - 1) + "...";
44
+ }
45
+ function hasSummaryContent(summary) {
46
+ return summary.filesRead.length > 0 || summary.filesModified.length > 0 || summary.filesCreated.length > 0 || summary.commandsRun.length > 0 || summary.tasksCompleted > 0 || summary.webSearches > 0;
47
+ }
48
+ const OperationSummary = memo(function OperationSummary2({
49
+ summary,
50
+ showUndo = false,
51
+ maxFilesToShow = 3,
52
+ maxCommandsToShow = 5
53
+ }) {
54
+ if (!hasSummaryContent(summary)) {
55
+ return null;
56
+ }
57
+ const totalModifiedStats = summary.filesModified.reduce(
58
+ (acc, file) => ({
59
+ added: acc.added + file.added,
60
+ removed: acc.removed + file.removed
61
+ }),
62
+ { added: 0, removed: 0 }
63
+ );
64
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.brand, bold: true }, "Session Summary"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, summary.filesRead.length > 0 && /* @__PURE__ */ React.createElement(
65
+ Section,
66
+ {
67
+ icon: "[read]",
68
+ title: "Files read:",
69
+ count: summary.filesRead.length
70
+ },
71
+ /* @__PURE__ */ React.createElement(FileList, { files: summary.filesRead, maxToShow: maxFilesToShow })
72
+ ), summary.filesModified.length > 0 && /* @__PURE__ */ React.createElement(
73
+ Section,
74
+ {
75
+ icon: "[edit]",
76
+ title: "Files modified:",
77
+ count: summary.filesModified.length,
78
+ hint: showUndo ? `/undo to revert${totalModifiedStats.added > 0 || totalModifiedStats.removed > 0 ? ` | +${totalModifiedStats.added}/-${totalModifiedStats.removed}` : ""}` : totalModifiedStats.added > 0 || totalModifiedStats.removed > 0 ? `+${totalModifiedStats.added}/-${totalModifiedStats.removed}` : void 0
79
+ },
80
+ /* @__PURE__ */ React.createElement(
81
+ ModifiedFileList,
82
+ {
83
+ files: summary.filesModified,
84
+ maxToShow: maxFilesToShow
85
+ }
86
+ )
87
+ ), summary.filesCreated.length > 0 && /* @__PURE__ */ React.createElement(
88
+ Section,
89
+ {
90
+ icon: "[new]",
91
+ title: "Files created:",
92
+ count: summary.filesCreated.length
93
+ },
94
+ /* @__PURE__ */ React.createElement(FileList, { files: summary.filesCreated, maxToShow: maxFilesToShow })
95
+ ), summary.commandsRun.length > 0 && /* @__PURE__ */ React.createElement(
96
+ Section,
97
+ {
98
+ icon: "[cmd]",
99
+ title: "Commands run:",
100
+ count: summary.commandsRun.length
101
+ },
102
+ /* @__PURE__ */ React.createElement(
103
+ CommandList,
104
+ {
105
+ commands: summary.commandsRun,
106
+ maxToShow: maxCommandsToShow
107
+ }
108
+ )
109
+ ), summary.tasksCompleted > 0 && /* @__PURE__ */ React.createElement(
110
+ Section,
111
+ {
112
+ icon: "[task]",
113
+ title: "Tasks completed:",
114
+ count: summary.tasksCompleted
115
+ }
116
+ ), summary.webSearches > 0 && /* @__PURE__ */ React.createElement(
117
+ Section,
118
+ {
119
+ icon: "[web]",
120
+ title: "Web searches:",
121
+ count: summary.webSearches
122
+ }
123
+ )));
124
+ });
125
+ var OperationSummary_default = OperationSummary;
126
+ export {
127
+ OperationSummary,
128
+ OperationSummary_default as default
129
+ };
130
+ //# sourceMappingURL=OperationSummary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/OperationSummary.tsx"],
4
+ "sourcesContent": ["/**\n * Operation Summary Component\n *\n * Displays a summary of operations performed during a session.\n * Shows files read, modified, created, and commands run in a compact format.\n *\n * Usage:\n * ```tsx\n * import { OperationSummary } from '@components/OperationSummary'\n * import { getOperationSummary } from '@core/operationTracker'\n *\n * const summary = getOperationSummary()\n * <OperationSummary summary={summary} showUndo={true} />\n * ```\n */\n\nimport React, { memo } from 'react'\nimport { Box, Text } from 'ink'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport type { OperationSummary as OperationSummaryType } from '@core/operationTracker'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface OperationSummaryProps {\n /** Aggregated summary of operations */\n summary: OperationSummaryType\n\n /** Show /undo hint when true (for file modifications) */\n showUndo?: boolean\n\n /** Maximum number of files to show in each category */\n maxFilesToShow?: number\n\n /** Maximum number of commands to show */\n maxCommandsToShow?: number\n}\n\n// ============================================================================\n// Helper Components\n// ============================================================================\n\ninterface SectionProps {\n icon: string\n title: string\n count: number\n hint?: string\n children?: React.ReactNode\n}\n\n/**\n * Section header with icon, title, count, and optional hint\n */\nconst Section = memo(function Section({\n icon,\n title,\n count,\n hint,\n children,\n}: SectionProps) {\n if (count === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text color={SEMANTIC_COLORS.secondary}>{icon} </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{title}</Text>\n <Text color={SEMANTIC_COLORS.brand}> {count}</Text>\n {hint && <Text color={SEMANTIC_COLORS.muted}> ({hint})</Text>}\n </Box>\n {children}\n </Box>\n )\n})\n\ninterface FileListProps {\n files: string[]\n maxToShow: number\n}\n\n/**\n * List of file paths with truncation\n */\nconst FileList = memo(function FileList({ files, maxToShow }: FileListProps) {\n const displayFiles = files.slice(0, maxToShow)\n const remaining = files.length - maxToShow\n\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {displayFiles.map((file, idx) => (\n <React.Fragment key={`${file}-${idx}`}>\n <Text color={SEMANTIC_COLORS.dim}>{formatFilePath(file)}</Text>\n </React.Fragment>\n ))}\n {remaining > 0 && (\n <Text color={SEMANTIC_COLORS.muted}>...and {remaining} more</Text>\n )}\n </Box>\n )\n})\n\ninterface ModifiedFileListProps {\n files: { path: string; added: number; removed: number }[]\n maxToShow: number\n}\n\n/**\n * List of modified files with +added/-removed stats\n */\nconst ModifiedFileList = memo(function ModifiedFileList({\n files,\n maxToShow,\n}: ModifiedFileListProps) {\n const displayFiles = files.slice(0, maxToShow)\n const remaining = files.length - maxToShow\n\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {displayFiles.map((file, idx) => (\n <Box key={`${file.path}-${idx}`} flexDirection=\"row\">\n <Text color={SEMANTIC_COLORS.dim}>{formatFilePath(file.path)} </Text>\n {(file.added > 0 || file.removed > 0) && (\n <Text color={SEMANTIC_COLORS.muted}>\n (\n {file.added > 0 && (\n <Text color={SEMANTIC_COLORS.success}>+{file.added}</Text>\n )}\n {file.added > 0 && file.removed > 0 && <Text>/</Text>}\n {file.removed > 0 && (\n <Text color={SEMANTIC_COLORS.error}>-{file.removed}</Text>\n )}\n )\n </Text>\n )}\n </Box>\n ))}\n {remaining > 0 && (\n <Text color={SEMANTIC_COLORS.muted}>...and {remaining} more</Text>\n )}\n </Box>\n )\n})\n\ninterface CommandListProps {\n commands: string[]\n maxToShow: number\n}\n\n/**\n * List of commands with truncation\n */\nconst CommandList = memo(function CommandList({\n commands,\n maxToShow,\n}: CommandListProps) {\n const displayCommands = commands.slice(0, maxToShow)\n const remaining = commands.length - maxToShow\n\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n {displayCommands.map((cmd, idx) => (\n <React.Fragment key={`cmd-${idx}`}>\n <Text color={SEMANTIC_COLORS.dim}>{truncateCommand(cmd, 60)}</Text>\n </React.Fragment>\n ))}\n {remaining > 0 && (\n <Text color={SEMANTIC_COLORS.muted}>...and {remaining} more</Text>\n )}\n </Box>\n )\n})\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Format a file path for display\n * Shows only the last 2 path components for brevity\n */\nfunction formatFilePath(filePath: string): string {\n const parts = filePath.split('/')\n if (parts.length <= 2) return filePath\n return '.../' + parts.slice(-2).join('/')\n}\n\n/**\n * Truncate a command string for display\n */\nfunction truncateCommand(command: string, maxLength: number): string {\n // Remove newlines and normalize whitespace\n const normalized = command.replace(/\\s+/g, ' ').trim()\n if (normalized.length <= maxLength) return normalized\n return normalized.slice(0, maxLength - 1) + '...'\n}\n\n/**\n * Check if summary has any operations\n */\nfunction hasSummaryContent(summary: OperationSummaryType): boolean {\n return (\n summary.filesRead.length > 0 ||\n summary.filesModified.length > 0 ||\n summary.filesCreated.length > 0 ||\n summary.commandsRun.length > 0 ||\n summary.tasksCompleted > 0 ||\n summary.webSearches > 0\n )\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * Operation Summary Component\n *\n * Displays a compact summary of all operations performed during a session.\n */\nexport const OperationSummary = memo(function OperationSummary({\n summary,\n showUndo = false,\n maxFilesToShow = 3,\n maxCommandsToShow = 5,\n}: OperationSummaryProps) {\n // Don't render if no operations\n if (!hasSummaryContent(summary)) {\n return null\n }\n\n const totalModifiedStats = summary.filesModified.reduce(\n (acc, file) => ({\n added: acc.added + file.added,\n removed: acc.removed + file.removed,\n }),\n { added: 0, removed: 0 },\n )\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {/* Header */}\n <Text color={SEMANTIC_COLORS.brand} bold>\n Session Summary\n </Text>\n\n <Box flexDirection=\"column\" marginTop={1}>\n {/* Files Read */}\n {summary.filesRead.length > 0 && (\n <Section\n icon=\"[read]\"\n title=\"Files read:\"\n count={summary.filesRead.length}\n >\n <FileList files={summary.filesRead} maxToShow={maxFilesToShow} />\n </Section>\n )}\n\n {/* Files Modified */}\n {summary.filesModified.length > 0 && (\n <Section\n icon=\"[edit]\"\n title=\"Files modified:\"\n count={summary.filesModified.length}\n hint={\n showUndo\n ? `/undo to revert${totalModifiedStats.added > 0 || totalModifiedStats.removed > 0 ? ` | +${totalModifiedStats.added}/-${totalModifiedStats.removed}` : ''}`\n : totalModifiedStats.added > 0 || totalModifiedStats.removed > 0\n ? `+${totalModifiedStats.added}/-${totalModifiedStats.removed}`\n : undefined\n }\n >\n <ModifiedFileList\n files={summary.filesModified}\n maxToShow={maxFilesToShow}\n />\n </Section>\n )}\n\n {/* Files Created */}\n {summary.filesCreated.length > 0 && (\n <Section\n icon=\"[new]\"\n title=\"Files created:\"\n count={summary.filesCreated.length}\n >\n <FileList files={summary.filesCreated} maxToShow={maxFilesToShow} />\n </Section>\n )}\n\n {/* Commands Run */}\n {summary.commandsRun.length > 0 && (\n <Section\n icon=\"[cmd]\"\n title=\"Commands run:\"\n count={summary.commandsRun.length}\n >\n <CommandList\n commands={summary.commandsRun}\n maxToShow={maxCommandsToShow}\n />\n </Section>\n )}\n\n {/* Tasks Completed */}\n {summary.tasksCompleted > 0 && (\n <Section\n icon=\"[task]\"\n title=\"Tasks completed:\"\n count={summary.tasksCompleted}\n />\n )}\n\n {/* Web Searches */}\n {summary.webSearches > 0 && (\n <Section\n icon=\"[web]\"\n title=\"Web searches:\"\n count={summary.webSearches}\n />\n )}\n </Box>\n </Box>\n )\n})\n\nexport default OperationSummary\n"],
5
+ "mappings": "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",
6
+ "names": ["Section", "FileList", "ModifiedFileList", "CommandList", "OperationSummary"]
7
+ }
@@ -0,0 +1,74 @@
1
+ import { Box, Text } from "ink";
2
+ import * as React from "react";
3
+ import { useRef } from "react";
4
+ import { getTheme } from "../utils/theme.js";
5
+ import { useUnifiedAnimation } from "../utils/animationManager.js";
6
+ function ProgressBar({
7
+ progress,
8
+ width = 20,
9
+ showPercent = true,
10
+ label,
11
+ indeterminate = false,
12
+ filledChar = "\u2588",
13
+ emptyChar = "\u2591",
14
+ filledColor,
15
+ emptyColor
16
+ }) {
17
+ const theme = getTheme();
18
+ const startTimeRef = useRef(Date.now());
19
+ const { spinnerFrame } = useUnifiedAnimation({
20
+ enabled: indeterminate,
21
+ startTime: startTimeRef.current,
22
+ spinnerFrameCount: width * 2,
23
+ componentId: "progress-bar"
24
+ });
25
+ const clampedProgress = Math.max(0, Math.min(100, progress));
26
+ if (indeterminate) {
27
+ const segmentWidth = Math.ceil(width / 4);
28
+ const effectivePos = spinnerFrame < width ? spinnerFrame : width * 2 - spinnerFrame - segmentWidth;
29
+ const beforeSegment = Math.max(0, effectivePos);
30
+ const afterSegment = Math.max(0, width - effectivePos - segmentWidth);
31
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, label && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, label, " "), /* @__PURE__ */ React.createElement(Text, { color: emptyColor || theme.dimmedText }, emptyChar.repeat(beforeSegment)), /* @__PURE__ */ React.createElement(Text, { color: filledColor || theme.minto }, filledChar.repeat(Math.min(segmentWidth, width - beforeSegment))), /* @__PURE__ */ React.createElement(Text, { color: emptyColor || theme.dimmedText }, emptyChar.repeat(afterSegment)));
32
+ }
33
+ const filled = Math.round(clampedProgress / 100 * width);
34
+ const empty = width - filled;
35
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, label && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, label, " "), /* @__PURE__ */ React.createElement(Text, { color: filledColor || theme.success }, filledChar.repeat(filled)), /* @__PURE__ */ React.createElement(Text, { color: emptyColor || theme.dimmedText }, emptyChar.repeat(empty)), showPercent && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", Math.round(clampedProgress), "%"));
36
+ }
37
+ function ProgressIndicator({
38
+ progress,
39
+ showText = true
40
+ }) {
41
+ const theme = getTheme();
42
+ const clampedProgress = Math.max(0, Math.min(100, progress));
43
+ const getIndicator = () => {
44
+ if (clampedProgress < 25) return "\u25CB";
45
+ if (clampedProgress < 50) return "\u25D4";
46
+ if (clampedProgress < 75) return "\u25D1";
47
+ if (clampedProgress < 100) return "\u25D5";
48
+ return "\u25CF";
49
+ };
50
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.minto }, getIndicator()), showText && /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, " ", Math.round(clampedProgress), "%"));
51
+ }
52
+ function StepProgress({
53
+ current,
54
+ total,
55
+ labels,
56
+ showLabels = true
57
+ }) {
58
+ const theme = getTheme();
59
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 1 }, Array.from({ length: total }, (_, i) => {
60
+ const stepNum = i + 1;
61
+ const isComplete = stepNum < current;
62
+ const isCurrent = stepNum === current;
63
+ const label = labels?.[i];
64
+ const color = isComplete ? theme.success : isCurrent ? theme.minto : theme.dimmedText;
65
+ const symbol = isComplete ? "\u25CF" : isCurrent ? "\u25D0" : "\u25CB";
66
+ return /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, symbol), showLabels && label && /* @__PURE__ */ React.createElement(Text, { color }, " ", label), i < total - 1 && /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \u2192 "));
67
+ }));
68
+ }
69
+ export {
70
+ ProgressBar,
71
+ ProgressIndicator,
72
+ StepProgress
73
+ };
74
+ //# sourceMappingURL=ProgressBar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/ProgressBar.tsx"],
4
+ "sourcesContent": ["/**\n * ProgressBar - Visual progress indicator for long-running operations\n *\n * Displays progress as a horizontal bar with optional percentage:\n *\n * \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 45%\n *\n * Features:\n * - Configurable width and style\n * - Optional percentage display\n * - Theme-aware colors\n * - Indeterminate mode with animation\n * - Uses unified animation manager to reduce screen flickering\n */\n\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { useRef } from 'react'\nimport { getTheme } from '@utils/theme'\nimport { useUnifiedAnimation } from '@utils/animationManager'\n\nexport interface ProgressBarProps {\n /** Progress value (0-100) */\n progress: number\n /** Bar width in characters (default: 20) */\n width?: number\n /** Show percentage text (default: true) */\n showPercent?: boolean\n /** Label text to show before the bar */\n label?: string\n /** Indeterminate mode - shows animated bouncing bar */\n indeterminate?: boolean\n /** Custom filled character (default: \u2588) */\n filledChar?: string\n /** Custom empty character (default: \u2591) */\n emptyChar?: string\n /** Color override for filled portion */\n filledColor?: string\n /** Color override for empty portion */\n emptyColor?: string\n}\n\n/**\n * ProgressBar component for displaying operation progress\n *\n * Usage:\n * ```tsx\n * // Basic usage\n * <ProgressBar progress={45} />\n *\n * // With label\n * <ProgressBar progress={75} label=\"Downloading\" />\n *\n * // Indeterminate (unknown progress)\n * <ProgressBar indeterminate />\n *\n * // Custom styling\n * <ProgressBar progress={60} width={30} filledChar=\"\u2593\" emptyChar=\"\u2591\" />\n * ```\n */\nexport function ProgressBar({\n progress,\n width = 20,\n showPercent = true,\n label,\n indeterminate = false,\n filledChar = '\u2588',\n emptyChar = '\u2591',\n filledColor,\n emptyColor,\n}: ProgressBarProps): React.ReactElement {\n const theme = getTheme()\n const startTimeRef = useRef(Date.now())\n\n // Use unified animation manager for indeterminate mode\n // spinnerFrameCount = width * 2 for bouncing animation\n const { spinnerFrame } = useUnifiedAnimation({\n enabled: indeterminate,\n startTime: startTimeRef.current,\n spinnerFrameCount: width * 2,\n componentId: 'progress-bar',\n })\n\n // Calculate bar segments\n const clampedProgress = Math.max(0, Math.min(100, progress))\n\n if (indeterminate) {\n // Indeterminate mode: bouncing segment\n const segmentWidth = Math.ceil(width / 4)\n const effectivePos =\n spinnerFrame < width\n ? spinnerFrame\n : width * 2 - spinnerFrame - segmentWidth\n\n const beforeSegment = Math.max(0, effectivePos)\n const afterSegment = Math.max(0, width - effectivePos - segmentWidth)\n\n return (\n <Box flexDirection=\"row\">\n {label && <Text color={theme.secondaryText}>{label} </Text>}\n <Text color={emptyColor || theme.dimmedText}>\n {emptyChar.repeat(beforeSegment)}\n </Text>\n <Text color={filledColor || theme.minto}>\n {filledChar.repeat(Math.min(segmentWidth, width - beforeSegment))}\n </Text>\n <Text color={emptyColor || theme.dimmedText}>\n {emptyChar.repeat(afterSegment)}\n </Text>\n </Box>\n )\n }\n\n // Determinate mode: fixed progress bar\n const filled = Math.round((clampedProgress / 100) * width)\n const empty = width - filled\n\n return (\n <Box flexDirection=\"row\">\n {label && <Text color={theme.secondaryText}>{label} </Text>}\n <Text color={filledColor || theme.success}>\n {filledChar.repeat(filled)}\n </Text>\n <Text color={emptyColor || theme.dimmedText}>\n {emptyChar.repeat(empty)}\n </Text>\n {showPercent && (\n <Text color={theme.secondaryText}> {Math.round(clampedProgress)}%</Text>\n )}\n </Box>\n )\n}\n\n/**\n * Compact progress indicator for inline use\n * Shows just percentage or a small visual indicator\n */\nexport function ProgressIndicator({\n progress,\n showText = true,\n}: {\n progress: number\n showText?: boolean\n}): React.ReactElement {\n const theme = getTheme()\n const clampedProgress = Math.max(0, Math.min(100, progress))\n\n // Visual indicator based on progress ranges\n const getIndicator = () => {\n if (clampedProgress < 25) return '\u25CB'\n if (clampedProgress < 50) return '\u25D4'\n if (clampedProgress < 75) return '\u25D1'\n if (clampedProgress < 100) return '\u25D5'\n return '\u25CF'\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.minto}>{getIndicator()}</Text>\n {showText && (\n <Text color={theme.secondaryText}> {Math.round(clampedProgress)}%</Text>\n )}\n </Box>\n )\n}\n\n/**\n * Step progress indicator for multi-step operations\n *\n * Usage:\n * ```tsx\n * <StepProgress current={2} total={5} labels={['Parse', 'Analyze', 'Transform', 'Generate', 'Complete']} />\n * ```\n */\nexport function StepProgress({\n current,\n total,\n labels,\n showLabels = true,\n}: {\n current: number\n total: number\n labels?: string[]\n showLabels?: boolean\n}): React.ReactElement {\n const theme = getTheme()\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n {Array.from({ length: total }, (_, i) => {\n const stepNum = i + 1\n const isComplete = stepNum < current\n const isCurrent = stepNum === current\n const label = labels?.[i]\n\n const color = isComplete\n ? theme.success\n : isCurrent\n ? theme.minto\n : theme.dimmedText\n\n const symbol = isComplete ? '\u25CF' : isCurrent ? '\u25D0' : '\u25CB'\n\n return (\n <Box key={i} flexDirection=\"row\">\n <Text color={color}>{symbol}</Text>\n {showLabels && label && <Text color={color}> {label}</Text>}\n {i < total - 1 && <Text color={theme.dimmedText}> \u2192 </Text>}\n </Box>\n )\n })}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }