@xortex/xcode 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (969) hide show
  1. package/QueryEngine.ts +1331 -0
  2. package/Task.ts +125 -0
  3. package/Tool.ts +792 -0
  4. package/assistant/sessionHistory.ts +87 -0
  5. package/bin/xcode +57 -25
  6. package/bridge/bridgeApi.ts +539 -0
  7. package/bridge/bridgeConfig.ts +48 -0
  8. package/bridge/bridgeDebug.ts +135 -0
  9. package/bridge/bridgeEnabled.ts +202 -0
  10. package/bridge/bridgeMain.ts +2999 -0
  11. package/bridge/bridgeMessaging.ts +461 -0
  12. package/bridge/bridgePermissionCallbacks.ts +43 -0
  13. package/bridge/bridgePointer.ts +210 -0
  14. package/bridge/bridgeStatusUtil.ts +163 -0
  15. package/bridge/bridgeUI.ts +530 -0
  16. package/bridge/capacityWake.ts +56 -0
  17. package/bridge/codeSessionApi.ts +168 -0
  18. package/bridge/createSession.ts +384 -0
  19. package/bridge/debugUtils.ts +141 -0
  20. package/bridge/envLessBridgeConfig.ts +165 -0
  21. package/bridge/flushGate.ts +71 -0
  22. package/bridge/inboundAttachments.ts +175 -0
  23. package/bridge/inboundMessages.ts +80 -0
  24. package/bridge/initReplBridge.ts +569 -0
  25. package/bridge/jwtUtils.ts +256 -0
  26. package/bridge/pollConfig.ts +110 -0
  27. package/bridge/pollConfigDefaults.ts +82 -0
  28. package/bridge/remoteBridgeCore.ts +1008 -0
  29. package/bridge/replBridge.ts +2406 -0
  30. package/bridge/replBridgeHandle.ts +36 -0
  31. package/bridge/replBridgeTransport.ts +370 -0
  32. package/bridge/sessionIdCompat.ts +57 -0
  33. package/bridge/sessionRunner.ts +550 -0
  34. package/bridge/trustedDevice.ts +210 -0
  35. package/bridge/types.ts +262 -0
  36. package/bridge/workSecret.ts +127 -0
  37. package/buddy/CompanionSprite.tsx +371 -0
  38. package/buddy/companion.ts +133 -0
  39. package/buddy/prompt.ts +36 -0
  40. package/buddy/sprites.ts +514 -0
  41. package/buddy/types.ts +148 -0
  42. package/buddy/useBuddyNotification.tsx +98 -0
  43. package/cli/exit.ts +31 -0
  44. package/cli/handlers/agents.ts +70 -0
  45. package/cli/handlers/auth.ts +330 -0
  46. package/cli/handlers/autoMode.ts +170 -0
  47. package/cli/handlers/mcp.tsx +362 -0
  48. package/cli/handlers/plugins.ts +878 -0
  49. package/cli/handlers/util.tsx +110 -0
  50. package/cli/ndjsonSafeStringify.ts +32 -0
  51. package/cli/print.ts +5594 -0
  52. package/cli/remoteIO.ts +255 -0
  53. package/cli/structuredIO.ts +859 -0
  54. package/cli/transports/HybridTransport.ts +282 -0
  55. package/cli/transports/SSETransport.ts +711 -0
  56. package/cli/transports/SerialBatchEventUploader.ts +275 -0
  57. package/cli/transports/WebSocketTransport.ts +800 -0
  58. package/cli/transports/WorkerStateUploader.ts +131 -0
  59. package/cli/transports/ccrClient.ts +998 -0
  60. package/cli/transports/transportUtils.ts +45 -0
  61. package/cli/update.ts +422 -0
  62. package/commands/add-dir/add-dir.tsx +126 -0
  63. package/commands/add-dir/index.ts +11 -0
  64. package/commands/add-dir/validation.ts +110 -0
  65. package/commands/advisor.ts +109 -0
  66. package/commands/agents/agents.tsx +12 -0
  67. package/commands/agents/index.ts +10 -0
  68. package/commands/ant-trace/index.js +1 -0
  69. package/commands/autofix-pr/index.js +1 -0
  70. package/commands/backfill-sessions/index.js +1 -0
  71. package/commands/branch/branch.ts +296 -0
  72. package/commands/branch/index.ts +14 -0
  73. package/commands/break-cache/index.js +1 -0
  74. package/commands/bridge/bridge.tsx +509 -0
  75. package/commands/bridge/index.ts +26 -0
  76. package/commands/bridge-kick.ts +200 -0
  77. package/commands/brief.ts +130 -0
  78. package/commands/btw/btw.tsx +243 -0
  79. package/commands/btw/index.ts +13 -0
  80. package/commands/bughunter/index.js +1 -0
  81. package/commands/chrome/chrome.tsx +285 -0
  82. package/commands/chrome/index.ts +13 -0
  83. package/commands/clear/caches.ts +144 -0
  84. package/commands/clear/clear.ts +7 -0
  85. package/commands/clear/conversation.ts +251 -0
  86. package/commands/clear/index.ts +19 -0
  87. package/commands/color/color.ts +93 -0
  88. package/commands/color/index.ts +16 -0
  89. package/commands/commit-push-pr.ts +158 -0
  90. package/commands/commit.ts +92 -0
  91. package/commands/compact/compact.ts +287 -0
  92. package/commands/compact/index.ts +15 -0
  93. package/commands/config/config.tsx +7 -0
  94. package/commands/config/index.ts +11 -0
  95. package/commands/context/context-noninteractive.ts +325 -0
  96. package/commands/context/context.tsx +64 -0
  97. package/commands/context/index.ts +24 -0
  98. package/commands/copy/copy.tsx +371 -0
  99. package/commands/copy/index.ts +15 -0
  100. package/commands/cost/cost.ts +24 -0
  101. package/commands/cost/index.ts +23 -0
  102. package/commands/createMovedToPluginCommand.ts +65 -0
  103. package/commands/ctx_viz/index.js +1 -0
  104. package/commands/debug-tool-call/index.js +1 -0
  105. package/commands/desktop/desktop.tsx +9 -0
  106. package/commands/desktop/index.ts +26 -0
  107. package/commands/diff/diff.tsx +9 -0
  108. package/commands/diff/index.ts +8 -0
  109. package/commands/doctor/doctor.tsx +7 -0
  110. package/commands/doctor/index.ts +12 -0
  111. package/commands/effort/effort.tsx +183 -0
  112. package/commands/effort/index.ts +13 -0
  113. package/commands/env/index.js +1 -0
  114. package/commands/exit/exit.tsx +33 -0
  115. package/commands/exit/index.ts +12 -0
  116. package/commands/export/export.tsx +91 -0
  117. package/commands/export/index.ts +11 -0
  118. package/commands/extra-usage/extra-usage-core.ts +118 -0
  119. package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  120. package/commands/extra-usage/extra-usage.tsx +17 -0
  121. package/commands/extra-usage/index.ts +31 -0
  122. package/commands/fast/fast.tsx +269 -0
  123. package/commands/fast/index.ts +26 -0
  124. package/commands/feedback/feedback.tsx +25 -0
  125. package/commands/feedback/index.ts +26 -0
  126. package/commands/files/files.ts +19 -0
  127. package/commands/files/index.ts +12 -0
  128. package/commands/good-claude/index.js +1 -0
  129. package/commands/heapdump/heapdump.ts +17 -0
  130. package/commands/heapdump/index.ts +12 -0
  131. package/commands/help/help.tsx +11 -0
  132. package/commands/help/index.ts +10 -0
  133. package/commands/hooks/hooks.tsx +13 -0
  134. package/commands/hooks/index.ts +11 -0
  135. package/commands/ide/ide.tsx +646 -0
  136. package/commands/ide/index.ts +11 -0
  137. package/commands/init-verifiers.ts +262 -0
  138. package/commands/init.ts +256 -0
  139. package/commands/insights.ts +3200 -0
  140. package/commands/install-github-app/ApiKeyStep.tsx +231 -0
  141. package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  142. package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  143. package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  144. package/commands/install-github-app/CreatingStep.tsx +65 -0
  145. package/commands/install-github-app/ErrorStep.tsx +85 -0
  146. package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  147. package/commands/install-github-app/InstallAppStep.tsx +94 -0
  148. package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  149. package/commands/install-github-app/SuccessStep.tsx +96 -0
  150. package/commands/install-github-app/WarningsStep.tsx +73 -0
  151. package/commands/install-github-app/index.ts +13 -0
  152. package/commands/install-github-app/install-github-app.tsx +587 -0
  153. package/commands/install-github-app/setupGitHubActions.ts +325 -0
  154. package/commands/install-slack-app/index.ts +12 -0
  155. package/commands/install-slack-app/install-slack-app.ts +30 -0
  156. package/commands/install.tsx +300 -0
  157. package/commands/issue/index.js +1 -0
  158. package/commands/keybindings/index.ts +13 -0
  159. package/commands/keybindings/keybindings.ts +53 -0
  160. package/commands/login/index.ts +14 -0
  161. package/commands/login/login.tsx +104 -0
  162. package/commands/logout/index.ts +10 -0
  163. package/commands/logout/logout.tsx +82 -0
  164. package/commands/mcp/addCommand.ts +280 -0
  165. package/commands/mcp/index.ts +12 -0
  166. package/commands/mcp/mcp.tsx +85 -0
  167. package/commands/mcp/xaaIdpCommand.ts +266 -0
  168. package/commands/memory/index.ts +10 -0
  169. package/commands/memory/memory.tsx +90 -0
  170. package/commands/mobile/index.ts +11 -0
  171. package/commands/mobile/mobile.tsx +274 -0
  172. package/commands/mock-limits/index.js +1 -0
  173. package/commands/model/index.ts +16 -0
  174. package/commands/model/model.tsx +297 -0
  175. package/commands/oauth-refresh/index.js +1 -0
  176. package/commands/onboarding/index.js +1 -0
  177. package/commands/output-style/index.ts +11 -0
  178. package/commands/output-style/output-style.tsx +7 -0
  179. package/commands/passes/index.ts +22 -0
  180. package/commands/passes/passes.tsx +24 -0
  181. package/commands/perf-issue/index.js +1 -0
  182. package/commands/permissions/index.ts +11 -0
  183. package/commands/permissions/permissions.tsx +10 -0
  184. package/commands/plan/index.ts +11 -0
  185. package/commands/plan/plan.tsx +122 -0
  186. package/commands/plugin/AddMarketplace.tsx +162 -0
  187. package/commands/plugin/BrowseMarketplace.tsx +802 -0
  188. package/commands/plugin/DiscoverPlugins.tsx +781 -0
  189. package/commands/plugin/ManageMarketplaces.tsx +838 -0
  190. package/commands/plugin/ManagePlugins.tsx +2215 -0
  191. package/commands/plugin/PluginErrors.tsx +124 -0
  192. package/commands/plugin/PluginOptionsDialog.tsx +357 -0
  193. package/commands/plugin/PluginOptionsFlow.tsx +135 -0
  194. package/commands/plugin/PluginSettings.tsx +1072 -0
  195. package/commands/plugin/PluginTrustWarning.tsx +32 -0
  196. package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  197. package/commands/plugin/ValidatePlugin.tsx +98 -0
  198. package/commands/plugin/index.tsx +11 -0
  199. package/commands/plugin/parseArgs.ts +103 -0
  200. package/commands/plugin/plugin.tsx +7 -0
  201. package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  202. package/commands/plugin/usePagination.ts +171 -0
  203. package/commands/pr_comments/index.ts +50 -0
  204. package/commands/privacy-settings/index.ts +14 -0
  205. package/commands/privacy-settings/privacy-settings.tsx +58 -0
  206. package/commands/rate-limit-options/index.ts +19 -0
  207. package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  208. package/commands/release-notes/index.ts +11 -0
  209. package/commands/release-notes/release-notes.ts +50 -0
  210. package/commands/reload-plugins/index.ts +18 -0
  211. package/commands/reload-plugins/reload-plugins.ts +61 -0
  212. package/commands/remote-env/index.ts +15 -0
  213. package/commands/remote-env/remote-env.tsx +7 -0
  214. package/commands/remote-setup/api.ts +182 -0
  215. package/commands/remote-setup/index.ts +20 -0
  216. package/commands/remote-setup/remote-setup.tsx +187 -0
  217. package/commands/rename/generateSessionName.ts +67 -0
  218. package/commands/rename/index.ts +12 -0
  219. package/commands/rename/rename.ts +87 -0
  220. package/commands/reset-limits/index.js +4 -0
  221. package/commands/resume/index.ts +12 -0
  222. package/commands/resume/resume.tsx +275 -0
  223. package/commands/review/UltrareviewOverageDialog.tsx +96 -0
  224. package/commands/review/reviewRemote.ts +316 -0
  225. package/commands/review/ultrareviewCommand.tsx +58 -0
  226. package/commands/review/ultrareviewEnabled.ts +14 -0
  227. package/commands/review.ts +57 -0
  228. package/commands/rewind/index.ts +13 -0
  229. package/commands/rewind/rewind.ts +13 -0
  230. package/commands/sandbox-toggle/index.ts +50 -0
  231. package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  232. package/commands/security-review.ts +243 -0
  233. package/commands/session/index.ts +16 -0
  234. package/commands/session/session.tsx +140 -0
  235. package/commands/share/index.js +1 -0
  236. package/commands/skills/index.ts +10 -0
  237. package/commands/skills/skills.tsx +8 -0
  238. package/commands/stats/index.ts +10 -0
  239. package/commands/stats/stats.tsx +7 -0
  240. package/commands/status/index.ts +12 -0
  241. package/commands/status/status.tsx +8 -0
  242. package/commands/statusline.tsx +24 -0
  243. package/commands/stickers/index.ts +11 -0
  244. package/commands/stickers/stickers.ts +16 -0
  245. package/commands/summary/index.js +1 -0
  246. package/commands/tag/index.ts +12 -0
  247. package/commands/tag/tag.tsx +215 -0
  248. package/commands/tasks/index.ts +11 -0
  249. package/commands/tasks/tasks.tsx +8 -0
  250. package/commands/teleport/index.js +1 -0
  251. package/commands/terminalSetup/index.ts +23 -0
  252. package/commands/terminalSetup/terminalSetup.tsx +531 -0
  253. package/commands/theme/index.ts +10 -0
  254. package/commands/theme/theme.tsx +57 -0
  255. package/commands/thinkback/index.ts +13 -0
  256. package/commands/thinkback/thinkback.tsx +554 -0
  257. package/commands/thinkback-play/index.ts +17 -0
  258. package/commands/thinkback-play/thinkback-play.ts +43 -0
  259. package/commands/ultraplan.tsx +471 -0
  260. package/commands/upgrade/index.ts +16 -0
  261. package/commands/upgrade/upgrade.tsx +38 -0
  262. package/commands/usage/index.ts +9 -0
  263. package/commands/usage/usage.tsx +7 -0
  264. package/commands/version.ts +22 -0
  265. package/commands/vim/index.ts +11 -0
  266. package/commands/vim/vim.ts +38 -0
  267. package/commands/voice/index.ts +20 -0
  268. package/commands/voice/voice.ts +150 -0
  269. package/commands/xingest/index.ts +11 -0
  270. package/commands/xingest/xingest.ts +90 -0
  271. package/commands/xsearch/index.ts +11 -0
  272. package/commands/xsearch/xsearch.ts +56 -0
  273. package/commands.ts +758 -0
  274. package/components/AgentProgressLine.tsx +136 -0
  275. package/components/App.tsx +56 -0
  276. package/components/ApproveApiKey.tsx +123 -0
  277. package/components/AutoModeOptInDialog.tsx +142 -0
  278. package/components/AutoUpdater.tsx +198 -0
  279. package/components/AutoUpdaterWrapper.tsx +91 -0
  280. package/components/AwsAuthStatusBox.tsx +82 -0
  281. package/components/BaseTextInput.tsx +136 -0
  282. package/components/BashModeProgress.tsx +56 -0
  283. package/components/BridgeDialog.tsx +401 -0
  284. package/components/BypassPermissionsModeDialog.tsx +87 -0
  285. package/components/ChannelDowngradeDialog.tsx +102 -0
  286. package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  287. package/components/ClaudeInChromeOnboarding.tsx +121 -0
  288. package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  289. package/components/ClickableImageRef.tsx +73 -0
  290. package/components/CompactSummary.tsx +118 -0
  291. package/components/ConfigurableShortcutHint.tsx +57 -0
  292. package/components/ConsoleOAuthFlow.tsx +631 -0
  293. package/components/ContextSuggestions.tsx +47 -0
  294. package/components/ContextVisualization.tsx +489 -0
  295. package/components/CoordinatorAgentStatus.tsx +273 -0
  296. package/components/CostThresholdDialog.tsx +50 -0
  297. package/components/CtrlOToExpand.tsx +51 -0
  298. package/components/CustomSelect/SelectMulti.tsx +213 -0
  299. package/components/CustomSelect/index.ts +3 -0
  300. package/components/CustomSelect/option-map.ts +50 -0
  301. package/components/CustomSelect/select-input-option.tsx +488 -0
  302. package/components/CustomSelect/select-option.tsx +68 -0
  303. package/components/CustomSelect/select.tsx +690 -0
  304. package/components/CustomSelect/use-multi-select-state.ts +414 -0
  305. package/components/CustomSelect/use-select-input.ts +287 -0
  306. package/components/CustomSelect/use-select-navigation.ts +653 -0
  307. package/components/CustomSelect/use-select-state.ts +157 -0
  308. package/components/DesktopHandoff.tsx +193 -0
  309. package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  310. package/components/DevBar.tsx +49 -0
  311. package/components/DevChannelsDialog.tsx +105 -0
  312. package/components/DiagnosticsDisplay.tsx +95 -0
  313. package/components/EffortCallout.tsx +265 -0
  314. package/components/EffortIndicator.ts +42 -0
  315. package/components/ExitFlow.tsx +48 -0
  316. package/components/ExportDialog.tsx +128 -0
  317. package/components/FallbackToolUseErrorMessage.tsx +116 -0
  318. package/components/FallbackToolUseRejectedMessage.tsx +16 -0
  319. package/components/FastIcon.tsx +46 -0
  320. package/components/Feedback.tsx +592 -0
  321. package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  322. package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  323. package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  324. package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  325. package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  326. package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  327. package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  328. package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  329. package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  330. package/components/FileEditToolDiff.tsx +181 -0
  331. package/components/FileEditToolUpdatedMessage.tsx +124 -0
  332. package/components/FileEditToolUseRejectedMessage.tsx +170 -0
  333. package/components/FilePathLink.tsx +43 -0
  334. package/components/FullscreenLayout.tsx +645 -0
  335. package/components/GlobalSearchDialog.tsx +343 -0
  336. package/components/HelpV2/Commands.tsx +82 -0
  337. package/components/HelpV2/General.tsx +23 -0
  338. package/components/HelpV2/HelpV2.tsx +184 -0
  339. package/components/HighlightedCode/Fallback.tsx +193 -0
  340. package/components/HighlightedCode.tsx +190 -0
  341. package/components/HistorySearchDialog.tsx +118 -0
  342. package/components/IdeAutoConnectDialog.tsx +154 -0
  343. package/components/IdeOnboardingDialog.tsx +167 -0
  344. package/components/IdeStatusIndicator.tsx +58 -0
  345. package/components/IdleReturnDialog.tsx +118 -0
  346. package/components/InterruptedByUser.tsx +15 -0
  347. package/components/InvalidConfigDialog.tsx +156 -0
  348. package/components/InvalidSettingsDialog.tsx +89 -0
  349. package/components/KeybindingWarnings.tsx +55 -0
  350. package/components/LanguagePicker.tsx +86 -0
  351. package/components/LogSelector.tsx +1575 -0
  352. package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  353. package/components/LogoV2/AnimatedClawd.tsx +124 -0
  354. package/components/LogoV2/ChannelsNotice.tsx +266 -0
  355. package/components/LogoV2/Clawd.tsx +14 -0
  356. package/components/LogoV2/CondensedLogo.tsx +161 -0
  357. package/components/LogoV2/EmergencyTip.tsx +58 -0
  358. package/components/LogoV2/Feed.tsx +112 -0
  359. package/components/LogoV2/FeedColumn.tsx +59 -0
  360. package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  361. package/components/LogoV2/LogoV2.tsx +543 -0
  362. package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  363. package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  364. package/components/LogoV2/VoiceModeNotice.tsx +68 -0
  365. package/components/LogoV2/WelcomeV2.tsx +433 -0
  366. package/components/LogoV2/feedConfigs.tsx +92 -0
  367. package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  368. package/components/MCPServerApprovalDialog.tsx +115 -0
  369. package/components/MCPServerDesktopImportDialog.tsx +203 -0
  370. package/components/MCPServerDialogCopy.tsx +15 -0
  371. package/components/MCPServerMultiselectDialog.tsx +133 -0
  372. package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  373. package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  374. package/components/Markdown.tsx +236 -0
  375. package/components/MarkdownTable.tsx +322 -0
  376. package/components/MemoryUsageIndicator.tsx +37 -0
  377. package/components/Message.tsx +627 -0
  378. package/components/MessageModel.tsx +43 -0
  379. package/components/MessageResponse.tsx +78 -0
  380. package/components/MessageRow.tsx +383 -0
  381. package/components/MessageSelector.tsx +831 -0
  382. package/components/MessageTimestamp.tsx +63 -0
  383. package/components/Messages.tsx +834 -0
  384. package/components/ModelPicker.tsx +448 -0
  385. package/components/NativeAutoUpdater.tsx +193 -0
  386. package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  387. package/components/OffscreenFreeze.tsx +44 -0
  388. package/components/Onboarding.tsx +244 -0
  389. package/components/OutputStylePicker.tsx +112 -0
  390. package/components/PackageManagerAutoUpdater.tsx +104 -0
  391. package/components/Passes/Passes.tsx +184 -0
  392. package/components/PrBadge.tsx +97 -0
  393. package/components/PressEnterToContinue.tsx +15 -0
  394. package/components/PromptInput/HistorySearchInput.tsx +51 -0
  395. package/components/PromptInput/IssueFlagBanner.tsx +12 -0
  396. package/components/PromptInput/Notifications.tsx +332 -0
  397. package/components/PromptInput/PromptInput.tsx +2350 -0
  398. package/components/PromptInput/PromptInputFooter.tsx +191 -0
  399. package/components/PromptInput/PromptInputFooterLeftSide.tsx +524 -0
  400. package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  401. package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  402. package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  403. package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  404. package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  405. package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  406. package/components/PromptInput/ShimmeredInput.tsx +143 -0
  407. package/components/PromptInput/VoiceIndicator.tsx +137 -0
  408. package/components/PromptInput/inputModes.ts +33 -0
  409. package/components/PromptInput/inputPaste.ts +90 -0
  410. package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  411. package/components/PromptInput/usePromptInputPlaceholder.ts +78 -0
  412. package/components/PromptInput/useShowFastIconHint.ts +31 -0
  413. package/components/PromptInput/useSwarmBanner.ts +155 -0
  414. package/components/PromptInput/utils.ts +60 -0
  415. package/components/QuickOpenDialog.tsx +244 -0
  416. package/components/RemoteCallout.tsx +76 -0
  417. package/components/RemoteEnvironmentDialog.tsx +340 -0
  418. package/components/ResumeTask.tsx +268 -0
  419. package/components/SandboxViolationExpandedView.tsx +99 -0
  420. package/components/ScrollKeybindingHandler.tsx +1012 -0
  421. package/components/SearchBox.tsx +72 -0
  422. package/components/SentryErrorBoundary.ts +28 -0
  423. package/components/SessionBackgroundHint.tsx +108 -0
  424. package/components/SessionPreview.tsx +194 -0
  425. package/components/Settings/Config.tsx +1822 -0
  426. package/components/Settings/Settings.tsx +137 -0
  427. package/components/Settings/Status.tsx +241 -0
  428. package/components/Settings/Usage.tsx +377 -0
  429. package/components/ShowInIDEPrompt.tsx +170 -0
  430. package/components/SkillImprovementSurvey.tsx +152 -0
  431. package/components/Spinner/FlashingChar.tsx +61 -0
  432. package/components/Spinner/GlimmerMessage.tsx +328 -0
  433. package/components/Spinner/ShimmerChar.tsx +36 -0
  434. package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  435. package/components/Spinner/SpinnerGlyph.tsx +80 -0
  436. package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  437. package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  438. package/components/Spinner/index.ts +10 -0
  439. package/components/Spinner/teammateSelectHint.ts +1 -0
  440. package/components/Spinner/useShimmerAnimation.ts +31 -0
  441. package/components/Spinner/useStalledAnimation.ts +75 -0
  442. package/components/Spinner/utils.ts +84 -0
  443. package/components/Spinner.tsx +562 -0
  444. package/components/Stats.tsx +1228 -0
  445. package/components/StatusLine.tsx +324 -0
  446. package/components/StatusNotices.tsx +55 -0
  447. package/components/StructuredDiff/Fallback.tsx +487 -0
  448. package/components/StructuredDiff/colorDiff.ts +37 -0
  449. package/components/StructuredDiff.tsx +190 -0
  450. package/components/StructuredDiffList.tsx +30 -0
  451. package/components/TagTabs.tsx +139 -0
  452. package/components/TaskListV2.tsx +378 -0
  453. package/components/TeammateViewHeader.tsx +82 -0
  454. package/components/TeleportError.tsx +189 -0
  455. package/components/TeleportProgress.tsx +140 -0
  456. package/components/TeleportRepoMismatchDialog.tsx +104 -0
  457. package/components/TeleportResumeWrapper.tsx +167 -0
  458. package/components/TeleportStash.tsx +116 -0
  459. package/components/TextInput.tsx +124 -0
  460. package/components/ThemePicker.tsx +333 -0
  461. package/components/ThinkingToggle.tsx +153 -0
  462. package/components/TokenWarning.tsx +179 -0
  463. package/components/ToolUseLoader.tsx +42 -0
  464. package/components/TrustDialog/TrustDialog.tsx +290 -0
  465. package/components/TrustDialog/utils.ts +245 -0
  466. package/components/ValidationErrorsList.tsx +148 -0
  467. package/components/VimTextInput.tsx +140 -0
  468. package/components/VirtualMessageList.tsx +1082 -0
  469. package/components/WorkflowMultiselectDialog.tsx +128 -0
  470. package/components/WorktreeExitDialog.tsx +231 -0
  471. package/components/agents/AgentDetail.tsx +220 -0
  472. package/components/agents/AgentEditor.tsx +178 -0
  473. package/components/agents/AgentNavigationFooter.tsx +26 -0
  474. package/components/agents/AgentsList.tsx +440 -0
  475. package/components/agents/AgentsMenu.tsx +800 -0
  476. package/components/agents/ColorPicker.tsx +112 -0
  477. package/components/agents/ModelSelector.tsx +68 -0
  478. package/components/agents/ToolSelector.tsx +562 -0
  479. package/components/agents/agentFileUtils.ts +272 -0
  480. package/components/agents/generateAgent.ts +197 -0
  481. package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  482. package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  483. package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  484. package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  485. package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  486. package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  487. package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  488. package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  489. package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  490. package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  491. package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  492. package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  493. package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  494. package/components/agents/types.ts +27 -0
  495. package/components/agents/utils.ts +18 -0
  496. package/components/agents/validateAgent.ts +109 -0
  497. package/components/design-system/Byline.tsx +77 -0
  498. package/components/design-system/Dialog.tsx +138 -0
  499. package/components/design-system/Divider.tsx +149 -0
  500. package/components/design-system/FuzzyPicker.tsx +312 -0
  501. package/components/design-system/KeyboardShortcutHint.tsx +81 -0
  502. package/components/design-system/ListItem.tsx +244 -0
  503. package/components/design-system/LoadingState.tsx +94 -0
  504. package/components/design-system/Pane.tsx +77 -0
  505. package/components/design-system/ProgressBar.tsx +86 -0
  506. package/components/design-system/Ratchet.tsx +80 -0
  507. package/components/design-system/StatusIcon.tsx +95 -0
  508. package/components/design-system/Tabs.tsx +340 -0
  509. package/components/design-system/ThemeProvider.tsx +170 -0
  510. package/components/design-system/ThemedBox.tsx +156 -0
  511. package/components/design-system/ThemedText.tsx +124 -0
  512. package/components/design-system/color.ts +30 -0
  513. package/components/diff/DiffDetailView.tsx +281 -0
  514. package/components/diff/DiffDialog.tsx +383 -0
  515. package/components/diff/DiffFileList.tsx +292 -0
  516. package/components/grove/Grove.tsx +463 -0
  517. package/components/hooks/HooksConfigMenu.tsx +578 -0
  518. package/components/hooks/PromptDialog.tsx +90 -0
  519. package/components/hooks/SelectEventMode.tsx +127 -0
  520. package/components/hooks/SelectHookMode.tsx +112 -0
  521. package/components/hooks/SelectMatcherMode.tsx +144 -0
  522. package/components/hooks/ViewHookMode.tsx +199 -0
  523. package/components/mcp/CapabilitiesSection.tsx +61 -0
  524. package/components/mcp/ElicitationDialog.tsx +1169 -0
  525. package/components/mcp/MCPAgentServerMenu.tsx +183 -0
  526. package/components/mcp/MCPListPanel.tsx +504 -0
  527. package/components/mcp/MCPReconnect.tsx +167 -0
  528. package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  529. package/components/mcp/MCPSettings.tsx +398 -0
  530. package/components/mcp/MCPStdioServerMenu.tsx +177 -0
  531. package/components/mcp/MCPToolDetailView.tsx +212 -0
  532. package/components/mcp/MCPToolListView.tsx +141 -0
  533. package/components/mcp/McpParsingWarnings.tsx +213 -0
  534. package/components/mcp/index.ts +9 -0
  535. package/components/mcp/utils/reconnectHelpers.tsx +49 -0
  536. package/components/memory/MemoryFileSelector.tsx +438 -0
  537. package/components/memory/MemoryUpdateNotification.tsx +45 -0
  538. package/components/messageActions.tsx +450 -0
  539. package/components/messages/AdvisorMessage.tsx +158 -0
  540. package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  541. package/components/messages/AssistantTextMessage.tsx +270 -0
  542. package/components/messages/AssistantThinkingMessage.tsx +86 -0
  543. package/components/messages/AssistantToolUseMessage.tsx +368 -0
  544. package/components/messages/AttachmentMessage.tsx +536 -0
  545. package/components/messages/CollapsedReadSearchContent.tsx +484 -0
  546. package/components/messages/CompactBoundaryMessage.tsx +18 -0
  547. package/components/messages/GroupedToolUseContent.tsx +58 -0
  548. package/components/messages/HighlightedThinkingText.tsx +162 -0
  549. package/components/messages/HookProgressMessage.tsx +116 -0
  550. package/components/messages/PlanApprovalMessage.tsx +222 -0
  551. package/components/messages/RateLimitMessage.tsx +161 -0
  552. package/components/messages/ShutdownMessage.tsx +132 -0
  553. package/components/messages/SystemAPIErrorMessage.tsx +141 -0
  554. package/components/messages/SystemTextMessage.tsx +827 -0
  555. package/components/messages/TaskAssignmentMessage.tsx +76 -0
  556. package/components/messages/UserAgentNotificationMessage.tsx +83 -0
  557. package/components/messages/UserBashInputMessage.tsx +58 -0
  558. package/components/messages/UserBashOutputMessage.tsx +54 -0
  559. package/components/messages/UserChannelMessage.tsx +137 -0
  560. package/components/messages/UserCommandMessage.tsx +108 -0
  561. package/components/messages/UserImageMessage.tsx +59 -0
  562. package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  563. package/components/messages/UserMemoryInputMessage.tsx +75 -0
  564. package/components/messages/UserPlanMessage.tsx +42 -0
  565. package/components/messages/UserPromptMessage.tsx +80 -0
  566. package/components/messages/UserResourceUpdateMessage.tsx +121 -0
  567. package/components/messages/UserTeammateMessage.tsx +206 -0
  568. package/components/messages/UserTextMessage.tsx +275 -0
  569. package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  570. package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  571. package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  572. package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  573. package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  574. package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  575. package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  576. package/components/messages/UserToolResultMessage/utils.tsx +44 -0
  577. package/components/messages/nullRenderingAttachments.ts +70 -0
  578. package/components/messages/teamMemCollapsed.tsx +140 -0
  579. package/components/messages/teamMemSaved.ts +19 -0
  580. package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  581. package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  582. package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  583. package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  584. package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  585. package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  586. package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  587. package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  588. package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  589. package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  590. package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  591. package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  592. package/components/permissions/FallbackPermissionRequest.tsx +333 -0
  593. package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  594. package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  595. package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  596. package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  597. package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  598. package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  599. package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  600. package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  601. package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  602. package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  603. package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  604. package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  605. package/components/permissions/PermissionDialog.tsx +72 -0
  606. package/components/permissions/PermissionExplanation.tsx +272 -0
  607. package/components/permissions/PermissionPrompt.tsx +336 -0
  608. package/components/permissions/PermissionRequest.tsx +217 -0
  609. package/components/permissions/PermissionRequestTitle.tsx +66 -0
  610. package/components/permissions/PermissionRuleExplanation.tsx +121 -0
  611. package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  612. package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  613. package/components/permissions/SandboxPermissionRequest.tsx +163 -0
  614. package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  615. package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  616. package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  617. package/components/permissions/WorkerBadge.tsx +49 -0
  618. package/components/permissions/WorkerPendingPermission.tsx +105 -0
  619. package/components/permissions/hooks.ts +209 -0
  620. package/components/permissions/rules/AddPermissionRules.tsx +180 -0
  621. package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  622. package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  623. package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  624. package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  625. package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  626. package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  627. package/components/permissions/rules/WorkspaceTab.tsx +150 -0
  628. package/components/permissions/shellPermissionHelpers.tsx +164 -0
  629. package/components/permissions/useShellPermissionFeedback.ts +148 -0
  630. package/components/permissions/utils.ts +25 -0
  631. package/components/sandbox/SandboxConfigTab.tsx +45 -0
  632. package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  633. package/components/sandbox/SandboxDoctorSection.tsx +46 -0
  634. package/components/sandbox/SandboxOverridesTab.tsx +193 -0
  635. package/components/sandbox/SandboxSettings.tsx +296 -0
  636. package/components/shell/ExpandShellOutputContext.tsx +36 -0
  637. package/components/shell/OutputLine.tsx +118 -0
  638. package/components/shell/ShellProgressMessage.tsx +150 -0
  639. package/components/shell/ShellTimeDisplay.tsx +74 -0
  640. package/components/skills/SkillsMenu.tsx +237 -0
  641. package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  642. package/components/tasks/BackgroundTask.tsx +345 -0
  643. package/components/tasks/BackgroundTaskStatus.tsx +429 -0
  644. package/components/tasks/BackgroundTasksDialog.tsx +652 -0
  645. package/components/tasks/DreamDetailDialog.tsx +251 -0
  646. package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  647. package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  648. package/components/tasks/RemoteSessionProgress.tsx +243 -0
  649. package/components/tasks/ShellDetailDialog.tsx +404 -0
  650. package/components/tasks/ShellProgress.tsx +87 -0
  651. package/components/tasks/renderToolActivity.tsx +33 -0
  652. package/components/tasks/taskStatusUtils.tsx +107 -0
  653. package/components/teams/TeamStatus.tsx +80 -0
  654. package/components/teams/TeamsDialog.tsx +715 -0
  655. package/components/ui/OrderedList.tsx +71 -0
  656. package/components/ui/OrderedListItem.tsx +45 -0
  657. package/components/ui/TreeSelect.tsx +397 -0
  658. package/components/wizard/WizardDialogLayout.tsx +65 -0
  659. package/components/wizard/WizardNavigationFooter.tsx +24 -0
  660. package/components/wizard/WizardProvider.tsx +213 -0
  661. package/components/wizard/index.ts +9 -0
  662. package/components/wizard/useWizard.ts +13 -0
  663. package/context.ts +189 -0
  664. package/cost-tracker.ts +323 -0
  665. package/entrypoints/cli.tsx +1 -1
  666. package/history.ts +464 -0
  667. package/hooks/fileSuggestions.ts +811 -0
  668. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  669. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  670. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  671. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  672. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  673. package/hooks/notifs/useInstallMessages.tsx +26 -0
  674. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  675. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  676. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  677. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  678. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  679. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  680. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  681. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  682. package/hooks/notifs/useStartupNotification.ts +41 -0
  683. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  684. package/hooks/renderPlaceholder.ts +51 -0
  685. package/hooks/toolPermission/PermissionContext.ts +388 -0
  686. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  687. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  688. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  689. package/hooks/toolPermission/permissionLogging.ts +238 -0
  690. package/hooks/unifiedSuggestions.ts +202 -0
  691. package/hooks/useAfterFirstRender.ts +17 -0
  692. package/hooks/useApiKeyVerification.ts +84 -0
  693. package/hooks/useArrowKeyHistory.tsx +229 -0
  694. package/hooks/useAssistantHistory.ts +250 -0
  695. package/hooks/useAwaySummary.ts +125 -0
  696. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  697. package/hooks/useBlink.ts +34 -0
  698. package/hooks/useCanUseTool.tsx +204 -0
  699. package/hooks/useCancelRequest.ts +276 -0
  700. package/hooks/useChromeExtensionNotification.tsx +50 -0
  701. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  702. package/hooks/useClipboardImageHint.ts +77 -0
  703. package/hooks/useCommandKeybindings.tsx +108 -0
  704. package/hooks/useCommandQueue.ts +15 -0
  705. package/hooks/useCopyOnSelect.ts +98 -0
  706. package/hooks/useDeferredHookMessages.ts +46 -0
  707. package/hooks/useDiffData.ts +110 -0
  708. package/hooks/useDiffInIDE.ts +379 -0
  709. package/hooks/useDirectConnect.ts +229 -0
  710. package/hooks/useDoublePress.ts +62 -0
  711. package/hooks/useDynamicConfig.ts +22 -0
  712. package/hooks/useElapsedTime.ts +37 -0
  713. package/hooks/useExitOnCtrlCD.ts +95 -0
  714. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  715. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  716. package/hooks/useGlobalKeybindings.tsx +249 -0
  717. package/hooks/useHistorySearch.ts +303 -0
  718. package/hooks/useIDEIntegration.tsx +70 -0
  719. package/hooks/useIdeAtMentioned.ts +76 -0
  720. package/hooks/useIdeConnectionStatus.ts +33 -0
  721. package/hooks/useIdeLogging.ts +41 -0
  722. package/hooks/useIdeSelection.ts +150 -0
  723. package/hooks/useInboxPoller.ts +969 -0
  724. package/hooks/useInputBuffer.ts +132 -0
  725. package/hooks/useIssueFlagBanner.ts +133 -0
  726. package/hooks/useLogMessages.ts +119 -0
  727. package/hooks/useLspPluginRecommendation.tsx +194 -0
  728. package/hooks/useMailboxBridge.ts +21 -0
  729. package/hooks/useMainLoopModel.ts +34 -0
  730. package/hooks/useManagePlugins.ts +304 -0
  731. package/hooks/useMemoryUsage.ts +39 -0
  732. package/hooks/useMergedClients.ts +23 -0
  733. package/hooks/useMergedCommands.ts +15 -0
  734. package/hooks/useMergedTools.ts +44 -0
  735. package/hooks/useMinDisplayTime.ts +35 -0
  736. package/hooks/useNotifyAfterTimeout.ts +65 -0
  737. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  738. package/hooks/usePasteHandler.ts +285 -0
  739. package/hooks/usePluginRecommendationBase.tsx +105 -0
  740. package/hooks/usePrStatus.ts +106 -0
  741. package/hooks/usePromptSuggestion.ts +177 -0
  742. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  743. package/hooks/useQueueProcessor.ts +68 -0
  744. package/hooks/useRemoteSession.ts +605 -0
  745. package/hooks/useReplBridge.tsx +723 -0
  746. package/hooks/useSSHSession.ts +241 -0
  747. package/hooks/useScheduledTasks.ts +139 -0
  748. package/hooks/useSearchInput.ts +364 -0
  749. package/hooks/useSessionBackgrounding.ts +158 -0
  750. package/hooks/useSettings.ts +17 -0
  751. package/hooks/useSettingsChange.ts +25 -0
  752. package/hooks/useSkillImprovementSurvey.ts +105 -0
  753. package/hooks/useSkillsChange.ts +62 -0
  754. package/hooks/useSwarmInitialization.ts +81 -0
  755. package/hooks/useSwarmPermissionPoller.ts +330 -0
  756. package/hooks/useTaskListWatcher.ts +221 -0
  757. package/hooks/useTasksV2.ts +250 -0
  758. package/hooks/useTeammateViewAutoExit.ts +63 -0
  759. package/hooks/useTeleportResume.tsx +85 -0
  760. package/hooks/useTerminalSize.ts +15 -0
  761. package/hooks/useTextInput.ts +529 -0
  762. package/hooks/useTimeout.ts +14 -0
  763. package/hooks/useTurnDiffs.ts +213 -0
  764. package/hooks/useTypeahead.tsx +1385 -0
  765. package/hooks/useUpdateNotification.ts +34 -0
  766. package/hooks/useVimInput.ts +316 -0
  767. package/hooks/useVirtualScroll.ts +721 -0
  768. package/hooks/useVoice.ts +1144 -0
  769. package/hooks/useVoiceEnabled.ts +25 -0
  770. package/hooks/useVoiceIntegration.tsx +677 -0
  771. package/ink/Ansi.tsx +292 -0
  772. package/ink/bidi.ts +139 -0
  773. package/ink/clearTerminal.ts +74 -0
  774. package/ink/colorize.ts +231 -0
  775. package/ink/components/AlternateScreen.tsx +80 -0
  776. package/ink/components/App.tsx +658 -0
  777. package/ink/components/AppContext.ts +21 -0
  778. package/ink/components/Box.tsx +214 -0
  779. package/ink/components/Button.tsx +192 -0
  780. package/ink/components/ClockContext.tsx +112 -0
  781. package/ink/components/CursorDeclarationContext.ts +32 -0
  782. package/ink/components/ErrorOverview.tsx +109 -0
  783. package/ink/components/Link.tsx +42 -0
  784. package/ink/components/Newline.tsx +39 -0
  785. package/ink/components/NoSelect.tsx +68 -0
  786. package/ink/components/RawAnsi.tsx +57 -0
  787. package/ink/components/ScrollBox.tsx +237 -0
  788. package/ink/components/Spacer.tsx +20 -0
  789. package/ink/components/StdinContext.ts +49 -0
  790. package/ink/components/TerminalFocusContext.tsx +52 -0
  791. package/ink/components/TerminalSizeContext.tsx +7 -0
  792. package/ink/components/Text.tsx +254 -0
  793. package/ink/constants.ts +2 -0
  794. package/ink/dom.ts +484 -0
  795. package/ink/events/click-event.ts +38 -0
  796. package/ink/events/dispatcher.ts +233 -0
  797. package/ink/events/emitter.ts +39 -0
  798. package/ink/events/event-handlers.ts +73 -0
  799. package/ink/events/event.ts +11 -0
  800. package/ink/events/focus-event.ts +21 -0
  801. package/ink/events/input-event.ts +205 -0
  802. package/ink/events/keyboard-event.ts +51 -0
  803. package/ink/events/terminal-event.ts +107 -0
  804. package/ink/events/terminal-focus-event.ts +19 -0
  805. package/ink/focus.ts +181 -0
  806. package/ink/frame.ts +124 -0
  807. package/ink/get-max-width.ts +27 -0
  808. package/ink/global.d.ts +26 -0
  809. package/ink/hit-test.ts +130 -0
  810. package/ink/hooks/use-animation-frame.ts +57 -0
  811. package/ink/hooks/use-app.ts +8 -0
  812. package/ink/hooks/use-declared-cursor.ts +73 -0
  813. package/ink/hooks/use-input.ts +92 -0
  814. package/ink/hooks/use-interval.ts +67 -0
  815. package/ink/hooks/use-search-highlight.ts +53 -0
  816. package/ink/hooks/use-selection.ts +104 -0
  817. package/ink/hooks/use-stdin.ts +8 -0
  818. package/ink/hooks/use-tab-status.ts +72 -0
  819. package/ink/hooks/use-terminal-focus.ts +16 -0
  820. package/ink/hooks/use-terminal-title.ts +31 -0
  821. package/ink/hooks/use-terminal-viewport.ts +96 -0
  822. package/ink/ink.tsx +1754 -0
  823. package/ink/instances.ts +10 -0
  824. package/ink/layout/engine.ts +6 -0
  825. package/ink/layout/geometry.ts +97 -0
  826. package/ink/layout/node.ts +152 -0
  827. package/ink/layout/yoga.ts +308 -0
  828. package/ink/line-width-cache.ts +24 -0
  829. package/ink/log-update.ts +773 -0
  830. package/ink/measure-element.ts +23 -0
  831. package/ink/measure-text.ts +47 -0
  832. package/ink/node-cache.ts +54 -0
  833. package/ink/optimizer.ts +93 -0
  834. package/ink/output.ts +797 -0
  835. package/ink/parse-keypress.ts +801 -0
  836. package/ink/reconciler.ts +512 -0
  837. package/ink/render-border.ts +231 -0
  838. package/ink/render-node-to-output.ts +1462 -0
  839. package/ink/render-to-screen.ts +231 -0
  840. package/ink/renderer.ts +178 -0
  841. package/ink/root.ts +184 -0
  842. package/ink/screen.ts +1486 -0
  843. package/ink/searchHighlight.ts +93 -0
  844. package/ink/selection.ts +917 -0
  845. package/ink/squash-text-nodes.ts +92 -0
  846. package/ink/stringWidth.ts +223 -0
  847. package/ink/styles.ts +771 -0
  848. package/ink/supports-hyperlinks.ts +57 -0
  849. package/ink/tabstops.ts +46 -0
  850. package/ink/terminal-focus-state.ts +47 -0
  851. package/ink/terminal-querier.ts +212 -0
  852. package/ink/terminal.ts +248 -0
  853. package/ink/termio/ansi.ts +75 -0
  854. package/ink/termio/csi.ts +319 -0
  855. package/ink/termio/dec.ts +60 -0
  856. package/ink/termio/esc.ts +67 -0
  857. package/ink/termio/osc.ts +493 -0
  858. package/ink/termio/parser.ts +394 -0
  859. package/ink/termio/sgr.ts +308 -0
  860. package/ink/termio/tokenize.ts +319 -0
  861. package/ink/termio/types.ts +236 -0
  862. package/ink/termio.ts +42 -0
  863. package/ink/useTerminalNotification.ts +126 -0
  864. package/ink/warn.ts +9 -0
  865. package/ink/widest-line.ts +19 -0
  866. package/ink/wrap-text.ts +74 -0
  867. package/ink/wrapAnsi.ts +20 -0
  868. package/inspect.js +7 -0
  869. package/keybindings/KeybindingContext.tsx +243 -0
  870. package/keybindings/KeybindingProviderSetup.tsx +308 -0
  871. package/keybindings/defaultBindings.ts +340 -0
  872. package/keybindings/loadUserBindings.ts +472 -0
  873. package/keybindings/match.ts +120 -0
  874. package/keybindings/parser.ts +203 -0
  875. package/keybindings/reservedShortcuts.ts +127 -0
  876. package/keybindings/resolver.ts +244 -0
  877. package/keybindings/schema.ts +236 -0
  878. package/keybindings/shortcutFormat.ts +63 -0
  879. package/keybindings/template.ts +52 -0
  880. package/keybindings/useKeybinding.ts +196 -0
  881. package/keybindings/useShortcutDisplay.ts +59 -0
  882. package/keybindings/validate.ts +498 -0
  883. package/macro.ts +24 -0
  884. package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  885. package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  886. package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  887. package/migrations/migrateFennecToOpus.ts +45 -0
  888. package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  889. package/migrations/migrateOpusToOpus1m.ts +43 -0
  890. package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  891. package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  892. package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  893. package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  894. package/migrations/resetProToOpusDefault.ts +51 -0
  895. package/package.json +29 -3
  896. package/patch-box.js +54 -0
  897. package/patch-compact.js +13 -0
  898. package/patch-condensed-center.js +13 -0
  899. package/patch-condensed-row.js +13 -0
  900. package/patch-condensed.js +13 -0
  901. package/patch-final.js +58 -0
  902. package/patch-input-body.js +46 -0
  903. package/patch-input-body2.js +35 -0
  904. package/patch-input-style.js +13 -0
  905. package/patch-input-width.js +13 -0
  906. package/patch-layout.js +87 -0
  907. package/patch-logo-row.js +12 -0
  908. package/patch-width.js +13 -0
  909. package/patch-width2.js +13 -0
  910. package/patch2.js +74 -0
  911. package/patch3.js +13 -0
  912. package/query.ts +1750 -0
  913. package/remote/RemoteSessionManager.ts +343 -0
  914. package/remote/SessionsWebSocket.ts +404 -0
  915. package/remote/remotePermissionBridge.ts +78 -0
  916. package/remote/sdkMessageAdapter.ts +302 -0
  917. package/skills/bundled/batch.ts +124 -0
  918. package/skills/bundled/claudeApi.ts +196 -0
  919. package/skills/bundled/claudeApiContent.ts +75 -0
  920. package/skills/bundled/claudeInChrome.ts +34 -0
  921. package/skills/bundled/debug.ts +103 -0
  922. package/skills/bundled/index.ts +79 -0
  923. package/skills/bundled/keybindings.ts +339 -0
  924. package/skills/bundled/loop.ts +92 -0
  925. package/skills/bundled/loremIpsum.ts +282 -0
  926. package/skills/bundled/remember.ts +82 -0
  927. package/skills/bundled/scheduleRemoteAgents.ts +447 -0
  928. package/skills/bundled/simplify.ts +69 -0
  929. package/skills/bundled/skillify.ts +197 -0
  930. package/skills/bundled/stuck.ts +79 -0
  931. package/skills/bundled/updateConfig.ts +475 -0
  932. package/skills/bundled/verify/SKILL.md +3 -0
  933. package/skills/bundled/verify/examples/cli.md +3 -0
  934. package/skills/bundled/verify/examples/server.md +3 -0
  935. package/skills/bundled/verify.ts +30 -0
  936. package/skills/bundled/verifyContent.ts +13 -0
  937. package/skills/bundledSkills.ts +220 -0
  938. package/skills/loadSkillsDir.ts +1086 -0
  939. package/skills/mcpSkillBuilders.ts +44 -0
  940. package/state/AppState.tsx +200 -0
  941. package/state/AppStateStore.ts +569 -0
  942. package/state/onChangeAppState.ts +171 -0
  943. package/state/selectors.ts +76 -0
  944. package/state/store.ts +34 -0
  945. package/state/teammateViewHelpers.ts +141 -0
  946. package/tasks/DreamTask/DreamTask.ts +157 -0
  947. package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  948. package/tasks/InProcessTeammateTask/types.ts +121 -0
  949. package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  950. package/tasks/LocalMainSessionTask.ts +479 -0
  951. package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  952. package/tasks/LocalShellTask/guards.ts +41 -0
  953. package/tasks/LocalShellTask/killShellTasks.ts +76 -0
  954. package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  955. package/tasks/pillLabel.ts +82 -0
  956. package/tasks/stopTask.ts +100 -0
  957. package/tasks/types.ts +46 -0
  958. package/types/command.ts +216 -0
  959. package/types/connectorText.ts +13 -0
  960. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  961. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  962. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  963. package/types/generated/google/protobuf/timestamp.ts +187 -0
  964. package/types/hooks.ts +290 -0
  965. package/types/ids.ts +44 -0
  966. package/types/logs.ts +330 -0
  967. package/types/permissions.ts +441 -0
  968. package/types/plugin.ts +363 -0
  969. package/types/textInputTypes.ts +387 -0
