dexto 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +25 -15
  2. package/dist/agents/agent-registry.json +9 -0
  3. package/dist/agents/coding-agent/coding-agent.yml +5 -0
  4. package/dist/agents/default-agent.yml +2 -2
  5. package/dist/api/server-hono.d.ts.map +1 -1
  6. package/dist/api/server-hono.js +39 -5
  7. package/dist/cli/cli-subscriber.d.ts.map +1 -1
  8. package/dist/cli/cli-subscriber.js +7 -1
  9. package/dist/cli/commands/helpers/formatters.d.ts.map +1 -1
  10. package/dist/cli/commands/helpers/formatters.js +2 -1
  11. package/dist/cli/commands/install.d.ts.map +1 -1
  12. package/dist/cli/commands/install.js +14 -40
  13. package/dist/cli/commands/interactive-commands/command-parser.d.ts +17 -14
  14. package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
  15. package/dist/cli/commands/interactive-commands/command-parser.js +0 -15
  16. package/dist/cli/commands/interactive-commands/commands.d.ts +4 -4
  17. package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
  18. package/dist/cli/commands/interactive-commands/commands.js +34 -42
  19. package/dist/cli/commands/interactive-commands/documentation-commands.d.ts.map +1 -1
  20. package/dist/cli/commands/interactive-commands/documentation-commands.js +4 -7
  21. package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +1 -1
  22. package/dist/cli/commands/interactive-commands/general-commands.js +159 -117
  23. package/dist/cli/commands/interactive-commands/mcp/index.d.ts +9 -3
  24. package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +1 -1
  25. package/dist/cli/commands/interactive-commands/mcp/index.js +18 -3
  26. package/dist/cli/commands/interactive-commands/model/index.d.ts +8 -6
  27. package/dist/cli/commands/interactive-commands/model/index.d.ts.map +1 -1
  28. package/dist/cli/commands/interactive-commands/model/index.js +18 -6
  29. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +3 -2
  30. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
  31. package/dist/cli/commands/interactive-commands/prompt-commands.js +69 -52
  32. package/dist/cli/commands/interactive-commands/session/index.d.ts +7 -12
  33. package/dist/cli/commands/interactive-commands/session/index.d.ts.map +1 -1
  34. package/dist/cli/commands/interactive-commands/session/index.js +7 -14
  35. package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +10 -24
  36. package/dist/cli/commands/interactive-commands/session/session-commands.d.ts.map +1 -1
  37. package/dist/cli/commands/interactive-commands/session/session-commands.js +16 -371
  38. package/dist/cli/commands/interactive-commands/system/system-commands.d.ts +1 -0
  39. package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
  40. package/dist/cli/commands/interactive-commands/system/system-commands.js +103 -74
  41. package/dist/cli/commands/interactive-commands/tool-commands.d.ts +1 -1
  42. package/dist/cli/commands/interactive-commands/tool-commands.d.ts.map +1 -1
  43. package/dist/cli/commands/interactive-commands/tool-commands.js +5 -62
  44. package/dist/cli/commands/interactive-commands/utils/command-output.d.ts +13 -17
  45. package/dist/cli/commands/interactive-commands/utils/command-output.d.ts.map +1 -1
  46. package/dist/cli/commands/interactive-commands/utils/command-output.js +18 -37
  47. package/dist/cli/commands/list-agents.d.ts +2 -2
  48. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  49. package/dist/cli/commands/list-agents.js +36 -32
  50. package/dist/cli/commands/uninstall.d.ts.map +1 -1
  51. package/dist/cli/commands/uninstall.js +4 -6
  52. package/dist/cli/commands/which.d.ts.map +1 -1
  53. package/dist/cli/commands/which.js +17 -3
  54. package/dist/cli/ink-cli/InkCLIRefactored.d.ts +9 -22
  55. package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
  56. package/dist/cli/ink-cli/InkCLIRefactored.js +50 -133
  57. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +24 -3
  58. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
  59. package/dist/cli/ink-cli/components/ApprovalPrompt.js +160 -45
  60. package/dist/cli/ink-cli/components/ElicitationForm.d.ts +22 -0
  61. package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +1 -0
  62. package/dist/cli/ink-cli/components/ElicitationForm.js +358 -0
  63. package/dist/cli/ink-cli/components/Footer.d.ts +16 -0
  64. package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -0
  65. package/dist/cli/ink-cli/components/Footer.js +27 -0
  66. package/dist/cli/ink-cli/components/HistorySearchBar.d.ts +17 -0
  67. package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +1 -0
  68. package/dist/cli/ink-cli/components/HistorySearchBar.js +8 -0
  69. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts +15 -2
  70. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
  71. package/dist/cli/ink-cli/components/ResourceAutocomplete.js +126 -82
  72. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts +15 -2
  73. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +1 -1
  74. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +228 -122
  75. package/dist/cli/ink-cli/components/StatusBar.d.ts +15 -2
  76. package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
  77. package/dist/cli/ink-cli/components/StatusBar.js +46 -8
  78. package/dist/cli/ink-cli/components/TextBufferInput.d.ts +52 -0
  79. package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -0
  80. package/dist/cli/ink-cli/components/TextBufferInput.js +471 -0
  81. package/dist/cli/ink-cli/components/base/BaseSelector.d.ts +11 -1
  82. package/dist/cli/ink-cli/components/base/BaseSelector.d.ts.map +1 -1
  83. package/dist/cli/ink-cli/components/base/BaseSelector.js +90 -49
  84. package/dist/cli/ink-cli/components/chat/Header.d.ts +1 -0
  85. package/dist/cli/ink-cli/components/chat/Header.d.ts.map +1 -1
  86. package/dist/cli/ink-cli/components/chat/Header.js +7 -2
  87. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts +3 -0
  88. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
  89. package/dist/cli/ink-cli/components/chat/MessageItem.js +95 -9
  90. package/dist/cli/ink-cli/components/chat/MessageList.js +1 -1
  91. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts +16 -0
  92. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts.map +1 -0
  93. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +27 -0
  94. package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +4 -2
  95. package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts.map +1 -1
  96. package/dist/cli/ink-cli/components/chat/ToolIcon.js +19 -5
  97. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts +10 -0
  98. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts.map +1 -0
  99. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +6 -0
  100. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts +10 -0
  101. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts.map +1 -0
  102. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +15 -0
  103. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts +10 -0
  104. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -0
  105. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +9 -0
  106. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts +10 -0
  107. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +1 -0
  108. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +37 -0
  109. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts +10 -0
  110. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts.map +1 -0
  111. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +9 -0
  112. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts +10 -0
  113. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts.map +1 -0
  114. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +6 -0
  115. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts +10 -0
  116. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts.map +1 -0
  117. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +29 -0
  118. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts +45 -0
  119. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts.map +1 -0
  120. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +38 -0
  121. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts +10 -0
  122. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts.map +1 -0
  123. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.js +6 -0
  124. package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts +13 -0
  125. package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts.map +1 -0
  126. package/dist/cli/ink-cli/components/chat/styled-boxes/index.js +12 -0
  127. package/dist/cli/ink-cli/components/input/InputArea.d.ts +36 -8
  128. package/dist/cli/ink-cli/components/input/InputArea.d.ts.map +1 -1
  129. package/dist/cli/ink-cli/components/input/InputArea.js +3 -3
  130. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +25 -0
  131. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -0
  132. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +166 -0
  133. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +27 -0
  134. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -0
  135. package/dist/cli/ink-cli/components/modes/StaticCLI.js +95 -0
  136. package/dist/cli/ink-cli/components/modes/index.d.ts +10 -0
  137. package/dist/cli/ink-cli/components/modes/index.d.ts.map +1 -0
  138. package/dist/cli/ink-cli/components/modes/index.js +9 -0
  139. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts +26 -0
  140. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts.map +1 -0
  141. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +92 -0
  142. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +21 -0
  143. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -0
  144. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +177 -0
  145. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +22 -0
  146. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -0
  147. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +59 -0
  148. package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts +22 -0
  149. package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +1 -0
  150. package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +59 -0
  151. package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts +26 -0
  152. package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts.map +1 -0
  153. package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +73 -0
  154. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts +21 -0
  155. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +1 -0
  156. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +51 -0
  157. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts +29 -0
  158. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts.map +1 -0
  159. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +215 -0
  160. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts +22 -0
  161. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -0
  162. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +74 -0
  163. package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts +21 -0
  164. package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +1 -0
  165. package/dist/cli/ink-cli/components/overlays/McpSelector.js +52 -0
  166. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +28 -0
  167. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -0
  168. package/dist/cli/ink-cli/components/overlays/McpServerActions.js +84 -0
  169. package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts +29 -0
  170. package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -0
  171. package/dist/cli/ink-cli/components/overlays/McpServerList.js +109 -0
  172. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +15 -8
  173. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  174. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +247 -24
  175. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts +22 -0
  176. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +1 -0
  177. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +52 -0
  178. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts +29 -0
  179. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts.map +1 -0
  180. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +166 -0
  181. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts +27 -0
  182. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +1 -0
  183. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +119 -0
  184. package/dist/cli/ink-cli/components/overlays/PromptList.d.ts +33 -0
  185. package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -0
  186. package/dist/cli/ink-cli/components/overlays/PromptList.js +144 -0
  187. package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts +23 -0
  188. package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +1 -0
  189. package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +189 -0
  190. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts +7 -2
  191. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
  192. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.js +19 -5
  193. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts +21 -0
  194. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +1 -0
  195. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +42 -0
  196. package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts +20 -0
  197. package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +1 -0
  198. package/dist/cli/ink-cli/components/overlays/StreamSelector.js +58 -0
  199. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +25 -0
  200. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -0
  201. package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +400 -0
  202. package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts +21 -0
  203. package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts.map +1 -0
  204. package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +65 -0
  205. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +28 -0
  206. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +1 -0
  207. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +66 -0
  208. package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts +19 -0
  209. package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts.map +1 -0
  210. package/dist/cli/ink-cli/components/renderers/FileRenderer.js +26 -0
  211. package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts +21 -0
  212. package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts.map +1 -0
  213. package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +26 -0
  214. package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts +20 -0
  215. package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts.map +1 -0
  216. package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +12 -0
  217. package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts +21 -0
  218. package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts.map +1 -0
  219. package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +25 -0
  220. package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts +61 -0
  221. package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts.map +1 -0
  222. package/dist/cli/ink-cli/components/renderers/diff-shared.js +158 -0
  223. package/dist/cli/ink-cli/components/renderers/index.d.ts +28 -0
  224. package/dist/cli/ink-cli/components/renderers/index.d.ts.map +1 -0
  225. package/dist/cli/ink-cli/components/renderers/index.js +36 -0
  226. package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts +38 -0
  227. package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -0
  228. package/dist/cli/ink-cli/components/shared/MarkdownText.js +360 -0
  229. package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts +44 -0
  230. package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts.map +1 -0
  231. package/dist/cli/ink-cli/components/shared/VirtualizedList.js +300 -0
  232. package/dist/cli/ink-cli/components/shared/text-buffer.d.ts +185 -0
  233. package/dist/cli/ink-cli/components/shared/text-buffer.d.ts.map +1 -0
  234. package/dist/cli/ink-cli/components/shared/text-buffer.js +1338 -0
  235. package/dist/cli/ink-cli/constants/processingPhrases.d.ts +10 -0
  236. package/dist/cli/ink-cli/constants/processingPhrases.d.ts.map +1 -0
  237. package/dist/cli/ink-cli/constants/processingPhrases.js +64 -0
  238. package/dist/cli/ink-cli/constants/tips.d.ts +15 -0
  239. package/dist/cli/ink-cli/constants/tips.d.ts.map +1 -0
  240. package/dist/cli/ink-cli/constants/tips.js +53 -0
  241. package/dist/cli/ink-cli/containers/InputContainer.d.ts +42 -8
  242. package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
  243. package/dist/cli/ink-cli/containers/InputContainer.js +491 -85
  244. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +23 -5
  245. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
  246. package/dist/cli/ink-cli/containers/OverlayContainer.js +1156 -130
  247. package/dist/cli/ink-cli/containers/index.d.ts +1 -1
  248. package/dist/cli/ink-cli/containers/index.d.ts.map +1 -1
  249. package/dist/cli/ink-cli/contexts/KeypressContext.d.ts +36 -0
  250. package/dist/cli/ink-cli/contexts/KeypressContext.d.ts.map +1 -0
  251. package/dist/cli/ink-cli/contexts/KeypressContext.js +461 -0
  252. package/dist/cli/ink-cli/contexts/MouseContext.d.ts +27 -0
  253. package/dist/cli/ink-cli/contexts/MouseContext.d.ts.map +1 -0
  254. package/dist/cli/ink-cli/contexts/MouseContext.js +102 -0
  255. package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts +33 -0
  256. package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts.map +1 -0
  257. package/dist/cli/ink-cli/contexts/ScrollProvider.js +170 -0
  258. package/dist/cli/ink-cli/contexts/index.d.ts +7 -0
  259. package/dist/cli/ink-cli/contexts/index.d.ts.map +1 -0
  260. package/dist/cli/ink-cli/contexts/index.js +6 -0
  261. package/dist/cli/ink-cli/hooks/index.d.ts +5 -0
  262. package/dist/cli/ink-cli/hooks/index.d.ts.map +1 -1
  263. package/dist/cli/ink-cli/hooks/index.js +6 -1
  264. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +26 -9
  265. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
  266. package/dist/cli/ink-cli/hooks/useAgentEvents.js +86 -198
  267. package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts +14 -0
  268. package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts.map +1 -0
  269. package/dist/cli/ink-cli/hooks/useBatchedScroll.js +25 -0
  270. package/dist/cli/ink-cli/hooks/useCLIState.d.ts +50 -0
  271. package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -0
  272. package/dist/cli/ink-cli/hooks/useCLIState.js +188 -0
  273. package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts +24 -0
  274. package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts.map +1 -0
  275. package/dist/cli/ink-cli/hooks/useElapsedTime.js +69 -0
  276. package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts +61 -0
  277. package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts.map +1 -0
  278. package/dist/cli/ink-cli/hooks/useHistorySearch.js +210 -0
  279. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts +136 -0
  280. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -0
  281. package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +663 -0
  282. package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  283. package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.js +7 -26
  284. package/dist/cli/ink-cli/hooks/useKeypress.d.ts +18 -0
  285. package/dist/cli/ink-cli/hooks/useKeypress.d.ts.map +1 -0
  286. package/dist/cli/ink-cli/hooks/useKeypress.js +26 -0
  287. package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts +30 -0
  288. package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts.map +1 -0
  289. package/dist/cli/ink-cli/hooks/usePhraseCycler.js +68 -0
  290. package/dist/cli/ink-cli/hooks/useStreaming.d.ts +19 -0
  291. package/dist/cli/ink-cli/hooks/useStreaming.d.ts.map +1 -0
  292. package/dist/cli/ink-cli/hooks/useStreaming.js +26 -0
  293. package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts +14 -0
  294. package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts.map +1 -0
  295. package/dist/cli/ink-cli/hooks/useTerminalSize.js +31 -0
  296. package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts +42 -0
  297. package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -0
  298. package/dist/cli/ink-cli/hooks/useTokenCounter.js +96 -0
  299. package/dist/cli/ink-cli/services/CommandService.d.ts +32 -1
  300. package/dist/cli/ink-cli/services/CommandService.d.ts.map +1 -1
  301. package/dist/cli/ink-cli/services/CommandService.js +36 -5
  302. package/dist/cli/ink-cli/services/InputService.d.ts +1 -5
  303. package/dist/cli/ink-cli/services/InputService.d.ts.map +1 -1
  304. package/dist/cli/ink-cli/services/InputService.js +1 -8
  305. package/dist/cli/ink-cli/services/index.d.ts +2 -1
  306. package/dist/cli/ink-cli/services/index.d.ts.map +1 -1
  307. package/dist/cli/ink-cli/services/index.js +2 -1
  308. package/dist/cli/ink-cli/services/processStream.d.ts +69 -0
  309. package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -0
  310. package/dist/cli/ink-cli/services/processStream.js +674 -0
  311. package/dist/cli/ink-cli/state/actions.d.ts +30 -60
  312. package/dist/cli/ink-cli/state/actions.d.ts.map +1 -1
  313. package/dist/cli/ink-cli/state/actions.js +3 -0
  314. package/dist/cli/ink-cli/state/index.d.ts +5 -3
  315. package/dist/cli/ink-cli/state/index.d.ts.map +1 -1
  316. package/dist/cli/ink-cli/state/index.js +4 -3
  317. package/dist/cli/ink-cli/state/initialState.d.ts +4 -3
  318. package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
  319. package/dist/cli/ink-cli/state/initialState.js +20 -4
  320. package/dist/cli/ink-cli/state/reducer.d.ts +3 -0
  321. package/dist/cli/ink-cli/state/reducer.d.ts.map +1 -1
  322. package/dist/cli/ink-cli/state/reducer.js +62 -168
  323. package/dist/cli/ink-cli/state/streaming-state.d.ts +27 -0
  324. package/dist/cli/ink-cli/state/streaming-state.d.ts.map +1 -0
  325. package/dist/cli/ink-cli/state/streaming-state.js +39 -0
  326. package/dist/cli/ink-cli/state/types.d.ts +222 -6
  327. package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
  328. package/dist/cli/ink-cli/utils/bracketedPaste.d.ts +22 -0
  329. package/dist/cli/ink-cli/utils/bracketedPaste.d.ts.map +1 -0
  330. package/dist/cli/ink-cli/utils/bracketedPaste.js +27 -0
  331. package/dist/cli/ink-cli/utils/clipboardUtils.d.ts +49 -0
  332. package/dist/cli/ink-cli/utils/clipboardUtils.d.ts.map +1 -0
  333. package/dist/cli/ink-cli/utils/clipboardUtils.js +356 -0
  334. package/dist/cli/ink-cli/utils/commandOverlays.d.ts +33 -0
  335. package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +1 -0
  336. package/dist/cli/ink-cli/utils/commandOverlays.js +78 -0
  337. package/dist/cli/ink-cli/utils/debugLog.d.ts +38 -0
  338. package/dist/cli/ink-cli/utils/debugLog.d.ts.map +1 -0
  339. package/dist/cli/ink-cli/utils/debugLog.js +66 -0
  340. package/dist/cli/ink-cli/utils/index.d.ts +2 -1
  341. package/dist/cli/ink-cli/utils/index.d.ts.map +1 -1
  342. package/dist/cli/ink-cli/utils/index.js +3 -1
  343. package/dist/cli/ink-cli/utils/input.d.ts +25 -0
  344. package/dist/cli/ink-cli/utils/input.d.ts.map +1 -0
  345. package/dist/cli/ink-cli/utils/input.js +56 -0
  346. package/dist/cli/ink-cli/utils/inputParsing.d.ts +0 -9
  347. package/dist/cli/ink-cli/utils/inputParsing.d.ts.map +1 -1
  348. package/dist/cli/ink-cli/utils/inputParsing.js +0 -27
  349. package/dist/cli/ink-cli/utils/messageFormatting.d.ts +54 -3
  350. package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
  351. package/dist/cli/ink-cli/utils/messageFormatting.js +290 -20
  352. package/dist/cli/ink-cli/utils/mouse.d.ts +61 -0
  353. package/dist/cli/ink-cli/utils/mouse.d.ts.map +1 -0
  354. package/dist/cli/ink-cli/utils/mouse.js +209 -0
  355. package/dist/cli/ink-cli/utils/streamSplitter.d.ts +44 -0
  356. package/dist/cli/ink-cli/utils/streamSplitter.d.ts.map +1 -0
  357. package/dist/cli/ink-cli/utils/streamSplitter.js +154 -0
  358. package/dist/cli/ink-cli/utils/textUtils.d.ts +63 -0
  359. package/dist/cli/ink-cli/utils/textUtils.d.ts.map +1 -0
  360. package/dist/cli/ink-cli/utils/textUtils.js +248 -0
  361. package/dist/cli/ink-cli/utils/toolUtils.d.ts +9 -0
  362. package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -0
  363. package/dist/cli/ink-cli/utils/toolUtils.js +13 -0
  364. package/dist/cli/utils/options.d.ts.map +1 -1
  365. package/dist/cli/utils/options.js +0 -2
  366. package/dist/config/cli-overrides.d.ts +1 -1
  367. package/dist/config/cli-overrides.d.ts.map +1 -1
  368. package/dist/config/cli-overrides.js +5 -10
  369. package/dist/index.js +66 -48
  370. package/dist/utils/agent-helpers.d.ts +95 -0
  371. package/dist/utils/agent-helpers.d.ts.map +1 -0
  372. package/dist/utils/agent-helpers.js +117 -0
  373. package/dist/webui/assets/index-BkwPkZpd.css +1 -0
  374. package/dist/webui/assets/index-D9u1XfyH.js +2025 -0
  375. package/dist/webui/assets/{tanstack-DgxBONJY.js → tanstack-Br79RQ-n.js} +1 -1
  376. package/dist/webui/index.html +3 -3
  377. package/package.json +16 -14
  378. package/dist/cli/commands/interactive-commands/index.d.ts +0 -63
  379. package/dist/cli/commands/interactive-commands/index.d.ts.map +0 -1
  380. package/dist/cli/commands/interactive-commands/index.js +0 -73
  381. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts +0 -34
  382. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts.map +0 -1
  383. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.js +0 -178
  384. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts +0 -9
  385. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts.map +0 -1
  386. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.js +0 -325
  387. package/dist/cli/commands/interactive-commands/model/model-commands.d.ts +0 -21
  388. package/dist/cli/commands/interactive-commands/model/model-commands.d.ts.map +0 -1
  389. package/dist/cli/commands/interactive-commands/model/model-commands.js +0 -190
  390. package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts +0 -26
  391. package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts.map +0 -1
  392. package/dist/cli/ink-cli/components/MultiLineTextInput.js +0 -220
  393. package/dist/discord/bot.d.ts +0 -4
  394. package/dist/discord/bot.d.ts.map +0 -1
  395. package/dist/discord/bot.js +0 -193
  396. package/dist/telegram/bot.d.ts +0 -5
  397. package/dist/telegram/bot.d.ts.map +0 -1
  398. package/dist/telegram/bot.js +0 -251
  399. package/dist/webui/assets/index-DKq5Xng1.js +0 -687
  400. package/dist/webui/assets/index-D_0_GBu5.css +0 -1
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect, useRef, useMemo, useCallback } from 'react';
3
- import { Box, Text, useInput } from 'ink';
2
+ import React, { useState, useEffect, useRef, useMemo, useCallback, forwardRef, useImperativeHandle, } from 'react';
3
+ import { Box, Text, useStdout } from 'ink';
4
4
  import { getAllCommands } from '../../commands/interactive-commands/commands.js';
