@within-7/minto 0.0.5-dev.1

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 (701) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1097 -0
  3. package/README.zh-CN.md +1097 -0
  4. package/cli.js +59 -0
  5. package/dist/Tool.js +1 -0
  6. package/dist/Tool.js.map +7 -0
  7. package/dist/commands/agents.js +2086 -0
  8. package/dist/commands/agents.js.map +7 -0
  9. package/dist/commands/approvedTools.js +36 -0
  10. package/dist/commands/approvedTools.js.map +7 -0
  11. package/dist/commands/bug.js +21 -0
  12. package/dist/commands/bug.js.map +7 -0
  13. package/dist/commands/build.js +74 -0
  14. package/dist/commands/build.js.map +7 -0
  15. package/dist/commands/clear.js +37 -0
  16. package/dist/commands/clear.js.map +7 -0
  17. package/dist/commands/compact.js +82 -0
  18. package/dist/commands/compact.js.map +7 -0
  19. package/dist/commands/compression.js +57 -0
  20. package/dist/commands/compression.js.map +7 -0
  21. package/dist/commands/config.js +20 -0
  22. package/dist/commands/config.js.map +7 -0
  23. package/dist/commands/cost.js +19 -0
  24. package/dist/commands/cost.js.map +7 -0
  25. package/dist/commands/ctx_viz.js +152 -0
  26. package/dist/commands/ctx_viz.js.map +7 -0
  27. package/dist/commands/doctor.js +25 -0
  28. package/dist/commands/doctor.js.map +7 -0
  29. package/dist/commands/help.js +20 -0
  30. package/dist/commands/help.js.map +7 -0
  31. package/dist/commands/init.js +38 -0
  32. package/dist/commands/init.js.map +7 -0
  33. package/dist/commands/listen.js +37 -0
  34. package/dist/commands/listen.js.map +7 -0
  35. package/dist/commands/login.js +37 -0
  36. package/dist/commands/login.js.map +7 -0
  37. package/dist/commands/logout.js +33 -0
  38. package/dist/commands/logout.js.map +7 -0
  39. package/dist/commands/mcp-interactive.js +267 -0
  40. package/dist/commands/mcp-interactive.js.map +7 -0
  41. package/dist/commands/mcp.js +40 -0
  42. package/dist/commands/mcp.js.map +7 -0
  43. package/dist/commands/mcp_refresh.js +40 -0
  44. package/dist/commands/mcp_refresh.js.map +7 -0
  45. package/dist/commands/model.js +41 -0
  46. package/dist/commands/model.js.map +7 -0
  47. package/dist/commands/modelstatus.js +21 -0
  48. package/dist/commands/modelstatus.js.map +7 -0
  49. package/dist/commands/onboarding.js +36 -0
  50. package/dist/commands/onboarding.js.map +7 -0
  51. package/dist/commands/plugin/AddMarketplaceForm.js +62 -0
  52. package/dist/commands/plugin/AddMarketplaceForm.js.map +7 -0
  53. package/dist/commands/plugin/ConfirmDialog.js +71 -0
  54. package/dist/commands/plugin/ConfirmDialog.js.map +7 -0
  55. package/dist/commands/plugin/ErrorView.js +33 -0
  56. package/dist/commands/plugin/ErrorView.js.map +7 -0
  57. package/dist/commands/plugin/InstalledPluginsByMarketplace.js +135 -0
  58. package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +7 -0
  59. package/dist/commands/plugin/InstalledPluginsManager.js +99 -0
  60. package/dist/commands/plugin/InstalledPluginsManager.js.map +7 -0
  61. package/dist/commands/plugin/LoadingView.js +14 -0
  62. package/dist/commands/plugin/LoadingView.js.map +7 -0
  63. package/dist/commands/plugin/MainMenu.js +57 -0
  64. package/dist/commands/plugin/MainMenu.js.map +7 -0
  65. package/dist/commands/plugin/MarketplaceManager.js +155 -0
  66. package/dist/commands/plugin/MarketplaceManager.js.map +7 -0
  67. package/dist/commands/plugin/MarketplaceSelector.js +119 -0
  68. package/dist/commands/plugin/MarketplaceSelector.js.map +7 -0
  69. package/dist/commands/plugin/PlaceholderScreen.js +16 -0
  70. package/dist/commands/plugin/PlaceholderScreen.js.map +7 -0
  71. package/dist/commands/plugin/PluginBrowser.js +180 -0
  72. package/dist/commands/plugin/PluginBrowser.js.map +7 -0
  73. package/dist/commands/plugin/PluginDetailsInstall.js +152 -0
  74. package/dist/commands/plugin/PluginDetailsInstall.js.map +7 -0
  75. package/dist/commands/plugin/PluginDetailsManage.js +200 -0
  76. package/dist/commands/plugin/PluginDetailsManage.js.map +7 -0
  77. package/dist/commands/plugin/components.js +16 -0
  78. package/dist/commands/plugin/components.js.map +7 -0
  79. package/dist/commands/plugin/example-usage.js +63 -0
  80. package/dist/commands/plugin/example-usage.js.map +7 -0
  81. package/dist/commands/plugin/types.js +1 -0
  82. package/dist/commands/plugin/types.js.map +7 -0
  83. package/dist/commands/plugin/utils.js +77 -0
  84. package/dist/commands/plugin/utils.js.map +7 -0
  85. package/dist/commands/plugin-interactive.js +446 -0
  86. package/dist/commands/plugin-interactive.js.map +7 -0
  87. package/dist/commands/plugin.js +523 -0
  88. package/dist/commands/plugin.js.map +7 -0
  89. package/dist/commands/pr_comments.js +61 -0
  90. package/dist/commands/pr_comments.js.map +7 -0
  91. package/dist/commands/quit.js +16 -0
  92. package/dist/commands/quit.js.map +7 -0
  93. package/dist/commands/refreshCommands.js +43 -0
  94. package/dist/commands/refreshCommands.js.map +7 -0
  95. package/dist/commands/release-notes.js +30 -0
  96. package/dist/commands/release-notes.js.map +7 -0
  97. package/dist/commands/resume.js +35 -0
  98. package/dist/commands/resume.js.map +7 -0
  99. package/dist/commands/review.js +51 -0
  100. package/dist/commands/review.js.map +7 -0
  101. package/dist/commands/terminalSetup.js +164 -0
  102. package/dist/commands/terminalSetup.js.map +7 -0
  103. package/dist/commands.js +104 -0
  104. package/dist/commands.js.map +7 -0
  105. package/dist/components/AgentResponseBlock.js +41 -0
  106. package/dist/components/AgentResponseBlock.js.map +7 -0
  107. package/dist/components/AgentThinkingBlock.js +40 -0
  108. package/dist/components/AgentThinkingBlock.js.map +7 -0
  109. package/dist/components/AsciiLogo.js +19 -0
  110. package/dist/components/AsciiLogo.js.map +7 -0
  111. package/dist/components/BackgroundTasksPanel.js +124 -0
  112. package/dist/components/BackgroundTasksPanel.js.map +7 -0
  113. package/dist/components/Bug.js +147 -0
  114. package/dist/components/Bug.js.map +7 -0
  115. package/dist/components/Config.js +166 -0
  116. package/dist/components/Config.js.map +7 -0
  117. package/dist/components/ConsoleOAuthFlow.js +178 -0
  118. package/dist/components/ConsoleOAuthFlow.js.map +7 -0
  119. package/dist/components/Cost.js +13 -0
  120. package/dist/components/Cost.js.map +7 -0
  121. package/dist/components/CostThresholdDialog.js +38 -0
  122. package/dist/components/CostThresholdDialog.js.map +7 -0
  123. package/dist/components/CustomSelect/option-map.js +32 -0
  124. package/dist/components/CustomSelect/option-map.js.map +7 -0
  125. package/dist/components/CustomSelect/select-option.js +34 -0
  126. package/dist/components/CustomSelect/select-option.js.map +7 -0
  127. package/dist/components/CustomSelect/select.js +64 -0
  128. package/dist/components/CustomSelect/select.js.map +7 -0
  129. package/dist/components/CustomSelect/theme.js +1 -0
  130. package/dist/components/CustomSelect/theme.js.map +7 -0
  131. package/dist/components/CustomSelect/use-select-state.js +220 -0
  132. package/dist/components/CustomSelect/use-select-state.js.map +7 -0
  133. package/dist/components/CustomSelect/use-select.js +21 -0
  134. package/dist/components/CustomSelect/use-select.js.map +7 -0
  135. package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
  136. package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
  137. package/dist/components/FileEditToolUpdatedMessage.js +32 -0
  138. package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
  139. package/dist/components/HeaderBar.js +57 -0
  140. package/dist/components/HeaderBar.js.map +7 -0
  141. package/dist/components/Help.js +46 -0
  142. package/dist/components/Help.js.map +7 -0
  143. package/dist/components/HighlightedCode.js +30 -0
  144. package/dist/components/HighlightedCode.js.map +7 -0
  145. package/dist/components/HistorySearchOverlay.js +48 -0
  146. package/dist/components/HistorySearchOverlay.js.map +7 -0
  147. package/dist/components/InteractionRoundBlock.js +56 -0
  148. package/dist/components/InteractionRoundBlock.js.map +7 -0
  149. package/dist/components/InvalidConfigDialog.js +83 -0
  150. package/dist/components/InvalidConfigDialog.js.map +7 -0
  151. package/dist/components/Link.js +18 -0
  152. package/dist/components/Link.js.map +7 -0
  153. package/dist/components/LogSelector.js +50 -0
  154. package/dist/components/LogSelector.js.map +7 -0
  155. package/dist/components/Logo.js +96 -0
  156. package/dist/components/Logo.js.map +7 -0
  157. package/dist/components/MCPServerApprovalDialog.js +79 -0
  158. package/dist/components/MCPServerApprovalDialog.js.map +7 -0
  159. package/dist/components/MCPServerDialogCopy.js +11 -0
  160. package/dist/components/MCPServerDialogCopy.js.map +7 -0
  161. package/dist/components/MCPServerMultiselectDialog.js +80 -0
  162. package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
  163. package/dist/components/Message.js +146 -0
  164. package/dist/components/Message.js.map +7 -0
  165. package/dist/components/MessageResponse.js +9 -0
  166. package/dist/components/MessageResponse.js.map +7 -0
  167. package/dist/components/MessageSelector.js +125 -0
  168. package/dist/components/MessageSelector.js.map +7 -0
  169. package/dist/components/ModeIndicator.js +38 -0
  170. package/dist/components/ModeIndicator.js.map +7 -0
  171. package/dist/components/ModelConfig.js +208 -0
  172. package/dist/components/ModelConfig.js.map +7 -0
  173. package/dist/components/ModelListManager.js +140 -0
  174. package/dist/components/ModelListManager.js.map +7 -0
  175. package/dist/components/ModelSelector.js +2062 -0
  176. package/dist/components/ModelSelector.js.map +7 -0
  177. package/dist/components/ModelStatusDisplay.js +87 -0
  178. package/dist/components/ModelStatusDisplay.js.map +7 -0
  179. package/dist/components/Onboarding.js +153 -0
  180. package/dist/components/Onboarding.js.map +7 -0
  181. package/dist/components/PressEnterToContinue.js +10 -0
  182. package/dist/components/PressEnterToContinue.js.map +7 -0
  183. package/dist/components/ProjectOnboarding.js +99 -0
  184. package/dist/components/ProjectOnboarding.js.map +7 -0
  185. package/dist/components/PromptInput.js +755 -0
  186. package/dist/components/PromptInput.js.map +7 -0
  187. package/dist/components/QuitSummary.js +81 -0
  188. package/dist/components/QuitSummary.js.map +7 -0
  189. package/dist/components/SentryErrorBoundary.js +27 -0
  190. package/dist/components/SentryErrorBoundary.js.map +7 -0
  191. package/dist/components/Spinner.js +101 -0
  192. package/dist/components/Spinner.js.map +7 -0
  193. package/dist/components/SpinnerSymbol.js +78 -0
  194. package/dist/components/SpinnerSymbol.js.map +7 -0
  195. package/dist/components/StreamingBashOutput.js +70 -0
  196. package/dist/components/StreamingBashOutput.js.map +7 -0
  197. package/dist/components/StructuredDiff.js +148 -0
  198. package/dist/components/StructuredDiff.js.map +7 -0
  199. package/dist/components/SubagentBlock.js +157 -0
  200. package/dist/components/SubagentBlock.js.map +7 -0
  201. package/dist/components/SubagentManager.js +65 -0
  202. package/dist/components/SubagentManager.js.map +7 -0
  203. package/dist/components/SubagentProgress.js +109 -0
  204. package/dist/components/SubagentProgress.js.map +7 -0
  205. package/dist/components/SubagentStatusMarker.js +37 -0
  206. package/dist/components/SubagentStatusMarker.js.map +7 -0
  207. package/dist/components/TaskCard.js +170 -0
  208. package/dist/components/TaskCard.js.map +7 -0
  209. package/dist/components/TextInput.js +100 -0
  210. package/dist/components/TextInput.js.map +7 -0
  211. package/dist/components/TimelineRenderer.js +31 -0
  212. package/dist/components/TimelineRenderer.js.map +7 -0
  213. package/dist/components/TodoChangeBlock.js +29 -0
  214. package/dist/components/TodoChangeBlock.js.map +7 -0
  215. package/dist/components/TodoChangeLine.js +22 -0
  216. package/dist/components/TodoChangeLine.js.map +7 -0
  217. package/dist/components/TodoItem.js +35 -0
  218. package/dist/components/TodoItem.js.map +7 -0
  219. package/dist/components/TodoPanel.js +55 -0
  220. package/dist/components/TodoPanel.js.map +7 -0
  221. package/dist/components/TokenWarning.js +19 -0
  222. package/dist/components/TokenWarning.js.map +7 -0
  223. package/dist/components/ToolExecutionBlock.js +18 -0
  224. package/dist/components/ToolExecutionBlock.js.map +7 -0
  225. package/dist/components/ToolUseLoader.js +24 -0
  226. package/dist/components/ToolUseLoader.js.map +7 -0
  227. package/dist/components/TrustDialog.js +71 -0
  228. package/dist/components/TrustDialog.js.map +7 -0
  229. package/dist/components/UserQueryBlock.js +12 -0
  230. package/dist/components/UserQueryBlock.js.map +7 -0
  231. package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
  232. package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
  233. package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
  234. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
  235. package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
  236. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
  237. package/dist/components/binary-feedback/utils.js +108 -0
  238. package/dist/components/binary-feedback/utils.js.map +7 -0
  239. package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
  240. package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
  241. package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
  242. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
  243. package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
  244. package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
  245. package/dist/components/messages/AssistantTextMessage.js +78 -0
  246. package/dist/components/messages/AssistantTextMessage.js.map +7 -0
  247. package/dist/components/messages/AssistantThinkingMessage.js +27 -0
  248. package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
  249. package/dist/components/messages/AssistantToolUseMessage.js +91 -0
  250. package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
  251. package/dist/components/messages/TaskProgressMessage.js +11 -0
  252. package/dist/components/messages/TaskProgressMessage.js.map +7 -0
  253. package/dist/components/messages/TaskToolMessage.js +39 -0
  254. package/dist/components/messages/TaskToolMessage.js.map +7 -0
  255. package/dist/components/messages/UserBashInputMessage.js +18 -0
  256. package/dist/components/messages/UserBashInputMessage.js.map +7 -0
  257. package/dist/components/messages/UserCommandMessage.js +20 -0
  258. package/dist/components/messages/UserCommandMessage.js.map +7 -0
  259. package/dist/components/messages/UserKodingInputMessage.js +18 -0
  260. package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
  261. package/dist/components/messages/UserPromptMessage.js +20 -0
  262. package/dist/components/messages/UserPromptMessage.js.map +7 -0
  263. package/dist/components/messages/UserTextMessage.js +25 -0
  264. package/dist/components/messages/UserTextMessage.js.map +7 -0
  265. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
  266. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
  267. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
  268. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
  269. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
  270. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
  271. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
  272. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
  273. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
  274. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
  275. package/dist/components/messages/UserToolResultMessage/utils.js +50 -0
  276. package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
  277. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
  278. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
  279. package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
  280. package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
  281. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
  282. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
  283. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
  284. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
  285. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
  286. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
  287. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
  288. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
  289. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
  290. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
  291. package/dist/components/permissions/PermissionRequest.js +70 -0
  292. package/dist/components/permissions/PermissionRequest.js.map +7 -0
  293. package/dist/components/permissions/PermissionRequestTitle.js +52 -0
  294. package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
  295. package/dist/components/permissions/hooks.js +23 -0
  296. package/dist/components/permissions/hooks.js.map +7 -0
  297. package/dist/components/permissions/toolUseOptions.js +46 -0
  298. package/dist/components/permissions/toolUseOptions.js.map +7 -0
  299. package/dist/components/permissions/utils.js +21 -0
  300. package/dist/components/permissions/utils.js.map +7 -0
  301. package/dist/constants/claude-asterisk-ascii-art.js +242 -0
  302. package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
  303. package/dist/constants/colors.js +126 -0
  304. package/dist/constants/colors.js.map +7 -0
  305. package/dist/constants/compressionPrompts.js +73 -0
  306. package/dist/constants/compressionPrompts.js.map +7 -0
  307. package/dist/constants/figures.js +6 -0
  308. package/dist/constants/figures.js.map +7 -0
  309. package/dist/constants/macros.js +11 -0
  310. package/dist/constants/macros.js.map +7 -0
  311. package/dist/constants/modelCapabilities.js +154 -0
  312. package/dist/constants/modelCapabilities.js.map +7 -0
  313. package/dist/constants/models.js +1034 -0
  314. package/dist/constants/models.js.map +7 -0
  315. package/dist/constants/oauth.js +18 -0
  316. package/dist/constants/oauth.js.map +7 -0
  317. package/dist/constants/product.js +26 -0
  318. package/dist/constants/product.js.map +7 -0
  319. package/dist/constants/prompts.js +168 -0
  320. package/dist/constants/prompts.js.map +7 -0
  321. package/dist/constants/releaseNotes.js +9 -0
  322. package/dist/constants/releaseNotes.js.map +7 -0
  323. package/dist/constants/symbols.js +50 -0
  324. package/dist/constants/symbols.js.map +7 -0
  325. package/dist/context/PermissionContext.js +111 -0
  326. package/dist/context/PermissionContext.js.map +7 -0
  327. package/dist/context.js +278 -0
  328. package/dist/context.js.map +7 -0
  329. package/dist/cost-tracker.js +76 -0
  330. package/dist/cost-tracker.js.map +7 -0
  331. package/dist/entrypoints/cli-wrapper.js +61 -0
  332. package/dist/entrypoints/cli-wrapper.js.map +7 -0
  333. package/dist/entrypoints/cli.js +1115 -0
  334. package/dist/entrypoints/cli.js.map +7 -0
  335. package/dist/entrypoints/mcp.js +150 -0
  336. package/dist/entrypoints/mcp.js.map +7 -0
  337. package/dist/history.js +25 -0
  338. package/dist/history.js.map +7 -0
  339. package/dist/hooks/useApiKeyVerification.js +12 -0
  340. package/dist/hooks/useApiKeyVerification.js.map +7 -0
  341. package/dist/hooks/useArrowKeyHistory.js +50 -0
  342. package/dist/hooks/useArrowKeyHistory.js.map +7 -0
  343. package/dist/hooks/useCanUseTool.js +87 -0
  344. package/dist/hooks/useCanUseTool.js.map +7 -0
  345. package/dist/hooks/useCancelRequest.js +28 -0
  346. package/dist/hooks/useCancelRequest.js.map +7 -0
  347. package/dist/hooks/useDoublePress.js +31 -0
  348. package/dist/hooks/useDoublePress.js.map +7 -0
  349. package/dist/hooks/useExitOnCtrlCD.js +26 -0
  350. package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
  351. package/dist/hooks/useHistorySearch.js +62 -0
  352. package/dist/hooks/useHistorySearch.js.map +7 -0
  353. package/dist/hooks/useInterval.js +18 -0
  354. package/dist/hooks/useInterval.js.map +7 -0
  355. package/dist/hooks/useLogMessages.js +14 -0
  356. package/dist/hooks/useLogMessages.js.map +7 -0
  357. package/dist/hooks/useLogStartupTime.js +10 -0
  358. package/dist/hooks/useLogStartupTime.js.map +7 -0
  359. package/dist/hooks/useNotifyAfterTimeout.js +42 -0
  360. package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
  361. package/dist/hooks/usePermissionRequestLogging.js +23 -0
  362. package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
  363. package/dist/hooks/useTerminalSize.js +38 -0
  364. package/dist/hooks/useTerminalSize.js.map +7 -0
  365. package/dist/hooks/useTextInput.js +252 -0
  366. package/dist/hooks/useTextInput.js.map +7 -0
  367. package/dist/hooks/useUnifiedCompletion.js +929 -0
  368. package/dist/hooks/useUnifiedCompletion.js.map +7 -0
  369. package/dist/index.js +5 -0
  370. package/dist/index.js.map +7 -0
  371. package/dist/messages.js +33 -0
  372. package/dist/messages.js.map +7 -0
  373. package/dist/package.json +4 -0
  374. package/dist/permissions.js +194 -0
  375. package/dist/permissions.js.map +7 -0
  376. package/dist/query.js +499 -0
  377. package/dist/query.js.map +7 -0
  378. package/dist/screens/Doctor.js +22 -0
  379. package/dist/screens/Doctor.js.map +7 -0
  380. package/dist/screens/LogList.js +55 -0
  381. package/dist/screens/LogList.js.map +7 -0
  382. package/dist/screens/REPL.js +671 -0
  383. package/dist/screens/REPL.js.map +7 -0
  384. package/dist/screens/ResumeConversation.js +56 -0
  385. package/dist/screens/ResumeConversation.js.map +7 -0
  386. package/dist/services/adapters/base.js +29 -0
  387. package/dist/services/adapters/base.js.map +7 -0
  388. package/dist/services/adapters/chatCompletions.js +69 -0
  389. package/dist/services/adapters/chatCompletions.js.map +7 -0
  390. package/dist/services/adapters/responsesAPI.js +126 -0
  391. package/dist/services/adapters/responsesAPI.js.map +7 -0
  392. package/dist/services/claude.js +1573 -0
  393. package/dist/services/claude.js.map +7 -0
  394. package/dist/services/compressionService.js +210 -0
  395. package/dist/services/compressionService.js.map +7 -0
  396. package/dist/services/customCommands.js +437 -0
  397. package/dist/services/customCommands.js.map +7 -0
  398. package/dist/services/fileFreshness.js +275 -0
  399. package/dist/services/fileFreshness.js.map +7 -0
  400. package/dist/services/gpt5ConnectionTest.js +248 -0
  401. package/dist/services/gpt5ConnectionTest.js.map +7 -0
  402. package/dist/services/hookExecutor.js +276 -0
  403. package/dist/services/hookExecutor.js.map +7 -0
  404. package/dist/services/mainAgentCompressor.js +84 -0
  405. package/dist/services/mainAgentCompressor.js.map +7 -0
  406. package/dist/services/mcpClient.js +449 -0
  407. package/dist/services/mcpClient.js.map +7 -0
  408. package/dist/services/mcpServerApproval.js +55 -0
  409. package/dist/services/mcpServerApproval.js.map +7 -0
  410. package/dist/services/mentionProcessor.js +201 -0
  411. package/dist/services/mentionProcessor.js.map +7 -0
  412. package/dist/services/modelAdapterFactory.js +47 -0
  413. package/dist/services/modelAdapterFactory.js.map +7 -0
  414. package/dist/services/notifier.js +35 -0
  415. package/dist/services/notifier.js.map +7 -0
  416. package/dist/services/oauth.js +247 -0
  417. package/dist/services/oauth.js.map +7 -0
  418. package/dist/services/openai.js +995 -0
  419. package/dist/services/openai.js.map +7 -0
  420. package/dist/services/responseStateManager.js +68 -0
  421. package/dist/services/responseStateManager.js.map +7 -0
  422. package/dist/services/sentry.js +9 -0
  423. package/dist/services/sentry.js.map +7 -0
  424. package/dist/services/subagentAbortManager.js +95 -0
  425. package/dist/services/subagentAbortManager.js.map +7 -0
  426. package/dist/services/subagentCompressor.js +146 -0
  427. package/dist/services/subagentCompressor.js.map +7 -0
  428. package/dist/services/systemReminder.js +335 -0
  429. package/dist/services/systemReminder.js.map +7 -0
  430. package/dist/services/vcr.js +133 -0
  431. package/dist/services/vcr.js.map +7 -0
  432. package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
  433. package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
  434. package/dist/tools/ArchitectTool/prompt.js +18 -0
  435. package/dist/tools/ArchitectTool/prompt.js.map +7 -0
  436. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
  437. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
  438. package/dist/tools/BashOutputTool/BashOutputTool.js +120 -0
  439. package/dist/tools/BashOutputTool/BashOutputTool.js.map +7 -0
  440. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +11 -0
  441. package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +7 -0
  442. package/dist/tools/BashOutputTool/prompt.js +13 -0
  443. package/dist/tools/BashOutputTool/prompt.js.map +7 -0
  444. package/dist/tools/BashTool/BashTool.js +209 -0
  445. package/dist/tools/BashTool/BashTool.js.map +7 -0
  446. package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
  447. package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
  448. package/dist/tools/BashTool/OutputLine.js +30 -0
  449. package/dist/tools/BashTool/OutputLine.js.map +7 -0
  450. package/dist/tools/BashTool/prompt.js +180 -0
  451. package/dist/tools/BashTool/prompt.js.map +7 -0
  452. package/dist/tools/BashTool/utils.js +51 -0
  453. package/dist/tools/BashTool/utils.js.map +7 -0
  454. package/dist/tools/FileEditTool/FileEditTool.js +226 -0
  455. package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
  456. package/dist/tools/FileEditTool/prompt.js +54 -0
  457. package/dist/tools/FileEditTool/prompt.js.map +7 -0
  458. package/dist/tools/FileEditTool/utils.js +42 -0
  459. package/dist/tools/FileEditTool/utils.js.map +7 -0
  460. package/dist/tools/FileReadTool/FileReadTool.js +272 -0
  461. package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
  462. package/dist/tools/FileReadTool/prompt.js +10 -0
  463. package/dist/tools/FileReadTool/prompt.js.map +7 -0
  464. package/dist/tools/FileWriteTool/FileWriteTool.js +202 -0
  465. package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
  466. package/dist/tools/FileWriteTool/prompt.js +14 -0
  467. package/dist/tools/FileWriteTool/prompt.js.map +7 -0
  468. package/dist/tools/GlobTool/GlobTool.js +88 -0
  469. package/dist/tools/GlobTool/GlobTool.js.map +7 -0
  470. package/dist/tools/GlobTool/prompt.js +12 -0
  471. package/dist/tools/GlobTool/prompt.js.map +7 -0
  472. package/dist/tools/GrepTool/GrepTool.js +107 -0
  473. package/dist/tools/GrepTool/GrepTool.js.map +7 -0
  474. package/dist/tools/GrepTool/prompt.js +15 -0
  475. package/dist/tools/GrepTool/prompt.js.map +7 -0
  476. package/dist/tools/KillShellTool/KillShellTool.js +92 -0
  477. package/dist/tools/KillShellTool/KillShellTool.js.map +7 -0
  478. package/dist/tools/KillShellTool/KillShellToolResultMessage.js +11 -0
  479. package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +7 -0
  480. package/dist/tools/KillShellTool/prompt.js +12 -0
  481. package/dist/tools/KillShellTool/prompt.js.map +7 -0
  482. package/dist/tools/MCPTool/MCPTool.js +90 -0
  483. package/dist/tools/MCPTool/MCPTool.js.map +7 -0
  484. package/dist/tools/MCPTool/prompt.js +7 -0
  485. package/dist/tools/MCPTool/prompt.js.map +7 -0
  486. package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
  487. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
  488. package/dist/tools/MemoryReadTool/prompt.js +7 -0
  489. package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
  490. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
  491. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
  492. package/dist/tools/MemoryWriteTool/prompt.js +7 -0
  493. package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
  494. package/dist/tools/MultiEditTool/MultiEditTool.js +301 -0
  495. package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
  496. package/dist/tools/MultiEditTool/prompt.js +48 -0
  497. package/dist/tools/MultiEditTool/prompt.js.map +7 -0
  498. package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
  499. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
  500. package/dist/tools/NotebookEditTool/prompt.js +7 -0
  501. package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
  502. package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
  503. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
  504. package/dist/tools/NotebookReadTool/prompt.js +7 -0
  505. package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
  506. package/dist/tools/SkillTool/SkillTool.js +209 -0
  507. package/dist/tools/SkillTool/SkillTool.js.map +7 -0
  508. package/dist/tools/SkillTool/prompt.js +81 -0
  509. package/dist/tools/SkillTool/prompt.js.map +7 -0
  510. package/dist/tools/TaskTool/TaskTool.js +381 -0
  511. package/dist/tools/TaskTool/TaskTool.js.map +7 -0
  512. package/dist/tools/TaskTool/constants.js +5 -0
  513. package/dist/tools/TaskTool/constants.js.map +7 -0
  514. package/dist/tools/TaskTool/prompt.js +111 -0
  515. package/dist/tools/TaskTool/prompt.js.map +7 -0
  516. package/dist/tools/ThinkTool/ThinkTool.js +40 -0
  517. package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
  518. package/dist/tools/ThinkTool/prompt.js +16 -0
  519. package/dist/tools/ThinkTool/prompt.js.map +7 -0
  520. package/dist/tools/TodoWriteTool/TodoWriteTool.js +243 -0
  521. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
  522. package/dist/tools/TodoWriteTool/prompt.js +66 -0
  523. package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
  524. package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
  525. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
  526. package/dist/tools/URLFetcherTool/cache.js +45 -0
  527. package/dist/tools/URLFetcherTool/cache.js.map +7 -0
  528. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
  529. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
  530. package/dist/tools/URLFetcherTool/prompt.js +22 -0
  531. package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
  532. package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
  533. package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
  534. package/dist/tools/WebSearchTool/prompt.js +17 -0
  535. package/dist/tools/WebSearchTool/prompt.js.map +7 -0
  536. package/dist/tools/WebSearchTool/searchProviders.js +48 -0
  537. package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
  538. package/dist/tools/lsTool/lsTool.js +201 -0
  539. package/dist/tools/lsTool/lsTool.js.map +7 -0
  540. package/dist/tools/lsTool/prompt.js +5 -0
  541. package/dist/tools/lsTool/prompt.js.map +7 -0
  542. package/dist/tools.js +70 -0
  543. package/dist/tools.js.map +7 -0
  544. package/dist/types/PermissionMode.js +82 -0
  545. package/dist/types/PermissionMode.js.map +7 -0
  546. package/dist/types/RequestContext.js +47 -0
  547. package/dist/types/RequestContext.js.map +7 -0
  548. package/dist/types/common.d.js +1 -0
  549. package/dist/types/common.d.js.map +7 -0
  550. package/dist/types/conversation.js +1 -0
  551. package/dist/types/conversation.js.map +7 -0
  552. package/dist/types/hooks.js +38 -0
  553. package/dist/types/hooks.js.map +7 -0
  554. package/dist/types/interactionRound.js +1 -0
  555. package/dist/types/interactionRound.js.map +7 -0
  556. package/dist/types/logs.js +1 -0
  557. package/dist/types/logs.js.map +7 -0
  558. package/dist/types/marketplace.js +101 -0
  559. package/dist/types/marketplace.js.map +7 -0
  560. package/dist/types/modelCapabilities.js +1 -0
  561. package/dist/types/modelCapabilities.js.map +7 -0
  562. package/dist/types/notebook.js +1 -0
  563. package/dist/types/notebook.js.map +7 -0
  564. package/dist/types/plugin.js +83 -0
  565. package/dist/types/plugin.js.map +7 -0
  566. package/dist/types/subagent.js +1 -0
  567. package/dist/types/subagent.js.map +7 -0
  568. package/dist/utils/BackgroundShellManager.js +215 -0
  569. package/dist/utils/BackgroundShellManager.js.map +7 -0
  570. package/dist/utils/Cursor.js +315 -0
  571. package/dist/utils/Cursor.js.map +7 -0
  572. package/dist/utils/PersistentShell.js +371 -0
  573. package/dist/utils/PersistentShell.js.map +7 -0
  574. package/dist/utils/advancedFuzzyMatcher.js +206 -0
  575. package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
  576. package/dist/utils/agentLoader.js +244 -0
  577. package/dist/utils/agentLoader.js.map +7 -0
  578. package/dist/utils/agentStorage.js +59 -0
  579. package/dist/utils/agentStorage.js.map +7 -0
  580. package/dist/utils/array.js +7 -0
  581. package/dist/utils/array.js.map +7 -0
  582. package/dist/utils/ask.js +77 -0
  583. package/dist/utils/ask.js.map +7 -0
  584. package/dist/utils/auth.js +11 -0
  585. package/dist/utils/auth.js.map +7 -0
  586. package/dist/utils/autoCompactCore.js +126 -0
  587. package/dist/utils/autoCompactCore.js.map +7 -0
  588. package/dist/utils/autoUpdater.js +107 -0
  589. package/dist/utils/autoUpdater.js.map +7 -0
  590. package/dist/utils/browser.js +15 -0
  591. package/dist/utils/browser.js.map +7 -0
  592. package/dist/utils/cleanup.js +54 -0
  593. package/dist/utils/cleanup.js.map +7 -0
  594. package/dist/utils/commands.js +207 -0
  595. package/dist/utils/commands.js.map +7 -0
  596. package/dist/utils/commonUnixCommands.js +687 -0
  597. package/dist/utils/commonUnixCommands.js.map +7 -0
  598. package/dist/utils/compressionMode.js +47 -0
  599. package/dist/utils/compressionMode.js.map +7 -0
  600. package/dist/utils/config.js +651 -0
  601. package/dist/utils/config.js.map +7 -0
  602. package/dist/utils/conversationRecovery.js +35 -0
  603. package/dist/utils/conversationRecovery.js.map +7 -0
  604. package/dist/utils/debugLogger.js +889 -0
  605. package/dist/utils/debugLogger.js.map +7 -0
  606. package/dist/utils/diff.js +32 -0
  607. package/dist/utils/diff.js.map +7 -0
  608. package/dist/utils/env.js +44 -0
  609. package/dist/utils/env.js.map +7 -0
  610. package/dist/utils/errors.js +23 -0
  611. package/dist/utils/errors.js.map +7 -0
  612. package/dist/utils/execFileNoThrow.js +44 -0
  613. package/dist/utils/execFileNoThrow.js.map +7 -0
  614. package/dist/utils/expertChatStorage.js +78 -0
  615. package/dist/utils/expertChatStorage.js.map +7 -0
  616. package/dist/utils/file.js +282 -0
  617. package/dist/utils/file.js.map +7 -0
  618. package/dist/utils/fileRecoveryCore.js +41 -0
  619. package/dist/utils/fileRecoveryCore.js.map +7 -0
  620. package/dist/utils/format.js +41 -0
  621. package/dist/utils/format.js.map +7 -0
  622. package/dist/utils/fuzzyMatcher.js +252 -0
  623. package/dist/utils/fuzzyMatcher.js.map +7 -0
  624. package/dist/utils/generators.js +46 -0
  625. package/dist/utils/generators.js.map +7 -0
  626. package/dist/utils/git.js +83 -0
  627. package/dist/utils/git.js.map +7 -0
  628. package/dist/utils/hookManager.js +238 -0
  629. package/dist/utils/hookManager.js.map +7 -0
  630. package/dist/utils/http.js +7 -0
  631. package/dist/utils/http.js.map +7 -0
  632. package/dist/utils/imagePaste.js +29 -0
  633. package/dist/utils/imagePaste.js.map +7 -0
  634. package/dist/utils/json.js +16 -0
  635. package/dist/utils/json.js.map +7 -0
  636. package/dist/utils/log.js +329 -0
  637. package/dist/utils/log.js.map +7 -0
  638. package/dist/utils/markdown.js +187 -0
  639. package/dist/utils/markdown.js.map +7 -0
  640. package/dist/utils/marketplaceManager.js +474 -0
  641. package/dist/utils/marketplaceManager.js.map +7 -0
  642. package/dist/utils/messageContextManager.js +195 -0
  643. package/dist/utils/messageContextManager.js.map +7 -0
  644. package/dist/utils/messages.js +650 -0
  645. package/dist/utils/messages.js.map +7 -0
  646. package/dist/utils/model.js +677 -0
  647. package/dist/utils/model.js.map +7 -0
  648. package/dist/utils/permissions/filesystem.js +80 -0
  649. package/dist/utils/permissions/filesystem.js.map +7 -0
  650. package/dist/utils/pluginInstaller.js +491 -0
  651. package/dist/utils/pluginInstaller.js.map +7 -0
  652. package/dist/utils/pluginLoader.js +582 -0
  653. package/dist/utils/pluginLoader.js.map +7 -0
  654. package/dist/utils/pluginRegistry.js +111 -0
  655. package/dist/utils/pluginRegistry.js.map +7 -0
  656. package/dist/utils/pluginValidator.js +774 -0
  657. package/dist/utils/pluginValidator.js.map +7 -0
  658. package/dist/utils/ptyCompat.js +125 -0
  659. package/dist/utils/ptyCompat.js.map +7 -0
  660. package/dist/utils/replStateMachine.js +145 -0
  661. package/dist/utils/replStateMachine.js.map +7 -0
  662. package/dist/utils/ripgrep.js +131 -0
  663. package/dist/utils/ripgrep.js.map +7 -0
  664. package/dist/utils/roundConverter.js +262 -0
  665. package/dist/utils/roundConverter.js.map +7 -0
  666. package/dist/utils/secureFile.js +483 -0
  667. package/dist/utils/secureFile.js.map +7 -0
  668. package/dist/utils/sessionState.js +22 -0
  669. package/dist/utils/sessionState.js.map +7 -0
  670. package/dist/utils/skillLoader.js +79 -0
  671. package/dist/utils/skillLoader.js.map +7 -0
  672. package/dist/utils/state.js +24 -0
  673. package/dist/utils/state.js.map +7 -0
  674. package/dist/utils/style.js +31 -0
  675. package/dist/utils/style.js.map +7 -0
  676. package/dist/utils/terminal.js +47 -0
  677. package/dist/utils/terminal.js.map +7 -0
  678. package/dist/utils/theme.js +102 -0
  679. package/dist/utils/theme.js.map +7 -0
  680. package/dist/utils/thinking.js +59 -0
  681. package/dist/utils/thinking.js.map +7 -0
  682. package/dist/utils/todoChangeCalculator.js +64 -0
  683. package/dist/utils/todoChangeCalculator.js.map +7 -0
  684. package/dist/utils/todoStorage.js +291 -0
  685. package/dist/utils/todoStorage.js.map +7 -0
  686. package/dist/utils/tokens.js +30 -0
  687. package/dist/utils/tokens.js.map +7 -0
  688. package/dist/utils/toolExecutionController.js +109 -0
  689. package/dist/utils/toolExecutionController.js.map +7 -0
  690. package/dist/utils/unaryLogging.js +6 -0
  691. package/dist/utils/unaryLogging.js.map +7 -0
  692. package/dist/utils/user.js +40 -0
  693. package/dist/utils/user.js.map +7 -0
  694. package/dist/utils/validate.js +132 -0
  695. package/dist/utils/validate.js.map +7 -0
  696. package/dist/version.js +7 -0
  697. package/dist/version.js.map +7 -0
  698. package/dist/yoga.wasm +0 -0
  699. package/package.json +113 -0
  700. package/scripts/postinstall.js +18 -0
  701. package/yoga.wasm +0 -0
