@xortex/xcode 3.0.1 → 3.0.3

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,998 @@
1
+ import { randomUUID } from 'crypto'
2
+ import type {
3
+ SDKPartialAssistantMessage,
4
+ StdoutMessage,
5
+ } from 'src/entrypoints/sdk/controlTypes.js'
6
+ import { decodeJwtExpiry } from '../../bridge/jwtUtils.js'
7
+ import { logForDebugging } from '../../utils/debug.js'
8
+ import { logForDiagnosticsNoPII } from '../../utils/diagLogs.js'
9
+ import { errorMessage, getErrnoCode } from '../../utils/errors.js'
10
+ import { createAxiosInstance } from '../../utils/proxy.js'
11
+ import {
12
+ registerSessionActivityCallback,
13
+ unregisterSessionActivityCallback,
14
+ } from '../../utils/sessionActivity.js'
15
+ import {
16
+ getSessionIngressAuthHeaders,
17
+ getSessionIngressAuthToken,
18
+ } from '../../utils/sessionIngressAuth.js'
19
+ import type {
20
+ RequiresActionDetails,
21
+ SessionState,
22
+ } from '../../utils/sessionState.js'
23
+ import { sleep } from '../../utils/sleep.js'
24
+ import { getClaudeCodeUserAgent } from '../../utils/userAgent.js'
25
+ import {
26
+ RetryableError,
27
+ SerialBatchEventUploader,
28
+ } from './SerialBatchEventUploader.js'
29
+ import type { SSETransport, StreamClientEvent } from './SSETransport.js'
30
+ import { WorkerStateUploader } from './WorkerStateUploader.js'
31
+
32
+ /** Default interval between heartbeat events (20s; server TTL is 60s). */
33
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 20_000
34
+
35
+ /**
36
+ * stream_event messages accumulate in a delay buffer for up to this many ms
37
+ * before enqueue. Mirrors HybridTransport's batching window. text_delta
38
+ * events for the same content block accumulate into a single full-so-far
39
+ * snapshot per flush — each emitted event is self-contained so a client
40
+ * connecting mid-stream sees complete text, not a fragment.
41
+ */
42
+ const STREAM_EVENT_FLUSH_INTERVAL_MS = 100
43
+
44
+ /** Hoisted axios validateStatus callback to avoid per-request closure allocation. */
45
+ function alwaysValidStatus(): boolean {
46
+ return true
47
+ }
48
+
49
+ export type CCRInitFailReason =
50
+ | 'no_auth_headers'
51
+ | 'missing_epoch'
52
+ | 'worker_register_failed'
53
+
54
+ /** Thrown by initialize(); carries a typed reason for the diag classifier. */
55
+ export class CCRInitError extends Error {
56
+ constructor(readonly reason: CCRInitFailReason) {
57
+ super(`CCRClient init failed: ${reason}`)
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Consecutive 401/403 with a VALID-LOOKING token before giving up. An
63
+ * expired JWT short-circuits this (exits immediately — deterministic,
64
+ * retry is futile). This threshold is for the uncertain case: token's
65
+ * exp is in the future but server says 401 (userauth down, KMS hiccup,
66
+ * clock skew). 10 × 20s heartbeat ≈ 200s to ride it out.
67
+ */
68
+ const MAX_CONSECUTIVE_AUTH_FAILURES = 10
69
+
70
+ type EventPayload = {
71
+ uuid: string
72
+ type: string
73
+ [key: string]: unknown
74
+ }
75
+
76
+ type ClientEvent = {
77
+ payload: EventPayload
78
+ ephemeral?: boolean
79
+ }
80
+
81
+ /**
82
+ * Structural subset of a stream_event carrying a text_delta. Not a narrowing
83
+ * of SDKPartialAssistantMessage — RawMessageStreamEvent's delta is a union and
84
+ * narrowing through two levels defeats the discriminant.
85
+ */
86
+ type CoalescedStreamEvent = {
87
+ type: 'stream_event'
88
+ uuid: string
89
+ session_id: string
90
+ parent_tool_use_id: string | null
91
+ event: {
92
+ type: 'content_block_delta'
93
+ index: number
94
+ delta: { type: 'text_delta'; text: string }
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Accumulator state for text_delta coalescing. Keyed by API message ID so
100
+ * lifetime is tied to the assistant message — cleared when the complete
101
+ * SDKAssistantMessage arrives (writeEvent), which is reliable even when
102
+ * abort/error paths skip content_block_stop/message_stop delivery.
103
+ */
104
+ export type StreamAccumulatorState = {
105
+ /** API message ID (msg_...) → blocks[blockIndex] → chunk array. */
106
+ byMessage: Map<string, string[][]>
107
+ /**
108
+ * {session_id}:{parent_tool_use_id} → active message ID.
109
+ * content_block_delta events don't carry the message ID (only
110
+ * message_start does), so we track which message is currently streaming
111
+ * for each scope. At most one message streams per scope at a time.
112
+ */
113
+ scopeToMessage: Map<string, string>
114
+ }
115
+
116
+ export function createStreamAccumulator(): StreamAccumulatorState {
117
+ return { byMessage: new Map(), scopeToMessage: new Map() }
118
+ }
119
+
120
+ function scopeKey(m: {
121
+ session_id: string
122
+ parent_tool_use_id: string | null
123
+ }): string {
124
+ return `${m.session_id}:${m.parent_tool_use_id ?? ''}`
125
+ }
126
+
127
+ /**
128
+ * Accumulate text_delta stream_events into full-so-far snapshots per content
129
+ * block. Each flush emits ONE event per touched block containing the FULL
130
+ * accumulated text from the start of the block — a client connecting
131
+ * mid-stream receives a self-contained snapshot, not a fragment.
132
+ *
133
+ * Non-text-delta events pass through unchanged. message_start records the
134
+ * active message ID for the scope; content_block_delta appends chunks;
135
+ * the snapshot event reuses the first text_delta UUID seen for that block in
136
+ * this flush so server-side idempotency remains stable across retries.
137
+ *
138
+ * Cleanup happens in writeEvent when the complete assistant message arrives
139
+ * (reliable), not here on stop events (abort/error paths skip those).
140
+ */
141
+ export function accumulateStreamEvents(
142
+ buffer: SDKPartialAssistantMessage[],
143
+ state: StreamAccumulatorState,
144
+ ): EventPayload[] {
145
+ const out: EventPayload[] = []
146
+ // chunks[] → snapshot already in `out` this flush. Keyed by the chunks
147
+ // array reference (stable per {messageId, index}) so subsequent deltas
148
+ // rewrite the same entry instead of emitting one event per delta.
149
+ const touched = new Map<string[], CoalescedStreamEvent>()
150
+ for (const msg of buffer) {
151
+ switch (msg.event.type) {
152
+ case 'message_start': {
153
+ const id = msg.event.message.id
154
+ const prevId = state.scopeToMessage.get(scopeKey(msg))
155
+ if (prevId) state.byMessage.delete(prevId)
156
+ state.scopeToMessage.set(scopeKey(msg), id)
157
+ state.byMessage.set(id, [])
158
+ out.push(msg)
159
+ break
160
+ }
161
+ case 'content_block_delta': {
162
+ if (msg.event.delta.type !== 'text_delta') {
163
+ out.push(msg)
164
+ break
165
+ }
166
+ const messageId = state.scopeToMessage.get(scopeKey(msg))
167
+ const blocks = messageId ? state.byMessage.get(messageId) : undefined
168
+ if (!blocks) {
169
+ // Delta without a preceding message_start (reconnect mid-stream,
170
+ // or message_start was in a prior buffer that got dropped). Pass
171
+ // through raw — can't produce a full-so-far snapshot without the
172
+ // prior chunks anyway.
173
+ out.push(msg)
174
+ break
175
+ }
176
+ const chunks = (blocks[msg.event.index] ??= [])
177
+ chunks.push(msg.event.delta.text)
178
+ const existing = touched.get(chunks)
179
+ if (existing) {
180
+ existing.event.delta.text = chunks.join('')
181
+ break
182
+ }
183
+ const snapshot: CoalescedStreamEvent = {
184
+ type: 'stream_event',
185
+ uuid: msg.uuid,
186
+ session_id: msg.session_id,
187
+ parent_tool_use_id: msg.parent_tool_use_id,
188
+ event: {
189
+ type: 'content_block_delta',
190
+ index: msg.event.index,
191
+ delta: { type: 'text_delta', text: chunks.join('') },
192
+ },
193
+ }
194
+ touched.set(chunks, snapshot)
195
+ out.push(snapshot)
196
+ break
197
+ }
198
+ default:
199
+ out.push(msg)
200
+ }
201
+ }
202
+ return out
203
+ }
204
+
205
+ /**
206
+ * Clear accumulator entries for a completed assistant message. Called from
207
+ * writeEvent when the SDKAssistantMessage arrives — the reliable end-of-stream
208
+ * signal that fires even when abort/interrupt/error skip SSE stop events.
209
+ */
210
+ export function clearStreamAccumulatorForMessage(
211
+ state: StreamAccumulatorState,
212
+ assistant: {
213
+ session_id: string
214
+ parent_tool_use_id: string | null
215
+ message: { id: string }
216
+ },
217
+ ): void {
218
+ state.byMessage.delete(assistant.message.id)
219
+ const scope = scopeKey(assistant)
220
+ if (state.scopeToMessage.get(scope) === assistant.message.id) {
221
+ state.scopeToMessage.delete(scope)
222
+ }
223
+ }
224
+
225
+ type RequestResult = { ok: true } | { ok: false; retryAfterMs?: number }
226
+
227
+ type WorkerEvent = {
228
+ payload: EventPayload
229
+ is_compaction?: boolean
230
+ agent_id?: string
231
+ }
232
+
233
+ export type InternalEvent = {
234
+ event_id: string
235
+ event_type: string
236
+ payload: Record<string, unknown>
237
+ event_metadata?: Record<string, unknown> | null
238
+ is_compaction: boolean
239
+ created_at: string
240
+ agent_id?: string
241
+ }
242
+
243
+ type ListInternalEventsResponse = {
244
+ data: InternalEvent[]
245
+ next_cursor?: string
246
+ }
247
+
248
+ type WorkerStateResponse = {
249
+ worker?: {
250
+ external_metadata?: Record<string, unknown>
251
+ }
252
+ }
253
+
254
+ /**
255
+ * Manages the worker lifecycle protocol with CCR v2:
256
+ * - Epoch management: reads worker_epoch from CLAUDE_CODE_WORKER_EPOCH env var
257
+ * - Runtime state reporting: PUT /sessions/{id}/worker
258
+ * - Heartbeat: POST /sessions/{id}/worker/heartbeat for liveness detection
259
+ *
260
+ * All writes go through this.request().
261
+ */
262
+ export class CCRClient {
263
+ private workerEpoch = 0
264
+ private readonly heartbeatIntervalMs: number
265
+ private readonly heartbeatJitterFraction: number
266
+ private heartbeatTimer: NodeJS.Timeout | null = null
267
+ private heartbeatInFlight = false
268
+ private closed = false
269
+ private consecutiveAuthFailures = 0
270
+ private currentState: SessionState | null = null
271
+ private readonly sessionBaseUrl: string
272
+ private readonly sessionId: string
273
+ private readonly http = createAxiosInstance({ keepAlive: true })
274
+
275
+ // stream_event delay buffer — accumulates content deltas for up to
276
+ // STREAM_EVENT_FLUSH_INTERVAL_MS before enqueueing (reduces POST count
277
+ // and enables text_delta coalescing). Mirrors HybridTransport's pattern.
278
+ private streamEventBuffer: SDKPartialAssistantMessage[] = []
279
+ private streamEventTimer: ReturnType<typeof setTimeout> | null = null
280
+ // Full-so-far text accumulator. Persists across flushes so each emitted
281
+ // text_delta event carries the complete text from the start of the block —
282
+ // mid-stream reconnects see a self-contained snapshot. Keyed by API message
283
+ // ID; cleared in writeEvent when the complete assistant message arrives.
284
+ private streamTextAccumulator = createStreamAccumulator()
285
+
286
+ private readonly workerState: WorkerStateUploader
287
+ private readonly eventUploader: SerialBatchEventUploader<ClientEvent>
288
+ private readonly internalEventUploader: SerialBatchEventUploader<WorkerEvent>
289
+ private readonly deliveryUploader: SerialBatchEventUploader<{
290
+ eventId: string
291
+ status: 'received' | 'processing' | 'processed'
292
+ }>
293
+
294
+ /**
295
+ * Called when the server returns 409 (a newer worker epoch superseded ours).
296
+ * Default: process.exit(1) — correct for spawn-mode children where the
297
+ * parent bridge re-spawns. In-process callers (replBridge) MUST override
298
+ * this to close gracefully instead; exit would kill the user's REPL.
299
+ */
300
+ private readonly onEpochMismatch: () => never
301
+
302
+ /**
303
+ * Auth header source. Defaults to the process-wide session-ingress token
304
+ * (CLAUDE_CODE_SESSION_ACCESS_TOKEN env var). Callers managing multiple
305
+ * concurrent sessions with distinct JWTs MUST inject this — the env-var
306
+ * path is a process global and would stomp across sessions.
307
+ */
308
+ private readonly getAuthHeaders: () => Record<string, string>
309
+
310
+ constructor(
311
+ transport: SSETransport,
312
+ sessionUrl: URL,
313
+ opts?: {
314
+ onEpochMismatch?: () => never
315
+ heartbeatIntervalMs?: number
316
+ heartbeatJitterFraction?: number
317
+ /**
318
+ * Per-instance auth header source. Omit to read the process-wide
319
+ * CLAUDE_CODE_SESSION_ACCESS_TOKEN (single-session callers — REPL,
320
+ * daemon). Required for concurrent multi-session callers.
321
+ */
322
+ getAuthHeaders?: () => Record<string, string>
323
+ },
324
+ ) {
325
+ this.onEpochMismatch =
326
+ opts?.onEpochMismatch ??
327
+ (() => {
328
+ // eslint-disable-next-line custom-rules/no-process-exit
329
+ process.exit(1)
330
+ })
331
+ this.heartbeatIntervalMs =
332
+ opts?.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS
333
+ this.heartbeatJitterFraction = opts?.heartbeatJitterFraction ?? 0
334
+ this.getAuthHeaders = opts?.getAuthHeaders ?? getSessionIngressAuthHeaders
335
+ // Session URL: https://host/v1/code/sessions/{id}
336
+ if (sessionUrl.protocol !== 'http:' && sessionUrl.protocol !== 'https:') {
337
+ throw new Error(
338
+ `CCRClient: Expected http(s) URL, got ${sessionUrl.protocol}`,
339
+ )
340
+ }
341
+ const pathname = sessionUrl.pathname.replace(/\/$/, '')
342
+ this.sessionBaseUrl = `${sessionUrl.protocol}//${sessionUrl.host}${pathname}`
343
+ // Extract session ID from the URL path (last segment)
344
+ this.sessionId = pathname.split('/').pop() || ''
345
+
346
+ this.workerState = new WorkerStateUploader({
347
+ send: body =>
348
+ this.request(
349
+ 'put',
350
+ '/worker',
351
+ { worker_epoch: this.workerEpoch, ...body },
352
+ 'PUT worker',
353
+ ).then(r => r.ok),
354
+ baseDelayMs: 500,
355
+ maxDelayMs: 30_000,
356
+ jitterMs: 500,
357
+ })
358
+
359
+ this.eventUploader = new SerialBatchEventUploader<ClientEvent>({
360
+ maxBatchSize: 100,
361
+ maxBatchBytes: 10 * 1024 * 1024,
362
+ // flushStreamEventBuffer() enqueues a full 100ms window of accumulated
363
+ // stream_events in one call. A burst of mixed delta types that don't
364
+ // fold into a single snapshot could exceed the old cap (50) and deadlock
365
+ // on the SerialBatchEventUploader backpressure check. Match
366
+ // HybridTransport's bound — high enough to be memory-only.
367
+ maxQueueSize: 100_000,
368
+ send: async batch => {
369
+ const result = await this.request(
370
+ 'post',
371
+ '/worker/events',
372
+ { worker_epoch: this.workerEpoch, events: batch },
373
+ 'client events',
374
+ )
375
+ if (!result.ok) {
376
+ throw new RetryableError(
377
+ 'client event POST failed',
378
+ result.retryAfterMs,
379
+ )
380
+ }
381
+ },
382
+ baseDelayMs: 500,
383
+ maxDelayMs: 30_000,
384
+ jitterMs: 500,
385
+ })
386
+
387
+ this.internalEventUploader = new SerialBatchEventUploader<WorkerEvent>({
388
+ maxBatchSize: 100,
389
+ maxBatchBytes: 10 * 1024 * 1024,
390
+ maxQueueSize: 200,
391
+ send: async batch => {
392
+ const result = await this.request(
393
+ 'post',
394
+ '/worker/internal-events',
395
+ { worker_epoch: this.workerEpoch, events: batch },
396
+ 'internal events',
397
+ )
398
+ if (!result.ok) {
399
+ throw new RetryableError(
400
+ 'internal event POST failed',
401
+ result.retryAfterMs,
402
+ )
403
+ }
404
+ },
405
+ baseDelayMs: 500,
406
+ maxDelayMs: 30_000,
407
+ jitterMs: 500,
408
+ })
409
+
410
+ this.deliveryUploader = new SerialBatchEventUploader<{
411
+ eventId: string
412
+ status: 'received' | 'processing' | 'processed'
413
+ }>({
414
+ maxBatchSize: 64,
415
+ maxQueueSize: 64,
416
+ send: async batch => {
417
+ const result = await this.request(
418
+ 'post',
419
+ '/worker/events/delivery',
420
+ {
421
+ worker_epoch: this.workerEpoch,
422
+ updates: batch.map(d => ({
423
+ event_id: d.eventId,
424
+ status: d.status,
425
+ })),
426
+ },
427
+ 'delivery batch',
428
+ )
429
+ if (!result.ok) {
430
+ throw new RetryableError('delivery POST failed', result.retryAfterMs)
431
+ }
432
+ },
433
+ baseDelayMs: 500,
434
+ maxDelayMs: 30_000,
435
+ jitterMs: 500,
436
+ })
437
+
438
+ // Ack each received client_event so CCR can track delivery status.
439
+ // Wired here (not in initialize()) so the callback is registered the
440
+ // moment new CCRClient() returns — remoteIO must be free to call
441
+ // transport.connect() immediately after without racing the first
442
+ // SSE catch-up frame against an unwired onEventCallback.
443
+ transport.setOnEvent((event: StreamClientEvent) => {
444
+ this.reportDelivery(event.event_id, 'received')
445
+ })
446
+ }
447
+
448
+ /**
449
+ * Initialize the session worker:
450
+ * 1. Take worker_epoch from the argument, or fall back to
451
+ * CLAUDE_CODE_WORKER_EPOCH (set by env-manager / bridge spawner)
452
+ * 2. Report state as 'idle'
453
+ * 3. Start heartbeat timer
454
+ *
455
+ * In-process callers (replBridge) pass the epoch directly — they
456
+ * registered the worker themselves and there is no parent process
457
+ * setting env vars.
458
+ */
459
+ async initialize(epoch?: number): Promise<Record<string, unknown> | null> {
460
+ const startMs = Date.now()
461
+ if (Object.keys(this.getAuthHeaders()).length === 0) {
462
+ throw new CCRInitError('no_auth_headers')
463
+ }
464
+ if (epoch === undefined) {
465
+ const rawEpoch = process.env.CLAUDE_CODE_WORKER_EPOCH
466
+ epoch = rawEpoch ? parseInt(rawEpoch, 10) : NaN
467
+ }
468
+ if (isNaN(epoch)) {
469
+ throw new CCRInitError('missing_epoch')
470
+ }
471
+ this.workerEpoch = epoch
472
+
473
+ // Concurrent with the init PUT — neither depends on the other.
474
+ const restoredPromise = this.getWorkerState()
475
+
476
+ const result = await this.request(
477
+ 'put',
478
+ '/worker',
479
+ {
480
+ worker_status: 'idle',
481
+ worker_epoch: this.workerEpoch,
482
+ // Clear stale pending_action/task_summary left by a prior
483
+ // worker crash — the in-session clears don't survive process restart.
484
+ external_metadata: {
485
+ pending_action: null,
486
+ task_summary: null,
487
+ },
488
+ },
489
+ 'PUT worker (init)',
490
+ )
491
+ if (!result.ok) {
492
+ // 409 → onEpochMismatch may throw, but request() catches it and returns
493
+ // false. Without this check we'd continue to startHeartbeat(), leaking a
494
+ // 20s timer against a dead epoch. Throw so connect()'s rejection handler
495
+ // fires instead of the success path.
496
+ throw new CCRInitError('worker_register_failed')
497
+ }
498
+ this.currentState = 'idle'
499
+ this.startHeartbeat()
500
+
501
+ // sessionActivity's refcount-gated timer fires while an API call or tool
502
+ // is in-flight; without a write the container lease can expire mid-wait.
503
+ // v1 wires this in WebSocketTransport per-connection.
504
+ registerSessionActivityCallback(() => {
505
+ void this.writeEvent({ type: 'keep_alive' })
506
+ })
507
+
508
+ logForDebugging(`CCRClient: initialized, epoch=${this.workerEpoch}`)
509
+ logForDiagnosticsNoPII('info', 'cli_worker_lifecycle_initialized', {
510
+ epoch: this.workerEpoch,
511
+ duration_ms: Date.now() - startMs,
512
+ })
513
+
514
+ // Await the concurrent GET and log state_restored here, after the PUT
515
+ // has succeeded — logging inside getWorkerState() raced: if the GET
516
+ // resolved before the PUT failed, diagnostics showed both init_failed
517
+ // and state_restored for the same session.
518
+ const { metadata, durationMs } = await restoredPromise
519
+ if (!this.closed) {
520
+ logForDiagnosticsNoPII('info', 'cli_worker_state_restored', {
521
+ duration_ms: durationMs,
522
+ had_state: metadata !== null,
523
+ })
524
+ }
525
+ return metadata
526
+ }
527
+
528
+ // Control_requests are marked processed and not re-delivered on
529
+ // restart, so read back what the prior worker wrote.
530
+ private async getWorkerState(): Promise<{
531
+ metadata: Record<string, unknown> | null
532
+ durationMs: number
533
+ }> {
534
+ const startMs = Date.now()
535
+ const authHeaders = this.getAuthHeaders()
536
+ if (Object.keys(authHeaders).length === 0) {
537
+ return { metadata: null, durationMs: 0 }
538
+ }
539
+ const data = await this.getWithRetry<WorkerStateResponse>(
540
+ `${this.sessionBaseUrl}/worker`,
541
+ authHeaders,
542
+ 'worker_state',
543
+ )
544
+ return {
545
+ metadata: data?.worker?.external_metadata ?? null,
546
+ durationMs: Date.now() - startMs,
547
+ }
548
+ }
549
+
550
+ /**
551
+ * Send an authenticated HTTP request to CCR. Handles auth headers,
552
+ * 409 epoch mismatch, and error logging. Returns { ok: true } on 2xx.
553
+ * On 429, reads Retry-After (integer seconds) so the uploader can honor
554
+ * the server's backoff hint instead of blindly exponentiating.
555
+ */
556
+ private async request(
557
+ method: 'post' | 'put',
558
+ path: string,
559
+ body: unknown,
560
+ label: string,
561
+ { timeout = 10_000 }: { timeout?: number } = {},
562
+ ): Promise<RequestResult> {
563
+ const authHeaders = this.getAuthHeaders()
564
+ if (Object.keys(authHeaders).length === 0) return { ok: false }
565
+
566
+ try {
567
+ const response = await this.http[method](
568
+ `${this.sessionBaseUrl}${path}`,
569
+ body,
570
+ {
571
+ headers: {
572
+ ...authHeaders,
573
+ 'Content-Type': 'application/json',
574
+ 'anthropic-version': '2023-06-01',
575
+ 'User-Agent': getClaudeCodeUserAgent(),
576
+ },
577
+ validateStatus: alwaysValidStatus,
578
+ timeout,
579
+ },
580
+ )
581
+
582
+ if (response.status >= 200 && response.status < 300) {
583
+ this.consecutiveAuthFailures = 0
584
+ return { ok: true }
585
+ }
586
+ if (response.status === 409) {
587
+ this.handleEpochMismatch()
588
+ }
589
+ if (response.status === 401 || response.status === 403) {
590
+ // A 401 with an expired JWT is deterministic — no retry will
591
+ // ever succeed. Check the token's own exp before burning
592
+ // wall-clock on the threshold loop.
593
+ const tok = getSessionIngressAuthToken()
594
+ const exp = tok ? decodeJwtExpiry(tok) : null
595
+ if (exp !== null && exp * 1000 < Date.now()) {
596
+ logForDebugging(
597
+ `CCRClient: session_token expired (exp=${new Date(exp * 1000).toISOString()}) — no refresh was delivered, exiting`,
598
+ { level: 'error' },
599
+ )
600
+ logForDiagnosticsNoPII('error', 'cli_worker_token_expired_no_refresh')
601
+ this.onEpochMismatch()
602
+ }
603
+ // Token looks valid but server says 401 — possible server-side
604
+ // blip (userauth down, KMS hiccup). Count toward threshold.
605
+ this.consecutiveAuthFailures++
606
+ if (this.consecutiveAuthFailures >= MAX_CONSECUTIVE_AUTH_FAILURES) {
607
+ logForDebugging(
608
+ `CCRClient: ${this.consecutiveAuthFailures} consecutive auth failures with a valid-looking token — server-side auth unrecoverable, exiting`,
609
+ { level: 'error' },
610
+ )
611
+ logForDiagnosticsNoPII('error', 'cli_worker_auth_failures_exhausted')
612
+ this.onEpochMismatch()
613
+ }
614
+ }
615
+ logForDebugging(`CCRClient: ${label} returned ${response.status}`, {
616
+ level: 'warn',
617
+ })
618
+ logForDiagnosticsNoPII('warn', 'cli_worker_request_failed', {
619
+ method,
620
+ path,
621
+ status: response.status,
622
+ })
623
+ if (response.status === 429) {
624
+ const raw = response.headers?.['retry-after']
625
+ const seconds = typeof raw === 'string' ? parseInt(raw, 10) : NaN
626
+ if (!isNaN(seconds) && seconds >= 0) {
627
+ return { ok: false, retryAfterMs: seconds * 1000 }
628
+ }
629
+ }
630
+ return { ok: false }
631
+ } catch (error) {
632
+ logForDebugging(`CCRClient: ${label} failed: ${errorMessage(error)}`, {
633
+ level: 'warn',
634
+ })
635
+ logForDiagnosticsNoPII('warn', 'cli_worker_request_error', {
636
+ method,
637
+ path,
638
+ error_code: getErrnoCode(error),
639
+ })
640
+ return { ok: false }
641
+ }
642
+ }
643
+
644
+ /** Report worker state to CCR via PUT /sessions/{id}/worker. */
645
+ reportState(state: SessionState, details?: RequiresActionDetails): void {
646
+ if (state === this.currentState && !details) return
647
+ this.currentState = state
648
+ this.workerState.enqueue({
649
+ worker_status: state,
650
+ requires_action_details: details
651
+ ? {
652
+ tool_name: details.tool_name,
653
+ action_description: details.action_description,
654
+ request_id: details.request_id,
655
+ }
656
+ : null,
657
+ })
658
+ }
659
+
660
+ /** Report external metadata to CCR via PUT /worker. */
661
+ reportMetadata(metadata: Record<string, unknown>): void {
662
+ this.workerState.enqueue({ external_metadata: metadata })
663
+ }
664
+
665
+ /**
666
+ * Handle epoch mismatch (409 Conflict). A newer CC instance has replaced
667
+ * this one — exit immediately.
668
+ */
669
+ private handleEpochMismatch(): never {
670
+ logForDebugging('CCRClient: Epoch mismatch (409), shutting down', {
671
+ level: 'error',
672
+ })
673
+ logForDiagnosticsNoPII('error', 'cli_worker_epoch_mismatch')
674
+ this.onEpochMismatch()
675
+ }
676
+
677
+ /** Start periodic heartbeat. */
678
+ private startHeartbeat(): void {
679
+ this.stopHeartbeat()
680
+ const schedule = (): void => {
681
+ const jitter =
682
+ this.heartbeatIntervalMs *
683
+ this.heartbeatJitterFraction *
684
+ (2 * Math.random() - 1)
685
+ this.heartbeatTimer = setTimeout(tick, this.heartbeatIntervalMs + jitter)
686
+ }
687
+ const tick = (): void => {
688
+ void this.sendHeartbeat()
689
+ // stopHeartbeat nulls the timer; check after the fire-and-forget send
690
+ // but before rescheduling so close() during sendHeartbeat is honored.
691
+ if (this.heartbeatTimer === null) return
692
+ schedule()
693
+ }
694
+ schedule()
695
+ }
696
+
697
+ /** Stop heartbeat timer. */
698
+ private stopHeartbeat(): void {
699
+ if (this.heartbeatTimer) {
700
+ clearTimeout(this.heartbeatTimer)
701
+ this.heartbeatTimer = null
702
+ }
703
+ }
704
+
705
+ /** Send a heartbeat via POST /sessions/{id}/worker/heartbeat. */
706
+ private async sendHeartbeat(): Promise<void> {
707
+ if (this.heartbeatInFlight) return
708
+ this.heartbeatInFlight = true
709
+ try {
710
+ const result = await this.request(
711
+ 'post',
712
+ '/worker/heartbeat',
713
+ { session_id: this.sessionId, worker_epoch: this.workerEpoch },
714
+ 'Heartbeat',
715
+ { timeout: 5_000 },
716
+ )
717
+ if (result.ok) {
718
+ logForDebugging('CCRClient: Heartbeat sent')
719
+ }
720
+ } finally {
721
+ this.heartbeatInFlight = false
722
+ }
723
+ }
724
+
725
+ /**
726
+ * Write a StdoutMessage as a client event via POST /sessions/{id}/worker/events.
727
+ * These events are visible to frontend clients via the SSE stream.
728
+ * Injects a UUID if missing to ensure server-side idempotency on retry.
729
+ *
730
+ * stream_event messages are held in a 100ms delay buffer and accumulated
731
+ * (text_deltas for the same content block emit a full-so-far snapshot per
732
+ * flush). A non-stream_event write flushes the buffer first so downstream
733
+ * ordering is preserved.
734
+ */
735
+ async writeEvent(message: StdoutMessage): Promise<void> {
736
+ if (message.type === 'stream_event') {
737
+ this.streamEventBuffer.push(message)
738
+ if (!this.streamEventTimer) {
739
+ this.streamEventTimer = setTimeout(
740
+ () => void this.flushStreamEventBuffer(),
741
+ STREAM_EVENT_FLUSH_INTERVAL_MS,
742
+ )
743
+ }
744
+ return
745
+ }
746
+ await this.flushStreamEventBuffer()
747
+ if (message.type === 'assistant') {
748
+ clearStreamAccumulatorForMessage(this.streamTextAccumulator, message)
749
+ }
750
+ await this.eventUploader.enqueue(this.toClientEvent(message))
751
+ }
752
+
753
+ /** Wrap a StdoutMessage as a ClientEvent, injecting a UUID if missing. */
754
+ private toClientEvent(message: StdoutMessage): ClientEvent {
755
+ const msg = message as unknown as Record<string, unknown>
756
+ return {
757
+ payload: {
758
+ ...msg,
759
+ uuid: typeof msg.uuid === 'string' ? msg.uuid : randomUUID(),
760
+ } as EventPayload,
761
+ }
762
+ }
763
+
764
+ /**
765
+ * Drain the stream_event delay buffer: accumulate text_deltas into
766
+ * full-so-far snapshots, clear the timer, enqueue the resulting events.
767
+ * Called from the timer, from writeEvent on a non-stream message, and from
768
+ * flush(). close() drops the buffer — call flush() first if you need
769
+ * delivery.
770
+ */
771
+ private async flushStreamEventBuffer(): Promise<void> {
772
+ if (this.streamEventTimer) {
773
+ clearTimeout(this.streamEventTimer)
774
+ this.streamEventTimer = null
775
+ }
776
+ if (this.streamEventBuffer.length === 0) return
777
+ const buffered = this.streamEventBuffer
778
+ this.streamEventBuffer = []
779
+ const payloads = accumulateStreamEvents(
780
+ buffered,
781
+ this.streamTextAccumulator,
782
+ )
783
+ await this.eventUploader.enqueue(
784
+ payloads.map(payload => ({ payload, ephemeral: true })),
785
+ )
786
+ }
787
+
788
+ /**
789
+ * Write an internal worker event via POST /sessions/{id}/worker/internal-events.
790
+ * These events are NOT visible to frontend clients — they store worker-internal
791
+ * state (transcript messages, compaction markers) needed for session resume.
792
+ */
793
+ async writeInternalEvent(
794
+ eventType: string,
795
+ payload: Record<string, unknown>,
796
+ {
797
+ isCompaction = false,
798
+ agentId,
799
+ }: {
800
+ isCompaction?: boolean
801
+ agentId?: string
802
+ } = {},
803
+ ): Promise<void> {
804
+ const event: WorkerEvent = {
805
+ payload: {
806
+ type: eventType,
807
+ ...payload,
808
+ uuid: typeof payload.uuid === 'string' ? payload.uuid : randomUUID(),
809
+ } as EventPayload,
810
+ ...(isCompaction && { is_compaction: true }),
811
+ ...(agentId && { agent_id: agentId }),
812
+ }
813
+ await this.internalEventUploader.enqueue(event)
814
+ }
815
+
816
+ /**
817
+ * Flush pending internal events. Call between turns and on shutdown
818
+ * to ensure transcript entries are persisted.
819
+ */
820
+ flushInternalEvents(): Promise<void> {
821
+ return this.internalEventUploader.flush()
822
+ }
823
+
824
+ /**
825
+ * Flush pending client events (writeEvent queue). Call before close()
826
+ * when the caller needs delivery confirmation — close() abandons the
827
+ * queue. Resolves once the uploader drains or rejects; returns
828
+ * regardless of whether individual POSTs succeeded (check server state
829
+ * separately if that matters).
830
+ */
831
+ async flush(): Promise<void> {
832
+ await this.flushStreamEventBuffer()
833
+ return this.eventUploader.flush()
834
+ }
835
+
836
+ /**
837
+ * Read foreground agent internal events from
838
+ * GET /sessions/{id}/worker/internal-events.
839
+ * Returns transcript entries from the last compaction boundary, or null on failure.
840
+ * Used for session resume.
841
+ */
842
+ async readInternalEvents(): Promise<InternalEvent[] | null> {
843
+ return this.paginatedGet('/worker/internal-events', {}, 'internal_events')
844
+ }
845
+
846
+ /**
847
+ * Read all subagent internal events from
848
+ * GET /sessions/{id}/worker/internal-events?subagents=true.
849
+ * Returns a merged stream across all non-foreground agents, each from its
850
+ * compaction point. Used for session resume.
851
+ */
852
+ async readSubagentInternalEvents(): Promise<InternalEvent[] | null> {
853
+ return this.paginatedGet(
854
+ '/worker/internal-events',
855
+ { subagents: 'true' },
856
+ 'subagent_events',
857
+ )
858
+ }
859
+
860
+ /**
861
+ * Paginated GET with retry. Fetches all pages from a list endpoint,
862
+ * retrying each page on failure with exponential backoff + jitter.
863
+ */
864
+ private async paginatedGet(
865
+ path: string,
866
+ params: Record<string, string>,
867
+ context: string,
868
+ ): Promise<InternalEvent[] | null> {
869
+ const authHeaders = this.getAuthHeaders()
870
+ if (Object.keys(authHeaders).length === 0) return null
871
+
872
+ const allEvents: InternalEvent[] = []
873
+ let cursor: string | undefined
874
+
875
+ do {
876
+ const url = new URL(`${this.sessionBaseUrl}${path}`)
877
+ for (const [k, v] of Object.entries(params)) {
878
+ url.searchParams.set(k, v)
879
+ }
880
+ if (cursor) {
881
+ url.searchParams.set('cursor', cursor)
882
+ }
883
+
884
+ const page = await this.getWithRetry<ListInternalEventsResponse>(
885
+ url.toString(),
886
+ authHeaders,
887
+ context,
888
+ )
889
+ if (!page) return null
890
+
891
+ allEvents.push(...(page.data ?? []))
892
+ cursor = page.next_cursor
893
+ } while (cursor)
894
+
895
+ logForDebugging(
896
+ `CCRClient: Read ${allEvents.length} internal events from ${path}${params.subagents ? ' (subagents)' : ''}`,
897
+ )
898
+ return allEvents
899
+ }
900
+
901
+ /**
902
+ * Single GET request with retry. Returns the parsed response body
903
+ * on success, null if all retries are exhausted.
904
+ */
905
+ private async getWithRetry<T>(
906
+ url: string,
907
+ authHeaders: Record<string, string>,
908
+ context: string,
909
+ ): Promise<T | null> {
910
+ for (let attempt = 1; attempt <= 10; attempt++) {
911
+ let response
912
+ try {
913
+ response = await this.http.get<T>(url, {
914
+ headers: {
915
+ ...authHeaders,
916
+ 'anthropic-version': '2023-06-01',
917
+ 'User-Agent': getClaudeCodeUserAgent(),
918
+ },
919
+ validateStatus: alwaysValidStatus,
920
+ timeout: 30_000,
921
+ })
922
+ } catch (error) {
923
+ logForDebugging(
924
+ `CCRClient: GET ${url} failed (attempt ${attempt}/10): ${errorMessage(error)}`,
925
+ { level: 'warn' },
926
+ )
927
+ if (attempt < 10) {
928
+ const delay =
929
+ Math.min(500 * 2 ** (attempt - 1), 30_000) + Math.random() * 500
930
+ await sleep(delay)
931
+ }
932
+ continue
933
+ }
934
+
935
+ if (response.status >= 200 && response.status < 300) {
936
+ return response.data
937
+ }
938
+ if (response.status === 409) {
939
+ this.handleEpochMismatch()
940
+ }
941
+ logForDebugging(
942
+ `CCRClient: GET ${url} returned ${response.status} (attempt ${attempt}/10)`,
943
+ { level: 'warn' },
944
+ )
945
+
946
+ if (attempt < 10) {
947
+ const delay =
948
+ Math.min(500 * 2 ** (attempt - 1), 30_000) + Math.random() * 500
949
+ await sleep(delay)
950
+ }
951
+ }
952
+
953
+ logForDebugging('CCRClient: GET retries exhausted', { level: 'error' })
954
+ logForDiagnosticsNoPII('error', 'cli_worker_get_retries_exhausted', {
955
+ context,
956
+ })
957
+ return null
958
+ }
959
+
960
+ /**
961
+ * Report delivery status for a client-to-worker event.
962
+ * POST /v1/code/sessions/{id}/worker/events/delivery (batch endpoint)
963
+ */
964
+ reportDelivery(
965
+ eventId: string,
966
+ status: 'received' | 'processing' | 'processed',
967
+ ): void {
968
+ void this.deliveryUploader.enqueue({ eventId, status })
969
+ }
970
+
971
+ /** Get the current epoch (for external use). */
972
+ getWorkerEpoch(): number {
973
+ return this.workerEpoch
974
+ }
975
+
976
+ /** Internal-event queue depth — shutdown-snapshot backpressure signal. */
977
+ get internalEventsPending(): number {
978
+ return this.internalEventUploader.pendingCount
979
+ }
980
+
981
+ /** Clean up uploaders and timers. */
982
+ close(): void {
983
+ this.closed = true
984
+ this.stopHeartbeat()
985
+ unregisterSessionActivityCallback()
986
+ if (this.streamEventTimer) {
987
+ clearTimeout(this.streamEventTimer)
988
+ this.streamEventTimer = null
989
+ }
990
+ this.streamEventBuffer = []
991
+ this.streamTextAccumulator.byMessage.clear()
992
+ this.streamTextAccumulator.scopeToMessage.clear()
993
+ this.workerState.close()
994
+ this.eventUploader.close()
995
+ this.internalEventUploader.close()
996
+ this.deliveryUploader.close()
997
+ }
998
+ }