@iaforged/context-code 2.1.7 → 2.2.4

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 (411) hide show
  1. package/dist/src/Task.js +1 -1
  2. package/dist/src/commands/login/login.js +1 -1
  3. package/dist/src/components/ConsoleOAuthFlow.js +1 -1
  4. package/dist/src/constants/oauth.js +1 -1
  5. package/dist/src/context/mailbox.js +1 -1
  6. package/dist/src/context/voice.js +1 -1
  7. package/dist/src/hooks/useTerminalSize.js +1 -1
  8. package/dist/src/ink/Ansi.js +1 -1
  9. package/dist/src/ink/clearTerminal.js +1 -1
  10. package/dist/src/ink/colorize.js +1 -1
  11. package/dist/src/ink/components/App.js +1 -1
  12. package/dist/src/ink/components/Button.js +1 -1
  13. package/dist/src/ink/components/ClockContext.js +1 -1
  14. package/dist/src/ink/components/CursorDeclarationContext.js +1 -1
  15. package/dist/src/ink/components/Link.js +1 -1
  16. package/dist/src/ink/components/StdinContext.js +1 -1
  17. package/dist/src/ink/components/TerminalFocusContext.js +1 -1
  18. package/dist/src/ink/dom.js +1 -1
  19. package/dist/src/ink/events/keyboard-event.js +1 -1
  20. package/dist/src/ink/hit-test.js +1 -1
  21. package/dist/src/ink/hooks/use-animation-frame.js +1 -1
  22. package/dist/src/ink/hooks/use-app.js +1 -1
  23. package/dist/src/ink/hooks/use-input.js +1 -1
  24. package/dist/src/ink/hooks/use-interval.js +1 -1
  25. package/dist/src/ink/hooks/use-selection.js +1 -1
  26. package/dist/src/ink/hooks/use-tab-status.js +1 -1
  27. package/dist/src/ink/hooks/use-terminal-focus.js +1 -1
  28. package/dist/src/ink/hooks/use-terminal-title.js +1 -1
  29. package/dist/src/ink/hooks/use-terminal-viewport.js +1 -1
  30. package/dist/src/ink/ink.js +1 -1
  31. package/dist/src/ink/layout/yoga.js +1 -1
  32. package/dist/src/ink/line-width-cache.js +1 -1
  33. package/dist/src/ink/log-update.js +1 -1
  34. package/dist/src/ink/measure-text.js +1 -1
  35. package/dist/src/ink/output.js +1 -1
  36. package/dist/src/ink/parse-keypress.js +1 -1
  37. package/dist/src/ink/reconciler.js +1 -1
  38. package/dist/src/ink/render-border.js +1 -1
  39. package/dist/src/ink/render-node-to-output.js +1 -1
  40. package/dist/src/ink/render-to-screen.js +1 -1
  41. package/dist/src/ink/renderer.js +1 -1
  42. package/dist/src/ink/root.js +1 -1
  43. package/dist/src/ink/screen.js +1 -1
  44. package/dist/src/ink/searchHighlight.js +1 -1
  45. package/dist/src/ink/selection.js +1 -1
  46. package/dist/src/ink/squash-text-nodes.js +1 -1
  47. package/dist/src/ink/stringWidth.js +1 -1
  48. package/dist/src/ink/tabstops.js +1 -1
  49. package/dist/src/ink/terminal.js +1 -1
  50. package/dist/src/ink/termio/osc.js +1 -1
  51. package/dist/src/ink/termio/parser.js +1 -1
  52. package/dist/src/ink/termio/tokenize.js +1 -1
  53. package/dist/src/ink/useTerminalNotification.js +1 -1
  54. package/dist/src/ink/warn.js +1 -1
  55. package/dist/src/ink/widest-line.js +1 -1
  56. package/dist/src/ink/wrap-text.js +1 -1
  57. package/dist/src/ink/wrapAnsi.js +1 -1
  58. package/dist/src/native-ts/yoga-layout/index.js +1 -1
  59. package/dist/src/schemas/hooks.js +1 -1
  60. package/dist/src/services/SessionMemory/sessionMemoryUtils.js +1 -1
  61. package/dist/src/services/api/client.js +1 -1
  62. package/dist/src/services/api/dumpPrompts.js +1 -1
  63. package/dist/src/services/api/errorUtils.js +1 -1
  64. package/dist/src/services/api/promptCacheBreakDetection.js +1 -1
  65. package/dist/src/services/api/withRetry.js +1 -1
  66. package/dist/src/services/autoDream/consolidationLock.js +1 -1
  67. package/dist/src/services/mcp/elicitationHandler.js +1 -1
  68. package/dist/src/services/mcp/mcpStringUtils.js +1 -1
  69. package/dist/src/services/mcp/oauthPort.js +1 -1
  70. package/dist/src/services/mcp/vscodeSdkMcp.js +1 -1
  71. package/dist/src/services/oauth/client.js +1 -1
  72. package/dist/src/services/oauth/getOauthProfile.js +1 -1
  73. package/dist/src/services/objetivo/types.js +1 -1
  74. package/dist/src/services/rateLimitMocking.js +1 -1
  75. package/dist/src/services/remoteManagedSettings/syncCacheState.js +1 -1
  76. package/dist/src/skills/bundledSkills.js +1 -1
  77. package/dist/src/tasks/DreamTask/DreamTask.js +1 -1
  78. package/dist/src/tools/AgentTool/agentMemory.js +1 -1
  79. package/dist/src/tools/AgentTool/forkSubagent.js +1 -1
  80. package/dist/src/tools/BashTool/BashToolResultMessage.js +1 -1
  81. package/dist/src/tools/BashTool/UI.js +1 -1
  82. package/dist/src/tools/BashTool/sedEditParser.js +1 -1
  83. package/dist/src/tools/BashTool/utils.js +1 -1
  84. package/dist/src/tools/FileReadTool/imageProcessor.js +1 -1
  85. package/dist/src/tools/FileReadTool/prompt.js +1 -1
  86. package/dist/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +1 -1
  87. package/dist/src/tools/ListMcpResourcesTool/UI.js +1 -1
  88. package/dist/src/tools/MCPTool/MCPTool.js +1 -1
  89. package/dist/src/tools/MCPTool/UI.js +1 -1
  90. package/dist/src/tools/McpAuthTool/McpAuthTool.js +1 -1
  91. package/dist/src/tools/NotebookEditTool/prompt.js +1 -1
  92. package/dist/src/tools/PowerShellTool/PowerShellTool.js +1 -1
  93. package/dist/src/tools/PowerShellTool/UI.js +1 -1
  94. package/dist/src/tools/PowerShellTool/gitSafety.js +1 -1
  95. package/dist/src/tools/PowerShellTool/modeValidation.js +1 -1
  96. package/dist/src/tools/PowerShellTool/pathValidation.js +1 -1
  97. package/dist/src/tools/PowerShellTool/powershellPermissions.js +1 -1
  98. package/dist/src/tools/PowerShellTool/powershellSecurity.js +1 -1
  99. package/dist/src/tools/PowerShellTool/prompt.js +1 -1
  100. package/dist/src/tools/PowerShellTool/readOnlyValidation.js +1 -1
  101. package/dist/src/tools/REPLTool/constants.js +1 -1
  102. package/dist/src/tools/REPLTool/primitiveTools.js +1 -1
  103. package/dist/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +1 -1
  104. package/dist/src/tools/ReadMcpResourceTool/UI.js +1 -1
  105. package/dist/src/tools/ScheduleCronTool/prompt.js +1 -1
  106. package/dist/src/tools/SkillTool/prompt.js +1 -1
  107. package/dist/src/tools/TodoWriteTool/TodoWriteTool.js +1 -1
  108. package/dist/src/tools/ToolSearchTool/prompt.js +1 -1
  109. package/dist/src/tools/WebSearchTool/prompt.js +1 -1
  110. package/dist/src/tools/shared/gitOperationTracking.js +1 -1
  111. package/dist/src/types/permissions.js +1 -1
  112. package/dist/src/utils/Cursor.js +1 -1
  113. package/dist/src/utils/QueryGuard.js +1 -1
  114. package/dist/src/utils/Shell.js +1 -1
  115. package/dist/src/utils/ShellCommand.js +1 -1
  116. package/dist/src/utils/activityManager.js +1 -1
  117. package/dist/src/utils/advisor.js +1 -1
  118. package/dist/src/utils/appleTerminalBackup.js +1 -1
  119. package/dist/src/utils/argumentSubstitution.js +1 -1
  120. package/dist/src/utils/authFileDescriptor.js +1 -1
  121. package/dist/src/utils/autoUpdater.js +1 -1
  122. package/dist/src/utils/background/remote/preconditions.js +1 -1
  123. package/dist/src/utils/background/remote/remoteSession.js +1 -1
  124. package/dist/src/utils/bash/ShellSnapshot.js +1 -1
  125. package/dist/src/utils/bash/ast.js +1 -1
  126. package/dist/src/utils/bash/bashParser.js +1 -1
  127. package/dist/src/utils/bash/bashPipeCommand.js +1 -1
  128. package/dist/src/utils/bash/parser.js +1 -1
  129. package/dist/src/utils/bash/shellQuote.js +1 -1
  130. package/dist/src/utils/bash/shellQuoting.js +1 -1
  131. package/dist/src/utils/billing.js +1 -1
  132. package/dist/src/utils/caCerts.js +1 -1
  133. package/dist/src/utils/claudeInChrome/common.js +1 -1
  134. package/dist/src/utils/claudeInChrome/setupPortable.js +1 -1
  135. package/dist/src/utils/claudemd.js +1 -1
  136. package/dist/src/utils/collapseBackgroundBashNotifications.js +1 -1
  137. package/dist/src/utils/collapseReadSearch.js +1 -1
  138. package/dist/src/utils/completionCache.js +1 -1
  139. package/dist/src/utils/computerUse/common.js +1 -1
  140. package/dist/src/utils/concurrentSessions.js +1 -1
  141. package/dist/src/utils/context.js +1 -1
  142. package/dist/src/utils/cron.js +1 -1
  143. package/dist/src/utils/cronTasks.js +1 -1
  144. package/dist/src/utils/cwd.js +1 -1
  145. package/dist/src/utils/debug.js +1 -1
  146. package/dist/src/utils/debugFilter.js +1 -1
  147. package/dist/src/utils/detectRepository.js +1 -1
  148. package/dist/src/utils/diagLogs.js +1 -1
  149. package/dist/src/utils/diff.js +1 -1
  150. package/dist/src/utils/directMemberMessage.js +1 -1
  151. package/dist/src/utils/doctorDiagnostic.js +1 -1
  152. package/dist/src/utils/dxt/helpers.js +1 -1
  153. package/dist/src/utils/dxt/zip.js +1 -1
  154. package/dist/src/utils/earlyInput.js +1 -1
  155. package/dist/src/utils/editor.js +1 -1
  156. package/dist/src/utils/effort.js +1 -1
  157. package/dist/src/utils/embeddedTools.js +1 -1
  158. package/dist/src/utils/envDynamic.js +1 -1
  159. package/dist/src/utils/envUtils.js +1 -1
  160. package/dist/src/utils/execFileNoThrowPortable.js +1 -1
  161. package/dist/src/utils/execSyncWrapper.js +1 -1
  162. package/dist/src/utils/exportRenderer.js +1 -1
  163. package/dist/src/utils/extraUsage.js +1 -1
  164. package/dist/src/utils/fastMode.js +1 -1
  165. package/dist/src/utils/fileOperationAnalytics.js +1 -1
  166. package/dist/src/utils/fileRead.js +1 -1
  167. package/dist/src/utils/findExecutable.js +1 -1
  168. package/dist/src/utils/format.js +1 -1
  169. package/dist/src/utils/frontmatterParser.js +1 -1
  170. package/dist/src/utils/fsOperations.js +1 -1
  171. package/dist/src/utils/fullscreen.js +1 -1
  172. package/dist/src/utils/genericProcessUtils.js +1 -1
  173. package/dist/src/utils/getWorktreePaths.js +1 -1
  174. package/dist/src/utils/git/gitConfigParser.js +1 -1
  175. package/dist/src/utils/git/gitFilesystem.js +1 -1
  176. package/dist/src/utils/git/gitignore.js +1 -1
  177. package/dist/src/utils/gitDiff.js +1 -1
  178. package/dist/src/utils/gitSettings.js +1 -1
  179. package/dist/src/utils/glob.js +1 -1
  180. package/dist/src/utils/gracefulShutdown.js +1 -1
  181. package/dist/src/utils/groupToolUses.js +1 -1
  182. package/dist/src/utils/handlePromptSubmit.js +1 -1
  183. package/dist/src/utils/hash.js +1 -1
  184. package/dist/src/utils/hooks/fileChangedWatcher.js +1 -1
  185. package/dist/src/utils/hooks/hooksSettings.js +1 -1
  186. package/dist/src/utils/hooks/registerSkillHooks.js +1 -1
  187. package/dist/src/utils/hooks/sessionHooks.js +1 -1
  188. package/dist/src/utils/http.js +1 -1
  189. package/dist/src/utils/hyperlink.js +1 -1
  190. package/dist/src/utils/ide.js +1 -1
  191. package/dist/src/utils/idePathConversion.js +1 -1
  192. package/dist/src/utils/imagePaste.js +1 -1
  193. package/dist/src/utils/imageResizer.js +1 -1
  194. package/dist/src/utils/imageStore.js +1 -1
  195. package/dist/src/utils/inProcessTeammateHelpers.js +1 -1
  196. package/dist/src/utils/ink.js +1 -1
  197. package/dist/src/utils/jetbrains.js +1 -1
  198. package/dist/src/utils/json.js +1 -1
  199. package/dist/src/utils/listSessionsImpl.js +1 -1
  200. package/dist/src/utils/localInstaller.js +1 -1
  201. package/dist/src/utils/lockfile.js +1 -1
  202. package/dist/src/utils/logoV2Utils.js +1 -1
  203. package/dist/src/utils/markdown.js +1 -1
  204. package/dist/src/utils/mcp/dateTimeParser.js +1 -1
  205. package/dist/src/utils/mcpOutputStorage.js +1 -1
  206. package/dist/src/utils/mcpValidation.js +1 -1
  207. package/dist/src/utils/memoize.js +1 -1
  208. package/dist/src/utils/memory/types.js +1 -1
  209. package/dist/src/utils/memoryFileDetection.js +1 -1
  210. package/dist/src/utils/messageQueueManager.js +1 -1
  211. package/dist/src/utils/messages/mappers.js +1 -1
  212. package/dist/src/utils/messages/systemInit.js +1 -1
  213. package/dist/src/utils/model/antModels.js +1 -1
  214. package/dist/src/utils/model/check1mAccess.js +1 -1
  215. package/dist/src/utils/model/contextWindowUpgradeCheck.js +1 -1
  216. package/dist/src/utils/model/model.js +1 -1
  217. package/dist/src/utils/model/modelAllowlist.js +1 -1
  218. package/dist/src/utils/model/modelCapabilities.js +1 -1
  219. package/dist/src/utils/model/modelOptions.js +1 -1
  220. package/dist/src/utils/model/modelStrings.js +1 -1
  221. package/dist/src/utils/model/providerBaseUrls.js +1 -1
  222. package/dist/src/utils/model/providerCatalog.js +1 -1
  223. package/dist/src/utils/model/providerModels.js +1 -1
  224. package/dist/src/utils/model/providerProfiles.js +1 -1
  225. package/dist/src/utils/model/providerProfilesDb.js +1 -1
  226. package/dist/src/utils/model/providerSwitch.js +1 -1
  227. package/dist/src/utils/model/providers.js +1 -1
  228. package/dist/src/utils/modelCost.js +1 -1
  229. package/dist/src/utils/modifiers.js +1 -1
  230. package/dist/src/utils/mtls.js +1 -1
  231. package/dist/src/utils/nativeInstaller/download.js +1 -1
  232. package/dist/src/utils/nativeInstaller/installer.js +1 -1
  233. package/dist/src/utils/nativeInstaller/packageManagers.js +1 -1
  234. package/dist/src/utils/nativeInstaller/pidLock.js +1 -1
  235. package/dist/src/utils/notebook.js +1 -1
  236. package/dist/src/utils/pasteStore.js +1 -1
  237. package/dist/src/utils/path.js +1 -1
  238. package/dist/src/utils/permissions/PermissionMode.js +1 -1
  239. package/dist/src/utils/permissions/PermissionPromptToolResultSchema.js +1 -1
  240. package/dist/src/utils/permissions/PermissionUpdate.js +1 -1
  241. package/dist/src/utils/permissions/PermissionUpdateSchema.js +1 -1
  242. package/dist/src/utils/permissions/autoModeState.js +1 -1
  243. package/dist/src/utils/permissions/bypassPermissionsKillswitch.js +1 -1
  244. package/dist/src/utils/permissions/filesystem.js +1 -1
  245. package/dist/src/utils/permissions/getNextPermissionMode.js +1 -1
  246. package/dist/src/utils/permissions/pathValidation.js +1 -1
  247. package/dist/src/utils/permissions/permissionRuleParser.js +1 -1
  248. package/dist/src/utils/permissions/permissionsDb.js +1 -1
  249. package/dist/src/utils/permissions/permissionsLoader.js +1 -1
  250. package/dist/src/utils/permissions/shellRuleMatching.js +1 -1
  251. package/dist/src/utils/planModeV2.js +1 -1
  252. package/dist/src/utils/plans.js +1 -1
  253. package/dist/src/utils/platform.js +1 -1
  254. package/dist/src/utils/plugins/addDirPluginSettings.js +1 -1
  255. package/dist/src/utils/plugins/cacheUtils.js +1 -1
  256. package/dist/src/utils/plugins/dependencyResolver.js +1 -1
  257. package/dist/src/utils/plugins/fetchTelemetry.js +1 -1
  258. package/dist/src/utils/plugins/gitAvailability.js +1 -1
  259. package/dist/src/utils/plugins/hintRecommendation.js +1 -1
  260. package/dist/src/utils/plugins/installedPluginsManager.js +1 -1
  261. package/dist/src/utils/plugins/loadPluginAgents.js +1 -1
  262. package/dist/src/utils/plugins/loadPluginCommands.js +1 -1
  263. package/dist/src/utils/plugins/loadPluginHooks.js +1 -1
  264. package/dist/src/utils/plugins/loadPluginOutputStyles.js +1 -1
  265. package/dist/src/utils/plugins/lspPluginIntegration.js +1 -1
  266. package/dist/src/utils/plugins/lspRecommendation.js +1 -1
  267. package/dist/src/utils/plugins/managedPlugins.js +1 -1
  268. package/dist/src/utils/plugins/marketplaceHelpers.js +1 -1
  269. package/dist/src/utils/plugins/marketplaceManager.js +1 -1
  270. package/dist/src/utils/plugins/mcpPluginIntegration.js +1 -1
  271. package/dist/src/utils/plugins/mcpbHandler.js +1 -1
  272. package/dist/src/utils/plugins/officialMarketplaceGcs.js +1 -1
  273. package/dist/src/utils/plugins/officialMarketplaceStartupCheck.js +1 -1
  274. package/dist/src/utils/plugins/orphanedPluginFilter.js +1 -1
  275. package/dist/src/utils/plugins/performStartupChecks.js +1 -1
  276. package/dist/src/utils/plugins/pluginAutoupdate.js +1 -1
  277. package/dist/src/utils/plugins/pluginBlocklist.js +1 -1
  278. package/dist/src/utils/plugins/pluginDirectories.js +1 -1
  279. package/dist/src/utils/plugins/pluginFlagging.js +1 -1
  280. package/dist/src/utils/plugins/pluginInstallationHelpers.js +1 -1
  281. package/dist/src/utils/plugins/pluginLoader.js +1 -1
  282. package/dist/src/utils/plugins/pluginOptionsStorage.js +1 -1
  283. package/dist/src/utils/plugins/pluginPolicy.js +1 -1
  284. package/dist/src/utils/plugins/pluginStartupCheck.js +1 -1
  285. package/dist/src/utils/plugins/pluginVersioning.js +1 -1
  286. package/dist/src/utils/plugins/reconciler.js +1 -1
  287. package/dist/src/utils/plugins/refresh.js +1 -1
  288. package/dist/src/utils/plugins/schemas.js +1 -1
  289. package/dist/src/utils/plugins/walkPluginMarkdown.js +1 -1
  290. package/dist/src/utils/plugins/zipCache.js +1 -1
  291. package/dist/src/utils/powershell/parser.js +1 -1
  292. package/dist/src/utils/processUserInput/processBashCommand.js +1 -1
  293. package/dist/src/utils/processUserInput/processSlashCommand.js +1 -1
  294. package/dist/src/utils/processUserInput/processTextPrompt.js +1 -1
  295. package/dist/src/utils/processUserInput/processUserInput.js +1 -1
  296. package/dist/src/utils/profilerBase.js +1 -1
  297. package/dist/src/utils/promptCategory.js +1 -1
  298. package/dist/src/utils/promptEditor.js +1 -1
  299. package/dist/src/utils/promptShellExecution.js +1 -1
  300. package/dist/src/utils/proxy.js +1 -1
  301. package/dist/src/utils/queryHelpers.js +1 -1
  302. package/dist/src/utils/queryProfiler.js +1 -1
  303. package/dist/src/utils/queueProcessor.js +1 -1
  304. package/dist/src/utils/readFileInRange.js +1 -1
  305. package/dist/src/utils/releaseNotes.js +1 -1
  306. package/dist/src/utils/renderOptions.js +1 -1
  307. package/dist/src/utils/ripgrep.js +1 -1
  308. package/dist/src/utils/sandbox/sandbox-adapter.js +1 -1
  309. package/dist/src/utils/sdkEventQueue.js +1 -1
  310. package/dist/src/utils/secureStorage/index.js +1 -1
  311. package/dist/src/utils/secureStorage/macOsKeychainHelpers.js +1 -1
  312. package/dist/src/utils/secureStorage/macOsKeychainStorage.js +1 -1
  313. package/dist/src/utils/secureStorage/plainTextStorage.js +1 -1
  314. package/dist/src/utils/secureStorage/sqliteStorage.js +1 -1
  315. package/dist/src/utils/sessionEnvironment.js +1 -1
  316. package/dist/src/utils/sessionIngressAuth.js +1 -1
  317. package/dist/src/utils/sessionRestore.js +1 -1
  318. package/dist/src/utils/sessionStart.js +1 -1
  319. package/dist/src/utils/sessionTitle.js +1 -1
  320. package/dist/src/utils/settings/managedPath.js +1 -1
  321. package/dist/src/utils/settings/mdm/rawRead.js +1 -1
  322. package/dist/src/utils/settings/mdm/settings.js +1 -1
  323. package/dist/src/utils/settings/permissionValidation.js +1 -1
  324. package/dist/src/utils/settings/pluginOnlyPolicy.js +1 -1
  325. package/dist/src/utils/settings/schemaOutput.js +1 -1
  326. package/dist/src/utils/settings/settings.js +1 -1
  327. package/dist/src/utils/settings/types.js +1 -1
  328. package/dist/src/utils/settings/validateEditTool.js +1 -1
  329. package/dist/src/utils/settings/validation.js +1 -1
  330. package/dist/src/utils/shell/bashProvider.js +1 -1
  331. package/dist/src/utils/shell/powershellDetection.js +1 -1
  332. package/dist/src/utils/shell/powershellProvider.js +1 -1
  333. package/dist/src/utils/shell/readOnlyCommandValidation.js +1 -1
  334. package/dist/src/utils/shell/resolveDefaultShell.js +1 -1
  335. package/dist/src/utils/shell/shellToolUtils.js +1 -1
  336. package/dist/src/utils/shell/specPrefix.js +1 -1
  337. package/dist/src/utils/shellConfig.js +1 -1
  338. package/dist/src/utils/sideQuestion.js +1 -1
  339. package/dist/src/utils/skills/skillChangeDetector.js +1 -1
  340. package/dist/src/utils/slashCommandParsing.js +1 -1
  341. package/dist/src/utils/sliceAnsi.js +1 -1
  342. package/dist/src/utils/slowOperations.js +1 -1
  343. package/dist/src/utils/standaloneAgent.js +1 -1
  344. package/dist/src/utils/startupProfiler.js +1 -1
  345. package/dist/src/utils/staticRender.js +1 -1
  346. package/dist/src/utils/status.js +1 -1
  347. package/dist/src/utils/statusNoticeDefinitions.js +1 -1
  348. package/dist/src/utils/suggestions/commandSuggestions.js +1 -1
  349. package/dist/src/utils/suggestions/directoryCompletion.js +1 -1
  350. package/dist/src/utils/suggestions/shellHistoryCompletion.js +1 -1
  351. package/dist/src/utils/suggestions/skillUsageTracking.js +1 -1
  352. package/dist/src/utils/suggestions/slackChannelSuggestions.js +1 -1
  353. package/dist/src/utils/swarm/backends/detection.js +1 -1
  354. package/dist/src/utils/swarm/permissionSync.js +1 -1
  355. package/dist/src/utils/swarm/reconnection.js +1 -1
  356. package/dist/src/utils/swarm/spawnUtils.js +1 -91
  357. package/dist/src/utils/swarm/teammateInit.js +1 -1
  358. package/dist/src/utils/systemDirectories.js +1 -1
  359. package/dist/src/utils/systemPrompt.js +1 -1
  360. package/dist/src/utils/systemTheme.js +1 -1
  361. package/dist/src/utils/task/TaskOutput.js +1 -1
  362. package/dist/src/utils/task/diskOutput.js +1 -1
  363. package/dist/src/utils/tasks.js +1 -1
  364. package/dist/src/utils/teamDiscovery.js +1 -1
  365. package/dist/src/utils/teamMemoryOps.js +1 -1
  366. package/dist/src/utils/teammateMailbox.js +1 -1
  367. package/dist/src/utils/telemetry/betaSessionTracing.js +1 -1
  368. package/dist/src/utils/telemetry/bigqueryExporter.js +1 -1
  369. package/dist/src/utils/telemetry/events.js +1 -1
  370. package/dist/src/utils/telemetry/instrumentation.js +1 -1
  371. package/dist/src/utils/telemetry/logger.js +1 -1
  372. package/dist/src/utils/telemetry/perfettoTracing.js +1 -1
  373. package/dist/src/utils/telemetry/pluginTelemetry.js +1 -1
  374. package/dist/src/utils/telemetry/sessionTracing.js +1 -1
  375. package/dist/src/utils/telemetryAttributes.js +1 -1
  376. package/dist/src/utils/teleport/api.js +1 -1
  377. package/dist/src/utils/teleport/environments.js +1 -1
  378. package/dist/src/utils/teleport/gitBundle.js +1 -1
  379. package/dist/src/utils/teleport.js +1 -1
  380. package/dist/src/utils/tempfile.js +1 -1
  381. package/dist/src/utils/terminal.js +1 -1
  382. package/dist/src/utils/terminalPanel.js +1 -1
  383. package/dist/src/utils/textHighlighting.js +1 -1
  384. package/dist/src/utils/theme.js +1 -1
  385. package/dist/src/utils/themes/bootstrap.js +1 -1
  386. package/dist/src/utils/themes/loader.js +1 -1
  387. package/dist/src/utils/thinking.js +1 -1
  388. package/dist/src/utils/tmuxSocket.js +1 -1
  389. package/dist/src/utils/tokens.js +1 -1
  390. package/dist/src/utils/toolPool.js +1 -1
  391. package/dist/src/utils/toolResultStorage.js +1 -1
  392. package/dist/src/utils/transcriptSearch.js +1 -1
  393. package/dist/src/utils/truncate.js +1 -1
  394. package/dist/src/utils/ultraplan/keyword.js +1 -1
  395. package/dist/src/utils/unaryLogging.js +1 -1
  396. package/dist/src/utils/undercover.js +1 -1
  397. package/dist/src/utils/user.js +1 -1
  398. package/dist/src/utils/userPromptKeywords.js +1 -1
  399. package/dist/src/utils/which.js +1 -1
  400. package/dist/src/utils/windowsPaths.js +1 -1
  401. package/dist/src/utils/worktree.js +1 -1
  402. package/dist/src/utils/zodToJsonSchema.js +1 -1
  403. package/dist/src/vim/operators.js +1 -1
  404. package/dist/src/vim/textObjects.js +1 -1
  405. package/dist/src/vim/transitions.js +1 -1
  406. package/dist/src/voice/voiceModeEnabled.js +1 -1
  407. package/dist/src/webapp/auth.js +1 -1
  408. package/dist/src/webapp/tunnel.js +1 -1
  409. package/dist/src/whatsapp/bridge.js +1 -1
  410. package/dist/src/whatsapp/mirror.js +1 -1
  411. package/package.json +41 -3
