@xortex/xcode 3.0.1 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (968) hide show
  1. package/QueryEngine.ts +1331 -0
  2. package/Task.ts +125 -0
  3. package/Tool.ts +792 -0
  4. package/assistant/sessionHistory.ts +87 -0
  5. package/bin/xcode +57 -25
  6. package/bridge/bridgeApi.ts +539 -0
  7. package/bridge/bridgeConfig.ts +48 -0
  8. package/bridge/bridgeDebug.ts +135 -0
  9. package/bridge/bridgeEnabled.ts +202 -0
  10. package/bridge/bridgeMain.ts +2999 -0
  11. package/bridge/bridgeMessaging.ts +461 -0
  12. package/bridge/bridgePermissionCallbacks.ts +43 -0
  13. package/bridge/bridgePointer.ts +210 -0
  14. package/bridge/bridgeStatusUtil.ts +163 -0
  15. package/bridge/bridgeUI.ts +530 -0
  16. package/bridge/capacityWake.ts +56 -0
  17. package/bridge/codeSessionApi.ts +168 -0
  18. package/bridge/createSession.ts +384 -0
  19. package/bridge/debugUtils.ts +141 -0
  20. package/bridge/envLessBridgeConfig.ts +165 -0
  21. package/bridge/flushGate.ts +71 -0
  22. package/bridge/inboundAttachments.ts +175 -0
  23. package/bridge/inboundMessages.ts +80 -0
  24. package/bridge/initReplBridge.ts +569 -0
  25. package/bridge/jwtUtils.ts +256 -0
  26. package/bridge/pollConfig.ts +110 -0
  27. package/bridge/pollConfigDefaults.ts +82 -0
  28. package/bridge/remoteBridgeCore.ts +1008 -0
  29. package/bridge/replBridge.ts +2406 -0
  30. package/bridge/replBridgeHandle.ts +36 -0
  31. package/bridge/replBridgeTransport.ts +370 -0
  32. package/bridge/sessionIdCompat.ts +57 -0
  33. package/bridge/sessionRunner.ts +550 -0
  34. package/bridge/trustedDevice.ts +210 -0
  35. package/bridge/types.ts +262 -0
  36. package/bridge/workSecret.ts +127 -0
  37. package/buddy/CompanionSprite.tsx +371 -0
  38. package/buddy/companion.ts +133 -0
  39. package/buddy/prompt.ts +36 -0
  40. package/buddy/sprites.ts +514 -0
  41. package/buddy/types.ts +148 -0
  42. package/buddy/useBuddyNotification.tsx +98 -0
  43. package/cli/exit.ts +31 -0
  44. package/cli/handlers/agents.ts +70 -0
  45. package/cli/handlers/auth.ts +330 -0
  46. package/cli/handlers/autoMode.ts +170 -0
  47. package/cli/handlers/mcp.tsx +362 -0
  48. package/cli/handlers/plugins.ts +878 -0
  49. package/cli/handlers/util.tsx +110 -0
  50. package/cli/ndjsonSafeStringify.ts +32 -0
  51. package/cli/print.ts +5594 -0
  52. package/cli/remoteIO.ts +255 -0
  53. package/cli/structuredIO.ts +859 -0
  54. package/cli/transports/HybridTransport.ts +282 -0
  55. package/cli/transports/SSETransport.ts +711 -0
  56. package/cli/transports/SerialBatchEventUploader.ts +275 -0
  57. package/cli/transports/WebSocketTransport.ts +800 -0
  58. package/cli/transports/WorkerStateUploader.ts +131 -0
  59. package/cli/transports/ccrClient.ts +998 -0
  60. package/cli/transports/transportUtils.ts +45 -0
  61. package/cli/update.ts +422 -0
  62. package/commands/add-dir/add-dir.tsx +126 -0
  63. package/commands/add-dir/index.ts +11 -0
  64. package/commands/add-dir/validation.ts +110 -0
  65. package/commands/advisor.ts +109 -0
  66. package/commands/agents/agents.tsx +12 -0
  67. package/commands/agents/index.ts +10 -0
  68. package/commands/ant-trace/index.js +1 -0
  69. package/commands/autofix-pr/index.js +1 -0
  70. package/commands/backfill-sessions/index.js +1 -0
  71. package/commands/branch/branch.ts +296 -0
  72. package/commands/branch/index.ts +14 -0
  73. package/commands/break-cache/index.js +1 -0
  74. package/commands/bridge/bridge.tsx +509 -0
  75. package/commands/bridge/index.ts +26 -0
  76. package/commands/bridge-kick.ts +200 -0
  77. package/commands/brief.ts +130 -0
  78. package/commands/btw/btw.tsx +243 -0
  79. package/commands/btw/index.ts +13 -0
  80. package/commands/bughunter/index.js +1 -0
  81. package/commands/chrome/chrome.tsx +285 -0
  82. package/commands/chrome/index.ts +13 -0
  83. package/commands/clear/caches.ts +144 -0
  84. package/commands/clear/clear.ts +7 -0
  85. package/commands/clear/conversation.ts +251 -0
  86. package/commands/clear/index.ts +19 -0
  87. package/commands/color/color.ts +93 -0
  88. package/commands/color/index.ts +16 -0
  89. package/commands/commit-push-pr.ts +158 -0
  90. package/commands/commit.ts +92 -0
  91. package/commands/compact/compact.ts +287 -0
  92. package/commands/compact/index.ts +15 -0
  93. package/commands/config/config.tsx +7 -0
  94. package/commands/config/index.ts +11 -0
  95. package/commands/context/context-noninteractive.ts +325 -0
  96. package/commands/context/context.tsx +64 -0
  97. package/commands/context/index.ts +24 -0
  98. package/commands/copy/copy.tsx +371 -0
  99. package/commands/copy/index.ts +15 -0
  100. package/commands/cost/cost.ts +24 -0
  101. package/commands/cost/index.ts +23 -0
  102. package/commands/createMovedToPluginCommand.ts +65 -0
  103. package/commands/ctx_viz/index.js +1 -0
  104. package/commands/debug-tool-call/index.js +1 -0
  105. package/commands/desktop/desktop.tsx +9 -0
  106. package/commands/desktop/index.ts +26 -0
  107. package/commands/diff/diff.tsx +9 -0
  108. package/commands/diff/index.ts +8 -0
  109. package/commands/doctor/doctor.tsx +7 -0
  110. package/commands/doctor/index.ts +12 -0
  111. package/commands/effort/effort.tsx +183 -0
  112. package/commands/effort/index.ts +13 -0
  113. package/commands/env/index.js +1 -0
  114. package/commands/exit/exit.tsx +33 -0
  115. package/commands/exit/index.ts +12 -0
  116. package/commands/export/export.tsx +91 -0
  117. package/commands/export/index.ts +11 -0
  118. package/commands/extra-usage/extra-usage-core.ts +118 -0
  119. package/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  120. package/commands/extra-usage/extra-usage.tsx +17 -0
  121. package/commands/extra-usage/index.ts +31 -0
  122. package/commands/fast/fast.tsx +269 -0
  123. package/commands/fast/index.ts +26 -0
  124. package/commands/feedback/feedback.tsx +25 -0
  125. package/commands/feedback/index.ts +26 -0
  126. package/commands/files/files.ts +19 -0
  127. package/commands/files/index.ts +12 -0
  128. package/commands/good-claude/index.js +1 -0
  129. package/commands/heapdump/heapdump.ts +17 -0
  130. package/commands/heapdump/index.ts +12 -0
  131. package/commands/help/help.tsx +11 -0
  132. package/commands/help/index.ts +10 -0
  133. package/commands/hooks/hooks.tsx +13 -0
  134. package/commands/hooks/index.ts +11 -0
  135. package/commands/ide/ide.tsx +646 -0
  136. package/commands/ide/index.ts +11 -0
  137. package/commands/init-verifiers.ts +262 -0
  138. package/commands/init.ts +256 -0
  139. package/commands/insights.ts +3200 -0
  140. package/commands/install-github-app/ApiKeyStep.tsx +231 -0
  141. package/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  142. package/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  143. package/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  144. package/commands/install-github-app/CreatingStep.tsx +65 -0
  145. package/commands/install-github-app/ErrorStep.tsx +85 -0
  146. package/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  147. package/commands/install-github-app/InstallAppStep.tsx +94 -0
  148. package/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  149. package/commands/install-github-app/SuccessStep.tsx +96 -0
  150. package/commands/install-github-app/WarningsStep.tsx +73 -0
  151. package/commands/install-github-app/index.ts +13 -0
  152. package/commands/install-github-app/install-github-app.tsx +587 -0
  153. package/commands/install-github-app/setupGitHubActions.ts +325 -0
  154. package/commands/install-slack-app/index.ts +12 -0
  155. package/commands/install-slack-app/install-slack-app.ts +30 -0
  156. package/commands/install.tsx +300 -0
  157. package/commands/issue/index.js +1 -0
  158. package/commands/keybindings/index.ts +13 -0
  159. package/commands/keybindings/keybindings.ts +53 -0
  160. package/commands/login/index.ts +14 -0
  161. package/commands/login/login.tsx +104 -0
  162. package/commands/logout/index.ts +10 -0
  163. package/commands/logout/logout.tsx +82 -0
  164. package/commands/mcp/addCommand.ts +280 -0
  165. package/commands/mcp/index.ts +12 -0
  166. package/commands/mcp/mcp.tsx +85 -0
  167. package/commands/mcp/xaaIdpCommand.ts +266 -0
  168. package/commands/memory/index.ts +10 -0
  169. package/commands/memory/memory.tsx +90 -0
  170. package/commands/mobile/index.ts +11 -0
  171. package/commands/mobile/mobile.tsx +274 -0
  172. package/commands/mock-limits/index.js +1 -0
  173. package/commands/model/index.ts +16 -0
  174. package/commands/model/model.tsx +297 -0
  175. package/commands/oauth-refresh/index.js +1 -0
  176. package/commands/onboarding/index.js +1 -0
  177. package/commands/output-style/index.ts +11 -0
  178. package/commands/output-style/output-style.tsx +7 -0
  179. package/commands/passes/index.ts +22 -0
  180. package/commands/passes/passes.tsx +24 -0
  181. package/commands/perf-issue/index.js +1 -0
  182. package/commands/permissions/index.ts +11 -0
  183. package/commands/permissions/permissions.tsx +10 -0
  184. package/commands/plan/index.ts +11 -0
  185. package/commands/plan/plan.tsx +122 -0
  186. package/commands/plugin/AddMarketplace.tsx +162 -0
  187. package/commands/plugin/BrowseMarketplace.tsx +802 -0
  188. package/commands/plugin/DiscoverPlugins.tsx +781 -0
  189. package/commands/plugin/ManageMarketplaces.tsx +838 -0
  190. package/commands/plugin/ManagePlugins.tsx +2215 -0
  191. package/commands/plugin/PluginErrors.tsx +124 -0
  192. package/commands/plugin/PluginOptionsDialog.tsx +357 -0
  193. package/commands/plugin/PluginOptionsFlow.tsx +135 -0
  194. package/commands/plugin/PluginSettings.tsx +1072 -0
  195. package/commands/plugin/PluginTrustWarning.tsx +32 -0
  196. package/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  197. package/commands/plugin/ValidatePlugin.tsx +98 -0
  198. package/commands/plugin/index.tsx +11 -0
  199. package/commands/plugin/parseArgs.ts +103 -0
  200. package/commands/plugin/plugin.tsx +7 -0
  201. package/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  202. package/commands/plugin/usePagination.ts +171 -0
  203. package/commands/pr_comments/index.ts +50 -0
  204. package/commands/privacy-settings/index.ts +14 -0
  205. package/commands/privacy-settings/privacy-settings.tsx +58 -0
  206. package/commands/rate-limit-options/index.ts +19 -0
  207. package/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  208. package/commands/release-notes/index.ts +11 -0
  209. package/commands/release-notes/release-notes.ts +50 -0
  210. package/commands/reload-plugins/index.ts +18 -0
  211. package/commands/reload-plugins/reload-plugins.ts +61 -0
  212. package/commands/remote-env/index.ts +15 -0
  213. package/commands/remote-env/remote-env.tsx +7 -0
  214. package/commands/remote-setup/api.ts +182 -0
  215. package/commands/remote-setup/index.ts +20 -0
  216. package/commands/remote-setup/remote-setup.tsx +187 -0
  217. package/commands/rename/generateSessionName.ts +67 -0
  218. package/commands/rename/index.ts +12 -0
  219. package/commands/rename/rename.ts +87 -0
  220. package/commands/reset-limits/index.js +4 -0
  221. package/commands/resume/index.ts +12 -0
  222. package/commands/resume/resume.tsx +275 -0
  223. package/commands/review/UltrareviewOverageDialog.tsx +96 -0
  224. package/commands/review/reviewRemote.ts +316 -0
  225. package/commands/review/ultrareviewCommand.tsx +58 -0
  226. package/commands/review/ultrareviewEnabled.ts +14 -0
  227. package/commands/review.ts +57 -0
  228. package/commands/rewind/index.ts +13 -0
  229. package/commands/rewind/rewind.ts +13 -0
  230. package/commands/sandbox-toggle/index.ts +50 -0
  231. package/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  232. package/commands/security-review.ts +243 -0
  233. package/commands/session/index.ts +16 -0
  234. package/commands/session/session.tsx +140 -0
  235. package/commands/share/index.js +1 -0
  236. package/commands/skills/index.ts +10 -0
  237. package/commands/skills/skills.tsx +8 -0
  238. package/commands/stats/index.ts +10 -0
  239. package/commands/stats/stats.tsx +7 -0
  240. package/commands/status/index.ts +12 -0
  241. package/commands/status/status.tsx +8 -0
  242. package/commands/statusline.tsx +24 -0
  243. package/commands/stickers/index.ts +11 -0
  244. package/commands/stickers/stickers.ts +16 -0
  245. package/commands/summary/index.js +1 -0
  246. package/commands/tag/index.ts +12 -0
  247. package/commands/tag/tag.tsx +215 -0
  248. package/commands/tasks/index.ts +11 -0
  249. package/commands/tasks/tasks.tsx +8 -0
  250. package/commands/teleport/index.js +1 -0
  251. package/commands/terminalSetup/index.ts +23 -0
  252. package/commands/terminalSetup/terminalSetup.tsx +531 -0
  253. package/commands/theme/index.ts +10 -0
  254. package/commands/theme/theme.tsx +57 -0
  255. package/commands/thinkback/index.ts +13 -0
  256. package/commands/thinkback/thinkback.tsx +554 -0
  257. package/commands/thinkback-play/index.ts +17 -0
  258. package/commands/thinkback-play/thinkback-play.ts +43 -0
  259. package/commands/ultraplan.tsx +471 -0
  260. package/commands/upgrade/index.ts +16 -0
  261. package/commands/upgrade/upgrade.tsx +38 -0
  262. package/commands/usage/index.ts +9 -0
  263. package/commands/usage/usage.tsx +7 -0
  264. package/commands/version.ts +22 -0
  265. package/commands/vim/index.ts +11 -0
  266. package/commands/vim/vim.ts +38 -0
  267. package/commands/voice/index.ts +20 -0
  268. package/commands/voice/voice.ts +150 -0
  269. package/commands/xingest/index.ts +11 -0
  270. package/commands/xingest/xingest.ts +90 -0
  271. package/commands/xsearch/index.ts +11 -0
  272. package/commands/xsearch/xsearch.ts +56 -0
  273. package/commands.ts +758 -0
  274. package/components/AgentProgressLine.tsx +136 -0
  275. package/components/App.tsx +56 -0
  276. package/components/ApproveApiKey.tsx +123 -0
  277. package/components/AutoModeOptInDialog.tsx +142 -0
  278. package/components/AutoUpdater.tsx +198 -0
  279. package/components/AutoUpdaterWrapper.tsx +91 -0
  280. package/components/AwsAuthStatusBox.tsx +82 -0
  281. package/components/BaseTextInput.tsx +136 -0
  282. package/components/BashModeProgress.tsx +56 -0
  283. package/components/BridgeDialog.tsx +401 -0
  284. package/components/BypassPermissionsModeDialog.tsx +87 -0
  285. package/components/ChannelDowngradeDialog.tsx +102 -0
  286. package/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  287. package/components/ClaudeInChromeOnboarding.tsx +121 -0
  288. package/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  289. package/components/ClickableImageRef.tsx +73 -0
  290. package/components/CompactSummary.tsx +118 -0
  291. package/components/ConfigurableShortcutHint.tsx +57 -0
  292. package/components/ConsoleOAuthFlow.tsx +631 -0
  293. package/components/ContextSuggestions.tsx +47 -0
  294. package/components/ContextVisualization.tsx +489 -0
  295. package/components/CoordinatorAgentStatus.tsx +273 -0
  296. package/components/CostThresholdDialog.tsx +50 -0
  297. package/components/CtrlOToExpand.tsx +51 -0
  298. package/components/CustomSelect/SelectMulti.tsx +213 -0
  299. package/components/CustomSelect/index.ts +3 -0
  300. package/components/CustomSelect/option-map.ts +50 -0
  301. package/components/CustomSelect/select-input-option.tsx +488 -0
  302. package/components/CustomSelect/select-option.tsx +68 -0
  303. package/components/CustomSelect/select.tsx +690 -0
  304. package/components/CustomSelect/use-multi-select-state.ts +414 -0
  305. package/components/CustomSelect/use-select-input.ts +287 -0
  306. package/components/CustomSelect/use-select-navigation.ts +653 -0
  307. package/components/CustomSelect/use-select-state.ts +157 -0
  308. package/components/DesktopHandoff.tsx +193 -0
  309. package/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  310. package/components/DevBar.tsx +49 -0
  311. package/components/DevChannelsDialog.tsx +105 -0
  312. package/components/DiagnosticsDisplay.tsx +95 -0
  313. package/components/EffortCallout.tsx +265 -0
  314. package/components/EffortIndicator.ts +42 -0
  315. package/components/ExitFlow.tsx +48 -0
  316. package/components/ExportDialog.tsx +128 -0
  317. package/components/FallbackToolUseErrorMessage.tsx +116 -0
  318. package/components/FallbackToolUseRejectedMessage.tsx +16 -0
  319. package/components/FastIcon.tsx +46 -0
  320. package/components/Feedback.tsx +592 -0
  321. package/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  322. package/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  323. package/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  324. package/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  325. package/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  326. package/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  327. package/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  328. package/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  329. package/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  330. package/components/FileEditToolDiff.tsx +181 -0
  331. package/components/FileEditToolUpdatedMessage.tsx +124 -0
  332. package/components/FileEditToolUseRejectedMessage.tsx +170 -0
  333. package/components/FilePathLink.tsx +43 -0
  334. package/components/FullscreenLayout.tsx +645 -0
  335. package/components/GlobalSearchDialog.tsx +343 -0
  336. package/components/HelpV2/Commands.tsx +82 -0
  337. package/components/HelpV2/General.tsx +23 -0
  338. package/components/HelpV2/HelpV2.tsx +184 -0
  339. package/components/HighlightedCode/Fallback.tsx +193 -0
  340. package/components/HighlightedCode.tsx +190 -0
  341. package/components/HistorySearchDialog.tsx +118 -0
  342. package/components/IdeAutoConnectDialog.tsx +154 -0
  343. package/components/IdeOnboardingDialog.tsx +167 -0
  344. package/components/IdeStatusIndicator.tsx +58 -0
  345. package/components/IdleReturnDialog.tsx +118 -0
  346. package/components/InterruptedByUser.tsx +15 -0
  347. package/components/InvalidConfigDialog.tsx +156 -0
  348. package/components/InvalidSettingsDialog.tsx +89 -0
  349. package/components/KeybindingWarnings.tsx +55 -0
  350. package/components/LanguagePicker.tsx +86 -0
  351. package/components/LogSelector.tsx +1575 -0
  352. package/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  353. package/components/LogoV2/AnimatedClawd.tsx +124 -0
  354. package/components/LogoV2/ChannelsNotice.tsx +266 -0
  355. package/components/LogoV2/Clawd.tsx +14 -0
  356. package/components/LogoV2/CondensedLogo.tsx +161 -0
  357. package/components/LogoV2/EmergencyTip.tsx +58 -0
  358. package/components/LogoV2/Feed.tsx +112 -0
  359. package/components/LogoV2/FeedColumn.tsx +59 -0
  360. package/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  361. package/components/LogoV2/LogoV2.tsx +543 -0
  362. package/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  363. package/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  364. package/components/LogoV2/VoiceModeNotice.tsx +68 -0
  365. package/components/LogoV2/WelcomeV2.tsx +433 -0
  366. package/components/LogoV2/feedConfigs.tsx +92 -0
  367. package/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  368. package/components/MCPServerApprovalDialog.tsx +115 -0
  369. package/components/MCPServerDesktopImportDialog.tsx +203 -0
  370. package/components/MCPServerDialogCopy.tsx +15 -0
  371. package/components/MCPServerMultiselectDialog.tsx +133 -0
  372. package/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  373. package/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  374. package/components/Markdown.tsx +236 -0
  375. package/components/MarkdownTable.tsx +322 -0
  376. package/components/MemoryUsageIndicator.tsx +37 -0
  377. package/components/Message.tsx +627 -0
  378. package/components/MessageModel.tsx +43 -0
  379. package/components/MessageResponse.tsx +78 -0
  380. package/components/MessageRow.tsx +383 -0
  381. package/components/MessageSelector.tsx +831 -0
  382. package/components/MessageTimestamp.tsx +63 -0
  383. package/components/Messages.tsx +834 -0
  384. package/components/ModelPicker.tsx +448 -0
  385. package/components/NativeAutoUpdater.tsx +193 -0
  386. package/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  387. package/components/OffscreenFreeze.tsx +44 -0
  388. package/components/Onboarding.tsx +244 -0
  389. package/components/OutputStylePicker.tsx +112 -0
  390. package/components/PackageManagerAutoUpdater.tsx +104 -0
  391. package/components/Passes/Passes.tsx +184 -0
  392. package/components/PrBadge.tsx +97 -0
  393. package/components/PressEnterToContinue.tsx +15 -0
  394. package/components/PromptInput/HistorySearchInput.tsx +51 -0
  395. package/components/PromptInput/IssueFlagBanner.tsx +12 -0
  396. package/components/PromptInput/Notifications.tsx +332 -0
  397. package/components/PromptInput/PromptInput.tsx +2350 -0
  398. package/components/PromptInput/PromptInputFooter.tsx +191 -0
  399. package/components/PromptInput/PromptInputFooterLeftSide.tsx +524 -0
  400. package/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  401. package/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  402. package/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  403. package/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  404. package/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  405. package/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  406. package/components/PromptInput/ShimmeredInput.tsx +143 -0
  407. package/components/PromptInput/VoiceIndicator.tsx +137 -0
  408. package/components/PromptInput/inputModes.ts +33 -0
  409. package/components/PromptInput/inputPaste.ts +90 -0
  410. package/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  411. package/components/PromptInput/usePromptInputPlaceholder.ts +78 -0
  412. package/components/PromptInput/useShowFastIconHint.ts +31 -0
  413. package/components/PromptInput/useSwarmBanner.ts +155 -0
  414. package/components/PromptInput/utils.ts +60 -0
  415. package/components/QuickOpenDialog.tsx +244 -0
  416. package/components/RemoteCallout.tsx +76 -0
  417. package/components/RemoteEnvironmentDialog.tsx +340 -0
  418. package/components/ResumeTask.tsx +268 -0
  419. package/components/SandboxViolationExpandedView.tsx +99 -0
  420. package/components/ScrollKeybindingHandler.tsx +1012 -0
  421. package/components/SearchBox.tsx +72 -0
  422. package/components/SentryErrorBoundary.ts +28 -0
  423. package/components/SessionBackgroundHint.tsx +108 -0
  424. package/components/SessionPreview.tsx +194 -0
  425. package/components/Settings/Config.tsx +1822 -0
  426. package/components/Settings/Settings.tsx +137 -0
  427. package/components/Settings/Status.tsx +241 -0
  428. package/components/Settings/Usage.tsx +377 -0
  429. package/components/ShowInIDEPrompt.tsx +170 -0
  430. package/components/SkillImprovementSurvey.tsx +152 -0
  431. package/components/Spinner/FlashingChar.tsx +61 -0
  432. package/components/Spinner/GlimmerMessage.tsx +328 -0
  433. package/components/Spinner/ShimmerChar.tsx +36 -0
  434. package/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  435. package/components/Spinner/SpinnerGlyph.tsx +80 -0
  436. package/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  437. package/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  438. package/components/Spinner/index.ts +10 -0
  439. package/components/Spinner/teammateSelectHint.ts +1 -0
  440. package/components/Spinner/useShimmerAnimation.ts +31 -0
  441. package/components/Spinner/useStalledAnimation.ts +75 -0
  442. package/components/Spinner/utils.ts +84 -0
  443. package/components/Spinner.tsx +562 -0
  444. package/components/Stats.tsx +1228 -0
  445. package/components/StatusLine.tsx +324 -0
  446. package/components/StatusNotices.tsx +55 -0
  447. package/components/StructuredDiff/Fallback.tsx +487 -0
  448. package/components/StructuredDiff/colorDiff.ts +37 -0
  449. package/components/StructuredDiff.tsx +190 -0
  450. package/components/StructuredDiffList.tsx +30 -0
  451. package/components/TagTabs.tsx +139 -0
  452. package/components/TaskListV2.tsx +378 -0
  453. package/components/TeammateViewHeader.tsx +82 -0
  454. package/components/TeleportError.tsx +189 -0
  455. package/components/TeleportProgress.tsx +140 -0
  456. package/components/TeleportRepoMismatchDialog.tsx +104 -0
  457. package/components/TeleportResumeWrapper.tsx +167 -0
  458. package/components/TeleportStash.tsx +116 -0
  459. package/components/TextInput.tsx +124 -0
  460. package/components/ThemePicker.tsx +333 -0
  461. package/components/ThinkingToggle.tsx +153 -0
  462. package/components/TokenWarning.tsx +179 -0
  463. package/components/ToolUseLoader.tsx +42 -0
  464. package/components/TrustDialog/TrustDialog.tsx +290 -0
  465. package/components/TrustDialog/utils.ts +245 -0
  466. package/components/ValidationErrorsList.tsx +148 -0
  467. package/components/VimTextInput.tsx +140 -0
  468. package/components/VirtualMessageList.tsx +1082 -0
  469. package/components/WorkflowMultiselectDialog.tsx +128 -0
  470. package/components/WorktreeExitDialog.tsx +231 -0
  471. package/components/agents/AgentDetail.tsx +220 -0
  472. package/components/agents/AgentEditor.tsx +178 -0
  473. package/components/agents/AgentNavigationFooter.tsx +26 -0
  474. package/components/agents/AgentsList.tsx +440 -0
  475. package/components/agents/AgentsMenu.tsx +800 -0
  476. package/components/agents/ColorPicker.tsx +112 -0
  477. package/components/agents/ModelSelector.tsx +68 -0
  478. package/components/agents/ToolSelector.tsx +562 -0
  479. package/components/agents/agentFileUtils.ts +272 -0
  480. package/components/agents/generateAgent.ts +197 -0
  481. package/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  482. package/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  483. package/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  484. package/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  485. package/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  486. package/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  487. package/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  488. package/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  489. package/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  490. package/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  491. package/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  492. package/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  493. package/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  494. package/components/agents/types.ts +27 -0
  495. package/components/agents/utils.ts +18 -0
  496. package/components/agents/validateAgent.ts +109 -0
  497. package/components/design-system/Byline.tsx +77 -0
  498. package/components/design-system/Dialog.tsx +138 -0
  499. package/components/design-system/Divider.tsx +149 -0
  500. package/components/design-system/FuzzyPicker.tsx +312 -0
  501. package/components/design-system/KeyboardShortcutHint.tsx +81 -0
  502. package/components/design-system/ListItem.tsx +244 -0
  503. package/components/design-system/LoadingState.tsx +94 -0
  504. package/components/design-system/Pane.tsx +77 -0
  505. package/components/design-system/ProgressBar.tsx +86 -0
  506. package/components/design-system/Ratchet.tsx +80 -0
  507. package/components/design-system/StatusIcon.tsx +95 -0
  508. package/components/design-system/Tabs.tsx +340 -0
  509. package/components/design-system/ThemeProvider.tsx +170 -0
  510. package/components/design-system/ThemedBox.tsx +156 -0
  511. package/components/design-system/ThemedText.tsx +124 -0
  512. package/components/design-system/color.ts +30 -0
  513. package/components/diff/DiffDetailView.tsx +281 -0
  514. package/components/diff/DiffDialog.tsx +383 -0
  515. package/components/diff/DiffFileList.tsx +292 -0
  516. package/components/grove/Grove.tsx +463 -0
  517. package/components/hooks/HooksConfigMenu.tsx +578 -0
  518. package/components/hooks/PromptDialog.tsx +90 -0
  519. package/components/hooks/SelectEventMode.tsx +127 -0
  520. package/components/hooks/SelectHookMode.tsx +112 -0
  521. package/components/hooks/SelectMatcherMode.tsx +144 -0
  522. package/components/hooks/ViewHookMode.tsx +199 -0
  523. package/components/mcp/CapabilitiesSection.tsx +61 -0
  524. package/components/mcp/ElicitationDialog.tsx +1169 -0
  525. package/components/mcp/MCPAgentServerMenu.tsx +183 -0
  526. package/components/mcp/MCPListPanel.tsx +504 -0
  527. package/components/mcp/MCPReconnect.tsx +167 -0
  528. package/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  529. package/components/mcp/MCPSettings.tsx +398 -0
  530. package/components/mcp/MCPStdioServerMenu.tsx +177 -0
  531. package/components/mcp/MCPToolDetailView.tsx +212 -0
  532. package/components/mcp/MCPToolListView.tsx +141 -0
  533. package/components/mcp/McpParsingWarnings.tsx +213 -0
  534. package/components/mcp/index.ts +9 -0
  535. package/components/mcp/utils/reconnectHelpers.tsx +49 -0
  536. package/components/memory/MemoryFileSelector.tsx +438 -0
  537. package/components/memory/MemoryUpdateNotification.tsx +45 -0
  538. package/components/messageActions.tsx +450 -0
  539. package/components/messages/AdvisorMessage.tsx +158 -0
  540. package/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  541. package/components/messages/AssistantTextMessage.tsx +270 -0
  542. package/components/messages/AssistantThinkingMessage.tsx +86 -0
  543. package/components/messages/AssistantToolUseMessage.tsx +368 -0
  544. package/components/messages/AttachmentMessage.tsx +536 -0
  545. package/components/messages/CollapsedReadSearchContent.tsx +484 -0
  546. package/components/messages/CompactBoundaryMessage.tsx +18 -0
  547. package/components/messages/GroupedToolUseContent.tsx +58 -0
  548. package/components/messages/HighlightedThinkingText.tsx +162 -0
  549. package/components/messages/HookProgressMessage.tsx +116 -0
  550. package/components/messages/PlanApprovalMessage.tsx +222 -0
  551. package/components/messages/RateLimitMessage.tsx +161 -0
  552. package/components/messages/ShutdownMessage.tsx +132 -0
  553. package/components/messages/SystemAPIErrorMessage.tsx +141 -0
  554. package/components/messages/SystemTextMessage.tsx +827 -0
  555. package/components/messages/TaskAssignmentMessage.tsx +76 -0
  556. package/components/messages/UserAgentNotificationMessage.tsx +83 -0
  557. package/components/messages/UserBashInputMessage.tsx +58 -0
  558. package/components/messages/UserBashOutputMessage.tsx +54 -0
  559. package/components/messages/UserChannelMessage.tsx +137 -0
  560. package/components/messages/UserCommandMessage.tsx +108 -0
  561. package/components/messages/UserImageMessage.tsx +59 -0
  562. package/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  563. package/components/messages/UserMemoryInputMessage.tsx +75 -0
  564. package/components/messages/UserPlanMessage.tsx +42 -0
  565. package/components/messages/UserPromptMessage.tsx +80 -0
  566. package/components/messages/UserResourceUpdateMessage.tsx +121 -0
  567. package/components/messages/UserTeammateMessage.tsx +206 -0
  568. package/components/messages/UserTextMessage.tsx +275 -0
  569. package/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  570. package/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  571. package/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  572. package/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  573. package/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  574. package/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  575. package/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  576. package/components/messages/UserToolResultMessage/utils.tsx +44 -0
  577. package/components/messages/nullRenderingAttachments.ts +70 -0
  578. package/components/messages/teamMemCollapsed.tsx +140 -0
  579. package/components/messages/teamMemSaved.ts +19 -0
  580. package/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  581. package/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  582. package/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  583. package/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  584. package/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  585. package/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  586. package/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  587. package/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  588. package/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  589. package/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  590. package/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  591. package/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  592. package/components/permissions/FallbackPermissionRequest.tsx +333 -0
  593. package/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  594. package/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  595. package/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  596. package/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  597. package/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  598. package/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  599. package/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  600. package/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  601. package/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  602. package/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  603. package/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  604. package/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  605. package/components/permissions/PermissionDialog.tsx +72 -0
  606. package/components/permissions/PermissionExplanation.tsx +272 -0
  607. package/components/permissions/PermissionPrompt.tsx +336 -0
  608. package/components/permissions/PermissionRequest.tsx +217 -0
  609. package/components/permissions/PermissionRequestTitle.tsx +66 -0
  610. package/components/permissions/PermissionRuleExplanation.tsx +121 -0
  611. package/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  612. package/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  613. package/components/permissions/SandboxPermissionRequest.tsx +163 -0
  614. package/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  615. package/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  616. package/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  617. package/components/permissions/WorkerBadge.tsx +49 -0
  618. package/components/permissions/WorkerPendingPermission.tsx +105 -0
  619. package/components/permissions/hooks.ts +209 -0
  620. package/components/permissions/rules/AddPermissionRules.tsx +180 -0
  621. package/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  622. package/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  623. package/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  624. package/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  625. package/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  626. package/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  627. package/components/permissions/rules/WorkspaceTab.tsx +150 -0
  628. package/components/permissions/shellPermissionHelpers.tsx +164 -0
  629. package/components/permissions/useShellPermissionFeedback.ts +148 -0
  630. package/components/permissions/utils.ts +25 -0
  631. package/components/sandbox/SandboxConfigTab.tsx +45 -0
  632. package/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  633. package/components/sandbox/SandboxDoctorSection.tsx +46 -0
  634. package/components/sandbox/SandboxOverridesTab.tsx +193 -0
  635. package/components/sandbox/SandboxSettings.tsx +296 -0
  636. package/components/shell/ExpandShellOutputContext.tsx +36 -0
  637. package/components/shell/OutputLine.tsx +118 -0
  638. package/components/shell/ShellProgressMessage.tsx +150 -0
  639. package/components/shell/ShellTimeDisplay.tsx +74 -0
  640. package/components/skills/SkillsMenu.tsx +237 -0
  641. package/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  642. package/components/tasks/BackgroundTask.tsx +345 -0
  643. package/components/tasks/BackgroundTaskStatus.tsx +429 -0
  644. package/components/tasks/BackgroundTasksDialog.tsx +652 -0
  645. package/components/tasks/DreamDetailDialog.tsx +251 -0
  646. package/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  647. package/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  648. package/components/tasks/RemoteSessionProgress.tsx +243 -0
  649. package/components/tasks/ShellDetailDialog.tsx +404 -0
  650. package/components/tasks/ShellProgress.tsx +87 -0
  651. package/components/tasks/renderToolActivity.tsx +33 -0
  652. package/components/tasks/taskStatusUtils.tsx +107 -0
  653. package/components/teams/TeamStatus.tsx +80 -0
  654. package/components/teams/TeamsDialog.tsx +715 -0
  655. package/components/ui/OrderedList.tsx +71 -0
  656. package/components/ui/OrderedListItem.tsx +45 -0
  657. package/components/ui/TreeSelect.tsx +397 -0
  658. package/components/wizard/WizardDialogLayout.tsx +65 -0
  659. package/components/wizard/WizardNavigationFooter.tsx +24 -0
  660. package/components/wizard/WizardProvider.tsx +213 -0
  661. package/components/wizard/index.ts +9 -0
  662. package/components/wizard/useWizard.ts +13 -0
  663. package/context.ts +189 -0
  664. package/cost-tracker.ts +323 -0
  665. package/history.ts +464 -0
  666. package/hooks/fileSuggestions.ts +811 -0
  667. package/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  668. package/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  669. package/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  670. package/hooks/notifs/useFastModeNotification.tsx +162 -0
  671. package/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  672. package/hooks/notifs/useInstallMessages.tsx +26 -0
  673. package/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  674. package/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  675. package/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  676. package/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  677. package/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  678. package/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  679. package/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  680. package/hooks/notifs/useSettingsErrors.tsx +69 -0
  681. package/hooks/notifs/useStartupNotification.ts +41 -0
  682. package/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  683. package/hooks/renderPlaceholder.ts +51 -0
  684. package/hooks/toolPermission/PermissionContext.ts +388 -0
  685. package/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  686. package/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  687. package/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  688. package/hooks/toolPermission/permissionLogging.ts +238 -0
  689. package/hooks/unifiedSuggestions.ts +202 -0
  690. package/hooks/useAfterFirstRender.ts +17 -0
  691. package/hooks/useApiKeyVerification.ts +84 -0
  692. package/hooks/useArrowKeyHistory.tsx +229 -0
  693. package/hooks/useAssistantHistory.ts +250 -0
  694. package/hooks/useAwaySummary.ts +125 -0
  695. package/hooks/useBackgroundTaskNavigation.ts +251 -0
  696. package/hooks/useBlink.ts +34 -0
  697. package/hooks/useCanUseTool.tsx +204 -0
  698. package/hooks/useCancelRequest.ts +276 -0
  699. package/hooks/useChromeExtensionNotification.tsx +50 -0
  700. package/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  701. package/hooks/useClipboardImageHint.ts +77 -0
  702. package/hooks/useCommandKeybindings.tsx +108 -0
  703. package/hooks/useCommandQueue.ts +15 -0
  704. package/hooks/useCopyOnSelect.ts +98 -0
  705. package/hooks/useDeferredHookMessages.ts +46 -0
  706. package/hooks/useDiffData.ts +110 -0
  707. package/hooks/useDiffInIDE.ts +379 -0
  708. package/hooks/useDirectConnect.ts +229 -0
  709. package/hooks/useDoublePress.ts +62 -0
  710. package/hooks/useDynamicConfig.ts +22 -0
  711. package/hooks/useElapsedTime.ts +37 -0
  712. package/hooks/useExitOnCtrlCD.ts +95 -0
  713. package/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  714. package/hooks/useFileHistorySnapshotInit.ts +25 -0
  715. package/hooks/useGlobalKeybindings.tsx +249 -0
  716. package/hooks/useHistorySearch.ts +303 -0
  717. package/hooks/useIDEIntegration.tsx +70 -0
  718. package/hooks/useIdeAtMentioned.ts +76 -0
  719. package/hooks/useIdeConnectionStatus.ts +33 -0
  720. package/hooks/useIdeLogging.ts +41 -0
  721. package/hooks/useIdeSelection.ts +150 -0
  722. package/hooks/useInboxPoller.ts +969 -0
  723. package/hooks/useInputBuffer.ts +132 -0
  724. package/hooks/useIssueFlagBanner.ts +133 -0
  725. package/hooks/useLogMessages.ts +119 -0
  726. package/hooks/useLspPluginRecommendation.tsx +194 -0
  727. package/hooks/useMailboxBridge.ts +21 -0
  728. package/hooks/useMainLoopModel.ts +34 -0
  729. package/hooks/useManagePlugins.ts +304 -0
  730. package/hooks/useMemoryUsage.ts +39 -0
  731. package/hooks/useMergedClients.ts +23 -0
  732. package/hooks/useMergedCommands.ts +15 -0
  733. package/hooks/useMergedTools.ts +44 -0
  734. package/hooks/useMinDisplayTime.ts +35 -0
  735. package/hooks/useNotifyAfterTimeout.ts +65 -0
  736. package/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  737. package/hooks/usePasteHandler.ts +285 -0
  738. package/hooks/usePluginRecommendationBase.tsx +105 -0
  739. package/hooks/usePrStatus.ts +106 -0
  740. package/hooks/usePromptSuggestion.ts +177 -0
  741. package/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  742. package/hooks/useQueueProcessor.ts +68 -0
  743. package/hooks/useRemoteSession.ts +605 -0
  744. package/hooks/useReplBridge.tsx +723 -0
  745. package/hooks/useSSHSession.ts +241 -0
  746. package/hooks/useScheduledTasks.ts +139 -0
  747. package/hooks/useSearchInput.ts +364 -0
  748. package/hooks/useSessionBackgrounding.ts +158 -0
  749. package/hooks/useSettings.ts +17 -0
  750. package/hooks/useSettingsChange.ts +25 -0
  751. package/hooks/useSkillImprovementSurvey.ts +105 -0
  752. package/hooks/useSkillsChange.ts +62 -0
  753. package/hooks/useSwarmInitialization.ts +81 -0
  754. package/hooks/useSwarmPermissionPoller.ts +330 -0
  755. package/hooks/useTaskListWatcher.ts +221 -0
  756. package/hooks/useTasksV2.ts +250 -0
  757. package/hooks/useTeammateViewAutoExit.ts +63 -0
  758. package/hooks/useTeleportResume.tsx +85 -0
  759. package/hooks/useTerminalSize.ts +15 -0
  760. package/hooks/useTextInput.ts +529 -0
  761. package/hooks/useTimeout.ts +14 -0
  762. package/hooks/useTurnDiffs.ts +213 -0
  763. package/hooks/useTypeahead.tsx +1385 -0
  764. package/hooks/useUpdateNotification.ts +34 -0
  765. package/hooks/useVimInput.ts +316 -0
  766. package/hooks/useVirtualScroll.ts +721 -0
  767. package/hooks/useVoice.ts +1144 -0
  768. package/hooks/useVoiceEnabled.ts +25 -0
  769. package/hooks/useVoiceIntegration.tsx +677 -0
  770. package/ink/Ansi.tsx +292 -0
  771. package/ink/bidi.ts +139 -0
  772. package/ink/clearTerminal.ts +74 -0
  773. package/ink/colorize.ts +231 -0
  774. package/ink/components/AlternateScreen.tsx +80 -0
  775. package/ink/components/App.tsx +658 -0
  776. package/ink/components/AppContext.ts +21 -0
  777. package/ink/components/Box.tsx +214 -0
  778. package/ink/components/Button.tsx +192 -0
  779. package/ink/components/ClockContext.tsx +112 -0
  780. package/ink/components/CursorDeclarationContext.ts +32 -0
  781. package/ink/components/ErrorOverview.tsx +109 -0
  782. package/ink/components/Link.tsx +42 -0
  783. package/ink/components/Newline.tsx +39 -0
  784. package/ink/components/NoSelect.tsx +68 -0
  785. package/ink/components/RawAnsi.tsx +57 -0
  786. package/ink/components/ScrollBox.tsx +237 -0
  787. package/ink/components/Spacer.tsx +20 -0
  788. package/ink/components/StdinContext.ts +49 -0
  789. package/ink/components/TerminalFocusContext.tsx +52 -0
  790. package/ink/components/TerminalSizeContext.tsx +7 -0
  791. package/ink/components/Text.tsx +254 -0
  792. package/ink/constants.ts +2 -0
  793. package/ink/dom.ts +484 -0
  794. package/ink/events/click-event.ts +38 -0
  795. package/ink/events/dispatcher.ts +233 -0
  796. package/ink/events/emitter.ts +39 -0
  797. package/ink/events/event-handlers.ts +73 -0
  798. package/ink/events/event.ts +11 -0
  799. package/ink/events/focus-event.ts +21 -0
  800. package/ink/events/input-event.ts +205 -0
  801. package/ink/events/keyboard-event.ts +51 -0
  802. package/ink/events/terminal-event.ts +107 -0
  803. package/ink/events/terminal-focus-event.ts +19 -0
  804. package/ink/focus.ts +181 -0
  805. package/ink/frame.ts +124 -0
  806. package/ink/get-max-width.ts +27 -0
  807. package/ink/global.d.ts +26 -0
  808. package/ink/hit-test.ts +130 -0
  809. package/ink/hooks/use-animation-frame.ts +57 -0
  810. package/ink/hooks/use-app.ts +8 -0
  811. package/ink/hooks/use-declared-cursor.ts +73 -0
  812. package/ink/hooks/use-input.ts +92 -0
  813. package/ink/hooks/use-interval.ts +67 -0
  814. package/ink/hooks/use-search-highlight.ts +53 -0
  815. package/ink/hooks/use-selection.ts +104 -0
  816. package/ink/hooks/use-stdin.ts +8 -0
  817. package/ink/hooks/use-tab-status.ts +72 -0
  818. package/ink/hooks/use-terminal-focus.ts +16 -0
  819. package/ink/hooks/use-terminal-title.ts +31 -0
  820. package/ink/hooks/use-terminal-viewport.ts +96 -0
  821. package/ink/ink.tsx +1754 -0
  822. package/ink/instances.ts +10 -0
  823. package/ink/layout/engine.ts +6 -0
  824. package/ink/layout/geometry.ts +97 -0
  825. package/ink/layout/node.ts +152 -0
  826. package/ink/layout/yoga.ts +308 -0
  827. package/ink/line-width-cache.ts +24 -0
  828. package/ink/log-update.ts +773 -0
  829. package/ink/measure-element.ts +23 -0
  830. package/ink/measure-text.ts +47 -0
  831. package/ink/node-cache.ts +54 -0
  832. package/ink/optimizer.ts +93 -0
  833. package/ink/output.ts +797 -0
  834. package/ink/parse-keypress.ts +801 -0
  835. package/ink/reconciler.ts +512 -0
  836. package/ink/render-border.ts +231 -0
  837. package/ink/render-node-to-output.ts +1462 -0
  838. package/ink/render-to-screen.ts +231 -0
  839. package/ink/renderer.ts +178 -0
  840. package/ink/root.ts +184 -0
  841. package/ink/screen.ts +1486 -0
  842. package/ink/searchHighlight.ts +93 -0
  843. package/ink/selection.ts +917 -0
  844. package/ink/squash-text-nodes.ts +92 -0
  845. package/ink/stringWidth.ts +223 -0
  846. package/ink/styles.ts +771 -0
  847. package/ink/supports-hyperlinks.ts +57 -0
  848. package/ink/tabstops.ts +46 -0
  849. package/ink/terminal-focus-state.ts +47 -0
  850. package/ink/terminal-querier.ts +212 -0
  851. package/ink/terminal.ts +248 -0
  852. package/ink/termio/ansi.ts +75 -0
  853. package/ink/termio/csi.ts +319 -0
  854. package/ink/termio/dec.ts +60 -0
  855. package/ink/termio/esc.ts +67 -0
  856. package/ink/termio/osc.ts +493 -0
  857. package/ink/termio/parser.ts +394 -0
  858. package/ink/termio/sgr.ts +308 -0
  859. package/ink/termio/tokenize.ts +319 -0
  860. package/ink/termio/types.ts +236 -0
  861. package/ink/termio.ts +42 -0
  862. package/ink/useTerminalNotification.ts +126 -0
  863. package/ink/warn.ts +9 -0
  864. package/ink/widest-line.ts +19 -0
  865. package/ink/wrap-text.ts +74 -0
  866. package/ink/wrapAnsi.ts +20 -0
  867. package/inspect.js +7 -0
  868. package/keybindings/KeybindingContext.tsx +243 -0
  869. package/keybindings/KeybindingProviderSetup.tsx +308 -0
  870. package/keybindings/defaultBindings.ts +340 -0
  871. package/keybindings/loadUserBindings.ts +472 -0
  872. package/keybindings/match.ts +120 -0
  873. package/keybindings/parser.ts +203 -0
  874. package/keybindings/reservedShortcuts.ts +127 -0
  875. package/keybindings/resolver.ts +244 -0
  876. package/keybindings/schema.ts +236 -0
  877. package/keybindings/shortcutFormat.ts +63 -0
  878. package/keybindings/template.ts +52 -0
  879. package/keybindings/useKeybinding.ts +196 -0
  880. package/keybindings/useShortcutDisplay.ts +59 -0
  881. package/keybindings/validate.ts +498 -0
  882. package/macro.ts +24 -0
  883. package/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  884. package/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  885. package/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  886. package/migrations/migrateFennecToOpus.ts +45 -0
  887. package/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  888. package/migrations/migrateOpusToOpus1m.ts +43 -0
  889. package/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  890. package/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  891. package/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  892. package/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  893. package/migrations/resetProToOpusDefault.ts +51 -0
  894. package/package.json +29 -3
  895. package/patch-box.js +54 -0
  896. package/patch-compact.js +13 -0
  897. package/patch-condensed-center.js +13 -0
  898. package/patch-condensed-row.js +13 -0
  899. package/patch-condensed.js +13 -0
  900. package/patch-final.js +58 -0
  901. package/patch-input-body.js +46 -0
  902. package/patch-input-body2.js +35 -0
  903. package/patch-input-style.js +13 -0
  904. package/patch-input-width.js +13 -0
  905. package/patch-layout.js +87 -0
  906. package/patch-logo-row.js +12 -0
  907. package/patch-width.js +13 -0
  908. package/patch-width2.js +13 -0
  909. package/patch2.js +74 -0
  910. package/patch3.js +13 -0
  911. package/query.ts +1750 -0
  912. package/remote/RemoteSessionManager.ts +343 -0
  913. package/remote/SessionsWebSocket.ts +404 -0
  914. package/remote/remotePermissionBridge.ts +78 -0
  915. package/remote/sdkMessageAdapter.ts +302 -0
  916. package/skills/bundled/batch.ts +124 -0
  917. package/skills/bundled/claudeApi.ts +196 -0
  918. package/skills/bundled/claudeApiContent.ts +75 -0
  919. package/skills/bundled/claudeInChrome.ts +34 -0
  920. package/skills/bundled/debug.ts +103 -0
  921. package/skills/bundled/index.ts +79 -0
  922. package/skills/bundled/keybindings.ts +339 -0
  923. package/skills/bundled/loop.ts +92 -0
  924. package/skills/bundled/loremIpsum.ts +282 -0
  925. package/skills/bundled/remember.ts +82 -0
  926. package/skills/bundled/scheduleRemoteAgents.ts +447 -0
  927. package/skills/bundled/simplify.ts +69 -0
  928. package/skills/bundled/skillify.ts +197 -0
  929. package/skills/bundled/stuck.ts +79 -0
  930. package/skills/bundled/updateConfig.ts +475 -0
  931. package/skills/bundled/verify/SKILL.md +3 -0
  932. package/skills/bundled/verify/examples/cli.md +3 -0
  933. package/skills/bundled/verify/examples/server.md +3 -0
  934. package/skills/bundled/verify.ts +30 -0
  935. package/skills/bundled/verifyContent.ts +13 -0
  936. package/skills/bundledSkills.ts +220 -0
  937. package/skills/loadSkillsDir.ts +1086 -0
  938. package/skills/mcpSkillBuilders.ts +44 -0
  939. package/state/AppState.tsx +200 -0
  940. package/state/AppStateStore.ts +569 -0
  941. package/state/onChangeAppState.ts +171 -0
  942. package/state/selectors.ts +76 -0
  943. package/state/store.ts +34 -0
  944. package/state/teammateViewHelpers.ts +141 -0
  945. package/tasks/DreamTask/DreamTask.ts +157 -0
  946. package/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  947. package/tasks/InProcessTeammateTask/types.ts +121 -0
  948. package/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  949. package/tasks/LocalMainSessionTask.ts +479 -0
  950. package/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  951. package/tasks/LocalShellTask/guards.ts +41 -0
  952. package/tasks/LocalShellTask/killShellTasks.ts +76 -0
  953. package/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  954. package/tasks/pillLabel.ts +82 -0
  955. package/tasks/stopTask.ts +100 -0
  956. package/tasks/types.ts +46 -0
  957. package/types/command.ts +216 -0
  958. package/types/connectorText.ts +13 -0
  959. package/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  960. package/types/generated/events_mono/common/v1/auth.ts +100 -0
  961. package/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  962. package/types/generated/google/protobuf/timestamp.ts +187 -0
  963. package/types/hooks.ts +290 -0
  964. package/types/ids.ts +44 -0
  965. package/types/logs.ts +330 -0
  966. package/types/permissions.ts +441 -0
  967. package/types/plugin.ts +363 -0
  968. package/types/textInputTypes.ts +387 -0
