@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,62 @@
1
+ import { useCallback, useEffect } from 'react'
2
+ import type { Command } from '../commands.js'
3
+ import {
4
+ clearCommandMemoizationCaches,
5
+ clearCommandsCache,
6
+ getCommands,
7
+ } from '../commands.js'
8
+ import { onGrowthBookRefresh } from '../services/analytics/growthbook.js'
9
+ import { logError } from '../utils/log.js'
10
+ import { skillChangeDetector } from '../utils/skills/skillChangeDetector.js'
11
+
12
+ /**
13
+ * Keep the commands list fresh across two triggers:
14
+ *
15
+ * 1. Skill file changes (watcher) — full cache clear + disk re-scan, since
16
+ * skill content changed on disk.
17
+ * 2. GrowthBook init/refresh — memo-only clear, since only `isEnabled()`
18
+ * predicates may have changed. Handles commands like /btw whose gate
19
+ * reads a flag that isn't in the disk cache yet on first session after
20
+ * a flag rename: getCommands() runs before GB init (main.tsx:2855 vs
21
+ * showSetupScreens at :3106), so the memoized list is baked with the
22
+ * default. Once init populates remoteEvalFeatureValues, re-filter.
23
+ */
24
+ export function useSkillsChange(
25
+ cwd: string | undefined,
26
+ onCommandsChange: (commands: Command[]) => void,
27
+ ): void {
28
+ const handleChange = useCallback(async () => {
29
+ if (!cwd) return
30
+ try {
31
+ // Clear all command caches to ensure fresh load
32
+ clearCommandsCache()
33
+ const commands = await getCommands(cwd)
34
+ onCommandsChange(commands)
35
+ } catch (error) {
36
+ // Errors during reload are non-fatal - log and continue
37
+ if (error instanceof Error) {
38
+ logError(error)
39
+ }
40
+ }
41
+ }, [cwd, onCommandsChange])
42
+
43
+ useEffect(() => skillChangeDetector.subscribe(handleChange), [handleChange])
44
+
45
+ const handleGrowthBookRefresh = useCallback(async () => {
46
+ if (!cwd) return
47
+ try {
48
+ clearCommandMemoizationCaches()
49
+ const commands = await getCommands(cwd)
50
+ onCommandsChange(commands)
51
+ } catch (error) {
52
+ if (error instanceof Error) {
53
+ logError(error)
54
+ }
55
+ }
56
+ }, [cwd, onCommandsChange])
57
+
58
+ useEffect(
59
+ () => onGrowthBookRefresh(handleGrowthBookRefresh),
60
+ [handleGrowthBookRefresh],
61
+ )
62
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Swarm Initialization Hook
3
+ *
4
+ * Initializes swarm features: teammate hooks and context.
5
+ * Handles both fresh spawns and resumed teammate sessions.
6
+ *
7
+ * This hook is conditionally loaded to allow dead code elimination when swarms are disabled.
8
+ */
9
+
10
+ import { useEffect } from 'react'
11
+ import { getSessionId } from '../bootstrap/state.js'
12
+ import type { AppState } from '../state/AppState.js'
13
+ import type { Message } from '../types/message.js'
14
+ import { isAgentSwarmsEnabled } from '../utils/agentSwarmsEnabled.js'
15
+ import { initializeTeammateContextFromSession } from '../utils/swarm/reconnection.js'
16
+ import { readTeamFile } from '../utils/swarm/teamHelpers.js'
17
+ import { initializeTeammateHooks } from '../utils/swarm/teammateInit.js'
18
+ import { getDynamicTeamContext } from '../utils/teammate.js'
19
+
20
+ type SetAppState = (f: (prevState: AppState) => AppState) => void
21
+
22
+ /**
23
+ * Hook that initializes swarm features when ENABLE_AGENT_SWARMS is true.
24
+ *
25
+ * Handles both:
26
+ * - Resumed teammate sessions (from --resume or /resume) where teamName/agentName
27
+ * are stored in transcript messages
28
+ * - Fresh spawns where context is read from environment variables
29
+ */
30
+ export function useSwarmInitialization(
31
+ setAppState: SetAppState,
32
+ initialMessages: Message[] | undefined,
33
+ { enabled = true }: { enabled?: boolean } = {},
34
+ ): void {
35
+ useEffect(() => {
36
+ if (!enabled) return
37
+ if (isAgentSwarmsEnabled()) {
38
+ // Check if this is a resumed agent session (from --resume or /resume)
39
+ // Resumed sessions have teamName/agentName stored in transcript messages
40
+ const firstMessage = initialMessages?.[0]
41
+ const teamName =
42
+ firstMessage && 'teamName' in firstMessage
43
+ ? (firstMessage.teamName as string | undefined)
44
+ : undefined
45
+ const agentName =
46
+ firstMessage && 'agentName' in firstMessage
47
+ ? (firstMessage.agentName as string | undefined)
48
+ : undefined
49
+
50
+ if (teamName && agentName) {
51
+ // Resumed agent session - set up team context from stored info
52
+ initializeTeammateContextFromSession(setAppState, teamName, agentName)
53
+
54
+ // Get agentId from team file for hook initialization
55
+ const teamFile = readTeamFile(teamName)
56
+ const member = teamFile?.members.find(
57
+ (m: { name: string }) => m.name === agentName,
58
+ )
59
+ if (member) {
60
+ initializeTeammateHooks(setAppState, getSessionId(), {
61
+ teamName,
62
+ agentId: member.agentId,
63
+ agentName,
64
+ })
65
+ }
66
+ } else {
67
+ // Fresh spawn or standalone session
68
+ // teamContext is already computed in main.tsx via computeInitialTeamContext()
69
+ // and included in initialState, so we only need to initialize hooks here
70
+ const context = getDynamicTeamContext?.()
71
+ if (context?.teamName && context?.agentId && context?.agentName) {
72
+ initializeTeammateHooks(setAppState, getSessionId(), {
73
+ teamName: context.teamName,
74
+ agentId: context.agentId,
75
+ agentName: context.agentName,
76
+ })
77
+ }
78
+ }
79
+ }
80
+ }, [setAppState, initialMessages, enabled])
81
+ }
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Swarm Permission Poller Hook
3
+ *
4
+ * This hook polls for permission responses from the team leader when running
5
+ * as a worker agent in a swarm. When a response is received, it calls the
6
+ * appropriate callback (onAllow/onReject) to continue execution.
7
+ *
8
+ * This hook should be used in conjunction with the worker-side integration
9
+ * in useCanUseTool.ts, which creates pending requests that this hook monitors.
10
+ */
11
+
12
+ import { useCallback, useEffect, useRef } from 'react'
13
+ import { useInterval } from 'usehooks-ts'
14
+ import { logForDebugging } from '../utils/debug.js'
15
+ import { errorMessage } from '../utils/errors.js'
16
+ import {
17
+ type PermissionUpdate,
18
+ permissionUpdateSchema,
19
+ } from '../utils/permissions/PermissionUpdateSchema.js'
20
+ import {
21
+ isSwarmWorker,
22
+ type PermissionResponse,
23
+ pollForResponse,
24
+ removeWorkerResponse,
25
+ } from '../utils/swarm/permissionSync.js'
26
+ import { getAgentName, getTeamName } from '../utils/teammate.js'
27
+
28
+ const POLL_INTERVAL_MS = 500
29
+
30
+ /**
31
+ * Validate permissionUpdates from external sources (mailbox IPC, disk polling).
32
+ * Malformed entries from buggy/old teammate processes are filtered out rather
33
+ * than propagated unchecked into callback.onAllow().
34
+ */
35
+ function parsePermissionUpdates(raw: unknown): PermissionUpdate[] {
36
+ if (!Array.isArray(raw)) {
37
+ return []
38
+ }
39
+ const schema = permissionUpdateSchema()
40
+ const valid: PermissionUpdate[] = []
41
+ for (const entry of raw) {
42
+ const result = schema.safeParse(entry)
43
+ if (result.success) {
44
+ valid.push(result.data)
45
+ } else {
46
+ logForDebugging(
47
+ `[SwarmPermissionPoller] Dropping malformed permissionUpdate entry: ${result.error.message}`,
48
+ { level: 'warn' },
49
+ )
50
+ }
51
+ }
52
+ return valid
53
+ }
54
+
55
+ /**
56
+ * Callback signature for handling permission responses
57
+ */
58
+ export type PermissionResponseCallback = {
59
+ requestId: string
60
+ toolUseId: string
61
+ onAllow: (
62
+ updatedInput: Record<string, unknown> | undefined,
63
+ permissionUpdates: PermissionUpdate[],
64
+ feedback?: string,
65
+ ) => void
66
+ onReject: (feedback?: string) => void
67
+ }
68
+
69
+ /**
70
+ * Registry for pending permission request callbacks
71
+ * This allows the poller to find and invoke the right callbacks when responses arrive
72
+ */
73
+ type PendingCallbackRegistry = Map<string, PermissionResponseCallback>
74
+
75
+ // Module-level registry that persists across renders
76
+ const pendingCallbacks: PendingCallbackRegistry = new Map()
77
+
78
+ /**
79
+ * Register a callback for a pending permission request
80
+ * Called by useCanUseTool when a worker submits a permission request
81
+ */
82
+ export function registerPermissionCallback(
83
+ callback: PermissionResponseCallback,
84
+ ): void {
85
+ pendingCallbacks.set(callback.requestId, callback)
86
+ logForDebugging(
87
+ `[SwarmPermissionPoller] Registered callback for request ${callback.requestId}`,
88
+ )
89
+ }
90
+
91
+ /**
92
+ * Unregister a callback (e.g., when the request is resolved locally or times out)
93
+ */
94
+ export function unregisterPermissionCallback(requestId: string): void {
95
+ pendingCallbacks.delete(requestId)
96
+ logForDebugging(
97
+ `[SwarmPermissionPoller] Unregistered callback for request ${requestId}`,
98
+ )
99
+ }
100
+
101
+ /**
102
+ * Check if a request has a registered callback
103
+ */
104
+ export function hasPermissionCallback(requestId: string): boolean {
105
+ return pendingCallbacks.has(requestId)
106
+ }
107
+
108
+ /**
109
+ * Clear all pending callbacks (both permission and sandbox).
110
+ * Called from clearSessionCaches() on /clear to reset stale state,
111
+ * and also used in tests for isolation.
112
+ */
113
+ export function clearAllPendingCallbacks(): void {
114
+ pendingCallbacks.clear()
115
+ pendingSandboxCallbacks.clear()
116
+ }
117
+
118
+ /**
119
+ * Process a permission response from a mailbox message.
120
+ * This is called by the inbox poller when it detects a permission_response message.
121
+ *
122
+ * @returns true if the response was processed, false if no callback was registered
123
+ */
124
+ export function processMailboxPermissionResponse(params: {
125
+ requestId: string
126
+ decision: 'approved' | 'rejected'
127
+ feedback?: string
128
+ updatedInput?: Record<string, unknown>
129
+ permissionUpdates?: unknown
130
+ }): boolean {
131
+ const callback = pendingCallbacks.get(params.requestId)
132
+
133
+ if (!callback) {
134
+ logForDebugging(
135
+ `[SwarmPermissionPoller] No callback registered for mailbox response ${params.requestId}`,
136
+ )
137
+ return false
138
+ }
139
+
140
+ logForDebugging(
141
+ `[SwarmPermissionPoller] Processing mailbox response for request ${params.requestId}: ${params.decision}`,
142
+ )
143
+
144
+ // Remove from registry before invoking callback
145
+ pendingCallbacks.delete(params.requestId)
146
+
147
+ if (params.decision === 'approved') {
148
+ const permissionUpdates = parsePermissionUpdates(params.permissionUpdates)
149
+ const updatedInput = params.updatedInput
150
+ callback.onAllow(updatedInput, permissionUpdates)
151
+ } else {
152
+ callback.onReject(params.feedback)
153
+ }
154
+
155
+ return true
156
+ }
157
+
158
+ // ============================================================================
159
+ // Sandbox Permission Callback Registry
160
+ // ============================================================================
161
+
162
+ /**
163
+ * Callback signature for handling sandbox permission responses
164
+ */
165
+ export type SandboxPermissionResponseCallback = {
166
+ requestId: string
167
+ host: string
168
+ resolve: (allow: boolean) => void
169
+ }
170
+
171
+ // Module-level registry for sandbox permission callbacks
172
+ const pendingSandboxCallbacks: Map<string, SandboxPermissionResponseCallback> =
173
+ new Map()
174
+
175
+ /**
176
+ * Register a callback for a pending sandbox permission request
177
+ * Called when a worker sends a sandbox permission request to the leader
178
+ */
179
+ export function registerSandboxPermissionCallback(
180
+ callback: SandboxPermissionResponseCallback,
181
+ ): void {
182
+ pendingSandboxCallbacks.set(callback.requestId, callback)
183
+ logForDebugging(
184
+ `[SwarmPermissionPoller] Registered sandbox callback for request ${callback.requestId}`,
185
+ )
186
+ }
187
+
188
+ /**
189
+ * Check if a sandbox request has a registered callback
190
+ */
191
+ export function hasSandboxPermissionCallback(requestId: string): boolean {
192
+ return pendingSandboxCallbacks.has(requestId)
193
+ }
194
+
195
+ /**
196
+ * Process a sandbox permission response from a mailbox message.
197
+ * Called by the inbox poller when it detects a sandbox_permission_response message.
198
+ *
199
+ * @returns true if the response was processed, false if no callback was registered
200
+ */
201
+ export function processSandboxPermissionResponse(params: {
202
+ requestId: string
203
+ host: string
204
+ allow: boolean
205
+ }): boolean {
206
+ const callback = pendingSandboxCallbacks.get(params.requestId)
207
+
208
+ if (!callback) {
209
+ logForDebugging(
210
+ `[SwarmPermissionPoller] No sandbox callback registered for request ${params.requestId}`,
211
+ )
212
+ return false
213
+ }
214
+
215
+ logForDebugging(
216
+ `[SwarmPermissionPoller] Processing sandbox response for request ${params.requestId}: allow=${params.allow}`,
217
+ )
218
+
219
+ // Remove from registry before invoking callback
220
+ pendingSandboxCallbacks.delete(params.requestId)
221
+
222
+ // Resolve the promise with the allow decision
223
+ callback.resolve(params.allow)
224
+
225
+ return true
226
+ }
227
+
228
+ /**
229
+ * Process a permission response by invoking the registered callback
230
+ */
231
+ function processResponse(response: PermissionResponse): boolean {
232
+ const callback = pendingCallbacks.get(response.requestId)
233
+
234
+ if (!callback) {
235
+ logForDebugging(
236
+ `[SwarmPermissionPoller] No callback registered for request ${response.requestId}`,
237
+ )
238
+ return false
239
+ }
240
+
241
+ logForDebugging(
242
+ `[SwarmPermissionPoller] Processing response for request ${response.requestId}: ${response.decision}`,
243
+ )
244
+
245
+ // Remove from registry before invoking callback
246
+ pendingCallbacks.delete(response.requestId)
247
+
248
+ if (response.decision === 'approved') {
249
+ const permissionUpdates = parsePermissionUpdates(response.permissionUpdates)
250
+ const updatedInput = response.updatedInput
251
+ callback.onAllow(updatedInput, permissionUpdates)
252
+ } else {
253
+ callback.onReject(response.feedback)
254
+ }
255
+
256
+ return true
257
+ }
258
+
259
+ /**
260
+ * Hook that polls for permission responses when running as a swarm worker.
261
+ *
262
+ * This hook:
263
+ * 1. Only activates when isSwarmWorker() returns true
264
+ * 2. Polls every 500ms for responses
265
+ * 3. When a response is found, invokes the registered callback
266
+ * 4. Cleans up the response file after processing
267
+ */
268
+ export function useSwarmPermissionPoller(): void {
269
+ const isProcessingRef = useRef(false)
270
+
271
+ const poll = useCallback(async () => {
272
+ // Don't poll if not a swarm worker
273
+ if (!isSwarmWorker()) {
274
+ return
275
+ }
276
+
277
+ // Prevent concurrent polling
278
+ if (isProcessingRef.current) {
279
+ return
280
+ }
281
+
282
+ // Don't poll if no callbacks are registered
283
+ if (pendingCallbacks.size === 0) {
284
+ return
285
+ }
286
+
287
+ isProcessingRef.current = true
288
+
289
+ try {
290
+ const agentName = getAgentName()
291
+ const teamName = getTeamName()
292
+
293
+ if (!agentName || !teamName) {
294
+ return
295
+ }
296
+
297
+ // Check each pending request for a response
298
+ for (const [requestId, _callback] of pendingCallbacks) {
299
+ const response = await pollForResponse(requestId, agentName, teamName)
300
+
301
+ if (response) {
302
+ // Process the response
303
+ const processed = processResponse(response)
304
+
305
+ if (processed) {
306
+ // Clean up the response from the worker's inbox
307
+ await removeWorkerResponse(requestId, agentName, teamName)
308
+ }
309
+ }
310
+ }
311
+ } catch (error) {
312
+ logForDebugging(
313
+ `[SwarmPermissionPoller] Error during poll: ${errorMessage(error)}`,
314
+ )
315
+ } finally {
316
+ isProcessingRef.current = false
317
+ }
318
+ }, [])
319
+
320
+ // Only poll if we're a swarm worker
321
+ const shouldPoll = isSwarmWorker()
322
+ useInterval(() => void poll(), shouldPoll ? POLL_INTERVAL_MS : null)
323
+
324
+ // Initial poll on mount
325
+ useEffect(() => {
326
+ if (isSwarmWorker()) {
327
+ void poll()
328
+ }
329
+ }, [poll])
330
+ }
@@ -0,0 +1,221 @@
1
+ import { type FSWatcher, watch } from 'fs'
2
+ import { useEffect, useRef } from 'react'
3
+ import { logForDebugging } from '../utils/debug.js'
4
+ import {
5
+ claimTask,
6
+ DEFAULT_TASKS_MODE_TASK_LIST_ID,
7
+ ensureTasksDir,
8
+ getTasksDir,
9
+ listTasks,
10
+ type Task,
11
+ updateTask,
12
+ } from '../utils/tasks.js'
13
+
14
+ const DEBOUNCE_MS = 1000
15
+
16
+ type Props = {
17
+ /** When undefined, the hook does nothing. The task list id is also used as the agent ID. */
18
+ taskListId?: string
19
+ isLoading: boolean
20
+ /**
21
+ * Called when a task is ready to be worked on.
22
+ * Returns true if submission succeeded, false if rejected.
23
+ */
24
+ onSubmitTask: (prompt: string) => boolean
25
+ }
26
+
27
+ /**
28
+ * Hook that watches a task list directory and automatically picks up
29
+ * open, unowned tasks to work on.
30
+ *
31
+ * This enables "tasks mode" where Claude watches for externally-created
32
+ * tasks and processes them one at a time.
33
+ */
34
+ export function useTaskListWatcher({
35
+ taskListId,
36
+ isLoading,
37
+ onSubmitTask,
38
+ }: Props): void {
39
+ const currentTaskRef = useRef<string | null>(null)
40
+ const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
41
+
42
+ // Stabilize unstable props via refs so the watcher effect doesn't depend on
43
+ // them. isLoading flips every turn, and onSubmitTask's identity changes
44
+ // whenever onQuery's deps change. Without this, the watcher effect re-runs
45
+ // on every turn, calling watcher.close() + watch() each time — which is a
46
+ // trigger for Bun's PathWatcherManager deadlock (oven-sh/bun#27469).
47
+ const isLoadingRef = useRef(isLoading)
48
+ isLoadingRef.current = isLoading
49
+ const onSubmitTaskRef = useRef(onSubmitTask)
50
+ onSubmitTaskRef.current = onSubmitTask
51
+
52
+ const enabled = taskListId !== undefined
53
+ const agentId = taskListId ?? DEFAULT_TASKS_MODE_TASK_LIST_ID
54
+
55
+ // checkForTasks reads isLoading and onSubmitTask from refs — always
56
+ // up-to-date, no stale closure, and doesn't force a new function identity
57
+ // per render. Stored in a ref so the watcher effect can call it without
58
+ // depending on it.
59
+ const checkForTasksRef = useRef<() => Promise<void>>(async () => {})
60
+ checkForTasksRef.current = async () => {
61
+ if (!enabled) {
62
+ return
63
+ }
64
+
65
+ // Don't need to submit new tasks if we are already working
66
+ if (isLoadingRef.current) {
67
+ return
68
+ }
69
+
70
+ const tasks = await listTasks(taskListId)
71
+
72
+ // If we have a current task, check if it's been resolved
73
+ if (currentTaskRef.current !== null) {
74
+ const currentTask = tasks.find(t => t.id === currentTaskRef.current)
75
+ if (!currentTask || currentTask.status === 'completed') {
76
+ logForDebugging(
77
+ `[TaskListWatcher] Task #${currentTaskRef.current} is marked complete, ready for next task`,
78
+ )
79
+ currentTaskRef.current = null
80
+ } else {
81
+ // Still working on current task
82
+ return
83
+ }
84
+ }
85
+
86
+ // Find an open task with no owner that isn't blocked
87
+ const availableTask = findAvailableTask(tasks)
88
+
89
+ if (!availableTask) {
90
+ return
91
+ }
92
+
93
+ logForDebugging(
94
+ `[TaskListWatcher] Found available task #${availableTask.id}: ${availableTask.subject}`,
95
+ )
96
+
97
+ // Claim the task using the task list's agent ID
98
+ const result = await claimTask(taskListId, availableTask.id, agentId)
99
+
100
+ if (!result.success) {
101
+ logForDebugging(
102
+ `[TaskListWatcher] Failed to claim task #${availableTask.id}: ${result.reason}`,
103
+ )
104
+ return
105
+ }
106
+
107
+ currentTaskRef.current = availableTask.id
108
+
109
+ // Format the task as a prompt
110
+ const prompt = formatTaskAsPrompt(availableTask)
111
+
112
+ logForDebugging(
113
+ `[TaskListWatcher] Submitting task #${availableTask.id} as prompt`,
114
+ )
115
+
116
+ const submitted = onSubmitTaskRef.current(prompt)
117
+ if (!submitted) {
118
+ logForDebugging(
119
+ `[TaskListWatcher] Failed to submit task #${availableTask.id}, releasing claim`,
120
+ )
121
+ // Release the claim
122
+ await updateTask(taskListId, availableTask.id, { owner: undefined })
123
+ currentTaskRef.current = null
124
+ }
125
+ }
126
+
127
+ // -- Watcher setup
128
+
129
+ // Schedules a check after DEBOUNCE_MS, collapsing rapid fs events.
130
+ // Shared between the watcher callback and the idle-trigger effect below.
131
+ const scheduleCheckRef = useRef<() => void>(() => {})
132
+
133
+ useEffect(() => {
134
+ if (!enabled) return
135
+
136
+ void ensureTasksDir(taskListId)
137
+ const tasksDir = getTasksDir(taskListId)
138
+
139
+ let watcher: FSWatcher | null = null
140
+
141
+ const debouncedCheck = (): void => {
142
+ if (debounceTimerRef.current) {
143
+ clearTimeout(debounceTimerRef.current)
144
+ }
145
+ debounceTimerRef.current = setTimeout(
146
+ ref => void ref.current(),
147
+ DEBOUNCE_MS,
148
+ checkForTasksRef,
149
+ )
150
+ }
151
+ scheduleCheckRef.current = debouncedCheck
152
+
153
+ try {
154
+ watcher = watch(tasksDir, debouncedCheck)
155
+ watcher.unref()
156
+ logForDebugging(`[TaskListWatcher] Watching for tasks in ${tasksDir}`)
157
+ } catch (error) {
158
+ // fs.watch throws synchronously on ENOENT — ensureTasksDir should have
159
+ // created the dir, but handle the race gracefully
160
+ logForDebugging(`[TaskListWatcher] Failed to watch ${tasksDir}: ${error}`)
161
+ }
162
+
163
+ // Initial check
164
+ debouncedCheck()
165
+
166
+ return () => {
167
+ // This cleanup only fires when taskListId changes or on unmount —
168
+ // never per-turn. That keeps watcher.close() out of the Bun
169
+ // PathWatcherManager deadlock window.
170
+ scheduleCheckRef.current = () => {}
171
+ if (watcher) {
172
+ watcher.close()
173
+ }
174
+ if (debounceTimerRef.current) {
175
+ clearTimeout(debounceTimerRef.current)
176
+ }
177
+ }
178
+ }, [enabled, taskListId])
179
+
180
+ // Previously, the watcher effect depended on checkForTasks (and transitively
181
+ // isLoading), so going idle triggered a re-setup whose initial debouncedCheck
182
+ // would pick up the next task. Preserve that behavior explicitly: when
183
+ // isLoading drops, schedule a check.
184
+ useEffect(() => {
185
+ if (!enabled) return
186
+ if (isLoading) return
187
+ scheduleCheckRef.current()
188
+ }, [enabled, isLoading])
189
+ }
190
+
191
+ /**
192
+ * Find an available task that can be worked on:
193
+ * - Status is 'pending'
194
+ * - No owner assigned
195
+ * - Not blocked by any unresolved tasks
196
+ */
197
+ function findAvailableTask(tasks: Task[]): Task | undefined {
198
+ const unresolvedTaskIds = new Set(
199
+ tasks.filter(t => t.status !== 'completed').map(t => t.id),
200
+ )
201
+
202
+ return tasks.find(task => {
203
+ if (task.status !== 'pending') return false
204
+ if (task.owner) return false
205
+ // Check all blockers are completed
206
+ return task.blockedBy.every(id => !unresolvedTaskIds.has(id))
207
+ })
208
+ }
209
+
210
+ /**
211
+ * Format a task as a prompt for Claude to work on.
212
+ */
213
+ function formatTaskAsPrompt(task: Task): string {
214
+ let prompt = `Complete all open tasks. Start with task #${task.id}: \n\n ${task.subject}`
215
+
216
+ if (task.description) {
217
+ prompt += `\n\n${task.description}`
218
+ }
219
+
220
+ return prompt
221
+ }