@xortex/xcode 3.0.1 → 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 (968) 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/history.ts +464 -0
  666. package/hooks/fileSuggestions.ts +811 -0
  667. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  668. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  669. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  670. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  671. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  672. package/hooks/notifs/useInstallMessages.tsx +26 -0
  673. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  674. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  675. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  676. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  677. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  678. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  679. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  680. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  681. package/hooks/notifs/useStartupNotification.ts +41 -0
  682. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  683. package/hooks/renderPlaceholder.ts +51 -0
  684. package/hooks/toolPermission/PermissionContext.ts +388 -0
  685. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  686. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  687. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  688. package/hooks/toolPermission/permissionLogging.ts +238 -0
  689. package/hooks/unifiedSuggestions.ts +202 -0
  690. package/hooks/useAfterFirstRender.ts +17 -0
  691. package/hooks/useApiKeyVerification.ts +84 -0
  692. package/hooks/useArrowKeyHistory.tsx +229 -0
  693. package/hooks/useAssistantHistory.ts +250 -0
  694. package/hooks/useAwaySummary.ts +125 -0
  695. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  696. package/hooks/useBlink.ts +34 -0
  697. package/hooks/useCanUseTool.tsx +204 -0
  698. package/hooks/useCancelRequest.ts +276 -0
  699. package/hooks/useChromeExtensionNotification.tsx +50 -0
  700. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  701. package/hooks/useClipboardImageHint.ts +77 -0
  702. package/hooks/useCommandKeybindings.tsx +108 -0
  703. package/hooks/useCommandQueue.ts +15 -0
  704. package/hooks/useCopyOnSelect.ts +98 -0
  705. package/hooks/useDeferredHookMessages.ts +46 -0
  706. package/hooks/useDiffData.ts +110 -0
  707. package/hooks/useDiffInIDE.ts +379 -0
  708. package/hooks/useDirectConnect.ts +229 -0
  709. package/hooks/useDoublePress.ts +62 -0
  710. package/hooks/useDynamicConfig.ts +22 -0
  711. package/hooks/useElapsedTime.ts +37 -0
  712. package/hooks/useExitOnCtrlCD.ts +95 -0
  713. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  714. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  715. package/hooks/useGlobalKeybindings.tsx +249 -0
  716. package/hooks/useHistorySearch.ts +303 -0
  717. package/hooks/useIDEIntegration.tsx +70 -0
  718. package/hooks/useIdeAtMentioned.ts +76 -0
  719. package/hooks/useIdeConnectionStatus.ts +33 -0
  720. package/hooks/useIdeLogging.ts +41 -0
  721. package/hooks/useIdeSelection.ts +150 -0
  722. package/hooks/useInboxPoller.ts +969 -0
  723. package/hooks/useInputBuffer.ts +132 -0
  724. package/hooks/useIssueFlagBanner.ts +133 -0
  725. package/hooks/useLogMessages.ts +119 -0
  726. package/hooks/useLspPluginRecommendation.tsx +194 -0
  727. package/hooks/useMailboxBridge.ts +21 -0
  728. package/hooks/useMainLoopModel.ts +34 -0
  729. package/hooks/useManagePlugins.ts +304 -0
  730. package/hooks/useMemoryUsage.ts +39 -0
  731. package/hooks/useMergedClients.ts +23 -0
  732. package/hooks/useMergedCommands.ts +15 -0
  733. package/hooks/useMergedTools.ts +44 -0
  734. package/hooks/useMinDisplayTime.ts +35 -0
  735. package/hooks/useNotifyAfterTimeout.ts +65 -0
  736. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  737. package/hooks/usePasteHandler.ts +285 -0
  738. package/hooks/usePluginRecommendationBase.tsx +105 -0
  739. package/hooks/usePrStatus.ts +106 -0
  740. package/hooks/usePromptSuggestion.ts +177 -0
  741. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  742. package/hooks/useQueueProcessor.ts +68 -0
  743. package/hooks/useRemoteSession.ts +605 -0
  744. package/hooks/useReplBridge.tsx +723 -0
  745. package/hooks/useSSHSession.ts +241 -0
  746. package/hooks/useScheduledTasks.ts +139 -0
  747. package/hooks/useSearchInput.ts +364 -0
  748. package/hooks/useSessionBackgrounding.ts +158 -0
  749. package/hooks/useSettings.ts +17 -0
  750. package/hooks/useSettingsChange.ts +25 -0
  751. package/hooks/useSkillImprovementSurvey.ts +105 -0
  752. package/hooks/useSkillsChange.ts +62 -0
  753. package/hooks/useSwarmInitialization.ts +81 -0
  754. package/hooks/useSwarmPermissionPoller.ts +330 -0
  755. package/hooks/useTaskListWatcher.ts +221 -0
  756. package/hooks/useTasksV2.ts +250 -0
  757. package/hooks/useTeammateViewAutoExit.ts +63 -0
  758. package/hooks/useTeleportResume.tsx +85 -0
  759. package/hooks/useTerminalSize.ts +15 -0
  760. package/hooks/useTextInput.ts +529 -0
  761. package/hooks/useTimeout.ts +14 -0
  762. package/hooks/useTurnDiffs.ts +213 -0
  763. package/hooks/useTypeahead.tsx +1385 -0
  764. package/hooks/useUpdateNotification.ts +34 -0
  765. package/hooks/useVimInput.ts +316 -0
  766. package/hooks/useVirtualScroll.ts +721 -0
  767. package/hooks/useVoice.ts +1144 -0
  768. package/hooks/useVoiceEnabled.ts +25 -0
  769. package/hooks/useVoiceIntegration.tsx +677 -0
  770. package/ink/Ansi.tsx +292 -0
  771. package/ink/bidi.ts +139 -0
  772. package/ink/clearTerminal.ts +74 -0
  773. package/ink/colorize.ts +231 -0
  774. package/ink/components/AlternateScreen.tsx +80 -0
  775. package/ink/components/App.tsx +658 -0
  776. package/ink/components/AppContext.ts +21 -0
  777. package/ink/components/Box.tsx +214 -0
  778. package/ink/components/Button.tsx +192 -0
  779. package/ink/components/ClockContext.tsx +112 -0
  780. package/ink/components/CursorDeclarationContext.ts +32 -0
  781. package/ink/components/ErrorOverview.tsx +109 -0
  782. package/ink/components/Link.tsx +42 -0
  783. package/ink/components/Newline.tsx +39 -0
  784. package/ink/components/NoSelect.tsx +68 -0
  785. package/ink/components/RawAnsi.tsx +57 -0
  786. package/ink/components/ScrollBox.tsx +237 -0
  787. package/ink/components/Spacer.tsx +20 -0
  788. package/ink/components/StdinContext.ts +49 -0
  789. package/ink/components/TerminalFocusContext.tsx +52 -0
  790. package/ink/components/TerminalSizeContext.tsx +7 -0
  791. package/ink/components/Text.tsx +254 -0
  792. package/ink/constants.ts +2 -0
  793. package/ink/dom.ts +484 -0
  794. package/ink/events/click-event.ts +38 -0
  795. package/ink/events/dispatcher.ts +233 -0
  796. package/ink/events/emitter.ts +39 -0
  797. package/ink/events/event-handlers.ts +73 -0
  798. package/ink/events/event.ts +11 -0
  799. package/ink/events/focus-event.ts +21 -0
  800. package/ink/events/input-event.ts +205 -0
  801. package/ink/events/keyboard-event.ts +51 -0
  802. package/ink/events/terminal-event.ts +107 -0
  803. package/ink/events/terminal-focus-event.ts +19 -0
  804. package/ink/focus.ts +181 -0
  805. package/ink/frame.ts +124 -0
  806. package/ink/get-max-width.ts +27 -0
  807. package/ink/global.d.ts +26 -0
  808. package/ink/hit-test.ts +130 -0
  809. package/ink/hooks/use-animation-frame.ts +57 -0
  810. package/ink/hooks/use-app.ts +8 -0
  811. package/ink/hooks/use-declared-cursor.ts +73 -0
  812. package/ink/hooks/use-input.ts +92 -0
  813. package/ink/hooks/use-interval.ts +67 -0
  814. package/ink/hooks/use-search-highlight.ts +53 -0
  815. package/ink/hooks/use-selection.ts +104 -0
  816. package/ink/hooks/use-stdin.ts +8 -0
  817. package/ink/hooks/use-tab-status.ts +72 -0
  818. package/ink/hooks/use-terminal-focus.ts +16 -0
  819. package/ink/hooks/use-terminal-title.ts +31 -0
  820. package/ink/hooks/use-terminal-viewport.ts +96 -0
  821. package/ink/ink.tsx +1754 -0
  822. package/ink/instances.ts +10 -0
  823. package/ink/layout/engine.ts +6 -0
  824. package/ink/layout/geometry.ts +97 -0
  825. package/ink/layout/node.ts +152 -0
  826. package/ink/layout/yoga.ts +308 -0
  827. package/ink/line-width-cache.ts +24 -0
  828. package/ink/log-update.ts +773 -0
  829. package/ink/measure-element.ts +23 -0
  830. package/ink/measure-text.ts +47 -0
  831. package/ink/node-cache.ts +54 -0
  832. package/ink/optimizer.ts +93 -0
  833. package/ink/output.ts +797 -0
  834. package/ink/parse-keypress.ts +801 -0
  835. package/ink/reconciler.ts +512 -0
  836. package/ink/render-border.ts +231 -0
  837. package/ink/render-node-to-output.ts +1462 -0
  838. package/ink/render-to-screen.ts +231 -0
  839. package/ink/renderer.ts +178 -0
  840. package/ink/root.ts +184 -0
  841. package/ink/screen.ts +1486 -0
  842. package/ink/searchHighlight.ts +93 -0
  843. package/ink/selection.ts +917 -0
  844. package/ink/squash-text-nodes.ts +92 -0
  845. package/ink/stringWidth.ts +223 -0
  846. package/ink/styles.ts +771 -0
  847. package/ink/supports-hyperlinks.ts +57 -0
  848. package/ink/tabstops.ts +46 -0
  849. package/ink/terminal-focus-state.ts +47 -0
  850. package/ink/terminal-querier.ts +212 -0
  851. package/ink/terminal.ts +248 -0
  852. package/ink/termio/ansi.ts +75 -0
  853. package/ink/termio/csi.ts +319 -0
  854. package/ink/termio/dec.ts +60 -0
  855. package/ink/termio/esc.ts +67 -0
  856. package/ink/termio/osc.ts +493 -0
  857. package/ink/termio/parser.ts +394 -0
  858. package/ink/termio/sgr.ts +308 -0
  859. package/ink/termio/tokenize.ts +319 -0
  860. package/ink/termio/types.ts +236 -0
  861. package/ink/termio.ts +42 -0
  862. package/ink/useTerminalNotification.ts +126 -0
  863. package/ink/warn.ts +9 -0
  864. package/ink/widest-line.ts +19 -0
  865. package/ink/wrap-text.ts +74 -0
  866. package/ink/wrapAnsi.ts +20 -0
  867. package/inspect.js +7 -0
  868. package/keybindings/KeybindingContext.tsx +243 -0
  869. package/keybindings/KeybindingProviderSetup.tsx +308 -0
  870. package/keybindings/defaultBindings.ts +340 -0
  871. package/keybindings/loadUserBindings.ts +472 -0
  872. package/keybindings/match.ts +120 -0
  873. package/keybindings/parser.ts +203 -0
  874. package/keybindings/reservedShortcuts.ts +127 -0
  875. package/keybindings/resolver.ts +244 -0
  876. package/keybindings/schema.ts +236 -0
  877. package/keybindings/shortcutFormat.ts +63 -0
  878. package/keybindings/template.ts +52 -0
  879. package/keybindings/useKeybinding.ts +196 -0
  880. package/keybindings/useShortcutDisplay.ts +59 -0
  881. package/keybindings/validate.ts +498 -0
  882. package/macro.ts +24 -0
  883. package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  884. package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  885. package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  886. package/migrations/migrateFennecToOpus.ts +45 -0
  887. package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  888. package/migrations/migrateOpusToOpus1m.ts +43 -0
  889. package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  890. package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  891. package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  892. package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  893. package/migrations/resetProToOpusDefault.ts +51 -0
  894. package/package.json +29 -3
  895. package/patch-box.js +54 -0
  896. package/patch-compact.js +13 -0
  897. package/patch-condensed-center.js +13 -0
  898. package/patch-condensed-row.js +13 -0
  899. package/patch-condensed.js +13 -0
  900. package/patch-final.js +58 -0
  901. package/patch-input-body.js +46 -0
  902. package/patch-input-body2.js +35 -0
  903. package/patch-input-style.js +13 -0
  904. package/patch-input-width.js +13 -0
  905. package/patch-layout.js +87 -0
  906. package/patch-logo-row.js +12 -0
  907. package/patch-width.js +13 -0
  908. package/patch-width2.js +13 -0
  909. package/patch2.js +74 -0
  910. package/patch3.js +13 -0
  911. package/query.ts +1750 -0
  912. package/remote/RemoteSessionManager.ts +343 -0
  913. package/remote/SessionsWebSocket.ts +404 -0
  914. package/remote/remotePermissionBridge.ts +78 -0
  915. package/remote/sdkMessageAdapter.ts +302 -0
  916. package/skills/bundled/batch.ts +124 -0
  917. package/skills/bundled/claudeApi.ts +196 -0
  918. package/skills/bundled/claudeApiContent.ts +75 -0
  919. package/skills/bundled/claudeInChrome.ts +34 -0
  920. package/skills/bundled/debug.ts +103 -0
  921. package/skills/bundled/index.ts +79 -0
  922. package/skills/bundled/keybindings.ts +339 -0
  923. package/skills/bundled/loop.ts +92 -0
  924. package/skills/bundled/loremIpsum.ts +282 -0
  925. package/skills/bundled/remember.ts +82 -0
  926. package/skills/bundled/scheduleRemoteAgents.ts +447 -0
  927. package/skills/bundled/simplify.ts +69 -0
  928. package/skills/bundled/skillify.ts +197 -0
  929. package/skills/bundled/stuck.ts +79 -0
  930. package/skills/bundled/updateConfig.ts +475 -0
  931. package/skills/bundled/verify/SKILL.md +3 -0
  932. package/skills/bundled/verify/examples/cli.md +3 -0
  933. package/skills/bundled/verify/examples/server.md +3 -0
  934. package/skills/bundled/verify.ts +30 -0
  935. package/skills/bundled/verifyContent.ts +13 -0
  936. package/skills/bundledSkills.ts +220 -0
  937. package/skills/loadSkillsDir.ts +1086 -0
  938. package/skills/mcpSkillBuilders.ts +44 -0
  939. package/state/AppState.tsx +200 -0
  940. package/state/AppStateStore.ts +569 -0
  941. package/state/onChangeAppState.ts +171 -0
  942. package/state/selectors.ts +76 -0
  943. package/state/store.ts +34 -0
  944. package/state/teammateViewHelpers.ts +141 -0
  945. package/tasks/DreamTask/DreamTask.ts +157 -0
  946. package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  947. package/tasks/InProcessTeammateTask/types.ts +121 -0
  948. package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  949. package/tasks/LocalMainSessionTask.ts +479 -0
  950. package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  951. package/tasks/LocalShellTask/guards.ts +41 -0
  952. package/tasks/LocalShellTask/killShellTasks.ts +76 -0
  953. package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  954. package/tasks/pillLabel.ts +82 -0
  955. package/tasks/stopTask.ts +100 -0
  956. package/tasks/types.ts +46 -0
  957. package/types/command.ts +216 -0
  958. package/types/connectorText.ts +13 -0
  959. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  960. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  961. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  962. package/types/generated/google/protobuf/timestamp.ts +187 -0
  963. package/types/hooks.ts +290 -0
  964. package/types/ids.ts +44 -0
  965. package/types/logs.ts +330 -0
  966. package/types/permissions.ts +441 -0
  967. package/types/plugin.ts +363 -0
  968. package/types/textInputTypes.ts +387 -0
