@xortex/xcode 3.0.0

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 (934) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/xcode +127 -0
  4. package/bin/xcode-test +84 -0
  5. package/bin/xcode.cmd +31 -0
  6. package/constants/apiLimits.ts +94 -0
  7. package/constants/betas.ts +52 -0
  8. package/constants/common.ts +33 -0
  9. package/constants/cyberRiskInstruction.ts +24 -0
  10. package/constants/errorIds.ts +15 -0
  11. package/constants/figures.ts +45 -0
  12. package/constants/files.ts +156 -0
  13. package/constants/github-app.ts +144 -0
  14. package/constants/keys.ts +11 -0
  15. package/constants/messages.ts +1 -0
  16. package/constants/oauth.ts +234 -0
  17. package/constants/outputStyles.ts +216 -0
  18. package/constants/product.ts +76 -0
  19. package/constants/prompts.ts +939 -0
  20. package/constants/spinnerVerbs.ts +204 -0
  21. package/constants/system.ts +95 -0
  22. package/constants/systemPromptSections.ts +68 -0
  23. package/constants/toolLimits.ts +56 -0
  24. package/constants/tools.ts +112 -0
  25. package/constants/turnCompletionVerbs.ts +12 -0
  26. package/constants/xml.ts +86 -0
  27. package/entrypoints/agentSdkTypes.ts +443 -0
  28. package/entrypoints/cli.tsx +307 -0
  29. package/entrypoints/init.ts +340 -0
  30. package/entrypoints/mcp.ts +196 -0
  31. package/entrypoints/sandboxTypes.ts +156 -0
  32. package/entrypoints/sdk/controlSchemas.ts +663 -0
  33. package/entrypoints/sdk/coreSchemas.ts +1889 -0
  34. package/entrypoints/sdk/coreTypes.generated.ts +2 -0
  35. package/entrypoints/sdk/coreTypes.ts +62 -0
  36. package/entrypoints/sdk/runtimeTypes.ts +140 -0
  37. package/entrypoints/sdk/sdkUtilityTypes.ts +3 -0
  38. package/entrypoints/sdk/toolTypes.ts +90 -0
  39. package/main.tsx +4686 -0
  40. package/package.json +120 -0
  41. package/services/AgentSummary/agentSummary.ts +179 -0
  42. package/services/MagicDocs/magicDocs.ts +254 -0
  43. package/services/MagicDocs/prompts.ts +127 -0
  44. package/services/PromptSuggestion/promptSuggestion.ts +523 -0
  45. package/services/PromptSuggestion/speculation.ts +991 -0
  46. package/services/SessionMemory/prompts.ts +324 -0
  47. package/services/SessionMemory/sessionMemory.ts +495 -0
  48. package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  49. package/services/analytics/config.ts +38 -0
  50. package/services/analytics/datadog.ts +307 -0
  51. package/services/analytics/firstPartyEventLogger.ts +449 -0
  52. package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  53. package/services/analytics/growthbook.ts +1155 -0
  54. package/services/analytics/index.ts +173 -0
  55. package/services/analytics/metadata.ts +973 -0
  56. package/services/analytics/sink.ts +114 -0
  57. package/services/analytics/sinkKillswitch.ts +25 -0
  58. package/services/api/adminRequests.ts +119 -0
  59. package/services/api/bootstrap.ts +141 -0
  60. package/services/api/claude.ts +3422 -0
  61. package/services/api/client.ts +406 -0
  62. package/services/api/dumpPrompts.ts +226 -0
  63. package/services/api/emptyUsage.ts +22 -0
  64. package/services/api/errorUtils.ts +260 -0
  65. package/services/api/errors.ts +1207 -0
  66. package/services/api/filesApi.ts +748 -0
  67. package/services/api/firstTokenDate.ts +60 -0
  68. package/services/api/gemini.ts +359 -0
  69. package/services/api/geminiAdapter.ts +123 -0
  70. package/services/api/geminiClient.ts +291 -0
  71. package/services/api/grove.ts +357 -0
  72. package/services/api/logging.ts +788 -0
  73. package/services/api/metricsOptOut.ts +159 -0
  74. package/services/api/openRouterClient.ts +453 -0
  75. package/services/api/overageCreditGrant.ts +137 -0
  76. package/services/api/promptCacheBreakDetection.ts +727 -0
  77. package/services/api/referral.ts +281 -0
  78. package/services/api/sessionIngress.ts +514 -0
  79. package/services/api/ultrareviewQuota.ts +38 -0
  80. package/services/api/usage.ts +63 -0
  81. package/services/api/withRetry.ts +822 -0
  82. package/services/autoDream/autoDream.ts +324 -0
  83. package/services/autoDream/config.ts +21 -0
  84. package/services/autoDream/consolidationLock.ts +140 -0
  85. package/services/autoDream/consolidationPrompt.ts +65 -0
  86. package/services/awaySummary.ts +74 -0
  87. package/services/claudeAiLimits.ts +515 -0
  88. package/services/claudeAiLimitsHook.ts +23 -0
  89. package/services/compact/apiMicrocompact.ts +153 -0
  90. package/services/compact/autoCompact.ts +351 -0
  91. package/services/compact/compact.ts +1705 -0
  92. package/services/compact/compactWarningHook.ts +16 -0
  93. package/services/compact/compactWarningState.ts +18 -0
  94. package/services/compact/grouping.ts +63 -0
  95. package/services/compact/microCompact.ts +530 -0
  96. package/services/compact/postCompactCleanup.ts +77 -0
  97. package/services/compact/prompt.ts +374 -0
  98. package/services/compact/sessionMemoryCompact.ts +630 -0
  99. package/services/compact/timeBasedMCConfig.ts +43 -0
  100. package/services/diagnosticTracking.ts +397 -0
  101. package/services/extractMemories/extractMemories.ts +517 -0
  102. package/services/extractMemories/prompts.ts +154 -0
  103. package/services/internalLogging.ts +90 -0
  104. package/services/lsp/LSPClient.ts +447 -0
  105. package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  106. package/services/lsp/LSPServerInstance.ts +511 -0
  107. package/services/lsp/LSPServerManager.ts +420 -0
  108. package/services/lsp/config.ts +79 -0
  109. package/services/lsp/manager.ts +289 -0
  110. package/services/lsp/passiveFeedback.ts +328 -0
  111. package/services/mcp/InProcessTransport.ts +63 -0
  112. package/services/mcp/MCPConnectionManager.tsx +73 -0
  113. package/services/mcp/SdkControlTransport.ts +136 -0
  114. package/services/mcp/auth.ts +2465 -0
  115. package/services/mcp/channelAllowlist.ts +76 -0
  116. package/services/mcp/channelNotification.ts +316 -0
  117. package/services/mcp/channelPermissions.ts +240 -0
  118. package/services/mcp/claudeai.ts +164 -0
  119. package/services/mcp/client.ts +3348 -0
  120. package/services/mcp/config.ts +1578 -0
  121. package/services/mcp/elicitationHandler.ts +313 -0
  122. package/services/mcp/envExpansion.ts +38 -0
  123. package/services/mcp/headersHelper.ts +138 -0
  124. package/services/mcp/mcpStringUtils.ts +106 -0
  125. package/services/mcp/normalization.ts +23 -0
  126. package/services/mcp/oauthPort.ts +78 -0
  127. package/services/mcp/officialRegistry.ts +72 -0
  128. package/services/mcp/types.ts +258 -0
  129. package/services/mcp/useManageMCPConnections.ts +1141 -0
  130. package/services/mcp/utils.ts +575 -0
  131. package/services/mcp/vscodeSdkMcp.ts +112 -0
  132. package/services/mcp/xaa.ts +511 -0
  133. package/services/mcp/xaaIdpLogin.ts +487 -0
  134. package/services/mcpServerApproval.tsx +41 -0
  135. package/services/mockRateLimits.ts +882 -0
  136. package/services/notifier.ts +156 -0
  137. package/services/oauth/auth-code-listener.ts +211 -0
  138. package/services/oauth/client.ts +566 -0
  139. package/services/oauth/crypto.ts +23 -0
  140. package/services/oauth/getOauthProfile.ts +53 -0
  141. package/services/oauth/index.ts +198 -0
  142. package/services/plugins/PluginInstallationManager.ts +184 -0
  143. package/services/plugins/pluginCliCommands.ts +344 -0
  144. package/services/plugins/pluginOperations.ts +1088 -0
  145. package/services/policyLimits/index.ts +663 -0
  146. package/services/policyLimits/types.ts +27 -0
  147. package/services/preventSleep.ts +165 -0
  148. package/services/rateLimitMessages.ts +344 -0
  149. package/services/rateLimitMocking.ts +144 -0
  150. package/services/remoteManagedSettings/index.ts +638 -0
  151. package/services/remoteManagedSettings/securityCheck.tsx +74 -0
  152. package/services/remoteManagedSettings/syncCache.ts +112 -0
  153. package/services/remoteManagedSettings/syncCacheState.ts +96 -0
  154. package/services/remoteManagedSettings/types.ts +31 -0
  155. package/services/settingsSync/index.ts +581 -0
  156. package/services/settingsSync/types.ts +67 -0
  157. package/services/teamMemorySync/index.ts +1256 -0
  158. package/services/teamMemorySync/secretScanner.ts +324 -0
  159. package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  160. package/services/teamMemorySync/types.ts +156 -0
  161. package/services/teamMemorySync/watcher.ts +387 -0
  162. package/services/tips/tipHistory.ts +17 -0
  163. package/services/tips/tipRegistry.ts +686 -0
  164. package/services/tips/tipScheduler.ts +58 -0
  165. package/services/tokenEstimation.ts +495 -0
  166. package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  167. package/services/tools/StreamingToolExecutor.ts +530 -0
  168. package/services/tools/toolExecution.ts +1745 -0
  169. package/services/tools/toolHooks.ts +650 -0
  170. package/services/tools/toolOrchestration.ts +188 -0
  171. package/services/vcr.ts +406 -0
  172. package/services/voice.ts +525 -0
  173. package/services/voiceKeyterms.ts +106 -0
  174. package/services/voiceStreamSTT.ts +544 -0
  175. package/tools/AgentTool/AgentTool.tsx +1398 -0
  176. package/tools/AgentTool/UI.tsx +872 -0
  177. package/tools/AgentTool/agentColorManager.ts +66 -0
  178. package/tools/AgentTool/agentDisplay.ts +104 -0
  179. package/tools/AgentTool/agentMemory.ts +177 -0
  180. package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  181. package/tools/AgentTool/agentToolUtils.ts +686 -0
  182. package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  183. package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  184. package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  185. package/tools/AgentTool/built-in/planAgent.ts +92 -0
  186. package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  187. package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  188. package/tools/AgentTool/builtInAgents.ts +72 -0
  189. package/tools/AgentTool/constants.ts +12 -0
  190. package/tools/AgentTool/forkSubagent.ts +210 -0
  191. package/tools/AgentTool/loadAgentsDir.ts +755 -0
  192. package/tools/AgentTool/prompt.ts +287 -0
  193. package/tools/AgentTool/resumeAgent.ts +265 -0
  194. package/tools/AgentTool/runAgent.ts +973 -0
  195. package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  196. package/tools/AskUserQuestionTool/prompt.ts +44 -0
  197. package/tools/BashTool/BashTool.tsx +1144 -0
  198. package/tools/BashTool/BashToolResultMessage.tsx +191 -0
  199. package/tools/BashTool/UI.tsx +185 -0
  200. package/tools/BashTool/bashCommandHelpers.ts +265 -0
  201. package/tools/BashTool/bashPermissions.ts +2621 -0
  202. package/tools/BashTool/bashSecurity.ts +2592 -0
  203. package/tools/BashTool/commandSemantics.ts +140 -0
  204. package/tools/BashTool/commentLabel.ts +13 -0
  205. package/tools/BashTool/destructiveCommandWarning.ts +102 -0
  206. package/tools/BashTool/modeValidation.ts +115 -0
  207. package/tools/BashTool/pathValidation.ts +1303 -0
  208. package/tools/BashTool/prompt.ts +369 -0
  209. package/tools/BashTool/readOnlyValidation.ts +1990 -0
  210. package/tools/BashTool/sedEditParser.ts +322 -0
  211. package/tools/BashTool/sedValidation.ts +684 -0
  212. package/tools/BashTool/shouldUseSandbox.ts +153 -0
  213. package/tools/BashTool/toolName.ts +2 -0
  214. package/tools/BashTool/utils.ts +223 -0
  215. package/tools/BriefTool/BriefTool.ts +204 -0
  216. package/tools/BriefTool/UI.tsx +101 -0
  217. package/tools/BriefTool/attachments.ts +110 -0
  218. package/tools/BriefTool/prompt.ts +22 -0
  219. package/tools/BriefTool/upload.ts +174 -0
  220. package/tools/ConfigTool/ConfigTool.ts +467 -0
  221. package/tools/ConfigTool/UI.tsx +38 -0
  222. package/tools/ConfigTool/constants.ts +1 -0
  223. package/tools/ConfigTool/prompt.ts +93 -0
  224. package/tools/ConfigTool/supportedSettings.ts +211 -0
  225. package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  226. package/tools/EnterPlanModeTool/UI.tsx +33 -0
  227. package/tools/EnterPlanModeTool/constants.ts +1 -0
  228. package/tools/EnterPlanModeTool/prompt.ts +170 -0
  229. package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  230. package/tools/EnterWorktreeTool/UI.tsx +20 -0
  231. package/tools/EnterWorktreeTool/constants.ts +1 -0
  232. package/tools/EnterWorktreeTool/prompt.ts +30 -0
  233. package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  234. package/tools/ExitPlanModeTool/UI.tsx +82 -0
  235. package/tools/ExitPlanModeTool/constants.ts +2 -0
  236. package/tools/ExitPlanModeTool/prompt.ts +29 -0
  237. package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  238. package/tools/ExitWorktreeTool/UI.tsx +25 -0
  239. package/tools/ExitWorktreeTool/constants.ts +1 -0
  240. package/tools/ExitWorktreeTool/prompt.ts +32 -0
  241. package/tools/FileEditTool/FileEditTool.ts +625 -0
  242. package/tools/FileEditTool/UI.tsx +289 -0
  243. package/tools/FileEditTool/constants.ts +11 -0
  244. package/tools/FileEditTool/prompt.ts +28 -0
  245. package/tools/FileEditTool/types.ts +85 -0
  246. package/tools/FileEditTool/utils.ts +775 -0
  247. package/tools/FileReadTool/FileReadTool.ts +1183 -0
  248. package/tools/FileReadTool/UI.tsx +185 -0
  249. package/tools/FileReadTool/imageProcessor.ts +94 -0
  250. package/tools/FileReadTool/limits.ts +92 -0
  251. package/tools/FileReadTool/prompt.ts +49 -0
  252. package/tools/FileWriteTool/FileWriteTool.ts +434 -0
  253. package/tools/FileWriteTool/UI.tsx +405 -0
  254. package/tools/FileWriteTool/prompt.ts +18 -0
  255. package/tools/GlobTool/GlobTool.ts +198 -0
  256. package/tools/GlobTool/UI.tsx +63 -0
  257. package/tools/GlobTool/prompt.ts +7 -0
  258. package/tools/GrepTool/GrepTool.ts +577 -0
  259. package/tools/GrepTool/UI.tsx +201 -0
  260. package/tools/GrepTool/prompt.ts +18 -0
  261. package/tools/LSPTool/LSPTool.ts +860 -0
  262. package/tools/LSPTool/UI.tsx +228 -0
  263. package/tools/LSPTool/formatters.ts +592 -0
  264. package/tools/LSPTool/prompt.ts +21 -0
  265. package/tools/LSPTool/schemas.ts +215 -0
  266. package/tools/LSPTool/symbolContext.ts +90 -0
  267. package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  268. package/tools/ListMcpResourcesTool/UI.tsx +29 -0
  269. package/tools/ListMcpResourcesTool/prompt.ts +20 -0
  270. package/tools/MCPTool/MCPTool.ts +77 -0
  271. package/tools/MCPTool/UI.tsx +403 -0
  272. package/tools/MCPTool/classifyForCollapse.ts +604 -0
  273. package/tools/MCPTool/prompt.ts +3 -0
  274. package/tools/McpAuthTool/McpAuthTool.ts +215 -0
  275. package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  276. package/tools/NotebookEditTool/UI.tsx +93 -0
  277. package/tools/NotebookEditTool/constants.ts +2 -0
  278. package/tools/NotebookEditTool/prompt.ts +3 -0
  279. package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  280. package/tools/PowerShellTool/UI.tsx +131 -0
  281. package/tools/PowerShellTool/clmTypes.ts +211 -0
  282. package/tools/PowerShellTool/commandSemantics.ts +142 -0
  283. package/tools/PowerShellTool/commonParameters.ts +30 -0
  284. package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  285. package/tools/PowerShellTool/gitSafety.ts +176 -0
  286. package/tools/PowerShellTool/modeValidation.ts +404 -0
  287. package/tools/PowerShellTool/pathValidation.ts +2049 -0
  288. package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  289. package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  290. package/tools/PowerShellTool/prompt.ts +145 -0
  291. package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  292. package/tools/PowerShellTool/toolName.ts +2 -0
  293. package/tools/REPLTool/constants.ts +46 -0
  294. package/tools/REPLTool/primitiveTools.ts +39 -0
  295. package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  296. package/tools/ReadMcpResourceTool/UI.tsx +37 -0
  297. package/tools/ReadMcpResourceTool/prompt.ts +16 -0
  298. package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  299. package/tools/RemoteTriggerTool/UI.tsx +17 -0
  300. package/tools/RemoteTriggerTool/prompt.ts +15 -0
  301. package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  302. package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  303. package/tools/ScheduleCronTool/CronListTool.ts +97 -0
  304. package/tools/ScheduleCronTool/UI.tsx +60 -0
  305. package/tools/ScheduleCronTool/prompt.ts +135 -0
  306. package/tools/SendMessageTool/SendMessageTool.ts +917 -0
  307. package/tools/SendMessageTool/UI.tsx +31 -0
  308. package/tools/SendMessageTool/constants.ts +1 -0
  309. package/tools/SendMessageTool/prompt.ts +49 -0
  310. package/tools/SkillTool/SkillTool.ts +1108 -0
  311. package/tools/SkillTool/UI.tsx +128 -0
  312. package/tools/SkillTool/constants.ts +1 -0
  313. package/tools/SkillTool/prompt.ts +241 -0
  314. package/tools/SleepTool/prompt.ts +17 -0
  315. package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  316. package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  317. package/tools/TaskCreateTool/constants.ts +1 -0
  318. package/tools/TaskCreateTool/prompt.ts +56 -0
  319. package/tools/TaskGetTool/TaskGetTool.ts +128 -0
  320. package/tools/TaskGetTool/constants.ts +1 -0
  321. package/tools/TaskGetTool/prompt.ts +24 -0
  322. package/tools/TaskListTool/TaskListTool.ts +116 -0
  323. package/tools/TaskListTool/constants.ts +1 -0
  324. package/tools/TaskListTool/prompt.ts +49 -0
  325. package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  326. package/tools/TaskOutputTool/constants.ts +1 -0
  327. package/tools/TaskStopTool/TaskStopTool.ts +131 -0
  328. package/tools/TaskStopTool/UI.tsx +41 -0
  329. package/tools/TaskStopTool/prompt.ts +8 -0
  330. package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  331. package/tools/TaskUpdateTool/constants.ts +1 -0
  332. package/tools/TaskUpdateTool/prompt.ts +77 -0
  333. package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  334. package/tools/TeamCreateTool/UI.tsx +6 -0
  335. package/tools/TeamCreateTool/constants.ts +1 -0
  336. package/tools/TeamCreateTool/prompt.ts +113 -0
  337. package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  338. package/tools/TeamDeleteTool/UI.tsx +20 -0
  339. package/tools/TeamDeleteTool/constants.ts +1 -0
  340. package/tools/TeamDeleteTool/prompt.ts +16 -0
  341. package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  342. package/tools/TodoWriteTool/constants.ts +1 -0
  343. package/tools/TodoWriteTool/prompt.ts +184 -0
  344. package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  345. package/tools/ToolSearchTool/constants.ts +1 -0
  346. package/tools/ToolSearchTool/prompt.ts +121 -0
  347. package/tools/TungstenTool/TungstenTool.ts +4 -0
  348. package/tools/WebFetchTool/UI.tsx +72 -0
  349. package/tools/WebFetchTool/WebFetchTool.ts +318 -0
  350. package/tools/WebFetchTool/preapproved.ts +166 -0
  351. package/tools/WebFetchTool/prompt.ts +46 -0
  352. package/tools/WebFetchTool/utils.ts +530 -0
  353. package/tools/WebSearchTool/UI.tsx +101 -0
  354. package/tools/WebSearchTool/WebSearchTool.ts +435 -0
  355. package/tools/WebSearchTool/prompt.ts +34 -0
  356. package/tools/WorkflowTool/constants.ts +2 -0
  357. package/tools/XMemIngestTool/XMemIngestTool.ts +140 -0
  358. package/tools/XMemIngestTool/prompt.ts +13 -0
  359. package/tools/XMemRetrieveTool/XMemRetrieveTool.ts +177 -0
  360. package/tools/XMemRetrieveTool/prompt.ts +16 -0
  361. package/tools/XMemSearchTool/XMemSearchTool.ts +172 -0
  362. package/tools/XMemSearchTool/prompt.ts +11 -0
  363. package/tools/shared/gitOperationTracking.ts +277 -0
  364. package/tools/shared/spawnMultiAgent.ts +1093 -0
  365. package/tools/testing/TestingPermissionTool.tsx +74 -0
  366. package/tools/utils.ts +40 -0
  367. package/utils/CircularBuffer.ts +84 -0
  368. package/utils/Cursor.ts +1530 -0
  369. package/utils/QueryGuard.ts +121 -0
  370. package/utils/Shell.ts +474 -0
  371. package/utils/ShellCommand.ts +465 -0
  372. package/utils/abortController.ts +99 -0
  373. package/utils/activityManager.ts +164 -0
  374. package/utils/advisor.ts +145 -0
  375. package/utils/agentContext.ts +178 -0
  376. package/utils/agentId.ts +99 -0
  377. package/utils/agentSwarmsEnabled.ts +44 -0
  378. package/utils/agenticSessionSearch.ts +307 -0
  379. package/utils/analyzeContext.ts +1382 -0
  380. package/utils/ansiToPng.ts +334 -0
  381. package/utils/ansiToSvg.ts +272 -0
  382. package/utils/api.ts +718 -0
  383. package/utils/apiPreconnect.ts +71 -0
  384. package/utils/appleTerminalBackup.ts +124 -0
  385. package/utils/argumentSubstitution.ts +145 -0
  386. package/utils/array.ts +13 -0
  387. package/utils/asciicast.ts +239 -0
  388. package/utils/attachments.ts +4091 -0
  389. package/utils/attribution.ts +393 -0
  390. package/utils/auth.ts +2002 -0
  391. package/utils/authFileDescriptor.ts +196 -0
  392. package/utils/authPortable.ts +19 -0
  393. package/utils/autoModeDenials.ts +26 -0
  394. package/utils/autoRunIssue.tsx +122 -0
  395. package/utils/autoUpdater.ts +561 -0
  396. package/utils/aws.ts +74 -0
  397. package/utils/awsAuthStatusManager.ts +81 -0
  398. package/utils/axios.ts +8 -0
  399. package/utils/background/remote/preconditions.ts +235 -0
  400. package/utils/background/remote/remoteSession.ts +98 -0
  401. package/utils/backgroundHousekeeping.ts +94 -0
  402. package/utils/bash/ParsedCommand.ts +318 -0
  403. package/utils/bash/ShellSnapshot.ts +582 -0
  404. package/utils/bash/ast.ts +2679 -0
  405. package/utils/bash/bashParser.ts +4436 -0
  406. package/utils/bash/bashPipeCommand.ts +294 -0
  407. package/utils/bash/commands.ts +1339 -0
  408. package/utils/bash/heredoc.ts +733 -0
  409. package/utils/bash/parser.ts +230 -0
  410. package/utils/bash/prefix.ts +204 -0
  411. package/utils/bash/registry.ts +53 -0
  412. package/utils/bash/shellCompletion.ts +259 -0
  413. package/utils/bash/shellPrefix.ts +28 -0
  414. package/utils/bash/shellQuote.ts +304 -0
  415. package/utils/bash/shellQuoting.ts +128 -0
  416. package/utils/bash/specs/alias.ts +14 -0
  417. package/utils/bash/specs/index.ts +18 -0
  418. package/utils/bash/specs/nohup.ts +13 -0
  419. package/utils/bash/specs/pyright.ts +91 -0
  420. package/utils/bash/specs/sleep.ts +13 -0
  421. package/utils/bash/specs/srun.ts +31 -0
  422. package/utils/bash/specs/time.ts +13 -0
  423. package/utils/bash/specs/timeout.ts +20 -0
  424. package/utils/bash/treeSitterAnalysis.ts +506 -0
  425. package/utils/betas.ts +434 -0
  426. package/utils/billing.ts +78 -0
  427. package/utils/binaryCheck.ts +53 -0
  428. package/utils/browser.ts +68 -0
  429. package/utils/bufferedWriter.ts +100 -0
  430. package/utils/bundledMode.ts +22 -0
  431. package/utils/caCerts.ts +115 -0
  432. package/utils/caCertsConfig.ts +88 -0
  433. package/utils/cachePaths.ts +38 -0
  434. package/utils/classifierApprovals.ts +88 -0
  435. package/utils/classifierApprovalsHook.ts +17 -0
  436. package/utils/claudeCodeHints.ts +193 -0
  437. package/utils/claudeDesktop.ts +152 -0
  438. package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  439. package/utils/claudeInChrome/common.ts +540 -0
  440. package/utils/claudeInChrome/mcpServer.ts +292 -0
  441. package/utils/claudeInChrome/prompt.ts +83 -0
  442. package/utils/claudeInChrome/setup.ts +400 -0
  443. package/utils/claudeInChrome/setupPortable.ts +233 -0
  444. package/utils/claudeInChrome/toolRendering.tsx +262 -0
  445. package/utils/claudemd.ts +1479 -0
  446. package/utils/cleanup.ts +602 -0
  447. package/utils/cleanupRegistry.ts +25 -0
  448. package/utils/cliArgs.ts +60 -0
  449. package/utils/cliHighlight.ts +54 -0
  450. package/utils/codeIndexing.ts +206 -0
  451. package/utils/collapseBackgroundBashNotifications.ts +84 -0
  452. package/utils/collapseHookSummaries.ts +59 -0
  453. package/utils/collapseReadSearch.ts +1109 -0
  454. package/utils/collapseTeammateShutdowns.ts +55 -0
  455. package/utils/color-diff-mock.ts +27 -0
  456. package/utils/combinedAbortSignal.ts +47 -0
  457. package/utils/commandLifecycle.ts +21 -0
  458. package/utils/commitAttribution.ts +961 -0
  459. package/utils/completionCache.ts +166 -0
  460. package/utils/computerUse/appNames.ts +196 -0
  461. package/utils/computerUse/cleanup.ts +86 -0
  462. package/utils/computerUse/common.ts +61 -0
  463. package/utils/computerUse/computerUseLock.ts +215 -0
  464. package/utils/computerUse/drainRunLoop.ts +79 -0
  465. package/utils/computerUse/escHotkey.ts +54 -0
  466. package/utils/computerUse/executor.ts +658 -0
  467. package/utils/computerUse/gates.ts +72 -0
  468. package/utils/computerUse/hostAdapter.ts +69 -0
  469. package/utils/computerUse/inputLoader.ts +30 -0
  470. package/utils/computerUse/mcpServer.ts +106 -0
  471. package/utils/computerUse/setup.ts +53 -0
  472. package/utils/computerUse/swiftLoader.ts +23 -0
  473. package/utils/computerUse/toolRendering.tsx +125 -0
  474. package/utils/computerUse/wrapper.tsx +336 -0
  475. package/utils/concurrentSessions.ts +204 -0
  476. package/utils/config.ts +1817 -0
  477. package/utils/configConstants.ts +21 -0
  478. package/utils/contentArray.ts +51 -0
  479. package/utils/context.ts +221 -0
  480. package/utils/contextAnalysis.ts +272 -0
  481. package/utils/contextSuggestions.ts +235 -0
  482. package/utils/controlMessageCompat.ts +32 -0
  483. package/utils/conversationRecovery.ts +597 -0
  484. package/utils/cron.ts +308 -0
  485. package/utils/cronJitterConfig.ts +75 -0
  486. package/utils/cronScheduler.ts +565 -0
  487. package/utils/cronTasks.ts +458 -0
  488. package/utils/cronTasksLock.ts +195 -0
  489. package/utils/crossProjectResume.ts +75 -0
  490. package/utils/crypto.ts +13 -0
  491. package/utils/cwd.ts +32 -0
  492. package/utils/debug.ts +268 -0
  493. package/utils/debugFilter.ts +157 -0
  494. package/utils/deepLink/banner.ts +123 -0
  495. package/utils/deepLink/parseDeepLink.ts +170 -0
  496. package/utils/deepLink/protocolHandler.ts +136 -0
  497. package/utils/deepLink/registerProtocol.ts +348 -0
  498. package/utils/deepLink/terminalLauncher.ts +557 -0
  499. package/utils/deepLink/terminalPreference.ts +54 -0
  500. package/utils/desktopDeepLink.ts +236 -0
  501. package/utils/detectRepository.ts +178 -0
  502. package/utils/diagLogs.ts +94 -0
  503. package/utils/diff.ts +177 -0
  504. package/utils/directMemberMessage.ts +69 -0
  505. package/utils/displayTags.ts +51 -0
  506. package/utils/doctorContextWarnings.ts +265 -0
  507. package/utils/doctorDiagnostic.ts +625 -0
  508. package/utils/dxt/helpers.ts +88 -0
  509. package/utils/dxt/zip.ts +226 -0
  510. package/utils/earlyInput.ts +191 -0
  511. package/utils/editor.ts +183 -0
  512. package/utils/effort.ts +329 -0
  513. package/utils/embeddedTools.ts +29 -0
  514. package/utils/env.ts +347 -0
  515. package/utils/envDynamic.ts +151 -0
  516. package/utils/envUtils.ts +183 -0
  517. package/utils/envValidation.ts +38 -0
  518. package/utils/errorLogSink.ts +235 -0
  519. package/utils/errors.ts +238 -0
  520. package/utils/exampleCommands.ts +184 -0
  521. package/utils/execFileNoThrow.ts +150 -0
  522. package/utils/execFileNoThrowPortable.ts +89 -0
  523. package/utils/execSyncWrapper.ts +38 -0
  524. package/utils/exportRenderer.tsx +98 -0
  525. package/utils/extraUsage.ts +23 -0
  526. package/utils/fastMode.ts +532 -0
  527. package/utils/file.ts +584 -0
  528. package/utils/fileHistory.ts +1115 -0
  529. package/utils/fileOperationAnalytics.ts +71 -0
  530. package/utils/filePersistence/filePersistence.ts +287 -0
  531. package/utils/filePersistence/outputsScanner.ts +126 -0
  532. package/utils/fileRead.ts +102 -0
  533. package/utils/fileReadCache.ts +96 -0
  534. package/utils/fileStateCache.ts +142 -0
  535. package/utils/findExecutable.ts +17 -0
  536. package/utils/fingerprint.ts +76 -0
  537. package/utils/forkedAgent.ts +689 -0
  538. package/utils/format.ts +308 -0
  539. package/utils/formatBriefTimestamp.ts +81 -0
  540. package/utils/fpsTracker.ts +47 -0
  541. package/utils/frontmatterParser.ts +370 -0
  542. package/utils/fsOperations.ts +770 -0
  543. package/utils/fullscreen.ts +202 -0
  544. package/utils/generatedFiles.ts +136 -0
  545. package/utils/generators.ts +88 -0
  546. package/utils/genericProcessUtils.ts +184 -0
  547. package/utils/getWorktreePaths.ts +70 -0
  548. package/utils/getWorktreePathsPortable.ts +27 -0
  549. package/utils/ghPrStatus.ts +106 -0
  550. package/utils/git/gitConfigParser.ts +277 -0
  551. package/utils/git/gitFilesystem.ts +699 -0
  552. package/utils/git/gitignore.ts +99 -0
  553. package/utils/git.ts +926 -0
  554. package/utils/gitDiff.ts +532 -0
  555. package/utils/gitSettings.ts +18 -0
  556. package/utils/github/ghAuthStatus.ts +29 -0
  557. package/utils/githubRepoPathMapping.ts +162 -0
  558. package/utils/glob.ts +130 -0
  559. package/utils/gracefulShutdown.ts +529 -0
  560. package/utils/groupToolUses.ts +182 -0
  561. package/utils/handlePromptSubmit.ts +610 -0
  562. package/utils/hash.ts +46 -0
  563. package/utils/headlessProfiler.ts +178 -0
  564. package/utils/heapDumpService.ts +303 -0
  565. package/utils/heatmap.ts +198 -0
  566. package/utils/highlightMatch.tsx +28 -0
  567. package/utils/hooks/AsyncHookRegistry.ts +309 -0
  568. package/utils/hooks/apiQueryHookHelper.ts +141 -0
  569. package/utils/hooks/execAgentHook.ts +339 -0
  570. package/utils/hooks/execHttpHook.ts +242 -0
  571. package/utils/hooks/execPromptHook.ts +211 -0
  572. package/utils/hooks/fileChangedWatcher.ts +191 -0
  573. package/utils/hooks/hookEvents.ts +192 -0
  574. package/utils/hooks/hookHelpers.ts +83 -0
  575. package/utils/hooks/hooksConfigManager.ts +400 -0
  576. package/utils/hooks/hooksConfigSnapshot.ts +133 -0
  577. package/utils/hooks/hooksSettings.ts +271 -0
  578. package/utils/hooks/postSamplingHooks.ts +70 -0
  579. package/utils/hooks/registerFrontmatterHooks.ts +67 -0
  580. package/utils/hooks/registerSkillHooks.ts +64 -0
  581. package/utils/hooks/sessionHooks.ts +447 -0
  582. package/utils/hooks/skillImprovement.ts +267 -0
  583. package/utils/hooks/ssrfGuard.ts +294 -0
  584. package/utils/hooks.ts +5022 -0
  585. package/utils/horizontalScroll.ts +137 -0
  586. package/utils/http.ts +136 -0
  587. package/utils/hyperlink.ts +39 -0
  588. package/utils/iTermBackup.ts +73 -0
  589. package/utils/ide.ts +1494 -0
  590. package/utils/idePathConversion.ts +90 -0
  591. package/utils/idleTimeout.ts +53 -0
  592. package/utils/imagePaste.ts +416 -0
  593. package/utils/imageResizer.ts +880 -0
  594. package/utils/imageStore.ts +167 -0
  595. package/utils/imageValidation.ts +104 -0
  596. package/utils/immediateCommand.ts +15 -0
  597. package/utils/inProcessTeammateHelpers.ts +102 -0
  598. package/utils/ink.ts +26 -0
  599. package/utils/intl.ts +94 -0
  600. package/utils/jetbrains.ts +191 -0
  601. package/utils/json.ts +277 -0
  602. package/utils/jsonRead.ts +16 -0
  603. package/utils/keyboardShortcuts.ts +14 -0
  604. package/utils/lazySchema.ts +8 -0
  605. package/utils/listSessionsImpl.ts +454 -0
  606. package/utils/localInstaller.ts +162 -0
  607. package/utils/lockfile.ts +43 -0
  608. package/utils/log.ts +362 -0
  609. package/utils/logoV2Utils.ts +347 -0
  610. package/utils/mailbox.ts +73 -0
  611. package/utils/managedEnv.ts +199 -0
  612. package/utils/managedEnvConstants.ts +191 -0
  613. package/utils/markdown.ts +381 -0
  614. package/utils/markdownConfigLoader.ts +600 -0
  615. package/utils/mcp/dateTimeParser.ts +121 -0
  616. package/utils/mcp/elicitationValidation.ts +336 -0
  617. package/utils/mcpInstructionsDelta.ts +130 -0
  618. package/utils/mcpOutputStorage.ts +189 -0
  619. package/utils/mcpValidation.ts +208 -0
  620. package/utils/mcpWebSocketTransport.ts +200 -0
  621. package/utils/memoize.ts +269 -0
  622. package/utils/memory/types.ts +12 -0
  623. package/utils/memory/versions.ts +8 -0
  624. package/utils/memoryFileDetection.ts +289 -0
  625. package/utils/messagePredicates.ts +8 -0
  626. package/utils/messageQueueManager.ts +547 -0
  627. package/utils/messages/mappers.ts +290 -0
  628. package/utils/messages/systemInit.ts +96 -0
  629. package/utils/messages.ts +5520 -0
  630. package/utils/model/agent.ts +157 -0
  631. package/utils/model/aliases.ts +35 -0
  632. package/utils/model/antModels.ts +64 -0
  633. package/utils/model/bedrock.ts +265 -0
  634. package/utils/model/check1mAccess.ts +72 -0
  635. package/utils/model/configs.ts +158 -0
  636. package/utils/model/contextWindowUpgradeCheck.ts +47 -0
  637. package/utils/model/deprecation.ts +101 -0
  638. package/utils/model/model.ts +654 -0
  639. package/utils/model/modelAllowlist.ts +170 -0
  640. package/utils/model/modelCapabilities.ts +118 -0
  641. package/utils/model/modelOptions.ts +589 -0
  642. package/utils/model/modelStrings.ts +170 -0
  643. package/utils/model/modelSupportOverrides.ts +50 -0
  644. package/utils/model/providers.ts +42 -0
  645. package/utils/model/validateModel.ts +159 -0
  646. package/utils/modelCost.ts +231 -0
  647. package/utils/modifiers.ts +36 -0
  648. package/utils/mtls.ts +179 -0
  649. package/utils/nativeInstaller/download.ts +523 -0
  650. package/utils/nativeInstaller/index.ts +18 -0
  651. package/utils/nativeInstaller/installer.ts +1708 -0
  652. package/utils/nativeInstaller/packageManagers.ts +336 -0
  653. package/utils/nativeInstaller/pidLock.ts +433 -0
  654. package/utils/notebook.ts +224 -0
  655. package/utils/objectGroupBy.ts +18 -0
  656. package/utils/pasteStore.ts +104 -0
  657. package/utils/path.ts +155 -0
  658. package/utils/pdf.ts +300 -0
  659. package/utils/pdfUtils.ts +70 -0
  660. package/utils/peerAddress.ts +21 -0
  661. package/utils/permissions/PermissionMode.ts +141 -0
  662. package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  663. package/utils/permissions/PermissionResult.ts +35 -0
  664. package/utils/permissions/PermissionRule.ts +40 -0
  665. package/utils/permissions/PermissionUpdate.ts +389 -0
  666. package/utils/permissions/PermissionUpdateSchema.ts +78 -0
  667. package/utils/permissions/autoModeState.ts +39 -0
  668. package/utils/permissions/bashClassifier.ts +61 -0
  669. package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  670. package/utils/permissions/classifierDecision.ts +98 -0
  671. package/utils/permissions/classifierShared.ts +39 -0
  672. package/utils/permissions/dangerousPatterns.ts +80 -0
  673. package/utils/permissions/denialTracking.ts +45 -0
  674. package/utils/permissions/filesystem.ts +1777 -0
  675. package/utils/permissions/getNextPermissionMode.ts +101 -0
  676. package/utils/permissions/pathValidation.ts +485 -0
  677. package/utils/permissions/permissionExplainer.ts +250 -0
  678. package/utils/permissions/permissionRuleParser.ts +198 -0
  679. package/utils/permissions/permissionSetup.ts +1532 -0
  680. package/utils/permissions/permissions.ts +1486 -0
  681. package/utils/permissions/permissionsLoader.ts +296 -0
  682. package/utils/permissions/shadowedRuleDetection.ts +234 -0
  683. package/utils/permissions/shellRuleMatching.ts +228 -0
  684. package/utils/permissions/yoloClassifier.ts +1495 -0
  685. package/utils/planModeV2.ts +95 -0
  686. package/utils/plans.ts +397 -0
  687. package/utils/platform.ts +150 -0
  688. package/utils/plugins/addDirPluginSettings.ts +71 -0
  689. package/utils/plugins/cacheUtils.ts +196 -0
  690. package/utils/plugins/dependencyResolver.ts +305 -0
  691. package/utils/plugins/fetchTelemetry.ts +135 -0
  692. package/utils/plugins/gitAvailability.ts +69 -0
  693. package/utils/plugins/headlessPluginInstall.ts +174 -0
  694. package/utils/plugins/hintRecommendation.ts +164 -0
  695. package/utils/plugins/installCounts.ts +292 -0
  696. package/utils/plugins/installedPluginsManager.ts +1268 -0
  697. package/utils/plugins/loadPluginAgents.ts +348 -0
  698. package/utils/plugins/loadPluginCommands.ts +946 -0
  699. package/utils/plugins/loadPluginHooks.ts +287 -0
  700. package/utils/plugins/loadPluginOutputStyles.ts +178 -0
  701. package/utils/plugins/lspPluginIntegration.ts +387 -0
  702. package/utils/plugins/lspRecommendation.ts +374 -0
  703. package/utils/plugins/managedPlugins.ts +27 -0
  704. package/utils/plugins/marketplaceHelpers.ts +592 -0
  705. package/utils/plugins/marketplaceManager.ts +2643 -0
  706. package/utils/plugins/mcpPluginIntegration.ts +634 -0
  707. package/utils/plugins/mcpbHandler.ts +968 -0
  708. package/utils/plugins/officialMarketplace.ts +25 -0
  709. package/utils/plugins/officialMarketplaceGcs.ts +216 -0
  710. package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  711. package/utils/plugins/orphanedPluginFilter.ts +114 -0
  712. package/utils/plugins/parseMarketplaceInput.ts +162 -0
  713. package/utils/plugins/performStartupChecks.tsx +70 -0
  714. package/utils/plugins/pluginAutoupdate.ts +284 -0
  715. package/utils/plugins/pluginBlocklist.ts +127 -0
  716. package/utils/plugins/pluginDirectories.ts +178 -0
  717. package/utils/plugins/pluginFlagging.ts +208 -0
  718. package/utils/plugins/pluginIdentifier.ts +123 -0
  719. package/utils/plugins/pluginInstallationHelpers.ts +595 -0
  720. package/utils/plugins/pluginLoader.ts +3302 -0
  721. package/utils/plugins/pluginOptionsStorage.ts +400 -0
  722. package/utils/plugins/pluginPolicy.ts +20 -0
  723. package/utils/plugins/pluginStartupCheck.ts +341 -0
  724. package/utils/plugins/pluginVersioning.ts +157 -0
  725. package/utils/plugins/reconciler.ts +265 -0
  726. package/utils/plugins/refresh.ts +215 -0
  727. package/utils/plugins/schemas.ts +1681 -0
  728. package/utils/plugins/validatePlugin.ts +903 -0
  729. package/utils/plugins/walkPluginMarkdown.ts +69 -0
  730. package/utils/plugins/zipCache.ts +406 -0
  731. package/utils/plugins/zipCacheAdapters.ts +164 -0
  732. package/utils/powershell/dangerousCmdlets.ts +185 -0
  733. package/utils/powershell/parser.ts +1804 -0
  734. package/utils/powershell/staticPrefix.ts +316 -0
  735. package/utils/preflightChecks.tsx +151 -0
  736. package/utils/privacyLevel.ts +55 -0
  737. package/utils/process.ts +68 -0
  738. package/utils/processUserInput/processBashCommand.tsx +140 -0
  739. package/utils/processUserInput/processSlashCommand.tsx +922 -0
  740. package/utils/processUserInput/processTextPrompt.ts +100 -0
  741. package/utils/processUserInput/processUserInput.ts +605 -0
  742. package/utils/profilerBase.ts +46 -0
  743. package/utils/promptCategory.ts +49 -0
  744. package/utils/promptEditor.ts +188 -0
  745. package/utils/promptShellExecution.ts +183 -0
  746. package/utils/proxy.ts +426 -0
  747. package/utils/queryContext.ts +179 -0
  748. package/utils/queryHelpers.ts +552 -0
  749. package/utils/queryProfiler.ts +301 -0
  750. package/utils/queueProcessor.ts +95 -0
  751. package/utils/readEditContext.ts +227 -0
  752. package/utils/readFileInRange.ts +383 -0
  753. package/utils/releaseNotes.ts +360 -0
  754. package/utils/renderOptions.ts +113 -0
  755. package/utils/ripgrep.ts +679 -0
  756. package/utils/sandbox/sandbox-adapter.ts +985 -0
  757. package/utils/sandbox/sandbox-ui-utils.ts +12 -0
  758. package/utils/sanitization.ts +91 -0
  759. package/utils/screenshotClipboard.ts +121 -0
  760. package/utils/sdkEventQueue.ts +134 -0
  761. package/utils/secureStorage/fallbackStorage.ts +70 -0
  762. package/utils/secureStorage/index.ts +17 -0
  763. package/utils/secureStorage/keychainPrefetch.ts +116 -0
  764. package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  765. package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  766. package/utils/secureStorage/plainTextStorage.ts +84 -0
  767. package/utils/semanticBoolean.ts +29 -0
  768. package/utils/semanticNumber.ts +36 -0
  769. package/utils/semver.ts +59 -0
  770. package/utils/sequential.ts +56 -0
  771. package/utils/sessionActivity.ts +133 -0
  772. package/utils/sessionEnvVars.ts +22 -0
  773. package/utils/sessionEnvironment.ts +166 -0
  774. package/utils/sessionFileAccessHooks.ts +250 -0
  775. package/utils/sessionIngressAuth.ts +140 -0
  776. package/utils/sessionRestore.ts +551 -0
  777. package/utils/sessionStart.ts +232 -0
  778. package/utils/sessionState.ts +150 -0
  779. package/utils/sessionStorage.ts +5105 -0
  780. package/utils/sessionStoragePortable.ts +793 -0
  781. package/utils/sessionTitle.ts +129 -0
  782. package/utils/sessionUrl.ts +64 -0
  783. package/utils/set.ts +53 -0
  784. package/utils/settings/allErrors.ts +32 -0
  785. package/utils/settings/applySettingsChange.ts +92 -0
  786. package/utils/settings/changeDetector.ts +488 -0
  787. package/utils/settings/constants.ts +202 -0
  788. package/utils/settings/internalWrites.ts +37 -0
  789. package/utils/settings/managedPath.ts +34 -0
  790. package/utils/settings/mdm/constants.ts +81 -0
  791. package/utils/settings/mdm/rawRead.ts +130 -0
  792. package/utils/settings/mdm/settings.ts +316 -0
  793. package/utils/settings/permissionValidation.ts +262 -0
  794. package/utils/settings/pluginOnlyPolicy.ts +60 -0
  795. package/utils/settings/schemaOutput.ts +8 -0
  796. package/utils/settings/settings.ts +1015 -0
  797. package/utils/settings/settingsCache.ts +80 -0
  798. package/utils/settings/toolValidationConfig.ts +103 -0
  799. package/utils/settings/types.ts +1149 -0
  800. package/utils/settings/validateEditTool.ts +45 -0
  801. package/utils/settings/validation.ts +265 -0
  802. package/utils/settings/validationTips.ts +164 -0
  803. package/utils/shell/bashProvider.ts +255 -0
  804. package/utils/shell/outputLimits.ts +14 -0
  805. package/utils/shell/powershellDetection.ts +107 -0
  806. package/utils/shell/powershellProvider.ts +123 -0
  807. package/utils/shell/prefix.ts +367 -0
  808. package/utils/shell/readOnlyCommandValidation.ts +1893 -0
  809. package/utils/shell/resolveDefaultShell.ts +14 -0
  810. package/utils/shell/shellProvider.ts +33 -0
  811. package/utils/shell/shellToolUtils.ts +22 -0
  812. package/utils/shell/specPrefix.ts +241 -0
  813. package/utils/shellConfig.ts +167 -0
  814. package/utils/sideQuery.ts +222 -0
  815. package/utils/sideQuestion.ts +155 -0
  816. package/utils/signal.ts +43 -0
  817. package/utils/sinks.ts +16 -0
  818. package/utils/skills/skillChangeDetector.ts +311 -0
  819. package/utils/slashCommandParsing.ts +60 -0
  820. package/utils/sleep.ts +84 -0
  821. package/utils/sliceAnsi.ts +91 -0
  822. package/utils/slowOperations.ts +286 -0
  823. package/utils/standaloneAgent.ts +23 -0
  824. package/utils/startupProfiler.ts +194 -0
  825. package/utils/staticRender.tsx +116 -0
  826. package/utils/stats.ts +1061 -0
  827. package/utils/statsCache.ts +434 -0
  828. package/utils/status.tsx +362 -0
  829. package/utils/statusNoticeDefinitions.tsx +198 -0
  830. package/utils/statusNoticeHelpers.ts +20 -0
  831. package/utils/stream.ts +76 -0
  832. package/utils/streamJsonStdoutGuard.ts +123 -0
  833. package/utils/streamlinedTransform.ts +201 -0
  834. package/utils/stringUtils.ts +235 -0
  835. package/utils/subprocessEnv.ts +99 -0
  836. package/utils/suggestions/commandSuggestions.ts +567 -0
  837. package/utils/suggestions/directoryCompletion.ts +263 -0
  838. package/utils/suggestions/shellHistoryCompletion.ts +119 -0
  839. package/utils/suggestions/skillUsageTracking.ts +55 -0
  840. package/utils/suggestions/slackChannelSuggestions.ts +209 -0
  841. package/utils/swarm/It2SetupPrompt.tsx +380 -0
  842. package/utils/swarm/backends/ITermBackend.ts +370 -0
  843. package/utils/swarm/backends/InProcessBackend.ts +339 -0
  844. package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  845. package/utils/swarm/backends/TmuxBackend.ts +764 -0
  846. package/utils/swarm/backends/detection.ts +128 -0
  847. package/utils/swarm/backends/it2Setup.ts +245 -0
  848. package/utils/swarm/backends/registry.ts +464 -0
  849. package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  850. package/utils/swarm/backends/types.ts +311 -0
  851. package/utils/swarm/constants.ts +33 -0
  852. package/utils/swarm/inProcessRunner.ts +1552 -0
  853. package/utils/swarm/leaderPermissionBridge.ts +54 -0
  854. package/utils/swarm/permissionSync.ts +928 -0
  855. package/utils/swarm/reconnection.ts +119 -0
  856. package/utils/swarm/spawnInProcess.ts +328 -0
  857. package/utils/swarm/spawnUtils.ts +146 -0
  858. package/utils/swarm/teamHelpers.ts +683 -0
  859. package/utils/swarm/teammateInit.ts +129 -0
  860. package/utils/swarm/teammateLayoutManager.ts +107 -0
  861. package/utils/swarm/teammateModel.ts +10 -0
  862. package/utils/swarm/teammatePromptAddendum.ts +18 -0
  863. package/utils/systemDirectories.ts +74 -0
  864. package/utils/systemPrompt.ts +123 -0
  865. package/utils/systemPromptType.ts +14 -0
  866. package/utils/systemTheme.ts +119 -0
  867. package/utils/taggedId.ts +54 -0
  868. package/utils/task/TaskOutput.ts +390 -0
  869. package/utils/task/diskOutput.ts +451 -0
  870. package/utils/task/framework.ts +308 -0
  871. package/utils/task/outputFormatting.ts +38 -0
  872. package/utils/task/sdkProgress.ts +36 -0
  873. package/utils/tasks.ts +862 -0
  874. package/utils/teamDiscovery.ts +81 -0
  875. package/utils/teamMemoryOps.ts +88 -0
  876. package/utils/teammate.ts +292 -0
  877. package/utils/teammateContext.ts +96 -0
  878. package/utils/teammateMailbox.ts +1183 -0
  879. package/utils/telemetry/betaSessionTracing.ts +491 -0
  880. package/utils/telemetry/bigqueryExporter.ts +252 -0
  881. package/utils/telemetry/events.ts +75 -0
  882. package/utils/telemetry/instrumentation.ts +825 -0
  883. package/utils/telemetry/logger.ts +26 -0
  884. package/utils/telemetry/perfettoTracing.ts +1120 -0
  885. package/utils/telemetry/pluginTelemetry.ts +289 -0
  886. package/utils/telemetry/sessionTracing.ts +927 -0
  887. package/utils/telemetry/skillLoadedEvent.ts +39 -0
  888. package/utils/telemetryAttributes.ts +71 -0
  889. package/utils/teleport/api.ts +466 -0
  890. package/utils/teleport/environmentSelection.ts +77 -0
  891. package/utils/teleport/environments.ts +120 -0
  892. package/utils/teleport/gitBundle.ts +292 -0
  893. package/utils/teleport.tsx +1226 -0
  894. package/utils/tempfile.ts +31 -0
  895. package/utils/terminal.ts +131 -0
  896. package/utils/terminalPanel.ts +191 -0
  897. package/utils/textHighlighting.ts +166 -0
  898. package/utils/theme.ts +639 -0
  899. package/utils/thinking.ts +162 -0
  900. package/utils/timeouts.ts +39 -0
  901. package/utils/tmuxSocket.ts +427 -0
  902. package/utils/todo/types.ts +18 -0
  903. package/utils/tokenBudget.ts +73 -0
  904. package/utils/tokens.ts +261 -0
  905. package/utils/toolErrors.ts +132 -0
  906. package/utils/toolPool.ts +79 -0
  907. package/utils/toolResultStorage.ts +1040 -0
  908. package/utils/toolSchemaCache.ts +26 -0
  909. package/utils/toolSearch.ts +756 -0
  910. package/utils/transcriptSearch.ts +202 -0
  911. package/utils/treeify.ts +170 -0
  912. package/utils/truncate.ts +179 -0
  913. package/utils/ultraplan/ccrSession.ts +349 -0
  914. package/utils/ultraplan/keyword.ts +127 -0
  915. package/utils/ultraplan/prompt.txt +1 -0
  916. package/utils/unaryLogging.ts +39 -0
  917. package/utils/undercover.ts +89 -0
  918. package/utils/user.ts +194 -0
  919. package/utils/userAgent.ts +10 -0
  920. package/utils/userPromptKeywords.ts +27 -0
  921. package/utils/uuid.ts +27 -0
  922. package/utils/warningHandler.ts +121 -0
  923. package/utils/which.ts +82 -0
  924. package/utils/windowsPaths.ts +173 -0
  925. package/utils/withResolvers.ts +13 -0
  926. package/utils/words.ts +800 -0
  927. package/utils/workloadContext.ts +57 -0
  928. package/utils/worktree.ts +1519 -0
  929. package/utils/worktreeModeEnabled.ts +11 -0
  930. package/utils/xdg.ts +65 -0
  931. package/utils/xmem.ts +6 -0
  932. package/utils/xml.ts +16 -0
  933. package/utils/yaml.ts +15 -0
  934. package/utils/zodToJsonSchema.ts +23 -0
