@within-7/minto 0.4.1 → 0.4.2

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 (391) hide show
  1. package/dist/Tool.js +7 -0
  2. package/dist/Tool.js.map +2 -2
  3. package/dist/commands/agents/AgentsCommand.js +1 -1
  4. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  5. package/dist/commands/agents/constants.js +2 -2
  6. package/dist/commands/agents/constants.js.map +2 -2
  7. package/dist/commands/clear.js +4 -3
  8. package/dist/commands/clear.js.map +2 -2
  9. package/dist/commands/compact.js +2 -2
  10. package/dist/commands/compact.js.map +1 -1
  11. package/dist/commands/context.js +3 -1
  12. package/dist/commands/context.js.map +2 -2
  13. package/dist/commands/login.js +128 -0
  14. package/dist/commands/login.js.map +7 -0
  15. package/dist/commands/memory.js +33 -82
  16. package/dist/commands/memory.js.map +2 -2
  17. package/dist/commands/quit.js +3 -1
  18. package/dist/commands/quit.js.map +2 -2
  19. package/dist/commands/resume.js +39 -239
  20. package/dist/commands/resume.js.map +2 -2
  21. package/dist/commands/tasks.js +1 -1
  22. package/dist/commands/tasks.js.map +2 -2
  23. package/dist/commands/terminalSetup.js +6 -2
  24. package/dist/commands/terminalSetup.js.map +2 -2
  25. package/dist/commands.js +2 -0
  26. package/dist/commands.js.map +2 -2
  27. package/dist/components/AgentDetailView.js +126 -0
  28. package/dist/components/AgentDetailView.js.map +7 -0
  29. package/dist/components/AgentThinkingBlock.js +1 -1
  30. package/dist/components/AgentThinkingBlock.js.map +2 -2
  31. package/dist/components/AgentViewBanner.js +22 -0
  32. package/dist/components/AgentViewBanner.js.map +7 -0
  33. package/dist/components/HeaderBar.js +1 -1
  34. package/dist/components/HeaderBar.js.map +2 -2
  35. package/dist/components/Help.js +8 -1
  36. package/dist/components/Help.js.map +2 -2
  37. package/dist/components/HotkeyHelpPanel.js +26 -8
  38. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  39. package/dist/components/IdleNotificationBar.js +10 -0
  40. package/dist/components/IdleNotificationBar.js.map +7 -0
  41. package/dist/components/ModelSelector/ModelSelector.js +55 -20
  42. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  43. package/dist/components/PromptInput.js +186 -115
  44. package/dist/components/PromptInput.js.map +2 -2
  45. package/dist/components/RewindPanel.js +272 -0
  46. package/dist/components/RewindPanel.js.map +7 -0
  47. package/dist/components/Spinner.js +10 -21
  48. package/dist/components/Spinner.js.map +2 -2
  49. package/dist/components/StreamingTextPreview.js +29 -0
  50. package/dist/components/StreamingTextPreview.js.map +7 -0
  51. package/dist/components/SubagentBlock.js +3 -2
  52. package/dist/components/SubagentBlock.js.map +2 -2
  53. package/dist/components/SubagentProgress.js +4 -4
  54. package/dist/components/SubagentProgress.js.map +2 -2
  55. package/dist/components/TabbedListView/SearchInput.js +1 -1
  56. package/dist/components/TabbedListView/SearchInput.js.map +2 -2
  57. package/dist/components/TabbedListView/TabbedListView.js +87 -41
  58. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  59. package/dist/components/TaskCard.js +4 -4
  60. package/dist/components/TaskCard.js.map +2 -2
  61. package/dist/components/TeamMemberPanel.js +107 -0
  62. package/dist/components/TeamMemberPanel.js.map +7 -0
  63. package/dist/components/ThinkingSelector.js +84 -0
  64. package/dist/components/ThinkingSelector.js.map +7 -0
  65. package/dist/components/TitledDivider.js +26 -0
  66. package/dist/components/TitledDivider.js.map +7 -0
  67. package/dist/components/TodoPanel.js +31 -30
  68. package/dist/components/TodoPanel.js.map +2 -2
  69. package/dist/components/TokenWarning.js +28 -7
  70. package/dist/components/TokenWarning.js.map +2 -2
  71. package/dist/components/messages/AssistantTextMessage.js +5 -2
  72. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  73. package/dist/components/messages/AssistantToolUseMessage.js +9 -1
  74. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  75. package/dist/components/messages/DefaultToolResultFallback.js +11 -0
  76. package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
  77. package/dist/components/messages/ParallelTasksGroupView.js +14 -6
  78. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  79. package/dist/components/messages/TaskInModuleView.js +27 -27
  80. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  81. package/dist/components/messages/UserGuidanceMessage.js +26 -0
  82. package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
  83. package/dist/components/messages/UserPromptMessage.js +2 -1
  84. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  85. package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
  86. package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
  87. package/dist/components/messages/UserTextMessage.js +8 -0
  88. package/dist/components/messages/UserTextMessage.js.map +2 -2
  89. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
  90. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
  91. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
  92. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
  93. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
  94. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  95. package/dist/components/permissions/PermissionRequest.js +4 -0
  96. package/dist/components/permissions/PermissionRequest.js.map +2 -2
  97. package/dist/components/permissions/PlanApprovalRequest.js +164 -0
  98. package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
  99. package/dist/constants/agentTeams.js +17 -0
  100. package/dist/constants/agentTeams.js.map +7 -0
  101. package/dist/constants/macros.js +2 -1
  102. package/dist/constants/macros.js.map +2 -2
  103. package/dist/constants/prompts/agentPrompt.js +1 -0
  104. package/dist/constants/prompts/agentPrompt.js.map +2 -2
  105. package/dist/constants/prompts/autoMemory.js +39 -0
  106. package/dist/constants/prompts/autoMemory.js.map +7 -0
  107. package/dist/constants/prompts/codeConventions.js +1 -13
  108. package/dist/constants/prompts/codeConventions.js.map +2 -2
  109. package/dist/constants/prompts/doingTasks.js +21 -2
  110. package/dist/constants/prompts/doingTasks.js.map +2 -2
  111. package/dist/constants/prompts/envInfo.js +6 -7
  112. package/dist/constants/prompts/envInfo.js.map +2 -2
  113. package/dist/constants/prompts/index.js +27 -5
  114. package/dist/constants/prompts/index.js.map +2 -2
  115. package/dist/constants/prompts/taskManagement.js +2 -43
  116. package/dist/constants/prompts/taskManagement.js.map +2 -2
  117. package/dist/constants/prompts/teamOverlays.js +50 -0
  118. package/dist/constants/prompts/teamOverlays.js.map +7 -0
  119. package/dist/constants/prompts/toneAndStyle.js +4 -29
  120. package/dist/constants/prompts/toneAndStyle.js.map +2 -2
  121. package/dist/constants/prompts/toolUsagePolicy.js +7 -22
  122. package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
  123. package/dist/constants/toolInputExamples.js +2 -2
  124. package/dist/constants/toolInputExamples.js.map +2 -2
  125. package/dist/context.js +39 -6
  126. package/dist/context.js.map +2 -2
  127. package/dist/core/backupManager.js +1 -1
  128. package/dist/core/backupManager.js.map +2 -2
  129. package/dist/core/permissions/rules/planModeRule.js +1 -1
  130. package/dist/core/permissions/rules/planModeRule.js.map +1 -1
  131. package/dist/core/permissions/rules/safeModeRule.js +1 -1
  132. package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
  133. package/dist/engine/AgentEngine.js +902 -0
  134. package/dist/engine/AgentEngine.js.map +7 -0
  135. package/dist/engine/EngineRegistry.js +89 -0
  136. package/dist/engine/EngineRegistry.js.map +7 -0
  137. package/dist/engine/foregroundAdapter.js +191 -0
  138. package/dist/engine/foregroundAdapter.js.map +7 -0
  139. package/dist/engine/index.js +15 -0
  140. package/dist/engine/index.js.map +7 -0
  141. package/dist/engine/types.js +1 -0
  142. package/dist/engine/types.js.map +7 -0
  143. package/dist/entrypoints/cli.js +410 -79
  144. package/dist/entrypoints/cli.js.map +3 -3
  145. package/dist/hooks/useAgentEngine.js +129 -0
  146. package/dist/hooks/useAgentEngine.js.map +7 -0
  147. package/dist/hooks/useAgentTokenStats.js +0 -16
  148. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  149. package/dist/hooks/useCanUseTool.js +47 -2
  150. package/dist/hooks/useCanUseTool.js.map +2 -2
  151. package/dist/hooks/useDeferredLoading.js +4 -1
  152. package/dist/hooks/useDeferredLoading.js.map +2 -2
  153. package/dist/hooks/useIdleNotifications.js +66 -0
  154. package/dist/hooks/useIdleNotifications.js.map +7 -0
  155. package/dist/hooks/useSessionTracking.js +9 -7
  156. package/dist/hooks/useSessionTracking.js.map +2 -2
  157. package/dist/hooks/useTeamMembers.js +51 -0
  158. package/dist/hooks/useTeamMembers.js.map +7 -0
  159. package/dist/i18n/locales/en.js +77 -12
  160. package/dist/i18n/locales/en.js.map +2 -2
  161. package/dist/i18n/locales/zh-CN.js +77 -12
  162. package/dist/i18n/locales/zh-CN.js.map +2 -2
  163. package/dist/i18n/types.js.map +1 -1
  164. package/dist/messages.js.map +2 -2
  165. package/dist/permissions.js +113 -7
  166. package/dist/permissions.js.map +2 -2
  167. package/dist/query.js +135 -37
  168. package/dist/query.js.map +2 -2
  169. package/dist/screens/REPL.js +504 -361
  170. package/dist/screens/REPL.js.map +3 -3
  171. package/dist/screens/ResumeConversation.js +199 -14
  172. package/dist/screens/ResumeConversation.js.map +2 -2
  173. package/dist/services/adapters/base.js.map +1 -1
  174. package/dist/services/agentTeams/backends/headless.js +108 -0
  175. package/dist/services/agentTeams/backends/headless.js.map +7 -0
  176. package/dist/services/agentTeams/backends/inProcess.js +102 -0
  177. package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
  178. package/dist/services/agentTeams/backends/resolver.js +18 -0
  179. package/dist/services/agentTeams/backends/resolver.js.map +7 -0
  180. package/dist/services/agentTeams/backends/tmux.js +168 -0
  181. package/dist/services/agentTeams/backends/tmux.js.map +7 -0
  182. package/dist/services/agentTeams/backends/types.js +1 -0
  183. package/dist/services/agentTeams/backends/types.js.map +7 -0
  184. package/dist/services/agentTeams/heartbeat.js +88 -0
  185. package/dist/services/agentTeams/heartbeat.js.map +7 -0
  186. package/dist/services/agentTeams/index.js +42 -2
  187. package/dist/services/agentTeams/index.js.map +2 -2
  188. package/dist/services/agentTeams/injectionChannel.js +105 -0
  189. package/dist/services/agentTeams/injectionChannel.js.map +7 -0
  190. package/dist/services/agentTeams/mailbox.js +410 -30
  191. package/dist/services/agentTeams/mailbox.js.map +2 -2
  192. package/dist/services/agentTeams/messageFormatter.js +80 -0
  193. package/dist/services/agentTeams/messageFormatter.js.map +7 -0
  194. package/dist/services/agentTeams/permissionDelegation.js +71 -0
  195. package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
  196. package/dist/services/agentTeams/teamEvents.js +45 -0
  197. package/dist/services/agentTeams/teamEvents.js.map +7 -0
  198. package/dist/services/agentTeams/teamManager.js +251 -34
  199. package/dist/services/agentTeams/teamManager.js.map +2 -2
  200. package/dist/services/agentTeams/teamTaskStore.js +290 -61
  201. package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
  202. package/dist/services/agentTeams/teammateSpawner.js +99 -18
  203. package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
  204. package/dist/services/hookExecutor.js +51 -8
  205. package/dist/services/hookExecutor.js.map +2 -2
  206. package/dist/services/llm/anthropicProvider.js +56 -59
  207. package/dist/services/llm/anthropicProvider.js.map +2 -2
  208. package/dist/services/llm/dispatch.js +24 -5
  209. package/dist/services/llm/dispatch.js.map +2 -2
  210. package/dist/services/llm/openaiProvider.js +115 -136
  211. package/dist/services/llm/openaiProvider.js.map +3 -3
  212. package/dist/services/llm/types.js +89 -15
  213. package/dist/services/llm/types.js.map +2 -2
  214. package/dist/services/mcpClient.js +80 -4
  215. package/dist/services/mcpClient.js.map +2 -2
  216. package/dist/services/mintoAuth.js +299 -0
  217. package/dist/services/mintoAuth.js.map +7 -0
  218. package/dist/services/oauth.js +3 -3
  219. package/dist/services/oauth.js.map +2 -2
  220. package/dist/services/openai.js +91 -20
  221. package/dist/services/openai.js.map +2 -2
  222. package/dist/services/plugins/pluginRuntime.js +11 -5
  223. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  224. package/dist/services/plugins/pluginValidation.js +4 -2
  225. package/dist/services/plugins/pluginValidation.js.map +2 -2
  226. package/dist/services/sandbox/sandboxController.js +11 -3
  227. package/dist/services/sandbox/sandboxController.js.map +2 -2
  228. package/dist/services/sessionMemoryInjector.js +77 -0
  229. package/dist/services/sessionMemoryInjector.js.map +7 -0
  230. package/dist/services/systemReminder.js +130 -8
  231. package/dist/services/systemReminder.js.map +2 -2
  232. package/dist/services/taskStore.js +199 -8
  233. package/dist/services/taskStore.js.map +3 -3
  234. package/dist/services/topicDetector.js +169 -0
  235. package/dist/services/topicDetector.js.map +7 -0
  236. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
  237. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  238. package/dist/tools/BashTool/BashTool.js +51 -28
  239. package/dist/tools/BashTool/BashTool.js.map +2 -2
  240. package/dist/tools/BashTool/prompt.js +95 -118
  241. package/dist/tools/BashTool/prompt.js.map +2 -2
  242. package/dist/tools/BashTool/utils.js +39 -1
  243. package/dist/tools/BashTool/utils.js.map +2 -2
  244. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
  245. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
  246. package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
  247. package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
  248. package/dist/tools/FileEditTool/FileEditTool.js +9 -4
  249. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  250. package/dist/tools/FileEditTool/prompt.js +3 -7
  251. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  252. package/dist/tools/FileReadTool/FileReadTool.js +125 -3
  253. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  254. package/dist/tools/FileReadTool/prompt.js +1 -2
  255. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  256. package/dist/tools/FileWriteTool/prompt.js +3 -5
  257. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  258. package/dist/tools/GlobTool/GlobTool.js +3 -2
  259. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  260. package/dist/tools/GrepTool/GrepTool.js +16 -5
  261. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  262. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  263. package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
  264. package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
  265. package/dist/tools/MCPSearchTool/prompt.js +77 -0
  266. package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
  267. package/dist/tools/MultiEditTool/prompt.js +4 -7
  268. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  269. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
  270. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  271. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
  272. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  273. package/dist/tools/PlanModeTool/prompt.js +23 -74
  274. package/dist/tools/PlanModeTool/prompt.js.map +2 -2
  275. package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
  276. package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
  277. package/dist/tools/SendMessageTool/prompt.js +44 -0
  278. package/dist/tools/SendMessageTool/prompt.js.map +7 -0
  279. package/dist/tools/TaskCreateTool/prompt.js +15 -4
  280. package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
  281. package/dist/tools/TaskListTool/prompt.js +18 -3
  282. package/dist/tools/TaskListTool/prompt.js.map +2 -2
  283. package/dist/tools/TaskOutputTool/prompt.js +4 -3
  284. package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
  285. package/dist/tools/TaskTool/TaskTool.js +762 -98
  286. package/dist/tools/TaskTool/TaskTool.js.map +3 -3
  287. package/dist/tools/TaskTool/constants.js +8 -2
  288. package/dist/tools/TaskTool/constants.js.map +2 -2
  289. package/dist/tools/TaskTool/prompt.js +74 -70
  290. package/dist/tools/TaskTool/prompt.js.map +2 -2
  291. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
  292. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
  293. package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
  294. package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
  295. package/dist/tools/TeamCreateTool/prompt.js +58 -0
  296. package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
  297. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
  298. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
  299. package/dist/tools/TeamDeleteTool/prompt.js +16 -0
  300. package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
  301. package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
  302. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  303. package/dist/tools/URLFetcherTool/prompt.js +3 -2
  304. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  305. package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
  306. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  307. package/dist/tools/WebSearchTool/prompt.js +5 -4
  308. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  309. package/dist/tools.js +100 -20
  310. package/dist/tools.js.map +2 -2
  311. package/dist/types/PermissionMode.js +35 -6
  312. package/dist/types/PermissionMode.js.map +2 -2
  313. package/dist/types/hooks.js +2 -0
  314. package/dist/types/hooks.js.map +2 -2
  315. package/dist/types/plugin.js +2 -0
  316. package/dist/types/plugin.js.map +3 -3
  317. package/dist/utils/CircuitBreaker.js +15 -9
  318. package/dist/utils/CircuitBreaker.js.map +2 -2
  319. package/dist/utils/agentLoader.js +249 -112
  320. package/dist/utils/agentLoader.js.map +2 -2
  321. package/dist/utils/animationManager.js +40 -3
  322. package/dist/utils/animationManager.js.map +2 -2
  323. package/dist/utils/ask.js +7 -6
  324. package/dist/utils/ask.js.map +2 -2
  325. package/dist/utils/atomicWrite.js +23 -0
  326. package/dist/utils/atomicWrite.js.map +7 -0
  327. package/dist/utils/autoCompactCore.js +73 -56
  328. package/dist/utils/autoCompactCore.js.map +2 -2
  329. package/dist/utils/autoMemoryPaths.js +89 -0
  330. package/dist/utils/autoMemoryPaths.js.map +7 -0
  331. package/dist/utils/config.js +63 -38
  332. package/dist/utils/config.js.map +2 -2
  333. package/dist/utils/configSchema.js +13 -8
  334. package/dist/utils/configSchema.js.map +2 -2
  335. package/dist/utils/credentials/index.js +14 -0
  336. package/dist/utils/credentials/index.js.map +2 -2
  337. package/dist/utils/dualPath.js +24 -0
  338. package/dist/utils/dualPath.js.map +7 -0
  339. package/dist/utils/exit.js +66 -7
  340. package/dist/utils/exit.js.map +2 -2
  341. package/dist/utils/externalEditor.js +155 -0
  342. package/dist/utils/externalEditor.js.map +7 -0
  343. package/dist/utils/fileLock.js +67 -0
  344. package/dist/utils/fileLock.js.map +7 -0
  345. package/dist/utils/format.js +24 -14
  346. package/dist/utils/format.js.map +2 -2
  347. package/dist/utils/globalErrorHandler.js +5 -96
  348. package/dist/utils/globalErrorHandler.js.map +3 -3
  349. package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
  350. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
  351. package/dist/utils/groupHandlers/taskHandler.js +2 -2
  352. package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
  353. package/dist/utils/hookManager.js +64 -6
  354. package/dist/utils/hookManager.js.map +2 -2
  355. package/dist/utils/log.js +6 -2
  356. package/dist/utils/log.js.map +2 -2
  357. package/dist/utils/markdown.js +237 -19
  358. package/dist/utils/markdown.js.map +2 -2
  359. package/dist/utils/messageContextManager.js +18 -5
  360. package/dist/utils/messageContextManager.js.map +2 -2
  361. package/dist/utils/messageGroupManager.js +1 -1
  362. package/dist/utils/messageGroupManager.js.map +2 -2
  363. package/dist/utils/messages.js +104 -46
  364. package/dist/utils/messages.js.map +2 -2
  365. package/dist/utils/model.js +2 -2
  366. package/dist/utils/model.js.map +2 -2
  367. package/dist/utils/pasteCache.js +8 -4
  368. package/dist/utils/pasteCache.js.map +2 -2
  369. package/dist/utils/pluginLoader.js +18 -0
  370. package/dist/utils/pluginLoader.js.map +2 -2
  371. package/dist/utils/secureKeyStorage.js +36 -7
  372. package/dist/utils/secureKeyStorage.js.map +2 -2
  373. package/dist/utils/simpleMode.js +7 -0
  374. package/dist/utils/simpleMode.js.map +7 -0
  375. package/dist/utils/streamingState.js +11 -1
  376. package/dist/utils/streamingState.js.map +2 -2
  377. package/dist/utils/taskDisplayUtils.js +2 -1
  378. package/dist/utils/taskDisplayUtils.js.map +2 -2
  379. package/dist/utils/teamConfig.js +2 -2
  380. package/dist/utils/teamConfig.js.map +2 -2
  381. package/dist/utils/thinking.js +6 -2
  382. package/dist/utils/thinking.js.map +3 -3
  383. package/dist/utils/tokenProgress.js +55 -0
  384. package/dist/utils/tokenProgress.js.map +7 -0
  385. package/dist/utils/toolRiskClassification.js +26 -17
  386. package/dist/utils/toolRiskClassification.js.map +2 -2
  387. package/dist/utils/tooling/toolError.js +12 -0
  388. package/dist/utils/tooling/toolError.js.map +7 -0
  389. package/dist/version.js +2 -2
  390. package/dist/version.js.map +1 -1
  391. package/package.json +10 -8
