@within-7/minto 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/dist/Tool.js +7 -0
  2. package/dist/Tool.js.map +2 -2
  3. package/dist/commands/agents/AgentsCommand.js +1 -1
  4. package/dist/commands/agents/AgentsCommand.js.map +2 -2
  5. package/dist/commands/agents/constants.js +2 -2
  6. package/dist/commands/agents/constants.js.map +2 -2
  7. package/dist/commands/clear.js +4 -3
  8. package/dist/commands/clear.js.map +2 -2
  9. package/dist/commands/compact.js +2 -2
  10. package/dist/commands/compact.js.map +1 -1
  11. package/dist/commands/context.js +3 -1
  12. package/dist/commands/context.js.map +2 -2
  13. package/dist/commands/login.js +128 -0
  14. package/dist/commands/login.js.map +7 -0
  15. package/dist/commands/memory.js +33 -82
  16. package/dist/commands/memory.js.map +2 -2
  17. package/dist/commands/quit.js +3 -1
  18. package/dist/commands/quit.js.map +2 -2
  19. package/dist/commands/resume.js +39 -239
  20. package/dist/commands/resume.js.map +2 -2
  21. package/dist/commands/tasks.js +1 -1
  22. package/dist/commands/tasks.js.map +2 -2
  23. package/dist/commands/terminalSetup.js +6 -2
  24. package/dist/commands/terminalSetup.js.map +2 -2
  25. package/dist/commands.js +2 -0
  26. package/dist/commands.js.map +2 -2
  27. package/dist/components/AgentDetailView.js +126 -0
  28. package/dist/components/AgentDetailView.js.map +7 -0
  29. package/dist/components/AgentThinkingBlock.js +1 -1
  30. package/dist/components/AgentThinkingBlock.js.map +2 -2
  31. package/dist/components/AgentViewBanner.js +22 -0
  32. package/dist/components/AgentViewBanner.js.map +7 -0
  33. package/dist/components/HeaderBar.js +1 -1
  34. package/dist/components/HeaderBar.js.map +2 -2
  35. package/dist/components/Help.js +8 -1
  36. package/dist/components/Help.js.map +2 -2
  37. package/dist/components/HotkeyHelpPanel.js +26 -8
  38. package/dist/components/HotkeyHelpPanel.js.map +2 -2
  39. package/dist/components/IdleNotificationBar.js +10 -0
  40. package/dist/components/IdleNotificationBar.js.map +7 -0
  41. package/dist/components/ModelSelector/ModelSelector.js +55 -20
  42. package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
  43. package/dist/components/PromptInput.js +186 -115
  44. package/dist/components/PromptInput.js.map +2 -2
  45. package/dist/components/RewindPanel.js +272 -0
  46. package/dist/components/RewindPanel.js.map +7 -0
  47. package/dist/components/Spinner.js +10 -21
  48. package/dist/components/Spinner.js.map +2 -2
  49. package/dist/components/StreamingTextPreview.js +29 -0
  50. package/dist/components/StreamingTextPreview.js.map +7 -0
  51. package/dist/components/SubagentBlock.js +3 -2
  52. package/dist/components/SubagentBlock.js.map +2 -2
  53. package/dist/components/SubagentProgress.js +4 -4
  54. package/dist/components/SubagentProgress.js.map +2 -2
  55. package/dist/components/TabbedListView/SearchInput.js +1 -1
  56. package/dist/components/TabbedListView/SearchInput.js.map +2 -2
  57. package/dist/components/TabbedListView/TabbedListView.js +87 -41
  58. package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
  59. package/dist/components/TaskCard.js +4 -4
  60. package/dist/components/TaskCard.js.map +2 -2
  61. package/dist/components/TeamMemberPanel.js +107 -0
  62. package/dist/components/TeamMemberPanel.js.map +7 -0
  63. package/dist/components/ThinkingSelector.js +84 -0
  64. package/dist/components/ThinkingSelector.js.map +7 -0
  65. package/dist/components/TitledDivider.js +26 -0
  66. package/dist/components/TitledDivider.js.map +7 -0
  67. package/dist/components/TodoPanel.js +31 -30
  68. package/dist/components/TodoPanel.js.map +2 -2
  69. package/dist/components/TokenWarning.js +28 -7
  70. package/dist/components/TokenWarning.js.map +2 -2
  71. package/dist/components/messages/AssistantTextMessage.js +5 -2
  72. package/dist/components/messages/AssistantTextMessage.js.map +2 -2
  73. package/dist/components/messages/AssistantToolUseMessage.js +9 -1
  74. package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
  75. package/dist/components/messages/DefaultToolResultFallback.js +11 -0
  76. package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
  77. package/dist/components/messages/ParallelTasksGroupView.js +14 -6
  78. package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
  79. package/dist/components/messages/TaskInModuleView.js +27 -27
  80. package/dist/components/messages/TaskInModuleView.js.map +2 -2
  81. package/dist/components/messages/UserGuidanceMessage.js +26 -0
  82. package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
  83. package/dist/components/messages/UserPromptMessage.js +2 -1
  84. package/dist/components/messages/UserPromptMessage.js.map +2 -2
  85. package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
  86. package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
  87. package/dist/components/messages/UserTextMessage.js +8 -0
  88. package/dist/components/messages/UserTextMessage.js.map +2 -2
  89. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
  90. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
  91. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
  92. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
  93. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
  94. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
  95. package/dist/components/permissions/PermissionRequest.js +4 -0
  96. package/dist/components/permissions/PermissionRequest.js.map +2 -2
  97. package/dist/components/permissions/PlanApprovalRequest.js +164 -0
  98. package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
  99. package/dist/constants/agentTeams.js +17 -0
  100. package/dist/constants/agentTeams.js.map +7 -0
  101. package/dist/constants/macros.js +2 -1
  102. package/dist/constants/macros.js.map +2 -2
  103. package/dist/constants/prompts/agentPrompt.js +1 -0
  104. package/dist/constants/prompts/agentPrompt.js.map +2 -2
  105. package/dist/constants/prompts/autoMemory.js +39 -0
  106. package/dist/constants/prompts/autoMemory.js.map +7 -0
  107. package/dist/constants/prompts/codeConventions.js +1 -13
  108. package/dist/constants/prompts/codeConventions.js.map +2 -2
  109. package/dist/constants/prompts/doingTasks.js +21 -2
  110. package/dist/constants/prompts/doingTasks.js.map +2 -2
  111. package/dist/constants/prompts/envInfo.js +6 -7
  112. package/dist/constants/prompts/envInfo.js.map +2 -2
  113. package/dist/constants/prompts/index.js +27 -5
  114. package/dist/constants/prompts/index.js.map +2 -2
  115. package/dist/constants/prompts/taskManagement.js +2 -43
  116. package/dist/constants/prompts/taskManagement.js.map +2 -2
  117. package/dist/constants/prompts/teamOverlays.js +50 -0
  118. package/dist/constants/prompts/teamOverlays.js.map +7 -0
  119. package/dist/constants/prompts/toneAndStyle.js +4 -29
  120. package/dist/constants/prompts/toneAndStyle.js.map +2 -2
  121. package/dist/constants/prompts/toolUsagePolicy.js +7 -22
  122. package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
  123. package/dist/constants/toolInputExamples.js +2 -2
  124. package/dist/constants/toolInputExamples.js.map +2 -2
  125. package/dist/context.js +39 -6
  126. package/dist/context.js.map +2 -2
  127. package/dist/core/backupManager.js +1 -1
  128. package/dist/core/backupManager.js.map +2 -2
  129. package/dist/core/permissions/rules/planModeRule.js +1 -1
  130. package/dist/core/permissions/rules/planModeRule.js.map +1 -1
  131. package/dist/core/permissions/rules/safeModeRule.js +1 -1
  132. package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
  133. package/dist/engine/AgentEngine.js +902 -0
  134. package/dist/engine/AgentEngine.js.map +7 -0
  135. package/dist/engine/EngineRegistry.js +89 -0
  136. package/dist/engine/EngineRegistry.js.map +7 -0
  137. package/dist/engine/foregroundAdapter.js +191 -0
  138. package/dist/engine/foregroundAdapter.js.map +7 -0
  139. package/dist/engine/index.js +15 -0
  140. package/dist/engine/index.js.map +7 -0
  141. package/dist/engine/types.js +1 -0
  142. package/dist/engine/types.js.map +7 -0
  143. package/dist/entrypoints/cli.js +410 -79
  144. package/dist/entrypoints/cli.js.map +3 -3
  145. package/dist/hooks/useAgentEngine.js +129 -0
  146. package/dist/hooks/useAgentEngine.js.map +7 -0
  147. package/dist/hooks/useAgentTokenStats.js +0 -16
  148. package/dist/hooks/useAgentTokenStats.js.map +2 -2
  149. package/dist/hooks/useCanUseTool.js +47 -2
  150. package/dist/hooks/useCanUseTool.js.map +2 -2
  151. package/dist/hooks/useDeferredLoading.js +4 -1
  152. package/dist/hooks/useDeferredLoading.js.map +2 -2
  153. package/dist/hooks/useIdleNotifications.js +66 -0
  154. package/dist/hooks/useIdleNotifications.js.map +7 -0
  155. package/dist/hooks/useSessionTracking.js +9 -7
  156. package/dist/hooks/useSessionTracking.js.map +2 -2
  157. package/dist/hooks/useTeamMembers.js +51 -0
  158. package/dist/hooks/useTeamMembers.js.map +7 -0
  159. package/dist/i18n/locales/en.js +77 -12
  160. package/dist/i18n/locales/en.js.map +2 -2
  161. package/dist/i18n/locales/zh-CN.js +77 -12
  162. package/dist/i18n/locales/zh-CN.js.map +2 -2
  163. package/dist/i18n/types.js.map +1 -1
  164. package/dist/messages.js.map +2 -2
  165. package/dist/permissions.js +113 -7
  166. package/dist/permissions.js.map +2 -2
  167. package/dist/query.js +135 -37
  168. package/dist/query.js.map +2 -2
  169. package/dist/screens/REPL.js +504 -361
  170. package/dist/screens/REPL.js.map +3 -3
  171. package/dist/screens/ResumeConversation.js +199 -14
  172. package/dist/screens/ResumeConversation.js.map +2 -2
  173. package/dist/services/adapters/base.js.map +1 -1
  174. package/dist/services/agentTeams/backends/headless.js +108 -0
  175. package/dist/services/agentTeams/backends/headless.js.map +7 -0
  176. package/dist/services/agentTeams/backends/inProcess.js +102 -0
  177. package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
  178. package/dist/services/agentTeams/backends/resolver.js +18 -0
  179. package/dist/services/agentTeams/backends/resolver.js.map +7 -0
  180. package/dist/services/agentTeams/backends/tmux.js +168 -0
  181. package/dist/services/agentTeams/backends/tmux.js.map +7 -0
  182. package/dist/services/agentTeams/backends/types.js +1 -0
  183. package/dist/services/agentTeams/backends/types.js.map +7 -0
  184. package/dist/services/agentTeams/heartbeat.js +88 -0
  185. package/dist/services/agentTeams/heartbeat.js.map +7 -0
  186. package/dist/services/agentTeams/index.js +42 -2
  187. package/dist/services/agentTeams/index.js.map +2 -2
  188. package/dist/services/agentTeams/injectionChannel.js +105 -0
  189. package/dist/services/agentTeams/injectionChannel.js.map +7 -0
  190. package/dist/services/agentTeams/mailbox.js +410 -30
  191. package/dist/services/agentTeams/mailbox.js.map +2 -2
  192. package/dist/services/agentTeams/messageFormatter.js +80 -0
  193. package/dist/services/agentTeams/messageFormatter.js.map +7 -0
  194. package/dist/services/agentTeams/permissionDelegation.js +71 -0
  195. package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
  196. package/dist/services/agentTeams/teamEvents.js +45 -0
  197. package/dist/services/agentTeams/teamEvents.js.map +7 -0
  198. package/dist/services/agentTeams/teamManager.js +251 -34
  199. package/dist/services/agentTeams/teamManager.js.map +2 -2
  200. package/dist/services/agentTeams/teamTaskStore.js +290 -61
  201. package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
  202. package/dist/services/agentTeams/teammateSpawner.js +99 -18
  203. package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
  204. package/dist/services/hookExecutor.js +51 -8
  205. package/dist/services/hookExecutor.js.map +2 -2
  206. package/dist/services/llm/anthropicProvider.js +56 -59
  207. package/dist/services/llm/anthropicProvider.js.map +2 -2
  208. package/dist/services/llm/dispatch.js +24 -5
  209. package/dist/services/llm/dispatch.js.map +2 -2
  210. package/dist/services/llm/openaiProvider.js +115 -136
  211. package/dist/services/llm/openaiProvider.js.map +3 -3
  212. package/dist/services/llm/types.js +89 -15
  213. package/dist/services/llm/types.js.map +2 -2
  214. package/dist/services/mcpClient.js +80 -4
  215. package/dist/services/mcpClient.js.map +2 -2
  216. package/dist/services/mintoAuth.js +299 -0
  217. package/dist/services/mintoAuth.js.map +7 -0
  218. package/dist/services/oauth.js +3 -3
  219. package/dist/services/oauth.js.map +2 -2
  220. package/dist/services/openai.js +91 -20
  221. package/dist/services/openai.js.map +2 -2
  222. package/dist/services/plugins/pluginRuntime.js +11 -5
  223. package/dist/services/plugins/pluginRuntime.js.map +2 -2
  224. package/dist/services/plugins/pluginValidation.js +4 -2
  225. package/dist/services/plugins/pluginValidation.js.map +2 -2
  226. package/dist/services/sandbox/sandboxController.js +11 -3
  227. package/dist/services/sandbox/sandboxController.js.map +2 -2
  228. package/dist/services/sessionMemoryInjector.js +77 -0
  229. package/dist/services/sessionMemoryInjector.js.map +7 -0
  230. package/dist/services/systemReminder.js +130 -8
  231. package/dist/services/systemReminder.js.map +2 -2
  232. package/dist/services/taskStore.js +199 -8
  233. package/dist/services/taskStore.js.map +3 -3
  234. package/dist/services/topicDetector.js +169 -0
  235. package/dist/services/topicDetector.js.map +7 -0
  236. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
  237. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
  238. package/dist/tools/BashTool/BashTool.js +51 -28
  239. package/dist/tools/BashTool/BashTool.js.map +2 -2
  240. package/dist/tools/BashTool/prompt.js +95 -118
  241. package/dist/tools/BashTool/prompt.js.map +2 -2
  242. package/dist/tools/BashTool/utils.js +39 -1
  243. package/dist/tools/BashTool/utils.js.map +2 -2
  244. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
  245. package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
  246. package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
  247. package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
  248. package/dist/tools/FileEditTool/FileEditTool.js +9 -4
  249. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  250. package/dist/tools/FileEditTool/prompt.js +3 -7
  251. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  252. package/dist/tools/FileReadTool/FileReadTool.js +125 -3
  253. package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
  254. package/dist/tools/FileReadTool/prompt.js +1 -2
  255. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  256. package/dist/tools/FileWriteTool/prompt.js +3 -5
  257. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  258. package/dist/tools/GlobTool/GlobTool.js +3 -2
  259. package/dist/tools/GlobTool/GlobTool.js.map +2 -2
  260. package/dist/tools/GrepTool/GrepTool.js +16 -5
  261. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  262. package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
  263. package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
  264. package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
  265. package/dist/tools/MCPSearchTool/prompt.js +77 -0
  266. package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
  267. package/dist/tools/MultiEditTool/prompt.js +4 -7
  268. package/dist/tools/MultiEditTool/prompt.js.map +2 -2
  269. package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
  270. package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
  271. package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
  272. package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
  273. package/dist/tools/PlanModeTool/prompt.js +23 -74
  274. package/dist/tools/PlanModeTool/prompt.js.map +2 -2
  275. package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
  276. package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
  277. package/dist/tools/SendMessageTool/prompt.js +44 -0
  278. package/dist/tools/SendMessageTool/prompt.js.map +7 -0
  279. package/dist/tools/TaskCreateTool/prompt.js +15 -4
  280. package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
  281. package/dist/tools/TaskListTool/prompt.js +18 -3
  282. package/dist/tools/TaskListTool/prompt.js.map +2 -2
  283. package/dist/tools/TaskOutputTool/prompt.js +4 -3
  284. package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
  285. package/dist/tools/TaskTool/TaskTool.js +762 -98
  286. package/dist/tools/TaskTool/TaskTool.js.map +3 -3
  287. package/dist/tools/TaskTool/constants.js +8 -2
  288. package/dist/tools/TaskTool/constants.js.map +2 -2
  289. package/dist/tools/TaskTool/prompt.js +74 -70
  290. package/dist/tools/TaskTool/prompt.js.map +2 -2
  291. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
  292. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
  293. package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
  294. package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
  295. package/dist/tools/TeamCreateTool/prompt.js +58 -0
  296. package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
  297. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
  298. package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
  299. package/dist/tools/TeamDeleteTool/prompt.js +16 -0
  300. package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
  301. package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
  302. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
  303. package/dist/tools/URLFetcherTool/prompt.js +3 -2
  304. package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
  305. package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
  306. package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
  307. package/dist/tools/WebSearchTool/prompt.js +5 -4
  308. package/dist/tools/WebSearchTool/prompt.js.map +2 -2
  309. package/dist/tools.js +100 -20
  310. package/dist/tools.js.map +2 -2
  311. package/dist/types/PermissionMode.js +35 -6
  312. package/dist/types/PermissionMode.js.map +2 -2
  313. package/dist/types/hooks.js +2 -0
  314. package/dist/types/hooks.js.map +2 -2
  315. package/dist/types/plugin.js +2 -0
  316. package/dist/types/plugin.js.map +3 -3
  317. package/dist/utils/CircuitBreaker.js +15 -9
  318. package/dist/utils/CircuitBreaker.js.map +2 -2
  319. package/dist/utils/agentLoader.js +249 -112
  320. package/dist/utils/agentLoader.js.map +2 -2
  321. package/dist/utils/animationManager.js +40 -3
  322. package/dist/utils/animationManager.js.map +2 -2
  323. package/dist/utils/ask.js +7 -6
  324. package/dist/utils/ask.js.map +2 -2
  325. package/dist/utils/atomicWrite.js +23 -0
  326. package/dist/utils/atomicWrite.js.map +7 -0
  327. package/dist/utils/autoCompactCore.js +73 -56
  328. package/dist/utils/autoCompactCore.js.map +2 -2
  329. package/dist/utils/autoMemoryPaths.js +89 -0
  330. package/dist/utils/autoMemoryPaths.js.map +7 -0
  331. package/dist/utils/config.js +63 -38
  332. package/dist/utils/config.js.map +2 -2
  333. package/dist/utils/configSchema.js +13 -8
  334. package/dist/utils/configSchema.js.map +2 -2
  335. package/dist/utils/credentials/index.js +14 -0
  336. package/dist/utils/credentials/index.js.map +2 -2
  337. package/dist/utils/dualPath.js +24 -0
  338. package/dist/utils/dualPath.js.map +7 -0
  339. package/dist/utils/exit.js +66 -7
  340. package/dist/utils/exit.js.map +2 -2
  341. package/dist/utils/externalEditor.js +155 -0
  342. package/dist/utils/externalEditor.js.map +7 -0
  343. package/dist/utils/fileLock.js +67 -0
  344. package/dist/utils/fileLock.js.map +7 -0
  345. package/dist/utils/format.js +24 -14
  346. package/dist/utils/format.js.map +2 -2
  347. package/dist/utils/globalErrorHandler.js +5 -96
  348. package/dist/utils/globalErrorHandler.js.map +3 -3
  349. package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
  350. package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
  351. package/dist/utils/groupHandlers/taskHandler.js +2 -2
  352. package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
  353. package/dist/utils/hookManager.js +64 -6
  354. package/dist/utils/hookManager.js.map +2 -2
  355. package/dist/utils/log.js +6 -2
  356. package/dist/utils/log.js.map +2 -2
  357. package/dist/utils/markdown.js +237 -19
  358. package/dist/utils/markdown.js.map +2 -2
  359. package/dist/utils/messageContextManager.js +18 -5
  360. package/dist/utils/messageContextManager.js.map +2 -2
  361. package/dist/utils/messageGroupManager.js +1 -1
  362. package/dist/utils/messageGroupManager.js.map +2 -2
  363. package/dist/utils/messages.js +104 -46
  364. package/dist/utils/messages.js.map +2 -2
  365. package/dist/utils/model.js +2 -2
  366. package/dist/utils/model.js.map +2 -2
  367. package/dist/utils/pasteCache.js +8 -4
  368. package/dist/utils/pasteCache.js.map +2 -2
  369. package/dist/utils/pluginLoader.js +18 -0
  370. package/dist/utils/pluginLoader.js.map +2 -2
  371. package/dist/utils/secureKeyStorage.js +36 -7
  372. package/dist/utils/secureKeyStorage.js.map +2 -2
  373. package/dist/utils/simpleMode.js +7 -0
  374. package/dist/utils/simpleMode.js.map +7 -0
  375. package/dist/utils/streamingState.js +11 -1
  376. package/dist/utils/streamingState.js.map +2 -2
  377. package/dist/utils/taskDisplayUtils.js +2 -1
  378. package/dist/utils/taskDisplayUtils.js.map +2 -2
  379. package/dist/utils/teamConfig.js +2 -2
  380. package/dist/utils/teamConfig.js.map +2 -2
  381. package/dist/utils/thinking.js +6 -2
  382. package/dist/utils/thinking.js.map +3 -3
  383. package/dist/utils/tokenProgress.js +55 -0
  384. package/dist/utils/tokenProgress.js.map +7 -0
  385. package/dist/utils/toolRiskClassification.js +26 -17
  386. package/dist/utils/toolRiskClassification.js.map +2 -2
  387. package/dist/utils/tooling/toolError.js +12 -0
  388. package/dist/utils/tooling/toolError.js.map +7 -0
  389. package/dist/version.js +2 -2
  390. package/dist/version.js.map +1 -1
  391. package/package.json +10 -8