@@ -0,0 +1,167 @@
1
+ import { mkdir, open } from 'fs/promises'
2
+ import { join } from 'path'
3
+ import { getSessionId } from '../bootstrap/state.js'
4
+ import type { PastedContent } from './config.js'
5
+ import { logForDebugging } from './debug.js'
6
+ import { getClaudeConfigHomeDir } from './envUtils.js'
7
+ import { getFsImplementation } from './fsOperations.js'
8
+
9
+ const IMAGE_STORE_DIR = 'image-cache'
10
+ const MAX_STORED_IMAGE_PATHS = 200
11
+
12
+ // In-memory cache of stored image paths
13
+ const storedImagePaths = new Map<number, string>()
14
+
15
+ /**
16
+ * Get the image store directory for the current session.
17
+ */
18
+ function getImageStoreDir(): string {
19
+ return join(getClaudeConfigHomeDir(), IMAGE_STORE_DIR, getSessionId())
20
+ }
21
+
22
+ /**
23
+ * Ensure the image store directory exists.
24
+ */
25
+ async function ensureImageStoreDir(): Promise<void> {
26
+ const dir = getImageStoreDir()
27
+ await mkdir(dir, { recursive: true })
28
+ }
29
+
30
+ /**
31
+ * Get the file path for an image by ID.
32
+ */
33
+ function getImagePath(imageId: number, mediaType: string): string {
34
+ const extension = mediaType.split('/')[1] || 'png'
35
+ return join(getImageStoreDir(), `${imageId}.${extension}`)
36
+ }
37
+
38
+ /**
39
+ * Cache the image path immediately (fast, no file I/O).
40
+ */
41
+ export function cacheImagePath(content: PastedContent): string | null {
42
+ if (content.type !== 'image') {
43
+ return null
44
+ }
45
+ const imagePath = getImagePath(content.id, content.mediaType || 'image/png')
46
+ evictOldestIfAtCap()
47
+ storedImagePaths.set(content.id, imagePath)
48
+ return imagePath
49
+ }
50
+
51
+ /**
52
+ * Store an image from pastedContents to disk.
53
+ */
54
+ export async function storeImage(
55
+ content: PastedContent,
56
+ ): Promise<string | null> {
57
+ if (content.type !== 'image') {
58
+ return null
59
+ }
60
+
61
+ try {
62
+ await ensureImageStoreDir()
63
+ const imagePath = getImagePath(content.id, content.mediaType || 'image/png')
64
+ const fh = await open(imagePath, 'w', 0o600)
65
+ try {
66
+ await fh.writeFile(content.content, { encoding: 'base64' })
67
+ await fh.datasync()
68
+ } finally {
69
+ await fh.close()
70
+ }
71
+ evictOldestIfAtCap()
72
+ storedImagePaths.set(content.id, imagePath)
73
+ logForDebugging(`Stored image ${content.id} to ${imagePath}`)
74
+ return imagePath
75
+ } catch (error) {
76
+ logForDebugging(`Failed to store image: ${error}`)
77
+ return null
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Store all images from pastedContents to disk.
83
+ */
84
+ export async function storeImages(
85
+ pastedContents: Record<number, PastedContent>,
86
+ ): Promise<Map<number, string>> {
87
+ const pathMap = new Map<number, string>()
88
+
89
+ for (const [id, content] of Object.entries(pastedContents)) {
90
+ if (content.type === 'image') {
91
+ const path = await storeImage(content)
92
+ if (path) {
93
+ pathMap.set(Number(id), path)
94
+ }
95
+ }
96
+ }
97
+
98
+ return pathMap
99
+ }
100
+
101
+ /**
102
+ * Get the file path for a stored image by ID.
103
+ */
104
+ export function getStoredImagePath(imageId: number): string | null {
105
+ return storedImagePaths.get(imageId) ?? null
106
+ }
107
+
108
+ /**
109
+ * Clear the in-memory cache of stored image paths.
110
+ */
111
+ export function clearStoredImagePaths(): void {
112
+ storedImagePaths.clear()
113
+ }
114
+
115
+ function evictOldestIfAtCap(): void {
116
+ while (storedImagePaths.size >= MAX_STORED_IMAGE_PATHS) {
117
+ const oldest = storedImagePaths.keys().next().value
118
+ if (oldest !== undefined) {
119
+ storedImagePaths.delete(oldest)
120
+ } else {
121
+ break
122
+ }
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Clean up old image cache directories from previous sessions.
128
+ */
129
+ export async function cleanupOldImageCaches(): Promise<void> {
130
+ const fsImpl = getFsImplementation()
131
+ const baseDir = join(getClaudeConfigHomeDir(), IMAGE_STORE_DIR)
132
+ const currentSessionId = getSessionId()
133
+
134
+ try {
135
+ let sessionDirs
136
+ try {
137
+ sessionDirs = await fsImpl.readdir(baseDir)
138
+ } catch {
139
+ return
140
+ }
141
+
142
+ for (const sessionDir of sessionDirs) {
143
+ if (sessionDir.name === currentSessionId) {
144
+ continue
145
+ }
146
+
147
+ const sessionPath = join(baseDir, sessionDir.name)
148
+ try {
149
+ await fsImpl.rm(sessionPath, { recursive: true, force: true })
150
+ logForDebugging(`Cleaned up old image cache: ${sessionPath}`)
151
+ } catch {
152
+ // Ignore errors for individual directories
153
+ }
154
+ }
155
+
156
+ try {
157
+ const remaining = await fsImpl.readdir(baseDir)
158
+ if (remaining.length === 0) {
159
+ await fsImpl.rmdir(baseDir)
160
+ }
161
+ } catch {
162
+ // Ignore
163
+ }
164
+ } catch {
165
+ // Ignore errors reading base directory
166
+ }
167
+ }
@@ -0,0 +1,104 @@
1
+ import { API_IMAGE_MAX_BASE64_SIZE } from '../constants/apiLimits.js'
2
+ import { logEvent } from '../services/analytics/index.js'
3
+ import { formatFileSize } from './format.js'
4
+
5
+ /**
6
+ * Information about an oversized image.
7
+ */
8
+ export type OversizedImage = {
9
+ index: number
10
+ size: number
11
+ }
12
+
13
+ /**
14
+ * Error thrown when one or more images exceed the API size limit.
15
+ */
16
+ export class ImageSizeError extends Error {
17
+ constructor(oversizedImages: OversizedImage[], maxSize: number) {
18
+ let message: string
19
+ const firstImage = oversizedImages[0]
20
+ if (oversizedImages.length === 1 && firstImage) {
21
+ message =
22
+ `Image base64 size (${formatFileSize(firstImage.size)}) exceeds API limit (${formatFileSize(maxSize)}). ` +
23
+ `Please resize the image before sending.`
24
+ } else {
25
+ message =
26
+ `${oversizedImages.length} images exceed the API limit (${formatFileSize(maxSize)}): ` +
27
+ oversizedImages
28
+ .map(img => `Image ${img.index}: ${formatFileSize(img.size)}`)
29
+ .join(', ') +
30
+ `. Please resize these images before sending.`
31
+ }
32
+ super(message)
33
+ this.name = 'ImageSizeError'
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Type guard to check if a block is a base64 image block
39
+ */
40
+ function isBase64ImageBlock(
41
+ block: unknown,
42
+ ): block is { type: 'image'; source: { type: 'base64'; data: string } } {
43
+ if (typeof block !== 'object' || block === null) return false
44
+ const b = block as Record<string, unknown>
45
+ if (b.type !== 'image') return false
46
+ if (typeof b.source !== 'object' || b.source === null) return false
47
+ const source = b.source as Record<string, unknown>
48
+ return source.type === 'base64' && typeof source.data === 'string'
49
+ }
50
+
51
+ /**
52
+ * Validates that all images in messages are within the API size limit.
53
+ * This is a safety net at the API boundary to catch any oversized images
54
+ * that may have slipped through upstream processing.
55
+ *
56
+ * Note: The API's 5MB limit applies to the base64-encoded string length,
57
+ * not the decoded raw bytes.
58
+ *
59
+ * Works with both UserMessage/AssistantMessage types (which have { type, message })
60
+ * and raw MessageParam types (which have { role, content }).
61
+ *
62
+ * @param messages - Array of messages to validate
63
+ * @throws ImageSizeError if any image exceeds the API limit
64
+ */
65
+ export function validateImagesForAPI(messages: unknown[]): void {
66
+ const oversizedImages: OversizedImage[] = []
67
+ let imageIndex = 0
68
+
69
+ for (const msg of messages) {
70
+ if (typeof msg !== 'object' || msg === null) continue
71
+
72
+ const m = msg as Record<string, unknown>
73
+
74
+ // Handle wrapped message format { type: 'user', message: { role, content } }
75
+ // Only check user messages
76
+ if (m.type !== 'user') continue
77
+
78
+ const innerMessage = m.message as Record<string, unknown> | undefined
79
+ if (!innerMessage) continue
80
+
81
+ const content = innerMessage.content
82
+ if (typeof content === 'string' || !Array.isArray(content)) continue
83
+
84
+ for (const block of content) {
85
+ if (isBase64ImageBlock(block)) {
86
+ imageIndex++
87
+ // Check the base64-encoded string length directly (not decoded bytes)
88
+ // The API limit applies to the base64 payload size
89
+ const base64Size = block.source.data.length
90
+ if (base64Size > API_IMAGE_MAX_BASE64_SIZE) {
91
+ logEvent('tengu_image_api_validation_failed', {
92
+ base64_size_bytes: base64Size,
93
+ max_bytes: API_IMAGE_MAX_BASE64_SIZE,
94
+ })
95
+ oversizedImages.push({ index: imageIndex, size: base64Size })
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+ if (oversizedImages.length > 0) {
102
+ throw new ImageSizeError(oversizedImages, API_IMAGE_MAX_BASE64_SIZE)
103
+ }
104
+ }
@@ -0,0 +1,15 @@
1
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'
2
+
3
+ /**
4
+ * Whether inference-config commands (/model, /fast, /effort) should execute
5
+ * immediately (during a running query) rather than waiting for the current
6
+ * turn to finish.
7
+ *
8
+ * Always enabled for ants; gated by experiment for external users.
9
+ */
10
+ export function shouldInferenceConfigCommandBeImmediate(): boolean {
11
+ return (
12
+ process.env.USER_TYPE === 'ant' ||
13
+ getFeatureValue_CACHED_MAY_BE_STALE('tengu_immediate_model_command', false)
14
+ )
15
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * In-Process Teammate Helpers
3
+ *
4
+ * Helper functions for in-process teammate integration.
5
+ * Provides utilities to:
6
+ * - Find task ID by agent name
7
+ * - Handle plan approval responses
8
+ * - Update awaitingPlanApproval state
9
+ * - Detect permission-related messages
10
+ */
11
+
12
+ import type { AppState } from '../state/AppState.js'
13
+ import {
14
+ type InProcessTeammateTaskState,
15
+ isInProcessTeammateTask,
16
+ } from '../tasks/InProcessTeammateTask/types.js'
17
+ import { updateTaskState } from './task/framework.js'
18
+ import {
19
+ isPermissionResponse,
20
+ isSandboxPermissionResponse,
21
+ type PlanApprovalResponseMessage,
22
+ } from './teammateMailbox.js'
23
+
24
+ type SetAppState = (updater: (prev: AppState) => AppState) => void
25
+
26
+ /**
27
+ * Find the task ID for an in-process teammate by agent name.
28
+ *
29
+ * @param agentName - The agent name (e.g., "researcher")
30
+ * @param appState - Current AppState
31
+ * @returns Task ID if found, undefined otherwise
32
+ */
33
+ export function findInProcessTeammateTaskId(
34
+ agentName: string,
35
+ appState: AppState,
36
+ ): string | undefined {
37
+ for (const task of Object.values(appState.tasks)) {
38
+ if (
39
+ isInProcessTeammateTask(task) &&
40
+ task.identity.agentName === agentName
41
+ ) {
42
+ return task.id
43
+ }
44
+ }
45
+ return undefined
46
+ }
47
+
48
+ /**
49
+ * Set awaitingPlanApproval state for an in-process teammate.
50
+ *
51
+ * @param taskId - Task ID of the in-process teammate
52
+ * @param setAppState - AppState setter
53
+ * @param awaiting - Whether teammate is awaiting plan approval
54
+ */
55
+ export function setAwaitingPlanApproval(
56
+ taskId: string,
57
+ setAppState: SetAppState,
58
+ awaiting: boolean,
59
+ ): void {
60
+ updateTaskState<InProcessTeammateTaskState>(taskId, setAppState, task => ({
61
+ ...task,
62
+ awaitingPlanApproval: awaiting,
63
+ }))
64
+ }
65
+
66
+ /**
67
+ * Handle plan approval response for an in-process teammate.
68
+ * Called by the message callback when a plan_approval_response arrives.
69
+ *
70
+ * This resets awaitingPlanApproval to false. The permissionMode from the
71
+ * response is handled separately by the agent loop (Task #11).
72
+ *
73
+ * @param taskId - Task ID of the in-process teammate
74
+ * @param _response - The plan approval response message (for future use)
75
+ * @param setAppState - AppState setter
76
+ */
77
+ export function handlePlanApprovalResponse(
78
+ taskId: string,
79
+ _response: PlanApprovalResponseMessage,
80
+ setAppState: SetAppState,
81
+ ): void {
82
+ setAwaitingPlanApproval(taskId, setAppState, false)
83
+ }
84
+
85
+ // ============ Permission Delegation Helpers ============
86
+
87
+ /**
88
+ * Check if a message is a permission-related response.
89
+ * Used by in-process teammate message handlers to detect and process
90
+ * permission responses from the team leader.
91
+ *
92
+ * Handles both tool permissions and sandbox (network host) permissions.
93
+ *
94
+ * @param messageText - The raw message text to check
95
+ * @returns true if the message is a permission response
96
+ */
97
+ export function isPermissionRelatedResponse(messageText: string): boolean {
98
+ return (
99
+ !!isPermissionResponse(messageText) ||
100
+ !!isSandboxPermissionResponse(messageText)
101
+ )
102
+ }
package/utils/ink.ts ADDED
@@ -0,0 +1,26 @@
1
+ import type { TextProps } from '../ink.js'
2
+ import {
3
+ AGENT_COLOR_TO_THEME_COLOR,
4
+ type AgentColorName,
5
+ } from '../tools/AgentTool/agentColorManager.js'
6
+
7
+ const DEFAULT_AGENT_THEME_COLOR = 'cyan_FOR_SUBAGENTS_ONLY'
8
+
9
+ /**
10
+ * Convert a color string to Ink's TextProps['color'] format.
11
+ * Colors are typically AgentColorName values like 'blue', 'green', etc.
12
+ * This converts them to theme keys so they respect the current theme.
13
+ * Falls back to the raw ANSI color if the color is not a known agent color.
14
+ */
15
+ export function toInkColor(color: string | undefined): TextProps['color'] {
16
+ if (!color) {
17
+ return DEFAULT_AGENT_THEME_COLOR
18
+ }
19
+ // Try to map to a theme color if it's a known agent color
20
+ const themeColor = AGENT_COLOR_TO_THEME_COLOR[color as AgentColorName]
21
+ if (themeColor) {
22
+ return themeColor
23
+ }
24
+ // Fall back to raw ANSI color for unknown colors
25
+ return `ansi:${color}` as TextProps['color']
26
+ }
package/utils/intl.ts ADDED
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Shared Intl object instances with lazy initialization.
3
+ *
4
+ * Intl constructors are expensive (~0.05-0.1ms each), so we cache instances
5
+ * for reuse across the codebase instead of creating new ones each time.
6
+ * Lazy initialization ensures we only pay the cost when actually needed.
7
+ */
8
+
9
+ // Segmenters for Unicode text processing (lazily initialized)
10
+ let graphemeSegmenter: Intl.Segmenter | null = null
11
+ let wordSegmenter: Intl.Segmenter | null = null
12
+
13
+ export function getGraphemeSegmenter(): Intl.Segmenter {
14
+ if (!graphemeSegmenter) {
15
+ graphemeSegmenter = new Intl.Segmenter(undefined, {
16
+ granularity: 'grapheme',
17
+ })
18
+ }
19
+ return graphemeSegmenter
20
+ }
21
+
22
+ /**
23
+ * Extract the first grapheme cluster from a string.
24
+ * Returns '' for empty strings.
25
+ */
26
+ export function firstGrapheme(text: string): string {
27
+ if (!text) return ''
28
+ const segments = getGraphemeSegmenter().segment(text)
29
+ const first = segments[Symbol.iterator]().next().value
30
+ return first?.segment ?? ''
31
+ }
32
+
33
+ /**
34
+ * Extract the last grapheme cluster from a string.
35
+ * Returns '' for empty strings.
36
+ */
37
+ export function lastGrapheme(text: string): string {
38
+ if (!text) return ''
39
+ let last = ''
40
+ for (const { segment } of getGraphemeSegmenter().segment(text)) {
41
+ last = segment
42
+ }
43
+ return last
44
+ }
45
+
46
+ export function getWordSegmenter(): Intl.Segmenter {
47
+ if (!wordSegmenter) {
48
+ wordSegmenter = new Intl.Segmenter(undefined, { granularity: 'word' })
49
+ }
50
+ return wordSegmenter
51
+ }
52
+
53
+ // RelativeTimeFormat cache (keyed by style:numeric)
54
+ const rtfCache = new Map<string, Intl.RelativeTimeFormat>()
55
+
56
+ export function getRelativeTimeFormat(
57
+ style: 'long' | 'short' | 'narrow',
58
+ numeric: 'always' | 'auto',
59
+ ): Intl.RelativeTimeFormat {
60
+ const key = `${style}:${numeric}`
61
+ let rtf = rtfCache.get(key)
62
+ if (!rtf) {
63
+ rtf = new Intl.RelativeTimeFormat('en', { style, numeric })
64
+ rtfCache.set(key, rtf)
65
+ }
66
+ return rtf
67
+ }
68
+
69
+ // Timezone is constant for the process lifetime
70
+ let cachedTimeZone: string | null = null
71
+
72
+ export function getTimeZone(): string {
73
+ if (!cachedTimeZone) {
74
+ cachedTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone
75
+ }
76
+ return cachedTimeZone
77
+ }
78
+
79
+ // System locale language subtag (e.g. 'en', 'ja') is constant for the process
80
+ // lifetime. null = not yet computed; undefined = computed but unavailable (so
81
+ // a stripped-ICU environment fails once instead of retrying on every call).
82
+ let cachedSystemLocaleLanguage: string | undefined | null = null
83
+
84
+ export function getSystemLocaleLanguage(): string | undefined {
85
+ if (cachedSystemLocaleLanguage === null) {
86
+ try {
87
+ const locale = Intl.DateTimeFormat().resolvedOptions().locale
88
+ cachedSystemLocaleLanguage = new Intl.Locale(locale).language
89
+ } catch {
90
+ cachedSystemLocaleLanguage = undefined
91
+ }
92
+ }
93
+ return cachedSystemLocaleLanguage
94
+ }
@@ -0,0 +1,191 @@
1
+ import { homedir, platform } from 'os'
2
+ import { join } from 'path'
3
+ import { getFsImplementation } from '../utils/fsOperations.js'
4
+ import type { IdeType } from './ide.js'
5
+
6
+ const PLUGIN_PREFIX = 'claude-code-jetbrains-plugin'
7
+
8
+ // Map of IDE names to their directory patterns
9
+ const ideNameToDirMap: { [key: string]: string[] } = {
10
+ pycharm: ['PyCharm'],
11
+ intellij: ['IntelliJIdea', 'IdeaIC'],
12
+ webstorm: ['WebStorm'],
13
+ phpstorm: ['PhpStorm'],
14
+ rubymine: ['RubyMine'],
15
+ clion: ['CLion'],
16
+ goland: ['GoLand'],
17
+ rider: ['Rider'],
18
+ datagrip: ['DataGrip'],
19
+ appcode: ['AppCode'],
20
+ dataspell: ['DataSpell'],
21
+ aqua: ['Aqua'],
22
+ gateway: ['Gateway'],
23
+ fleet: ['Fleet'],
24
+ androidstudio: ['AndroidStudio'],
25
+ }
26
+
27
+ // Build plugin directory paths
28
+ // https://www.jetbrains.com/help/pycharm/directories-used-by-the-ide-to-store-settings-caches-plugins-and-logs.html#plugins-directory
29
+ function buildCommonPluginDirectoryPaths(ideName: string): string[] {
30
+ const homeDir = homedir()
31
+ const directories: string[] = []
32
+ const idePatterns = ideNameToDirMap[ideName.toLowerCase()]
33
+ if (!idePatterns) {
34
+ return directories
35
+ }
36
+
37
+ const appData = process.env.APPDATA || join(homeDir, 'AppData', 'Roaming')
38
+ const localAppData =
39
+ process.env.LOCALAPPDATA || join(homeDir, 'AppData', 'Local')
40
+
41
+ switch (platform()) {
42
+ case 'darwin':
43
+ directories.push(
44
+ join(homeDir, 'Library', 'Application Support', 'JetBrains'),
45
+ join(homeDir, 'Library', 'Application Support'),
46
+ )
47
+ if (ideName.toLowerCase() === 'androidstudio') {
48
+ directories.push(
49
+ join(homeDir, 'Library', 'Application Support', 'Google'),
50
+ )
51
+ }
52
+ break
53
+
54
+ case 'win32':
55
+ directories.push(
56
+ join(appData, 'JetBrains'),
57
+ join(localAppData, 'JetBrains'),
58
+ join(appData),
59
+ )
60
+ if (ideName.toLowerCase() === 'androidstudio') {
61
+ directories.push(join(localAppData, 'Google'))
62
+ }
63
+ break
64
+
65
+ case 'linux':
66
+ directories.push(
67
+ join(homeDir, '.config', 'JetBrains'),
68
+ join(homeDir, '.local', 'share', 'JetBrains'),
69
+ )
70
+ for (const pattern of idePatterns) {
71
+ directories.push(join(homeDir, '.' + pattern))
72
+ }
73
+ if (ideName.toLowerCase() === 'androidstudio') {
74
+ directories.push(join(homeDir, '.config', 'Google'))
75
+ }
76
+ break
77
+ default:
78
+ break
79
+ }
80
+
81
+ return directories
82
+ }
83
+
84
+ // Find all actual plugin directories that exist
85
+ async function detectPluginDirectories(ideName: string): Promise<string[]> {
86
+ const foundDirectories: string[] = []
87
+ const fs = getFsImplementation()
88
+
89
+ const pluginDirPaths = buildCommonPluginDirectoryPaths(ideName)
90
+ const idePatterns = ideNameToDirMap[ideName.toLowerCase()]
91
+ if (!idePatterns) {
92
+ return foundDirectories
93
+ }
94
+
95
+ // Precompile once — idePatterns is invariant across baseDirs
96
+ const regexes = idePatterns.map(p => new RegExp('^' + p))
97
+
98
+ for (const baseDir of pluginDirPaths) {
99
+ try {
100
+ const entries = await fs.readdir(baseDir)
101
+ for (const regex of regexes) {
102
+ for (const entry of entries) {
103
+ if (!regex.test(entry.name)) continue
104
+ // Accept symlinks too — dirent.isDirectory() is false for symlinks,
105
+ // but GNU stow users symlink their JetBrains config dirs. Downstream
106
+ // fs.stat() calls will filter out symlinks that don't point to dirs.
107
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) continue
108
+ const dir = join(baseDir, entry.name)
109
+ // Linux is the only OS to not have a plugins directory
110
+ if (platform() === 'linux') {
111
+ foundDirectories.push(dir)
112
+ continue
113
+ }
114
+ const pluginDir = join(dir, 'plugins')
115
+ try {
116
+ await fs.stat(pluginDir)
117
+ foundDirectories.push(pluginDir)
118
+ } catch {
119
+ // Plugin directory doesn't exist, skip
120
+ }
121
+ }
122
+ }
123
+ } catch {
124
+ // Ignore errors from stale IDE directories (ENOENT, EACCES, etc.)
125
+ continue
126
+ }
127
+ }
128
+
129
+ return foundDirectories.filter(
130
+ (dir, index) => foundDirectories.indexOf(dir) === index,
131
+ )
132
+ }
133
+
134
+ export async function isJetBrainsPluginInstalled(
135
+ ideType: IdeType,
136
+ ): Promise<boolean> {
137
+ const pluginDirs = await detectPluginDirectories(ideType)
138
+ for (const dir of pluginDirs) {
139
+ const pluginPath = join(dir, PLUGIN_PREFIX)
140
+ try {
141
+ await getFsImplementation().stat(pluginPath)
142
+ return true
143
+ } catch {
144
+ // Plugin not found in this directory, continue
145
+ }
146
+ }
147
+ return false
148
+ }
149
+
150
+ const pluginInstalledCache = new Map<IdeType, boolean>()
151
+ const pluginInstalledPromiseCache = new Map<IdeType, Promise<boolean>>()
152
+
153
+ async function isJetBrainsPluginInstalledMemoized(
154
+ ideType: IdeType,
155
+ forceRefresh = false,
156
+ ): Promise<boolean> {
157
+ if (!forceRefresh) {
158
+ const existing = pluginInstalledPromiseCache.get(ideType)
159
+ if (existing) {
160
+ return existing
161
+ }
162
+ }
163
+ const promise = isJetBrainsPluginInstalled(ideType).then(result => {
164
+ pluginInstalledCache.set(ideType, result)
165
+ return result
166
+ })
167
+ pluginInstalledPromiseCache.set(ideType, promise)
168
+ return promise
169
+ }
170
+
171
+ export async function isJetBrainsPluginInstalledCached(
172
+ ideType: IdeType,
173
+ forceRefresh = false,
174
+ ): Promise<boolean> {
175
+ if (forceRefresh) {
176
+ pluginInstalledCache.delete(ideType)
177
+ pluginInstalledPromiseCache.delete(ideType)
178
+ }
179
+ return isJetBrainsPluginInstalledMemoized(ideType, forceRefresh)
180
+ }
181
+
182
+ /**
183
+ * Returns the cached result of isJetBrainsPluginInstalled synchronously.
184
+ * Returns false if the result hasn't been resolved yet.
185
+ * Use this only in sync contexts (e.g., status notice isActive checks).
186
+ */
187
+ export function isJetBrainsPluginInstalledCachedSync(
188
+ ideType: IdeType,
189
+ ): boolean {
190
+ return pluginInstalledCache.get(ideType) ?? false
191
+ }