@qwen-code/qwen-code 0.0.9 → 0.0.10-nightly.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/README.md +6 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/commands/mcp/add.js +21 -10
  4. package/dist/src/commands/mcp/add.js.map +1 -1
  5. package/dist/src/commands/mcp/remove.js +2 -2
  6. package/dist/src/commands/mcp/remove.js.map +1 -1
  7. package/dist/src/config/auth.js +8 -7
  8. package/dist/src/config/auth.js.map +1 -1
  9. package/dist/src/config/auth.test.d.ts +6 -0
  10. package/dist/src/config/auth.test.js +57 -0
  11. package/dist/src/config/auth.test.js.map +1 -0
  12. package/dist/src/config/config.d.ts +1 -0
  13. package/dist/src/config/config.js +26 -15
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/config/keyBindings.js +3 -2
  16. package/dist/src/config/keyBindings.js.map +1 -1
  17. package/dist/src/config/keyBindings.test.d.ts +6 -0
  18. package/dist/src/config/keyBindings.test.js +51 -0
  19. package/dist/src/config/keyBindings.test.js.map +1 -0
  20. package/dist/src/config/sandboxConfig.js +3 -3
  21. package/dist/src/config/sandboxConfig.js.map +1 -1
  22. package/dist/src/config/settings.js +50 -46
  23. package/dist/src/config/settings.js.map +1 -1
  24. package/dist/src/config/settingsSchema.d.ts +33 -6
  25. package/dist/src/config/settingsSchema.js +33 -6
  26. package/dist/src/config/settingsSchema.js.map +1 -1
  27. package/dist/src/config/settingsSchema.test.d.ts +6 -0
  28. package/dist/src/config/settingsSchema.test.js +195 -0
  29. package/dist/src/config/settingsSchema.test.js.map +1 -0
  30. package/dist/src/config/trustedFolders.d.ts +2 -1
  31. package/dist/src/config/trustedFolders.js +7 -1
  32. package/dist/src/config/trustedFolders.js.map +1 -1
  33. package/dist/src/config/trustedFolders.test.d.ts +6 -0
  34. package/dist/src/config/trustedFolders.test.js +160 -0
  35. package/dist/src/config/trustedFolders.test.js.map +1 -0
  36. package/dist/src/gemini.js +17 -7
  37. package/dist/src/gemini.js.map +1 -1
  38. package/dist/src/gemini.test.d.ts +6 -0
  39. package/dist/src/gemini.test.js +193 -0
  40. package/dist/src/gemini.test.js.map +1 -0
  41. package/dist/src/generated/git-commit.d.ts +2 -1
  42. package/dist/src/generated/git-commit.js +2 -1
  43. package/dist/src/generated/git-commit.js.map +1 -1
  44. package/dist/src/nonInteractiveCli.js +2 -5
  45. package/dist/src/nonInteractiveCli.js.map +1 -1
  46. package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
  47. package/dist/src/services/BuiltinCommandLoader.test.js +108 -0
  48. package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
  49. package/dist/src/services/CommandService.test.d.ts +6 -0
  50. package/dist/src/services/CommandService.test.js +232 -0
  51. package/dist/src/services/CommandService.test.js.map +1 -0
  52. package/dist/src/services/FileCommandLoader.js +10 -8
  53. package/dist/src/services/FileCommandLoader.js.map +1 -1
  54. package/dist/src/services/McpPromptLoader.js +3 -3
  55. package/dist/src/services/McpPromptLoader.js.map +1 -1
  56. package/dist/src/services/prompt-processors/argumentProcessor.d.ts +2 -7
  57. package/dist/src/services/prompt-processors/argumentProcessor.js +2 -10
  58. package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -1
  59. package/dist/src/services/prompt-processors/shellProcessor.d.ts +16 -13
  60. package/dist/src/services/prompt-processors/shellProcessor.js +125 -40
  61. package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -1
  62. package/dist/src/services/prompt-processors/types.d.ts +2 -0
  63. package/dist/src/services/prompt-processors/types.js +2 -0
  64. package/dist/src/services/prompt-processors/types.js.map +1 -1
  65. package/dist/src/test-utils/customMatchers.d.ts +14 -0
  66. package/dist/src/test-utils/customMatchers.js +46 -0
  67. package/dist/src/test-utils/customMatchers.js.map +1 -0
  68. package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
  69. package/dist/src/test-utils/mockCommandContext.js +87 -0
  70. package/dist/src/test-utils/mockCommandContext.js.map +1 -0
  71. package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
  72. package/dist/src/test-utils/mockCommandContext.test.js +51 -0
  73. package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
  74. package/dist/src/test-utils/render.d.ts +8 -0
  75. package/dist/src/test-utils/render.js +10 -0
  76. package/dist/src/test-utils/render.js.map +1 -0
  77. package/dist/src/ui/App.js +52 -20
  78. package/dist/src/ui/App.js.map +1 -1
  79. package/dist/src/ui/IdeIntegrationNudge.js +3 -3
  80. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  81. package/dist/src/ui/commands/aboutCommand.js +9 -5
  82. package/dist/src/ui/commands/aboutCommand.js.map +1 -1
  83. package/dist/src/ui/commands/bugCommand.js +13 -5
  84. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  85. package/dist/src/ui/commands/chatCommand.js +8 -6
  86. package/dist/src/ui/commands/chatCommand.js.map +1 -1
  87. package/dist/src/ui/commands/clearCommand.js +0 -1
  88. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  89. package/dist/src/ui/commands/docsCommand.js +1 -1
  90. package/dist/src/ui/commands/docsCommand.js.map +1 -1
  91. package/dist/src/ui/commands/ideCommand.js +29 -11
  92. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  93. package/dist/src/ui/commands/mcpCommand.js +6 -6
  94. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  95. package/dist/src/ui/commands/setupGithubCommand.d.ts +2 -0
  96. package/dist/src/ui/commands/setupGithubCommand.js +47 -8
  97. package/dist/src/ui/commands/setupGithubCommand.js.map +1 -1
  98. package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
  99. package/dist/src/ui/commands/setupGithubCommand.test.js +167 -0
  100. package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
  101. package/dist/src/ui/commands/toolsCommand.js +1 -1
  102. package/dist/src/ui/commands/toolsCommand.js.map +1 -1
  103. package/dist/src/ui/commands/types.d.ts +0 -1
  104. package/dist/src/ui/commands/types.js.map +1 -1
  105. package/dist/src/ui/components/AboutBox.d.ts +1 -0
  106. package/dist/src/ui/components/AboutBox.js +1 -1
  107. package/dist/src/ui/components/AboutBox.js.map +1 -1
  108. package/dist/src/ui/components/AuthDialog.js +5 -4
  109. package/dist/src/ui/components/AuthDialog.js.map +1 -1
  110. package/dist/src/ui/components/AuthDialog.test.d.ts +6 -0
  111. package/dist/src/ui/components/AuthDialog.test.js +220 -0
  112. package/dist/src/ui/components/AuthDialog.test.js.map +1 -0
  113. package/dist/src/ui/components/ContextSummaryDisplay.js +1 -1
  114. package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
  115. package/dist/src/ui/components/FolderTrustDialog.test.js +26 -0
  116. package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
  117. package/dist/src/ui/components/Footer.d.ts +1 -0
  118. package/dist/src/ui/components/Footer.js +3 -2
  119. package/dist/src/ui/components/Footer.js.map +1 -1
  120. package/dist/src/ui/components/Header.test.d.ts +6 -0
  121. package/dist/src/ui/components/Header.test.js +37 -0
  122. package/dist/src/ui/components/Header.test.js.map +1 -0
  123. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  124. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  125. package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
  126. package/dist/src/ui/components/HistoryItemDisplay.test.js +91 -0
  127. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
  128. package/dist/src/ui/components/InputPrompt.js +5 -4
  129. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  130. package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
  131. package/dist/src/ui/components/LoadingIndicator.test.js +190 -0
  132. package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
  133. package/dist/src/ui/components/OpenAIKeyPrompt.test.d.ts +6 -0
  134. package/dist/src/ui/components/OpenAIKeyPrompt.test.js +44 -0
  135. package/dist/src/ui/components/OpenAIKeyPrompt.test.js.map +1 -0
  136. package/dist/src/ui/components/QwenOAuthProgress.test.d.ts +6 -0
  137. package/dist/src/ui/components/QwenOAuthProgress.test.js +292 -0
  138. package/dist/src/ui/components/QwenOAuthProgress.test.js.map +1 -0
  139. package/dist/src/ui/components/SettingsDialog.js +332 -62
  140. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  141. package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
  142. package/dist/src/ui/components/SettingsDialog.test.js +568 -0
  143. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
  144. package/dist/src/ui/components/ShellConfirmationDialog.js +2 -1
  145. package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
  146. package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
  147. package/dist/src/ui/components/ShellConfirmationDialog.test.js +40 -0
  148. package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
  149. package/dist/src/ui/components/StatsDisplay.js +8 -7
  150. package/dist/src/ui/components/StatsDisplay.js.map +1 -1
  151. package/dist/src/ui/components/TodoDisplay.d.ts +16 -0
  152. package/dist/src/ui/components/TodoDisplay.js +27 -0
  153. package/dist/src/ui/components/TodoDisplay.js.map +1 -0
  154. package/dist/src/ui/components/TodoDisplay.test.d.ts +6 -0
  155. package/dist/src/ui/components/TodoDisplay.test.js +77 -0
  156. package/dist/src/ui/components/TodoDisplay.test.js.map +1 -0
  157. package/dist/src/ui/components/messages/DiffRenderer.js +10 -1
  158. package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -1
  159. package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
  160. package/dist/src/ui/components/messages/DiffRenderer.test.js +239 -0
  161. package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
  162. package/dist/src/ui/components/messages/InfoMessage.js +2 -1
  163. package/dist/src/ui/components/messages/InfoMessage.js.map +1 -1
  164. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +2 -1
  165. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  166. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
  167. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +37 -0
  168. package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
  169. package/dist/src/ui/components/messages/ToolMessage.js +58 -8
  170. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  171. package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
  172. package/dist/src/ui/components/messages/ToolMessage.test.js +118 -0
  173. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
  174. package/dist/src/ui/components/shared/MaxSizedBox.js +1 -1
  175. package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -1
  176. package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
  177. package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
  178. package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
  179. package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
  180. package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
  181. package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
  182. package/dist/src/ui/components/shared/RadioButtonSelect.test.js +111 -0
  183. package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
  184. package/dist/src/ui/components/shared/text-buffer.js +6 -0
  185. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  186. package/dist/src/ui/contexts/KeypressContext.d.ts +30 -0
  187. package/dist/src/ui/contexts/KeypressContext.js +331 -0
  188. package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
  189. package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
  190. package/dist/src/ui/contexts/KeypressContext.test.js +275 -0
  191. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -0
  192. package/dist/src/ui/contexts/SessionContext.d.ts +3 -1
  193. package/dist/src/ui/contexts/SessionContext.js +3 -11
  194. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  195. package/dist/src/ui/hooks/atCommandProcessor.js +10 -12
  196. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  197. package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
  198. package/dist/src/ui/hooks/atCommandProcessor.test.js +824 -0
  199. package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
  200. package/dist/src/ui/hooks/shellCommandProcessor.js +8 -13
  201. package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -1
  202. package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
  203. package/dist/src/ui/hooks/shellCommandProcessor.test.js +328 -0
  204. package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
  205. package/dist/src/ui/hooks/slashCommandProcessor.js +21 -11
  206. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  207. package/dist/src/ui/hooks/useAtCompletion.js +3 -5
  208. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  209. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
  210. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +191 -0
  211. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
  212. package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
  213. package/dist/src/ui/hooks/useEditorSettings.test.js +164 -0
  214. package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
  215. package/dist/src/ui/hooks/useFolderTrust.d.ts +2 -2
  216. package/dist/src/ui/hooks/useFolderTrust.js +23 -5
  217. package/dist/src/ui/hooks/useFolderTrust.js.map +1 -1
  218. package/dist/src/ui/hooks/useGeminiStream.js +2 -0
  219. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  220. package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
  221. package/dist/src/ui/hooks/useGitBranchName.test.js +175 -0
  222. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
  223. package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
  224. package/dist/src/ui/hooks/useHistoryManager.test.js +171 -0
  225. package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
  226. package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
  227. package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
  228. package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
  229. package/dist/src/ui/hooks/useKeypress.d.ts +4 -24
  230. package/dist/src/ui/hooks/useKeypress.js +9 -330
  231. package/dist/src/ui/hooks/useKeypress.js.map +1 -1
  232. package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
  233. package/dist/src/ui/hooks/useLoadingIndicator.test.js +91 -0
  234. package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
  235. package/dist/src/ui/hooks/useMessageQueue.d.ts +22 -0
  236. package/dist/src/ui/hooks/useMessageQueue.js +49 -0
  237. package/dist/src/ui/hooks/useMessageQueue.js.map +1 -0
  238. package/dist/src/ui/hooks/useMessageQueue.test.d.ts +6 -0
  239. package/dist/src/ui/hooks/useMessageQueue.test.js +158 -0
  240. package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -0
  241. package/dist/src/ui/hooks/usePrivacySettings.js +6 -2
  242. package/dist/src/ui/hooks/usePrivacySettings.js.map +1 -1
  243. package/dist/src/ui/hooks/usePrivacySettings.test.d.ts +6 -0
  244. package/dist/src/ui/hooks/usePrivacySettings.test.js +154 -0
  245. package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -0
  246. package/dist/src/ui/hooks/useQwenAuth.test.d.ts +6 -0
  247. package/dist/src/ui/hooks/useQwenAuth.test.js +288 -0
  248. package/dist/src/ui/hooks/useQwenAuth.test.js.map +1 -0
  249. package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
  250. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
  251. package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
  252. package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
  253. package/dist/src/ui/hooks/useShellHistory.test.js +162 -0
  254. package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
  255. package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +6 -0
  256. package/dist/src/ui/hooks/useSlashCompletion.test.js +272 -0
  257. package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
  258. package/dist/src/ui/hooks/useThemeCommand.js +1 -1
  259. package/dist/src/ui/hooks/useThemeCommand.js.map +1 -1
  260. package/dist/src/ui/hooks/useTimer.test.d.ts +6 -0
  261. package/dist/src/ui/hooks/useTimer.test.js +90 -0
  262. package/dist/src/ui/hooks/useTimer.test.js.map +1 -0
  263. package/dist/src/ui/hooks/useToolScheduler.test.d.ts +6 -0
  264. package/dist/src/ui/hooks/useToolScheduler.test.js +846 -0
  265. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -0
  266. package/dist/src/ui/keyMatchers.test.d.ts +6 -0
  267. package/dist/src/ui/keyMatchers.test.js +276 -0
  268. package/dist/src/ui/keyMatchers.test.js.map +1 -0
  269. package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
  270. package/dist/src/ui/themes/color-utils.test.js +197 -0
  271. package/dist/src/ui/themes/color-utils.test.js.map +1 -0
  272. package/dist/src/ui/themes/theme-manager.js +1 -1
  273. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  274. package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
  275. package/dist/src/ui/themes/theme-manager.test.js +83 -0
  276. package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
  277. package/dist/src/ui/types.d.ts +2 -0
  278. package/dist/src/ui/types.js.map +1 -1
  279. package/dist/src/ui/utils/CodeColorizer.js +1 -1
  280. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  281. package/dist/src/ui/utils/InlineMarkdownRenderer.js +8 -1
  282. package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -1
  283. package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
  284. package/dist/src/ui/utils/MarkdownDisplay.test.js +151 -0
  285. package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
  286. package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
  287. package/dist/src/ui/utils/clipboardUtils.test.js +65 -0
  288. package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
  289. package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
  290. package/dist/src/ui/utils/commandUtils.test.js +294 -0
  291. package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
  292. package/dist/src/ui/utils/computeStats.js +3 -1
  293. package/dist/src/ui/utils/computeStats.js.map +1 -1
  294. package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
  295. package/dist/src/ui/utils/displayUtils.test.js +42 -0
  296. package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
  297. package/dist/src/ui/utils/formatters.test.d.ts +6 -0
  298. package/dist/src/ui/utils/formatters.test.js +56 -0
  299. package/dist/src/ui/utils/formatters.test.js.map +1 -0
  300. package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
  301. package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
  302. package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
  303. package/dist/src/ui/utils/platformConstants.d.ts +7 -0
  304. package/dist/src/ui/utils/platformConstants.js +7 -0
  305. package/dist/src/ui/utils/platformConstants.js.map +1 -1
  306. package/dist/src/ui/utils/terminalSetup.js +7 -7
  307. package/dist/src/ui/utils/terminalSetup.js.map +1 -1
  308. package/dist/src/ui/utils/updateCheck.js +1 -1
  309. package/dist/src/ui/utils/updateCheck.js.map +1 -1
  310. package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
  311. package/dist/src/ui/utils/updateCheck.test.js +145 -0
  312. package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
  313. package/dist/src/utils/gitUtils.test.d.ts +6 -0
  314. package/dist/src/utils/gitUtils.test.js +113 -0
  315. package/dist/src/utils/gitUtils.test.js.map +1 -0
  316. package/dist/src/utils/installationInfo.test.d.ts +6 -0
  317. package/dist/src/utils/installationInfo.test.js +242 -0
  318. package/dist/src/utils/installationInfo.test.js.map +1 -0
  319. package/dist/src/utils/readStdin.js +10 -0
  320. package/dist/src/utils/readStdin.js.map +1 -1
  321. package/dist/src/utils/sandbox.js +70 -68
  322. package/dist/src/utils/sandbox.js.map +1 -1
  323. package/dist/src/utils/settingsUtils.d.ts +8 -0
  324. package/dist/src/utils/settingsUtils.js +16 -7
  325. package/dist/src/utils/settingsUtils.js.map +1 -1
  326. package/dist/src/utils/settingsUtils.test.d.ts +6 -0
  327. package/dist/src/utils/settingsUtils.test.js +514 -0
  328. package/dist/src/utils/settingsUtils.test.js.map +1 -0
  329. package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
  330. package/dist/src/utils/userStartupWarnings.test.js +67 -0
  331. package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
  332. package/dist/src/utils/version.js +1 -1
  333. package/dist/src/utils/version.js.map +1 -1
  334. package/dist/src/validateNonInterActiveAuth.js +4 -4
  335. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  336. package/dist/src/zed-integration/fileSystemService.d.ts +19 -0
  337. package/dist/src/zed-integration/fileSystemService.js +43 -0
  338. package/dist/src/zed-integration/fileSystemService.js.map +1 -0
  339. package/dist/src/zed-integration/schema.d.ts +446 -343
  340. package/dist/src/zed-integration/schema.js +7 -1
  341. package/dist/src/zed-integration/schema.js.map +1 -1
  342. package/dist/src/zed-integration/zedIntegration.js +219 -145
  343. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  344. package/dist/tsconfig.tsbuildinfo +1 -1
  345. package/package.json +3 -3
