@xortex/xcode 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (969) hide show
  1. package/QueryEngine.ts +1331 -0
  2. package/Task.ts +125 -0
  3. package/Tool.ts +792 -0
  4. package/assistant/sessionHistory.ts +87 -0
  5. package/bin/xcode +57 -25
  6. package/bridge/bridgeApi.ts +539 -0
  7. package/bridge/bridgeConfig.ts +48 -0
  8. package/bridge/bridgeDebug.ts +135 -0
  9. package/bridge/bridgeEnabled.ts +202 -0
  10. package/bridge/bridgeMain.ts +2999 -0
  11. package/bridge/bridgeMessaging.ts +461 -0
  12. package/bridge/bridgePermissionCallbacks.ts +43 -0
  13. package/bridge/bridgePointer.ts +210 -0
  14. package/bridge/bridgeStatusUtil.ts +163 -0
  15. package/bridge/bridgeUI.ts +530 -0
  16. package/bridge/capacityWake.ts +56 -0
  17. package/bridge/codeSessionApi.ts +168 -0
  18. package/bridge/createSession.ts +384 -0
  19. package/bridge/debugUtils.ts +141 -0
  20. package/bridge/envLessBridgeConfig.ts +165 -0
  21. package/bridge/flushGate.ts +71 -0
  22. package/bridge/inboundAttachments.ts +175 -0
  23. package/bridge/inboundMessages.ts +80 -0
  24. package/bridge/initReplBridge.ts +569 -0
  25. package/bridge/jwtUtils.ts +256 -0
  26. package/bridge/pollConfig.ts +110 -0
  27. package/bridge/pollConfigDefaults.ts +82 -0
  28. package/bridge/remoteBridgeCore.ts +1008 -0
  29. package/bridge/replBridge.ts +2406 -0
  30. package/bridge/replBridgeHandle.ts +36 -0
  31. package/bridge/replBridgeTransport.ts +370 -0
  32. package/bridge/sessionIdCompat.ts +57 -0
  33. package/bridge/sessionRunner.ts +550 -0
  34. package/bridge/trustedDevice.ts +210 -0
  35. package/bridge/types.ts +262 -0
  36. package/bridge/workSecret.ts +127 -0
  37. package/buddy/CompanionSprite.tsx +371 -0
  38. package/buddy/companion.ts +133 -0
  39. package/buddy/prompt.ts +36 -0
  40. package/buddy/sprites.ts +514 -0
  41. package/buddy/types.ts +148 -0
  42. package/buddy/useBuddyNotification.tsx +98 -0
  43. package/cli/exit.ts +31 -0
  44. package/cli/handlers/agents.ts +70 -0
  45. package/cli/handlers/auth.ts +330 -0
  46. package/cli/handlers/autoMode.ts +170 -0
  47. package/cli/handlers/mcp.tsx +362 -0
  48. package/cli/handlers/plugins.ts +878 -0
  49. package/cli/handlers/util.tsx +110 -0
  50. package/cli/ndjsonSafeStringify.ts +32 -0
  51. package/cli/print.ts +5594 -0
  52. package/cli/remoteIO.ts +255 -0
  53. package/cli/structuredIO.ts +859 -0
  54. package/cli/transports/HybridTransport.ts +282 -0
  55. package/cli/transports/SSETransport.ts +711 -0
  56. package/cli/transports/SerialBatchEventUploader.ts +275 -0
  57. package/cli/transports/WebSocketTransport.ts +800 -0
  58. package/cli/transports/WorkerStateUploader.ts +131 -0
  59. package/cli/transports/ccrClient.ts +998 -0
  60. package/cli/transports/transportUtils.ts +45 -0
  61. package/cli/update.ts +422 -0
  62. package/commands/add-dir/add-dir.tsx +126 -0
  63. package/commands/add-dir/index.ts +11 -0
  64. package/commands/add-dir/validation.ts +110 -0
  65. package/commands/advisor.ts +109 -0
  66. package/commands/agents/agents.tsx +12 -0
  67. package/commands/agents/index.ts +10 -0
  68. package/commands/ant-trace/index.js +1 -0
  69. package/commands/autofix-pr/index.js +1 -0
  70. package/commands/backfill-sessions/index.js +1 -0
  71. package/commands/branch/branch.ts +296 -0
  72. package/commands/branch/index.ts +14 -0
  73. package/commands/break-cache/index.js +1 -0
  74. package/commands/bridge/bridge.tsx +509 -0
  75. package/commands/bridge/index.ts +26 -0
  76. package/commands/bridge-kick.ts +200 -0
  77. package/commands/brief.ts +130 -0
  78. package/commands/btw/btw.tsx +243 -0
  79. package/commands/btw/index.ts +13 -0
  80. package/commands/bughunter/index.js +1 -0
  81. package/commands/chrome/chrome.tsx +285 -0
  82. package/commands/chrome/index.ts +13 -0
  83. package/commands/clear/caches.ts +144 -0
  84. package/commands/clear/clear.ts +7 -0
  85. package/commands/clear/conversation.ts +251 -0
  86. package/commands/clear/index.ts +19 -0
  87. package/commands/color/color.ts +93 -0
  88. package/commands/color/index.ts +16 -0
  89. package/commands/commit-push-pr.ts +158 -0
  90. package/commands/commit.ts +92 -0
  91. package/commands/compact/compact.ts +287 -0
  92. package/commands/compact/index.ts +15 -0
  93. package/commands/config/config.tsx +7 -0
  94. package/commands/config/index.ts +11 -0
  95. package/commands/context/context-noninteractive.ts +325 -0
  96. package/commands/context/context.tsx +64 -0
  97. package/commands/context/index.ts +24 -0
  98. package/commands/copy/copy.tsx +371 -0
  99. package/commands/copy/index.ts +15 -0
  100. package/commands/cost/cost.ts +24 -0
  101. package/commands/cost/index.ts +23 -0
  102. package/commands/createMovedToPluginCommand.ts +65 -0
  103. package/commands/ctx_viz/index.js +1 -0
  104. package/commands/debug-tool-call/index.js +1 -0
  105. package/commands/desktop/desktop.tsx +9 -0
  106. package/commands/desktop/index.ts +26 -0
  107. package/commands/diff/diff.tsx +9 -0
  108. package/commands/diff/index.ts +8 -0
  109. package/commands/doctor/doctor.tsx +7 -0
  110. package/commands/doctor/index.ts +12 -0
  111. package/commands/effort/effort.tsx +183 -0
  112. package/commands/effort/index.ts +13 -0
  113. package/commands/env/index.js +1 -0
  114. package/commands/exit/exit.tsx +33 -0
  115. package/commands/exit/index.ts +12 -0
  116. package/commands/export/export.tsx +91 -0
  117. package/commands/export/index.ts +11 -0
  118. package/commands/extra-usage/extra-usage-core.ts +118 -0
  119. package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  120. package/commands/extra-usage/extra-usage.tsx +17 -0
  121. package/commands/extra-usage/index.ts +31 -0
  122. package/commands/fast/fast.tsx +269 -0
  123. package/commands/fast/index.ts +26 -0
  124. package/commands/feedback/feedback.tsx +25 -0
  125. package/commands/feedback/index.ts +26 -0
  126. package/commands/files/files.ts +19 -0
  127. package/commands/files/index.ts +12 -0
  128. package/commands/good-claude/index.js +1 -0
  129. package/commands/heapdump/heapdump.ts +17 -0
  130. package/commands/heapdump/index.ts +12 -0
  131. package/commands/help/help.tsx +11 -0
  132. package/commands/help/index.ts +10 -0
  133. package/commands/hooks/hooks.tsx +13 -0
  134. package/commands/hooks/index.ts +11 -0
  135. package/commands/ide/ide.tsx +646 -0
  136. package/commands/ide/index.ts +11 -0
  137. package/commands/init-verifiers.ts +262 -0
  138. package/commands/init.ts +256 -0
  139. package/commands/insights.ts +3200 -0
  140. package/commands/install-github-app/ApiKeyStep.tsx +231 -0
  141. package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  142. package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  143. package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  144. package/commands/install-github-app/CreatingStep.tsx +65 -0
  145. package/commands/install-github-app/ErrorStep.tsx +85 -0
  146. package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  147. package/commands/install-github-app/InstallAppStep.tsx +94 -0
  148. package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  149. package/commands/install-github-app/SuccessStep.tsx +96 -0
  150. package/commands/install-github-app/WarningsStep.tsx +73 -0
  151. package/commands/install-github-app/index.ts +13 -0
  152. package/commands/install-github-app/install-github-app.tsx +587 -0
  153. package/commands/install-github-app/setupGitHubActions.ts +325 -0
  154. package/commands/install-slack-app/index.ts +12 -0
  155. package/commands/install-slack-app/install-slack-app.ts +30 -0
  156. package/commands/install.tsx +300 -0
  157. package/commands/issue/index.js +1 -0
  158. package/commands/keybindings/index.ts +13 -0
  159. package/commands/keybindings/keybindings.ts +53 -0
  160. package/commands/login/index.ts +14 -0
  161. package/commands/login/login.tsx +104 -0
  162. package/commands/logout/index.ts +10 -0
  163. package/commands/logout/logout.tsx +82 -0
  164. package/commands/mcp/addCommand.ts +280 -0
  165. package/commands/mcp/index.ts +12 -0
  166. package/commands/mcp/mcp.tsx +85 -0
  167. package/commands/mcp/xaaIdpCommand.ts +266 -0
  168. package/commands/memory/index.ts +10 -0
  169. package/commands/memory/memory.tsx +90 -0
  170. package/commands/mobile/index.ts +11 -0
  171. package/commands/mobile/mobile.tsx +274 -0
  172. package/commands/mock-limits/index.js +1 -0
  173. package/commands/model/index.ts +16 -0
  174. package/commands/model/model.tsx +297 -0
  175. package/commands/oauth-refresh/index.js +1 -0
  176. package/commands/onboarding/index.js +1 -0
  177. package/commands/output-style/index.ts +11 -0
  178. package/commands/output-style/output-style.tsx +7 -0
  179. package/commands/passes/index.ts +22 -0
  180. package/commands/passes/passes.tsx +24 -0
  181. package/commands/perf-issue/index.js +1 -0
  182. package/commands/permissions/index.ts +11 -0
  183. package/commands/permissions/permissions.tsx +10 -0
  184. package/commands/plan/index.ts +11 -0
  185. package/commands/plan/plan.tsx +122 -0
  186. package/commands/plugin/AddMarketplace.tsx +162 -0
  187. package/commands/plugin/BrowseMarketplace.tsx +802 -0
  188. package/commands/plugin/DiscoverPlugins.tsx +781 -0
  189. package/commands/plugin/ManageMarketplaces.tsx +838 -0
  190. package/commands/plugin/ManagePlugins.tsx +2215 -0
  191. package/commands/plugin/PluginErrors.tsx +124 -0
  192. package/commands/plugin/PluginOptionsDialog.tsx +357 -0
  193. package/commands/plugin/PluginOptionsFlow.tsx +135 -0
  194. package/commands/plugin/PluginSettings.tsx +1072 -0
  195. package/commands/plugin/PluginTrustWarning.tsx +32 -0
  196. package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  197. package/commands/plugin/ValidatePlugin.tsx +98 -0
  198. package/commands/plugin/index.tsx +11 -0
  199. package/commands/plugin/parseArgs.ts +103 -0
  200. package/commands/plugin/plugin.tsx +7 -0
  201. package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  202. package/commands/plugin/usePagination.ts +171 -0
  203. package/commands/pr_comments/index.ts +50 -0
  204. package/commands/privacy-settings/index.ts +14 -0
  205. package/commands/privacy-settings/privacy-settings.tsx +58 -0
  206. package/commands/rate-limit-options/index.ts +19 -0
  207. package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  208. package/commands/release-notes/index.ts +11 -0
  209. package/commands/release-notes/release-notes.ts +50 -0
  210. package/commands/reload-plugins/index.ts +18 -0
  211. package/commands/reload-plugins/reload-plugins.ts +61 -0
  212. package/commands/remote-env/index.ts +15 -0
  213. package/commands/remote-env/remote-env.tsx +7 -0
  214. package/commands/remote-setup/api.ts +182 -0
  215. package/commands/remote-setup/index.ts +20 -0
  216. package/commands/remote-setup/remote-setup.tsx +187 -0
  217. package/commands/rename/generateSessionName.ts +67 -0
  218. package/commands/rename/index.ts +12 -0
  219. package/commands/rename/rename.ts +87 -0
  220. package/commands/reset-limits/index.js +4 -0
  221. package/commands/resume/index.ts +12 -0
  222. package/commands/resume/resume.tsx +275 -0
  223. package/commands/review/UltrareviewOverageDialog.tsx +96 -0
  224. package/commands/review/reviewRemote.ts +316 -0
  225. package/commands/review/ultrareviewCommand.tsx +58 -0
  226. package/commands/review/ultrareviewEnabled.ts +14 -0
  227. package/commands/review.ts +57 -0
  228. package/commands/rewind/index.ts +13 -0
  229. package/commands/rewind/rewind.ts +13 -0
  230. package/commands/sandbox-toggle/index.ts +50 -0
  231. package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  232. package/commands/security-review.ts +243 -0
  233. package/commands/session/index.ts +16 -0
  234. package/commands/session/session.tsx +140 -0
  235. package/commands/share/index.js +1 -0
  236. package/commands/skills/index.ts +10 -0
  237. package/commands/skills/skills.tsx +8 -0
  238. package/commands/stats/index.ts +10 -0
  239. package/commands/stats/stats.tsx +7 -0
  240. package/commands/status/index.ts +12 -0
  241. package/commands/status/status.tsx +8 -0
  242. package/commands/statusline.tsx +24 -0
  243. package/commands/stickers/index.ts +11 -0
  244. package/commands/stickers/stickers.ts +16 -0
  245. package/commands/summary/index.js +1 -0
  246. package/commands/tag/index.ts +12 -0
  247. package/commands/tag/tag.tsx +215 -0
  248. package/commands/tasks/index.ts +11 -0
  249. package/commands/tasks/tasks.tsx +8 -0
  250. package/commands/teleport/index.js +1 -0
  251. package/commands/terminalSetup/index.ts +23 -0
  252. package/commands/terminalSetup/terminalSetup.tsx +531 -0
  253. package/commands/theme/index.ts +10 -0
  254. package/commands/theme/theme.tsx +57 -0
  255. package/commands/thinkback/index.ts +13 -0
  256. package/commands/thinkback/thinkback.tsx +554 -0
  257. package/commands/thinkback-play/index.ts +17 -0
  258. package/commands/thinkback-play/thinkback-play.ts +43 -0
  259. package/commands/ultraplan.tsx +471 -0
  260. package/commands/upgrade/index.ts +16 -0
  261. package/commands/upgrade/upgrade.tsx +38 -0
  262. package/commands/usage/index.ts +9 -0
  263. package/commands/usage/usage.tsx +7 -0
  264. package/commands/version.ts +22 -0
  265. package/commands/vim/index.ts +11 -0
  266. package/commands/vim/vim.ts +38 -0
  267. package/commands/voice/index.ts +20 -0
  268. package/commands/voice/voice.ts +150 -0
  269. package/commands/xingest/index.ts +11 -0
  270. package/commands/xingest/xingest.ts +90 -0
  271. package/commands/xsearch/index.ts +11 -0
  272. package/commands/xsearch/xsearch.ts +56 -0
  273. package/commands.ts +758 -0
  274. package/components/AgentProgressLine.tsx +136 -0
  275. package/components/App.tsx +56 -0
  276. package/components/ApproveApiKey.tsx +123 -0
  277. package/components/AutoModeOptInDialog.tsx +142 -0
  278. package/components/AutoUpdater.tsx +198 -0
  279. package/components/AutoUpdaterWrapper.tsx +91 -0
  280. package/components/AwsAuthStatusBox.tsx +82 -0
  281. package/components/BaseTextInput.tsx +136 -0
  282. package/components/BashModeProgress.tsx +56 -0
  283. package/components/BridgeDialog.tsx +401 -0
  284. package/components/BypassPermissionsModeDialog.tsx +87 -0
  285. package/components/ChannelDowngradeDialog.tsx +102 -0
  286. package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  287. package/components/ClaudeInChromeOnboarding.tsx +121 -0
  288. package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  289. package/components/ClickableImageRef.tsx +73 -0
  290. package/components/CompactSummary.tsx +118 -0
  291. package/components/ConfigurableShortcutHint.tsx +57 -0
  292. package/components/ConsoleOAuthFlow.tsx +631 -0
  293. package/components/ContextSuggestions.tsx +47 -0
  294. package/components/ContextVisualization.tsx +489 -0
  295. package/components/CoordinatorAgentStatus.tsx +273 -0
  296. package/components/CostThresholdDialog.tsx +50 -0
  297. package/components/CtrlOToExpand.tsx +51 -0
  298. package/components/CustomSelect/SelectMulti.tsx +213 -0
  299. package/components/CustomSelect/index.ts +3 -0
  300. package/components/CustomSelect/option-map.ts +50 -0
  301. package/components/CustomSelect/select-input-option.tsx +488 -0
  302. package/components/CustomSelect/select-option.tsx +68 -0
  303. package/components/CustomSelect/select.tsx +690 -0
  304. package/components/CustomSelect/use-multi-select-state.ts +414 -0
  305. package/components/CustomSelect/use-select-input.ts +287 -0
  306. package/components/CustomSelect/use-select-navigation.ts +653 -0
  307. package/components/CustomSelect/use-select-state.ts +157 -0
  308. package/components/DesktopHandoff.tsx +193 -0
  309. package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  310. package/components/DevBar.tsx +49 -0
  311. package/components/DevChannelsDialog.tsx +105 -0
  312. package/components/DiagnosticsDisplay.tsx +95 -0
  313. package/components/EffortCallout.tsx +265 -0
  314. package/components/EffortIndicator.ts +42 -0
  315. package/components/ExitFlow.tsx +48 -0
  316. package/components/ExportDialog.tsx +128 -0
  317. package/components/FallbackToolUseErrorMessage.tsx +116 -0
  318. package/components/FallbackToolUseRejectedMessage.tsx +16 -0
  319. package/components/FastIcon.tsx +46 -0
  320. package/components/Feedback.tsx +592 -0
  321. package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  322. package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  323. package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  324. package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  325. package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  326. package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  327. package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  328. package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  329. package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  330. package/components/FileEditToolDiff.tsx +181 -0
  331. package/components/FileEditToolUpdatedMessage.tsx +124 -0
  332. package/components/FileEditToolUseRejectedMessage.tsx +170 -0
  333. package/components/FilePathLink.tsx +43 -0
  334. package/components/FullscreenLayout.tsx +645 -0
  335. package/components/GlobalSearchDialog.tsx +343 -0
  336. package/components/HelpV2/Commands.tsx +82 -0
  337. package/components/HelpV2/General.tsx +23 -0
  338. package/components/HelpV2/HelpV2.tsx +184 -0
  339. package/components/HighlightedCode/Fallback.tsx +193 -0
  340. package/components/HighlightedCode.tsx +190 -0
  341. package/components/HistorySearchDialog.tsx +118 -0
  342. package/components/IdeAutoConnectDialog.tsx +154 -0
  343. package/components/IdeOnboardingDialog.tsx +167 -0
  344. package/components/IdeStatusIndicator.tsx +58 -0
  345. package/components/IdleReturnDialog.tsx +118 -0
  346. package/components/InterruptedByUser.tsx +15 -0
  347. package/components/InvalidConfigDialog.tsx +156 -0
  348. package/components/InvalidSettingsDialog.tsx +89 -0
  349. package/components/KeybindingWarnings.tsx +55 -0
  350. package/components/LanguagePicker.tsx +86 -0
  351. package/components/LogSelector.tsx +1575 -0
  352. package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  353. package/components/LogoV2/AnimatedClawd.tsx +124 -0
  354. package/components/LogoV2/ChannelsNotice.tsx +266 -0
  355. package/components/LogoV2/Clawd.tsx +14 -0
  356. package/components/LogoV2/CondensedLogo.tsx +161 -0
  357. package/components/LogoV2/EmergencyTip.tsx +58 -0
  358. package/components/LogoV2/Feed.tsx +112 -0
  359. package/components/LogoV2/FeedColumn.tsx +59 -0
  360. package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  361. package/components/LogoV2/LogoV2.tsx +543 -0
  362. package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  363. package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  364. package/components/LogoV2/VoiceModeNotice.tsx +68 -0
  365. package/components/LogoV2/WelcomeV2.tsx +433 -0
  366. package/components/LogoV2/feedConfigs.tsx +92 -0
  367. package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  368. package/components/MCPServerApprovalDialog.tsx +115 -0
  369. package/components/MCPServerDesktopImportDialog.tsx +203 -0
  370. package/components/MCPServerDialogCopy.tsx +15 -0
  371. package/components/MCPServerMultiselectDialog.tsx +133 -0
  372. package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  373. package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  374. package/components/Markdown.tsx +236 -0
  375. package/components/MarkdownTable.tsx +322 -0
  376. package/components/MemoryUsageIndicator.tsx +37 -0
  377. package/components/Message.tsx +627 -0
  378. package/components/MessageModel.tsx +43 -0
  379. package/components/MessageResponse.tsx +78 -0
  380. package/components/MessageRow.tsx +383 -0
  381. package/components/MessageSelector.tsx +831 -0
  382. package/components/MessageTimestamp.tsx +63 -0
  383. package/components/Messages.tsx +834 -0
  384. package/components/ModelPicker.tsx +448 -0
  385. package/components/NativeAutoUpdater.tsx +193 -0
  386. package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  387. package/components/OffscreenFreeze.tsx +44 -0
  388. package/components/Onboarding.tsx +244 -0
  389. package/components/OutputStylePicker.tsx +112 -0
  390. package/components/PackageManagerAutoUpdater.tsx +104 -0
  391. package/components/Passes/Passes.tsx +184 -0
  392. package/components/PrBadge.tsx +97 -0
  393. package/components/PressEnterToContinue.tsx +15 -0
  394. package/components/PromptInput/HistorySearchInput.tsx +51 -0
  395. package/components/PromptInput/IssueFlagBanner.tsx +12 -0
  396. package/components/PromptInput/Notifications.tsx +332 -0
  397. package/components/PromptInput/PromptInput.tsx +2350 -0
  398. package/components/PromptInput/PromptInputFooter.tsx +191 -0
  399. package/components/PromptInput/PromptInputFooterLeftSide.tsx +524 -0
  400. package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  401. package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  402. package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  403. package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  404. package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  405. package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  406. package/components/PromptInput/ShimmeredInput.tsx +143 -0
  407. package/components/PromptInput/VoiceIndicator.tsx +137 -0
  408. package/components/PromptInput/inputModes.ts +33 -0
  409. package/components/PromptInput/inputPaste.ts +90 -0
  410. package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  411. package/components/PromptInput/usePromptInputPlaceholder.ts +78 -0
  412. package/components/PromptInput/useShowFastIconHint.ts +31 -0
  413. package/components/PromptInput/useSwarmBanner.ts +155 -0
  414. package/components/PromptInput/utils.ts +60 -0
  415. package/components/QuickOpenDialog.tsx +244 -0
  416. package/components/RemoteCallout.tsx +76 -0
  417. package/components/RemoteEnvironmentDialog.tsx +340 -0
  418. package/components/ResumeTask.tsx +268 -0
  419. package/components/SandboxViolationExpandedView.tsx +99 -0
  420. package/components/ScrollKeybindingHandler.tsx +1012 -0
  421. package/components/SearchBox.tsx +72 -0
  422. package/components/SentryErrorBoundary.ts +28 -0
  423. package/components/SessionBackgroundHint.tsx +108 -0
  424. package/components/SessionPreview.tsx +194 -0
  425. package/components/Settings/Config.tsx +1822 -0
  426. package/components/Settings/Settings.tsx +137 -0
  427. package/components/Settings/Status.tsx +241 -0
  428. package/components/Settings/Usage.tsx +377 -0
  429. package/components/ShowInIDEPrompt.tsx +170 -0
  430. package/components/SkillImprovementSurvey.tsx +152 -0
  431. package/components/Spinner/FlashingChar.tsx +61 -0
  432. package/components/Spinner/GlimmerMessage.tsx +328 -0
  433. package/components/Spinner/ShimmerChar.tsx +36 -0
  434. package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  435. package/components/Spinner/SpinnerGlyph.tsx +80 -0
  436. package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  437. package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  438. package/components/Spinner/index.ts +10 -0
  439. package/components/Spinner/teammateSelectHint.ts +1 -0
  440. package/components/Spinner/useShimmerAnimation.ts +31 -0
  441. package/components/Spinner/useStalledAnimation.ts +75 -0
  442. package/components/Spinner/utils.ts +84 -0
  443. package/components/Spinner.tsx +562 -0
  444. package/components/Stats.tsx +1228 -0
  445. package/components/StatusLine.tsx +324 -0
  446. package/components/StatusNotices.tsx +55 -0
  447. package/components/StructuredDiff/Fallback.tsx +487 -0
  448. package/components/StructuredDiff/colorDiff.ts +37 -0
  449. package/components/StructuredDiff.tsx +190 -0
  450. package/components/StructuredDiffList.tsx +30 -0
  451. package/components/TagTabs.tsx +139 -0
  452. package/components/TaskListV2.tsx +378 -0
  453. package/components/TeammateViewHeader.tsx +82 -0
  454. package/components/TeleportError.tsx +189 -0
  455. package/components/TeleportProgress.tsx +140 -0
  456. package/components/TeleportRepoMismatchDialog.tsx +104 -0
  457. package/components/TeleportResumeWrapper.tsx +167 -0
  458. package/components/TeleportStash.tsx +116 -0
  459. package/components/TextInput.tsx +124 -0
  460. package/components/ThemePicker.tsx +333 -0
  461. package/components/ThinkingToggle.tsx +153 -0
  462. package/components/TokenWarning.tsx +179 -0
  463. package/components/ToolUseLoader.tsx +42 -0
  464. package/components/TrustDialog/TrustDialog.tsx +290 -0
  465. package/components/TrustDialog/utils.ts +245 -0
  466. package/components/ValidationErrorsList.tsx +148 -0
  467. package/components/VimTextInput.tsx +140 -0
  468. package/components/VirtualMessageList.tsx +1082 -0
  469. package/components/WorkflowMultiselectDialog.tsx +128 -0
  470. package/components/WorktreeExitDialog.tsx +231 -0
  471. package/components/agents/AgentDetail.tsx +220 -0
  472. package/components/agents/AgentEditor.tsx +178 -0
  473. package/components/agents/AgentNavigationFooter.tsx +26 -0
  474. package/components/agents/AgentsList.tsx +440 -0
  475. package/components/agents/AgentsMenu.tsx +800 -0
  476. package/components/agents/ColorPicker.tsx +112 -0
  477. package/components/agents/ModelSelector.tsx +68 -0
  478. package/components/agents/ToolSelector.tsx +562 -0
  479. package/components/agents/agentFileUtils.ts +272 -0
  480. package/components/agents/generateAgent.ts +197 -0
  481. package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  482. package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  483. package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  484. package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  485. package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  486. package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  487. package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  488. package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  489. package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  490. package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  491. package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  492. package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  493. package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  494. package/components/agents/types.ts +27 -0
  495. package/components/agents/utils.ts +18 -0
  496. package/components/agents/validateAgent.ts +109 -0
  497. package/components/design-system/Byline.tsx +77 -0
  498. package/components/design-system/Dialog.tsx +138 -0
  499. package/components/design-system/Divider.tsx +149 -0
  500. package/components/design-system/FuzzyPicker.tsx +312 -0
  501. package/components/design-system/KeyboardShortcutHint.tsx +81 -0
  502. package/components/design-system/ListItem.tsx +244 -0
  503. package/components/design-system/LoadingState.tsx +94 -0
  504. package/components/design-system/Pane.tsx +77 -0
  505. package/components/design-system/ProgressBar.tsx +86 -0
  506. package/components/design-system/Ratchet.tsx +80 -0
  507. package/components/design-system/StatusIcon.tsx +95 -0
  508. package/components/design-system/Tabs.tsx +340 -0
  509. package/components/design-system/ThemeProvider.tsx +170 -0
  510. package/components/design-system/ThemedBox.tsx +156 -0
  511. package/components/design-system/ThemedText.tsx +124 -0
  512. package/components/design-system/color.ts +30 -0
  513. package/components/diff/DiffDetailView.tsx +281 -0
  514. package/components/diff/DiffDialog.tsx +383 -0
  515. package/components/diff/DiffFileList.tsx +292 -0
  516. package/components/grove/Grove.tsx +463 -0
  517. package/components/hooks/HooksConfigMenu.tsx +578 -0
  518. package/components/hooks/PromptDialog.tsx +90 -0
  519. package/components/hooks/SelectEventMode.tsx +127 -0
  520. package/components/hooks/SelectHookMode.tsx +112 -0
  521. package/components/hooks/SelectMatcherMode.tsx +144 -0
  522. package/components/hooks/ViewHookMode.tsx +199 -0
  523. package/components/mcp/CapabilitiesSection.tsx +61 -0
  524. package/components/mcp/ElicitationDialog.tsx +1169 -0
  525. package/components/mcp/MCPAgentServerMenu.tsx +183 -0
  526. package/components/mcp/MCPListPanel.tsx +504 -0
  527. package/components/mcp/MCPReconnect.tsx +167 -0
  528. package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  529. package/components/mcp/MCPSettings.tsx +398 -0
  530. package/components/mcp/MCPStdioServerMenu.tsx +177 -0
  531. package/components/mcp/MCPToolDetailView.tsx +212 -0
  532. package/components/mcp/MCPToolListView.tsx +141 -0
  533. package/components/mcp/McpParsingWarnings.tsx +213 -0
  534. package/components/mcp/index.ts +9 -0
  535. package/components/mcp/utils/reconnectHelpers.tsx +49 -0
  536. package/components/memory/MemoryFileSelector.tsx +438 -0
  537. package/components/memory/MemoryUpdateNotification.tsx +45 -0
  538. package/components/messageActions.tsx +450 -0
  539. package/components/messages/AdvisorMessage.tsx +158 -0
  540. package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  541. package/components/messages/AssistantTextMessage.tsx +270 -0
  542. package/components/messages/AssistantThinkingMessage.tsx +86 -0
  543. package/components/messages/AssistantToolUseMessage.tsx +368 -0
  544. package/components/messages/AttachmentMessage.tsx +536 -0
  545. package/components/messages/CollapsedReadSearchContent.tsx +484 -0
  546. package/components/messages/CompactBoundaryMessage.tsx +18 -0
  547. package/components/messages/GroupedToolUseContent.tsx +58 -0
  548. package/components/messages/HighlightedThinkingText.tsx +162 -0
  549. package/components/messages/HookProgressMessage.tsx +116 -0
  550. package/components/messages/PlanApprovalMessage.tsx +222 -0
  551. package/components/messages/RateLimitMessage.tsx +161 -0
  552. package/components/messages/ShutdownMessage.tsx +132 -0
  553. package/components/messages/SystemAPIErrorMessage.tsx +141 -0
  554. package/components/messages/SystemTextMessage.tsx +827 -0
  555. package/components/messages/TaskAssignmentMessage.tsx +76 -0
  556. package/components/messages/UserAgentNotificationMessage.tsx +83 -0
  557. package/components/messages/UserBashInputMessage.tsx +58 -0
  558. package/components/messages/UserBashOutputMessage.tsx +54 -0
  559. package/components/messages/UserChannelMessage.tsx +137 -0
  560. package/components/messages/UserCommandMessage.tsx +108 -0
  561. package/components/messages/UserImageMessage.tsx +59 -0
  562. package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  563. package/components/messages/UserMemoryInputMessage.tsx +75 -0
  564. package/components/messages/UserPlanMessage.tsx +42 -0
  565. package/components/messages/UserPromptMessage.tsx +80 -0
  566. package/components/messages/UserResourceUpdateMessage.tsx +121 -0
  567. package/components/messages/UserTeammateMessage.tsx +206 -0
  568. package/components/messages/UserTextMessage.tsx +275 -0
  569. package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  570. package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  571. package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  572. package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  573. package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  574. package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  575. package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  576. package/components/messages/UserToolResultMessage/utils.tsx +44 -0
  577. package/components/messages/nullRenderingAttachments.ts +70 -0
  578. package/components/messages/teamMemCollapsed.tsx +140 -0
  579. package/components/messages/teamMemSaved.ts +19 -0
  580. package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  581. package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  582. package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  583. package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  584. package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  585. package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  586. package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  587. package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  588. package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  589. package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  590. package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  591. package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  592. package/components/permissions/FallbackPermissionRequest.tsx +333 -0
  593. package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  594. package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  595. package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  596. package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  597. package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  598. package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  599. package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  600. package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  601. package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  602. package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  603. package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  604. package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  605. package/components/permissions/PermissionDialog.tsx +72 -0
  606. package/components/permissions/PermissionExplanation.tsx +272 -0
  607. package/components/permissions/PermissionPrompt.tsx +336 -0
  608. package/components/permissions/PermissionRequest.tsx +217 -0
  609. package/components/permissions/PermissionRequestTitle.tsx +66 -0
  610. package/components/permissions/PermissionRuleExplanation.tsx +121 -0
  611. package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  612. package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  613. package/components/permissions/SandboxPermissionRequest.tsx +163 -0
  614. package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  615. package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  616. package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  617. package/components/permissions/WorkerBadge.tsx +49 -0
  618. package/components/permissions/WorkerPendingPermission.tsx +105 -0
  619. package/components/permissions/hooks.ts +209 -0
  620. package/components/permissions/rules/AddPermissionRules.tsx +180 -0
  621. package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  622. package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  623. package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  624. package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  625. package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  626. package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  627. package/components/permissions/rules/WorkspaceTab.tsx +150 -0
  628. package/components/permissions/shellPermissionHelpers.tsx +164 -0
  629. package/components/permissions/useShellPermissionFeedback.ts +148 -0
  630. package/components/permissions/utils.ts +25 -0
  631. package/components/sandbox/SandboxConfigTab.tsx +45 -0
  632. package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  633. package/components/sandbox/SandboxDoctorSection.tsx +46 -0
  634. package/components/sandbox/SandboxOverridesTab.tsx +193 -0
  635. package/components/sandbox/SandboxSettings.tsx +296 -0
  636. package/components/shell/ExpandShellOutputContext.tsx +36 -0
  637. package/components/shell/OutputLine.tsx +118 -0
  638. package/components/shell/ShellProgressMessage.tsx +150 -0
  639. package/components/shell/ShellTimeDisplay.tsx +74 -0
  640. package/components/skills/SkillsMenu.tsx +237 -0
  641. package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  642. package/components/tasks/BackgroundTask.tsx +345 -0
  643. package/components/tasks/BackgroundTaskStatus.tsx +429 -0
  644. package/components/tasks/BackgroundTasksDialog.tsx +652 -0
  645. package/components/tasks/DreamDetailDialog.tsx +251 -0
  646. package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  647. package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  648. package/components/tasks/RemoteSessionProgress.tsx +243 -0
  649. package/components/tasks/ShellDetailDialog.tsx +404 -0
  650. package/components/tasks/ShellProgress.tsx +87 -0
  651. package/components/tasks/renderToolActivity.tsx +33 -0
  652. package/components/tasks/taskStatusUtils.tsx +107 -0
  653. package/components/teams/TeamStatus.tsx +80 -0
  654. package/components/teams/TeamsDialog.tsx +715 -0
  655. package/components/ui/OrderedList.tsx +71 -0
  656. package/components/ui/OrderedListItem.tsx +45 -0
  657. package/components/ui/TreeSelect.tsx +397 -0
  658. package/components/wizard/WizardDialogLayout.tsx +65 -0
  659. package/components/wizard/WizardNavigationFooter.tsx +24 -0
  660. package/components/wizard/WizardProvider.tsx +213 -0
  661. package/components/wizard/index.ts +9 -0
  662. package/components/wizard/useWizard.ts +13 -0
  663. package/context.ts +189 -0
  664. package/cost-tracker.ts +323 -0
  665. package/entrypoints/cli.tsx +1 -1
  666. package/history.ts +464 -0
  667. package/hooks/fileSuggestions.ts +811 -0
  668. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  669. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  670. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  671. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  672. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  673. package/hooks/notifs/useInstallMessages.tsx +26 -0
  674. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  675. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  676. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  677. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  678. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  679. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  680. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  681. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  682. package/hooks/notifs/useStartupNotification.ts +41 -0
  683. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  684. package/hooks/renderPlaceholder.ts +51 -0
  685. package/hooks/toolPermission/PermissionContext.ts +388 -0
  686. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  687. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  688. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  689. package/hooks/toolPermission/permissionLogging.ts +238 -0
  690. package/hooks/unifiedSuggestions.ts +202 -0
  691. package/hooks/useAfterFirstRender.ts +17 -0
  692. package/hooks/useApiKeyVerification.ts +84 -0
  693. package/hooks/useArrowKeyHistory.tsx +229 -0
  694. package/hooks/useAssistantHistory.ts +250 -0
  695. package/hooks/useAwaySummary.ts +125 -0
  696. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  697. package/hooks/useBlink.ts +34 -0
  698. package/hooks/useCanUseTool.tsx +204 -0
  699. package/hooks/useCancelRequest.ts +276 -0
  700. package/hooks/useChromeExtensionNotification.tsx +50 -0
  701. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  702. package/hooks/useClipboardImageHint.ts +77 -0
  703. package/hooks/useCommandKeybindings.tsx +108 -0
  704. package/hooks/useCommandQueue.ts +15 -0
  705. package/hooks/useCopyOnSelect.ts +98 -0
  706. package/hooks/useDeferredHookMessages.ts +46 -0
  707. package/hooks/useDiffData.ts +110 -0
  708. package/hooks/useDiffInIDE.ts +379 -0
  709. package/hooks/useDirectConnect.ts +229 -0
  710. package/hooks/useDoublePress.ts +62 -0
  711. package/hooks/useDynamicConfig.ts +22 -0
  712. package/hooks/useElapsedTime.ts +37 -0
  713. package/hooks/useExitOnCtrlCD.ts +95 -0
  714. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  715. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  716. package/hooks/useGlobalKeybindings.tsx +249 -0
  717. package/hooks/useHistorySearch.ts +303 -0
  718. package/hooks/useIDEIntegration.tsx +70 -0
  719. package/hooks/useIdeAtMentioned.ts +76 -0
  720. package/hooks/useIdeConnectionStatus.ts +33 -0
  721. package/hooks/useIdeLogging.ts +41 -0
  722. package/hooks/useIdeSelection.ts +150 -0
  723. package/hooks/useInboxPoller.ts +969 -0
  724. package/hooks/useInputBuffer.ts +132 -0
  725. package/hooks/useIssueFlagBanner.ts +133 -0
  726. package/hooks/useLogMessages.ts +119 -0
  727. package/hooks/useLspPluginRecommendation.tsx +194 -0
  728. package/hooks/useMailboxBridge.ts +21 -0
  729. package/hooks/useMainLoopModel.ts +34 -0
  730. package/hooks/useManagePlugins.ts +304 -0
  731. package/hooks/useMemoryUsage.ts +39 -0
  732. package/hooks/useMergedClients.ts +23 -0
  733. package/hooks/useMergedCommands.ts +15 -0
  734. package/hooks/useMergedTools.ts +44 -0
  735. package/hooks/useMinDisplayTime.ts +35 -0
  736. package/hooks/useNotifyAfterTimeout.ts +65 -0
  737. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  738. package/hooks/usePasteHandler.ts +285 -0
  739. package/hooks/usePluginRecommendationBase.tsx +105 -0
  740. package/hooks/usePrStatus.ts +106 -0
  741. package/hooks/usePromptSuggestion.ts +177 -0
  742. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  743. package/hooks/useQueueProcessor.ts +68 -0
  744. package/hooks/useRemoteSession.ts +605 -0
  745. package/hooks/useReplBridge.tsx +723 -0
  746. package/hooks/useSSHSession.ts +241 -0
  747. package/hooks/useScheduledTasks.ts +139 -0
  748. package/hooks/useSearchInput.ts +364 -0
  749. package/hooks/useSessionBackgrounding.ts +158 -0
  750. package/hooks/useSettings.ts +17 -0
  751. package/hooks/useSettingsChange.ts +25 -0
  752. package/hooks/useSkillImprovementSurvey.ts +105 -0
  753. package/hooks/useSkillsChange.ts +62 -0
  754. package/hooks/useSwarmInitialization.ts +81 -0
  755. package/hooks/useSwarmPermissionPoller.ts +330 -0
  756. package/hooks/useTaskListWatcher.ts +221 -0
  757. package/hooks/useTasksV2.ts +250 -0
  758. package/hooks/useTeammateViewAutoExit.ts +63 -0
  759. package/hooks/useTeleportResume.tsx +85 -0
  760. package/hooks/useTerminalSize.ts +15 -0
  761. package/hooks/useTextInput.ts +529 -0
  762. package/hooks/useTimeout.ts +14 -0
  763. package/hooks/useTurnDiffs.ts +213 -0
  764. package/hooks/useTypeahead.tsx +1385 -0
  765. package/hooks/useUpdateNotification.ts +34 -0
  766. package/hooks/useVimInput.ts +316 -0
  767. package/hooks/useVirtualScroll.ts +721 -0
  768. package/hooks/useVoice.ts +1144 -0
  769. package/hooks/useVoiceEnabled.ts +25 -0
  770. package/hooks/useVoiceIntegration.tsx +677 -0
  771. package/ink/Ansi.tsx +292 -0
  772. package/ink/bidi.ts +139 -0
  773. package/ink/clearTerminal.ts +74 -0
  774. package/ink/colorize.ts +231 -0
  775. package/ink/components/AlternateScreen.tsx +80 -0
  776. package/ink/components/App.tsx +658 -0
  777. package/ink/components/AppContext.ts +21 -0
  778. package/ink/components/Box.tsx +214 -0
  779. package/ink/components/Button.tsx +192 -0
  780. package/ink/components/ClockContext.tsx +112 -0
  781. package/ink/components/CursorDeclarationContext.ts +32 -0
  782. package/ink/components/ErrorOverview.tsx +109 -0
  783. package/ink/components/Link.tsx +42 -0
  784. package/ink/components/Newline.tsx +39 -0
  785. package/ink/components/NoSelect.tsx +68 -0
  786. package/ink/components/RawAnsi.tsx +57 -0
  787. package/ink/components/ScrollBox.tsx +237 -0
  788. package/ink/components/Spacer.tsx +20 -0
  789. package/ink/components/StdinContext.ts +49 -0
  790. package/ink/components/TerminalFocusContext.tsx +52 -0
  791. package/ink/components/TerminalSizeContext.tsx +7 -0
  792. package/ink/components/Text.tsx +254 -0
  793. package/ink/constants.ts +2 -0
  794. package/ink/dom.ts +484 -0
  795. package/ink/events/click-event.ts +38 -0
  796. package/ink/events/dispatcher.ts +233 -0
  797. package/ink/events/emitter.ts +39 -0
  798. package/ink/events/event-handlers.ts +73 -0
  799. package/ink/events/event.ts +11 -0
  800. package/ink/events/focus-event.ts +21 -0
  801. package/ink/events/input-event.ts +205 -0
  802. package/ink/events/keyboard-event.ts +51 -0
  803. package/ink/events/terminal-event.ts +107 -0
  804. package/ink/events/terminal-focus-event.ts +19 -0
  805. package/ink/focus.ts +181 -0
  806. package/ink/frame.ts +124 -0
  807. package/ink/get-max-width.ts +27 -0
  808. package/ink/global.d.ts +26 -0
  809. package/ink/hit-test.ts +130 -0
  810. package/ink/hooks/use-animation-frame.ts +57 -0
  811. package/ink/hooks/use-app.ts +8 -0
  812. package/ink/hooks/use-declared-cursor.ts +73 -0
  813. package/ink/hooks/use-input.ts +92 -0
  814. package/ink/hooks/use-interval.ts +67 -0
  815. package/ink/hooks/use-search-highlight.ts +53 -0
  816. package/ink/hooks/use-selection.ts +104 -0
  817. package/ink/hooks/use-stdin.ts +8 -0
  818. package/ink/hooks/use-tab-status.ts +72 -0
  819. package/ink/hooks/use-terminal-focus.ts +16 -0
  820. package/ink/hooks/use-terminal-title.ts +31 -0
  821. package/ink/hooks/use-terminal-viewport.ts +96 -0
  822. package/ink/ink.tsx +1754 -0
  823. package/ink/instances.ts +10 -0
  824. package/ink/layout/engine.ts +6 -0
  825. package/ink/layout/geometry.ts +97 -0
  826. package/ink/layout/node.ts +152 -0
  827. package/ink/layout/yoga.ts +308 -0
  828. package/ink/line-width-cache.ts +24 -0
  829. package/ink/log-update.ts +773 -0
  830. package/ink/measure-element.ts +23 -0
  831. package/ink/measure-text.ts +47 -0
  832. package/ink/node-cache.ts +54 -0
  833. package/ink/optimizer.ts +93 -0
  834. package/ink/output.ts +797 -0
  835. package/ink/parse-keypress.ts +801 -0
  836. package/ink/reconciler.ts +512 -0
  837. package/ink/render-border.ts +231 -0
  838. package/ink/render-node-to-output.ts +1462 -0
  839. package/ink/render-to-screen.ts +231 -0
  840. package/ink/renderer.ts +178 -0
  841. package/ink/root.ts +184 -0
  842. package/ink/screen.ts +1486 -0
  843. package/ink/searchHighlight.ts +93 -0
  844. package/ink/selection.ts +917 -0
  845. package/ink/squash-text-nodes.ts +92 -0
  846. package/ink/stringWidth.ts +223 -0
  847. package/ink/styles.ts +771 -0
  848. package/ink/supports-hyperlinks.ts +57 -0
  849. package/ink/tabstops.ts +46 -0
  850. package/ink/terminal-focus-state.ts +47 -0
  851. package/ink/terminal-querier.ts +212 -0
  852. package/ink/terminal.ts +248 -0
  853. package/ink/termio/ansi.ts +75 -0
  854. package/ink/termio/csi.ts +319 -0
  855. package/ink/termio/dec.ts +60 -0
  856. package/ink/termio/esc.ts +67 -0
  857. package/ink/termio/osc.ts +493 -0
  858. package/ink/termio/parser.ts +394 -0
  859. package/ink/termio/sgr.ts +308 -0
  860. package/ink/termio/tokenize.ts +319 -0
  861. package/ink/termio/types.ts +236 -0
  862. package/ink/termio.ts +42 -0
  863. package/ink/useTerminalNotification.ts +126 -0
  864. package/ink/warn.ts +9 -0
  865. package/ink/widest-line.ts +19 -0
  866. package/ink/wrap-text.ts +74 -0
  867. package/ink/wrapAnsi.ts +20 -0
  868. package/inspect.js +7 -0
  869. package/keybindings/KeybindingContext.tsx +243 -0
  870. package/keybindings/KeybindingProviderSetup.tsx +308 -0
  871. package/keybindings/defaultBindings.ts +340 -0
  872. package/keybindings/loadUserBindings.ts +472 -0
  873. package/keybindings/match.ts +120 -0
  874. package/keybindings/parser.ts +203 -0
  875. package/keybindings/reservedShortcuts.ts +127 -0
  876. package/keybindings/resolver.ts +244 -0
  877. package/keybindings/schema.ts +236 -0
  878. package/keybindings/shortcutFormat.ts +63 -0
  879. package/keybindings/template.ts +52 -0
  880. package/keybindings/useKeybinding.ts +196 -0
  881. package/keybindings/useShortcutDisplay.ts +59 -0
  882. package/keybindings/validate.ts +498 -0
  883. package/macro.ts +24 -0
  884. package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  885. package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  886. package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  887. package/migrations/migrateFennecToOpus.ts +45 -0
  888. package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  889. package/migrations/migrateOpusToOpus1m.ts +43 -0
  890. package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  891. package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  892. package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  893. package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  894. package/migrations/resetProToOpusDefault.ts +51 -0
  895. package/package.json +29 -3
  896. package/patch-box.js +54 -0
  897. package/patch-compact.js +13 -0
  898. package/patch-condensed-center.js +13 -0
  899. package/patch-condensed-row.js +13 -0
  900. package/patch-condensed.js +13 -0
  901. package/patch-final.js +58 -0
  902. package/patch-input-body.js +46 -0
  903. package/patch-input-body2.js +35 -0
  904. package/patch-input-style.js +13 -0
  905. package/patch-input-width.js +13 -0
  906. package/patch-layout.js +87 -0
  907. package/patch-logo-row.js +12 -0
  908. package/patch-width.js +13 -0
  909. package/patch-width2.js +13 -0
  910. package/patch2.js +74 -0
  911. package/patch3.js +13 -0
  912. package/query.ts +1750 -0
  913. package/remote/RemoteSessionManager.ts +343 -0
  914. package/remote/SessionsWebSocket.ts +404 -0
  915. package/remote/remotePermissionBridge.ts +78 -0
  916. package/remote/sdkMessageAdapter.ts +302 -0
  917. package/skills/bundled/batch.ts +124 -0
  918. package/skills/bundled/claudeApi.ts +196 -0
  919. package/skills/bundled/claudeApiContent.ts +75 -0
  920. package/skills/bundled/claudeInChrome.ts +34 -0
  921. package/skills/bundled/debug.ts +103 -0
  922. package/skills/bundled/index.ts +79 -0
  923. package/skills/bundled/keybindings.ts +339 -0
  924. package/skills/bundled/loop.ts +92 -0
  925. package/skills/bundled/loremIpsum.ts +282 -0
  926. package/skills/bundled/remember.ts +82 -0
  927. package/skills/bundled/scheduleRemoteAgents.ts +447 -0
  928. package/skills/bundled/simplify.ts +69 -0
  929. package/skills/bundled/skillify.ts +197 -0
  930. package/skills/bundled/stuck.ts +79 -0
  931. package/skills/bundled/updateConfig.ts +475 -0
  932. package/skills/bundled/verify/SKILL.md +3 -0
  933. package/skills/bundled/verify/examples/cli.md +3 -0
  934. package/skills/bundled/verify/examples/server.md +3 -0
  935. package/skills/bundled/verify.ts +30 -0
  936. package/skills/bundled/verifyContent.ts +13 -0
  937. package/skills/bundledSkills.ts +220 -0
  938. package/skills/loadSkillsDir.ts +1086 -0
  939. package/skills/mcpSkillBuilders.ts +44 -0
  940. package/state/AppState.tsx +200 -0
  941. package/state/AppStateStore.ts +569 -0
  942. package/state/onChangeAppState.ts +171 -0
  943. package/state/selectors.ts +76 -0
  944. package/state/store.ts +34 -0
  945. package/state/teammateViewHelpers.ts +141 -0
  946. package/tasks/DreamTask/DreamTask.ts +157 -0
  947. package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  948. package/tasks/InProcessTeammateTask/types.ts +121 -0
  949. package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  950. package/tasks/LocalMainSessionTask.ts +479 -0
  951. package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  952. package/tasks/LocalShellTask/guards.ts +41 -0
  953. package/tasks/LocalShellTask/killShellTasks.ts +76 -0
  954. package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  955. package/tasks/pillLabel.ts +82 -0
  956. package/tasks/stopTask.ts +100 -0
  957. package/tasks/types.ts +46 -0
  958. package/types/command.ts +216 -0
  959. package/types/connectorText.ts +13 -0
  960. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  961. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  962. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  963. package/types/generated/google/protobuf/timestamp.ts +187 -0
  964. package/types/hooks.ts +290 -0
  965. package/types/ids.ts +44 -0
  966. package/types/logs.ts +330 -0
  967. package/types/permissions.ts +441 -0
  968. package/types/plugin.ts +363 -0
  969. package/types/textInputTypes.ts +387 -0