@@ -0,0 +1,126 @@
1
+ import { Box, Text, useInput } from "ink";
2
+ import InkTextInput from "ink-text-input";
3
+ import React, { useState, useMemo } from "react";
4
+ import { Message } from "./Message.js";
5
+ import { useAgentTranscript } from "../hooks/useAgentTranscripts.js";
6
+ import { useTeamMembers } from "../hooks/useTeamMembers.js";
7
+ import { getTeam } from "../services/agentTeams/teamManager.js";
8
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
9
+ import { normalizeMessages, isNotEmptyMessage } from "../utils/messages.js";
10
+ const STATUS_BADGE = {
11
+ running: { label: "running", color: "yellow" },
12
+ working: { label: "working", color: "yellow" },
13
+ planning: { label: "planning", color: "cyan" },
14
+ idle: { label: "idle", color: "green" },
15
+ pending: { label: "pending", color: "cyan" },
16
+ completed: { label: "done", color: "green" },
17
+ stopped: { label: "stopped", color: "gray" },
18
+ error: { label: "error", color: "red" },
19
+ cancelled: { label: "cancelled", color: "gray" }
20
+ };
21
+ const MEMBER_STATUS_ICONS = {
22
+ working: "\u25D0",
23
+ // ◐
24
+ planning: "\u25D1",
25
+ // ◑
26
+ idle: "\u25CB",
27
+ // ○
28
+ stopped: "\u25CC"
29
+ // ◌
30
+ };
31
+ function AgentFocusView({
32
+ agentId,
33
+ teamName,
34
+ tools,
35
+ verbose,
36
+ debug,
37
+ onBack
38
+ }) {
39
+ const [inputValue, setInputValue] = useState("");
40
+ const transcript = useAgentTranscript(agentId);
41
+ const { members } = useTeamMembers();
42
+ useInput((_input, key) => {
43
+ if (key.escape) {
44
+ onBack();
45
+ }
46
+ });
47
+ const normalizedMessages = useMemo(() => {
48
+ if (!transcript?.messages) return [];
49
+ return normalizeMessages(transcript.messages).filter(isNotEmptyMessage);
50
+ }, [transcript?.messages]);
51
+ const handleSubmit = (text) => {
52
+ if (!text.trim()) return;
53
+ const entry = getTeam(teamName);
54
+ if (entry) {
55
+ entry.mailbox.send("user", agentId, text.trim());
56
+ }
57
+ setInputValue("");
58
+ };
59
+ const agentName = transcript?.description ?? agentId;
60
+ const agentType = transcript?.agentType ?? "unknown";
61
+ const status = transcript?.status ?? "pending";
62
+ const badge = STATUS_BADGE[status] ?? STATUS_BADGE.pending;
63
+ const displayName = agentId.includes("@") ? agentId.split("@")[0] : agentId;
64
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "Viewing "), /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, "@", displayName), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " (", agentType, ")"), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: badge.color }, "[", badge.label, "]"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\xB7 Esc to return")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, normalizedMessages.length === 0 ? /* @__PURE__ */ React.createElement(Box, { paddingX: 1, paddingY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Waiting for agent output...")) : normalizedMessages.map((msg) => {
65
+ if (msg.type !== "user" && msg.type !== "assistant") return null;
66
+ return /* @__PURE__ */ React.createElement(Box, { key: msg.uuid, width: "100%" }, /* @__PURE__ */ React.createElement(
67
+ Message,
68
+ {
69
+ message: msg,
70
+ messages: normalizedMessages,
71
+ addMargin: true,
72
+ tools,
73
+ verbose,
74
+ debug,
75
+ erroredToolUseIDs: /* @__PURE__ */ new Set(),
76
+ inProgressToolUseIDs: /* @__PURE__ */ new Set(),
77
+ unresolvedToolUseIDs: /* @__PURE__ */ new Set(),
78
+ shouldAnimate: false,
79
+ shouldShowDot: false
80
+ }
81
+ ));
82
+ })), members.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingX: 1, marginTop: 1 }, members.map((member, index) => {
83
+ const isLast = index === members.length - 1;
84
+ const isCurrent = member.id === agentId;
85
+ const connector = isLast ? "\u2558\u2550" : index === 0 ? "\u250C\u2500" : "\u251C\u2500";
86
+ const icon = MEMBER_STATUS_ICONS[member.status] || "\u25CB";
87
+ const statusColor = STATUS_BADGE[member.status]?.color ?? "gray";
88
+ return /* @__PURE__ */ React.createElement(Box, { key: member.id, flexDirection: "row", gap: 1, paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, connector), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, icon), /* @__PURE__ */ React.createElement(
89
+ Text,
90
+ {
91
+ bold: isCurrent,
92
+ color: isCurrent ? BRAND_GRADIENT.START : void 0
93
+ },
94
+ "@",
95
+ member.name
96
+ ), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "(", member.agentType, ")", isCurrent ? " \xB7 viewing" : ""));
97
+ })), /* @__PURE__ */ React.createElement(
98
+ Box,
99
+ {
100
+ borderTop: true,
101
+ borderBottom: false,
102
+ borderLeft: false,
103
+ borderRight: false,
104
+ borderColor: BRAND_GRADIENT.START,
105
+ borderStyle: "single",
106
+ width: "100%",
107
+ paddingX: 1,
108
+ flexDirection: "row",
109
+ gap: 1
110
+ },
111
+ /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, ">"),
112
+ /* @__PURE__ */ React.createElement(
113
+ InkTextInput,
114
+ {
115
+ value: inputValue,
116
+ onChange: setInputValue,
117
+ onSubmit: handleSubmit,
118
+ placeholder: `Message @${displayName}...`
119
+ }
120
+ )
121
+ ), /* @__PURE__ */ React.createElement(Box, { paddingX: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.muted }, "Type to message \xB7 Esc Back to main")));
122
+ }
123
+ export {
124
+ AgentFocusView
125
+ };
126
+ //# sourceMappingURL=AgentDetailView.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/AgentDetailView.tsx"],
4
+ "sourcesContent": ["/**\n * AgentFocusView Component\n *\n * Full-screen focus view for a specific agent's transcript.\n * Clears the terminal and replaces the main REPL content entirely.\n * Shows real-time agent output (tool calls, AI text, status) using\n * the same Message component as the main REPL.\n * Includes a text input for sending messages to influence the agent.\n * Press Escape to return to the main REPL view.\n */\n\nimport { Box, Text, useInput } from 'ink'\nimport InkTextInput from 'ink-text-input'\nimport React, { useState, useMemo } from 'react'\nimport { Message } from './Message'\nimport { useAgentTranscript } from '@hooks/useAgentTranscripts'\nimport { useTeamMembers } from '@hooks/useTeamMembers'\nimport { getTeam } from '@services/agentTeams/teamManager'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport type { Tool } from '@tool'\nimport type { AssistantMessage, UserMessage } from '@query'\nimport { normalizeMessages, isNotEmptyMessage } from '@utils/messages'\n\ntype Props = {\n agentId: string\n teamName: string\n tools: Tool[]\n verbose: boolean\n debug: boolean\n onBack: () => void\n}\n\nconst STATUS_BADGE: Record<string, { label: string; color: string }> = {\n running: { label: 'running', color: 'yellow' },\n working: { label: 'working', color: 'yellow' },\n planning: { label: 'planning', color: 'cyan' },\n idle: { label: 'idle', color: 'green' },\n pending: { label: 'pending', color: 'cyan' },\n completed: { label: 'done', color: 'green' },\n stopped: { label: 'stopped', color: 'gray' },\n error: { label: 'error', color: 'red' },\n cancelled: { label: 'cancelled', color: 'gray' },\n}\n\nconst MEMBER_STATUS_ICONS: Record<string, string> = {\n working: '\\u25D0', // \u25D0\n planning: '\\u25D1', // \u25D1\n idle: '\\u25CB', // \u25CB\n stopped: '\\u25CC', // \u25CC\n}\n\nexport function AgentFocusView({\n agentId,\n teamName,\n tools,\n verbose,\n debug,\n onBack,\n}: Props): React.ReactNode {\n const [inputValue, setInputValue] = useState('')\n const transcript = useAgentTranscript(agentId)\n const { members } = useTeamMembers()\n\n // Handle keyboard\n useInput((_input, key) => {\n if (key.escape) {\n onBack()\n }\n })\n\n // Normalize transcript messages for rendering\n const normalizedMessages = useMemo(() => {\n if (!transcript?.messages) return []\n return normalizeMessages(transcript.messages).filter(isNotEmptyMessage)\n }, [transcript?.messages])\n\n // Send message to agent via mailbox\n const handleSubmit = (text: string) => {\n if (!text.trim()) return\n const entry = getTeam(teamName)\n if (entry) {\n entry.mailbox.send('user', agentId, text.trim())\n }\n setInputValue('')\n }\n\n const agentName = transcript?.description ?? agentId\n const agentType = transcript?.agentType ?? 'unknown'\n const status = transcript?.status ?? 'pending'\n const badge = STATUS_BADGE[status] ?? STATUS_BADGE.pending!\n\n // Derive short display name (strip @team suffix)\n const displayName = agentId.includes('@') ? agentId.split('@')[0] : agentId\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Full-screen header banner \u2014 matches CC CLI \"Viewing @agent\" style */}\n <Box paddingX={1} marginBottom={1}>\n <Text color={BRAND_GRADIENT.START}>Viewing </Text>\n <Text bold color={BRAND_GRADIENT.START}>\n @{displayName}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> ({agentType})</Text>\n <Text> </Text>\n <Text color={badge.color}>[{badge.label}]</Text>\n <Text color={SEMANTIC_COLORS.dim}>{' '}\u00B7 Esc to return</Text>\n </Box>\n\n {/* Message area - renders agent transcript */}\n <Box flexDirection=\"column\" width=\"100%\">\n {normalizedMessages.length === 0 ? (\n <Box paddingX={1} paddingY={1}>\n <Text color={SEMANTIC_COLORS.dim}>Waiting for agent output...</Text>\n </Box>\n ) : (\n normalizedMessages.map(msg => {\n // Only render user and assistant messages\n if (msg.type !== 'user' && msg.type !== 'assistant') return null\n\n return (\n <Box key={msg.uuid} width=\"100%\">\n <Message\n message={msg as UserMessage | AssistantMessage}\n messages={normalizedMessages}\n addMargin={true}\n tools={tools}\n verbose={verbose}\n debug={debug}\n erroredToolUseIDs={new Set()}\n inProgressToolUseIDs={new Set()}\n unresolvedToolUseIDs={new Set()}\n shouldAnimate={false}\n shouldShowDot={false}\n />\n </Box>\n )\n })\n )}\n </Box>\n\n {/* Team member status bar \u2014 shows all teammates with their status */}\n {members.length > 0 && (\n <Box flexDirection=\"column\" paddingX={1} marginTop={1}>\n {members.map((member, index) => {\n const isLast = index === members.length - 1\n const isCurrent = member.id === agentId\n const connector = isLast\n ? '\\u2558\\u2550'\n : index === 0\n ? '\\u250C\\u2500'\n : '\\u251C\\u2500'\n const icon = MEMBER_STATUS_ICONS[member.status] || '\\u25CB'\n const statusColor = STATUS_BADGE[member.status]?.color ?? 'gray'\n\n return (\n <Box key={member.id} flexDirection=\"row\" gap={1} paddingLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>{connector}</Text>\n <Text color={statusColor}>{icon}</Text>\n <Text\n bold={isCurrent}\n color={isCurrent ? BRAND_GRADIENT.START : undefined}\n >\n @{member.name}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n ({member.agentType}){isCurrent ? ' \u00B7 viewing' : ''}\n </Text>\n </Box>\n )\n })}\n </Box>\n )}\n\n {/* Input area */}\n <Box\n borderTop={true}\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"single\"\n width=\"100%\"\n paddingX={1}\n flexDirection=\"row\"\n gap={1}\n >\n <Text color={BRAND_GRADIENT.START}>&gt;</Text>\n <InkTextInput\n value={inputValue}\n onChange={setInputValue}\n onSubmit={handleSubmit}\n placeholder={`Message @${displayName}...`}\n />\n </Box>\n <Box paddingX={2}>\n <Text color={SEMANTIC_COLORS.muted}>\n Type to message \u00B7 Esc Back to main\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -18,7 +18,7 @@ function AgentThinkingBlock({
18
18
  spinnerFrameCount: frames.length,
19
19
  componentId: "agent-thinking-block"
20
20
  });
