dexto 1.3.0 → 1.5.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 (494) hide show
  1. package/README.md +87 -22
  2. package/dist/agents/agent-registry.json +9 -0
  3. package/dist/agents/agent-template.yml +2 -2
  4. package/dist/agents/coding-agent/coding-agent.yml +27 -16
  5. package/dist/agents/database-agent/database-agent.yml +2 -2
  6. package/dist/agents/default-agent.yml +9 -7
  7. package/dist/agents/github-agent/github-agent.yml +2 -2
  8. package/dist/agents/product-name-researcher/product-name-researcher.yml +2 -2
  9. package/dist/agents/talk2pdf-agent/talk2pdf-agent.yml +2 -2
  10. package/dist/analytics/events.d.ts +13 -6
  11. package/dist/analytics/events.d.ts.map +1 -1
  12. package/dist/analytics/index.d.ts +1 -1
  13. package/dist/analytics/index.d.ts.map +1 -1
  14. package/dist/analytics/index.js +6 -2
  15. package/dist/api/server-hono.d.ts.map +1 -1
  16. package/dist/api/server-hono.js +65 -9
  17. package/dist/cli/cli-subscriber.d.ts +4 -0
  18. package/dist/cli/cli-subscriber.d.ts.map +1 -1
  19. package/dist/cli/cli-subscriber.js +47 -3
  20. package/dist/cli/commands/create-app.d.ts +16 -14
  21. package/dist/cli/commands/create-app.d.ts.map +1 -1
  22. package/dist/cli/commands/create-app.js +626 -102
  23. package/dist/cli/commands/create-image.d.ts +7 -0
  24. package/dist/cli/commands/create-image.d.ts.map +1 -0
  25. package/dist/cli/commands/create-image.js +201 -0
  26. package/dist/cli/commands/helpers/formatters.d.ts.map +1 -1
  27. package/dist/cli/commands/helpers/formatters.js +9 -8
  28. package/dist/cli/commands/index.d.ts +2 -1
  29. package/dist/cli/commands/index.d.ts.map +1 -1
  30. package/dist/cli/commands/index.js +2 -1
  31. package/dist/cli/commands/init-app.js +7 -7
  32. package/dist/cli/commands/install.d.ts +0 -3
  33. package/dist/cli/commands/install.d.ts.map +1 -1
  34. package/dist/cli/commands/install.js +19 -70
  35. package/dist/cli/commands/interactive-commands/command-parser.d.ts +17 -14
  36. package/dist/cli/commands/interactive-commands/command-parser.d.ts.map +1 -1
  37. package/dist/cli/commands/interactive-commands/command-parser.js +7 -22
  38. package/dist/cli/commands/interactive-commands/commands.d.ts +4 -4
  39. package/dist/cli/commands/interactive-commands/commands.d.ts.map +1 -1
  40. package/dist/cli/commands/interactive-commands/commands.js +34 -42
  41. package/dist/cli/commands/interactive-commands/documentation-commands.d.ts.map +1 -1
  42. package/dist/cli/commands/interactive-commands/documentation-commands.js +4 -7
  43. package/dist/cli/commands/interactive-commands/general-commands.d.ts.map +1 -1
  44. package/dist/cli/commands/interactive-commands/general-commands.js +159 -117
  45. package/dist/cli/commands/interactive-commands/mcp/index.d.ts +9 -3
  46. package/dist/cli/commands/interactive-commands/mcp/index.d.ts.map +1 -1
  47. package/dist/cli/commands/interactive-commands/mcp/index.js +18 -3
  48. package/dist/cli/commands/interactive-commands/model/index.d.ts +8 -6
  49. package/dist/cli/commands/interactive-commands/model/index.d.ts.map +1 -1
  50. package/dist/cli/commands/interactive-commands/model/index.js +18 -6
  51. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +3 -2
  52. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
  53. package/dist/cli/commands/interactive-commands/prompt-commands.js +77 -60
  54. package/dist/cli/commands/interactive-commands/session/index.d.ts +7 -12
  55. package/dist/cli/commands/interactive-commands/session/index.d.ts.map +1 -1
  56. package/dist/cli/commands/interactive-commands/session/index.js +7 -14
  57. package/dist/cli/commands/interactive-commands/session/session-commands.d.ts +10 -24
  58. package/dist/cli/commands/interactive-commands/session/session-commands.d.ts.map +1 -1
  59. package/dist/cli/commands/interactive-commands/session/session-commands.js +16 -371
  60. package/dist/cli/commands/interactive-commands/system/system-commands.d.ts +1 -0
  61. package/dist/cli/commands/interactive-commands/system/system-commands.d.ts.map +1 -1
  62. package/dist/cli/commands/interactive-commands/system/system-commands.js +106 -77
  63. package/dist/cli/commands/interactive-commands/tool-commands.d.ts +1 -1
  64. package/dist/cli/commands/interactive-commands/tool-commands.d.ts.map +1 -1
  65. package/dist/cli/commands/interactive-commands/tool-commands.js +5 -62
  66. package/dist/cli/commands/interactive-commands/utils/command-output.d.ts +13 -17
  67. package/dist/cli/commands/interactive-commands/utils/command-output.d.ts.map +1 -1
  68. package/dist/cli/commands/interactive-commands/utils/command-output.js +18 -37
  69. package/dist/cli/commands/list-agents.d.ts +2 -2
  70. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  71. package/dist/cli/commands/list-agents.js +38 -34
  72. package/dist/cli/commands/session-commands.js +16 -16
  73. package/dist/cli/commands/setup.d.ts +13 -5
  74. package/dist/cli/commands/setup.d.ts.map +1 -1
  75. package/dist/cli/commands/setup.js +860 -65
  76. package/dist/cli/commands/uninstall.d.ts.map +1 -1
  77. package/dist/cli/commands/uninstall.js +4 -6
  78. package/dist/cli/commands/which.d.ts.map +1 -1
  79. package/dist/cli/commands/which.js +18 -4
  80. package/dist/cli/ink-cli/InkCLIRefactored.d.ts +9 -22
  81. package/dist/cli/ink-cli/InkCLIRefactored.d.ts.map +1 -1
  82. package/dist/cli/ink-cli/InkCLIRefactored.js +50 -133
  83. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts +26 -3
  84. package/dist/cli/ink-cli/components/ApprovalPrompt.d.ts.map +1 -1
  85. package/dist/cli/ink-cli/components/ApprovalPrompt.js +182 -45
  86. package/dist/cli/ink-cli/components/CustomInput.js +1 -1
  87. package/dist/cli/ink-cli/components/EditableMultiLineInput.js +4 -4
  88. package/dist/cli/ink-cli/components/ElicitationForm.d.ts +22 -0
  89. package/dist/cli/ink-cli/components/ElicitationForm.d.ts.map +1 -0
  90. package/dist/cli/ink-cli/components/ElicitationForm.js +358 -0
  91. package/dist/cli/ink-cli/components/ErrorBoundary.d.ts.map +1 -1
  92. package/dist/cli/ink-cli/components/ErrorBoundary.js +1 -1
  93. package/dist/cli/ink-cli/components/Footer.d.ts +16 -0
  94. package/dist/cli/ink-cli/components/Footer.d.ts.map +1 -0
  95. package/dist/cli/ink-cli/components/Footer.js +27 -0
  96. package/dist/cli/ink-cli/components/HistorySearchBar.d.ts +17 -0
  97. package/dist/cli/ink-cli/components/HistorySearchBar.d.ts.map +1 -0
  98. package/dist/cli/ink-cli/components/HistorySearchBar.js +8 -0
  99. package/dist/cli/ink-cli/components/MultiLineInput.d.ts.map +1 -1
  100. package/dist/cli/ink-cli/components/MultiLineInput.js +3 -3
  101. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts +15 -2
  102. package/dist/cli/ink-cli/components/ResourceAutocomplete.d.ts.map +1 -1
  103. package/dist/cli/ink-cli/components/ResourceAutocomplete.js +126 -82
  104. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts +15 -2
  105. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.d.ts.map +1 -1
  106. package/dist/cli/ink-cli/components/SlashCommandAutocomplete.js +228 -122
  107. package/dist/cli/ink-cli/components/StatusBar.d.ts +15 -2
  108. package/dist/cli/ink-cli/components/StatusBar.d.ts.map +1 -1
  109. package/dist/cli/ink-cli/components/StatusBar.js +50 -10
  110. package/dist/cli/ink-cli/components/TextBufferInput.d.ts +52 -0
  111. package/dist/cli/ink-cli/components/TextBufferInput.d.ts.map +1 -0
  112. package/dist/cli/ink-cli/components/TextBufferInput.js +471 -0
  113. package/dist/cli/ink-cli/components/base/BaseAutocomplete.js +4 -4
  114. package/dist/cli/ink-cli/components/base/BaseSelector.d.ts +11 -1
  115. package/dist/cli/ink-cli/components/base/BaseSelector.d.ts.map +1 -1
  116. package/dist/cli/ink-cli/components/base/BaseSelector.js +90 -49
  117. package/dist/cli/ink-cli/components/chat/Footer.js +1 -1
  118. package/dist/cli/ink-cli/components/chat/Header.d.ts +1 -0
  119. package/dist/cli/ink-cli/components/chat/Header.d.ts.map +1 -1
  120. package/dist/cli/ink-cli/components/chat/Header.js +6 -3
  121. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts +3 -0
  122. package/dist/cli/ink-cli/components/chat/MessageItem.d.ts.map +1 -1
  123. package/dist/cli/ink-cli/components/chat/MessageItem.js +95 -9
  124. package/dist/cli/ink-cli/components/chat/MessageList.js +1 -1
  125. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts +16 -0
  126. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.d.ts.map +1 -0
  127. package/dist/cli/ink-cli/components/chat/QueuedMessagesDisplay.js +27 -0
  128. package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts +5 -3
  129. package/dist/cli/ink-cli/components/chat/ToolIcon.d.ts.map +1 -1
  130. package/dist/cli/ink-cli/components/chat/ToolIcon.js +21 -7
  131. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts +10 -0
  132. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.d.ts.map +1 -0
  133. package/dist/cli/ink-cli/components/chat/styled-boxes/ConfigBox.js +6 -0
  134. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts +10 -0
  135. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.d.ts.map +1 -0
  136. package/dist/cli/ink-cli/components/chat/styled-boxes/HelpBox.js +15 -0
  137. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts +10 -0
  138. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.d.ts.map +1 -0
  139. package/dist/cli/ink-cli/components/chat/styled-boxes/LogConfigBox.js +9 -0
  140. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts +10 -0
  141. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.d.ts.map +1 -0
  142. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionHistoryBox.js +37 -0
  143. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts +10 -0
  144. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.d.ts.map +1 -0
  145. package/dist/cli/ink-cli/components/chat/styled-boxes/SessionListBox.js +9 -0
  146. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts +10 -0
  147. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.d.ts.map +1 -0
  148. package/dist/cli/ink-cli/components/chat/styled-boxes/ShortcutsBox.js +6 -0
  149. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts +10 -0
  150. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.d.ts.map +1 -0
  151. package/dist/cli/ink-cli/components/chat/styled-boxes/StatsBox.js +29 -0
  152. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts +45 -0
  153. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.d.ts.map +1 -0
  154. package/dist/cli/ink-cli/components/chat/styled-boxes/StyledBox.js +38 -0
  155. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts +10 -0
  156. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.d.ts.map +1 -0
  157. package/dist/cli/ink-cli/components/chat/styled-boxes/SyspromptBox.js +6 -0
  158. package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts +13 -0
  159. package/dist/cli/ink-cli/components/chat/styled-boxes/index.d.ts.map +1 -0
  160. package/dist/cli/ink-cli/components/chat/styled-boxes/index.js +12 -0
  161. package/dist/cli/ink-cli/components/input/InputArea.d.ts +36 -8
  162. package/dist/cli/ink-cli/components/input/InputArea.d.ts.map +1 -1
  163. package/dist/cli/ink-cli/components/input/InputArea.js +3 -3
  164. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts +25 -0
  165. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.d.ts.map +1 -0
  166. package/dist/cli/ink-cli/components/modes/AlternateBufferCLI.js +166 -0
  167. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts +27 -0
  168. package/dist/cli/ink-cli/components/modes/StaticCLI.d.ts.map +1 -0
  169. package/dist/cli/ink-cli/components/modes/StaticCLI.js +95 -0
  170. package/dist/cli/ink-cli/components/modes/index.d.ts +10 -0
  171. package/dist/cli/ink-cli/components/modes/index.d.ts.map +1 -0
  172. package/dist/cli/ink-cli/components/modes/index.js +9 -0
  173. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts +26 -0
  174. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.d.ts.map +1 -0
  175. package/dist/cli/ink-cli/components/overlays/ApiKeyInput.js +92 -0
  176. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts +29 -0
  177. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.d.ts.map +1 -0
  178. package/dist/cli/ink-cli/components/overlays/CustomModelWizard.js +286 -0
  179. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts +22 -0
  180. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.d.ts.map +1 -0
  181. package/dist/cli/ink-cli/components/overlays/LogLevelSelector.js +59 -0
  182. package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts +22 -0
  183. package/dist/cli/ink-cli/components/overlays/McpAddChoice.d.ts.map +1 -0
  184. package/dist/cli/ink-cli/components/overlays/McpAddChoice.js +59 -0
  185. package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts +26 -0
  186. package/dist/cli/ink-cli/components/overlays/McpAddSelector.d.ts.map +1 -0
  187. package/dist/cli/ink-cli/components/overlays/McpAddSelector.js +73 -0
  188. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts +21 -0
  189. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.d.ts.map +1 -0
  190. package/dist/cli/ink-cli/components/overlays/McpCustomTypeSelector.js +51 -0
  191. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts +29 -0
  192. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.d.ts.map +1 -0
  193. package/dist/cli/ink-cli/components/overlays/McpCustomWizard.js +215 -0
  194. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts +22 -0
  195. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.d.ts.map +1 -0
  196. package/dist/cli/ink-cli/components/overlays/McpRemoveSelector.js +74 -0
  197. package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts +21 -0
  198. package/dist/cli/ink-cli/components/overlays/McpSelector.d.ts.map +1 -0
  199. package/dist/cli/ink-cli/components/overlays/McpSelector.js +52 -0
  200. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts +28 -0
  201. package/dist/cli/ink-cli/components/overlays/McpServerActions.d.ts.map +1 -0
  202. package/dist/cli/ink-cli/components/overlays/McpServerActions.js +84 -0
  203. package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts +29 -0
  204. package/dist/cli/ink-cli/components/overlays/McpServerList.d.ts.map +1 -0
  205. package/dist/cli/ink-cli/components/overlays/McpServerList.js +109 -0
  206. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts +15 -8
  207. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.d.ts.map +1 -1
  208. package/dist/cli/ink-cli/components/overlays/ModelSelectorRefactored.js +400 -23
  209. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts +22 -0
  210. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.d.ts.map +1 -0
  211. package/dist/cli/ink-cli/components/overlays/PromptAddChoice.js +52 -0
  212. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts +29 -0
  213. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.d.ts.map +1 -0
  214. package/dist/cli/ink-cli/components/overlays/PromptAddWizard.js +166 -0
  215. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts +27 -0
  216. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.d.ts.map +1 -0
  217. package/dist/cli/ink-cli/components/overlays/PromptDeleteSelector.js +119 -0
  218. package/dist/cli/ink-cli/components/overlays/PromptList.d.ts +33 -0
  219. package/dist/cli/ink-cli/components/overlays/PromptList.d.ts.map +1 -0
  220. package/dist/cli/ink-cli/components/overlays/PromptList.js +144 -0
  221. package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts +23 -0
  222. package/dist/cli/ink-cli/components/overlays/SearchOverlay.d.ts.map +1 -0
  223. package/dist/cli/ink-cli/components/overlays/SearchOverlay.js +189 -0
  224. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts +7 -2
  225. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.d.ts.map +1 -1
  226. package/dist/cli/ink-cli/components/overlays/SessionSelectorRefactored.js +19 -5
  227. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts +21 -0
  228. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.d.ts.map +1 -0
  229. package/dist/cli/ink-cli/components/overlays/SessionSubcommandSelector.js +42 -0
  230. package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts +20 -0
  231. package/dist/cli/ink-cli/components/overlays/StreamSelector.d.ts.map +1 -0
  232. package/dist/cli/ink-cli/components/overlays/StreamSelector.js +58 -0
  233. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts +25 -0
  234. package/dist/cli/ink-cli/components/overlays/ToolBrowser.d.ts.map +1 -0
  235. package/dist/cli/ink-cli/components/overlays/ToolBrowser.js +400 -0
  236. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts +25 -0
  237. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.d.ts.map +1 -0
  238. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/LocalModelWizard.js +609 -0
  239. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts +15 -0
  240. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.d.ts.map +1 -0
  241. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/index.js +14 -0
  242. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts +33 -0
  243. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.d.ts.map +1 -0
  244. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/provider-config.js +419 -0
  245. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts +25 -0
  246. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.d.ts.map +1 -0
  247. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ApiKeyStep.js +29 -0
  248. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts +17 -0
  249. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.d.ts.map +1 -0
  250. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/ProviderSelector.js +11 -0
  251. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts +20 -0
  252. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.d.ts.map +1 -0
  253. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/SetupInfoBanner.js +10 -0
  254. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts +30 -0
  255. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.d.ts.map +1 -0
  256. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/WizardStepInput.js +13 -0
  257. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts +8 -0
  258. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.d.ts.map +1 -0
  259. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/shared/index.js +7 -0
  260. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts +79 -0
  261. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.d.ts.map +1 -0
  262. package/dist/cli/ink-cli/components/overlays/custom-model-wizard/types.js +38 -0
  263. package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts +21 -0
  264. package/dist/cli/ink-cli/components/renderers/DiffRenderer.d.ts.map +1 -0
  265. package/dist/cli/ink-cli/components/renderers/DiffRenderer.js +65 -0
  266. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts +28 -0
  267. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.d.ts.map +1 -0
  268. package/dist/cli/ink-cli/components/renderers/FilePreviewRenderer.js +66 -0
  269. package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts +19 -0
  270. package/dist/cli/ink-cli/components/renderers/FileRenderer.d.ts.map +1 -0
  271. package/dist/cli/ink-cli/components/renderers/FileRenderer.js +26 -0
  272. package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts +21 -0
  273. package/dist/cli/ink-cli/components/renderers/GenericRenderer.d.ts.map +1 -0
  274. package/dist/cli/ink-cli/components/renderers/GenericRenderer.js +26 -0
  275. package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts +20 -0
  276. package/dist/cli/ink-cli/components/renderers/SearchRenderer.d.ts.map +1 -0
  277. package/dist/cli/ink-cli/components/renderers/SearchRenderer.js +12 -0
  278. package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts +21 -0
  279. package/dist/cli/ink-cli/components/renderers/ShellRenderer.d.ts.map +1 -0
  280. package/dist/cli/ink-cli/components/renderers/ShellRenderer.js +25 -0
  281. package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts +61 -0
  282. package/dist/cli/ink-cli/components/renderers/diff-shared.d.ts.map +1 -0
  283. package/dist/cli/ink-cli/components/renderers/diff-shared.js +158 -0
  284. package/dist/cli/ink-cli/components/renderers/index.d.ts +28 -0
  285. package/dist/cli/ink-cli/components/renderers/index.d.ts.map +1 -0
  286. package/dist/cli/ink-cli/components/renderers/index.js +36 -0
  287. package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts +38 -0
  288. package/dist/cli/ink-cli/components/shared/MarkdownText.d.ts.map +1 -0
  289. package/dist/cli/ink-cli/components/shared/MarkdownText.js +362 -0
  290. package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts +44 -0
  291. package/dist/cli/ink-cli/components/shared/VirtualizedList.d.ts.map +1 -0
  292. package/dist/cli/ink-cli/components/shared/VirtualizedList.js +300 -0
  293. package/dist/cli/ink-cli/components/shared/text-buffer.d.ts +185 -0
  294. package/dist/cli/ink-cli/components/shared/text-buffer.d.ts.map +1 -0
  295. package/dist/cli/ink-cli/components/shared/text-buffer.js +1338 -0
  296. package/dist/cli/ink-cli/constants/processingPhrases.d.ts +10 -0
  297. package/dist/cli/ink-cli/constants/processingPhrases.d.ts.map +1 -0
  298. package/dist/cli/ink-cli/constants/processingPhrases.js +64 -0
  299. package/dist/cli/ink-cli/constants/tips.d.ts +15 -0
  300. package/dist/cli/ink-cli/constants/tips.d.ts.map +1 -0
  301. package/dist/cli/ink-cli/constants/tips.js +53 -0
  302. package/dist/cli/ink-cli/containers/InputContainer.d.ts +42 -8
  303. package/dist/cli/ink-cli/containers/InputContainer.d.ts.map +1 -1
  304. package/dist/cli/ink-cli/containers/InputContainer.js +513 -85
  305. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts +23 -5
  306. package/dist/cli/ink-cli/containers/OverlayContainer.d.ts.map +1 -1
  307. package/dist/cli/ink-cli/containers/OverlayContainer.js +1214 -132
  308. package/dist/cli/ink-cli/containers/index.d.ts +1 -1
  309. package/dist/cli/ink-cli/containers/index.d.ts.map +1 -1
  310. package/dist/cli/ink-cli/contexts/KeypressContext.d.ts +36 -0
  311. package/dist/cli/ink-cli/contexts/KeypressContext.d.ts.map +1 -0
  312. package/dist/cli/ink-cli/contexts/KeypressContext.js +461 -0
  313. package/dist/cli/ink-cli/contexts/MouseContext.d.ts +27 -0
  314. package/dist/cli/ink-cli/contexts/MouseContext.d.ts.map +1 -0
  315. package/dist/cli/ink-cli/contexts/MouseContext.js +102 -0
  316. package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts +33 -0
  317. package/dist/cli/ink-cli/contexts/ScrollProvider.d.ts.map +1 -0
  318. package/dist/cli/ink-cli/contexts/ScrollProvider.js +170 -0
  319. package/dist/cli/ink-cli/contexts/index.d.ts +7 -0
  320. package/dist/cli/ink-cli/contexts/index.d.ts.map +1 -0
  321. package/dist/cli/ink-cli/contexts/index.js +6 -0
  322. package/dist/cli/ink-cli/hooks/index.d.ts +5 -0
  323. package/dist/cli/ink-cli/hooks/index.d.ts.map +1 -1
  324. package/dist/cli/ink-cli/hooks/index.js +6 -1
  325. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts +26 -9
  326. package/dist/cli/ink-cli/hooks/useAgentEvents.d.ts.map +1 -1
  327. package/dist/cli/ink-cli/hooks/useAgentEvents.js +90 -198
  328. package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts +14 -0
  329. package/dist/cli/ink-cli/hooks/useBatchedScroll.d.ts.map +1 -0
  330. package/dist/cli/ink-cli/hooks/useBatchedScroll.js +25 -0
  331. package/dist/cli/ink-cli/hooks/useCLIState.d.ts +50 -0
  332. package/dist/cli/ink-cli/hooks/useCLIState.d.ts.map +1 -0
  333. package/dist/cli/ink-cli/hooks/useCLIState.js +190 -0
  334. package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts +24 -0
  335. package/dist/cli/ink-cli/hooks/useElapsedTime.d.ts.map +1 -0
  336. package/dist/cli/ink-cli/hooks/useElapsedTime.js +69 -0
  337. package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts +61 -0
  338. package/dist/cli/ink-cli/hooks/useHistorySearch.d.ts.map +1 -0
  339. package/dist/cli/ink-cli/hooks/useHistorySearch.js +210 -0
  340. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts +136 -0
  341. package/dist/cli/ink-cli/hooks/useInputOrchestrator.d.ts.map +1 -0
  342. package/dist/cli/ink-cli/hooks/useInputOrchestrator.js +663 -0
  343. package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  344. package/dist/cli/ink-cli/hooks/useKeyboardShortcuts.js +7 -26
  345. package/dist/cli/ink-cli/hooks/useKeypress.d.ts +18 -0
  346. package/dist/cli/ink-cli/hooks/useKeypress.d.ts.map +1 -0
  347. package/dist/cli/ink-cli/hooks/useKeypress.js +26 -0
  348. package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts +30 -0
  349. package/dist/cli/ink-cli/hooks/usePhraseCycler.d.ts.map +1 -0
  350. package/dist/cli/ink-cli/hooks/usePhraseCycler.js +68 -0
  351. package/dist/cli/ink-cli/hooks/useStreaming.d.ts +19 -0
  352. package/dist/cli/ink-cli/hooks/useStreaming.d.ts.map +1 -0
  353. package/dist/cli/ink-cli/hooks/useStreaming.js +26 -0
  354. package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts +14 -0
  355. package/dist/cli/ink-cli/hooks/useTerminalSize.d.ts.map +1 -0
  356. package/dist/cli/ink-cli/hooks/useTerminalSize.js +31 -0
  357. package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts +42 -0
  358. package/dist/cli/ink-cli/hooks/useTokenCounter.d.ts.map +1 -0
  359. package/dist/cli/ink-cli/hooks/useTokenCounter.js +96 -0
  360. package/dist/cli/ink-cli/services/CommandService.d.ts +32 -1
  361. package/dist/cli/ink-cli/services/CommandService.d.ts.map +1 -1
  362. package/dist/cli/ink-cli/services/CommandService.js +36 -5
  363. package/dist/cli/ink-cli/services/InputService.d.ts +1 -5
  364. package/dist/cli/ink-cli/services/InputService.d.ts.map +1 -1
  365. package/dist/cli/ink-cli/services/InputService.js +1 -8
  366. package/dist/cli/ink-cli/services/index.d.ts +2 -1
  367. package/dist/cli/ink-cli/services/index.d.ts.map +1 -1
  368. package/dist/cli/ink-cli/services/index.js +2 -1
  369. package/dist/cli/ink-cli/services/processStream.d.ts +69 -0
  370. package/dist/cli/ink-cli/services/processStream.d.ts.map +1 -0
  371. package/dist/cli/ink-cli/services/processStream.js +742 -0
  372. package/dist/cli/ink-cli/state/actions.d.ts +30 -60
  373. package/dist/cli/ink-cli/state/actions.d.ts.map +1 -1
  374. package/dist/cli/ink-cli/state/actions.js +3 -0
  375. package/dist/cli/ink-cli/state/index.d.ts +5 -3
  376. package/dist/cli/ink-cli/state/index.d.ts.map +1 -1
  377. package/dist/cli/ink-cli/state/index.js +4 -3
  378. package/dist/cli/ink-cli/state/initialState.d.ts +4 -3
  379. package/dist/cli/ink-cli/state/initialState.d.ts.map +1 -1
  380. package/dist/cli/ink-cli/state/initialState.js +20 -4
  381. package/dist/cli/ink-cli/state/reducer.d.ts +3 -0
  382. package/dist/cli/ink-cli/state/reducer.d.ts.map +1 -1
  383. package/dist/cli/ink-cli/state/reducer.js +62 -168
  384. package/dist/cli/ink-cli/state/streaming-state.d.ts +27 -0
  385. package/dist/cli/ink-cli/state/streaming-state.d.ts.map +1 -0
  386. package/dist/cli/ink-cli/state/streaming-state.js +39 -0
  387. package/dist/cli/ink-cli/state/types.d.ts +223 -6
  388. package/dist/cli/ink-cli/state/types.d.ts.map +1 -1
  389. package/dist/cli/ink-cli/utils/bracketedPaste.d.ts +22 -0
  390. package/dist/cli/ink-cli/utils/bracketedPaste.d.ts.map +1 -0
  391. package/dist/cli/ink-cli/utils/bracketedPaste.js +27 -0
  392. package/dist/cli/ink-cli/utils/clipboardUtils.d.ts +49 -0
  393. package/dist/cli/ink-cli/utils/clipboardUtils.d.ts.map +1 -0
  394. package/dist/cli/ink-cli/utils/clipboardUtils.js +356 -0
  395. package/dist/cli/ink-cli/utils/commandOverlays.d.ts +33 -0
  396. package/dist/cli/ink-cli/utils/commandOverlays.d.ts.map +1 -0
  397. package/dist/cli/ink-cli/utils/commandOverlays.js +78 -0
  398. package/dist/cli/ink-cli/utils/debugLog.d.ts +38 -0
  399. package/dist/cli/ink-cli/utils/debugLog.d.ts.map +1 -0
  400. package/dist/cli/ink-cli/utils/debugLog.js +66 -0
  401. package/dist/cli/ink-cli/utils/index.d.ts +2 -1
  402. package/dist/cli/ink-cli/utils/index.d.ts.map +1 -1
  403. package/dist/cli/ink-cli/utils/index.js +3 -1
  404. package/dist/cli/ink-cli/utils/input.d.ts +25 -0
  405. package/dist/cli/ink-cli/utils/input.d.ts.map +1 -0
  406. package/dist/cli/ink-cli/utils/input.js +56 -0
  407. package/dist/cli/ink-cli/utils/inputParsing.d.ts +0 -9
  408. package/dist/cli/ink-cli/utils/inputParsing.d.ts.map +1 -1
  409. package/dist/cli/ink-cli/utils/inputParsing.js +0 -27
  410. package/dist/cli/ink-cli/utils/messageFormatting.d.ts +59 -3
  411. package/dist/cli/ink-cli/utils/messageFormatting.d.ts.map +1 -1
  412. package/dist/cli/ink-cli/utils/messageFormatting.js +348 -20
  413. package/dist/cli/ink-cli/utils/mouse.d.ts +61 -0
  414. package/dist/cli/ink-cli/utils/mouse.d.ts.map +1 -0
  415. package/dist/cli/ink-cli/utils/mouse.js +209 -0
  416. package/dist/cli/ink-cli/utils/streamSplitter.d.ts +44 -0
  417. package/dist/cli/ink-cli/utils/streamSplitter.d.ts.map +1 -0
  418. package/dist/cli/ink-cli/utils/streamSplitter.js +154 -0
  419. package/dist/cli/ink-cli/utils/textUtils.d.ts +63 -0
  420. package/dist/cli/ink-cli/utils/textUtils.d.ts.map +1 -0
  421. package/dist/cli/ink-cli/utils/textUtils.js +248 -0
  422. package/dist/cli/ink-cli/utils/toolUtils.d.ts +9 -0
  423. package/dist/cli/ink-cli/utils/toolUtils.d.ts.map +1 -0
  424. package/dist/cli/ink-cli/utils/toolUtils.js +15 -0
  425. package/dist/cli/utils/api-key-setup.d.ts +54 -4
  426. package/dist/cli/utils/api-key-setup.d.ts.map +1 -1
  427. package/dist/cli/utils/api-key-setup.js +433 -107
  428. package/dist/cli/utils/api-key-verification.d.ts +17 -0
  429. package/dist/cli/utils/api-key-verification.d.ts.map +1 -0
  430. package/dist/cli/utils/api-key-verification.js +211 -0
  431. package/dist/cli/utils/config-validation.d.ts +22 -2
  432. package/dist/cli/utils/config-validation.d.ts.map +1 -1
  433. package/dist/cli/utils/config-validation.js +354 -25
  434. package/dist/cli/utils/local-model-setup.d.ts +46 -0
  435. package/dist/cli/utils/local-model-setup.d.ts.map +1 -0
  436. package/dist/cli/utils/local-model-setup.js +662 -0
  437. package/dist/cli/utils/options.d.ts.map +1 -1
  438. package/dist/cli/utils/options.js +1 -3
  439. package/dist/cli/utils/prompt-helpers.d.ts +47 -0
  440. package/dist/cli/utils/prompt-helpers.d.ts.map +1 -0
  441. package/dist/cli/utils/prompt-helpers.js +66 -0
  442. package/dist/cli/utils/provider-setup.d.ts +66 -8
  443. package/dist/cli/utils/provider-setup.d.ts.map +1 -1
  444. package/dist/cli/utils/provider-setup.js +324 -84
  445. package/dist/cli/utils/scaffolding-utils.d.ts +76 -0
  446. package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -0
  447. package/dist/cli/utils/scaffolding-utils.js +246 -0
  448. package/dist/cli/utils/setup-utils.d.ts +16 -0
  449. package/dist/cli/utils/setup-utils.d.ts.map +1 -1
  450. package/dist/cli/utils/setup-utils.js +72 -21
  451. package/dist/cli/utils/template-engine.d.ts +65 -0
  452. package/dist/cli/utils/template-engine.d.ts.map +1 -0
  453. package/dist/cli/utils/template-engine.js +1089 -0
  454. package/dist/config/cli-overrides.d.ts +45 -2
  455. package/dist/config/cli-overrides.d.ts.map +1 -1
  456. package/dist/config/cli-overrides.js +107 -10
  457. package/dist/index.js +379 -99
  458. package/dist/utils/agent-helpers.d.ts +95 -0
  459. package/dist/utils/agent-helpers.d.ts.map +1 -0
  460. package/dist/utils/agent-helpers.js +117 -0
  461. package/dist/webui/assets/index-8j-KMkX1.js +2054 -0
  462. package/dist/webui/assets/index-c_AX24V4.css +1 -0
  463. package/dist/webui/assets/{tanstack-DgxBONJY.js → tanstack-Br79RQ-n.js} +1 -1
  464. package/dist/webui/index.html +4 -10
  465. package/dist/webui/logos/aws-color.svg +1 -0
  466. package/dist/webui/logos/dexto/dexto_logo.svg +1 -1
  467. package/dist/webui/logos/dexto/dexto_logo_light.svg +6 -6
  468. package/dist/webui/logos/glama.svg +7 -0
  469. package/dist/webui/logos/litellm.svg +7 -0
  470. package/dist/webui/logos/openrouter.svg +1 -0
  471. package/package.json +18 -15
  472. package/dist/cli/commands/interactive-commands/index.d.ts +0 -63
  473. package/dist/cli/commands/interactive-commands/index.d.ts.map +0 -1
  474. package/dist/cli/commands/interactive-commands/index.js +0 -73
  475. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts +0 -34
  476. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.d.ts.map +0 -1
  477. package/dist/cli/commands/interactive-commands/mcp/mcp-add-utils.js +0 -178
  478. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts +0 -9
  479. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.d.ts.map +0 -1
  480. package/dist/cli/commands/interactive-commands/mcp/mcp-commands.js +0 -325
  481. package/dist/cli/commands/interactive-commands/model/model-commands.d.ts +0 -21
  482. package/dist/cli/commands/interactive-commands/model/model-commands.d.ts.map +0 -1
  483. package/dist/cli/commands/interactive-commands/model/model-commands.js +0 -190
  484. package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts +0 -26
  485. package/dist/cli/ink-cli/components/MultiLineTextInput.d.ts.map +0 -1
  486. package/dist/cli/ink-cli/components/MultiLineTextInput.js +0 -220
  487. package/dist/discord/bot.d.ts +0 -4
  488. package/dist/discord/bot.d.ts.map +0 -1
  489. package/dist/discord/bot.js +0 -193
  490. package/dist/telegram/bot.d.ts +0 -5
  491. package/dist/telegram/bot.d.ts.map +0 -1
  492. package/dist/telegram/bot.js +0 -251
  493. package/dist/webui/assets/index-DKq5Xng1.js +0 -687
  494. package/dist/webui/assets/index-D_0_GBu5.css +0 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Shared CLI State Hook
