@xortex/xcode 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (969) hide show
  1. package/QueryEngine.ts +1331 -0
  2. package/Task.ts +125 -0
  3. package/Tool.ts +792 -0
  4. package/assistant/sessionHistory.ts +87 -0
  5. package/bin/xcode +57 -25
  6. package/bridge/bridgeApi.ts +539 -0
  7. package/bridge/bridgeConfig.ts +48 -0
  8. package/bridge/bridgeDebug.ts +135 -0
  9. package/bridge/bridgeEnabled.ts +202 -0
  10. package/bridge/bridgeMain.ts +2999 -0
  11. package/bridge/bridgeMessaging.ts +461 -0
  12. package/bridge/bridgePermissionCallbacks.ts +43 -0
  13. package/bridge/bridgePointer.ts +210 -0
  14. package/bridge/bridgeStatusUtil.ts +163 -0
  15. package/bridge/bridgeUI.ts +530 -0
  16. package/bridge/capacityWake.ts +56 -0
  17. package/bridge/codeSessionApi.ts +168 -0
  18. package/bridge/createSession.ts +384 -0
  19. package/bridge/debugUtils.ts +141 -0
  20. package/bridge/envLessBridgeConfig.ts +165 -0
  21. package/bridge/flushGate.ts +71 -0
  22. package/bridge/inboundAttachments.ts +175 -0
  23. package/bridge/inboundMessages.ts +80 -0
  24. package/bridge/initReplBridge.ts +569 -0
  25. package/bridge/jwtUtils.ts +256 -0
  26. package/bridge/pollConfig.ts +110 -0
  27. package/bridge/pollConfigDefaults.ts +82 -0
  28. package/bridge/remoteBridgeCore.ts +1008 -0
  29. package/bridge/replBridge.ts +2406 -0
  30. package/bridge/replBridgeHandle.ts +36 -0
  31. package/bridge/replBridgeTransport.ts +370 -0
  32. package/bridge/sessionIdCompat.ts +57 -0
  33. package/bridge/sessionRunner.ts +550 -0
  34. package/bridge/trustedDevice.ts +210 -0
  35. package/bridge/types.ts +262 -0
  36. package/bridge/workSecret.ts +127 -0
  37. package/buddy/CompanionSprite.tsx +371 -0
  38. package/buddy/companion.ts +133 -0
  39. package/buddy/prompt.ts +36 -0
  40. package/buddy/sprites.ts +514 -0
  41. package/buddy/types.ts +148 -0
  42. package/buddy/useBuddyNotification.tsx +98 -0
  43. package/cli/exit.ts +31 -0
  44. package/cli/handlers/agents.ts +70 -0
  45. package/cli/handlers/auth.ts +330 -0
  46. package/cli/handlers/autoMode.ts +170 -0
  47. package/cli/handlers/mcp.tsx +362 -0
  48. package/cli/handlers/plugins.ts +878 -0
  49. package/cli/handlers/util.tsx +110 -0
  50. package/cli/ndjsonSafeStringify.ts +32 -0
  51. package/cli/print.ts +5594 -0
  52. package/cli/remoteIO.ts +255 -0
  53. package/cli/structuredIO.ts +859 -0
  54. package/cli/transports/HybridTransport.ts +282 -0
  55. package/cli/transports/SSETransport.ts +711 -0
  56. package/cli/transports/SerialBatchEventUploader.ts +275 -0
  57. package/cli/transports/WebSocketTransport.ts +800 -0
  58. package/cli/transports/WorkerStateUploader.ts +131 -0
  59. package/cli/transports/ccrClient.ts +998 -0
  60. package/cli/transports/transportUtils.ts +45 -0
  61. package/cli/update.ts +422 -0
  62. package/commands/add-dir/add-dir.tsx +126 -0
  63. package/commands/add-dir/index.ts +11 -0
  64. package/commands/add-dir/validation.ts +110 -0
  65. package/commands/advisor.ts +109 -0
  66. package/commands/agents/agents.tsx +12 -0
  67. package/commands/agents/index.ts +10 -0
  68. package/commands/ant-trace/index.js +1 -0
  69. package/commands/autofix-pr/index.js +1 -0
  70. package/commands/backfill-sessions/index.js +1 -0
  71. package/commands/branch/branch.ts +296 -0
  72. package/commands/branch/index.ts +14 -0
  73. package/commands/break-cache/index.js +1 -0
  74. package/commands/bridge/bridge.tsx +509 -0
  75. package/commands/bridge/index.ts +26 -0
  76. package/commands/bridge-kick.ts +200 -0
  77. package/commands/brief.ts +130 -0
  78. package/commands/btw/btw.tsx +243 -0
  79. package/commands/btw/index.ts +13 -0
  80. package/commands/bughunter/index.js +1 -0
  81. package/commands/chrome/chrome.tsx +285 -0
  82. package/commands/chrome/index.ts +13 -0
  83. package/commands/clear/caches.ts +144 -0
  84. package/commands/clear/clear.ts +7 -0
  85. package/commands/clear/conversation.ts +251 -0
  86. package/commands/clear/index.ts +19 -0
  87. package/commands/color/color.ts +93 -0
  88. package/commands/color/index.ts +16 -0
  89. package/commands/commit-push-pr.ts +158 -0
  90. package/commands/commit.ts +92 -0
  91. package/commands/compact/compact.ts +287 -0
  92. package/commands/compact/index.ts +15 -0
  93. package/commands/config/config.tsx +7 -0
  94. package/commands/config/index.ts +11 -0
  95. package/commands/context/context-noninteractive.ts +325 -0
  96. package/commands/context/context.tsx +64 -0
  97. package/commands/context/index.ts +24 -0
  98. package/commands/copy/copy.tsx +371 -0
  99. package/commands/copy/index.ts +15 -0
  100. package/commands/cost/cost.ts +24 -0
  101. package/commands/cost/index.ts +23 -0
  102. package/commands/createMovedToPluginCommand.ts +65 -0
  103. package/commands/ctx_viz/index.js +1 -0
  104. package/commands/debug-tool-call/index.js +1 -0
  105. package/commands/desktop/desktop.tsx +9 -0
  106. package/commands/desktop/index.ts +26 -0
  107. package/commands/diff/diff.tsx +9 -0
  108. package/commands/diff/index.ts +8 -0
  109. package/commands/doctor/doctor.tsx +7 -0
  110. package/commands/doctor/index.ts +12 -0
  111. package/commands/effort/effort.tsx +183 -0
  112. package/commands/effort/index.ts +13 -0
  113. package/commands/env/index.js +1 -0
  114. package/commands/exit/exit.tsx +33 -0
  115. package/commands/exit/index.ts +12 -0
  116. package/commands/export/export.tsx +91 -0
  117. package/commands/export/index.ts +11 -0
  118. package/commands/extra-usage/extra-usage-core.ts +118 -0
  119. package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  120. package/commands/extra-usage/extra-usage.tsx +17 -0
  121. package/commands/extra-usage/index.ts +31 -0
  122. package/commands/fast/fast.tsx +269 -0
  123. package/commands/fast/index.ts +26 -0
  124. package/commands/feedback/feedback.tsx +25 -0
  125. package/commands/feedback/index.ts +26 -0
  126. package/commands/files/files.ts +19 -0
  127. package/commands/files/index.ts +12 -0
  128. package/commands/good-claude/index.js +1 -0
  129. package/commands/heapdump/heapdump.ts +17 -0
  130. package/commands/heapdump/index.ts +12 -0
  131. package/commands/help/help.tsx +11 -0
  132. package/commands/help/index.ts +10 -0
  133. package/commands/hooks/hooks.tsx +13 -0
  134. package/commands/hooks/index.ts +11 -0
  135. package/commands/ide/ide.tsx +646 -0
  136. package/commands/ide/index.ts +11 -0
  137. package/commands/init-verifiers.ts +262 -0
  138. package/commands/init.ts +256 -0
  139. package/commands/insights.ts +3200 -0
  140. package/commands/install-github-app/ApiKeyStep.tsx +231 -0
  141. package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  142. package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  143. package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  144. package/commands/install-github-app/CreatingStep.tsx +65 -0
  145. package/commands/install-github-app/ErrorStep.tsx +85 -0
  146. package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  147. package/commands/install-github-app/InstallAppStep.tsx +94 -0
  148. package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  149. package/commands/install-github-app/SuccessStep.tsx +96 -0
  150. package/commands/install-github-app/WarningsStep.tsx +73 -0
  151. package/commands/install-github-app/index.ts +13 -0
  152. package/commands/install-github-app/install-github-app.tsx +587 -0
  153. package/commands/install-github-app/setupGitHubActions.ts +325 -0
  154. package/commands/install-slack-app/index.ts +12 -0
  155. package/commands/install-slack-app/install-slack-app.ts +30 -0
  156. package/commands/install.tsx +300 -0
  157. package/commands/issue/index.js +1 -0
  158. package/commands/keybindings/index.ts +13 -0
  159. package/commands/keybindings/keybindings.ts +53 -0
  160. package/commands/login/index.ts +14 -0
  161. package/commands/login/login.tsx +104 -0
  162. package/commands/logout/index.ts +10 -0
  163. package/commands/logout/logout.tsx +82 -0
  164. package/commands/mcp/addCommand.ts +280 -0
  165. package/commands/mcp/index.ts +12 -0
  166. package/commands/mcp/mcp.tsx +85 -0
  167. package/commands/mcp/xaaIdpCommand.ts +266 -0
  168. package/commands/memory/index.ts +10 -0
  169. package/commands/memory/memory.tsx +90 -0
  170. package/commands/mobile/index.ts +11 -0
  171. package/commands/mobile/mobile.tsx +274 -0
  172. package/commands/mock-limits/index.js +1 -0
  173. package/commands/model/index.ts +16 -0
  174. package/commands/model/model.tsx +297 -0
  175. package/commands/oauth-refresh/index.js +1 -0
  176. package/commands/onboarding/index.js +1 -0
  177. package/commands/output-style/index.ts +11 -0
  178. package/commands/output-style/output-style.tsx +7 -0
  179. package/commands/passes/index.ts +22 -0
  180. package/commands/passes/passes.tsx +24 -0
  181. package/commands/perf-issue/index.js +1 -0
  182. package/commands/permissions/index.ts +11 -0
  183. package/commands/permissions/permissions.tsx +10 -0
  184. package/commands/plan/index.ts +11 -0
  185. package/commands/plan/plan.tsx +122 -0
  186. package/commands/plugin/AddMarketplace.tsx +162 -0
  187. package/commands/plugin/BrowseMarketplace.tsx +802 -0
  188. package/commands/plugin/DiscoverPlugins.tsx +781 -0
  189. package/commands/plugin/ManageMarketplaces.tsx +838 -0
  190. package/commands/plugin/ManagePlugins.tsx +2215 -0
  191. package/commands/plugin/PluginErrors.tsx +124 -0
  192. package/commands/plugin/PluginOptionsDialog.tsx +357 -0
  193. package/commands/plugin/PluginOptionsFlow.tsx +135 -0
  194. package/commands/plugin/PluginSettings.tsx +1072 -0
  195. package/commands/plugin/PluginTrustWarning.tsx +32 -0
  196. package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  197. package/commands/plugin/ValidatePlugin.tsx +98 -0
  198. package/commands/plugin/index.tsx +11 -0
  199. package/commands/plugin/parseArgs.ts +103 -0
  200. package/commands/plugin/plugin.tsx +7 -0
  201. package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  202. package/commands/plugin/usePagination.ts +171 -0
  203. package/commands/pr_comments/index.ts +50 -0
  204. package/commands/privacy-settings/index.ts +14 -0
  205. package/commands/privacy-settings/privacy-settings.tsx +58 -0
  206. package/commands/rate-limit-options/index.ts +19 -0
  207. package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  208. package/commands/release-notes/index.ts +11 -0
  209. package/commands/release-notes/release-notes.ts +50 -0
  210. package/commands/reload-plugins/index.ts +18 -0
  211. package/commands/reload-plugins/reload-plugins.ts +61 -0
  212. package/commands/remote-env/index.ts +15 -0
  213. package/commands/remote-env/remote-env.tsx +7 -0
  214. package/commands/remote-setup/api.ts +182 -0
  215. package/commands/remote-setup/index.ts +20 -0
  216. package/commands/remote-setup/remote-setup.tsx +187 -0
  217. package/commands/rename/generateSessionName.ts +67 -0
  218. package/commands/rename/index.ts +12 -0
  219. package/commands/rename/rename.ts +87 -0
  220. package/commands/reset-limits/index.js +4 -0
  221. package/commands/resume/index.ts +12 -0
  222. package/commands/resume/resume.tsx +275 -0
  223. package/commands/review/UltrareviewOverageDialog.tsx +96 -0
  224. package/commands/review/reviewRemote.ts +316 -0
  225. package/commands/review/ultrareviewCommand.tsx +58 -0
  226. package/commands/review/ultrareviewEnabled.ts +14 -0
  227. package/commands/review.ts +57 -0
  228. package/commands/rewind/index.ts +13 -0
  229. package/commands/rewind/rewind.ts +13 -0
  230. package/commands/sandbox-toggle/index.ts +50 -0
  231. package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  232. package/commands/security-review.ts +243 -0
  233. package/commands/session/index.ts +16 -0
  234. package/commands/session/session.tsx +140 -0
  235. package/commands/share/index.js +1 -0
  236. package/commands/skills/index.ts +10 -0
  237. package/commands/skills/skills.tsx +8 -0
  238. package/commands/stats/index.ts +10 -0
  239. package/commands/stats/stats.tsx +7 -0
  240. package/commands/status/index.ts +12 -0
  241. package/commands/status/status.tsx +8 -0
  242. package/commands/statusline.tsx +24 -0
  243. package/commands/stickers/index.ts +11 -0
  244. package/commands/stickers/stickers.ts +16 -0
  245. package/commands/summary/index.js +1 -0
  246. package/commands/tag/index.ts +12 -0
  247. package/commands/tag/tag.tsx +215 -0
  248. package/commands/tasks/index.ts +11 -0
  249. package/commands/tasks/tasks.tsx +8 -0
  250. package/commands/teleport/index.js +1 -0
  251. package/commands/terminalSetup/index.ts +23 -0
  252. package/commands/terminalSetup/terminalSetup.tsx +531 -0
  253. package/commands/theme/index.ts +10 -0
  254. package/commands/theme/theme.tsx +57 -0
  255. package/commands/thinkback/index.ts +13 -0
  256. package/commands/thinkback/thinkback.tsx +554 -0
  257. package/commands/thinkback-play/index.ts +17 -0
  258. package/commands/thinkback-play/thinkback-play.ts +43 -0
  259. package/commands/ultraplan.tsx +471 -0
  260. package/commands/upgrade/index.ts +16 -0
  261. package/commands/upgrade/upgrade.tsx +38 -0
  262. package/commands/usage/index.ts +9 -0
  263. package/commands/usage/usage.tsx +7 -0
  264. package/commands/version.ts +22 -0
  265. package/commands/vim/index.ts +11 -0
  266. package/commands/vim/vim.ts +38 -0
  267. package/commands/voice/index.ts +20 -0
  268. package/commands/voice/voice.ts +150 -0
  269. package/commands/xingest/index.ts +11 -0
  270. package/commands/xingest/xingest.ts +90 -0
  271. package/commands/xsearch/index.ts +11 -0
  272. package/commands/xsearch/xsearch.ts +56 -0
  273. package/commands.ts +758 -0
  274. package/components/AgentProgressLine.tsx +136 -0
  275. package/components/App.tsx +56 -0
  276. package/components/ApproveApiKey.tsx +123 -0
  277. package/components/AutoModeOptInDialog.tsx +142 -0
  278. package/components/AutoUpdater.tsx +198 -0
  279. package/components/AutoUpdaterWrapper.tsx +91 -0
  280. package/components/AwsAuthStatusBox.tsx +82 -0
  281. package/components/BaseTextInput.tsx +136 -0
  282. package/components/BashModeProgress.tsx +56 -0
  283. package/components/BridgeDialog.tsx +401 -0
  284. package/components/BypassPermissionsModeDialog.tsx +87 -0
  285. package/components/ChannelDowngradeDialog.tsx +102 -0
  286. package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  287. package/components/ClaudeInChromeOnboarding.tsx +121 -0
  288. package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  289. package/components/ClickableImageRef.tsx +73 -0
  290. package/components/CompactSummary.tsx +118 -0
  291. package/components/ConfigurableShortcutHint.tsx +57 -0
  292. package/components/ConsoleOAuthFlow.tsx +631 -0
  293. package/components/ContextSuggestions.tsx +47 -0
  294. package/components/ContextVisualization.tsx +489 -0
  295. package/components/CoordinatorAgentStatus.tsx +273 -0
  296. package/components/CostThresholdDialog.tsx +50 -0
  297. package/components/CtrlOToExpand.tsx +51 -0
  298. package/components/CustomSelect/SelectMulti.tsx +213 -0
  299. package/components/CustomSelect/index.ts +3 -0
  300. package/components/CustomSelect/option-map.ts +50 -0
  301. package/components/CustomSelect/select-input-option.tsx +488 -0
  302. package/components/CustomSelect/select-option.tsx +68 -0
  303. package/components/CustomSelect/select.tsx +690 -0
  304. package/components/CustomSelect/use-multi-select-state.ts +414 -0
  305. package/components/CustomSelect/use-select-input.ts +287 -0
  306. package/components/CustomSelect/use-select-navigation.ts +653 -0
  307. package/components/CustomSelect/use-select-state.ts +157 -0
  308. package/components/DesktopHandoff.tsx +193 -0
  309. package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  310. package/components/DevBar.tsx +49 -0
  311. package/components/DevChannelsDialog.tsx +105 -0
  312. package/components/DiagnosticsDisplay.tsx +95 -0
  313. package/components/EffortCallout.tsx +265 -0
  314. package/components/EffortIndicator.ts +42 -0
  315. package/components/ExitFlow.tsx +48 -0
  316. package/components/ExportDialog.tsx +128 -0
  317. package/components/FallbackToolUseErrorMessage.tsx +116 -0
  318. package/components/FallbackToolUseRejectedMessage.tsx +16 -0
  319. package/components/FastIcon.tsx +46 -0
  320. package/components/Feedback.tsx +592 -0
  321. package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  322. package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  323. package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  324. package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  325. package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  326. package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  327. package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  328. package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  329. package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  330. package/components/FileEditToolDiff.tsx +181 -0
  331. package/components/FileEditToolUpdatedMessage.tsx +124 -0
  332. package/components/FileEditToolUseRejectedMessage.tsx +170 -0
  333. package/components/FilePathLink.tsx +43 -0
  334. package/components/FullscreenLayout.tsx +645 -0
  335. package/components/GlobalSearchDialog.tsx +343 -0
  336. package/components/HelpV2/Commands.tsx +82 -0
  337. package/components/HelpV2/General.tsx +23 -0
  338. package/components/HelpV2/HelpV2.tsx +184 -0
  339. package/components/HighlightedCode/Fallback.tsx +193 -0
  340. package/components/HighlightedCode.tsx +190 -0
  341. package/components/HistorySearchDialog.tsx +118 -0
  342. package/components/IdeAutoConnectDialog.tsx +154 -0
  343. package/components/IdeOnboardingDialog.tsx +167 -0
  344. package/components/IdeStatusIndicator.tsx +58 -0
  345. package/components/IdleReturnDialog.tsx +118 -0
  346. package/components/InterruptedByUser.tsx +15 -0
  347. package/components/InvalidConfigDialog.tsx +156 -0
  348. package/components/InvalidSettingsDialog.tsx +89 -0
  349. package/components/KeybindingWarnings.tsx +55 -0
  350. package/components/LanguagePicker.tsx +86 -0
  351. package/components/LogSelector.tsx +1575 -0
  352. package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  353. package/components/LogoV2/AnimatedClawd.tsx +124 -0
  354. package/components/LogoV2/ChannelsNotice.tsx +266 -0
  355. package/components/LogoV2/Clawd.tsx +14 -0
  356. package/components/LogoV2/CondensedLogo.tsx +161 -0
  357. package/components/LogoV2/EmergencyTip.tsx +58 -0
  358. package/components/LogoV2/Feed.tsx +112 -0
  359. package/components/LogoV2/FeedColumn.tsx +59 -0
  360. package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  361. package/components/LogoV2/LogoV2.tsx +543 -0
  362. package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  363. package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  364. package/components/LogoV2/VoiceModeNotice.tsx +68 -0
  365. package/components/LogoV2/WelcomeV2.tsx +433 -0
  366. package/components/LogoV2/feedConfigs.tsx +92 -0
  367. package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  368. package/components/MCPServerApprovalDialog.tsx +115 -0
  369. package/components/MCPServerDesktopImportDialog.tsx +203 -0
  370. package/components/MCPServerDialogCopy.tsx +15 -0
  371. package/components/MCPServerMultiselectDialog.tsx +133 -0
  372. package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  373. package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  374. package/components/Markdown.tsx +236 -0
  375. package/components/MarkdownTable.tsx +322 -0
  376. package/components/MemoryUsageIndicator.tsx +37 -0
  377. package/components/Message.tsx +627 -0
  378. package/components/MessageModel.tsx +43 -0
  379. package/components/MessageResponse.tsx +78 -0
  380. package/components/MessageRow.tsx +383 -0
  381. package/components/MessageSelector.tsx +831 -0
  382. package/components/MessageTimestamp.tsx +63 -0
  383. package/components/Messages.tsx +834 -0
  384. package/components/ModelPicker.tsx +448 -0
  385. package/components/NativeAutoUpdater.tsx +193 -0
  386. package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  387. package/components/OffscreenFreeze.tsx +44 -0
  388. package/components/Onboarding.tsx +244 -0
  389. package/components/OutputStylePicker.tsx +112 -0
  390. package/components/PackageManagerAutoUpdater.tsx +104 -0
  391. package/components/Passes/Passes.tsx +184 -0
  392. package/components/PrBadge.tsx +97 -0
  393. package/components/PressEnterToContinue.tsx +15 -0
  394. package/components/PromptInput/HistorySearchInput.tsx +51 -0
  395. package/components/PromptInput/IssueFlagBanner.tsx +12 -0
  396. package/components/PromptInput/Notifications.tsx +332 -0
  397. package/components/PromptInput/PromptInput.tsx +2350 -0
  398. package/components/PromptInput/PromptInputFooter.tsx +191 -0
  399. package/components/PromptInput/PromptInputFooterLeftSide.tsx +524 -0
  400. package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  401. package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  402. package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  403. package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  404. package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  405. package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  406. package/components/PromptInput/ShimmeredInput.tsx +143 -0
  407. package/components/PromptInput/VoiceIndicator.tsx +137 -0
  408. package/components/PromptInput/inputModes.ts +33 -0
  409. package/components/PromptInput/inputPaste.ts +90 -0
  410. package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  411. package/components/PromptInput/usePromptInputPlaceholder.ts +78 -0
  412. package/components/PromptInput/useShowFastIconHint.ts +31 -0
  413. package/components/PromptInput/useSwarmBanner.ts +155 -0
  414. package/components/PromptInput/utils.ts +60 -0
  415. package/components/QuickOpenDialog.tsx +244 -0
  416. package/components/RemoteCallout.tsx +76 -0
  417. package/components/RemoteEnvironmentDialog.tsx +340 -0
  418. package/components/ResumeTask.tsx +268 -0
  419. package/components/SandboxViolationExpandedView.tsx +99 -0
  420. package/components/ScrollKeybindingHandler.tsx +1012 -0
  421. package/components/SearchBox.tsx +72 -0
  422. package/components/SentryErrorBoundary.ts +28 -0
  423. package/components/SessionBackgroundHint.tsx +108 -0
  424. package/components/SessionPreview.tsx +194 -0
  425. package/components/Settings/Config.tsx +1822 -0
  426. package/components/Settings/Settings.tsx +137 -0
  427. package/components/Settings/Status.tsx +241 -0
  428. package/components/Settings/Usage.tsx +377 -0
  429. package/components/ShowInIDEPrompt.tsx +170 -0
  430. package/components/SkillImprovementSurvey.tsx +152 -0
  431. package/components/Spinner/FlashingChar.tsx +61 -0
  432. package/components/Spinner/GlimmerMessage.tsx +328 -0
  433. package/components/Spinner/ShimmerChar.tsx +36 -0
  434. package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  435. package/components/Spinner/SpinnerGlyph.tsx +80 -0
  436. package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  437. package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  438. package/components/Spinner/index.ts +10 -0
  439. package/components/Spinner/teammateSelectHint.ts +1 -0
  440. package/components/Spinner/useShimmerAnimation.ts +31 -0
  441. package/components/Spinner/useStalledAnimation.ts +75 -0
  442. package/components/Spinner/utils.ts +84 -0
  443. package/components/Spinner.tsx +562 -0
  444. package/components/Stats.tsx +1228 -0
  445. package/components/StatusLine.tsx +324 -0
  446. package/components/StatusNotices.tsx +55 -0
  447. package/components/StructuredDiff/Fallback.tsx +487 -0
  448. package/components/StructuredDiff/colorDiff.ts +37 -0
  449. package/components/StructuredDiff.tsx +190 -0
  450. package/components/StructuredDiffList.tsx +30 -0
  451. package/components/TagTabs.tsx +139 -0
  452. package/components/TaskListV2.tsx +378 -0
  453. package/components/TeammateViewHeader.tsx +82 -0
  454. package/components/TeleportError.tsx +189 -0
  455. package/components/TeleportProgress.tsx +140 -0
  456. package/components/TeleportRepoMismatchDialog.tsx +104 -0
  457. package/components/TeleportResumeWrapper.tsx +167 -0
  458. package/components/TeleportStash.tsx +116 -0
  459. package/components/TextInput.tsx +124 -0
  460. package/components/ThemePicker.tsx +333 -0
  461. package/components/ThinkingToggle.tsx +153 -0
  462. package/components/TokenWarning.tsx +179 -0
  463. package/components/ToolUseLoader.tsx +42 -0
  464. package/components/TrustDialog/TrustDialog.tsx +290 -0
  465. package/components/TrustDialog/utils.ts +245 -0
  466. package/components/ValidationErrorsList.tsx +148 -0
  467. package/components/VimTextInput.tsx +140 -0
  468. package/components/VirtualMessageList.tsx +1082 -0
  469. package/components/WorkflowMultiselectDialog.tsx +128 -0
  470. package/components/WorktreeExitDialog.tsx +231 -0
  471. package/components/agents/AgentDetail.tsx +220 -0
  472. package/components/agents/AgentEditor.tsx +178 -0
  473. package/components/agents/AgentNavigationFooter.tsx +26 -0
  474. package/components/agents/AgentsList.tsx +440 -0
  475. package/components/agents/AgentsMenu.tsx +800 -0
  476. package/components/agents/ColorPicker.tsx +112 -0
  477. package/components/agents/ModelSelector.tsx +68 -0
  478. package/components/agents/ToolSelector.tsx +562 -0
  479. package/components/agents/agentFileUtils.ts +272 -0
  480. package/components/agents/generateAgent.ts +197 -0
  481. package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  482. package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  483. package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  484. package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  485. package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  486. package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  487. package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  488. package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  489. package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  490. package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  491. package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  492. package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  493. package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  494. package/components/agents/types.ts +27 -0
  495. package/components/agents/utils.ts +18 -0
  496. package/components/agents/validateAgent.ts +109 -0
  497. package/components/design-system/Byline.tsx +77 -0
  498. package/components/design-system/Dialog.tsx +138 -0
  499. package/components/design-system/Divider.tsx +149 -0
  500. package/components/design-system/FuzzyPicker.tsx +312 -0
  501. package/components/design-system/KeyboardShortcutHint.tsx +81 -0
  502. package/components/design-system/ListItem.tsx +244 -0
  503. package/components/design-system/LoadingState.tsx +94 -0
  504. package/components/design-system/Pane.tsx +77 -0
  505. package/components/design-system/ProgressBar.tsx +86 -0
  506. package/components/design-system/Ratchet.tsx +80 -0
  507. package/components/design-system/StatusIcon.tsx +95 -0
  508. package/components/design-system/Tabs.tsx +340 -0
  509. package/components/design-system/ThemeProvider.tsx +170 -0
  510. package/components/design-system/ThemedBox.tsx +156 -0
  511. package/components/design-system/ThemedText.tsx +124 -0
  512. package/components/design-system/color.ts +30 -0
  513. package/components/diff/DiffDetailView.tsx +281 -0
  514. package/components/diff/DiffDialog.tsx +383 -0
  515. package/components/diff/DiffFileList.tsx +292 -0
  516. package/components/grove/Grove.tsx +463 -0
  517. package/components/hooks/HooksConfigMenu.tsx +578 -0
  518. package/components/hooks/PromptDialog.tsx +90 -0
  519. package/components/hooks/SelectEventMode.tsx +127 -0
  520. package/components/hooks/SelectHookMode.tsx +112 -0
  521. package/components/hooks/SelectMatcherMode.tsx +144 -0
  522. package/components/hooks/ViewHookMode.tsx +199 -0
  523. package/components/mcp/CapabilitiesSection.tsx +61 -0
  524. package/components/mcp/ElicitationDialog.tsx +1169 -0
  525. package/components/mcp/MCPAgentServerMenu.tsx +183 -0
  526. package/components/mcp/MCPListPanel.tsx +504 -0
  527. package/components/mcp/MCPReconnect.tsx +167 -0
  528. package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  529. package/components/mcp/MCPSettings.tsx +398 -0
  530. package/components/mcp/MCPStdioServerMenu.tsx +177 -0
  531. package/components/mcp/MCPToolDetailView.tsx +212 -0
  532. package/components/mcp/MCPToolListView.tsx +141 -0
  533. package/components/mcp/McpParsingWarnings.tsx +213 -0
  534. package/components/mcp/index.ts +9 -0
  535. package/components/mcp/utils/reconnectHelpers.tsx +49 -0
  536. package/components/memory/MemoryFileSelector.tsx +438 -0
  537. package/components/memory/MemoryUpdateNotification.tsx +45 -0
  538. package/components/messageActions.tsx +450 -0
  539. package/components/messages/AdvisorMessage.tsx +158 -0
  540. package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  541. package/components/messages/AssistantTextMessage.tsx +270 -0
  542. package/components/messages/AssistantThinkingMessage.tsx +86 -0
  543. package/components/messages/AssistantToolUseMessage.tsx +368 -0
  544. package/components/messages/AttachmentMessage.tsx +536 -0
  545. package/components/messages/CollapsedReadSearchContent.tsx +484 -0
  546. package/components/messages/CompactBoundaryMessage.tsx +18 -0
  547. package/components/messages/GroupedToolUseContent.tsx +58 -0
  548. package/components/messages/HighlightedThinkingText.tsx +162 -0
  549. package/components/messages/HookProgressMessage.tsx +116 -0
  550. package/components/messages/PlanApprovalMessage.tsx +222 -0
  551. package/components/messages/RateLimitMessage.tsx +161 -0
  552. package/components/messages/ShutdownMessage.tsx +132 -0
  553. package/components/messages/SystemAPIErrorMessage.tsx +141 -0
  554. package/components/messages/SystemTextMessage.tsx +827 -0
  555. package/components/messages/TaskAssignmentMessage.tsx +76 -0
  556. package/components/messages/UserAgentNotificationMessage.tsx +83 -0
  557. package/components/messages/UserBashInputMessage.tsx +58 -0
  558. package/components/messages/UserBashOutputMessage.tsx +54 -0
  559. package/components/messages/UserChannelMessage.tsx +137 -0
  560. package/components/messages/UserCommandMessage.tsx +108 -0
  561. package/components/messages/UserImageMessage.tsx +59 -0
  562. package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  563. package/components/messages/UserMemoryInputMessage.tsx +75 -0
  564. package/components/messages/UserPlanMessage.tsx +42 -0
  565. package/components/messages/UserPromptMessage.tsx +80 -0
  566. package/components/messages/UserResourceUpdateMessage.tsx +121 -0
  567. package/components/messages/UserTeammateMessage.tsx +206 -0
  568. package/components/messages/UserTextMessage.tsx +275 -0
  569. package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  570. package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  571. package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  572. package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  573. package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  574. package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  575. package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  576. package/components/messages/UserToolResultMessage/utils.tsx +44 -0
  577. package/components/messages/nullRenderingAttachments.ts +70 -0
  578. package/components/messages/teamMemCollapsed.tsx +140 -0
  579. package/components/messages/teamMemSaved.ts +19 -0
  580. package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  581. package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  582. package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  583. package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  584. package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  585. package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  586. package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  587. package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  588. package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  589. package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  590. package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  591. package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  592. package/components/permissions/FallbackPermissionRequest.tsx +333 -0
  593. package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  594. package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  595. package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  596. package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  597. package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  598. package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  599. package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  600. package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  601. package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  602. package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  603. package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  604. package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  605. package/components/permissions/PermissionDialog.tsx +72 -0
  606. package/components/permissions/PermissionExplanation.tsx +272 -0
  607. package/components/permissions/PermissionPrompt.tsx +336 -0
  608. package/components/permissions/PermissionRequest.tsx +217 -0
  609. package/components/permissions/PermissionRequestTitle.tsx +66 -0
  610. package/components/permissions/PermissionRuleExplanation.tsx +121 -0
  611. package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  612. package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  613. package/components/permissions/SandboxPermissionRequest.tsx +163 -0
  614. package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  615. package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  616. package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  617. package/components/permissions/WorkerBadge.tsx +49 -0
  618. package/components/permissions/WorkerPendingPermission.tsx +105 -0
  619. package/components/permissions/hooks.ts +209 -0
  620. package/components/permissions/rules/AddPermissionRules.tsx +180 -0
  621. package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  622. package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  623. package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  624. package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  625. package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  626. package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  627. package/components/permissions/rules/WorkspaceTab.tsx +150 -0
  628. package/components/permissions/shellPermissionHelpers.tsx +164 -0
  629. package/components/permissions/useShellPermissionFeedback.ts +148 -0
  630. package/components/permissions/utils.ts +25 -0
  631. package/components/sandbox/SandboxConfigTab.tsx +45 -0
  632. package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  633. package/components/sandbox/SandboxDoctorSection.tsx +46 -0
  634. package/components/sandbox/SandboxOverridesTab.tsx +193 -0
  635. package/components/sandbox/SandboxSettings.tsx +296 -0
  636. package/components/shell/ExpandShellOutputContext.tsx +36 -0
  637. package/components/shell/OutputLine.tsx +118 -0
  638. package/components/shell/ShellProgressMessage.tsx +150 -0
  639. package/components/shell/ShellTimeDisplay.tsx +74 -0
  640. package/components/skills/SkillsMenu.tsx +237 -0
  641. package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  642. package/components/tasks/BackgroundTask.tsx +345 -0
  643. package/components/tasks/BackgroundTaskStatus.tsx +429 -0
  644. package/components/tasks/BackgroundTasksDialog.tsx +652 -0
  645. package/components/tasks/DreamDetailDialog.tsx +251 -0
  646. package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  647. package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  648. package/components/tasks/RemoteSessionProgress.tsx +243 -0
  649. package/components/tasks/ShellDetailDialog.tsx +404 -0
  650. package/components/tasks/ShellProgress.tsx +87 -0
  651. package/components/tasks/renderToolActivity.tsx +33 -0
  652. package/components/tasks/taskStatusUtils.tsx +107 -0
  653. package/components/teams/TeamStatus.tsx +80 -0
  654. package/components/teams/TeamsDialog.tsx +715 -0
  655. package/components/ui/OrderedList.tsx +71 -0
  656. package/components/ui/OrderedListItem.tsx +45 -0
  657. package/components/ui/TreeSelect.tsx +397 -0
  658. package/components/wizard/WizardDialogLayout.tsx +65 -0
  659. package/components/wizard/WizardNavigationFooter.tsx +24 -0
  660. package/components/wizard/WizardProvider.tsx +213 -0
  661. package/components/wizard/index.ts +9 -0
  662. package/components/wizard/useWizard.ts +13 -0
  663. package/context.ts +189 -0
  664. package/cost-tracker.ts +323 -0
  665. package/entrypoints/cli.tsx +1 -1
  666. package/history.ts +464 -0
  667. package/hooks/fileSuggestions.ts +811 -0
  668. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  669. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  670. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  671. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  672. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  673. package/hooks/notifs/useInstallMessages.tsx +26 -0
  674. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  675. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  676. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  677. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  678. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  679. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  680. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  681. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  682. package/hooks/notifs/useStartupNotification.ts +41 -0
  683. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  684. package/hooks/renderPlaceholder.ts +51 -0
  685. package/hooks/toolPermission/PermissionContext.ts +388 -0
  686. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  687. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  688. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  689. package/hooks/toolPermission/permissionLogging.ts +238 -0
  690. package/hooks/unifiedSuggestions.ts +202 -0
  691. package/hooks/useAfterFirstRender.ts +17 -0
  692. package/hooks/useApiKeyVerification.ts +84 -0
  693. package/hooks/useArrowKeyHistory.tsx +229 -0
  694. package/hooks/useAssistantHistory.ts +250 -0
  695. package/hooks/useAwaySummary.ts +125 -0
  696. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  697. package/hooks/useBlink.ts +34 -0
  698. package/hooks/useCanUseTool.tsx +204 -0
  699. package/hooks/useCancelRequest.ts +276 -0
  700. package/hooks/useChromeExtensionNotification.tsx +50 -0
  701. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  702. package/hooks/useClipboardImageHint.ts +77 -0
  703. package/hooks/useCommandKeybindings.tsx +108 -0
  704. package/hooks/useCommandQueue.ts +15 -0
  705. package/hooks/useCopyOnSelect.ts +98 -0
  706. package/hooks/useDeferredHookMessages.ts +46 -0
  707. package/hooks/useDiffData.ts +110 -0
  708. package/hooks/useDiffInIDE.ts +379 -0
  709. package/hooks/useDirectConnect.ts +229 -0
  710. package/hooks/useDoublePress.ts +62 -0
  711. package/hooks/useDynamicConfig.ts +22 -0
  712. package/hooks/useElapsedTime.ts +37 -0
  713. package/hooks/useExitOnCtrlCD.ts +95 -0
  714. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  715. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  716. package/hooks/useGlobalKeybindings.tsx +249 -0
  717. package/hooks/useHistorySearch.ts +303 -0
  718. package/hooks/useIDEIntegration.tsx +70 -0
  719. package/hooks/useIdeAtMentioned.ts +76 -0
  720. package/hooks/useIdeConnectionStatus.ts +33 -0
  721. package/hooks/useIdeLogging.ts +41 -0
  722. package/hooks/useIdeSelection.ts +150 -0
  723. package/hooks/useInboxPoller.ts +969 -0
  724. package/hooks/useInputBuffer.ts +132 -0
  725. package/hooks/useIssueFlagBanner.ts +133 -0
  726. package/hooks/useLogMessages.ts +119 -0
  727. package/hooks/useLspPluginRecommendation.tsx +194 -0
  728. package/hooks/useMailboxBridge.ts +21 -0
  729. package/hooks/useMainLoopModel.ts +34 -0
  730. package/hooks/useManagePlugins.ts +304 -0
  731. package/hooks/useMemoryUsage.ts +39 -0
  732. package/hooks/useMergedClients.ts +23 -0
  733. package/hooks/useMergedCommands.ts +15 -0
  734. package/hooks/useMergedTools.ts +44 -0
  735. package/hooks/useMinDisplayTime.ts +35 -0
  736. package/hooks/useNotifyAfterTimeout.ts +65 -0
  737. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  738. package/hooks/usePasteHandler.ts +285 -0
  739. package/hooks/usePluginRecommendationBase.tsx +105 -0
  740. package/hooks/usePrStatus.ts +106 -0
  741. package/hooks/usePromptSuggestion.ts +177 -0
  742. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  743. package/hooks/useQueueProcessor.ts +68 -0
  744. package/hooks/useRemoteSession.ts +605 -0
  745. package/hooks/useReplBridge.tsx +723 -0
  746. package/hooks/useSSHSession.ts +241 -0
  747. package/hooks/useScheduledTasks.ts +139 -0
  748. package/hooks/useSearchInput.ts +364 -0
  749. package/hooks/useSessionBackgrounding.ts +158 -0
  750. package/hooks/useSettings.ts +17 -0
  751. package/hooks/useSettingsChange.ts +25 -0
  752. package/hooks/useSkillImprovementSurvey.ts +105 -0
  753. package/hooks/useSkillsChange.ts +62 -0
  754. package/hooks/useSwarmInitialization.ts +81 -0
  755. package/hooks/useSwarmPermissionPoller.ts +330 -0
  756. package/hooks/useTaskListWatcher.ts +221 -0
  757. package/hooks/useTasksV2.ts +250 -0
  758. package/hooks/useTeammateViewAutoExit.ts +63 -0
  759. package/hooks/useTeleportResume.tsx +85 -0
  760. package/hooks/useTerminalSize.ts +15 -0
  761. package/hooks/useTextInput.ts +529 -0
  762. package/hooks/useTimeout.ts +14 -0
  763. package/hooks/useTurnDiffs.ts +213 -0
  764. package/hooks/useTypeahead.tsx +1385 -0
  765. package/hooks/useUpdateNotification.ts +34 -0
  766. package/hooks/useVimInput.ts +316 -0
  767. package/hooks/useVirtualScroll.ts +721 -0
  768. package/hooks/useVoice.ts +1144 -0
  769. package/hooks/useVoiceEnabled.ts +25 -0
  770. package/hooks/useVoiceIntegration.tsx +677 -0
  771. package/ink/Ansi.tsx +292 -0
  772. package/ink/bidi.ts +139 -0
  773. package/ink/clearTerminal.ts +74 -0
  774. package/ink/colorize.ts +231 -0
  775. package/ink/components/AlternateScreen.tsx +80 -0
  776. package/ink/components/App.tsx +658 -0
  777. package/ink/components/AppContext.ts +21 -0
  778. package/ink/components/Box.tsx +214 -0
  779. package/ink/components/Button.tsx +192 -0
  780. package/ink/components/ClockContext.tsx +112 -0
  781. package/ink/components/CursorDeclarationContext.ts +32 -0
  782. package/ink/components/ErrorOverview.tsx +109 -0
  783. package/ink/components/Link.tsx +42 -0
  784. package/ink/components/Newline.tsx +39 -0
  785. package/ink/components/NoSelect.tsx +68 -0
  786. package/ink/components/RawAnsi.tsx +57 -0
  787. package/ink/components/ScrollBox.tsx +237 -0
  788. package/ink/components/Spacer.tsx +20 -0
  789. package/ink/components/StdinContext.ts +49 -0
  790. package/ink/components/TerminalFocusContext.tsx +52 -0
  791. package/ink/components/TerminalSizeContext.tsx +7 -0
  792. package/ink/components/Text.tsx +254 -0
  793. package/ink/constants.ts +2 -0
  794. package/ink/dom.ts +484 -0
  795. package/ink/events/click-event.ts +38 -0
  796. package/ink/events/dispatcher.ts +233 -0
  797. package/ink/events/emitter.ts +39 -0
  798. package/ink/events/event-handlers.ts +73 -0
  799. package/ink/events/event.ts +11 -0
  800. package/ink/events/focus-event.ts +21 -0
  801. package/ink/events/input-event.ts +205 -0
  802. package/ink/events/keyboard-event.ts +51 -0
  803. package/ink/events/terminal-event.ts +107 -0
  804. package/ink/events/terminal-focus-event.ts +19 -0
  805. package/ink/focus.ts +181 -0
  806. package/ink/frame.ts +124 -0
  807. package/ink/get-max-width.ts +27 -0
  808. package/ink/global.d.ts +26 -0
  809. package/ink/hit-test.ts +130 -0
  810. package/ink/hooks/use-animation-frame.ts +57 -0
  811. package/ink/hooks/use-app.ts +8 -0
  812. package/ink/hooks/use-declared-cursor.ts +73 -0
  813. package/ink/hooks/use-input.ts +92 -0
  814. package/ink/hooks/use-interval.ts +67 -0
  815. package/ink/hooks/use-search-highlight.ts +53 -0
  816. package/ink/hooks/use-selection.ts +104 -0
  817. package/ink/hooks/use-stdin.ts +8 -0
  818. package/ink/hooks/use-tab-status.ts +72 -0
  819. package/ink/hooks/use-terminal-focus.ts +16 -0
  820. package/ink/hooks/use-terminal-title.ts +31 -0
  821. package/ink/hooks/use-terminal-viewport.ts +96 -0
  822. package/ink/ink.tsx +1754 -0
  823. package/ink/instances.ts +10 -0
  824. package/ink/layout/engine.ts +6 -0
  825. package/ink/layout/geometry.ts +97 -0
  826. package/ink/layout/node.ts +152 -0
  827. package/ink/layout/yoga.ts +308 -0
  828. package/ink/line-width-cache.ts +24 -0
  829. package/ink/log-update.ts +773 -0
  830. package/ink/measure-element.ts +23 -0
  831. package/ink/measure-text.ts +47 -0
  832. package/ink/node-cache.ts +54 -0
  833. package/ink/optimizer.ts +93 -0
  834. package/ink/output.ts +797 -0
  835. package/ink/parse-keypress.ts +801 -0
  836. package/ink/reconciler.ts +512 -0
  837. package/ink/render-border.ts +231 -0
  838. package/ink/render-node-to-output.ts +1462 -0
  839. package/ink/render-to-screen.ts +231 -0
  840. package/ink/renderer.ts +178 -0
  841. package/ink/root.ts +184 -0
  842. package/ink/screen.ts +1486 -0
  843. package/ink/searchHighlight.ts +93 -0
  844. package/ink/selection.ts +917 -0
  845. package/ink/squash-text-nodes.ts +92 -0
  846. package/ink/stringWidth.ts +223 -0
  847. package/ink/styles.ts +771 -0
  848. package/ink/supports-hyperlinks.ts +57 -0
  849. package/ink/tabstops.ts +46 -0
  850. package/ink/terminal-focus-state.ts +47 -0
  851. package/ink/terminal-querier.ts +212 -0
  852. package/ink/terminal.ts +248 -0
  853. package/ink/termio/ansi.ts +75 -0
  854. package/ink/termio/csi.ts +319 -0
  855. package/ink/termio/dec.ts +60 -0
  856. package/ink/termio/esc.ts +67 -0
  857. package/ink/termio/osc.ts +493 -0
  858. package/ink/termio/parser.ts +394 -0
  859. package/ink/termio/sgr.ts +308 -0
  860. package/ink/termio/tokenize.ts +319 -0
  861. package/ink/termio/types.ts +236 -0
  862. package/ink/termio.ts +42 -0
  863. package/ink/useTerminalNotification.ts +126 -0
  864. package/ink/warn.ts +9 -0
  865. package/ink/widest-line.ts +19 -0
  866. package/ink/wrap-text.ts +74 -0
  867. package/ink/wrapAnsi.ts +20 -0
  868. package/inspect.js +7 -0
  869. package/keybindings/KeybindingContext.tsx +243 -0
  870. package/keybindings/KeybindingProviderSetup.tsx +308 -0
  871. package/keybindings/defaultBindings.ts +340 -0
  872. package/keybindings/loadUserBindings.ts +472 -0
  873. package/keybindings/match.ts +120 -0
  874. package/keybindings/parser.ts +203 -0
  875. package/keybindings/reservedShortcuts.ts +127 -0
  876. package/keybindings/resolver.ts +244 -0
  877. package/keybindings/schema.ts +236 -0
  878. package/keybindings/shortcutFormat.ts +63 -0
  879. package/keybindings/template.ts +52 -0
  880. package/keybindings/useKeybinding.ts +196 -0
  881. package/keybindings/useShortcutDisplay.ts +59 -0
  882. package/keybindings/validate.ts +498 -0
  883. package/macro.ts +24 -0
  884. package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  885. package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  886. package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  887. package/migrations/migrateFennecToOpus.ts +45 -0
  888. package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  889. package/migrations/migrateOpusToOpus1m.ts +43 -0
  890. package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  891. package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  892. package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  893. package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  894. package/migrations/resetProToOpusDefault.ts +51 -0
  895. package/package.json +29 -3
  896. package/patch-box.js +54 -0
  897. package/patch-compact.js +13 -0
  898. package/patch-condensed-center.js +13 -0
  899. package/patch-condensed-row.js +13 -0
  900. package/patch-condensed.js +13 -0
  901. package/patch-final.js +58 -0
  902. package/patch-input-body.js +46 -0
  903. package/patch-input-body2.js +35 -0
  904. package/patch-input-style.js +13 -0
  905. package/patch-input-width.js +13 -0
  906. package/patch-layout.js +87 -0
  907. package/patch-logo-row.js +12 -0
  908. package/patch-width.js +13 -0
  909. package/patch-width2.js +13 -0
  910. package/patch2.js +74 -0
  911. package/patch3.js +13 -0
  912. package/query.ts +1750 -0
  913. package/remote/RemoteSessionManager.ts +343 -0
  914. package/remote/SessionsWebSocket.ts +404 -0
  915. package/remote/remotePermissionBridge.ts +78 -0
  916. package/remote/sdkMessageAdapter.ts +302 -0
  917. package/skills/bundled/batch.ts +124 -0
  918. package/skills/bundled/claudeApi.ts +196 -0
  919. package/skills/bundled/claudeApiContent.ts +75 -0
  920. package/skills/bundled/claudeInChrome.ts +34 -0
  921. package/skills/bundled/debug.ts +103 -0
  922. package/skills/bundled/index.ts +79 -0
  923. package/skills/bundled/keybindings.ts +339 -0
  924. package/skills/bundled/loop.ts +92 -0
  925. package/skills/bundled/loremIpsum.ts +282 -0
  926. package/skills/bundled/remember.ts +82 -0
  927. package/skills/bundled/scheduleRemoteAgents.ts +447 -0
  928. package/skills/bundled/simplify.ts +69 -0
  929. package/skills/bundled/skillify.ts +197 -0
  930. package/skills/bundled/stuck.ts +79 -0
  931. package/skills/bundled/updateConfig.ts +475 -0
  932. package/skills/bundled/verify/SKILL.md +3 -0
  933. package/skills/bundled/verify/examples/cli.md +3 -0
  934. package/skills/bundled/verify/examples/server.md +3 -0
  935. package/skills/bundled/verify.ts +30 -0
  936. package/skills/bundled/verifyContent.ts +13 -0
  937. package/skills/bundledSkills.ts +220 -0
  938. package/skills/loadSkillsDir.ts +1086 -0
  939. package/skills/mcpSkillBuilders.ts +44 -0
  940. package/state/AppState.tsx +200 -0
  941. package/state/AppStateStore.ts +569 -0
  942. package/state/onChangeAppState.ts +171 -0
  943. package/state/selectors.ts +76 -0
  944. package/state/store.ts +34 -0
  945. package/state/teammateViewHelpers.ts +141 -0
  946. package/tasks/DreamTask/DreamTask.ts +157 -0
  947. package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  948. package/tasks/InProcessTeammateTask/types.ts +121 -0
  949. package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  950. package/tasks/LocalMainSessionTask.ts +479 -0
  951. package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  952. package/tasks/LocalShellTask/guards.ts +41 -0
  953. package/tasks/LocalShellTask/killShellTasks.ts +76 -0
  954. package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  955. package/tasks/pillLabel.ts +82 -0
  956. package/tasks/stopTask.ts +100 -0
  957. package/tasks/types.ts +46 -0
  958. package/types/command.ts +216 -0
  959. package/types/connectorText.ts +13 -0
  960. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  961. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  962. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  963. package/types/generated/google/protobuf/timestamp.ts +187 -0
  964. package/types/hooks.ts +290 -0
  965. package/types/ids.ts +44 -0
  966. package/types/logs.ts +330 -0
  967. package/types/permissions.ts +441 -0
  968. package/types/plugin.ts +363 -0
  969. package/types/textInputTypes.ts +387 -0