@@ -0,0 +1,331 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { KittySequenceOverflowEvent, logKittySequenceOverflow, } from '@qwen-code/qwen-code-core';
8
+ import { useStdin } from 'ink';
9
+ import { createContext, useCallback, useContext, useEffect, useRef, } from 'react';
10
+ import readline from 'readline';
11
+ import { PassThrough } from 'stream';
12
+ import { BACKSLASH_ENTER_DETECTION_WINDOW_MS, KITTY_CTRL_C, KITTY_KEYCODE_BACKSPACE, KITTY_KEYCODE_ENTER, KITTY_KEYCODE_NUMPAD_ENTER, KITTY_KEYCODE_TAB, MAX_KITTY_SEQUENCE_LENGTH, } from '../utils/platformConstants.js';
13
+ import { FOCUS_IN, FOCUS_OUT } from '../hooks/useFocus.js';
14
+ const ESC = '\u001B';
15
+ export const PASTE_MODE_PREFIX = `${ESC}[200~`;
16
+ export const PASTE_MODE_SUFFIX = `${ESC}[201~`;
17
+ const KeypressContext = createContext(undefined);
18
+ export function useKeypressContext() {
19
+ const context = useContext(KeypressContext);
20
+ if (!context) {
21
+ throw new Error('useKeypressContext must be used within a KeypressProvider');
22
+ }
23
+ return context;
24
+ }
25
+ export function KeypressProvider({ children, kittyProtocolEnabled, config, }) {
26
+ const { stdin, setRawMode } = useStdin();
27
+ const subscribers = useRef(new Set()).current;
28
+ const subscribe = useCallback((handler) => {
29
+ subscribers.add(handler);
30
+ }, [subscribers]);
31
+ const unsubscribe = useCallback((handler) => {
32
+ subscribers.delete(handler);
33
+ }, [subscribers]);
34
+ useEffect(() => {
35
+ setRawMode(true);
36
+ const keypressStream = new PassThrough();
37
+ let usePassthrough = false;
38
+ const nodeMajorVersion = parseInt(process.versions.node.split('.')[0], 10);
39
+ if (nodeMajorVersion < 20 ||
40
+ process.env['PASTE_WORKAROUND'] === '1' ||
41
+ process.env['PASTE_WORKAROUND'] === 'true') {
42
+ usePassthrough = true;
43
+ }
44
+ let isPaste = false;
45
+ let pasteBuffer = Buffer.alloc(0);
46
+ let kittySequenceBuffer = '';
47
+ let backslashTimeout = null;
48
+ let waitingForEnterAfterBackslash = false;
49
+ const parseKittySequence = (sequence) => {
50
+ const kittyPattern = new RegExp(`^${ESC}\\[(\\d+)(;(\\d+))?([u~])$`);
51
+ const match = sequence.match(kittyPattern);
52
+ if (!match)
53
+ return null;
54
+ const keyCode = parseInt(match[1], 10);
55
+ const modifiers = match[3] ? parseInt(match[3], 10) : 1;
56
+ const modifierBits = modifiers - 1;
57
+ const shift = (modifierBits & 1) === 1;
58
+ const alt = (modifierBits & 2) === 2;
59
+ const ctrl = (modifierBits & 4) === 4;
60
+ if (keyCode === 27) {
61
+ return {
62
+ name: 'escape',
63
+ ctrl,
64
+ meta: alt,
65
+ shift,
66
+ paste: false,
67
+ sequence,
68
+ kittyProtocol: true,
69
+ };
70
+ }
71
+ if (keyCode === KITTY_KEYCODE_TAB) {
72
+ return {
73
+ name: 'tab',
74
+ ctrl,
75
+ meta: alt,
76
+ shift,
77
+ paste: false,
78
+ sequence,
79
+ kittyProtocol: true,
80
+ };
81
+ }
82
+ if (keyCode === KITTY_KEYCODE_BACKSPACE) {
83
+ return {
84
+ name: 'backspace',
85
+ ctrl,
86
+ meta: alt,
87
+ shift,
88
+ paste: false,
89
+ sequence,
90
+ kittyProtocol: true,
91
+ };
92
+ }
93
+ if (keyCode === KITTY_KEYCODE_ENTER ||
94
+ keyCode === KITTY_KEYCODE_NUMPAD_ENTER) {
95
+ return {
96
+ name: 'return',
97
+ ctrl,
98
+ meta: alt,
99
+ shift,
100
+ paste: false,
101
+ sequence,
102
+ kittyProtocol: true,
103
+ };
104
+ }
105
+ if (keyCode >= 97 && keyCode <= 122 && ctrl) {
106
+ const letter = String.fromCharCode(keyCode);
107
+ return {
108
+ name: letter,
109
+ ctrl: true,
110
+ meta: alt,
111
+ shift,
112
+ paste: false,
113
+ sequence,
114
+ kittyProtocol: true,
115
+ };
116
+ }
117
+ return null;
118
+ };
119
+ const broadcast = (key) => {
120
+ for (const handler of subscribers) {
121
+ handler(key);
122
+ }
123
+ };
124
+ const handleKeypress = (_, key) => {
125
+ if (key.name === 'paste-start') {
126
+ isPaste = true;
127
+ return;
128
+ }
129
+ if (key.name === 'paste-end') {
130
+ isPaste = false;
131
+ broadcast({
132
+ name: '',
133
+ ctrl: false,
134
+ meta: false,
135
+ shift: false,
136
+ paste: true,
137
+ sequence: pasteBuffer.toString(),
138
+ });
139
+ pasteBuffer = Buffer.alloc(0);
140
+ return;
141
+ }
142
+ if (isPaste) {
143
+ pasteBuffer = Buffer.concat([pasteBuffer, Buffer.from(key.sequence)]);
144
+ return;
145
+ }
146
+ if (key.name === 'return' && waitingForEnterAfterBackslash) {
147
+ if (backslashTimeout) {
148
+ clearTimeout(backslashTimeout);
149
+ backslashTimeout = null;
150
+ }
151
+ waitingForEnterAfterBackslash = false;
152
+ broadcast({
153
+ ...key,
154
+ shift: true,
155
+ sequence: '\r', // Corrected escaping for newline
156
+ });
157
+ return;
158
+ }
159
+ if (key.sequence === '\\' && !key.name) {
160
+ // Corrected escaping for backslash
161
+ waitingForEnterAfterBackslash = true;
162
+ backslashTimeout = setTimeout(() => {
163
+ waitingForEnterAfterBackslash = false;
164
+ backslashTimeout = null;
165
+ broadcast(key);
166
+ }, BACKSLASH_ENTER_DETECTION_WINDOW_MS);
167
+ return;
168
+ }
169
+ if (waitingForEnterAfterBackslash && key.name !== 'return') {
170
+ if (backslashTimeout) {
171
+ clearTimeout(backslashTimeout);
172
+ backslashTimeout = null;
173
+ }
174
+ waitingForEnterAfterBackslash = false;
175
+ broadcast({
176
+ name: '',
177
+ sequence: '\\',
178
+ ctrl: false,
179
+ meta: false,
180
+ shift: false,
181
+ paste: false,
182
+ });
183
+ }
184
+ if (['up', 'down', 'left', 'right'].includes(key.name)) {
185
+ broadcast(key);
186
+ return;
187
+ }
188
+ if ((key.ctrl && key.name === 'c') ||
189
+ key.sequence === `${ESC}${KITTY_CTRL_C}`) {
190
+ kittySequenceBuffer = '';
191
+ if (key.sequence === `${ESC}${KITTY_CTRL_C}`) {
192
+ broadcast({
193
+ name: 'c',
194
+ ctrl: true,
195
+ meta: false,
196
+ shift: false,
197
+ paste: false,
198
+ sequence: key.sequence,
199
+ kittyProtocol: true,
200
+ });
201
+ }
202
+ else {
203
+ broadcast(key);
204
+ }
205
+ return;
206
+ }
207
+ if (kittyProtocolEnabled) {
208
+ if (kittySequenceBuffer ||
209
+ (key.sequence.startsWith(`${ESC}[`) &&
210
+ !key.sequence.startsWith(PASTE_MODE_PREFIX) &&
211
+ !key.sequence.startsWith(PASTE_MODE_SUFFIX) &&
212
+ !key.sequence.startsWith(FOCUS_IN) &&
213
+ !key.sequence.startsWith(FOCUS_OUT))) {
214
+ kittySequenceBuffer += key.sequence;
215
+ const kittyKey = parseKittySequence(kittySequenceBuffer);
216
+ if (kittyKey) {
217
+ kittySequenceBuffer = '';
218
+ broadcast(kittyKey);
219
+ return;
220
+ }
221
+ if (config?.getDebugMode()) {
222
+ const codes = Array.from(kittySequenceBuffer).map((ch) => ch.charCodeAt(0));
223
+ console.warn('Kitty sequence buffer has char codes:', codes);
224
+ }
225
+ if (kittySequenceBuffer.length > MAX_KITTY_SEQUENCE_LENGTH) {
226
+ if (config) {
227
+ const event = new KittySequenceOverflowEvent(kittySequenceBuffer.length, kittySequenceBuffer);
228
+ logKittySequenceOverflow(config, event);
229
+ }
230
+ kittySequenceBuffer = '';
231
+ }
232
+ else {
233
+ return;
234
+ }
235
+ }
236
+ }
237
+ if (key.name === 'return' && key.sequence === `${ESC}\r`) {
238
+ key.meta = true;
239
+ }
240
+ broadcast({ ...key, paste: isPaste });
241
+ };
242
+ const handleRawKeypress = (data) => {
243
+ const pasteModePrefixBuffer = Buffer.from(PASTE_MODE_PREFIX);
244
+ const pasteModeSuffixBuffer = Buffer.from(PASTE_MODE_SUFFIX);
245
+ let pos = 0;
246
+ while (pos < data.length) {
247
+ const prefixPos = data.indexOf(pasteModePrefixBuffer, pos);
248
+ const suffixPos = data.indexOf(pasteModeSuffixBuffer, pos);
249
+ const isPrefixNext = prefixPos !== -1 && (suffixPos === -1 || prefixPos < suffixPos);
250
+ const isSuffixNext = suffixPos !== -1 && (prefixPos === -1 || suffixPos < prefixPos);
251
+ let nextMarkerPos = -1;
252
+ let markerLength = 0;
253
+ if (isPrefixNext) {
254
+ nextMarkerPos = prefixPos;
255
+ }
256
+ else if (isSuffixNext) {
257
+ nextMarkerPos = suffixPos;
258
+ }
259
+ markerLength = pasteModeSuffixBuffer.length;
260
+ if (nextMarkerPos === -1) {
261
+ keypressStream.write(data.slice(pos));
262
+ return;
263
+ }
264
+ const nextData = data.slice(pos, nextMarkerPos);
265
+ if (nextData.length > 0) {
266
+ keypressStream.write(nextData);
267
+ }
268
+ const createPasteKeyEvent = (name) => ({
269
+ name,
270
+ ctrl: false,
271
+ meta: false,
272
+ shift: false,
273
+ paste: false,
274
+ sequence: '',
275
+ });
276
+ if (isPrefixNext) {
277
+ handleKeypress(undefined, createPasteKeyEvent('paste-start'));
278
+ }
279
+ else if (isSuffixNext) {
280
+ handleKeypress(undefined, createPasteKeyEvent('paste-end'));
281
+ }
282
+ pos = nextMarkerPos + markerLength;
283
+ }
284
+ };
285
+ let rl;
286
+ if (usePassthrough) {
287
+ rl = readline.createInterface({
288
+ input: keypressStream,
289
+ escapeCodeTimeout: 0,
290
+ });
291
+ readline.emitKeypressEvents(keypressStream, rl);
292
+ keypressStream.on('keypress', handleKeypress);
293
+ stdin.on('data', handleRawKeypress);
294
+ }
295
+ else {
296
+ rl = readline.createInterface({ input: stdin, escapeCodeTimeout: 0 });
297
+ readline.emitKeypressEvents(stdin, rl);
298
+ stdin.on('keypress', handleKeypress);
299
+ }
300
+ return () => {
301
+ if (usePassthrough) {
302
+ keypressStream.removeListener('keypress', handleKeypress);
303
+ stdin.removeListener('data', handleRawKeypress);
304
+ }
305
+ else {
306
+ stdin.removeListener('keypress', handleKeypress);
307
+ }
308
+ rl.close();
309
+ // Restore the terminal to its original state.
310
+ setRawMode(false);
311
+ if (backslashTimeout) {
312
+ clearTimeout(backslashTimeout);
313
+ backslashTimeout = null;
314
+ }
315
+ // Flush any pending paste data to avoid data loss on exit.
316
+ if (isPaste) {
317
+ broadcast({
318
+ name: '',
319
+ ctrl: false,
320
+ meta: false,
321
+ shift: false,
322
+ paste: true,
323
+ sequence: pasteBuffer.toString(),
324
+ });
325
+ pasteBuffer = Buffer.alloc(0);
326
+ }
327
+ };
328
+ }, [stdin, setRawMode, kittyProtocolEnabled, config, subscribers]);
329
+ return (_jsx(KeypressContext.Provider, { value: { subscribe, unsubscribe }, children: children }));
330
+ }
331
+ //# sourceMappingURL=KeypressContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeypressContext.js","sourceRoot":"","sources":["../../../../src/ui/contexts/KeypressContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,275 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { renderHook, act, waitFor } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { KeypressProvider, useKeypressContext, } from './KeypressContext.js';
5
+ import { useStdin } from 'ink';
6
+ import { EventEmitter } from 'events';
7
+ import { KITTY_KEYCODE_ENTER, KITTY_KEYCODE_NUMPAD_ENTER, KITTY_KEYCODE_TAB, KITTY_KEYCODE_BACKSPACE, } from '../utils/platformConstants.js';
8
+ // Mock the 'ink' module to control stdin
9
+ vi.mock('ink', async (importOriginal) => {
10
+ const original = await importOriginal();
11
+ return {
12
+ ...original,
13
+ useStdin: vi.fn(),
14
+ };
15
+ });
16
+ class MockStdin extends EventEmitter {
17
+ isTTY = true;
18
+ setRawMode = vi.fn();
19
+ on = this.addListener;
20
+ removeListener = super.removeListener;
21
+ write = vi.fn();
22
+ resume = vi.fn();
23
+ pause = vi.fn();
24
+ // Helper to simulate a keypress event
25
+ pressKey(key) {
26
+ this.emit('keypress', null, key);
27
+ }
28
+ // Helper to simulate a kitty protocol sequence
29
+ sendKittySequence(sequence) {
30
+ this.emit('data', Buffer.from(sequence));
31
+ }
32
+ // Helper to simulate a paste event
33
+ sendPaste(text) {
34
+ const PASTE_MODE_PREFIX = `\x1b[200~`;
35
+ const PASTE_MODE_SUFFIX = `\x1b[201~`;
36
+ this.emit('data', Buffer.from(PASTE_MODE_PREFIX));
37
+ this.emit('data', Buffer.from(text));
38
+ this.emit('data', Buffer.from(PASTE_MODE_SUFFIX));
39
+ }
40
+ }
41
+ describe('KeypressContext - Kitty Protocol', () => {
42
+ let stdin;
43
+ const mockSetRawMode = vi.fn();
44
+ const wrapper = ({ children, kittyProtocolEnabled = true, }) => (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolEnabled, children: children }));
45
+ beforeEach(() => {
46
+ vi.clearAllMocks();
47
+ stdin = new MockStdin();
48
+ useStdin.mockReturnValue({
49
+ stdin,
50
+ setRawMode: mockSetRawMode,
51
+ });
52
+ });
53
+ describe('Enter key handling', () => {
54
+ it('should recognize regular enter key (keycode 13) in kitty protocol', async () => {
55
+ const keyHandler = vi.fn();
56
+ const { result } = renderHook(() => useKeypressContext(), {
57
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
58
+ });
59
+ act(() => {
60
+ result.current.subscribe(keyHandler);
61
+ });
62
+ // Send kitty protocol sequence for regular enter: ESC[13u
63
+ act(() => {
64
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_ENTER}u`);
65
+ });
66
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
67
+ name: 'return',
68
+ kittyProtocol: true,
69
+ ctrl: false,
70
+ meta: false,
71
+ shift: false,
72
+ }));
73
+ });
74
+ it('should recognize numpad enter key (keycode 57414) in kitty protocol', async () => {
75
+ const keyHandler = vi.fn();
76
+ const { result } = renderHook(() => useKeypressContext(), {
77
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
78
+ });
79
+ act(() => {
80
+ result.current.subscribe(keyHandler);
81
+ });
82
+ // Send kitty protocol sequence for numpad enter: ESC[57414u
83
+ act(() => {
84
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_NUMPAD_ENTER}u`);
85
+ });
86
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
87
+ name: 'return',
88
+ kittyProtocol: true,
89
+ ctrl: false,
90
+ meta: false,
91
+ shift: false,
92
+ }));
93
+ });
94
+ it('should handle numpad enter with modifiers', async () => {
95
+ const keyHandler = vi.fn();
96
+ const { result } = renderHook(() => useKeypressContext(), {
97
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
98
+ });
99
+ act(() => {
100
+ result.current.subscribe(keyHandler);
101
+ });
102
+ // Send kitty protocol sequence for numpad enter with Shift (modifier 2): ESC[57414;2u
103
+ act(() => {
104
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_NUMPAD_ENTER};2u`);
105
+ });
106
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
107
+ name: 'return',
108
+ kittyProtocol: true,
109
+ ctrl: false,
110
+ meta: false,
111
+ shift: true,
112
+ }));
113
+ });
114
+ it('should handle numpad enter with Ctrl modifier', async () => {
115
+ const keyHandler = vi.fn();
116
+ const { result } = renderHook(() => useKeypressContext(), {
117
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
118
+ });
119
+ act(() => {
120
+ result.current.subscribe(keyHandler);
121
+ });
122
+ // Send kitty protocol sequence for numpad enter with Ctrl (modifier 5): ESC[57414;5u
123
+ act(() => {
124
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_NUMPAD_ENTER};5u`);
125
+ });
126
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
127
+ name: 'return',
128
+ kittyProtocol: true,
129
+ ctrl: true,
130
+ meta: false,
131
+ shift: false,
132
+ }));
133
+ });
134
+ it('should handle numpad enter with Alt modifier', async () => {
135
+ const keyHandler = vi.fn();
136
+ const { result } = renderHook(() => useKeypressContext(), {
137
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
138
+ });
139
+ act(() => {
140
+ result.current.subscribe(keyHandler);
141
+ });
142
+ // Send kitty protocol sequence for numpad enter with Alt (modifier 3): ESC[57414;3u
143
+ act(() => {
144
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_NUMPAD_ENTER};3u`);
145
+ });
146
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
147
+ name: 'return',
148
+ kittyProtocol: true,
149
+ ctrl: false,
150
+ meta: true,
151
+ shift: false,
152
+ }));
153
+ });
154
+ it('should not process kitty sequences when kitty protocol is disabled', async () => {
155
+ const keyHandler = vi.fn();
156
+ const { result } = renderHook(() => useKeypressContext(), {
157
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: false }),
158
+ });
159
+ act(() => {
160
+ result.current.subscribe(keyHandler);
161
+ });
162
+ // Send kitty protocol sequence for numpad enter
163
+ act(() => {
164
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_NUMPAD_ENTER}u`);
165
+ });
166
+ // When kitty protocol is disabled, the sequence should be passed through
167
+ // as individual keypresses, not recognized as a single enter key
168
+ expect(keyHandler).not.toHaveBeenCalledWith(expect.objectContaining({
169
+ name: 'return',
170
+ kittyProtocol: true,
171
+ }));
172
+ });
173
+ });
174
+ describe('Escape key handling', () => {
175
+ it('should recognize escape key (keycode 27) in kitty protocol', async () => {
176
+ const keyHandler = vi.fn();
177
+ const { result } = renderHook(() => useKeypressContext(), {
178
+ wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
179
+ });
180
+ act(() => {
181
+ result.current.subscribe(keyHandler);
182
+ });
183
+ // Send kitty protocol sequence for escape: ESC[27u
184
+ act(() => {
185
+ stdin.sendKittySequence('\x1b[27u');
186
+ });
187
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
188
+ name: 'escape',
189
+ kittyProtocol: true,
190
+ }));
191
+ });
192
+ });
193
+ describe('Tab and Backspace handling', () => {
194
+ it('should recognize Tab key in kitty protocol', async () => {
195
+ const keyHandler = vi.fn();
196
+ const { result } = renderHook(() => useKeypressContext(), { wrapper });
197
+ act(() => result.current.subscribe(keyHandler));
198
+ act(() => {
199
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_TAB}u`);
200
+ });
201
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
202
+ name: 'tab',
203
+ kittyProtocol: true,
204
+ shift: false,
205
+ }));
206
+ });
207
+ it('should recognize Shift+Tab in kitty protocol', async () => {
208
+ const keyHandler = vi.fn();
209
+ const { result } = renderHook(() => useKeypressContext(), { wrapper });
210
+ act(() => result.current.subscribe(keyHandler));
211
+ // Modifier 2 is Shift
212
+ act(() => {
213
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_TAB};2u`);
214
+ });
215
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
216
+ name: 'tab',
217
+ kittyProtocol: true,
218
+ shift: true,
219
+ }));
220
+ });
221
+ it('should recognize Backspace key in kitty protocol', async () => {
222
+ const keyHandler = vi.fn();
223
+ const { result } = renderHook(() => useKeypressContext(), { wrapper });
224
+ act(() => result.current.subscribe(keyHandler));
225
+ act(() => {
226
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_BACKSPACE}u`);
227
+ });
228
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
229
+ name: 'backspace',
230
+ kittyProtocol: true,
231
+ meta: false,
232
+ }));
233
+ });
234
+ it('should recognize Option+Backspace in kitty protocol', async () => {
235
+ const keyHandler = vi.fn();
236
+ const { result } = renderHook(() => useKeypressContext(), { wrapper });
237
+ act(() => result.current.subscribe(keyHandler));
238
+ // Modifier 3 is Alt/Option
239
+ act(() => {
240
+ stdin.sendKittySequence(`\x1b[${KITTY_KEYCODE_BACKSPACE};3u`);
241
+ });
242
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
243
+ name: 'backspace',
244
+ kittyProtocol: true,
245
+ meta: true,
246
+ }));
247
+ });
248
+ });
249
+ describe('paste mode', () => {
250
+ it('should handle multiline paste as a single event', async () => {
251
+ const keyHandler = vi.fn();
252
+ const pastedText = 'This \n is \n a \n multiline \n paste.';
253
+ const { result } = renderHook(() => useKeypressContext(), {
254
+ wrapper,
255
+ });
256
+ act(() => {
257
+ result.current.subscribe(keyHandler);
258
+ });
259
+ // Simulate a bracketed paste event
260
+ act(() => {
261
+ stdin.sendPaste(pastedText);
262
+ });
263
+ await waitFor(() => {
264
+ // Expect the handler to be called exactly once for the entire paste
265
+ expect(keyHandler).toHaveBeenCalledTimes(1);
266
+ });
267
+ // Verify the single event contains the full pasted text
268
+ expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
269
+ paste: true,
270
+ sequence: pastedText,
271
+ }));
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=KeypressContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeypressContext.test.js","sourceRoot":"","sources":["../../../../src/ui/contexts/KeypressContext.test.tsx"],"names":[],"mappings":"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"}