@@ -9,8 +9,11 @@ import { Logo } from "../components/Logo.js";
9
9
  import { Message } from "../components/Message.js";
10
10
  import { MessageResponse } from "../components/MessageResponse.js";
11
11
  import { BashStreamingProgress } from "../components/BashStreamingProgress.js";
12
+ import { StreamingTextPreview } from "../components/StreamingTextPreview.js";
12
13
  import { MessageSelector } from "../components/MessageSelector.js";
13
- import { MessageBatchBuffer } from "../utils/MessageBatchBuffer.js";
14
+ import {
15
+ RewindPanel
16
+ } from "../components/RewindPanel.js";
14
17
  import {
15
18
  PermissionRequest
16
19
  } from "../components/permissions/PermissionRequest.js";
@@ -27,6 +30,7 @@ import { overwriteLog } from "../utils/log.js";
27
30
  import { PermissionProvider } from "../context/PermissionContext.js";
28
31
  import { useFullscreenExitCallback } from "../hooks/useTerminalSize.js";
29
32
  import { TodoPanel } from "../components/TodoPanel.js";
33
+ import { ThinkingSelector } from "../components/ThinkingSelector.js";
30
34
  import { TurnCompletionIndicator } from "../components/TurnCompletionIndicator.js";
31
35
  import { getTodos, initTodoSession } from "../utils/todoStorage.js";
