@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
package/utils/tasks.ts ADDED
@@ -0,0 +1,862 @@
1
+ import { mkdir, readdir, readFile, unlink, writeFile } from 'fs/promises'
2
+ import { join } from 'path'
3
+ import { z } from 'zod/v4'
4
+ import { getIsNonInteractiveSession, getSessionId } from '../bootstrap/state.js'
5
+ import { uniq } from './array.js'
6
+ import { logForDebugging } from './debug.js'
7
+ import { getClaudeConfigHomeDir, getTeamsDir, isEnvTruthy } from './envUtils.js'
8
+ import { errorMessage, getErrnoCode } from './errors.js'
9
+ import { lazySchema } from './lazySchema.js'
10
+ import * as lockfile from './lockfile.js'
11
+ import { logError } from './log.js'
12
+ import { createSignal } from './signal.js'
13
+ import { jsonParse, jsonStringify } from './slowOperations.js'
14
+ import { getTeamName } from './teammate.js'
15
+ import { getTeammateContext } from './teammateContext.js'
16
+
17
+ // Listeners for task list updates (used for immediate UI refresh in same process)
18
+ const tasksUpdated = createSignal()
19
+
20
+ /**
21
+ * Team name set by the leader when creating a team.
22
+ * Used by getTaskListId() so the leader's tasks are stored under the team name
23
+ * (matching where tmux/iTerm2 teammates look), not under the session ID.
24
+ */
25
+ let leaderTeamName: string | undefined
26
+
27
+ /**
28
+ * Sets the leader's team name for task list resolution.
29
+ * Called by TeamCreateTool when a team is created.
30
+ */
31
+ export function setLeaderTeamName(teamName: string): void {
32
+ if (leaderTeamName === teamName) return
33
+ leaderTeamName = teamName
34
+ // Changing the task list ID is a "tasks updated" event for subscribers —
35
+ // they're now looking at a different directory.
36
+ notifyTasksUpdated()
37
+ }
38
+
39
+ /**
40
+ * Clears the leader's team name.
41
+ * Called when a team is deleted.
42
+ */
43
+ export function clearLeaderTeamName(): void {
44
+ if (leaderTeamName === undefined) return
45
+ leaderTeamName = undefined
46
+ notifyTasksUpdated()
47
+ }
48
+
49
+ /**
50
+ * Register a listener to be called when tasks are updated in this process.
51
+ * Returns an unsubscribe function.
52
+ */
53
+ export const onTasksUpdated = tasksUpdated.subscribe
54
+
55
+ /**
56
+ * Notify listeners that tasks have been updated.
57
+ * Called internally after createTask, updateTask, etc.
58
+ * Wraps emit in try/catch so listener failures never propagate to callers
59
+ * (task mutations must succeed from the caller's perspective).
60
+ */
61
+ export function notifyTasksUpdated(): void {
62
+ try {
63
+ tasksUpdated.emit()
64
+ } catch {
65
+ // Ignore listener errors — task mutations must not fail due to notification issues
66
+ }
67
+ }
68
+
69
+ export const TASK_STATUSES = ['pending', 'in_progress', 'completed'] as const
70
+
71
+ export const TaskStatusSchema = lazySchema(() =>
72
+ z.enum(['pending', 'in_progress', 'completed']),
73
+ )
74
+ export type TaskStatus = z.infer<ReturnType<typeof TaskStatusSchema>>
75
+
76
+ export const TaskSchema = lazySchema(() =>
77
+ z.object({
78
+ id: z.string(),
79
+ subject: z.string(),
80
+ description: z.string(),
81
+ activeForm: z.string().optional(), // present continuous form for spinner (e.g., "Running tests")
82
+ owner: z.string().optional(), // agent ID
83
+ status: TaskStatusSchema(),
84
+ blocks: z.array(z.string()), // task IDs this task blocks
85
+ blockedBy: z.array(z.string()), // task IDs that block this task
86
+ metadata: z.record(z.string(), z.unknown()).optional(), // arbitrary metadata
87
+ }),
88
+ )
89
+ export type Task = z.infer<ReturnType<typeof TaskSchema>>
90
+
91
+ // High water mark file name - stores the maximum task ID ever assigned
92
+ const HIGH_WATER_MARK_FILE = '.highwatermark'
93
+
94
+ // Lock options: retry with backoff so concurrent callers (multiple Claudes
95
+ // in a swarm) wait for the lock instead of failing immediately. The sync
96
+ // lockSync API blocked the event loop; the async API needs explicit retries
97
+ // to achieve the same serialization semantics.
98
+ //
99
+ // Budget sized for ~10+ concurrent swarm agents: each critical section does
100
+ // readdir + N×readFile + writeFile (~50-100ms on slow disks), so the last
101
+ // caller in a 10-way race needs ~900ms. retries=30 gives ~2.6s total wait.
102
+ const LOCK_OPTIONS = {
103
+ retries: {
104
+ retries: 30,
105
+ minTimeout: 5,
106
+ maxTimeout: 100,
107
+ },
108
+ }
109
+
110
+ function getHighWaterMarkPath(taskListId: string): string {
111
+ return join(getTasksDir(taskListId), HIGH_WATER_MARK_FILE)
112
+ }
113
+
114
+ async function readHighWaterMark(taskListId: string): Promise<number> {
115
+ const path = getHighWaterMarkPath(taskListId)
116
+ try {
117
+ const content = (await readFile(path, 'utf-8')).trim()
118
+ const value = parseInt(content, 10)
119
+ return isNaN(value) ? 0 : value
120
+ } catch {
121
+ return 0
122
+ }
123
+ }
124
+
125
+ async function writeHighWaterMark(
126
+ taskListId: string,
127
+ value: number,
128
+ ): Promise<void> {
129
+ const path = getHighWaterMarkPath(taskListId)
130
+ await writeFile(path, String(value))
131
+ }
132
+
133
+ export function isTodoV2Enabled(): boolean {
134
+ // Force-enable tasks in non-interactive mode (e.g. SDK users who want Task tools over TodoWrite)
135
+ if (isEnvTruthy(process.env.CLAUDE_CODE_ENABLE_TASKS)) {
136
+ return true
137
+ }
138
+ return !getIsNonInteractiveSession()
139
+ }
140
+
141
+ /**
142
+ * Resets the task list for a new swarm - clears any existing tasks.
143
+ * Writes a high water mark file to prevent ID reuse after reset.
144
+ * Should be called when a new swarm is created to ensure task numbering starts at 1.
145
+ * Uses file locking to prevent race conditions when multiple Claudes run in parallel.
146
+ */
147
+ export async function resetTaskList(taskListId: string): Promise<void> {
148
+ const dir = getTasksDir(taskListId)
149
+ const lockPath = await ensureTaskListLockFile(taskListId)
150
+
151
+ let release: (() => Promise<void>) | undefined
152
+ try {
153
+ // Acquire exclusive lock on the task list
154
+ release = await lockfile.lock(lockPath, LOCK_OPTIONS)
155
+
156
+ // Find the current highest ID and save it to the high water mark file
157
+ const currentHighest = await findHighestTaskIdFromFiles(taskListId)
158
+ if (currentHighest > 0) {
159
+ const existingMark = await readHighWaterMark(taskListId)
160
+ if (currentHighest > existingMark) {
161
+ await writeHighWaterMark(taskListId, currentHighest)
162
+ }
163
+ }
164
+
165
+ // Delete all task files
166
+ let files: string[]
167
+ try {
168
+ files = await readdir(dir)
169
+ } catch {
170
+ files = []
171
+ }
172
+ for (const file of files) {
173
+ if (file.endsWith('.json') && !file.startsWith('.')) {
174
+ const filePath = join(dir, file)
175
+ try {
176
+ await unlink(filePath)
177
+ } catch {
178
+ // Ignore errors, file may already be deleted
179
+ }
180
+ }
181
+ }
182
+ notifyTasksUpdated()
183
+ } finally {
184
+ if (release) {
185
+ await release()
186
+ }
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Gets the task list ID based on the current context.
192
+ * Priority:
193
+ * 1. CLAUDE_CODE_TASK_LIST_ID - explicit task list ID
194
+ * 2. In-process teammate: leader's team name (so teammates share the leader's task list)
195
+ * 3. CLAUDE_CODE_TEAM_NAME - set when running as a process-based teammate
196
+ * 4. Leader team name - set when the leader creates a team via TeamCreate
197
+ * 5. Session ID - fallback for standalone sessions
198
+ */
199
+ export function getTaskListId(): string {
200
+ if (process.env.CLAUDE_CODE_TASK_LIST_ID) {
201
+ return process.env.CLAUDE_CODE_TASK_LIST_ID
202
+ }
203
+ // In-process teammates use the leader's team name so they share the same
204
+ // task list that tmux/iTerm2 teammates also resolve to.
205
+ const teammateCtx = getTeammateContext()
206
+ if (teammateCtx) {
207
+ return teammateCtx.teamName
208
+ }
209
+ return getTeamName() || leaderTeamName || getSessionId()
210
+ }
211
+
212
+ /**
213
+ * Sanitizes a string for safe use in file paths.
214
+ * Removes path traversal characters and other potentially dangerous characters.
215
+ * Only allows alphanumeric characters, hyphens, and underscores.
216
+ */
217
+ export function sanitizePathComponent(input: string): string {
218
+ return input.replace(/[^a-zA-Z0-9_-]/g, '-')
219
+ }
220
+
221
+ export function getTasksDir(taskListId: string): string {
222
+ return join(
223
+ getClaudeConfigHomeDir(),
224
+ 'tasks',
225
+ sanitizePathComponent(taskListId),
226
+ )
227
+ }
228
+
229
+ export function getTaskPath(taskListId: string, taskId: string): string {
230
+ return join(getTasksDir(taskListId), `${sanitizePathComponent(taskId)}.json`)
231
+ }
232
+
233
+ export async function ensureTasksDir(taskListId: string): Promise<void> {
234
+ const dir = getTasksDir(taskListId)
235
+ try {
236
+ await mkdir(dir, { recursive: true })
237
+ } catch {
238
+ // Directory already exists or creation failed; callers will surface
239
+ // errors from subsequent operations.
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Finds the highest task ID from existing task files (not including high water mark).
245
+ */
246
+ async function findHighestTaskIdFromFiles(taskListId: string): Promise<number> {
247
+ const dir = getTasksDir(taskListId)
248
+ let files: string[]
249
+ try {
250
+ files = await readdir(dir)
251
+ } catch {
252
+ return 0
253
+ }
254
+ let highest = 0
255
+ for (const file of files) {
256
+ if (!file.endsWith('.json')) {
257
+ continue
258
+ }
259
+ const taskId = parseInt(file.replace('.json', ''), 10)
260
+ if (!isNaN(taskId) && taskId > highest) {
261
+ highest = taskId
262
+ }
263
+ }
264
+ return highest
265
+ }
266
+
267
+ /**
268
+ * Finds the highest task ID ever assigned, considering both existing files
269
+ * and the high water mark (for deleted/reset tasks).
270
+ */
271
+ async function findHighestTaskId(taskListId: string): Promise<number> {
272
+ const [fromFiles, fromMark] = await Promise.all([
273
+ findHighestTaskIdFromFiles(taskListId),
274
+ readHighWaterMark(taskListId),
275
+ ])
276
+ return Math.max(fromFiles, fromMark)
277
+ }
278
+
279
+ /**
280
+ * Creates a new task with a unique ID.
281
+ * Uses file locking to prevent race conditions when multiple processes
282
+ * create tasks concurrently.
283
+ */
284
+ export async function createTask(
285
+ taskListId: string,
286
+ taskData: Omit<Task, 'id'>,
287
+ ): Promise<string> {
288
+ const lockPath = await ensureTaskListLockFile(taskListId)
289
+
290
+ let release: (() => Promise<void>) | undefined
291
+ try {
292
+ // Acquire exclusive lock on the task list
293
+ release = await lockfile.lock(lockPath, LOCK_OPTIONS)
294
+
295
+ // Read highest ID from disk while holding the lock
296
+ const highestId = await findHighestTaskId(taskListId)
297
+ const id = String(highestId + 1)
298
+ const task: Task = { id, ...taskData }
299
+ const path = getTaskPath(taskListId, id)
300
+ await writeFile(path, jsonStringify(task, null, 2))
301
+ notifyTasksUpdated()
302
+ return id
303
+ } finally {
304
+ if (release) {
305
+ await release()
306
+ }
307
+ }
308
+ }
309
+
310
+ export async function getTask(
311
+ taskListId: string,
312
+ taskId: string,
313
+ ): Promise<Task | null> {
314
+ const path = getTaskPath(taskListId, taskId)
315
+ try {
316
+ const content = await readFile(path, 'utf-8')
317
+ const data = jsonParse(content) as { status?: string }
318
+
319
+ // TEMPORARY: Migrate old status names for existing sessions (ant-only)
320
+ if (process.env.USER_TYPE === 'ant') {
321
+ if (data.status === 'open') data.status = 'pending'
322
+ else if (data.status === 'resolved') data.status = 'completed'
323
+ // Migrate development task statuses to in_progress
324
+ else if (
325
+ data.status &&
326
+ ['planning', 'implementing', 'reviewing', 'verifying'].includes(
327
+ data.status,
328
+ )
329
+ ) {
330
+ data.status = 'in_progress'
331
+ }
332
+ }
333
+ const parsed = TaskSchema().safeParse(data)
334
+ if (!parsed.success) {
335
+ logForDebugging(
336
+ `[Tasks] Task ${taskId} failed schema validation: ${parsed.error.message}`,
337
+ )
338
+ return null
339
+ }
340
+ return parsed.data
341
+ } catch (e) {
342
+ const code = getErrnoCode(e)
343
+ if (code === 'ENOENT') {
344
+ return null
345
+ }
346
+ logForDebugging(`[Tasks] Failed to read task ${taskId}: ${errorMessage(e)}`)
347
+ logError(e)
348
+ return null
349
+ }
350
+ }
351
+
352
+ // Internal: no lock. Callers already holding a lock on taskPath must use this
353
+ // to avoid deadlock (claimTask, deleteTask cascade, etc.).
354
+ async function updateTaskUnsafe(
355
+ taskListId: string,
356
+ taskId: string,
357
+ updates: Partial<Omit<Task, 'id'>>,
358
+ ): Promise<Task | null> {
359
+ const existing = await getTask(taskListId, taskId)
360
+ if (!existing) {
361
+ return null
362
+ }
363
+ const updated: Task = { ...existing, ...updates, id: taskId }
364
+ const path = getTaskPath(taskListId, taskId)
365
+ await writeFile(path, jsonStringify(updated, null, 2))
366
+ notifyTasksUpdated()
367
+ return updated
368
+ }
369
+
370
+ export async function updateTask(
371
+ taskListId: string,
372
+ taskId: string,
373
+ updates: Partial<Omit<Task, 'id'>>,
374
+ ): Promise<Task | null> {
375
+ const path = getTaskPath(taskListId, taskId)
376
+
377
+ // Check existence before locking — proper-lockfile throws if the
378
+ // target file doesn't exist, and we want a clean null result.
379
+ const taskBeforeLock = await getTask(taskListId, taskId)
380
+ if (!taskBeforeLock) {
381
+ return null
382
+ }
383
+
384
+ let release: (() => Promise<void>) | undefined
385
+ try {
386
+ release = await lockfile.lock(path, LOCK_OPTIONS)
387
+ return await updateTaskUnsafe(taskListId, taskId, updates)
388
+ } finally {
389
+ await release?.()
390
+ }
391
+ }
392
+
393
+ export async function deleteTask(
394
+ taskListId: string,
395
+ taskId: string,
396
+ ): Promise<boolean> {
397
+ const path = getTaskPath(taskListId, taskId)
398
+
399
+ try {
400
+ // Update high water mark before deleting to prevent ID reuse
401
+ const numericId = parseInt(taskId, 10)
402
+ if (!isNaN(numericId)) {
403
+ const currentMark = await readHighWaterMark(taskListId)
404
+ if (numericId > currentMark) {
405
+ await writeHighWaterMark(taskListId, numericId)
406
+ }
407
+ }
408
+
409
+ // Delete the task file
410
+ try {
411
+ await unlink(path)
412
+ } catch (e) {
413
+ const code = getErrnoCode(e)
414
+ if (code === 'ENOENT') {
415
+ return false
416
+ }
417
+ throw e
418
+ }
419
+
420
+ // Remove references to this task from other tasks
421
+ const allTasks = await listTasks(taskListId)
422
+ for (const task of allTasks) {
423
+ const newBlocks = task.blocks.filter(id => id !== taskId)
424
+ const newBlockedBy = task.blockedBy.filter(id => id !== taskId)
425
+ if (
426
+ newBlocks.length !== task.blocks.length ||
427
+ newBlockedBy.length !== task.blockedBy.length
428
+ ) {
429
+ await updateTask(taskListId, task.id, {
430
+ blocks: newBlocks,
431
+ blockedBy: newBlockedBy,
432
+ })
433
+ }
434
+ }
435
+
436
+ notifyTasksUpdated()
437
+ return true
438
+ } catch {
439
+ return false
440
+ }
441
+ }
442
+
443
+ export async function listTasks(taskListId: string): Promise<Task[]> {
444
+ const dir = getTasksDir(taskListId)
445
+ let files: string[]
446
+ try {
447
+ files = await readdir(dir)
448
+ } catch {
449
+ return []
450
+ }
451
+ const taskIds = files
452
+ .filter(f => f.endsWith('.json'))
453
+ .map(f => f.replace('.json', ''))
454
+ const results = await Promise.all(taskIds.map(id => getTask(taskListId, id)))
455
+ return results.filter((t): t is Task => t !== null)
456
+ }
457
+
458
+ export async function blockTask(
459
+ taskListId: string,
460
+ fromTaskId: string,
461
+ toTaskId: string,
462
+ ): Promise<boolean> {
463
+ const [fromTask, toTask] = await Promise.all([
464
+ getTask(taskListId, fromTaskId),
465
+ getTask(taskListId, toTaskId),
466
+ ])
467
+ if (!fromTask || !toTask) {
468
+ return false
469
+ }
470
+
471
+ // Update source task: A blocks B
472
+ if (!fromTask.blocks.includes(toTaskId)) {
473
+ await updateTask(taskListId, fromTaskId, {
474
+ blocks: [...fromTask.blocks, toTaskId],
475
+ })
476
+ }
477
+
478
+ // Update target task: B is blockedBy A
479
+ if (!toTask.blockedBy.includes(fromTaskId)) {
480
+ await updateTask(taskListId, toTaskId, {
481
+ blockedBy: [...toTask.blockedBy, fromTaskId],
482
+ })
483
+ }
484
+
485
+ return true
486
+ }
487
+
488
+ export type ClaimTaskResult = {
489
+ success: boolean
490
+ reason?:
491
+ | 'task_not_found'
492
+ | 'already_claimed'
493
+ | 'already_resolved'
494
+ | 'blocked'
495
+ | 'agent_busy'
496
+ task?: Task
497
+ busyWithTasks?: string[] // task IDs the agent is busy with (when reason is 'agent_busy')
498
+ blockedByTasks?: string[] // task IDs blocking this task (when reason is 'blocked')
499
+ }
500
+
501
+ /**
502
+ * Gets the lock file path for a task list (used for list-level locking)
503
+ */
504
+ function getTaskListLockPath(taskListId: string): string {
505
+ return join(getTasksDir(taskListId), '.lock')
506
+ }
507
+
508
+ /**
509
+ * Ensures the lock file exists for a task list
510
+ */
511
+ async function ensureTaskListLockFile(taskListId: string): Promise<string> {
512
+ await ensureTasksDir(taskListId)
513
+ const lockPath = getTaskListLockPath(taskListId)
514
+ // proper-lockfile requires the target file to exist. Create it with the
515
+ // 'wx' flag (write-exclusive) so concurrent callers don't both create it,
516
+ // and the first one to create wins silently.
517
+ try {
518
+ await writeFile(lockPath, '', { flag: 'wx' })
519
+ } catch {
520
+ // EEXIST or other — file already exists, which is fine.
521
+ }
522
+ return lockPath
523
+ }
524
+
525
+ export type ClaimTaskOptions = {
526
+ /**
527
+ * If true, checks whether the agent is already busy (owns other open tasks)
528
+ * before allowing the claim. This check is performed atomically with the claim
529
+ * using a task-list-level lock to prevent TOCTOU race conditions.
530
+ */
531
+ checkAgentBusy?: boolean
532
+ }
533
+
534
+ /**
535
+ * Attempts to claim a task for an agent with file locking to prevent race conditions.
536
+ * Returns success if the task was claimed, or a reason if it wasn't.
537
+ *
538
+ * When checkAgentBusy is true, uses a task-list-level lock to atomically check
539
+ * if the agent owns any other open tasks before claiming.
540
+ */
541
+ export async function claimTask(
542
+ taskListId: string,
543
+ taskId: string,
544
+ claimantAgentId: string,
545
+ options: ClaimTaskOptions = {},
546
+ ): Promise<ClaimTaskResult> {
547
+ const taskPath = getTaskPath(taskListId, taskId)
548
+
549
+ // Check existence before locking — proper-lockfile.lock throws if the
550
+ // target file doesn't exist, and we want a clean task_not_found result.
551
+ const taskBeforeLock = await getTask(taskListId, taskId)
552
+ if (!taskBeforeLock) {
553
+ return { success: false, reason: 'task_not_found' }
554
+ }
555
+
556
+ // If we need to check agent busy status, use task-list-level lock
557
+ // to prevent TOCTOU race conditions
558
+ if (options.checkAgentBusy) {
559
+ return claimTaskWithBusyCheck(taskListId, taskId, claimantAgentId)
560
+ }
561
+
562
+ // Otherwise, use task-level lock (original behavior)
563
+ let release: (() => Promise<void>) | undefined
564
+ try {
565
+ // Acquire exclusive lock on the task file
566
+ release = await lockfile.lock(taskPath, LOCK_OPTIONS)
567
+
568
+ // Read current task state
569
+ const task = await getTask(taskListId, taskId)
570
+ if (!task) {
571
+ return { success: false, reason: 'task_not_found' }
572
+ }
573
+
574
+ // Check if already claimed by another agent
575
+ if (task.owner && task.owner !== claimantAgentId) {
576
+ return { success: false, reason: 'already_claimed', task }
577
+ }
578
+
579
+ // Check if already resolved
580
+ if (task.status === 'completed') {
581
+ return { success: false, reason: 'already_resolved', task }
582
+ }
583
+
584
+ // Check for unresolved blockers (open or in_progress tasks block)
585
+ const allTasks = await listTasks(taskListId)
586
+ const unresolvedTaskIds = new Set(
587
+ allTasks.filter(t => t.status !== 'completed').map(t => t.id),
588
+ )
589
+ const blockedByTasks = task.blockedBy.filter(id =>
590
+ unresolvedTaskIds.has(id),
591
+ )
592
+ if (blockedByTasks.length > 0) {
593
+ return { success: false, reason: 'blocked', task, blockedByTasks }
594
+ }
595
+
596
+ // Claim the task (already holding taskPath lock — use unsafe variant)
597
+ const updated = await updateTaskUnsafe(taskListId, taskId, {
598
+ owner: claimantAgentId,
599
+ })
600
+ return { success: true, task: updated! }
601
+ } catch (error) {
602
+ logForDebugging(
603
+ `[Tasks] Failed to claim task ${taskId}: ${errorMessage(error)}`,
604
+ )
605
+ logError(error)
606
+ return { success: false, reason: 'task_not_found' }
607
+ } finally {
608
+ if (release) {
609
+ await release()
610
+ }
611
+ }
612
+ }
613
+
614
+ /**
615
+ * Claims a task with an atomic check for agent busy status.
616
+ * Uses a task-list-level lock to ensure the busy check and claim are atomic.
617
+ */
618
+ async function claimTaskWithBusyCheck(
619
+ taskListId: string,
620
+ taskId: string,
621
+ claimantAgentId: string,
622
+ ): Promise<ClaimTaskResult> {
623
+ const lockPath = await ensureTaskListLockFile(taskListId)
624
+
625
+ let release: (() => Promise<void>) | undefined
626
+ try {
627
+ // Acquire exclusive lock on the task list
628
+ release = await lockfile.lock(lockPath, LOCK_OPTIONS)
629
+
630
+ // Read all tasks to check agent status and task state atomically
631
+ const allTasks = await listTasks(taskListId)
632
+
633
+ // Find the task we want to claim
634
+ const task = allTasks.find(t => t.id === taskId)
635
+ if (!task) {
636
+ return { success: false, reason: 'task_not_found' }
637
+ }
638
+
639
+ // Check if already claimed by another agent
640
+ if (task.owner && task.owner !== claimantAgentId) {
641
+ return { success: false, reason: 'already_claimed', task }
642
+ }
643
+
644
+ // Check if already resolved
645
+ if (task.status === 'completed') {
646
+ return { success: false, reason: 'already_resolved', task }
647
+ }
648
+
649
+ // Check for unresolved blockers (open or in_progress tasks block)
650
+ const unresolvedTaskIds = new Set(
651
+ allTasks.filter(t => t.status !== 'completed').map(t => t.id),
652
+ )
653
+ const blockedByTasks = task.blockedBy.filter(id =>
654
+ unresolvedTaskIds.has(id),
655
+ )
656
+ if (blockedByTasks.length > 0) {
657
+ return { success: false, reason: 'blocked', task, blockedByTasks }
658
+ }
659
+
660
+ // Check if agent is busy with other unresolved tasks
661
+ const agentOpenTasks = allTasks.filter(
662
+ t =>
663
+ t.status !== 'completed' &&
664
+ t.owner === claimantAgentId &&
665
+ t.id !== taskId,
666
+ )
667
+ if (agentOpenTasks.length > 0) {
668
+ return {
669
+ success: false,
670
+ reason: 'agent_busy',
671
+ task,
672
+ busyWithTasks: agentOpenTasks.map(t => t.id),
673
+ }
674
+ }
675
+
676
+ // Claim the task
677
+ const updated = await updateTask(taskListId, taskId, {
678
+ owner: claimantAgentId,
679
+ })
680
+ return { success: true, task: updated! }
681
+ } catch (error) {
682
+ logForDebugging(
683
+ `[Tasks] Failed to claim task ${taskId} with busy check: ${errorMessage(error)}`,
684
+ )
685
+ logError(error)
686
+ return { success: false, reason: 'task_not_found' }
687
+ } finally {
688
+ if (release) {
689
+ await release()
690
+ }
691
+ }
692
+ }
693
+
694
+ /**
695
+ * Team member info (subset of TeamFile member structure)
696
+ */
697
+ export type TeamMember = {
698
+ agentId: string
699
+ name: string
700
+ agentType?: string
701
+ }
702
+
703
+ /**
704
+ * Agent status based on task ownership
705
+ */
706
+ export type AgentStatus = {
707
+ agentId: string
708
+ name: string
709
+ agentType?: string
710
+ status: 'idle' | 'busy'
711
+ currentTasks: string[] // task IDs the agent owns
712
+ }
713
+
714
+ /**
715
+ * Sanitizes a name for use in file paths
716
+ */
717
+ function sanitizeName(name: string): string {
718
+ return name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()
719
+ }
720
+
721
+ /**
722
+ * Reads team members from the team file
723
+ */
724
+ async function readTeamMembers(
725
+ teamName: string,
726
+ ): Promise<{ leadAgentId: string; members: TeamMember[] } | null> {
727
+ const teamsDir = getTeamsDir()
728
+ const teamFilePath = join(teamsDir, sanitizeName(teamName), 'config.json')
729
+ try {
730
+ const content = await readFile(teamFilePath, 'utf-8')
731
+ const teamFile = jsonParse(content) as {
732
+ leadAgentId: string
733
+ members: TeamMember[]
734
+ }
735
+ return {
736
+ leadAgentId: teamFile.leadAgentId,
737
+ members: teamFile.members.map(m => ({
738
+ agentId: m.agentId,
739
+ name: m.name,
740
+ agentType: m.agentType,
741
+ })),
742
+ }
743
+ } catch (e) {
744
+ const code = getErrnoCode(e)
745
+ if (code === 'ENOENT') {
746
+ return null
747
+ }
748
+ logForDebugging(
749
+ `[Tasks] Failed to read team file for ${teamName}: ${errorMessage(e)}`,
750
+ )
751
+ return null
752
+ }
753
+ }
754
+
755
+ /**
756
+ * Gets the status of all agents in a team based on task ownership.
757
+ * An agent is considered "idle" if they don't own any open tasks.
758
+ * An agent is considered "busy" if they own at least one open task.
759
+ *
760
+ * @param teamName - The name of the team (also used as taskListId)
761
+ * @returns Array of agent statuses, or null if team not found
762
+ */
763
+ export async function getAgentStatuses(
764
+ teamName: string,
765
+ ): Promise<AgentStatus[] | null> {
766
+ const teamData = await readTeamMembers(teamName)
767
+ if (!teamData) {
768
+ return null
769
+ }
770
+
771
+ const taskListId = sanitizeName(teamName)
772
+ const allTasks = await listTasks(taskListId)
773
+
774
+ // Get unresolved tasks grouped by owner (open or in_progress)
775
+ const unresolvedTasksByOwner = new Map<string, string[]>()
776
+ for (const task of allTasks) {
777
+ if (task.status !== 'completed' && task.owner) {
778
+ const existing = unresolvedTasksByOwner.get(task.owner) || []
779
+ existing.push(task.id)
780
+ unresolvedTasksByOwner.set(task.owner, existing)
781
+ }
782
+ }
783
+
784
+ // Build status for each agent (leader is already in members)
785
+ return teamData.members.map(member => {
786
+ // Check both name (new) and agentId (legacy) for backwards compatibility
787
+ const tasksByName = unresolvedTasksByOwner.get(member.name) || []
788
+ const tasksById = unresolvedTasksByOwner.get(member.agentId) || []
789
+ const currentTasks = uniq([...tasksByName, ...tasksById])
790
+ return {
791
+ agentId: member.agentId,
792
+ name: member.name,
793
+ agentType: member.agentType,
794
+ status: currentTasks.length === 0 ? 'idle' : 'busy',
795
+ currentTasks,
796
+ }
797
+ })
798
+ }
799
+
800
+ /**
801
+ * Result of unassigning tasks from a teammate
802
+ */
803
+ export type UnassignTasksResult = {
804
+ unassignedTasks: Array<{ id: string; subject: string }>
805
+ notificationMessage: string
806
+ }
807
+
808
+ /**
809
+ * Unassigns all open tasks from a teammate and builds a notification message.
810
+ * Used when a teammate is killed or gracefully shuts down.
811
+ *
812
+ * @param teamName - The team/task list name
813
+ * @param teammateId - The teammate's agent ID
814
+ * @param teammateName - The teammate's display name
815
+ * @param reason - How the teammate exited ('terminated' | 'shutdown')
816
+ * @returns The unassigned tasks and a formatted notification message
817
+ */
818
+ export async function unassignTeammateTasks(
819
+ teamName: string,
820
+ teammateId: string,
821
+ teammateName: string,
822
+ reason: 'terminated' | 'shutdown',
823
+ ): Promise<UnassignTasksResult> {
824
+ const tasks = await listTasks(teamName)
825
+ const unresolvedAssignedTasks = tasks.filter(
826
+ t =>
827
+ t.status !== 'completed' &&
828
+ (t.owner === teammateId || t.owner === teammateName),
829
+ )
830
+
831
+ // Unassign each task and reset status to open
832
+ for (const task of unresolvedAssignedTasks) {
833
+ await updateTask(teamName, task.id, { owner: undefined, status: 'pending' })
834
+ }
835
+
836
+ if (unresolvedAssignedTasks.length > 0) {
837
+ logForDebugging(
838
+ `[Tasks] Unassigned ${unresolvedAssignedTasks.length} task(s) from ${teammateName}`,
839
+ )
840
+ }
841
+
842
+ // Build notification message
843
+ const actionVerb =
844
+ reason === 'terminated' ? 'was terminated' : 'has shut down'
845
+ let notificationMessage = `${teammateName} ${actionVerb}.`
846
+ if (unresolvedAssignedTasks.length > 0) {
847
+ const taskList = unresolvedAssignedTasks
848
+ .map(t => `#${t.id} "${t.subject}"`)
849
+ .join(', ')
850
+ notificationMessage += ` ${unresolvedAssignedTasks.length} task(s) were unassigned: ${taskList}. Use TaskList to check availability and TaskUpdate with owner to reassign them to idle teammates.`
851
+ }
852
+
853
+ return {
854
+ unassignedTasks: unresolvedAssignedTasks.map(t => ({
855
+ id: t.id,
856
+ subject: t.subject,
857
+ })),
858
+ notificationMessage,
859
+ }
860
+ }
861
+
862
+ export const DEFAULT_TASKS_MODE_TASK_LIST_ID = 'tasklist'