3
+ *
4
+ * Contains all common state and logic shared between rendering modes.
5
+ * Both AlternateBufferCLI and StaticCLI use this hook.
6
+ */
7
+ import React from 'react';
8
+ import { type DextoAgent, type QueuedMessage } from '@dexto/core';
9
+ import type { Message, StartupInfo, UIState, InputState, SessionState } from '../state/types.js';
10
+ import type { ApprovalRequest } from '../components/ApprovalPrompt.js';
11
+ import { InputService, MessageService } from '../services/index.js';
12
+ import type { OverlayContainerHandle } from '../containers/OverlayContainer.js';
13
+ import { type TextBuffer } from '../components/shared/text-buffer.js';
14
+ export type { UIState, InputState, SessionState } from '../state/types.js';
15
+ export interface UseCLIStateProps {
16
+ agent: DextoAgent;
17
+ initialSessionId: string | null;
18
+ startupInfo: StartupInfo;
19
+ /** Optional keyboard scroll handler for alternate buffer mode */
20
+ onKeyboardScroll?: (direction: 'up' | 'down') => void;
21
+ }
22
+ export interface CLIStateReturn {
23
+ messages: Message[];
24
+ setMessages: React.Dispatch<React.SetStateAction<Message[]>>;
25
+ pendingMessages: Message[];
26
+ setPendingMessages: React.Dispatch<React.SetStateAction<Message[]>>;
27
+ dequeuedBuffer: Message[];
28
+ setDequeuedBuffer: React.Dispatch<React.SetStateAction<Message[]>>;
29
+ queuedMessages: QueuedMessage[];
30
+ setQueuedMessages: React.Dispatch<React.SetStateAction<QueuedMessage[]>>;
31
+ ui: UIState;
32
+ setUi: React.Dispatch<React.SetStateAction<UIState>>;
33
+ input: InputState;
34
+ setInput: React.Dispatch<React.SetStateAction<InputState>>;
35
+ session: SessionState;
36
+ setSession: React.Dispatch<React.SetStateAction<SessionState>>;
37
+ approval: ApprovalRequest | null;
38
+ setApproval: React.Dispatch<React.SetStateAction<ApprovalRequest | null>>;
39
+ approvalQueue: ApprovalRequest[];
40
+ setApprovalQueue: React.Dispatch<React.SetStateAction<ApprovalRequest[]>>;
41
+ buffer: TextBuffer;
42
+ inputService: InputService;
43
+ messageService: MessageService;
44
+ overlayContainerRef: React.RefObject<OverlayContainerHandle | null>;
45
+ visibleMessages: Message[];
46
+ agent: DextoAgent;
47
+ startupInfo: StartupInfo;
48
+ }
49
+ export declare function useCLIState({ agent, initialSessionId, startupInfo, onKeyboardScroll: _onKeyboardScroll, }: UseCLIStateProps): CLIStateReturn;
50
+ //# sourceMappingURL=useCLIState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCLIState.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/hooks/useCLIState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAuB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAGrF,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,cAAc;IAE3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE7D,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAGpE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAEnE,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1E,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAG1E,MAAM,EAAE,UAAU,CAAC;IAGnB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAG/B,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;IAGpE,eAAe,EAAE,OAAO,EAAE,CAAC;IAG3B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAAE,iBAAiB,GACtC,EAAE,gBAAgB,GAAG,cAAc,CAgMnC"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Shared CLI State Hook
3
+ *
4
+ * Contains all common state and logic shared between rendering modes.
5
+ * Both AlternateBufferCLI and StaticCLI use this hook.
6
+ */
7
+ import { useState, useMemo, useEffect, useRef, useCallback } from 'react';
8
+ import { useStdout } from 'ink';
9
+ import { getModelDisplayName } from '@dexto/core';
10
+ import { useAgentEvents } from './useAgentEvents.js';
11
+ import { useInputOrchestrator } from './useInputOrchestrator.js';
12
+ import { InputService, MessageService } from '../services/index.js';
13
+ import { convertHistoryToUIMessages } from '../utils/messageFormatting.js';
14
+ import { useTextBuffer } from '../components/shared/text-buffer.js';
15
+ export function useCLIState({ agent, initialSessionId, startupInfo, onKeyboardScroll: _onKeyboardScroll, }) {
16
+ // Messages state - finalized messages (rendered in <Static>)
17
+ const [messages, setMessages] = useState([]);
18
+ // Pending messages - streaming/in-progress (rendered dynamically outside <Static>)
19
+ const [pendingMessages, setPendingMessages] = useState([]);
20
+ // Dequeued buffer - user messages rendered after pending (guarantees visual order)
21
+ const [dequeuedBuffer, setDequeuedBuffer] = useState([]);
22
+ // Queued messages - messages waiting to be processed (uses core type)
23
+ const [queuedMessages, setQueuedMessages] = useState([]);
24
+ // UI state
25
+ const [ui, setUi] = useState({
26
+ isProcessing: false,
27
+ isCancelling: false,
28
+ isThinking: false,
29
+ activeOverlay: 'none',
30
+ exitWarningShown: false,
31
+ exitWarningTimestamp: null,
32
+ mcpWizardServerType: null,
33
+ copyModeEnabled: false,
34
+ pendingModelSwitch: null,
35
+ selectedMcpServer: null,
36
+ historySearch: {
37
+ isActive: false,
38
+ query: '',
39
+ matchIndex: 0,
40
+ originalInput: '',
41
+ lastMatch: '',
42
+ },
43
+ promptAddWizard: null,
44
+ autoApproveEdits: false,
45
+ });
46
+ // Input state
47
+ const [input, setInput] = useState({
48
+ value: '',
49
+ history: [],
50
+ historyIndex: -1,
51
+ draftBeforeHistory: '',
52
+ images: [],
53
+ pastedBlocks: [],
54
+ pasteCounter: 0,
55
+ });
56
+ // Session state - use display name for built-in models at startup
57
+ const initialConfig = agent.getCurrentLLMConfig();
58
+ const [session, setSession] = useState({
59
+ id: initialSessionId,
60
+ hasActiveSession: initialSessionId !== null,
61
+ modelName: getModelDisplayName(initialConfig.model, initialConfig.provider),
62
+ });
63
+ // Approval state
64
+ const [approval, setApproval] = useState(null);
65
+ const [approvalQueue, setApprovalQueue] = useState([]);
66
+ // Initialize services (memoized)
67
+ const inputService = useMemo(() => new InputService(), []);
68
+ const messageService = useMemo(() => new MessageService(), []);
69
+ // Get terminal dimensions for buffer
70
+ const { stdout } = useStdout();
71
+ const terminalWidth = stdout?.columns || 80;
72
+ const inputWidth = Math.max(20, terminalWidth - 4);
73
+ // Memoize onChange to prevent infinite loops (useTextBuffer has onChange in deps)
74
+ const handleBufferChange = useCallback((text) => {
75
+ setInput((prev) => ({ ...prev, value: text }));
76
+ }, []);
77
+ // Create text buffer (source of truth for input)
78
+ const buffer = useTextBuffer({
79
+ initialText: '',
80
+ viewport: { width: inputWidth, height: 10 },
81
+ onChange: handleBufferChange,
82
+ });
83
+ // Update viewport on terminal resize
84
+ useEffect(() => {
85
+ buffer.setViewport(inputWidth, 10);
86
+ }, [inputWidth, buffer.setViewport]);
87
+ // Ref for overlay container (input no longer needs ref)
88
+ const overlayContainerRef = useRef(null);
89
+ // Setup event bus subscriptions for non-streaming events
90
+ // (streaming events are handled directly via agent.stream() iterator in InputContainer)
91
+ useAgentEvents({
92
+ agent,
93
+ setMessages,
94
+ setUi,
95
+ setSession,
96
+ setApproval,
97
+ setApprovalQueue,
98
+ setQueuedMessages,
99
+ });
100
+ // Create input handlers for the orchestrator
101
+ // Note: Main input is NOT routed through orchestrator - TextBufferInput handles it directly
102
+ const approvalHandler = useCallback((inputStr, key) => {
103
+ return overlayContainerRef.current?.handleInput(inputStr, key) ?? false;
104
+ }, []);
105
+ const overlayHandler = useCallback((inputStr, key) => {
106
+ return overlayContainerRef.current?.handleInput(inputStr, key) ?? false;
107
+ }, []);
108
+ // Setup unified input orchestrator (handles global shortcuts, approval, overlay only)
109
+ useInputOrchestrator({
110
+ ui,
111
+ approval,
112
+ input,
113
+ session,
114
+ queuedMessages,
115
+ buffer,
116
+ setUi,
117
+ setInput,
118
+ setMessages,
119
+ setPendingMessages,
120
+ setQueuedMessages,
121
+ agent,
122
+ handlers: {
123
+ approval: approvalHandler,
124
+ overlay: overlayHandler,
125
+ },
126
+ });
127
+ // Hydrate conversation history when resuming a session
128
+ useEffect(() => {
129
+ if (!initialSessionId || !session.hasActiveSession || messages.length > 0) {
130
+ return;
131
+ }
132
+ let cancelled = false;
133
+ (async () => {
134
+ try {
135
+ const history = await agent.getSessionHistory(initialSessionId);
136
+ if (!history?.length || cancelled)
137
+ return;
138
+ const historyMessages = convertHistoryToUIMessages(history, initialSessionId);
139
+ setMessages(historyMessages);
140
+ }
141
+ catch (error) {
142
+ if (cancelled)
143
+ return;
144
+ setMessages((prev) => [
145
+ ...prev,
146
+ {
147
+ id: `error-${Date.now()}`,
148
+ role: 'system',
149
+ content: `Error: ${error instanceof Error ? error.message : String(error)}`,
150
+ timestamp: new Date(),
151
+ },
152
+ ]);
153
+ }
154
+ })();
155
+ return () => {
156
+ cancelled = true;
157
+ };
158
+ }, [agent, initialSessionId, messages.length, session.hasActiveSession]);
159
+ // Get visible messages - no limit needed
160
+ // Static mode: items are permanent in terminal scrollback, Ink only renders NEW keys
161
+ // AlternateBuffer mode: VirtualizedList handles its own virtualization
162
+ const visibleMessages = messages;
163
+ return {
164
+ messages,
165
+ setMessages,
166
+ pendingMessages,
167
+ setPendingMessages,
168
+ dequeuedBuffer,
169
+ setDequeuedBuffer,
170
+ queuedMessages,
171
+ setQueuedMessages,
172
+ ui,
173
+ setUi,
174
+ input,
175
+ setInput,
176
+ session,
177
+ setSession,
178
+ approval,
179
+ setApproval,
180
+ approvalQueue,
181
+ setApprovalQueue,
182
+ buffer,
183
+ inputService,
184
+ messageService,
185
+ overlayContainerRef,
186
+ visibleMessages,
187
+ agent,
188
+ startupInfo,
189
+ };
190
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * useElapsedTime Hook
3
+ * Tracks elapsed time during processing with live updates
4
+ */
5
+ export interface ElapsedTimeOptions {
6
+ /** Whether timing is active (should only run during processing) */
7
+ isActive: boolean;
8
+ /** Update interval in milliseconds (default: 100ms) */
9
+ intervalMs?: number;
10
+ }
11
+ export interface ElapsedTimeResult {
12
+ /** Elapsed time in milliseconds */
13
+ elapsedMs: number;
14
+ /** Formatted elapsed time string (e.g., "1.2s", "1m 23s") */
15
+ formatted: string;
16
+ }
17
+ /**
18
+ * Hook that tracks elapsed time during processing
19
+ *
20
+ * @param options - Configuration options
21
+ * @returns Elapsed time in ms and formatted string
22
+ */
23
+ export declare function useElapsedTime({ isActive, intervalMs, }: ElapsedTimeOptions): ElapsedTimeResult;
24
+ //# sourceMappingURL=useElapsedTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useElapsedTime.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/hooks/useElapsedTime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,kBAAkB;IAC/B,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAC9B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;CACrB;AA4BD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,UAAgB,GACnB,EAAE,kBAAkB,GAAG,iBAAiB,CAuCxC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * useElapsedTime Hook
3
+ * Tracks elapsed time during processing with live updates
4
+ */
5
+ import { useState, useEffect, useRef } from 'react';
6
+ /**
7
+ * Format milliseconds into a human-readable string
8
+ * - Under 1 minute: "1.2s"
9
+ * - 1+ minutes: "1m 23s"
10
+ * - 1+ hours: "1h 2m 3s"
11
+ */
12
+ function formatElapsedTime(ms) {
13
+ const seconds = Math.floor(ms / 1000);
14
+ const tenths = Math.floor((ms % 1000) / 100);
15
+ if (seconds < 60) {
16
+ return `${seconds}.${tenths}s`;
17
+ }
18
+ const minutes = Math.floor(seconds / 60);
19
+ const remainingSeconds = seconds % 60;
20
+ if (minutes < 60) {
21
+ return `${minutes}m ${remainingSeconds}s`;
22
+ }
23
+ const hours = Math.floor(minutes / 60);
24
+ const remainingMinutes = minutes % 60;
25
+ return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`;
26
+ }
27
+ /**
28
+ * Hook that tracks elapsed time during processing
29
+ *
30
+ * @param options - Configuration options
31
+ * @returns Elapsed time in ms and formatted string
32
+ */
33
+ export function useElapsedTime({ isActive, intervalMs = 100, }) {
34
+ const [elapsedMs, setElapsedMs] = useState(0);
35
+ const startTimeRef = useRef(null);
36
+ const intervalRef = useRef(null);
37
+ useEffect(() => {
38
+ if (isActive) {
39
+ // Start timing
40
+ startTimeRef.current = Date.now();
41
+ setElapsedMs(0);
42
+ // Update elapsed time at regular intervals
43
+ intervalRef.current = setInterval(() => {
44
+ if (startTimeRef.current !== null) {
45
+ setElapsedMs(Date.now() - startTimeRef.current);
46
+ }
47
+ }, intervalMs);
48
+ }
49
+ else {
50
+ // Stop timing
51
+ if (intervalRef.current) {
52
+ clearInterval(intervalRef.current);
53
+ intervalRef.current = null;
54
+ }
55
+ startTimeRef.current = null;
56
+ setElapsedMs(0);
57
+ }
58
+ return () => {
59
+ if (intervalRef.current) {
60
+ clearInterval(intervalRef.current);
61
+ intervalRef.current = null;
62
+ }
63
+ };
64
+ }, [isActive, intervalMs]);
65
+ return {
66
+ elapsedMs,
67
+ formatted: formatElapsedTime(elapsedMs),
68
+ };
69
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * useHistorySearch - Hook for Ctrl+R reverse history search
3
+ *
4
+ * Manages search state and provides handlers for search operations.
5
+ */
6
+ import { type Dispatch, type SetStateAction } from 'react';
7
+ import type { InputState, UIState } from '../state/types.js';
8
+ import type { TextBuffer } from '../components/shared/text-buffer.js';
9
+ interface UseHistorySearchProps {
10
+ ui: UIState;
11
+ input: InputState;
12
+ buffer: TextBuffer;
13
+ setUi: Dispatch<SetStateAction<UIState>>;
14
+ setInput: Dispatch<SetStateAction<InputState>>;
15
+ }
16
+ interface UseHistorySearchReturn {
17
+ /** Whether search mode is active */
18
+ isActive: boolean;
19
+ /** Current search query */
20
+ query: string;
21
+ /** Current match (or last valid match if no current results) */
22
+ currentMatch: string | null;
23
+ /** Whether there's a match for the current query */
24
+ hasMatch: boolean;
25
+ /** Original input to potentially restore */
26
+ originalInput: string;
27
+ /** Enter search mode */
28
+ enter: () => void;
29
+ /** Exit search mode (keep current input) */
30
+ exit: (showRestoreHint?: boolean) => void;
31
+ /** Cancel search mode (restore original - used by Escape) */
32
+ cancel: () => void;
33
+ /** Update search query */
34
+ updateQuery: (query: string) => void;
35
+ /** Add character to query */
36
+ appendToQuery: (char: string) => void;
37
+ /** Remove last character from query */
38
+ backspace: () => void;
39
+ /** Cycle to next (older) match - Ctrl+R */
40
+ cycleNext: () => void;
41
+ /** Cycle to previous (newer) match - Ctrl+Shift+R */
42
+ cyclePrev: () => void;
43
+ /** Accept current match (for Enter - also exits search mode) */
44
+ accept: () => void;
45
+ /** Handle a keypress - returns true if consumed */
46
+ handleKey: (inputStr: string, key: {
47
+ ctrl: boolean;
48
+ shift: boolean;
49
+ return: boolean;
50
+ backspace: boolean;
51
+ delete: boolean;
52
+ escape: boolean;
53
+ meta: boolean;
54
+ }) => boolean;
55
+ }
56
+ /**
57
+ * Hook for managing reverse history search
58
+ */
59
+ export declare function useHistorySearch({ ui, input, buffer, setUi, setInput, }: UseHistorySearchProps): UseHistorySearchReturn;
60
+ export {};
61
+ //# sourceMappingURL=useHistorySearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHistorySearch.d.ts","sourceRoot":"","sources":["../../../../src/cli/ink-cli/hooks/useHistorySearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAwB,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEtE,UAAU,qBAAqB;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;CAClD;AAED,UAAU,sBAAsB;IAC5B,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,4CAA4C;IAC5C,IAAI,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,6DAA6D;IAC7D,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,0BAA0B;IAC1B,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6BAA6B;IAC7B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,uCAAuC;IACvC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,qDAAqD;IACrD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gEAAgE;IAChE,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,mDAAmD;IACnD,SAAS,EAAE,CACP,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;QACD,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC;KACjB,KACA,OAAO,CAAC;CAChB;AAWD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,EAAE,EACF,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,GACX,EAAE,qBAAqB,GAAG,sBAAsB,CAqPhD"}
@@ -0,0 +1,210 @@
1
+ /**
2
+ * useHistorySearch - Hook for Ctrl+R reverse history search
3
+ *
4
+ * Manages search state and provides handlers for search operations.
5
+ */
6
+ import { useCallback, useMemo } from 'react';
7
+ /**
8
+ * Find matches in history for a query (reversed so newest is first)
9
+ */
10
+ function findMatches(history, query) {
11
+ if (!query)
12
+ return [];
13
+ const lowerQuery = query.toLowerCase();
14
+ return history.filter((item) => item.toLowerCase().includes(lowerQuery)).reverse();
15
+ }
16
+ /**
17
+ * Hook for managing reverse history search
18
+ */
19
+ export function useHistorySearch({ ui, input, buffer, setUi, setInput, }) {
20
+ const { historySearch } = ui;
21
+ const { history } = input;
22
+ // Compute current matches and whether we have a match
23
+ const matches = useMemo(() => findMatches(history, historySearch.query), [history, historySearch.query]);
24
+ const hasMatch = matches.length > 0;
25
+ const currentMatch = hasMatch
26
+ ? matches[Math.min(historySearch.matchIndex, matches.length - 1)] || null
27
+ : historySearch.lastMatch || null;
28
+ // Enter search mode
29
+ const enter = useCallback(() => {
30
+ const currentText = buffer.text;
31
+ setUi((prev) => ({
32
+ ...prev,
33
+ historySearch: {
34
+ isActive: true,
35
+ query: '',
36
+ matchIndex: 0,
37
+ originalInput: currentText,
38
+ lastMatch: '',
39
+ },
40
+ }));
41
+ }, [buffer, setUi]);
42
+ // Exit search mode (keep current input)
43
+ const exit = useCallback(() => {
44
+ setUi((prev) => ({
45
+ ...prev,
46
+ historySearch: {
47
+ isActive: false,
48
+ query: '',
49
+ matchIndex: 0,
50
+ originalInput: '',
51
+ lastMatch: '',
52
+ },
53
+ }));
54
+ }, [setUi]);
55
+ // Cancel search mode (restore original) - kept for potential future use
56
+ const cancel = useCallback(() => {
57
+ const originalInput = historySearch.originalInput;
58
+ buffer.setText(originalInput);
59
+ setInput((prev) => ({ ...prev, value: originalInput }));
60
+ exit();
61
+ }, [historySearch.originalInput, buffer, setInput, exit]);
62
+ // Apply a match to the input buffer
63
+ const applyMatch = useCallback((match) => {
64
+ if (match) {
65
+ buffer.setText(match);
66
+ setInput((prev) => ({ ...prev, value: match }));
67
+ }
68
+ }, [buffer, setInput]);
69
+ // Update query and apply resulting match
70
+ const updateQuery = useCallback((newQuery) => {
71
+ const newMatches = findMatches(history, newQuery);
72
+ const newHasMatch = newMatches.length > 0;
73
+ const newMatch = newHasMatch ? newMatches[0] : null;
74
+ setUi((prev) => ({
75
+ ...prev,
76
+ historySearch: {
77
+ ...prev.historySearch,
78
+ query: newQuery,
79
+ matchIndex: 0,
80
+ // Update lastMatch only if we have a new match
81
+ lastMatch: newMatch || prev.historySearch.lastMatch,
82
+ },
83
+ }));
84
+ // Apply match (or keep last match if no new match)
85
+ if (newMatch) {
86
+ applyMatch(newMatch);
87
+ }
88
+ // If no match, keep whatever is currently in input (the last match)
89
+ }, [history, setUi, applyMatch]);
90
+ // Append character to query
91
+ const appendToQuery = useCallback((char) => {
92
+ updateQuery(historySearch.query + char);
93
+ }, [historySearch.query, updateQuery]);
94
+ // Backspace - remove last character
95
+ const backspace = useCallback(() => {
96
+ if (historySearch.query.length > 0) {
97
+ updateQuery(historySearch.query.slice(0, -1));
98
+ }
99
+ }, [historySearch.query, updateQuery]);
100
+ // Cycle to next (older) match - Ctrl+R
101
+ const cycleNext = useCallback(() => {
102
+ if (matches.length === 0)
103
+ return;
104
+ const newIndex = Math.min(historySearch.matchIndex + 1, matches.length - 1);
105
+ const newMatch = matches[newIndex];
106
+ setUi((prev) => ({
107
+ ...prev,
108
+ historySearch: {
109
+ ...prev.historySearch,
110
+ matchIndex: newIndex,
111
+ lastMatch: newMatch || prev.historySearch.lastMatch,
112
+ },
113
+ }));
114
+ if (newMatch) {
115
+ applyMatch(newMatch);
116
+ }
117
+ }, [matches, historySearch.matchIndex, setUi, applyMatch]);
118
+ // Cycle to previous (newer) match - Ctrl+Shift+R
119
+ const cyclePrev = useCallback(() => {
120
+ if (matches.length === 0)
121
+ return;
122
+ const newIndex = Math.max(0, historySearch.matchIndex - 1);
123
+ const newMatch = matches[newIndex];
124
+ setUi((prev) => ({
125
+ ...prev,
126
+ historySearch: {
127
+ ...prev.historySearch,
128
+ matchIndex: newIndex,
129
+ lastMatch: newMatch || prev.historySearch.lastMatch,
130
+ },
131
+ }));
132
+ if (newMatch) {
133
+ applyMatch(newMatch);
134
+ }
135
+ }, [matches, historySearch.matchIndex, setUi, applyMatch]);
136
+ // Accept current match and exit
137
+ const accept = useCallback(() => {
138
+ // Input already has the match, just exit
139
+ exit();
140
+ }, [exit]);
141
+ // Handle keypress - returns true if consumed
142
+ const handleKey = useCallback((inputStr, key) => {
143
+ if (!historySearch.isActive) {
144
+ // Not in search mode - check if Ctrl+R to enter
145
+ if (key.ctrl && inputStr === 'r') {
146
+ enter();
147
+ return true;
148
+ }
149
+ return false;
150
+ }
151
+ // In search mode - handle all keys
152
+ // Ctrl+E: cycle to previous (newer) match
153
+ if (key.ctrl && inputStr === 'e') {
154
+ cyclePrev();
155
+ return true;
156
+ }
157
+ // Ctrl+R: cycle to next (older) match
158
+ if (key.ctrl && inputStr === 'r') {
159
+ cycleNext();
160
+ return true;
161
+ }
162
+ // Enter: accept match and exit (keep matched text, don't submit)
163
+ if (key.return) {
164
+ accept();
165
+ return true; // Consume - don't submit
166
+ }
167
+ // Escape: restore original and exit
168
+ if (key.escape) {
169
+ cancel();
170
+ return true;
171
+ }
172
+ // Backspace: remove character from query
173
+ if (key.backspace || key.delete) {
174
+ backspace();
175
+ return true;
176
+ }
177
+ // Regular typing: add to query
178
+ if (inputStr && !key.ctrl && !key.meta) {
179
+ appendToQuery(inputStr);
180
+ return true;
181
+ }
182
+ return true; // Consume other keys while in search mode
183
+ }, [
184
+ historySearch.isActive,
185
+ enter,
186
+ cycleNext,
187
+ cyclePrev,
188
+ accept,
189
+ cancel,
190
+ backspace,
191
+ appendToQuery,
192
+ ]);
193
+ return {
194
+ isActive: historySearch.isActive,
195
+ query: historySearch.query,
196
+ currentMatch,
197
+ hasMatch,
198
+ originalInput: historySearch.originalInput,
199
+ enter,
200
+ exit,
201
+ cancel,
202
+ updateQuery,
203
+ appendToQuery,
204
+ backspace,
205
+ cycleNext,
206
+ cyclePrev,
207
+ accept,
208
+ handleKey,
209
+ };
210
+ }