21
- return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 1 }, showSpinner && /* @__PURE__ */ React.createElement(Box, { flexWrap: "nowrap", height: 1, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, frames[spinnerFrame])), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, message, showSpinner && "\u2026"), showElapsedTime && /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " ", "(", elapsedTime, "s \xB7 ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "esc esc"), " to interrupt)"));
21
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 1 }, showSpinner && /* @__PURE__ */ React.createElement(Box, { flexWrap: "nowrap", height: 1, width: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, frames[spinnerFrame])), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, message, showSpinner && "\u2026"), showElapsedTime && /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " ", "(", elapsedTime, "s \xB7 ", /* @__PURE__ */ React.createElement(Text, { bold: true }, "esc"), " to interrupt)"));
22
22
  }
23
23
  function ThinkingIndicator({
24
24
  message
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/AgentThinkingBlock.tsx"],
4
- "sourcesContent": ["/**\n * AgentThinkingBlock - Claude Code CLI \u98CE\u683C\u7684\u601D\u8003\u8FC7\u7A0B\u7EC4\u4EF6\n *\n * \u6838\u5FC3\u7279\u6027\uFF1A\n * 1. **\u539F\u5730\u66F4\u65B0** - \u540C\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\uFF0C\u901A\u8FC7 props \u66F4\u65B0\u5185\u5BB9\n * 2. **\u6697\u6DE1\u914D\u8272** - \u4F7F\u7528 dimmedText \u8868\u793A\u8FC7\u6E21\u72B6\u6001\n * 3. **\u52A8\u753B Spinner** - \u6301\u7EED\u65CB\u8F6C\uFF0C\u8868\u793A\u6D3B\u8DC3\u72B6\u6001\n * 4. **\u6D41\u7545\u8FC7\u6E21** - \u6D88\u606F\u53D8\u5316\u65F6\u5E73\u6ED1\u66FF\u6362\uFF0C\u4E0D\u4EA7\u751F\u6EDA\u52A8\n *\n * \u8FD9\u662F\u5B9E\u73B0\"\u6D41\u52A8\u6027\"\u7684\u5173\u952E\u7EC4\u4EF6\n * \u4F7F\u7528\u7EDF\u4E00\u52A8\u753B\u7BA1\u7406\u5668\u4EE3\u66FF\u591A\u4E2A setInterval\uFF0C\u51CF\u5C11\u5C4F\u5E55\u95EA\u70C1\n */\n\nimport React, { useRef } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SYMBOLS } from '@constants/symbols'\nimport { useUnifiedAnimation } from '@utils/animationManager'\n\ninterface Props {\n /** \u5F53\u524D\u601D\u8003\u9636\u6BB5\u7684\u6D88\u606F */\n message: string\n\n /** \u662F\u5426\u663E\u793A Spinner \u52A8\u753B */\n showSpinner?: boolean\n\n /** \u662F\u5426\u663E\u793A\u7ECF\u8FC7\u65F6\u95F4 */\n showElapsedTime?: boolean\n\n /** \u8D77\u59CB\u65F6\u95F4 (\u7528\u4E8E\u8BA1\u7B97\u7ECF\u8FC7\u65F6\u95F4) */\n startTime?: number\n}\n\n/**\n * AgentThinkingBlock - \u539F\u5730\u66F4\u65B0\u7684\u601D\u8003\u8FC7\u7A0B\u7EC4\u4EF6\n *\n * \u7528\u6CD5\u793A\u4F8B\uFF1A\n * ```tsx\n * // \u521D\u59CB\u6E32\u67D3\n * <AgentThinkingBlock message=\"Reading file...\" />\n *\n * // \u66F4\u65B0\u6D88\u606F (\u540C\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\uFF0Cprops \u53D8\u5316)\n * <AgentThinkingBlock message=\"Analyzing code...\" />\n *\n * // \u518D\u6B21\u66F4\u65B0\n * <AgentThinkingBlock message=\"Generating response...\" />\n * ```\n *\n * \u7528\u6237\u770B\u5230\u7684\u6548\u679C\uFF1A\n * ```\n * \u00B7 Reading file... \u2190 \u663E\u793A\n * \u2722 Analyzing code... \u2190 \u66FF\u6362 (\u4E0D\u662F\u65B0\u884C)\n * \u2733 Generating response... \u2190 \u518D\u6B21\u66FF\u6362\n * ```\n */\nexport function AgentThinkingBlock({\n message,\n showSpinner = true,\n showElapsedTime = true,\n startTime = Date.now(),\n}: Props): React.ReactNode {\n const theme = getTheme()\n const startTimeRef = useRef(startTime)\n\n // Claude Code \u98CE\u683C\u7684\u601D\u8003\u52A8\u753B - 6\u5E27\u5FAA\u73AF\n const frames = SYMBOLS.THINKING_FRAMES\n\n // Use unified animation manager instead of separate setInterval timers\n const { spinnerFrame, elapsedTime } = useUnifiedAnimation({\n enabled: showSpinner || showElapsedTime,\n startTime: startTimeRef.current,\n spinnerFrameCount: frames.length,\n componentId: 'agent-thinking-block',\n })\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n {/* Spinner \u52A8\u753B */}\n {showSpinner && (\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n {/* \u4F7F\u7528\u6697\u6DE1\u8272 - \u5173\u952E\uFF1A\u8FC7\u6E21\u72B6\u6001\u5E94\u8BE5\u4E0D\u663E\u773C */}\n <Text color={theme.dimmedText}>{frames[spinnerFrame]}</Text>\n </Box>\n )}\n\n {/* \u601D\u8003\u6D88\u606F - \u4F7F\u7528\u6697\u6DE1\u8272\uFF0C\u7B26\u5408 Claude Code CLI \u89C4\u8303 */}\n <Text color={theme.dimmedText}>\n {message}\n {showSpinner && '\u2026'}\n </Text>\n\n {/* \u7ECF\u8FC7\u65F6\u95F4\u548C\u63D0\u793A */}\n {showElapsedTime && (\n <Text color={theme.mutedText}>\n {' '}\n ({elapsedTime}s \u00B7 <Text bold>esc esc</Text> to interrupt)\n </Text>\n )}\n </Box>\n )\n}\n\n/**\n * \u8F7B\u91CF\u7EA7\u7684 Thinking Indicator (\u7528\u4E8E\u7D27\u51D1\u5E03\u5C40)\n */\nexport function ThinkingIndicator({\n message,\n}: {\n message: string\n}): React.ReactNode {\n return <AgentThinkingBlock message={message} showElapsedTime={false} />\n}\n"],
5
- "mappings": "AAaA,OAAO,SAAS,cAAc;AAC9B,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,2BAA2B;AAsC7B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY,KAAK,IAAI;AACvB,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,QAAM,eAAe,OAAO,SAAS;AAGrC,QAAM,SAAS,QAAQ;AAGvB,QAAM,EAAE,cAAc,YAAY,IAAI,oBAAoB;AAAA,IACxD,SAAS,eAAe;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB,mBAAmB,OAAO;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,KAEjC,eACC,oCAAC,OAAI,UAAS,UAAS,QAAQ,GAAG,OAAO,KAEvC,oCAAC,QAAK,OAAO,MAAM,cAAa,OAAO,YAAY,CAAE,CACvD,GAIF,oCAAC,QAAK,OAAO,MAAM,cAChB,SACA,eAAe,QAClB,GAGC,mBACC,oCAAC,QAAK,OAAO,MAAM,aAChB,KAAI,KACH,aAAY,WAAI,oCAAC,QAAK,MAAI,QAAC,SAAO,GAAO,gBAC7C,CAEJ;AAEJ;AAKO,SAAS,kBAAkB;AAAA,EAChC;AACF,GAEoB;AAClB,SAAO,oCAAC,sBAAmB,SAAkB,iBAAiB,OAAO;AACvE;",
4
+ "sourcesContent": ["/**\n * AgentThinkingBlock - Claude Code CLI \u98CE\u683C\u7684\u601D\u8003\u8FC7\u7A0B\u7EC4\u4EF6\n *\n * \u6838\u5FC3\u7279\u6027\uFF1A\n * 1. **\u539F\u5730\u66F4\u65B0** - \u540C\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\uFF0C\u901A\u8FC7 props \u66F4\u65B0\u5185\u5BB9\n * 2. **\u6697\u6DE1\u914D\u8272** - \u4F7F\u7528 dimmedText \u8868\u793A\u8FC7\u6E21\u72B6\u6001\n * 3. **\u52A8\u753B Spinner** - \u6301\u7EED\u65CB\u8F6C\uFF0C\u8868\u793A\u6D3B\u8DC3\u72B6\u6001\n * 4. **\u6D41\u7545\u8FC7\u6E21** - \u6D88\u606F\u53D8\u5316\u65F6\u5E73\u6ED1\u66FF\u6362\uFF0C\u4E0D\u4EA7\u751F\u6EDA\u52A8\n *\n * \u8FD9\u662F\u5B9E\u73B0\"\u6D41\u52A8\u6027\"\u7684\u5173\u952E\u7EC4\u4EF6\n * \u4F7F\u7528\u7EDF\u4E00\u52A8\u753B\u7BA1\u7406\u5668\u4EE3\u66FF\u591A\u4E2A setInterval\uFF0C\u51CF\u5C11\u5C4F\u5E55\u95EA\u70C1\n */\n\nimport React, { useRef } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { SYMBOLS } from '@constants/symbols'\nimport { useUnifiedAnimation } from '@utils/animationManager'\n\ninterface Props {\n /** \u5F53\u524D\u601D\u8003\u9636\u6BB5\u7684\u6D88\u606F */\n message: string\n\n /** \u662F\u5426\u663E\u793A Spinner \u52A8\u753B */\n showSpinner?: boolean\n\n /** \u662F\u5426\u663E\u793A\u7ECF\u8FC7\u65F6\u95F4 */\n showElapsedTime?: boolean\n\n /** \u8D77\u59CB\u65F6\u95F4 (\u7528\u4E8E\u8BA1\u7B97\u7ECF\u8FC7\u65F6\u95F4) */\n startTime?: number\n}\n\n/**\n * AgentThinkingBlock - \u539F\u5730\u66F4\u65B0\u7684\u601D\u8003\u8FC7\u7A0B\u7EC4\u4EF6\n *\n * \u7528\u6CD5\u793A\u4F8B\uFF1A\n * ```tsx\n * // \u521D\u59CB\u6E32\u67D3\n * <AgentThinkingBlock message=\"Reading file...\" />\n *\n * // \u66F4\u65B0\u6D88\u606F (\u540C\u4E00\u4E2A\u7EC4\u4EF6\u5B9E\u4F8B\uFF0Cprops \u53D8\u5316)\n * <AgentThinkingBlock message=\"Analyzing code...\" />\n *\n * // \u518D\u6B21\u66F4\u65B0\n * <AgentThinkingBlock message=\"Generating response...\" />\n * ```\n *\n * \u7528\u6237\u770B\u5230\u7684\u6548\u679C\uFF1A\n * ```\n * \u00B7 Reading file... \u2190 \u663E\u793A\n * \u2722 Analyzing code... \u2190 \u66FF\u6362 (\u4E0D\u662F\u65B0\u884C)\n * \u2733 Generating response... \u2190 \u518D\u6B21\u66FF\u6362\n * ```\n */\nexport function AgentThinkingBlock({\n message,\n showSpinner = true,\n showElapsedTime = true,\n startTime = Date.now(),\n}: Props): React.ReactNode {\n const theme = getTheme()\n const startTimeRef = useRef(startTime)\n\n // Claude Code \u98CE\u683C\u7684\u601D\u8003\u52A8\u753B - 6\u5E27\u5FAA\u73AF\n const frames = SYMBOLS.THINKING_FRAMES\n\n // Use unified animation manager instead of separate setInterval timers\n const { spinnerFrame, elapsedTime } = useUnifiedAnimation({\n enabled: showSpinner || showElapsedTime,\n startTime: startTimeRef.current,\n spinnerFrameCount: frames.length,\n componentId: 'agent-thinking-block',\n })\n\n return (\n <Box flexDirection=\"row\" marginTop={1}>\n {/* Spinner \u52A8\u753B */}\n {showSpinner && (\n <Box flexWrap=\"nowrap\" height={1} width={2}>\n {/* \u4F7F\u7528\u6697\u6DE1\u8272 - \u5173\u952E\uFF1A\u8FC7\u6E21\u72B6\u6001\u5E94\u8BE5\u4E0D\u663E\u773C */}\n <Text color={theme.dimmedText}>{frames[spinnerFrame]}</Text>\n </Box>\n )}\n\n {/* \u601D\u8003\u6D88\u606F - \u4F7F\u7528\u6697\u6DE1\u8272\uFF0C\u7B26\u5408 Claude Code CLI \u89C4\u8303 */}\n <Text color={theme.dimmedText}>\n {message}\n {showSpinner && '\u2026'}\n </Text>\n\n {/* \u7ECF\u8FC7\u65F6\u95F4\u548C\u63D0\u793A */}\n {showElapsedTime && (\n <Text color={theme.mutedText}>\n {' '}\n ({elapsedTime}s \u00B7 <Text bold>esc</Text> to interrupt)\n </Text>\n )}\n </Box>\n )\n}\n\n/**\n * \u8F7B\u91CF\u7EA7\u7684 Thinking Indicator (\u7528\u4E8E\u7D27\u51D1\u5E03\u5C40)\n */\nexport function ThinkingIndicator({\n message,\n}: {\n message: string\n}): React.ReactNode {\n return <AgentThinkingBlock message={message} showElapsedTime={false} />\n}\n"],
5
+ "mappings": "AAaA,OAAO,SAAS,cAAc;AAC9B,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,2BAA2B;AAsC7B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY,KAAK,IAAI;AACvB,GAA2B;AACzB,QAAM,QAAQ,SAAS;AACvB,QAAM,eAAe,OAAO,SAAS;AAGrC,QAAM,SAAS,QAAQ;AAGvB,QAAM,EAAE,cAAc,YAAY,IAAI,oBAAoB;AAAA,IACxD,SAAS,eAAe;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB,mBAAmB,OAAO;AAAA,IAC1B,aAAa;AAAA,EACf,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,OAAM,WAAW,KAEjC,eACC,oCAAC,OAAI,UAAS,UAAS,QAAQ,GAAG,OAAO,KAEvC,oCAAC,QAAK,OAAO,MAAM,cAAa,OAAO,YAAY,CAAE,CACvD,GAIF,oCAAC,QAAK,OAAO,MAAM,cAChB,SACA,eAAe,QAClB,GAGC,mBACC,oCAAC,QAAK,OAAO,MAAM,aAChB,KAAI,KACH,aAAY,WAAI,oCAAC,QAAK,MAAI,QAAC,KAAG,GAAO,gBACzC,CAEJ;AAEJ;AAKO,SAAS,kBAAkB;AAAA,EAChC;AACF,GAEoB;AAClB,SAAO,oCAAC,sBAAmB,SAAkB,iBAAiB,OAAO;AACvE;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,22 @@
1
+ import { Box, Text } from "ink";
2
+ import React from "react";
3
+ import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
4
+ const STATUS_BADGE = {
5
+ running: { label: "running", color: "yellow" },
6
+ working: { label: "working", color: "yellow" },
7
+ planning: { label: "planning", color: "cyan" },
8
+ idle: { label: "idle", color: "green" },
9
+ pending: { label: "pending", color: "cyan" },
10
+ completed: { label: "done", color: "green" },
11
+ stopped: { label: "stopped", color: "gray" },
12
+ error: { label: "error", color: "red" },
13
+ cancelled: { label: "cancelled", color: "gray" }
14
+ };
15
+ function AgentViewBanner({ displayName, agentType, status }) {
16
+ const badge = STATUS_BADGE[status] ?? { label: status, color: "gray" };
17
+ return /* @__PURE__ */ React.createElement(Box, { paddingX: 1, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: BRAND_GRADIENT.START }, "Focused: "), /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, "@", displayName), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " (", agentType, ")"), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: badge.color }, "[", badge.label, "]"));
18
+ }
19
+ export {
20
+ AgentViewBanner
21
+ };
22
+ //# sourceMappingURL=AgentViewBanner.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/AgentViewBanner.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\nconst STATUS_BADGE: Record<string, { label: string; color: string }> = {\n running: { label: 'running', color: 'yellow' },\n working: { label: 'working', color: 'yellow' },\n planning: { label: 'planning', color: 'cyan' },\n idle: { label: 'idle', color: 'green' },\n pending: { label: 'pending', color: 'cyan' },\n completed: { label: 'done', color: 'green' },\n stopped: { label: 'stopped', color: 'gray' },\n error: { label: 'error', color: 'red' },\n cancelled: { label: 'cancelled', color: 'gray' },\n}\n\ntype Props = {\n displayName: string\n agentType: string\n status: string\n}\n\nexport function AgentViewBanner({ displayName, agentType, status }: Props) {\n const badge = STATUS_BADGE[status] ?? { label: status, color: 'gray' }\n return (\n <Box paddingX={1} marginBottom={1}>\n <Text color={BRAND_GRADIENT.START}>Focused: </Text>\n <Text bold color={BRAND_GRADIENT.START}>\n @{displayName}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> ({agentType})</Text>\n <Text> </Text>\n <Text color={badge.color}>[{badge.label}]</Text>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAClB,SAAS,gBAAgB,uBAAuB;AAEhD,MAAM,eAAiE;AAAA,EACrE,SAAS,EAAE,OAAO,WAAW,OAAO,SAAS;AAAA,EAC7C,SAAS,EAAE,OAAO,WAAW,OAAO,SAAS;AAAA,EAC7C,UAAU,EAAE,OAAO,YAAY,OAAO,OAAO;AAAA,EAC7C,MAAM,EAAE,OAAO,QAAQ,OAAO,QAAQ;AAAA,EACtC,SAAS,EAAE,OAAO,WAAW,OAAO,OAAO;AAAA,EAC3C,WAAW,EAAE,OAAO,QAAQ,OAAO,QAAQ;AAAA,EAC3C,SAAS,EAAE,OAAO,WAAW,OAAO,OAAO;AAAA,EAC3C,OAAO,EAAE,OAAO,SAAS,OAAO,MAAM;AAAA,EACtC,WAAW,EAAE,OAAO,aAAa,OAAO,OAAO;AACjD;AAQO,SAAS,gBAAgB,EAAE,aAAa,WAAW,OAAO,GAAU;AACzE,QAAM,QAAQ,aAAa,MAAM,KAAK,EAAE,OAAO,QAAQ,OAAO,OAAO;AACrE,SACE,oCAAC,OAAI,UAAU,GAAG,cAAc,KAC9B,oCAAC,QAAK,OAAO,eAAe,SAAO,WAAS,GAC5C,oCAAC,QAAK,MAAI,MAAC,OAAO,eAAe,SAAO,KACpC,WACJ,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,MAAG,WAAU,GAAC,GAChD,oCAAC,YAAK,GAAC,GACP,oCAAC,QAAK,OAAO,MAAM,SAAO,KAAE,MAAM,OAAM,GAAC,CAC3C;AAEJ;",
6
+ "names": []
7
+ }
@@ -14,7 +14,7 @@ function HeaderBar({
14
14
  const modelManager = getModelManager();
15
15
  const currentModel = modelManager.getModel("main");
16
16
  const cwd = getCwd();
17
- const contextPercentage = currentModel ? Math.round(tokenUsage / currentModel.contextLength * 100) : 0;
17
+ const contextPercentage = currentModel?.contextLength && currentModel.contextLength > 0 ? Math.round(tokenUsage / currentModel.contextLength * 100) : 0;
18
18
  const formatTokens = (tokens) => `${Math.round(tokens / 1e3)}k`;
19
19
  const getDisplayModelName = (modelName) => {
20
20
  if (!modelName) return t("ui.model.fallbackName");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/HeaderBar.tsx"],
4
- "sourcesContent": ["/**\n * HeaderBar - Minto \u54C1\u724C\u9875\u7709\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u54C1\u724C\u8BC6\u522B** - \u7D2B\u84DD\u2192\u73CA\u745A\u6E10\u53D8\uFF0C\u4F20\u9012\u4E13\u4E1A\u4E0E\u70ED\u60C5\n * 2. **\u4FE1\u606F\u6E05\u6670** - \u663E\u793A\u5173\u952E\u4FE1\u606F\uFF08\u9879\u76EE\u4F4D\u7F6E\u3001AI \u6A21\u578B\u3001\u4F7F\u7528\u91CF\uFF09\n * 3. **\u5546\u52A1\u53CB\u597D** - \u6E29\u6696\u3001\u4E13\u4E1A\u3001\u6613\u4E8E\u7406\u89E3\n * 4. **\u89C6\u89C9\u7CBE\u7B80** - \u4E0D\u5360\u7528\u8FC7\u591A\u5782\u76F4\u7A7A\u95F4\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { getModelManager } from '@utils/model'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { t } from '@i18n'\n\ninterface Props {\n /** \u5F53\u524D Token \u4F7F\u7528\u91CF */\n tokenUsage?: number\n\n /** MCP \u5BA2\u6237\u7AEF (\u53EF\u9009) */\n mcpClients?: WrappedClient[]\n\n /** \u662F\u5426\u662F\u9ED8\u8BA4\u6A21\u578B */\n isDefaultModel?: boolean\n}\n\n/**\n * HeaderBar - \u54C1\u724C\u9875\u7709\u72B6\u6001\u680F\n *\n * \u5E03\u5C40\uFF1A\n * ```\n * \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\n * \u2502 \u25C6 Minto \u00B7 /path/to/project AI Model \u00B7 50k/200k\u2502\n * \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\n * ```\n */\nexport function HeaderBar({\n tokenUsage = 0,\n mcpClients = [],\n isDefaultModel = true,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n // \u8BA1\u7B97\u4E0A\u4E0B\u6587\u4F7F\u7528\u767E\u5206\u6BD4\n const contextPercentage = currentModel\n ? Math.round((tokenUsage / currentModel.contextLength) * 100)\n : 0\n\n // \u683C\u5F0F\u5316 Token \u6570\u91CF (k \u4E3A\u5355\u4F4D)\n const formatTokens = (tokens: number) => `${Math.round(tokens / 1000)}k`\n\n // Get simplified model display name (more friendly for non-technical users)\n const getDisplayModelName = (modelName: string | undefined) => {\n if (!modelName) return t('ui.model.fallbackName')\n // Extract model short name, remove version numbers and technical details\n const simplified = modelName\n .replace(/^(claude-|gpt-|glm-)/, '')\n .replace(/-\\d+.*$/, '')\n .replace(/-latest$/, '')\n return simplified.charAt(0).toUpperCase() + simplified.slice(1)\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"round\"\n paddingX={1}\n marginBottom={1}\n >\n {/* \u4E3B\u4FE1\u606F\u884C */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n {/* \u5DE6\u4FA7\uFF1A\u54C1\u724C\u6807\u8BC6 + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* \u53F3\u4FA7\uFF1AAI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n <Box flexDirection=\"row\">\n <Text color={SEMANTIC_COLORS.dim}>\n {getDisplayModelName(currentModel?.modelName)}\n </Text>\n {currentModel && (\n <>\n <Text color={SEMANTIC_COLORS.muted}> \u00B7 </Text>\n <Text\n color={\n contextPercentage > 80\n ? SEMANTIC_COLORS.error\n : contextPercentage > 60\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.muted\n }\n >\n {formatTokens(tokenUsage)}/\n {formatTokens(currentModel.contextLength)}\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* \u6269\u5C55\u670D\u52A1\u72B6\u6001 (\u5982\u679C\u6709) */}\n {mcpClients.length > 0 && (\n <Box flexDirection=\"row\" marginTop={0}>\n <Text color={SEMANTIC_COLORS.muted}>MCP: </Text>\n {mcpClients.map((client, idx) => (\n <React.Fragment key={idx}>\n <Text\n color={\n client.type === 'connected'\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error\n }\n >\n {client.name}\n </Text>\n {idx < mcpClients.length - 1 && (\n <Text color={SEMANTIC_COLORS.muted}>, </Text>\n )}\n </React.Fragment>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u6781\u7B80\u7248\u9875\u7709 (\u53EA\u663E\u793A\u57FA\u672C\u4FE1\u606F)\n */\nexport function MinimalHeaderBar({\n tokenUsage = 0,\n}: {\n tokenUsage?: number\n}): React.ReactNode {\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n {/* \u54C1\u724C + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* AI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n {currentModel && (\n <Text color={SEMANTIC_COLORS.dim}>\n {Math.round(tokenUsage / 1000)}k/\n {Math.round(currentModel.contextLength / 1000)}k\n </Text>\n )}\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * HeaderBar - Minto \u54C1\u724C\u9875\u7709\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u54C1\u724C\u8BC6\u522B** - \u7D2B\u84DD\u2192\u73CA\u745A\u6E10\u53D8\uFF0C\u4F20\u9012\u4E13\u4E1A\u4E0E\u70ED\u60C5\n * 2. **\u4FE1\u606F\u6E05\u6670** - \u663E\u793A\u5173\u952E\u4FE1\u606F\uFF08\u9879\u76EE\u4F4D\u7F6E\u3001AI \u6A21\u578B\u3001\u4F7F\u7528\u91CF\uFF09\n * 3. **\u5546\u52A1\u53CB\u597D** - \u6E29\u6696\u3001\u4E13\u4E1A\u3001\u6613\u4E8E\u7406\u89E3\n * 4. **\u89C6\u89C9\u7CBE\u7B80** - \u4E0D\u5360\u7528\u8FC7\u591A\u5782\u76F4\u7A7A\u95F4\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getCwd } from '@utils/state'\nimport { getModelManager } from '@utils/model'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { t } from '@i18n'\n\ninterface Props {\n /** \u5F53\u524D Token \u4F7F\u7528\u91CF */\n tokenUsage?: number\n\n /** MCP \u5BA2\u6237\u7AEF (\u53EF\u9009) */\n mcpClients?: WrappedClient[]\n\n /** \u662F\u5426\u662F\u9ED8\u8BA4\u6A21\u578B */\n isDefaultModel?: boolean\n}\n\n/**\n * HeaderBar - \u54C1\u724C\u9875\u7709\u72B6\u6001\u680F\n *\n * \u5E03\u5C40\uFF1A\n * ```\n * \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E\n * \u2502 \u25C6 Minto \u00B7 /path/to/project AI Model \u00B7 50k/200k\u2502\n * \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F\n * ```\n */\nexport function HeaderBar({\n tokenUsage = 0,\n mcpClients = [],\n isDefaultModel = true,\n}: Props): React.ReactNode {\n const theme = getTheme()\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n // \u8BA1\u7B97\u4E0A\u4E0B\u6587\u4F7F\u7528\u767E\u5206\u6BD4\n const contextPercentage =\n currentModel?.contextLength && currentModel.contextLength > 0\n ? Math.round((tokenUsage / currentModel.contextLength) * 100)\n : 0\n\n // \u683C\u5F0F\u5316 Token \u6570\u91CF (k \u4E3A\u5355\u4F4D)\n const formatTokens = (tokens: number) => `${Math.round(tokens / 1000)}k`\n\n // Get simplified model display name (more friendly for non-technical users)\n const getDisplayModelName = (modelName: string | undefined) => {\n if (!modelName) return t('ui.model.fallbackName')\n // Extract model short name, remove version numbers and technical details\n const simplified = modelName\n .replace(/^(claude-|gpt-|glm-)/, '')\n .replace(/-\\d+.*$/, '')\n .replace(/-latest$/, '')\n return simplified.charAt(0).toUpperCase() + simplified.slice(1)\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderColor={BRAND_GRADIENT.START}\n borderStyle=\"round\"\n paddingX={1}\n marginBottom={1}\n >\n {/* \u4E3B\u4FE1\u606F\u884C */}\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n {/* \u5DE6\u4FA7\uFF1A\u54C1\u724C\u6807\u8BC6 + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* \u53F3\u4FA7\uFF1AAI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n <Box flexDirection=\"row\">\n <Text color={SEMANTIC_COLORS.dim}>\n {getDisplayModelName(currentModel?.modelName)}\n </Text>\n {currentModel && (\n <>\n <Text color={SEMANTIC_COLORS.muted}> \u00B7 </Text>\n <Text\n color={\n contextPercentage > 80\n ? SEMANTIC_COLORS.error\n : contextPercentage > 60\n ? SEMANTIC_COLORS.running\n : SEMANTIC_COLORS.muted\n }\n >\n {formatTokens(tokenUsage)}/\n {formatTokens(currentModel.contextLength)}\n </Text>\n </>\n )}\n </Box>\n </Box>\n\n {/* \u6269\u5C55\u670D\u52A1\u72B6\u6001 (\u5982\u679C\u6709) */}\n {mcpClients.length > 0 && (\n <Box flexDirection=\"row\" marginTop={0}>\n <Text color={SEMANTIC_COLORS.muted}>MCP: </Text>\n {mcpClients.map((client, idx) => (\n <React.Fragment key={idx}>\n <Text\n color={\n client.type === 'connected'\n ? SEMANTIC_COLORS.success\n : SEMANTIC_COLORS.error\n }\n >\n {client.name}\n </Text>\n {idx < mcpClients.length - 1 && (\n <Text color={SEMANTIC_COLORS.muted}>, </Text>\n )}\n </React.Fragment>\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u6781\u7B80\u7248\u9875\u7709 (\u53EA\u663E\u793A\u57FA\u672C\u4FE1\u606F)\n */\nexport function MinimalHeaderBar({\n tokenUsage = 0,\n}: {\n tokenUsage?: number\n}): React.ReactNode {\n const modelManager = getModelManager()\n const currentModel = modelManager.getModel('main')\n const cwd = getCwd()\n\n return (\n <Box flexDirection=\"row\" justifyContent=\"space-between\" paddingX={2}>\n {/* \u54C1\u724C + \u9879\u76EE\u4F4D\u7F6E */}\n <Box flexDirection=\"row\">\n <Text color={BRAND_GRADIENT.START}>\u25C6</Text>\n <Text> </Text>\n <Text color={BRAND_GRADIENT.START} bold>\n Min\n </Text>\n <Text color={BRAND_GRADIENT.END} bold>\n to\n </Text>\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>\n <Text color={SEMANTIC_COLORS.secondary}>{cwd}</Text>\n </Box>\n\n {/* AI \u6A21\u578B + \u4F7F\u7528\u91CF */}\n {currentModel && (\n <Text color={SEMANTIC_COLORS.dim}>\n {Math.round(tokenUsage / 1000)}k/\n {Math.round(currentModel.contextLength / 1000)}k\n </Text>\n )}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -75,7 +75,14 @@ function buildModeSystemsSection() {
75
75
  { label: " default", value: "Standard confirmation flow" },
76
76
  { label: " acceptEdits", value: "Auto-approve file edits" },
77
77
  { label: " plan", value: "Plan mode (no modifications)" },
78
- { label: " bypass", value: "Skip all permission checks" }
78
+ { label: " bypass", value: "Skip all permission checks" },
79
+ {
80
+ label: "",
81
+ value: t("help.permissionModesSystem"),
82
+ valueColor: SEMANTIC_COLORS.muted
83
+ },
84
+ { label: " dontAsk", value: "Auto-deny non-allowed tools (CI/CD)" },
85
+ { label: " delegate", value: "Team coordination only (auto-activated)" }
79
86
  ]
80
87
  };
81
88
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/Help.tsx"],
4
- "sourcesContent": ["/**\n * Help Component\n *\n * Displays comprehensive help using InfoPanel for consistent UI.\n * Shows all information immediately (no progressive disclosure timer).\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { CustomCommandWithScope } from '@services/customCommands'\nimport { hasCustomCommands } from '@services/customCommands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '@constants/product'\nimport { MACRO } from '@constants/macros'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\nfunction buildUsageSection(): InfoSection {\n return {\n title: t('help.usageModes'),\n items: [\n { label: 'REPL', value: `${PRODUCT_COMMAND} (interactive session)` },\n {\n label: t('help.nonInteractive'),\n value: `${PRODUCT_COMMAND} -p \"question\"`,\n },\n {\n label: t('help.options'),\n value: t('help.runForOptions', { command: PRODUCT_COMMAND }),\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildCommonTasksSection(): InfoSection {\n return {\n title: t('help.commonTasks'),\n items: [\n {\n label: '\\u2022 Ask questions',\n value: 'How does foo.py work?',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Edit files',\n value: 'Update bar.ts to...',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Fix errors',\n value: 'cargo build',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run commands',\n value: '/help',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run bash',\n value: '!ls',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildModeSystemsSection(): InfoSection {\n return {\n title: t('help.modeSystems'),\n items: [\n {\n label: '',\n value: t('help.safetyModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' --yolo', value: 'Skip all confirmations' },\n { label: ' --smart', value: 'Dangerous tools require confirmation' },\n { label: ' --strict', value: 'All tools require confirmation' },\n { label: ' --free', value: 'Free mode (no restrictions)' },\n {\n label: '',\n value: t('help.permissionModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' default', value: 'Standard confirmation flow' },\n { label: ' acceptEdits', value: 'Auto-approve file edits' },\n { label: ' plan', value: 'Plan mode (no modifications)' },\n { label: ' bypass', value: 'Skip all permission checks' },\n ],\n }\n}\n\nfunction buildBuiltInSection(commands: Command[]): InfoSection {\n const builtInCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n !cmd.name.startsWith('project:') &&\n !cmd.name.startsWith('user:') &&\n !cmd.name.startsWith('plugin:') &&\n !cmd.name.startsWith('mcp:'),\n )\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n const items: InfoItem[] = builtInCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.builtInCommands'), items }\n}\n\nfunction buildCustomSection(commands: Command[]): InfoSection | null {\n const customCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n (cmd.name.startsWith('project:') || cmd.name.startsWith('user:')),\n )\n .sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n ) as CustomCommandWithScope[]\n\n if (customCommands.length === 0) return null\n\n const items: InfoItem[] = customCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: `${cmd.description}${cmd.scope ? ` [${cmd.scope}]` : ''}`,\n }))\n\n return { title: t('help.customCommands'), items }\n}\n\nfunction buildPluginSection(commands: Command[]): InfoSection | null {\n const pluginCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('plugin:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (pluginCommands.length === 0) return null\n\n const items: InfoItem[] = pluginCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.pluginCommands'), items }\n}\n\nfunction buildMcpSection(commands: Command[]): InfoSection | null {\n const mcpCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('mcp:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (mcpCommands.length === 0) return null\n\n const items: InfoItem[] = mcpCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.mcpCommands'), items }\n}\n\nfunction buildPrioritySection(): InfoSection {\n return {\n title: t('help.commandPriority'),\n items: [\n {\n label: '1.',\n value: 'Built-in commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '2.',\n value: 'Custom commands (project: / user:)',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '3.',\n value: 'Plugin commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n { label: '4.', value: 'MCP commands', valueColor: SEMANTIC_COLORS.dim },\n ],\n }\n}\n\nexport function Help({\n commands,\n onClose,\n}: {\n commands: Command[]\n onClose: () => void\n}): React.ReactNode {\n const sections: InfoSection[] = []\n\n // Usage modes\n sections.push(buildUsageSection())\n\n // Common tasks\n sections.push(buildCommonTasksSection())\n\n // Mode systems\n sections.push(buildModeSystemsSection())\n\n // Built-in commands\n sections.push(buildBuiltInSection(commands))\n\n // Custom commands (if any)\n const customSection = buildCustomSection(commands)\n if (customSection) sections.push(customSection)\n\n // Plugin commands (if any)\n const pluginSection = buildPluginSection(commands)\n if (pluginSection) sections.push(pluginSection)\n\n // MCP commands (if any)\n const mcpSection = buildMcpSection(commands)\n if (mcpSection) sections.push(mcpSection)\n\n // Priority info (if any non-built-in commands exist)\n const hasExtended =\n hasCustomCommands() || customSection || pluginSection || mcpSection\n if (hasExtended) {\n sections.push(buildPrioritySection())\n }\n\n return (\n <InfoPanel\n title={t('commands.help.title')}\n subtitle={`${PRODUCT_NAME} v${MACRO.VERSION}`}\n sections={sections}\n onClose={onClose}\n />\n )\n}\n"],
5
- "mappings": "AAOA,OAAO,WAAW;AAGlB,SAAS,yBAAyB;AAClC,SAAS,iBAAiB,oBAAoB;AAC9C,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAChC,SAAS,iBAAiB;AAE1B,SAAS,SAAS;AAElB,SAAS,oBAAiC;AACxC,SAAO;AAAA,IACL,OAAO,EAAE,iBAAiB;AAAA,IAC1B,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,OAAO,GAAG,eAAe,yBAAyB;AAAA,MACnE;AAAA,QACE,OAAO,EAAE,qBAAqB;AAAA,QAC9B,OAAO,GAAG,eAAe;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,OAAO,EAAE,cAAc;AAAA,QACvB,OAAO,EAAE,sBAAsB,EAAE,SAAS,gBAAgB,CAAC;AAAA,QAC3D,YAAY,gBAAgB;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BAAuC;AAC9C,SAAO;AAAA,IACL,OAAO,EAAE,kBAAkB;AAAA,IAC3B,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BAAuC;AAC9C,SAAO;AAAA,IACL,OAAO,EAAE,kBAAkB;AAAA,IAC3B,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,OAAO,EAAE,kBAAkB;AAAA,QAC3B,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA,EAAE,OAAO,YAAY,OAAO,yBAAyB;AAAA,MACrD,EAAE,OAAO,aAAa,OAAO,uCAAuC;AAAA,MACpE,EAAE,OAAO,cAAc,OAAO,iCAAiC;AAAA,MAC/D,EAAE,OAAO,YAAY,OAAO,8BAA8B;AAAA,MAC1D;AAAA,QACE,OAAO;AAAA,QACP,OAAO,EAAE,sBAAsB;AAAA,QAC/B,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA,EAAE,OAAO,aAAa,OAAO,6BAA6B;AAAA,MAC1D,EAAE,OAAO,iBAAiB,OAAO,0BAA0B;AAAA,MAC3D,EAAE,OAAO,UAAU,OAAO,+BAA+B;AAAA,MACzD,EAAE,OAAO,YAAY,OAAO,6BAA6B;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAkC;AAC7D,QAAM,kBAAkB,SACrB;AAAA,IACC,SACE,CAAC,IAAI,YACL,CAAC,IAAI,KAAK,WAAW,UAAU,KAC/B,CAAC,IAAI,KAAK,WAAW,OAAO,KAC5B,CAAC,IAAI,KAAK,WAAW,SAAS,KAC9B,CAAC,IAAI,KAAK,WAAW,MAAM;AAAA,EAC/B,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAEtE,QAAM,QAAoB,gBAAgB,IAAI,UAAQ;AAAA,IACpD,OAAO,IAAI,IAAI,IAAI;AAAA,IACnB,OAAO,IAAI;AAAA,EACb,EAAE;AAEF,SAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM;AACnD;AAEA,SAAS,mBAAmB,UAAyC;AACnE,QAAM,iBAAiB,SACpB;AAAA,IACC,SACE,CAAC,IAAI,aACJ,IAAI,KAAK,WAAW,UAAU,KAAK,IAAI,KAAK,WAAW,OAAO;AAAA,EACnE,EACC;AAAA,IAAK,CAAC,GAAG,MACR,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC;AAAA,EACrD;AAEF,MAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QAAM,QAAoB,eAAe,IAAI,UAAQ;AAAA,IACnD,OAAO,IAAI,IAAI,IAAI;AAAA,IACnB,OAAO,GAAG,IAAI,WAAW,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,MAAM,EAAE;AAAA,EAChE,EAAE;AAEF,SAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,MAAM;AAClD;AAEA,SAAS,mBAAmB,UAAyC;AACnE,QAAM,iBAAiB,SACpB,OAAO,SAAO,CAAC,IAAI,YAAY,IAAI,KAAK,WAAW,SAAS,CAAC,EAC7D,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAEtE,MAAI,eAAe,WAAW,EAAG,QAAO;AAExC,QAAM,QAAoB,eAAe,IAAI,UAAQ;AAAA,IACnD,OAAO,IAAI,IAAI,IAAI;AAAA,IACnB,OAAO,IAAI;AAAA,EACb,EAAE;AAEF,SAAO,EAAE,OAAO,EAAE,qBAAqB,GAAG,MAAM;AAClD;AAEA,SAAS,gBAAgB,UAAyC;AAChE,QAAM,cAAc,SACjB,OAAO,SAAO,CAAC,IAAI,YAAY,IAAI,KAAK,WAAW,MAAM,CAAC,EAC1D,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAEtE,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,QAAM,QAAoB,YAAY,IAAI,UAAQ;AAAA,IAChD,OAAO,IAAI,IAAI,IAAI;AAAA,IACnB,OAAO,IAAI;AAAA,EACb,EAAE;AAEF,SAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM;AAC/C;AAEA,SAAS,uBAAoC;AAC3C,SAAO;AAAA,IACL,OAAO,EAAE,sBAAsB;AAAA,IAC/B,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,gBAAgB;AAAA,MAC9B;AAAA,MACA,EAAE,OAAO,MAAM,OAAO,gBAAgB,YAAY,gBAAgB,IAAI;AAAA,IACxE;AAAA,EACF;AACF;AAEO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AACF,GAGoB;AAClB,QAAM,WAA0B,CAAC;AAGjC,WAAS,KAAK,kBAAkB,CAAC;AAGjC,WAAS,KAAK,wBAAwB,CAAC;AAGvC,WAAS,KAAK,wBAAwB,CAAC;AAGvC,WAAS,KAAK,oBAAoB,QAAQ,CAAC;AAG3C,QAAM,gBAAgB,mBAAmB,QAAQ;AACjD,MAAI,cAAe,UAAS,KAAK,aAAa;AAG9C,QAAM,gBAAgB,mBAAmB,QAAQ;AACjD,MAAI,cAAe,UAAS,KAAK,aAAa;AAG9C,QAAM,aAAa,gBAAgB,QAAQ;AAC3C,MAAI,WAAY,UAAS,KAAK,UAAU;AAGxC,QAAM,cACJ,kBAAkB,KAAK,iBAAiB,iBAAiB;AAC3D,MAAI,aAAa;AACf,aAAS,KAAK,qBAAqB,CAAC;AAAA,EACtC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,qBAAqB;AAAA,MAC9B,UAAU,GAAG,YAAY,KAAK,MAAM,OAAO;AAAA,MAC3C;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["/**\n * Help Component\n *\n * Displays comprehensive help using InfoPanel for consistent UI.\n * Shows all information immediately (no progressive disclosure timer).\n */\n\nimport React from 'react'\nimport type { Command } from '@commands'\nimport type { CustomCommandWithScope } from '@services/customCommands'\nimport { hasCustomCommands } from '@services/customCommands'\nimport { PRODUCT_COMMAND, PRODUCT_NAME } from '@constants/product'\nimport { MACRO } from '@constants/macros'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { InfoPanel } from '@components/InfoPanel'\nimport type { InfoSection, InfoItem } from '@components/InfoPanel'\nimport { t } from '@i18n'\n\nfunction buildUsageSection(): InfoSection {\n return {\n title: t('help.usageModes'),\n items: [\n { label: 'REPL', value: `${PRODUCT_COMMAND} (interactive session)` },\n {\n label: t('help.nonInteractive'),\n value: `${PRODUCT_COMMAND} -p \"question\"`,\n },\n {\n label: t('help.options'),\n value: t('help.runForOptions', { command: PRODUCT_COMMAND }),\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildCommonTasksSection(): InfoSection {\n return {\n title: t('help.commonTasks'),\n items: [\n {\n label: '\\u2022 Ask questions',\n value: 'How does foo.py work?',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Edit files',\n value: 'Update bar.ts to...',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Fix errors',\n value: 'cargo build',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run commands',\n value: '/help',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '\\u2022 Run bash',\n value: '!ls',\n valueColor: SEMANTIC_COLORS.dim,\n },\n ],\n }\n}\n\nfunction buildModeSystemsSection(): InfoSection {\n return {\n title: t('help.modeSystems'),\n items: [\n {\n label: '',\n value: t('help.safetyModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' --yolo', value: 'Skip all confirmations' },\n { label: ' --smart', value: 'Dangerous tools require confirmation' },\n { label: ' --strict', value: 'All tools require confirmation' },\n { label: ' --free', value: 'Free mode (no restrictions)' },\n {\n label: '',\n value: t('help.permissionModes'),\n valueColor: SEMANTIC_COLORS.secondary,\n },\n { label: ' default', value: 'Standard confirmation flow' },\n { label: ' acceptEdits', value: 'Auto-approve file edits' },\n { label: ' plan', value: 'Plan mode (no modifications)' },\n { label: ' bypass', value: 'Skip all permission checks' },\n {\n label: '',\n value: t('help.permissionModesSystem'),\n valueColor: SEMANTIC_COLORS.muted,\n },\n { label: ' dontAsk', value: 'Auto-deny non-allowed tools (CI/CD)' },\n { label: ' delegate', value: 'Team coordination only (auto-activated)' },\n ],\n }\n}\n\nfunction buildBuiltInSection(commands: Command[]): InfoSection {\n const builtInCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n !cmd.name.startsWith('project:') &&\n !cmd.name.startsWith('user:') &&\n !cmd.name.startsWith('plugin:') &&\n !cmd.name.startsWith('mcp:'),\n )\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n const items: InfoItem[] = builtInCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.builtInCommands'), items }\n}\n\nfunction buildCustomSection(commands: Command[]): InfoSection | null {\n const customCommands = commands\n .filter(\n cmd =>\n !cmd.isHidden &&\n (cmd.name.startsWith('project:') || cmd.name.startsWith('user:')),\n )\n .sort((a, b) =>\n a.userFacingName().localeCompare(b.userFacingName()),\n ) as CustomCommandWithScope[]\n\n if (customCommands.length === 0) return null\n\n const items: InfoItem[] = customCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: `${cmd.description}${cmd.scope ? ` [${cmd.scope}]` : ''}`,\n }))\n\n return { title: t('help.customCommands'), items }\n}\n\nfunction buildPluginSection(commands: Command[]): InfoSection | null {\n const pluginCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('plugin:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (pluginCommands.length === 0) return null\n\n const items: InfoItem[] = pluginCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.pluginCommands'), items }\n}\n\nfunction buildMcpSection(commands: Command[]): InfoSection | null {\n const mcpCommands = commands\n .filter(cmd => !cmd.isHidden && cmd.name.startsWith('mcp:'))\n .sort((a, b) => a.userFacingName().localeCompare(b.userFacingName()))\n\n if (mcpCommands.length === 0) return null\n\n const items: InfoItem[] = mcpCommands.map(cmd => ({\n label: `/${cmd.name}`,\n value: cmd.description,\n }))\n\n return { title: t('help.mcpCommands'), items }\n}\n\nfunction buildPrioritySection(): InfoSection {\n return {\n title: t('help.commandPriority'),\n items: [\n {\n label: '1.',\n value: 'Built-in commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '2.',\n value: 'Custom commands (project: / user:)',\n valueColor: SEMANTIC_COLORS.dim,\n },\n {\n label: '3.',\n value: 'Plugin commands',\n valueColor: SEMANTIC_COLORS.dim,\n },\n { label: '4.', value: 'MCP commands', valueColor: SEMANTIC_COLORS.dim },\n ],\n }\n}\n\nexport function Help({\n commands,\n onClose,\n}: {\n commands: Command[]\n onClose: () => void\n}): React.ReactNode {\n const sections: InfoSection[] = []\n\n // Usage modes\n sections.push(buildUsageSection())\n\n // Common tasks\n sections.push(buildCommonTasksSection())\n\n // Mode systems\n sections.push(buildModeSystemsSection())\n\n // Built-in commands\n sections.push(buildBuiltInSection(commands))\n\n // Custom commands (if any)\n const customSection = buildCustomSection(commands)\n if (customSection) sections.push(customSection)\n\n // Plugin commands (if any)\n const pluginSection = buildPluginSection(commands)\n if (pluginSection) sections.push(pluginSection)\n\n // MCP commands (if any)\n const mcpSection = buildMcpSection(commands)\n if (mcpSection) sections.push(mcpSection)\n\n // Priority info (if any non-built-in commands exist)\n const hasExtended =\n hasCustomCommands() || customSection || pluginSection || mcpSection\n if (hasExtended) {\n sections.push(buildPrioritySection())\n }\n\n return (\n <InfoPanel\n title={t('commands.help.title')}\n subtitle={`${PRODUCT_NAME} v${MACRO.VERSION}`}\n sections={sections}\n onClose={onClose}\n />\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,15 +2,15 @@ import { Box, Text, useInput } from "ink";
2
2
  import * as React from "react";
3
3
  import { t } from "../i18n/index.js";
4
4
  import { BRAND_GRADIENT, SEMANTIC_COLORS } from "../constants/colors.js";
5
- function getHotkeyGroups() {
6
- return [
5
+ function getHotkeyGroups(hasActiveTeam = false) {
6
+ const groups = [
7
7
  {
8
8
  title: t("hotkey.navigation"),
9
9
  hotkeys: [
10
10
  { keys: "\u2191/\u2193", description: t("hotkey.browseHistory") },
11
11
  { keys: "Ctrl+R", description: t("hotkey.searchHistory") },
12
12
  { keys: "Tab", description: t("hotkey.autocomplete") },
13
- { keys: "Esc Esc", description: t("hotkey.rollbackResponse") }
13
+ { keys: "Esc Esc", description: t("hotkey.rewind") }
14
14
  ]
15
15
  },
16
16
  {
@@ -25,10 +25,14 @@ function getHotkeyGroups() {
25
25
  {
26
26
  title: t("hotkey.features"),
27
27
  hotkeys: [
28
+ { keys: "Ctrl+G", description: t("hotkey.openExternalEditor") },
28
29
  { keys: "Ctrl+T", description: t("hotkey.toggleTodoPanel") },
30
+ { keys: "\u2325T", description: t("hotkey.toggleThinking") },
29
31
  { keys: "Ctrl+O", description: t("hotkey.cycleDisplayMode") },
32
+ { keys: "Ctrl+E", description: t("hotkey.showHidePrevious") },
30
33
  { keys: "Ctrl+B", description: t("hotkey.executeAsBash") },
31
- { keys: "Ctrl+?", description: t("hotkey.showHideHelp") }
34
+ { keys: "Ctrl+?", description: t("hotkey.showHideHelp") },
35
+ { keys: "Shift+\u2193", description: t("hotkey.toggleTeamPanel") }
32
36
  ]
33
37
  },
34
38
  {
@@ -40,10 +44,23 @@ function getHotkeyGroups() {
40
44
  ]
41
45
  }
42
46
  ];
47
+ if (hasActiveTeam) {
48
+ groups.push({
49
+ title: t("hotkey.agentTeams"),
50
+ hotkeys: [
51
+ { keys: "Shift+\u2193/\u2191", description: t("hotkey.toggleTeamPanel") },
52
+ { keys: "Ctrl+J", description: t("hotkey.toggleAgentView") },
53
+ { keys: "Ctrl+F", description: t("hotkey.killAllAgents") },
54
+ { keys: "Shift+Tab", description: t("hotkey.cyclePermissionMode") }
55
+ ]
56
+ });
57
+ }
58
+ return groups;
43
59
  }
44
60
  function HotkeyHelpPanel({
45
61
  onClose,
46
- isVisible
62
+ isVisible,
63
+ hasActiveTeam = false
47
64
  }) {
48
65
  useInput(
49
66
  (input, key) => {
@@ -67,7 +84,7 @@ function HotkeyHelpPanel({
67
84
  marginBottom: 1
68
85
  },
69
86
  /* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.START }, "\u2328\uFE0F ", t("ui.hints.shortcuts")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.secondary }, " ", "(", t("ui.hints.pressEsc"), ")")),
70
- /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 4 }, getHotkeyGroups().map((group, groupIndex) => /* @__PURE__ */ React.createElement(Box, { key: groupIndex, flexDirection: "column", minWidth: 28 }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: SEMANTIC_COLORS.secondary }, group.title), group.hotkeys.map((hotkey, hotkeyIndex) => /* @__PURE__ */ React.createElement(Box, { key: hotkeyIndex }, /* @__PURE__ */ React.createElement(Box, { width: 12 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.MIDDLE }, hotkey.keys)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, hotkey.description)))))),
87
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 4 }, getHotkeyGroups(hasActiveTeam).map((group, groupIndex) => /* @__PURE__ */ React.createElement(Box, { key: groupIndex, flexDirection: "column", minWidth: 28 }, /* @__PURE__ */ React.createElement(Text, { bold: true, underline: true, color: SEMANTIC_COLORS.secondary }, group.title), group.hotkeys.map((hotkey, hotkeyIndex) => /* @__PURE__ */ React.createElement(Box, { key: hotkeyIndex }, /* @__PURE__ */ React.createElement(Box, { width: 12 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: BRAND_GRADIENT.MIDDLE }, hotkey.keys)), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.primary }, hotkey.description)))))),
71
88
  /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, t("ui.hints.tip")))