@@ -0,0 +1,37 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { getTheme } from "../utils/theme.js";
4
+ import { getAgentColor } from "../constants/colors.js";
5
+ import { formatNumber, formatDuration } from "../utils/format.js";
6
+ function SubagentStatusMarker({
7
+ status,
8
+ taskName,
9
+ agentType,
10
+ agentColor,
11
+ metrics,
12
+ errorMessage
13
+ }) {
14
+ const theme = getTheme();
15
+ const color = agentColor ? getAgentColor(agentColor, theme) : theme.brand;
16
+ const duration = metrics && metrics.endTime ? metrics.endTime - metrics.startTime : void 0;
17
+ if (status === "complete") {
18
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\u23FA "), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Task"), /* @__PURE__ */ React.createElement(Text, null, "(", taskName, ")")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \u23BF "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Done "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, "(", metrics?.toolUseCount || 0, " tool use", (metrics?.toolUseCount || 0) !== 1 ? "s" : "", " \xB7", " ", formatNumber(metrics?.tokenCount || 0), " tokens", duration ? ` \xB7 ${formatDuration(duration)}` : "", ")")));
19
+ }
20
+ if (status === "error") {
21
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\u23FA "), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Task"), /* @__PURE__ */ React.createElement(Text, null, "(", taskName, ")")), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \u23BF "), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error: ", errorMessage || "Task failed")));
22
+ }
23
+ return null;
24
+ }
25
+ function CompactSubagentStatusMarker({
26
+ status,
27
+ taskName
28
+ }) {
29
+ const theme = getTheme();
30
+ const config = status === "start" ? { symbol: "\u23FA", color: theme.info } : status === "complete" ? { symbol: "\u2713", color: theme.success } : { symbol: "\u2715", color: theme.error };
31
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: config.color }, config.symbol, " ", taskName));
32
+ }
33
+ export {
34
+ CompactSubagentStatusMarker,
35
+ SubagentStatusMarker
36
+ };
37
+ //# sourceMappingURL=SubagentStatusMarker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/SubagentStatusMarker.tsx"],
4
+ "sourcesContent": ["/**\n * SubagentStatusMarker - Subagent \u72B6\u6001\u6807\u8BB0\u7EC4\u4EF6\n *\n * \u8BBE\u8BA1\u539F\u5219\uFF1A\n * 1. **\u7C7B\u4F3C\u5DE5\u5177\u8C03\u7528** - \u5728\u6D88\u606F\u6D41\u4E2D\u663E\u793A subagent \u7684\u72B6\u6001\u6807\u8BB0\n * 2. **\u6E05\u6670\u7684\u72B6\u6001\u7B26\u53F7** - \u23FA \u5F00\u59CB, \u23F3 \u8FDB\u884C\u4E2D, \u2713 \u5B8C\u6210, \u2715 \u9519\u8BEF\n * 3. **\u7D27\u51D1\u5E03\u5C40** - \u4E0D\u5360\u7528\u8FC7\u591A\u7A7A\u95F4\n * 4. **\u65F6\u5E8F\u4E00\u81F4** - \u5728\u6D88\u606F\u6D41\u7684\u6B63\u786E\u4F4D\u7F6E\u663E\u793A\n *\n * \u7528\u6CD5\uFF1A\n * - start: \u663E\u793A \"\u23FA Launched: Task Name \u00B7 agent-type\"\n * - complete: \u663E\u793A \"\u2713 Completed: Task Name \u00B7 3 tools \u00B7 5.2k tokens \u00B7 12s\"\n * - error: \u663E\u793A \"\u2715 Failed: Task Name \u00B7 Error message\"\n */\n\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getAgentColor } from '@constants/colors'\nimport type { SubagentState, SubagentStatus } from '@minto-types/subagent'\nimport { formatNumber, formatDuration } from '@utils/format'\nimport type { AgentColor } from '@constants/colors'\n\ninterface SubagentStatusMarkerProps {\n /** \u72B6\u6001\u7C7B\u578B */\n status: 'start' | 'complete' | 'error'\n\n /** \u4EFB\u52A1\u540D\u79F0 */\n taskName: string\n\n /** Agent \u7C7B\u578B */\n agentType: string\n\n /** Agent \u989C\u8272 */\n agentColor?: AgentColor\n\n /** \u6027\u80FD\u6307\u6807\uFF08complete \u65F6\u9700\u8981\uFF09 */\n metrics?: {\n toolUseCount: number\n tokenCount: number\n startTime: number\n endTime?: number\n }\n\n /** \u9519\u8BEF\u4FE1\u606F\uFF08error \u65F6\u9700\u8981\uFF09 */\n errorMessage?: string\n}\n\n/**\n * SubagentStatusMarker - Claude Code CLI \u98CE\u683C\u7684\u4EFB\u52A1\u72B6\u6001\u663E\u793A\n *\n * \u89C6\u89C9\u6837\u5F0F\uFF08\u5339\u914D Claude Code\uFF09\uFF1A\n * ```\n * \u23FA Task(Analyze ARM_HAMMER file)\n * \u23BF Done (1 tool use \u00B7 52.7k tokens \u00B7 46.3s)\n * ```\n *\n * Note: This component is currently NOT rendered in the main message stream.\n * Task status is displayed via TaskCard component instead.\n */\nexport function SubagentStatusMarker({\n status,\n taskName,\n agentType,\n agentColor,\n metrics,\n errorMessage,\n}: SubagentStatusMarkerProps): React.ReactNode {\n const theme = getTheme()\n const color = agentColor ? getAgentColor(agentColor, theme) : theme.brand\n\n // \u8BA1\u7B97\u6301\u7EED\u65F6\u95F4\n const duration =\n metrics && metrics.endTime ? metrics.endTime - metrics.startTime : undefined\n\n // \u4EC5\u5728\u5B8C\u6210\u65F6\u663E\u793A\n if (status === 'complete') {\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u7B2C1\u884C\uFF1A\u23FA Task(\u4EFB\u52A1\u540D\u79F0) */}\n <Box flexDirection=\"row\">\n <Text>\u23FA </Text>\n <Text bold>Task</Text>\n <Text>({taskName})</Text>\n </Box>\n\n {/* \u7B2C2\u884C\uFF1A\u23BF Done (\u7EDF\u8BA1\u4FE1\u606F) */}\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}> \u23BF </Text>\n <Text color={theme.success}>Done </Text>\n <Text color={theme.mutedText}>\n ({metrics?.toolUseCount || 0} tool use\n {(metrics?.toolUseCount || 0) !== 1 ? 's' : ''} \u00B7{' '}\n {formatNumber(metrics?.tokenCount || 0)} tokens\n {duration ? ` \u00B7 ${formatDuration(duration)}` : ''})\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Error \u72B6\u6001\u663E\u793A\n if (status === 'error') {\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u7B2C1\u884C\uFF1A\u23FA Task(\u4EFB\u52A1\u540D\u79F0) */}\n <Box flexDirection=\"row\">\n <Text>\u23FA </Text>\n <Text bold>Task</Text>\n <Text>({taskName})</Text>\n </Box>\n\n {/* \u7B2C2\u884C\uFF1A\u23BF Error */}\n <Box flexDirection=\"row\">\n <Text color={theme.dimmedText}> \u23BF </Text>\n <Text color={theme.error}>\n Error: {errorMessage || 'Task failed'}\n </Text>\n </Box>\n </Box>\n )\n }\n\n // Start \u72B6\u6001\uFF1A\u4E0D\u663E\u793A\uFF08\u4EFB\u52A1\u542F\u52A8\u65F6\u65E0\u9700\u6807\u8BB0\uFF09\n return null\n}\n\n/**\n * \u7D27\u51D1\u7248\u72B6\u6001\u6807\u8BB0\uFF08\u7528\u4E8E\u8BE6\u7EC6\u89C6\u56FE\u4E2D\uFF09\n */\nexport function CompactSubagentStatusMarker({\n status,\n taskName,\n}: {\n status: 'start' | 'complete' | 'error'\n taskName: string\n}): React.ReactNode {\n const theme = getTheme()\n\n const config =\n status === 'start'\n ? { symbol: '\u23FA', color: theme.info }\n : status === 'complete'\n ? { symbol: '\u2713', color: theme.success }\n : { symbol: '\u2715', color: theme.error }\n\n return (\n <Box flexDirection=\"row\">\n <Text color={config.color}>\n {config.symbol} {taskName}\n </Text>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAeA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAC1B,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAE9B,SAAS,cAAc,sBAAsB;AAwCtC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,aAAa,cAAc,YAAY,KAAK,IAAI,MAAM;AAGpE,QAAM,WACJ,WAAW,QAAQ,UAAU,QAAQ,UAAU,QAAQ,YAAY;AAGrE,MAAI,WAAW,YAAY;AACzB,WACE,oCAAC,OAAI,eAAc,UAAS,SAAS,KAEnC,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,SAAE,GACR,oCAAC,QAAK,MAAI,QAAC,MAAI,GACf,oCAAC,YAAK,KAAE,UAAS,GAAC,CACpB,GAGA,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,cAAY,UAAG,GAClC,oCAAC,QAAK,OAAO,MAAM,WAAS,OAAK,GACjC,oCAAC,QAAK,OAAO,MAAM,aAAW,KAC1B,SAAS,gBAAgB,GAAE,cAC3B,SAAS,gBAAgB,OAAO,IAAI,MAAM,IAAG,SAAG,KACjD,aAAa,SAAS,cAAc,CAAC,GAAE,WACvC,WAAW,SAAM,eAAe,QAAQ,CAAC,KAAK,IAAG,GACpD,CACF,CACF;AAAA,EAEJ;AAGA,MAAI,WAAW,SAAS;AACtB,WACE,oCAAC,OAAI,eAAc,UAAS,SAAS,KAEnC,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,SAAE,GACR,oCAAC,QAAK,MAAI,QAAC,MAAI,GACf,oCAAC,YAAK,KAAE,UAAS,GAAC,CACpB,GAGA,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,cAAY,UAAG,GAClC,oCAAC,QAAK,OAAO,MAAM,SAAO,WAChB,gBAAgB,aAC1B,CACF,CACF;AAAA,EAEJ;AAGA,SAAO;AACT;AAKO,SAAS,4BAA4B;AAAA,EAC1C;AAAA,EACA;AACF,GAGoB;AAClB,QAAM,QAAQ,SAAS;AAEvB,QAAM,SACJ,WAAW,UACP,EAAE,QAAQ,UAAK,OAAO,MAAM,KAAK,IACjC,WAAW,aACT,EAAE,QAAQ,UAAK,OAAO,MAAM,QAAQ,IACpC,EAAE,QAAQ,UAAK,OAAO,MAAM,MAAM;AAE1C,SACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,OAAO,SACjB,OAAO,QAAO,KAAE,QACnB,CACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,170 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import { Box, Text } from "ink";
3
+ import { getTheme } from "../utils/theme.js";
4
+ import { formatNumber, formatDuration } from "../utils/format.js";
5
+ import { getAgentColor } from "../constants/colors.js";
6
+ function TaskCard({
7
+ subagent,
8
+ isExpanded = false,
9
+ isHighlighted = false,
10
+ tools = [],
11
+ verbose = false,
12
+ debug = false,
13
+ onToggleExpand
14
+ }) {
15
+ const theme = getTheme();
16
+ const { metrics, taskName, status, messages, agentType, agentColor } = subagent;
17
+ const color = getAgentColor(agentColor, theme);
18
+ const isRunning = status === "initializing" || status === "running" || status === "queued";
19
+ const [, setTick] = useState(0);
20
+ useEffect(() => {
21
+ if (isRunning) {
22
+ const timer = setInterval(() => {
23
+ setTick((prev) => prev + 1);
24
+ }, 1e3);
25
+ return () => clearInterval(timer);
26
+ }
27
+ }, [isRunning]);
28
+ const duration = metrics.endTime ? metrics.endTime - metrics.startTime : Date.now() - metrics.startTime;
29
+ const statusIcon = getStatusIcon(status, isRunning);
30
+ const statusText = getStatusText(status);
31
+ const statusColor = getStatusColor(status, theme);
32
+ const latestMessage = getLatestMessage(messages);
33
+ const cardBgColor = isHighlighted ? theme.selectionBg : "#6A7B8E";
34
+ const isCompleted = status === "completed" || status === "error";
35
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 0 }, !isCompleted && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " "), /* @__PURE__ */ React.createElement(Text, { bold: true }, taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", agentType)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u251C\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusText), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, metrics.toolUseCount, " tool", metrics.toolUseCount !== 1 ? "s" : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatNumber(metrics.tokenCount), " tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatDuration(duration))), latestMessage && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, latestMessage)), messages.length > 0 && messages.map((msg, idx) => {
36
+ let content = "";
37
+ let prefix = "\u2190 ";
38
+ if (msg.type === "assistant") {
39
+ prefix = "\u2192 ";
40
+ const blocks = msg.message.content;
41
+ content = blocks.filter((block) => block.type === "text").map((block) => block.text).join(" ");
42
+ } else if (msg.type === "user") {
43
+ const msgParam = msg.message;
44
+ if (typeof msgParam.content === "string") {
45
+ content = msgParam.content;
46
+ } else if (Array.isArray(msgParam.content)) {
47
+ content = msgParam.content.filter((block) => block.type === "text").map((block) => block.text).join(" ");
48
+ }
49
+ } else if (msg.type === "progress") {
50
+ prefix = "\u2699 ";
51
+ const blocks = msg.content.message.content;
52
+ content = blocks.filter((block) => block.type === "text").map((block) => block.text).join(" ");
53
+ }
54
+ if (!content || content.trim().length === 0) {
55
+ return null;
56
+ }
57
+ return /* @__PURE__ */ React.createElement(Box, { key: idx, flexDirection: "row", marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, prefix), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, content.substring(0, 80), content.length > 80 ? "..." : ""));
58
+ }).filter(Boolean)), isCompleted && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " "), /* @__PURE__ */ React.createElement(Text, { bold: true }, taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", agentType)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, "\u2514\u2500 "), /* @__PURE__ */ React.createElement(Text, { color: statusColor }, statusText), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, metrics.toolUseCount, " tool", metrics.toolUseCount !== 1 ? "s" : ""), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatNumber(metrics.tokenCount), " tokens"), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, " \xB7 "), /* @__PURE__ */ React.createElement(Text, { color: theme.mutedText }, formatDuration(duration)), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " (Ctrl+O to expand)")), isExpanded && messages.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 4, marginTop: 1 }, renderTaskOutputLog(subagent, theme, tools, verbose))), debug && /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "[View Details]"), /* @__PURE__ */ React.createElement(Text, null, " "), isRunning && /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "[Cancel]")));
59
+ }
60
+ function getStatusIcon(status, isRunning) {
61
+ if (isRunning) {
62
+ const spinnerFrames = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
63
+ const frame = Math.floor(Date.now() / 120) % spinnerFrames.length;
64
+ return spinnerFrames[frame] || "\u280B";
65
+ }
66
+ switch (status) {
67
+ case "completed":
68
+ return "\u2713";
69
+ case "error":
70
+ return "\u2715";
71
+ case "queued":
72
+ return "\u2026";
73
+ default:
74
+ return "\u25E6";
75
+ }
76
+ }
77
+ function getStatusText(status) {
78
+ switch (status) {
79
+ case "initializing":
80
+ return "Initializing";
81
+ case "queued":
82
+ return "Queued";
83
+ case "running":
84
+ return "Running";
85
+ case "completed":
86
+ return "Completed";
87
+ case "error":
88
+ return "Error";
89
+ }
90
+ }
91
+ function getStatusColor(status, theme) {
92
+ switch (status) {
93
+ case "initializing":
94
+ case "queued":
95
+ return "#ADD8E6";
96
+ // Pending Task (浅蓝)
97
+ case "running":
98
+ return theme.brand;
99
+ // #D4BBFF (品牌色,表示活跃)
100
+ case "completed":
101
+ return theme.success;
102
+ // #3DDC84 (鲜绿)
103
+ case "error":
104
+ return theme.error;
105
+ }
106
+ }
107
+ function getLatestMessage(messages) {
108
+ if (messages.length === 0) return null;
109
+ for (let i = messages.length - 1; i >= 0; i--) {
110
+ const msg = messages[i];
111
+ if (msg?.type === "assistant" && msg.message?.content) {
112
+ for (const content of msg.message.content) {
113
+ if (content.type === "text" && content.text.trim()) {
114
+ const text = content.text.trim();
115
+ return text.length > 60 ? text.substring(0, 60) + "..." : text;
116
+ }
117
+ if (content.type === "tool_use") {
118
+ return `Using ${content.name}...`;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ function renderTaskOutputLog(subagent, theme, tools, verbose) {
126
+ const { messages } = subagent;
127
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, messages.map((msg, idx) => {
128
+ if (msg.type === "assistant") {
129
+ return msg.message.content.map((content, contentIdx) => {
130
+ if (content.type === "tool_use") {
131
+ const tool = tools.find((t) => t.name === content.name);
132
+ const toolName = tool?.userFacingName ? typeof tool.userFacingName === "function" ? tool.userFacingName() : tool.userFacingName : content.name;
133
+ return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "\u{1F527} ", toolName));
134
+ } else if (content.type === "text" && content.text.trim()) {
135
+ const lines = content.text.trim().split("\n");
136
+ return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, lines.map((line, lineIdx) => /* @__PURE__ */ React.createElement(Text, { key: lineIdx, color: theme.secondaryTextNew }, line)));
137
+ }
138
+ return null;
139
+ });
140
+ } else if (msg.type === "user") {
141
+ return msg.message.content.map((content, contentIdx) => {
142
+ if (content.type === "tool_result") {
143
+ const resultContent = Array.isArray(content.content) ? content.content.find((c) => c.type === "text")?.text : typeof content.content === "string" ? content.content : "";
144
+ if (resultContent && resultContent.trim()) {
145
+ const lines = resultContent.trim().split("\n");
146
+ const preview = lines.length > 5 ? lines.slice(0, 5).join("\n") + "\n..." : resultContent.trim();
147
+ return /* @__PURE__ */ React.createElement(Box, { key: `${idx}-${contentIdx}`, flexDirection: "column" }, preview.split("\n").map((line, lineIdx) => /* @__PURE__ */ React.createElement(Text, { key: lineIdx, color: theme.mutedText }, line)));
148
+ }
149
+ }
150
+ return null;
151
+ });
152
+ }
153
+ return null;
154
+ }));
155
+ }
156
+ function CompactTaskCard({
157
+ subagent
158
+ }) {
159
+ const theme = getTheme();
160
+ const { taskName, status, agentColor } = subagent;
161
+ const color = getAgentColor(agentColor, theme);
162
+ const isRunning = status === "initializing" || status === "running" || status === "queued";
163
+ const statusIcon = getStatusIcon(status, isRunning);
164
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color }, statusIcon, " ", taskName), /* @__PURE__ */ React.createElement(Text, { color: theme.dimmedText }, " \xB7 ", getStatusText(status)));
165
+ }
166
+ export {
167
+ CompactTaskCard,
168
+ TaskCard
169
+ };
170
+ //# sourceMappingURL=TaskCard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TaskCard.tsx"],
4
+ "sourcesContent": ["/**\n * TaskCard - Claude Code CLI \u98CE\u683C\u7684\u4EFB\u52A1\u5361\u7247\u7EC4\u4EF6\n *\n * \u6838\u5FC3\u7279\u6027\uFF1A\n * 1. **\u5361\u7247\u5F0F\u8BBE\u8BA1** - \u72EC\u7ACB\u7684\u89C6\u89C9\u5355\u5143\uFF0C\u4E0E\u4E3B\u5BF9\u8BDD\u6D41\u533A\u5206\n * 2. **\u72B6\u6001\u6E05\u6670** - \u901A\u8FC7\u56FE\u6807\u548C\u989C\u8272\u660E\u786E\u4F20\u8FBE\u4EFB\u52A1\u72B6\u6001\n * 3. **\u53EF\u6298\u53E0** - \u8BE6\u7EC6\u65E5\u5FD7\u53EF\u6298\u53E0\uFF0C\u8282\u7701\u7A7A\u95F4\n * 4. **\u8FDB\u5EA6\u53EF\u89C6\u5316** - \u663E\u793A\u4EFB\u52A1\u8FDB\u5EA6\u767E\u5206\u6BD4\u548C\u6307\u6807\n * 5. **\u5E76\u53D1\u53CB\u597D** - \u591A\u4E2A\u5361\u7247\u5E76\u5217\u663E\u793A\u4E0D\u6DF7\u4E71\n *\n * \u57FA\u4E8E Claude Code CLI \u7684 TaskCardBlock \u89C4\u8303\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { formatNumber, formatDuration } from '@utils/format'\nimport { getAgentColor } from '@constants/colors'\nimport type { SubagentState } from '@minto-types/subagent'\nimport type { Tool } from '@tool'\n\ninterface TaskCardProps {\n /** \u5B50\u4EFB\u52A1\u72B6\u6001 */\n subagent: SubagentState\n\n /** \u662F\u5426\u5C55\u5F00\u8BE6\u7EC6\u65E5\u5FD7 */\n isExpanded?: boolean\n\n /** \u662F\u5426\u9AD8\u4EAE\uFF08\u9700\u8981\u7528\u6237\u5173\u6CE8\uFF09 */\n isHighlighted?: boolean\n\n /** \u5DE5\u5177\u5217\u8868 */\n tools?: Tool[]\n\n /** \u662F\u5426\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F */\n verbose?: boolean\n\n /** \u8C03\u8BD5\u6A21\u5F0F */\n debug?: boolean\n\n /** \u6298\u53E0/\u5C55\u5F00\u56DE\u8C03 */\n onToggleExpand?: () => void\n}\n\n/**\n * TaskCard - \u5355\u4E2A\u5B50\u4EFB\u52A1\u7684\u52A8\u6001\u5C55\u793A\uFF08\u65E0\u8FB9\u6846\uFF09\n *\n * \u8FD0\u884C\u4E2D\u5E03\u5C40\uFF08\u81EA\u52A8\u5C55\u5F00\uFF09:\n * ```\n * \u280B Feature Implementation \u00B7 backend-architect\n * \u251C\u2500 Running \u00B7 3 tools \u00B7 5.2k tokens \u00B7 12s\n * \u2514\u2500 Analyzing code structure...\n * \u2192 Tool call output message...\n * \u2190 Assistant response...\n * ```\n *\n * \u5B8C\u6210\u540E\u5E03\u5C40\uFF08\u81EA\u52A8\u6298\u53E0\uFF09:\n * ```\n * \u2713 Feature Implementation \u00B7 backend-architect\n * \u2514\u2500 Done \u00B7 5 tools \u00B7 8.3k tokens \u00B7 24s (Ctrl+O to expand)\n * ```\n *\n * \u5B8C\u6210\u540E\u5C55\u5F00\uFF08Ctrl+O\uFF09:\n * ```\n * \u2713 Feature Implementation \u00B7 backend-architect\n * \u2514\u2500 Done \u00B7 5 tools \u00B7 8.3k tokens \u00B7 24s (Ctrl+O to expand)\n * [\u8BE6\u7EC6\u7684\u6267\u884C\u8FC7\u7A0B\u65E5\u5FD7]\n * ```\n */\nexport function TaskCard({\n subagent,\n isExpanded = false,\n isHighlighted = false,\n tools = [],\n verbose = false,\n debug = false,\n onToggleExpand,\n}: TaskCardProps): React.ReactNode {\n const theme = getTheme()\n const { metrics, taskName, status, messages, agentType, agentColor } =\n subagent\n\n // \u83B7\u53D6 agent \u989C\u8272\n const color = getAgentColor(agentColor, theme)\n\n // \u5224\u65AD\u662F\u5426\u6B63\u5728\u8FD0\u884C\n const isRunning =\n status === 'initializing' || status === 'running' || status === 'queued'\n\n // \u5B9E\u65F6\u66F4\u65B0\u65F6\u95F4\n const [, setTick] = useState(0)\n useEffect(() => {\n if (isRunning) {\n const timer = setInterval(() => {\n setTick(prev => prev + 1)\n }, 1000)\n return () => clearInterval(timer)\n }\n }, [isRunning])\n\n // \u8BA1\u7B97\u6301\u7EED\u65F6\u95F4\n const duration = metrics.endTime\n ? metrics.endTime - metrics.startTime\n : Date.now() - metrics.startTime\n\n // \u72B6\u6001\u56FE\u6807\u548C\u6587\u672C\n const statusIcon = getStatusIcon(status, isRunning)\n const statusText = getStatusText(status)\n const statusColor = getStatusColor(status, theme)\n\n // \u83B7\u53D6\u6700\u65B0\u7684\u72B6\u6001\u6D88\u606F\n const latestMessage = getLatestMessage(messages)\n\n // \u5361\u7247\u80CC\u666F\u8272\uFF08\u6839\u636E\u72B6\u6001\u548C\u9AD8\u4EAE\uFF09\n const cardBgColor = isHighlighted\n ? theme.selectionBg // #3C3C3C\n : '#6A7B8E' // Task Card BG\n\n // \u5224\u65AD\u662F\u5426\u5DF2\u5B8C\u6210\uFF08completed \u6216 error\uFF09\n const isCompleted = status === 'completed' || status === 'error'\n\n return (\n <Box flexDirection=\"column\" marginY={0}>\n {/* \u8FD0\u884C\u4E2D\uFF1A\u5C55\u5F00\u663E\u793A\u6240\u6709\u5185\u5BB9 */}\n {!isCompleted && (\n <>\n {/* TaskHeader - \u4EFB\u52A1\u540D\u79F0\u548C Agent \u7C7B\u578B */}\n <Box flexDirection=\"row\">\n <Text color={color}>{statusIcon} </Text>\n <Text bold>{taskName}</Text>\n <Text color={theme.dimmedText}> \u00B7 {agentType}</Text>\n </Box>\n\n {/* TaskProgress - \u72B6\u6001\u548C\u6307\u6807 */}\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u251C\u2500 </Text>\n <Text color={statusColor}>{statusText}</Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {metrics.toolUseCount} tool{metrics.toolUseCount !== 1 ? 's' : ''}\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {formatNumber(metrics.tokenCount)} tokens\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>{formatDuration(duration)}</Text>\n </Box>\n\n {/* TaskStatusMessage - \u5F53\u524D\u6B63\u5728\u505A\u4EC0\u4E48 */}\n {latestMessage && (\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={theme.dimmedText}>{latestMessage}</Text>\n </Box>\n )}\n\n {/* Output messages - \u76F4\u63A5\u663E\u793A\u4E3A\u5B50\u5C42\u7EA7\uFF0C\u65E0 \"Output Log\" \u6807\u9898 */}\n {messages.length > 0 &&\n messages\n .map((msg, idx) => {\n // Extract text content based on message type\n let content = ''\n let prefix = '\u2190 '\n\n if (msg.type === 'assistant') {\n prefix = '\u2192 '\n const blocks = msg.message.content\n content = blocks\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n } else if (msg.type === 'user') {\n const msgParam = msg.message as any\n if (typeof msgParam.content === 'string') {\n content = msgParam.content\n } else if (Array.isArray(msgParam.content)) {\n content = msgParam.content\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n }\n } else if (msg.type === 'progress') {\n prefix = '\u2699 '\n const blocks = msg.content.message.content\n content = blocks\n .filter((block: any) => block.type === 'text')\n .map((block: any) => block.text)\n .join(' ')\n }\n\n if (!content || content.trim().length === 0) {\n return null\n }\n\n return (\n <Box key={idx} flexDirection=\"row\" marginLeft={4}>\n <Text color={theme.dimmedText}>{prefix}</Text>\n <Text color={theme.mutedText}>\n {content.substring(0, 80)}\n {content.length > 80 ? '...' : ''}\n </Text>\n </Box>\n )\n })\n .filter(Boolean)}\n </>\n )}\n\n {/* \u5DF2\u5B8C\u6210\uFF1A\u6298\u53E0\u6210\u4E00\u884C\uFF0C\u5E26\u5C55\u5F00\u63D0\u793A */}\n {isCompleted && (\n <>\n <Box flexDirection=\"row\">\n <Text color={color}>{statusIcon} </Text>\n <Text bold>{taskName}</Text>\n <Text color={theme.dimmedText}> \u00B7 {agentType}</Text>\n </Box>\n\n <Box flexDirection=\"row\" marginLeft={2}>\n <Text color={theme.dimmedText}>\u2514\u2500 </Text>\n <Text color={statusColor}>{statusText}</Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {metrics.toolUseCount} tool{metrics.toolUseCount !== 1 ? 's' : ''}\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>\n {formatNumber(metrics.tokenCount)} tokens\n </Text>\n <Text color={theme.mutedText}> \u00B7 </Text>\n <Text color={theme.mutedText}>{formatDuration(duration)}</Text>\n <Text color={theme.dimmedText}> (Ctrl+O to expand)</Text>\n </Box>\n\n {/* \u5C55\u5F00\u65F6\u663E\u793A\u8BE6\u7EC6\u8FC7\u7A0B */}\n {isExpanded && messages.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={4} marginTop={1}>\n {renderTaskOutputLog(subagent, theme, tools, verbose)}\n </Box>\n )}\n </>\n )}\n\n {/* TaskActionButtons - \u64CD\u4F5C\u6309\u94AE (\u672A\u6765\u6269\u5C55) */}\n {debug && (\n <Box flexDirection=\"row\" marginTop={1}>\n <Text color={theme.info}>[View Details]</Text>\n <Text> </Text>\n {isRunning && <Text color={theme.error}>[Cancel]</Text>}\n </Box>\n )}\n </Box>\n )\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u56FE\u6807\n */\nfunction getStatusIcon(\n status: SubagentState['status'],\n isRunning: boolean,\n): string {\n if (isRunning) {\n // \u4F7F\u7528 Spinner \u5B57\u7B26\u8F6E\u8F6C (\u7B80\u5316\u7248)\n const spinnerFrames = ['\u280B', '\u2819', '\u2839', '\u2838', '\u283C', '\u2834', '\u2826', '\u2827', '\u2807', '\u280F']\n const frame = Math.floor(Date.now() / 120) % spinnerFrames.length\n return spinnerFrames[frame] || '\u280B'\n }\n\n switch (status) {\n case 'completed':\n return '\u2713'\n case 'error':\n return '\u2715'\n case 'queued':\n return '\u2026'\n default:\n return '\u25E6'\n }\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u6587\u672C\n */\nfunction getStatusText(status: SubagentState['status']): string {\n switch (status) {\n case 'initializing':\n return 'Initializing'\n case 'queued':\n return 'Queued'\n case 'running':\n return 'Running'\n case 'completed':\n return 'Completed'\n case 'error':\n return 'Error'\n }\n}\n\n/**\n * \u83B7\u53D6\u72B6\u6001\u989C\u8272 (\u4F7F\u7528 Claude Code CLI \u914D\u8272)\n */\nfunction getStatusColor(\n status: SubagentState['status'],\n theme: ReturnType<typeof getTheme>,\n): string {\n switch (status) {\n case 'initializing':\n case 'queued':\n return '#ADD8E6' // Pending Task (\u6D45\u84DD)\n case 'running':\n return theme.brand // #D4BBFF (\u54C1\u724C\u8272\uFF0C\u8868\u793A\u6D3B\u8DC3)\n case 'completed':\n return theme.success // #3DDC84 (\u9C9C\u7EFF)\n case 'error':\n return theme.error // #FF5555 (\u9C9C\u7EA2)\n }\n}\n\n/**\n * \u83B7\u53D6\u6700\u65B0\u7684\u72B6\u6001\u6D88\u606F\n */\nfunction getLatestMessage(messages: SubagentState['messages']): string | null {\n if (messages.length === 0) return null\n\n // \u5012\u5E8F\u67E5\u627E\u6700\u65B0\u7684\u6587\u672C\u6D88\u606F\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'assistant' && msg.message?.content) {\n for (const content of msg.message.content) {\n if (content.type === 'text' && content.text.trim()) {\n // \u622A\u53D6\u524D 60 \u4E2A\u5B57\u7B26\n const text = content.text.trim()\n return text.length > 60 ? text.substring(0, 60) + '...' : text\n }\n if (content.type === 'tool_use') {\n return `Using ${content.name}...`\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * \u6E32\u67D3\u8BE6\u7EC6\u7684\u8F93\u51FA\u65E5\u5FD7\n */\nfunction renderTaskOutputLog(\n subagent: SubagentState,\n theme: ReturnType<typeof getTheme>,\n tools: Tool[],\n verbose: boolean,\n): React.ReactNode {\n const { messages } = subagent\n\n return (\n <Box flexDirection=\"column\">\n {messages.map((msg, idx) => {\n if (msg.type === 'assistant') {\n return msg.message.content.map((content, contentIdx) => {\n if (content.type === 'tool_use') {\n const tool = tools.find(t => t.name === content.name)\n const toolName = tool?.userFacingName\n ? typeof tool.userFacingName === 'function'\n ? tool.userFacingName()\n : tool.userFacingName\n : content.name\n\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"row\">\n <Text color={theme.info}>\uD83D\uDD27 {toolName}</Text>\n </Box>\n )\n } else if (content.type === 'text' && content.text.trim()) {\n const lines = content.text.trim().split('\\n')\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n {lines.map((line, lineIdx) => (\n <Text key={lineIdx} color={theme.secondaryTextNew}>\n {line}\n </Text>\n ))}\n </Box>\n )\n }\n return null\n })\n } else if (msg.type === 'user') {\n return msg.message.content.map((content, contentIdx) => {\n if (content.type === 'tool_result') {\n const resultContent = Array.isArray(content.content)\n ? content.content.find(c => c.type === 'text')?.text\n : typeof content.content === 'string'\n ? content.content\n : ''\n\n if (resultContent && resultContent.trim()) {\n const lines = resultContent.trim().split('\\n')\n const preview =\n lines.length > 5\n ? lines.slice(0, 5).join('\\n') + '\\n...'\n : resultContent.trim()\n\n return (\n <Box key={`${idx}-${contentIdx}`} flexDirection=\"column\">\n {preview.split('\\n').map((line, lineIdx) => (\n <Text key={lineIdx} color={theme.mutedText}>\n {line}\n </Text>\n ))}\n </Box>\n )\n }\n }\n return null\n })\n }\n return null\n })}\n </Box>\n )\n}\n\n/**\n * \u7D27\u51D1\u7248 TaskCard (\u7528\u4E8E\u7A7A\u95F4\u53D7\u9650\u7684\u573A\u666F)\n */\nexport function CompactTaskCard({\n subagent,\n}: {\n subagent: SubagentState\n}): React.ReactNode {\n const theme = getTheme()\n const { taskName, status, agentColor } = subagent\n\n const color = getAgentColor(agentColor, theme)\n const isRunning =\n status === 'initializing' || status === 'running' || status === 'queued'\n const statusIcon = getStatusIcon(status, isRunning)\n\n return (\n <Box flexDirection=\"row\">\n <Text color={color}>\n {statusIcon} {taskName}\n </Text>\n <Text color={theme.dimmedText}> \u00B7 {getStatusText(status)}</Text>\n </Box>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,100 @@
1
+ import React from "react";
2
+ import { Text, useInput } from "ink";
3
+ import chalk from "chalk";
4
+ import { useTextInput } from "../hooks/useTextInput.js";
5
+ import { getTheme } from "../utils/theme.js";
6
+ function TextInput({
7
+ value: originalValue,
8
+ placeholder = "",
9
+ focus = true,
10
+ mask,
11
+ multiline = false,
12
+ highlightPastedText = false,
13
+ showCursor = true,
14
+ onChange,
15
+ onSubmit,
16
+ onExit,
17
+ onHistoryUp,
18
+ onHistoryDown,
19
+ onExitMessage,
20
+ onMessage,
21
+ onHistoryReset,
22
+ columns,
23
+ onImagePaste,
24
+ onPaste,
25
+ isDimmed = false,
26
+ disableCursorMovementForUpDownKeys = false,
27
+ onSpecialKey,
28
+ cursorOffset,
29
+ onChangeCursorOffset
30
+ }) {
31
+ const { onInput, renderedValue } = useTextInput({
32
+ value: originalValue,
33
+ onChange,
34
+ onSubmit,
35
+ onExit,
36
+ onExitMessage,
37
+ onMessage,
38
+ onHistoryReset,
39
+ onHistoryUp,
40
+ onHistoryDown,
41
+ focus,
42
+ mask,
43
+ multiline,
44
+ cursorChar: showCursor ? " " : "",
45
+ highlightPastedText,
46
+ invert: chalk.inverse,
47
+ themeText: (text) => chalk.hex(getTheme().text)(text),
48
+ columns,
49
+ onImagePaste,
50
+ disableCursorMovementForUpDownKeys,
51
+ externalOffset: cursorOffset,
52
+ onOffsetChange: onChangeCursorOffset
53
+ });
54
+ const [pasteState, setPasteState] = React.useState({ chunks: [], timeoutId: null });
55
+ const resetPasteTimeout = (currentTimeoutId) => {
56
+ if (currentTimeoutId) {
57
+ clearTimeout(currentTimeoutId);
58
+ }
59
+ return setTimeout(() => {
60
+ setPasteState(({ chunks }) => {
61
+ const pastedText = chunks.join("");
62
+ Promise.resolve().then(() => onPaste(pastedText));
63
+ return { chunks: [], timeoutId: null };
64
+ });
65
+ }, 100);
66
+ };
67
+ const wrappedOnInput = (input, key) => {
68
+ if (onSpecialKey && onSpecialKey(input, key)) {
69
+ return;
70
+ }
71
+ if (key.backspace || key.delete || input === "\b" || input === "\x7F" || input === "\b") {
72
+ onInput(input, {
73
+ ...key,
74
+ backspace: true
75
+ });
76
+ return;
77
+ }
78
+ if (onPaste && (input.length > 800 || pasteState.timeoutId)) {
79
+ setPasteState(({ chunks, timeoutId }) => {
80
+ return {
81
+ chunks: [...chunks, input],
82
+ timeoutId: resetPasteTimeout(timeoutId)
83
+ };
84
+ });
85
+ return;
86
+ }
87
+ onInput(input, key);
88
+ };
89
+ useInput(wrappedOnInput, { isActive: focus });
90
+ let renderedPlaceholder = placeholder ? chalk.hex(getTheme().secondaryText)(placeholder) : void 0;
91
+ if (showCursor && focus) {
92
+ renderedPlaceholder = placeholder.length > 0 ? chalk.inverse(placeholder[0]) + chalk.hex(getTheme().secondaryText)(placeholder.slice(1)) : chalk.inverse(" ");
93
+ }
94
+ const showPlaceholder = originalValue.length == 0 && placeholder;
95
+ return /* @__PURE__ */ React.createElement(Text, { wrap: "truncate-end", dimColor: isDimmed }, showPlaceholder ? renderedPlaceholder : renderedValue);
96
+ }
97
+ export {
98
+ TextInput as default
99
+ };
100
+ //# sourceMappingURL=TextInput.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TextInput.tsx"],
4
+ "sourcesContent": ["import React from 'react'\nimport { Text, useInput } from 'ink'\nimport chalk from 'chalk'\nimport { useTextInput } from '@hooks/useTextInput'\nimport { getTheme } from '@utils/theme'\nimport { type Key } from 'ink'\n\nexport type Props = {\n /**\n * Optional callback for handling history navigation on up arrow at start of input\n */\n readonly onHistoryUp?: () => void\n\n /**\n * Optional callback for handling history navigation on down arrow at end of input\n */\n readonly onHistoryDown?: () => void\n\n /**\n * Text to display when `value` is empty.\n */\n readonly placeholder?: string\n\n /**\n * Allow multi-line input via line ending with backslash (default: `true`)\n */\n readonly multiline?: boolean\n\n /**\n * Listen to user's input. Useful in case there are multiple input components\n * at the same time and input must be \"routed\" to a specific component.\n */\n readonly focus?: boolean\n\n /**\n * Replace all chars and mask the value. Useful for password inputs.\n */\n readonly mask?: string\n\n /**\n * Whether to show cursor and allow navigation inside text input with arrow keys.\n */\n readonly showCursor?: boolean\n\n /**\n * Highlight pasted text\n */\n readonly highlightPastedText?: boolean\n\n /**\n * Value to display in a text input.\n */\n readonly value: string\n\n /**\n * Function to call when value updates.\n */\n readonly onChange: (value: string) => void\n\n /**\n * Function to call when `Enter` is pressed, where first argument is a value of the input.\n */\n readonly onSubmit?: (value: string) => void\n\n /**\n * Function to call when Ctrl+C is pressed to exit.\n */\n readonly onExit?: () => void\n\n /**\n * Optional callback to show exit message\n */\n readonly onExitMessage?: (show: boolean, key?: string) => void\n\n /**\n * Optional callback to show custom message\n */\n readonly onMessage?: (show: boolean, message?: string) => void\n\n /**\n * Optional callback to reset history position\n */\n readonly onHistoryReset?: () => void\n\n /**\n * Number of columns to wrap text at\n */\n readonly columns: number\n\n /**\n * Optional callback when an image is pasted\n */\n readonly onImagePaste?: (base64Image: string) => void\n\n /**\n * Optional callback when a large text (over 800 chars) is pasted\n */\n readonly onPaste?: (text: string) => void\n\n /**\n * Whether the input is dimmed and non-interactive\n */\n readonly isDimmed?: boolean\n\n /**\n * Whether to disable cursor movement for up/down arrow keys\n */\n readonly disableCursorMovementForUpDownKeys?: boolean\n \n /**\n * Optional callback to handle special key combinations before input processing\n * Return true to prevent default handling\n */\n readonly onSpecialKey?: (input: string, key: Key) => boolean\n\n readonly cursorOffset: number\n\n /**\n * Callback to set the offset of the cursor\n */\n onChangeCursorOffset: (offset: number) => void\n}\n\nexport default function TextInput({\n value: originalValue,\n placeholder = '',\n focus = true,\n mask,\n multiline = false,\n highlightPastedText = false,\n showCursor = true,\n onChange,\n onSubmit,\n onExit,\n onHistoryUp,\n onHistoryDown,\n onExitMessage,\n onMessage,\n onHistoryReset,\n columns,\n onImagePaste,\n onPaste,\n isDimmed = false,\n disableCursorMovementForUpDownKeys = false,\n onSpecialKey,\n cursorOffset,\n onChangeCursorOffset,\n}: Props) {\n const { onInput, renderedValue } = useTextInput({\n value: originalValue,\n onChange,\n onSubmit,\n onExit,\n onExitMessage,\n onMessage,\n onHistoryReset,\n onHistoryUp,\n onHistoryDown,\n focus,\n mask,\n multiline,\n cursorChar: showCursor ? ' ' : '',\n highlightPastedText,\n invert: chalk.inverse,\n themeText: (text: string) => chalk.hex(getTheme().text)(text),\n columns,\n onImagePaste,\n disableCursorMovementForUpDownKeys,\n externalOffset: cursorOffset,\n onOffsetChange: onChangeCursorOffset,\n })\n\n // Paste detection state\n const [pasteState, setPasteState] = React.useState<{\n chunks: string[]\n timeoutId: ReturnType<typeof setTimeout> | null\n }>({ chunks: [], timeoutId: null })\n\n const resetPasteTimeout = (\n currentTimeoutId: ReturnType<typeof setTimeout> | null,\n ) => {\n if (currentTimeoutId) {\n clearTimeout(currentTimeoutId)\n }\n return setTimeout(() => {\n setPasteState(({ chunks }) => {\n const pastedText = chunks.join('')\n // Schedule callback after current render to avoid state updates during render\n Promise.resolve().then(() => onPaste!(pastedText))\n return { chunks: [], timeoutId: null }\n })\n }, 100)\n }\n\n const wrappedOnInput = (input: string, key: Key): void => {\n // Check for special key combinations first\n if (onSpecialKey && onSpecialKey(input, key)) {\n // Special key was handled, don't process further\n return\n }\n \n // Special handling for backspace or delete\n if (\n key.backspace ||\n key.delete ||\n input === '\\b' ||\n input === '\\x7f' ||\n input === '\\x08'\n ) {\n // Ensure backspace is handled directly\n onInput(input, {\n ...key,\n backspace: true,\n })\n return\n }\n\n // Handle pastes (>800 chars)\n // Usually we get one or two input characters at a time. If we\n // get a bunch, the user has probably pasted.\n // Unfortunately node batches long pastes, so it's possible\n // that we would see e.g. 1024 characters and then just a few\n // more in the next frame that belong with the original paste.\n // This batching number is not consistent.\n if (onPaste && (input.length > 800 || pasteState.timeoutId)) {\n setPasteState(({ chunks, timeoutId }) => {\n return {\n chunks: [...chunks, input],\n timeoutId: resetPasteTimeout(timeoutId),\n }\n })\n return\n }\n\n onInput(input, key)\n }\n\n useInput(wrappedOnInput, { isActive: focus })\n\n let renderedPlaceholder = placeholder\n ? chalk.hex(getTheme().secondaryText)(placeholder)\n : undefined\n\n // Fake mouse cursor, because we like punishment\n if (showCursor && focus) {\n renderedPlaceholder =\n placeholder.length > 0\n ? chalk.inverse(placeholder[0]) +\n chalk.hex(getTheme().secondaryText)(placeholder.slice(1))\n : chalk.inverse(' ')\n }\n\n const showPlaceholder = originalValue.length == 0 && placeholder\n return (\n <Text wrap=\"truncate-end\" dimColor={isDimmed}>\n {showPlaceholder ? renderedPlaceholder : renderedValue}\n </Text>\n )\n}\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,MAAM,gBAAgB;AAC/B,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAuHV,SAAR,UAA2B;AAAA,EAChC,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,qCAAqC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,GAAU;AACR,QAAM,EAAE,SAAS,cAAc,IAAI,aAAa;AAAA,IAC9C,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,aAAa,MAAM;AAAA,IAC/B;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,WAAW,CAAC,SAAiB,MAAM,IAAI,SAAS,EAAE,IAAI,EAAE,IAAI;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,CAAC;AAGD,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAGvC,EAAE,QAAQ,CAAC,GAAG,WAAW,KAAK,CAAC;AAElC,QAAM,oBAAoB,CACxB,qBACG;AACH,QAAI,kBAAkB;AACpB,mBAAa,gBAAgB;AAAA,IAC/B;AACA,WAAO,WAAW,MAAM;AACtB,oBAAc,CAAC,EAAE,OAAO,MAAM;AAC5B,cAAM,aAAa,OAAO,KAAK,EAAE;AAEjC,gBAAQ,QAAQ,EAAE,KAAK,MAAM,QAAS,UAAU,CAAC;AACjD,eAAO,EAAE,QAAQ,CAAC,GAAG,WAAW,KAAK;AAAA,MACvC,CAAC;AAAA,IACH,GAAG,GAAG;AAAA,EACR;AAEA,QAAM,iBAAiB,CAAC,OAAe,QAAmB;AAExD,QAAI,gBAAgB,aAAa,OAAO,GAAG,GAAG;AAE5C;AAAA,IACF;AAGA,QACE,IAAI,aACJ,IAAI,UACJ,UAAU,QACV,UAAU,UACV,UAAU,MACV;AAEA,cAAQ,OAAO;AAAA,QACb,GAAG;AAAA,QACH,WAAW;AAAA,MACb,CAAC;AACD;AAAA,IACF;AASA,QAAI,YAAY,MAAM,SAAS,OAAO,WAAW,YAAY;AAC3D,oBAAc,CAAC,EAAE,QAAQ,UAAU,MAAM;AACvC,eAAO;AAAA,UACL,QAAQ,CAAC,GAAG,QAAQ,KAAK;AAAA,UACzB,WAAW,kBAAkB,SAAS;AAAA,QACxC;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,OAAO,GAAG;AAAA,EACpB;AAEA,WAAS,gBAAgB,EAAE,UAAU,MAAM,CAAC;AAE5C,MAAI,sBAAsB,cACtB,MAAM,IAAI,SAAS,EAAE,aAAa,EAAE,WAAW,IAC/C;AAGJ,MAAI,cAAc,OAAO;AACvB,0BACE,YAAY,SAAS,IACjB,MAAM,QAAQ,YAAY,CAAC,CAAC,IAC5B,MAAM,IAAI,SAAS,EAAE,aAAa,EAAE,YAAY,MAAM,CAAC,CAAC,IACxD,MAAM,QAAQ,GAAG;AAAA,EACzB;AAEA,QAAM,kBAAkB,cAAc,UAAU,KAAK;AACrD,SACE,oCAAC,QAAK,MAAK,gBAAe,UAAU,YACjC,kBAAkB,sBAAsB,aAC3C;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,31 @@
1
+ function mergeTimeline(toolExecutions, subagentExecutions) {
2
+ const timeline = [];
3
+ for (const tool of toolExecutions) {
4
+ timeline.push({
5
+ type: "tool",
6
+ data: tool,
7
+ time: tool.startTime
8
+ });
9
+ }
10
+ for (const subagent of subagentExecutions) {
11
+ timeline.push({
12
+ type: "subagent",
13
+ data: subagent,
14
+ time: subagent.metrics.startTime
15
+ });
16
+ }
17
+ timeline.sort((a, b) => a.time - b.time);
18
+ return timeline;
19
+ }
20
+ function isToolExecution(item) {
21
+ return item.type === "tool";
22
+ }
23
+ function isSubagentExecution(item) {
24
+ return item.type === "subagent";
25
+ }
26
+ export {
27
+ isSubagentExecution,
28
+ isToolExecution,
29
+ mergeTimeline
30
+ };
31
+ //# sourceMappingURL=TimelineRenderer.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TimelineRenderer.tsx"],
4
+ "sourcesContent": ["/**\n * TimelineRenderer - Merges tool executions and subagent executions\n *\n * Sorts timeline items by timestamp and returns a unified array\n * for hierarchical rendering in InteractionRoundBlock.\n */\n\nimport type { SubagentState } from '@minto-types/subagent'\n\n/**\n * Tool execution data (simplified from existing tool execution tracking)\n */\nexport interface ToolExecution {\n id: string\n name: string\n input: any\n result?: any\n status: 'pending' | 'running' | 'completed' | 'error'\n startTime: number\n endTime?: number\n durationMs?: number\n}\n\n/**\n * Timeline item types\n */\nexport type TimelineItemType = 'tool' | 'subagent'\n\n/**\n * Unified timeline item\n */\nexport interface TimelineItem {\n type: TimelineItemType\n data: ToolExecution | SubagentState\n time: number\n}\n\n/**\n * Merge tool executions and subagent executions into a unified timeline\n *\n * @param toolExecutions - Array of tool execution records\n * @param subagentExecutions - Array of subagent execution records\n * @returns Sorted array of timeline items\n */\nexport function mergeTimeline(\n toolExecutions: ToolExecution[],\n subagentExecutions: SubagentState[],\n): TimelineItem[] {\n const timeline: TimelineItem[] = []\n\n // Add tool executions to timeline\n for (const tool of toolExecutions) {\n timeline.push({\n type: 'tool',\n data: tool,\n time: tool.startTime,\n })\n }\n\n // Add subagent executions to timeline\n for (const subagent of subagentExecutions) {\n timeline.push({\n type: 'subagent',\n data: subagent,\n time: subagent.metrics.startTime,\n })\n }\n\n // Sort by timestamp (ascending - earliest first)\n timeline.sort((a, b) => a.time - b.time)\n\n return timeline\n}\n\n/**\n * Type guard to check if timeline item is a tool execution\n */\nexport function isToolExecution(\n item: TimelineItem,\n): item is TimelineItem & { data: ToolExecution } {\n return item.type === 'tool'\n}\n\n/**\n * Type guard to check if timeline item is a subagent execution\n */\nexport function isSubagentExecution(\n item: TimelineItem,\n): item is TimelineItem & { data: SubagentState } {\n return item.type === 'subagent'\n}\n"],
5
+ "mappings": "AA4CO,SAAS,cACd,gBACA,oBACgB;AAChB,QAAM,WAA2B,CAAC;AAGlC,aAAW,QAAQ,gBAAgB;AACjC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AAGA,aAAW,YAAY,oBAAoB;AACzC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,SAAS,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAGA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAEvC,SAAO;AACT;AAKO,SAAS,gBACd,MACgD;AAChD,SAAO,KAAK,SAAS;AACvB;AAKO,SAAS,oBACd,MACgD;AAChD,SAAO,KAAK,SAAS;AACvB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,29 @@
1
+ import { Box, Text } from "ink";
2
+ import React from "react";
3
+ import { TodoChangeLine } from "./TodoChangeLine.js";
4
+ import { getTheme } from "../utils/theme.js";
5
+ function TodoChangeBlock({
6
+ changes,
7
+ todos,
8
+ indent = 1
9
+ }) {
10
+ const theme = getTheme();
11
+ const stats = {
12
+ pending: todos.filter((t) => t.status === "pending").length,
13
+ inProgress: todos.filter((t) => t.status === "in_progress").length,
14
+ completed: todos.filter((t) => t.status === "completed").length
15
+ };
16
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: indent * 2 }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, "\u{1F527} "), /* @__PURE__ */ React.createElement(Text, null, "Updated task list")), changes.length > 0 && /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, changes.map((change, idx) => /* @__PURE__ */ React.createElement(Box, { key: `${change.todoId}-${idx}` }, /* @__PURE__ */ React.createElement(TodoChangeLine, { change })))), /* @__PURE__ */ React.createElement(
17
+ Box,
18
+ {
19
+ flexDirection: "row",
20
+ marginLeft: 2,
21
+ marginTop: changes.length > 0 ? 1 : 0
22
+ },
23
+ /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, stats.pending, " pending \xB7 ", stats.inProgress, " in progress \xB7", " ", stats.completed, " completed")
24
+ ));
25
+ }
26
+ export {
27
+ TodoChangeBlock
28
+ };
29
+ //# sourceMappingURL=TodoChangeBlock.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TodoChangeBlock.tsx"],
4
+ "sourcesContent": ["/**\n * TodoChangeBlock - Renders Todo changes in the conversation flow\n *\n * Displays:\n * - Tool call header \"\uD83D\uDD27 Updated task list\"\n * - Individual changes via TodoChangeLine\n * - Summary statistics (pending/in_progress/completed)\n *\n * When TodoWriteTool is called, this component shows what changed\n * in the conversation timeline, separate from the TodoPanel.\n */\n\nimport { Box, Text } from 'ink'\nimport React from 'react'\nimport type { TodoChange } from '@utils/todoChangeCalculator'\nimport type { TodoItem } from '@utils/todoStorage'\nimport { TodoChangeLine } from './TodoChangeLine'\nimport { getTheme } from '@utils/theme'\n\ninterface TodoChangeBlockProps {\n /** List of changes to display */\n changes: TodoChange[]\n /** Current complete todo list (for statistics) */\n todos: TodoItem[]\n /** Indentation level (default: 1) */\n indent?: number\n}\n\nexport function TodoChangeBlock({\n changes,\n todos,\n indent = 1,\n}: TodoChangeBlockProps) {\n const theme = getTheme()\n\n // Calculate statistics\n const stats = {\n pending: todos.filter(t => t.status === 'pending').length,\n inProgress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n }\n\n return (\n <Box flexDirection=\"column\" marginLeft={indent * 2}>\n {/* Tool call header */}\n <Box flexDirection=\"row\">\n <Text color={theme.brand}>\uD83D\uDD27 </Text>\n <Text>Updated task list</Text>\n </Box>\n\n {/* Changes display */}\n {changes.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {changes.map((change, idx) => (\n <Box key={`${change.todoId}-${idx}`}>\n <TodoChangeLine change={change} />\n </Box>\n ))}\n </Box>\n )}\n\n {/* Summary statistics */}\n <Box\n flexDirection=\"row\"\n marginLeft={2}\n marginTop={changes.length > 0 ? 1 : 0}\n >\n <Text color={theme.dim}>\n {stats.pending} pending \u00B7 {stats.inProgress} in progress \u00B7{' '}\n {stats.completed} completed\n </Text>\n </Box>\n </Box>\n )\n}\n"],
5
+ "mappings": "AAYA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAGlB,SAAS,sBAAsB;AAC/B,SAAS,gBAAgB;AAWlB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAAyB;AACvB,QAAM,QAAQ,SAAS;AAGvB,QAAM,QAAQ;AAAA,IACZ,SAAS,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,IACnD,YAAY,MAAM,OAAO,OAAK,EAAE,WAAW,aAAa,EAAE;AAAA,IAC1D,WAAW,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,EACzD;AAEA,SACE,oCAAC,OAAI,eAAc,UAAS,YAAY,SAAS,KAE/C,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,YAAG,GAC7B,oCAAC,YAAK,mBAAiB,CACzB,GAGC,QAAQ,SAAS,KAChB,oCAAC,OAAI,eAAc,UAAS,YAAY,KACrC,QAAQ,IAAI,CAAC,QAAQ,QACpB,oCAAC,OAAI,KAAK,GAAG,OAAO,MAAM,IAAI,GAAG,MAC/B,oCAAC,kBAAe,QAAgB,CAClC,CACD,CACH,GAIF;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,YAAY;AAAA,MACZ,WAAW,QAAQ,SAAS,IAAI,IAAI;AAAA;AAAA,IAEpC,oCAAC,QAAK,OAAO,MAAM,OAChB,MAAM,SAAQ,kBAAY,MAAM,YAAW,qBAAe,KAC1D,MAAM,WAAU,YACnB;AAAA,EACF,CACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ import { Box, Text } from "ink";
2
+ import React from "react";
3
+ import { getTheme } from "../utils/theme.js";
4
+ function TodoChangeLine({ change }) {
5
+ const theme = getTheme();
6
+ switch (change.type) {
7
+ case "added":
8
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "+ "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content));
9
+ case "removed":
10
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "- "), /* @__PURE__ */ React.createElement(Text, { strikethrough: true, color: theme.dim }, change.oldValue?.content));
11
+ case "status_changed":
12
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.brand }, "\u2713 "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content), /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " ", "(", change.oldValue?.status, " \u2192 ", change.newValue?.status, ")"));
13
+ case "updated":
14
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "~ "), /* @__PURE__ */ React.createElement(Text, null, change.newValue?.content), change.oldValue?.priority !== change.newValue?.priority && /* @__PURE__ */ React.createElement(Text, { color: theme.dim }, " ", "(priority: ", change.oldValue?.priority, " \u2192", " ", change.newValue?.priority, ")"));
15
+ default:
16
+ return null;
17
+ }
18
+ }
19
+ export {
20
+ TodoChangeLine
21
+ };
22
+ //# sourceMappingURL=TodoChangeLine.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TodoChangeLine.tsx"],
4
+ "sourcesContent": ["/**\n * TodoChangeLine - Renders individual Todo changes\n *\n * Handles:\n * - 'added' (green +)\n * - 'removed' (red -)\n * - 'status_changed' (blue \u2713)\n * - 'updated' (default style)\n *\n * Shows old \u2192 new status for status changes\n * Uses strikethrough for removed items\n */\n\nimport { Box, Text } from 'ink'\nimport React from 'react'\nimport type { TodoChange } from '@utils/todoChangeCalculator'\nimport { getTheme } from '@utils/theme'\n\ninterface TodoChangeLineProps {\n change: TodoChange\n}\n\nexport function TodoChangeLine({ change }: TodoChangeLineProps) {\n const theme = getTheme()\n\n switch (change.type) {\n case 'added':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.success}>+ </Text>\n <Text>{change.newValue?.content}</Text>\n </Box>\n )\n\n case 'removed':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.error}>- </Text>\n <Text strikethrough color={theme.dim}>\n {change.oldValue?.content}\n </Text>\n </Box>\n )\n\n case 'status_changed':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.brand}>\u2713 </Text>\n <Text>{change.newValue?.content}</Text>\n <Text color={theme.dim}>\n {' '}\n ({change.oldValue?.status} \u2192 {change.newValue?.status})\n </Text>\n </Box>\n )\n\n case 'updated':\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.info}>~ </Text>\n <Text>{change.newValue?.content}</Text>\n {change.oldValue?.priority !== change.newValue?.priority && (\n <Text color={theme.dim}>\n {' '}\n (priority: {change.oldValue?.priority} \u2192{' '}\n {change.newValue?.priority})\n </Text>\n )}\n </Box>\n )\n\n default:\n return null\n }\n}\n"],
5
+ "mappings": "AAaA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAElB,SAAS,gBAAgB;AAMlB,SAAS,eAAe,EAAE,OAAO,GAAwB;AAC9D,QAAM,QAAQ,SAAS;AAEvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,WAAS,IAAE,GAC9B,oCAAC,YAAM,OAAO,UAAU,OAAQ,CAClC;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,IAAE,GAC5B,oCAAC,QAAK,eAAa,MAAC,OAAO,MAAM,OAC9B,OAAO,UAAU,OACpB,CACF;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,SAAO,SAAE,GAC5B,oCAAC,YAAM,OAAO,UAAU,OAAQ,GAChC,oCAAC,QAAK,OAAO,MAAM,OAChB,KAAI,KACH,OAAO,UAAU,QAAO,YAAI,OAAO,UAAU,QAAO,GACxD,CACF;AAAA,IAGJ,KAAK;AACH,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,QAAM,IAAE,GAC3B,oCAAC,YAAM,OAAO,UAAU,OAAQ,GAC/B,OAAO,UAAU,aAAa,OAAO,UAAU,YAC9C,oCAAC,QAAK,OAAO,MAAM,OAChB,KAAI,eACO,OAAO,UAAU,UAAS,WAAG,KACxC,OAAO,UAAU,UAAS,GAC7B,CAEJ;AAAA,IAGJ;AACE,aAAO;AAAA,EACX;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ const TodoItem = ({ todo, children }) => {
4
+ const statusIconMap = {
5
+ completed: "\u2705",
6
+ in_progress: "\u{1F504}",
7
+ pending: "\u23F8\uFE0F"
8
+ };
9
+ const statusColorMap = {
10
+ completed: "#008000",
11
+ in_progress: "#FFA500",
12
+ pending: "#FFD700"
13
+ };
14
+ const priorityIconMap = {
15
+ high: "\u{1F534}",
16
+ medium: "\u{1F7E1}",
17
+ low: "\u{1F7E2}"
18
+ };
19
+ const icon = statusIconMap[todo.status];
20
+ const color = statusColorMap[todo.status];
21
+ const priorityIcon = todo.priority ? priorityIconMap[todo.priority] : "";
22
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ React.createElement(Text, { color }, icon), priorityIcon && /* @__PURE__ */ React.createElement(Text, null, priorityIcon), /* @__PURE__ */ React.createElement(
23
+ Text,
24
+ {
25
+ color,
26
+ strikethrough: todo.status === "completed",
27
+ bold: todo.status === "in_progress"
28
+ },
29
+ todo.content
30
+ ), children);
31
+ };
32
+ export {
33
+ TodoItem
34
+ };
35
+ //# sourceMappingURL=TodoItem.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TodoItem.tsx"],
4
+ "sourcesContent": ["import React from 'react'\nimport { Box, Text } from 'ink'\nimport type { TodoItem as TodoItemType } from '@utils/todoStorage'\n\nexport interface TodoItemProps {\n todo: TodoItemType\n children?: React.ReactNode\n}\n\nexport const TodoItem: React.FC<TodoItemProps> = ({ todo, children }) => {\n const statusIconMap = {\n completed: '\u2705',\n in_progress: '\uD83D\uDD04',\n pending: '\u23F8\uFE0F',\n }\n\n const statusColorMap = {\n completed: '#008000',\n in_progress: '#FFA500', \n pending: '#FFD700',\n }\n\n const priorityIconMap = {\n high: '\uD83D\uDD34',\n medium: '\uD83D\uDFE1',\n low: '\uD83D\uDFE2',\n }\n\n const icon = statusIconMap[todo.status]\n const color = statusColorMap[todo.status]\n const priorityIcon = todo.priority ? priorityIconMap[todo.priority] : ''\n\n return (\n <Box flexDirection=\"row\" gap={1}>\n <Text color={color}>{icon}</Text>\n {priorityIcon && <Text>{priorityIcon}</Text>}\n <Text \n color={color}\n strikethrough={todo.status === 'completed'}\n bold={todo.status === 'in_progress'}\n >\n {todo.content}\n </Text>\n {children}\n </Box>\n )\n}"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,KAAK,YAAY;AAQnB,MAAM,WAAoC,CAAC,EAAE,MAAM,SAAS,MAAM;AACvE,QAAM,gBAAgB;AAAA,IACpB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,QAAM,iBAAiB;AAAA,IACrB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAEA,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAEA,QAAM,OAAO,cAAc,KAAK,MAAM;AACtC,QAAM,QAAQ,eAAe,KAAK,MAAM;AACxC,QAAM,eAAe,KAAK,WAAW,gBAAgB,KAAK,QAAQ,IAAI;AAEtE,SACE,oCAAC,OAAI,eAAc,OAAM,KAAK,KAC5B,oCAAC,QAAK,SAAe,IAAK,GACzB,gBAAgB,oCAAC,YAAM,YAAa,GACrC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe,KAAK,WAAW;AAAA,MAC/B,MAAM,KAAK,WAAW;AAAA;AAAA,IAErB,KAAK;AAAA,EACR,GACC,QACH;AAEJ;",
6
+ "names": []
7
+ }