package/QueryEngine.ts ADDED
@@ -0,0 +1,1331 @@
1
+ import { feature } from 'bun:bundle'
2
+ import type { ContentBlockParam } from '@anthropic-ai/sdk/resources/messages.mjs'
3
+ import { randomUUID } from 'crypto'
4
+ import last from 'lodash-es/last.js'
5
+ import {
6
+ getSessionId,
7
+ isSessionPersistenceDisabled,
8
+ } from 'src/bootstrap/state.js'
9
+ import type {
10
+ PermissionMode,
11
+ SDKCompactBoundaryMessage,
12
+ SDKMessage,
13
+ SDKPermissionDenial,
14
+ SDKStatus,
15
+ SDKUserMessageReplay,
16
+ } from 'src/entrypoints/agentSdkTypes.js'
17
+ import { accumulateUsage, updateUsage } from 'src/services/api/gemini.js'
18
+ import type { NonNullableUsage } from 'src/services/api/logging.js'
19
+ import { EMPTY_USAGE } from 'src/services/api/logging.js'
20
+ import stripAnsi from 'strip-ansi'
21
+ import type { Command } from './commands.js'
22
+ import { getSlashCommandToolSkills } from './commands.js'
23
+ import {
24
+ LOCAL_COMMAND_STDERR_TAG,
25
+ LOCAL_COMMAND_STDOUT_TAG,
26
+ } from './constants/xml.js'
27
+ import {
28
+ getModelUsage,
29
+ getTotalAPIDuration,
30
+ getTotalCost,
31
+ } from './cost-tracker.js'
32
+ import type { CanUseToolFn } from './hooks/useCanUseTool.js'
33
+ import { loadMemoryPrompt } from './memdir/memdir.js'
34
+ import { hasAutoMemPathOverride } from './memdir/paths.js'
35
+ import { query } from './query.js'
36
+ import { categorizeRetryableAPIError } from './services/api/errors.js'
37
+ import type { MCPServerConnection } from './services/mcp/types.js'
38
+ import type { AppState } from './state/AppState.js'
39
+ import { type Tools, type ToolUseContext, toolMatchesName } from './Tool.js'
40
+ import type { AgentDefinition } from './tools/AgentTool/loadAgentsDir.js'
41
+ import { SYNTHETIC_OUTPUT_TOOL_NAME } from './tools/SyntheticOutputTool/SyntheticOutputTool.js'
42
+ import type { Message } from './types/message.js'
43
+ import type { OrphanedPermission } from './types/textInputTypes.js'
44
+ import { createAbortController } from './utils/abortController.js'
45
+ import type { AttributionState } from './utils/commitAttribution.js'
46
+ import { getGlobalConfig } from './utils/config.js'
47
+ import { getCwd } from './utils/cwd.js'
48
+ import { isBareMode, isEnvTruthy } from './utils/envUtils.js'
49
+ import { getFastModeState } from './utils/fastMode.js'
50
+ import {
51
+ type FileHistoryState,
52
+ fileHistoryEnabled,
53
+ fileHistoryMakeSnapshot,
54
+ } from './utils/fileHistory.js'
55
+ import {
56
+ cloneFileStateCache,
57
+ type FileStateCache,
58
+ } from './utils/fileStateCache.js'
59
+ import { headlessProfilerCheckpoint } from './utils/headlessProfiler.js'
60
+ import { registerStructuredOutputEnforcement } from './utils/hooks/hookHelpers.js'
61
+ import { getInMemoryErrors } from './utils/log.js'
62
+ import { countToolCalls, SYNTHETIC_MESSAGES } from './utils/messages.js'
63
+ import {
64
+ getMainLoopModel,
65
+ parseUserSpecifiedModel,
66
+ } from './utils/model/model.js'
67
+ import { loadAllPluginsCacheOnly } from './utils/plugins/pluginLoader.js'
68
+ import {
69
+ type ProcessUserInputContext,
70
+ processUserInput,
71
+ } from './utils/processUserInput/processUserInput.js'
72
+ import { fetchSystemPromptParts } from './utils/queryContext.js'
73
+ import { setCwd } from './utils/Shell.js'
74
+ import {
75
+ flushSessionStorage,
76
+ recordTranscript,
77
+ } from './utils/sessionStorage.js'
78
+ import { asSystemPrompt } from './utils/systemPromptType.js'
79
+ import { resolveThemeSetting } from './utils/systemTheme.js'
80
+ import {
81
+ shouldEnableThinkingByDefault,
82
+ type ThinkingConfig,
83
+ } from './utils/thinking.js'
84
+
85
+ // Lazy: MessageSelector.tsx pulls React/ink; only needed for message filtering at query time
86
+ /* eslint-disable @typescript-eslint/no-require-imports */
87
+ const messageSelector =
88
+ (): typeof import('src/components/MessageSelector.js') =>
89
+ require('src/components/MessageSelector.js')
90
+
91
+ import {
92
+ localCommandOutputToSDKAssistantMessage,
93
+ toSDKCompactMetadata,
94
+ } from './utils/messages/mappers.js'
95
+ import {
96
+ buildSystemInitMessage,
97
+ sdkCompatToolName,
98
+ } from './utils/messages/systemInit.js'
99
+ import {
100
+ getScratchpadDir,
101
+ isScratchpadEnabled,
102
+ } from './utils/permissions/filesystem.js'
103
+ /* eslint-enable @typescript-eslint/no-require-imports */
104
+ import {
105
+ handleOrphanedPermission,
106
+ isResultSuccessful,
107
+ normalizeMessage,
108
+ } from './utils/queryHelpers.js'
109
+
110
+ // Dead code elimination: conditional import for coordinator mode
111
+ /* eslint-disable @typescript-eslint/no-require-imports */
112
+ const getCoordinatorUserContext: (
113
+ mcpClients: ReadonlyArray<{ name: string }>,
114
+ scratchpadDir?: string,
115
+ ) => { [k: string]: string } = feature('COORDINATOR_MODE')
116
+ ? require('./coordinator/coordinatorMode.js').getCoordinatorUserContext
117
+ : () => ({})
118
+ /* eslint-enable @typescript-eslint/no-require-imports */
119
+
120
+ // Dead code elimination: conditional import for snip compaction
121
+ /* eslint-disable @typescript-eslint/no-require-imports */
122
+ const snipModule = feature('HISTORY_SNIP')
123
+ ? (require('./services/compact/snipCompact.js') as typeof import('./services/compact/snipCompact.js'))
124
+ : null
125
+ const snipProjection = feature('HISTORY_SNIP')
126
+ ? (require('./services/compact/snipProjection.js') as typeof import('./services/compact/snipProjection.js'))
127
+ : null
128
+ /* eslint-enable @typescript-eslint/no-require-imports */
129
+
130
+ export type QueryEngineConfig = {
131
+ cwd: string
132
+ tools: Tools
133
+ commands: Command[]
134
+ mcpClients: MCPServerConnection[]
135
+ agents: AgentDefinition[]
136
+ canUseTool: CanUseToolFn
137
+ getAppState: () => AppState
138
+ setAppState: (f: (prev: AppState) => AppState) => void
139
+ initialMessages?: Message[]
140
+ readFileCache: FileStateCache
141
+ customSystemPrompt?: string
142
+ appendSystemPrompt?: string
143
+ userSpecifiedModel?: string
144
+ fallbackModel?: string
145
+ thinkingConfig?: ThinkingConfig
146
+ maxTurns?: number
147
+ maxBudgetUsd?: number
148
+ taskBudget?: { total: number }
149
+ jsonSchema?: Record<string, unknown>
150
+ verbose?: boolean
151
+ replayUserMessages?: boolean
152
+ /** Handler for URL elicitations triggered by MCP tool -32042 errors. */
153
+ handleElicitation?: ToolUseContext['handleElicitation']
154
+ includePartialMessages?: boolean
155
+ setSDKStatus?: (status: SDKStatus) => void
156
+ abortController?: AbortController
157
+ orphanedPermission?: OrphanedPermission
158
+ /**
159
+ * Snip-boundary handler: receives each yielded system message plus the
160
+ * current mutableMessages store. Returns undefined if the message is not a
161
+ * snip boundary; otherwise returns the replayed snip result. Injected by
162
+ * ask() when HISTORY_SNIP is enabled so feature-gated strings stay inside
163
+ * the gated module (keeps QueryEngine free of excluded strings and testable
164
+ * despite feature() returning false under bun test). SDK-only: the REPL
165
+ * keeps full history for UI scrollback and projects on demand via
166
+ * projectSnippedView; QueryEngine truncates here to bound memory in long
167
+ * headless sessions (no UI to preserve).
168
+ */
169
+ snipReplay?: (
170
+ yieldedSystemMsg: Message,
171
+ store: Message[],
172
+ ) => { messages: Message[]; executed: boolean } | undefined
173
+ }
174
+
175
+ /**
176
+ * QueryEngine owns the query lifecycle and session state for a conversation.
177
+ * It extracts the core logic from ask() into a standalone class that can be
178
+ * used by both the headless/SDK path and (in a future phase) the REPL.
179
+ *
180
+ * One QueryEngine per conversation. Each submitMessage() call starts a new
181
+ * turn within the same conversation. State (messages, file cache, usage, etc.)
182
+ * persists across turns.
183
+ */
184
+ export class QueryEngine {
185
+ private config: QueryEngineConfig
186
+ private mutableMessages: Message[]
187
+ private abortController: AbortController
188
+ private permissionDenials: SDKPermissionDenial[]
189
+ private totalUsage: NonNullableUsage
190
+ private hasHandledOrphanedPermission = false
191
+ private readFileState: FileStateCache
192
+ // Turn-scoped skill discovery tracking (feeds was_discovered on
193
+ // tengu_skill_tool_invocation). Must persist across the two
194
+ // processUserInputContext rebuilds inside submitMessage, but is cleared
195
+ // at the start of each submitMessage to avoid unbounded growth across
196
+ // many turns in SDK mode.
197
+ private discoveredSkillNames = new Set<string>()
198
+ private loadedNestedMemoryPaths = new Set<string>()
199
+
200
+ constructor(config: QueryEngineConfig) {
201
+ this.config = config
202
+ this.mutableMessages = config.initialMessages ?? []
203
+ this.abortController = config.abortController ?? createAbortController()
204
+ this.permissionDenials = []
205
+ this.readFileState = config.readFileCache
206
+ this.totalUsage = EMPTY_USAGE
207
+ }
208
+
209
+ async *submitMessage(
210
+ prompt: string | ContentBlockParam[],
211
+ options?: { uuid?: string; isMeta?: boolean },
212
+ ): AsyncGenerator<SDKMessage, void, unknown> {
213
+ const {
214
+ cwd,
215
+ commands,
216
+ tools,
217
+ mcpClients,
218
+ verbose = false,
219
+ thinkingConfig,
220
+ maxTurns,
221
+ maxBudgetUsd,
222
+ taskBudget,
223
+ canUseTool,
224
+ customSystemPrompt,
225
+ appendSystemPrompt,
226
+ userSpecifiedModel,
227
+ fallbackModel,
228
+ jsonSchema,
229
+ getAppState,
230
+ setAppState,
231
+ replayUserMessages = false,
232
+ includePartialMessages = false,
233
+ agents = [],
234
+ setSDKStatus,
235
+ orphanedPermission,
236
+ } = this.config
237
+
238
+ this.discoveredSkillNames.clear()
239
+ setCwd(cwd)
240
+ const persistSession = !isSessionPersistenceDisabled()
241
+ const startTime = Date.now()
242
+
243
+ // Wrap canUseTool to track permission denials
244
+ const wrappedCanUseTool: CanUseToolFn = async (
245
+ tool,
246
+ input,
247
+ toolUseContext,
248
+ assistantMessage,
249
+ toolUseID,
250
+ forceDecision,
251
+ ) => {
252
+ const result = await canUseTool(
253
+ tool,
254
+ input,
255
+ toolUseContext,
256
+ assistantMessage,
257
+ toolUseID,
258
+ forceDecision,
259
+ )
260
+
261
+ // Track denials for SDK reporting
262
+ if (result.behavior !== 'allow') {
263
+ this.permissionDenials.push({
264
+ tool_name: sdkCompatToolName(tool.name),
265
+ tool_use_id: toolUseID,
266
+ tool_input: input,
267
+ })
268
+ }
269
+
270
+ return result
271
+ }
272
+
273
+ const initialAppState = getAppState()
274
+ const initialMainLoopModel = userSpecifiedModel
275
+ ? parseUserSpecifiedModel(userSpecifiedModel)
276
+ : getMainLoopModel()
277
+
278
+ const initialThinkingConfig: ThinkingConfig = thinkingConfig
279
+ ? thinkingConfig
280
+ : shouldEnableThinkingByDefault() !== false
281
+ ? { type: 'adaptive' }
282
+ : { type: 'disabled' }
283
+
284
+ headlessProfilerCheckpoint('before_getSystemPrompt')
285
+ // Narrow once so TS tracks the type through the conditionals below.
286
+ const customPrompt =
287
+ typeof customSystemPrompt === 'string' ? customSystemPrompt : undefined
288
+ const {
289
+ defaultSystemPrompt,
290
+ userContext: baseUserContext,
291
+ systemContext,
292
+ } = await fetchSystemPromptParts({
293
+ tools,
294
+ mainLoopModel: initialMainLoopModel,
295
+ additionalWorkingDirectories: Array.from(
296
+ initialAppState.toolPermissionContext.additionalWorkingDirectories.keys(),
297
+ ),
298
+ mcpClients,
299
+ customSystemPrompt: customPrompt,
300
+ })
301
+ headlessProfilerCheckpoint('after_getSystemPrompt')
302
+ const userContext = {
303
+ ...baseUserContext,
304
+ ...getCoordinatorUserContext(
305
+ mcpClients,
306
+ isScratchpadEnabled() ? getScratchpadDir() : undefined,
307
+ ),
308
+ }
309
+
310
+ // When an SDK caller provides a custom system prompt AND has set
311
+ // CLAUDE_COWORK_MEMORY_PATH_OVERRIDE, inject the memory-mechanics prompt.
312
+ // The env var is an explicit opt-in signal — the caller has wired up
313
+ // a memory directory and needs Claude to know how to use it (which
314
+ // Write/Edit tools to call, MEMORY.md filename, loading semantics).
315
+ // The caller can layer their own policy text via appendSystemPrompt.
316
+ const memoryMechanicsPrompt =
317
+ customPrompt !== undefined && hasAutoMemPathOverride()
318
+ ? await loadMemoryPrompt()
319
+ : null
320
+
321
+ let lastUserQuery = ''
322
+ if (typeof prompt === 'string') {
323
+ lastUserQuery = prompt
324
+ } else if (Array.isArray(prompt)) {
325
+ lastUserQuery = prompt.map(c => c.type === 'text' ? c.text : '').join('\\n')
326
+ }
327
+
328
+ const xmemContext = await (async () => {
329
+ // XMem is now the default memory system - always retrieve context when there's a query
330
+ if (lastUserQuery.trim()) {
331
+ try {
332
+ const { logForDebugging } = await import('./utils/debug.js')
333
+ const logMsg = `[XMem Retrieve] Retrieving memory for user_id: 'default_user' with query: ${lastUserQuery.substring(0, 50)}...\\n`
334
+ logForDebugging(logMsg)
335
+ console.error(logMsg)
336
+
337
+ const { xmemClient } = await import('./utils/xmem.js')
338
+ const result = await xmemClient.retrieve({ query: lastUserQuery, user_id: 'default_user' })
339
+
340
+ const successMsg = `[XMem Retrieve] Successfully retrieved memory context.\\n`
341
+ logForDebugging(successMsg)
342
+ console.error(successMsg)
343
+
344
+ return `## XMem Context\\n\\n${result.answer}`
345
+ } catch (e) {
346
+ const { logForDebugging } = await import('./utils/debug.js')
347
+ const errorMsg = `[XMem Retrieve] Retrieve error: ${e}\\n`
348
+ logForDebugging(errorMsg)
349
+ console.error(errorMsg)
350
+ return null
351
+ }
352
+ }
353
+ return null
354
+ })()
355
+
356
+ const systemPrompt = asSystemPrompt([
357
+ ...(customPrompt !== undefined ? [customPrompt] : defaultSystemPrompt),
358
+ ...(memoryMechanicsPrompt ? [memoryMechanicsPrompt] : []),
359
+ ...(xmemContext ? [xmemContext] : []),
360
+ ...(appendSystemPrompt ? [appendSystemPrompt] : []),
361
+ ])
362
+
363
+ // Register function hook for structured output enforcement
364
+ const hasStructuredOutputTool = tools.some(t =>
365
+ toolMatchesName(t, SYNTHETIC_OUTPUT_TOOL_NAME),
366
+ )
367
+ if (jsonSchema && hasStructuredOutputTool) {
368
+ registerStructuredOutputEnforcement(setAppState, getSessionId())
369
+ }
370
+
371
+ let processUserInputContext: ProcessUserInputContext = {
372
+ messages: this.mutableMessages,
373
+ // Slash commands that mutate the message array (e.g. /force-snip)
374
+ // call setMessages(fn). In interactive mode this writes back to
375
+ // AppState; in print mode we write back to mutableMessages so the
376
+ // rest of the query loop (push at :389, snapshot at :392) sees
377
+ // the result. The second processUserInputContext below (after
378
+ // slash-command processing) keeps the no-op — nothing else calls
379
+ // setMessages past that point.
380
+ setMessages: fn => {
381
+ this.mutableMessages = fn(this.mutableMessages)
382
+ },
383
+ onChangeAPIKey: () => {},
384
+ handleElicitation: this.config.handleElicitation,
385
+ options: {
386
+ commands,
387
+ debug: false, // we use stdout, so don't want to clobber it
388
+ tools,
389
+ verbose,
390
+ mainLoopModel: initialMainLoopModel,
391
+ thinkingConfig: initialThinkingConfig,
392
+ mcpClients,
393
+ mcpResources: {},
394
+ ideInstallationStatus: null,
395
+ isNonInteractiveSession: true,
396
+ customSystemPrompt,
397
+ appendSystemPrompt,
398
+ agentDefinitions: { activeAgents: agents, allAgents: [] },
399
+ theme: resolveThemeSetting(getGlobalConfig().theme),
400
+ maxBudgetUsd,
401
+ },
402
+ getAppState,
403
+ setAppState,
404
+ abortController: this.abortController,
405
+ readFileState: this.readFileState,
406
+ nestedMemoryAttachmentTriggers: new Set<string>(),
407
+ loadedNestedMemoryPaths: this.loadedNestedMemoryPaths,
408
+ dynamicSkillDirTriggers: new Set<string>(),
409
+ discoveredSkillNames: this.discoveredSkillNames,
410
+ setInProgressToolUseIDs: () => {},
411
+ setResponseLength: () => {},
412
+ updateFileHistoryState: (
413
+ updater: (prev: FileHistoryState) => FileHistoryState,
414
+ ) => {
415
+ setAppState(prev => {
416
+ const updated = updater(prev.fileHistory)
417
+ if (updated === prev.fileHistory) return prev
418
+ return { ...prev, fileHistory: updated }
419
+ })
420
+ },
421
+ updateAttributionState: (
422
+ updater: (prev: AttributionState) => AttributionState,
423
+ ) => {
424
+ setAppState(prev => {
425
+ const updated = updater(prev.attribution)
426
+ if (updated === prev.attribution) return prev
427
+ return { ...prev, attribution: updated }
428
+ })
429
+ },
430
+ setSDKStatus,
431
+ }
432
+
433
+ // Handle orphaned permission (only once per engine lifetime)
434
+ if (orphanedPermission && !this.hasHandledOrphanedPermission) {
435
+ this.hasHandledOrphanedPermission = true
436
+ for await (const message of handleOrphanedPermission(
437
+ orphanedPermission,
438
+ tools,
439
+ this.mutableMessages,
440
+ processUserInputContext,
441
+ )) {
442
+ yield message
443
+ }
444
+ }
445
+
446
+ const {
447
+ messages: messagesFromUserInput,
448
+ shouldQuery,
449
+ allowedTools,
450
+ model: modelFromUserInput,
451
+ resultText,
452
+ } = await processUserInput({
453
+ input: prompt,
454
+ mode: 'prompt',
455
+ setToolJSX: () => {},
456
+ context: {
457
+ ...processUserInputContext,
458
+ messages: this.mutableMessages,
459
+ },
460
+ messages: this.mutableMessages,
461
+ uuid: options?.uuid,
462
+ isMeta: options?.isMeta,
463
+ querySource: 'sdk',
464
+ })
465
+
466
+ // Push new messages, including user input and any attachments
467
+ this.mutableMessages.push(...messagesFromUserInput)
468
+
469
+ // Update params to reflect updates from processing /slash commands
470
+ const messages = [...this.mutableMessages]
471
+
472
+ // Persist the user's message(s) to transcript BEFORE entering the query
473
+ // loop. The for-await below only calls recordTranscript when ask() yields
474
+ // an assistant/user/compact_boundary message — which doesn't happen until
475
+ // the API responds. If the process is killed before that (e.g. user clicks
476
+ // Stop in cowork seconds after send), the transcript is left with only
477
+ // queue-operation entries; getLastSessionLog filters those out, returns
478
+ // null, and --resume fails with "No conversation found". Writing now makes
479
+ // the transcript resumable from the point the user message was accepted,
480
+ // even if no API response ever arrives.
481
+ //
482
+ // --bare / SIMPLE: fire-and-forget. Scripted calls don't --resume after
483
+ // kill-mid-request. The await is ~4ms on SSD, ~30ms under disk contention
484
+ // — the single largest controllable critical-path cost after module eval.
485
+ // Transcript is still written (for post-hoc debugging); just not blocking.
486
+ if (persistSession && messagesFromUserInput.length > 0) {
487
+ const transcriptPromise = recordTranscript(messages)
488
+ if (isBareMode()) {
489
+ void transcriptPromise
490
+ } else {
491
+ await transcriptPromise
492
+ if (
493
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
494
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
495
+ ) {
496
+ await flushSessionStorage()
497
+ }
498
+ }
499
+ }
500
+
501
+ // Filter messages that should be acknowledged after transcript
502
+ const replayableMessages = messagesFromUserInput.filter(
503
+ msg =>
504
+ (msg.type === 'user' &&
505
+ !msg.isMeta && // Skip synthetic caveat messages
506
+ !msg.toolUseResult && // Skip tool results (they'll be acked from query)
507
+ messageSelector().selectableUserMessagesFilter(msg)) || // Skip non-user-authored messages (task notifications, etc.)
508
+ (msg.type === 'system' && msg.subtype === 'compact_boundary'), // Always ack compact boundaries
509
+ )
510
+ const messagesToAck = replayUserMessages ? replayableMessages : []
511
+
512
+ // Update the ToolPermissionContext based on user input processing (as necessary)
513
+ setAppState(prev => ({
514
+ ...prev,
515
+ toolPermissionContext: {
516
+ ...prev.toolPermissionContext,
517
+ alwaysAllowRules: {
518
+ ...prev.toolPermissionContext.alwaysAllowRules,
519
+ command: allowedTools,
520
+ },
521
+ },
522
+ }))
523
+
524
+ const mainLoopModel = modelFromUserInput ?? initialMainLoopModel
525
+
526
+ // Recreate after processing the prompt to pick up updated messages and
527
+ // model (from slash commands).
528
+ processUserInputContext = {
529
+ messages,
530
+ setMessages: () => {},
531
+ onChangeAPIKey: () => {},
532
+ handleElicitation: this.config.handleElicitation,
533
+ options: {
534
+ commands,
535
+ debug: false,
536
+ tools,
537
+ verbose,
538
+ mainLoopModel,
539
+ thinkingConfig: initialThinkingConfig,
540
+ mcpClients,
541
+ mcpResources: {},
542
+ ideInstallationStatus: null,
543
+ isNonInteractiveSession: true,
544
+ customSystemPrompt,
545
+ appendSystemPrompt,
546
+ theme: resolveThemeSetting(getGlobalConfig().theme),
547
+ agentDefinitions: { activeAgents: agents, allAgents: [] },
548
+ maxBudgetUsd,
549
+ },
550
+ getAppState,
551
+ setAppState,
552
+ abortController: this.abortController,
553
+ readFileState: this.readFileState,
554
+ nestedMemoryAttachmentTriggers: new Set<string>(),
555
+ loadedNestedMemoryPaths: this.loadedNestedMemoryPaths,
556
+ dynamicSkillDirTriggers: new Set<string>(),
557
+ discoveredSkillNames: this.discoveredSkillNames,
558
+ setInProgressToolUseIDs: () => {},
559
+ setResponseLength: () => {},
560
+ updateFileHistoryState: processUserInputContext.updateFileHistoryState,
561
+ updateAttributionState: processUserInputContext.updateAttributionState,
562
+ setSDKStatus,
563
+ }
564
+
565
+ headlessProfilerCheckpoint('before_skills_plugins')
566
+ // Cache-only: headless/SDK/CCR startup must not block on network for
567
+ // ref-tracked plugins. CCR populates the cache via CLAUDE_CODE_SYNC_PLUGIN_INSTALL
568
+ // (headlessPluginInstall) or CLAUDE_CODE_PLUGIN_SEED_DIR before this runs;
569
+ // SDK callers that need fresh source can call /reload-plugins.
570
+ const [skills, { enabled: enabledPlugins }] = await Promise.all([
571
+ getSlashCommandToolSkills(getCwd()),
572
+ loadAllPluginsCacheOnly(),
573
+ ])
574
+ headlessProfilerCheckpoint('after_skills_plugins')
575
+
576
+ yield buildSystemInitMessage({
577
+ tools,
578
+ mcpClients,
579
+ model: mainLoopModel,
580
+ permissionMode: initialAppState.toolPermissionContext
581
+ .mode as PermissionMode, // TODO: avoid the cast
582
+ commands,
583
+ agents,
584
+ skills,
585
+ plugins: enabledPlugins,
586
+ fastMode: initialAppState.fastMode,
587
+ })
588
+
589
+ // Record when system message is yielded for headless latency tracking
590
+ headlessProfilerCheckpoint('system_message_yielded')
591
+
592
+ if (!shouldQuery) {
593
+ // Return the results of local slash commands.
594
+ // Use messagesFromUserInput (not replayableMessages) for command output
595
+ // because selectableUserMessagesFilter excludes local-command-stdout tags.
596
+ for (const msg of messagesFromUserInput) {
597
+ if (
598
+ msg.type === 'user' &&
599
+ typeof msg.message.content === 'string' &&
600
+ (msg.message.content.includes(`<${LOCAL_COMMAND_STDOUT_TAG}>`) ||
601
+ msg.message.content.includes(`<${LOCAL_COMMAND_STDERR_TAG}>`) ||
602
+ msg.isCompactSummary)
603
+ ) {
604
+ yield {
605
+ type: 'user',
606
+ message: {
607
+ ...msg.message,
608
+ content: stripAnsi(msg.message.content),
609
+ },
610
+ session_id: getSessionId(),
611
+ parent_tool_use_id: null,
612
+ uuid: msg.uuid,
613
+ timestamp: msg.timestamp,
614
+ isReplay: !msg.isCompactSummary,
615
+ isSynthetic: msg.isMeta || msg.isVisibleInTranscriptOnly,
616
+ } as SDKUserMessageReplay
617
+ }
618
+
619
+ // Local command output — yield as a synthetic assistant message so
620
+ // RC renders it as assistant-style text rather than a user bubble.
621
+ // Emitted as assistant (not the dedicated SDKLocalCommandOutputMessage
622
+ // system subtype) so mobile clients + session-ingress can parse it.
623
+ if (
624
+ msg.type === 'system' &&
625
+ msg.subtype === 'local_command' &&
626
+ typeof msg.content === 'string' &&
627
+ (msg.content.includes(`<${LOCAL_COMMAND_STDOUT_TAG}>`) ||
628
+ msg.content.includes(`<${LOCAL_COMMAND_STDERR_TAG}>`))
629
+ ) {
630
+ yield localCommandOutputToSDKAssistantMessage(msg.content, msg.uuid)
631
+ }
632
+
633
+ if (msg.type === 'system' && msg.subtype === 'compact_boundary') {
634
+ yield {
635
+ type: 'system',
636
+ subtype: 'compact_boundary' as const,
637
+ session_id: getSessionId(),
638
+ uuid: msg.uuid,
639
+ compact_metadata: toSDKCompactMetadata(msg.compactMetadata),
640
+ } as SDKCompactBoundaryMessage
641
+ }
642
+ }
643
+
644
+ if (persistSession) {
645
+ await recordTranscript(messages)
646
+ if (
647
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
648
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
649
+ ) {
650
+ await flushSessionStorage()
651
+ }
652
+ }
653
+
654
+ yield {
655
+ type: 'result',
656
+ subtype: 'success',
657
+ is_error: false,
658
+ duration_ms: Date.now() - startTime,
659
+ duration_api_ms: getTotalAPIDuration(),
660
+ num_turns: messages.length - 1,
661
+ result: resultText ?? '',
662
+ stop_reason: null,
663
+ session_id: getSessionId(),
664
+ total_cost_usd: getTotalCost(),
665
+ usage: this.totalUsage,
666
+ modelUsage: getModelUsage(),
667
+ permission_denials: this.permissionDenials,
668
+ fast_mode_state: getFastModeState(
669
+ mainLoopModel,
670
+ initialAppState.fastMode,
671
+ ),
672
+ uuid: randomUUID(),
673
+ }
674
+ return
675
+ }
676
+
677
+ if (fileHistoryEnabled() && persistSession) {
678
+ messagesFromUserInput
679
+ .filter(messageSelector().selectableUserMessagesFilter)
680
+ .forEach(message => {
681
+ void fileHistoryMakeSnapshot(
682
+ (updater: (prev: FileHistoryState) => FileHistoryState) => {
683
+ setAppState(prev => ({
684
+ ...prev,
685
+ fileHistory: updater(prev.fileHistory),
686
+ }))
687
+ },
688
+ message.uuid,
689
+ )
690
+ })
691
+ }
692
+
693
+ // Track current message usage (reset on each message_start)
694
+ let currentMessageUsage: NonNullableUsage = EMPTY_USAGE
695
+ let turnCount = 1
696
+ let hasAcknowledgedInitialMessages = false
697
+ // Track structured output from StructuredOutput tool calls
698
+ let structuredOutputFromTool: unknown
699
+ // Track the last stop_reason from assistant messages
700
+ let lastStopReason: string | null = null
701
+ // Reference-based watermark so error_during_execution's errors[] is
702
+ // turn-scoped. A length-based index breaks when the 100-entry ring buffer
703
+ // shift()s during the turn — the index slides. If this entry is rotated
704
+ // out, lastIndexOf returns -1 and we include everything (safe fallback).
705
+ const errorLogWatermark = getInMemoryErrors().at(-1)
706
+ // Snapshot count before this query for delta-based retry limiting
707
+ const initialStructuredOutputCalls = jsonSchema
708
+ ? countToolCalls(this.mutableMessages, SYNTHETIC_OUTPUT_TOOL_NAME)
709
+ : 0
710
+
711
+ for await (const message of query({
712
+ messages,
713
+ systemPrompt,
714
+ userContext,
715
+ systemContext,
716
+ canUseTool: wrappedCanUseTool,
717
+ toolUseContext: processUserInputContext,
718
+ fallbackModel,
719
+ querySource: 'sdk',
720
+ maxTurns,
721
+ taskBudget,
722
+ })) {
723
+ // Record assistant, user, and compact boundary messages
724
+ if (
725
+ message.type === 'assistant' ||
726
+ message.type === 'user' ||
727
+ (message.type === 'system' && message.subtype === 'compact_boundary')
728
+ ) {
729
+ // Before writing a compact boundary, flush any in-memory-only
730
+ // messages up through the preservedSegment tail. Attachments and
731
+ // progress are now recorded inline (their switch cases below), but
732
+ // this flush still matters for the preservedSegment tail walk.
733
+ // If the SDK subprocess restarts before then (claude-desktop kills
734
+ // between turns), tailUuid points to a never-written message →
735
+ // applyPreservedSegmentRelinks fails its tail→head walk → returns
736
+ // without pruning → resume loads full pre-compact history.
737
+ if (
738
+ persistSession &&
739
+ message.type === 'system' &&
740
+ message.subtype === 'compact_boundary'
741
+ ) {
742
+ const tailUuid = message.compactMetadata?.preservedSegment?.tailUuid
743
+ if (tailUuid) {
744
+ const tailIdx = this.mutableMessages.findLastIndex(
745
+ m => m.uuid === tailUuid,
746
+ )
747
+ if (tailIdx !== -1) {
748
+ await recordTranscript(this.mutableMessages.slice(0, tailIdx + 1))
749
+ }
750
+ }
751
+ }
752
+ messages.push(message)
753
+ if (persistSession) {
754
+ // Fire-and-forget for assistant messages. claude.ts yields one
755
+ // assistant message per content block, then mutates the last
756
+ // one's message.usage/stop_reason on message_delta — relying on
757
+ // the write queue's 100ms lazy jsonStringify. Awaiting here
758
+ // blocks ask()'s generator, so message_delta can't run until
759
+ // every block is consumed; the drain timer (started at block 1)
760
+ // elapses first. Interactive CC doesn't hit this because
761
+ // useLogMessages.ts fire-and-forgets. enqueueWrite is
762
+ // order-preserving so fire-and-forget here is safe.
763
+ if (message.type === 'assistant') {
764
+ void recordTranscript(messages)
765
+ } else {
766
+ await recordTranscript(messages)
767
+ }
768
+ }
769
+
770
+ // Acknowledge initial user messages after first transcript recording
771
+ if (!hasAcknowledgedInitialMessages && messagesToAck.length > 0) {
772
+ hasAcknowledgedInitialMessages = true
773
+ for (const msgToAck of messagesToAck) {
774
+ if (msgToAck.type === 'user') {
775
+ yield {
776
+ type: 'user',
777
+ message: msgToAck.message,
778
+ session_id: getSessionId(),
779
+ parent_tool_use_id: null,
780
+ uuid: msgToAck.uuid,
781
+ timestamp: msgToAck.timestamp,
782
+ isReplay: true,
783
+ } as SDKUserMessageReplay
784
+ }
785
+ }
786
+ }
787
+ }
788
+
789
+ if (message.type === 'user') {
790
+ turnCount++
791
+ }
792
+
793
+ switch (message.type) {
794
+ case 'tombstone':
795
+ // Tombstone messages are control signals for removing messages, skip them
796
+ break
797
+ case 'assistant':
798
+ // Capture stop_reason if already set (synthetic messages). For
799
+ // streamed responses, this is null at content_block_stop time;
800
+ // the real value arrives via message_delta (handled below).
801
+ if (message.message.stop_reason != null) {
802
+ lastStopReason = message.message.stop_reason
803
+ }
804
+ this.mutableMessages.push(message)
805
+ yield* normalizeMessage(message)
806
+ break
807
+ case 'progress':
808
+ this.mutableMessages.push(message)
809
+ // Record inline so the dedup loop in the next ask() call sees it
810
+ // as already-recorded. Without this, deferred progress interleaves
811
+ // with already-recorded tool_results in mutableMessages, and the
812
+ // dedup walk freezes startingParentUuid at the wrong message —
813
+ // forking the chain and orphaning the conversation on resume.
814
+ if (persistSession) {
815
+ messages.push(message)
816
+ void recordTranscript(messages)
817
+ }
818
+ yield* normalizeMessage(message)
819
+ break
820
+ case 'user':
821
+ this.mutableMessages.push(message)
822
+ yield* normalizeMessage(message)
823
+ break
824
+ case 'stream_event':
825
+ if (message.event.type === 'message_start') {
826
+ // Reset current message usage for new message
827
+ currentMessageUsage = EMPTY_USAGE
828
+ currentMessageUsage = updateUsage(
829
+ currentMessageUsage,
830
+ message.event.message.usage,
831
+ )
832
+ }
833
+ if (message.event.type === 'message_delta') {
834
+ currentMessageUsage = updateUsage(
835
+ currentMessageUsage,
836
+ message.event.usage,
837
+ )
838
+ // Capture stop_reason from message_delta. The assistant message
839
+ // is yielded at content_block_stop with stop_reason=null; the
840
+ // real value only arrives here (see claude.ts message_delta
841
+ // handler). Without this, result.stop_reason is always null.
842
+ if (message.event.delta.stop_reason != null) {
843
+ lastStopReason = message.event.delta.stop_reason
844
+ }
845
+ }
846
+ if (message.event.type === 'message_stop') {
847
+ // Accumulate current message usage into total
848
+ this.totalUsage = accumulateUsage(
849
+ this.totalUsage,
850
+ currentMessageUsage,
851
+ )
852
+ }
853
+
854
+ if (includePartialMessages) {
855
+ yield {
856
+ type: 'stream_event' as const,
857
+ event: message.event,
858
+ session_id: getSessionId(),
859
+ parent_tool_use_id: null,
860
+ uuid: randomUUID(),
861
+ }
862
+ }
863
+
864
+ break
865
+ case 'attachment':
866
+ this.mutableMessages.push(message)
867
+ // Record inline (same reason as progress above).
868
+ if (persistSession) {
869
+ messages.push(message)
870
+ void recordTranscript(messages)
871
+ }
872
+
873
+ // Extract structured output from StructuredOutput tool calls
874
+ if (message.attachment.type === 'structured_output') {
875
+ structuredOutputFromTool = message.attachment.data
876
+ }
877
+ // Handle max turns reached signal from query.ts
878
+ else if (message.attachment.type === 'max_turns_reached') {
879
+ if (persistSession) {
880
+ if (
881
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
882
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
883
+ ) {
884
+ await flushSessionStorage()
885
+ }
886
+ }
887
+ yield {
888
+ type: 'result',
889
+ subtype: 'error_max_turns',
890
+ duration_ms: Date.now() - startTime,
891
+ duration_api_ms: getTotalAPIDuration(),
892
+ is_error: true,
893
+ num_turns: message.attachment.turnCount,
894
+ stop_reason: lastStopReason,
895
+ session_id: getSessionId(),
896
+ total_cost_usd: getTotalCost(),
897
+ usage: this.totalUsage,
898
+ modelUsage: getModelUsage(),
899
+ permission_denials: this.permissionDenials,
900
+ fast_mode_state: getFastModeState(
901
+ mainLoopModel,
902
+ initialAppState.fastMode,
903
+ ),
904
+ uuid: randomUUID(),
905
+ errors: [
906
+ `Reached maximum number of turns (${message.attachment.maxTurns})`,
907
+ ],
908
+ }
909
+ return
910
+ }
911
+ // Yield queued_command attachments as SDK user message replays
912
+ else if (
913
+ replayUserMessages &&
914
+ message.attachment.type === 'queued_command'
915
+ ) {
916
+ yield {
917
+ type: 'user',
918
+ message: {
919
+ role: 'user' as const,
920
+ content: message.attachment.prompt,
921
+ },
922
+ session_id: getSessionId(),
923
+ parent_tool_use_id: null,
924
+ uuid: message.attachment.source_uuid || message.uuid,
925
+ timestamp: message.timestamp,
926
+ isReplay: true,
927
+ } as SDKUserMessageReplay
928
+ }
929
+ break
930
+ case 'stream_request_start':
931
+ // Don't yield stream request start messages
932
+ break
933
+ case 'system': {
934
+ // Snip boundary: replay on our store to remove zombie messages and
935
+ // stale markers. The yielded boundary is a signal, not data to push —
936
+ // the replay produces its own equivalent boundary. Without this,
937
+ // markers persist and re-trigger on every turn, and mutableMessages
938
+ // never shrinks (memory leak in long SDK sessions). The subtype
939
+ // check lives inside the injected callback so feature-gated strings
940
+ // stay out of this file (excluded-strings check).
941
+ const snipResult = this.config.snipReplay?.(
942
+ message,
943
+ this.mutableMessages,
944
+ )
945
+ if (snipResult !== undefined) {
946
+ if (snipResult.executed) {
947
+ this.mutableMessages.length = 0
948
+ this.mutableMessages.push(...snipResult.messages)
949
+ }
950
+ break
951
+ }
952
+ this.mutableMessages.push(message)
953
+ // Yield compact boundary messages to SDK
954
+ if (
955
+ message.subtype === 'compact_boundary' &&
956
+ message.compactMetadata
957
+ ) {
958
+ // Release pre-compaction messages for GC. The boundary was just
959
+ // pushed so it's the last element. query.ts already uses
960
+ // getMessagesAfterCompactBoundary() internally, so only
961
+ // post-boundary messages are needed going forward.
962
+ const mutableBoundaryIdx = this.mutableMessages.length - 1
963
+ if (mutableBoundaryIdx > 0) {
964
+ this.mutableMessages.splice(0, mutableBoundaryIdx)
965
+ }
966
+ const localBoundaryIdx = messages.length - 1
967
+ if (localBoundaryIdx > 0) {
968
+ messages.splice(0, localBoundaryIdx)
969
+ }
970
+
971
+ yield {
972
+ type: 'system',
973
+ subtype: 'compact_boundary' as const,
974
+ session_id: getSessionId(),
975
+ uuid: message.uuid,
976
+ compact_metadata: toSDKCompactMetadata(message.compactMetadata),
977
+ }
978
+ }
979
+ if (message.subtype === 'api_error') {
980
+ yield {
981
+ type: 'system',
982
+ subtype: 'api_retry' as const,
983
+ attempt: message.retryAttempt,
984
+ max_retries: message.maxRetries,
985
+ retry_delay_ms: message.retryInMs,
986
+ error_status: message.error.status ?? null,
987
+ error: categorizeRetryableAPIError(message.error),
988
+ session_id: getSessionId(),
989
+ uuid: message.uuid,
990
+ }
991
+ }
992
+ // Don't yield other system messages in headless mode
993
+ break
994
+ }
995
+ case 'tool_use_summary':
996
+ // Yield tool use summary messages to SDK
997
+ yield {
998
+ type: 'tool_use_summary' as const,
999
+ summary: message.summary,
1000
+ preceding_tool_use_ids: message.precedingToolUseIds,
1001
+ session_id: getSessionId(),
1002
+ uuid: message.uuid,
1003
+ }
1004
+ break
1005
+ }
1006
+
1007
+ // Check if USD budget has been exceeded
1008
+ if (maxBudgetUsd !== undefined && getTotalCost() >= maxBudgetUsd) {
1009
+ if (persistSession) {
1010
+ if (
1011
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
1012
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
1013
+ ) {
1014
+ await flushSessionStorage()
1015
+ }
1016
+ }
1017
+ yield {
1018
+ type: 'result',
1019
+ subtype: 'error_max_budget_usd',
1020
+ duration_ms: Date.now() - startTime,
1021
+ duration_api_ms: getTotalAPIDuration(),
1022
+ is_error: true,
1023
+ num_turns: turnCount,
1024
+ stop_reason: lastStopReason,
1025
+ session_id: getSessionId(),
1026
+ total_cost_usd: getTotalCost(),
1027
+ usage: this.totalUsage,
1028
+ modelUsage: getModelUsage(),
1029
+ permission_denials: this.permissionDenials,
1030
+ fast_mode_state: getFastModeState(
1031
+ mainLoopModel,
1032
+ initialAppState.fastMode,
1033
+ ),
1034
+ uuid: randomUUID(),
1035
+ errors: [`Reached maximum budget ($${maxBudgetUsd})`],
1036
+ }
1037
+ return
1038
+ }
1039
+
1040
+ // Check if structured output retry limit exceeded (only on user messages)
1041
+ if (message.type === 'user' && jsonSchema) {
1042
+ const currentCalls = countToolCalls(
1043
+ this.mutableMessages,
1044
+ SYNTHETIC_OUTPUT_TOOL_NAME,
1045
+ )
1046
+ const callsThisQuery = currentCalls - initialStructuredOutputCalls
1047
+ const maxRetries = parseInt(
1048
+ process.env.MAX_STRUCTURED_OUTPUT_RETRIES || '5',
1049
+ 10,
1050
+ )
1051
+ if (callsThisQuery >= maxRetries) {
1052
+ if (persistSession) {
1053
+ if (
1054
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
1055
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
1056
+ ) {
1057
+ await flushSessionStorage()
1058
+ }
1059
+ }
1060
+ yield {
1061
+ type: 'result',
1062
+ subtype: 'error_max_structured_output_retries',
1063
+ duration_ms: Date.now() - startTime,
1064
+ duration_api_ms: getTotalAPIDuration(),
1065
+ is_error: true,
1066
+ num_turns: turnCount,
1067
+ stop_reason: lastStopReason,
1068
+ session_id: getSessionId(),
1069
+ total_cost_usd: getTotalCost(),
1070
+ usage: this.totalUsage,
1071
+ modelUsage: getModelUsage(),
1072
+ permission_denials: this.permissionDenials,
1073
+ fast_mode_state: getFastModeState(
1074
+ mainLoopModel,
1075
+ initialAppState.fastMode,
1076
+ ),
1077
+ uuid: randomUUID(),
1078
+ errors: [
1079
+ `Failed to provide valid structured output after ${maxRetries} attempts`,
1080
+ ],
1081
+ }
1082
+ return
1083
+ }
1084
+ }
1085
+ }
1086
+
1087
+ // Stop hooks yield progress/attachment messages AFTER the assistant
1088
+ // response (via yield* handleStopHooks in query.ts). Since #23537 pushes
1089
+ // those to `messages` inline, last(messages) can be a progress/attachment
1090
+ // instead of the assistant — which makes textResult extraction below
1091
+ // return '' and -p mode emit a blank line. Allowlist to assistant|user:
1092
+ // isResultSuccessful handles both (user with all tool_result blocks is a
1093
+ // valid successful terminal state).
1094
+ const result = messages.findLast(
1095
+ m => m.type === 'assistant' || m.type === 'user',
1096
+ )
1097
+ // Capture for the error_during_execution diagnostic — isResultSuccessful
1098
+ // is a type predicate (message is Message), so inside the false branch
1099
+ // `result` narrows to never and these accesses don't typecheck.
1100
+ const edeResultType = result?.type ?? 'undefined'
1101
+ const edeLastContentType =
1102
+ result?.type === 'assistant'
1103
+ ? (last(result.message.content)?.type ?? 'none')
1104
+ : 'n/a'
1105
+
1106
+ // Flush buffered transcript writes before yielding result.
1107
+ // The desktop app kills the CLI process immediately after receiving the
1108
+ // result message, so any unflushed writes would be lost.
1109
+ if (persistSession) {
1110
+ if (
1111
+ isEnvTruthy(process.env.CLAUDE_CODE_EAGER_FLUSH) ||
1112
+ isEnvTruthy(process.env.CLAUDE_CODE_IS_COWORK)
1113
+ ) {
1114
+ await flushSessionStorage()
1115
+ }
1116
+ }
1117
+
1118
+ if (!isResultSuccessful(result, lastStopReason)) {
1119
+ yield {
1120
+ type: 'result',
1121
+ subtype: 'error_during_execution',
1122
+ duration_ms: Date.now() - startTime,
1123
+ duration_api_ms: getTotalAPIDuration(),
1124
+ is_error: true,
1125
+ num_turns: turnCount,
1126
+ stop_reason: lastStopReason,
1127
+ session_id: getSessionId(),
1128
+ total_cost_usd: getTotalCost(),
1129
+ usage: this.totalUsage,
1130
+ modelUsage: getModelUsage(),
1131
+ permission_denials: this.permissionDenials,
1132
+ fast_mode_state: getFastModeState(
1133
+ mainLoopModel,
1134
+ initialAppState.fastMode,
1135
+ ),
1136
+ uuid: randomUUID(),
1137
+ // Diagnostic prefix: these are what isResultSuccessful() checks — if
1138
+ // the result type isn't assistant-with-text/thinking or user-with-
1139
+ // tool_result, and stop_reason isn't end_turn, that's why this fired.
1140
+ // errors[] is turn-scoped via the watermark; previously it dumped the
1141
+ // entire process's logError buffer (ripgrep timeouts, ENOENT, etc).
1142
+ errors: (() => {
1143
+ const all = getInMemoryErrors()
1144
+ const start = errorLogWatermark
1145
+ ? all.lastIndexOf(errorLogWatermark) + 1
1146
+ : 0
1147
+ return [
1148
+ `[ede_diagnostic] result_type=${edeResultType} last_content_type=${edeLastContentType} stop_reason=${lastStopReason}`,
1149
+ ...all.slice(start).map(_ => _.error),
1150
+ ]
1151
+ })(),
1152
+ }
1153
+ return
1154
+ }
1155
+
1156
+ // Extract the text result based on message type
1157
+ let textResult = ''
1158
+ let isApiError = false
1159
+
1160
+ if (result.type === 'assistant') {
1161
+ const lastContent = last(result.message.content)
1162
+ if (
1163
+ lastContent?.type === 'text' &&
1164
+ !SYNTHETIC_MESSAGES.has(lastContent.text)
1165
+ ) {
1166
+ textResult = lastContent.text
1167
+ }
1168
+ isApiError = Boolean(result.isApiErrorMessage)
1169
+ }
1170
+
1171
+ yield {
1172
+ type: 'result',
1173
+ subtype: 'success',
1174
+ is_error: isApiError,
1175
+ duration_ms: Date.now() - startTime,
1176
+ duration_api_ms: getTotalAPIDuration(),
1177
+ num_turns: turnCount,
1178
+ result: textResult,
1179
+ stop_reason: lastStopReason,
1180
+ session_id: getSessionId(),
1181
+ total_cost_usd: getTotalCost(),
1182
+ usage: this.totalUsage,
1183
+ modelUsage: getModelUsage(),
1184
+ permission_denials: this.permissionDenials,
1185
+ structured_output: structuredOutputFromTool,
1186
+ fast_mode_state: getFastModeState(
1187
+ mainLoopModel,
1188
+ initialAppState.fastMode,
1189
+ ),
1190
+ uuid: randomUUID(),
1191
+ }
1192
+ }
1193
+
1194
+ interrupt(): void {
1195
+ this.abortController.abort()
1196
+ }
1197
+
1198
+ getMessages(): readonly Message[] {
1199
+ return this.mutableMessages
1200
+ }
1201
+
1202
+ getReadFileState(): FileStateCache {
1203
+ return this.readFileState
1204
+ }
1205
+
1206
+ getSessionId(): string {
1207
+ return getSessionId()
1208
+ }
1209
+
1210
+ setModel(model: string): void {
1211
+ this.config.userSpecifiedModel = model
1212
+ }
1213
+ }
1214
+
1215
+ /**
1216
+ * Sends a single prompt to the Claude API and returns the response.
1217
+ * Assumes that claude is being used non-interactively -- will not
1218
+ * ask the user for permissions or further input.
1219
+ *
1220
+ * Convenience wrapper around QueryEngine for one-shot usage.
1221
+ */
1222
+ export async function* ask({
1223
+ commands,
1224
+ prompt,
1225
+ promptUuid,
1226
+ isMeta,
1227
+ cwd,
1228
+ tools,
1229
+ mcpClients,
1230
+ verbose = false,
1231
+ thinkingConfig,
1232
+ maxTurns,
1233
+ maxBudgetUsd,
1234
+ taskBudget,
1235
+ canUseTool,
1236
+ mutableMessages = [],
1237
+ getReadFileCache,
1238
+ setReadFileCache,
1239
+ customSystemPrompt,
1240
+ appendSystemPrompt,
1241
+ userSpecifiedModel,
1242
+ fallbackModel,
1243
+ jsonSchema,
1244
+ getAppState,
1245
+ setAppState,
1246
+ abortController,
1247
+ replayUserMessages = false,
1248
+ includePartialMessages = false,
1249
+ handleElicitation,
1250
+ agents = [],
1251
+ setSDKStatus,
1252
+ orphanedPermission,
1253
+ }: {
1254
+ commands: Command[]
1255
+ prompt: string | Array<ContentBlockParam>
1256
+ promptUuid?: string
1257
+ isMeta?: boolean
1258
+ cwd: string
1259
+ tools: Tools
1260
+ verbose?: boolean
1261
+ mcpClients: MCPServerConnection[]
1262
+ thinkingConfig?: ThinkingConfig
1263
+ maxTurns?: number
1264
+ maxBudgetUsd?: number
1265
+ taskBudget?: { total: number }
1266
+ canUseTool: CanUseToolFn
1267
+ mutableMessages?: Message[]
1268
+ customSystemPrompt?: string
1269
+ appendSystemPrompt?: string
1270
+ userSpecifiedModel?: string
1271
+ fallbackModel?: string
1272
+ jsonSchema?: Record<string, unknown>
1273
+ getAppState: () => AppState
1274
+ setAppState: (f: (prev: AppState) => AppState) => void
1275
+ getReadFileCache: () => FileStateCache
1276
+ setReadFileCache: (cache: FileStateCache) => void
1277
+ abortController?: AbortController
1278
+ replayUserMessages?: boolean
1279
+ includePartialMessages?: boolean
1280
+ handleElicitation?: ToolUseContext['handleElicitation']
1281
+ agents?: AgentDefinition[]
1282
+ setSDKStatus?: (status: SDKStatus) => void
1283
+ orphanedPermission?: OrphanedPermission
1284
+ }): AsyncGenerator<SDKMessage, void, unknown> {
1285
+ const engine = new QueryEngine({
1286
+ cwd,
1287
+ tools,
1288
+ commands,
1289
+ mcpClients,
1290
+ agents,
1291
+ canUseTool,
1292
+ getAppState,
1293
+ setAppState,
1294
+ initialMessages: mutableMessages,
1295
+ readFileCache: cloneFileStateCache(getReadFileCache()),
1296
+ customSystemPrompt,
1297
+ appendSystemPrompt,
1298
+ userSpecifiedModel,
1299
+ fallbackModel,
1300
+ thinkingConfig,
1301
+ maxTurns,
1302
+ maxBudgetUsd,
1303
+ taskBudget,
1304
+ jsonSchema,
1305
+ verbose,
1306
+ handleElicitation,
1307
+ replayUserMessages,
1308
+ includePartialMessages,
1309
+ setSDKStatus,
1310
+ abortController,
1311
+ orphanedPermission,
1312
+ ...(feature('HISTORY_SNIP')
1313
+ ? {
1314
+ snipReplay: (yielded: Message, store: Message[]) => {
1315
+ if (!snipProjection!.isSnipBoundaryMessage(yielded))
1316
+ return undefined
1317
+ return snipModule!.snipCompactIfNeeded(store, { force: true })
1318
+ },
1319
+ }
1320
+ : {}),
1321
+ })
1322
+
1323
+ try {
1324
+ yield* engine.submitMessage(prompt, {
1325
+ uuid: promptUuid,
1326
+ isMeta,
1327
+ })
1328
+ } finally {
1329
+ setReadFileCache(engine.getReadFileState())
1330
+ }
1331
+ }