32
36
  import {
@@ -35,24 +39,11 @@ import {
35
39
  setModelConfigChangeHandler,
36
40
  setLanguageChangeHandler
37
41
  } from "../messages.js";
38
- import {
39
- query
40
- } from "../query.js";
41
- import {
42
- getGlobalConfig,
43
- saveGlobalConfig,
44
- getVerboseLabel
45
- } from "../utils/config.js";
46
- import { loadMessagesFromLog } from "../utils/conversationRecovery.js";
42
+ import { getGlobalConfig, saveGlobalConfig } from "../utils/config.js";
47
43
  import { useBackgroundShells } from "../hooks/useBackgroundShells.js";
48
44
  import { useDeferredLoading } from "../hooks/useDeferredLoading.js";
49
45
  import { useSessionTracking } from "../hooks/useSessionTracking.js";
50
- import { emitReminderEvent } from "../services/systemReminder.js";
51
- import {
52
- getNextAvailableLogForkNumber,
53
- loadLogList,
54
- CACHE_PATHS
55
- } from "../utils/log.js";
46
+ import { getNextAvailableLogForkNumber } from "../utils/log.js";
56
47
  import {
57
48
  getErroredToolUseMessages,
58
49
  getInProgressToolUseIDs,
@@ -64,22 +55,26 @@ import {
64
55
  normalizeMessages,
65
56
  normalizeMessagesForAPI,
66
57
  processUserInput,
67
- reorderMessages,
68
- createAssistantAPIErrorMessage
58
+ reorderMessages
69
59
  } from "../utils/messages.js";
70
60
  import { logError } from "../utils/log.js";
71
- import { ModelManager } from "../utils/model.js";
72
- import { clearTerminal } from "../utils/terminal.js";
61
+ import {
62
+ clearTerminal,
63
+ clearScreen
64
+ } from "../utils/terminal.js";
73
65
  import { BinaryFeedback } from "../components/binary-feedback/BinaryFeedback.js";
74
66
  import { getMaxThinkingTokens } from "../utils/thinking.js";
75
67
  import { getOriginalCwd } from "../utils/state.js";
68
+ import { animationManager } from "../utils/animationManager.js";
76
69
  import { handleHashCommand } from "../commands/terminalSetup.js";
77
- import { randomUUID } from "crypto";
78
70
  import { getMessagesPath } from "../utils/log.js";
79
- import {
80
- BackgroundShellManager
81
- } from "../utils/BackgroundShellManager.js";
71
+ import { BackgroundShellManager } from "../utils/BackgroundShellManager.js";
82
72
  import { BackgroundTasksPanel } from "../components/BackgroundTasksPanel.js";
73
+ import { TeamMemberPanel } from "../components/TeamMemberPanel.js";
74
+ import { AgentViewBanner } from "../components/AgentViewBanner.js";
75
+ import { TitledDivider } from "../components/TitledDivider.js";
76
+ import { t } from "../i18n/index.js";
77
+ import { IdleNotificationBar } from "../components/IdleNotificationBar.js";
83
78
  import { AskUserQuestionDialog } from "../components/AskUserQuestionDialog/AskUserQuestionDialog.js";
84
79
  import {
85
80
  getToolUseIdByAgentId,
@@ -90,13 +85,24 @@ import { useMessageGroups } from "../hooks/useMessageGroups.js";
90
85
  import { useAgentTranscripts } from "../hooks/useAgentTranscripts.js";
91
86
  import { GroupRenderer } from "../components/messages/GroupRenderer.js";
92
87
  import { SEMANTIC_COLORS } from "../constants/colors.js";
88
+ import { useIdleNotifications } from "../hooks/useIdleNotifications.js";
89
+ import { useTeamMembers } from "../hooks/useTeamMembers.js";
93
90
  import {
94
91
  recordFirstPrompt,
95
92
  incrementMessageCount,
96
- incrementToolCallCount,
97
93
  flushSessionStats
98
94
  } from "../utils/sessionTracker.js";
95
+ import {
96
+ getActiveTeams,
97
+ disbandTeam,
98
+ formatUserGuidanceForInjection,
99
+ teamEvents
100
+ } from "../services/agentTeams/index.js";
101
+ import { AgentEngine } from "../engine/AgentEngine.js";
102
+ import { EngineRegistry, setGlobalRegistry } from "../engine/EngineRegistry.js";
103
+ import { useAgentEngine } from "../hooks/useAgentEngine.js";
99
104
  const RESUME_VISIBLE_MESSAGE_COUNT = Infinity;
105
+ const TRANSCRIPT_VISIBLE_COUNT = 10;
100
106
  function REPL({
101
107
  commands,
102
108
  safeMode,
@@ -115,36 +121,83 @@ function REPL({
115
121
  initialUpdateCommands,
116
122
  fallbackMode = false,
117
123
  isResumedConversation = false,
118
- enableArchitect,
119
- autoResume = false
124
+ enableArchitect
120
125
  }) {
121
- const [verbose, setVerbose] = useState(
122
- verboseFromCLI === true ? true : false
126
+ const [screen, setScreen] = useState(
127
+ verboseFromCLI === true ? "transcript" : "prompt"
123
128
  );
129
+ const [showAllInTranscript, setShowAllInTranscript] = useState(false);
130
+ const verbose = screen === "transcript";
124
131
  const [forkNumber, setForkNumber] = useState(
125
132
  getNextAvailableLogForkNumber(messageLogName, initialForkNumber, 0)
126
133
  );
127
134
  const [isResizeClearing, setIsResizeClearing] = useState(false);
128
- const { exit: unmountREPL } = useApp();
129
- useFullscreenExitCallback(async () => {
135
+ const safeRefork = useCallback(async (beforeRefork) => {
130
136
  setIsResizeClearing(true);
131
137
  await new Promise((resolve) => setTimeout(resolve, 50));
132
138
  await clearTerminal();
139
+ beforeRefork?.();
133
140
  setForkNumber((prev) => prev + 1);
134
141
  setIsResizeClearing(false);
135
- });
142
+ }, []);
143
+ const { exit: unmountREPL } = useApp();
144
+ useFullscreenExitCallback(() => safeRefork());
145
+ useEffect(() => {
146
+ const unsubscribe = animationManager.onResume(() => safeRefork());
147
+ return unsubscribe;
148
+ }, [safeRefork]);
149
+ useEffect(() => {
150
+ const handler = () => safeRefork();
151
+ process.on("SIGCONT", handler);
152
+ return () => {
153
+ process.off("SIGCONT", handler);
154
+ };
155
+ }, [safeRefork]);
136
156
  const [
137
157
  forkConvoWithMessagesOnTheNextRender,
138
158
  setForkConvoWithMessagesOnTheNextRender
139
159
  ] = useState(null);
140
- const [abortController, setAbortController] = useState(null);
141
- const [isLoading, setIsLoading] = useState(false);
160
+ const defaultEngine = useMemo(() => {
161
+ const engine = new AgentEngine({
162
+ agentId: "default",
163
+ name: "default",
164
+ role: "default",
165
+ systemPrompt: () => getSystemPrompt(),
166
+ context: () => getContext(),
167
+ tools,
168
+ commands,
169
+ initialMessages: initialMessages ?? [],
170
+ verbose: verboseFromCLI === true,
171
+ safeMode,
172
+ safetyMode,
173
+ messageLogName,
174
+ forkNumber: getNextAvailableLogForkNumber(
175
+ messageLogName,
176
+ initialForkNumber,
177
+ 0
178
+ )
179
+ });
180
+ return engine;
181
+ }, []);
182
+ const registry = useMemo(() => {
183
+ const r = new EngineRegistry();
184
+ r.register("default", defaultEngine);
185
+ setGlobalRegistry(r);
186
+ return r;
187
+ }, [defaultEngine]);
188
+ const {
189
+ messages,
190
+ isLoading,
191
+ lastTurnDurationMs,
192
+ submitPrompt: engineSubmitPrompt,
193
+ abort: engineAbort,
194
+ setMessages: engineSetMessages,
195
+ appendMessages: engineAppendMessages
196
+ } = useAgentEngine(registry.focused ?? null);
142
197
  const [toolJSX, setToolJSX] = useState(null);
143
198
  const [toolUseConfirm, setToolUseConfirm] = useState(
144
199
  null
145
200
  );
146
- const [messages, setMessages] = useState(initialMessages ?? []);
147
- const messagesRef = useRef(initialMessages ?? []);
148
201
  const [messageHistory, setMessageHistory] = useState([]);
149
202
  const [inputValue, setInputValue] = useState("");
150
203
  const [inputMode, setInputMode] = useState(
@@ -152,6 +205,7 @@ function REPL({
152
205
  );
153
206
  const [submitCount, setSubmitCount] = useState(0);
154
207
  const [isMessageSelectorVisible, setIsMessageSelectorVisible] = useState(false);
208
+ const [isRewindPanelVisible, setIsRewindPanelVisible] = useState(false);
155
209
  const [showCostDialog, setShowCostDialog] = useState(false);
156
210
  const [haveShownCostDialog, setHaveShownCostDialog] = useState(
157
211
  getGlobalConfig().hasAcknowledgedCostThreshold
@@ -174,54 +228,51 @@ function REPL({
174
228
  enableArchitect
175
229
  });
176
230
  const [isTodoPanelVisible, setIsTodoPanelVisible] = useState(true);
177
- const [verboseToggleMessage, setVerboseToggleMessage] = useState(null);
178
- const turnStartTimeRef = useRef(null);
179
- const [lastTurnDurationMs, setLastTurnDurationMs] = useState(
180
- null
181
- );
182
- const [queuedPrompts, setQueuedPrompts] = useState([]);
183
- const queuedPromptsRef = useRef([]);
184
- useEffect(() => {
185
- queuedPromptsRef.current = queuedPrompts;
186
- }, [queuedPrompts]);
187
- useEffect(() => {
188
- if (isLoading) {
189
- turnStartTimeRef.current = Date.now();
190
- setLastTurnDurationMs(null);
191
- } else if (turnStartTimeRef.current !== null) {
192
- const duration = Date.now() - turnStartTimeRef.current;
193
- setLastTurnDurationMs(duration);
194
- turnStartTimeRef.current = null;
195
- }
196
- }, [isLoading]);
231
+ const [showThinkingSelector, setShowThinkingSelector] = useState(false);
197
232
  const {
198
233
  shells: backgroundShells,
199
234
  isPanelVisible: showBackgroundPanel,
200
235
  setIsPanelVisible: setShowBackgroundPanel,
201
236
  runningCount: backgroundShellRunningCount
202
237
  } = useBackgroundShells();
203
- const prevUnresolvedRef = useRef(/* @__PURE__ */ new Set());
204
- const messageBatchBufferRef = useRef(null);
205
- if (messageBatchBufferRef.current === null) {
206
- messageBatchBufferRef.current = new MessageBatchBuffer(
207
- (batchedMessages) => {
208
- setMessages((prev) => [...prev, ...batchedMessages]);
209
- },
210
- {
211
- flushInterval: 100,
212
- // Batch messages for 100ms
213
- maxBatchSize: 50,
214
- // Force flush if 50+ messages buffered
215
- debug: false
216
- // Set to true for debugging
238
+ const [showTeamPanel, setShowTeamPanel] = useState(false);
239
+ const [currentViewAgent, setCurrentViewAgent] = useState(null);
240
+ const { notifications: idleNotifications } = useIdleNotifications();
241
+ const { members: teamMembers, teamName, hasActiveTeam } = useTeamMembers();
242
+ useEffect(() => {
243
+ if (!hasActiveTeam) {
244
+ setShowTeamPanel(false);
245
+ setToolJSX(null);
246
+ setToolUseConfirm(null);
247
+ if (currentViewAgent) {
248
+ setIsResizeClearing(true);
249
+ clearScreen();
250
+ registry.setFocus("default");
251
+ setCurrentViewAgent(null);
252
+ setForkNumber((prev) => prev + 1);
253
+ setImmediate(() => setIsResizeClearing(false));
217
254
  }
218
- );
219
- }
255
+ defaultEngine.updateConfig({
256
+ systemPrompt: () => getSystemPrompt()
257
+ });
258
+ defaultEngine.demoteFromTeamLead();
259
+ }
260
+ }, [hasActiveTeam]);
220
261
  useEffect(() => {
221
- return () => {
222
- messageBatchBufferRef.current?.dispose();
223
- };
224
- }, []);
262
+ const unsub = registry.onChange(() => {
263
+ if (isSwitchingViewRef.current) return;
264
+ if (registry.focusedId === "default" && currentViewAgent) {
265
+ setIsResizeClearing(true);
266
+ clearScreen();
267
+ setCurrentViewAgent(null);
268
+ setForkNumber((prev) => prev + 1);
269
+ setImmediate(() => setIsResizeClearing(false));
270
+ }
271
+ });
272
+ return unsub;
273
+ }, [registry, currentViewAgent]);
274
+ const prevUnresolvedRef = useRef(/* @__PURE__ */ new Set());
275
+ const isSwitchingViewRef = useRef(false);
225
276
  const getBinaryFeedbackResponse = useCallback(
226
277
  (m1, m2) => {
227
278
  return new Promise((resolvePromise) => {
@@ -236,13 +287,15 @@ function REPL({
236
287
  );
237
288
  const readFileTimestamps = useRef({});
238
289
  const { status: apiKeyStatus, reverify } = useApiKeyVerification();
239
- function onInterrupt() {
290
+ const onInterrupt = useCallback(() => {
240
291
  if (!isLoading) {
241
292
  return;
242
293
  }
243
- const currentMessages = messagesRef.current;
244
- if (currentMessages.length > 0) {
245
- const serializedMessages = currentMessages.map(serializeMessageForLog);
294
+ const currentMessages = registry.focused?.messages;
295
+ if (currentMessages && currentMessages.length > 0) {
296
+ const serializedMessages = [...currentMessages].map(
297
+ serializeMessageForLog
298
+ );
246
299
  overwriteLog(
247
300
  getMessagesPath(messageLogName, forkNumber, 0),
248
301
  serializedMessages
@@ -251,23 +304,29 @@ function REPL({
251
304
  setToolJSX(null);
252
305
  setToolUseConfirm(null);
253
306
  setBinaryFeedbackContext(null);
254
- setIsLoading(false);
255
307
  if (toolUseConfirm) {
256
308
  toolUseConfirm.onAbort();
257
- } else if (abortController && !abortController.signal.aborted) {
258
- abortController.abort();
309
+ } else {
310
+ engineAbort();
259
311
  }
260
- }
261
- function onCancel() {
312
+ }, [
313
+ isLoading,
314
+ registry.focused?.messages,
315
+ messageLogName,
316
+ forkNumber,
317
+ toolUseConfirm,
318
+ engineAbort
319
+ ]);
320
+ const onCancel = useCallback(() => {
262
321
  onInterrupt();
263
- }
322
+ }, [onInterrupt]);
264
323
  useEffect(() => {
265
324
  if (forkConvoWithMessagesOnTheNextRender) {
266
325
  setForkNumber((_) => _ + 1);
267
326
  setForkConvoWithMessagesOnTheNextRender(null);
268
- setMessages(forkConvoWithMessagesOnTheNextRender);
327
+ engineSetMessages(forkConvoWithMessagesOnTheNextRender);
269
328
  }
270
- }, [forkConvoWithMessagesOnTheNextRender]);
329
+ }, [forkConvoWithMessagesOnTheNextRender, engineSetMessages]);
271
330
  useEffect(() => {
272
331
  const totalCost = getTotalCost();
273
332
  if (totalCost >= 5 && !showCostDialog && !haveShownCostDialog) {
@@ -281,17 +340,14 @@ function REPL({
281
340
  if (!initialPrompt) {
282
341
  return;
283
342
  }
284
- setIsLoading(true);
285
- const newAbortController = new AbortController();
286
- setAbortController(newAbortController);
287
343
  try {
288
- const model = new ModelManager(getGlobalConfig()).getModelName("main");
344
+ const tempAbortController = new AbortController();
289
345
  const newMessages = await processUserInput(
290
346
  initialPrompt,
291
347
  "prompt",
292
348
  setToolJSX,
293
349
  {
294
- abortController: newAbortController,
350
+ abortController: tempAbortController,
295
351
  options: {
296
352
  commands: currentCommands,
297
353
  forkNumber,
@@ -312,44 +368,7 @@ function REPL({
312
368
  addToHistory(initialPrompt);
313
369
  }
314
370
  }
315
- setMessages((_) => [..._, ...newMessages]);
316
- const lastMessage = newMessages[newMessages.length - 1];
317
- if (lastMessage.type === "assistant") {
318
- return;
319
- }
320
- const [systemPrompt, context, model2, maxThinkingTokens] = await Promise.all([
321
- getSystemPrompt(),
322
- getContext(),
323
- new ModelManager(getGlobalConfig()).getModelName("main"),
324
- getMaxThinkingTokens([...messages, ...newMessages])
325
- ]);
326
- for await (const message of query(
327
- [...messages, ...newMessages],
328
- systemPrompt,
329
- context,
330
- canUseTool,
331
- {
332
- options: {
333
- commands: currentCommands,
334
- forkNumber,
335
- messageLogName,
336
- tools: currentTools,
337
- verbose,
338
- safeMode,
339
- safetyMode,
340
- maxThinkingTokens
341
- },
342
- messageId: getLastAssistantMessageId([...messages, ...newMessages]),
343
- readFileTimestamps: readFileTimestamps.current,
344
- abortController: newAbortController,
345
- setToolJSX,
346
- askUser
347
- },
348
- getBinaryFeedbackResponse
349
- )) {
350
- messageBatchBufferRef.current?.add(message);
351
- }
352
- messageBatchBufferRef.current?.flush();
371
+ await onQuery(newMessages);
353
372
  } else {
354
373
  addToHistory(initialPrompt);
355
374
  }
@@ -358,103 +377,51 @@ function REPL({
358
377
  );
359
378
  } catch (error) {
360
379
  logError(error);
361
- setMessages((oldMessages) => [
362
- ...oldMessages,
363
- createAssistantAPIErrorMessage(
364
- `Request failed: ${error instanceof Error ? error.message : String(error)}`
365
- )
366
- ]);
367
- } finally {
368
- setIsLoading(false);
369
- setAbortController(null);
370
380
  }
371
381
  }
372
- function rollbackConversation() {
382
+ const rollbackConversation = useCallback(() => {
373
383
  if (messageHistory.length === 0) {
374
384
  return false;
375
385
  }
376
386
  const previousMessages = messageHistory[messageHistory.length - 1];
377
- setMessages(previousMessages);
387
+ if (!previousMessages) return false;
388
+ engineSetMessages(previousMessages);
378
389
  setMessageHistory((history) => history.slice(0, -1));
379
390
  return true;
380
- }
381
- const processNextQueuedPromptRef = useRef(null);
382
- async function onQuery(newMessages, passedAbortController) {
383
- const controllerToUse = passedAbortController || new AbortController();
384
- if (!passedAbortController) {
385
- setAbortController(controllerToUse);
386
- }
387
- setIsLoading(true);
388
- setVerbose(false);
389
- const isKodingRequest = newMessages.length > 0 && newMessages[0].type === "user" && "options" in newMessages[0] && newMessages[0].options?.isKodingRequest === true;
390
- setMessages((oldMessages) => {
391
- setMessageHistory((history) => [...history, oldMessages].slice(-10));
392
- return [...oldMessages, ...newMessages];
393
- });
391
+ }, [messageHistory, engineSetMessages]);
392
+ async function onQuery(newMessages, _passedAbortController) {
393
+ setScreen("prompt");
394
+ setShowAllInTranscript(false);
395
+ const firstMessage = newMessages[0];
396
+ const isKodingRequest = newMessages.length > 0 && firstMessage !== void 0 && firstMessage.type === "user" && "options" in firstMessage && firstMessage.options?.isKodingRequest === true;
397
+ setMessageHistory((history) => [...history, [...messages]].slice(-10));
394
398
  markProjectOnboardingComplete();
395
399
  const lastMessage = newMessages[newMessages.length - 1];
396
- if (lastMessage.type === "user" && typeof lastMessage.message.content === "string") {
400
+ if (lastMessage && lastMessage.type === "user" && typeof lastMessage.message.content === "string") {
397
401
  recordFirstPrompt(lastMessage.message.content);
398
402
  incrementMessageCount(1);
399
403
  }
400
- if (lastMessage.type === "user" && typeof lastMessage.message.content === "string") {
401
- }
402
- if (lastMessage.type === "assistant") {
403
- setAbortController(null);
404
- setIsLoading(false);
404
+ if (lastMessage && lastMessage.type === "assistant") {
405
+ engineAppendMessages(newMessages);
405
406
  return;
406
407
  }
407
- try {
408
- const [systemPrompt, context, model, maxThinkingTokens] = await Promise.all([
409
- getSystemPrompt(),
410
- getContext(),
411
- new ModelManager(getGlobalConfig()).getModelName("main"),
412
- getMaxThinkingTokens([...messages, lastMessage])
413
- ]);
414
- let lastAssistantMessage = null;
415
- for await (const message of query(
416
- [...messages, lastMessage],
417
- systemPrompt,
418
- context,
419
- canUseTool,
420
- {
421
- options: {
422
- commands: currentCommands,
423
- forkNumber,
424
- messageLogName,
425
- tools: currentTools,
426
- verbose,
427
- safeMode,
428
- safetyMode,
429
- maxThinkingTokens,
430
- // If this came from Koding mode, pass that along
431
- isKodingRequest: isKodingRequest || void 0
432
- },
433
- messageId: getLastAssistantMessageId([...messages, lastMessage]),
434
- readFileTimestamps: readFileTimestamps.current,
435
- abortController: controllerToUse,
436
- setToolJSX,
437
- askUser
438
- },
439
- getBinaryFeedbackResponse
440
- )) {
441
- messageBatchBufferRef.current?.add(message);
442
- if (message.type === "assistant") {
443
- lastAssistantMessage = message;
444
- incrementMessageCount(1);
445
- if (Array.isArray(message.message.content)) {
446
- const toolUseCount = message.message.content.filter(
447
- (block) => typeof block === "object" && block.type === "tool_use"
448
- ).length;
449
- if (toolUseCount > 0) {
450
- incrementToolCallCount(toolUseCount);
451
- }
452
- }
453
- }
454
- }
455
- if (isKodingRequest && lastAssistantMessage && lastAssistantMessage.type === "assistant") {
408
+ const maxThinkingTokens = await getMaxThinkingTokens([
409
+ ...messages,
410
+ ...newMessages
411
+ ]);
412
+ const targetEngine = registry.focused ?? defaultEngine;
413
+ targetEngine.updateConfig({ maxThinkingTokens });
414
+ if (isKodingRequest) {
415
+ targetEngine.updateConfig({ isKodingRequest: true });
416
+ }
417
+ await engineSubmitPrompt(newMessages);
418
+ flushSessionStats();
419
+ if (isKodingRequest) {
420
+ const engineMsgs = registry.focused?.messages ?? [];
421
+ const lastAssistantMsg = [...engineMsgs].reverse().find((m) => m.type === "assistant");
422
+ if (lastAssistantMsg && lastAssistantMsg.type === "assistant") {
456
423
  try {
457
- const content = typeof lastAssistantMessage.message.content === "string" ? lastAssistantMessage.message.content : lastAssistantMessage.message.content.filter((block) => block.type === "text").map((block) => block.type === "text" ? block.text : "").join("\n");
424
+ const content = typeof lastAssistantMsg.message.content === "string" ? lastAssistantMsg.message.content : lastAssistantMsg.message.content.filter((block) => block.type === "text").map((block) => block.type === "text" ? block.text : "").join("\n");
458
425
  if (content && content.trim().length > 0) {
459
426
  handleHashCommand(content);
460
427
  }
@@ -462,35 +429,15 @@ function REPL({
462
429
  console.error("Error saving response to project docs:", error);
463
430
  }
464
431
  }
465
- messageBatchBufferRef.current?.flush();
466
- } catch (error) {
467
- logError(error);
468
- messageBatchBufferRef.current?.flush();
469
- setMessages((oldMessages) => [
470
- ...oldMessages,
471
- createAssistantAPIErrorMessage(
472
- `Request failed: ${error instanceof Error ? error.message : String(error)}`
473
- )
474
- ]);
475
- } finally {
476
- setIsLoading(false);
477
- setAbortController(null);
478
- flushSessionStats();
479
- if (queuedPromptsRef.current.length > 0) {
480
- setTimeout(() => {
481
- if (processNextQueuedPromptRef.current) {
482
- processNextQueuedPromptRef.current();
483
- }
484
- }, 100);
485
- }
432
+ targetEngine.updateConfig({ isKodingRequest: void 0 });
486
433
  }
487
434
  }
488
435
  useCostSummary();
489
436
  useEffect(() => {
490
437
  const getMessages = () => messages;
491
438
  setMessagesGetter(getMessages);
492
- setMessagesSetter(setMessages);
493
- }, [messages]);
439
+ setMessagesSetter(engineSetMessages);
440
+ }, [messages, engineSetMessages]);
494
441
  useEffect(() => {
495
442
  const todoSessionId = `${messageLogName}-${forkNumber}`;
496
443
  initTodoSession(todoSessionId);
@@ -499,51 +446,27 @@ function REPL({
499
446
  }
500
447
  }, [messageLogName, forkNumber, initialMessages]);
501
448
  useEffect(() => {
502
- setModelConfigChangeHandler(() => {
503
- setForkNumber((prev) => prev + 1);
504
- });
505
- }, []);
506
- useEffect(() => {
507
- setLanguageChangeHandler(async () => {
508
- setIsResizeClearing(true);
509
- await new Promise((resolve) => setTimeout(resolve, 50));
510
- await clearTerminal();
511
- setForkNumber((prev) => prev + 1);
512
- setIsResizeClearing(false);
513
- });
514
- }, []);
449
+ setModelConfigChangeHandler(() => safeRefork());
450
+ }, [safeRefork]);
515
451
  useEffect(() => {
516
- messagesRef.current = messages;
517
- }, [messages]);
452
+ setLanguageChangeHandler(() => safeRefork());
453
+ }, [safeRefork]);
518
454
  useLogMessages(messages, messageLogName, forkNumber);
519
455
  useLogStartupTime();
520
- useEffect(() => {
521
- if (!autoResume) return;
522
- loadLogList(CACHE_PATHS.messages()).then(async (logs) => {
523
- for (const log of logs) {
524
- try {
525
- const loaded = await loadMessagesFromLog(log.fullPath, tools);
526
- if (loaded && loaded.length > 0) {
527
- setMessages(loaded);
528
- emitReminderEvent("session:continuation", {
529
- messageCount: loaded.length
530
- });
531
- break;
532
- }
533
- } catch {
534
- continue;
535
- }
536
- }
537
- }).catch(() => {
538
- });
539
- }, []);
540
456
  useEffect(() => {
541
457
  onInit();
542
458
  }, []);
543
459
  useSessionTracking(messageLogName, forkNumber);
460
+ const activeMessages = useMemo(() => {
461
+ const engine = registry.focused;
462
+ if (engine && engine !== defaultEngine && engine.ownMessagesStartIndex > 0) {
463
+ return messages.slice(engine.ownMessagesStartIndex);
464
+ }
465
+ return messages;
466
+ }, [messages, currentViewAgent, registry, defaultEngine]);
544
467
  const normalizedMessages = useMemo(
545
- () => normalizeMessages(messages).filter(isNotEmptyMessage),
546
- [messages]
468
+ () => normalizeMessages(activeMessages).filter(isNotEmptyMessage),
469
+ [activeMessages]
547
470
  );
548
471
  const unresolvedToolUseIDs = useMemo(
549
472
  () => getUnresolvedToolUseIDs(normalizedMessages),
@@ -592,26 +515,68 @@ function REPL({
592
515
  }, [normalizedMessages]);
593
516
  const messagesJSX = useMemo(() => {
594
517
  const reorderedMessages = reorderMessages(normalizedMessages);
595
- const hiddenMessageCount = isResumedConversation && reorderedMessages.length > RESUME_VISIBLE_MESSAGE_COUNT ? reorderedMessages.length - RESUME_VISIBLE_MESSAGE_COUNT : 0;
596
- const visibleMessages = hiddenMessageCount > 0 ? reorderedMessages.slice(-RESUME_VISIBLE_MESSAGE_COUNT) : reorderedMessages;
597
- const result = [
598
- {
518
+ const isTranscript = screen === "transcript";
519
+ const shouldTruncateTranscript = isTranscript && !showAllInTranscript;
520
+ const totalMessageCount = reorderedMessages.length;
521
+ const transcriptTruncatedCount = shouldTruncateTranscript && totalMessageCount > TRANSCRIPT_VISIBLE_COUNT ? totalMessageCount - TRANSCRIPT_VISIBLE_COUNT : 0;
522
+ const resumeHiddenCount = !isTranscript && isResumedConversation && reorderedMessages.length > RESUME_VISIBLE_MESSAGE_COUNT ? reorderedMessages.length - RESUME_VISIBLE_MESSAGE_COUNT : 0;
523
+ const visibleMessages = transcriptTruncatedCount > 0 ? reorderedMessages.slice(-TRANSCRIPT_VISIBLE_COUNT) : resumeHiddenCount > 0 ? reorderedMessages.slice(-RESUME_VISIBLE_MESSAGE_COUNT) : reorderedMessages;
524
+ const result = [];
525
+ result.push({
526
+ type: "static",
527
+ jsx: /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%", key: "logo" }, /* @__PURE__ */ React.createElement(
528
+ Logo,
529
+ {
530
+ mcpClients: currentMcpClients,
531
+ isDefaultModel,
532
+ updateBannerVersion: updateAvailableVersion,
533
+ updateBannerCommands: updateCommands
534
+ }
535
+ ), /* @__PURE__ */ React.createElement(ProjectOnboarding, { workspaceDir: getOriginalCwd() }), currentViewAgent && (() => {
536
+ const focusedEngine = registry.get(registry.focusedId);
537
+ const engineName = focusedEngine?.engineConfig?.name ?? "unknown";
538
+ const engineState = focusedEngine?.state ?? "pending";
539
+ return /* @__PURE__ */ React.createElement(
540
+ AgentViewBanner,
541
+ {
542
+ displayName: currentViewAgent.includes("@") ? currentViewAgent.split("@")[0] : currentViewAgent,
543
+ agentType: engineName,
544
+ status: engineState
545
+ }
546
+ );
547
+ })())
548
+ });
549
+ if (transcriptTruncatedCount > 0) {
550
+ result.push({
599
551
  type: "static",
600
- jsx: /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%", key: "logo" }, /* @__PURE__ */ React.createElement(
601
- Logo,
552
+ jsx: /* @__PURE__ */ React.createElement(Box, { key: `transcript-truncation-${forkNumber}`, width: "100%" }, /* @__PURE__ */ React.createElement(
553
+ TitledDivider,
602
554
  {
603
- mcpClients: currentMcpClients,
604
- isDefaultModel,
605
- updateBannerVersion: updateAvailableVersion,
606
- updateBannerCommands: updateCommands
555
+ title: t("ui.transcript.showPrevious").replace(
556
+ "{count}",
557
+ String(transcriptTruncatedCount)
558
+ )
607
559
  }
608
- ), /* @__PURE__ */ React.createElement(ProjectOnboarding, { workspaceDir: getOriginalCwd() }))
609
- }
610
- ];
611
- if (hiddenMessageCount > 0) {
560
+ ))
561
+ });
562
+ } else if (isTranscript && showAllInTranscript && totalMessageCount > TRANSCRIPT_VISIBLE_COUNT) {
612
563
  result.push({
613
564
  type: "static",
614
- jsx: /* @__PURE__ */ React.createElement(Box, { key: "collapsed-history", paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\xB7\xB7\xB7 ", hiddenMessageCount, " earlier messages hidden \xB7\xB7\xB7"))
565
+ jsx: /* @__PURE__ */ React.createElement(Box, { key: `transcript-hide-${forkNumber}`, width: "100%" }, /* @__PURE__ */ React.createElement(
566
+ TitledDivider,
567
+ {
568
+ title: t("ui.transcript.hidePrevious").replace(
569
+ "{count}",
570
+ String(totalMessageCount - TRANSCRIPT_VISIBLE_COUNT)
571
+ )
572
+ }
573
+ ))
574
+ });
575
+ }
576
+ if (resumeHiddenCount > 0) {
577
+ result.push({
578
+ type: "static",
579
+ jsx: /* @__PURE__ */ React.createElement(Box, { key: "collapsed-history", paddingLeft: 2, marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\xB7\xB7\xB7 ", resumeHiddenCount, " earlier messages hidden \xB7\xB7\xB7"))
615
580
  });
616
581
  }
617
582
  const renderedGroupIds = /* @__PURE__ */ new Set();
@@ -641,7 +606,7 @@ function REPL({
641
606
  }
642
607
  const isGroupStatic = shouldGroupBeStatic(group);
643
608
  const groupType = isGroupStatic ? "static" : "transient";
644
- const shouldAnimate = !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isGroupStatic;
609
+ const shouldAnimate = !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isRewindPanelVisible && !isGroupStatic;
645
610
  result.push({
646
611
  type: groupType,
647
612
  jsx: /* @__PURE__ */ React.createElement(Box, { key: `group-${group.id}`, width: "100%" }, /* @__PURE__ */ React.createElement(
@@ -695,6 +660,9 @@ function REPL({
695
660
  if (_.type === "progress" && !unresolvedToolUseIDs.has(_.toolUseID)) {
696
661
  continue;
697
662
  }
663
+ if (!isNotEmptyMessage(_)) {
664
+ continue;
665
+ }
698
666
  const message = _.type === "progress" ? (
699
667
  // Check if this is a streaming progress content (e.g., from BashTool)
700
668
  "type" in _.content && _.content.type === "streaming" ? /* @__PURE__ */ React.createElement(
@@ -755,7 +723,7 @@ function REPL({
755
723
  debug,
756
724
  erroredToolUseIDs,
757
725
  inProgressToolUseIDs,
758
- shouldAnimate: !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && (!toolUseID || inProgressToolUseIDs.has(toolUseID)),
726
+ shouldAnimate: !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isRewindPanelVisible && (!toolUseID || inProgressToolUseIDs.has(toolUseID)),
759
727
  shouldShowDot: true,
760
728
  unresolvedToolUseIDs
761
729
  }
@@ -798,10 +766,14 @@ function REPL({
798
766
  toolJSX,
799
767
  toolUseConfirm,
800
768
  isMessageSelectorVisible,
769
+ isRewindPanelVisible,
801
770
  unresolvedToolUseIDs,
802
771
  currentMcpClients,
803
772
  isDefaultModel,
804
773
  isResumedConversation,
774
+ // Transcript mode dependencies
775
+ screen,
776
+ showAllInTranscript,
805
777
  // V1+ dependencies
806
778
  messageGroups,
807
779
  getGroupForMessage,
@@ -809,7 +781,9 @@ function REPL({
809
781
  shouldGroupBeStatic,
810
782
  displayConfig,
811
783
  agentTranscripts,
812
- toolOutputs
784
+ toolOutputs,
785
+ // Agent view dependencies
786
+ currentViewAgent
813
787
  ]);
814
788
  const showingCostDialog = !isLoading && showCostDialog;
815
789
  const { staticItems, dynamicItems } = useMemo(() => {
@@ -825,79 +799,198 @@ function REPL({
825
799
  }
826
800
  return { staticItems: staticItems2, dynamicItems: dynamicItems2 };
827
801
  }, [messagesJSX]);
802
+ const noopSetBool = useCallback((_) => {
803
+ }, []);
804
+ const noopSetAbort = useCallback((_) => {
805
+ }, []);
828
806
  const handleShowMessageSelector = useCallback(() => {
829
807
  setIsMessageSelectorVisible((prev) => !prev);
830
808
  }, []);
809
+ const handleShowRewindPanel = useCallback(() => {
810
+ if (messages.length === 0) return;
811
+ setIsRewindPanelVisible(true);
812
+ }, [messages.length]);
813
+ const handleRewindAction = useCallback(
814
+ (action, point) => {
815
+ setIsRewindPanelVisible(false);
816
+ if (action === "never_mind") return;
817
+ if (action === "restore_code_and_conversation" || action === "restore_conversation") {
818
+ onCancel();
819
+ setImmediate(async () => {
820
+ await clearTerminal();
821
+ const truncatedMessages = messages.slice(0, point.messageIndex);
822
+ engineSetMessages([]);
823
+ setForkConvoWithMessagesOnTheNextRender(truncatedMessages);
824
+ if (point.userText) {
825
+ setInputValue(point.userText);
826
+ }
827
+ });
828
+ return;
829
+ }
830
+ if (action === "restore_code") {
831
+ return;
832
+ }
833
+ if (action === "summarize_from_here") {
834
+ onCancel();
835
+ setImmediate(async () => {
836
+ await clearTerminal();
837
+ const preserved = messages.slice(0, point.messageIndex);
838
+ engineSetMessages([]);
839
+ setForkConvoWithMessagesOnTheNextRender(preserved);
840
+ if (point.userText) {
841
+ setInputValue(point.userText);
842
+ }
843
+ });
844
+ }
845
+ },
846
+ [
847
+ messages,
848
+ onCancel,
849
+ engineSetMessages,
850
+ setForkConvoWithMessagesOnTheNextRender
851
+ ]
852
+ );
831
853
  const handleToggleTodoPanel = useCallback(() => {
832
854
  setIsTodoPanelVisible((prev) => !prev);
833
855
  }, []);
856
+ const handleToggleThinkingSelector = useCallback(() => {
857
+ setShowThinkingSelector((prev) => !prev);
858
+ }, []);
834
859
  const handleToggleBackgroundPanel = useCallback(() => {
835
860
  setShowBackgroundPanel((prev) => !prev);
836
861
  }, []);
837
- const handleModelChange = useCallback(async () => {
838
- setIsResizeClearing(true);
839
- await new Promise((resolve) => setTimeout(resolve, 50));
840
- await clearTerminal();
841
- setForkNumber((prev) => prev + 1);
842
- setIsResizeClearing(false);
862
+ const handleToggleTeamPanel = useCallback(() => {
863
+ setShowTeamPanel((prev) => !prev);
843
864
  }, []);
844
- const handleToggleVerbose = useCallback(async (newVerbose) => {
845
- const message = `${getVerboseLabel(newVerbose)} (Ctrl+O)`;
846
- setVerboseToggleMessage(message);
847
- setTimeout(() => setVerboseToggleMessage(null), 2e3);
848
- setIsResizeClearing(true);
849
- await new Promise((resolve) => setTimeout(resolve, 50));
850
- await clearTerminal();
851
- setVerbose(newVerbose);
852
- setForkNumber((prev) => prev + 1);
853
- setIsResizeClearing(false);
865
+ const handleKillAllAgents = useCallback(() => {
866
+ const teams = getActiveTeams();
867
+ for (const team of teams) {
868
+ disbandTeam(team.name);
869
+ }
854
870
  }, []);
855
- const handleQueueAwareQuery = useCallback(
856
- async (newMessages, abortController2) => {
857
- if (!isLoading) {
858
- return onQuery(newMessages, abortController2);
871
+ const handleSwitchView = useCallback(
872
+ async (agentId) => {
873
+ isSwitchingViewRef.current = true;
874
+ setShowTeamPanel(false);
875
+ const isTeamLead = agentId === null || agentId.startsWith("team-lead") || agentId === "team-lead";
876
+ const oldFocused = registry.focused;
877
+ if (oldFocused && oldFocused !== defaultEngine) {
878
+ oldFocused.setIdlePaused(false);
859
879
  }
860
- const userMessage = newMessages.find((m) => m.type === "user");
861
- if (userMessage && userMessage.type === "user") {
862
- const promptText = typeof userMessage.message.content === "string" ? userMessage.message.content : "";
863
- if (promptText) {
864
- setQueuedPrompts((prev) => [...prev, promptText]);
880
+ await safeRefork(() => {
881
+ setCurrentViewAgent(isTeamLead ? null : agentId);
882
+ const targetId = isTeamLead ? "default" : agentId;
883
+ if (registry.get(targetId)) {
884
+ registry.setFocus(targetId);
885
+ const newFocused = registry.get(targetId);
886
+ if (newFocused && newFocused !== defaultEngine) {
887
+ newFocused.setIdlePaused(true);
888
+ }
889
+ } else {
890
+ registry.setFocus("default");
865
891
  }
892
+ });
893
+ isSwitchingViewRef.current = false;
894
+ },
895
+ [registry, defaultEngine]
896
+ );
897
+ const handleBackFromAgent = useCallback(async () => {
898
+ await handleSwitchView(null);
899
+ }, [handleSwitchView]);
900
+ const handleCycleTeammate = useCallback(
901
+ (direction) => {
902
+ const activeMembers = teamMembers.filter((m) => m.status !== "stopped");
903
+ if (activeMembers.length === 0) return;
904
+ const memberIds = [
905
+ null,
906
+ ...activeMembers.map((m) => m.name)
907
+ ];
908
+ const currentIdx = currentViewAgent === null ? 0 : memberIds.findIndex(
909
+ (id) => id !== null && (currentViewAgent.includes(id) || id.includes(currentViewAgent?.split("@")[0] || ""))
910
+ );
911
+ let nextIdx;
912
+ if (direction === "next") {
913
+ nextIdx = currentIdx < 0 ? 0 : (currentIdx + 1) % memberIds.length;
914
+ } else {
915
+ nextIdx = currentIdx < 0 ? memberIds.length - 1 : (currentIdx - 1 + memberIds.length) % memberIds.length;
866
916
  }
917
+ const nextId = memberIds[nextIdx];
918
+ if (nextId) handleSwitchView(nextId);
867
919
  },
868
- [isLoading]
920
+ [teamMembers, currentViewAgent, handleSwitchView]
869
921
  );
922
+ const handleToggleAgentView = useCallback(() => {
923
+ if (currentViewAgent) {
924
+ handleBackFromAgent();
925
+ } else {
926
+ const activeMembers = teamMembers.filter((m) => m.status !== "stopped");
927
+ const firstActive = activeMembers[0];
928
+ if (firstActive) {
929
+ handleSwitchView(firstActive.name);
930
+ }
931
+ }
932
+ }, [currentViewAgent, teamMembers, handleBackFromAgent, handleSwitchView]);
933
+ const handleModelChange = useCallback(() => safeRefork(), [safeRefork]);
934
+ const handleToggleScreen = useCallback(async () => {
935
+ setShowAllInTranscript(false);
936
+ await safeRefork(
937
+ () => setScreen((prev) => prev === "transcript" ? "prompt" : "transcript")
938
+ );
939
+ }, [safeRefork]);
940
+ const handleToggleShowAll = useCallback(async () => {
941
+ await safeRefork(() => setShowAllInTranscript((prev) => !prev));
942
+ }, [safeRefork]);
870
943
  useEffect(() => {
871
- processNextQueuedPromptRef.current = async () => {
872
- if (queuedPrompts.length === 0) return;
873
- const nextPrompt = queuedPrompts[0];
874
- setQueuedPrompts((prev) => prev.slice(1));
875
- if (!nextPrompt) return;
876
- const userMessage = {
877
- type: "user",
878
- uuid: randomUUID(),
879
- message: {
880
- role: "user",
881
- content: nextPrompt
944
+ const unsubscribe = teamEvents.onTeamChange(
945
+ (data) => {
946
+ if (data.event === "created") {
947
+ defaultEngine.promoteToTeamLead(data.teamName);
948
+ defaultEngine.updateConfig({
949
+ systemPrompt: () => getSystemPrompt("team-lead")
950
+ });
951
+ } else if (data.event === "disbanded") {
952
+ defaultEngine.updateConfig({
953
+ systemPrompt: () => getSystemPrompt()
954
+ });
882
955
  }
883
- };
884
- setIsLoading(true);
885
- const newAbortController = new AbortController();
886
- setAbortController(newAbortController);
887
- await onQuery([userMessage], newAbortController);
956
+ }
957
+ );
958
+ return unsubscribe;
959
+ }, [defaultEngine]);
960
+ useEffect(() => {
961
+ const engine = registry.focused;
962
+ if (!engine) return;
963
+ engine.setCanUseTool(canUseTool);
964
+ engine.setAskUser(askUser);
965
+ engine.setToolJSX(setToolJSX);
966
+ engine.setBinaryFeedbackResponse(getBinaryFeedbackResponse);
967
+ }, [registry.focusedId, canUseTool, askUser, getBinaryFeedbackResponse]);
968
+ useEffect(() => {
969
+ defaultEngine.start();
970
+ return () => {
971
+ defaultEngine.stop();
888
972
  };
889
- }, [queuedPrompts]);
973
+ }, [defaultEngine]);
974
+ useEffect(() => {
975
+ defaultEngine.updateConfig({
976
+ tools: currentTools,
977
+ commands: currentCommands
978
+ });
979
+ }, [currentTools, currentCommands, defaultEngine]);
980
+ useEffect(() => {
981
+ defaultEngine.updateConfig({ verbose, safeMode, safetyMode });
982
+ }, [verbose, safeMode, safetyMode, defaultEngine]);
890
983
  return /* @__PURE__ */ React.createElement(
891
984
  PermissionProvider,
892
985
  {
893
986
  isBypassPermissionsModeAvailable: !safeMode,
894
- children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, { key: `static-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
987
+ children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, { key: `static-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
895
988
  Static,
896
989
  {
897
990
  items: staticItems,
898
991
  children: (item) => /* @__PURE__ */ React.createElement(React.Fragment, { key: item.id }, item.jsx)
899
992
  }
900
- )), /* @__PURE__ */ React.createElement(React.Fragment, { key: `dynamic-messages-${forkNumber}` }, dynamicItems.map((item) => item.jsx)), /* @__PURE__ */ React.createElement(
993
+ )), /* @__PURE__ */ React.createElement(React.Fragment, { key: `dynamic-messages-${forkNumber}` }, dynamicItems.map((item) => item.jsx)), isLoading && !isResizeClearing && /* @__PURE__ */ React.createElement(StreamingTextPreview, null), /* @__PURE__ */ React.createElement(
901
994
  Box,
902
995
  {
903
996
  key: `transient-ui-${forkNumber}`,
@@ -912,10 +1005,11 @@ function REPL({
912
1005
  todos: getTodos(),
913
1006
  isVisible: isTodoPanelVisible,
914
1007
  isLoading,
915
- showTodoList: isTodoPanelVisible
1008
+ showTodoList: isTodoPanelVisible,
1009
+ focusedAgentId: currentViewAgent
916
1010
  }
917
1011
  ),
918
- !isResizeClearing && !isLoading && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && queuedPrompts.length === 0 && /* @__PURE__ */ React.createElement(
1012
+ !isResizeClearing && !isLoading && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && !defaultEngine.injectionChannel.hasMessages() && /* @__PURE__ */ React.createElement(
919
1013
  TurnCompletionIndicator,
920
1014
  {
921
1015
  durationMs: lastTurnDurationMs,
@@ -923,7 +1017,7 @@ function REPL({
923
1017
  }
924
1018
  ),
925
1019
  toolJSX?.shouldHidePromptInput ? toolJSX.jsx : null,
926
- !toolJSX && binaryFeedbackContext && !isMessageSelectorVisible && /* @__PURE__ */ React.createElement(
1020
+ !toolJSX && binaryFeedbackContext && !isMessageSelectorVisible && !isRewindPanelVisible && /* @__PURE__ */ React.createElement(
927
1021
  BinaryFeedback,
928
1022
  {
929
1023
  m1: binaryFeedbackContext.m1,
@@ -941,7 +1035,7 @@ function REPL({
941
1035
  unresolvedToolUseIDs
942
1036
  }
943
1037
  ),
944
- !toolJSX && toolUseConfirm && !isMessageSelectorVisible && !binaryFeedbackContext && !askUserQuestionContext && /* @__PURE__ */ React.createElement(
1038
+ !toolJSX && toolUseConfirm && !isMessageSelectorVisible && !isRewindPanelVisible && !binaryFeedbackContext && !askUserQuestionContext && /* @__PURE__ */ React.createElement(
945
1039
  PermissionRequest,
946
1040
  {
947
1041
  toolUseConfirm,
@@ -949,14 +1043,14 @@ function REPL({
949
1043
  verbose
950
1044
  }
951
1045
  ),
952
- !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !binaryFeedbackContext && askUserQuestionContext && /* @__PURE__ */ React.createElement(
1046
+ !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isRewindPanelVisible && !binaryFeedbackContext && askUserQuestionContext && /* @__PURE__ */ React.createElement(
953
1047
  AskUserQuestionDialog,
954
1048
  {
955
1049
  context: askUserQuestionContext,
956
1050
  onDone: () => setAskUserQuestionContext(null)
957
1051
  }
958
1052
  ),
959
- !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !binaryFeedbackContext && !askUserQuestionContext && showingCostDialog && /* @__PURE__ */ React.createElement(
1053
+ !toolJSX && !toolUseConfirm && !isMessageSelectorVisible && !isRewindPanelVisible && !binaryFeedbackContext && !askUserQuestionContext && showingCostDialog && /* @__PURE__ */ React.createElement(
960
1054
  CostThresholdDialog,
961
1055
  {
962
1056
  onDone: () => {
@@ -970,7 +1064,7 @@ function REPL({
970
1064
  }
971
1065
  }
972
1066
  ),
973
- !toolUseConfirm && !toolJSX?.shouldHidePromptInput && shouldShowPromptInput && !isMessageSelectorVisible && !binaryFeedbackContext && !askUserQuestionContext && !showingCostDialog && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
1067
+ !toolUseConfirm && !toolJSX?.shouldHidePromptInput && shouldShowPromptInput && !isMessageSelectorVisible && !isRewindPanelVisible && !showThinkingSelector && !binaryFeedbackContext && !askUserQuestionContext && !showingCostDialog && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
974
1068
  BackgroundTasksPanel,
975
1069
  {
976
1070
  shells: backgroundShells,
@@ -983,11 +1077,12 @@ function REPL({
983
1077
  },
984
1078
  onClose: () => setShowBackgroundPanel(false)
985
1079
  }
986
- ), /* @__PURE__ */ React.createElement(
1080
+ ), !isResizeClearing && /* @__PURE__ */ React.createElement(IdleNotificationBar, { notifications: idleNotifications }), /* @__PURE__ */ React.createElement(
987
1081
  PromptInput,
988
1082
  {
989
1083
  commands: currentCommands,
990
1084
  forkNumber,
1085
+ focusedAgentName: currentViewAgent ? teamMembers.find((m) => m.id === currentViewAgent)?.name ?? currentViewAgent.split("@")[0] : hasActiveTeam ? "team-lead" : null,
991
1086
  messageLogName,
992
1087
  tools: currentTools,
993
1088
  isDisabled: apiKeyStatus === "invalid",
@@ -995,7 +1090,6 @@ function REPL({
995
1090
  onQuery,
996
1091
  debug,
997
1092
  verbose,
998
- verboseToggleMessage,
999
1093
  messages,
1000
1094
  setToolJSX,
1001
1095
  input: inputValue,
@@ -1004,34 +1098,71 @@ function REPL({
1004
1098
  onModeChange: setInputMode,
1005
1099
  submitCount,
1006
1100
  onSubmitCountChange: setSubmitCount,
1007
- setIsLoading,
1008
- setAbortController,
1101
+ setIsLoading: noopSetBool,
1102
+ setAbortController: noopSetAbort,
1009
1103
  onShowMessageSelector: handleShowMessageSelector,
1010
1104
  setForkConvoWithMessagesOnTheNextRender,
1011
1105
  readFileTimestamps: readFileTimestamps.current,
1012
- abortController,
1106
+ abortController: null,
1013
1107
  onModelChange: handleModelChange,
1014
- onRollbackConversation: rollbackConversation,
1108
+ onShowRewindPanel: handleShowRewindPanel,
1015
1109
  onToggleTodoPanel: handleToggleTodoPanel,
1016
- onToggleVerbose: handleToggleVerbose,
1110
+ onToggleThinkingSelector: handleToggleThinkingSelector,
1111
+ onToggleScreen: handleToggleScreen,
1112
+ onToggleShowAllInTranscript: handleToggleShowAll,
1113
+ screen,
1017
1114
  onToggleBackgroundPanel: handleToggleBackgroundPanel,
1115
+ onToggleTeamPanel: handleToggleTeamPanel,
1116
+ onCycleTeammate: handleCycleTeammate,
1117
+ onToggleAgentView: handleToggleAgentView,
1118
+ onKillAllAgents: handleKillAllAgents,
1018
1119
  backgroundShellCount: backgroundShells.filter((s) => s.status === "running").length,
1019
1120
  isBackgroundPanelOpen: showBackgroundPanel,
1020
1121
  fallbackMode,
1021
- queuedPrompts,
1022
- onQueuePrompt: (prompt) => setQueuedPrompts((prev) => [...prev, prompt]),
1023
- onPopQueuedPrompt: () => {
1024
- if (queuedPrompts.length === 0) return void 0;
1025
- const lastPrompt = queuedPrompts[queuedPrompts.length - 1];
1026
- setQueuedPrompts((prev) => prev.slice(0, -1));
1027
- return lastPrompt;
1122
+ onInjectMessage: (input) => {
1123
+ const formatted = formatUserGuidanceForInjection(input);
1124
+ const focusedEng = registry.focused ?? defaultEngine;
1125
+ focusedEng.injectionChannel.push(
1126
+ formatted,
1127
+ "user",
1128
+ input
1129
+ );
1028
1130
  },
1131
+ onRemoveQueuedMessage: () => {
1132
+ const focusedEng = registry.focused ?? defaultEngine;
1133
+ return focusedEng.injectionChannel.removeLastUserMessage();
1134
+ },
1135
+ injectionPending: (registry.focused ?? defaultEngine).injectionChannel.size > 0,
1136
+ getQueuedUserMessages: () => (registry.focused ?? defaultEngine).injectionChannel.peekUserDisplayTexts(),
1029
1137
  onInterrupt,
1030
- isOverlayActive: !!(toolJSX && !toolJSX.shouldHidePromptInput),
1138
+ isOverlayActive: showTeamPanel || !!(toolJSX && !toolJSX.shouldHidePromptInput),
1031
1139
  unmount: unmountREPL,
1032
- startupItems
1140
+ startupItems,
1141
+ teamMembers,
1142
+ hasActiveTeam
1143
+ }
1144
+ ), toolJSX && !toolJSX.shouldHidePromptInput && toolJSX.jsx, /* @__PURE__ */ React.createElement(
1145
+ TeamMemberPanel,
1146
+ {
1147
+ isVisible: showTeamPanel,
1148
+ onClose: () => setShowTeamPanel(false),
1149
+ onFocusAgent: handleSwitchView
1033
1150
  }
1034
- ), toolJSX && !toolJSX.shouldHidePromptInput && toolJSX.jsx)
1151
+ ), screen === "transcript" && /* @__PURE__ */ React.createElement(
1152
+ Box,
1153
+ {
1154
+ width: "100%",
1155
+ paddingLeft: 2,
1156
+ marginTop: 1,
1157
+ borderStyle: "single",
1158
+ borderTop: true,
1159
+ borderBottom: false,
1160
+ borderLeft: false,
1161
+ borderRight: false,
1162
+ borderColor: SEMANTIC_COLORS.dim
1163
+ },
1164
+ /* @__PURE__ */ React.createElement(Text, { dimColor: true }, t("ui.transcript.showing"))
1165
+ ))
1035
1166
  ), isMessageSelectorVisible && /* @__PURE__ */ React.createElement(React.Fragment, { key: `message-selector-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
1036
1167
  MessageSelector,
1037
1168
  {
@@ -1046,7 +1177,7 @@ function REPL({
1046
1177
  onCancel();
1047
1178
  setImmediate(async () => {
1048
1179
  await clearTerminal();
1049
- setMessages([]);
1180
+ engineSetMessages([]);
1050
1181
  setForkConvoWithMessagesOnTheNextRender(
1051
1182
  messages.slice(0, messages.indexOf(message))
1052
1183
  );
@@ -1058,7 +1189,19 @@ function REPL({
1058
1189
  onEscape: () => setIsMessageSelectorVisible(false),
1059
1190
  tools: currentTools
1060
1191
  }
1061
- )), /* @__PURE__ */ React.createElement(Newline, null))
1192
+ )), isRewindPanelVisible && /* @__PURE__ */ React.createElement(
1193
+ RewindPanel,
1194
+ {
1195
+ messages,
1196
+ onAction: handleRewindAction,
1197
+ onEscape: () => setIsRewindPanelVisible(false)
1198
+ }
1199
+ ), showThinkingSelector && /* @__PURE__ */ React.createElement(
1200
+ ThinkingSelector,
1201
+ {
1202
+ onClose: () => setShowThinkingSelector(false)
1203
+ }
1204
+ ), /* @__PURE__ */ React.createElement(Newline, null)))
1062
1205
  }
1063
1206
  );
1064
1207
  }