5
5
  /**
6
6
  * Get match score for prompt: 0 = no match, 1 = description/title match, 2 = name includes, 3 = name starts with
@@ -74,22 +74,46 @@ function getSystemCommandMatchScore(cmd, query) {
74
74
  function matchesSystemCommandQuery(cmd, query) {
75
75
  return getSystemCommandMatchScore(cmd, query) > 0;
76
76
  }
77
- export default function SlashCommandAutocomplete({ isVisible, searchQuery, onSelectPrompt, onSelectSystemCommand, onLoadIntoInput, onClose, onCreatePrompt, agent, }) {
77
+ /**
78
+ * Truncate text to fit within maxLength, adding ellipsis if truncated
79
+ */
80
+ function truncateText(text, maxLength) {
81
+ if (text.length <= maxLength)
82
+ return text;
83
+ if (maxLength <= 3)
84
+ return text.slice(0, maxLength);
85
+ return text.slice(0, maxLength - 1) + '…';
86
+ }
87
+ /**
88
+ * Inner component - wrapped with React.memo below
89
+ */
90
+ const SlashCommandAutocompleteInner = forwardRef(function SlashCommandAutocomplete({ isVisible, searchQuery, onSelectPrompt, onSelectSystemCommand, onLoadIntoInput, onSubmitRaw, onClose, agent, }, ref) {
78
91
  const [prompts, setPrompts] = useState([]);
79
92
  const [systemCommands, setSystemCommands] = useState([]);
80
93
  const [isLoading, setIsLoading] = useState(false);
81
- const [selectedIndex, setSelectedIndex] = useState(0);
82
- const [scrollOffset, setScrollOffset] = useState(0);
94
+ // Combined state to guarantee single render on navigation
95
+ const [selection, setSelection] = useState({ index: 0, offset: 0 });
83
96
  const selectedIndexRef = useRef(0);
84
- const MAX_VISIBLE_ITEMS = 10; // Increased to show more items
85
- // Wrapper to set both state and ref synchronously to prevent race conditions
86
- const setSelectedIndexSync = useCallback((newIndex) => {
87
- setSelectedIndex((prev) => {
88
- const resolved = typeof newIndex === 'function' ? newIndex(prev) : newIndex;
89
- selectedIndexRef.current = resolved;
90
- return resolved;
97
+ const { stdout } = useStdout();
98
+ const terminalWidth = stdout?.columns || 80;
99
+ const MAX_VISIBLE_ITEMS = 8;
100
+ // Update selection AND scroll offset in a single state update
101
+ // This guarantees exactly one render per navigation action
102
+ const updateSelection = useCallback((indexUpdater) => {
103
+ setSelection((prev) => {
104
+ const newIndex = typeof indexUpdater === 'function' ? indexUpdater(prev.index) : indexUpdater;
105
+ selectedIndexRef.current = newIndex;
106
+ // Calculate new scroll offset
107
+ let newOffset = prev.offset;
108
+ if (newIndex < prev.offset) {
109
+ newOffset = newIndex;
110
+ }
111
+ else if (newIndex >= prev.offset + MAX_VISIBLE_ITEMS) {
112
+ newOffset = Math.max(0, newIndex - MAX_VISIBLE_ITEMS + 1);
113
+ }
114
+ return { index: newIndex, offset: newOffset };
91
115
  });
92
- }, []);
116
+ }, [MAX_VISIBLE_ITEMS]);
93
117
  // Fetch prompts and system commands from agent
94
118
  useEffect(() => {
95
119
  if (!isVisible)
@@ -119,9 +143,9 @@ export default function SlashCommandAutocomplete({ isVisible, searchQuery, onSel
119
143
  setIsLoading(false);
120
144
  }
121
145
  }
122
- catch (error) {
146
+ catch {
123
147
  if (!cancelled) {
124
- console.error(`Error in fetchCommands: ${error instanceof Error ? error.message : String(error)}`);
148
+ // Silently fail - don't use console.error as it interferes with Ink rendering
125
149
  setPrompts([]);
126
150
  setSystemCommands([]);
127
151
  setIsLoading(false);
@@ -169,150 +193,232 @@ export default function SlashCommandAutocomplete({ isVisible, searchQuery, onSel
169
193
  return scoreB - scoreA; // Higher score first
170
194
  });
171
195
  }, [systemCommands, commandQuery]);
172
- // Check if user has started typing arguments (hide autocomplete if so)
196
+ // Check if user has started typing arguments (hide autocomplete)
173
197
  const hasArguments = useMemo(() => {
174
198
  if (!searchQuery.startsWith('/'))
175
199
  return false;
176
200
  const afterSlash = searchQuery.slice(1).trim();
177
201
  return afterSlash.includes(' ');
178
202
  }, [searchQuery]);
179
- // Show create option only if query doesn't match any commands and is a valid prompt name
180
- const showCreateOption = useMemo(() => {
181
- if (!commandQuery)
182
- return false; // Don't show create when just "/"
183
- if (hasArguments)
184
- return false; // Don't show create when typing arguments
185
- // Only show create if no matches and query looks like a prompt name (no spaces, valid chars)
186
- return (filteredPrompts.length === 0 &&
187
- filteredSystemCommands.length === 0 &&
188
- commandQuery.length > 0);
189
- }, [commandQuery, hasArguments, filteredPrompts.length, filteredSystemCommands.length]);
190
- // Combine items: system commands first, then prompts, then create option
191
- // Hide autocomplete if user has started typing arguments
203
+ // Combine items: system commands first, then prompts
204
+ // When typing arguments, show only exact matches (for argument hints)
192
205
  const combinedItems = useMemo(() => {
206
+ const items = [];
193
207
  if (hasArguments) {
194
- return []; // Hide autocomplete when typing arguments
208
+ // When typing arguments, only show exact match for the command
209
+ const exactSystemCmd = systemCommands.find((cmd) => cmd.name.toLowerCase() === commandQuery.toLowerCase());
210
+ if (exactSystemCmd) {
211
+ items.push({ kind: 'system', command: exactSystemCmd });
212
+ }
213
+ const exactPrompt = prompts.find((p) => p.name.toLowerCase() === commandQuery.toLowerCase() ||
214
+ (p.displayName && p.displayName.toLowerCase() === commandQuery.toLowerCase()));
215
+ if (exactPrompt) {
216
+ items.push({ kind: 'prompt', prompt: exactPrompt });
217
+ }
218
+ return items;
195
219
  }
196
- const items = [];
197
220
  // System commands first (they're more commonly used)
198
221
  filteredSystemCommands.forEach((cmd) => items.push({ kind: 'system', command: cmd }));
199
222
  // Then prompts
200
223
  filteredPrompts.forEach((prompt) => items.push({ kind: 'prompt', prompt }));
201
- // Create option last
202
- if (showCreateOption) {
203
- items.push({ kind: 'create' });
204
- }
205
224
  return items;
206
- }, [hasArguments, showCreateOption, filteredPrompts, filteredSystemCommands]);
207
- // Reset selected index and scroll when items change
208
- useEffect(() => {
209
- setSelectedIndexSync(0);
210
- setScrollOffset(0);
211
- }, [combinedItems.length, setSelectedIndexSync]);
212
- // Auto-scroll to keep selected item visible
225
+ }, [
226
+ hasArguments,
227
+ filteredPrompts,
228
+ filteredSystemCommands,
229
+ systemCommands,
230
+ prompts,
231
+ commandQuery,
232
+ ]);
233
+ // Get stable identity for first item (used to detect content changes)
234
+ const getFirstItemId = () => {
235
+ const first = combinedItems[0];
236
+ if (!first)
237
+ return null;
238
+ if (first.kind === 'system')
239
+ return `sys:${first.command.name}`;
240
+ return `prompt:${first.prompt.name}`;
241
+ };
242
+ // Track items for reset detection (length + first item identity)
243
+ const currentFirstId = getFirstItemId();
244
+ const prevItemsRef = useRef({ length: combinedItems.length, firstId: currentFirstId });
245
+ const itemsChanged = combinedItems.length !== prevItemsRef.current.length ||
246
+ currentFirstId !== prevItemsRef.current.firstId;
247
+ // Derive clamped selection values during render (always valid, no setState needed)
248
+ // This prevents the double-render that was causing flickering
249
+ const selectedIndex = itemsChanged
250
+ ? 0
251
+ : Math.min(selection.index, Math.max(0, combinedItems.length - 1));
252
+ const scrollOffset = itemsChanged
253
+ ? 0
254
+ : Math.min(selection.offset, Math.max(0, combinedItems.length - MAX_VISIBLE_ITEMS));
255
+ // Sync state only when items actually changed AND state differs
256
+ // This effect runs AFTER render, updating state for next user interaction
213
257
  useEffect(() => {
214
- if (selectedIndex < scrollOffset) {
215
- // Selected item is above visible area, scroll up
216
- setScrollOffset(selectedIndex);
217
- }
218
- else if (selectedIndex >= scrollOffset + MAX_VISIBLE_ITEMS) {
219
- // Selected item is below visible area, scroll down
220
- setScrollOffset(Math.max(0, selectedIndex - MAX_VISIBLE_ITEMS + 1));
258
+ if (itemsChanged) {
259
+ prevItemsRef.current = { length: combinedItems.length, firstId: currentFirstId };
260
+ // Only setState if values actually differ (prevents unnecessary re-render)
261
+ if (selection.index !== 0 || selection.offset !== 0) {
262
+ selectedIndexRef.current = 0;
263
+ setSelection({ index: 0, offset: 0 });
264
+ }
265
+ else {
266
+ selectedIndexRef.current = 0;
267
+ }
221
268
  }
222
- }, [selectedIndex, scrollOffset]);
269
+ }, [itemsChanged, combinedItems.length, currentFirstId, selection.index, selection.offset]);
223
270
  // Calculate visible items based on scroll offset
224
271
  const visibleItems = useMemo(() => {
225
272
  return combinedItems.slice(scrollOffset, scrollOffset + MAX_VISIBLE_ITEMS);
226
- }, [combinedItems, scrollOffset]);
227
- // Handle keyboard navigation
228
- useInput((input, key) => {
229
- if (!isVisible)
230
- return;
231
- const itemsLength = combinedItems.length;
232
- if (itemsLength === 0)
233
- return;
234
- if (key.upArrow) {
235
- setSelectedIndexSync((prev) => (prev - 1 + itemsLength) % itemsLength);
236
- }
237
- if (key.downArrow) {
238
- setSelectedIndexSync((prev) => (prev + 1) % itemsLength);
239
- }
240
- if (key.escape) {
241
- onClose();
242
- }
243
- // Tab: Load command into input (for editing before execution)
244
- if (key.tab && itemsLength > 0) {
245
- const item = combinedItems[selectedIndexRef.current];
246
- if (!item)
247
- return;
248
- if (item.kind === 'create') {
249
- // For create, load the command name into input
250
- onLoadIntoInput?.(`/${commandQuery || 'name'}`);
273
+ }, [combinedItems, scrollOffset, MAX_VISIBLE_ITEMS]);
274
+ // Expose handleInput method via ref
275
+ useImperativeHandle(ref, () => ({
276
+ handleInput: (input, key) => {
277
+ if (!isVisible)
278
+ return false;
279
+ // Escape always closes, regardless of item count
280
+ if (key.escape) {
281
+ onClose();
282
+ return true;
251
283
  }
252
- else if (item.kind === 'system') {
253
- // Load system command into input
254
- onLoadIntoInput?.(`/${item.command.name}`);
284
+ const itemsLength = combinedItems.length;
285
+ // Handle Enter when no matches or typing arguments
286
+ // Submit raw text directly (main input won't handle it since overlay is active)
287
+ if (itemsLength === 0 || hasArguments) {
288
+ if (key.return) {
289
+ void Promise.resolve(onSubmitRaw?.(searchQuery)).catch((err) => {
290
+ const message = err instanceof Error ? err.message : String(err);
291
+ agent.logger.error(`SlashCommandAutocomplete: Failed to submit raw command: ${message}`);
292
+ });
293
+ onClose();
294
+ return true;
295
+ }
296
+ // Let other keys (typing, backspace) fall through
297
+ return false;
255
298
  }
256
- else {
257
- // Load prompt command into input
258
- const argsString = item.prompt.arguments && item.prompt.arguments.length > 0
259
- ? ' ' +
260
- item.prompt.arguments
261
- .map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
262
- .join(' ')
263
- : '';
264
- onLoadIntoInput?.(`/${item.prompt.name}${argsString}`);
299
+ if (key.upArrow) {
300
+ updateSelection((prev) => (prev - 1 + itemsLength) % itemsLength);
301
+ return true;
265
302
  }
266
- return;
267
- }
268
- // Enter: Always execute the highlighted command/prompt
269
- if (key.return && itemsLength > 0) {
270
- const item = combinedItems[selectedIndexRef.current];
271
- if (!item)
272
- return;
273
- if (item.kind === 'create') {
274
- onCreatePrompt?.();
303
+ if (key.downArrow) {
304
+ updateSelection((prev) => (prev + 1) % itemsLength);
305
+ return true;
275
306
  }
276
- else if (item.kind === 'system') {
277
- onSelectSystemCommand?.(item.command.name);
307
+ // Tab: For interactive commands (model, resume, switch), execute them like Enter
308
+ // For other commands, load into input for editing
309
+ if (key.tab) {
310
+ const item = combinedItems[selectedIndexRef.current];
311
+ if (!item)
312
+ return false;
313
+ // Check if this is an interactive command that should be executed
314
+ const interactiveCommands = ['model', 'resume', 'switch'];
315
+ const isInteractiveCommand = item.kind === 'system' && interactiveCommands.includes(item.command.name);
316
+ if (isInteractiveCommand && item.kind === 'system') {
317
+ // Execute interactive command (same as Enter)
318
+ onSelectSystemCommand?.(item.command.name);
319
+ }
320
+ else if (item.kind === 'system') {
321
+ // Load system command into input
322
+ onLoadIntoInput?.(`/${item.command.name}`);
323
+ }
324
+ else {
325
+ // Load prompt command into input
326
+ // Use displayName only if it's command-safe (no spaces/special chars)
327
+ const promptDisplayName = item.prompt.displayName || item.prompt.name;
328
+ const isCommandSafe = /^[A-Za-z0-9_-]+$/.test(promptDisplayName);
329
+ const commandName = isCommandSafe ? promptDisplayName : item.prompt.name;
330
+ const argsString = item.prompt.arguments && item.prompt.arguments.length > 0
331
+ ? ' ' +
332
+ item.prompt.arguments
333
+ .map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
334
+ .join(' ')
335
+ : '';
336
+ onLoadIntoInput?.(`/${commandName}${argsString}`);
337
+ }
338
+ return true;
278
339
  }
279
- else {
280
- onSelectPrompt(item.prompt);
340
+ // Enter: Execute the highlighted command/prompt and close overlay
341
+ if (key.return) {
342
+ const item = combinedItems[selectedIndexRef.current];
343
+ if (!item)
344
+ return false;
345
+ if (item.kind === 'system') {
346
+ onSelectSystemCommand?.(item.command.name);
347
+ }
348
+ else {
349
+ onSelectPrompt(item.prompt);
350
+ }
351
+ onClose();
352
+ return true;
281
353
  }
282
- }
283
- }, { isActive: isVisible });
354
+ // Don't consume other keys (typing, backspace, etc.)
355
+ // Let them fall through to the input handler
356
+ return false;
357
+ },
358
+ }), [
359
+ isVisible,
360
+ combinedItems,
361
+ hasArguments,
362
+ selectedIndexRef,
363
+ searchQuery,
364
+ onClose,
365
+ onLoadIntoInput,
366
+ onSubmitRaw,
367
+ onSelectPrompt,
368
+ onSelectSystemCommand,
369
+ updateSelection,
370
+ agent,
371
+ ]);
284
372
  if (!isVisible)
285
373
  return null;
286
- // Hide autocomplete when user is typing arguments
287
- if (hasArguments)
288
- return null;
374
+ // Show loading state while fetching commands
289
375
  if (isLoading) {
290
- return (_jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, paddingY: 1, children: _jsx(Text, { dimColor: true, children: "Loading commands..." }) }));
376
+ return (_jsx(Box, { width: terminalWidth, paddingX: 0, paddingY: 0, children: _jsx(Text, { dimColor: true, children: "Loading commands..." }) }));
291
377
  }
378
+ // If no items after loading, don't render
292
379
  if (combinedItems.length === 0) {
293
- return (_jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, paddingY: 1, children: _jsx(Text, { dimColor: true, children: "No commands found" }) }));
380
+ return null;
294
381
  }
295
- const hasMoreAbove = scrollOffset > 0;
296
- const hasMoreBelow = scrollOffset + MAX_VISIBLE_ITEMS < combinedItems.length;
297
382
  const totalItems = combinedItems.length;
298
- return (_jsxs(Box, { borderStyle: "single", borderColor: "cyan", flexDirection: "column", height: Math.min(MAX_VISIBLE_ITEMS + 3, totalItems + 3), children: [_jsx(Box, { paddingX: 1, paddingY: 0, children: _jsxs(Text, { dimColor: true, children: ["Commands (", selectedIndex + 1, "/", totalItems, ") - \u2191\u2193 to navigate, Tab to load, Enter to execute, Esc to close"] }) }), hasMoreAbove && (_jsx(Box, { paddingX: 1, paddingY: 0, children: _jsxs(Text, { dimColor: true, children: ["... \u2191 (", scrollOffset, " more above)"] }) })), visibleItems.map((item, visibleIndex) => {
383
+ // Show simplified header when user is typing arguments
384
+ const headerText = hasArguments
385
+ ? 'Press Enter to execute'
386
+ : `Commands (${selectedIndex + 1}/${totalItems}) - ↑↓ navigate, Tab load, Enter execute, Esc close`;
387
+ return (_jsxs(Box, { flexDirection: "column", width: terminalWidth, children: [_jsx(Box, { paddingX: 0, paddingY: 0, children: _jsx(Text, { color: "purple", bold: true, children: headerText }) }), visibleItems.map((item, visibleIndex) => {
299
388
  const actualIndex = scrollOffset + visibleIndex;
300
389
  const isSelected = actualIndex === selectedIndex;
301
- if (item.kind === 'create') {
302
- return (_jsx(Box, { paddingX: 1, paddingY: 0, backgroundColor: isSelected ? 'yellow' : undefined, children: _jsxs(Text, { color: isSelected ? 'black' : 'gray', bold: isSelected, children: ["+ Create new prompt: /", commandQuery || 'name'] }) }, "create"));
303
- }
304
390
  if (item.kind === 'system') {
305
391
  const cmd = item.command;
306
- return (_jsxs(Box, { paddingX: 1, paddingY: 0, backgroundColor: isSelected ? 'yellow' : undefined, flexDirection: "row", children: [_jsxs(Text, { color: isSelected ? 'black' : 'gray', bold: isSelected, children: ["/", cmd.name] }), cmd.description && (_jsxs(Text, { color: isSelected ? 'black' : 'gray', dimColor: !isSelected, children: [' ', cmd.description] })), cmd.category && (_jsxs(Text, { color: isSelected ? 'black' : 'gray', dimColor: !isSelected, children: [' ', "(", cmd.category, ")"] }))] }, `system-${cmd.name}`));
392
+ const nameText = `/${cmd.name}`;
393
+ const categoryText = cmd.category ? ` (${cmd.category})` : '';
394
+ const descText = cmd.description || '';
395
+ // Two-line layout:
396
+ // Line 1: /command-name
397
+ // Line 2: Description text (category)
398
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 0, children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: nameText }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', dimColor: !isSelected, children: [' ', descText, categoryText] })] }, `system-${cmd.name}`));
307
399
  }
308
- // Prompt command
400
+ // Prompt command (MCP prompts)
309
401
  const prompt = item.prompt;
310
- const description = prompt.title || prompt.description || '';
402
+ // Use displayName for user-friendly display, fall back to full name
403
+ const displayName = prompt.displayName || prompt.name;
404
+ const nameText = `/${displayName}`;
311
405
  const argsString = prompt.arguments && prompt.arguments.length > 0
312
- ? prompt.arguments
313
- .map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
314
- .join(' ')
406
+ ? ' ' +
407
+ prompt.arguments
408
+ .map((arg) => `<${arg.name}${arg.required ? '' : '?'}>`)
409
+ .join(' ')
315
410
  : '';
316
- return (_jsxs(Box, { paddingX: 1, paddingY: 0, backgroundColor: isSelected ? 'yellow' : undefined, flexDirection: "row", children: [_jsxs(Text, { color: isSelected ? 'black' : 'gray', bold: isSelected, children: ["/", prompt.name] }), argsString && (_jsxs(Text, { color: isSelected ? 'black' : 'gray', dimColor: !isSelected, children: [' ', argsString] })), description && (_jsxs(Text, { color: isSelected ? 'black' : 'gray', dimColor: !isSelected, children: [' ', description] }))] }, `prompt-${prompt.name}`));
317
- }), hasMoreBelow && (_jsx(Box, { paddingX: 1, paddingY: 0, children: _jsxs(Text, { dimColor: true, children: ["... \u2193 (", totalItems - scrollOffset - MAX_VISIBLE_ITEMS, " more below)"] }) }))] }));
318
- }
411
+ const description = prompt.title || prompt.description || '';
412
+ // Two-line layout:
413
+ // Line 1: /command-name <args>
414
+ // Line 2: Description text (source)
415
+ const commandText = nameText + argsString;
416
+ const sourceLabel = prompt.source || 'prompt';
417
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 0, children: [_jsx(Text, { color: isSelected ? 'cyan' : 'gray', bold: isSelected, children: commandText }), _jsxs(Text, { color: isSelected ? 'white' : 'gray', dimColor: !isSelected, children: [' ', description, ` (${sourceLabel})`] })] }, `prompt-${prompt.name}`));
418
+ })] }));
419
+ });
420
+ /**
421
+ * Export with React.memo to prevent unnecessary re-renders from parent
422
+ * Only re-renders when props actually change (shallow comparison)
423
+ */
424
+ export const SlashCommandAutocomplete = React.memo(SlashCommandAutocompleteInner);
@@ -1,17 +1,30 @@
1
1
  /**
2
2
  * StatusBar Component
3
3
  * Displays processing status and controls above the input area
4
+ *
5
+ * Layout:
6
+ * - Line 1: Spinner + phrase (+ queue count if any)
7
+ * - Line 2: Meta info (time, tokens, cancel hint)
8
+ * This 2-line layout prevents truncation on any terminal width.
4
9
  */
