@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,155 @@
1
+ /**
2
+ * Side Question ("/btw") feature - allows asking quick questions without
3
+ * interrupting the main agent context.
4
+ *
5
+ * Uses runForkedAgent to leverage prompt caching from the parent context
6
+ * while keeping the side question response separate from main conversation.
7
+ */
8
+
9
+ import { formatAPIError } from '../services/api/errorUtils.js'
10
+ import type { NonNullableUsage } from '../services/api/logging.js'
11
+ import type { Message, SystemAPIErrorMessage } from '../types/message.js'
12
+ import { type CacheSafeParams, runForkedAgent } from './forkedAgent.js'
13
+ import { createUserMessage, extractTextContent } from './messages.js'
14
+
15
+ // Pattern to detect "/btw" at start of input (case-insensitive, word boundary)
16
+ const BTW_PATTERN = /^\/btw\b/gi
17
+
18
+ /**
19
+ * Find positions of "/btw" keyword at the start of text for highlighting.
20
+ * Similar to findThinkingTriggerPositions in thinking.ts.
21
+ */
22
+ export function findBtwTriggerPositions(text: string): Array<{
23
+ word: string
24
+ start: number
25
+ end: number
26
+ }> {
27
+ const positions: Array<{ word: string; start: number; end: number }> = []
28
+ const matches = text.matchAll(BTW_PATTERN)
29
+
30
+ for (const match of matches) {
31
+ if (match.index !== undefined) {
32
+ positions.push({
33
+ word: match[0],
34
+ start: match.index,
35
+ end: match.index + match[0].length,
36
+ })
37
+ }
38
+ }
39
+
40
+ return positions
41
+ }
42
+
43
+ export type SideQuestionResult = {
44
+ response: string | null
45
+ usage: NonNullableUsage
46
+ }
47
+
48
+ /**
49
+ * Run a side question using a forked agent.
50
+ * Shares the parent's prompt cache — no thinking override, no cache write.
51
+ * All tools are blocked and we cap at 1 turn.
52
+ */
53
+ export async function runSideQuestion({
54
+ question,
55
+ cacheSafeParams,
56
+ }: {
57
+ question: string
58
+ cacheSafeParams: CacheSafeParams
59
+ }): Promise<SideQuestionResult> {
60
+ // Wrap the question with instructions to answer without tools
61
+ const wrappedQuestion = `<system-reminder>This is a side question from the user. You must answer this question directly in a single response.
62
+
63
+ IMPORTANT CONTEXT:
64
+ - You are a separate, lightweight agent spawned to answer this one question
65
+ - The main agent is NOT interrupted - it continues working independently in the background
66
+ - You share the conversation context but are a completely separate instance
67
+ - Do NOT reference being interrupted or what you were "previously doing" - that framing is incorrect
68
+
69
+ CRITICAL CONSTRAINTS:
70
+ - You have NO tools available - you cannot read files, run commands, search, or take any actions
71
+ - This is a one-off response - there will be no follow-up turns
72
+ - You can ONLY provide information based on what you already know from the conversation context
73
+ - NEVER say things like "Let me try...", "I'll now...", "Let me check...", or promise to take any action
74
+ - If you don't know the answer, say so - do not offer to look it up or investigate
75
+
76
+ Simply answer the question with the information you have.</system-reminder>
77
+
78
+ ${question}`
79
+
80
+ const agentResult = await runForkedAgent({
81
+ promptMessages: [createUserMessage({ content: wrappedQuestion })],
82
+ // Do NOT override thinkingConfig — thinking is part of the API cache key,
83
+ // and diverging from the main thread's config busts the prompt cache.
84
+ // Adaptive thinking on a quick Q&A has negligible overhead.
85
+ cacheSafeParams,
86
+ canUseTool: async () => ({
87
+ behavior: 'deny' as const,
88
+ message: 'Side questions cannot use tools',
89
+ decisionReason: { type: 'other' as const, reason: 'side_question' },
90
+ }),
91
+ querySource: 'side_question',
92
+ forkLabel: 'side_question',
93
+ maxTurns: 1, // Single turn only - no tool use loops
94
+ // No future request shares this suffix; skip writing cache entries.
95
+ skipCacheWrite: true,
96
+ })
97
+
98
+ return {
99
+ response: extractSideQuestionResponse(agentResult.messages),
100
+ usage: agentResult.totalUsage,
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Extract a display string from forked agent messages.
106
+ *
107
+ * IMPORTANT: claude.ts yields one AssistantMessage PER CONTENT BLOCK, not one
108
+ * per API response. With adaptive thinking enabled (inherited from the main
109
+ * thread to preserve the cache key), a thinking response arrives as:
110
+ * messages[0] = assistant { content: [thinking_block] }
111
+ * messages[1] = assistant { content: [text_block] }
112
+ *
113
+ * The old code used `.find(m => m.type === 'assistant')` which grabbed the
114
+ * first (thinking-only) message, found no text block, and returned null →
115
+ * "No response received". Repos with large context (many skills, big CLAUDE.md)
116
+ * trigger thinking more often, which is why this reproduced in the monorepo
117
+ * but not here.
118
+ *
119
+ * Secondary failure modes also surfaced as "No response received":
120
+ * - Model attempts tool_use → content = [thinking, tool_use], no text.
121
+ * Rare — the system-reminder usually prevents this, but handled here.
122
+ * - API error exhausts retries → query yields system api_error + user
123
+ * interruption, no assistant message at all.
124
+ */
125
+ function extractSideQuestionResponse(messages: Message[]): string | null {
126
+ // Flatten all assistant content blocks across the per-block messages.
127
+ const assistantBlocks = messages.flatMap(m =>
128
+ m.type === 'assistant' ? m.message.content : [],
129
+ )
130
+
131
+ if (assistantBlocks.length > 0) {
132
+ // Concatenate all text blocks (there's normally at most one, but be safe).
133
+ const text = extractTextContent(assistantBlocks, '\n\n').trim()
134
+ if (text) return text
135
+
136
+ // No text — check if the model tried to call a tool despite instructions.
137
+ const toolUse = assistantBlocks.find(b => b.type === 'tool_use')
138
+ if (toolUse) {
139
+ const toolName = 'name' in toolUse ? toolUse.name : 'a tool'
140
+ return `(The model tried to call ${toolName} instead of answering directly. Try rephrasing or ask in the main conversation.)`
141
+ }
142
+ }
143
+
144
+ // No assistant content — likely API error exhausted retries. Surface the
145
+ // first system api_error message so the user sees what happened.
146
+ const apiErr = messages.find(
147
+ (m): m is SystemAPIErrorMessage =>
148
+ m.type === 'system' && 'subtype' in m && m.subtype === 'api_error',
149
+ )
150
+ if (apiErr) {
151
+ return `(API error: ${formatAPIError(apiErr.error)})`
152
+ }
153
+
154
+ return null
155
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Tiny listener-set primitive for pure event signals (no stored state).
3
+ *
4
+ * Collapses the ~8-line `const listeners = new Set(); function subscribe(){…};
5
+ * function notify(){for(const l of listeners) l()}` boilerplate that was
6
+ * duplicated ~15× across the codebase into a one-liner.
7
+ *
8
+ * Distinct from a store (AppState, createStore) — there is no snapshot, no
9
+ * getState. Use this when subscribers only need to know "something happened",
10
+ * optionally with event args, not "what is the current value".
11
+ *
12
+ * Usage:
13
+ * const changed = createSignal<[SettingSource]>()
14
+ * export const subscribe = changed.subscribe
15
+ * // later: changed.emit('userSettings')
16
+ */
17
+
18
+ export type Signal<Args extends unknown[] = []> = {
19
+ /** Subscribe a listener. Returns an unsubscribe function. */
20
+ subscribe: (listener: (...args: Args) => void) => () => void
21
+ /** Call all subscribed listeners with the given arguments. */
22
+ emit: (...args: Args) => void
23
+ /** Remove all listeners. Useful in dispose/reset paths. */
24
+ clear: () => void
25
+ }
26
+
27
+ export function createSignal<Args extends unknown[] = []>(): Signal<Args> {
28
+ const listeners = new Set<(...args: Args) => void>()
29
+ return {
30
+ subscribe(listener) {
31
+ listeners.add(listener)
32
+ return () => {
33
+ listeners.delete(listener)
34
+ }
35
+ },
36
+ emit(...args) {
37
+ for (const listener of listeners) listener(...args)
38
+ },
39
+ clear() {
40
+ listeners.clear()
41
+ },
42
+ }
43
+ }
package/utils/sinks.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { initializeAnalyticsSink } from '../services/analytics/sink.js'
2
+ import { initializeErrorLogSink } from './errorLogSink.js'
3
+
4
+ /**
5
+ * Attach error log and analytics sinks, draining any events queued before
6
+ * attachment. Both inits are idempotent. Called from setup() for the default
7
+ * command; other entrypoints (subcommands, daemon, bridge) call this directly
8
+ * since they bypass setup().
9
+ *
10
+ * Leaf module — kept out of setup.ts to avoid the setup → commands → bridge
11
+ * → setup import cycle.
12
+ */
13
+ export function initSinks(): void {
14
+ initializeErrorLogSink()
15
+ initializeAnalyticsSink()
16
+ }
@@ -0,0 +1,311 @@
1
+ import chokidar, { type FSWatcher } from 'chokidar'
2
+ import * as platformPath from 'path'
3
+ import { getAdditionalDirectoriesForClaudeMd } from '../../bootstrap/state.js'
4
+ import {
5
+ clearCommandMemoizationCaches,
6
+ clearCommandsCache,
7
+ } from '../../commands.js'
8
+ import {
9
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
10
+ logEvent,
11
+ } from '../../services/analytics/index.js'
12
+ import {
13
+ clearSkillCaches,
14
+ getSkillsPath,
15
+ onDynamicSkillsLoaded,
16
+ } from '../../skills/loadSkillsDir.js'
17
+ import { resetSentSkillNames } from '../attachments.js'
18
+ import { registerCleanup } from '../cleanupRegistry.js'
19
+ import { logForDebugging } from '../debug.js'
20
+ import { getFsImplementation } from '../fsOperations.js'
21
+ import { executeConfigChangeHooks, hasBlockingResult } from '../hooks.js'
22
+ import { createSignal } from '../signal.js'
23
+
24
+ /**
25
+ * Time in milliseconds to wait for file writes to stabilize before processing.
26
+ */
27
+ const FILE_STABILITY_THRESHOLD_MS = 1000
28
+
29
+ /**
30
+ * Polling interval in milliseconds for checking file stability.
31
+ */
32
+ const FILE_STABILITY_POLL_INTERVAL_MS = 500
33
+
34
+ /**
35
+ * Time in milliseconds to debounce rapid skill change events into a single
36
+ * reload. Prevents cascading reloads when many skill files change at once
37
+ * (e.g. during auto-update or when another session modifies skill directories).
38
+ * Without this, each file change triggers a full clearSkillCaches() +
39
+ * clearCommandsCache() + listener notification cycle, which can deadlock the
40
+ * event loop when dozens of events fire in rapid succession.
41
+ */
42
+ const RELOAD_DEBOUNCE_MS = 300
43
+
44
+ /**
45
+ * Polling interval for chokidar when usePolling is enabled.
46
+ * Skill files change rarely (manual edits, git operations), so a 2s interval
47
+ * trades negligible latency for far fewer stat() calls than the default 100ms.
48
+ */
49
+ const POLLING_INTERVAL_MS = 2000
50
+
51
+ /**
52
+ * Bun's native fs.watch() has a PathWatcherManager deadlock (oven-sh/bun#27469,
53
+ * #26385): closing a watcher on the main thread while the File Watcher thread
54
+ * is delivering events can hang both threads in __ulock_wait2 forever. Chokidar
55
+ * with depth: 2 on large skill trees (hundreds of subdirs) triggers this
56
+ * reliably when a git operation touches many directories at once — chokidar
57
+ * internally closes/reopens per-directory FSWatchers as dirs are added/removed.
58
+ *
59
+ * Workaround: use stat() polling under Bun. No FSWatcher = no deadlock.
60
+ * The fix is pending upstream; remove this once the Bun PR lands.
61
+ */
62
+ const USE_POLLING = typeof Bun !== 'undefined'
63
+
64
+ let watcher: FSWatcher | null = null
65
+ let reloadTimer: ReturnType<typeof setTimeout> | null = null
66
+ const pendingChangedPaths = new Set<string>()
67
+ let initialized = false
68
+ let disposed = false
69
+ let dynamicSkillsCallbackRegistered = false
70
+ let unregisterCleanup: (() => void) | null = null
71
+ const skillsChanged = createSignal()
72
+
73
+ // Test overrides for timing constants
74
+ let testOverrides: {
75
+ stabilityThreshold?: number
76
+ pollInterval?: number
77
+ reloadDebounce?: number
78
+ /** Chokidar fs.stat polling interval when USE_POLLING is active. */
79
+ chokidarInterval?: number
80
+ } | null = null
81
+
82
+ /**
83
+ * Initialize file watching for skill directories
84
+ */
85
+ export async function initialize(): Promise<void> {
86
+ if (initialized || disposed) return
87
+ initialized = true
88
+
89
+ // Register callback for when dynamic skills are loaded (only once)
90
+ if (!dynamicSkillsCallbackRegistered) {
91
+ dynamicSkillsCallbackRegistered = true
92
+ onDynamicSkillsLoaded(() => {
93
+ // Clear memoization caches so new skills are picked up
94
+ // Note: we use clearCommandMemoizationCaches (not clearCommandsCache)
95
+ // because clearCommandsCache would call clearSkillCaches which
96
+ // wipes out the dynamic skills we just loaded
97
+ clearCommandMemoizationCaches()
98
+ // Notify listeners that skills changed
99
+ skillsChanged.emit()
100
+ })
101
+ }
102
+
103
+ const paths = await getWatchablePaths()
104
+ if (paths.length === 0) return
105
+
106
+ logForDebugging(
107
+ `Watching for changes in skill/command directories: ${paths.join(', ')}...`,
108
+ )
109
+
110
+ watcher = chokidar.watch(paths, {
111
+ persistent: true,
112
+ ignoreInitial: true,
113
+ depth: 2, // Skills use skill-name/SKILL.md format
114
+ awaitWriteFinish: {
115
+ stabilityThreshold:
116
+ testOverrides?.stabilityThreshold ?? FILE_STABILITY_THRESHOLD_MS,
117
+ pollInterval:
118
+ testOverrides?.pollInterval ?? FILE_STABILITY_POLL_INTERVAL_MS,
119
+ },
120
+ // Ignore special file types (sockets, FIFOs, devices) - they cannot be watched
121
+ // and will error with EOPNOTSUPP on macOS. Only allow regular files and directories.
122
+ ignored: (path, stats) => {
123
+ if (stats && !stats.isFile() && !stats.isDirectory()) return true
124
+ // Ignore .git directories
125
+ return path.split(platformPath.sep).some(dir => dir === '.git')
126
+ },
127
+ ignorePermissionErrors: true,
128
+ usePolling: USE_POLLING,
129
+ interval: testOverrides?.chokidarInterval ?? POLLING_INTERVAL_MS,
130
+ atomic: true,
131
+ })
132
+
133
+ watcher.on('add', handleChange)
134
+ watcher.on('change', handleChange)
135
+ watcher.on('unlink', handleChange)
136
+
137
+ // Register cleanup to properly dispose of the file watcher during graceful shutdown
138
+ unregisterCleanup = registerCleanup(async () => {
139
+ await dispose()
140
+ })
141
+ }
142
+
143
+ /**
144
+ * Clean up file watcher
145
+ */
146
+ export function dispose(): Promise<void> {
147
+ disposed = true
148
+ if (unregisterCleanup) {
149
+ unregisterCleanup()
150
+ unregisterCleanup = null
151
+ }
152
+ let closePromise: Promise<void> = Promise.resolve()
153
+ if (watcher) {
154
+ closePromise = watcher.close()
155
+ watcher = null
156
+ }
157
+ if (reloadTimer) {
158
+ clearTimeout(reloadTimer)
159
+ reloadTimer = null
160
+ }
161
+ pendingChangedPaths.clear()
162
+ skillsChanged.clear()
163
+ return closePromise
164
+ }
165
+
166
+ /**
167
+ * Subscribe to skill changes
168
+ */
169
+ export const subscribe = skillsChanged.subscribe
170
+
171
+ async function getWatchablePaths(): Promise<string[]> {
172
+ const fs = getFsImplementation()
173
+ const paths: string[] = []
174
+
175
+ // User skills directory (~/.claude/skills)
176
+ const userSkillsPath = getSkillsPath('userSettings', 'skills')
177
+ if (userSkillsPath) {
178
+ try {
179
+ await fs.stat(userSkillsPath)
180
+ paths.push(userSkillsPath)
181
+ } catch {
182
+ // Path doesn't exist, skip it
183
+ }
184
+ }
185
+
186
+ // User commands directory (~/.claude/commands)
187
+ const userCommandsPath = getSkillsPath('userSettings', 'commands')
188
+ if (userCommandsPath) {
189
+ try {
190
+ await fs.stat(userCommandsPath)
191
+ paths.push(userCommandsPath)
192
+ } catch {
193
+ // Path doesn't exist, skip it
194
+ }
195
+ }
196
+
197
+ // Project skills directory (.claude/skills)
198
+ const projectSkillsPath = getSkillsPath('projectSettings', 'skills')
199
+ if (projectSkillsPath) {
200
+ try {
201
+ // For project settings, resolve to absolute path
202
+ const absolutePath = platformPath.resolve(projectSkillsPath)
203
+ await fs.stat(absolutePath)
204
+ paths.push(absolutePath)
205
+ } catch {
206
+ // Path doesn't exist, skip it
207
+ }
208
+ }
209
+
210
+ // Project commands directory (.claude/commands)
211
+ const projectCommandsPath = getSkillsPath('projectSettings', 'commands')
212
+ if (projectCommandsPath) {
213
+ try {
214
+ // For project settings, resolve to absolute path
215
+ const absolutePath = platformPath.resolve(projectCommandsPath)
216
+ await fs.stat(absolutePath)
217
+ paths.push(absolutePath)
218
+ } catch {
219
+ // Path doesn't exist, skip it
220
+ }
221
+ }
222
+
223
+ // Additional directories (--add-dir) skills
224
+ for (const dir of getAdditionalDirectoriesForClaudeMd()) {
225
+ const additionalSkillsPath = platformPath.join(dir, '.claude', 'skills')
226
+ try {
227
+ await fs.stat(additionalSkillsPath)
228
+ paths.push(additionalSkillsPath)
229
+ } catch {
230
+ // Path doesn't exist, skip it
231
+ }
232
+ }
233
+
234
+ return paths
235
+ }
236
+
237
+ function handleChange(path: string): void {
238
+ logForDebugging(`Detected skill change: ${path}`)
239
+ logEvent('tengu_skill_file_changed', {
240
+ source:
241
+ 'chokidar' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
242
+ })
243
+
244
+ scheduleReload(path)
245
+ }
246
+
247
+ /**
248
+ * Debounce rapid skill changes into a single reload. When many skill files
249
+ * change at once (e.g. auto-update installs a new binary and a new session
250
+ * touches skill directories), each file fires its own chokidar event. Without
251
+ * debouncing, each event triggers clearSkillCaches() + clearCommandsCache() +
252
+ * listener notification — 30 events means 30 full reload cycles, which can
253
+ * deadlock the Bun event loop via rapid FSWatcher watch/unwatch churn.
254
+ */
255
+ function scheduleReload(changedPath: string): void {
256
+ pendingChangedPaths.add(changedPath)
257
+ if (reloadTimer) clearTimeout(reloadTimer)
258
+ reloadTimer = setTimeout(async () => {
259
+ reloadTimer = null
260
+ const paths = [...pendingChangedPaths]
261
+ pendingChangedPaths.clear()
262
+ // Fire ConfigChange hook once for the batch — the hook query is always
263
+ // 'skills' so firing per-path (which can be hundreds during a git
264
+ // operation) just spams the hook matcher with identical queries. Pass the
265
+ // first path as a representative; hooks can inspect all paths via the
266
+ // skills directory if they need the full set.
267
+ const results = await executeConfigChangeHooks('skills', paths[0]!)
268
+ if (hasBlockingResult(results)) {
269
+ logForDebugging(
270
+ `ConfigChange hook blocked skill reload (${paths.length} paths)`,
271
+ )
272
+ return
273
+ }
274
+ clearSkillCaches()
275
+ clearCommandsCache()
276
+ resetSentSkillNames()
277
+ skillsChanged.emit()
278
+ }, testOverrides?.reloadDebounce ?? RELOAD_DEBOUNCE_MS)
279
+ }
280
+
281
+ /**
282
+ * Reset internal state for testing purposes only.
283
+ */
284
+ export async function resetForTesting(overrides?: {
285
+ stabilityThreshold?: number
286
+ pollInterval?: number
287
+ reloadDebounce?: number
288
+ chokidarInterval?: number
289
+ }): Promise<void> {
290
+ // Clean up existing watcher if present to avoid resource leaks
291
+ if (watcher) {
292
+ await watcher.close()
293
+ watcher = null
294
+ }
295
+ if (reloadTimer) {
296
+ clearTimeout(reloadTimer)
297
+ reloadTimer = null
298
+ }
299
+ pendingChangedPaths.clear()
300
+ skillsChanged.clear()
301
+ initialized = false
302
+ disposed = false
303
+ testOverrides = overrides ?? null
304
+ }
305
+
306
+ export const skillChangeDetector = {
307
+ initialize,
308
+ dispose,
309
+ subscribe,
310
+ resetForTesting,
311
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Centralized utilities for parsing slash commands
3
+ */
4
+
5
+ export type ParsedSlashCommand = {
6
+ commandName: string
7
+ args: string
8
+ isMcp: boolean
9
+ }
10
+
11
+ /**
12
+ * Parses a slash command input string into its component parts
13
+ *
14
+ * @param input - The raw input string (should start with '/')
15
+ * @returns Parsed command name, args, and MCP flag, or null if invalid
16
+ *
17
+ * @example
18
+ * parseSlashCommand('/search foo bar')
19
+ * // => { commandName: 'search', args: 'foo bar', isMcp: false }
20
+ *
21
+ * @example
22
+ * parseSlashCommand('/mcp:tool (MCP) arg1 arg2')
23
+ * // => { commandName: 'mcp:tool (MCP)', args: 'arg1 arg2', isMcp: true }
24
+ */
25
+ export function parseSlashCommand(input: string): ParsedSlashCommand | null {
26
+ const trimmedInput = input.trim()
27
+
28
+ // Check if input starts with '/'
29
+ if (!trimmedInput.startsWith('/')) {
30
+ return null
31
+ }
32
+
33
+ // Remove the leading '/' and split by spaces
34
+ const withoutSlash = trimmedInput.slice(1)
35
+ const words = withoutSlash.split(' ')
36
+
37
+ if (!words[0]) {
38
+ return null
39
+ }
40
+
41
+ let commandName = words[0]
42
+ let isMcp = false
43
+ let argsStartIndex = 1
44
+
45
+ // Check for MCP commands (second word is '(MCP)')
46
+ if (words.length > 1 && words[1] === '(MCP)') {
47
+ commandName = commandName + ' (MCP)'
48
+ isMcp = true
49
+ argsStartIndex = 2
50
+ }
51
+
52
+ // Extract arguments (everything after command name)
53
+ const args = words.slice(argsStartIndex).join(' ')
54
+
55
+ return {
56
+ commandName,
57
+ args,
58
+ isMcp,
59
+ }
60
+ }
package/utils/sleep.ts ADDED
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Abort-responsive sleep. Resolves after `ms` milliseconds, or immediately
3
+ * when `signal` aborts (so backoff loops don't block shutdown).
4
+ *
5
+ * By default, abort resolves silently; the caller should check
6
+ * `signal.aborted` after the await. Pass `throwOnAbort: true` to have
7
+ * abort reject — useful when the sleep is deep inside a retry loop
8
+ * and you want the rejection to bubble up and cancel the whole operation.
9
+ *
10
+ * Pass `abortError` to customize the rejection error (implies
11
+ * `throwOnAbort: true`). Useful for retry loops that catch a specific
12
+ * error class (e.g. `APIUserAbortError`).
13
+ */
14
+ export function sleep(
15
+ ms: number,
16
+ signal?: AbortSignal,
17
+ opts?: { throwOnAbort?: boolean; abortError?: () => Error; unref?: boolean },
18
+ ): Promise<void> {
19
+ return new Promise((resolve, reject) => {
20
+ // Check aborted state BEFORE setting up the timer. If we defined
21
+ // onAbort first and called it synchronously here, it would reference
22
+ // `timer` while still in the Temporal Dead Zone.
23
+ if (signal?.aborted) {
24
+ if (opts?.throwOnAbort || opts?.abortError) {
25
+ void reject(opts.abortError?.() ?? new Error('aborted'))
26
+ } else {
27
+ void resolve()
28
+ }
29
+ return
30
+ }
31
+ const timer = setTimeout(
32
+ (signal, onAbort, resolve) => {
33
+ signal?.removeEventListener('abort', onAbort)
34
+ void resolve()
35
+ },
36
+ ms,
37
+ signal,
38
+ onAbort,
39
+ resolve,
40
+ )
41
+ function onAbort(): void {
42
+ clearTimeout(timer)
43
+ if (opts?.throwOnAbort || opts?.abortError) {
44
+ void reject(opts.abortError?.() ?? new Error('aborted'))
45
+ } else {
46
+ void resolve()
47
+ }
48
+ }
49
+ signal?.addEventListener('abort', onAbort, { once: true })
50
+ if (opts?.unref) {
51
+ timer.unref()
52
+ }
53
+ })
54
+ }
55
+
56
+ function rejectWithTimeout(reject: (e: Error) => void, message: string): void {
57
+ reject(new Error(message))
58
+ }
59
+
60
+ /**
61
+ * Race a promise against a timeout. Rejects with `Error(message)` if the
62
+ * promise doesn't settle within `ms`. The timeout timer is cleared when
63
+ * the promise settles (no dangling timer) and unref'd so it doesn't
64
+ * block process exit.
65
+ *
66
+ * Note: this doesn't cancel the underlying work — if the promise is
67
+ * backed by a runaway async operation, that keeps running. This just
68
+ * returns control to the caller.
69
+ */
70
+ export function withTimeout<T>(
71
+ promise: Promise<T>,
72
+ ms: number,
73
+ message: string,
74
+ ): Promise<T> {
75
+ let timer: ReturnType<typeof setTimeout> | undefined
76
+ const timeoutPromise = new Promise<never>((_, reject) => {
77
+ // eslint-disable-next-line no-restricted-syntax -- not a sleep: REJECTS after ms (timeout guard)
78
+ timer = setTimeout(rejectWithTimeout, ms, reject, message)
79
+ if (typeof timer === 'object') timer.unref?.()
80
+ })
81
+ return Promise.race([promise, timeoutPromise]).finally(() => {
82
+ if (timer !== undefined) clearTimeout(timer)
83
+ })
84
+ }