@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,178 @@
1
+ /**
2
+ * Headless mode profiling utility for measuring per-turn latency in -p (print) mode.
3
+ *
4
+ * Tracks key timing phases per turn:
5
+ * - Time to system message output (turn 0 only)
6
+ * - Time to first query started
7
+ * - Time to first API response (TTFT)
8
+ *
9
+ * Uses Node.js built-in performance hooks API for standard timing measurement.
10
+ * Sampled logging: 100% of ant users, 5% of external users.
11
+ *
12
+ * Set CLAUDE_CODE_PROFILE_STARTUP=1 for detailed logging output.
13
+ */
14
+
15
+ import { getIsNonInteractiveSession } from '../bootstrap/state.js'
16
+ import {
17
+ type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
18
+ logEvent,
19
+ } from '../services/analytics/index.js'
20
+ import { logForDebugging } from './debug.js'
21
+ import { isEnvTruthy } from './envUtils.js'
22
+ import { getPerformance } from './profilerBase.js'
23
+ import { jsonStringify } from './slowOperations.js'
24
+
25
+ // Detailed profiling mode - same env var as startupProfiler
26
+ // eslint-disable-next-line custom-rules/no-process-env-top-level
27
+ const DETAILED_PROFILING = isEnvTruthy(process.env.CLAUDE_CODE_PROFILE_STARTUP)
28
+
29
+ // Sampling for Statsig logging: 100% ant, 5% external
30
+ // Decision made once at module load - non-sampled users pay no profiling cost
31
+ const STATSIG_SAMPLE_RATE = 0.05
32
+ // eslint-disable-next-line custom-rules/no-process-env-top-level
33
+ const STATSIG_LOGGING_SAMPLED =
34
+ process.env.USER_TYPE === 'ant' || Math.random() < STATSIG_SAMPLE_RATE
35
+
36
+ // Enable profiling if either detailed mode OR sampled for Statsig
37
+ const SHOULD_PROFILE = DETAILED_PROFILING || STATSIG_LOGGING_SAMPLED
38
+
39
+ // Use a unique prefix to avoid conflicts with other profiler marks
40
+ const MARK_PREFIX = 'headless_'
41
+
42
+ // Track current turn number (auto-incremented by headlessProfilerStartTurn)
43
+ let currentTurnNumber = -1
44
+
45
+ /**
46
+ * Clear all headless profiler marks from performance timeline
47
+ */
48
+ function clearHeadlessMarks(): void {
49
+ const perf = getPerformance()
50
+ const allMarks = perf.getEntriesByType('mark')
51
+ for (const mark of allMarks) {
52
+ if (mark.name.startsWith(MARK_PREFIX)) {
53
+ perf.clearMarks(mark.name)
54
+ }
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Start a new turn for profiling. Clears previous marks, increments turn number,
60
+ * and records turn_start. Call this at the beginning of each user message processing.
61
+ */
62
+ export function headlessProfilerStartTurn(): void {
63
+ // Only profile in headless/non-interactive mode
64
+ if (!getIsNonInteractiveSession()) return
65
+ // Only profile if enabled
66
+ if (!SHOULD_PROFILE) return
67
+
68
+ currentTurnNumber++
69
+ clearHeadlessMarks()
70
+
71
+ const perf = getPerformance()
72
+ perf.mark(`${MARK_PREFIX}turn_start`)
73
+
74
+ if (DETAILED_PROFILING) {
75
+ logForDebugging(`[headlessProfiler] Started turn ${currentTurnNumber}`)
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Record a checkpoint with the given name.
81
+ * Only records if in headless mode and profiling is enabled.
82
+ */
83
+ export function headlessProfilerCheckpoint(name: string): void {
84
+ // Only profile in headless/non-interactive mode
85
+ if (!getIsNonInteractiveSession()) return
86
+ // Only profile if enabled
87
+ if (!SHOULD_PROFILE) return
88
+
89
+ const perf = getPerformance()
90
+ perf.mark(`${MARK_PREFIX}${name}`)
91
+
92
+ if (DETAILED_PROFILING) {
93
+ logForDebugging(
94
+ `[headlessProfiler] Checkpoint: ${name} at ${perf.now().toFixed(1)}ms`,
95
+ )
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Log headless latency metrics for the current turn to Statsig.
101
+ * Call this at the end of each turn (before processing next user message).
102
+ */
103
+ export function logHeadlessProfilerTurn(): void {
104
+ // Only log in headless mode
105
+ if (!getIsNonInteractiveSession()) return
106
+ // Only log if enabled
107
+ if (!SHOULD_PROFILE) return
108
+
109
+ const perf = getPerformance()
110
+ const allMarks = perf.getEntriesByType('mark')
111
+
112
+ // Filter to only our headless marks
113
+ const marks = allMarks.filter(mark => mark.name.startsWith(MARK_PREFIX))
114
+ if (marks.length === 0) return
115
+
116
+ // Build checkpoint lookup (strip prefix for easier access)
117
+ const checkpointTimes = new Map<string, number>()
118
+ for (const mark of marks) {
119
+ const name = mark.name.slice(MARK_PREFIX.length)
120
+ checkpointTimes.set(name, mark.startTime)
121
+ }
122
+
123
+ const turnStart = checkpointTimes.get('turn_start')
124
+ if (turnStart === undefined) return
125
+
126
+ // Compute phase durations relative to turn_start
127
+ const metadata: Record<string, number | string | undefined> = {
128
+ turn_number: currentTurnNumber,
129
+ }
130
+
131
+ // Time to system message from process start (only meaningful for turn 0)
132
+ // Use absolute time since perf_hooks startTime is relative to process start
133
+ const systemMessageTime = checkpointTimes.get('system_message_yielded')
134
+ if (systemMessageTime !== undefined && currentTurnNumber === 0) {
135
+ metadata.time_to_system_message_ms = Math.round(systemMessageTime)
136
+ }
137
+
138
+ // Time to query start
139
+ const queryStartTime = checkpointTimes.get('query_started')
140
+ if (queryStartTime !== undefined) {
141
+ metadata.time_to_query_start_ms = Math.round(queryStartTime - turnStart)
142
+ }
143
+
144
+ // Time to first response (first chunk from API)
145
+ const firstChunkTime = checkpointTimes.get('first_chunk')
146
+ if (firstChunkTime !== undefined) {
147
+ metadata.time_to_first_response_ms = Math.round(firstChunkTime - turnStart)
148
+ }
149
+
150
+ // Query overhead (time between query start and API request sent)
151
+ const apiRequestTime = checkpointTimes.get('api_request_sent')
152
+ if (queryStartTime !== undefined && apiRequestTime !== undefined) {
153
+ metadata.query_overhead_ms = Math.round(apiRequestTime - queryStartTime)
154
+ }
155
+
156
+ // Add checkpoint count for debugging
157
+ metadata.checkpoint_count = marks.length
158
+
159
+ // Add entrypoint for segmentation (sdk-ts, sdk-py, sdk-cli, or undefined)
160
+ if (process.env.CLAUDE_CODE_ENTRYPOINT) {
161
+ metadata.entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT
162
+ }
163
+
164
+ // Log to Statsig if sampled
165
+ if (STATSIG_LOGGING_SAMPLED) {
166
+ logEvent(
167
+ 'tengu_headless_latency',
168
+ metadata as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
169
+ )
170
+ }
171
+
172
+ // Log detailed output if CLAUDE_CODE_PROFILE_STARTUP=1
173
+ if (DETAILED_PROFILING) {
174
+ logForDebugging(
175
+ `[headlessProfiler] Turn ${currentTurnNumber} metrics: ${jsonStringify(metadata)}`,
176
+ )
177
+ }
178
+ }
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Service for heap dump capture.
3
+ * Used by the /heapdump command.
4
+ */
5
+
6
+ import { createWriteStream, writeFileSync } from 'fs'
7
+ import { readdir, readFile, writeFile } from 'fs/promises'
8
+ import { join } from 'path'
9
+ import { pipeline } from 'stream/promises'
10
+ import {
11
+ getHeapSnapshot,
12
+ getHeapSpaceStatistics,
13
+ getHeapStatistics,
14
+ type HeapSpaceInfo,
15
+ } from 'v8'
16
+ import { getSessionId } from '../bootstrap/state.js'
17
+ import { logEvent } from '../services/analytics/index.js'
18
+ import { logForDebugging } from './debug.js'
19
+ import { toError } from './errors.js'
20
+ import { getDesktopPath } from './file.js'
21
+ import { getFsImplementation } from './fsOperations.js'
22
+ import { logError } from './log.js'
23
+ import { jsonStringify } from './slowOperations.js'
24
+
25
+ export type HeapDumpResult = {
26
+ success: boolean
27
+ heapPath?: string
28
+ diagPath?: string
29
+ error?: string
30
+ }
31
+
32
+ /**
33
+ * Memory diagnostics captured alongside heap dump.
34
+ * Helps identify if leak is in V8 heap (captured in snapshot) or native memory (not captured).
35
+ */
36
+ export type MemoryDiagnostics = {
37
+ timestamp: string
38
+ sessionId: string
39
+ trigger: 'manual' | 'auto-1.5GB'
40
+ dumpNumber: number // 1st, 2nd, etc. auto dump in this session (0 for manual)
41
+ uptimeSeconds: number
42
+ memoryUsage: {
43
+ heapUsed: number
44
+ heapTotal: number
45
+ external: number
46
+ arrayBuffers: number
47
+ rss: number
48
+ }
49
+ memoryGrowthRate: {
50
+ bytesPerSecond: number
51
+ mbPerHour: number
52
+ }
53
+ v8HeapStats: {
54
+ heapSizeLimit: number // Max heap size allowed
55
+ mallocedMemory: number // Memory allocated outside V8 heap
56
+ peakMallocedMemory: number // Peak native memory
57
+ detachedContexts: number // Leaked contexts - key leak indicator!
58
+ nativeContexts: number // Active contexts
59
+ }
60
+ v8HeapSpaces?: Array<{
61
+ name: string
62
+ size: number
63
+ used: number
64
+ available: number
65
+ }>
66
+ resourceUsage: {
67
+ maxRSS: number // Peak RSS in bytes
68
+ userCPUTime: number
69
+ systemCPUTime: number
70
+ }
71
+ activeHandles: number // Leaked timers, sockets, file handles
72
+ activeRequests: number // Pending async operations
73
+ openFileDescriptors?: number // Linux/macOS - indicates resource leaks
74
+ analysis: {
75
+ potentialLeaks: string[]
76
+ recommendation: string
77
+ }
78
+ smapsRollup?: string // Linux only - detailed memory breakdown
79
+ platform: string
80
+ nodeVersion: string
81
+ ccVersion: string
82
+ }
83
+
84
+ /**
85
+ * Capture memory diagnostics.
86
+ * This helps identify if the leak is in V8 heap (captured) or native memory (not captured).
87
+ */
88
+ export async function captureMemoryDiagnostics(
89
+ trigger: 'manual' | 'auto-1.5GB',
90
+ dumpNumber = 0,
91
+ ): Promise<MemoryDiagnostics> {
92
+ const usage = process.memoryUsage()
93
+ const heapStats = getHeapStatistics()
94
+ const resourceUsage = process.resourceUsage()
95
+ const uptimeSeconds = process.uptime()
96
+
97
+ // getHeapSpaceStatistics() is not available in Bun
98
+ let heapSpaceStats: HeapSpaceInfo[] | undefined
99
+ try {
100
+ heapSpaceStats = getHeapSpaceStatistics()
101
+ } catch {
102
+ // Not available in Bun runtime
103
+ }
104
+
105
+ // Get active handles/requests count (these are internal APIs but stable)
106
+ const activeHandles = (
107
+ process as unknown as { _getActiveHandles: () => unknown[] }
108
+ )._getActiveHandles().length
109
+ const activeRequests = (
110
+ process as unknown as { _getActiveRequests: () => unknown[] }
111
+ )._getActiveRequests().length
112
+
113
+ // Try to count open file descriptors (Linux/macOS)
114
+ let openFileDescriptors: number | undefined
115
+ try {
116
+ openFileDescriptors = (await readdir('/proc/self/fd')).length
117
+ } catch {
118
+ // Not on Linux - try macOS approach would require lsof, skip for now
119
+ }
120
+
121
+ // Try to read Linux smaps_rollup for detailed memory breakdown
122
+ let smapsRollup: string | undefined
123
+ try {
124
+ smapsRollup = await readFile('/proc/self/smaps_rollup', 'utf8')
125
+ } catch {
126
+ // Not on Linux or no access - this is fine
127
+ }
128
+
129
+ // Calculate native memory (RSS - heap) and growth rate
130
+ const nativeMemory = usage.rss - usage.heapUsed
131
+ const bytesPerSecond = uptimeSeconds > 0 ? usage.rss / uptimeSeconds : 0
132
+ const mbPerHour = (bytesPerSecond * 3600) / (1024 * 1024)
133
+
134
+ // Identify potential leaks
135
+ const potentialLeaks: string[] = []
136
+ if (heapStats.number_of_detached_contexts > 0) {
137
+ potentialLeaks.push(
138
+ `${heapStats.number_of_detached_contexts} detached context(s) - possible iframe/context leak`,
139
+ )
140
+ }
141
+ if (activeHandles > 100) {
142
+ potentialLeaks.push(
143
+ `${activeHandles} active handles - possible timer/socket leak`,
144
+ )
145
+ }
146
+ if (nativeMemory > usage.heapUsed) {
147
+ potentialLeaks.push(
148
+ 'Native memory > heap - leak may be in native addons (node-pty, sharp, etc.)',
149
+ )
150
+ }
151
+ if (mbPerHour > 100) {
152
+ potentialLeaks.push(
153
+ `High memory growth rate: ${mbPerHour.toFixed(1)} MB/hour`,
154
+ )
155
+ }
156
+ if (openFileDescriptors && openFileDescriptors > 500) {
157
+ potentialLeaks.push(
158
+ `${openFileDescriptors} open file descriptors - possible file/socket leak`,
159
+ )
160
+ }
161
+
162
+ return {
163
+ timestamp: new Date().toISOString(),
164
+ sessionId: getSessionId(),
165
+ trigger,
166
+ dumpNumber,
167
+ uptimeSeconds,
168
+ memoryUsage: {
169
+ heapUsed: usage.heapUsed,
170
+ heapTotal: usage.heapTotal,
171
+ external: usage.external,
172
+ arrayBuffers: usage.arrayBuffers,
173
+ rss: usage.rss,
174
+ },
175
+ memoryGrowthRate: {
176
+ bytesPerSecond,
177
+ mbPerHour,
178
+ },
179
+ v8HeapStats: {
180
+ heapSizeLimit: heapStats.heap_size_limit,
181
+ mallocedMemory: heapStats.malloced_memory,
182
+ peakMallocedMemory: heapStats.peak_malloced_memory,
183
+ detachedContexts: heapStats.number_of_detached_contexts,
184
+ nativeContexts: heapStats.number_of_native_contexts,
185
+ },
186
+ v8HeapSpaces: heapSpaceStats?.map(space => ({
187
+ name: space.space_name,
188
+ size: space.space_size,
189
+ used: space.space_used_size,
190
+ available: space.space_available_size,
191
+ })),
192
+ resourceUsage: {
193
+ maxRSS: resourceUsage.maxRSS * 1024, // Convert KB to bytes
194
+ userCPUTime: resourceUsage.userCPUTime,
195
+ systemCPUTime: resourceUsage.systemCPUTime,
196
+ },
197
+ activeHandles,
198
+ activeRequests,
199
+ openFileDescriptors,
200
+ analysis: {
201
+ potentialLeaks,
202
+ recommendation:
203
+ potentialLeaks.length > 0
204
+ ? `WARNING: ${potentialLeaks.length} potential leak indicator(s) found. See potentialLeaks array.`
205
+ : 'No obvious leak indicators. Check heap snapshot for retained objects.',
206
+ },
207
+ smapsRollup,
208
+ platform: process.platform,
209
+ nodeVersion: process.version,
210
+ ccVersion: MACRO.VERSION,
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Core heap dump function — captures heap snapshot + diagnostics to ~/Desktop.
216
+ *
217
+ * Diagnostics are written BEFORE the heap snapshot is captured, because the
218
+ * V8 heap snapshot serialization can crash for very large heaps. By writing
219
+ * diagnostics first, we still get useful memory info even if the snapshot fails.
220
+ */
221
+ export async function performHeapDump(
222
+ trigger: 'manual' | 'auto-1.5GB' = 'manual',
223
+ dumpNumber = 0,
224
+ ): Promise<HeapDumpResult> {
225
+ try {
226
+ const sessionId = getSessionId()
227
+
228
+ // Capture diagnostics before any other async I/O —
229
+ // the heap dump itself allocates memory and would skew the numbers.
230
+ const diagnostics = await captureMemoryDiagnostics(trigger, dumpNumber)
231
+
232
+ const toGB = (bytes: number): string =>
233
+ (bytes / 1024 / 1024 / 1024).toFixed(3)
234
+ logForDebugging(`[HeapDump] Memory state:
235
+ heapUsed: ${toGB(diagnostics.memoryUsage.heapUsed)} GB (in snapshot)
236
+ external: ${toGB(diagnostics.memoryUsage.external)} GB (NOT in snapshot)
237
+ rss: ${toGB(diagnostics.memoryUsage.rss)} GB (total process)
238
+ ${diagnostics.analysis.recommendation}`)
239
+
240
+ const dumpDir = getDesktopPath()
241
+ await getFsImplementation().mkdir(dumpDir)
242
+
243
+ const suffix = dumpNumber > 0 ? `-dump${dumpNumber}` : ''
244
+ const heapFilename = `${sessionId}${suffix}.heapsnapshot`
245
+ const diagFilename = `${sessionId}${suffix}-diagnostics.json`
246
+ const heapPath = join(dumpDir, heapFilename)
247
+ const diagPath = join(dumpDir, diagFilename)
248
+
249
+ // Write diagnostics first (cheap, unlikely to fail)
250
+ await writeFile(diagPath, jsonStringify(diagnostics, null, 2), {
251
+ mode: 0o600,
252
+ })
253
+ logForDebugging(`[HeapDump] Diagnostics written to ${diagPath}`)
254
+
255
+ // Write heap snapshot (this can crash for very large heaps)
256
+ await writeHeapSnapshot(heapPath)
257
+ logForDebugging(`[HeapDump] Heap dump written to ${heapPath}`)
258
+
259
+ logEvent('tengu_heap_dump', {
260
+ triggerManual: trigger === 'manual',
261
+ triggerAuto15GB: trigger === 'auto-1.5GB',
262
+ dumpNumber,
263
+ success: true,
264
+ })
265
+
266
+ return { success: true, heapPath, diagPath }
267
+ } catch (err) {
268
+ const error = toError(err)
269
+ logError(error)
270
+ logEvent('tengu_heap_dump', {
271
+ triggerManual: trigger === 'manual',
272
+ triggerAuto15GB: trigger === 'auto-1.5GB',
273
+ dumpNumber,
274
+ success: false,
275
+ })
276
+ return { success: false, error: error.message }
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Write heap snapshot to a file.
282
+ * Uses pipeline() which handles stream cleanup automatically on errors.
283
+ */
284
+ async function writeHeapSnapshot(filepath: string): Promise<void> {
285
+ if (typeof Bun !== 'undefined') {
286
+ // In Bun, heapsnapshots are currently not streaming.
287
+ // Use synchronous I/O despite potentially large filesize so that we avoid cloning the string for cross-thread usage.
288
+ //
289
+ /* eslint-disable custom-rules/no-sync-fs -- intentionally sync to avoid cloning large heap snapshot string for cross-thread usage */
290
+ // @ts-expect-error 2nd argument is in the next version of Bun
291
+ writeFileSync(filepath, Bun.generateHeapSnapshot('v8', 'arraybuffer'), {
292
+ mode: 0o600,
293
+ })
294
+ /* eslint-enable custom-rules/no-sync-fs */
295
+
296
+ // Force GC to try to free that heap snapshot sooner.
297
+ Bun.gc(true)
298
+ return
299
+ }
300
+ const writeStream = createWriteStream(filepath, { mode: 0o600 })
301
+ const heapSnapshotStream = getHeapSnapshot()
302
+ await pipeline(heapSnapshotStream, writeStream)
303
+ }
@@ -0,0 +1,198 @@
1
+ import chalk from 'chalk'
2
+ import type { DailyActivity } from './stats.js'
3
+ import { toDateString } from './statsCache.js'
4
+
5
+ export type HeatmapOptions = {
6
+ terminalWidth?: number // Terminal width in characters
7
+ showMonthLabels?: boolean
8
+ }
9
+
10
+ type Percentiles = {
11
+ p25: number
12
+ p50: number
13
+ p75: number
14
+ }
15
+
16
+ /**
17
+ * Pre-calculates percentiles from activity data for use in intensity calculations
18
+ */
19
+ function calculatePercentiles(
20
+ dailyActivity: DailyActivity[],
21
+ ): Percentiles | null {
22
+ const counts = dailyActivity
23
+ .map(a => a.messageCount)
24
+ .filter(c => c > 0)
25
+ .sort((a, b) => a - b)
26
+
27
+ if (counts.length === 0) return null
28
+
29
+ return {
30
+ p25: counts[Math.floor(counts.length * 0.25)]!,
31
+ p50: counts[Math.floor(counts.length * 0.5)]!,
32
+ p75: counts[Math.floor(counts.length * 0.75)]!,
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Generates a GitHub-style activity heatmap for the terminal
38
+ */
39
+ export function generateHeatmap(
40
+ dailyActivity: DailyActivity[],
41
+ options: HeatmapOptions = {},
42
+ ): string {
43
+ const { terminalWidth = 80, showMonthLabels = true } = options
44
+
45
+ // Day labels take 4 characters ("Mon "), calculate weeks that fit
46
+ // Cap at 52 weeks (1 year) to match GitHub style
47
+ const dayLabelWidth = 4
48
+ const availableWidth = terminalWidth - dayLabelWidth
49
+ const width = Math.min(52, Math.max(10, availableWidth))
50
+
51
+ // Build activity map by date
52
+ const activityMap = new Map<string, DailyActivity>()
53
+ for (const activity of dailyActivity) {
54
+ activityMap.set(activity.date, activity)
55
+ }
56
+
57
+ // Pre-calculate percentiles once for all intensity lookups
58
+ const percentiles = calculatePercentiles(dailyActivity)
59
+
60
+ // Calculate date range - end at today, go back N weeks
61
+ const today = new Date()
62
+ today.setHours(0, 0, 0, 0)
63
+
64
+ // Find the Sunday of the current week (start of the week containing today)
65
+ const currentWeekStart = new Date(today)
66
+ currentWeekStart.setDate(today.getDate() - today.getDay())
67
+
68
+ // Go back (width - 1) weeks from the current week start
69
+ const startDate = new Date(currentWeekStart)
70
+ startDate.setDate(startDate.getDate() - (width - 1) * 7)
71
+
72
+ // Generate grid (7 rows for days of week, width columns for weeks)
73
+ // Also track which week each month starts for labels
74
+ const grid: string[][] = Array.from({ length: 7 }, () =>
75
+ Array(width).fill(''),
76
+ )
77
+ const monthStarts: { month: number; week: number }[] = []
78
+ let lastMonth = -1
79
+
80
+ const currentDate = new Date(startDate)
81
+ for (let week = 0; week < width; week++) {
82
+ for (let day = 0; day < 7; day++) {
83
+ // Don't show future dates
84
+ if (currentDate > today) {
85
+ grid[day]![week] = ' '
86
+ currentDate.setDate(currentDate.getDate() + 1)
87
+ continue
88
+ }
89
+
90
+ const dateStr = toDateString(currentDate)
91
+ const activity = activityMap.get(dateStr)
92
+
93
+ // Track month changes (on day 0 = Sunday of each week)
94
+ if (day === 0) {
95
+ const month = currentDate.getMonth()
96
+ if (month !== lastMonth) {
97
+ monthStarts.push({ month, week })
98
+ lastMonth = month
99
+ }
100
+ }
101
+
102
+ // Determine intensity level based on message count
103
+ const intensity = getIntensity(activity?.messageCount || 0, percentiles)
104
+ grid[day]![week] = getHeatmapChar(intensity)
105
+
106
+ currentDate.setDate(currentDate.getDate() + 1)
107
+ }
108
+ }
109
+
110
+ // Build output
111
+ const lines: string[] = []
112
+
113
+ // Month labels - evenly spaced across the grid
114
+ if (showMonthLabels) {
115
+ const monthNames = [
116
+ 'Jan',
117
+ 'Feb',
118
+ 'Mar',
119
+ 'Apr',
120
+ 'May',
121
+ 'Jun',
122
+ 'Jul',
123
+ 'Aug',
124
+ 'Sep',
125
+ 'Oct',
126
+ 'Nov',
127
+ 'Dec',
128
+ ]
129
+
130
+ // Build label line with fixed-width month labels
131
+ const uniqueMonths = monthStarts.map(m => m.month)
132
+ const labelWidth = Math.floor(width / Math.max(uniqueMonths.length, 1))
133
+ const monthLabels = uniqueMonths
134
+ .map(month => monthNames[month]!.padEnd(labelWidth))
135
+ .join('')
136
+
137
+ // 4 spaces for day label column prefix
138
+ lines.push(' ' + monthLabels)
139
+ }
140
+
141
+ // Day labels
142
+ const dayLabels = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
143
+
144
+ // Grid
145
+ for (let day = 0; day < 7; day++) {
146
+ // Only show labels for Mon, Wed, Fri
147
+ const label = [1, 3, 5].includes(day) ? dayLabels[day]!.padEnd(3) : ' '
148
+ const row = label + ' ' + grid[day]!.join('')
149
+ lines.push(row)
150
+ }
151
+
152
+ // Legend
153
+ lines.push('')
154
+ lines.push(
155
+ ' Less ' +
156
+ [
157
+ claudeOrange('░'),
158
+ claudeOrange('▒'),
159
+ claudeOrange('▓'),
160
+ claudeOrange('█'),
161
+ ].join(' ') +
162
+ ' More',
163
+ )
164
+
165
+ return lines.join('\n')
166
+ }
167
+
168
+ function getIntensity(
169
+ messageCount: number,
170
+ percentiles: Percentiles | null,
171
+ ): number {
172
+ if (messageCount === 0 || !percentiles) return 0
173
+
174
+ if (messageCount >= percentiles.p75) return 4
175
+ if (messageCount >= percentiles.p50) return 3
176
+ if (messageCount >= percentiles.p25) return 2
177
+ return 1
178
+ }
179
+
180
+ // Claude orange color (hex #da7756)
181
+ const claudeOrange = chalk.hex('#da7756')
182
+
183
+ function getHeatmapChar(intensity: number): string {
184
+ switch (intensity) {
185
+ case 0:
186
+ return chalk.gray('·')
187
+ case 1:
188
+ return claudeOrange('░')
189
+ case 2:
190
+ return claudeOrange('▒')
191
+ case 3:
192
+ return claudeOrange('▓')
193
+ case 4:
194
+ return claudeOrange('█')
195
+ default:
196
+ return chalk.gray('·')
197
+ }
198
+ }