@@ -0,0 +1,859 @@
1
+ import { feature } from 'bun:bundle'
2
+ import type {
3
+ ElicitResult,
4
+ JSONRPCMessage,
5
+ } from '@modelcontextprotocol/sdk/types.js'
6
+ import { randomUUID } from 'crypto'
7
+ import type { AssistantMessage } from 'src//types/message.js'
8
+ import type {
9
+ HookInput,
10
+ HookJSONOutput,
11
+ PermissionUpdate,
12
+ SDKMessage,
13
+ SDKUserMessage,
14
+ } from 'src/entrypoints/agentSdkTypes.js'
15
+ import { SDKControlElicitationResponseSchema } from 'src/entrypoints/sdk/controlSchemas.js'
16
+ import type {
17
+ SDKControlRequest,
18
+ SDKControlResponse,
19
+ StdinMessage,
20
+ StdoutMessage,
21
+ } from 'src/entrypoints/sdk/controlTypes.js'
22
+ import type { CanUseToolFn } from 'src/hooks/useCanUseTool.js'
23
+ import type { Tool, ToolUseContext } from 'src/Tool.js'
24
+ import { type HookCallback, hookJSONOutputSchema } from 'src/types/hooks.js'
25
+ import { logForDebugging } from 'src/utils/debug.js'
26
+ import { logForDiagnosticsNoPII } from 'src/utils/diagLogs.js'
27
+ import { AbortError } from 'src/utils/errors.js'
28
+ import {
29
+ type Output as PermissionToolOutput,
30
+ permissionPromptToolResultToPermissionDecision,
31
+ outputSchema as permissionToolOutputSchema,
32
+ } from 'src/utils/permissions/PermissionPromptToolResultSchema.js'
33
+ import type {
34
+ PermissionDecision,
35
+ PermissionDecisionReason,
36
+ } from 'src/utils/permissions/PermissionResult.js'
37
+ import { hasPermissionsToUseTool } from 'src/utils/permissions/permissions.js'
38
+ import { writeToStdout } from 'src/utils/process.js'
39
+ import { jsonStringify } from 'src/utils/slowOperations.js'
40
+ import { z } from 'zod/v4'
41
+ import { notifyCommandLifecycle } from '../utils/commandLifecycle.js'
42
+ import { normalizeControlMessageKeys } from '../utils/controlMessageCompat.js'
43
+ import { executePermissionRequestHooks } from '../utils/hooks.js'
44
+ import {
45
+ applyPermissionUpdates,
46
+ persistPermissionUpdates,
47
+ } from '../utils/permissions/PermissionUpdate.js'
48
+ import {
49
+ notifySessionStateChanged,
50
+ type RequiresActionDetails,
51
+ type SessionExternalMetadata,
52
+ } from '../utils/sessionState.js'
53
+ import { jsonParse } from '../utils/slowOperations.js'
54
+ import { Stream } from '../utils/stream.js'
55
+ import { ndjsonSafeStringify } from './ndjsonSafeStringify.js'
56
+
57
+ /**
58
+ * Synthetic tool name used when forwarding sandbox network permission
59
+ * requests via the can_use_tool control_request protocol. SDK hosts
60
+ * see this as a normal tool permission prompt.
61
+ */
62
+ export const SANDBOX_NETWORK_ACCESS_TOOL_NAME = 'SandboxNetworkAccess'
63
+
64
+ function serializeDecisionReason(
65
+ reason: PermissionDecisionReason | undefined,
66
+ ): string | undefined {
67
+ if (!reason) {
68
+ return undefined
69
+ }
70
+
71
+ if (
72
+ (feature('BASH_CLASSIFIER') || feature('TRANSCRIPT_CLASSIFIER')) &&
73
+ reason.type === 'classifier'
74
+ ) {
75
+ return reason.reason
76
+ }
77
+ switch (reason.type) {
78
+ case 'rule':
79
+ case 'mode':
80
+ case 'subcommandResults':
81
+ case 'permissionPromptTool':
82
+ return undefined
83
+ case 'hook':
84
+ case 'asyncAgent':
85
+ case 'sandboxOverride':
86
+ case 'workingDir':
87
+ case 'safetyCheck':
88
+ case 'other':
89
+ return reason.reason
90
+ }
91
+ }
92
+
93
+ function buildRequiresActionDetails(
94
+ tool: Tool,
95
+ input: Record<string, unknown>,
96
+ toolUseID: string,
97
+ requestId: string,
98
+ ): RequiresActionDetails {
99
+ // Per-tool summary methods may throw on malformed input; permission
100
+ // handling must not break because of a bad description.
101
+ let description: string
102
+ try {
103
+ description =
104
+ tool.getActivityDescription?.(input) ??
105
+ tool.getToolUseSummary?.(input) ??
106
+ tool.userFacingName(input)
107
+ } catch {
108
+ description = tool.name
109
+ }
110
+ return {
111
+ tool_name: tool.name,
112
+ action_description: description,
113
+ tool_use_id: toolUseID,
114
+ request_id: requestId,
115
+ input,
116
+ }
117
+ }
118
+
119
+ type PendingRequest<T> = {
120
+ resolve: (result: T) => void
121
+ reject: (error: unknown) => void
122
+ schema?: z.Schema
123
+ request: SDKControlRequest
124
+ }
125
+
126
+ /**
127
+ * Provides a structured way to read and write SDK messages from stdio,
128
+ * capturing the SDK protocol.
129
+ */
130
+ // Maximum number of resolved tool_use IDs to track. Once exceeded, the oldest
131
+ // entry is evicted. This bounds memory in very long sessions while keeping
132
+ // enough history to catch duplicate control_response deliveries.
133
+ const MAX_RESOLVED_TOOL_USE_IDS = 1000
134
+
135
+ export class StructuredIO {
136
+ readonly structuredInput: AsyncGenerator<StdinMessage | SDKMessage>
137
+ private readonly pendingRequests = new Map<string, PendingRequest<unknown>>()
138
+
139
+ // CCR external_metadata read back on worker start; null when the
140
+ // transport doesn't restore. Assigned by RemoteIO.
141
+ restoredWorkerState: Promise<SessionExternalMetadata | null> =
142
+ Promise.resolve(null)
143
+
144
+ private inputClosed = false
145
+ private unexpectedResponseCallback?: (
146
+ response: SDKControlResponse,
147
+ ) => Promise<void>
148
+
149
+ // Tracks tool_use IDs that have been resolved through the normal permission
150
+ // flow (or aborted by a hook). When a duplicate control_response arrives
151
+ // after the original was already handled, this Set prevents the orphan
152
+ // handler from re-processing it — which would push duplicate assistant
153
+ // messages into mutableMessages and cause a 400 "tool_use ids must be unique"
154
+ // error from the API.
155
+ private readonly resolvedToolUseIds = new Set<string>()
156
+ private prependedLines: string[] = []
157
+ private onControlRequestSent?: (request: SDKControlRequest) => void
158
+ private onControlRequestResolved?: (requestId: string) => void
159
+
160
+ // sendRequest() and print.ts both enqueue here; the drain loop is the
161
+ // only writer. Prevents control_request from overtaking queued stream_events.
162
+ readonly outbound = new Stream<StdoutMessage>()
163
+
164
+ constructor(
165
+ private readonly input: AsyncIterable<string>,
166
+ private readonly replayUserMessages?: boolean,
167
+ ) {
168
+ this.input = input
169
+ this.structuredInput = this.read()
170
+ }
171
+
172
+ /**
173
+ * Records a tool_use ID as resolved so that late/duplicate control_response
174
+ * messages for the same tool are ignored by the orphan handler.
175
+ */
176
+ private trackResolvedToolUseId(request: SDKControlRequest): void {
177
+ if (request.request.subtype === 'can_use_tool') {
178
+ this.resolvedToolUseIds.add(request.request.tool_use_id)
179
+ if (this.resolvedToolUseIds.size > MAX_RESOLVED_TOOL_USE_IDS) {
180
+ // Evict the oldest entry (Sets iterate in insertion order)
181
+ const first = this.resolvedToolUseIds.values().next().value
182
+ if (first !== undefined) {
183
+ this.resolvedToolUseIds.delete(first)
184
+ }
185
+ }
186
+ }
187
+ }
188
+
189
+ /** Flush pending internal events. No-op for non-remote IO. Overridden by RemoteIO. */
190
+ flushInternalEvents(): Promise<void> {
191
+ return Promise.resolve()
192
+ }
193
+
194
+ /** Internal-event queue depth. Overridden by RemoteIO; zero otherwise. */
195
+ get internalEventsPending(): number {
196
+ return 0
197
+ }
198
+
199
+ /**
200
+ * Queue a user turn to be yielded before the next message from this.input.
201
+ * Works before iteration starts and mid-stream — read() re-checks
202
+ * prependedLines between each yielded message.
203
+ */
204
+ prependUserMessage(content: string): void {
205
+ this.prependedLines.push(
206
+ jsonStringify({
207
+ type: 'user',
208
+ session_id: '',
209
+ message: { role: 'user', content },
210
+ parent_tool_use_id: null,
211
+ } satisfies SDKUserMessage) + '\n',
212
+ )
213
+ }
214
+
215
+ private async *read() {
216
+ let content = ''
217
+
218
+ // Called once before for-await (an empty this.input otherwise skips the
219
+ // loop body entirely), then again per block. prependedLines re-check is
220
+ // inside the while so a prepend pushed between two messages in the SAME
221
+ // block still lands first.
222
+ const splitAndProcess = async function* (this: StructuredIO) {
223
+ for (;;) {
224
+ if (this.prependedLines.length > 0) {
225
+ content = this.prependedLines.join('') + content
226
+ this.prependedLines = []
227
+ }
228
+ const newline = content.indexOf('\n')
229
+ if (newline === -1) break
230
+ const line = content.slice(0, newline)
231
+ content = content.slice(newline + 1)
232
+ const message = await this.processLine(line)
233
+ if (message) {
234
+ logForDiagnosticsNoPII('info', 'cli_stdin_message_parsed', {
235
+ type: message.type,
236
+ })
237
+ yield message
238
+ }
239
+ }
240
+ }.bind(this)
241
+
242
+ yield* splitAndProcess()
243
+
244
+ for await (const block of this.input) {
245
+ content += block
246
+ yield* splitAndProcess()
247
+ }
248
+ if (content) {
249
+ const message = await this.processLine(content)
250
+ if (message) {
251
+ yield message
252
+ }
253
+ }
254
+ this.inputClosed = true
255
+ for (const request of this.pendingRequests.values()) {
256
+ // Reject all pending requests if the input stream
257
+ request.reject(
258
+ new Error('Tool permission stream closed before response received'),
259
+ )
260
+ }
261
+ }
262
+
263
+ getPendingPermissionRequests() {
264
+ return Array.from(this.pendingRequests.values())
265
+ .map(entry => entry.request)
266
+ .filter(pr => pr.request.subtype === 'can_use_tool')
267
+ }
268
+
269
+ setUnexpectedResponseCallback(
270
+ callback: (response: SDKControlResponse) => Promise<void>,
271
+ ): void {
272
+ this.unexpectedResponseCallback = callback
273
+ }
274
+
275
+ /**
276
+ * Inject a control_response message to resolve a pending permission request.
277
+ * Used by the bridge to feed permission responses from claude.ai into the
278
+ * SDK permission flow.
279
+ *
280
+ * Also sends a control_cancel_request to the SDK consumer so its canUseTool
281
+ * callback is aborted via the signal — otherwise the callback hangs.
282
+ */
283
+ injectControlResponse(response: SDKControlResponse): void {
284
+ const requestId = response.response?.request_id
285
+ if (!requestId) return
286
+ const request = this.pendingRequests.get(requestId)
287
+ if (!request) return
288
+ this.trackResolvedToolUseId(request.request)
289
+ this.pendingRequests.delete(requestId)
290
+ // Cancel the SDK consumer's canUseTool callback — the bridge won.
291
+ void this.write({
292
+ type: 'control_cancel_request',
293
+ request_id: requestId,
294
+ })
295
+ if (response.response.subtype === 'error') {
296
+ request.reject(new Error(response.response.error))
297
+ } else {
298
+ const result = response.response.response
299
+ if (request.schema) {
300
+ try {
301
+ request.resolve(request.schema.parse(result))
302
+ } catch (error) {
303
+ request.reject(error)
304
+ }
305
+ } else {
306
+ request.resolve({})
307
+ }
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Register a callback invoked whenever a can_use_tool control_request
313
+ * is written to stdout. Used by the bridge to forward permission
314
+ * requests to claude.ai.
315
+ */
316
+ setOnControlRequestSent(
317
+ callback: ((request: SDKControlRequest) => void) | undefined,
318
+ ): void {
319
+ this.onControlRequestSent = callback
320
+ }
321
+
322
+ /**
323
+ * Register a callback invoked when a can_use_tool control_response arrives
324
+ * from the SDK consumer (via stdin). Used by the bridge to cancel the
325
+ * stale permission prompt on claude.ai when the SDK consumer wins the race.
326
+ */
327
+ setOnControlRequestResolved(
328
+ callback: ((requestId: string) => void) | undefined,
329
+ ): void {
330
+ this.onControlRequestResolved = callback
331
+ }
332
+
333
+ private async processLine(
334
+ line: string,
335
+ ): Promise<StdinMessage | SDKMessage | undefined> {
336
+ // Skip empty lines (e.g. from double newlines in piped stdin)
337
+ if (!line) {
338
+ return undefined
339
+ }
340
+ try {
341
+ const message = normalizeControlMessageKeys(jsonParse(line)) as
342
+ | StdinMessage
343
+ | SDKMessage
344
+ if (message.type === 'keep_alive') {
345
+ // Silently ignore keep-alive messages
346
+ return undefined
347
+ }
348
+ if (message.type === 'update_environment_variables') {
349
+ // Apply environment variable updates directly to process.env.
350
+ // Used by bridge session runner for auth token refresh
351
+ // (CLAUDE_CODE_SESSION_ACCESS_TOKEN) which must be readable
352
+ // by the REPL process itself, not just child Bash commands.
353
+ const keys = Object.keys(message.variables)
354
+ for (const [key, value] of Object.entries(message.variables)) {
355
+ process.env[key] = value
356
+ }
357
+ logForDebugging(
358
+ `[structuredIO] applied update_environment_variables: ${keys.join(', ')}`,
359
+ )
360
+ return undefined
361
+ }
362
+ if (message.type === 'control_response') {
363
+ // Close lifecycle for every control_response, including duplicates
364
+ // and orphans — orphans don't yield to print.ts's main loop, so this
365
+ // is the only path that sees them. uuid is server-injected into the
366
+ // payload.
367
+ const uuid =
368
+ 'uuid' in message && typeof message.uuid === 'string'
369
+ ? message.uuid
370
+ : undefined
371
+ if (uuid) {
372
+ notifyCommandLifecycle(uuid, 'completed')
373
+ }
374
+ const request = this.pendingRequests.get(message.response.request_id)
375
+ if (!request) {
376
+ // Check if this tool_use was already resolved through the normal
377
+ // permission flow. Duplicate control_response deliveries (e.g. from
378
+ // WebSocket reconnects) arrive after the original was handled, and
379
+ // re-processing them would push duplicate assistant messages into
380
+ // the conversation, causing API 400 errors.
381
+ const responsePayload =
382
+ message.response.subtype === 'success'
383
+ ? message.response.response
384
+ : undefined
385
+ const toolUseID = responsePayload?.toolUseID
386
+ if (
387
+ typeof toolUseID === 'string' &&
388
+ this.resolvedToolUseIds.has(toolUseID)
389
+ ) {
390
+ logForDebugging(
391
+ `Ignoring duplicate control_response for already-resolved toolUseID=${toolUseID} request_id=${message.response.request_id}`,
392
+ )
393
+ return undefined
394
+ }
395
+ if (this.unexpectedResponseCallback) {
396
+ await this.unexpectedResponseCallback(message)
397
+ }
398
+ return undefined // Ignore responses for requests we don't know about
399
+ }
400
+ this.trackResolvedToolUseId(request.request)
401
+ this.pendingRequests.delete(message.response.request_id)
402
+ // Notify the bridge when the SDK consumer resolves a can_use_tool
403
+ // request, so it can cancel the stale permission prompt on claude.ai.
404
+ if (
405
+ request.request.request.subtype === 'can_use_tool' &&
406
+ this.onControlRequestResolved
407
+ ) {
408
+ this.onControlRequestResolved(message.response.request_id)
409
+ }
410
+
411
+ if (message.response.subtype === 'error') {
412
+ request.reject(new Error(message.response.error))
413
+ return undefined
414
+ }
415
+ const result = message.response.response
416
+ if (request.schema) {
417
+ try {
418
+ request.resolve(request.schema.parse(result))
419
+ } catch (error) {
420
+ request.reject(error)
421
+ }
422
+ } else {
423
+ request.resolve({})
424
+ }
425
+ // Propagate control responses when replay is enabled
426
+ if (this.replayUserMessages) {
427
+ return message
428
+ }
429
+ return undefined
430
+ }
431
+ if (
432
+ message.type !== 'user' &&
433
+ message.type !== 'control_request' &&
434
+ message.type !== 'assistant' &&
435
+ message.type !== 'system'
436
+ ) {
437
+ logForDebugging(`Ignoring unknown message type: ${message.type}`, {
438
+ level: 'warn',
439
+ })
440
+ return undefined
441
+ }
442
+ if (message.type === 'control_request') {
443
+ if (!message.request) {
444
+ exitWithMessage(`Error: Missing request on control_request`)
445
+ }
446
+ return message
447
+ }
448
+ if (message.type === 'assistant' || message.type === 'system') {
449
+ return message
450
+ }
451
+ if (message.message.role !== 'user') {
452
+ exitWithMessage(
453
+ `Error: Expected message role 'user', got '${message.message.role}'`,
454
+ )
455
+ }
456
+ return message
457
+ } catch (error) {
458
+ // biome-ignore lint/suspicious/noConsole:: intentional console output
459
+ console.error(`Error parsing streaming input line: ${line}: ${error}`)
460
+ // eslint-disable-next-line custom-rules/no-process-exit
461
+ process.exit(1)
462
+ }
463
+ }
464
+
465
+ async write(message: StdoutMessage): Promise<void> {
466
+ writeToStdout(ndjsonSafeStringify(message) + '\n')
467
+ }
468
+
469
+ private async sendRequest<Response>(
470
+ request: SDKControlRequest['request'],
471
+ schema: z.Schema,
472
+ signal?: AbortSignal,
473
+ requestId: string = randomUUID(),
474
+ ): Promise<Response> {
475
+ const message: SDKControlRequest = {
476
+ type: 'control_request',
477
+ request_id: requestId,
478
+ request,
479
+ }
480
+ if (this.inputClosed) {
481
+ throw new Error('Stream closed')
482
+ }
483
+ if (signal?.aborted) {
484
+ throw new Error('Request aborted')
485
+ }
486
+ this.outbound.enqueue(message)
487
+ if (request.subtype === 'can_use_tool' && this.onControlRequestSent) {
488
+ this.onControlRequestSent(message)
489
+ }
490
+ const aborted = () => {
491
+ this.outbound.enqueue({
492
+ type: 'control_cancel_request',
493
+ request_id: requestId,
494
+ })
495
+ // Immediately reject the outstanding promise, without
496
+ // waiting for the host to acknowledge the cancellation.
497
+ const request = this.pendingRequests.get(requestId)
498
+ if (request) {
499
+ // Track the tool_use ID as resolved before rejecting, so that a
500
+ // late response from the host is ignored by the orphan handler.
501
+ this.trackResolvedToolUseId(request.request)
502
+ request.reject(new AbortError())
503
+ }
504
+ }
505
+ if (signal) {
506
+ signal.addEventListener('abort', aborted, {
507
+ once: true,
508
+ })
509
+ }
510
+ try {
511
+ return await new Promise<Response>((resolve, reject) => {
512
+ this.pendingRequests.set(requestId, {
513
+ request: {
514
+ type: 'control_request',
515
+ request_id: requestId,
516
+ request,
517
+ },
518
+ resolve: result => {
519
+ resolve(result as Response)
520
+ },
521
+ reject,
522
+ schema,
523
+ })
524
+ })
525
+ } finally {
526
+ if (signal) {
527
+ signal.removeEventListener('abort', aborted)
528
+ }
529
+ this.pendingRequests.delete(requestId)
530
+ }
531
+ }
532
+
533
+ createCanUseTool(
534
+ onPermissionPrompt?: (details: RequiresActionDetails) => void,
535
+ ): CanUseToolFn {
536
+ return async (
537
+ tool: Tool,
538
+ input: { [key: string]: unknown },
539
+ toolUseContext: ToolUseContext,
540
+ assistantMessage: AssistantMessage,
541
+ toolUseID: string,
542
+ forceDecision?: PermissionDecision,
543
+ ): Promise<PermissionDecision> => {
544
+ const mainPermissionResult =
545
+ forceDecision ??
546
+ (await hasPermissionsToUseTool(
547
+ tool,
548
+ input,
549
+ toolUseContext,
550
+ assistantMessage,
551
+ toolUseID,
552
+ ))
553
+ // If the tool is allowed or denied, return the result
554
+ if (
555
+ mainPermissionResult.behavior === 'allow' ||
556
+ mainPermissionResult.behavior === 'deny'
557
+ ) {
558
+ return mainPermissionResult
559
+ }
560
+
561
+ // Run PermissionRequest hooks in parallel with the SDK permission
562
+ // prompt. In the terminal CLI, hooks race against the interactive
563
+ // prompt so that e.g. a hook with --delay 20 doesn't block the UI.
564
+ // We need the same behavior here: the SDK host (VS Code, etc.) shows
565
+ // its permission dialog immediately while hooks run in the background.
566
+ // Whichever resolves first wins; the loser is cancelled/ignored.
567
+
568
+ // AbortController used to cancel the SDK request if a hook decides first
569
+ const hookAbortController = new AbortController()
570
+ const parentSignal = toolUseContext.abortController.signal
571
+ // Forward parent abort to our local controller
572
+ const onParentAbort = () => hookAbortController.abort()
573
+ parentSignal.addEventListener('abort', onParentAbort, { once: true })
574
+
575
+ try {
576
+ // Start the hook evaluation (runs in background)
577
+ const hookPromise = executePermissionRequestHooksForSDK(
578
+ tool.name,
579
+ toolUseID,
580
+ input,
581
+ toolUseContext,
582
+ mainPermissionResult.suggestions,
583
+ ).then(decision => ({ source: 'hook' as const, decision }))
584
+
585
+ // Start the SDK permission prompt immediately (don't wait for hooks)
586
+ const requestId = randomUUID()
587
+ onPermissionPrompt?.(
588
+ buildRequiresActionDetails(tool, input, toolUseID, requestId),
589
+ )
590
+ const sdkPromise = this.sendRequest<PermissionToolOutput>(
591
+ {
592
+ subtype: 'can_use_tool',
593
+ tool_name: tool.name,
594
+ input,
595
+ permission_suggestions: mainPermissionResult.suggestions,
596
+ blocked_path: mainPermissionResult.blockedPath,
597
+ decision_reason: serializeDecisionReason(
598
+ mainPermissionResult.decisionReason,
599
+ ),
600
+ tool_use_id: toolUseID,
601
+ agent_id: toolUseContext.agentId,
602
+ },
603
+ permissionToolOutputSchema(),
604
+ hookAbortController.signal,
605
+ requestId,
606
+ ).then(result => ({ source: 'sdk' as const, result }))
607
+
608
+ // Race: hook completion vs SDK prompt response.
609
+ // The hook promise always resolves (never rejects), returning
610
+ // undefined if no hook made a decision.
611
+ const winner = await Promise.race([hookPromise, sdkPromise])
612
+
613
+ if (winner.source === 'hook') {
614
+ if (winner.decision) {
615
+ // Hook decided — abort the pending SDK request.
616
+ // Suppress the expected AbortError rejection from sdkPromise.
617
+ sdkPromise.catch(() => {})
618
+ hookAbortController.abort()
619
+ return winner.decision
620
+ }
621
+ // Hook passed through (no decision) — wait for the SDK prompt
622
+ const sdkResult = await sdkPromise
623
+ return permissionPromptToolResultToPermissionDecision(
624
+ sdkResult.result,
625
+ tool,
626
+ input,
627
+ toolUseContext,
628
+ )
629
+ }
630
+
631
+ // SDK prompt responded first — use its result (hook still running
632
+ // in background but its result will be ignored)
633
+ return permissionPromptToolResultToPermissionDecision(
634
+ winner.result,
635
+ tool,
636
+ input,
637
+ toolUseContext,
638
+ )
639
+ } catch (error) {
640
+ return permissionPromptToolResultToPermissionDecision(
641
+ {
642
+ behavior: 'deny',
643
+ message: `Tool permission request failed: ${error}`,
644
+ toolUseID,
645
+ },
646
+ tool,
647
+ input,
648
+ toolUseContext,
649
+ )
650
+ } finally {
651
+ // Only transition back to 'running' if no other permission prompts
652
+ // are pending (concurrent tool execution can have multiple in-flight).
653
+ if (this.getPendingPermissionRequests().length === 0) {
654
+ notifySessionStateChanged('running')
655
+ }
656
+ parentSignal.removeEventListener('abort', onParentAbort)
657
+ }
658
+ }
659
+ }
660
+
661
+ createHookCallback(callbackId: string, timeout?: number): HookCallback {
662
+ return {
663
+ type: 'callback',
664
+ timeout,
665
+ callback: async (
666
+ input: HookInput,
667
+ toolUseID: string | null,
668
+ abort: AbortSignal | undefined,
669
+ ): Promise<HookJSONOutput> => {
670
+ try {
671
+ const result = await this.sendRequest<HookJSONOutput>(
672
+ {
673
+ subtype: 'hook_callback',
674
+ callback_id: callbackId,
675
+ input,
676
+ tool_use_id: toolUseID || undefined,
677
+ },
678
+ hookJSONOutputSchema(),
679
+ abort,
680
+ )
681
+ return result
682
+ } catch (error) {
683
+ // biome-ignore lint/suspicious/noConsole:: intentional console output
684
+ console.error(`Error in hook callback ${callbackId}:`, error)
685
+ return {}
686
+ }
687
+ },
688
+ }
689
+ }
690
+
691
+ /**
692
+ * Sends an elicitation request to the SDK consumer and returns the response.
693
+ */
694
+ async handleElicitation(
695
+ serverName: string,
696
+ message: string,
697
+ requestedSchema?: Record<string, unknown>,
698
+ signal?: AbortSignal,
699
+ mode?: 'form' | 'url',
700
+ url?: string,
701
+ elicitationId?: string,
702
+ ): Promise<ElicitResult> {
703
+ try {
704
+ const result = await this.sendRequest<ElicitResult>(
705
+ {
706
+ subtype: 'elicitation',
707
+ mcp_server_name: serverName,
708
+ message,
709
+ mode,
710
+ url,
711
+ elicitation_id: elicitationId,
712
+ requested_schema: requestedSchema,
713
+ },
714
+ SDKControlElicitationResponseSchema(),
715
+ signal,
716
+ )
717
+ return result
718
+ } catch {
719
+ return { action: 'cancel' as const }
720
+ }
721
+ }
722
+
723
+ /**
724
+ * Creates a SandboxAskCallback that forwards sandbox network permission
725
+ * requests to the SDK host as can_use_tool control_requests.
726
+ *
727
+ * This piggybacks on the existing can_use_tool protocol with a synthetic
728
+ * tool name so that SDK hosts (VS Code, CCR, etc.) can prompt the user
729
+ * for network access without requiring a new protocol subtype.
730
+ */
731
+ createSandboxAskCallback(): (hostPattern: {
732
+ host: string
733
+ port?: number
734
+ }) => Promise<boolean> {
735
+ return async (hostPattern): Promise<boolean> => {
736
+ try {
737
+ const result = await this.sendRequest<PermissionToolOutput>(
738
+ {
739
+ subtype: 'can_use_tool',
740
+ tool_name: SANDBOX_NETWORK_ACCESS_TOOL_NAME,
741
+ input: { host: hostPattern.host },
742
+ tool_use_id: randomUUID(),
743
+ description: `Allow network connection to ${hostPattern.host}?`,
744
+ },
745
+ permissionToolOutputSchema(),
746
+ )
747
+ return result.behavior === 'allow'
748
+ } catch {
749
+ // If the request fails (stream closed, abort, etc.), deny the connection
750
+ return false
751
+ }
752
+ }
753
+ }
754
+
755
+ /**
756
+ * Sends an MCP message to an SDK server and waits for the response
757
+ */
758
+ async sendMcpMessage(
759
+ serverName: string,
760
+ message: JSONRPCMessage,
761
+ ): Promise<JSONRPCMessage> {
762
+ const response = await this.sendRequest<{ mcp_response: JSONRPCMessage }>(
763
+ {
764
+ subtype: 'mcp_message',
765
+ server_name: serverName,
766
+ message,
767
+ },
768
+ z.object({
769
+ mcp_response: z.any() as z.Schema<JSONRPCMessage>,
770
+ }),
771
+ )
772
+ return response.mcp_response
773
+ }
774
+ }
775
+
776
+ function exitWithMessage(message: string): never {
777
+ // biome-ignore lint/suspicious/noConsole:: intentional console output
778
+ console.error(message)
779
+ // eslint-disable-next-line custom-rules/no-process-exit
780
+ process.exit(1)
781
+ }
782
+
783
+ /**
784
+ * Execute PermissionRequest hooks and return a decision if one is made.
785
+ * Returns undefined if no hook made a decision.
786
+ */
787
+ async function executePermissionRequestHooksForSDK(
788
+ toolName: string,
789
+ toolUseID: string,
790
+ input: Record<string, unknown>,
791
+ toolUseContext: ToolUseContext,
792
+ suggestions: PermissionUpdate[] | undefined,
793
+ ): Promise<PermissionDecision | undefined> {
794
+ const appState = toolUseContext.getAppState()
795
+ const permissionMode = appState.toolPermissionContext.mode
796
+
797
+ // Iterate directly over the generator instead of using `all`
798
+ const hookGenerator = executePermissionRequestHooks(
799
+ toolName,
800
+ toolUseID,
801
+ input,
802
+ toolUseContext,
803
+ permissionMode,
804
+ suggestions,
805
+ toolUseContext.abortController.signal,
806
+ )
807
+
808
+ for await (const hookResult of hookGenerator) {
809
+ if (
810
+ hookResult.permissionRequestResult &&
811
+ (hookResult.permissionRequestResult.behavior === 'allow' ||
812
+ hookResult.permissionRequestResult.behavior === 'deny')
813
+ ) {
814
+ const decision = hookResult.permissionRequestResult
815
+ if (decision.behavior === 'allow') {
816
+ const finalInput = decision.updatedInput || input
817
+
818
+ // Apply permission updates if provided by hook ("always allow")
819
+ const permissionUpdates = decision.updatedPermissions ?? []
820
+ if (permissionUpdates.length > 0) {
821
+ persistPermissionUpdates(permissionUpdates)
822
+ const currentAppState = toolUseContext.getAppState()
823
+ const updatedContext = applyPermissionUpdates(
824
+ currentAppState.toolPermissionContext,
825
+ permissionUpdates,
826
+ )
827
+ // Update permission context via setAppState
828
+ toolUseContext.setAppState(prev => {
829
+ if (prev.toolPermissionContext === updatedContext) return prev
830
+ return { ...prev, toolPermissionContext: updatedContext }
831
+ })
832
+ }
833
+
834
+ return {
835
+ behavior: 'allow',
836
+ updatedInput: finalInput,
837
+ userModified: false,
838
+ decisionReason: {
839
+ type: 'hook',
840
+ hookName: 'PermissionRequest',
841
+ },
842
+ }
843
+ } else {
844
+ // Hook denied the permission
845
+ return {
846
+ behavior: 'deny',
847
+ message:
848
+ decision.message || 'Permission denied by PermissionRequest hook',
849
+ decisionReason: {
850
+ type: 'hook',
851
+ hookName: 'PermissionRequest',
852
+ },
853
+ }
854
+ }
855
+ }
856
+ }
857
+
858
+ return undefined
859
+ }