@@ -0,0 +1,324 @@
1
+ import { feature } from 'bun:bundle';
2
+ import * as React from 'react';
3
+ import { memo, useCallback, useEffect, useRef } from 'react';
4
+ import { logEvent } from 'src/services/analytics/index.js';
5
+ import { useAppState, useSetAppState } from 'src/state/AppState.js';
6
+ import type { PermissionMode } from 'src/utils/permissions/PermissionMode.js';
7
+ import { getIsRemoteMode, getKairosActive, getMainThreadAgentType, getOriginalCwd, getSdkBetas, getSessionId } from '../bootstrap/state.js';
8
+ import { DEFAULT_OUTPUT_STYLE_NAME } from '../constants/outputStyles.js';
9
+ import { useNotifications } from '../context/notifications.js';
10
+ import { getTotalAPIDuration, getTotalCost, getTotalDuration, getTotalInputTokens, getTotalLinesAdded, getTotalLinesRemoved, getTotalOutputTokens } from '../cost-tracker.js';
11
+ import { useMainLoopModel } from '../hooks/useMainLoopModel.js';
12
+ import { type ReadonlySettings, useSettings } from '../hooks/useSettings.js';
13
+ import { Ansi, Box, Text } from '../ink.js';
14
+ import { getRawUtilization } from '../services/claudeAiLimits.js';
15
+ import type { Message } from '../types/message.js';
16
+ import type { StatusLineCommandInput } from '../types/statusLine.js';
17
+ import type { VimMode } from '../types/textInputTypes.js';
18
+ import { checkHasTrustDialogAccepted } from '../utils/config.js';
19
+ import { calculateContextPercentages, getContextWindowForModel } from '../utils/context.js';
20
+ import { getCwd } from '../utils/cwd.js';
21
+ import { logForDebugging } from '../utils/debug.js';
22
+ import { isFullscreenEnvEnabled } from '../utils/fullscreen.js';
23
+ import { createBaseHookInput, executeStatusLineCommand } from '../utils/hooks.js';
24
+ import { getLastAssistantMessage } from '../utils/messages.js';
25
+ import { getRuntimeMainLoopModel, type ModelName, renderModelName } from '../utils/model/model.js';
26
+ import { getCurrentSessionTitle } from '../utils/sessionStorage.js';
27
+ import { doesMostRecentAssistantMessageExceed200k, getCurrentUsage } from '../utils/tokens.js';
28
+ import { getCurrentWorktreeSession } from '../utils/worktree.js';
29
+ import { isVimModeEnabled } from './PromptInput/utils.js';
30
+ export function statusLineShouldDisplay(settings: ReadonlySettings): boolean {
31
+ // Assistant mode: statusline fields (model, permission mode, cwd) reflect the
32
+ // REPL/daemon process, not what the agent child is actually running. Hide it.
33
+ if (feature('KAIROS') && getKairosActive()) return false;
34
+ return settings?.statusLine !== undefined;
35
+ }
36
+ function buildStatusLineCommandInput(permissionMode: PermissionMode, exceeds200kTokens: boolean, settings: ReadonlySettings, messages: Message[], addedDirs: string[], mainLoopModel: ModelName, vimMode?: VimMode): StatusLineCommandInput {
37
+ const agentType = getMainThreadAgentType();
38
+ const worktreeSession = getCurrentWorktreeSession();
39
+ const runtimeModel = getRuntimeMainLoopModel({
40
+ permissionMode,
41
+ mainLoopModel,
42
+ exceeds200kTokens
43
+ });
44
+ const outputStyleName = settings?.outputStyle || DEFAULT_OUTPUT_STYLE_NAME;
45
+ const currentUsage = getCurrentUsage(messages);
46
+ const contextWindowSize = getContextWindowForModel(runtimeModel, getSdkBetas());
47
+ const contextPercentages = calculateContextPercentages(currentUsage, contextWindowSize);
48
+ const sessionId = getSessionId();
49
+ const sessionName = getCurrentSessionTitle(sessionId);
50
+ const rawUtil = getRawUtilization();
51
+ const rateLimits: StatusLineCommandInput['rate_limits'] = {
52
+ ...(rawUtil.five_hour && {
53
+ five_hour: {
54
+ used_percentage: rawUtil.five_hour.utilization * 100,
55
+ resets_at: rawUtil.five_hour.resets_at
56
+ }
57
+ }),
58
+ ...(rawUtil.seven_day && {
59
+ seven_day: {
60
+ used_percentage: rawUtil.seven_day.utilization * 100,
61
+ resets_at: rawUtil.seven_day.resets_at
62
+ }
63
+ })
64
+ };
65
+ return {
66
+ ...createBaseHookInput(),
67
+ ...(sessionName && {
68
+ session_name: sessionName
69
+ }),
70
+ model: {
71
+ id: runtimeModel,
72
+ display_name: renderModelName(runtimeModel)
73
+ },
74
+ workspace: {
75
+ current_dir: getCwd(),
76
+ project_dir: getOriginalCwd(),
77
+ added_dirs: addedDirs
78
+ },
79
+ version: MACRO.VERSION,
80
+ output_style: {
81
+ name: outputStyleName
82
+ },
83
+ cost: {
84
+ total_cost_usd: getTotalCost(),
85
+ total_duration_ms: getTotalDuration(),
86
+ total_api_duration_ms: getTotalAPIDuration(),
87
+ total_lines_added: getTotalLinesAdded(),
88
+ total_lines_removed: getTotalLinesRemoved()
89
+ },
90
+ context_window: {
91
+ total_input_tokens: getTotalInputTokens(),
92
+ total_output_tokens: getTotalOutputTokens(),
93
+ context_window_size: contextWindowSize,
94
+ current_usage: currentUsage,
95
+ used_percentage: contextPercentages.used,
96
+ remaining_percentage: contextPercentages.remaining
97
+ },
98
+ exceeds_200k_tokens: exceeds200kTokens,
99
+ ...((rateLimits.five_hour || rateLimits.seven_day) && {
100
+ rate_limits: rateLimits
101
+ }),
102
+ ...(isVimModeEnabled() && {
103
+ vim: {
104
+ mode: vimMode ?? 'INSERT'
105
+ }
106
+ }),
107
+ ...(agentType && {
108
+ agent: {
109
+ name: agentType
110
+ }
111
+ }),
112
+ ...(getIsRemoteMode() && {
113
+ remote: {
114
+ session_id: getSessionId()
115
+ }
116
+ }),
117
+ ...(worktreeSession && {
118
+ worktree: {
119
+ name: worktreeSession.worktreeName,
120
+ path: worktreeSession.worktreePath,
121
+ branch: worktreeSession.worktreeBranch,
122
+ original_cwd: worktreeSession.originalCwd,
123
+ original_branch: worktreeSession.originalBranch
124
+ }
125
+ })
126
+ };
127
+ }
128
+ type Props = {
129
+ // messages stays behind a ref (read only in the debounced callback);
130
+ // lastAssistantMessageId is the actual re-render trigger.
131
+ messagesRef: React.RefObject<Message[]>;
132
+ lastAssistantMessageId: string | null;
133
+ vimMode?: VimMode;
134
+ };
135
+ export function getLastAssistantMessageId(messages: Message[]): string | null {
136
+ return getLastAssistantMessage(messages)?.uuid ?? null;
137
+ }
138
+ function StatusLineInner({
139
+ messagesRef,
140
+ lastAssistantMessageId,
141
+ vimMode
142
+ }: Props): React.ReactNode {
143
+ const abortControllerRef = useRef<AbortController | undefined>(undefined);
144
+ const permissionMode = useAppState(s => s.toolPermissionContext.mode);
145
+ const additionalWorkingDirectories = useAppState(s => s.toolPermissionContext.additionalWorkingDirectories);
146
+ const statusLineText = useAppState(s => s.statusLineText);
147
+ const setAppState = useSetAppState();
148
+ const settings = useSettings();
149
+ const {
150
+ addNotification
151
+ } = useNotifications();
152
+ // AppState-sourced model — same source as API requests. getMainLoopModel()
153
+ // re-reads settings.json on every call, so another session's /model write
154
+ // would leak into this session's statusline (anthropics/claude-code#37596).
155
+ const mainLoopModel = useMainLoopModel();
156
+
157
+ // Keep latest values in refs for stable callback access
158
+ const settingsRef = useRef(settings);
159
+ settingsRef.current = settings;
160
+ const vimModeRef = useRef(vimMode);
161
+ vimModeRef.current = vimMode;
162
+ const permissionModeRef = useRef(permissionMode);
163
+ permissionModeRef.current = permissionMode;
164
+ const addedDirsRef = useRef(additionalWorkingDirectories);
165
+ addedDirsRef.current = additionalWorkingDirectories;
166
+ const mainLoopModelRef = useRef(mainLoopModel);
167
+ mainLoopModelRef.current = mainLoopModel;
168
+
169
+ // Track previous state to detect changes and cache expensive calculations
170
+ const previousStateRef = useRef<{
171
+ messageId: string | null;
172
+ exceeds200kTokens: boolean;
173
+ permissionMode: PermissionMode;
174
+ vimMode: VimMode | undefined;
175
+ mainLoopModel: ModelName;
176
+ }>({
177
+ messageId: null,
178
+ exceeds200kTokens: false,
179
+ permissionMode,
180
+ vimMode,
181
+ mainLoopModel
182
+ });
183
+
184
+ // Debounce timer ref
185
+ const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
186
+
187
+ // True when the next invocation should log its result (first run or after settings reload)
188
+ const logNextResultRef = useRef(true);
189
+
190
+ // Stable update function — reads latest values from refs
191
+ const doUpdate = useCallback(async () => {
192
+ // Cancel any in-flight requests
193
+ abortControllerRef.current?.abort();
194
+ const controller = new AbortController();
195
+ abortControllerRef.current = controller;
196
+ const msgs = messagesRef.current;
197
+ const logResult = logNextResultRef.current;
198
+ logNextResultRef.current = false;
199
+ try {
200
+ let exceeds200kTokens = previousStateRef.current.exceeds200kTokens;
201
+
202
+ // Only recalculate 200k check if messages changed
203
+ const currentMessageId = getLastAssistantMessageId(msgs);
204
+ if (currentMessageId !== previousStateRef.current.messageId) {
205
+ exceeds200kTokens = doesMostRecentAssistantMessageExceed200k(msgs);
206
+ previousStateRef.current.messageId = currentMessageId;
207
+ previousStateRef.current.exceeds200kTokens = exceeds200kTokens;
208
+ }
209
+ const statusInput = buildStatusLineCommandInput(permissionModeRef.current, exceeds200kTokens, settingsRef.current, msgs, Array.from(addedDirsRef.current.keys()), mainLoopModelRef.current, vimModeRef.current);
210
+ const text = await executeStatusLineCommand(statusInput, controller.signal, undefined, logResult);
211
+ if (!controller.signal.aborted) {
212
+ setAppState(prev => {
213
+ if (prev.statusLineText === text) return prev;
214
+ return {
215
+ ...prev,
216
+ statusLineText: text
217
+ };
218
+ });
219
+ }
220
+ } catch {
221
+ // Silently ignore errors in status line updates
222
+ }
223
+ }, [messagesRef, setAppState]);
224
+
225
+ // Stable debounced schedule function — no deps, uses refs
226
+ const scheduleUpdate = useCallback(() => {
227
+ if (debounceTimerRef.current !== undefined) {
228
+ clearTimeout(debounceTimerRef.current);
229
+ }
230
+ debounceTimerRef.current = setTimeout((ref, doUpdate) => {
231
+ ref.current = undefined;
232
+ void doUpdate();
233
+ }, 300, debounceTimerRef, doUpdate);
234
+ }, [doUpdate]);
235
+
236
+ // Only trigger update when assistant message, permission mode, vim mode, or model actually changes
237
+ useEffect(() => {
238
+ if (lastAssistantMessageId !== previousStateRef.current.messageId || permissionMode !== previousStateRef.current.permissionMode || vimMode !== previousStateRef.current.vimMode || mainLoopModel !== previousStateRef.current.mainLoopModel) {
239
+ // Don't update messageId here — let doUpdate handle it so
240
+ // exceeds200kTokens is recalculated with the latest messages
241
+ previousStateRef.current.permissionMode = permissionMode;
242
+ previousStateRef.current.vimMode = vimMode;
243
+ previousStateRef.current.mainLoopModel = mainLoopModel;
244
+ scheduleUpdate();
245
+ }
246
+ }, [lastAssistantMessageId, permissionMode, vimMode, mainLoopModel, scheduleUpdate]);
247
+
248
+ // When the statusLine command changes (hot reload), log the next result
249
+ const statusLineCommand = settings?.statusLine?.command;
250
+ const isFirstSettingsRender = useRef(true);
251
+ useEffect(() => {
252
+ if (isFirstSettingsRender.current) {
253
+ isFirstSettingsRender.current = false;
254
+ return;
255
+ }
256
+ logNextResultRef.current = true;
257
+ void doUpdate();
258
+ }, [statusLineCommand, doUpdate]);
259
+
260
+ // Separate effect for logging on mount
261
+ useEffect(() => {
262
+ const statusLine = settings?.statusLine;
263
+ if (statusLine) {
264
+ logEvent('tengu_status_line_mount', {
265
+ command_length: statusLine.command.length,
266
+ padding: statusLine.padding
267
+ });
268
+ // Log if status line is configured but disabled by disableAllHooks
269
+ if (settings.disableAllHooks === true) {
270
+ logForDebugging('Status line is configured but disableAllHooks is true', {
271
+ level: 'warn'
272
+ });
273
+ }
274
+ // executeStatusLineCommand (hooks.ts) returns undefined when trust is
275
+ // blocked — statusLineText stays undefined forever, user sees nothing,
276
+ // and tengu_status_line_mount above fires anyway so telemetry looks fine.
277
+ if (!checkHasTrustDialogAccepted()) {
278
+ addNotification({
279
+ key: 'statusline-trust-blocked',
280
+ text: 'statusline skipped · restart to fix',
281
+ color: 'warning',
282
+ priority: 'low'
283
+ });
284
+ logForDebugging('Status line command skipped: workspace trust not accepted', {
285
+ level: 'warn'
286
+ });
287
+ }
288
+ }
289
+ // eslint-disable-next-line react-hooks/exhaustive-deps
290
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentional
291
+ }, []); // Only run once on mount - settings stable for initial logging
292
+
293
+ // Initial update on mount + cleanup on unmount
294
+ useEffect(() => {
295
+ void doUpdate();
296
+ return () => {
297
+ abortControllerRef.current?.abort();
298
+ if (debounceTimerRef.current !== undefined) {
299
+ clearTimeout(debounceTimerRef.current);
300
+ }
301
+ };
302
+ // eslint-disable-next-line react-hooks/exhaustive-deps
303
+ // biome-ignore lint/correctness/useExhaustiveDependencies: intentional
304
+ }, []); // Only run once on mount, not when doUpdate changes
305
+
306
+ // Get padding from settings or default to 0
307
+ const paddingX = settings?.statusLine?.padding ?? 0;
308
+
309
+ // StatusLine must have stable height in fullscreen — the footer is
310
+ // flexShrink:0 so a 0→1 row change when the command finishes steals
311
+ // a row from ScrollBox and shifts content. Reserve the row while loading
312
+ // (same trick as PromptInputFooterLeftSide).
313
+ return <Box paddingX={paddingX} gap={2}>
314
+ {statusLineText ? <Text dimColor wrap="truncate">
315
+ <Ansi>{statusLineText}</Ansi>
316
+ </Text> : isFullscreenEnvEnabled() ? <Text> </Text> : null}
317
+ </Box>;
318
+ }
319
+
320
+ // Parent (PromptInputFooter) re-renders on every setMessages, but StatusLine's
321
+ // own props now only change when lastAssistantMessageId flips — memo keeps it
322
+ // from being dragged along (previously ~18 no-prop-change renders per session).
323
+ export const StatusLine = memo(StatusLineInner);
324
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZWF0dXJlIiwiUmVhY3QiLCJtZW1vIiwidXNlQ2FsbGJhY2siLCJ1c2VFZmZlY3QiLCJ1c2VSZWYiLCJsb2dFdmVudCIsInVzZUFwcFN0YXRlIiwidXNlU2V0QXBwU3RhdGUiLCJQZXJtaXNzaW9uTW9kZSIsImdldElzUmVtb3RlTW9kZSIsImdldEthaXJvc0FjdGl2ZSIsImdldE1haW5UaHJlYWRBZ2VudFR5cGUiLCJnZXRPcmlnaW5hbEN3ZCIsImdldFNka0JldGFzIiwiZ2V0U2Vzc2lvbklkIiwiREVGQVVMVF9PVVRQVVRfU1RZTEVfTkFNRSIsInVzZU5vdGlmaWNhdGlvbnMiLCJnZXRUb3RhbEFQSUR1cmF0aW9uIiwiZ2V0VG90YWxDb3N0IiwiZ2V0VG90YWxEdXJhdGlvbiIsImdldFRvdGFsSW5wdXRUb2tlbnMiLCJnZXRUb3RhbExpbmVzQWRkZWQiLCJnZXRUb3RhbExpbmVzUmVtb3ZlZCIsImdldFRvdGFsT3V0cHV0VG9rZW5zIiwidXNlTWFpbkxvb3BNb2RlbCIsIlJlYWRvbmx5U2V0dGluZ3MiLCJ1c2VTZXR0aW5ncyIsIkFuc2kiLCJCb3giLCJUZXh0IiwiZ2V0UmF3VXRpbGl6YXRpb24iLCJNZXNzYWdlIiwiU3RhdHVzTGluZUNvbW1hbmRJbnB1dCIsIlZpbU1vZGUiLCJjaGVja0hhc1RydXN0RGlhbG9nQWNjZXB0ZWQiLCJjYWxjdWxhdGVDb250ZXh0UGVyY2VudGFnZXMiLCJnZXRDb250ZXh0V2luZG93Rm9yTW9kZWwiLCJnZXRDd2QiLCJsb2dGb3JEZWJ1Z2dpbmciLCJpc0Z1bGxzY3JlZW5FbnZFbmFibGVkIiwiY3JlYXRlQmFzZUhvb2tJbnB1dCIsImV4ZWN1dGVTdGF0dXNMaW5lQ29tbWFuZCIsImdldExhc3RBc3Npc3RhbnRNZXNzYWdlIiwiZ2V0UnVudGltZU1haW5Mb29wTW9kZWwiLCJNb2RlbE5hbWUiLCJyZW5kZXJNb2RlbE5hbWUiLCJnZXRDdXJyZW50U2Vzc2lvblRpdGxlIiwiZG9lc01vc3RSZWNlbnRBc3Npc3RhbnRNZXNzYWdlRXhjZWVkMjAwayIsImdldEN1cnJlbnRVc2FnZSIsImdldEN1cnJlbnRXb3JrdHJlZVNlc3Npb24iLCJpc1ZpbU1vZGVFbmFibGVkIiwic3RhdHVzTGluZVNob3VsZERpc3BsYXkiLCJzZXR0aW5ncyIsInN0YXR1c0xpbmUiLCJ1bmRlZmluZWQiLCJidWlsZFN0YXR1c0xpbmVDb21tYW5kSW5wdXQiLCJwZXJtaXNzaW9uTW9kZSIsImV4Y2VlZHMyMDBrVG9rZW5zIiwibWVzc2FnZXMiLCJhZGRlZERpcnMiLCJtYWluTG9vcE1vZGVsIiwidmltTW9kZSIsImFnZW50VHlwZSIsIndvcmt0cmVlU2Vzc2lvbiIsInJ1bnRpbWVNb2RlbCIsIm91dHB1dFN0eWxlTmFtZSIsIm91dHB1dFN0eWxlIiwiY3VycmVudFVzYWdlIiwiY29udGV4dFdpbmRvd1NpemUiLCJjb250ZXh0UGVyY2VudGFnZXMiLCJzZXNzaW9uSWQiLCJzZXNzaW9uTmFtZSIsInJhd1V0aWwiLCJyYXRlTGltaXRzIiwiZml2ZV9ob3VyIiwidXNlZF9wZXJjZW50YWdlIiwidXRpbGl6YXRpb24iLCJyZXNldHNfYXQiLCJzZXZlbl9kYXkiLCJzZXNzaW9uX25hbWUiLCJtb2RlbCIsImlkIiwiZGlzcGxheV9uYW1lIiwid29ya3NwYWNlIiwiY3VycmVudF9kaXIiLCJwcm9qZWN0X2RpciIsImFkZGVkX2RpcnMiLCJ2ZXJzaW9uIiwiTUFDUk8iLCJWRVJTSU9OIiwib3V0cHV0X3N0eWxlIiwibmFtZSIsImNvc3QiLCJ0b3RhbF9jb3N0X3VzZCIsInRvdGFsX2R1cmF0aW9uX21zIiwidG90YWxfYXBpX2R1cmF0aW9uX21zIiwidG90YWxfbGluZXNfYWRkZWQiLCJ0b3RhbF9saW5lc19yZW1vdmVkIiwiY29udGV4dF93aW5kb3ciLCJ0b3RhbF9pbnB1dF90b2tlbnMiLCJ0b3RhbF9vdXRwdXRfdG9rZW5zIiwiY29udGV4dF93aW5kb3dfc2l6ZSIsImN1cnJlbnRfdXNhZ2UiLCJ1c2VkIiwicmVtYWluaW5nX3BlcmNlbnRhZ2UiLCJyZW1haW5pbmciLCJleGNlZWRzXzIwMGtfdG9rZW5zIiwicmF0ZV9saW1pdHMiLCJ2aW0iLCJtb2RlIiwiYWdlbnQiLCJyZW1vdGUiLCJzZXNzaW9uX2lkIiwid29ya3RyZWUiLCJ3b3JrdHJlZU5hbWUiLCJwYXRoIiwid29ya3RyZWVQYXRoIiwiYnJhbmNoIiwid29ya3RyZWVCcmFuY2giLCJvcmlnaW5hbF9jd2QiLCJvcmlnaW5hbEN3ZCIsIm9yaWdpbmFsX2JyYW5jaCIsIm9yaWdpbmFsQnJhbmNoIiwiUHJvcHMiLCJtZXNzYWdlc1JlZiIsIlJlZk9iamVjdCIsImxhc3RBc3Npc3RhbnRNZXNzYWdlSWQiLCJnZXRMYXN0QXNzaXN0YW50TWVzc2FnZUlkIiwidXVpZCIsIlN0YXR1c0xpbmVJbm5lciIsIlJlYWN0Tm9kZSIsImFib3J0Q29udHJvbGxlclJlZiIsIkFib3J0Q29udHJvbGxlciIsInMiLCJ0b29sUGVybWlzc2lvbkNvbnRleHQiLCJhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzIiwic3RhdHVzTGluZVRleHQiLCJzZXRBcHBTdGF0ZSIsImFkZE5vdGlmaWNhdGlvbiIsInNldHRpbmdzUmVmIiwiY3VycmVudCIsInZpbU1vZGVSZWYiLCJwZXJtaXNzaW9uTW9kZVJlZiIsImFkZGVkRGlyc1JlZiIsIm1haW5Mb29wTW9kZWxSZWYiLCJwcmV2aW91c1N0YXRlUmVmIiwibWVzc2FnZUlkIiwiZGVib3VuY2VUaW1lclJlZiIsIlJldHVyblR5cGUiLCJzZXRUaW1lb3V0IiwibG9nTmV4dFJlc3VsdFJlZiIsImRvVXBkYXRlIiwiYWJvcnQiLCJjb250cm9sbGVyIiwibXNncyIsImxvZ1Jlc3VsdCIsImN1cnJlbnRNZXNzYWdlSWQiLCJzdGF0dXNJbnB1dCIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJ0ZXh0Iiwic2lnbmFsIiwiYWJvcnRlZCIsInByZXYiLCJzY2hlZHVsZVVwZGF0ZSIsImNsZWFyVGltZW91dCIsInJlZiIsInN0YXR1c0xpbmVDb21tYW5kIiwiY29tbWFuZCIsImlzRmlyc3RTZXR0aW5nc1JlbmRlciIsImNvbW1hbmRfbGVuZ3RoIiwibGVuZ3RoIiwicGFkZGluZyIsImRpc2FibGVBbGxIb29rcyIsImxldmVsIiwia2V5IiwiY29sb3IiLCJwcmlvcml0eSIsInBhZGRpbmdYIiwiU3RhdHVzTGluZSJdLCJzb3VyY2VzIjpbIlN0YXR1c0xpbmUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZlYXR1cmUgfSBmcm9tICdidW46YnVuZGxlJ1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBtZW1vLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGxvZ0V2ZW50IH0gZnJvbSAnc3JjL3NlcnZpY2VzL2FuYWx5dGljcy9pbmRleC5qcydcbmltcG9ydCB7IHVzZUFwcFN0YXRlLCB1c2VTZXRBcHBTdGF0ZSB9IGZyb20gJ3NyYy9zdGF0ZS9BcHBTdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbk1vZGUgfSBmcm9tICdzcmMvdXRpbHMvcGVybWlzc2lvbnMvUGVybWlzc2lvbk1vZGUuanMnXG5pbXBvcnQge1xuICBnZXRJc1JlbW90ZU1vZGUsXG4gIGdldEthaXJvc0FjdGl2ZSxcbiAgZ2V0TWFpblRocmVhZEFnZW50VHlwZSxcbiAgZ2V0T3JpZ2luYWxDd2QsXG4gIGdldFNka0JldGFzLFxuICBnZXRTZXNzaW9uSWQsXG59IGZyb20gJy4uL2Jvb3RzdHJhcC9zdGF0ZS5qcydcbmltcG9ydCB7IERFRkFVTFRfT1VUUFVUX1NUWUxFX05BTUUgfSBmcm9tICcuLi9jb25zdGFudHMvb3V0cHV0U3R5bGVzLmpzJ1xuaW1wb3J0IHsgdXNlTm90aWZpY2F0aW9ucyB9IGZyb20gJy4uL2NvbnRleHQvbm90aWZpY2F0aW9ucy5qcydcbmltcG9ydCB7XG4gIGdldFRvdGFsQVBJRHVyYXRpb24sXG4gIGdldFRvdGFsQ29zdCxcbiAgZ2V0VG90YWxEdXJhdGlvbixcbiAgZ2V0VG90YWxJbnB1dFRva2VucyxcbiAgZ2V0VG90YWxMaW5lc0FkZGVkLFxuICBnZXRUb3RhbExpbmVzUmVtb3ZlZCxcbiAgZ2V0VG90YWxPdXRwdXRUb2tlbnMsXG59IGZyb20gJy4uL2Nvc3QtdHJhY2tlci5qcydcbmltcG9ydCB7IHVzZU1haW5Mb29wTW9kZWwgfSBmcm9tICcuLi9ob29rcy91c2VNYWluTG9vcE1vZGVsLmpzJ1xuaW1wb3J0IHsgdHlwZSBSZWFkb25seVNldHRpbmdzLCB1c2VTZXR0aW5ncyB9IGZyb20gJy4uL2hvb2tzL3VzZVNldHRpbmdzLmpzJ1xuaW1wb3J0IHsgQW5zaSwgQm94LCBUZXh0IH0gZnJvbSAnLi4vaW5rLmpzJ1xuaW1wb3J0IHsgZ2V0UmF3VXRpbGl6YXRpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9jbGF1ZGVBaUxpbWl0cy5qcydcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXR1c0xpbmVDb21tYW5kSW5wdXQgfSBmcm9tICcuLi90eXBlcy9zdGF0dXNMaW5lLmpzJ1xuaW1wb3J0IHR5cGUgeyBWaW1Nb2RlIH0gZnJvbSAnLi4vdHlwZXMvdGV4dElucHV0VHlwZXMuanMnXG5pbXBvcnQgeyBjaGVja0hhc1RydXN0RGlhbG9nQWNjZXB0ZWQgfSBmcm9tICcuLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQge1xuICBjYWxjdWxhdGVDb250ZXh0UGVyY2VudGFnZXMsXG4gIGdldENvbnRleHRXaW5kb3dGb3JNb2RlbCxcbn0gZnJvbSAnLi4vdXRpbHMvY29udGV4dC5qcydcbmltcG9ydCB7IGdldEN3ZCB9IGZyb20gJy4uL3V0aWxzL2N3ZC5qcydcbmltcG9ydCB7IGxvZ0ZvckRlYnVnZ2luZyB9IGZyb20gJy4uL3V0aWxzL2RlYnVnLmpzJ1xuaW1wb3J0IHsgaXNGdWxsc2NyZWVuRW52RW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzL2Z1bGxzY3JlZW4uanMnXG5pbXBvcnQge1xuICBjcmVhdGVCYXNlSG9va0lucHV0LFxuICBleGVjdXRlU3RhdHVzTGluZUNvbW1hbmQsXG59IGZyb20gJy4uL3V0aWxzL2hvb2tzLmpzJ1xuaW1wb3J0IHsgZ2V0TGFzdEFzc2lzdGFudE1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9tZXNzYWdlcy5qcydcbmltcG9ydCB7XG4gIGdldFJ1bnRpbWVNYWluTG9vcE1vZGVsLFxuICB0eXBlIE1vZGVsTmFtZSxcbiAgcmVuZGVyTW9kZWxOYW1lLFxufSBmcm9tICcuLi91dGlscy9tb2RlbC9tb2RlbC5qcydcbmltcG9ydCB7IGdldEN1cnJlbnRTZXNzaW9uVGl0bGUgfSBmcm9tICcuLi91dGlscy9zZXNzaW9uU3RvcmFnZS5qcydcbmltcG9ydCB7XG4gIGRvZXNNb3N0UmVjZW50QXNzaXN0YW50TWVzc2FnZUV4Y2VlZDIwMGssXG4gIGdldEN1cnJlbnRVc2FnZSxcbn0gZnJvbSAnLi4vdXRpbHMvdG9rZW5zLmpzJ1xuaW1wb3J0IHsgZ2V0Q3VycmVudFdvcmt0cmVlU2Vzc2lvbiB9IGZyb20gJy4uL3V0aWxzL3dvcmt0cmVlLmpzJ1xuaW1wb3J0IHsgaXNWaW1Nb2RlRW5hYmxlZCB9IGZyb20gJy4vUHJvbXB0SW5wdXQvdXRpbHMuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0dXNMaW5lU2hvdWxkRGlzcGxheShzZXR0aW5nczogUmVhZG9ubHlTZXR0aW5ncyk6IGJvb2xlYW4ge1xuICAvLyBBc3Npc3RhbnQgbW9kZTogc3RhdHVzbGluZSBmaWVsZHMgKG1vZGVsLCBwZXJtaXNzaW9uIG1vZGUsIGN3ZCkgcmVmbGVjdCB0aGVcbiAgLy8gUkVQTC9kYWVtb24gcHJvY2Vzcywgbm90IHdoYXQgdGhlIGFnZW50IGNoaWxkIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIEhpZGUgaXQuXG4gIGlmIChmZWF0dXJlKCdLQUlST1MnKSAmJiBnZXRLYWlyb3NBY3RpdmUoKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBzZXR0aW5ncz8uc3RhdHVzTGluZSAhPT0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RhdHVzTGluZUNvbW1hbmRJbnB1dChcbiAgcGVybWlzc2lvbk1vZGU6IFBlcm1pc3Npb25Nb2RlLFxuICBleGNlZWRzMjAwa1Rva2VuczogYm9vbGVhbixcbiAgc2V0dGluZ3M6IFJlYWRvbmx5U2V0dGluZ3MsXG4gIG1lc3NhZ2VzOiBNZXNzYWdlW10sXG4gIGFkZGVkRGlyczogc3RyaW5nW10sXG4gIG1haW5Mb29wTW9kZWw6IE1vZGVsTmFtZSxcbiAgdmltTW9kZT86IFZpbU1vZGUsXG4pOiBTdGF0dXNMaW5lQ29tbWFuZElucHV0IHtcbiAgY29uc3QgYWdlbnRUeXBlID0gZ2V0TWFpblRocmVhZEFnZW50VHlwZSgpXG4gIGNvbnN0IHdvcmt0cmVlU2Vzc2lvbiA9IGdldEN1cnJlbnRXb3JrdHJlZVNlc3Npb24oKVxuICBjb25zdCBydW50aW1lTW9kZWwgPSBnZXRSdW50aW1lTWFpbkxvb3BNb2RlbCh7XG4gICAgcGVybWlzc2lvbk1vZGUsXG4gICAgbWFpbkxvb3BNb2RlbCxcbiAgICBleGNlZWRzMjAwa1Rva2VucyxcbiAgfSlcbiAgY29uc3Qgb3V0cHV0U3R5bGVOYW1lID0gc2V0dGluZ3M/Lm91dHB1dFN0eWxlIHx8IERFRkFVTFRfT1VUUFVUX1NUWUxFX05BTUVcblxuICBjb25zdCBjdXJyZW50VXNhZ2UgPSBnZXRDdXJyZW50VXNhZ2UobWVzc2FnZXMpXG4gIGNvbnN0IGNvbnRleHRXaW5kb3dTaXplID0gZ2V0Q29udGV4dFdpbmRvd0Zvck1vZGVsKFxuICAgIHJ1bnRpbWVNb2RlbCxcbiAgICBnZXRTZGtCZXRhcygpLFxuICApXG4gIGNvbnN0IGNvbnRleHRQZXJjZW50YWdlcyA9IGNhbGN1bGF0ZUNvbnRleHRQZXJjZW50YWdlcyhcbiAgICBjdXJyZW50VXNhZ2UsXG4gICAgY29udGV4dFdpbmRvd1NpemUsXG4gIClcblxuICBjb25zdCBzZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWQoKVxuICBjb25zdCBzZXNzaW9uTmFtZSA9IGdldEN1cnJlbnRTZXNzaW9uVGl0bGUoc2Vzc2lvbklkKVxuICBjb25zdCByYXdVdGlsID0gZ2V0UmF3VXRpbGl6YXRpb24oKVxuICBjb25zdCByYXRlTGltaXRzOiBTdGF0dXNMaW5lQ29tbWFuZElucHV0WydyYXRlX2xpbWl0cyddID0ge1xuICAgIC4uLihyYXdVdGlsLmZpdmVfaG91ciAmJiB7XG4gICAgICBmaXZlX2hvdXI6IHtcbiAgICAgICAgdXNlZF9wZXJjZW50YWdlOiByYXdVdGlsLmZpdmVfaG91ci51dGlsaXphdGlvbiAqIDEwMCxcbiAgICAgICAgcmVzZXRzX2F0OiByYXdVdGlsLmZpdmVfaG91ci5yZXNldHNfYXQsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIC4uLihyYXdVdGlsLnNldmVuX2RheSAmJiB7XG4gICAgICBzZXZlbl9kYXk6IHtcbiAgICAgICAgdXNlZF9wZXJjZW50YWdlOiByYXdVdGlsLnNldmVuX2RheS51dGlsaXphdGlvbiAqIDEwMCxcbiAgICAgICAgcmVzZXRzX2F0OiByYXdVdGlsLnNldmVuX2RheS5yZXNldHNfYXQsXG4gICAgICB9LFxuICAgIH0pLFxuICB9XG4gIHJldHVybiB7XG4gICAgLi4uY3JlYXRlQmFzZUhvb2tJbnB1dCgpLFxuICAgIC4uLihzZXNzaW9uTmFtZSAmJiB7IHNlc3Npb25fbmFtZTogc2Vzc2lvbk5hbWUgfSksXG4gICAgbW9kZWw6IHtcbiAgICAgIGlkOiBydW50aW1lTW9kZWwsXG4gICAgICBkaXNwbGF5X25hbWU6IHJlbmRlck1vZGVsTmFtZShydW50aW1lTW9kZWwpLFxuICAgIH0sXG4gICAgd29ya3NwYWNlOiB7XG4gICAgICBjdXJyZW50X2RpcjogZ2V0Q3dkKCksXG4gICAgICBwcm9qZWN0X2RpcjogZ2V0T3JpZ2luYWxDd2QoKSxcbiAgICAgIGFkZGVkX2RpcnM6IGFkZGVkRGlycyxcbiAgICB9LFxuICAgIHZlcnNpb246IE1BQ1JPLlZFUlNJT04sXG4gICAgb3V0cHV0X3N0eWxlOiB7XG4gICAgICBuYW1lOiBvdXRwdXRTdHlsZU5hbWUsXG4gICAgfSxcbiAgICBjb3N0OiB7XG4gICAgICB0b3RhbF9jb3N0X3VzZDogZ2V0VG90YWxDb3N0KCksXG4gICAgICB0b3RhbF9kdXJhdGlvbl9tczogZ2V0VG90YWxEdXJhdGlvbigpLFxuICAgICAgdG90YWxfYXBpX2R1cmF0aW9uX21zOiBnZXRUb3RhbEFQSUR1cmF0aW9uKCksXG4gICAgICB0b3RhbF9saW5lc19hZGRlZDogZ2V0VG90YWxMaW5lc0FkZGVkKCksXG4gICAgICB0b3RhbF9saW5lc19yZW1vdmVkOiBnZXRUb3RhbExpbmVzUmVtb3ZlZCgpLFxuICAgIH0sXG4gICAgY29udGV4dF93aW5kb3c6IHtcbiAgICAgIHRvdGFsX2lucHV0X3Rva2VuczogZ2V0VG90YWxJbnB1dFRva2VucygpLFxuICAgICAgdG90YWxfb3V0cHV0X3Rva2VuczogZ2V0VG90YWxPdXRwdXRUb2tlbnMoKSxcbiAgICAgIGNvbnRleHRfd2luZG93X3NpemU6IGNvbnRleHRXaW5kb3dTaXplLFxuICAgICAgY3VycmVudF91c2FnZTogY3VycmVudFVzYWdlLFxuICAgICAgdXNlZF9wZXJjZW50YWdlOiBjb250ZXh0UGVyY2VudGFnZXMudXNlZCxcbiAgICAgIHJlbWFpbmluZ19wZXJjZW50YWdlOiBjb250ZXh0UGVyY2VudGFnZXMucmVtYWluaW5nLFxuICAgIH0sXG4gICAgZXhjZWVkc18yMDBrX3Rva2VuczogZXhjZWVkczIwMGtUb2tlbnMsXG4gICAgLi4uKChyYXRlTGltaXRzLmZpdmVfaG91ciB8fCByYXRlTGltaXRzLnNldmVuX2RheSkgJiYge1xuICAgICAgcmF0ZV9saW1pdHM6IHJhdGVMaW1pdHMsXG4gICAgfSksXG4gICAgLi4uKGlzVmltTW9kZUVuYWJsZWQoKSAmJiB7XG4gICAgICB2aW06IHtcbiAgICAgICAgbW9kZTogdmltTW9kZSA/PyAnSU5TRVJUJyxcbiAgICAgIH0sXG4gICAgfSksXG4gICAgLi4uKGFnZW50VHlwZSAmJiB7XG4gICAgICBhZ2VudDoge1xuICAgICAgICBuYW1lOiBhZ2VudFR5cGUsXG4gICAgICB9LFxuICAgIH0pLFxuICAgIC4uLihnZXRJc1JlbW90ZU1vZGUoKSAmJiB7XG4gICAgICByZW1vdGU6IHtcbiAgICAgICAgc2Vzc2lvbl9pZDogZ2V0U2Vzc2lvbklkKCksXG4gICAgICB9LFxuICAgIH0pLFxuICAgIC4uLih3b3JrdHJlZVNlc3Npb24gJiYge1xuICAgICAgd29ya3RyZWU6IHtcbiAgICAgICAgbmFtZTogd29ya3RyZWVTZXNzaW9uLndvcmt0cmVlTmFtZSxcbiAgICAgICAgcGF0aDogd29ya3RyZWVTZXNzaW9uLndvcmt0cmVlUGF0aCxcbiAgICAgICAgYnJhbmNoOiB3b3JrdHJlZVNlc3Npb24ud29ya3RyZWVCcmFuY2gsXG4gICAgICAgIG9yaWdpbmFsX2N3ZDogd29ya3RyZWVTZXNzaW9uLm9yaWdpbmFsQ3dkLFxuICAgICAgICBvcmlnaW5hbF9icmFuY2g6IHdvcmt0cmVlU2Vzc2lvbi5vcmlnaW5hbEJyYW5jaCxcbiAgICAgIH0sXG4gICAgfSksXG4gIH1cbn1cblxudHlwZSBQcm9wcyA9IHtcbiAgLy8gbWVzc2FnZXMgc3RheXMgYmVoaW5kIGEgcmVmIChyZWFkIG9ubHkgaW4gdGhlIGRlYm91bmNlZCBjYWxsYmFjayk7XG4gIC8vIGxhc3RBc3Npc3RhbnRNZXNzYWdlSWQgaXMgdGhlIGFjdHVhbCByZS1yZW5kZXIgdHJpZ2dlci5cbiAgbWVzc2FnZXNSZWY6IFJlYWN0LlJlZk9iamVjdDxNZXNzYWdlW10+XG4gIGxhc3RBc3Npc3RhbnRNZXNzYWdlSWQ6IHN0cmluZyB8IG51bGxcbiAgdmltTW9kZT86IFZpbU1vZGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3RBc3Npc3RhbnRNZXNzYWdlSWQobWVzc2FnZXM6IE1lc3NhZ2VbXSk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gZ2V0TGFzdEFzc2lzdGFudE1lc3NhZ2UobWVzc2FnZXMpPy51dWlkID8/IG51bGxcbn1cblxuZnVuY3Rpb24gU3RhdHVzTGluZUlubmVyKHtcbiAgbWVzc2FnZXNSZWYsXG4gIGxhc3RBc3Npc3RhbnRNZXNzYWdlSWQsXG4gIHZpbU1vZGUsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlclJlZiA9IHVzZVJlZjxBYm9ydENvbnRyb2xsZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiAgY29uc3QgcGVybWlzc2lvbk1vZGUgPSB1c2VBcHBTdGF0ZShzID0+IHMudG9vbFBlcm1pc3Npb25Db250ZXh0Lm1vZGUpXG4gIGNvbnN0IGFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMgPSB1c2VBcHBTdGF0ZShcbiAgICBzID0+IHMudG9vbFBlcm1pc3Npb25Db250ZXh0LmFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXMsXG4gIClcbiAgY29uc3Qgc3RhdHVzTGluZVRleHQgPSB1c2VBcHBTdGF0ZShzID0+IHMuc3RhdHVzTGluZVRleHQpXG4gIGNvbnN0IHNldEFwcFN0YXRlID0gdXNlU2V0QXBwU3RhdGUoKVxuICBjb25zdCBzZXR0aW5ncyA9IHVzZVNldHRpbmdzKClcbiAgY29uc3QgeyBhZGROb3RpZmljYXRpb24gfSA9IHVzZU5vdGlmaWNhdGlvbnMoKVxuICAvLyBBcHBTdGF0ZS1zb3VyY2VkIG1vZGVsIOKAlCBzYW1lIHNvdXJjZSBhcyBBUEkgcmVxdWVzdHMuIGdldE1haW5Mb29wTW9kZWwoKVxuICAvLyByZS1yZWFkcyBzZXR0aW5ncy5qc29uIG9uIGV2ZXJ5IGNhbGwsIHNvIGFub3RoZXIgc2Vzc2lvbidzIC9tb2RlbCB3cml0ZVxuICAvLyB3b3VsZCBsZWFrIGludG8gdGhpcyBzZXNzaW9uJ3Mgc3RhdHVzbGluZSAoYW50aHJvcGljcy9jbGF1ZGUtY29kZSMzNzU5NikuXG4gIGNvbnN0IG1haW5Mb29wTW9kZWwgPSB1c2VNYWluTG9vcE1vZGVsKClcblxuICAvLyBLZWVwIGxhdGVzdCB2YWx1ZXMgaW4gcmVmcyBmb3Igc3RhYmxlIGNhbGxiYWNrIGFjY2Vzc1xuICBjb25zdCBzZXR0aW5nc1JlZiA9IHVzZVJlZihzZXR0aW5ncylcbiAgc2V0dGluZ3NSZWYuY3VycmVudCA9IHNldHRpbmdzXG4gIGNvbnN0IHZpbU1vZGVSZWYgPSB1c2VSZWYodmltTW9kZSlcbiAgdmltTW9kZVJlZi5jdXJyZW50ID0gdmltTW9kZVxuICBjb25zdCBwZXJtaXNzaW9uTW9kZVJlZiA9IHVzZVJlZihwZXJtaXNzaW9uTW9kZSlcbiAgcGVybWlzc2lvbk1vZGVSZWYuY3VycmVudCA9IHBlcm1pc3Npb25Nb2RlXG4gIGNvbnN0IGFkZGVkRGlyc1JlZiA9IHVzZVJlZihhZGRpdGlvbmFsV29ya2luZ0RpcmVjdG9yaWVzKVxuICBhZGRlZERpcnNSZWYuY3VycmVudCA9IGFkZGl0aW9uYWxXb3JraW5nRGlyZWN0b3JpZXNcbiAgY29uc3QgbWFpbkxvb3BNb2RlbFJlZiA9IHVzZVJlZihtYWluTG9vcE1vZGVsKVxuICBtYWluTG9vcE1vZGVsUmVmLmN1cnJlbnQgPSBtYWluTG9vcE1vZGVsXG5cbiAgLy8gVHJhY2sgcHJldmlvdXMgc3RhdGUgdG8gZGV0ZWN0IGNoYW5nZXMgYW5kIGNhY2hlIGV4cGVuc2l2ZSBjYWxjdWxhdGlvbnNcbiAgY29uc3QgcHJldmlvdXNTdGF0ZVJlZiA9IHVzZVJlZjx7XG4gICAgbWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsXG4gICAgZXhjZWVkczIwMGtUb2tlbnM6IGJvb2xlYW5cbiAgICBwZXJtaXNzaW9uTW9kZTogUGVybWlzc2lvbk1vZGVcbiAgICB2aW1Nb2RlOiBWaW1Nb2RlIHwgdW5kZWZpbmVkXG4gICAgbWFpbkxvb3BNb2RlbDogTW9kZWxOYW1lXG4gIH0+KHtcbiAgICBtZXNzYWdlSWQ6IG51bGwsXG4gICAgZXhjZWVkczIwMGtUb2tlbnM6IGZhbHNlLFxuICAgIHBlcm1pc3Npb25Nb2RlLFxuICAgIHZpbU1vZGUsXG4gICAgbWFpbkxvb3BNb2RlbCxcbiAgfSlcblxuICAvLyBEZWJvdW5jZSB0aW1lciByZWZcbiAgY29uc3QgZGVib3VuY2VUaW1lclJlZiA9IHVzZVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkLFxuICApXG5cbiAgLy8gVHJ1ZSB3aGVuIHRoZSBuZXh0IGludm9jYXRpb24gc2hvdWxkIGxvZyBpdHMgcmVzdWx0IChmaXJzdCBydW4gb3IgYWZ0ZXIgc2V0dGluZ3MgcmVsb2FkKVxuICBjb25zdCBsb2dOZXh0UmVzdWx0UmVmID0gdXNlUmVmKHRydWUpXG5cbiAgLy8gU3RhYmxlIHVwZGF0ZSBmdW5jdGlvbiDigJQgcmVhZHMgbGF0ZXN0IHZhbHVlcyBmcm9tIHJlZnNcbiAgY29uc3QgZG9VcGRhdGUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgLy8gQ2FuY2VsIGFueSBpbi1mbGlnaHQgcmVxdWVzdHNcbiAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudD8uYWJvcnQoKVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gY29udHJvbGxlclxuXG4gICAgY29uc3QgbXNncyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcblxuICAgIGNvbnN0IGxvZ1Jlc3VsdCA9IGxvZ05leHRSZXN1bHRSZWYuY3VycmVudFxuICAgIGxvZ05leHRSZXN1bHRSZWYuY3VycmVudCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgbGV0IGV4Y2VlZHMyMDBrVG9rZW5zID0gcHJldmlvdXNTdGF0ZVJlZi5jdXJyZW50LmV4Y2VlZHMyMDBrVG9rZW5zXG5cbiAgICAgIC8vIE9ubHkgcmVjYWxjdWxhdGUgMjAwayBjaGVjayBpZiBtZXNzYWdlcyBjaGFuZ2VkXG4gICAgICBjb25zdCBjdXJyZW50TWVzc2FnZUlkID0gZ2V0TGFzdEFzc2lzdGFudE1lc3NhZ2VJZChtc2dzKVxuICAgICAgaWYgKGN1cnJlbnRNZXNzYWdlSWQgIT09IHByZXZpb3VzU3RhdGVSZWYuY3VycmVudC5tZXNzYWdlSWQpIHtcbiAgICAgICAgZXhjZWVkczIwMGtUb2tlbnMgPSBkb2VzTW9zdFJlY2VudEFzc2lzdGFudE1lc3NhZ2VFeGNlZWQyMDBrKG1zZ3MpXG4gICAgICAgIHByZXZpb3VzU3RhdGVSZWYuY3VycmVudC5tZXNzYWdlSWQgPSBjdXJyZW50TWVzc2FnZUlkXG4gICAgICAgIHByZXZpb3VzU3RhdGVSZWYuY3VycmVudC5leGNlZWRzMjAwa1Rva2VucyA9IGV4Y2VlZHMyMDBrVG9rZW5zXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXR1c0lucHV0ID0gYnVpbGRTdGF0dXNMaW5lQ29tbWFuZElucHV0KFxuICAgICAgICBwZXJtaXNzaW9uTW9kZVJlZi5jdXJyZW50LFxuICAgICAgICBleGNlZWRzMjAwa1Rva2VucyxcbiAgICAgICAgc2V0dGluZ3NSZWYuY3VycmVudCxcbiAgICAgICAgbXNncyxcbiAgICAgICAgQXJyYXkuZnJvbShhZGRlZERpcnNSZWYuY3VycmVudC5rZXlzKCkpLFxuICAgICAgICBtYWluTG9vcE1vZGVsUmVmLmN1cnJlbnQsXG4gICAgICAgIHZpbU1vZGVSZWYuY3VycmVudCxcbiAgICAgIClcblxuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGV4ZWN1dGVTdGF0dXNMaW5lQ29tbWFuZChcbiAgICAgICAgc3RhdHVzSW5wdXQsXG4gICAgICAgIGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGxvZ1Jlc3VsdCxcbiAgICAgIClcbiAgICAgIGlmICghY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBzZXRBcHBTdGF0ZShwcmV2ID0+IHtcbiAgICAgICAgICBpZiAocHJldi5zdGF0dXNMaW5lVGV4dCA9PT0gdGV4dCkgcmV0dXJuIHByZXZcbiAgICAgICAgICByZXR1cm4geyAuLi5wcmV2LCBzdGF0dXNMaW5lVGV4dDogdGV4dCB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTaWxlbnRseSBpZ25vcmUgZXJyb3JzIGluIHN0YXR1cyBsaW5lIHVwZGF0ZXNcbiAgICB9XG4gIH0sIFttZXNzYWdlc1JlZiwgc2V0QXBwU3RhdGVdKVxuXG4gIC8vIFN0YWJsZSBkZWJvdW5jZWQgc2NoZWR1bGUgZnVuY3Rpb24g4oCUIG5vIGRlcHMsIHVzZXMgcmVmc1xuICBjb25zdCBzY2hlZHVsZVVwZGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyUmVmLmN1cnJlbnQpXG4gICAgfVxuICAgIGRlYm91bmNlVGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoXG4gICAgICAocmVmLCBkb1VwZGF0ZSkgPT4ge1xuICAgICAgICByZWYuY3VycmVudCA9IHVuZGVmaW5lZFxuICAgICAgICB2b2lkIGRvVXBkYXRlKClcbiAgICAgIH0sXG4gICAgICAzMDAsXG4gICAgICBkZWJvdW5jZVRpbWVyUmVmLFxuICAgICAgZG9VcGRhdGUsXG4gICAgKVxuICB9LCBbZG9VcGRhdGVdKVxuXG4gIC8vIE9ubHkgdHJpZ2dlciB1cGRhdGUgd2hlbiBhc3Npc3RhbnQgbWVzc2FnZSwgcGVybWlzc2lvbiBtb2RlLCB2aW0gbW9kZSwgb3IgbW9kZWwgYWN0dWFsbHkgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIGxhc3RBc3Npc3RhbnRNZXNzYWdlSWQgIT09IHByZXZpb3VzU3RhdGVSZWYuY3VycmVudC5tZXNzYWdlSWQgfHxcbiAgICAgIHBlcm1pc3Npb25Nb2RlICE9PSBwcmV2aW91c1N0YXRlUmVmLmN1cnJlbnQucGVybWlzc2lvbk1vZGUgfHxcbiAgICAgIHZpbU1vZGUgIT09IHByZXZpb3VzU3RhdGVSZWYuY3VycmVudC52aW1Nb2RlIHx8XG4gICAgICBtYWluTG9vcE1vZGVsICE9PSBwcmV2aW91c1N0YXRlUmVmLmN1cnJlbnQubWFpbkxvb3BNb2RlbFxuICAgICkge1xuICAgICAgLy8gRG9uJ3QgdXBkYXRlIG1lc3NhZ2VJZCBoZXJlIOKAlCBsZXQgZG9VcGRhdGUgaGFuZGxlIGl0IHNvXG4gICAgICAvLyBleGNlZWRzMjAwa1Rva2VucyBpcyByZWNhbGN1bGF0ZWQgd2l0aCB0aGUgbGF0ZXN0IG1lc3NhZ2VzXG4gICAgICBwcmV2aW91c1N0YXRlUmVmLmN1cnJlbnQucGVybWlzc2lvbk1vZGUgPSBwZXJtaXNzaW9uTW9kZVxuICAgICAgcHJldmlvdXNTdGF0ZVJlZi5jdXJyZW50LnZpbU1vZGUgPSB2aW1Nb2RlXG4gICAgICBwcmV2aW91c1N0YXRlUmVmLmN1cnJlbnQubWFpbkxvb3BNb2RlbCA9IG1haW5Mb29wTW9kZWxcbiAgICAgIHNjaGVkdWxlVXBkYXRlKClcbiAgICB9XG4gIH0sIFtcbiAgICBsYXN0QXNzaXN0YW50TWVzc2FnZUlkLFxuICAgIHBlcm1pc3Npb25Nb2RlLFxuICAgIHZpbU1vZGUsXG4gICAgbWFpbkxvb3BNb2RlbCxcbiAgICBzY2hlZHVsZVVwZGF0ZSxcbiAgXSlcblxuICAvLyBXaGVuIHRoZSBzdGF0dXNMaW5lIGNvbW1hbmQgY2hhbmdlcyAoaG90IHJlbG9hZCksIGxvZyB0aGUgbmV4dCByZXN1bHRcbiAgY29uc3Qgc3RhdHVzTGluZUNvbW1hbmQgPSBzZXR0aW5ncz8uc3RhdHVzTGluZT8uY29tbWFuZFxuICBjb25zdCBpc0ZpcnN0U2V0dGluZ3NSZW5kZXIgPSB1c2VSZWYodHJ1ZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNGaXJzdFNldHRpbmdzUmVuZGVyLmN1cnJlbnQpIHtcbiAgICAgIGlzRmlyc3RTZXR0aW5nc1JlbmRlci5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsb2dOZXh0UmVzdWx0UmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgdm9pZCBkb1VwZGF0ZSgpXG4gIH0sIFtzdGF0dXNMaW5lQ29tbWFuZCwgZG9VcGRhdGVdKVxuXG4gIC8vIFNlcGFyYXRlIGVmZmVjdCBmb3IgbG9nZ2luZyBvbiBtb3VudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1c0xpbmUgPSBzZXR0aW5ncz8uc3RhdHVzTGluZVxuICAgIGlmIChzdGF0dXNMaW5lKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3Vfc3RhdHVzX2xpbmVfbW91bnQnLCB7XG4gICAgICAgIGNvbW1hbmRfbGVuZ3RoOiBzdGF0dXNMaW5lLmNvbW1hbmQubGVuZ3RoLFxuICAgICAgICBwYWRkaW5nOiBzdGF0dXNMaW5lLnBhZGRpbmcsXG4gICAgICB9KVxuICAgICAgLy8gTG9nIGlmIHN0YXR1cyBsaW5lIGlzIGNvbmZpZ3VyZWQgYnV0IGRpc2FibGVkIGJ5IGRpc2FibGVBbGxIb29rc1xuICAgICAgaWYgKHNldHRpbmdzLmRpc2FibGVBbGxIb29rcyA9PT0gdHJ1ZSkge1xuICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgICAgICAgJ1N0YXR1cyBsaW5lIGlzIGNvbmZpZ3VyZWQgYnV0IGRpc2FibGVBbGxIb29rcyBpcyB0cnVlJyxcbiAgICAgICAgICB7IGxldmVsOiAnd2FybicgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgLy8gZXhlY3V0ZVN0YXR1c0xpbmVDb21tYW5kIChob29rcy50cykgcmV0dXJucyB1bmRlZmluZWQgd2hlbiB0cnVzdCBpc1xuICAgICAgLy8gYmxvY2tlZCDigJQgc3RhdHVzTGluZVRleHQgc3RheXMgdW5kZWZpbmVkIGZvcmV2ZXIsIHVzZXIgc2VlcyBub3RoaW5nLFxuICAgICAgLy8gYW5kIHRlbmd1X3N0YXR1c19saW5lX21vdW50IGFib3ZlIGZpcmVzIGFueXdheSBzbyB0ZWxlbWV0cnkgbG9va3MgZmluZS5cbiAgICAgIGlmICghY2hlY2tIYXNUcnVzdERpYWxvZ0FjY2VwdGVkKCkpIHtcbiAgICAgICAgYWRkTm90aWZpY2F0aW9uKHtcbiAgICAgICAgICBrZXk6ICdzdGF0dXNsaW5lLXRydXN0LWJsb2NrZWQnLFxuICAgICAgICAgIHRleHQ6ICdzdGF0dXNsaW5lIHNraXBwZWQgwrcgcmVzdGFydCB0byBmaXgnLFxuICAgICAgICAgIGNvbG9yOiAnd2FybmluZycsXG4gICAgICAgICAgcHJpb3JpdHk6ICdsb3cnLFxuICAgICAgICB9KVxuICAgICAgICBsb2dGb3JEZWJ1Z2dpbmcoXG4gICAgICAgICAgJ1N0YXR1cyBsaW5lIGNvbW1hbmQgc2tpcHBlZDogd29ya3NwYWNlIHRydXN0IG5vdCBhY2NlcHRlZCcsXG4gICAgICAgICAgeyBsZXZlbDogJ3dhcm4nIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IGludGVudGlvbmFsXG4gIH0sIFtdKSAvLyBPbmx5IHJ1biBvbmNlIG9uIG1vdW50IC0gc2V0dGluZ3Mgc3RhYmxlIGZvciBpbml0aWFsIGxvZ2dpbmdcblxuICAvLyBJbml0aWFsIHVwZGF0ZSBvbiBtb3VudCArIGNsZWFudXAgb24gdW5tb3VudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgZG9VcGRhdGUoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50Py5hYm9ydCgpXG4gICAgICBpZiAoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXJSZWYuY3VycmVudClcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL3VzZUV4aGF1c3RpdmVEZXBlbmRlbmNpZXM6IGludGVudGlvbmFsXG4gIH0sIFtdKSAvLyBPbmx5IHJ1biBvbmNlIG9uIG1vdW50LCBub3Qgd2hlbiBkb1VwZGF0ZSBjaGFuZ2VzXG5cbiAgLy8gR2V0IHBhZGRpbmcgZnJvbSBzZXR0aW5ncyBvciBkZWZhdWx0IHRvIDBcbiAgY29uc3QgcGFkZGluZ1ggPSBzZXR0aW5ncz8uc3RhdHVzTGluZT8ucGFkZGluZyA/PyAwXG5cbiAgLy8gU3RhdHVzTGluZSBtdXN0IGhhdmUgc3RhYmxlIGhlaWdodCBpbiBmdWxsc2NyZWVuIOKAlCB0aGUgZm9vdGVyIGlzXG4gIC8vIGZsZXhTaHJpbms6MCBzbyBhIDDihpIxIHJvdyBjaGFuZ2Ugd2hlbiB0aGUgY29tbWFuZCBmaW5pc2hlcyBzdGVhbHNcbiAgLy8gYSByb3cgZnJvbSBTY3JvbGxCb3ggYW5kIHNoaWZ0cyBjb250ZW50LiBSZXNlcnZlIHRoZSByb3cgd2hpbGUgbG9hZGluZ1xuICAvLyAoc2FtZSB0cmljayBhcyBQcm9tcHRJbnB1dEZvb3RlckxlZnRTaWRlKS5cbiAgcmV0dXJuIChcbiAgICA8Qm94IHBhZGRpbmdYPXtwYWRkaW5nWH0gZ2FwPXsyfT5cbiAgICAgIHtzdGF0dXNMaW5lVGV4dCA/IChcbiAgICAgICAgPFRleHQgZGltQ29sb3Igd3JhcD1cInRydW5jYXRlXCI+XG4gICAgICAgICAgPEFuc2k+e3N0YXR1c0xpbmVUZXh0fTwvQW5zaT5cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKSA6IGlzRnVsbHNjcmVlbkVudkVuYWJsZWQoKSA/IChcbiAgICAgICAgPFRleHQ+IDwvVGV4dD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvQm94PlxuICApXG59XG5cbi8vIFBhcmVudCAoUHJvbXB0SW5wdXRGb290ZXIpIHJlLXJlbmRlcnMgb24gZXZlcnkgc2V0TWVzc2FnZXMsIGJ1dCBTdGF0dXNMaW5lJ3Ncbi8vIG93biBwcm9wcyBub3cgb25seSBjaGFuZ2Ugd2hlbiBsYXN0QXNzaXN0YW50TWVzc2FnZUlkIGZsaXBzIOKAlCBtZW1vIGtlZXBzIGl0XG4vLyBmcm9tIGJlaW5nIGRyYWdnZWQgYWxvbmcgKHByZXZpb3VzbHkgfjE4IG5vLXByb3AtY2hhbmdlIHJlbmRlcnMgcGVyIHNlc3Npb24pLlxuZXhwb3J0IGNvbnN0IFN0YXR1c0xpbmUgPSBtZW1vKFN0YXR1c0xpbmVJbm5lcilcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsT0FBTyxRQUFRLFlBQVk7QUFDcEMsT0FBTyxLQUFLQyxLQUFLLE1BQU0sT0FBTztBQUM5QixTQUFTQyxJQUFJLEVBQUVDLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyxNQUFNLFFBQVEsT0FBTztBQUM1RCxTQUFTQyxRQUFRLFFBQVEsaUNBQWlDO0FBQzFELFNBQVNDLFdBQVcsRUFBRUMsY0FBYyxRQUFRLHVCQUF1QjtBQUNuRSxjQUFjQyxjQUFjLFFBQVEseUNBQXlDO0FBQzdFLFNBQ0VDLGVBQWUsRUFDZkMsZUFBZSxFQUNmQyxzQkFBc0IsRUFDdEJDLGNBQWMsRUFDZEMsV0FBVyxFQUNYQyxZQUFZLFFBQ1AsdUJBQXVCO0FBQzlCLFNBQVNDLHlCQUF5QixRQUFRLDhCQUE4QjtBQUN4RSxTQUFTQyxnQkFBZ0IsUUFBUSw2QkFBNkI7QUFDOUQsU0FDRUMsbUJBQW1CLEVBQ25CQyxZQUFZLEVBQ1pDLGdCQUFnQixFQUNoQkMsbUJBQW1CLEVBQ25CQyxrQkFBa0IsRUFDbEJDLG9CQUFvQixFQUNwQkMsb0JBQW9CLFFBQ2Ysb0JBQW9CO0FBQzNCLFNBQVNDLGdCQUFnQixRQUFRLDhCQUE4QjtBQUMvRCxTQUFTLEtBQUtDLGdCQUFnQixFQUFFQyxXQUFXLFFBQVEseUJBQXlCO0FBQzVFLFNBQVNDLElBQUksRUFBRUMsR0FBRyxFQUFFQyxJQUFJLFFBQVEsV0FBVztBQUMzQyxTQUFTQyxpQkFBaUIsUUFBUSwrQkFBK0I7QUFDakUsY0FBY0MsT0FBTyxRQUFRLHFCQUFxQjtBQUNsRCxjQUFjQyxzQkFBc0IsUUFBUSx3QkFBd0I7QUFDcEUsY0FBY0MsT0FBTyxRQUFRLDRCQUE0QjtBQUN6RCxTQUFTQywyQkFBMkIsUUFBUSxvQkFBb0I7QUFDaEUsU0FDRUMsMkJBQTJCLEVBQzNCQyx3QkFBd0IsUUFDbkIscUJBQXFC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
@@ -0,0 +1,55 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import * as React from 'react';
3
+ import { use } from 'react';
4
+ import { Box } from '../ink.js';
5
+ import type { AgentDefinitionsResult } from '../tools/AgentTool/loadAgentsDir.js';
6
+ import { getMemoryFiles } from '../utils/claudemd.js';
7
+ import { getGlobalConfig } from '../utils/config.js';
8
+ import { getActiveNotices, type StatusNoticeContext } from '../utils/statusNoticeDefinitions.js';
9
+ type Props = {
10
+ agentDefinitions?: AgentDefinitionsResult;
11
+ };
12
+
13
+ /**
14
+ * StatusNotices contains the information displayed to users at startup. We have
15
+ * moved neutral or positive status to src/components/Status.tsx instead, which
16
+ * users can access through /status.
17
+ */
18
+ export function StatusNotices(t0) {
19
+ const $ = _c(4);
20
+ const {
21
+ agentDefinitions
22
+ } = t0 === undefined ? {} : t0;
23
+ const t1 = getGlobalConfig();
24
+ let t2;
25
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
26
+ t2 = getMemoryFiles();
27
+ $[0] = t2;
28
+ } else {
29
+ t2 = $[0];
30
+ }
31
+ const context = {
32
+ config: t1,
33
+ agentDefinitions,
34
+ memoryFiles: use(t2)
35
+ };
36
+ const activeNotices = getActiveNotices(context);
37
+ if (activeNotices.length === 0) {
38
+ return null;
39
+ }
40
+ const T0 = Box;
41
+ const t3 = "column";
42
+ const t4 = 1;
43
+ const t5 = activeNotices.map(notice => <React.Fragment key={notice.id}>{notice.render(context)}</React.Fragment>);
44
+ let t6;
45
+ if ($[1] !== T0 || $[2] !== t5) {
46
+ t6 = <T0 flexDirection={t3} paddingLeft={t4}>{t5}</T0>;
47
+ $[1] = T0;
48
+ $[2] = t5;
49
+ $[3] = t6;
50
+ } else {
51
+ t6 = $[3];
52
+ }
53
+ return t6;
54
+ }
55
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZSIsIkJveCIsIkFnZW50RGVmaW5pdGlvbnNSZXN1bHQiLCJnZXRNZW1vcnlGaWxlcyIsImdldEdsb2JhbENvbmZpZyIsImdldEFjdGl2ZU5vdGljZXMiLCJTdGF0dXNOb3RpY2VDb250ZXh0IiwiUHJvcHMiLCJhZ2VudERlZmluaXRpb25zIiwiU3RhdHVzTm90aWNlcyIsInQwIiwiJCIsIl9jIiwidW5kZWZpbmVkIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJjb25maWciLCJtZW1vcnlGaWxlcyIsImFjdGl2ZU5vdGljZXMiLCJsZW5ndGgiLCJUMCIsInQzIiwidDQiLCJ0NSIsIm1hcCIsIm5vdGljZSIsImlkIiwicmVuZGVyIiwidDYiXSwic291cmNlcyI6WyJTdGF0dXNOb3RpY2VzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi4vaW5rLmpzJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudERlZmluaXRpb25zUmVzdWx0IH0gZnJvbSAnLi4vdG9vbHMvQWdlbnRUb29sL2xvYWRBZ2VudHNEaXIuanMnXG5pbXBvcnQgeyBnZXRNZW1vcnlGaWxlcyB9IGZyb20gJy4uL3V0aWxzL2NsYXVkZW1kLmpzJ1xuaW1wb3J0IHsgZ2V0R2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0QWN0aXZlTm90aWNlcyxcbiAgdHlwZSBTdGF0dXNOb3RpY2VDb250ZXh0LFxufSBmcm9tICcuLi91dGlscy9zdGF0dXNOb3RpY2VEZWZpbml0aW9ucy5qcydcblxudHlwZSBQcm9wcyA9IHtcbiAgYWdlbnREZWZpbml0aW9ucz86IEFnZW50RGVmaW5pdGlvbnNSZXN1bHRcbn1cblxuLyoqXG4gKiBTdGF0dXNOb3RpY2VzIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgdG8gdXNlcnMgYXQgc3RhcnR1cC4gV2UgaGF2ZVxuICogbW92ZWQgbmV1dHJhbCBvciBwb3NpdGl2ZSBzdGF0dXMgdG8gc3JjL2NvbXBvbmVudHMvU3RhdHVzLnRzeCBpbnN0ZWFkLCB3aGljaFxuICogdXNlcnMgY2FuIGFjY2VzcyB0aHJvdWdoIC9zdGF0dXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTdGF0dXNOb3RpY2VzKHtcbiAgYWdlbnREZWZpbml0aW9ucyxcbn06IFByb3BzID0ge30pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBjb250ZXh0OiBTdGF0dXNOb3RpY2VDb250ZXh0ID0ge1xuICAgIGNvbmZpZzogZ2V0R2xvYmFsQ29uZmlnKCksXG4gICAgYWdlbnREZWZpbml0aW9ucyxcbiAgICBtZW1vcnlGaWxlczogdXNlKGdldE1lbW9yeUZpbGVzKCkpLFxuICB9XG4gIGNvbnN0IGFjdGl2ZU5vdGljZXMgPSBnZXRBY3RpdmVOb3RpY2VzKGNvbnRleHQpXG4gIGlmIChhY3RpdmVOb3RpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdMZWZ0PXsxfT5cbiAgICAgIHthY3RpdmVOb3RpY2VzLm1hcChub3RpY2UgPT4gKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQga2V5PXtub3RpY2UuaWR9PlxuICAgICAgICAgIHtub3RpY2UucmVuZGVyKGNvbnRleHQpfVxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgKSl9XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsR0FBRyxRQUFRLE9BQU87QUFDM0IsU0FBU0MsR0FBRyxRQUFRLFdBQVc7QUFDL0IsY0FBY0Msc0JBQXNCLFFBQVEscUNBQXFDO0FBQ2pGLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUNFQyxnQkFBZ0IsRUFDaEIsS0FBS0MsbUJBQW1CLFFBQ25CLHFDQUFxQztBQUU1QyxLQUFLQyxLQUFLLEdBQUc7RUFDWEMsZ0JBQWdCLENBQUMsRUFBRU4sc0JBQXNCO0FBQzNDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBQU8sY0FBQUMsRUFBQTtFQUFBLE1BQUFDLENBQUEsR0FBQUMsRUFBQTtFQUF1QjtJQUFBSjtFQUFBLElBQUFFLEVBRWpCLEtBRmlCRyxTQUVqQixHQUZpQixDQUVsQixDQUFDLEdBRmlCSCxFQUVqQjtFQUVELE1BQUFJLEVBQUEsR0FBQVYsZUFBZSxDQUFDLENBQUM7RUFBQSxJQUFBVyxFQUFBO0VBQUEsSUFBQUosQ0FBQSxRQUFBSyxNQUFBLENBQUFDLEdBQUE7SUFFUkYsRUFBQSxHQUFBWixjQUFjLENBQUMsQ0FBQztJQUFBUSxDQUFBLE1BQUFJLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFKLENBQUE7RUFBQTtFQUhuQyxNQUFBTyxPQUFBLEdBQXFDO0lBQUFDLE1BQUEsRUFDM0JMLEVBQWlCO0lBQUFOLGdCQUFBO0lBQUFZLFdBQUEsRUFFWnBCLEdBQUcsQ0FBQ2UsRUFBZ0I7RUFDbkMsQ0FBQztFQUNELE1BQUFNLGFBQUEsR0FBc0JoQixnQkFBZ0IsQ0FBQ2EsT0FBTyxDQUFDO0VBQy9DLElBQUlHLGFBQWEsQ0FBQUMsTUFBTyxLQUFLLENBQUM7SUFBQSxPQUNyQixJQUFJO0VBQUE7RUFJVixNQUFBQyxFQUFBLEdBQUF0QixHQUFHO0VBQWUsTUFBQXVCLEVBQUEsV0FBUTtFQUFjLE1BQUFDLEVBQUEsSUFBQztFQUN2QyxNQUFBQyxFQUFBLEdBQUFMLGFBQWEsQ0FBQU0sR0FBSSxDQUFDQyxNQUFBLElBQ2pCLGdCQUFxQixHQUFTLENBQVQsQ0FBQUEsTUFBTSxDQUFBQyxFQUFFLENBQUMsQ0FDM0IsQ0FBQUQsTUFBTSxDQUFBRSxNQUFPLENBQUNaLE9BQU8sRUFDeEIsaUJBQ0QsQ0FBQztFQUFBLElBQUFhLEVBQUE7RUFBQSxJQUFBcEIsQ0FBQSxRQUFBWSxFQUFBLElBQUFaLENBQUEsUUFBQWUsRUFBQTtJQUxKSyxFQUFBLElBQUMsRUFBRyxDQUFlLGFBQVEsQ0FBUixDQUFBUCxFQUFPLENBQUMsQ0FBYyxXQUFDLENBQUQsQ0FBQUMsRUFBQSxDQUFDLENBQ3ZDLENBQUFDLEVBSUEsQ0FDSCxFQU5DLEVBQUcsQ0FNRTtJQUFBZixDQUFBLE1BQUFZLEVBQUE7SUFBQVosQ0FBQSxNQUFBZSxFQUFBO0lBQUFmLENBQUEsTUFBQW9CLEVBQUE7RUFBQTtJQUFBQSxFQUFBLEdBQUFwQixDQUFBO0VBQUE7RUFBQSxPQU5Ob0IsRUFNTTtBQUFBIiwiaWdub3JlTGlzdCI6W119