@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,95 @@
1
+ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../services/analytics/growthbook.js'
2
+ import { getRateLimitTier, getSubscriptionType } from './auth.js'
3
+ import { isEnvDefinedFalsy, isEnvTruthy } from './envUtils.js'
4
+
5
+ export function getPlanModeV2AgentCount(): number {
6
+ // Environment variable override takes precedence
7
+ if (process.env.CLAUDE_CODE_PLAN_V2_AGENT_COUNT) {
8
+ const count = parseInt(process.env.CLAUDE_CODE_PLAN_V2_AGENT_COUNT, 10)
9
+ if (!isNaN(count) && count > 0 && count <= 10) {
10
+ return count
11
+ }
12
+ }
13
+
14
+ const subscriptionType = getSubscriptionType()
15
+ const rateLimitTier = getRateLimitTier()
16
+
17
+ if (
18
+ subscriptionType === 'max' &&
19
+ rateLimitTier === 'default_claude_max_20x'
20
+ ) {
21
+ return 3
22
+ }
23
+
24
+ if (subscriptionType === 'enterprise' || subscriptionType === 'team') {
25
+ return 3
26
+ }
27
+
28
+ return 1
29
+ }
30
+
31
+ export function getPlanModeV2ExploreAgentCount(): number {
32
+ if (process.env.CLAUDE_CODE_PLAN_V2_EXPLORE_AGENT_COUNT) {
33
+ const count = parseInt(
34
+ process.env.CLAUDE_CODE_PLAN_V2_EXPLORE_AGENT_COUNT,
35
+ 10,
36
+ )
37
+ if (!isNaN(count) && count > 0 && count <= 10) {
38
+ return count
39
+ }
40
+ }
41
+
42
+ return 3
43
+ }
44
+
45
+ /**
46
+ * Check if plan mode interview phase is enabled.
47
+ *
48
+ * Config: ant=always_on, external=tengu_plan_mode_interview_phase gate, envVar=true
49
+ */
50
+ export function isPlanModeInterviewPhaseEnabled(): boolean {
51
+ // Always on for ants
52
+ if (process.env.USER_TYPE === 'ant') return true
53
+
54
+ const env = process.env.CLAUDE_CODE_PLAN_MODE_INTERVIEW_PHASE
55
+ if (isEnvTruthy(env)) return true
56
+ if (isEnvDefinedFalsy(env)) return false
57
+
58
+ return getFeatureValue_CACHED_MAY_BE_STALE(
59
+ 'tengu_plan_mode_interview_phase',
60
+ false,
61
+ )
62
+ }
63
+
64
+ export type PewterLedgerVariant = 'trim' | 'cut' | 'cap' | null
65
+
66
+ /**
67
+ * tengu_pewter_ledger — plan file structure prompt experiment.
68
+ *
69
+ * Controls the Phase 4 "Final Plan" bullets in the 5-phase plan mode
70
+ * workflow (messages.ts getPlanPhase4Section). 5-phase is 99% of plan
71
+ * traffic; interview-phase (ants) is untouched as a reference population.
72
+ *
73
+ * Arms: null (control), 'trim', 'cut', 'cap' — progressively stricter
74
+ * guidance on plan file size.
75
+ *
76
+ * Baseline (control, 14d ending 2026-03-02, N=26.3M):
77
+ * p50 4,906 chars | p90 11,617 | mean 6,207 | 82% Opus 4.6
78
+ * Reject rate monotonic with size: 20% at <2K → 50% at 20K+
79
+ *
80
+ * Primary: session-level Avg Cost (fact__201omjcij85f) — Opus output is
81
+ * 5× input price so cost is an output-weighted proxy. planLengthChars
82
+ * on tengu_plan_exit is the mechanism but NOT the goal — the cap arm
83
+ * could shrink the plan file while increasing total output via
84
+ * write→count→edit cycles.
85
+ * Guardrail: feedback-bad rate, requests/session (too-thin plans →
86
+ * more implementation iterations), tool error rate
87
+ */
88
+ export function getPewterLedgerVariant(): PewterLedgerVariant {
89
+ const raw = getFeatureValue_CACHED_MAY_BE_STALE<string | null>(
90
+ 'tengu_pewter_ledger',
91
+ null,
92
+ )
93
+ if (raw === 'trim' || raw === 'cut' || raw === 'cap') return raw
94
+ return null
95
+ }
package/utils/plans.ts ADDED
@@ -0,0 +1,397 @@
1
+ import { randomUUID } from 'crypto'
2
+ import { copyFile, writeFile } from 'fs/promises'
3
+ import memoize from 'lodash-es/memoize.js'
4
+ import { join, resolve, sep } from 'path'
5
+ import type { AgentId, SessionId } from 'src/types/ids.js'
6
+ import type { LogOption } from 'src/types/logs.js'
7
+ import type {
8
+ AssistantMessage,
9
+ AttachmentMessage,
10
+ SystemFileSnapshotMessage,
11
+ UserMessage,
12
+ } from 'src/types/message.js'
13
+ import { getPlanSlugCache, getSessionId } from '../bootstrap/state.js'
14
+ import { EXIT_PLAN_MODE_V2_TOOL_NAME } from '../tools/ExitPlanModeTool/constants.js'
15
+ import { getCwd } from './cwd.js'
16
+ import { logForDebugging } from './debug.js'
17
+ import { getClaudeConfigHomeDir } from './envUtils.js'
18
+ import { isENOENT } from './errors.js'
19
+ import { getEnvironmentKind } from './filePersistence/outputsScanner.js'
20
+ import { getFsImplementation } from './fsOperations.js'
21
+ import { logError } from './log.js'
22
+ import { getInitialSettings } from './settings/settings.js'
23
+ import { generateWordSlug } from './words.js'
24
+
25
+ const MAX_SLUG_RETRIES = 10
26
+
27
+ /**
28
+ * Get or generate a word slug for the current session's plan.
29
+ * The slug is generated lazily on first access and cached for the session.
30
+ * If a plan file with the generated slug already exists, retries up to 10 times.
31
+ */
32
+ export function getPlanSlug(sessionId?: SessionId): string {
33
+ const id = sessionId ?? getSessionId()
34
+ const cache = getPlanSlugCache()
35
+ let slug = cache.get(id)
36
+ if (!slug) {
37
+ const plansDir = getPlansDirectory()
38
+ // Try to find a unique slug that doesn't conflict with existing files
39
+ for (let i = 0; i < MAX_SLUG_RETRIES; i++) {
40
+ slug = generateWordSlug()
41
+ const filePath = join(plansDir, `${slug}.md`)
42
+ if (!getFsImplementation().existsSync(filePath)) {
43
+ break
44
+ }
45
+ }
46
+ cache.set(id, slug!)
47
+ }
48
+ return slug!
49
+ }
50
+
51
+ /**
52
+ * Set a specific plan slug for a session (used when resuming a session)
53
+ */
54
+ export function setPlanSlug(sessionId: SessionId, slug: string): void {
55
+ getPlanSlugCache().set(sessionId, slug)
56
+ }
57
+
58
+ /**
59
+ * Clear the plan slug for the current session.
60
+ * This should be called on /clear to ensure a fresh plan file is used.
61
+ */
62
+ export function clearPlanSlug(sessionId?: SessionId): void {
63
+ const id = sessionId ?? getSessionId()
64
+ getPlanSlugCache().delete(id)
65
+ }
66
+
67
+ /**
68
+ * Clear ALL plan slug entries (all sessions).
69
+ * Use this on /clear to free sub-session slug entries.
70
+ */
71
+ export function clearAllPlanSlugs(): void {
72
+ getPlanSlugCache().clear()
73
+ }
74
+
75
+ // Memoized: called from render bodies (FileReadTool/FileEditTool/FileWriteTool UI.tsx)
76
+ // and permission checks. Inputs (initial settings + cwd) are fixed at startup, so the
77
+ // mkdirSync result is stable for the session. Without memoization, each rendered tool
78
+ // message triggers a mkdirSync syscall (regressed in #20005).
79
+ export const getPlansDirectory = memoize(function getPlansDirectory(): string {
80
+ const settings = getInitialSettings()
81
+ const settingsDir = settings.plansDirectory
82
+ let plansPath: string
83
+
84
+ if (settingsDir) {
85
+ // Settings.json (relative to project root)
86
+ const cwd = getCwd()
87
+ const resolved = resolve(cwd, settingsDir)
88
+
89
+ // Validate path stays within project root to prevent path traversal
90
+ if (!resolved.startsWith(cwd + sep) && resolved !== cwd) {
91
+ logError(
92
+ new Error(`plansDirectory must be within project root: ${settingsDir}`),
93
+ )
94
+ plansPath = join(getClaudeConfigHomeDir(), 'plans')
95
+ } else {
96
+ plansPath = resolved
97
+ }
98
+ } else {
99
+ // Default
100
+ plansPath = join(getClaudeConfigHomeDir(), 'plans')
101
+ }
102
+
103
+ // Ensure directory exists (mkdirSync with recursive: true is a no-op if it exists)
104
+ try {
105
+ getFsImplementation().mkdirSync(plansPath)
106
+ } catch (error) {
107
+ logError(error)
108
+ }
109
+
110
+ return plansPath
111
+ })
112
+
113
+ /**
114
+ * Get the file path for a session's plan
115
+ * @param agentId Optional agent ID for subagents. If not provided, returns main session plan.
116
+ * For main conversation (no agentId), returns {planSlug}.md
117
+ * For subagents (agentId provided), returns {planSlug}-agent-{agentId}.md
118
+ */
119
+ export function getPlanFilePath(agentId?: AgentId): string {
120
+ const planSlug = getPlanSlug(getSessionId())
121
+
122
+ // Main conversation: simple filename with word slug
123
+ if (!agentId) {
124
+ return join(getPlansDirectory(), `${planSlug}.md`)
125
+ }
126
+
127
+ // Subagents: include agent ID
128
+ return join(getPlansDirectory(), `${planSlug}-agent-${agentId}.md`)
129
+ }
130
+
131
+ /**
132
+ * Get the plan content for a session
133
+ * @param agentId Optional agent ID for subagents. If not provided, returns main session plan.
134
+ */
135
+ export function getPlan(agentId?: AgentId): string | null {
136
+ const filePath = getPlanFilePath(agentId)
137
+ try {
138
+ return getFsImplementation().readFileSync(filePath, { encoding: 'utf-8' })
139
+ } catch (error) {
140
+ if (isENOENT(error)) return null
141
+ logError(error)
142
+ return null
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Extract the plan slug from a log's message history.
148
+ */
149
+ function getSlugFromLog(log: LogOption): string | undefined {
150
+ return log.messages.find(m => m.slug)?.slug
151
+ }
152
+
153
+ /**
154
+ * Restore plan slug from a resumed session.
155
+ * Sets the slug in the session cache so getPlanSlug returns it.
156
+ * If the plan file is missing, attempts to recover it from a file snapshot
157
+ * (written incrementally during the session) or from message history.
158
+ * Returns true if a plan file exists (or was recovered) for the slug.
159
+ * @param log The log to restore from
160
+ * @param targetSessionId The session ID to associate the plan slug with.
161
+ * This should be the ORIGINAL session ID being resumed,
162
+ * not the temporary session ID from before resume.
163
+ */
164
+ export async function copyPlanForResume(
165
+ log: LogOption,
166
+ targetSessionId?: SessionId,
167
+ ): Promise<boolean> {
168
+ const slug = getSlugFromLog(log)
169
+ if (!slug) {
170
+ return false
171
+ }
172
+
173
+ // Set the slug for the target session ID (or current if not provided)
174
+ const sessionId = targetSessionId ?? getSessionId()
175
+ setPlanSlug(sessionId, slug)
176
+
177
+ // Attempt to read the plan file directly — recovery triggers on ENOENT.
178
+ const planPath = join(getPlansDirectory(), `${slug}.md`)
179
+ try {
180
+ await getFsImplementation().readFile(planPath, { encoding: 'utf-8' })
181
+ return true
182
+ } catch (e: unknown) {
183
+ if (!isENOENT(e)) {
184
+ // Don't throw — called fire-and-forget (void copyPlanForResume(...)) with no .catch()
185
+ logError(e)
186
+ return false
187
+ }
188
+ // Only attempt recovery in remote sessions (CCR) where files don't persist
189
+ if (getEnvironmentKind() === null) {
190
+ return false
191
+ }
192
+
193
+ logForDebugging(
194
+ `Plan file missing during resume: ${planPath}. Attempting recovery.`,
195
+ )
196
+
197
+ // Try file snapshot first (written incrementally during session)
198
+ const snapshotPlan = findFileSnapshotEntry(log.messages, 'plan')
199
+ let recovered: string | null = null
200
+ if (snapshotPlan && snapshotPlan.content.length > 0) {
201
+ recovered = snapshotPlan.content
202
+ logForDebugging(
203
+ `Plan recovered from file snapshot, ${recovered.length} chars`,
204
+ { level: 'info' },
205
+ )
206
+ } else {
207
+ // Fall back to searching message history
208
+ recovered = recoverPlanFromMessages(log)
209
+ if (recovered) {
210
+ logForDebugging(
211
+ `Plan recovered from message history, ${recovered.length} chars`,
212
+ { level: 'info' },
213
+ )
214
+ }
215
+ }
216
+
217
+ if (recovered) {
218
+ try {
219
+ await writeFile(planPath, recovered, { encoding: 'utf-8' })
220
+ return true
221
+ } catch (writeError) {
222
+ logError(writeError)
223
+ return false
224
+ }
225
+ }
226
+ logForDebugging(
227
+ 'Plan file recovery failed: no file snapshot or plan content found in message history',
228
+ )
229
+ return false
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Copy a plan file for a forked session. Unlike copyPlanForResume (which reuses
235
+ * the original slug), this generates a NEW slug for the forked session and
236
+ * writes the original plan content to the new file. This prevents the original
237
+ * and forked sessions from clobbering each other's plan files.
238
+ */
239
+ export async function copyPlanForFork(
240
+ log: LogOption,
241
+ targetSessionId: SessionId,
242
+ ): Promise<boolean> {
243
+ const originalSlug = getSlugFromLog(log)
244
+ if (!originalSlug) {
245
+ return false
246
+ }
247
+
248
+ const plansDir = getPlansDirectory()
249
+ const originalPlanPath = join(plansDir, `${originalSlug}.md`)
250
+
251
+ // Generate a new slug for the forked session (do NOT reuse the original)
252
+ const newSlug = getPlanSlug(targetSessionId)
253
+ const newPlanPath = join(plansDir, `${newSlug}.md`)
254
+ try {
255
+ await copyFile(originalPlanPath, newPlanPath)
256
+ return true
257
+ } catch (error) {
258
+ if (isENOENT(error)) {
259
+ return false
260
+ }
261
+ logError(error)
262
+ return false
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Recover plan content from the message history. Plan content can appear in
268
+ * three forms depending on what happened during the session:
269
+ *
270
+ * 1. ExitPlanMode tool_use input — normalizeToolInput injects the plan content
271
+ * into the tool_use input, which persists in the transcript.
272
+ *
273
+ * 2. planContent field on user messages — set during the "clear context and
274
+ * implement" flow when ExitPlanMode is approved.
275
+ *
276
+ * 3. plan_file_reference attachment — created by auto-compact to preserve the
277
+ * plan across compaction boundaries.
278
+ */
279
+ function recoverPlanFromMessages(log: LogOption): string | null {
280
+ for (let i = log.messages.length - 1; i >= 0; i--) {
281
+ const msg = log.messages[i]
282
+ if (!msg) {
283
+ continue
284
+ }
285
+
286
+ if (msg.type === 'assistant') {
287
+ const { content } = (msg as AssistantMessage).message
288
+ if (Array.isArray(content)) {
289
+ for (const block of content) {
290
+ if (
291
+ block.type === 'tool_use' &&
292
+ block.name === EXIT_PLAN_MODE_V2_TOOL_NAME
293
+ ) {
294
+ const input = block.input as Record<string, unknown> | undefined
295
+ const plan = input?.plan
296
+ if (typeof plan === 'string' && plan.length > 0) {
297
+ return plan
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+
304
+ if (msg.type === 'user') {
305
+ const userMsg = msg as UserMessage
306
+ if (
307
+ typeof userMsg.planContent === 'string' &&
308
+ userMsg.planContent.length > 0
309
+ ) {
310
+ return userMsg.planContent
311
+ }
312
+ }
313
+
314
+ if (msg.type === 'attachment') {
315
+ const attachmentMsg = msg as AttachmentMessage
316
+ if (attachmentMsg.attachment?.type === 'plan_file_reference') {
317
+ const plan = (attachmentMsg.attachment as { planContent?: string })
318
+ .planContent
319
+ if (typeof plan === 'string' && plan.length > 0) {
320
+ return plan
321
+ }
322
+ }
323
+ }
324
+ }
325
+ return null
326
+ }
327
+
328
+ /**
329
+ * Find a file entry in the most recent file-snapshot system message in the transcript.
330
+ * Scans backwards to find the latest snapshot.
331
+ */
332
+ function findFileSnapshotEntry(
333
+ messages: LogOption['messages'],
334
+ key: string,
335
+ ): { key: string; path: string; content: string } | undefined {
336
+ for (let i = messages.length - 1; i >= 0; i--) {
337
+ const msg = messages[i]
338
+ if (
339
+ msg?.type === 'system' &&
340
+ 'subtype' in msg &&
341
+ msg.subtype === 'file_snapshot' &&
342
+ 'snapshotFiles' in msg
343
+ ) {
344
+ const files = msg.snapshotFiles as Array<{
345
+ key: string
346
+ path: string
347
+ content: string
348
+ }>
349
+ return files.find(f => f.key === key)
350
+ }
351
+ }
352
+ return undefined
353
+ }
354
+
355
+ /**
356
+ * Persist a snapshot of session files (plan, todos) to the transcript.
357
+ * Called incrementally whenever these files change. Only active in remote
358
+ * sessions (CCR) where local files don't persist between sessions.
359
+ */
360
+ export async function persistFileSnapshotIfRemote(): Promise<void> {
361
+ if (getEnvironmentKind() === null) {
362
+ return
363
+ }
364
+ try {
365
+ const snapshotFiles: SystemFileSnapshotMessage['snapshotFiles'] = []
366
+
367
+ // Snapshot plan file
368
+ const plan = getPlan()
369
+ if (plan) {
370
+ snapshotFiles.push({
371
+ key: 'plan',
372
+ path: getPlanFilePath(),
373
+ content: plan,
374
+ })
375
+ }
376
+
377
+ if (snapshotFiles.length === 0) {
378
+ return
379
+ }
380
+
381
+ const message: SystemFileSnapshotMessage = {
382
+ type: 'system',
383
+ subtype: 'file_snapshot',
384
+ content: 'File snapshot',
385
+ level: 'info',
386
+ isMeta: true,
387
+ timestamp: new Date().toISOString(),
388
+ uuid: randomUUID(),
389
+ snapshotFiles,
390
+ }
391
+
392
+ const { recordTranscript } = await import('./sessionStorage.js')
393
+ await recordTranscript([message])
394
+ } catch (error) {
395
+ logError(error)
396
+ }
397
+ }
@@ -0,0 +1,150 @@
1
+ import { readdir, readFile } from 'fs/promises'
2
+ import memoize from 'lodash-es/memoize.js'
3
+ import { release as osRelease } from 'os'
4
+ import { getFsImplementation } from './fsOperations.js'
5
+ import { logError } from './log.js'
6
+
7
+ export type Platform = 'macos' | 'windows' | 'wsl' | 'linux' | 'unknown'
8
+
9
+ export const SUPPORTED_PLATFORMS: Platform[] = ['macos', 'wsl']
10
+
11
+ export const getPlatform = memoize((): Platform => {
12
+ try {
13
+ if (process.platform === 'darwin') {
14
+ return 'macos'
15
+ }
16
+
17
+ if (process.platform === 'win32') {
18
+ return 'windows'
19
+ }
20
+
21
+ if (process.platform === 'linux') {
22
+ // Check if running in WSL (Windows Subsystem for Linux)
23
+ try {
24
+ const procVersion = getFsImplementation().readFileSync(
25
+ '/proc/version',
26
+ { encoding: 'utf8' },
27
+ )
28
+ if (
29
+ procVersion.toLowerCase().includes('microsoft') ||
30
+ procVersion.toLowerCase().includes('wsl')
31
+ ) {
32
+ return 'wsl'
33
+ }
34
+ } catch (error) {
35
+ // Error reading /proc/version, assume regular Linux
36
+ logError(error)
37
+ }
38
+
39
+ // Regular Linux
40
+ return 'linux'
41
+ }
42
+
43
+ // Unknown platform
44
+ return 'unknown'
45
+ } catch (error) {
46
+ logError(error)
47
+ return 'unknown'
48
+ }
49
+ })
50
+
51
+ export const getWslVersion = memoize((): string | undefined => {
52
+ // Only check for WSL on Linux systems
53
+ if (process.platform !== 'linux') {
54
+ return undefined
55
+ }
56
+ try {
57
+ const procVersion = getFsImplementation().readFileSync('/proc/version', {
58
+ encoding: 'utf8',
59
+ })
60
+
61
+ // First check for explicit WSL version markers (e.g., "WSL2", "WSL3", etc.)
62
+ const wslVersionMatch = procVersion.match(/WSL(\d+)/i)
63
+ if (wslVersionMatch && wslVersionMatch[1]) {
64
+ return wslVersionMatch[1]
65
+ }
66
+
67
+ // If no explicit WSL version but contains Microsoft, assume WSL1
68
+ // This handles the original WSL1 format: "4.4.0-19041-Microsoft"
69
+ if (procVersion.toLowerCase().includes('microsoft')) {
70
+ return '1'
71
+ }
72
+
73
+ // Not WSL or unable to determine version
74
+ return undefined
75
+ } catch (error) {
76
+ logError(error)
77
+ return undefined
78
+ }
79
+ })
80
+
81
+ export type LinuxDistroInfo = {
82
+ linuxDistroId?: string
83
+ linuxDistroVersion?: string
84
+ linuxKernel?: string
85
+ }
86
+
87
+ export const getLinuxDistroInfo = memoize(
88
+ async (): Promise<LinuxDistroInfo | undefined> => {
89
+ if (process.platform !== 'linux') {
90
+ return undefined
91
+ }
92
+
93
+ const result: LinuxDistroInfo = {
94
+ linuxKernel: osRelease(),
95
+ }
96
+
97
+ try {
98
+ const content = await readFile('/etc/os-release', 'utf8')
99
+ for (const line of content.split('\n')) {
100
+ const match = line.match(/^(ID|VERSION_ID)=(.*)$/)
101
+ if (match && match[1] && match[2]) {
102
+ const value = match[2].replace(/^"|"$/g, '')
103
+ if (match[1] === 'ID') {
104
+ result.linuxDistroId = value
105
+ } else {
106
+ result.linuxDistroVersion = value
107
+ }
108
+ }
109
+ }
110
+ } catch {
111
+ // /etc/os-release may not exist on all Linux systems
112
+ }
113
+
114
+ return result
115
+ },
116
+ )
117
+
118
+ const VCS_MARKERS: Array<[string, string]> = [
119
+ ['.git', 'git'],
120
+ ['.hg', 'mercurial'],
121
+ ['.svn', 'svn'],
122
+ ['.p4config', 'perforce'],
123
+ ['$tf', 'tfs'],
124
+ ['.tfvc', 'tfs'],
125
+ ['.jj', 'jujutsu'],
126
+ ['.sl', 'sapling'],
127
+ ]
128
+
129
+ export async function detectVcs(dir?: string): Promise<string[]> {
130
+ const detected = new Set<string>()
131
+
132
+ // Check for Perforce via env var
133
+ if (process.env.P4PORT) {
134
+ detected.add('perforce')
135
+ }
136
+
137
+ try {
138
+ const targetDir = dir ?? getFsImplementation().cwd()
139
+ const entries = new Set(await readdir(targetDir))
140
+ for (const [marker, vcs] of VCS_MARKERS) {
141
+ if (entries.has(marker)) {
142
+ detected.add(vcs)
143
+ }
144
+ }
145
+ } catch {
146
+ // Directory may not be readable
147
+ }
148
+
149
+ return [...detected]
150
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Reads plugin-related settings (enabledPlugins, extraKnownMarketplaces)
3
+ * from --add-dir directories.
4
+ *
5
+ * These have the LOWEST priority — callers must spread standard settings
6
+ * on top so that user/project/local/flag/policy sources all override.
7
+ */
8
+
9
+ import { join } from 'path'
10
+ import type { z } from 'zod/v4'
11
+ import { getAdditionalDirectoriesForClaudeMd } from '../../bootstrap/state.js'
12
+ import { parseSettingsFile } from '../settings/settings.js'
13
+ import type {
14
+ ExtraKnownMarketplaceSchema,
15
+ SettingsJson,
16
+ } from '../settings/types.js'
17
+
18
+ type ExtraKnownMarketplace = z.infer<
19
+ ReturnType<typeof ExtraKnownMarketplaceSchema>
20
+ >
21
+
22
+ const SETTINGS_FILES = ['settings.json', 'settings.local.json'] as const
23
+
24
+ /**
25
+ * Returns a merged record of enabledPlugins from all --add-dir directories.
26
+ *
27
+ * Within each directory, settings.local.json is processed after settings.json
28
+ * (local wins within that dir). Across directories, later CLI-order wins on
29
+ * conflict.
30
+ *
31
+ * This has the lowest priority — callers must spread their standard settings
32
+ * on top to let user/project/local/flag/policy override.
33
+ */
34
+ export function getAddDirEnabledPlugins(): NonNullable<
35
+ SettingsJson['enabledPlugins']
36
+ > {
37
+ const result: NonNullable<SettingsJson['enabledPlugins']> = {}
38
+ for (const dir of getAdditionalDirectoriesForClaudeMd()) {
39
+ for (const file of SETTINGS_FILES) {
40
+ const { settings } = parseSettingsFile(join(dir, '.claude', file))
41
+ if (!settings?.enabledPlugins) {
42
+ continue
43
+ }
44
+ Object.assign(result, settings.enabledPlugins)
45
+ }
46
+ }
47
+ return result
48
+ }
49
+
50
+ /**
51
+ * Returns a merged record of extraKnownMarketplaces from all --add-dir directories.
52
+ *
53
+ * Same priority rules as getAddDirEnabledPlugins: settings.local.json wins
54
+ * within each dir, and callers spread standard settings on top.
55
+ */
56
+ export function getAddDirExtraMarketplaces(): Record<
57
+ string,
58
+ ExtraKnownMarketplace
59
+ > {
60
+ const result: Record<string, ExtraKnownMarketplace> = {}
61
+ for (const dir of getAdditionalDirectoriesForClaudeMd()) {
62
+ for (const file of SETTINGS_FILES) {
63
+ const { settings } = parseSettingsFile(join(dir, '.claude', file))
64
+ if (!settings?.extraKnownMarketplaces) {
65
+ continue
66
+ }
67
+ Object.assign(result, settings.extraKnownMarketplaces)
68
+ }
69
+ }
70
+ return result
71
+ }