@@ -1 +1 @@
1
- import{jsxs as e}from"react/jsx-runtime";import r from"chalk";import o from"figures";import{color as a,Text as s}from"../ink.js";import{getAccountInformation as t,hasStoredProviderApiKey as i,hasStoredProviderOAuthTokens as n,isClaudeAISubscriber as l}from"./auth.js";import{getLargeMemoryFiles as u,getMemoryFiles as c,MAX_MEMORY_CHARACTER_COUNT as d}from"./claudemd.js";import{getDoctorDiagnostic as p}from"./doctorDiagnostic.js";import{getAWSRegion as m,getDefaultVertexRegion as v,isEnvTruthy as f}from"./envUtils.js";import{getDisplayPath as g}from"./file.js";import{formatNumber as h}from"./format.js";import{getIdeClientName as b,isJetBrainsIde as E,toIDEDisplayName as A}from"./ide.js";import{getClaudeAiUserDefaultModelDescription as S,modelDisplayString as C}from"./model/model.js";import{checkProviderHealth as _}from"./model/providerModels.js";import{getAPIProvider as P,isOllamaCloudProviderConfigured as D,isMiniMaxProviderConfigured as O,isOllamaProviderConfigured as R,isOpenRouterProviderConfigured as y,isZAIProviderConfigured as I}from"./model/providers.js";import{getConfiguredProviderBaseUrl as T}from"./model/providerBaseUrls.js";import{getActiveProviderProfile as L}from"./model/providerProfiles.js";import{getProviderProfilesDbPath as U,getProviderProfilesStorageBackend as x,getProviderProfilesStorageMode as j,getStoredActiveProviderPreference as M}from"./model/providerProfilesDb.js";import{getMTLSConfig as N}from"./mtls.js";import{checkInstall as $}from"./nativeInstaller/index.js";import{getProxyUrl as B}from"./proxy.js";import{SandboxManager as k}from"./sandbox/sandbox-adapter.js";import{getSecureStorage as K}from"./secureStorage/index.js";import{getLegacyCredentialsFilePath as H,getSecureStorageDbPath as F,getSecureStorageKeyPath as z,hasLegacyCredentialsFile as X,isSecureStorageEncrypted as w}from"./secureStorage/sqliteStorage.js";import{getSettingsWithAllErrors as V}from"./settings/allErrors.js";import{getEnabledSettingSources as q,getSettingSourceDisplayNameCapitalized as Y}from"./settings/constants.js";import{getManagedFileSettingsPresence as W,getPolicySettingsOrigin as Z,getSettingsForSource as G}from"./settings/settings.js";export function buildSandboxProperties(){return[{label:"Bash Sandbox",value:k.isSandboxingEnabled()?"Enabled":"Disabled"}]}export function buildIDEProperties(r,t=null,i){const n=r?.find(e=>"ide"===e.name);if(t){const r=A(t.ideType),l=E(t.ideType)?"plugin":"extensión";if(t.error)return[{label:"IDE",value:e(s,{children:[a("error",i)(o.cross)," Error al instalar ",r," ",l,": ",t.error,"\n","Por favor, reinicie su IDE e inténtelo de nuevo."]})}];if(t.installed)return n&&"connected"===n.type?t.installedVersion!==n.serverInfo?.version?[{label:"IDE",value:`Conectado a ${r} (${l}) versión ${t.installedVersion} (versión servidor: ${n.serverInfo?.version})`}]:[{label:"IDE",value:`Conectado a ${r} (${l}) versión ${t.installedVersion}`}]:[{label:"IDE",value:`Instalado ${r} (${l})`}]}else if(n){const e=b(n)??"IDE";return"connected"===n.type?[{label:"IDE",value:`Conectado a la extensión ${e}`}]:[{label:"IDE",value:`${a("error",i)(o.cross)} No conectado a ${e}`}]}return[]}export function buildMcpProperties(e=[],r){const o=e.filter(e=>"ide"!==e.name);if(!o.length)return[];const s={connected:0,pending:0,needsAuth:0,failed:0};for(const e of o)"connected"===e.type?s.connected++:"pending"===e.type?s.pending++:"needs-auth"===e.type?s.needsAuth++:s.failed++;const t=[];return s.connected&&t.push(a("success",r)(`${s.connected} conectados`)),s.needsAuth&&t.push(a("warning",r)(`${s.needsAuth} requieren autenticación`)),s.pending&&t.push(a("inactive",r)(`${s.pending} pendientes`)),s.failed&&t.push(a("error",r)(`${s.failed} fallidos`)),[{label:"Servidores MCP",value:`${t.join(", ")} ${a("inactive",r)("· /mcp")}`}]}export async function buildMemoryDiagnostics(){const e=await c(),r=u(e),o=[];return r.forEach(e=>{const r=g(e.path);o.push(`${r} pesado impactará el rendimiento (${h(e.content.length)} caracteres > ${h(d)})`)}),o}export function buildSettingSourcesProperties(){return[{label:"Fuentes de ajustes",value:q().filter(e=>{const r=G(e);return null!==r&&Object.keys(r).length>0}).map(e=>{if("policySettings"===e){const e=Z();if(null===e)return null;switch(e){case"remote":return"Ajustes corporativos (remoto)";case"plist":return"Ajustes corporativos (plist)";case"hklm":return"Ajustes corporativos (HKLM)";case"file":{const{hasBase:e,hasDropIns:r}=W();return e&&r?"Ajustes corporativos (archivo + complementos)":r?"Ajustes corporativos (complementos)":"Ajustes corporativos (archivo)"}case"hkcu":return"Ajustes corporativos (HKCU)"}}return Y(e)}).filter(e=>null!==e)}]}export async function buildInstallationDiagnostics(){return(await $()).map(e=>e.message)}export async function buildInstallationHealthDiagnostics(){const e=await p(),r=[],{errors:o}=V();if(o.length>0){const e=Array.from(new Set(o.map(e=>e.file))).join(", ");r.push(`Se encontraron archivos de ajustes inválidos: ${e}. Serán ignorados.`)}e.warnings.forEach(e=>{r.push(e.issue)});const a=await async function(){const e=function(){const e=new Set,r=M();y()&&e.add("openrouter"),R()&&e.add("ollama"),D()&&e.add("ollama-cloud"),I()&&e.add("zai"),O()&&e.add("minimax");const o=P();return"openrouter"!==o&&"openrouter"!==r||e.add("openrouter"),"ollama"!==o&&"ollama"!==r||e.add("ollama"),"ollama-cloud"!==o&&"ollama-cloud"!==r||e.add("ollama-cloud"),"zai"!==o&&"zai"!==r||e.add("zai"),"minimax"!==o&&"minimax"!==r||e.add("minimax"),Array.from(e)}();return 0===e.length?[]:(await Promise.all(e.map(e=>_(e)))).map(formatProviderHealthDiagnostic)}();return r.push(...a),!1===e.hasUpdatePermissions&&r.push("Sin permisos de escritura para auto-actualizaciones (requiere sudo)"),r}function formatProviderHealthDiagnostic(e){switch(e.state){case"healthy":return`${e.label}: OK (${e.message})`;case"needs-setup":case"rate-limited":case"unreachable":return`${e.label}: ${e.message}`}}export function buildAccountProperties(){const e=t();if(!e)return[];const r=[];return e.subscription&&r.push({label:"Cuenta",value:`${e.subscription}`}),e.tokenSource&&r.push({label:"Token",value:e.tokenSource}),e.apiKeySource&&r.push({label:"API Key",value:e.apiKeySource}),e.organization&&!process.env.IS_DEMO&&r.push({label:"Organización",value:e.organization}),e.email&&!process.env.IS_DEMO&&r.push({label:"Correo",value:e.email}),r}export function buildAPIProviderProperties(){const e=P(),r=[],o=x(),a=j();if(r.push({label:"Persistencia providers",value:"sqlite"===o?"sqlite-only"===a?"SQLite-only":"SQLite (migracion pendiente)":"Legacy fallback"}),r.push({label:"Provider DB",value:U()}),r.push({label:"Credenciales providers",value:"sqlite"===K().name?"SQLite (cifrado local)":K().name}),"sqlite"===K().name&&(K().read(),r.push({label:"Credenciales DB",value:F()}),r.push({label:"Clave cifrado",value:z()}),r.push({label:"Estado cifrado credenciales",value:w()?"Cifrado activo":"Sin payload o pendiente"}),r.push({label:"Legacy credentials file",value:X()?`Presente (${H()})`:"No presente"})),"firstParty"!==e){const o={bedrock:"AWS Bedrock",vertex:"Google Vertex AI",foundry:"Microsoft Foundry",openai:"OpenAI / Codex",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud",zai:"Z.AI",minimax:"MiniMax"}[e]||e;r.push({label:"Proveedor API",value:o})}if("firstParty"===e){const e=process.env.ANTHROPIC_BASE_URL;e&&r.push({label:"Anthropic base URL",value:e})}else if("bedrock"===e){const e=process.env.BEDROCK_BASE_URL;e&&r.push({label:"Bedrock base URL",value:e}),r.push({label:"AWS region",value:m()}),(f(process.env.CONTEXT_CODE_SKIP_BEDROCK_AUTH)||f(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH))&&r.push({value:"AWS auth skipped"})}else if("vertex"===e){const e=process.env.VERTEX_BASE_URL;e&&r.push({label:"Vertex base URL",value:e});const o=process.env.ANTHROPIC_VERTEX_PROJECT_ID;o&&r.push({label:"GCP project",value:o}),r.push({label:"Default region",value:v()}),(f(process.env.CONTEXT_CODE_SKIP_VERTEX_AUTH)||f(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH))&&r.push({value:"GCP auth skipped"})}else if("foundry"===e){const e=process.env.ANTHROPIC_FOUNDRY_BASE_URL;e&&r.push({label:"Microsoft Foundry base URL",value:e});const o=process.env.ANTHROPIC_FOUNDRY_RESOURCE;o&&r.push({label:"Microsoft Foundry resource",value:o}),(f(process.env.CONTEXT_CODE_SKIP_FOUNDRY_AUTH)||f(process.env.CLAUDE_CODE_SKIP_FOUNDRY_AUTH))&&r.push({value:"Microsoft Foundry auth skipped"})}else if("openai"===e){const e=process.env.OPENAI_BASE_URL;e&&r.push({label:"OpenAI base URL",value:e})}else if("openrouter"===e){const e=process.env.OPENROUTER_BASE_URL||T("openrouter");r.push({label:"OpenRouter base URL",value:e})}else if("ollama"===e){const e=process.env.OLLAMA_BASE_URL||T("ollama");r.push({label:"Ollama base URL",value:e})}else if("ollama-cloud"===e){const e=process.env.OLLAMA_BASE_URL||T("ollama-cloud");r.push({label:"Ollama Cloud base URL",value:e})}else if("zai"===e){const e=process.env.ZAI_BASE_URL||T("zai");r.push({label:"Z.AI base URL",value:e})}else if("minimax"===e){const e=process.env.MINIMAX_BASE_URL||T("minimax");r.push({label:"MiniMax base URL",value:e})}const s=L();if(s&&(s.provider===e||"firstParty"===e&&"claude"===s.provider)&&s){r.push({label:"Perfil activo",value:`${s.name} (${s.agentName})`}),r.push({label:"Modelo guardado",value:s.lastModel||"Sin modelo guardado"});let e="No aplica";"openai"===s.provider?e=n(s.provider,s.id)?"Configuradas":"No configuradas":"openrouter"!==s.provider&&"zai"!==s.provider&&"minimax"!==s.provider||(e=i(s.provider,s.id)?"Configuradas":"No configuradas"),r.push({label:"Credenciales por perfil",value:e})}const t=B();t&&r.push({label:"Proxy",value:t});const l=N();if(process.env.NODE_EXTRA_CA_CERTS&&r.push({label:"Additional CA cert(s)",value:process.env.NODE_EXTRA_CA_CERTS}),l){const e=process.env.CONTEXT_CODE_CLIENT_CERT??process.env.CLAUDE_CODE_CLIENT_CERT;l.cert&&e&&r.push({label:"mTLS client cert",value:e});const o=process.env.CONTEXT_CODE_CLIENT_KEY??process.env.CLAUDE_CODE_CLIENT_KEY;l.key&&o&&r.push({label:"mTLS client key",value:o})}return r}export function getModelDisplayLabel(e){let o=C(e);if(null===e&&l()){const e=S();o=`${r.bold("Default")} ${e}`}return o}
1
+ import{jsxs as e}from"react/jsx-runtime";import o from"chalk";import r from"figures";import{color as s,Text as a}from"../ink.js";import{getAccountInformation as n,hasStoredProviderApiKey as l,hasStoredProviderOAuthTokens as t,isClaudeAISubscriber as i}from"./auth.js";import{getLargeMemoryFiles as u,getMemoryFiles as c,MAX_MEMORY_CHARACTER_COUNT as p}from"./claudemd.js";import{getDoctorDiagnostic as d}from"./doctorDiagnostic.js";import{getAWSRegion as m,getDefaultVertexRegion as v,isEnvTruthy as f}from"./envUtils.js";import{getDisplayPath as h}from"./file.js";import{formatNumber as b}from"./format.js";import{getIdeClientName as E,isJetBrainsIde as _,toIDEDisplayName as A}from"./ide.js";import{getClaudeAiUserDefaultModelDescription as C,modelDisplayString as g}from"./model/model.js";import{checkProviderHealth as D}from"./model/providerModels.js";import{getAPIProvider as S,isOllamaCloudProviderConfigured as O,isMiniMaxProviderConfigured as R,isOllamaProviderConfigured as I,isOpenRouterProviderConfigured as L,isZAIProviderConfigured as P}from"./model/providers.js";import{getConfiguredProviderBaseUrl as T}from"./model/providerBaseUrls.js";import{getActiveProviderProfile as U}from"./model/providerProfiles.js";import{getProviderProfilesDbPath as y,getProviderProfilesStorageBackend as j,getProviderProfilesStorageMode as x,getStoredActiveProviderPreference as $}from"./model/providerProfilesDb.js";import{getMTLSConfig as N}from"./mtls.js";import{checkInstall as M}from"./nativeInstaller/index.js";import{getProxyUrl as B}from"./proxy.js";import{SandboxManager as k}from"./sandbox/sandbox-adapter.js";import{getSecureStorage as K}from"./secureStorage/index.js";import{getLegacyCredentialsFilePath as H,getSecureStorageDbPath as z,getSecureStorageKeyPath as X,hasLegacyCredentialsFile as w,isSecureStorageEncrypted as F}from"./secureStorage/sqliteStorage.js";import{getSettingsWithAllErrors as V}from"./settings/allErrors.js";import{getEnabledSettingSources as q,getSettingSourceDisplayNameCapitalized as Y}from"./settings/constants.js";import{getManagedFileSettingsPresence as G,getPolicySettingsOrigin as Q,getSettingsForSource as W}from"./settings/settings.js";export function buildSandboxProperties(){return[{label:"Bash Sandbox",value:k.isSandboxingEnabled()?"Enabled":"Disabled"}]}export function buildIDEProperties(o,n=null,l){const t=o?.find(e=>"ide"===e.name);if(n){const o=A(n.ideType),i=_(n.ideType)?"plugin":"extensión";if(n.error)return[{label:"IDE",value:e(a,{children:[s("error",l)(r.cross)," Error al instalar ",o," ",i,": ",n.error,"\n","Por favor, reinicie su IDE e inténtelo de nuevo."]})}];if(n.installed)return t&&"connected"===t.type?n.installedVersion!==t.serverInfo?.version?[{label:"IDE",value:`Conectado a ${o} (${i}) versión ${n.installedVersion} (versión servidor: ${t.serverInfo?.version})`}]:[{label:"IDE",value:`Conectado a ${o} (${i}) versión ${n.installedVersion}`}]:[{label:"IDE",value:`Instalado ${o} (${i})`}]}else if(t){const e=E(t)??"IDE";return"connected"===t.type?[{label:"IDE",value:`Conectado a la extensión ${e}`}]:[{label:"IDE",value:`${s("error",l)(r.cross)} No conectado a ${e}`}]}return[]}export function buildMcpProperties(e=[],o){const r=e.filter(e=>"ide"!==e.name);if(!r.length)return[];const a={connected:0,pending:0,needsAuth:0,failed:0};for(const e of r)"connected"===e.type?a.connected++:"pending"===e.type?a.pending++:"needs-auth"===e.type?a.needsAuth++:a.failed++;const n=[];return a.connected&&n.push(s("success",o)(`${a.connected} conectados`)),a.needsAuth&&n.push(s("warning",o)(`${a.needsAuth} requieren autenticación`)),a.pending&&n.push(s("inactive",o)(`${a.pending} pendientes`)),a.failed&&n.push(s("error",o)(`${a.failed} fallidos`)),[{label:"Servidores MCP",value:`${n.join(", ")} ${s("inactive",o)("· /mcp")}`}]}export async function buildMemoryDiagnostics(){const e=await c(),o=u(e),r=[];return o.forEach(e=>{const o=h(e.path);r.push(`${o} pesado impactará el rendimiento (${b(e.content.length)} caracteres > ${b(p)})`)}),r}export function buildSettingSourcesProperties(){return[{label:"Fuentes de ajustes",value:q().filter(e=>{const o=W(e);return null!==o&&Object.keys(o).length>0}).map(e=>{if("policySettings"===e){const e=Q();if(null===e)return null;switch(e){case"remote":return"Ajustes corporativos (remoto)";case"plist":return"Ajustes corporativos (plist)";case"hklm":return"Ajustes corporativos (HKLM)";case"file":{const{hasBase:e,hasDropIns:o}=G();return e&&o?"Ajustes corporativos (archivo + complementos)":o?"Ajustes corporativos (complementos)":"Ajustes corporativos (archivo)"}case"hkcu":return"Ajustes corporativos (HKCU)"}}return Y(e)}).filter(e=>null!==e)}]}export async function buildInstallationDiagnostics(){return(await M()).map(e=>e.message)}export async function buildInstallationHealthDiagnostics(){const e=await d(),o=[],{errors:r}=V();if(r.length>0){const e=Array.from(new Set(r.map(e=>e.file))).join(", ");o.push(`Se encontraron archivos de ajustes inválidos: ${e}. Serán ignorados.`)}e.warnings.forEach(e=>{o.push(e.issue)});const s=await async function(){const e=function(){const e=new Set,o=$();L()&&e.add("openrouter");I()&&e.add("ollama");O()&&e.add("ollama-cloud");P()&&e.add("zai");R()&&e.add("minimax");const r=S();"openrouter"!==r&&"openrouter"!==o||e.add("openrouter");"ollama"!==r&&"ollama"!==o||e.add("ollama");"ollama-cloud"!==r&&"ollama-cloud"!==o||e.add("ollama-cloud");"zai"!==r&&"zai"!==o||e.add("zai");"minimax"!==r&&"minimax"!==o||e.add("minimax");return Array.from(e)}();if(0===e.length)return[];return(await Promise.all(e.map(e=>D(e)))).map(formatProviderHealthDiagnostic)}();return o.push(...s),!1===e.hasUpdatePermissions&&o.push("Sin permisos de escritura para auto-actualizaciones (requiere sudo)"),o}function formatProviderHealthDiagnostic(e){switch(e.state){case"healthy":return`${e.label}: OK (${e.message})`;case"needs-setup":case"rate-limited":case"unreachable":return`${e.label}: ${e.message}`}}export function buildAccountProperties(){const e=n();if(!e)return[];const o=[];return e.subscription&&o.push({label:"Cuenta",value:`${e.subscription}`}),e.tokenSource&&o.push({label:"Token",value:e.tokenSource}),e.apiKeySource&&o.push({label:"API Key",value:e.apiKeySource}),e.organization&&!process.env.IS_DEMO&&o.push({label:"Organización",value:e.organization}),e.email&&!process.env.IS_DEMO&&o.push({label:"Correo",value:e.email}),o}export function buildAPIProviderProperties(){const e=S(),o=[],r=j(),s=x();if(o.push({label:"Persistencia providers",value:"sqlite"===r?"sqlite-only"===s?"SQLite-only":"SQLite (migracion pendiente)":"Legacy fallback"}),o.push({label:"Provider DB",value:y()}),o.push({label:"Credenciales providers",value:"sqlite"===K().name?"SQLite (cifrado local)":K().name}),"sqlite"===K().name&&(K().read(),o.push({label:"Credenciales DB",value:z()}),o.push({label:"Clave cifrado",value:X()}),o.push({label:"Estado cifrado credenciales",value:F()?"Cifrado activo":"Sin payload o pendiente"}),o.push({label:"Legacy credentials file",value:w()?`Presente (${H()})`:"No presente"})),"firstParty"!==e){const r={bedrock:"AWS Bedrock",vertex:"Google Vertex AI",foundry:"Microsoft Foundry",openai:"OpenAI / Codex",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud",zai:"Z.AI",minimax:"MiniMax"}[e]||e;o.push({label:"Proveedor API",value:r})}if("firstParty"===e){const e=process.env.ANTHROPIC_BASE_URL;e&&o.push({label:"Anthropic base URL",value:e})}else if("bedrock"===e){const e=process.env.BEDROCK_BASE_URL;e&&o.push({label:"Bedrock base URL",value:e}),o.push({label:"AWS region",value:m()}),(f(process.env.CONTEXT_CODE_SKIP_BEDROCK_AUTH)||f(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH))&&o.push({value:"AWS auth skipped"})}else if("vertex"===e){const e=process.env.VERTEX_BASE_URL;e&&o.push({label:"Vertex base URL",value:e});const r=process.env.ANTHROPIC_VERTEX_PROJECT_ID;r&&o.push({label:"GCP project",value:r}),o.push({label:"Default region",value:v()}),(f(process.env.CONTEXT_CODE_SKIP_VERTEX_AUTH)||f(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH))&&o.push({value:"GCP auth skipped"})}else if("foundry"===e){const e=process.env.ANTHROPIC_FOUNDRY_BASE_URL;e&&o.push({label:"Microsoft Foundry base URL",value:e});const r=process.env.ANTHROPIC_FOUNDRY_RESOURCE;r&&o.push({label:"Microsoft Foundry resource",value:r}),(f(process.env.CONTEXT_CODE_SKIP_FOUNDRY_AUTH)||f(process.env.CLAUDE_CODE_SKIP_FOUNDRY_AUTH))&&o.push({value:"Microsoft Foundry auth skipped"})}else if("openai"===e){const e=process.env.OPENAI_BASE_URL;e&&o.push({label:"OpenAI base URL",value:e})}else if("openrouter"===e){const e=process.env.OPENROUTER_BASE_URL||T("openrouter");o.push({label:"OpenRouter base URL",value:e})}else if("ollama"===e){const e=process.env.OLLAMA_BASE_URL||T("ollama");o.push({label:"Ollama base URL",value:e})}else if("ollama-cloud"===e){const e=process.env.OLLAMA_BASE_URL||T("ollama-cloud");o.push({label:"Ollama Cloud base URL",value:e})}else if("zai"===e){const e=process.env.ZAI_BASE_URL||T("zai");o.push({label:"Z.AI base URL",value:e})}else if("minimax"===e){const e=process.env.MINIMAX_BASE_URL||T("minimax");o.push({label:"MiniMax base URL",value:e})}const a=U();if(a&&(a.provider===e||"firstParty"===e&&"claude"===a.provider)&&a){o.push({label:"Perfil activo",value:`${a.name} (${a.agentName})`}),o.push({label:"Modelo guardado",value:a.lastModel||"Sin modelo guardado"});let e="No aplica";"openai"===a.provider?e=t(a.provider,a.id)?"Configuradas":"No configuradas":"openrouter"!==a.provider&&"zai"!==a.provider&&"minimax"!==a.provider||(e=l(a.provider,a.id)?"Configuradas":"No configuradas"),o.push({label:"Credenciales por perfil",value:e})}const n=B();n&&o.push({label:"Proxy",value:n});const i=N();if(process.env.NODE_EXTRA_CA_CERTS&&o.push({label:"Additional CA cert(s)",value:process.env.NODE_EXTRA_CA_CERTS}),i){const e=process.env.CONTEXT_CODE_CLIENT_CERT??process.env.CLAUDE_CODE_CLIENT_CERT;i.cert&&e&&o.push({label:"mTLS client cert",value:e});const r=process.env.CONTEXT_CODE_CLIENT_KEY??process.env.CLAUDE_CODE_CLIENT_KEY;i.key&&r&&o.push({label:"mTLS client key",value:r})}return o}export function getModelDisplayLabel(e){let r=g(e);if(null===e&&i()){const e=C();r=`${o.bold("Default")} ${e}`}return r}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r,Fragment as i}from"react/jsx-runtime";import{Box as n,Text as o}from"../ink.js";import{getLargeMemoryFiles as a,MAX_MEMORY_CHARACTER_COUNT as t}from"./claudemd.js";import c from"figures";import{getCwd as s}from"./cwd.js";import{relative as l}from"path";import{formatNumber as d}from"./format.js";import{getAnthropicApiKeyWithSource as u,getApiKeyFromConfigOrMacOSKeychain as p,getAuthTokenSource as g,isClaudeAISubscriber as m}from"./auth.js";import{getAgentDescriptionsTotalTokens as h,AGENT_DESCRIPTIONS_THRESHOLD as f}from"./statusNoticeHelpers.js";import{isSupportedJetBrainsTerminal as y,toIDEDisplayName as A,getTerminalIdeType as w}from"./ide.js";import{isJetBrainsPluginInstalledCachedSync as v}from"./jetbrains.js";const D={id:"large-memory-files",type:"warning",isActive:e=>a(e.memoryFiles).length>0,render:u=>{const p=a(u.memoryFiles);return e(i,{children:p.map(i=>{const a=i.path.startsWith(s())?l(s(),i.path):i.path;return r(n,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["El archivo grande ",e(o,{bold:!0,children:a})," afectará el rendimiento (",d(i.content.length)," caracteres >"," ",d(t),")",e(o,{dimColor:!0,children:" · /memory para editar"})]})]},i.path)})})}},K={id:"claude-ai-external-token",type:"warning",isActive:()=>{const e=g();return m()&&("ANTHROPIC_AUTH_TOKEN"===e.source||"apiKeyHelper"===e.source)},render:()=>{const i=g();return r(n,{flexDirection:"row",marginTop:1,children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Usando ",i.source," en lugar del token de suscripción de la cuenta de Claude. Desactiva ",i.source," o ejecuta `claude /logout`."]})]})}},T={id:"api-key-conflict",type:"warning",isActive:()=>{const{source:e}=u({skipRetrievingKeyFromApiKeyHelper:!0});return!!p()&&("ANTHROPIC_API_KEY"===e||"apiKeyHelper"===e)},render:()=>{const{source:i}=u({skipRetrievingKeyFromApiKeyHelper:!0});return r(n,{flexDirection:"row",marginTop:1,children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Usando ",i," en lugar de la clave de Anthropic Console. Desactiva ",i," o ejecuta `claude /logout`."]})]})}},I={id:"both-auth-methods",type:"warning",isActive:()=>{const{source:e}=u({skipRetrievingKeyFromApiKeyHelper:!0}),r=g();return"none"!==e&&"none"!==r.source&&!("apiKeyHelper"===e&&"apiKeyHelper"===r.source)},render:()=>{const{source:i}=u({skipRetrievingKeyFromApiKeyHelper:!0}),a=g();return r(n,{flexDirection:"column",marginTop:1,children:[r(n,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Se han establecido tanto un token (",a.source,") como una clave de API (",i,"). Esto puede causar un comportamiento inesperado."]})]}),r(n,{flexDirection:"column",marginLeft:3,children:[r(o,{color:"warning",children:["· ¿Intentas usar"," ","claude.ai"===a.source?"claude.ai":a.source,"?"," ","ANTHROPIC_API_KEY"===i?'Desactiva la variable de entorno ANTHROPIC_API_KEY, o ejecuta claude /logout y selecciona "No" en la aprobación de la clave API antes de iniciar sesión.':"apiKeyHelper"===i?"Desactiva el ajuste apiKeyHelper.":"claude /logout"]}),r(o,{color:"warning",children:["· ¿Intentas usar ",i,"?"," ","claude.ai"===a.source?"claude /logout para cerrar sesión en claude.ai.":`Desactiva la variable de entorno ${a.source}.`]})]})]})}},C={id:"large-agent-descriptions",type:"warning",isActive:e=>h(e.agentDefinitions)>f,render:i=>{const a=h(i.agentDefinitions);return r(n,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Las descripciones acumuladas de los agentes afectarán el rendimiento (~",d(a)," tokens >"," ",d(f),")",e(o,{dimColor:!0,children:" · /agents para gestionar"})]})]})}},H={id:"jetbrains-plugin-install",type:"info",isActive:e=>{if(!y())return!1;if(!(e.config.autoInstallIdeExtension??1))return!1;const r=w();return null!==r&&!v(r)},render:()=>{const i=w(),a=A(i);return r(n,{flexDirection:"row",gap:1,marginLeft:1,children:[e(o,{color:"ide",children:c.arrowUp}),r(o,{children:["Instala el complemento ",e(o,{color:"ide",children:a})," desde el Marketplace de JetBrains:"," ",e(o,{bold:!0,children:"https://docs.claude.com/s/claude-code-jetbrains"})]})]})}};export const statusNoticeDefinitions=[D,C,K,T,I,H];export function getActiveNotices(e){return statusNoticeDefinitions.filter(r=>r.isActive(e))}
1
+ import{jsx as e,jsxs as r,Fragment as n}from"react/jsx-runtime";import{Box as i,Text as o}from"../ink.js";import{getLargeMemoryFiles as t,MAX_MEMORY_CHARACTER_COUNT as a}from"./claudemd.js";import c from"figures";import{getCwd as l}from"./cwd.js";import{relative as s}from"path";import{formatNumber as d}from"./format.js";import{getAnthropicApiKeyWithSource as u,getApiKeyFromConfigOrMacOSKeychain as p,getAuthTokenSource as m,isClaudeAISubscriber as g}from"./auth.js";import{getAgentDescriptionsTotalTokens as h,AGENT_DESCRIPTIONS_THRESHOLD as f}from"./statusNoticeHelpers.js";import{isSupportedJetBrainsTerminal as w,toIDEDisplayName as y,getTerminalIdeType as v}from"./ide.js";import{isJetBrainsPluginInstalledCachedSync as A}from"./jetbrains.js";const j={id:"large-memory-files",type:"warning",isActive:e=>t(e.memoryFiles).length>0,render:u=>{const p=t(u.memoryFiles);return e(n,{children:p.map(n=>{const t=n.path.startsWith(l())?s(l(),n.path):n.path;return r(i,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["El archivo grande ",e(o,{bold:!0,children:t})," afectará el rendimiento (",d(n.content.length)," caracteres >"," ",d(a),")",e(o,{dimColor:!0,children:" · /memory para editar"})]})]},n.path)})})}},K={id:"claude-ai-external-token",type:"warning",isActive:()=>{const e=m();return g()&&("ANTHROPIC_AUTH_TOKEN"===e.source||"apiKeyHelper"===e.source)},render:()=>{const n=m();return r(i,{flexDirection:"row",marginTop:1,children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Usando ",n.source," en lugar del token de suscripción de la cuenta de Claude. Desactiva ",n.source," o ejecuta `claude /logout`."]})]})}},D={id:"api-key-conflict",type:"warning",isActive:()=>{const{source:e}=u({skipRetrievingKeyFromApiKeyHelper:!0});return!!p()&&("ANTHROPIC_API_KEY"===e||"apiKeyHelper"===e)},render:()=>{const{source:n}=u({skipRetrievingKeyFromApiKeyHelper:!0});return r(i,{flexDirection:"row",marginTop:1,children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Usando ",n," en lugar de la clave de Anthropic Console. Desactiva ",n," o ejecuta `claude /logout`."]})]})}},H={id:"both-auth-methods",type:"warning",isActive:()=>{const{source:e}=u({skipRetrievingKeyFromApiKeyHelper:!0}),r=m();return"none"!==e&&"none"!==r.source&&!("apiKeyHelper"===e&&"apiKeyHelper"===r.source)},render:()=>{const{source:n}=u({skipRetrievingKeyFromApiKeyHelper:!0}),t=m();return r(i,{flexDirection:"column",marginTop:1,children:[r(i,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Conflicto de autenticación: Se han establecido tanto un token (",t.source,") como una clave de API (",n,"). Esto puede causar un comportamiento inesperado."]})]}),r(i,{flexDirection:"column",marginLeft:3,children:[r(o,{color:"warning",children:["· ¿Intentas usar"," ","claude.ai"===t.source?"claude.ai":t.source,"?"," ","ANTHROPIC_API_KEY"===n?'Desactiva la variable de entorno ANTHROPIC_API_KEY, o ejecuta claude /logout y selecciona "No" en la aprobación de la clave API antes de iniciar sesión.':"apiKeyHelper"===n?"Desactiva el ajuste apiKeyHelper.":"claude /logout"]}),r(o,{color:"warning",children:["· ¿Intentas usar ",n,"?"," ","claude.ai"===t.source?"claude /logout para cerrar sesión en claude.ai.":`Desactiva la variable de entorno ${t.source}.`]})]})]})}},x={id:"large-agent-descriptions",type:"warning",isActive:e=>h(e.agentDefinitions)>f,render:n=>{const t=h(n.agentDefinitions);return r(i,{flexDirection:"row",children:[e(o,{color:"warning",children:c.warning}),r(o,{color:"warning",children:["Las descripciones acumuladas de los agentes afectarán el rendimiento (~",d(t)," tokens >"," ",d(f),")",e(o,{dimColor:!0,children:" · /agents para gestionar"})]})]})}},I={id:"jetbrains-plugin-install",type:"info",isActive:e=>{if(!w())return!1;if(!(e.config.autoInstallIdeExtension??!0))return!1;const r=v();return null!==r&&!A(r)},render:()=>{const n=v(),t=y(n);return r(i,{flexDirection:"row",gap:1,marginLeft:1,children:[e(o,{color:"ide",children:c.arrowUp}),r(o,{children:["Instala el complemento ",e(o,{color:"ide",children:t})," desde el Marketplace de JetBrains:"," ",e(o,{bold:!0,children:"https://docs.claude.com/s/claude-code-jetbrains"})]})]})}};export const statusNoticeDefinitions=[j,x,K,D,H,I];export function getActiveNotices(e){return statusNoticeDefinitions.filter(r=>r.isActive(e))}
@@ -1 +1 @@
1
- import t from"fuse.js";import{formatDescriptionWithSource as e,getCommand as n,getCommandName as o}from"../../commands.js";import{getSkillUsageScore as r}from"./skillUsageTracking.js";const s=/[:_-]/g;let a=null;function isCommandMetadata(t){return"object"==typeof t&&null!==t&&"name"in t&&"string"==typeof t.name&&"type"in t}export function findMidInputSlashCommand(t,e){if(t.startsWith("/"))return null;const n=t.slice(0,e).match(/\s\/([a-zA-Z0-9_:-]*)$/);if(!n||void 0===n.index)return null;const o=n.index+1,r=t.slice(o+1).match(/^[a-zA-Z0-9_:-]*/),s=r?r[0]:"";return e>o+1+s.length?null:{token:"/"+s,startPos:o,partialCommand:s}}export function getBestCommandMatch(t,e){if(!t)return null;const n=generateCommandSuggestions("/"+t,e);if(0===n.length)return null;const r=t.toLowerCase();for(const e of n){if(!isCommandMetadata(e.metadata))continue;const n=o(e.metadata);if(n.toLowerCase().startsWith(r)){const e=n.slice(t.length);if(e)return{suffix:e,fullCommand:n}}}return null}export function isCommandInput(t){return t.startsWith("/")}export function hasCommandArgs(t){return!!isCommandInput(t)&&!!t.includes(" ")&&!t.endsWith(" ")}export function formatCommand(t){return`/${t} `}function getCommandId(t){const e=o(t);return"prompt"===t.type?"plugin"===t.source&&t.pluginInfo?.repository?`${e}:${t.source}:${t.pluginInfo.repository}`:`${e}:${t.source}`:`${e}:${t.type}`}function createCommandSuggestionItem(t,n){const r=o(t),s=n?` (${n})`:"",a="prompt"===t.type&&"workflow"===t.kind,i=(a?t.description:e(t))+("prompt"===t.type&&t.argNames?.length?` (arguments: ${t.argNames.join(", ")})`:"");return{id:getCommandId(t),displayText:`/${r}${s}`,tag:a?"workflow":void 0,description:i,metadata:t}}export function generateCommandSuggestions(e,n){if(!isCommandInput(e))return[];if(hasCommandArgs(e))return[];const i=e.slice(1).toLowerCase().trim();if(""===i){const t=n.filter(t=>!t.isHidden),e=[],s=t.filter(t=>"prompt"===t.type).map(t=>({cmd:t,score:r(o(t))})).filter(t=>t.score>0).sort((t,e)=>e.score-t.score);for(const t of s.slice(0,5))e.push(t.cmd);const a=new Set(e.map(t=>getCommandId(t))),i=[],m=[],c=[],u=[],l=[];t.forEach(t=>{a.has(getCommandId(t))||("local"===t.type||"local-jsx"===t.type?i.push(t):"prompt"!==t.type||"userSettings"!==t.source&&"localSettings"!==t.source?"prompt"===t.type&&"projectSettings"===t.source?c.push(t):"prompt"===t.type&&"policySettings"===t.source?u.push(t):l.push(t):m.push(t))});const sortAlphabetically=(t,e)=>o(t).localeCompare(o(e));return i.sort(sortAlphabetically),m.sort(sortAlphabetically),c.sort(sortAlphabetically),u.sort(sortAlphabetically),l.sort(sortAlphabetically),[...e,...i,...m,...c,...u,...l].map(t=>createCommandSuggestionItem(t))}let m=n.find(t=>t&&t.isHidden&&o(t)?.toLowerCase()===i);m&&n.some(t=>t&&!t.isHidden&&o(t)?.toLowerCase()===i)&&(m=void 0);const c=function(e){if(a?.commands===e)return a.fuse;const n=e.filter(t=>t&&!t.isHidden&&o(t)).map(t=>{const e=o(t),n=e.split(s).filter(Boolean);return{descriptionKey:(t.description??"").split(" ").map(t=>function(t){return t.toLowerCase().replace(/[^a-z0-9]/g,"")}(t)).filter(Boolean),partKey:n.length>1?n:void 0,commandName:e,command:t,aliasKey:t.aliases}}),r=new t(n,{includeScore:!0,threshold:.3,location:0,distance:100,keys:[{name:"commandName",weight:3},{name:"partKey",weight:2},{name:"aliasKey",weight:2},{name:"descriptionKey",weight:.5}]});return a={commands:e,fuse:r},r}(n),u=c.search(i).map(t=>{const e=(t.item.commandName||"").toLowerCase(),n=t.item.command?.aliases?.map(t=>t?.toLowerCase()).filter(t=>!!t)??[];return{r:t,name:e,aliases:n,usage:"prompt"===t.item.command?.type?r(o(t.item.command)):0}}).sort((t,e)=>{const n=t.name,o=e.name,r=t.aliases,s=e.aliases,a=n===i,m=o===i;if(a&&!m)return-1;if(m&&!a)return 1;const c=r.some(t=>t===i),u=s.some(t=>t===i);if(c&&!u)return-1;if(u&&!c)return 1;const l=n.startsWith(i),d=o.startsWith(i);if(l&&!d)return-1;if(d&&!l)return 1;if(l&&d&&n.length!==o.length)return n.length-o.length;const p=r.find(t=>t.startsWith(i)),f=s.find(t=>t.startsWith(i));if(p&&!f)return-1;if(f&&!p)return 1;if(p&&f&&p.length!==f.length)return p.length-f.length;const g=(t.r.score??0)-(e.r.score??0);return Math.abs(g)>.1?g:e.usage-t.usage}).map(t=>{const e=t.r.item.command,n=function(t,e){if(e&&0!==e.length&&""!==t)return e.find(e=>e.toLowerCase().startsWith(t))}(i,e.aliases);return createCommandSuggestionItem(e,n)});if(m){const t=getCommandId(m);if(!u.some(e=>e.id===t))return[createCommandSuggestionItem(m),...u]}return u}export function applyCommandSuggestion(t,e,r,s,a,i){let m,c;if("string"==typeof t)m=t,c=e?n(m,r):void 0;else{if(!isCommandMetadata(t.metadata))return;m=o(t.metadata),c=t.metadata}const u=formatCommand(m);s(u),a(u.length),e&&c&&("prompt"===c.type&&0!==(c.argNames??[]).length||i(u,!0))}export function findSlashCommandPositions(t){const e=[],n=/(^|[\s])(\/[a-zA-Z][a-zA-Z0-9:\-_]*)/g;let o=null;for(;null!==(o=n.exec(t));){const t=o[1]??"",n=o[2]??"",r=o.index+t.length;e.push({start:r,end:r+n.length})}return e}
1
+ import t from"fuse.js";import{formatDescriptionWithSource as e,getCommand as n,getCommandName as o}from"../../commands.js";import{getSkillUsageScore as r}from"./skillUsageTracking.js";const s=/[:_-]/g;let a=null;function isCommandMetadata(t){return"object"==typeof t&&null!==t&&"name"in t&&"string"==typeof t.name&&"type"in t}export function findMidInputSlashCommand(t,e){if(t.startsWith("/"))return null;const n=t.slice(0,e).match(/\s\/([a-zA-Z0-9_:-]*)$/);if(!n||void 0===n.index)return null;const o=n.index+1,r=t.slice(o+1).match(/^[a-zA-Z0-9_:-]*/),s=r?r[0]:"";return e>o+1+s.length?null:{token:"/"+s,startPos:o,partialCommand:s}}export function getBestCommandMatch(t,e){if(!t)return null;const n=generateCommandSuggestions("/"+t,e);if(0===n.length)return null;const r=t.toLowerCase();for(const e of n){if(!isCommandMetadata(e.metadata))continue;const n=o(e.metadata);if(n.toLowerCase().startsWith(r)){const e=n.slice(t.length);if(e)return{suffix:e,fullCommand:n}}}return null}export function isCommandInput(t){return t.startsWith("/")}export function hasCommandArgs(t){return!!isCommandInput(t)&&(!!t.includes(" ")&&!t.endsWith(" "))}export function formatCommand(t){return`/${t} `}function getCommandId(t){const e=o(t);return"prompt"===t.type?"plugin"===t.source&&t.pluginInfo?.repository?`${e}:${t.source}:${t.pluginInfo.repository}`:`${e}:${t.source}`:`${e}:${t.type}`}function createCommandSuggestionItem(t,n){const r=o(t),s=n?` (${n})`:"",a="prompt"===t.type&&"workflow"===t.kind,i=(a?t.description:e(t))+("prompt"===t.type&&t.argNames?.length?` (arguments: ${t.argNames.join(", ")})`:"");return{id:getCommandId(t),displayText:`/${r}${s}`,tag:a?"workflow":void 0,description:i,metadata:t}}export function generateCommandSuggestions(e,n){if(!isCommandInput(e))return[];if(hasCommandArgs(e))return[];const i=e.slice(1).toLowerCase().trim();if(""===i){const t=n.filter(t=>!t.isHidden),e=[],s=t.filter(t=>"prompt"===t.type).map(t=>({cmd:t,score:r(o(t))})).filter(t=>t.score>0).sort((t,e)=>e.score-t.score);for(const t of s.slice(0,5))e.push(t.cmd);const a=new Set(e.map(t=>getCommandId(t))),i=[],m=[],c=[],u=[],l=[];t.forEach(t=>{a.has(getCommandId(t))||("local"===t.type||"local-jsx"===t.type?i.push(t):"prompt"!==t.type||"userSettings"!==t.source&&"localSettings"!==t.source?"prompt"===t.type&&"projectSettings"===t.source?c.push(t):"prompt"===t.type&&"policySettings"===t.source?u.push(t):l.push(t):m.push(t))});const sortAlphabetically=(t,e)=>o(t).localeCompare(o(e));return i.sort(sortAlphabetically),m.sort(sortAlphabetically),c.sort(sortAlphabetically),u.sort(sortAlphabetically),l.sort(sortAlphabetically),[...e,...i,...m,...c,...u,...l].map(t=>createCommandSuggestionItem(t))}let m=n.find(t=>t&&t.isHidden&&o(t)?.toLowerCase()===i);m&&n.some(t=>t&&!t.isHidden&&o(t)?.toLowerCase()===i)&&(m=void 0);const c=function(e){if(a?.commands===e)return a.fuse;const n=e.filter(t=>t&&!t.isHidden&&o(t)).map(t=>{const e=o(t),n=e.split(s).filter(Boolean);return{descriptionKey:(t.description??"").split(" ").map(t=>function(t){return t.toLowerCase().replace(/[^a-z0-9]/g,"")}(t)).filter(Boolean),partKey:n.length>1?n:void 0,commandName:e,command:t,aliasKey:t.aliases}}),r=new t(n,{includeScore:!0,threshold:.3,location:0,distance:100,keys:[{name:"commandName",weight:3},{name:"partKey",weight:2},{name:"aliasKey",weight:2},{name:"descriptionKey",weight:.5}]});return a={commands:e,fuse:r},r}(n),u=c.search(i).map(t=>{const e=(t.item.commandName||"").toLowerCase(),n=t.item.command?.aliases?.map(t=>t?.toLowerCase()).filter(t=>!!t)??[];return{r:t,name:e,aliases:n,usage:"prompt"===t.item.command?.type?r(o(t.item.command)):0}}).sort((t,e)=>{const n=t.name,o=e.name,r=t.aliases,s=e.aliases,a=n===i,m=o===i;if(a&&!m)return-1;if(m&&!a)return 1;const c=r.some(t=>t===i),u=s.some(t=>t===i);if(c&&!u)return-1;if(u&&!c)return 1;const l=n.startsWith(i),d=o.startsWith(i);if(l&&!d)return-1;if(d&&!l)return 1;if(l&&d&&n.length!==o.length)return n.length-o.length;const p=r.find(t=>t.startsWith(i)),f=s.find(t=>t.startsWith(i));if(p&&!f)return-1;if(f&&!p)return 1;if(p&&f&&p.length!==f.length)return p.length-f.length;const g=(t.r.score??0)-(e.r.score??0);return Math.abs(g)>.1?g:e.usage-t.usage}).map(t=>{const e=t.r.item.command,n=function(t,e){if(e&&0!==e.length&&""!==t)return e.find(e=>e.toLowerCase().startsWith(t))}(i,e.aliases);return createCommandSuggestionItem(e,n)});if(m){const t=getCommandId(m);if(!u.some(e=>e.id===t))return[createCommandSuggestionItem(m),...u]}return u}export function applyCommandSuggestion(t,e,r,s,a,i){let m,c;if("string"==typeof t)m=t,c=e?n(m,r):void 0;else{if(!isCommandMetadata(t.metadata))return;m=o(t.metadata),c=t.metadata}const u=formatCommand(m);s(u),a(u.length),e&&c&&("prompt"===c.type&&0!==(c.argNames??[]).length||i(u,!0))}export function findSlashCommandPositions(t){const e=[],n=/(^|[\s])(\/[a-zA-Z][a-zA-Z0-9:\-_]*)/g;let o=null;for(;null!==(o=n.exec(t));){const t=o[1]??"",n=o[2]??"",r=o.index+t.length;e.push({start:r,end:r+n.length})}return e}
@@ -1 +1 @@
1
- import{LRUCache as t}from"lru-cache";import{basename as e,dirname as r,join as a,sep as i}from"path";import{getCwd as s}from"src/utils/cwd.js";import{getFsImplementation as o}from"src/utils/fsOperations.js";import{logError as n}from"src/utils/log.js";import{expandPath as c}from"src/utils/path.js";const p=3e5,l=new t({max:500,ttl:p}),m=new t({max:500,ttl:p});export function parsePartialPath(t,a){if(!t)return{directory:a||s(),prefix:""};const o=c(t,a);return t.endsWith("/")||t.endsWith(i)?{directory:o,prefix:""}:{directory:r(o),prefix:e(t)}}export async function scanDirectory(t){const e=l.get(t);if(e)return e;try{const e=o(),r=(await e.readdir(t)).filter(t=>t.isDirectory()&&!t.name.startsWith(".")).map(e=>({name:e.name,path:a(t,e.name),type:"directory"})).slice(0,100);return l.set(t,r),r}catch(t){return n(t),[]}}export async function getDirectoryCompletions(t,e={}){const{basePath:r=s(),maxResults:a=10}=e,{directory:i,prefix:o}=parsePartialPath(t,r),n=await scanDirectory(i),c=o.toLowerCase();return n.filter(t=>t.name.toLowerCase().startsWith(c)).slice(0,a).map(t=>({id:t.path,displayText:t.name+"/",description:"directory",metadata:{type:"directory"}}))}export function clearDirectoryCache(){l.clear()}export function isPathLikeToken(t){return t.startsWith("~/")||t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||"~"===t||"."===t||".."===t}export async function scanDirectoryForPaths(t,e=!1){const r=`${t}:${e}`,i=m.get(r);if(i)return i;try{const i=o(),s=(await i.readdir(t)).filter(t=>e||!t.name.startsWith(".")).map(e=>({name:e.name,path:a(t,e.name),type:e.isDirectory()?"directory":"file"})).sort((t,e)=>"directory"===t.type&&"directory"!==e.type?-1:"directory"!==t.type&&"directory"===e.type?1:t.name.localeCompare(e.name)).slice(0,100);return m.set(r,s),s}catch(t){return n(t),[]}}export async function getPathCompletions(t,e={}){const{basePath:r=s(),maxResults:a=10,includeFiles:o=!0,includeHidden:n=!1}=e,{directory:c,prefix:p}=parsePartialPath(t,r),l=await scanDirectoryForPaths(c,n),m=p.toLowerCase(),y=l.filter(t=>!(!o&&"file"===t.type)&&t.name.toLowerCase().startsWith(m)).slice(0,a),d=t.includes("/")||t.includes(i);let h="";if(d){const e=t.lastIndexOf("/"),r=t.lastIndexOf(i),a=Math.max(e,r);h=t.substring(0,a+1)}return(h.startsWith("./")||h.startsWith("."+i))&&(h=h.slice(2)),y.map(t=>{const e=h+t.name;return{id:e,displayText:"directory"===t.type?e+"/":e,metadata:{type:t.type}}})}export function clearPathCache(){l.clear(),m.clear()}
1
+ import{LRUCache as t}from"lru-cache";import{basename as e,dirname as r,join as a,sep as i}from"path";import{getCwd as s}from"../cwd.js";import{getFsImplementation as o}from"../fsOperations.js";import{logError as n}from"../log.js";import{expandPath as c}from"../path.js";const p=3e5,y=new t({max:500,ttl:p}),m=new t({max:500,ttl:p});export function parsePartialPath(t,a){if(!t){return{directory:a||s(),prefix:""}}const o=c(t,a);if(t.endsWith("/")||t.endsWith(i))return{directory:o,prefix:""};return{directory:r(o),prefix:e(t)}}export async function scanDirectory(t){const e=y.get(t);if(e)return e;try{const e=o(),r=(await e.readdir(t)).filter(t=>t.isDirectory()&&!t.name.startsWith(".")).map(e=>({name:e.name,path:a(t,e.name),type:"directory"})).slice(0,100);return y.set(t,r),r}catch(t){return n(t),[]}}export async function getDirectoryCompletions(t,e={}){const{basePath:r=s(),maxResults:a=10}=e,{directory:i,prefix:o}=parsePartialPath(t,r),n=await scanDirectory(i),c=o.toLowerCase();return n.filter(t=>t.name.toLowerCase().startsWith(c)).slice(0,a).map(t=>({id:t.path,displayText:t.name+"/",description:"directory",metadata:{type:"directory"}}))}export function clearDirectoryCache(){y.clear()}export function isPathLikeToken(t){return t.startsWith("~/")||t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||"~"===t||"."===t||".."===t}export async function scanDirectoryForPaths(t,e=!1){const r=`${t}:${e}`,i=m.get(r);if(i)return i;try{const i=o(),s=(await i.readdir(t)).filter(t=>e||!t.name.startsWith(".")).map(e=>({name:e.name,path:a(t,e.name),type:e.isDirectory()?"directory":"file"})).sort((t,e)=>"directory"===t.type&&"directory"!==e.type?-1:"directory"!==t.type&&"directory"===e.type?1:t.name.localeCompare(e.name)).slice(0,100);return m.set(r,s),s}catch(t){return n(t),[]}}export async function getPathCompletions(t,e={}){const{basePath:r=s(),maxResults:a=10,includeFiles:o=!0,includeHidden:n=!1}=e,{directory:c,prefix:p}=parsePartialPath(t,r),y=await scanDirectoryForPaths(c,n),m=p.toLowerCase(),l=y.filter(t=>!(!o&&"file"===t.type)&&t.name.toLowerCase().startsWith(m)).slice(0,a),d=t.includes("/")||t.includes(i);let f="";if(d){const e=t.lastIndexOf("/"),r=t.lastIndexOf(i),a=Math.max(e,r);f=t.substring(0,a+1)}return(f.startsWith("./")||f.startsWith("."+i))&&(f=f.slice(2)),l.map(t=>{const e=f+t.name;return{id:e,displayText:"directory"===t.type?e+"/":e,metadata:{type:t.type}}})}export function clearPathCache(){y.clear(),m.clear()}
@@ -1 +1 @@
1
- import{getHistory as t}from"../../history.js";import{logForDebugging as n}from"../debug.js";let e=null,r=0;export function clearShellHistoryCache(){e=null,r=0}export function prependToShellHistoryCache(t){if(!e)return;const n=e.indexOf(t);-1!==n&&e.splice(n,1),e.unshift(t)}export async function getShellHistoryCompletion(i){if(!i||i.length<2)return null;if(!i.trim())return null;const o=await async function(){const i=Date.now();if(e&&i-r<6e4)return e;const o=[],l=new Set;try{for await(const n of t()){if(n.display&&n.display.startsWith("!")){const t=n.display.slice(1).trim();t&&!l.has(t)&&(l.add(t),o.push(t))}if(o.length>=50)break}}catch(t){n(`Failed to read shell history: ${t}`)}return e=o,r=i,o}();for(const t of o)if(t.startsWith(i)&&t!==i)return{fullCommand:t,suffix:t.slice(i.length)};return null}
1
+ import{getHistory as t}from"../../history.js";import{logForDebugging as n}from"../debug.js";let e=null,r=0;export function clearShellHistoryCache(){e=null,r=0}export function prependToShellHistoryCache(t){if(!e)return;const n=e.indexOf(t);-1!==n&&e.splice(n,1),e.unshift(t)}export async function getShellHistoryCompletion(i){if(!i||i.length<2)return null;if(!i.trim())return null;const l=await async function(){const i=Date.now();if(e&&i-r<6e4)return e;const l=[],o=new Set;try{for await(const n of t()){if(n.display&&n.display.startsWith("!")){const t=n.display.slice(1).trim();t&&!o.has(t)&&(o.add(t),l.push(t))}if(l.length>=50)break}}catch(t){n(`Failed to read shell history: ${t}`)}return e=l,r=i,l}();for(const t of l)if(t.startsWith(i)&&t!==i)return{fullCommand:t,suffix:t.slice(i.length)};return null}
@@ -1 +1 @@
1
- import{getGlobalConfig as e,saveGlobalConfig as t}from"../config.js";const s=new Map;export function recordSkillUsage(e){const o=Date.now(),a=s.get(e);void 0!==a&&o-a<6e4||(s.set(e,o),t(t=>{const s=t.skillUsage?.[e];return{...t,skillUsage:{...t.skillUsage,[e]:{usageCount:(s?.usageCount??0)+1,lastUsedAt:o}}}}))}export function getSkillUsageScore(t){const s=e(),o=s.skillUsage?.[t];if(!o)return 0;const a=(Date.now()-o.lastUsedAt)/864e5,n=Math.pow(.5,a/7);return o.usageCount*Math.max(n,.1)}
1
+ import{getGlobalConfig as t,saveGlobalConfig as e}from"../config.js";const s=new Map;export function recordSkillUsage(t){const o=Date.now(),n=s.get(t);void 0!==n&&o-n<6e4||(s.set(t,o),e(e=>{const s=e.skillUsage?.[t];return{...e,skillUsage:{...e.skillUsage,[t]:{usageCount:(s?.usageCount??0)+1,lastUsedAt:o}}}}))}export function getSkillUsageScore(e){const s=t(),o=s.skillUsage?.[e];if(!o)return 0;const n=(Date.now()-o.lastUsedAt)/864e5,a=Math.pow(.5,n/7);return o.usageCount*Math.max(a,.1)}
@@ -1 +1 @@
1
- import{z as t}from"zod";import{logForDebugging as n}from"../debug.js";import{lazySchema as e}from"../lazySchema.js";import{createSignal as s}from"../signal.js";import{jsonParse as a}from"../slowOperations.js";const r=new Map,c=new Set;let l=0;const o=s();export const subscribeKnownChannels=o.subscribe;let i=null,u=null;function findSlackClient(t){return t.find(t=>"connected"===t.type&&t.name.includes("slack"))}async function fetchChannels(t,e){const s=findSlackClient(t);if(!s||"connected"!==s.type)return[];try{const t=(await s.client.callTool({name:"slack_search_channels",arguments:{query:e,limit:20,channel_types:"public_channel,private_channel"}},void 0,{timeout:5e3})).content;return Array.isArray(t)?function(t){const n=[],e=new Set;for(const s of t.split("\n")){const t=s.match(/^Name:\s*#?([a-z0-9][a-z0-9_-]{0,79})\s*$/);t&&!e.has(t[1])&&(e.add(t[1]),n.push(t[1]))}return n}(function(t){const n=t.trim();if(!n.startsWith("{"))return t;try{const t=f().safeParse(a(n));if(t.success)return t.data.results}catch{}return t}(t.filter(t=>"text"===t.type).map(t=>t.text).join("\n"))):[]}catch(t){return n(`Failed to fetch Slack channels: ${t}`),[]}}const f=e(()=>t.object({results:t.string()}));export function hasSlackMcpServer(t){return void 0!==findSlackClient(t)}export function getKnownChannelsVersion(){return l}export function findSlackChannelPositions(t){const n=[],e=/(^|\s)#([a-z0-9][a-z0-9_-]{0,79})(?=\s|$)/g;let s;for(;null!==(s=e.exec(t));){if(!c.has(s[2]))continue;const t=s.index+s[1].length;n.push({start:t,end:t+1+s[2].length})}return n}export async function getSlackChannelSuggestions(t,n){if(!n)return[];const e=function(t){const n=Math.max(t.lastIndexOf("-"),t.lastIndexOf("_"));return n>0?t.slice(0,n):t}(n),s=n.toLowerCase();let a=r.get(e)??function(t,n){let e,s=0;for(const[a,c]of r)t.startsWith(a)&&a.length>s&&c.some(t=>t.startsWith(n))&&(e=c,s=a.length);return e}(e,s);if(!a)if(i===e&&u)a=await u;else{i=e,u=fetchChannels(t,e),a=await u,r.set(e,a);const n=c.size;for(const t of a)c.add(t);c.size!==n&&(l++,o.emit()),r.size>50&&r.delete(r.keys().next().value),i===e&&(i=null,u=null)}return a.filter(t=>t.startsWith(s)).sort().slice(0,10).map(t=>({id:`slack-channel-${t}`,displayText:`#${t}`}))}export function clearSlackChannelCache(){r.clear(),c.clear(),l=0,i=null,u=null}
1
+ import{z as t}from"zod";import{logForDebugging as n}from"../debug.js";import{lazySchema as e}from"../lazySchema.js";import{createSignal as s}from"../signal.js";import{jsonParse as r}from"../slowOperations.js";const a=new Map,c=new Set;let l=0;const o=s();export const subscribeKnownChannels=o.subscribe;let i=null,u=null;function findSlackClient(t){return t.find(t=>"connected"===t.type&&t.name.includes("slack"))}async function fetchChannels(t,e){const s=findSlackClient(t);if(!s||"connected"!==s.type)return[];try{const t=(await s.client.callTool({name:"slack_search_channels",arguments:{query:e,limit:20,channel_types:"public_channel,private_channel"}},void 0,{timeout:5e3})).content;if(!Array.isArray(t))return[];return function(t){const n=[],e=new Set;for(const s of t.split("\n")){const t=s.match(/^Name:\s*#?([a-z0-9][a-z0-9_-]{0,79})\s*$/);t&&!e.has(t[1])&&(e.add(t[1]),n.push(t[1]))}return n}(function(t){const n=t.trim();if(!n.startsWith("{"))return t;try{const t=f().safeParse(r(n));if(t.success)return t.data.results}catch{}return t}(t.filter(t=>"text"===t.type).map(t=>t.text).join("\n")))}catch(t){return n(`Failed to fetch Slack channels: ${t}`),[]}}const f=e(()=>t.object({results:t.string()}));export function hasSlackMcpServer(t){return void 0!==findSlackClient(t)}export function getKnownChannelsVersion(){return l}export function findSlackChannelPositions(t){const n=[],e=/(^|\s)#([a-z0-9][a-z0-9_-]{0,79})(?=\s|$)/g;let s;for(;null!==(s=e.exec(t));){if(!c.has(s[2]))continue;const t=s.index+s[1].length;n.push({start:t,end:t+1+s[2].length})}return n}export async function getSlackChannelSuggestions(t,n){if(!n)return[];const e=function(t){const n=Math.max(t.lastIndexOf("-"),t.lastIndexOf("_"));return n>0?t.slice(0,n):t}(n),s=n.toLowerCase();let r=a.get(e)??function(t,n){let e,s=0;for(const[r,c]of a)t.startsWith(r)&&r.length>s&&c.some(t=>t.startsWith(n))&&(e=c,s=r.length);return e}(e,s);if(!r)if(i===e&&u)r=await u;else{i=e,u=fetchChannels(t,e),r=await u,a.set(e,r);const n=c.size;for(const t of r)c.add(t);c.size!==n&&(l++,o.emit()),a.size>50&&a.delete(a.keys().next().value),i===e&&(i=null,u=null)}return r.filter(t=>t.startsWith(s)).sort().slice(0,10).map(t=>({id:`slack-channel-${t}`,displayText:`#${t}`}))}export function clearSlackChannelCache(){a.clear(),c.clear(),l=0,i=null,u=null}
@@ -1 +1 @@
1
- import{env as e}from"../../env.js";import{execFileNoThrow as n}from"../../execFileNoThrow.js";import{TMUX_COMMAND as t}from"../constants.js";const r=process.env.TMUX,o=process.env.TMUX_PANE;let s=null,i=null;export function isInsideTmuxSync(){return!!r}export async function isInsideTmux(){return null!==s||(s=!!r),s}export function getLeaderPaneId(){return o||null}export async function isTmuxAvailable(){return 0===(await n(t,["-V"])).code}export function isInITerm2(){if(null!==i)return i;const n=process.env.TERM_PROGRAM,t=!!process.env.ITERM_SESSION_ID,r="iTerm.app"===e.terminal;return i="iTerm.app"===n||t||r,i}export const IT2_COMMAND="it2";export async function isIt2CliAvailable(){return 0===(await n("it2",["session","list"])).code}export function resetDetectionCache(){s=null,i=null}
1
+ import{env as n}from"../../env.js";import{execFileNoThrow as e}from"../../execFileNoThrow.js";import{TMUX_COMMAND as t}from"../constants.js";const r=process.env.TMUX,o=process.env.TMUX_PANE;let i=null,s=null;export function isInsideTmuxSync(){return!!r}export async function isInsideTmux(){return null!==i||(i=!!r),i}export function getLeaderPaneId(){return o||null}export async function isTmuxAvailable(){return 0===(await e(t,["-V"])).code}export function isInITerm2(){if(null!==s)return s;const e=process.env.TERM_PROGRAM,t=!!process.env.ITERM_SESSION_ID,r="iTerm.app"===n.terminal;return s="iTerm.app"===e||t||r,s}export const IT2_COMMAND="it2";export async function isIt2CliAvailable(){return 0===(await e("it2",["session","list"])).code}export function resetDetectionCache(){i=null,s=null}
@@ -1 +1 @@
1
- import{mkdir as e,readdir as r,readFile as t,unlink as s,writeFile as n}from"fs/promises";import{join as o}from"path";import{z as i}from"zod/v4";import{logForDebugging as a}from"../debug.js";import{getErrnoCode as m}from"../errors.js";import{lazySchema as d}from"../lazySchema.js";import*as u from"../lockfile.js";import{logError as c}from"../log.js";import{jsonParse as l,jsonStringify as p}from"../slowOperations.js";import{getAgentId as f,getAgentName as g,getTeammateColor as w,getTeamName as P}from"../teammate.js";import{createPermissionRequestMessage as y,createPermissionResponseMessage as S,createSandboxPermissionRequestMessage as x,createSandboxPermissionResponseMessage as q,writeToMailbox as v}from"../teammateMailbox.js";import{getTeamDir as b,readTeamFileAsync as $}from"./teamHelpers.js";export const SwarmPermissionRequestSchema=d(()=>i.object({id:i.string(),workerId:i.string(),workerName:i.string(),workerColor:i.string().optional(),teamName:i.string(),toolName:i.string(),toolUseId:i.string(),description:i.string(),input:i.record(i.string(),i.unknown()),permissionSuggestions:i.array(i.unknown()),status:i.enum(["pending","approved","rejected"]),resolvedBy:i.enum(["worker","leader"]).optional(),resolvedAt:i.number().optional(),feedback:i.string().optional(),updatedInput:i.record(i.string(),i.unknown()).optional(),permissionUpdates:i.array(i.unknown()).optional(),createdAt:i.number()}));export function getPermissionDir(e){return o(b(e),"permissions")}function getPendingDir(e){return o(getPermissionDir(e),"pending")}function getResolvedDir(e){return o(getPermissionDir(e),"resolved")}async function ensurePermissionDirsAsync(r){const t=getPermissionDir(r),s=getPendingDir(r),n=getResolvedDir(r);for(const r of[t,s,n])await e(r,{recursive:!0})}function getPendingRequestPath(e,r){return o(getPendingDir(e),`${r}.json`)}function getResolvedRequestPath(e,r){return o(getResolvedDir(e),`${r}.json`)}export function generateRequestId(){return`perm-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}export function createPermissionRequest(e){const r=e.teamName||P(),t=e.workerId||f(),s=e.workerName||g(),n=e.workerColor||w();if(!r)throw new Error("Team name is required for permission requests");if(!t)throw new Error("Worker ID is required for permission requests");if(!s)throw new Error("Worker name is required for permission requests");return{id:generateRequestId(),workerId:t,workerName:s,workerColor:n,teamName:r,toolName:e.toolName,toolUseId:e.toolUseId,description:e.description,input:e.input,permissionSuggestions:e.permissionSuggestions||[],status:"pending",createdAt:Date.now()}}export async function writePermissionRequest(e){await ensurePermissionDirsAsync(e.teamName);const r=getPendingRequestPath(e.teamName,e.id),t=getPendingDir(e.teamName),s=o(t,".lock");let i;await n(s,"","utf-8");try{return i=await u.lock(s),await n(r,p(e,null,2),"utf-8"),a(`[PermissionSync] Wrote pending request ${e.id} from ${e.workerName} for ${e.toolName}`),e}catch(e){throw a(`[PermissionSync] Failed to write permission request: ${e}`),c(e),e}finally{i&&await i()}}export async function readPendingPermissions(e){const s=e||P();if(!s)return a("[PermissionSync] No team name available"),[];const n=getPendingDir(s);let i;try{i=await r(n)}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to read pending requests: ${e}`),c(e)),[]}const d=i.filter(e=>e.endsWith(".json")&&".lock"!==e),u=(await Promise.all(d.map(async e=>{const r=o(n,e);try{const s=await t(r,"utf-8"),n=SwarmPermissionRequestSchema().safeParse(l(s));return n.success?n.data:(a(`[PermissionSync] Invalid request file ${e}: ${n.error.message}`),null)}catch(r){return a(`[PermissionSync] Failed to read request file ${e}: ${r}`),null}}))).filter(e=>null!==e);return u.sort((e,r)=>e.createdAt-r.createdAt),u}export async function readResolvedPermission(e,r){const s=r||P();if(!s)return null;const n=getResolvedRequestPath(s,e);try{const r=await t(n,"utf-8"),s=SwarmPermissionRequestSchema().safeParse(l(r));return s.success?s.data:(a(`[PermissionSync] Invalid resolved request ${e}: ${s.error.message}`),null)}catch(r){return"ENOENT"===m(r)||(a(`[PermissionSync] Failed to read resolved request ${e}: ${r}`),c(r)),null}}export async function resolvePermission(e,r,i){const d=i||P();if(!d)return a("[PermissionSync] No team name available"),!1;await ensurePermissionDirsAsync(d);const f=getPendingRequestPath(d,e),g=getResolvedRequestPath(d,e),w=o(getPendingDir(d),".lock");let y;await n(w,"","utf-8");try{let o;y=await u.lock(w);try{o=await t(f,"utf-8")}catch(r){if("ENOENT"===m(r))return a(`[PermissionSync] Pending request not found: ${e}`),!1;throw r}const i=SwarmPermissionRequestSchema().safeParse(l(o));if(!i.success)return a(`[PermissionSync] Invalid pending request ${e}: ${i.error.message}`),!1;const d={...i.data,status:"approved"===r.decision?"approved":"rejected",resolvedBy:r.resolvedBy,resolvedAt:Date.now(),feedback:r.feedback,updatedInput:r.updatedInput,permissionUpdates:r.permissionUpdates};return await n(g,p(d,null,2),"utf-8"),await s(f),a(`[PermissionSync] Resolved request ${e} with ${r.decision}`),!0}catch(e){return a(`[PermissionSync] Failed to resolve request: ${e}`),c(e),!1}finally{y&&await y()}}export async function cleanupOldResolutions(e,n=36e5){const i=e||P();if(!i)return 0;const d=getResolvedDir(i);let u;try{u=await r(d)}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to cleanup resolutions: ${e}`),c(e)),0}const p=Date.now(),f=u.filter(e=>e.endsWith(".json")),g=(await Promise.all(f.map(async e=>{const r=o(d,e);try{const o=await t(r,"utf-8"),i=l(o),m=i.resolvedAt||i.createdAt;return p-m>=n?(await s(r),a(`[PermissionSync] Cleaned up old resolution: ${e}`),1):0}catch{try{return await s(r),1}catch{return 0}}}))).reduce((e,r)=>e+r,0);return g>0&&a(`[PermissionSync] Cleaned up ${g} old resolutions`),g}export async function pollForResponse(e,r,t){const s=await readResolvedPermission(e,t);return s?{requestId:s.id,decision:"approved"===s.status?"approved":"denied",timestamp:s.resolvedAt?new Date(s.resolvedAt).toISOString():new Date(s.createdAt).toISOString(),feedback:s.feedback,updatedInput:s.updatedInput,permissionUpdates:s.permissionUpdates}:null}export async function removeWorkerResponse(e,r,t){await deleteResolvedPermission(e,t)}export function isTeamLeader(e){if(!e&&!P())return!1;const r=f();return!r||"team-lead"===r}export function isSwarmWorker(){const e=P(),r=f();return!!e&&!!r&&!isTeamLeader()}export async function deleteResolvedPermission(e,r){const t=r||P();if(!t)return!1;const n=getResolvedRequestPath(t,e);try{return await s(n),a(`[PermissionSync] Deleted resolved permission: ${e}`),!0}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to delete resolved permission: ${e}`),c(e)),!1}}export const submitPermissionRequest=writePermissionRequest;export async function getLeaderName(e){const r=e||P();if(!r)return null;const t=await $(r);if(!t)return a(`[PermissionSync] Team file not found for team: ${r}`),null;const s=t.members.find(e=>e.agentId===t.leadAgentId);return s?.name||"team-lead"}export async function sendPermissionRequestViaMailbox(e){const r=await getLeaderName(e.teamName);if(!r)return a("[PermissionSync] Cannot send permission request: leader name not found"),!1;try{const t=y({request_id:e.id,agent_id:e.workerName,tool_name:e.toolName,tool_use_id:e.toolUseId,description:e.description,input:e.input,permission_suggestions:e.permissionSuggestions});return await v(r,{from:e.workerName,text:p(t),timestamp:(new Date).toISOString(),color:e.workerColor},e.teamName),a(`[PermissionSync] Sent permission request ${e.id} to leader ${r} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send permission request via mailbox: ${e}`),c(e),!1}}export async function sendPermissionResponseViaMailbox(e,r,t,s){const n=s||P();if(!n)return a("[PermissionSync] Cannot send permission response: team name not found"),!1;try{const s=S({request_id:t,subtype:"approved"===r.decision?"success":"error",error:r.feedback,updated_input:r.updatedInput,permission_updates:r.permissionUpdates}),o=g()||"team-lead";return await v(e,{from:o,text:p(s),timestamp:(new Date).toISOString()},n),a(`[PermissionSync] Sent permission response for ${t} to worker ${e} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send permission response via mailbox: ${e}`),c(e),!1}}export function generateSandboxRequestId(){return`sandbox-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}export async function sendSandboxPermissionRequestViaMailbox(e,r,t){const s=t||P();if(!s)return a("[PermissionSync] Cannot send sandbox permission request: team name not found"),!1;const n=await getLeaderName(s);if(!n)return a("[PermissionSync] Cannot send sandbox permission request: leader name not found"),!1;const o=f(),i=g(),m=w();if(!o||!i)return a("[PermissionSync] Cannot send sandbox permission request: worker ID or name not found"),!1;try{const t=x({requestId:r,workerId:o,workerName:i,workerColor:m,host:e});return await v(n,{from:i,text:p(t),timestamp:(new Date).toISOString(),color:m},s),a(`[PermissionSync] Sent sandbox permission request ${r} for host ${e} to leader ${n} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send sandbox permission request via mailbox: ${e}`),c(e),!1}}export async function sendSandboxPermissionResponseViaMailbox(e,r,t,s,n){const o=n||P();if(!o)return a("[PermissionSync] Cannot send sandbox permission response: team name not found"),!1;try{const n=q({requestId:r,host:t,allow:s}),i=g()||"team-lead";return await v(e,{from:i,text:p(n),timestamp:(new Date).toISOString()},o),a(`[PermissionSync] Sent sandbox permission response for ${r} (host: ${t}, allow: ${s}) to worker ${e} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send sandbox permission response via mailbox: ${e}`),c(e),!1}}
1
+ import{mkdir as e,readdir as t,readFile as r,unlink as n,writeFile as s}from"fs/promises";import{join as o}from"path";import{z as i}from"zod/v4";import{logForDebugging as a}from"../debug.js";import{getErrnoCode as m}from"../errors.js";import{lazySchema as d}from"../lazySchema.js";import*as u from"../lockfile.js";import{logError as c}from"../log.js";import{jsonParse as l,jsonStringify as p}from"../slowOperations.js";import{getAgentId as f,getAgentName as w,getTeammateColor as g,getTeamName as P}from"../teammate.js";import{createPermissionRequestMessage as y,createPermissionResponseMessage as S,createSandboxPermissionRequestMessage as q,createSandboxPermissionResponseMessage as v,writeToMailbox as x}from"../teammateMailbox.js";import{getTeamDir as $,readTeamFileAsync as b}from"./teamHelpers.js";export const SwarmPermissionRequestSchema=d(()=>i.object({id:i.string(),workerId:i.string(),workerName:i.string(),workerColor:i.string().optional(),teamName:i.string(),toolName:i.string(),toolUseId:i.string(),description:i.string(),input:i.record(i.string(),i.unknown()),permissionSuggestions:i.array(i.unknown()),status:i.enum(["pending","approved","rejected"]),resolvedBy:i.enum(["worker","leader"]).optional(),resolvedAt:i.number().optional(),feedback:i.string().optional(),updatedInput:i.record(i.string(),i.unknown()).optional(),permissionUpdates:i.array(i.unknown()).optional(),createdAt:i.number()}));export function getPermissionDir(e){return o($(e),"permissions")}function getPendingDir(e){return o(getPermissionDir(e),"pending")}function getResolvedDir(e){return o(getPermissionDir(e),"resolved")}async function ensurePermissionDirsAsync(t){const r=getPermissionDir(t),n=getPendingDir(t),s=getResolvedDir(t);for(const t of[r,n,s])await e(t,{recursive:!0})}function getPendingRequestPath(e,t){return o(getPendingDir(e),`${t}.json`)}function getResolvedRequestPath(e,t){return o(getResolvedDir(e),`${t}.json`)}export function generateRequestId(){return`perm-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}export function createPermissionRequest(e){const t=e.teamName||P(),r=e.workerId||f(),n=e.workerName||w(),s=e.workerColor||g();if(!t)throw new Error("Team name is required for permission requests");if(!r)throw new Error("Worker ID is required for permission requests");if(!n)throw new Error("Worker name is required for permission requests");return{id:generateRequestId(),workerId:r,workerName:n,workerColor:s,teamName:t,toolName:e.toolName,toolUseId:e.toolUseId,description:e.description,input:e.input,permissionSuggestions:e.permissionSuggestions||[],status:"pending",createdAt:Date.now()}}export async function writePermissionRequest(e){await ensurePermissionDirsAsync(e.teamName);const t=getPendingRequestPath(e.teamName,e.id),r=getPendingDir(e.teamName),n=o(r,".lock");let i;await s(n,"","utf-8");try{return i=await u.lock(n),await s(t,p(e,null,2),"utf-8"),a(`[PermissionSync] Wrote pending request ${e.id} from ${e.workerName} for ${e.toolName}`),e}catch(e){throw a(`[PermissionSync] Failed to write permission request: ${e}`),c(e),e}finally{i&&await i()}}export async function readPendingPermissions(e){const n=e||P();if(!n)return a("[PermissionSync] No team name available"),[];const s=getPendingDir(n);let i;try{i=await t(s)}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to read pending requests: ${e}`),c(e)),[]}const d=i.filter(e=>e.endsWith(".json")&&".lock"!==e),u=(await Promise.all(d.map(async e=>{const t=o(s,e);try{const n=await r(t,"utf-8"),s=SwarmPermissionRequestSchema().safeParse(l(n));return s.success?s.data:(a(`[PermissionSync] Invalid request file ${e}: ${s.error.message}`),null)}catch(t){return a(`[PermissionSync] Failed to read request file ${e}: ${t}`),null}}))).filter(e=>null!==e);return u.sort((e,t)=>e.createdAt-t.createdAt),u}export async function readResolvedPermission(e,t){const n=t||P();if(!n)return null;const s=getResolvedRequestPath(n,e);try{const t=await r(s,"utf-8"),n=SwarmPermissionRequestSchema().safeParse(l(t));return n.success?n.data:(a(`[PermissionSync] Invalid resolved request ${e}: ${n.error.message}`),null)}catch(t){return"ENOENT"===m(t)||(a(`[PermissionSync] Failed to read resolved request ${e}: ${t}`),c(t)),null}}export async function resolvePermission(e,t,i){const d=i||P();if(!d)return a("[PermissionSync] No team name available"),!1;await ensurePermissionDirsAsync(d);const f=getPendingRequestPath(d,e),w=getResolvedRequestPath(d,e),g=o(getPendingDir(d),".lock");let y;await s(g,"","utf-8");try{let o;y=await u.lock(g);try{o=await r(f,"utf-8")}catch(t){if("ENOENT"===m(t))return a(`[PermissionSync] Pending request not found: ${e}`),!1;throw t}const i=SwarmPermissionRequestSchema().safeParse(l(o));if(!i.success)return a(`[PermissionSync] Invalid pending request ${e}: ${i.error.message}`),!1;const d={...i.data,status:"approved"===t.decision?"approved":"rejected",resolvedBy:t.resolvedBy,resolvedAt:Date.now(),feedback:t.feedback,updatedInput:t.updatedInput,permissionUpdates:t.permissionUpdates};return await s(w,p(d,null,2),"utf-8"),await n(f),a(`[PermissionSync] Resolved request ${e} with ${t.decision}`),!0}catch(e){return a(`[PermissionSync] Failed to resolve request: ${e}`),c(e),!1}finally{y&&await y()}}export async function cleanupOldResolutions(e,s=36e5){const i=e||P();if(!i)return 0;const d=getResolvedDir(i);let u;try{u=await t(d)}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to cleanup resolutions: ${e}`),c(e)),0}const p=Date.now(),f=u.filter(e=>e.endsWith(".json")),w=(await Promise.all(f.map(async e=>{const t=o(d,e);try{const o=await r(t,"utf-8"),i=l(o),m=i.resolvedAt||i.createdAt;return p-m>=s?(await n(t),a(`[PermissionSync] Cleaned up old resolution: ${e}`),1):0}catch{try{return await n(t),1}catch{return 0}}}))).reduce((e,t)=>e+t,0);return w>0&&a(`[PermissionSync] Cleaned up ${w} old resolutions`),w}export async function pollForResponse(e,t,r){const n=await readResolvedPermission(e,r);return n?{requestId:n.id,decision:"approved"===n.status?"approved":"denied",timestamp:n.resolvedAt?new Date(n.resolvedAt).toISOString():new Date(n.createdAt).toISOString(),feedback:n.feedback,updatedInput:n.updatedInput,permissionUpdates:n.permissionUpdates}:null}export async function removeWorkerResponse(e,t,r){await deleteResolvedPermission(e,r)}export function isTeamLeader(e){if(!(e||P()))return!1;const t=f();return!t||"team-lead"===t}export function isSwarmWorker(){const e=P(),t=f();return!!e&&!!t&&!isTeamLeader()}export async function deleteResolvedPermission(e,t){const r=t||P();if(!r)return!1;const s=getResolvedRequestPath(r,e);try{return await n(s),a(`[PermissionSync] Deleted resolved permission: ${e}`),!0}catch(e){return"ENOENT"===m(e)||(a(`[PermissionSync] Failed to delete resolved permission: ${e}`),c(e)),!1}}export const submitPermissionRequest=writePermissionRequest;export async function getLeaderName(e){const t=e||P();if(!t)return null;const r=await b(t);if(!r)return a(`[PermissionSync] Team file not found for team: ${t}`),null;const n=r.members.find(e=>e.agentId===r.leadAgentId);return n?.name||"team-lead"}export async function sendPermissionRequestViaMailbox(e){const t=await getLeaderName(e.teamName);if(!t)return a("[PermissionSync] Cannot send permission request: leader name not found"),!1;try{const r=y({request_id:e.id,agent_id:e.workerName,tool_name:e.toolName,tool_use_id:e.toolUseId,description:e.description,input:e.input,permission_suggestions:e.permissionSuggestions});return await x(t,{from:e.workerName,text:p(r),timestamp:(new Date).toISOString(),color:e.workerColor},e.teamName),a(`[PermissionSync] Sent permission request ${e.id} to leader ${t} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send permission request via mailbox: ${e}`),c(e),!1}}export async function sendPermissionResponseViaMailbox(e,t,r,n){const s=n||P();if(!s)return a("[PermissionSync] Cannot send permission response: team name not found"),!1;try{const n=S({request_id:r,subtype:"approved"===t.decision?"success":"error",error:t.feedback,updated_input:t.updatedInput,permission_updates:t.permissionUpdates}),o=w()||"team-lead";return await x(e,{from:o,text:p(n),timestamp:(new Date).toISOString()},s),a(`[PermissionSync] Sent permission response for ${r} to worker ${e} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send permission response via mailbox: ${e}`),c(e),!1}}export function generateSandboxRequestId(){return`sandbox-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}export async function sendSandboxPermissionRequestViaMailbox(e,t,r){const n=r||P();if(!n)return a("[PermissionSync] Cannot send sandbox permission request: team name not found"),!1;const s=await getLeaderName(n);if(!s)return a("[PermissionSync] Cannot send sandbox permission request: leader name not found"),!1;const o=f(),i=w(),m=g();if(!o||!i)return a("[PermissionSync] Cannot send sandbox permission request: worker ID or name not found"),!1;try{const r=q({requestId:t,workerId:o,workerName:i,workerColor:m,host:e});return await x(s,{from:i,text:p(r),timestamp:(new Date).toISOString(),color:m},n),a(`[PermissionSync] Sent sandbox permission request ${t} for host ${e} to leader ${s} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send sandbox permission request via mailbox: ${e}`),c(e),!1}}export async function sendSandboxPermissionResponseViaMailbox(e,t,r,n,s){const o=s||P();if(!o)return a("[PermissionSync] Cannot send sandbox permission response: team name not found"),!1;try{const s=v({requestId:t,host:r,allow:n}),i=w()||"team-lead";return await x(e,{from:i,text:p(s),timestamp:(new Date).toISOString()},o),a(`[PermissionSync] Sent sandbox permission response for ${t} (host: ${r}, allow: ${n}) to worker ${e} via mailbox`),!0}catch(e){return a(`[PermissionSync] Failed to send sandbox permission response via mailbox: ${e}`),c(e),!1}}
@@ -1 +1 @@
1
- import{logForDebugging as e}from"../debug.js";import{logError as t}from"../log.js";import{getDynamicTeamContext as a}from"../teammate.js";import{getTeamFilePath as n,readTeamFile as o}from"./teamHelpers.js";export function computeInitialTeamContext(){const m=a();if(!m?.teamName||!m?.agentName)return void e("[Reconnection] computeInitialTeamContext: No teammate context set (not a teammate)");const{teamName:i,agentId:r,agentName:s}=m,d=o(i);if(!d)return void t(new Error(`[computeInitialTeamContext] Could not read team file for ${i}`));const l=n(i),c=!r;return e(`[Reconnection] Computed initial team context for ${c?"leader":`teammate ${s}`} in team ${i}`),{teamName:i,teamFilePath:l,leadAgentId:d.leadAgentId,selfAgentId:r,selfAgentName:s,isLeader:c,teammates:{}}}export function initializeTeammateContextFromSession(a,m,i){const r=o(m);if(!r)return void t(new Error(`[initializeTeammateContextFromSession] Could not read team file for ${m} (agent: ${i})`));const s=r.members.find(e=>e.name===i);s||e(`[Reconnection] Member ${i} not found in team ${m} - may have been removed`);const d=s?.agentId,l=n(m);a(e=>({...e,teamContext:{teamName:m,teamFilePath:l,leadAgentId:r.leadAgentId,selfAgentId:d,selfAgentName:i,isLeader:!1,teammates:{}}})),e(`[Reconnection] Initialized agent context from session for ${i} in team ${m}`)}
1
+ import{logForDebugging as e}from"../debug.js";import{logError as t}from"../log.js";import{getDynamicTeamContext as n}from"../teammate.js";import{getTeamFilePath as a,readTeamFile as o}from"./teamHelpers.js";export function computeInitialTeamContext(){const m=n();if(!m?.teamName||!m?.agentName)return void e("[Reconnection] computeInitialTeamContext: No teammate context set (not a teammate)");const{teamName:i,agentId:r,agentName:d}=m,s=o(i);if(!s)return void t(new Error(`[computeInitialTeamContext] Could not read team file for ${i}`));const l=a(i),c=!r;return e(`[Reconnection] Computed initial team context for ${c?"leader":`teammate ${d}`} in team ${i}`),{teamName:i,teamFilePath:l,leadAgentId:s.leadAgentId,selfAgentId:r,selfAgentName:d,isLeader:c,teammates:{}}}export function initializeTeammateContextFromSession(n,m,i){const r=o(m);if(!r)return void t(new Error(`[initializeTeammateContextFromSession] Could not read team file for ${m} (agent: ${i})`));const d=r.members.find(e=>e.name===i);d||e(`[Reconnection] Member ${i} not found in team ${m} - may have been removed`);const s=d?.agentId,l=a(m);n(e=>({...e,teamContext:{teamName:m,teamFilePath:l,leadAgentId:r.leadAgentId,selfAgentId:s,selfAgentName:i,isLeader:!1,teammates:{}}})),e(`[Reconnection] Initialized agent context from session for ${i} in team ${m}`)}
@@ -1,91 +1 @@
1
- import{getChromeFlagOverride as o,getFlagSettingsPath as s,getInlinePlugins as t,getMainLoopModelOverride as e,getSessionBypassPermissionsMode as n}from"../../bootstrap/state.js";import{quote as E}from"../bash/shellQuote.js";import{isInBundledMode as r}from"../bundledMode.js";import{getTeammateModeFromSnapshot as p}from"./backends/teammateModeSnapshot.js";import{TEAMMATE_COMMAND_ENV_VAR as _}from"./constants.js";export function getTeammateCommand(){return process.env[_]?process.env[_]:r()?process.execPath:process.argv[1]}export function buildInheritedCliFlags(r){const _=[],{planModeRequired:i,permissionMode:c}=r||{};i||("bypassPermissions"===c||n()?_.push("--dangerously-skip-permissions"):"acceptEdits"===c&&_.push("--permission-mode acceptEdits"));const m=e();m&&_.push(`--model ${E([m])}`);const C=s();C&&_.push(`--settings ${E([C])}`);const a=t();for(const o of a)_.push(`--plugin-dir ${E([o])}`);const u=p();_.push(`--teammate-mode ${u}`);const D=o();return!0===D?_.push("--chrome"):!1===D&&_.push("--no-chrome"),_.join(" ")}const i=["CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY","ANTHROPIC_BASE_URL","CLAUDE_CONFIG_DIR","CLAUDE_CODE_REMOTE","CLAUDE_CODE_REMOTE_MEMORY_DIR","HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","SSL_CERT_FILE","NODE_EXTRA_CA_CERTS","REQUESTS_CA_BUNDLE","CURL_CA_BUNDLE"];export function buildInheritedEnvVars(){const o=["CLAUDECODE=1","CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1"];for(const s of i){const t=process.env[s];void 0!==t&&""!==t&&o.push(`${s}=${E([t])}`)}return o.join(" ")}red) {
2
- // Don't inherit bypass permissions when plan mode is required
3
- }
4
- else if (permissionMode === 'bypassPermissions' ||
5
- getSessionBypassPermissionsMode()) {
6
- flags.push('--dangerously-skip-permissions');
7
- }
8
- else if (permissionMode === 'acceptEdits') {
9
- flags.push('--permission-mode acceptEdits');
10
- }
11
- // Propagate --model if explicitly set via CLI
12
- const modelOverride = getMainLoopModelOverride();
13
- if (modelOverride) {
14
- flags.push(`--model ${quote([modelOverride])}`);
15
- }
16
- // Propagate --settings if set via CLI
17
- const settingsPath = getFlagSettingsPath();
18
- if (settingsPath) {
19
- flags.push(`--settings ${quote([settingsPath])}`);
20
- }
21
- // Propagate --plugin-dir for each inline plugin
22
- const inlinePlugins = getInlinePlugins();
23
- for (const pluginDir of inlinePlugins) {
24
- flags.push(`--plugin-dir ${quote([pluginDir])}`);
25
- }
26
- // Propagate --teammate-mode so tmux teammates use the same mode as leader
27
- const sessionMode = getTeammateModeFromSnapshot();
28
- flags.push(`--teammate-mode ${sessionMode}`);
29
- // Propagate --chrome / --no-chrome if explicitly set on the CLI
30
- const chromeFlagOverride = getChromeFlagOverride();
31
- if (chromeFlagOverride === true) {
32
- flags.push('--chrome');
33
- }
34
- else if (chromeFlagOverride === false) {
35
- flags.push('--no-chrome');
36
- }
37
- return flags.join(' ');
38
- }
39
- /**
40
- * Environment variables that must be explicitly forwarded to tmux-spawned
41
- * teammates. Tmux may start a new login shell that doesn't inherit the
42
- * parent's env, so we forward any that are set in the current process.
43
- */
44
- const TEAMMATE_ENV_VARS = [
45
- // API provider selection — without these, teammates default to firstParty
46
- // and send requests to the wrong endpoint (GitHub issue #23561)
47
- 'CLAUDE_CODE_USE_BEDROCK',
48
- 'CLAUDE_CODE_USE_VERTEX',
49
- 'CLAUDE_CODE_USE_FOUNDRY',
50
- // Custom API endpoint
51
- 'ANTHROPIC_BASE_URL',
52
- // Config directory override
53
- 'CLAUDE_CONFIG_DIR',
54
- // CCR marker — teammates need this for CCR-aware code paths. Auth finds
55
- // its own way via /home/claude/.claude/remote/.oauth_token regardless;
56
- // the FD env var wouldn't help (pipe FDs don't cross tmux).
57
- 'CLAUDE_CODE_REMOTE',
58
- // Auto-memory gate (memdir/paths.ts) checks REMOTE && !MEMORY_DIR to
59
- // disable memory on ephemeral CCR filesystems. Forwarding REMOTE alone
60
- // would flip teammates to memory-off when the parent has it on.
61
- 'CLAUDE_CODE_REMOTE_MEMORY_DIR',
62
- // Upstream proxy — the parent's MITM relay is reachable from teammates
63
- // (same container network). Forward the proxy vars so teammates route
64
- // customer-configured upstream traffic through the relay for credential
65
- // injection. Without these, teammates bypass the proxy entirely.
66
- 'HTTPS_PROXY',
67
- 'https_proxy',
68
- 'HTTP_PROXY',
69
- 'http_proxy',
70
- 'NO_PROXY',
71
- 'no_proxy',
72
- 'SSL_CERT_FILE',
73
- 'NODE_EXTRA_CA_CERTS',
74
- 'REQUESTS_CA_BUNDLE',
75
- 'CURL_CA_BUNDLE',
76
- ];
77
- /**
78
- * Builds the `env KEY=VALUE ...` string for teammate spawn commands.
79
- * Always includes CLAUDECODE=1 and CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1,
80
- * plus any provider/config env vars that are set in the current process.
81
- */
82
- export function buildInheritedEnvVars() {
83
- const envVars = ['CLAUDECODE=1', 'CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1'];
84
- for (const key of TEAMMATE_ENV_VARS) {
85
- const value = process.env[key];
86
- if (value !== undefined && value !== '') {
87
- envVars.push(`${key}=${quote([value])}`);
88
- }
89
- }
90
- return envVars.join(' ');
91
- }
1
+ import{getChromeFlagOverride as o,getFlagSettingsPath as s,getInlinePlugins as t,getMainLoopModelOverride as e,getSessionBypassPermissionsMode as n}from"../../bootstrap/state.js";import{quote as E}from"../bash/shellQuote.js";import{isInBundledMode as r}from"../bundledMode.js";import{getTeammateModeFromSnapshot as p}from"./backends/teammateModeSnapshot.js";import{TEAMMATE_COMMAND_ENV_VAR as _}from"./constants.js";export function getTeammateCommand(){return process.env[_]?process.env[_]:r()?process.execPath:process.argv[1]}export function buildInheritedCliFlags(r){const _=[],{planModeRequired:i,permissionMode:c}=r||{};i||("bypassPermissions"===c||n()?_.push("--dangerously-skip-permissions"):"acceptEdits"===c&&_.push("--permission-mode acceptEdits"));const m=e();m&&_.push(`--model ${E([m])}`);const C=s();C&&_.push(`--settings ${E([C])}`);const a=t();for(const o of a)_.push(`--plugin-dir ${E([o])}`);const u=p();_.push(`--teammate-mode ${u}`);const D=o();return!0===D?_.push("--chrome"):!1===D&&_.push("--no-chrome"),_.join(" ")}const i=["CLAUDE_CODE_USE_BEDROCK","CLAUDE_CODE_USE_VERTEX","CLAUDE_CODE_USE_FOUNDRY","ANTHROPIC_BASE_URL","CLAUDE_CONFIG_DIR","CLAUDE_CODE_REMOTE","CLAUDE_CODE_REMOTE_MEMORY_DIR","HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","NO_PROXY","no_proxy","SSL_CERT_FILE","NODE_EXTRA_CA_CERTS","REQUESTS_CA_BUNDLE","CURL_CA_BUNDLE"];export function buildInheritedEnvVars(){const o=["CLAUDECODE=1","CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1"];for(const s of i){const t=process.env[s];void 0!==t&&""!==t&&o.push(`${s}=${E([t])}`)}return o.join(" ")}
@@ -1 +1 @@
1
- import{logForDebugging as e}from"../debug.js";import{addFunctionHook as t}from"../hooks/sessionHooks.js";import{applyPermissionUpdate as a}from"../permissions/PermissionUpdate.js";import{jsonStringify as o}from"../slowOperations.js";import{getTeammateColor as i}from"../teammate.js";import{createIdleNotification as m,getLastPeerDmSummary as s,writeToMailbox as n}from"../teammateMailbox.js";import{readTeamFile as r,setMemberActive as l}from"./teamHelpers.js";export function initializeTeammateHooks(d,p,f){const{teamName:g,agentId:h,agentName:c}=f,u=r(g);if(!u)return void e(`[TeammateInit] Team file not found for team: ${g}`);const w=u.leadAgentId;if(u.teamAllowedPaths&&u.teamAllowedPaths.length>0){e(`[TeammateInit] Found ${u.teamAllowedPaths.length} team-wide allowed path(s)`);for(const t of u.teamAllowedPaths){const o=t.path.startsWith("/")?`/${t.path}/**`:`${t.path}/**`;e(`[TeammateInit] Applying team permission: ${t.toolName} allowed in ${t.path} (rule: ${o})`),d(e=>({...e,toolPermissionContext:a(e.toolPermissionContext,{type:"addRules",rules:[{toolName:t.toolName,ruleContent:o}],behavior:"allow",destination:"session"})}))}}const T=u.members.find(e=>e.agentId===w),I=T?.name||"team-lead";h!==w?(e(`[TeammateInit] Registering Stop hook for teammate ${c} to notify leader ${I}`),t(d,p,"Stop","",async(t,a)=>{l(g,c,!1);const r=m(c,{idleReason:"available",summary:s(t)});return await n(I,{from:c,text:o(r),timestamp:(new Date).toISOString(),color:i()}),e(`[TeammateInit] Sent idle notification to leader ${I}`),!0},"Failed to send idle notification to team leader",{timeout:1e4})):e("[TeammateInit] This agent is the team leader - skipping idle notification hook")}
1
+ import{logForDebugging as t}from"../debug.js";import{addFunctionHook as e}from"../hooks/sessionHooks.js";import{applyPermissionUpdate as o}from"../permissions/PermissionUpdate.js";import{jsonStringify as a}from"../slowOperations.js";import{getTeammateColor as i}from"../teammate.js";import{createIdleNotification as m,getLastPeerDmSummary as n,writeToMailbox as s}from"../teammateMailbox.js";import{readTeamFile as l,setMemberActive as r}from"./teamHelpers.js";export function initializeTeammateHooks(d,p,f){const{teamName:h,agentId:g,agentName:c}=f,u=l(h);if(!u)return void t(`[TeammateInit] Team file not found for team: ${h}`);const w=u.leadAgentId;if(u.teamAllowedPaths&&u.teamAllowedPaths.length>0){t(`[TeammateInit] Found ${u.teamAllowedPaths.length} team-wide allowed path(s)`);for(const e of u.teamAllowedPaths){const a=e.path.startsWith("/")?`/${e.path}/**`:`${e.path}/**`;t(`[TeammateInit] Applying team permission: ${e.toolName} allowed in ${e.path} (rule: ${a})`),d(t=>({...t,toolPermissionContext:o(t.toolPermissionContext,{type:"addRules",rules:[{toolName:e.toolName,ruleContent:a}],behavior:"allow",destination:"session"})}))}}const I=u.members.find(t=>t.agentId===w),$=I?.name||"team-lead";g!==w?(t(`[TeammateInit] Registering Stop hook for teammate ${c} to notify leader ${$}`),e(d,p,"Stop","",async(e,o)=>{r(h,c,!1);const l=m(c,{idleReason:"available",summary:n(e)});return await s($,{from:c,text:a(l),timestamp:(new Date).toISOString(),color:i()}),t(`[TeammateInit] Sent idle notification to leader ${$}`),!0},"Failed to send idle notification to team leader",{timeout:1e4})):t("[TeammateInit] This agent is the team leader - skipping idle notification hook")}
@@ -1 +1 @@
1
- import{homedir as o}from"os";import{join as D}from"path";import{logForDebugging as t}from"./debug.js";import{getPlatform as e}from"./platform.js";export function getSystemDirectories(s){const r=s?.platform??e(),n=s?.homedir??o(),O=s?.env??process.env,a={HOME:n,DESKTOP:D(n,"Desktop"),DOCUMENTS:D(n,"Documents"),DOWNLOADS:D(n,"Downloads")};switch(r){case"windows":{const o=O.USERPROFILE||n;return{HOME:n,DESKTOP:D(o,"Desktop"),DOCUMENTS:D(o,"Documents"),DOWNLOADS:D(o,"Downloads")}}case"linux":case"wsl":return{HOME:n,DESKTOP:O.XDG_DESKTOP_DIR||a.DESKTOP,DOCUMENTS:O.XDG_DOCUMENTS_DIR||a.DOCUMENTS,DOWNLOADS:O.XDG_DOWNLOAD_DIR||a.DOWNLOADS};default:return"unknown"===r&&t("Unknown platform detected, using default paths"),a}}
1
+ import{homedir as D}from"os";import{join as o}from"path";import{logForDebugging as t}from"./debug.js";import{getPlatform as e}from"./platform.js";export function getSystemDirectories(O){const s=O?.platform??e(),n=O?.homedir??D(),r=O?.env??process.env,S={HOME:n,DESKTOP:o(n,"Desktop"),DOCUMENTS:o(n,"Documents"),DOWNLOADS:o(n,"Downloads")};switch(s){case"windows":{const D=r.USERPROFILE||n;return{HOME:n,DESKTOP:o(D,"Desktop"),DOCUMENTS:o(D,"Documents"),DOWNLOADS:o(D,"Downloads")}}case"linux":case"wsl":return{HOME:n,DESKTOP:r.XDG_DESKTOP_DIR||S.DESKTOP,DOCUMENTS:r.XDG_DOCUMENTS_DIR||S.DOCUMENTS,DOWNLOADS:r.XDG_DOWNLOAD_DIR||S.DOWNLOADS};default:return"unknown"===s&&t("Unknown platform detected, using default paths"),S}}
@@ -1 +1 @@
1
- import{createRequire as t}from"module";const e=t(import.meta.url);import{feature as o}from"bun:bundle";import{logEvent as r}from"../services/analytics/index.js";import{isBuiltInAgent as s}from"../tools/AgentTool/loadAgentsDir.js";import{isEnvTruthy as m}from"./envUtils.js";import{asSystemPrompt as n}from"./systemPromptType.js";export{asSystemPrompt}from"./systemPromptType.js";const i=o("PROACTIVE")||o("KAIROS")?e("../proactive/index.js"):null;export function buildEffectiveSystemPrompt({mainThreadAgentDefinition:t,toolUseContext:p,customSystemPrompt:a,defaultSystemPrompt:c,appendSystemPrompt:y,overrideSystemPrompt:u}){if(u)return n([u]);if(o("COORDINATOR_MODE")&&(m(process.env.CONTEXT_CODE_COORDINATOR_MODE)||m(process.env.CLAUDE_CODE_COORDINATOR_MODE))&&!t){const{getCoordinatorSystemPrompt:t}=e("../coordinator/coordinatorMode.js");return n([t(),...y?[y]:[]])}const O=t?s(t)?t.getSystemPrompt({toolUseContext:{options:p.options}}):t.getSystemPrompt():void 0;return t?.memory&&r("tengu_agent_memory_loaded",{..."ant"===process.env.USER_TYPE&&{agent_type:t.agentType},scope:t.memory,source:"main-thread"}),O&&(o("PROACTIVE")||o("KAIROS"))&&i?.isProactiveActive()?n([...c,`\n# Custom Agent Instructions\n${O}`,...y?[y]:[]]):n([...O?[O]:a?[a]:c,...y?[y]:[]])}
1
+ import{feature as t}from"../recovery/bunBundleShim.js";import{createRequire as o}from"module";const e=o(import.meta.url);import{logEvent as r}from"../services/analytics/index.js";import{isBuiltInAgent as m}from"../tools/AgentTool/loadAgentsDir.js";import{isEnvTruthy as s}from"./envUtils.js";import{asSystemPrompt as n}from"./systemPromptType.js";export{asSystemPrompt}from"./systemPromptType.js";const i=t("PROACTIVE")||t("KAIROS")?e("../proactive/index.js"):null;export function buildEffectiveSystemPrompt({mainThreadAgentDefinition:o,toolUseContext:p,customSystemPrompt:a,defaultSystemPrompt:c,appendSystemPrompt:y,overrideSystemPrompt:O}){if(O)return n([O]);if(t("COORDINATOR_MODE")&&(s(process.env.CONTEXT_CODE_COORDINATOR_MODE)||s(process.env.CLAUDE_CODE_COORDINATOR_MODE))&&!o){const{getCoordinatorSystemPrompt:t}=e("../coordinator/coordinatorMode.js");return n([t(),...y?[y]:[]])}const d=o?m(o)?o.getSystemPrompt({toolUseContext:{options:p.options}}):o.getSystemPrompt():void 0;return o?.memory&&r("tengu_agent_memory_loaded",{..."ant"===process.env.USER_TYPE&&{agent_type:o.agentType},scope:o.memory,source:"main-thread"}),d&&(t("PROACTIVE")||t("KAIROS"))&&i?.isProactiveActive()?n([...c,`\n# Custom Agent Instructions\n${d}`,...y?[y]:[]]):n([...d?[d]:a?[a]:c,...y?[y]:[]])}
@@ -1 +1 @@
1
- let e;export function getSystemThemeName(){return void 0===e&&(e=function(){const e=process.env.COLORFGBG;if(!e)return;const t=e.split(";"),n=t[t.length-1];if(void 0===n||""===n)return;const o=Number(n);return!Number.isInteger(o)||o<0||o>15?void 0:o<=6||8===o?"dark":"light"}()??"dark"),e}export function setCachedSystemTheme(t){e=t}export function resolveThemeSetting(e){return"auto"===e?getSystemThemeName():e}export function themeFromOscColor(e){const t=function(e){const t=/^rgba?:([0-9a-f]{1,4})\/([0-9a-f]{1,4})\/([0-9a-f]{1,4})/i.exec(e);if(t)return{r:hexComponent(t[1]),g:hexComponent(t[2]),b:hexComponent(t[3])};const n=/^#([0-9a-f]+)$/i.exec(e);if(n&&n[1].length%3==0){const e=n[1],t=e.length/3;return{r:hexComponent(e.slice(0,t)),g:hexComponent(e.slice(t,2*t)),b:hexComponent(e.slice(2*t))}}}(e);if(t)return.2126*t.r+.7152*t.g+.0722*t.b>.5?"light":"dark"}function hexComponent(e){const t=16**e.length-1;return parseInt(e,16)/t}
1
+ let e;export function getSystemThemeName(){return void 0===e&&(e=function(){const e=process.env.COLORFGBG;if(!e)return;const t=e.split(";"),n=t[t.length-1];if(void 0===n||""===n)return;const o=Number(n);return!Number.isInteger(o)||o<0||o>15?void 0:o<=6||8===o?"dark":"light"}()??"dark"),e}export function setCachedSystemTheme(t){e=t}export function resolveThemeSetting(e){return"auto"===e?getSystemThemeName():e}export function themeFromOscColor(e){const t=function(e){const t=/^rgba?:([0-9a-f]{1,4})\/([0-9a-f]{1,4})\/([0-9a-f]{1,4})/i.exec(e);if(t)return{r:hexComponent(t[1]),g:hexComponent(t[2]),b:hexComponent(t[3])};const n=/^#([0-9a-f]+)$/i.exec(e);if(n&&n[1].length%3==0){const e=n[1],t=e.length/3;return{r:hexComponent(e.slice(0,t)),g:hexComponent(e.slice(t,2*t)),b:hexComponent(e.slice(2*t))}}return}(e);if(!t)return;return.2126*t.r+.7152*t.g+.0722*t.b>.5?"light":"dark"}function hexComponent(e){const t=16**e.length-1;return parseInt(e,16)/t}
@@ -1 +1 @@
1
- import{unlink as t}from"fs/promises";import{CircularBuffer as s}from"../CircularBuffer.js";import{logForDebugging as e}from"../debug.js";import{readFileRange as i,tailFile as u}from"../fsOperations.js";import{getMaxOutputLength as a}from"../shell/outputLimits.js";import{safeJoinLines as n}from"../stringUtils.js";import{DiskTaskOutput as r,getTaskOutputPath as h}from"./diskOutput.js";export class TaskOutput{taskId;path;stdoutToFile;#t="";#s="";#e=null;#i=new s(1e3);#u=0;#a=0;#n;#r;#h=!1;#l=0;static#o=new Map;static#p=new Map;static#d=null;constructor(t,s,e=!1,i=8388608){this.taskId=t,this.path=h(t),this.stdoutToFile=e,this.#n=i,this.#r=s,e&&s&&TaskOutput.#o.set(t,this)}static startPolling(t){const s=TaskOutput.#o.get(t);s&&s.#r&&(TaskOutput.#p.set(t,s),TaskOutput.#d||(TaskOutput.#d=setInterval(TaskOutput.#c,1e3),TaskOutput.#d.unref()))}static stopPolling(t){TaskOutput.#p.delete(t),0===TaskOutput.#p.size&&TaskOutput.#d&&(clearInterval(TaskOutput.#d),TaskOutput.#d=null)}static#c(){for(const[,t]of TaskOutput.#p)t.#r&&u(t.path,4096).then(({content:s,bytesRead:e,bytesTotal:i})=>{if(!t.#r)return;if(!s)return void t.#r("","",t.#u,i,!1);let u=s.length,a=0,n=0,r=0;for(;u>0;)u=s.lastIndexOf("\n",u-1),r++,5===r&&(a=u<=0?0:u+1),100===r&&(n=u<=0?0:u+1);const h=e>=i?r:Math.max(t.#u,Math.round(i/e*r));t.#u=h,t.#a=i,t.#r(s.slice(a),s.slice(n),h,i,e<i)},()=>{})}writeStdout(t){this.#f(t,!1)}writeStderr(t){this.#f(t,!0)}#f(t,s){this.#a+=t.length,this.#g(t),this.#e?this.#e.append(s?`[stderr] ${t}`:t):this.#t.length+this.#s.length+t.length>this.#n?this.#k(s?t:null,s?null:t):s?this.#s+=t:this.#t+=t}#g(t){let s=0;const e=[];let i=0,u=t.length;for(;u>0;){const a=t.lastIndexOf("\n",u-1);if(-1===a)break;if(s++,e.length<100&&i<4096){const s=u-a-1;if(s>0&&s<=4096-i){const n=t.slice(a+1,u);n.trim()&&(e.push(Buffer.from(n).toString()),i+=s)}}u=a}this.#u+=s;for(let t=e.length-1;t>=0;t--)this.#i.add(e[t]);if(this.#r&&e.length>0){const t=this.#i.getRecent(5);this.#r(n(t,"\n"),n(this.#i.getRecent(100),"\n"),this.#u,this.#a,null!==this.#e)}}#k(t,s){this.#e=new r(this.taskId),this.#t&&(this.#e.append(this.#t),this.#t=""),this.#s&&(this.#e.append(`[stderr] ${this.#s}`),this.#s=""),s&&this.#e.append(s),t&&this.#e.append(`[stderr] ${t}`)}async getStdout(){if(this.stdoutToFile)return this.#O();if(this.#e){const t=this.#i.getRecent(5),s=n(t,"\n"),e=`\nOutput truncated (${Math.round(this.#a/1024)}KB total). Full output saved to: ${this.path}`;return s?s+e:e.trimStart()}return this.#t}async#O(){const t=a();try{const s=await i(this.path,0,t);if(!s)return this.#h=!0,"";const{content:e,bytesRead:u,bytesTotal:a}=s;return this.#l=a,this.#h=a<=u,e}catch(t){const s=t instanceof Error&&"code"in t?String(t.code):"unknown";return e(`TaskOutput.#readStdoutFromFile: failed to read ${this.path} (${s}): ${t}`),`<bash output unavailable: output file ${this.path} could not be read (${s}). This usually means another Context Code process in the same project deleted it during startup cleanup.>`}}getStderr(){return this.#e?"":this.#s}get isOverflowed(){return null!==this.#e}get totalLines(){return this.#u}get totalBytes(){return this.#a}get outputFileRedundant(){return this.#h}get outputFileSize(){return this.#l}spillToDisk(){this.#e||this.#k(null,null)}async flush(){await(this.#e?.flush())}async deleteOutputFile(){try{await t(this.path)}catch{}}clear(){this.#t="",this.#s="",this.#i.clear(),this.#r=null,this.#e?.cancel(),TaskOutput.stopPolling(this.taskId),TaskOutput.#o.delete(this.taskId)}}
1
+ import{unlink as t}from"fs/promises";import{CircularBuffer as s}from"../CircularBuffer.js";import{logForDebugging as e}from"../debug.js";import{readFileRange as i,tailFile as r}from"../fsOperations.js";import{getMaxOutputLength as o}from"../shell/outputLimits.js";import{safeJoinLines as n}from"../stringUtils.js";import{DiskTaskOutput as u,getTaskOutputPath as l}from"./diskOutput.js";export class TaskOutput{taskId;path;stdoutToFile;#t="";#s="";#e=null;#i=new s(1e3);#r=0;#o=0;#n;#u;#l=!1;#a=0;static#h=new Map;static#d=new Map;static#p=null;constructor(t,s,e=!1,i=8388608){this.taskId=t,this.path=l(t),this.stdoutToFile=e,this.#n=i,this.#u=s,e&&s&&TaskOutput.#h.set(t,this)}static startPolling(t){const s=TaskOutput.#h.get(t);s&&s.#u&&(TaskOutput.#d.set(t,s),TaskOutput.#p||(TaskOutput.#p=setInterval(TaskOutput.#f,1e3),TaskOutput.#p.unref()))}static stopPolling(t){TaskOutput.#d.delete(t),0===TaskOutput.#d.size&&TaskOutput.#p&&(clearInterval(TaskOutput.#p),TaskOutput.#p=null)}static#f(){for(const[,t]of TaskOutput.#d)t.#u&&r(t.path,4096).then(({content:s,bytesRead:e,bytesTotal:i})=>{if(!t.#u)return;if(!s)return void t.#u("","",t.#r,i,!1);let r=s.length,o=0,n=0,u=0;for(;r>0;)r=s.lastIndexOf("\n",r-1),u++,5===u&&(o=r<=0?0:r+1),100===u&&(n=r<=0?0:r+1);const l=e>=i?u:Math.max(t.#r,Math.round(i/e*u));t.#r=l,t.#o=i,t.#u(s.slice(o),s.slice(n),l,i,e<i)},()=>{})}writeStdout(t){this.#c(t,!1)}writeStderr(t){this.#c(t,!0)}#c(t,s){if(this.#o+=t.length,this.#g(t),this.#e)return void this.#e.append(s?`[stderr] ${t}`:t);this.#t.length+this.#s.length+t.length>this.#n?this.#k(s?t:null,s?null:t):s?this.#s+=t:this.#t+=t}#g(t){let s=0;const e=[];let i=0,r=t.length;for(;r>0;){const o=t.lastIndexOf("\n",r-1);if(-1===o)break;if(s++,e.length<100&&i<4096){const s=r-o-1;if(s>0&&s<=4096-i){const n=t.slice(o+1,r);n.trim()&&(e.push(Buffer.from(n).toString()),i+=s)}}r=o}this.#r+=s;for(let t=e.length-1;t>=0;t--)this.#i.add(e[t]);if(this.#u&&e.length>0){const t=this.#i.getRecent(5);this.#u(n(t,"\n"),n(this.#i.getRecent(100),"\n"),this.#r,this.#o,null!==this.#e)}}#k(t,s){this.#e=new u(this.taskId),this.#t&&(this.#e.append(this.#t),this.#t=""),this.#s&&(this.#e.append(`[stderr] ${this.#s}`),this.#s=""),s&&this.#e.append(s),t&&this.#e.append(`[stderr] ${t}`)}async getStdout(){if(this.stdoutToFile)return this.#m();if(this.#e){const t=this.#i.getRecent(5),s=n(t,"\n"),e=`\nOutput truncated (${Math.round(this.#o/1024)}KB total). Full output saved to: ${this.path}`;return s?s+e:e.trimStart()}return this.#t}async#m(){const t=o();try{const s=await i(this.path,0,t);if(!s)return this.#l=!0,"";const{content:e,bytesRead:r,bytesTotal:o}=s;return this.#a=o,this.#l=o<=r,e}catch(t){const s=t instanceof Error&&"code"in t?String(t.code):"unknown";return e(`TaskOutput.#readStdoutFromFile: failed to read ${this.path} (${s}): ${t}`),`<bash output unavailable: output file ${this.path} could not be read (${s}). This usually means another Context Code process in the same project deleted it during startup cleanup.>`}}getStderr(){return this.#e?"":this.#s}get isOverflowed(){return null!==this.#e}get totalLines(){return this.#r}get totalBytes(){return this.#o}get outputFileRedundant(){return this.#l}get outputFileSize(){return this.#a}spillToDisk(){this.#e||this.#k(null,null)}async flush(){await(this.#e?.flush())}async deleteOutputFile(){try{await t(this.path)}catch{}}clear(){this.#t="",this.#s="",this.#i.clear(),this.#u=null,this.#e?.cancel(),TaskOutput.stopPolling(this.taskId),TaskOutput.#h.delete(this.taskId)}}
@@ -1 +1 @@
1
- import{constants as t}from"fs";import{mkdir as s,open as e,stat as a,symlink as n,unlink as r}from"fs/promises";import{join as i}from"path";import{getSessionId as u}from"../../bootstrap/state.js";import{getErrnoCode as o}from"../errors.js";import{readFileRange as c,tailFile as p}from"../fsOperations.js";import{logError as l}from"../log.js";import{getProjectTempDir as f}from"../permissions/filesystem.js";const h=t.O_NOFOLLOW??0;export const MAX_TASK_OUTPUT_BYTES=5368709120;export const MAX_TASK_OUTPUT_BYTES_DISPLAY="5GB";let O;export function getTaskOutputDir(){return void 0===O&&(O=i(f(),u(),"tasks")),O}export function _resetTaskOutputDirForTest(){O=void 0}async function ensureOutputDir(){await s(getTaskOutputDir(),{recursive:!0})}export function getTaskOutputPath(t){return i(getTaskOutputDir(),`${t}.output`)}const T=new Set;function track(t){return T.add(t),t.finally(()=>T.delete(t)).catch(()=>{}),t}export class DiskTaskOutput{#t;#s=null;#e=[];#a=0;#n=!1;#r=null;#i=null;constructor(t){this.#t=getTaskOutputPath(t)}append(t){this.#n||(this.#a+=t.length,this.#a>5368709120?(this.#n=!0,this.#e.push("\n[output truncated: exceeded 5GB disk cap]\n")):this.#e.push(t),this.#r||(this.#r=new Promise(t=>{this.#i=t}),track(this.#u())))}flush(){return this.#r??Promise.resolve()}cancel(){this.#e.length=0}async#o(){for(;;){try{for(this.#s||(await ensureOutputDir(),this.#s=await e(this.#t,"win32"===process.platform?"a":t.O_WRONLY|t.O_APPEND|t.O_CREAT|h));await this.#c(),0!==this.#e.length;);}finally{if(this.#s){const t=this.#s;this.#s=null,await t.close()}}if(!this.#e.length)break}}#c(){return this.#s.appendFile(this.#p())}#p(){const t=this.#e.splice(0,this.#e.length);let s=0;for(const e of t)s+=Buffer.byteLength(e,"utf8");const e=Buffer.allocUnsafe(s);let a=0;for(const s of t)a+=e.write(s,a,"utf8");return e}async#u(){try{await this.#o()}catch(t){if(l(t),this.#e.length>0)try{await this.#o()}catch(t){l(t)}}finally{const t=this.#i;this.#r=null,this.#i=null,t()}}}const k=new Map;export async function _clearOutputsForTest(){for(const t of k.values())t.cancel();for(;T.size>0;)await Promise.allSettled([...T]);k.clear()}export function appendTaskOutput(t,s){(function(t){let s=k.get(t);return s||(s=new DiskTaskOutput(t),k.set(t,s)),s})(t).append(s)}export async function flushTaskOutput(t){const s=k.get(t);s&&await s.flush()}export function evictTaskOutput(t){return track((async()=>{const s=k.get(t);s&&(await s.flush(),k.delete(t))})())}export async function getTaskOutputDelta(t,s,e=8388608){try{const a=await c(getTaskOutputPath(t),s,e);return a?{content:a.content,newOffset:s+a.bytesRead}:{content:"",newOffset:s}}catch(t){return"ENOENT"===o(t)||l(t),{content:"",newOffset:s}}}export async function getTaskOutput(t,s=8388608){try{const{content:e,bytesTotal:a,bytesRead:n}=await p(getTaskOutputPath(t),s);return a>n?`[${Math.round((a-n)/1024)}KB of earlier output omitted]\n${e}`:e}catch(t){return"ENOENT"===o(t)||l(t),""}}export async function getTaskOutputSize(t){try{return(await a(getTaskOutputPath(t))).size}catch(t){return"ENOENT"===o(t)||l(t),0}}export async function cleanupTaskOutput(t){const s=k.get(t);s&&(s.cancel(),k.delete(t));try{await r(getTaskOutputPath(t))}catch(t){if("ENOENT"===o(t))return;l(t)}}export function initTaskOutput(s){return track((async()=>{await ensureOutputDir();const a=getTaskOutputPath(s),n=await e(a,"win32"===process.platform?"wx":t.O_WRONLY|t.O_CREAT|t.O_EXCL|h);return await n.close(),a})())}export function initTaskOutputAsSymlink(t,s){return track((async()=>{try{await ensureOutputDir();const e=getTaskOutputPath(t);try{await n(s,e)}catch{await r(e),await n(s,e)}return e}catch(s){return l(s),initTaskOutput(t)}})())}
1
+ import{constants as t}from"fs";import{mkdir as e,open as s,stat as n,symlink as u,unlink as a}from"fs/promises";import{join as r}from"path";import{getSessionId as i}from"../../bootstrap/state.js";import{getErrnoCode as o}from"../errors.js";import{readFileRange as c,tailFile as l}from"../fsOperations.js";import{logError as p}from"../log.js";import{getProjectTempDir as f}from"../permissions/filesystem.js";const h=t.O_NOFOLLOW??0;export const MAX_TASK_OUTPUT_BYTES=5368709120;export const MAX_TASK_OUTPUT_BYTES_DISPLAY="5GB";let O;export function getTaskOutputDir(){return void 0===O&&(O=r(f(),i(),"tasks")),O}export function _resetTaskOutputDirForTest(){O=void 0}async function ensureOutputDir(){await e(getTaskOutputDir(),{recursive:!0})}export function getTaskOutputPath(t){return r(getTaskOutputDir(),`${t}.output`)}const T=new Set;function track(t){return T.add(t),t.finally(()=>T.delete(t)).catch(()=>{}),t}export class DiskTaskOutput{#t;#e=null;#s=[];#n=0;#u=!1;#a=null;#r=null;constructor(t){this.#t=getTaskOutputPath(t)}append(t){this.#u||(this.#n+=t.length,this.#n>5368709120?(this.#u=!0,this.#s.push("\n[output truncated: exceeded 5GB disk cap]\n")):this.#s.push(t),this.#a||(this.#a=new Promise(t=>{this.#r=t}),track(this.#i())))}flush(){return this.#a??Promise.resolve()}cancel(){this.#s.length=0}async#o(){for(;;){try{for(this.#e||(await ensureOutputDir(),this.#e=await s(this.#t,"win32"===process.platform?"a":t.O_WRONLY|t.O_APPEND|t.O_CREAT|h));await this.#c(),0!==this.#s.length;);}finally{if(this.#e){const t=this.#e;this.#e=null,await t.close()}}if(!this.#s.length)break}}#c(){return this.#e.appendFile(this.#l())}#l(){const t=this.#s.splice(0,this.#s.length);let e=0;for(const s of t)e+=Buffer.byteLength(s,"utf8");const s=Buffer.allocUnsafe(e);let n=0;for(const e of t)n+=s.write(e,n,"utf8");return s}async#i(){try{await this.#o()}catch(t){if(p(t),this.#s.length>0)try{await this.#o()}catch(t){p(t)}}finally{const t=this.#r;this.#a=null,this.#r=null,t()}}}const k=new Map;export async function _clearOutputsForTest(){for(const t of k.values())t.cancel();for(;T.size>0;)await Promise.allSettled([...T]);k.clear()}export function appendTaskOutput(t,e){(function(t){let e=k.get(t);return e||(e=new DiskTaskOutput(t),k.set(t,e)),e})(t).append(e)}export async function flushTaskOutput(t){const e=k.get(t);e&&await e.flush()}export function evictTaskOutput(t){return track((async()=>{const e=k.get(t);e&&(await e.flush(),k.delete(t))})())}export async function getTaskOutputDelta(t,e,s=8388608){try{const n=await c(getTaskOutputPath(t),e,s);return n?{content:n.content,newOffset:e+n.bytesRead}:{content:"",newOffset:e}}catch(t){return"ENOENT"===o(t)||p(t),{content:"",newOffset:e}}}export async function getTaskOutput(t,e=8388608){try{const{content:s,bytesTotal:n,bytesRead:u}=await l(getTaskOutputPath(t),e);return n>u?`[${Math.round((n-u)/1024)}KB of earlier output omitted]\n${s}`:s}catch(t){return"ENOENT"===o(t)||p(t),""}}export async function getTaskOutputSize(t){try{return(await n(getTaskOutputPath(t))).size}catch(t){return"ENOENT"===o(t)||p(t),0}}export async function cleanupTaskOutput(t){const e=k.get(t);e&&(e.cancel(),k.delete(t));try{await a(getTaskOutputPath(t))}catch(t){if("ENOENT"===o(t))return;p(t)}}export function initTaskOutput(e){return track((async()=>{await ensureOutputDir();const n=getTaskOutputPath(e),u=await s(n,"win32"===process.platform?"wx":t.O_WRONLY|t.O_CREAT|t.O_EXCL|h);return await u.close(),n})())}export function initTaskOutputAsSymlink(t,e){return track((async()=>{try{await ensureOutputDir();const s=getTaskOutputPath(t);try{await u(e,s)}catch{await a(s),await u(e,s)}return s}catch(e){return p(e),initTaskOutput(t)}})())}
@@ -1 +1 @@
1
- import{mkdir as t,readdir as a,readFile as e,unlink as s,writeFile as n}from"fs/promises";import{join as r}from"path";import{z as i}from"zod/v4";import{getIsNonInteractiveSession as o,getSessionId as c}from"../bootstrap/state.js";import{uniq as u}from"./array.js";import{logForDebugging as l}from"./debug.js";import{getClaudeConfigHomeDir as k,getTeamsDir as d,isEnvTruthy as m}from"./envUtils.js";import{errorMessage as f,getErrnoCode as g}from"./errors.js";import{lazySchema as p}from"./lazySchema.js";import*as T from"./lockfile.js";import{logError as w}from"./log.js";import{createSignal as h}from"./signal.js";import{jsonParse as y,jsonStringify as b}from"./slowOperations.js";import{getTeamName as _}from"./teammate.js";import{getTeammateContext as S}from"./teammateContext.js";const x=h();let j;export function setLeaderTeamName(t){j!==t&&(j=t,notifyTasksUpdated())}export function clearLeaderTeamName(){void 0!==j&&(j=void 0,notifyTasksUpdated())}export const onTasksUpdated=x.subscribe;export function notifyTasksUpdated(){try{x.emit()}catch{}}export const TASK_STATUSES=["pending","in_progress","completed"];export const TaskStatusSchema=p(()=>i.enum(["pending","in_progress","completed"]));export const TaskSchema=p(()=>i.object({id:i.string(),subject:i.string(),description:i.string(),activeForm:i.string().optional(),owner:i.string().optional(),status:TaskStatusSchema(),blocks:i.array(i.string()),blockedBy:i.array(i.string()),metadata:i.record(i.string(),i.unknown()).optional()}));const E={retries:{retries:30,minTimeout:5,maxTimeout:100}};function getHighWaterMarkPath(t){return r(getTasksDir(t),".highwatermark")}async function readHighWaterMark(t){const a=getHighWaterMarkPath(t);try{const t=(await e(a,"utf-8")).trim(),s=parseInt(t,10);return isNaN(s)?0:s}catch{return 0}}async function writeHighWaterMark(t,a){const e=getHighWaterMarkPath(t);await n(e,String(a))}export function isTodoV2Enabled(){return!(!m(process.env.CONTEXT_CODE_ENABLE_TASKS)&&!m(process.env.CLAUDE_CODE_ENABLE_TASKS)&&o())}export async function resetTaskList(t){const e=getTasksDir(t),n=await ensureTaskListLockFile(t);let i;try{i=await T.lock(n,E);const o=await findHighestTaskIdFromFiles(t);let c;o>0&&o>await readHighWaterMark(t)&&await writeHighWaterMark(t,o);try{c=await a(e)}catch{c=[]}for(const t of c)if(t.endsWith(".json")&&!t.startsWith(".")){const a=r(e,t);try{await s(a)}catch{}}notifyTasksUpdated()}finally{i&&await i()}}export function getTaskListId(){const t=process.env.CONTEXT_CODE_TASK_LIST_ID??process.env.CLAUDE_CODE_TASK_LIST_ID;if(t)return t;const a=S();return a?a.teamName:_()||j||c()}export function sanitizePathComponent(t){return t.replace(/[^a-zA-Z0-9_-]/g,"-")}export function getTasksDir(t){return r(k(),"tasks",sanitizePathComponent(t))}export function getTaskPath(t,a){return r(getTasksDir(t),`${sanitizePathComponent(a)}.json`)}export async function ensureTasksDir(a){const e=getTasksDir(a);try{await t(e,{recursive:!0})}catch{}}async function findHighestTaskIdFromFiles(t){const e=getTasksDir(t);let s;try{s=await a(e)}catch{return 0}let n=0;for(const t of s){if(!t.endsWith(".json"))continue;const a=parseInt(t.replace(".json",""),10);!isNaN(a)&&a>n&&(n=a)}return n}export async function createTask(t,a){const e=await ensureTaskListLockFile(t);let s;try{s=await T.lock(e,E);const r=await async function(t){const[a,e]=await Promise.all([findHighestTaskIdFromFiles(t),readHighWaterMark(t)]);return Math.max(a,e)}(t),i=String(r+1),o={id:i,...a},c=getTaskPath(t,i);return await n(c,b(o,null,2)),notifyTasksUpdated(),i}finally{s&&await s()}}export async function getTask(t,a){const s=getTaskPath(t,a);try{const t=await e(s,"utf-8"),n=y(t);"ant"===process.env.USER_TYPE&&("open"===n.status?n.status="pending":"resolved"===n.status?n.status="completed":n.status&&["planning","implementing","reviewing","verifying"].includes(n.status)&&(n.status="in_progress"));const r=TaskSchema().safeParse(n);return r.success?r.data:(l(`[Tasks] Task ${a} failed schema validation: ${r.error.message}`),null)}catch(t){return"ENOENT"===g(t)||(l(`[Tasks] Failed to read task ${a}: ${f(t)}`),w(t)),null}}async function updateTaskUnsafe(t,a,e){const s=await getTask(t,a);if(!s)return null;const r={...s,...e,id:a},i=getTaskPath(t,a);return await n(i,b(r,null,2)),notifyTasksUpdated(),r}export async function updateTask(t,a,e){const s=getTaskPath(t,a);if(!await getTask(t,a))return null;let n;try{return n=await T.lock(s,E),await updateTaskUnsafe(t,a,e)}finally{await(n?.())}}export async function deleteTask(t,a){const e=getTaskPath(t,a);try{const n=parseInt(a,10);isNaN(n)||n>await readHighWaterMark(t)&&await writeHighWaterMark(t,n);try{await s(e)}catch(t){if("ENOENT"===g(t))return!1;throw t}const r=await listTasks(t);for(const e of r){const s=e.blocks.filter(t=>t!==a),n=e.blockedBy.filter(t=>t!==a);s.length===e.blocks.length&&n.length===e.blockedBy.length||await updateTask(t,e.id,{blocks:s,blockedBy:n})}return notifyTasksUpdated(),!0}catch{return!1}}export async function listTasks(t){const e=getTasksDir(t);let s;try{s=await a(e)}catch{return[]}const n=s.filter(t=>t.endsWith(".json")).map(t=>t.replace(".json",""));return(await Promise.all(n.map(a=>getTask(t,a)))).filter(t=>null!==t)}export async function blockTask(t,a,e){const[s,n]=await Promise.all([getTask(t,a),getTask(t,e)]);return!(!s||!n||(s.blocks.includes(e)||await updateTask(t,a,{blocks:[...s.blocks,e]}),n.blockedBy.includes(a)||await updateTask(t,e,{blockedBy:[...n.blockedBy,a]}),0))}async function ensureTaskListLockFile(t){await ensureTasksDir(t);const a=function(t){return r(getTasksDir(t),".lock")}(t);try{await n(a,"",{flag:"wx"})}catch{}return a}export async function claimTask(t,a,e,s={}){const n=getTaskPath(t,a);if(!await getTask(t,a))return{success:!1,reason:"task_not_found"};if(s.checkAgentBusy)return async function(t,a,e){const s=await ensureTaskListLockFile(t);let n;try{n=await T.lock(s,E);const r=await listTasks(t),i=r.find(t=>t.id===a);if(!i)return{success:!1,reason:"task_not_found"};if(i.owner&&i.owner!==e)return{success:!1,reason:"already_claimed",task:i};if("completed"===i.status)return{success:!1,reason:"already_resolved",task:i};const o=new Set(r.filter(t=>"completed"!==t.status).map(t=>t.id)),c=i.blockedBy.filter(t=>o.has(t));if(c.length>0)return{success:!1,reason:"blocked",task:i,blockedByTasks:c};const u=r.filter(t=>"completed"!==t.status&&t.owner===e&&t.id!==a);return u.length>0?{success:!1,reason:"agent_busy",task:i,busyWithTasks:u.map(t=>t.id)}:{success:!0,task:await updateTask(t,a,{owner:e})}}catch(t){return l(`[Tasks] Failed to claim task ${a} with busy check: ${f(t)}`),w(t),{success:!1,reason:"task_not_found"}}finally{n&&await n()}}(t,a,e);let r;try{r=await T.lock(n,E);const s=await getTask(t,a);if(!s)return{success:!1,reason:"task_not_found"};if(s.owner&&s.owner!==e)return{success:!1,reason:"already_claimed",task:s};if("completed"===s.status)return{success:!1,reason:"already_resolved",task:s};const i=await listTasks(t),o=new Set(i.filter(t=>"completed"!==t.status).map(t=>t.id)),c=s.blockedBy.filter(t=>o.has(t));return c.length>0?{success:!1,reason:"blocked",task:s,blockedByTasks:c}:{success:!0,task:await updateTaskUnsafe(t,a,{owner:e})}}catch(t){return l(`[Tasks] Failed to claim task ${a}: ${f(t)}`),w(t),{success:!1,reason:"task_not_found"}}finally{r&&await r()}}function sanitizeName(t){return t.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase()}export async function getAgentStatuses(t){const a=await async function(t){const a=d(),s=r(a,sanitizeName(t),"config.json");try{const t=await e(s,"utf-8"),a=y(t);return{leadAgentId:a.leadAgentId,members:a.members.map(t=>({agentId:t.agentId,name:t.name,agentType:t.agentType}))}}catch(a){return"ENOENT"===g(a)||l(`[Tasks] Failed to read team file for ${t}: ${f(a)}`),null}}(t);if(!a)return null;const s=sanitizeName(t),n=await listTasks(s),i=new Map;for(const t of n)if("completed"!==t.status&&t.owner){const a=i.get(t.owner)||[];a.push(t.id),i.set(t.owner,a)}return a.members.map(t=>{const a=i.get(t.name)||[],e=i.get(t.agentId)||[],s=u([...a,...e]);return{agentId:t.agentId,name:t.name,agentType:t.agentType,status:0===s.length?"idle":"busy",currentTasks:s}})}export async function unassignTeammateTasks(t,a,e,s){const n=(await listTasks(t)).filter(t=>"completed"!==t.status&&(t.owner===a||t.owner===e));for(const a of n)await updateTask(t,a.id,{owner:void 0,status:"pending"});n.length>0&&l(`[Tasks] Unassigned ${n.length} task(s) from ${e}`);let r=`${e} ${"terminated"===s?"was terminated":"has shut down"}.`;if(n.length>0){const t=n.map(t=>`#${t.id} "${t.subject}"`).join(", ");r+=` ${n.length} task(s) were unassigned: ${t}. Use TaskList to check availability and TaskUpdate with owner to reassign them to idle teammates.`}return{unassignedTasks:n.map(t=>({id:t.id,subject:t.subject})),notificationMessage:r}}export const DEFAULT_TASKS_MODE_TASK_LIST_ID="tasklist";
1
+ import{mkdir as t,readdir as a,readFile as e,unlink as s,writeFile as n}from"fs/promises";import{join as r}from"path";import{z as i}from"zod/v4";import{getIsNonInteractiveSession as o,getSessionId as c}from"../bootstrap/state.js";import{uniq as u}from"./array.js";import{logForDebugging as l}from"./debug.js";import{getClaudeConfigHomeDir as k,getTeamsDir as d,isEnvTruthy as f}from"./envUtils.js";import{errorMessage as m,getErrnoCode as p}from"./errors.js";import{lazySchema as T}from"./lazySchema.js";import*as g from"./lockfile.js";import{logError as w}from"./log.js";import{createSignal as h}from"./signal.js";import{jsonParse as y,jsonStringify as _}from"./slowOperations.js";import{getTeamName as b}from"./teammate.js";import{getTeammateContext as S}from"./teammateContext.js";const x=h();let j;export function setLeaderTeamName(t){j!==t&&(j=t,notifyTasksUpdated())}export function clearLeaderTeamName(){void 0!==j&&(j=void 0,notifyTasksUpdated())}export const onTasksUpdated=x.subscribe;export function notifyTasksUpdated(){try{x.emit()}catch{}}export const TASK_STATUSES=["pending","in_progress","completed"];export const TaskStatusSchema=T(()=>i.enum(["pending","in_progress","completed"]));export const TaskSchema=T(()=>i.object({id:i.string(),subject:i.string(),description:i.string(),activeForm:i.string().optional(),owner:i.string().optional(),status:TaskStatusSchema(),blocks:i.array(i.string()),blockedBy:i.array(i.string()),metadata:i.record(i.string(),i.unknown()).optional()}));const E={retries:{retries:30,minTimeout:5,maxTimeout:100}};function getHighWaterMarkPath(t){return r(getTasksDir(t),".highwatermark")}async function readHighWaterMark(t){const a=getHighWaterMarkPath(t);try{const t=(await e(a,"utf-8")).trim(),s=parseInt(t,10);return isNaN(s)?0:s}catch{return 0}}async function writeHighWaterMark(t,a){const e=getHighWaterMarkPath(t);await n(e,String(a))}export function isTodoV2Enabled(){return!(!f(process.env.CONTEXT_CODE_ENABLE_TASKS)&&!f(process.env.CLAUDE_CODE_ENABLE_TASKS))||!o()}export async function resetTaskList(t){const e=getTasksDir(t),n=await ensureTaskListLockFile(t);let i;try{i=await g.lock(n,E);const o=await findHighestTaskIdFromFiles(t);if(o>0){o>await readHighWaterMark(t)&&await writeHighWaterMark(t,o)}let c;try{c=await a(e)}catch{c=[]}for(const t of c)if(t.endsWith(".json")&&!t.startsWith(".")){const a=r(e,t);try{await s(a)}catch{}}notifyTasksUpdated()}finally{i&&await i()}}export function getTaskListId(){const t=process.env.CONTEXT_CODE_TASK_LIST_ID??process.env.CLAUDE_CODE_TASK_LIST_ID;if(t)return t;const a=S();return a?a.teamName:b()||j||c()}export function sanitizePathComponent(t){return t.replace(/[^a-zA-Z0-9_-]/g,"-")}export function getTasksDir(t){return r(k(),"tasks",sanitizePathComponent(t))}export function getTaskPath(t,a){return r(getTasksDir(t),`${sanitizePathComponent(a)}.json`)}export async function ensureTasksDir(a){const e=getTasksDir(a);try{await t(e,{recursive:!0})}catch{}}async function findHighestTaskIdFromFiles(t){const e=getTasksDir(t);let s;try{s=await a(e)}catch{return 0}let n=0;for(const t of s){if(!t.endsWith(".json"))continue;const a=parseInt(t.replace(".json",""),10);!isNaN(a)&&a>n&&(n=a)}return n}export async function createTask(t,a){const e=await ensureTaskListLockFile(t);let s;try{s=await g.lock(e,E);const r=await async function(t){const[a,e]=await Promise.all([findHighestTaskIdFromFiles(t),readHighWaterMark(t)]);return Math.max(a,e)}(t),i=String(r+1),o={id:i,...a},c=getTaskPath(t,i);return await n(c,_(o,null,2)),notifyTasksUpdated(),i}finally{s&&await s()}}export async function getTask(t,a){const s=getTaskPath(t,a);try{const t=await e(s,"utf-8"),n=y(t);"ant"===process.env.USER_TYPE&&("open"===n.status?n.status="pending":"resolved"===n.status?n.status="completed":n.status&&["planning","implementing","reviewing","verifying"].includes(n.status)&&(n.status="in_progress"));const r=TaskSchema().safeParse(n);return r.success?r.data:(l(`[Tasks] Task ${a} failed schema validation: ${r.error.message}`),null)}catch(t){return"ENOENT"===p(t)||(l(`[Tasks] Failed to read task ${a}: ${m(t)}`),w(t)),null}}async function updateTaskUnsafe(t,a,e){const s=await getTask(t,a);if(!s)return null;const r={...s,...e,id:a},i=getTaskPath(t,a);return await n(i,_(r,null,2)),notifyTasksUpdated(),r}export async function updateTask(t,a,e){const s=getTaskPath(t,a);if(!await getTask(t,a))return null;let n;try{return n=await g.lock(s,E),await updateTaskUnsafe(t,a,e)}finally{await(n?.())}}export async function deleteTask(t,a){const e=getTaskPath(t,a);try{const n=parseInt(a,10);if(!isNaN(n)){n>await readHighWaterMark(t)&&await writeHighWaterMark(t,n)}try{await s(e)}catch(t){if("ENOENT"===p(t))return!1;throw t}const r=await listTasks(t);for(const e of r){const s=e.blocks.filter(t=>t!==a),n=e.blockedBy.filter(t=>t!==a);s.length===e.blocks.length&&n.length===e.blockedBy.length||await updateTask(t,e.id,{blocks:s,blockedBy:n})}return notifyTasksUpdated(),!0}catch{return!1}}export async function listTasks(t){const e=getTasksDir(t);let s;try{s=await a(e)}catch{return[]}const n=s.filter(t=>t.endsWith(".json")).map(t=>t.replace(".json",""));return(await Promise.all(n.map(a=>getTask(t,a)))).filter(t=>null!==t)}export async function blockTask(t,a,e){const[s,n]=await Promise.all([getTask(t,a),getTask(t,e)]);return!(!s||!n)&&(s.blocks.includes(e)||await updateTask(t,a,{blocks:[...s.blocks,e]}),n.blockedBy.includes(a)||await updateTask(t,e,{blockedBy:[...n.blockedBy,a]}),!0)}async function ensureTaskListLockFile(t){await ensureTasksDir(t);const a=function(t){return r(getTasksDir(t),".lock")}(t);try{await n(a,"",{flag:"wx"})}catch{}return a}export async function claimTask(t,a,e,s={}){const n=getTaskPath(t,a);if(!await getTask(t,a))return{success:!1,reason:"task_not_found"};if(s.checkAgentBusy)return async function(t,a,e){const s=await ensureTaskListLockFile(t);let n;try{n=await g.lock(s,E);const r=await listTasks(t),i=r.find(t=>t.id===a);if(!i)return{success:!1,reason:"task_not_found"};if(i.owner&&i.owner!==e)return{success:!1,reason:"already_claimed",task:i};if("completed"===i.status)return{success:!1,reason:"already_resolved",task:i};const o=new Set(r.filter(t=>"completed"!==t.status).map(t=>t.id)),c=i.blockedBy.filter(t=>o.has(t));if(c.length>0)return{success:!1,reason:"blocked",task:i,blockedByTasks:c};const u=r.filter(t=>"completed"!==t.status&&t.owner===e&&t.id!==a);if(u.length>0)return{success:!1,reason:"agent_busy",task:i,busyWithTasks:u.map(t=>t.id)};return{success:!0,task:await updateTask(t,a,{owner:e})}}catch(t){return l(`[Tasks] Failed to claim task ${a} with busy check: ${m(t)}`),w(t),{success:!1,reason:"task_not_found"}}finally{n&&await n()}}(t,a,e);let r;try{r=await g.lock(n,E);const s=await getTask(t,a);if(!s)return{success:!1,reason:"task_not_found"};if(s.owner&&s.owner!==e)return{success:!1,reason:"already_claimed",task:s};if("completed"===s.status)return{success:!1,reason:"already_resolved",task:s};const i=await listTasks(t),o=new Set(i.filter(t=>"completed"!==t.status).map(t=>t.id)),c=s.blockedBy.filter(t=>o.has(t));if(c.length>0)return{success:!1,reason:"blocked",task:s,blockedByTasks:c};return{success:!0,task:await updateTaskUnsafe(t,a,{owner:e})}}catch(t){return l(`[Tasks] Failed to claim task ${a}: ${m(t)}`),w(t),{success:!1,reason:"task_not_found"}}finally{r&&await r()}}function sanitizeName(t){return t.replace(/[^a-zA-Z0-9]/g,"-").toLowerCase()}export async function getAgentStatuses(t){const a=await async function(t){const a=d(),s=r(a,sanitizeName(t),"config.json");try{const t=await e(s,"utf-8"),a=y(t);return{leadAgentId:a.leadAgentId,members:a.members.map(t=>({agentId:t.agentId,name:t.name,agentType:t.agentType}))}}catch(a){return"ENOENT"===p(a)||l(`[Tasks] Failed to read team file for ${t}: ${m(a)}`),null}}(t);if(!a)return null;const s=sanitizeName(t),n=await listTasks(s),i=new Map;for(const t of n)if("completed"!==t.status&&t.owner){const a=i.get(t.owner)||[];a.push(t.id),i.set(t.owner,a)}return a.members.map(t=>{const a=i.get(t.name)||[],e=i.get(t.agentId)||[],s=u([...a,...e]);return{agentId:t.agentId,name:t.name,agentType:t.agentType,status:0===s.length?"idle":"busy",currentTasks:s}})}export async function unassignTeammateTasks(t,a,e,s){const n=(await listTasks(t)).filter(t=>"completed"!==t.status&&(t.owner===a||t.owner===e));for(const a of n)await updateTask(t,a.id,{owner:void 0,status:"pending"});n.length>0&&l(`[Tasks] Unassigned ${n.length} task(s) from ${e}`);let r=`${e} ${"terminated"===s?"was terminated":"has shut down"}.`;if(n.length>0){const t=n.map(t=>`#${t.id} "${t.subject}"`).join(", ");r+=` ${n.length} task(s) were unassigned: ${t}. Use TaskList to check availability and TaskUpdate with owner to reassign them to idle teammates.`}return{unassignedTasks:n.map(t=>({id:t.id,subject:t.subject})),notificationMessage:r}}export const DEFAULT_TASKS_MODE_TASK_LIST_ID="tasklist";
@@ -1 +1 @@
1
- import{isPaneBackend as e}from"./swarm/backends/types.js";import{readTeamFile as t}from"./swarm/teamHelpers.js";export function getTeammateStatuses(a){const n=t(a);if(!n)return[];const d=new Set(n.hiddenPaneIds??[]),o=[];for(const t of n.members){if("team-lead"===t.name)continue;const a=!1!==t.isActive?"running":"idle";o.push({name:t.name,agentId:t.agentId,agentType:t.agentType,model:t.model,prompt:t.prompt,status:a,color:t.color,tmuxPaneId:t.tmuxPaneId,cwd:t.cwd,worktreePath:t.worktreePath,isHidden:d.has(t.tmuxPaneId),backendType:t.backendType&&e(t.backendType)?t.backendType:void 0,mode:t.mode})}return o}
1
+ import{isPaneBackend as e}from"./swarm/backends/types.js";import{readTeamFile as t}from"./swarm/teamHelpers.js";export function getTeammateStatuses(n){const a=t(n);if(!a)return[];const o=new Set(a.hiddenPaneIds??[]),d=[];for(const t of a.members){if("team-lead"===t.name)continue;const n=!1!==t.isActive?"running":"idle";d.push({name:t.name,agentId:t.agentId,agentType:t.agentType,model:t.model,prompt:t.prompt,status:n,color:t.color,tmuxPaneId:t.tmuxPaneId,cwd:t.cwd,worktreePath:t.worktreePath,isHidden:o.has(t.tmuxPaneId),backendType:t.backendType&&e(t.backendType)?t.backendType:void 0,mode:t.mode})}return d}
@@ -1 +1 @@
1
- import{isTeamMemFile as e}from"../memdir/teamMemPaths.js";import{FILE_EDIT_TOOL_NAME as t}from"../tools/FileEditTool/constants.js";import{FILE_WRITE_TOOL_NAME as r}from"../tools/FileWriteTool/prompt.js";export{e as isTeamMemFile};export function isTeamMemorySearch(t){const r=t;return!!r&&!(!r.path||!e(r.path))}export function isTeamMemoryWriteOrEdit(o,m){if(o!==r&&o!==t)return!1;const i=m,a=i?.file_path??i?.path;return void 0!==a&&e(a)}export function appendTeamMemorySummaryParts(e,t,r){const o=e.teamMemoryReadCount??0,m=e.teamMemorySearchCount??0,i=e.teamMemoryWriteCount??0;if(o>0){const e=t?0===r.length?"Recalling":"recalling":0===r.length?"Recalled":"recalled";r.push(`${e} ${o} team ${1===o?"memory":"memories"}`)}if(m>0){const e=t?0===r.length?"Searching":"searching":0===r.length?"Searched":"searched";r.push(`${e} team memories`)}if(i>0){const e=t?0===r.length?"Writing":"writing":0===r.length?"Wrote":"wrote";r.push(`${e} ${i} team ${1===i?"memory":"memories"}`)}}
1
+ import{isTeamMemFile as e}from"../memdir/teamMemPaths.js";import{FILE_EDIT_TOOL_NAME as t}from"../tools/FileEditTool/constants.js";import{FILE_WRITE_TOOL_NAME as r}from"../tools/FileWriteTool/prompt.js";export{e as isTeamMemFile};export function isTeamMemorySearch(t){const r=t;return!!r&&!(!r.path||!e(r.path))}export function isTeamMemoryWriteOrEdit(o,m){if(o!==r&&o!==t)return!1;const i=m,n=i?.file_path??i?.path;return void 0!==n&&e(n)}export function appendTeamMemorySummaryParts(e,t,r){const o=e.teamMemoryReadCount??0,m=e.teamMemorySearchCount??0,i=e.teamMemoryWriteCount??0;if(o>0){const e=t?0===r.length?"Recalling":"recalling":0===r.length?"Recalled":"recalled";r.push(`${e} ${o} team ${1===o?"memory":"memories"}`)}if(m>0){const e=t?0===r.length?"Searching":"searching":0===r.length?"Searched":"searched";r.push(`${e} team memories`)}if(i>0){const e=t?0===r.length?"Writing":"writing":0===r.length?"Wrote":"wrote";r.push(`${e} ${i} team ${1===i?"memory":"memories"}`)}}
@@ -1 +1 @@
1
- import{mkdir as e,readFile as t,writeFile as a}from"fs/promises";import{join as s}from"path";import{z as o}from"zod/v4";import{TEAMMATE_MESSAGE_TAG as r}from"../constants/xml.js";import{PermissionModeSchema as n}from"../entrypoints/sdk/coreSchemas.js";import{SEND_MESSAGE_TOOL_NAME as i}from"../tools/SendMessageTool/constants.js";import{generateRequestId as m}from"./agentId.js";import{count as u}from"./array.js";import{logForDebugging as c}from"./debug.js";import{getTeamsDir as l}from"./envUtils.js";import{getErrnoCode as p}from"./errors.js";import{lazySchema as d}from"./lazySchema.js";import*as f from"./lockfile.js";import{logError as g}from"./log.js";import{jsonParse as x,jsonStringify as M}from"./slowOperations.js";import{TEAM_LEAD_NAME as y}from"./swarm/constants.js";import{sanitizePathComponent as h}from"./tasks.js";import{getAgentName as b,getTeammateColor as _,getTeamName as w}from"./teammate.js";const k={retries:{retries:10,minTimeout:5,maxTimeout:100}};export function getInboxPath(e,t){const a=t||w()||"default",o=h(a),r=h(e),n=s(l(),o,"inboxes"),i=s(n,`${r}.json`);return c(`[TeammateMailbox] getInboxPath: agent=${e}, team=${a}, fullPath=${i}`),i}export async function readMailbox(e,a){const s=getInboxPath(e,a);c(`[TeammateMailbox] readMailbox: path=${s}`);try{const e=await t(s,"utf-8"),a=x(e);return c(`[TeammateMailbox] readMailbox: read ${a.length} message(s)`),a}catch(t){return"ENOENT"===p(t)?(c("[TeammateMailbox] readMailbox: file does not exist"),[]):(c(`Failed to read inbox for ${e}: ${t}`),g(t),[])}}export async function readUnreadMessages(e,t){const a=await readMailbox(e,t),s=a.filter(e=>!e.read);return c(`[TeammateMailbox] readUnreadMessages: ${s.length} unread of ${a.length} total`),s}export async function writeToMailbox(t,o,r){await async function(t){const a=t||w()||"default",o=h(a),r=s(l(),o,"inboxes");await e(r,{recursive:!0}),c(`[TeammateMailbox] Ensured inbox directory: ${r}`)}(r);const n=getInboxPath(t,r),i=`${n}.lock`;c(`[TeammateMailbox] writeToMailbox: recipient=${t}, from=${o.from}, path=${n}`);try{await a(n,"[]",{encoding:"utf-8",flag:"wx"}),c("[TeammateMailbox] writeToMailbox: created new inbox file")}catch(e){if("EEXIST"!==p(e))return c(`[TeammateMailbox] writeToMailbox: failed to create inbox file: ${e}`),void g(e)}let m;try{m=await f.lock(n,{lockfilePath:i,...k});const e=await readMailbox(t,r),s={...o,read:!1};e.push(s),await a(n,M(e,null,2),"utf-8"),c(`[TeammateMailbox] Wrote message to ${t}'s inbox from ${o.from}`)}catch(e){c(`Failed to write to inbox for ${t}: ${e}`),g(e)}finally{m&&await m()}}export async function markMessageAsReadByIndex(e,t,s){const o=getInboxPath(e,t);c(`[TeammateMailbox] markMessageAsReadByIndex called: agentName=${e}, teamName=${t}, index=${s}, path=${o}`);const r=`${o}.lock`;let n;try{c("[TeammateMailbox] markMessageAsReadByIndex: acquiring lock..."),n=await f.lock(o,{lockfilePath:r,...k}),c("[TeammateMailbox] markMessageAsReadByIndex: lock acquired");const i=await readMailbox(e,t);if(c(`[TeammateMailbox] markMessageAsReadByIndex: read ${i.length} messages after lock`),s<0||s>=i.length)return void c(`[TeammateMailbox] markMessageAsReadByIndex: index ${s} out of bounds (${i.length} messages)`);const m=i[s];if(!m||m.read)return void c("[TeammateMailbox] markMessageAsReadByIndex: message already read or missing");i[s]={...m,read:!0},await a(o,M(i,null,2),"utf-8"),c(`[TeammateMailbox] markMessageAsReadByIndex: marked message at index ${s} as read`)}catch(t){if("ENOENT"===p(t))return void c(`[TeammateMailbox] markMessageAsReadByIndex: file does not exist at ${o}`);c(`[TeammateMailbox] markMessageAsReadByIndex FAILED for ${e}: ${t}`),g(t)}finally{n&&(await n(),c("[TeammateMailbox] markMessageAsReadByIndex: lock released"))}}export async function markMessagesAsRead(e,t){const s=getInboxPath(e,t);c(`[TeammateMailbox] markMessagesAsRead called: agentName=${e}, teamName=${t}, path=${s}`);const o=`${s}.lock`;let r;try{c("[TeammateMailbox] markMessagesAsRead: acquiring lock..."),r=await f.lock(s,{lockfilePath:o,...k}),c("[TeammateMailbox] markMessagesAsRead: lock acquired");const n=await readMailbox(e,t);if(c(`[TeammateMailbox] markMessagesAsRead: read ${n.length} messages after lock`),0===n.length)return void c("[TeammateMailbox] markMessagesAsRead: no messages to mark");const i=u(n,e=>!e.read);c(`[TeammateMailbox] markMessagesAsRead: ${i} unread of ${n.length} total`);for(const e of n)e.read=!0;await a(s,M(n,null,2),"utf-8"),c(`[TeammateMailbox] markMessagesAsRead: WROTE ${i} message(s) as read to ${s}`)}catch(t){if("ENOENT"===p(t))return void c(`[TeammateMailbox] markMessagesAsRead: file does not exist at ${s}`);c(`[TeammateMailbox] markMessagesAsRead FAILED for ${e}: ${t}`),g(t)}finally{r&&(await r(),c("[TeammateMailbox] markMessagesAsRead: lock released"))}}export async function clearMailbox(e,t){const s=getInboxPath(e,t);try{await a(s,"[]",{encoding:"utf-8",flag:"r+"}),c(`[TeammateMailbox] Cleared inbox for ${e}`)}catch(t){if("ENOENT"===p(t))return;c(`Failed to clear inbox for ${e}: ${t}`),g(t)}}export function formatTeammateMessages(e){return e.map(e=>{const t=e.color?` color="${e.color}"`:"",a=e.summary?` summary="${e.summary}"`:"";return`<${r} teammate_id="${e.from}"${t}${a}>\n${e.text}\n</${r}>`}).join("\n\n")}export function createIdleNotification(e,t){return{type:"idle_notification",from:e,timestamp:(new Date).toISOString(),idleReason:t?.idleReason,summary:t?.summary,completedTaskId:t?.completedTaskId,completedStatus:t?.completedStatus,failureReason:t?.failureReason}}export function isIdleNotification(e){try{const t=x(e);if(t&&"idle_notification"===t.type)return t}catch{}return null}export function createPermissionRequestMessage(e){return{type:"permission_request",request_id:e.request_id,agent_id:e.agent_id,tool_name:e.tool_name,tool_use_id:e.tool_use_id,description:e.description,input:e.input,permission_suggestions:e.permission_suggestions||[]}}export function createPermissionResponseMessage(e){return"error"===e.subtype?{type:"permission_response",request_id:e.request_id,subtype:"error",error:e.error||"Permission denied"}:{type:"permission_response",request_id:e.request_id,subtype:"success",response:{updated_input:e.updated_input,permission_updates:e.permission_updates}}}export function isPermissionRequest(e){try{const t=x(e);if(t&&"permission_request"===t.type)return t}catch{}return null}export function isPermissionResponse(e){try{const t=x(e);if(t&&"permission_response"===t.type)return t}catch{}return null}export function createSandboxPermissionRequestMessage(e){return{type:"sandbox_permission_request",requestId:e.requestId,workerId:e.workerId,workerName:e.workerName,workerColor:e.workerColor,hostPattern:{host:e.host},createdAt:Date.now()}}export function createSandboxPermissionResponseMessage(e){return{type:"sandbox_permission_response",requestId:e.requestId,host:e.host,allow:e.allow,timestamp:(new Date).toISOString()}}export function isSandboxPermissionRequest(e){try{const t=x(e);if(t&&"sandbox_permission_request"===t.type)return t}catch{}return null}export function isSandboxPermissionResponse(e){try{const t=x(e);if(t&&"sandbox_permission_response"===t.type)return t}catch{}return null}export const PlanApprovalRequestMessageSchema=d(()=>o.object({type:o.literal("plan_approval_request"),from:o.string(),timestamp:o.string(),planFilePath:o.string(),planContent:o.string(),requestId:o.string()}));export const PlanApprovalResponseMessageSchema=d(()=>o.object({type:o.literal("plan_approval_response"),requestId:o.string(),approved:o.boolean(),feedback:o.string().optional(),timestamp:o.string(),permissionMode:n().optional()}));export const ShutdownRequestMessageSchema=d(()=>o.object({type:o.literal("shutdown_request"),requestId:o.string(),from:o.string(),reason:o.string().optional(),timestamp:o.string()}));export const ShutdownApprovedMessageSchema=d(()=>o.object({type:o.literal("shutdown_approved"),requestId:o.string(),from:o.string(),timestamp:o.string(),paneId:o.string().optional(),backendType:o.string().optional()}));export const ShutdownRejectedMessageSchema=d(()=>o.object({type:o.literal("shutdown_rejected"),requestId:o.string(),from:o.string(),reason:o.string(),timestamp:o.string()}));export function createShutdownRequestMessage(e){return{type:"shutdown_request",requestId:e.requestId,from:e.from,reason:e.reason,timestamp:(new Date).toISOString()}}export function createShutdownApprovedMessage(e){return{type:"shutdown_approved",requestId:e.requestId,from:e.from,timestamp:(new Date).toISOString(),paneId:e.paneId,backendType:e.backendType}}export function createShutdownRejectedMessage(e){return{type:"shutdown_rejected",requestId:e.requestId,from:e.from,reason:e.reason,timestamp:(new Date).toISOString()}}export async function sendShutdownRequestToMailbox(e,t,a){const s=t||w(),o=b()||y,r=m("shutdown",e),n=createShutdownRequestMessage({requestId:r,from:o,reason:a});return await writeToMailbox(e,{from:o,text:M(n),timestamp:(new Date).toISOString(),color:_()},s),{requestId:r,target:e}}export function isShutdownRequest(e){try{const t=ShutdownRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isPlanApprovalRequest(e){try{const t=PlanApprovalRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isShutdownApproved(e){try{const t=ShutdownApprovedMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isShutdownRejected(e){try{const t=ShutdownRejectedMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isPlanApprovalResponse(e){try{const t=PlanApprovalResponseMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isTaskAssignment(e){try{const t=x(e);if(t&&"task_assignment"===t.type)return t}catch{}return null}export function isTeamPermissionUpdate(e){try{const t=x(e);if(t&&"team_permission_update"===t.type)return t}catch{}return null}export const ModeSetRequestMessageSchema=d(()=>o.object({type:o.literal("mode_set_request"),mode:n(),from:o.string()}));export function createModeSetRequestMessage(e){return{type:"mode_set_request",mode:e.mode,from:e.from}}export function isModeSetRequest(e){try{const t=ModeSetRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isStructuredProtocolMessage(e){try{const t=x(e);if(!t||"object"!=typeof t||!("type"in t))return!1;const a=t.type;return"permission_request"===a||"permission_response"===a||"sandbox_permission_request"===a||"sandbox_permission_response"===a||"shutdown_request"===a||"shutdown_approved"===a||"team_permission_update"===a||"mode_set_request"===a||"plan_approval_request"===a||"plan_approval_response"===a}catch{return!1}}export async function markMessagesAsReadByPredicate(e,t,s){const o=getInboxPath(e,s),r=`${o}.lock`;let n;try{n=await f.lock(o,{lockfilePath:r,...k});const i=await readMailbox(e,s);if(0===i.length)return;const m=i.map(e=>!e.read&&t(e)?{...e,read:!0}:e);await a(o,M(m,null,2),"utf-8")}catch(e){if("ENOENT"===p(e))return;g(e)}finally{if(n)try{await n()}catch{}}}export function getLastPeerDmSummary(e){for(let t=e.length-1;t>=0;t--){const a=e[t];if(a){if("user"===a.type&&"string"==typeof a.message.content)break;if("assistant"===a.type)for(const e of a.message.content)if("tool_use"===e.type&&e.name===i&&"object"==typeof e.input&&null!==e.input&&"to"in e.input&&"string"==typeof e.input.to&&"*"!==e.input.to&&e.input.to.toLowerCase()!==y.toLowerCase()&&"message"in e.input&&"string"==typeof e.input.message)return`[to ${e.input.to}] ${"summary"in e.input&&"string"==typeof e.input.summary?e.input.summary:e.input.message.slice(0,80)}`}}}
1
+ import{mkdir as e,readFile as t,writeFile as a}from"fs/promises";import{join as s}from"path";import{z as o}from"zod/v4";import{TEAMMATE_MESSAGE_TAG as r}from"../constants/xml.js";import{PermissionModeSchema as n}from"../entrypoints/sdk/coreSchemas.js";import{SEND_MESSAGE_TOOL_NAME as i}from"../tools/SendMessageTool/constants.js";import{generateRequestId as m}from"./agentId.js";import{count as u}from"./array.js";import{logForDebugging as c}from"./debug.js";import{getTeamsDir as l}from"./envUtils.js";import{getErrnoCode as p}from"./errors.js";import{lazySchema as d}from"./lazySchema.js";import*as f from"./lockfile.js";import{logError as g}from"./log.js";import{jsonParse as x,jsonStringify as y}from"./slowOperations.js";import{TEAM_LEAD_NAME as M}from"./swarm/constants.js";import{sanitizePathComponent as h}from"./tasks.js";import{getAgentName as b,getTeammateColor as w,getTeamName as _}from"./teammate.js";const k={retries:{retries:10,minTimeout:5,maxTimeout:100}};export function getInboxPath(e,t){const a=t||_()||"default",o=h(a),r=h(e),n=s(l(),o,"inboxes"),i=s(n,`${r}.json`);return c(`[TeammateMailbox] getInboxPath: agent=${e}, team=${a}, fullPath=${i}`),i}export async function readMailbox(e,a){const s=getInboxPath(e,a);c(`[TeammateMailbox] readMailbox: path=${s}`);try{const e=await t(s,"utf-8"),a=x(e);return c(`[TeammateMailbox] readMailbox: read ${a.length} message(s)`),a}catch(t){return"ENOENT"===p(t)?(c("[TeammateMailbox] readMailbox: file does not exist"),[]):(c(`Failed to read inbox for ${e}: ${t}`),g(t),[])}}export async function readUnreadMessages(e,t){const a=await readMailbox(e,t),s=a.filter(e=>!e.read);return c(`[TeammateMailbox] readUnreadMessages: ${s.length} unread of ${a.length} total`),s}export async function writeToMailbox(t,o,r){await async function(t){const a=t||_()||"default",o=h(a),r=s(l(),o,"inboxes");await e(r,{recursive:!0}),c(`[TeammateMailbox] Ensured inbox directory: ${r}`)}(r);const n=getInboxPath(t,r),i=`${n}.lock`;c(`[TeammateMailbox] writeToMailbox: recipient=${t}, from=${o.from}, path=${n}`);try{await a(n,"[]",{encoding:"utf-8",flag:"wx"}),c("[TeammateMailbox] writeToMailbox: created new inbox file")}catch(e){if("EEXIST"!==p(e))return c(`[TeammateMailbox] writeToMailbox: failed to create inbox file: ${e}`),void g(e)}let m;try{m=await f.lock(n,{lockfilePath:i,...k});const e=await readMailbox(t,r),s={...o,read:!1};e.push(s),await a(n,y(e,null,2),"utf-8"),c(`[TeammateMailbox] Wrote message to ${t}'s inbox from ${o.from}`)}catch(e){c(`Failed to write to inbox for ${t}: ${e}`),g(e)}finally{m&&await m()}}export async function markMessageAsReadByIndex(e,t,s){const o=getInboxPath(e,t);c(`[TeammateMailbox] markMessageAsReadByIndex called: agentName=${e}, teamName=${t}, index=${s}, path=${o}`);const r=`${o}.lock`;let n;try{c("[TeammateMailbox] markMessageAsReadByIndex: acquiring lock..."),n=await f.lock(o,{lockfilePath:r,...k}),c("[TeammateMailbox] markMessageAsReadByIndex: lock acquired");const i=await readMailbox(e,t);if(c(`[TeammateMailbox] markMessageAsReadByIndex: read ${i.length} messages after lock`),s<0||s>=i.length)return void c(`[TeammateMailbox] markMessageAsReadByIndex: index ${s} out of bounds (${i.length} messages)`);const m=i[s];if(!m||m.read)return void c("[TeammateMailbox] markMessageAsReadByIndex: message already read or missing");i[s]={...m,read:!0},await a(o,y(i,null,2),"utf-8"),c(`[TeammateMailbox] markMessageAsReadByIndex: marked message at index ${s} as read`)}catch(t){if("ENOENT"===p(t))return void c(`[TeammateMailbox] markMessageAsReadByIndex: file does not exist at ${o}`);c(`[TeammateMailbox] markMessageAsReadByIndex FAILED for ${e}: ${t}`),g(t)}finally{n&&(await n(),c("[TeammateMailbox] markMessageAsReadByIndex: lock released"))}}export async function markMessagesAsRead(e,t){const s=getInboxPath(e,t);c(`[TeammateMailbox] markMessagesAsRead called: agentName=${e}, teamName=${t}, path=${s}`);const o=`${s}.lock`;let r;try{c("[TeammateMailbox] markMessagesAsRead: acquiring lock..."),r=await f.lock(s,{lockfilePath:o,...k}),c("[TeammateMailbox] markMessagesAsRead: lock acquired");const n=await readMailbox(e,t);if(c(`[TeammateMailbox] markMessagesAsRead: read ${n.length} messages after lock`),0===n.length)return void c("[TeammateMailbox] markMessagesAsRead: no messages to mark");const i=u(n,e=>!e.read);c(`[TeammateMailbox] markMessagesAsRead: ${i} unread of ${n.length} total`);for(const e of n)e.read=!0;await a(s,y(n,null,2),"utf-8"),c(`[TeammateMailbox] markMessagesAsRead: WROTE ${i} message(s) as read to ${s}`)}catch(t){if("ENOENT"===p(t))return void c(`[TeammateMailbox] markMessagesAsRead: file does not exist at ${s}`);c(`[TeammateMailbox] markMessagesAsRead FAILED for ${e}: ${t}`),g(t)}finally{r&&(await r(),c("[TeammateMailbox] markMessagesAsRead: lock released"))}}export async function clearMailbox(e,t){const s=getInboxPath(e,t);try{await a(s,"[]",{encoding:"utf-8",flag:"r+"}),c(`[TeammateMailbox] Cleared inbox for ${e}`)}catch(t){if("ENOENT"===p(t))return;c(`Failed to clear inbox for ${e}: ${t}`),g(t)}}export function formatTeammateMessages(e){return e.map(e=>{const t=e.color?` color="${e.color}"`:"",a=e.summary?` summary="${e.summary}"`:"";return`<${r} teammate_id="${e.from}"${t}${a}>\n${e.text}\n</${r}>`}).join("\n\n")}export function createIdleNotification(e,t){return{type:"idle_notification",from:e,timestamp:(new Date).toISOString(),idleReason:t?.idleReason,summary:t?.summary,completedTaskId:t?.completedTaskId,completedStatus:t?.completedStatus,failureReason:t?.failureReason}}export function isIdleNotification(e){try{const t=x(e);if(t&&"idle_notification"===t.type)return t}catch{}return null}export function createPermissionRequestMessage(e){return{type:"permission_request",request_id:e.request_id,agent_id:e.agent_id,tool_name:e.tool_name,tool_use_id:e.tool_use_id,description:e.description,input:e.input,permission_suggestions:e.permission_suggestions||[]}}export function createPermissionResponseMessage(e){return"error"===e.subtype?{type:"permission_response",request_id:e.request_id,subtype:"error",error:e.error||"Permission denied"}:{type:"permission_response",request_id:e.request_id,subtype:"success",response:{updated_input:e.updated_input,permission_updates:e.permission_updates}}}export function isPermissionRequest(e){try{const t=x(e);if(t&&"permission_request"===t.type)return t}catch{}return null}export function isPermissionResponse(e){try{const t=x(e);if(t&&"permission_response"===t.type)return t}catch{}return null}export function createSandboxPermissionRequestMessage(e){return{type:"sandbox_permission_request",requestId:e.requestId,workerId:e.workerId,workerName:e.workerName,workerColor:e.workerColor,hostPattern:{host:e.host},createdAt:Date.now()}}export function createSandboxPermissionResponseMessage(e){return{type:"sandbox_permission_response",requestId:e.requestId,host:e.host,allow:e.allow,timestamp:(new Date).toISOString()}}export function isSandboxPermissionRequest(e){try{const t=x(e);if(t&&"sandbox_permission_request"===t.type)return t}catch{}return null}export function isSandboxPermissionResponse(e){try{const t=x(e);if(t&&"sandbox_permission_response"===t.type)return t}catch{}return null}export const PlanApprovalRequestMessageSchema=d(()=>o.object({type:o.literal("plan_approval_request"),from:o.string(),timestamp:o.string(),planFilePath:o.string(),planContent:o.string(),requestId:o.string()}));export const PlanApprovalResponseMessageSchema=d(()=>o.object({type:o.literal("plan_approval_response"),requestId:o.string(),approved:o.boolean(),feedback:o.string().optional(),timestamp:o.string(),permissionMode:n().optional()}));export const ShutdownRequestMessageSchema=d(()=>o.object({type:o.literal("shutdown_request"),requestId:o.string(),from:o.string(),reason:o.string().optional(),timestamp:o.string()}));export const ShutdownApprovedMessageSchema=d(()=>o.object({type:o.literal("shutdown_approved"),requestId:o.string(),from:o.string(),timestamp:o.string(),paneId:o.string().optional(),backendType:o.string().optional()}));export const ShutdownRejectedMessageSchema=d(()=>o.object({type:o.literal("shutdown_rejected"),requestId:o.string(),from:o.string(),reason:o.string(),timestamp:o.string()}));export function createShutdownRequestMessage(e){return{type:"shutdown_request",requestId:e.requestId,from:e.from,reason:e.reason,timestamp:(new Date).toISOString()}}export function createShutdownApprovedMessage(e){return{type:"shutdown_approved",requestId:e.requestId,from:e.from,timestamp:(new Date).toISOString(),paneId:e.paneId,backendType:e.backendType}}export function createShutdownRejectedMessage(e){return{type:"shutdown_rejected",requestId:e.requestId,from:e.from,reason:e.reason,timestamp:(new Date).toISOString()}}export async function sendShutdownRequestToMailbox(e,t,a){const s=t||_(),o=b()||M,r=m("shutdown",e),n=createShutdownRequestMessage({requestId:r,from:o,reason:a});return await writeToMailbox(e,{from:o,text:y(n),timestamp:(new Date).toISOString(),color:w()},s),{requestId:r,target:e}}export function isShutdownRequest(e){try{const t=ShutdownRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isPlanApprovalRequest(e){try{const t=PlanApprovalRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isShutdownApproved(e){try{const t=ShutdownApprovedMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isShutdownRejected(e){try{const t=ShutdownRejectedMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isPlanApprovalResponse(e){try{const t=PlanApprovalResponseMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isTaskAssignment(e){try{const t=x(e);if(t&&"task_assignment"===t.type)return t}catch{}return null}export function isTeamPermissionUpdate(e){try{const t=x(e);if(t&&"team_permission_update"===t.type)return t}catch{}return null}export const ModeSetRequestMessageSchema=d(()=>o.object({type:o.literal("mode_set_request"),mode:n(),from:o.string()}));export function createModeSetRequestMessage(e){return{type:"mode_set_request",mode:e.mode,from:e.from}}export function isModeSetRequest(e){try{const t=ModeSetRequestMessageSchema().safeParse(x(e));if(t.success)return t.data}catch{}return null}export function isStructuredProtocolMessage(e){try{const t=x(e);if(!t||"object"!=typeof t||!("type"in t))return!1;const a=t.type;return"permission_request"===a||"permission_response"===a||"sandbox_permission_request"===a||"sandbox_permission_response"===a||"shutdown_request"===a||"shutdown_approved"===a||"team_permission_update"===a||"mode_set_request"===a||"plan_approval_request"===a||"plan_approval_response"===a}catch{return!1}}export async function markMessagesAsReadByPredicate(e,t,s){const o=getInboxPath(e,s),r=`${o}.lock`;let n;try{n=await f.lock(o,{lockfilePath:r,...k});const i=await readMailbox(e,s);if(0===i.length)return;const m=i.map(e=>!e.read&&t(e)?{...e,read:!0}:e);await a(o,y(m,null,2),"utf-8")}catch(e){if("ENOENT"===p(e))return;g(e)}finally{if(n)try{await n()}catch{}}}export function getLastPeerDmSummary(e){for(let t=e.length-1;t>=0;t--){const a=e[t];if(a){if("user"===a.type&&"string"==typeof a.message.content)break;if("assistant"===a.type)for(const e of a.message.content)if("tool_use"===e.type&&e.name===i&&"object"==typeof e.input&&null!==e.input&&"to"in e.input&&"string"==typeof e.input.to&&"*"!==e.input.to&&e.input.to.toLowerCase()!==M.toLowerCase()&&"message"in e.input&&"string"==typeof e.input.message){return`[to ${e.input.to}] ${"summary"in e.input&&"string"==typeof e.input.summary?e.input.summary:e.input.message.slice(0,80)}`}}}}