@@ -0,0 +1,800 @@
1
+ import type { StdoutMessage } from 'src/entrypoints/sdk/controlTypes.js'
2
+ import type WsWebSocket from 'ws'
3
+ import { logEvent } from '../../services/analytics/index.js'
4
+ import { CircularBuffer } from '../../utils/CircularBuffer.js'
5
+ import { logForDebugging } from '../../utils/debug.js'
6
+ import { logForDiagnosticsNoPII } from '../../utils/diagLogs.js'
7
+ import { isEnvTruthy } from '../../utils/envUtils.js'
8
+ import { getWebSocketTLSOptions } from '../../utils/mtls.js'
9
+ import {
10
+ getWebSocketProxyAgent,
11
+ getWebSocketProxyUrl,
12
+ } from '../../utils/proxy.js'
13
+ import {
14
+ registerSessionActivityCallback,
15
+ unregisterSessionActivityCallback,
16
+ } from '../../utils/sessionActivity.js'
17
+ import { jsonStringify } from '../../utils/slowOperations.js'
18
+ import type { Transport } from './Transport.js'
19
+
20
+ const KEEP_ALIVE_FRAME = '{"type":"keep_alive"}\n'
21
+
22
+ const DEFAULT_MAX_BUFFER_SIZE = 1000
23
+ const DEFAULT_BASE_RECONNECT_DELAY = 1000
24
+ const DEFAULT_MAX_RECONNECT_DELAY = 30000
25
+ /** Time budget for reconnection attempts before giving up (10 minutes). */
26
+ const DEFAULT_RECONNECT_GIVE_UP_MS = 600_000
27
+ const DEFAULT_PING_INTERVAL = 10000
28
+ const DEFAULT_KEEPALIVE_INTERVAL = 300_000 // 5 minutes
29
+
30
+ /**
31
+ * Threshold for detecting system sleep/wake. If the gap between consecutive
32
+ * reconnection attempts exceeds this, the machine likely slept. We reset
33
+ * the reconnection budget and retry — the server will reject with permanent
34
+ * close codes (4001/1002) if the session was reaped during sleep.
35
+ */
36
+ const SLEEP_DETECTION_THRESHOLD_MS = DEFAULT_MAX_RECONNECT_DELAY * 2 // 60s
37
+
38
+ /**
39
+ * WebSocket close codes that indicate a permanent server-side rejection.
40
+ * The transport transitions to 'closed' immediately without retrying.
41
+ */
42
+ const PERMANENT_CLOSE_CODES = new Set([
43
+ 1002, // protocol error — server rejected handshake (e.g. session reaped)
44
+ 4001, // session expired / not found
45
+ 4003, // unauthorized
46
+ ])
47
+
48
+ export type WebSocketTransportOptions = {
49
+ /** When false, the transport does not attempt automatic reconnection on
50
+ * disconnect. Use this when the caller has its own recovery mechanism
51
+ * (e.g. the REPL bridge poll loop). Defaults to true. */
52
+ autoReconnect?: boolean
53
+ /** Gates the tengu_ws_transport_* telemetry events. Set true at the
54
+ * REPL-bridge construction site so only Remote Control sessions (the
55
+ * Cloudflare-idle-timeout population) emit; print-mode workers stay
56
+ * silent. Defaults to false. */
57
+ isBridge?: boolean
58
+ }
59
+
60
+ type WebSocketTransportState =
61
+ | 'idle'
62
+ | 'connected'
63
+ | 'reconnecting'
64
+ | 'closing'
65
+ | 'closed'
66
+
67
+ // Common interface between globalThis.WebSocket and ws.WebSocket
68
+ type WebSocketLike = {
69
+ close(): void
70
+ send(data: string): void
71
+ ping?(): void // Bun & ws both support this
72
+ }
73
+
74
+ export class WebSocketTransport implements Transport {
75
+ private ws: WebSocketLike | null = null
76
+ private lastSentId: string | null = null
77
+ protected url: URL
78
+ protected state: WebSocketTransportState = 'idle'
79
+ protected onData?: (data: string) => void
80
+ private onCloseCallback?: (closeCode?: number) => void
81
+ private onConnectCallback?: () => void
82
+ private headers: Record<string, string>
83
+ private sessionId?: string
84
+ private autoReconnect: boolean
85
+ private isBridge: boolean
86
+
87
+ // Reconnection state
88
+ private reconnectAttempts = 0
89
+ private reconnectStartTime: number | null = null
90
+ private reconnectTimer: NodeJS.Timeout | null = null
91
+ private lastReconnectAttemptTime: number | null = null
92
+ // Wall-clock of last WS data-frame activity (inbound message or outbound
93
+ // ws.send). Used to compute idle time at close — the signal for diagnosing
94
+ // proxy idle-timeout RSTs (e.g. Cloudflare 5-min). Excludes ping/pong
95
+ // control frames (proxies don't count those).
96
+ private lastActivityTime = 0
97
+
98
+ // Ping interval for connection health checks
99
+ private pingInterval: NodeJS.Timeout | null = null
100
+ private pongReceived = true
101
+
102
+ // Periodic keep_alive data frames to reset proxy idle timers
103
+ private keepAliveInterval: NodeJS.Timeout | null = null
104
+
105
+ // Message buffering for replay on reconnection
106
+ private messageBuffer: CircularBuffer<StdoutMessage>
107
+ // Track which runtime's WS we're using so we can detach listeners
108
+ // with the matching API (removeEventListener vs. off).
109
+ private isBunWs = false
110
+
111
+ // Captured at connect() time for handleOpenEvent timing. Stored as an
112
+ // instance field so the onOpen handler can be a stable class-property
113
+ // arrow function (removable in doDisconnect) instead of a closure over
114
+ // a local variable.
115
+ private connectStartTime = 0
116
+
117
+ private refreshHeaders?: () => Record<string, string>
118
+
119
+ constructor(
120
+ url: URL,
121
+ headers: Record<string, string> = {},
122
+ sessionId?: string,
123
+ refreshHeaders?: () => Record<string, string>,
124
+ options?: WebSocketTransportOptions,
125
+ ) {
126
+ this.url = url
127
+ this.headers = headers
128
+ this.sessionId = sessionId
129
+ this.refreshHeaders = refreshHeaders
130
+ this.autoReconnect = options?.autoReconnect ?? true
131
+ this.isBridge = options?.isBridge ?? false
132
+ this.messageBuffer = new CircularBuffer(DEFAULT_MAX_BUFFER_SIZE)
133
+ }
134
+
135
+ public async connect(): Promise<void> {
136
+ if (this.state !== 'idle' && this.state !== 'reconnecting') {
137
+ logForDebugging(
138
+ `WebSocketTransport: Cannot connect, current state is ${this.state}`,
139
+ { level: 'error' },
140
+ )
141
+ logForDiagnosticsNoPII('error', 'cli_websocket_connect_failed')
142
+ return
143
+ }
144
+ this.state = 'reconnecting'
145
+
146
+ this.connectStartTime = Date.now()
147
+ logForDebugging(`WebSocketTransport: Opening ${this.url.href}`)
148
+ logForDiagnosticsNoPII('info', 'cli_websocket_connect_opening')
149
+
150
+ // Start with provided headers and add runtime headers
151
+ const headers = { ...this.headers }
152
+ if (this.lastSentId) {
153
+ headers['X-Last-Request-Id'] = this.lastSentId
154
+ logForDebugging(
155
+ `WebSocketTransport: Adding X-Last-Request-Id header: ${this.lastSentId}`,
156
+ )
157
+ }
158
+
159
+ if (typeof Bun !== 'undefined') {
160
+ // Bun's WebSocket supports headers/proxy options but the DOM typings don't
161
+ // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
162
+ const ws = new globalThis.WebSocket(this.url.href, {
163
+ headers,
164
+ proxy: getWebSocketProxyUrl(this.url.href),
165
+ tls: getWebSocketTLSOptions() || undefined,
166
+ } as unknown as string[])
167
+ this.ws = ws
168
+ this.isBunWs = true
169
+
170
+ ws.addEventListener('open', this.onBunOpen)
171
+ ws.addEventListener('message', this.onBunMessage)
172
+ ws.addEventListener('error', this.onBunError)
173
+ // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
174
+ ws.addEventListener('close', this.onBunClose)
175
+ // 'pong' is Bun-specific — not in DOM typings.
176
+ ws.addEventListener('pong', this.onPong)
177
+ } else {
178
+ const { default: WS } = await import('ws')
179
+ const ws = new WS(this.url.href, {
180
+ headers,
181
+ agent: getWebSocketProxyAgent(this.url.href),
182
+ ...getWebSocketTLSOptions(),
183
+ })
184
+ this.ws = ws
185
+ this.isBunWs = false
186
+
187
+ ws.on('open', this.onNodeOpen)
188
+ ws.on('message', this.onNodeMessage)
189
+ ws.on('error', this.onNodeError)
190
+ ws.on('close', this.onNodeClose)
191
+ ws.on('pong', this.onPong)
192
+ }
193
+ }
194
+
195
+ // --- Bun (native WebSocket) event handlers ---
196
+ // Stored as class-property arrow functions so they can be removed in
197
+ // doDisconnect(). Without removal, each reconnect orphans the old WS
198
+ // object + its 5 closures until GC, which accumulates under network
199
+ // instability. Mirrors the pattern in src/utils/mcpWebSocketTransport.ts.
200
+
201
+ private onBunOpen = () => {
202
+ this.handleOpenEvent()
203
+ // Bun's WebSocket doesn't expose upgrade response headers,
204
+ // so replay all buffered messages. The server deduplicates by UUID.
205
+ if (this.lastSentId) {
206
+ this.replayBufferedMessages('')
207
+ }
208
+ }
209
+
210
+ private onBunMessage = (event: MessageEvent) => {
211
+ const message =
212
+ typeof event.data === 'string' ? event.data : String(event.data)
213
+ this.lastActivityTime = Date.now()
214
+ logForDiagnosticsNoPII('info', 'cli_websocket_message_received', {
215
+ length: message.length,
216
+ })
217
+ if (this.onData) {
218
+ this.onData(message)
219
+ }
220
+ }
221
+
222
+ private onBunError = () => {
223
+ logForDebugging('WebSocketTransport: Error', {
224
+ level: 'error',
225
+ })
226
+ logForDiagnosticsNoPII('error', 'cli_websocket_connect_error')
227
+ // close event fires after error — let it call handleConnectionError
228
+ }
229
+
230
+ // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
231
+ private onBunClose = (event: CloseEvent) => {
232
+ const isClean = event.code === 1000 || event.code === 1001
233
+ logForDebugging(
234
+ `WebSocketTransport: Closed: ${event.code}`,
235
+ isClean ? undefined : { level: 'error' },
236
+ )
237
+ logForDiagnosticsNoPII('error', 'cli_websocket_connect_closed')
238
+ this.handleConnectionError(event.code)
239
+ }
240
+
241
+ // --- Node (ws package) event handlers ---
242
+
243
+ private onNodeOpen = () => {
244
+ // Capture ws before handleOpenEvent() invokes onConnectCallback — if the
245
+ // callback synchronously closes the transport, this.ws becomes null.
246
+ // The old inline-closure code had this safety implicitly via closure capture.
247
+ const ws = this.ws
248
+ this.handleOpenEvent()
249
+ if (!ws) return
250
+ // Check for last-id in upgrade response headers (ws package only)
251
+ const nws = ws as unknown as WsWebSocket & {
252
+ upgradeReq?: { headers?: Record<string, string> }
253
+ }
254
+ const upgradeResponse = nws.upgradeReq
255
+ if (upgradeResponse?.headers?.['x-last-request-id']) {
256
+ const serverLastId = upgradeResponse.headers['x-last-request-id']
257
+ this.replayBufferedMessages(serverLastId)
258
+ }
259
+ }
260
+
261
+ private onNodeMessage = (data: Buffer) => {
262
+ const message = data.toString()
263
+ this.lastActivityTime = Date.now()
264
+ logForDiagnosticsNoPII('info', 'cli_websocket_message_received', {
265
+ length: message.length,
266
+ })
267
+ if (this.onData) {
268
+ this.onData(message)
269
+ }
270
+ }
271
+
272
+ private onNodeError = (err: Error) => {
273
+ logForDebugging(`WebSocketTransport: Error: ${err.message}`, {
274
+ level: 'error',
275
+ })
276
+ logForDiagnosticsNoPII('error', 'cli_websocket_connect_error')
277
+ // close event fires after error — let it call handleConnectionError
278
+ }
279
+
280
+ private onNodeClose = (code: number, _reason: Buffer) => {
281
+ const isClean = code === 1000 || code === 1001
282
+ logForDebugging(
283
+ `WebSocketTransport: Closed: ${code}`,
284
+ isClean ? undefined : { level: 'error' },
285
+ )
286
+ logForDiagnosticsNoPII('error', 'cli_websocket_connect_closed')
287
+ this.handleConnectionError(code)
288
+ }
289
+
290
+ // --- Shared handlers ---
291
+
292
+ private onPong = () => {
293
+ this.pongReceived = true
294
+ }
295
+
296
+ private handleOpenEvent(): void {
297
+ const connectDuration = Date.now() - this.connectStartTime
298
+ logForDebugging('WebSocketTransport: Connected')
299
+ logForDiagnosticsNoPII('info', 'cli_websocket_connect_connected', {
300
+ duration_ms: connectDuration,
301
+ })
302
+
303
+ // Reconnect success — capture attempt count + downtime before resetting.
304
+ // reconnectStartTime is null on first connect, non-null on reopen.
305
+ if (this.isBridge && this.reconnectStartTime !== null) {
306
+ logEvent('tengu_ws_transport_reconnected', {
307
+ attempts: this.reconnectAttempts,
308
+ downtimeMs: Date.now() - this.reconnectStartTime,
309
+ })
310
+ }
311
+
312
+ this.reconnectAttempts = 0
313
+ this.reconnectStartTime = null
314
+ this.lastReconnectAttemptTime = null
315
+ this.lastActivityTime = Date.now()
316
+ this.state = 'connected'
317
+ this.onConnectCallback?.()
318
+
319
+ // Start periodic pings to detect dead connections
320
+ this.startPingInterval()
321
+
322
+ // Start periodic keep_alive data frames to reset proxy idle timers
323
+ this.startKeepaliveInterval()
324
+
325
+ // Register callback for session activity signals
326
+ registerSessionActivityCallback(() => {
327
+ void this.write({ type: 'keep_alive' })
328
+ })
329
+ }
330
+
331
+ protected sendLine(line: string): boolean {
332
+ if (!this.ws || this.state !== 'connected') {
333
+ logForDebugging('WebSocketTransport: Not connected')
334
+ logForDiagnosticsNoPII('info', 'cli_websocket_send_not_connected')
335
+ return false
336
+ }
337
+
338
+ try {
339
+ this.ws.send(line)
340
+ this.lastActivityTime = Date.now()
341
+ return true
342
+ } catch (error) {
343
+ logForDebugging(`WebSocketTransport: Failed to send: ${error}`, {
344
+ level: 'error',
345
+ })
346
+ logForDiagnosticsNoPII('error', 'cli_websocket_send_error')
347
+ // Don't null this.ws here — let doDisconnect() (via handleConnectionError)
348
+ // handle cleanup so listeners are removed before the WS is released.
349
+ this.handleConnectionError()
350
+ return false
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Remove all listeners attached in connect() for the given WebSocket.
356
+ * Without this, each reconnect orphans the old WS object + its closures
357
+ * until GC — these accumulate under network instability. Mirrors the
358
+ * pattern in src/utils/mcpWebSocketTransport.ts.
359
+ */
360
+ private removeWsListeners(ws: WebSocketLike): void {
361
+ if (this.isBunWs) {
362
+ const nws = ws as unknown as globalThis.WebSocket
363
+ nws.removeEventListener('open', this.onBunOpen)
364
+ nws.removeEventListener('message', this.onBunMessage)
365
+ nws.removeEventListener('error', this.onBunError)
366
+ // eslint-disable-next-line eslint-plugin-n/no-unsupported-features/node-builtins
367
+ nws.removeEventListener('close', this.onBunClose)
368
+ // 'pong' is Bun-specific — not in DOM typings
369
+ nws.removeEventListener('pong' as 'message', this.onPong)
370
+ } else {
371
+ const nws = ws as unknown as WsWebSocket
372
+ nws.off('open', this.onNodeOpen)
373
+ nws.off('message', this.onNodeMessage)
374
+ nws.off('error', this.onNodeError)
375
+ nws.off('close', this.onNodeClose)
376
+ nws.off('pong', this.onPong)
377
+ }
378
+ }
379
+
380
+ protected doDisconnect(): void {
381
+ // Stop pinging and keepalive when disconnecting
382
+ this.stopPingInterval()
383
+ this.stopKeepaliveInterval()
384
+
385
+ // Unregister session activity callback
386
+ unregisterSessionActivityCallback()
387
+
388
+ if (this.ws) {
389
+ // Remove listeners BEFORE close() so the old WS + closures can be
390
+ // GC'd promptly instead of lingering until the next mark-and-sweep.
391
+ this.removeWsListeners(this.ws)
392
+ this.ws.close()
393
+ this.ws = null
394
+ }
395
+ }
396
+
397
+ private handleConnectionError(closeCode?: number): void {
398
+ logForDebugging(
399
+ `WebSocketTransport: Disconnected from ${this.url.href}` +
400
+ (closeCode != null ? ` (code ${closeCode})` : ''),
401
+ )
402
+ logForDiagnosticsNoPII('info', 'cli_websocket_disconnected')
403
+ if (this.isBridge) {
404
+ // Fire on every close — including intermediate ones during a reconnect
405
+ // storm (those never surface to the onCloseCallback consumer). For the
406
+ // Cloudflare-5min-idle hypothesis: cluster msSinceLastActivity; if the
407
+ // peak sits at ~300s with closeCode 1006, that's the proxy RST.
408
+ logEvent('tengu_ws_transport_closed', {
409
+ closeCode,
410
+ msSinceLastActivity:
411
+ this.lastActivityTime > 0 ? Date.now() - this.lastActivityTime : -1,
412
+ // 'connected' = healthy drop (the Cloudflare case); 'reconnecting' =
413
+ // connect-rejection mid-storm. State isn't mutated until the branches
414
+ // below, so this reads the pre-close value.
415
+ wasConnected: this.state === 'connected',
416
+ reconnectAttempts: this.reconnectAttempts,
417
+ })
418
+ }
419
+ this.doDisconnect()
420
+
421
+ if (this.state === 'closing' || this.state === 'closed') return
422
+
423
+ // Permanent codes: don't retry — server has definitively ended the session.
424
+ // Exception: 4003 (unauthorized) can be retried when refreshHeaders is
425
+ // available and returns a new token (e.g. after the parent process mints
426
+ // a fresh session ingress token during reconnection).
427
+ let headersRefreshed = false
428
+ if (closeCode === 4003 && this.refreshHeaders) {
429
+ const freshHeaders = this.refreshHeaders()
430
+ if (freshHeaders.Authorization !== this.headers.Authorization) {
431
+ Object.assign(this.headers, freshHeaders)
432
+ headersRefreshed = true
433
+ logForDebugging(
434
+ 'WebSocketTransport: 4003 received but headers refreshed, scheduling reconnect',
435
+ )
436
+ logForDiagnosticsNoPII('info', 'cli_websocket_4003_token_refreshed')
437
+ }
438
+ }
439
+
440
+ if (
441
+ closeCode != null &&
442
+ PERMANENT_CLOSE_CODES.has(closeCode) &&
443
+ !headersRefreshed
444
+ ) {
445
+ logForDebugging(
446
+ `WebSocketTransport: Permanent close code ${closeCode}, not reconnecting`,
447
+ { level: 'error' },
448
+ )
449
+ logForDiagnosticsNoPII('error', 'cli_websocket_permanent_close', {
450
+ closeCode,
451
+ })
452
+ this.state = 'closed'
453
+ this.onCloseCallback?.(closeCode)
454
+ return
455
+ }
456
+
457
+ // When autoReconnect is disabled, go straight to closed state.
458
+ // The caller (e.g. REPL bridge poll loop) handles recovery.
459
+ if (!this.autoReconnect) {
460
+ this.state = 'closed'
461
+ this.onCloseCallback?.(closeCode)
462
+ return
463
+ }
464
+
465
+ // Schedule reconnection with exponential backoff and time budget
466
+ const now = Date.now()
467
+ if (!this.reconnectStartTime) {
468
+ this.reconnectStartTime = now
469
+ }
470
+
471
+ // Detect system sleep/wake: if the gap since our last reconnection
472
+ // attempt greatly exceeds the max delay, the machine likely slept
473
+ // (e.g. laptop lid closed). Reset the budget and retry from scratch —
474
+ // the server will reject with permanent close codes (4001/1002) if
475
+ // the session was reaped while we were asleep.
476
+ if (
477
+ this.lastReconnectAttemptTime !== null &&
478
+ now - this.lastReconnectAttemptTime > SLEEP_DETECTION_THRESHOLD_MS
479
+ ) {
480
+ logForDebugging(
481
+ `WebSocketTransport: Detected system sleep (${Math.round((now - this.lastReconnectAttemptTime) / 1000)}s gap), resetting reconnection budget`,
482
+ )
483
+ logForDiagnosticsNoPII('info', 'cli_websocket_sleep_detected', {
484
+ gapMs: now - this.lastReconnectAttemptTime,
485
+ })
486
+ this.reconnectStartTime = now
487
+ this.reconnectAttempts = 0
488
+ }
489
+ this.lastReconnectAttemptTime = now
490
+
491
+ const elapsed = now - this.reconnectStartTime
492
+ if (elapsed < DEFAULT_RECONNECT_GIVE_UP_MS) {
493
+ // Clear any existing reconnection timer to avoid duplicates
494
+ if (this.reconnectTimer) {
495
+ clearTimeout(this.reconnectTimer)
496
+ this.reconnectTimer = null
497
+ }
498
+
499
+ // Refresh headers before reconnecting (e.g. to pick up a new session token).
500
+ // Skip if already refreshed by the 4003 path above.
501
+ if (!headersRefreshed && this.refreshHeaders) {
502
+ const freshHeaders = this.refreshHeaders()
503
+ Object.assign(this.headers, freshHeaders)
504
+ logForDebugging('WebSocketTransport: Refreshed headers for reconnect')
505
+ }
506
+
507
+ this.state = 'reconnecting'
508
+ this.reconnectAttempts++
509
+
510
+ const baseDelay = Math.min(
511
+ DEFAULT_BASE_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts - 1),
512
+ DEFAULT_MAX_RECONNECT_DELAY,
513
+ )
514
+ // Add ±25% jitter to avoid thundering herd
515
+ const delay = Math.max(
516
+ 0,
517
+ baseDelay + baseDelay * 0.25 * (2 * Math.random() - 1),
518
+ )
519
+
520
+ logForDebugging(
521
+ `WebSocketTransport: Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}, ${Math.round(elapsed / 1000)}s elapsed)`,
522
+ )
523
+ logForDiagnosticsNoPII('error', 'cli_websocket_reconnect_attempt', {
524
+ reconnectAttempts: this.reconnectAttempts,
525
+ })
526
+ if (this.isBridge) {
527
+ logEvent('tengu_ws_transport_reconnecting', {
528
+ attempt: this.reconnectAttempts,
529
+ elapsedMs: elapsed,
530
+ delayMs: Math.round(delay),
531
+ })
532
+ }
533
+
534
+ this.reconnectTimer = setTimeout(() => {
535
+ this.reconnectTimer = null
536
+ void this.connect()
537
+ }, delay)
538
+ } else {
539
+ logForDebugging(
540
+ `WebSocketTransport: Reconnection time budget exhausted after ${Math.round(elapsed / 1000)}s for ${this.url.href}`,
541
+ { level: 'error' },
542
+ )
543
+ logForDiagnosticsNoPII('error', 'cli_websocket_reconnect_exhausted', {
544
+ reconnectAttempts: this.reconnectAttempts,
545
+ elapsedMs: elapsed,
546
+ })
547
+ this.state = 'closed'
548
+
549
+ // Notify close callback
550
+ if (this.onCloseCallback) {
551
+ this.onCloseCallback(closeCode)
552
+ }
553
+ }
554
+ }
555
+
556
+ close(): void {
557
+ // Clear any pending reconnection timer
558
+ if (this.reconnectTimer) {
559
+ clearTimeout(this.reconnectTimer)
560
+ this.reconnectTimer = null
561
+ }
562
+
563
+ // Clear ping and keepalive intervals
564
+ this.stopPingInterval()
565
+ this.stopKeepaliveInterval()
566
+
567
+ // Unregister session activity callback
568
+ unregisterSessionActivityCallback()
569
+
570
+ this.state = 'closing'
571
+ this.doDisconnect()
572
+ }
573
+
574
+ private replayBufferedMessages(lastId: string): void {
575
+ const messages = this.messageBuffer.toArray()
576
+ if (messages.length === 0) return
577
+
578
+ // Find where to start replay based on server's last received message
579
+ let startIndex = 0
580
+ if (lastId) {
581
+ const lastConfirmedIndex = messages.findIndex(
582
+ message => 'uuid' in message && message.uuid === lastId,
583
+ )
584
+ if (lastConfirmedIndex >= 0) {
585
+ // Server confirmed messages up to lastConfirmedIndex — evict them
586
+ startIndex = lastConfirmedIndex + 1
587
+ // Rebuild the buffer with only unconfirmed messages
588
+ const remaining = messages.slice(startIndex)
589
+ this.messageBuffer.clear()
590
+ this.messageBuffer.addAll(remaining)
591
+ if (remaining.length === 0) {
592
+ this.lastSentId = null
593
+ }
594
+ logForDebugging(
595
+ `WebSocketTransport: Evicted ${startIndex} confirmed messages, ${remaining.length} remaining`,
596
+ )
597
+ logForDiagnosticsNoPII(
598
+ 'info',
599
+ 'cli_websocket_evicted_confirmed_messages',
600
+ {
601
+ evicted: startIndex,
602
+ remaining: remaining.length,
603
+ },
604
+ )
605
+ }
606
+ }
607
+
608
+ const messagesToReplay = messages.slice(startIndex)
609
+ if (messagesToReplay.length === 0) {
610
+ logForDebugging('WebSocketTransport: No new messages to replay')
611
+ logForDiagnosticsNoPII('info', 'cli_websocket_no_messages_to_replay')
612
+ return
613
+ }
614
+
615
+ logForDebugging(
616
+ `WebSocketTransport: Replaying ${messagesToReplay.length} buffered messages`,
617
+ )
618
+ logForDiagnosticsNoPII('info', 'cli_websocket_messages_to_replay', {
619
+ count: messagesToReplay.length,
620
+ })
621
+
622
+ for (const message of messagesToReplay) {
623
+ const line = jsonStringify(message) + '\n'
624
+ const success = this.sendLine(line)
625
+ if (!success) {
626
+ this.handleConnectionError()
627
+ break
628
+ }
629
+ }
630
+ // Do NOT clear the buffer after replay — messages remain buffered until
631
+ // the server confirms receipt on the next reconnection. This prevents
632
+ // message loss if the connection drops after replay but before the server
633
+ // processes the messages.
634
+ }
635
+
636
+ isConnectedStatus(): boolean {
637
+ return this.state === 'connected'
638
+ }
639
+
640
+ isClosedStatus(): boolean {
641
+ return this.state === 'closed'
642
+ }
643
+
644
+ setOnData(callback: (data: string) => void): void {
645
+ this.onData = callback
646
+ }
647
+
648
+ setOnConnect(callback: () => void): void {
649
+ this.onConnectCallback = callback
650
+ }
651
+
652
+ setOnClose(callback: (closeCode?: number) => void): void {
653
+ this.onCloseCallback = callback
654
+ }
655
+
656
+ getStateLabel(): string {
657
+ return this.state
658
+ }
659
+
660
+ async write(message: StdoutMessage): Promise<void> {
661
+ if ('uuid' in message && typeof message.uuid === 'string') {
662
+ this.messageBuffer.add(message)
663
+ this.lastSentId = message.uuid
664
+ }
665
+
666
+ const line = jsonStringify(message) + '\n'
667
+
668
+ if (this.state !== 'connected') {
669
+ // Message buffered for replay when connected (if it has a UUID)
670
+ return
671
+ }
672
+
673
+ const sessionLabel = this.sessionId ? ` session=${this.sessionId}` : ''
674
+ const detailLabel = this.getControlMessageDetailLabel(message)
675
+
676
+ logForDebugging(
677
+ `WebSocketTransport: Sending message type=${message.type}${sessionLabel}${detailLabel}`,
678
+ )
679
+
680
+ this.sendLine(line)
681
+ }
682
+
683
+ private getControlMessageDetailLabel(message: StdoutMessage): string {
684
+ if (message.type === 'control_request') {
685
+ const { request_id, request } = message
686
+ const toolName =
687
+ request.subtype === 'can_use_tool' ? request.tool_name : ''
688
+ return ` subtype=${request.subtype} request_id=${request_id}${toolName ? ` tool=${toolName}` : ''}`
689
+ }
690
+ if (message.type === 'control_response') {
691
+ const { subtype, request_id } = message.response
692
+ return ` subtype=${subtype} request_id=${request_id}`
693
+ }
694
+ return ''
695
+ }
696
+
697
+ private startPingInterval(): void {
698
+ // Clear any existing interval
699
+ this.stopPingInterval()
700
+
701
+ this.pongReceived = true
702
+ let lastTickTime = Date.now()
703
+
704
+ // Send ping periodically to detect dead connections.
705
+ // If the previous ping got no pong, treat the connection as dead.
706
+ this.pingInterval = setInterval(() => {
707
+ if (this.state === 'connected' && this.ws) {
708
+ const now = Date.now()
709
+ const gap = now - lastTickTime
710
+ lastTickTime = now
711
+
712
+ // Process-suspension detector. If the wall-clock gap between ticks
713
+ // greatly exceeds the 10s interval, the process was suspended
714
+ // (laptop lid, SIGSTOP, VM pause). setInterval does not queue
715
+ // missed ticks — it coalesces — so on wake this callback fires
716
+ // once with a huge gap. The socket is almost certainly dead:
717
+ // NAT mappings drop in 30s–5min, and the server has been
718
+ // retransmitting into the void. Don't wait for a ping/pong
719
+ // round-trip to confirm (ws.ping() on a dead socket returns
720
+ // immediately with no error — bytes go into the kernel send
721
+ // buffer). Assume dead and reconnect now. A spurious reconnect
722
+ // after a short sleep is cheap — replayBufferedMessages() handles
723
+ // it and the server dedups by UUID.
724
+ if (gap > SLEEP_DETECTION_THRESHOLD_MS) {
725
+ logForDebugging(
726
+ `WebSocketTransport: ${Math.round(gap / 1000)}s tick gap detected — process was suspended, forcing reconnect`,
727
+ )
728
+ logForDiagnosticsNoPII(
729
+ 'info',
730
+ 'cli_websocket_sleep_detected_on_ping',
731
+ { gapMs: gap },
732
+ )
733
+ this.handleConnectionError()
734
+ return
735
+ }
736
+
737
+ if (!this.pongReceived) {
738
+ logForDebugging(
739
+ 'WebSocketTransport: No pong received, connection appears dead',
740
+ { level: 'error' },
741
+ )
742
+ logForDiagnosticsNoPII('error', 'cli_websocket_pong_timeout')
743
+ this.handleConnectionError()
744
+ return
745
+ }
746
+
747
+ this.pongReceived = false
748
+ try {
749
+ this.ws.ping?.()
750
+ } catch (error) {
751
+ logForDebugging(`WebSocketTransport: Ping failed: ${error}`, {
752
+ level: 'error',
753
+ })
754
+ logForDiagnosticsNoPII('error', 'cli_websocket_ping_failed')
755
+ }
756
+ }
757
+ }, DEFAULT_PING_INTERVAL)
758
+ }
759
+
760
+ private stopPingInterval(): void {
761
+ if (this.pingInterval) {
762
+ clearInterval(this.pingInterval)
763
+ this.pingInterval = null
764
+ }
765
+ }
766
+
767
+ private startKeepaliveInterval(): void {
768
+ this.stopKeepaliveInterval()
769
+
770
+ // In CCR sessions, session activity heartbeats handle keep-alives
771
+ if (isEnvTruthy(process.env.CLAUDE_CODE_REMOTE)) {
772
+ return
773
+ }
774
+
775
+ this.keepAliveInterval = setInterval(() => {
776
+ if (this.state === 'connected' && this.ws) {
777
+ try {
778
+ this.ws.send(KEEP_ALIVE_FRAME)
779
+ this.lastActivityTime = Date.now()
780
+ logForDebugging(
781
+ 'WebSocketTransport: Sent periodic keep_alive data frame',
782
+ )
783
+ } catch (error) {
784
+ logForDebugging(
785
+ `WebSocketTransport: Periodic keep_alive failed: ${error}`,
786
+ { level: 'error' },
787
+ )
788
+ logForDiagnosticsNoPII('error', 'cli_websocket_keepalive_failed')
789
+ }
790
+ }
791
+ }, DEFAULT_KEEPALIVE_INTERVAL)
792
+ }
793
+
794
+ private stopKeepaliveInterval(): void {
795
+ if (this.keepAliveInterval) {
796
+ clearInterval(this.keepAliveInterval)
797
+ this.keepAliveInterval = null
798
+ }
799
+ }
800
+ }