@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,928 @@
1
+ /**
2
+ * Synchronized Permission Prompts for Agent Swarms
3
+ *
4
+ * This module provides infrastructure for coordinating permission prompts across
5
+ * multiple agents in a swarm. When a worker agent needs permission for a tool use,
6
+ * it can forward the request to the team leader, who can then approve or deny it.
7
+ *
8
+ * The system uses the teammate mailbox for message passing:
9
+ * - Workers send permission requests to the leader's mailbox
10
+ * - Leaders send permission responses to the worker's mailbox
11
+ *
12
+ * Flow:
13
+ * 1. Worker agent encounters a permission prompt
14
+ * 2. Worker sends a permission_request message to the leader's mailbox
15
+ * 3. Leader polls for mailbox messages and detects permission requests
16
+ * 4. User approves/denies via the leader's UI
17
+ * 5. Leader sends a permission_response message to the worker's mailbox
18
+ * 6. Worker polls mailbox for responses and continues execution
19
+ */
20
+
21
+ import { mkdir, readdir, readFile, unlink, writeFile } from 'fs/promises'
22
+ import { join } from 'path'
23
+ import { z } from 'zod/v4'
24
+ import { logForDebugging } from '../debug.js'
25
+ import { getErrnoCode } from '../errors.js'
26
+ import { lazySchema } from '../lazySchema.js'
27
+ import * as lockfile from '../lockfile.js'
28
+ import { logError } from '../log.js'
29
+ import type { PermissionUpdate } from '../permissions/PermissionUpdateSchema.js'
30
+ import { jsonParse, jsonStringify } from '../slowOperations.js'
31
+ import {
32
+ getAgentId,
33
+ getAgentName,
34
+ getTeammateColor,
35
+ getTeamName,
36
+ } from '../teammate.js'
37
+ import {
38
+ createPermissionRequestMessage,
39
+ createPermissionResponseMessage,
40
+ createSandboxPermissionRequestMessage,
41
+ createSandboxPermissionResponseMessage,
42
+ writeToMailbox,
43
+ } from '../teammateMailbox.js'
44
+ import { getTeamDir, readTeamFileAsync } from './teamHelpers.js'
45
+
46
+ /**
47
+ * Full request schema for a permission request from a worker to the leader
48
+ */
49
+ export const SwarmPermissionRequestSchema = lazySchema(() =>
50
+ z.object({
51
+ /** Unique identifier for this request */
52
+ id: z.string(),
53
+ /** Worker's CLAUDE_CODE_AGENT_ID */
54
+ workerId: z.string(),
55
+ /** Worker's CLAUDE_CODE_AGENT_NAME */
56
+ workerName: z.string(),
57
+ /** Worker's CLAUDE_CODE_AGENT_COLOR */
58
+ workerColor: z.string().optional(),
59
+ /** Team name for routing */
60
+ teamName: z.string(),
61
+ /** Tool name requiring permission (e.g., "Bash", "Edit") */
62
+ toolName: z.string(),
63
+ /** Original toolUseID from worker's context */
64
+ toolUseId: z.string(),
65
+ /** Human-readable description of the tool use */
66
+ description: z.string(),
67
+ /** Serialized tool input */
68
+ input: z.record(z.string(), z.unknown()),
69
+ /** Suggested permission rules from the permission result */
70
+ permissionSuggestions: z.array(z.unknown()),
71
+ /** Status of the request */
72
+ status: z.enum(['pending', 'approved', 'rejected']),
73
+ /** Who resolved the request */
74
+ resolvedBy: z.enum(['worker', 'leader']).optional(),
75
+ /** Timestamp when resolved */
76
+ resolvedAt: z.number().optional(),
77
+ /** Rejection feedback message */
78
+ feedback: z.string().optional(),
79
+ /** Modified input if changed by resolver */
80
+ updatedInput: z.record(z.string(), z.unknown()).optional(),
81
+ /** "Always allow" rules applied during resolution */
82
+ permissionUpdates: z.array(z.unknown()).optional(),
83
+ /** Timestamp when request was created */
84
+ createdAt: z.number(),
85
+ }),
86
+ )
87
+
88
+ export type SwarmPermissionRequest = z.infer<
89
+ ReturnType<typeof SwarmPermissionRequestSchema>
90
+ >
91
+
92
+ /**
93
+ * Resolution data returned when leader/worker resolves a request
94
+ */
95
+ export type PermissionResolution = {
96
+ /** Decision: approved or rejected */
97
+ decision: 'approved' | 'rejected'
98
+ /** Who resolved it */
99
+ resolvedBy: 'worker' | 'leader'
100
+ /** Optional feedback message if rejected */
101
+ feedback?: string
102
+ /** Optional updated input if the resolver modified it */
103
+ updatedInput?: Record<string, unknown>
104
+ /** Permission updates to apply (e.g., "always allow" rules) */
105
+ permissionUpdates?: PermissionUpdate[]
106
+ }
107
+
108
+ /**
109
+ * Get the base directory for a team's permission requests
110
+ * Path: ~/.claude/teams/{teamName}/permissions/
111
+ */
112
+ export function getPermissionDir(teamName: string): string {
113
+ return join(getTeamDir(teamName), 'permissions')
114
+ }
115
+
116
+ /**
117
+ * Get the pending directory for a team
118
+ */
119
+ function getPendingDir(teamName: string): string {
120
+ return join(getPermissionDir(teamName), 'pending')
121
+ }
122
+
123
+ /**
124
+ * Get the resolved directory for a team
125
+ */
126
+ function getResolvedDir(teamName: string): string {
127
+ return join(getPermissionDir(teamName), 'resolved')
128
+ }
129
+
130
+ /**
131
+ * Ensure the permissions directory structure exists (async)
132
+ */
133
+ async function ensurePermissionDirsAsync(teamName: string): Promise<void> {
134
+ const permDir = getPermissionDir(teamName)
135
+ const pendingDir = getPendingDir(teamName)
136
+ const resolvedDir = getResolvedDir(teamName)
137
+
138
+ for (const dir of [permDir, pendingDir, resolvedDir]) {
139
+ await mkdir(dir, { recursive: true })
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Get the path to a pending request file
145
+ */
146
+ function getPendingRequestPath(teamName: string, requestId: string): string {
147
+ return join(getPendingDir(teamName), `${requestId}.json`)
148
+ }
149
+
150
+ /**
151
+ * Get the path to a resolved request file
152
+ */
153
+ function getResolvedRequestPath(teamName: string, requestId: string): string {
154
+ return join(getResolvedDir(teamName), `${requestId}.json`)
155
+ }
156
+
157
+ /**
158
+ * Generate a unique request ID
159
+ */
160
+ export function generateRequestId(): string {
161
+ return `perm-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`
162
+ }
163
+
164
+ /**
165
+ * Create a new SwarmPermissionRequest object
166
+ */
167
+ export function createPermissionRequest(params: {
168
+ toolName: string
169
+ toolUseId: string
170
+ input: Record<string, unknown>
171
+ description: string
172
+ permissionSuggestions?: unknown[]
173
+ teamName?: string
174
+ workerId?: string
175
+ workerName?: string
176
+ workerColor?: string
177
+ }): SwarmPermissionRequest {
178
+ const teamName = params.teamName || getTeamName()
179
+ const workerId = params.workerId || getAgentId()
180
+ const workerName = params.workerName || getAgentName()
181
+ const workerColor = params.workerColor || getTeammateColor()
182
+
183
+ if (!teamName) {
184
+ throw new Error('Team name is required for permission requests')
185
+ }
186
+ if (!workerId) {
187
+ throw new Error('Worker ID is required for permission requests')
188
+ }
189
+ if (!workerName) {
190
+ throw new Error('Worker name is required for permission requests')
191
+ }
192
+
193
+ return {
194
+ id: generateRequestId(),
195
+ workerId,
196
+ workerName,
197
+ workerColor,
198
+ teamName,
199
+ toolName: params.toolName,
200
+ toolUseId: params.toolUseId,
201
+ description: params.description,
202
+ input: params.input,
203
+ permissionSuggestions: params.permissionSuggestions || [],
204
+ status: 'pending',
205
+ createdAt: Date.now(),
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Write a permission request to the pending directory with file locking
211
+ * Called by worker agents when they need permission approval from the leader
212
+ *
213
+ * @returns The written request
214
+ */
215
+ export async function writePermissionRequest(
216
+ request: SwarmPermissionRequest,
217
+ ): Promise<SwarmPermissionRequest> {
218
+ await ensurePermissionDirsAsync(request.teamName)
219
+
220
+ const pendingPath = getPendingRequestPath(request.teamName, request.id)
221
+ const lockDir = getPendingDir(request.teamName)
222
+
223
+ // Create a directory-level lock file for atomic writes
224
+ const lockFilePath = join(lockDir, '.lock')
225
+ await writeFile(lockFilePath, '', 'utf-8')
226
+
227
+ let release: (() => Promise<void>) | undefined
228
+ try {
229
+ release = await lockfile.lock(lockFilePath)
230
+
231
+ // Write the request file
232
+ await writeFile(pendingPath, jsonStringify(request, null, 2), 'utf-8')
233
+
234
+ logForDebugging(
235
+ `[PermissionSync] Wrote pending request ${request.id} from ${request.workerName} for ${request.toolName}`,
236
+ )
237
+
238
+ return request
239
+ } catch (error) {
240
+ logForDebugging(
241
+ `[PermissionSync] Failed to write permission request: ${error}`,
242
+ )
243
+ logError(error)
244
+ throw error
245
+ } finally {
246
+ if (release) {
247
+ await release()
248
+ }
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Read all pending permission requests for a team
254
+ * Called by the team leader to see what requests need attention
255
+ */
256
+ export async function readPendingPermissions(
257
+ teamName?: string,
258
+ ): Promise<SwarmPermissionRequest[]> {
259
+ const team = teamName || getTeamName()
260
+ if (!team) {
261
+ logForDebugging('[PermissionSync] No team name available')
262
+ return []
263
+ }
264
+
265
+ const pendingDir = getPendingDir(team)
266
+
267
+ let files: string[]
268
+ try {
269
+ files = await readdir(pendingDir)
270
+ } catch (e: unknown) {
271
+ const code = getErrnoCode(e)
272
+ if (code === 'ENOENT') {
273
+ return []
274
+ }
275
+ logForDebugging(`[PermissionSync] Failed to read pending requests: ${e}`)
276
+ logError(e)
277
+ return []
278
+ }
279
+
280
+ const jsonFiles = files.filter(f => f.endsWith('.json') && f !== '.lock')
281
+
282
+ const results = await Promise.all(
283
+ jsonFiles.map(async file => {
284
+ const filePath = join(pendingDir, file)
285
+ try {
286
+ const content = await readFile(filePath, 'utf-8')
287
+ const parsed = SwarmPermissionRequestSchema().safeParse(
288
+ jsonParse(content),
289
+ )
290
+ if (parsed.success) {
291
+ return parsed.data
292
+ }
293
+ logForDebugging(
294
+ `[PermissionSync] Invalid request file ${file}: ${parsed.error.message}`,
295
+ )
296
+ return null
297
+ } catch (err) {
298
+ logForDebugging(
299
+ `[PermissionSync] Failed to read request file ${file}: ${err}`,
300
+ )
301
+ return null
302
+ }
303
+ }),
304
+ )
305
+
306
+ const requests = results.filter(r => r !== null)
307
+
308
+ // Sort by creation time (oldest first)
309
+ requests.sort((a, b) => a.createdAt - b.createdAt)
310
+
311
+ return requests
312
+ }
313
+
314
+ /**
315
+ * Read a resolved permission request by ID
316
+ * Called by workers to check if their request has been resolved
317
+ *
318
+ * @returns The resolved request, or null if not yet resolved
319
+ */
320
+ export async function readResolvedPermission(
321
+ requestId: string,
322
+ teamName?: string,
323
+ ): Promise<SwarmPermissionRequest | null> {
324
+ const team = teamName || getTeamName()
325
+ if (!team) {
326
+ return null
327
+ }
328
+
329
+ const resolvedPath = getResolvedRequestPath(team, requestId)
330
+
331
+ try {
332
+ const content = await readFile(resolvedPath, 'utf-8')
333
+ const parsed = SwarmPermissionRequestSchema().safeParse(jsonParse(content))
334
+ if (parsed.success) {
335
+ return parsed.data
336
+ }
337
+ logForDebugging(
338
+ `[PermissionSync] Invalid resolved request ${requestId}: ${parsed.error.message}`,
339
+ )
340
+ return null
341
+ } catch (e: unknown) {
342
+ const code = getErrnoCode(e)
343
+ if (code === 'ENOENT') {
344
+ return null
345
+ }
346
+ logForDebugging(
347
+ `[PermissionSync] Failed to read resolved request ${requestId}: ${e}`,
348
+ )
349
+ logError(e)
350
+ return null
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Resolve a permission request
356
+ * Called by the team leader (or worker in self-resolution cases)
357
+ *
358
+ * Writes the resolution to resolved/, removes from pending/
359
+ */
360
+ export async function resolvePermission(
361
+ requestId: string,
362
+ resolution: PermissionResolution,
363
+ teamName?: string,
364
+ ): Promise<boolean> {
365
+ const team = teamName || getTeamName()
366
+ if (!team) {
367
+ logForDebugging('[PermissionSync] No team name available')
368
+ return false
369
+ }
370
+
371
+ await ensurePermissionDirsAsync(team)
372
+
373
+ const pendingPath = getPendingRequestPath(team, requestId)
374
+ const resolvedPath = getResolvedRequestPath(team, requestId)
375
+ const lockFilePath = join(getPendingDir(team), '.lock')
376
+
377
+ await writeFile(lockFilePath, '', 'utf-8')
378
+
379
+ let release: (() => Promise<void>) | undefined
380
+ try {
381
+ release = await lockfile.lock(lockFilePath)
382
+
383
+ // Read the pending request
384
+ let content: string
385
+ try {
386
+ content = await readFile(pendingPath, 'utf-8')
387
+ } catch (e: unknown) {
388
+ const code = getErrnoCode(e)
389
+ if (code === 'ENOENT') {
390
+ logForDebugging(
391
+ `[PermissionSync] Pending request not found: ${requestId}`,
392
+ )
393
+ return false
394
+ }
395
+ throw e
396
+ }
397
+
398
+ const parsed = SwarmPermissionRequestSchema().safeParse(jsonParse(content))
399
+ if (!parsed.success) {
400
+ logForDebugging(
401
+ `[PermissionSync] Invalid pending request ${requestId}: ${parsed.error.message}`,
402
+ )
403
+ return false
404
+ }
405
+
406
+ const request = parsed.data
407
+
408
+ // Update the request with resolution data
409
+ const resolvedRequest: SwarmPermissionRequest = {
410
+ ...request,
411
+ status: resolution.decision === 'approved' ? 'approved' : 'rejected',
412
+ resolvedBy: resolution.resolvedBy,
413
+ resolvedAt: Date.now(),
414
+ feedback: resolution.feedback,
415
+ updatedInput: resolution.updatedInput,
416
+ permissionUpdates: resolution.permissionUpdates,
417
+ }
418
+
419
+ // Write to resolved directory
420
+ await writeFile(
421
+ resolvedPath,
422
+ jsonStringify(resolvedRequest, null, 2),
423
+ 'utf-8',
424
+ )
425
+
426
+ // Remove from pending directory
427
+ await unlink(pendingPath)
428
+
429
+ logForDebugging(
430
+ `[PermissionSync] Resolved request ${requestId} with ${resolution.decision}`,
431
+ )
432
+
433
+ return true
434
+ } catch (error) {
435
+ logForDebugging(`[PermissionSync] Failed to resolve request: ${error}`)
436
+ logError(error)
437
+ return false
438
+ } finally {
439
+ if (release) {
440
+ await release()
441
+ }
442
+ }
443
+ }
444
+
445
+ /**
446
+ * Clean up old resolved permission files
447
+ * Called periodically to prevent file accumulation
448
+ *
449
+ * @param teamName - Team name
450
+ * @param maxAgeMs - Maximum age in milliseconds (default: 1 hour)
451
+ */
452
+ export async function cleanupOldResolutions(
453
+ teamName?: string,
454
+ maxAgeMs = 3600000,
455
+ ): Promise<number> {
456
+ const team = teamName || getTeamName()
457
+ if (!team) {
458
+ return 0
459
+ }
460
+
461
+ const resolvedDir = getResolvedDir(team)
462
+
463
+ let files: string[]
464
+ try {
465
+ files = await readdir(resolvedDir)
466
+ } catch (e: unknown) {
467
+ const code = getErrnoCode(e)
468
+ if (code === 'ENOENT') {
469
+ return 0
470
+ }
471
+ logForDebugging(`[PermissionSync] Failed to cleanup resolutions: ${e}`)
472
+ logError(e)
473
+ return 0
474
+ }
475
+
476
+ const now = Date.now()
477
+ const jsonFiles = files.filter(f => f.endsWith('.json'))
478
+
479
+ const cleanupResults = await Promise.all(
480
+ jsonFiles.map(async file => {
481
+ const filePath = join(resolvedDir, file)
482
+ try {
483
+ const content = await readFile(filePath, 'utf-8')
484
+ const request = jsonParse(content) as SwarmPermissionRequest
485
+
486
+ // Check if the resolution is old enough to clean up
487
+ // Use >= to handle edge case where maxAgeMs is 0 (clean up everything)
488
+ const resolvedAt = request.resolvedAt || request.createdAt
489
+ if (now - resolvedAt >= maxAgeMs) {
490
+ await unlink(filePath)
491
+ logForDebugging(`[PermissionSync] Cleaned up old resolution: ${file}`)
492
+ return 1
493
+ }
494
+ return 0
495
+ } catch {
496
+ // If we can't parse it, clean it up anyway
497
+ try {
498
+ await unlink(filePath)
499
+ return 1
500
+ } catch {
501
+ // Ignore deletion errors
502
+ return 0
503
+ }
504
+ }
505
+ }),
506
+ )
507
+
508
+ const cleanedCount = cleanupResults.reduce<number>((sum, n) => sum + n, 0)
509
+
510
+ if (cleanedCount > 0) {
511
+ logForDebugging(
512
+ `[PermissionSync] Cleaned up ${cleanedCount} old resolutions`,
513
+ )
514
+ }
515
+
516
+ return cleanedCount
517
+ }
518
+
519
+ /**
520
+ * Legacy response type for worker polling
521
+ * Used for backward compatibility with worker integration code
522
+ */
523
+ export type PermissionResponse = {
524
+ /** ID of the request this responds to */
525
+ requestId: string
526
+ /** Decision: approved or denied */
527
+ decision: 'approved' | 'denied'
528
+ /** Timestamp when response was created */
529
+ timestamp: string
530
+ /** Optional feedback message if denied */
531
+ feedback?: string
532
+ /** Optional updated input if the resolver modified it */
533
+ updatedInput?: Record<string, unknown>
534
+ /** Permission updates to apply (e.g., "always allow" rules) */
535
+ permissionUpdates?: unknown[]
536
+ }
537
+
538
+ /**
539
+ * Poll for a permission response (worker-side convenience function)
540
+ * Converts the resolved request into a simpler response format
541
+ *
542
+ * @returns The permission response, or null if not yet resolved
543
+ */
544
+ export async function pollForResponse(
545
+ requestId: string,
546
+ _agentName?: string,
547
+ teamName?: string,
548
+ ): Promise<PermissionResponse | null> {
549
+ const resolved = await readResolvedPermission(requestId, teamName)
550
+ if (!resolved) {
551
+ return null
552
+ }
553
+
554
+ return {
555
+ requestId: resolved.id,
556
+ decision: resolved.status === 'approved' ? 'approved' : 'denied',
557
+ timestamp: resolved.resolvedAt
558
+ ? new Date(resolved.resolvedAt).toISOString()
559
+ : new Date(resolved.createdAt).toISOString(),
560
+ feedback: resolved.feedback,
561
+ updatedInput: resolved.updatedInput,
562
+ permissionUpdates: resolved.permissionUpdates,
563
+ }
564
+ }
565
+
566
+ /**
567
+ * Remove a worker's response after processing
568
+ * This is an alias for deleteResolvedPermission for backward compatibility
569
+ */
570
+ export async function removeWorkerResponse(
571
+ requestId: string,
572
+ _agentName?: string,
573
+ teamName?: string,
574
+ ): Promise<void> {
575
+ await deleteResolvedPermission(requestId, teamName)
576
+ }
577
+
578
+ /**
579
+ * Check if the current agent is a team leader
580
+ */
581
+ export function isTeamLeader(teamName?: string): boolean {
582
+ const team = teamName || getTeamName()
583
+ if (!team) {
584
+ return false
585
+ }
586
+
587
+ // Team leaders don't have an agent ID set, or their ID is 'team-lead'
588
+ const agentId = getAgentId()
589
+
590
+ return !agentId || agentId === 'team-lead'
591
+ }
592
+
593
+ /**
594
+ * Check if the current agent is a worker in a swarm
595
+ */
596
+ export function isSwarmWorker(): boolean {
597
+ const teamName = getTeamName()
598
+ const agentId = getAgentId()
599
+
600
+ return !!teamName && !!agentId && !isTeamLeader()
601
+ }
602
+
603
+ /**
604
+ * Delete a resolved permission file
605
+ * Called after a worker has processed the resolution
606
+ */
607
+ export async function deleteResolvedPermission(
608
+ requestId: string,
609
+ teamName?: string,
610
+ ): Promise<boolean> {
611
+ const team = teamName || getTeamName()
612
+ if (!team) {
613
+ return false
614
+ }
615
+
616
+ const resolvedPath = getResolvedRequestPath(team, requestId)
617
+
618
+ try {
619
+ await unlink(resolvedPath)
620
+ logForDebugging(
621
+ `[PermissionSync] Deleted resolved permission: ${requestId}`,
622
+ )
623
+ return true
624
+ } catch (e: unknown) {
625
+ const code = getErrnoCode(e)
626
+ if (code === 'ENOENT') {
627
+ return false
628
+ }
629
+ logForDebugging(
630
+ `[PermissionSync] Failed to delete resolved permission: ${e}`,
631
+ )
632
+ logError(e)
633
+ return false
634
+ }
635
+ }
636
+
637
+ /**
638
+ * Submit a permission request (alias for writePermissionRequest)
639
+ * Provided for backward compatibility with worker integration code
640
+ */
641
+ export const submitPermissionRequest = writePermissionRequest
642
+
643
+ // ============================================================================
644
+ // Mailbox-Based Permission System
645
+ // ============================================================================
646
+
647
+ /**
648
+ * Get the leader's name from the team file
649
+ * This is needed to send permission requests to the leader's mailbox
650
+ */
651
+ export async function getLeaderName(teamName?: string): Promise<string | null> {
652
+ const team = teamName || getTeamName()
653
+ if (!team) {
654
+ return null
655
+ }
656
+
657
+ const teamFile = await readTeamFileAsync(team)
658
+ if (!teamFile) {
659
+ logForDebugging(`[PermissionSync] Team file not found for team: ${team}`)
660
+ return null
661
+ }
662
+
663
+ const leadMember = teamFile.members.find(
664
+ m => m.agentId === teamFile.leadAgentId,
665
+ )
666
+ return leadMember?.name || 'team-lead'
667
+ }
668
+
669
+ /**
670
+ * Send a permission request to the leader via mailbox.
671
+ * This is the new mailbox-based approach that replaces the file-based pending directory.
672
+ *
673
+ * @param request - The permission request to send
674
+ * @returns true if the message was sent successfully
675
+ */
676
+ export async function sendPermissionRequestViaMailbox(
677
+ request: SwarmPermissionRequest,
678
+ ): Promise<boolean> {
679
+ const leaderName = await getLeaderName(request.teamName)
680
+ if (!leaderName) {
681
+ logForDebugging(
682
+ `[PermissionSync] Cannot send permission request: leader name not found`,
683
+ )
684
+ return false
685
+ }
686
+
687
+ try {
688
+ // Create the permission request message
689
+ const message = createPermissionRequestMessage({
690
+ request_id: request.id,
691
+ agent_id: request.workerName,
692
+ tool_name: request.toolName,
693
+ tool_use_id: request.toolUseId,
694
+ description: request.description,
695
+ input: request.input,
696
+ permission_suggestions: request.permissionSuggestions,
697
+ })
698
+
699
+ // Send to leader's mailbox (routes to in-process or file-based based on recipient)
700
+ await writeToMailbox(
701
+ leaderName,
702
+ {
703
+ from: request.workerName,
704
+ text: jsonStringify(message),
705
+ timestamp: new Date().toISOString(),
706
+ color: request.workerColor,
707
+ },
708
+ request.teamName,
709
+ )
710
+
711
+ logForDebugging(
712
+ `[PermissionSync] Sent permission request ${request.id} to leader ${leaderName} via mailbox`,
713
+ )
714
+ return true
715
+ } catch (error) {
716
+ logForDebugging(
717
+ `[PermissionSync] Failed to send permission request via mailbox: ${error}`,
718
+ )
719
+ logError(error)
720
+ return false
721
+ }
722
+ }
723
+
724
+ /**
725
+ * Send a permission response to a worker via mailbox.
726
+ * This is the new mailbox-based approach that replaces the file-based resolved directory.
727
+ *
728
+ * @param workerName - The worker's name to send the response to
729
+ * @param resolution - The permission resolution
730
+ * @param requestId - The original request ID
731
+ * @param teamName - The team name
732
+ * @returns true if the message was sent successfully
733
+ */
734
+ export async function sendPermissionResponseViaMailbox(
735
+ workerName: string,
736
+ resolution: PermissionResolution,
737
+ requestId: string,
738
+ teamName?: string,
739
+ ): Promise<boolean> {
740
+ const team = teamName || getTeamName()
741
+ if (!team) {
742
+ logForDebugging(
743
+ `[PermissionSync] Cannot send permission response: team name not found`,
744
+ )
745
+ return false
746
+ }
747
+
748
+ try {
749
+ // Create the permission response message
750
+ const message = createPermissionResponseMessage({
751
+ request_id: requestId,
752
+ subtype: resolution.decision === 'approved' ? 'success' : 'error',
753
+ error: resolution.feedback,
754
+ updated_input: resolution.updatedInput,
755
+ permission_updates: resolution.permissionUpdates,
756
+ })
757
+
758
+ // Get the sender name (leader's name)
759
+ const senderName = getAgentName() || 'team-lead'
760
+
761
+ // Send to worker's mailbox (routes to in-process or file-based based on recipient)
762
+ await writeToMailbox(
763
+ workerName,
764
+ {
765
+ from: senderName,
766
+ text: jsonStringify(message),
767
+ timestamp: new Date().toISOString(),
768
+ },
769
+ team,
770
+ )
771
+
772
+ logForDebugging(
773
+ `[PermissionSync] Sent permission response for ${requestId} to worker ${workerName} via mailbox`,
774
+ )
775
+ return true
776
+ } catch (error) {
777
+ logForDebugging(
778
+ `[PermissionSync] Failed to send permission response via mailbox: ${error}`,
779
+ )
780
+ logError(error)
781
+ return false
782
+ }
783
+ }
784
+
785
+ // ============================================================================
786
+ // Sandbox Permission Mailbox System
787
+ // ============================================================================
788
+
789
+ /**
790
+ * Generate a unique sandbox permission request ID
791
+ */
792
+ export function generateSandboxRequestId(): string {
793
+ return `sandbox-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`
794
+ }
795
+
796
+ /**
797
+ * Send a sandbox permission request to the leader via mailbox.
798
+ * Called by workers when sandbox runtime needs network access approval.
799
+ *
800
+ * @param host - The host requesting network access
801
+ * @param requestId - Unique ID for this request
802
+ * @param teamName - Optional team name
803
+ * @returns true if the message was sent successfully
804
+ */
805
+ export async function sendSandboxPermissionRequestViaMailbox(
806
+ host: string,
807
+ requestId: string,
808
+ teamName?: string,
809
+ ): Promise<boolean> {
810
+ const team = teamName || getTeamName()
811
+ if (!team) {
812
+ logForDebugging(
813
+ `[PermissionSync] Cannot send sandbox permission request: team name not found`,
814
+ )
815
+ return false
816
+ }
817
+
818
+ const leaderName = await getLeaderName(team)
819
+ if (!leaderName) {
820
+ logForDebugging(
821
+ `[PermissionSync] Cannot send sandbox permission request: leader name not found`,
822
+ )
823
+ return false
824
+ }
825
+
826
+ const workerId = getAgentId()
827
+ const workerName = getAgentName()
828
+ const workerColor = getTeammateColor()
829
+
830
+ if (!workerId || !workerName) {
831
+ logForDebugging(
832
+ `[PermissionSync] Cannot send sandbox permission request: worker ID or name not found`,
833
+ )
834
+ return false
835
+ }
836
+
837
+ try {
838
+ const message = createSandboxPermissionRequestMessage({
839
+ requestId,
840
+ workerId,
841
+ workerName,
842
+ workerColor,
843
+ host,
844
+ })
845
+
846
+ // Send to leader's mailbox (routes to in-process or file-based based on recipient)
847
+ await writeToMailbox(
848
+ leaderName,
849
+ {
850
+ from: workerName,
851
+ text: jsonStringify(message),
852
+ timestamp: new Date().toISOString(),
853
+ color: workerColor,
854
+ },
855
+ team,
856
+ )
857
+
858
+ logForDebugging(
859
+ `[PermissionSync] Sent sandbox permission request ${requestId} for host ${host} to leader ${leaderName} via mailbox`,
860
+ )
861
+ return true
862
+ } catch (error) {
863
+ logForDebugging(
864
+ `[PermissionSync] Failed to send sandbox permission request via mailbox: ${error}`,
865
+ )
866
+ logError(error)
867
+ return false
868
+ }
869
+ }
870
+
871
+ /**
872
+ * Send a sandbox permission response to a worker via mailbox.
873
+ * Called by the leader when approving/denying a sandbox network access request.
874
+ *
875
+ * @param workerName - The worker's name to send the response to
876
+ * @param requestId - The original request ID
877
+ * @param host - The host that was approved/denied
878
+ * @param allow - Whether the connection is allowed
879
+ * @param teamName - Optional team name
880
+ * @returns true if the message was sent successfully
881
+ */
882
+ export async function sendSandboxPermissionResponseViaMailbox(
883
+ workerName: string,
884
+ requestId: string,
885
+ host: string,
886
+ allow: boolean,
887
+ teamName?: string,
888
+ ): Promise<boolean> {
889
+ const team = teamName || getTeamName()
890
+ if (!team) {
891
+ logForDebugging(
892
+ `[PermissionSync] Cannot send sandbox permission response: team name not found`,
893
+ )
894
+ return false
895
+ }
896
+
897
+ try {
898
+ const message = createSandboxPermissionResponseMessage({
899
+ requestId,
900
+ host,
901
+ allow,
902
+ })
903
+
904
+ const senderName = getAgentName() || 'team-lead'
905
+
906
+ // Send to worker's mailbox (routes to in-process or file-based based on recipient)
907
+ await writeToMailbox(
908
+ workerName,
909
+ {
910
+ from: senderName,
911
+ text: jsonStringify(message),
912
+ timestamp: new Date().toISOString(),
913
+ },
914
+ team,
915
+ )
916
+
917
+ logForDebugging(
918
+ `[PermissionSync] Sent sandbox permission response for ${requestId} (host: ${host}, allow: ${allow}) to worker ${workerName} via mailbox`,
919
+ )
920
+ return true
921
+ } catch (error) {
922
+ logForDebugging(
923
+ `[PermissionSync] Failed to send sandbox permission response via mailbox: ${error}`,
924
+ )
925
+ logError(error)
926
+ return false
927
+ }
928
+ }