@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,793 @@
1
+ /**
2
+ * Portable session storage utilities.
3
+ *
4
+ * Pure Node.js — no internal dependencies on logging, experiments, or feature
5
+ * flags. Shared between the CLI (src/utils/sessionStorage.ts) and the VS Code
6
+ * extension (packages/claude-vscode/src/common-host/sessionStorage.ts).
7
+ */
8
+
9
+ import type { UUID } from 'crypto'
10
+ import { open as fsOpen, readdir, realpath, stat } from 'fs/promises'
11
+ import { join } from 'path'
12
+ import { getClaudeConfigHomeDir } from './envUtils.js'
13
+ import { getWorktreePathsPortable } from './getWorktreePathsPortable.js'
14
+ import { djb2Hash } from './hash.js'
15
+
16
+ /** Size of the head/tail buffer for lite metadata reads. */
17
+ export const LITE_READ_BUF_SIZE = 65536
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // UUID validation
21
+ // ---------------------------------------------------------------------------
22
+
23
+ const uuidRegex =
24
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
25
+
26
+ export function validateUuid(maybeUuid: unknown): UUID | null {
27
+ if (typeof maybeUuid !== 'string') return null
28
+ return uuidRegex.test(maybeUuid) ? (maybeUuid as UUID) : null
29
+ }
30
+
31
+ // ---------------------------------------------------------------------------
32
+ // JSON string field extraction — no full parse, works on truncated lines
33
+ // ---------------------------------------------------------------------------
34
+
35
+ /**
36
+ * Unescape a JSON string value extracted as raw text.
37
+ * Only allocates a new string when escape sequences are present.
38
+ */
39
+ export function unescapeJsonString(raw: string): string {
40
+ if (!raw.includes('\\')) return raw
41
+ try {
42
+ return JSON.parse(`"${raw}"`)
43
+ } catch {
44
+ return raw
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Extracts a simple JSON string field value from raw text without full parsing.
50
+ * Looks for `"key":"value"` or `"key": "value"` patterns.
51
+ * Returns the first match, or undefined if not found.
52
+ */
53
+ export function extractJsonStringField(
54
+ text: string,
55
+ key: string,
56
+ ): string | undefined {
57
+ const patterns = [`"${key}":"`, `"${key}": "`]
58
+ for (const pattern of patterns) {
59
+ const idx = text.indexOf(pattern)
60
+ if (idx < 0) continue
61
+
62
+ const valueStart = idx + pattern.length
63
+ let i = valueStart
64
+ while (i < text.length) {
65
+ if (text[i] === '\\') {
66
+ i += 2
67
+ continue
68
+ }
69
+ if (text[i] === '"') {
70
+ return unescapeJsonString(text.slice(valueStart, i))
71
+ }
72
+ i++
73
+ }
74
+ }
75
+ return undefined
76
+ }
77
+
78
+ /**
79
+ * Like extractJsonStringField but finds the LAST occurrence.
80
+ * Useful for fields that are appended (customTitle, tag, etc.).
81
+ */
82
+ export function extractLastJsonStringField(
83
+ text: string,
84
+ key: string,
85
+ ): string | undefined {
86
+ const patterns = [`"${key}":"`, `"${key}": "`]
87
+ let lastValue: string | undefined
88
+ for (const pattern of patterns) {
89
+ let searchFrom = 0
90
+ while (true) {
91
+ const idx = text.indexOf(pattern, searchFrom)
92
+ if (idx < 0) break
93
+
94
+ const valueStart = idx + pattern.length
95
+ let i = valueStart
96
+ while (i < text.length) {
97
+ if (text[i] === '\\') {
98
+ i += 2
99
+ continue
100
+ }
101
+ if (text[i] === '"') {
102
+ lastValue = unescapeJsonString(text.slice(valueStart, i))
103
+ break
104
+ }
105
+ i++
106
+ }
107
+ searchFrom = i + 1
108
+ }
109
+ }
110
+ return lastValue
111
+ }
112
+
113
+ // ---------------------------------------------------------------------------
114
+ // First prompt extraction from head chunk
115
+ // ---------------------------------------------------------------------------
116
+
117
+ /**
118
+ * Pattern matching auto-generated or system messages that should be skipped
119
+ * when looking for the first meaningful user prompt. Matches anything that
120
+ * starts with a lowercase XML-like tag (IDE context, hook output, task
121
+ * notifications, channel messages, etc.) or a synthetic interrupt marker.
122
+ */
123
+ const SKIP_FIRST_PROMPT_PATTERN =
124
+ /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/
125
+
126
+ const COMMAND_NAME_RE = /<command-name>(.*?)<\/command-name>/
127
+
128
+ /**
129
+ * Extracts the first meaningful user prompt from a JSONL head chunk.
130
+ *
131
+ * Skips tool_result messages, isMeta, isCompactSummary, command-name messages,
132
+ * and auto-generated patterns (session hooks, tick, IDE metadata, etc.).
133
+ * Truncates to 200 chars.
134
+ */
135
+ export function extractFirstPromptFromHead(head: string): string {
136
+ let start = 0
137
+ let commandFallback = ''
138
+ while (start < head.length) {
139
+ const newlineIdx = head.indexOf('\n', start)
140
+ const line =
141
+ newlineIdx >= 0 ? head.slice(start, newlineIdx) : head.slice(start)
142
+ start = newlineIdx >= 0 ? newlineIdx + 1 : head.length
143
+
144
+ if (!line.includes('"type":"user"') && !line.includes('"type": "user"'))
145
+ continue
146
+ if (line.includes('"tool_result"')) continue
147
+ if (line.includes('"isMeta":true') || line.includes('"isMeta": true'))
148
+ continue
149
+ if (
150
+ line.includes('"isCompactSummary":true') ||
151
+ line.includes('"isCompactSummary": true')
152
+ )
153
+ continue
154
+
155
+ try {
156
+ const entry = JSON.parse(line) as Record<string, unknown>
157
+ if (entry.type !== 'user') continue
158
+
159
+ const message = entry.message as Record<string, unknown> | undefined
160
+ if (!message) continue
161
+
162
+ const content = message.content
163
+ const texts: string[] = []
164
+ if (typeof content === 'string') {
165
+ texts.push(content)
166
+ } else if (Array.isArray(content)) {
167
+ for (const block of content as Record<string, unknown>[]) {
168
+ if (block.type === 'text' && typeof block.text === 'string') {
169
+ texts.push(block.text as string)
170
+ }
171
+ }
172
+ }
173
+
174
+ for (const raw of texts) {
175
+ let result = raw.replace(/\n/g, ' ').trim()
176
+ if (!result) continue
177
+
178
+ // Skip slash-command messages but remember first as fallback
179
+ const cmdMatch = COMMAND_NAME_RE.exec(result)
180
+ if (cmdMatch) {
181
+ if (!commandFallback) commandFallback = cmdMatch[1]!
182
+ continue
183
+ }
184
+
185
+ // Format bash input with ! prefix before the generic XML skip
186
+ const bashMatch = /<bash-input>([\s\S]*?)<\/bash-input>/.exec(result)
187
+ if (bashMatch) return `! ${bashMatch[1]!.trim()}`
188
+
189
+ if (SKIP_FIRST_PROMPT_PATTERN.test(result)) continue
190
+
191
+ if (result.length > 200) {
192
+ result = result.slice(0, 200).trim() + '\u2026'
193
+ }
194
+ return result
195
+ }
196
+ } catch {
197
+ continue
198
+ }
199
+ }
200
+ if (commandFallback) return commandFallback
201
+ return ''
202
+ }
203
+
204
+ // ---------------------------------------------------------------------------
205
+ // File I/O — read head and tail of a file
206
+ // ---------------------------------------------------------------------------
207
+
208
+ /**
209
+ * Reads the first and last LITE_READ_BUF_SIZE bytes of a file.
210
+ *
211
+ * For small files where head covers tail, `tail === head`.
212
+ * Accepts a shared Buffer to avoid per-file allocation overhead.
213
+ * Returns `{ head: '', tail: '' }` on any error.
214
+ */
215
+ export async function readHeadAndTail(
216
+ filePath: string,
217
+ fileSize: number,
218
+ buf: Buffer,
219
+ ): Promise<{ head: string; tail: string }> {
220
+ try {
221
+ const fh = await fsOpen(filePath, 'r')
222
+ try {
223
+ const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)
224
+ if (headResult.bytesRead === 0) return { head: '', tail: '' }
225
+
226
+ const head = buf.toString('utf8', 0, headResult.bytesRead)
227
+
228
+ const tailOffset = Math.max(0, fileSize - LITE_READ_BUF_SIZE)
229
+ let tail = head
230
+ if (tailOffset > 0) {
231
+ const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)
232
+ tail = buf.toString('utf8', 0, tailResult.bytesRead)
233
+ }
234
+
235
+ return { head, tail }
236
+ } finally {
237
+ await fh.close()
238
+ }
239
+ } catch {
240
+ return { head: '', tail: '' }
241
+ }
242
+ }
243
+
244
+ export type LiteSessionFile = {
245
+ mtime: number
246
+ size: number
247
+ head: string
248
+ tail: string
249
+ }
250
+
251
+ /**
252
+ * Opens a single session file, stats it, and reads head + tail in one fd.
253
+ * Allocates its own buffer — safe for concurrent use with Promise.all.
254
+ * Returns null on any error.
255
+ */
256
+ export async function readSessionLite(
257
+ filePath: string,
258
+ ): Promise<LiteSessionFile | null> {
259
+ try {
260
+ const fh = await fsOpen(filePath, 'r')
261
+ try {
262
+ const stat = await fh.stat()
263
+ const buf = Buffer.allocUnsafe(LITE_READ_BUF_SIZE)
264
+ const headResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, 0)
265
+ if (headResult.bytesRead === 0) return null
266
+
267
+ const head = buf.toString('utf8', 0, headResult.bytesRead)
268
+ const tailOffset = Math.max(0, stat.size - LITE_READ_BUF_SIZE)
269
+ let tail = head
270
+ if (tailOffset > 0) {
271
+ const tailResult = await fh.read(buf, 0, LITE_READ_BUF_SIZE, tailOffset)
272
+ tail = buf.toString('utf8', 0, tailResult.bytesRead)
273
+ }
274
+
275
+ return { mtime: stat.mtime.getTime(), size: stat.size, head, tail }
276
+ } finally {
277
+ await fh.close()
278
+ }
279
+ } catch {
280
+ return null
281
+ }
282
+ }
283
+
284
+ // ---------------------------------------------------------------------------
285
+ // Path sanitization
286
+ // ---------------------------------------------------------------------------
287
+
288
+ /**
289
+ * Maximum length for a single filesystem path component (directory or file name).
290
+ * Most filesystems (ext4, APFS, NTFS) limit individual components to 255 bytes.
291
+ * We use 200 to leave room for the hash suffix and separator.
292
+ */
293
+ export const MAX_SANITIZED_LENGTH = 200
294
+
295
+ function simpleHash(str: string): string {
296
+ return Math.abs(djb2Hash(str)).toString(36)
297
+ }
298
+
299
+ /**
300
+ * Makes a string safe for use as a directory or file name.
301
+ * Replaces all non-alphanumeric characters with hyphens.
302
+ * This ensures compatibility across all platforms, including Windows
303
+ * where characters like colons are reserved.
304
+ *
305
+ * For deeply nested paths that would exceed filesystem limits (255 bytes),
306
+ * truncates and appends a hash suffix for uniqueness.
307
+ *
308
+ * @param name - The string to make safe (e.g., '/Users/foo/my-project' or 'plugin:name:server')
309
+ * @returns A safe name (e.g., '-Users-foo-my-project' or 'plugin-name-server')
310
+ */
311
+ export function sanitizePath(name: string): string {
312
+ const sanitized = name.replace(/[^a-zA-Z0-9]/g, '-')
313
+ if (sanitized.length <= MAX_SANITIZED_LENGTH) {
314
+ return sanitized
315
+ }
316
+ const hash =
317
+ typeof Bun !== 'undefined' ? Bun.hash(name).toString(36) : simpleHash(name)
318
+ return `${sanitized.slice(0, MAX_SANITIZED_LENGTH)}-${hash}`
319
+ }
320
+
321
+ // ---------------------------------------------------------------------------
322
+ // Project directory discovery (shared by listSessions & getSessionMessages)
323
+ // ---------------------------------------------------------------------------
324
+
325
+ export function getProjectsDir(): string {
326
+ return join(getClaudeConfigHomeDir(), 'projects')
327
+ }
328
+
329
+ export function getProjectDir(projectDir: string): string {
330
+ return join(getProjectsDir(), sanitizePath(projectDir))
331
+ }
332
+
333
+ /**
334
+ * Resolves a directory path to its canonical form using realpath + NFC
335
+ * normalization. Falls back to NFC-only if realpath fails (e.g., the
336
+ * directory doesn't exist yet). Ensures symlinked paths (e.g.,
337
+ * /tmp → /private/tmp on macOS) resolve to the same project directory.
338
+ */
339
+ export async function canonicalizePath(dir: string): Promise<string> {
340
+ try {
341
+ return (await realpath(dir)).normalize('NFC')
342
+ } catch {
343
+ return dir.normalize('NFC')
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Finds the project directory for a given path, tolerating hash mismatches
349
+ * for long paths (>200 chars). The CLI uses Bun.hash while the SDK under
350
+ * Node.js uses simpleHash — for paths that exceed MAX_SANITIZED_LENGTH,
351
+ * these produce different directory suffixes. This function falls back to
352
+ * prefix-based scanning when the exact match doesn't exist.
353
+ */
354
+ export async function findProjectDir(
355
+ projectPath: string,
356
+ ): Promise<string | undefined> {
357
+ const exact = getProjectDir(projectPath)
358
+ try {
359
+ await readdir(exact)
360
+ return exact
361
+ } catch {
362
+ // Exact match failed — for short paths this means no sessions exist.
363
+ // For long paths, try prefix matching to handle hash mismatches.
364
+ const sanitized = sanitizePath(projectPath)
365
+ if (sanitized.length <= MAX_SANITIZED_LENGTH) {
366
+ return undefined
367
+ }
368
+ const prefix = sanitized.slice(0, MAX_SANITIZED_LENGTH)
369
+ const projectsDir = getProjectsDir()
370
+ try {
371
+ const dirents = await readdir(projectsDir, { withFileTypes: true })
372
+ const match = dirents.find(
373
+ d => d.isDirectory() && d.name.startsWith(prefix + '-'),
374
+ )
375
+ return match ? join(projectsDir, match.name) : undefined
376
+ } catch {
377
+ return undefined
378
+ }
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Resolve a sessionId to its on-disk JSONL file path.
384
+ *
385
+ * When `dir` is provided: canonicalize it, look in that project's directory
386
+ * (with findProjectDir fallback for Bun/Node hash mismatches), then fall back
387
+ * to sibling git worktrees. `projectPath` in the result is the canonical
388
+ * user-facing directory the file was found under.
389
+ *
390
+ * When `dir` is omitted: scan all project directories under ~/.claude/projects/.
391
+ * `projectPath` is undefined in this case (no meaningful project path to report).
392
+ *
393
+ * Existence is checked by stat (operate-then-catch-ENOENT, no existsSync).
394
+ * Zero-byte files are treated as not-found so callers continue searching past
395
+ * a truncated copy to find a valid one in a sibling directory.
396
+ *
397
+ * `fileSize` is returned so callers (loadSessionBuffer) don't need to re-stat.
398
+ *
399
+ * Shared by getSessionInfoImpl and getSessionMessagesImpl — the caller
400
+ * invokes its own reader (readSessionLite / loadSessionBuffer) on the
401
+ * resolved path.
402
+ */
403
+ export async function resolveSessionFilePath(
404
+ sessionId: string,
405
+ dir?: string,
406
+ ): Promise<
407
+ | { filePath: string; projectPath: string | undefined; fileSize: number }
408
+ | undefined
409
+ > {
410
+ const fileName = `${sessionId}.jsonl`
411
+
412
+ if (dir) {
413
+ const canonical = await canonicalizePath(dir)
414
+ const projectDir = await findProjectDir(canonical)
415
+ if (projectDir) {
416
+ const filePath = join(projectDir, fileName)
417
+ try {
418
+ const s = await stat(filePath)
419
+ if (s.size > 0)
420
+ return { filePath, projectPath: canonical, fileSize: s.size }
421
+ } catch {
422
+ // ENOENT/EACCES — keep searching
423
+ }
424
+ }
425
+ // Worktree fallback — sessions may live under a different worktree root
426
+ let worktreePaths: string[]
427
+ try {
428
+ worktreePaths = await getWorktreePathsPortable(canonical)
429
+ } catch {
430
+ worktreePaths = []
431
+ }
432
+ for (const wt of worktreePaths) {
433
+ if (wt === canonical) continue
434
+ const wtProjectDir = await findProjectDir(wt)
435
+ if (!wtProjectDir) continue
436
+ const filePath = join(wtProjectDir, fileName)
437
+ try {
438
+ const s = await stat(filePath)
439
+ if (s.size > 0) return { filePath, projectPath: wt, fileSize: s.size }
440
+ } catch {
441
+ // ENOENT/EACCES — keep searching
442
+ }
443
+ }
444
+ return undefined
445
+ }
446
+
447
+ // No dir — scan all project directories
448
+ const projectsDir = getProjectsDir()
449
+ let dirents: string[]
450
+ try {
451
+ dirents = await readdir(projectsDir)
452
+ } catch {
453
+ return undefined
454
+ }
455
+ for (const name of dirents) {
456
+ const filePath = join(projectsDir, name, fileName)
457
+ try {
458
+ const s = await stat(filePath)
459
+ if (s.size > 0)
460
+ return { filePath, projectPath: undefined, fileSize: s.size }
461
+ } catch {
462
+ // ENOENT/ENOTDIR — not in this project, keep scanning
463
+ }
464
+ }
465
+ return undefined
466
+ }
467
+
468
+ // ---------------------------------------------------------------------------
469
+ // Compact-boundary chunked read (shared by loadTranscriptFile & SDK getSessionMessages)
470
+ // ---------------------------------------------------------------------------
471
+
472
+ /** Chunk size for the forward transcript reader. 1 MB balances I/O calls vs buffer growth. */
473
+ const TRANSCRIPT_READ_CHUNK_SIZE = 1024 * 1024
474
+
475
+ /**
476
+ * File size below which precompact filtering is skipped.
477
+ * Large sessions (>5 MB) almost always have compact boundaries — they got big
478
+ * because of many turns triggering auto-compact.
479
+ */
480
+ export const SKIP_PRECOMPACT_THRESHOLD = 5 * 1024 * 1024
481
+
482
+ /** Marker bytes searched for when locating the boundary. Lazy: allocated on
483
+ * first use, not at module load. Most sessions never resume. */
484
+ let _compactBoundaryMarker: Buffer | undefined
485
+ function compactBoundaryMarker(): Buffer {
486
+ return (_compactBoundaryMarker ??= Buffer.from('"compact_boundary"'))
487
+ }
488
+
489
+ /**
490
+ * Confirm a byte-matched line is a real compact_boundary (marker can appear
491
+ * inside user content) and check for preservedSegment.
492
+ */
493
+ function parseBoundaryLine(
494
+ line: string,
495
+ ): { hasPreservedSegment: boolean } | null {
496
+ try {
497
+ const parsed = JSON.parse(line) as {
498
+ type?: string
499
+ subtype?: string
500
+ compactMetadata?: { preservedSegment?: unknown }
501
+ }
502
+ if (parsed.type !== 'system' || parsed.subtype !== 'compact_boundary') {
503
+ return null
504
+ }
505
+ return {
506
+ hasPreservedSegment: Boolean(parsed.compactMetadata?.preservedSegment),
507
+ }
508
+ } catch {
509
+ return null
510
+ }
511
+ }
512
+
513
+ /**
514
+ * Single forward chunked read for the --resume load path. Attr-snap lines
515
+ * are skipped at the fd level; compact boundaries truncate in-stream. Peak
516
+ * is the output size, not the file size.
517
+ *
518
+ * The surviving (last) attr-snap is appended at EOF instead of in-place;
519
+ * restoreAttributionStateFromSnapshots only reads [length-1] so position
520
+ * doesn't matter.
521
+ */
522
+
523
+ type Sink = { buf: Buffer; len: number; cap: number }
524
+
525
+ function sinkWrite(s: Sink, src: Buffer, start: number, end: number): void {
526
+ const n = end - start
527
+ if (n <= 0) return
528
+ if (s.len + n > s.buf.length) {
529
+ const grown = Buffer.allocUnsafe(
530
+ Math.min(Math.max(s.buf.length * 2, s.len + n), s.cap),
531
+ )
532
+ s.buf.copy(grown, 0, 0, s.len)
533
+ s.buf = grown
534
+ }
535
+ src.copy(s.buf, s.len, start, end)
536
+ s.len += n
537
+ }
538
+
539
+ function hasPrefix(
540
+ src: Buffer,
541
+ prefix: Buffer,
542
+ at: number,
543
+ end: number,
544
+ ): boolean {
545
+ return (
546
+ end - at >= prefix.length &&
547
+ src.compare(prefix, 0, prefix.length, at, at + prefix.length) === 0
548
+ )
549
+ }
550
+
551
+ const ATTR_SNAP_PREFIX = Buffer.from('{"type":"attribution-snapshot"')
552
+ const SYSTEM_PREFIX = Buffer.from('{"type":"system"')
553
+ const LF = 0x0a
554
+ const LF_BYTE = Buffer.from([LF])
555
+ const BOUNDARY_SEARCH_BOUND = 256 // marker sits ~28 bytes in; 256 is slack
556
+
557
+ type LoadState = {
558
+ out: Sink
559
+ boundaryStartOffset: number
560
+ hasPreservedSegment: boolean
561
+ lastSnapSrc: Buffer | null // most-recent attr-snap, appended at EOF
562
+ lastSnapLen: number
563
+ lastSnapBuf: Buffer | undefined
564
+ bufFileOff: number // file offset of buf[0]
565
+ carryLen: number
566
+ carryBuf: Buffer | undefined
567
+ straddleSnapCarryLen: number // per-chunk; reset by processStraddle
568
+ straddleSnapTailEnd: number
569
+ }
570
+
571
+ // Line spanning the chunk seam. 0 = fall through to concat.
572
+ function processStraddle(
573
+ s: LoadState,
574
+ chunk: Buffer,
575
+ bytesRead: number,
576
+ ): number {
577
+ s.straddleSnapCarryLen = 0
578
+ s.straddleSnapTailEnd = 0
579
+ if (s.carryLen === 0) return 0
580
+ const cb = s.carryBuf!
581
+ const firstNl = chunk.indexOf(LF)
582
+ if (firstNl === -1 || firstNl >= bytesRead) return 0
583
+ const tailEnd = firstNl + 1
584
+ if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {
585
+ s.straddleSnapCarryLen = s.carryLen
586
+ s.straddleSnapTailEnd = tailEnd
587
+ s.lastSnapSrc = null
588
+ } else if (s.carryLen < ATTR_SNAP_PREFIX.length) {
589
+ return 0 // too short to rule out attr-snap
590
+ } else {
591
+ if (hasPrefix(cb, SYSTEM_PREFIX, 0, s.carryLen)) {
592
+ const hit = parseBoundaryLine(
593
+ cb.toString('utf-8', 0, s.carryLen) +
594
+ chunk.toString('utf-8', 0, firstNl),
595
+ )
596
+ if (hit?.hasPreservedSegment) {
597
+ s.hasPreservedSegment = true
598
+ } else if (hit) {
599
+ s.out.len = 0
600
+ s.boundaryStartOffset = s.bufFileOff
601
+ s.hasPreservedSegment = false
602
+ s.lastSnapSrc = null
603
+ }
604
+ }
605
+ sinkWrite(s.out, cb, 0, s.carryLen)
606
+ sinkWrite(s.out, chunk, 0, tailEnd)
607
+ }
608
+ s.bufFileOff += s.carryLen + tailEnd
609
+ s.carryLen = 0
610
+ return tailEnd
611
+ }
612
+
613
+ // Strip attr-snaps, truncate on boundaries. Kept lines write as runs.
614
+ function scanChunkLines(
615
+ s: LoadState,
616
+ buf: Buffer,
617
+ boundaryMarker: Buffer,
618
+ ): { lastSnapStart: number; lastSnapEnd: number; trailStart: number } {
619
+ let boundaryAt = buf.indexOf(boundaryMarker)
620
+ let runStart = 0
621
+ let lineStart = 0
622
+ let lastSnapStart = -1
623
+ let lastSnapEnd = -1
624
+ let nl = buf.indexOf(LF)
625
+ while (nl !== -1) {
626
+ const lineEnd = nl + 1
627
+ if (boundaryAt !== -1 && boundaryAt < lineStart) {
628
+ boundaryAt = buf.indexOf(boundaryMarker, lineStart)
629
+ }
630
+ if (hasPrefix(buf, ATTR_SNAP_PREFIX, lineStart, lineEnd)) {
631
+ sinkWrite(s.out, buf, runStart, lineStart)
632
+ lastSnapStart = lineStart
633
+ lastSnapEnd = lineEnd
634
+ runStart = lineEnd
635
+ } else if (
636
+ boundaryAt >= lineStart &&
637
+ boundaryAt < Math.min(lineStart + BOUNDARY_SEARCH_BOUND, lineEnd)
638
+ ) {
639
+ const hit = parseBoundaryLine(buf.toString('utf-8', lineStart, nl))
640
+ if (hit?.hasPreservedSegment) {
641
+ s.hasPreservedSegment = true // don't truncate; preserved msgs already in output
642
+ } else if (hit) {
643
+ s.out.len = 0
644
+ s.boundaryStartOffset = s.bufFileOff + lineStart
645
+ s.hasPreservedSegment = false
646
+ s.lastSnapSrc = null
647
+ lastSnapStart = -1
648
+ s.straddleSnapCarryLen = 0
649
+ runStart = lineStart
650
+ }
651
+ boundaryAt = buf.indexOf(
652
+ boundaryMarker,
653
+ boundaryAt + boundaryMarker.length,
654
+ )
655
+ }
656
+ lineStart = lineEnd
657
+ nl = buf.indexOf(LF, lineStart)
658
+ }
659
+ sinkWrite(s.out, buf, runStart, lineStart)
660
+ return { lastSnapStart, lastSnapEnd, trailStart: lineStart }
661
+ }
662
+
663
+ // In-buf snap wins over straddle (later in file). carryBuf still valid here.
664
+ function captureSnap(
665
+ s: LoadState,
666
+ buf: Buffer,
667
+ chunk: Buffer,
668
+ lastSnapStart: number,
669
+ lastSnapEnd: number,
670
+ ): void {
671
+ if (lastSnapStart !== -1) {
672
+ s.lastSnapLen = lastSnapEnd - lastSnapStart
673
+ if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {
674
+ s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)
675
+ }
676
+ buf.copy(s.lastSnapBuf, 0, lastSnapStart, lastSnapEnd)
677
+ s.lastSnapSrc = s.lastSnapBuf
678
+ } else if (s.straddleSnapCarryLen > 0) {
679
+ s.lastSnapLen = s.straddleSnapCarryLen + s.straddleSnapTailEnd
680
+ if (s.lastSnapBuf === undefined || s.lastSnapLen > s.lastSnapBuf.length) {
681
+ s.lastSnapBuf = Buffer.allocUnsafe(s.lastSnapLen)
682
+ }
683
+ s.carryBuf!.copy(s.lastSnapBuf, 0, 0, s.straddleSnapCarryLen)
684
+ chunk.copy(s.lastSnapBuf, s.straddleSnapCarryLen, 0, s.straddleSnapTailEnd)
685
+ s.lastSnapSrc = s.lastSnapBuf
686
+ }
687
+ }
688
+
689
+ function captureCarry(s: LoadState, buf: Buffer, trailStart: number): void {
690
+ s.carryLen = buf.length - trailStart
691
+ if (s.carryLen > 0) {
692
+ if (s.carryBuf === undefined || s.carryLen > s.carryBuf.length) {
693
+ s.carryBuf = Buffer.allocUnsafe(s.carryLen)
694
+ }
695
+ buf.copy(s.carryBuf, 0, trailStart, buf.length)
696
+ }
697
+ }
698
+
699
+ function finalizeOutput(s: LoadState): void {
700
+ if (s.carryLen > 0) {
701
+ const cb = s.carryBuf!
702
+ if (hasPrefix(cb, ATTR_SNAP_PREFIX, 0, s.carryLen)) {
703
+ s.lastSnapSrc = cb
704
+ s.lastSnapLen = s.carryLen
705
+ } else {
706
+ sinkWrite(s.out, cb, 0, s.carryLen)
707
+ }
708
+ }
709
+ if (s.lastSnapSrc) {
710
+ if (s.out.len > 0 && s.out.buf[s.out.len - 1] !== LF) {
711
+ sinkWrite(s.out, LF_BYTE, 0, 1)
712
+ }
713
+ sinkWrite(s.out, s.lastSnapSrc, 0, s.lastSnapLen)
714
+ }
715
+ }
716
+
717
+ export async function readTranscriptForLoad(
718
+ filePath: string,
719
+ fileSize: number,
720
+ ): Promise<{
721
+ boundaryStartOffset: number
722
+ postBoundaryBuf: Buffer
723
+ hasPreservedSegment: boolean
724
+ }> {
725
+ const boundaryMarker = compactBoundaryMarker()
726
+ const CHUNK_SIZE = TRANSCRIPT_READ_CHUNK_SIZE
727
+
728
+ const s: LoadState = {
729
+ out: {
730
+ // Gated callers enter with fileSize > 5MB, so min(fileSize, 8MB) lands
731
+ // in [5, 8]MB; large boundaryless sessions (24-31MB output) take 2
732
+ // grows. Ungated callers (attribution.ts) pass small files too — the
733
+ // min just right-sizes the initial buf, no grows.
734
+ buf: Buffer.allocUnsafe(Math.min(fileSize, 8 * 1024 * 1024)),
735
+ len: 0,
736
+ // +1: finalizeOutput may insert one LF between a non-LF-terminated
737
+ // carry and the reordered last attr-snap (crash-truncated file).
738
+ cap: fileSize + 1,
739
+ },
740
+ boundaryStartOffset: 0,
741
+ hasPreservedSegment: false,
742
+ lastSnapSrc: null,
743
+ lastSnapLen: 0,
744
+ lastSnapBuf: undefined,
745
+ bufFileOff: 0,
746
+ carryLen: 0,
747
+ carryBuf: undefined,
748
+ straddleSnapCarryLen: 0,
749
+ straddleSnapTailEnd: 0,
750
+ }
751
+
752
+ const chunk = Buffer.allocUnsafe(CHUNK_SIZE)
753
+ const fd = await fsOpen(filePath, 'r')
754
+ try {
755
+ let filePos = 0
756
+ while (filePos < fileSize) {
757
+ const { bytesRead } = await fd.read(
758
+ chunk,
759
+ 0,
760
+ Math.min(CHUNK_SIZE, fileSize - filePos),
761
+ filePos,
762
+ )
763
+ if (bytesRead === 0) break
764
+ filePos += bytesRead
765
+
766
+ const chunkOff = processStraddle(s, chunk, bytesRead)
767
+
768
+ let buf: Buffer
769
+ if (s.carryLen > 0) {
770
+ const bufLen = s.carryLen + (bytesRead - chunkOff)
771
+ buf = Buffer.allocUnsafe(bufLen)
772
+ s.carryBuf!.copy(buf, 0, 0, s.carryLen)
773
+ chunk.copy(buf, s.carryLen, chunkOff, bytesRead)
774
+ } else {
775
+ buf = chunk.subarray(chunkOff, bytesRead)
776
+ }
777
+
778
+ const r = scanChunkLines(s, buf, boundaryMarker)
779
+ captureSnap(s, buf, chunk, r.lastSnapStart, r.lastSnapEnd)
780
+ captureCarry(s, buf, r.trailStart)
781
+ s.bufFileOff += r.trailStart
782
+ }
783
+ finalizeOutput(s)
784
+ } finally {
785
+ await fd.close()
786
+ }
787
+
788
+ return {
789
+ boundaryStartOffset: s.boundaryStartOffset,
790
+ postBoundaryBuf: s.out.buf.subarray(0, s.out.len),
791
+ hasPreservedSegment: s.hasPreservedSegment,
792
+ }
793
+ }