10
+ import type { DextoAgent } from '@dexto/core';
5
11
  interface StatusBarProps {
12
+ agent: DextoAgent;
6
13
  isProcessing: boolean;
7
14
  isThinking: boolean;
8
15
  approvalQueueCount: number;
9
- exitWarningShown?: boolean;
16
+ copyModeEnabled?: boolean;
17
+ /** Whether an approval prompt is currently shown */
18
+ isAwaitingApproval?: boolean;
10
19
  }
11
20
  /**
12
21
  * Status bar that shows processing state above input area
13
22
  * Provides clear feedback on whether the agent is running or idle
23
+ *
24
+ * Design decisions:
25
+ * - Hide spinner during approval wait (user is reviewing, not waiting)
26
+ * - Only show elapsed time after 30s (avoid visual noise for fast operations)
14
27
  */
15
- export declare function StatusBar({ isProcessing, isThinking, approvalQueueCount, exitWarningShown, }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function StatusBar({ agent, isProcessing, isThinking, approvalQueueCount, copyModeEnabled, isAwaitingApproval, }: StatusBarProps): import("react/jsx-runtime").JSX.Element | null;
16
29
  export {};
17
30
  //# sourceMappingURL=StatusBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,cAAc;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EACtB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,gBAAwB,GAC3B,EAAE,cAAc,2CA+DhB"}
1
+ {"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,UAAU,cAAc;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,eAAuB,EACvB,kBAA0B,GAC7B,EAAE,cAAc,kDAwFhB"}
@@ -2,28 +2,66 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * StatusBar Component
4
4
  * Displays processing status and controls above the input area
5
+ *
6
+ * Layout:
7
+ * - Line 1: Spinner + phrase (+ queue count if any)
8
+ * - Line 2: Meta info (time, tokens, cancel hint)
9
+ * This 2-line layout prevents truncation on any terminal width.
5
10
  */
6
11
  import { Box, Text } from 'ink';
7
12
  import Spinner from 'ink-spinner';
13
+ import { usePhraseCycler } from '../hooks/usePhraseCycler.js';
14
+ import { useElapsedTime } from '../hooks/useElapsedTime.js';
15
+ import { useTokenCounter } from '../hooks/useTokenCounter.js';
8
16
  /**
9
17
  * Status bar that shows processing state above input area
10
18
  * Provides clear feedback on whether the agent is running or idle
19
+ *
20
+ * Design decisions:
21
+ * - Hide spinner during approval wait (user is reviewing, not waiting)
22
+ * - Only show elapsed time after 30s (avoid visual noise for fast operations)
11
23
  */
12
- export function StatusBar({ isProcessing, isThinking, approvalQueueCount, exitWarningShown = false, }) {
13
- // Show exit warning if Ctrl+C was pressed
14
- if (exitWarningShown) {
15
- return (_jsxs(Box, { paddingX: 1, marginBottom: 0, children: [_jsx(Text, { color: "yellow", bold: true, children: "\u26A0 Press Ctrl+C again to exit" }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', "(or press any key to cancel)"] })] }));
24
+ export function StatusBar({ agent, isProcessing, isThinking, approvalQueueCount, copyModeEnabled = false, isAwaitingApproval = false, }) {
25
+ // Cycle through witty phrases while processing
26
+ const { phrase } = usePhraseCycler({ isActive: isProcessing });
27
+ // Track elapsed time during processing
28
+ const { formatted: elapsedTime, elapsedMs } = useElapsedTime({ isActive: isProcessing });
29
+ // Track token usage during processing
30
+ const { formatted: tokenCount } = useTokenCounter({ agent, isActive: isProcessing });
31
+ // Only show time after 30 seconds
32
+ const showTime = elapsedMs >= 30000;
33
+ // Show copy mode warning (highest priority)
34
+ if (copyModeEnabled) {
35
+ return (_jsx(Box, { paddingX: 1, marginBottom: 0, children: _jsx(Text, { color: "yellow", bold: true, children: "\uD83D\uDCCB Copy Mode - Select text with mouse. Press any key to exit." }) }));
16
36
  }
17
37
  if (!isProcessing) {
18
- // Show idle state - minimal, non-intrusive
19
- return (_jsxs(Box, { paddingX: 1, marginBottom: 0, children: [_jsx(Text, { color: "green", children: "\u25CF" }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', "Ready"] })] }));
38
+ // No status bar when idle
39
+ return null;
40
+ }
41
+ // Hide status bar during approval wait - user is reviewing, not waiting
42
+ if (isAwaitingApproval) {
43
+ return null;
20
44
  }
21
45
  // Show initial processing state (before streaming starts) - magenta color
22
46
  // TODO: Rename this event/state to "reasoning" and associate it with actual reasoning tokens
23
47
  // Currently "thinking" event fires before any response, not during reasoning token generation
24
48
  if (isThinking) {
25
- return (_jsxs(Box, { paddingX: 1, marginBottom: 0, flexDirection: "row", children: [_jsx(Text, { color: "magenta", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { color: "magenta", children: " Processing" }), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', "\u2022 Press Esc or Ctrl+C to cancel"] })] }));
49
+ const metaParts = [];
50
+ if (showTime)
51
+ metaParts.push(`(${elapsedTime})`);
52
+ metaParts.push('Esc to cancel');
53
+ const metaContent = metaParts.join(' • ');
54
+ return (_jsxs(Box, { paddingX: 1, marginTop: 1, marginBottom: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "magenta", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: "magenta", children: [" ", phrase] })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "gray", dimColor: true, children: metaContent }) })] }));
26
55
  }
27
56
  // Show active streaming state - cyan color
28
- return (_jsxs(Box, { paddingX: 1, marginBottom: 0, flexDirection: "row", children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsx(Text, { color: "cyan", children: " Processing" }), approvalQueueCount > 0 && (_jsxs(Text, { color: "yellow", children: [" \u2022 ", approvalQueueCount, " approval(s) queued"] })), _jsxs(Text, { color: "gray", dimColor: true, children: [' ', "\u2022 Press Esc or Ctrl+C to cancel"] })] }));
57
+ // Always use 2-line layout: phrase on first line, meta on second
58
+ // This prevents truncation and messy wrapping on any terminal width
59
+ const metaParts = [];
60
+ if (showTime)
61
+ metaParts.push(`(${elapsedTime})`);
62
+ if (tokenCount)
63
+ metaParts.push(tokenCount);
64
+ metaParts.push('Esc to cancel');
65
+ const metaContent = metaParts.join(' • ');
66
+ return (_jsxs(Box, { paddingX: 1, marginTop: 1, marginBottom: 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", alignItems: "center", children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: "cyan", children: [" ", phrase] }), approvalQueueCount > 0 && (_jsxs(Text, { color: "yellow", children: [" \u2022 ", approvalQueueCount, " queued"] }))] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "gray", dimColor: true, children: metaContent }) })] }));
29
67
  }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * TextBufferInput Component
3
+ *
4
+ * Buffer is passed as prop from parent.
5
+ * Uses direct useKeypress for input handling (no ref chain).
6
+ * Parent owns the buffer and can read values directly.
7
+ */
8
+ import type { TextBuffer } from './shared/text-buffer.js';
9
+ import type { PendingImage, PastedBlock } from '../state/types.js';
10
+ /** Overlay trigger types for event-driven overlay detection */
11
+ export type OverlayTrigger = 'slash-autocomplete' | 'resource-autocomplete' | 'close';
12
+ interface TextBufferInputProps {
13
+ /** Text buffer (owned by parent) */
14
+ buffer: TextBuffer;
15
+ /** Called when user presses Enter to submit */
16
+ onSubmit: (value: string) => void;
17
+ /** Placeholder text when empty */
18
+ placeholder?: string | undefined;
19
+ /** Whether input handling is disabled (e.g., during processing) */
20
+ isDisabled?: boolean | undefined;
21
+ /** Called for history navigation (up/down at boundaries) */
22
+ onHistoryNavigate?: ((direction: 'up' | 'down') => void) | undefined;
23
+ /** Called to trigger overlay (slash command, @mention) */
24
+ onTriggerOverlay?: ((trigger: OverlayTrigger) => void) | undefined;
25
+ /** Maximum lines to show in viewport */
26
+ maxViewportLines?: number | undefined;
27
+ /** Whether this input should handle keypresses */
28
+ isActive: boolean;
29
+ /** Optional handler for keyboard scroll (PageUp/PageDown, Shift+arrows) */
30
+ onKeyboardScroll?: ((direction: 'up' | 'down') => void) | undefined;
31
+ /** Current number of attached images (for placeholder numbering) */
32
+ imageCount?: number | undefined;
33
+ /** Called when image is pasted from clipboard */
34
+ onImagePaste?: ((image: PendingImage) => void) | undefined;
35
+ /** Current pending images (for placeholder removal detection) */
36
+ images?: PendingImage[] | undefined;
37
+ /** Called when an image placeholder is removed from text */
38
+ onImageRemove?: ((imageId: string) => void) | undefined;
39
+ /** Current pasted blocks for collapse/expand feature */
40
+ pastedBlocks?: PastedBlock[] | undefined;
41
+ /** Called when a large paste is detected and should be collapsed */
42
+ onPasteBlock?: ((block: PastedBlock) => void) | undefined;
43
+ /** Called to update a pasted block (e.g., toggle collapse) */
44
+ onPasteBlockUpdate?: ((blockId: string, updates: Partial<PastedBlock>) => void) | undefined;
45
+ /** Called when a paste block placeholder is removed from text */
46
+ onPasteBlockRemove?: ((blockId: string) => void) | undefined;
47
+ /** Query to highlight in input text (for history search) */
48
+ highlightQuery?: string | undefined;
49
+ }
50
+ export declare function TextBufferInput({ buffer, onSubmit, placeholder, isDisabled, onHistoryNavigate, onTriggerOverlay, maxViewportLines, isActive, onKeyboardScroll, imageCount, onImagePaste, images, onImageRemove, pastedBlocks, onPasteBlock, onPasteBlockUpdate, onPasteBlockRemove, highlightQuery, }: TextBufferInputProps): import("react/jsx-runtime").JSX.Element;
51
+ export {};
52
+ //# sourceMappingURL=TextBufferInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextBufferInput.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/components/TextBufferInput.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGnE,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,OAAO,CAAC;AActF,UAAU,oBAAoB;IAC1B,oCAAoC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACrE,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnE,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kDAAkD;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACpE,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,iEAAiE;IACjE,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IACpC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACxD,wDAAwD;IACxD,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACzC,oEAAoE;IACpE,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1D,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5F,iEAAiE;IACjE,kBAAkB,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7D,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAuCD,wBAAgB,eAAe,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,UAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAqB,EACrB,QAAQ,EACR,gBAAgB,EAChB,UAAc,EACd,YAAY,EACZ,MAAW,EACX,aAAa,EACb,YAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACjB,EAAE,oBAAoB,2CA8gBtB"}