@@ -0,0 +1,811 @@
1
+ import { statSync } from 'fs'
2
+ import ignore from 'ignore'
3
+ import * as path from 'path'
4
+ import {
5
+ CLAUDE_CONFIG_DIRECTORIES,
6
+ loadMarkdownFilesForSubdir,
7
+ } from 'src/utils/markdownConfigLoader.js'
8
+ import type { SuggestionItem } from '../components/PromptInput/PromptInputFooterSuggestions.js'
9
+ import {
10
+ CHUNK_MS,
11
+ FileIndex,
12
+ yieldToEventLoop,
13
+ } from '../native-ts/file-index/index.js'
14
+ import { logEvent } from '../services/analytics/index.js'
15
+ import type { FileSuggestionCommandInput } from '../types/fileSuggestion.js'
16
+ import { getGlobalConfig } from '../utils/config.js'
17
+ import { getCwd } from '../utils/cwd.js'
18
+ import { logForDebugging } from '../utils/debug.js'
19
+ import { errorMessage } from '../utils/errors.js'
20
+ import { execFileNoThrowWithCwd } from '../utils/execFileNoThrow.js'
21
+ import { getFsImplementation } from '../utils/fsOperations.js'
22
+ import { findGitRoot, gitExe } from '../utils/git.js'
23
+ import {
24
+ createBaseHookInput,
25
+ executeFileSuggestionCommand,
26
+ } from '../utils/hooks.js'
27
+ import { logError } from '../utils/log.js'
28
+ import { expandPath } from '../utils/path.js'
29
+ import { ripGrep } from '../utils/ripgrep.js'
30
+ import { getInitialSettings } from '../utils/settings/settings.js'
31
+ import { createSignal } from '../utils/signal.js'
32
+
33
+ // Lazily constructed singleton
34
+ let fileIndex: FileIndex | null = null
35
+
36
+ function getFileIndex(): FileIndex {
37
+ if (!fileIndex) {
38
+ fileIndex = new FileIndex()
39
+ }
40
+ return fileIndex
41
+ }
42
+
43
+ let fileListRefreshPromise: Promise<FileIndex> | null = null
44
+ // Signal fired when an in-progress index build completes. Lets the
45
+ // typeahead UI re-run its last search so partial results upgrade to full.
46
+ const indexBuildComplete = createSignal()
47
+ export const onIndexBuildComplete = indexBuildComplete.subscribe
48
+ let cacheGeneration = 0
49
+
50
+ // Background fetch for untracked files
51
+ let untrackedFetchPromise: Promise<void> | null = null
52
+
53
+ // Store tracked files so we can rebuild index with untracked
54
+ let cachedTrackedFiles: string[] = []
55
+ // Store config files so mergeUntrackedIntoNormalizedCache preserves them
56
+ let cachedConfigFiles: string[] = []
57
+ // Store tracked directories so mergeUntrackedIntoNormalizedCache doesn't
58
+ // recompute ~270k path.dirname() calls on each merge
59
+ let cachedTrackedDirs: string[] = []
60
+
61
+ // Cache for .ignore/.rgignore patterns (keyed by repoRoot:cwd)
62
+ let ignorePatternsCache: ReturnType<typeof ignore> | null = null
63
+ let ignorePatternsCacheKey: string | null = null
64
+
65
+ // Throttle state for background refresh. .git/index mtime triggers an
66
+ // immediate refresh when tracked files change (add/checkout/commit/rm).
67
+ // The time floor still refreshes every 5s to pick up untracked files,
68
+ // which don't bump the index.
69
+ let lastRefreshMs = 0
70
+ let lastGitIndexMtime: number | null = null
71
+
72
+ // Signatures of the path lists loaded into the Rust index. Two separate
73
+ // signatures because the two loadFromFileList call sites use differently
74
+ // structured arrays — a shared signature would ping-pong and never match.
75
+ // Skips nucleo.restart() when git ls-files returns an unchanged list
76
+ // (e.g. `git add` of an already-tracked file bumps index mtime but not the list).
77
+ let loadedTrackedSignature: string | null = null
78
+ let loadedMergedSignature: string | null = null
79
+
80
+ /**
81
+ * Clear all file suggestion caches.
82
+ * Call this when resuming a session to ensure fresh file discovery.
83
+ */
84
+ export function clearFileSuggestionCaches(): void {
85
+ fileIndex = null
86
+ fileListRefreshPromise = null
87
+ cacheGeneration++
88
+ untrackedFetchPromise = null
89
+ cachedTrackedFiles = []
90
+ cachedConfigFiles = []
91
+ cachedTrackedDirs = []
92
+ indexBuildComplete.clear()
93
+ ignorePatternsCache = null
94
+ ignorePatternsCacheKey = null
95
+ lastRefreshMs = 0
96
+ lastGitIndexMtime = null
97
+ loadedTrackedSignature = null
98
+ loadedMergedSignature = null
99
+ }
100
+
101
+ /**
102
+ * Content hash of a path list. A length|first|last sample misses renames of
103
+ * middle files (same length, same endpoints → stale entry stuck in nucleo).
104
+ *
105
+ * Samples every Nth path (plus length). On a 346k-path list this hashes ~700
106
+ * paths instead of 14MB — enough to catch git operations (checkout, rebase,
107
+ * add/rm) while running in <1ms. A single mid-list rename that happens to
108
+ * fall between samples will miss the rebuild, but the 5s refresh floor picks
109
+ * it up on the next cycle.
110
+ */
111
+ export function pathListSignature(paths: string[]): string {
112
+ const n = paths.length
113
+ const stride = Math.max(1, Math.floor(n / 500))
114
+ let h = 0x811c9dc5 | 0
115
+ for (let i = 0; i < n; i += stride) {
116
+ const p = paths[i]!
117
+ for (let j = 0; j < p.length; j++) {
118
+ h = ((h ^ p.charCodeAt(j)) * 0x01000193) | 0
119
+ }
120
+ h = (h * 0x01000193) | 0
121
+ }
122
+ // Stride starts at 0 (first path always hashed); explicitly include last
123
+ // so single-file add/rm at the tail is caught
124
+ if (n > 0) {
125
+ const last = paths[n - 1]!
126
+ for (let j = 0; j < last.length; j++) {
127
+ h = ((h ^ last.charCodeAt(j)) * 0x01000193) | 0
128
+ }
129
+ }
130
+ return `${n}:${(h >>> 0).toString(16)}`
131
+ }
132
+
133
+ /**
134
+ * Stat .git/index to detect git state changes without spawning git ls-files.
135
+ * Returns null for worktrees (.git is a file → ENOTDIR), fresh repos with no
136
+ * index yet (ENOENT), and non-git dirs — caller falls back to time throttle.
137
+ */
138
+ function getGitIndexMtime(): number | null {
139
+ const repoRoot = findGitRoot(getCwd())
140
+ if (!repoRoot) return null
141
+ try {
142
+ // eslint-disable-next-line custom-rules/no-sync-fs -- mtimeMs is the operation here, not a pre-check. findGitRoot above already stat-walks synchronously; one more stat is marginal vs spawning git ls-files on every keystroke. Async would force startBackgroundCacheRefresh to become async, breaking the synchronous fileListRefreshPromise contract at the cold-start await site.
143
+ return statSync(path.join(repoRoot, '.git', 'index')).mtimeMs
144
+ } catch {
145
+ return null
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Normalize git paths relative to originalCwd
151
+ */
152
+ function normalizeGitPaths(
153
+ files: string[],
154
+ repoRoot: string,
155
+ originalCwd: string,
156
+ ): string[] {
157
+ if (originalCwd === repoRoot) {
158
+ return files
159
+ }
160
+ return files.map(f => {
161
+ const absolutePath = path.join(repoRoot, f)
162
+ return path.relative(originalCwd, absolutePath)
163
+ })
164
+ }
165
+
166
+ /**
167
+ * Merge already-normalized untracked files into the cache
168
+ */
169
+ async function mergeUntrackedIntoNormalizedCache(
170
+ normalizedUntracked: string[],
171
+ ): Promise<void> {
172
+ if (normalizedUntracked.length === 0) return
173
+ if (!fileIndex || cachedTrackedFiles.length === 0) return
174
+
175
+ const untrackedDirs = await getDirectoryNamesAsync(normalizedUntracked)
176
+ const allPaths = [
177
+ ...cachedTrackedFiles,
178
+ ...cachedConfigFiles,
179
+ ...cachedTrackedDirs,
180
+ ...normalizedUntracked,
181
+ ...untrackedDirs,
182
+ ]
183
+ const sig = pathListSignature(allPaths)
184
+ if (sig === loadedMergedSignature) {
185
+ logForDebugging(
186
+ `[FileIndex] skipped index rebuild — merged paths unchanged`,
187
+ )
188
+ return
189
+ }
190
+ await fileIndex.loadFromFileListAsync(allPaths).done
191
+ loadedMergedSignature = sig
192
+ logForDebugging(
193
+ `[FileIndex] rebuilt index with ${cachedTrackedFiles.length} tracked + ${normalizedUntracked.length} untracked files`,
194
+ )
195
+ }
196
+
197
+ /**
198
+ * Load ripgrep-specific ignore patterns from .ignore or .rgignore files
199
+ * Returns an ignore instance if patterns were found, null otherwise
200
+ * Results are cached per repoRoot:cwd combination
201
+ */
202
+ async function loadRipgrepIgnorePatterns(
203
+ repoRoot: string,
204
+ cwd: string,
205
+ ): Promise<ReturnType<typeof ignore> | null> {
206
+ const cacheKey = `${repoRoot}:${cwd}`
207
+
208
+ // Return cached result if available
209
+ if (ignorePatternsCacheKey === cacheKey) {
210
+ return ignorePatternsCache
211
+ }
212
+
213
+ const fs = getFsImplementation()
214
+ const ignoreFiles = ['.ignore', '.rgignore']
215
+ const directories = [...new Set([repoRoot, cwd])]
216
+
217
+ const ig = ignore()
218
+ let hasPatterns = false
219
+
220
+ const paths = directories.flatMap(dir =>
221
+ ignoreFiles.map(f => path.join(dir, f)),
222
+ )
223
+ const contents = await Promise.all(
224
+ paths.map(p => fs.readFile(p, { encoding: 'utf8' }).catch(() => null)),
225
+ )
226
+ for (const [i, content] of contents.entries()) {
227
+ if (content === null) continue
228
+ ig.add(content)
229
+ hasPatterns = true
230
+ logForDebugging(`[FileIndex] loaded ignore patterns from ${paths[i]}`)
231
+ }
232
+
233
+ const result = hasPatterns ? ig : null
234
+ ignorePatternsCache = result
235
+ ignorePatternsCacheKey = cacheKey
236
+
237
+ return result
238
+ }
239
+
240
+ /**
241
+ * Get files using git ls-files (much faster than ripgrep for git repos)
242
+ * Returns tracked files immediately, fetches untracked in background
243
+ * @param respectGitignore If true, excludes gitignored files from untracked results
244
+ *
245
+ * Note: Unlike ripgrep --follow, git ls-files doesn't follow symlinks.
246
+ * This is intentional as git tracks symlinks as symlinks.
247
+ */
248
+ async function getFilesUsingGit(
249
+ abortSignal: AbortSignal,
250
+ respectGitignore: boolean,
251
+ ): Promise<string[] | null> {
252
+ const startTime = Date.now()
253
+ logForDebugging(`[FileIndex] getFilesUsingGit called`)
254
+
255
+ // Check if we're in a git repo. findGitRoot is LRU-memoized per path.
256
+ const repoRoot = findGitRoot(getCwd())
257
+ if (!repoRoot) {
258
+ logForDebugging(`[FileIndex] not a git repo, returning null`)
259
+ return null
260
+ }
261
+
262
+ try {
263
+ const cwd = getCwd()
264
+
265
+ // Get tracked files (fast - reads from git index)
266
+ // Run from repoRoot so paths are relative to repo root, not CWD
267
+ const lsFilesStart = Date.now()
268
+ const trackedResult = await execFileNoThrowWithCwd(
269
+ gitExe(),
270
+ ['-c', 'core.quotepath=false', 'ls-files', '--recurse-submodules'],
271
+ { timeout: 5000, abortSignal, cwd: repoRoot },
272
+ )
273
+ logForDebugging(
274
+ `[FileIndex] git ls-files (tracked) took ${Date.now() - lsFilesStart}ms`,
275
+ )
276
+
277
+ if (trackedResult.code !== 0) {
278
+ logForDebugging(
279
+ `[FileIndex] git ls-files failed (code=${trackedResult.code}, stderr=${trackedResult.stderr}), falling back to ripgrep`,
280
+ )
281
+ return null
282
+ }
283
+
284
+ const trackedFiles = trackedResult.stdout.trim().split('\n').filter(Boolean)
285
+
286
+ // Normalize paths relative to the current working directory
287
+ let normalizedTracked = normalizeGitPaths(trackedFiles, repoRoot, cwd)
288
+
289
+ // Apply .ignore/.rgignore patterns if present (faster than falling back to ripgrep)
290
+ const ignorePatterns = await loadRipgrepIgnorePatterns(repoRoot, cwd)
291
+ if (ignorePatterns) {
292
+ const beforeCount = normalizedTracked.length
293
+ normalizedTracked = ignorePatterns.filter(normalizedTracked)
294
+ logForDebugging(
295
+ `[FileIndex] applied ignore patterns: ${beforeCount} -> ${normalizedTracked.length} files`,
296
+ )
297
+ }
298
+
299
+ // Cache tracked files for later merge with untracked
300
+ cachedTrackedFiles = normalizedTracked
301
+
302
+ const duration = Date.now() - startTime
303
+ logForDebugging(
304
+ `[FileIndex] git ls-files: ${normalizedTracked.length} tracked files in ${duration}ms`,
305
+ )
306
+
307
+ logEvent('tengu_file_suggestions_git_ls_files', {
308
+ file_count: normalizedTracked.length,
309
+ tracked_count: normalizedTracked.length,
310
+ untracked_count: 0,
311
+ duration_ms: duration,
312
+ })
313
+
314
+ // Start background fetch for untracked files (don't await)
315
+ if (!untrackedFetchPromise) {
316
+ const untrackedArgs = respectGitignore
317
+ ? [
318
+ '-c',
319
+ 'core.quotepath=false',
320
+ 'ls-files',
321
+ '--others',
322
+ '--exclude-standard',
323
+ ]
324
+ : ['-c', 'core.quotepath=false', 'ls-files', '--others']
325
+
326
+ const generation = cacheGeneration
327
+ untrackedFetchPromise = execFileNoThrowWithCwd(gitExe(), untrackedArgs, {
328
+ timeout: 10000,
329
+ cwd: repoRoot,
330
+ })
331
+ .then(async untrackedResult => {
332
+ if (generation !== cacheGeneration) {
333
+ return // Cache was cleared; don't merge stale untracked files
334
+ }
335
+ if (untrackedResult.code === 0) {
336
+ const rawUntrackedFiles = untrackedResult.stdout
337
+ .trim()
338
+ .split('\n')
339
+ .filter(Boolean)
340
+
341
+ // Normalize paths BEFORE applying ignore patterns (consistent with tracked files)
342
+ let normalizedUntracked = normalizeGitPaths(
343
+ rawUntrackedFiles,
344
+ repoRoot,
345
+ cwd,
346
+ )
347
+
348
+ // Apply .ignore/.rgignore patterns to normalized untracked files
349
+ const ignorePatterns = await loadRipgrepIgnorePatterns(
350
+ repoRoot,
351
+ cwd,
352
+ )
353
+ if (ignorePatterns && normalizedUntracked.length > 0) {
354
+ const beforeCount = normalizedUntracked.length
355
+ normalizedUntracked = ignorePatterns.filter(normalizedUntracked)
356
+ logForDebugging(
357
+ `[FileIndex] applied ignore patterns to untracked: ${beforeCount} -> ${normalizedUntracked.length} files`,
358
+ )
359
+ }
360
+
361
+ logForDebugging(
362
+ `[FileIndex] background untracked fetch: ${normalizedUntracked.length} files`,
363
+ )
364
+ // Pass already-normalized files directly to merge function
365
+ void mergeUntrackedIntoNormalizedCache(normalizedUntracked)
366
+ }
367
+ })
368
+ .catch(error => {
369
+ logForDebugging(
370
+ `[FileIndex] background untracked fetch failed: ${error}`,
371
+ )
372
+ })
373
+ .finally(() => {
374
+ untrackedFetchPromise = null
375
+ })
376
+ }
377
+
378
+ return normalizedTracked
379
+ } catch (error) {
380
+ logForDebugging(`[FileIndex] git ls-files error: ${errorMessage(error)}`)
381
+ return null
382
+ }
383
+ }
384
+
385
+ /**
386
+ * This function collects all parent directories for each file path
387
+ * and returns a list of unique directory names with a trailing separator.
388
+ * For example, if the input is ['src/index.js', 'src/utils/helpers.js'],
389
+ * the output will be ['src/', 'src/utils/'].
390
+ * @param files An array of file paths
391
+ * @returns An array of unique directory names with a trailing separator
392
+ */
393
+ export function getDirectoryNames(files: string[]): string[] {
394
+ const directoryNames = new Set<string>()
395
+ collectDirectoryNames(files, 0, files.length, directoryNames)
396
+ return [...directoryNames].map(d => d + path.sep)
397
+ }
398
+
399
+ /**
400
+ * Async variant: yields every ~10k files so 270k+ file lists don't block
401
+ * the main thread for >10ms at a time.
402
+ */
403
+ export async function getDirectoryNamesAsync(
404
+ files: string[],
405
+ ): Promise<string[]> {
406
+ const directoryNames = new Set<string>()
407
+ // Time-based chunking: yield after CHUNK_MS of work so slow machines get
408
+ // smaller chunks and stay responsive.
409
+ let chunkStart = performance.now()
410
+ for (let i = 0; i < files.length; i++) {
411
+ collectDirectoryNames(files, i, i + 1, directoryNames)
412
+ if ((i & 0xff) === 0xff && performance.now() - chunkStart > CHUNK_MS) {
413
+ await yieldToEventLoop()
414
+ chunkStart = performance.now()
415
+ }
416
+ }
417
+ return [...directoryNames].map(d => d + path.sep)
418
+ }
419
+
420
+ function collectDirectoryNames(
421
+ files: string[],
422
+ start: number,
423
+ end: number,
424
+ out: Set<string>,
425
+ ): void {
426
+ for (let i = start; i < end; i++) {
427
+ let currentDir = path.dirname(files[i]!)
428
+ // Early exit if we've already processed this directory and all its parents.
429
+ // Root detection: path.dirname returns its input at the root (fixed point),
430
+ // so we stop when dirname stops changing. Checking this before add() keeps
431
+ // the root out of the result set (matching the old path.parse().root guard).
432
+ // This avoids path.parse() which allocates a 5-field object per file.
433
+ while (currentDir !== '.' && !out.has(currentDir)) {
434
+ const parent = path.dirname(currentDir)
435
+ if (parent === currentDir) break
436
+ out.add(currentDir)
437
+ currentDir = parent
438
+ }
439
+ }
440
+ }
441
+
442
+ /**
443
+ * Gets additional files from Claude config directories
444
+ */
445
+ async function getClaudeConfigFiles(cwd: string): Promise<string[]> {
446
+ const markdownFileArrays = await Promise.all(
447
+ CLAUDE_CONFIG_DIRECTORIES.map(subdir =>
448
+ loadMarkdownFilesForSubdir(subdir, cwd),
449
+ ),
450
+ )
451
+ return markdownFileArrays.flatMap(markdownFiles =>
452
+ markdownFiles.map(f => f.filePath),
453
+ )
454
+ }
455
+
456
+ /**
457
+ * Gets project files using git ls-files (fast) or ripgrep (fallback)
458
+ */
459
+ async function getProjectFiles(
460
+ abortSignal: AbortSignal,
461
+ respectGitignore: boolean,
462
+ ): Promise<string[]> {
463
+ logForDebugging(
464
+ `[FileIndex] getProjectFiles called, respectGitignore=${respectGitignore}`,
465
+ )
466
+
467
+ // Try git ls-files first (much faster for git repos)
468
+ const gitFiles = await getFilesUsingGit(abortSignal, respectGitignore)
469
+ if (gitFiles !== null) {
470
+ logForDebugging(
471
+ `[FileIndex] using git ls-files result (${gitFiles.length} files)`,
472
+ )
473
+ return gitFiles
474
+ }
475
+
476
+ // Fall back to ripgrep
477
+ logForDebugging(
478
+ `[FileIndex] git ls-files returned null, falling back to ripgrep`,
479
+ )
480
+ const startTime = Date.now()
481
+ const rgArgs = [
482
+ '--files',
483
+ '--follow',
484
+ '--hidden',
485
+ '--glob',
486
+ '!.git/',
487
+ '--glob',
488
+ '!.svn/',
489
+ '--glob',
490
+ '!.hg/',
491
+ '--glob',
492
+ '!.bzr/',
493
+ '--glob',
494
+ '!.jj/',
495
+ '--glob',
496
+ '!.sl/',
497
+ ]
498
+ if (!respectGitignore) {
499
+ rgArgs.push('--no-ignore-vcs')
500
+ }
501
+
502
+ const files = await ripGrep(rgArgs, '.', abortSignal)
503
+ const relativePaths = files.map(f => path.relative(getCwd(), f))
504
+
505
+ const duration = Date.now() - startTime
506
+ logForDebugging(
507
+ `[FileIndex] ripgrep: ${relativePaths.length} files in ${duration}ms`,
508
+ )
509
+
510
+ logEvent('tengu_file_suggestions_ripgrep', {
511
+ file_count: relativePaths.length,
512
+ duration_ms: duration,
513
+ })
514
+
515
+ return relativePaths
516
+ }
517
+
518
+ /**
519
+ * Gets both files and their directory paths for providing path suggestions
520
+ * Uses git ls-files for git repos (fast) or ripgrep as fallback
521
+ * Returns a FileIndex populated for fast fuzzy search
522
+ */
523
+ export async function getPathsForSuggestions(): Promise<FileIndex> {
524
+ const signal = AbortSignal.timeout(10_000)
525
+ const index = getFileIndex()
526
+
527
+ try {
528
+ // Check project settings first, then fall back to global config
529
+ const projectSettings = getInitialSettings()
530
+ const globalConfig = getGlobalConfig()
531
+ const respectGitignore =
532
+ projectSettings.respectGitignore ?? globalConfig.respectGitignore ?? true
533
+
534
+ const cwd = getCwd()
535
+ const [projectFiles, configFiles] = await Promise.all([
536
+ getProjectFiles(signal, respectGitignore),
537
+ getClaudeConfigFiles(cwd),
538
+ ])
539
+
540
+ // Cache for mergeUntrackedIntoNormalizedCache
541
+ cachedConfigFiles = configFiles
542
+
543
+ const allFiles = [...projectFiles, ...configFiles]
544
+ const directories = await getDirectoryNamesAsync(allFiles)
545
+ cachedTrackedDirs = directories
546
+ const allPathsList = [...directories, ...allFiles]
547
+
548
+ // Skip rebuild when the list is unchanged. This is the common case
549
+ // during a typing session — git ls-files returns the same output.
550
+ const sig = pathListSignature(allPathsList)
551
+ if (sig !== loadedTrackedSignature) {
552
+ // Await the full build so cold-start returns complete results. The
553
+ // build yields every ~4ms so the UI stays responsive — user can keep
554
+ // typing during the ~120ms wait without input lag.
555
+ await index.loadFromFileListAsync(allPathsList).done
556
+ loadedTrackedSignature = sig
557
+ // We just replaced the merged index with tracked-only data. Force
558
+ // the next untracked merge to rebuild even if its own sig matches.
559
+ loadedMergedSignature = null
560
+ } else {
561
+ logForDebugging(
562
+ `[FileIndex] skipped index rebuild — tracked paths unchanged`,
563
+ )
564
+ }
565
+ } catch (error) {
566
+ logError(error)
567
+ }
568
+
569
+ return index
570
+ }
571
+
572
+ /**
573
+ * Finds the common prefix between two strings
574
+ */
575
+ function findCommonPrefix(a: string, b: string): string {
576
+ const minLength = Math.min(a.length, b.length)
577
+ let i = 0
578
+ while (i < minLength && a[i] === b[i]) {
579
+ i++
580
+ }
581
+ return a.substring(0, i)
582
+ }
583
+
584
+ /**
585
+ * Finds the longest common prefix among an array of suggestion items
586
+ */
587
+ export function findLongestCommonPrefix(suggestions: SuggestionItem[]): string {
588
+ if (suggestions.length === 0) return ''
589
+
590
+ const strings = suggestions.map(item => item.displayText)
591
+ let prefix = strings[0]!
592
+ for (let i = 1; i < strings.length; i++) {
593
+ const currentString = strings[i]!
594
+ prefix = findCommonPrefix(prefix, currentString)
595
+ if (prefix === '') return ''
596
+ }
597
+ return prefix
598
+ }
599
+
600
+ /**
601
+ * Creates a file suggestion item
602
+ */
603
+ function createFileSuggestionItem(
604
+ filePath: string,
605
+ score?: number,
606
+ ): SuggestionItem {
607
+ return {
608
+ id: `file-${filePath}`,
609
+ displayText: filePath,
610
+ metadata: score !== undefined ? { score } : undefined,
611
+ }
612
+ }
613
+
614
+ /**
615
+ * Find matching files and folders for a given query using the TS file index
616
+ */
617
+ const MAX_SUGGESTIONS = 15
618
+ function findMatchingFiles(
619
+ fileIndex: FileIndex,
620
+ partialPath: string,
621
+ ): SuggestionItem[] {
622
+ const results = fileIndex.search(partialPath, MAX_SUGGESTIONS)
623
+ return results.map(result =>
624
+ createFileSuggestionItem(result.path, result.score),
625
+ )
626
+ }
627
+
628
+ /**
629
+ * Starts a background refresh of the file index cache if not already in progress.
630
+ *
631
+ * Throttled: when a cache already exists, we skip the refresh unless git state
632
+ * has actually changed. This prevents every keystroke from spawning git ls-files
633
+ * and rebuilding the nucleo index.
634
+ */
635
+ const REFRESH_THROTTLE_MS = 5_000
636
+ export function startBackgroundCacheRefresh(): void {
637
+ if (fileListRefreshPromise) return
638
+
639
+ // Throttle only when a cache exists — cold start must always populate.
640
+ // Refresh immediately when .git/index mtime changed (tracked files).
641
+ // Otherwise refresh at most once per 5s — this floor picks up new UNTRACKED
642
+ // files, which don't bump .git/index. The signature checks downstream skip
643
+ // the rebuild when the 5s refresh finds nothing actually changed.
644
+ const indexMtime = getGitIndexMtime()
645
+ if (fileIndex) {
646
+ const gitStateChanged =
647
+ indexMtime !== null && indexMtime !== lastGitIndexMtime
648
+ if (!gitStateChanged && Date.now() - lastRefreshMs < REFRESH_THROTTLE_MS) {
649
+ return
650
+ }
651
+ }
652
+
653
+ const generation = cacheGeneration
654
+ const refreshStart = Date.now()
655
+ // Ensure the FileIndex singleton exists — it's progressively queryable
656
+ // via readyCount while the build runs. Callers searching early get partial
657
+ // results; indexBuildComplete fires after .done so they can re-search.
658
+ getFileIndex()
659
+ fileListRefreshPromise = getPathsForSuggestions()
660
+ .then(result => {
661
+ if (generation !== cacheGeneration) {
662
+ return result // Cache was cleared; don't overwrite with stale data
663
+ }
664
+ fileListRefreshPromise = null
665
+ indexBuildComplete.emit()
666
+ // Commit the start-time mtime observation on success. If git state
667
+ // changed mid-refresh, the next call will see the newer mtime and
668
+ // correctly refresh again.
669
+ lastGitIndexMtime = indexMtime
670
+ lastRefreshMs = Date.now()
671
+ logForDebugging(
672
+ `[FileIndex] cache refresh completed in ${Date.now() - refreshStart}ms`,
673
+ )
674
+ return result
675
+ })
676
+ .catch(error => {
677
+ logForDebugging(
678
+ `[FileIndex] Cache refresh failed: ${errorMessage(error)}`,
679
+ )
680
+ logError(error)
681
+ if (generation === cacheGeneration) {
682
+ fileListRefreshPromise = null // Allow retry on next call
683
+ }
684
+ return getFileIndex()
685
+ })
686
+ }
687
+
688
+ /**
689
+ * Gets the top-level files and directories in the current working directory
690
+ * @returns Array of file/directory paths in the current directory
691
+ */
692
+ async function getTopLevelPaths(): Promise<string[]> {
693
+ const fs = getFsImplementation()
694
+ const cwd = getCwd()
695
+
696
+ try {
697
+ const entries = await fs.readdir(cwd)
698
+ return entries.map(entry => {
699
+ const fullPath = path.join(cwd, entry.name)
700
+ const relativePath = path.relative(cwd, fullPath)
701
+ // Add trailing separator for directories
702
+ return entry.isDirectory() ? relativePath + path.sep : relativePath
703
+ })
704
+ } catch (error) {
705
+ logError(error as Error)
706
+ return []
707
+ }
708
+ }
709
+
710
+ /**
711
+ * Generate file suggestions for the current input and cursor position
712
+ * @param partialPath The partial file path to match
713
+ * @param showOnEmpty Whether to show suggestions even if partialPath is empty (used for @ symbol)
714
+ */
715
+ export async function generateFileSuggestions(
716
+ partialPath: string,
717
+ showOnEmpty = false,
718
+ ): Promise<SuggestionItem[]> {
719
+ // If input is empty and we don't want to show suggestions on empty, return nothing
720
+ if (!partialPath && !showOnEmpty) {
721
+ return []
722
+ }
723
+
724
+ // Use custom command directly if configured. We don't mix in our config files
725
+ // because the command returns pre-ranked results using its own search logic.
726
+ if (getInitialSettings().fileSuggestion?.type === 'command') {
727
+ const input: FileSuggestionCommandInput = {
728
+ ...createBaseHookInput(),
729
+ query: partialPath,
730
+ }
731
+ const results = await executeFileSuggestionCommand(input)
732
+ return results.slice(0, MAX_SUGGESTIONS).map(createFileSuggestionItem)
733
+ }
734
+
735
+ // If the partial path is empty or just a dot, return current directory suggestions
736
+ if (partialPath === '' || partialPath === '.' || partialPath === './') {
737
+ const topLevelPaths = await getTopLevelPaths()
738
+ startBackgroundCacheRefresh()
739
+ return topLevelPaths.slice(0, MAX_SUGGESTIONS).map(createFileSuggestionItem)
740
+ }
741
+
742
+ const startTime = Date.now()
743
+
744
+ try {
745
+ // Kick a background refresh. The index is progressively queryable —
746
+ // searches during build return partial results from ready chunks, and
747
+ // the typeahead callback (setOnIndexBuildComplete) re-fires the search
748
+ // when the build finishes to upgrade partial → full.
749
+ const wasBuilding = fileListRefreshPromise !== null
750
+ startBackgroundCacheRefresh()
751
+
752
+ // Handle both './' and '.\'
753
+ let normalizedPath = partialPath
754
+ const currentDirPrefix = '.' + path.sep
755
+ if (partialPath.startsWith(currentDirPrefix)) {
756
+ normalizedPath = partialPath.substring(2)
757
+ }
758
+
759
+ // Handle tilde expansion for home directory
760
+ if (normalizedPath.startsWith('~')) {
761
+ normalizedPath = expandPath(normalizedPath)
762
+ }
763
+
764
+ const matches = fileIndex
765
+ ? findMatchingFiles(fileIndex, normalizedPath)
766
+ : []
767
+
768
+ const duration = Date.now() - startTime
769
+ logForDebugging(
770
+ `[FileIndex] generateFileSuggestions: ${matches.length} results in ${duration}ms (${wasBuilding ? 'partial' : 'full'} index)`,
771
+ )
772
+ logEvent('tengu_file_suggestions_query', {
773
+ duration_ms: duration,
774
+ cache_hit: !wasBuilding,
775
+ result_count: matches.length,
776
+ query_length: partialPath.length,
777
+ })
778
+
779
+ return matches
780
+ } catch (error) {
781
+ logError(error)
782
+ return []
783
+ }
784
+ }
785
+
786
+ /**
787
+ * Apply a file suggestion to the input
788
+ */
789
+ export function applyFileSuggestion(
790
+ suggestion: string | SuggestionItem,
791
+ input: string,
792
+ partialPath: string,
793
+ startPos: number,
794
+ onInputChange: (value: string) => void,
795
+ setCursorOffset: (offset: number) => void,
796
+ ): void {
797
+ // Extract suggestion text from string or SuggestionItem
798
+ const suggestionText =
799
+ typeof suggestion === 'string' ? suggestion : suggestion.displayText
800
+
801
+ // Replace the partial path with the selected file path
802
+ const newInput =
803
+ input.substring(0, startPos) +
804
+ suggestionText +
805
+ input.substring(startPos + partialPath.length)
806
+ onInputChange(newInput)
807
+
808
+ // Move cursor to end of the file path
809
+ const newCursorPos = startPos + suggestionText.length
810
+ setCursorOffset(newCursorPos)
811
+ }