72
89
  );
73
90
  }
@@ -81,7 +98,7 @@ function getContextHints(context) {
81
98
  { keys: "!", description: t("ui.hints.forBashMode") },
82
99
  { keys: "#", description: t("ui.hints.forMintoMd") },
83
100
  { keys: "/", description: t("ui.hints.forCommands") },
84
- { keys: "ctrl+c", description: t("common.cancel") },
101
+ { keys: "Esc Esc", description: t("hotkey.rewind") },
85
102
  { keys: "ctrl+l", description: t("common.clear") }
86
103
  ];
87
104
  case "typing":
@@ -93,8 +110,9 @@ function getContextHints(context) {
93
110
  ];
94
111
  case "loading":
95
112
  return [
113
+ { keys: "Esc", description: t("common.cancel") },
96
114
  { keys: "Ctrl+C", description: t("common.cancel") },
97
- { keys: "Esc Esc", description: t("ui.hints.rollback") }
115
+ { keys: "Esc Esc", description: t("hotkey.rewind") }
98
116
  ];
99
117
  case "completion":
100
118
  return [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/HotkeyHelpPanel.tsx"],
4
- "sourcesContent": ["/**\n * Hotkey Help Panel Component\n *\n * Displays a compact overlay showing available keyboard shortcuts.\n * Toggled with Ctrl+? or Ctrl+/ for quick reference.\n */\n\nimport { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ninterface HotkeyGroup {\n title: string\n hotkeys: Array<{\n keys: string\n description: string\n }>\n}\n\n// Build hotkey groups dynamically to support i18n\nfunction getHotkeyGroups(): HotkeyGroup[] {\n return [\n {\n title: t('hotkey.navigation'),\n hotkeys: [\n { keys: '\u2191/\u2193', description: t('hotkey.browseHistory') },\n { keys: 'Ctrl+R', description: t('hotkey.searchHistory') },\n { keys: 'Tab', description: t('hotkey.autocomplete') },\n { keys: 'Esc Esc', description: t('hotkey.rollbackResponse') },\n ],\n },\n {\n title: t('hotkey.control'),\n hotkeys: [\n { keys: 'Ctrl+C', description: t('hotkey.cancelOperation') },\n { keys: 'Ctrl+D', description: t('hotkey.exitPressTwice') },\n { keys: 'Ctrl+L', description: t('hotkey.clearScreen') },\n { keys: 'Enter', description: t('hotkey.submitPrompt') },\n ],\n },\n {\n title: t('hotkey.features'),\n hotkeys: [\n { keys: 'Ctrl+T', description: t('hotkey.toggleTodoPanel') },\n { keys: 'Ctrl+O', description: t('hotkey.cycleDisplayMode') },\n { keys: 'Ctrl+B', description: t('hotkey.executeAsBash') },\n { keys: 'Ctrl+?', description: t('hotkey.showHideHelp') },\n ],\n },\n {\n title: t('hotkey.inputModes'),\n hotkeys: [\n { keys: '/', description: t('hotkey.startSlashCommand') },\n { keys: '!', description: t('hotkey.executeBashCommand') },\n { keys: '#', description: t('hotkey.addNoteToKoding') },\n ],\n },\n ]\n}\n\ninterface Props {\n onClose: () => void\n isVisible: boolean\n}\n\nexport function HotkeyHelpPanel({\n onClose,\n isVisible,\n}: Props): React.ReactNode {\n // Handle Escape or Ctrl+? to close\n useInput(\n (input, key) => {\n if (key.escape || (key.ctrl && (input === '?' || input === '/'))) {\n onClose()\n }\n },\n { isActive: isVisible },\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={BRAND_GRADIENT.START}\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Box marginBottom={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n \u2328\uFE0F {t('ui.hints.shortcuts')}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}>\n {' '}\n ({t('ui.hints.pressEsc')})\n </Text>\n </Box>\n\n <Box flexDirection=\"row\" gap={4}>\n {getHotkeyGroups().map((group, groupIndex) => (\n <Box key={groupIndex} flexDirection=\"column\" minWidth={28}>\n <Text bold underline color={SEMANTIC_COLORS.secondary}>\n {group.title}\n </Text>\n {group.hotkeys.map((hotkey, hotkeyIndex) => (\n <Box key={hotkeyIndex}>\n <Box width={12}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hotkey.keys}\n </Text>\n </Box>\n <Text color={SEMANTIC_COLORS.primary}>\n {hotkey.description}\n </Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>{t('ui.hints.tip')}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Compact inline hotkey hint shown in the prompt area\n */\nexport function HotkeyHint(): React.ReactNode {\n return (\n <Text color={SEMANTIC_COLORS.dim}>\n {t('hotkey.ctrlQuestionForShortcuts')}\n </Text>\n )\n}\n\n/**\n * Context state for determining which hints to show\n */\nexport type InputContext =\n | 'idle' // Empty input, ready for new command\n | 'typing' // User is typing a prompt\n | 'loading' // Request is being processed\n | 'completion' // Autocomplete suggestions visible\n | 'history_search' // Ctrl+R history search active\n | 'slash_command' // Typing a slash command\n\ninterface ContextHint {\n keys: string\n description: string\n}\n\n/**\n * Get context-specific hotkey hints based on current input state\n */\nfunction getContextHints(context: InputContext): ContextHint[] {\n switch (context) {\n case 'idle':\n return [\n { keys: '!', description: t('ui.hints.forBashMode') },\n { keys: '#', description: t('ui.hints.forMintoMd') },\n { keys: '/', description: t('ui.hints.forCommands') },\n { keys: 'ctrl+c', description: t('common.cancel') },\n { keys: 'ctrl+l', description: t('common.clear') },\n ]\n case 'typing':\n return [\n { keys: 'Enter', description: t('ui.hints.send') },\n { keys: 'Tab', description: t('ui.hints.complete') },\n { keys: 'Ctrl+B', description: t('ui.hints.bash') },\n { keys: 'Esc', description: t('common.clear') },\n ]\n case 'loading':\n return [\n { keys: 'Ctrl+C', description: t('common.cancel') },\n { keys: 'Esc Esc', description: t('ui.hints.rollback') },\n ]\n case 'completion':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.select') },\n { keys: 'Tab', description: t('ui.hints.confirm') },\n { keys: 'Esc', description: t('ui.hints.close') },\n ]\n case 'history_search':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.browse') },\n { keys: 'Enter', description: t('ui.hints.select') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n case 'slash_command':\n return [\n { keys: 'Tab', description: t('ui.hints.completeCommand') },\n { keys: 'Enter', description: t('ui.hints.execute') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n default:\n return [{ keys: 'Ctrl+?', description: t('common.help') }]\n }\n}\n\ninterface ContextAwareHintsProps {\n context: InputContext\n compact?: boolean // When true, show minimal hints\n}\n\n/**\n * Context-aware hotkey hints that adapt based on user's current activity\n * Shows relevant shortcuts for the current state without overwhelming the user\n */\nexport function ContextAwareHints({\n context,\n compact = true,\n}: ContextAwareHintsProps): React.ReactNode {\n const hints = getContextHints(context)\n\n if (compact) {\n // Single line, condensed format (0.1.7 style with \u00B7 separator)\n return (\n <Box>\n {hints.map((hint, i) => (\n <React.Fragment key={i}>\n {i > 0 && <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>}\n <Text color={SEMANTIC_COLORS.dim}>\n {hint.keys} {hint.description}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n )\n }\n\n // Expanded format with more padding\n return (\n <Box gap={2}>\n {hints.map((hint, i) => (\n <Box key={i}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hint.keys}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}> {hint.description}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Hotkey Help Panel Component\n *\n * Displays a compact overlay showing available keyboard shortcuts.\n * Toggled with Ctrl+? or Ctrl+/ for quick reference.\n */\n\nimport { Box, Text, useInput } from 'ink'\nimport * as React from 'react'\nimport { t } from '@i18n'\nimport { BRAND_GRADIENT, SEMANTIC_COLORS } from '@constants/colors'\n\ninterface HotkeyGroup {\n title: string\n hotkeys: Array<{\n keys: string\n description: string\n }>\n}\n\n// Build hotkey groups dynamically to support i18n\nfunction getHotkeyGroups(hasActiveTeam = false): HotkeyGroup[] {\n const groups: HotkeyGroup[] = [\n {\n title: t('hotkey.navigation'),\n hotkeys: [\n { keys: '\u2191/\u2193', description: t('hotkey.browseHistory') },\n { keys: 'Ctrl+R', description: t('hotkey.searchHistory') },\n { keys: 'Tab', description: t('hotkey.autocomplete') },\n { keys: 'Esc Esc', description: t('hotkey.rewind') },\n ],\n },\n {\n title: t('hotkey.control'),\n hotkeys: [\n { keys: 'Ctrl+C', description: t('hotkey.cancelOperation') },\n { keys: 'Ctrl+D', description: t('hotkey.exitPressTwice') },\n { keys: 'Ctrl+L', description: t('hotkey.clearScreen') },\n { keys: 'Enter', description: t('hotkey.submitPrompt') },\n ],\n },\n {\n title: t('hotkey.features'),\n hotkeys: [\n { keys: 'Ctrl+G', description: t('hotkey.openExternalEditor') },\n { keys: 'Ctrl+T', description: t('hotkey.toggleTodoPanel') },\n { keys: '\u2325T', description: t('hotkey.toggleThinking') },\n { keys: 'Ctrl+O', description: t('hotkey.cycleDisplayMode') },\n { keys: 'Ctrl+E', description: t('hotkey.showHidePrevious') },\n { keys: 'Ctrl+B', description: t('hotkey.executeAsBash') },\n { keys: 'Ctrl+?', description: t('hotkey.showHideHelp') },\n { keys: 'Shift+\u2193', description: t('hotkey.toggleTeamPanel') },\n ],\n },\n {\n title: t('hotkey.inputModes'),\n hotkeys: [\n { keys: '/', description: t('hotkey.startSlashCommand') },\n { keys: '!', description: t('hotkey.executeBashCommand') },\n { keys: '#', description: t('hotkey.addNoteToKoding') },\n ],\n },\n ]\n\n // Add agent teams shortcuts when a team is active\n if (hasActiveTeam) {\n groups.push({\n title: t('hotkey.agentTeams'),\n hotkeys: [\n { keys: 'Shift+\u2193/\u2191', description: t('hotkey.toggleTeamPanel') },\n { keys: 'Ctrl+J', description: t('hotkey.toggleAgentView') },\n { keys: 'Ctrl+F', description: t('hotkey.killAllAgents') },\n { keys: 'Shift+Tab', description: t('hotkey.cyclePermissionMode') },\n ],\n })\n }\n\n return groups\n}\n\ninterface Props {\n onClose: () => void\n isVisible: boolean\n hasActiveTeam?: boolean\n}\n\nexport function HotkeyHelpPanel({\n onClose,\n isVisible,\n hasActiveTeam = false,\n}: Props): React.ReactNode {\n // Handle Escape or Ctrl+? to close\n useInput(\n (input, key) => {\n if (key.escape || (key.ctrl && (input === '?' || input === '/'))) {\n onClose()\n }\n },\n { isActive: isVisible },\n )\n\n if (!isVisible) {\n return null\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={BRAND_GRADIENT.START}\n paddingX={2}\n paddingY={1}\n marginBottom={1}\n >\n <Box marginBottom={1}>\n <Text bold color={BRAND_GRADIENT.START}>\n \u2328\uFE0F {t('ui.hints.shortcuts')}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}>\n {' '}\n ({t('ui.hints.pressEsc')})\n </Text>\n </Box>\n\n <Box flexDirection=\"row\" gap={4}>\n {getHotkeyGroups(hasActiveTeam).map((group, groupIndex) => (\n <Box key={groupIndex} flexDirection=\"column\" minWidth={28}>\n <Text bold underline color={SEMANTIC_COLORS.secondary}>\n {group.title}\n </Text>\n {group.hotkeys.map((hotkey, hotkeyIndex) => (\n <Box key={hotkeyIndex}>\n <Box width={12}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hotkey.keys}\n </Text>\n </Box>\n <Text color={SEMANTIC_COLORS.primary}>\n {hotkey.description}\n </Text>\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>{t('ui.hints.tip')}</Text>\n </Box>\n </Box>\n )\n}\n\n/**\n * Compact inline hotkey hint shown in the prompt area\n */\nexport function HotkeyHint(): React.ReactNode {\n return (\n <Text color={SEMANTIC_COLORS.dim}>\n {t('hotkey.ctrlQuestionForShortcuts')}\n </Text>\n )\n}\n\n/**\n * Context state for determining which hints to show\n */\nexport type InputContext =\n | 'idle' // Empty input, ready for new command\n | 'typing' // User is typing a prompt\n | 'loading' // Request is being processed\n | 'completion' // Autocomplete suggestions visible\n | 'history_search' // Ctrl+R history search active\n | 'slash_command' // Typing a slash command\n\ninterface ContextHint {\n keys: string\n description: string\n}\n\n/**\n * Get context-specific hotkey hints based on current input state\n */\nfunction getContextHints(context: InputContext): ContextHint[] {\n switch (context) {\n case 'idle':\n return [\n { keys: '!', description: t('ui.hints.forBashMode') },\n { keys: '#', description: t('ui.hints.forMintoMd') },\n { keys: '/', description: t('ui.hints.forCommands') },\n { keys: 'Esc Esc', description: t('hotkey.rewind') },\n { keys: 'ctrl+l', description: t('common.clear') },\n ]\n case 'typing':\n return [\n { keys: 'Enter', description: t('ui.hints.send') },\n { keys: 'Tab', description: t('ui.hints.complete') },\n { keys: 'Ctrl+B', description: t('ui.hints.bash') },\n { keys: 'Esc', description: t('common.clear') },\n ]\n case 'loading':\n return [\n { keys: 'Esc', description: t('common.cancel') },\n { keys: 'Ctrl+C', description: t('common.cancel') },\n { keys: 'Esc Esc', description: t('hotkey.rewind') },\n ]\n case 'completion':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.select') },\n { keys: 'Tab', description: t('ui.hints.confirm') },\n { keys: 'Esc', description: t('ui.hints.close') },\n ]\n case 'history_search':\n return [\n { keys: '\u2191/\u2193', description: t('ui.hints.browse') },\n { keys: 'Enter', description: t('ui.hints.select') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n case 'slash_command':\n return [\n { keys: 'Tab', description: t('ui.hints.completeCommand') },\n { keys: 'Enter', description: t('ui.hints.execute') },\n { keys: 'Esc', description: t('common.cancel') },\n ]\n default:\n return [{ keys: 'Ctrl+?', description: t('common.help') }]\n }\n}\n\ninterface ContextAwareHintsProps {\n context: InputContext\n compact?: boolean // When true, show minimal hints\n}\n\n/**\n * Context-aware hotkey hints that adapt based on user's current activity\n * Shows relevant shortcuts for the current state without overwhelming the user\n */\nexport function ContextAwareHints({\n context,\n compact = true,\n}: ContextAwareHintsProps): React.ReactNode {\n const hints = getContextHints(context)\n\n if (compact) {\n // Single line, condensed format (0.1.7 style with \u00B7 separator)\n return (\n <Box>\n {hints.map((hint, i) => (\n <React.Fragment key={i}>\n {i > 0 && <Text color={SEMANTIC_COLORS.dim}> \u00B7 </Text>}\n <Text color={SEMANTIC_COLORS.dim}>\n {hint.keys} {hint.description}\n </Text>\n </React.Fragment>\n ))}\n </Box>\n )\n }\n\n // Expanded format with more padding\n return (\n <Box gap={2}>\n {hints.map((hint, i) => (\n <Box key={i}>\n <Text bold color={BRAND_GRADIENT.MIDDLE}>\n {hint.keys}\n </Text>\n <Text color={SEMANTIC_COLORS.secondary}> {hint.description}</Text>\n </Box>\n ))}\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,10 @@
1
+ import { Box, Text } from "ink";
2
+ import React from "react";
3
+ function IdleNotificationBar({ notifications }) {
4
+ if (notifications.length === 0) return null;
5
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, notifications.map((n) => /* @__PURE__ */ React.createElement(Box, { key: n.id }, /* @__PURE__ */ React.createElement(Text, { color: n.color }, "\u25D1", " ", n.memberName, " went idle"))));
6
+ }
7
+ export {
8
+ IdleNotificationBar
9
+ };
10
+ //# sourceMappingURL=IdleNotificationBar.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/IdleNotificationBar.tsx"],
4
+ "sourcesContent": ["/**\n * IdleNotificationBar Component\n *\n * Renders a small stack of auto-dismissing notifications when teammates\n * transition to idle status. Each line shows the teammate's assigned color\n * and name. Only renders when there are active notifications.\n */\n\nimport { Box, Text } from 'ink'\nimport React from 'react'\nimport type { IdleNotification } from '@hooks/useIdleNotifications'\n\ntype Props = {\n notifications: IdleNotification[]\n}\n\nexport function IdleNotificationBar({ notifications }: Props): React.ReactNode {\n if (notifications.length === 0) return null\n\n return (\n <Box flexDirection=\"column\">\n {notifications.map(n => (\n <Box key={n.id}>\n <Text color={n.color}>\n {'\\u25D1'} {n.memberName} went idle\n </Text>\n </Box>\n ))}\n </Box>\n )\n}\n"],
5
+ "mappings": "AAQA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAOX,SAAS,oBAAoB,EAAE,cAAc,GAA2B;AAC7E,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,SACE,oCAAC,OAAI,eAAc,YAChB,cAAc,IAAI,OACjB,oCAAC,OAAI,KAAK,EAAE,MACV,oCAAC,QAAK,OAAO,EAAE,SACZ,UAAS,KAAE,EAAE,YAAW,YAC3B,CACF,CACD,CACH;AAEJ;",
6
+ "names": []
7
+ }