@xortex/xcode 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/xcode +127 -0
  4. package/bin/xcode-test +84 -0
  5. package/bin/xcode.cmd +31 -0
  6. package/constants/apiLimits.ts +94 -0
  7. package/constants/betas.ts +52 -0
  8. package/constants/common.ts +33 -0
  9. package/constants/cyberRiskInstruction.ts +24 -0
  10. package/constants/errorIds.ts +15 -0
  11. package/constants/figures.ts +45 -0
  12. package/constants/files.ts +156 -0
  13. package/constants/github-app.ts +144 -0
  14. package/constants/keys.ts +11 -0
  15. package/constants/messages.ts +1 -0
  16. package/constants/oauth.ts +234 -0
  17. package/constants/outputStyles.ts +216 -0
  18. package/constants/product.ts +76 -0
  19. package/constants/prompts.ts +939 -0
  20. package/constants/spinnerVerbs.ts +204 -0
  21. package/constants/system.ts +95 -0
  22. package/constants/systemPromptSections.ts +68 -0
  23. package/constants/toolLimits.ts +56 -0
  24. package/constants/tools.ts +112 -0
  25. package/constants/turnCompletionVerbs.ts +12 -0
  26. package/constants/xml.ts +86 -0
  27. package/entrypoints/agentSdkTypes.ts +443 -0
  28. package/entrypoints/cli.tsx +307 -0
  29. package/entrypoints/init.ts +340 -0
  30. package/entrypoints/mcp.ts +196 -0
  31. package/entrypoints/sandboxTypes.ts +156 -0
  32. package/entrypoints/sdk/controlSchemas.ts +663 -0
  33. package/entrypoints/sdk/coreSchemas.ts +1889 -0
  34. package/entrypoints/sdk/coreTypes.generated.ts +2 -0
  35. package/entrypoints/sdk/coreTypes.ts +62 -0
  36. package/entrypoints/sdk/runtimeTypes.ts +140 -0
  37. package/entrypoints/sdk/sdkUtilityTypes.ts +3 -0
  38. package/entrypoints/sdk/toolTypes.ts +90 -0
  39. package/main.tsx +4686 -0
  40. package/package.json +120 -0
  41. package/services/AgentSummary/agentSummary.ts +179 -0
  42. package/services/MagicDocs/magicDocs.ts +254 -0
  43. package/services/MagicDocs/prompts.ts +127 -0
  44. package/services/PromptSuggestion/promptSuggestion.ts +523 -0
  45. package/services/PromptSuggestion/speculation.ts +991 -0
  46. package/services/SessionMemory/prompts.ts +324 -0
  47. package/services/SessionMemory/sessionMemory.ts +495 -0
  48. package/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  49. package/services/analytics/config.ts +38 -0
  50. package/services/analytics/datadog.ts +307 -0
  51. package/services/analytics/firstPartyEventLogger.ts +449 -0
  52. package/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  53. package/services/analytics/growthbook.ts +1155 -0
  54. package/services/analytics/index.ts +173 -0
  55. package/services/analytics/metadata.ts +973 -0
  56. package/services/analytics/sink.ts +114 -0
  57. package/services/analytics/sinkKillswitch.ts +25 -0
  58. package/services/api/adminRequests.ts +119 -0
  59. package/services/api/bootstrap.ts +141 -0
  60. package/services/api/claude.ts +3422 -0
  61. package/services/api/client.ts +406 -0
  62. package/services/api/dumpPrompts.ts +226 -0
  63. package/services/api/emptyUsage.ts +22 -0
  64. package/services/api/errorUtils.ts +260 -0
  65. package/services/api/errors.ts +1207 -0
  66. package/services/api/filesApi.ts +748 -0
  67. package/services/api/firstTokenDate.ts +60 -0
  68. package/services/api/gemini.ts +359 -0
  69. package/services/api/geminiAdapter.ts +123 -0
  70. package/services/api/geminiClient.ts +291 -0
  71. package/services/api/grove.ts +357 -0
  72. package/services/api/logging.ts +788 -0
  73. package/services/api/metricsOptOut.ts +159 -0
  74. package/services/api/openRouterClient.ts +453 -0
  75. package/services/api/overageCreditGrant.ts +137 -0
  76. package/services/api/promptCacheBreakDetection.ts +727 -0
  77. package/services/api/referral.ts +281 -0
  78. package/services/api/sessionIngress.ts +514 -0
  79. package/services/api/ultrareviewQuota.ts +38 -0
  80. package/services/api/usage.ts +63 -0
  81. package/services/api/withRetry.ts +822 -0
  82. package/services/autoDream/autoDream.ts +324 -0
  83. package/services/autoDream/config.ts +21 -0
  84. package/services/autoDream/consolidationLock.ts +140 -0
  85. package/services/autoDream/consolidationPrompt.ts +65 -0
  86. package/services/awaySummary.ts +74 -0
  87. package/services/claudeAiLimits.ts +515 -0
  88. package/services/claudeAiLimitsHook.ts +23 -0
  89. package/services/compact/apiMicrocompact.ts +153 -0
  90. package/services/compact/autoCompact.ts +351 -0
  91. package/services/compact/compact.ts +1705 -0
  92. package/services/compact/compactWarningHook.ts +16 -0
  93. package/services/compact/compactWarningState.ts +18 -0
  94. package/services/compact/grouping.ts +63 -0
  95. package/services/compact/microCompact.ts +530 -0
  96. package/services/compact/postCompactCleanup.ts +77 -0
  97. package/services/compact/prompt.ts +374 -0
  98. package/services/compact/sessionMemoryCompact.ts +630 -0
  99. package/services/compact/timeBasedMCConfig.ts +43 -0
  100. package/services/diagnosticTracking.ts +397 -0
  101. package/services/extractMemories/extractMemories.ts +517 -0
  102. package/services/extractMemories/prompts.ts +154 -0
  103. package/services/internalLogging.ts +90 -0
  104. package/services/lsp/LSPClient.ts +447 -0
  105. package/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  106. package/services/lsp/LSPServerInstance.ts +511 -0
  107. package/services/lsp/LSPServerManager.ts +420 -0
  108. package/services/lsp/config.ts +79 -0
  109. package/services/lsp/manager.ts +289 -0
  110. package/services/lsp/passiveFeedback.ts +328 -0
  111. package/services/mcp/InProcessTransport.ts +63 -0
  112. package/services/mcp/MCPConnectionManager.tsx +73 -0
  113. package/services/mcp/SdkControlTransport.ts +136 -0
  114. package/services/mcp/auth.ts +2465 -0
  115. package/services/mcp/channelAllowlist.ts +76 -0
  116. package/services/mcp/channelNotification.ts +316 -0
  117. package/services/mcp/channelPermissions.ts +240 -0
  118. package/services/mcp/claudeai.ts +164 -0
  119. package/services/mcp/client.ts +3348 -0
  120. package/services/mcp/config.ts +1578 -0
  121. package/services/mcp/elicitationHandler.ts +313 -0
  122. package/services/mcp/envExpansion.ts +38 -0
  123. package/services/mcp/headersHelper.ts +138 -0
  124. package/services/mcp/mcpStringUtils.ts +106 -0
  125. package/services/mcp/normalization.ts +23 -0
  126. package/services/mcp/oauthPort.ts +78 -0
  127. package/services/mcp/officialRegistry.ts +72 -0
  128. package/services/mcp/types.ts +258 -0
  129. package/services/mcp/useManageMCPConnections.ts +1141 -0
  130. package/services/mcp/utils.ts +575 -0
  131. package/services/mcp/vscodeSdkMcp.ts +112 -0
  132. package/services/mcp/xaa.ts +511 -0
  133. package/services/mcp/xaaIdpLogin.ts +487 -0
  134. package/services/mcpServerApproval.tsx +41 -0
  135. package/services/mockRateLimits.ts +882 -0
  136. package/services/notifier.ts +156 -0
  137. package/services/oauth/auth-code-listener.ts +211 -0
  138. package/services/oauth/client.ts +566 -0
  139. package/services/oauth/crypto.ts +23 -0
  140. package/services/oauth/getOauthProfile.ts +53 -0
  141. package/services/oauth/index.ts +198 -0
  142. package/services/plugins/PluginInstallationManager.ts +184 -0
  143. package/services/plugins/pluginCliCommands.ts +344 -0
  144. package/services/plugins/pluginOperations.ts +1088 -0
  145. package/services/policyLimits/index.ts +663 -0
  146. package/services/policyLimits/types.ts +27 -0
  147. package/services/preventSleep.ts +165 -0
  148. package/services/rateLimitMessages.ts +344 -0
  149. package/services/rateLimitMocking.ts +144 -0
  150. package/services/remoteManagedSettings/index.ts +638 -0
  151. package/services/remoteManagedSettings/securityCheck.tsx +74 -0
  152. package/services/remoteManagedSettings/syncCache.ts +112 -0
  153. package/services/remoteManagedSettings/syncCacheState.ts +96 -0
  154. package/services/remoteManagedSettings/types.ts +31 -0
  155. package/services/settingsSync/index.ts +581 -0
  156. package/services/settingsSync/types.ts +67 -0
  157. package/services/teamMemorySync/index.ts +1256 -0
  158. package/services/teamMemorySync/secretScanner.ts +324 -0
  159. package/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  160. package/services/teamMemorySync/types.ts +156 -0
  161. package/services/teamMemorySync/watcher.ts +387 -0
  162. package/services/tips/tipHistory.ts +17 -0
  163. package/services/tips/tipRegistry.ts +686 -0
  164. package/services/tips/tipScheduler.ts +58 -0
  165. package/services/tokenEstimation.ts +495 -0
  166. package/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  167. package/services/tools/StreamingToolExecutor.ts +530 -0
  168. package/services/tools/toolExecution.ts +1745 -0
  169. package/services/tools/toolHooks.ts +650 -0
  170. package/services/tools/toolOrchestration.ts +188 -0
  171. package/services/vcr.ts +406 -0
  172. package/services/voice.ts +525 -0
  173. package/services/voiceKeyterms.ts +106 -0
  174. package/services/voiceStreamSTT.ts +544 -0
  175. package/tools/AgentTool/AgentTool.tsx +1398 -0
  176. package/tools/AgentTool/UI.tsx +872 -0
  177. package/tools/AgentTool/agentColorManager.ts +66 -0
  178. package/tools/AgentTool/agentDisplay.ts +104 -0
  179. package/tools/AgentTool/agentMemory.ts +177 -0
  180. package/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  181. package/tools/AgentTool/agentToolUtils.ts +686 -0
  182. package/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  183. package/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  184. package/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  185. package/tools/AgentTool/built-in/planAgent.ts +92 -0
  186. package/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  187. package/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  188. package/tools/AgentTool/builtInAgents.ts +72 -0
  189. package/tools/AgentTool/constants.ts +12 -0
  190. package/tools/AgentTool/forkSubagent.ts +210 -0
  191. package/tools/AgentTool/loadAgentsDir.ts +755 -0
  192. package/tools/AgentTool/prompt.ts +287 -0
  193. package/tools/AgentTool/resumeAgent.ts +265 -0
  194. package/tools/AgentTool/runAgent.ts +973 -0
  195. package/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  196. package/tools/AskUserQuestionTool/prompt.ts +44 -0
  197. package/tools/BashTool/BashTool.tsx +1144 -0
  198. package/tools/BashTool/BashToolResultMessage.tsx +191 -0
  199. package/tools/BashTool/UI.tsx +185 -0
  200. package/tools/BashTool/bashCommandHelpers.ts +265 -0
  201. package/tools/BashTool/bashPermissions.ts +2621 -0
  202. package/tools/BashTool/bashSecurity.ts +2592 -0
  203. package/tools/BashTool/commandSemantics.ts +140 -0
  204. package/tools/BashTool/commentLabel.ts +13 -0
  205. package/tools/BashTool/destructiveCommandWarning.ts +102 -0
  206. package/tools/BashTool/modeValidation.ts +115 -0
  207. package/tools/BashTool/pathValidation.ts +1303 -0
  208. package/tools/BashTool/prompt.ts +369 -0
  209. package/tools/BashTool/readOnlyValidation.ts +1990 -0
  210. package/tools/BashTool/sedEditParser.ts +322 -0
  211. package/tools/BashTool/sedValidation.ts +684 -0
  212. package/tools/BashTool/shouldUseSandbox.ts +153 -0
  213. package/tools/BashTool/toolName.ts +2 -0
  214. package/tools/BashTool/utils.ts +223 -0
  215. package/tools/BriefTool/BriefTool.ts +204 -0
  216. package/tools/BriefTool/UI.tsx +101 -0
  217. package/tools/BriefTool/attachments.ts +110 -0
  218. package/tools/BriefTool/prompt.ts +22 -0
  219. package/tools/BriefTool/upload.ts +174 -0
  220. package/tools/ConfigTool/ConfigTool.ts +467 -0
  221. package/tools/ConfigTool/UI.tsx +38 -0
  222. package/tools/ConfigTool/constants.ts +1 -0
  223. package/tools/ConfigTool/prompt.ts +93 -0
  224. package/tools/ConfigTool/supportedSettings.ts +211 -0
  225. package/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  226. package/tools/EnterPlanModeTool/UI.tsx +33 -0
  227. package/tools/EnterPlanModeTool/constants.ts +1 -0
  228. package/tools/EnterPlanModeTool/prompt.ts +170 -0
  229. package/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  230. package/tools/EnterWorktreeTool/UI.tsx +20 -0
  231. package/tools/EnterWorktreeTool/constants.ts +1 -0
  232. package/tools/EnterWorktreeTool/prompt.ts +30 -0
  233. package/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  234. package/tools/ExitPlanModeTool/UI.tsx +82 -0
  235. package/tools/ExitPlanModeTool/constants.ts +2 -0
  236. package/tools/ExitPlanModeTool/prompt.ts +29 -0
  237. package/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  238. package/tools/ExitWorktreeTool/UI.tsx +25 -0
  239. package/tools/ExitWorktreeTool/constants.ts +1 -0
  240. package/tools/ExitWorktreeTool/prompt.ts +32 -0
  241. package/tools/FileEditTool/FileEditTool.ts +625 -0
  242. package/tools/FileEditTool/UI.tsx +289 -0
  243. package/tools/FileEditTool/constants.ts +11 -0
  244. package/tools/FileEditTool/prompt.ts +28 -0
  245. package/tools/FileEditTool/types.ts +85 -0
  246. package/tools/FileEditTool/utils.ts +775 -0
  247. package/tools/FileReadTool/FileReadTool.ts +1183 -0
  248. package/tools/FileReadTool/UI.tsx +185 -0
  249. package/tools/FileReadTool/imageProcessor.ts +94 -0
  250. package/tools/FileReadTool/limits.ts +92 -0
  251. package/tools/FileReadTool/prompt.ts +49 -0
  252. package/tools/FileWriteTool/FileWriteTool.ts +434 -0
  253. package/tools/FileWriteTool/UI.tsx +405 -0
  254. package/tools/FileWriteTool/prompt.ts +18 -0
  255. package/tools/GlobTool/GlobTool.ts +198 -0
  256. package/tools/GlobTool/UI.tsx +63 -0
  257. package/tools/GlobTool/prompt.ts +7 -0
  258. package/tools/GrepTool/GrepTool.ts +577 -0
  259. package/tools/GrepTool/UI.tsx +201 -0
  260. package/tools/GrepTool/prompt.ts +18 -0
  261. package/tools/LSPTool/LSPTool.ts +860 -0
  262. package/tools/LSPTool/UI.tsx +228 -0
  263. package/tools/LSPTool/formatters.ts +592 -0
  264. package/tools/LSPTool/prompt.ts +21 -0
  265. package/tools/LSPTool/schemas.ts +215 -0
  266. package/tools/LSPTool/symbolContext.ts +90 -0
  267. package/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  268. package/tools/ListMcpResourcesTool/UI.tsx +29 -0
  269. package/tools/ListMcpResourcesTool/prompt.ts +20 -0
  270. package/tools/MCPTool/MCPTool.ts +77 -0
  271. package/tools/MCPTool/UI.tsx +403 -0
  272. package/tools/MCPTool/classifyForCollapse.ts +604 -0
  273. package/tools/MCPTool/prompt.ts +3 -0
  274. package/tools/McpAuthTool/McpAuthTool.ts +215 -0
  275. package/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  276. package/tools/NotebookEditTool/UI.tsx +93 -0
  277. package/tools/NotebookEditTool/constants.ts +2 -0
  278. package/tools/NotebookEditTool/prompt.ts +3 -0
  279. package/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  280. package/tools/PowerShellTool/UI.tsx +131 -0
  281. package/tools/PowerShellTool/clmTypes.ts +211 -0
  282. package/tools/PowerShellTool/commandSemantics.ts +142 -0
  283. package/tools/PowerShellTool/commonParameters.ts +30 -0
  284. package/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  285. package/tools/PowerShellTool/gitSafety.ts +176 -0
  286. package/tools/PowerShellTool/modeValidation.ts +404 -0
  287. package/tools/PowerShellTool/pathValidation.ts +2049 -0
  288. package/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  289. package/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  290. package/tools/PowerShellTool/prompt.ts +145 -0
  291. package/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  292. package/tools/PowerShellTool/toolName.ts +2 -0
  293. package/tools/REPLTool/constants.ts +46 -0
  294. package/tools/REPLTool/primitiveTools.ts +39 -0
  295. package/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  296. package/tools/ReadMcpResourceTool/UI.tsx +37 -0
  297. package/tools/ReadMcpResourceTool/prompt.ts +16 -0
  298. package/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  299. package/tools/RemoteTriggerTool/UI.tsx +17 -0
  300. package/tools/RemoteTriggerTool/prompt.ts +15 -0
  301. package/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  302. package/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  303. package/tools/ScheduleCronTool/CronListTool.ts +97 -0
  304. package/tools/ScheduleCronTool/UI.tsx +60 -0
  305. package/tools/ScheduleCronTool/prompt.ts +135 -0
  306. package/tools/SendMessageTool/SendMessageTool.ts +917 -0
  307. package/tools/SendMessageTool/UI.tsx +31 -0
  308. package/tools/SendMessageTool/constants.ts +1 -0
  309. package/tools/SendMessageTool/prompt.ts +49 -0
  310. package/tools/SkillTool/SkillTool.ts +1108 -0
  311. package/tools/SkillTool/UI.tsx +128 -0
  312. package/tools/SkillTool/constants.ts +1 -0
  313. package/tools/SkillTool/prompt.ts +241 -0
  314. package/tools/SleepTool/prompt.ts +17 -0
  315. package/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  316. package/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  317. package/tools/TaskCreateTool/constants.ts +1 -0
  318. package/tools/TaskCreateTool/prompt.ts +56 -0
  319. package/tools/TaskGetTool/TaskGetTool.ts +128 -0
  320. package/tools/TaskGetTool/constants.ts +1 -0
  321. package/tools/TaskGetTool/prompt.ts +24 -0
  322. package/tools/TaskListTool/TaskListTool.ts +116 -0
  323. package/tools/TaskListTool/constants.ts +1 -0
  324. package/tools/TaskListTool/prompt.ts +49 -0
  325. package/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  326. package/tools/TaskOutputTool/constants.ts +1 -0
  327. package/tools/TaskStopTool/TaskStopTool.ts +131 -0
  328. package/tools/TaskStopTool/UI.tsx +41 -0
  329. package/tools/TaskStopTool/prompt.ts +8 -0
  330. package/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  331. package/tools/TaskUpdateTool/constants.ts +1 -0
  332. package/tools/TaskUpdateTool/prompt.ts +77 -0
  333. package/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  334. package/tools/TeamCreateTool/UI.tsx +6 -0
  335. package/tools/TeamCreateTool/constants.ts +1 -0
  336. package/tools/TeamCreateTool/prompt.ts +113 -0
  337. package/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  338. package/tools/TeamDeleteTool/UI.tsx +20 -0
  339. package/tools/TeamDeleteTool/constants.ts +1 -0
  340. package/tools/TeamDeleteTool/prompt.ts +16 -0
  341. package/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  342. package/tools/TodoWriteTool/constants.ts +1 -0
  343. package/tools/TodoWriteTool/prompt.ts +184 -0
  344. package/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  345. package/tools/ToolSearchTool/constants.ts +1 -0
  346. package/tools/ToolSearchTool/prompt.ts +121 -0
  347. package/tools/TungstenTool/TungstenTool.ts +4 -0
  348. package/tools/WebFetchTool/UI.tsx +72 -0
  349. package/tools/WebFetchTool/WebFetchTool.ts +318 -0
  350. package/tools/WebFetchTool/preapproved.ts +166 -0
  351. package/tools/WebFetchTool/prompt.ts +46 -0
  352. package/tools/WebFetchTool/utils.ts +530 -0
  353. package/tools/WebSearchTool/UI.tsx +101 -0
  354. package/tools/WebSearchTool/WebSearchTool.ts +435 -0
  355. package/tools/WebSearchTool/prompt.ts +34 -0
  356. package/tools/WorkflowTool/constants.ts +2 -0
  357. package/tools/XMemIngestTool/XMemIngestTool.ts +140 -0
  358. package/tools/XMemIngestTool/prompt.ts +13 -0
  359. package/tools/XMemRetrieveTool/XMemRetrieveTool.ts +177 -0
  360. package/tools/XMemRetrieveTool/prompt.ts +16 -0
  361. package/tools/XMemSearchTool/XMemSearchTool.ts +172 -0
  362. package/tools/XMemSearchTool/prompt.ts +11 -0
  363. package/tools/shared/gitOperationTracking.ts +277 -0
  364. package/tools/shared/spawnMultiAgent.ts +1093 -0
  365. package/tools/testing/TestingPermissionTool.tsx +74 -0
  366. package/tools/utils.ts +40 -0
  367. package/utils/CircularBuffer.ts +84 -0
  368. package/utils/Cursor.ts +1530 -0
  369. package/utils/QueryGuard.ts +121 -0
  370. package/utils/Shell.ts +474 -0
  371. package/utils/ShellCommand.ts +465 -0
  372. package/utils/abortController.ts +99 -0
  373. package/utils/activityManager.ts +164 -0
  374. package/utils/advisor.ts +145 -0
  375. package/utils/agentContext.ts +178 -0
  376. package/utils/agentId.ts +99 -0
  377. package/utils/agentSwarmsEnabled.ts +44 -0
  378. package/utils/agenticSessionSearch.ts +307 -0
  379. package/utils/analyzeContext.ts +1382 -0
  380. package/utils/ansiToPng.ts +334 -0
  381. package/utils/ansiToSvg.ts +272 -0
  382. package/utils/api.ts +718 -0
  383. package/utils/apiPreconnect.ts +71 -0
  384. package/utils/appleTerminalBackup.ts +124 -0
  385. package/utils/argumentSubstitution.ts +145 -0
  386. package/utils/array.ts +13 -0
  387. package/utils/asciicast.ts +239 -0
  388. package/utils/attachments.ts +4091 -0
  389. package/utils/attribution.ts +393 -0
  390. package/utils/auth.ts +2002 -0
  391. package/utils/authFileDescriptor.ts +196 -0
  392. package/utils/authPortable.ts +19 -0
  393. package/utils/autoModeDenials.ts +26 -0
  394. package/utils/autoRunIssue.tsx +122 -0
  395. package/utils/autoUpdater.ts +561 -0
  396. package/utils/aws.ts +74 -0
  397. package/utils/awsAuthStatusManager.ts +81 -0
  398. package/utils/axios.ts +8 -0
  399. package/utils/background/remote/preconditions.ts +235 -0
  400. package/utils/background/remote/remoteSession.ts +98 -0
  401. package/utils/backgroundHousekeeping.ts +94 -0
  402. package/utils/bash/ParsedCommand.ts +318 -0
  403. package/utils/bash/ShellSnapshot.ts +582 -0
  404. package/utils/bash/ast.ts +2679 -0
  405. package/utils/bash/bashParser.ts +4436 -0
  406. package/utils/bash/bashPipeCommand.ts +294 -0
  407. package/utils/bash/commands.ts +1339 -0
  408. package/utils/bash/heredoc.ts +733 -0
  409. package/utils/bash/parser.ts +230 -0
  410. package/utils/bash/prefix.ts +204 -0
  411. package/utils/bash/registry.ts +53 -0
  412. package/utils/bash/shellCompletion.ts +259 -0
  413. package/utils/bash/shellPrefix.ts +28 -0
  414. package/utils/bash/shellQuote.ts +304 -0
  415. package/utils/bash/shellQuoting.ts +128 -0
  416. package/utils/bash/specs/alias.ts +14 -0
  417. package/utils/bash/specs/index.ts +18 -0
  418. package/utils/bash/specs/nohup.ts +13 -0
  419. package/utils/bash/specs/pyright.ts +91 -0
  420. package/utils/bash/specs/sleep.ts +13 -0
  421. package/utils/bash/specs/srun.ts +31 -0
  422. package/utils/bash/specs/time.ts +13 -0
  423. package/utils/bash/specs/timeout.ts +20 -0
  424. package/utils/bash/treeSitterAnalysis.ts +506 -0
  425. package/utils/betas.ts +434 -0
  426. package/utils/billing.ts +78 -0
  427. package/utils/binaryCheck.ts +53 -0
  428. package/utils/browser.ts +68 -0
  429. package/utils/bufferedWriter.ts +100 -0
  430. package/utils/bundledMode.ts +22 -0
  431. package/utils/caCerts.ts +115 -0
  432. package/utils/caCertsConfig.ts +88 -0
  433. package/utils/cachePaths.ts +38 -0
  434. package/utils/classifierApprovals.ts +88 -0
  435. package/utils/classifierApprovalsHook.ts +17 -0
  436. package/utils/claudeCodeHints.ts +193 -0
  437. package/utils/claudeDesktop.ts +152 -0
  438. package/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  439. package/utils/claudeInChrome/common.ts +540 -0
  440. package/utils/claudeInChrome/mcpServer.ts +292 -0
  441. package/utils/claudeInChrome/prompt.ts +83 -0
  442. package/utils/claudeInChrome/setup.ts +400 -0
  443. package/utils/claudeInChrome/setupPortable.ts +233 -0
  444. package/utils/claudeInChrome/toolRendering.tsx +262 -0
  445. package/utils/claudemd.ts +1479 -0
  446. package/utils/cleanup.ts +602 -0
  447. package/utils/cleanupRegistry.ts +25 -0
  448. package/utils/cliArgs.ts +60 -0
  449. package/utils/cliHighlight.ts +54 -0
  450. package/utils/codeIndexing.ts +206 -0
  451. package/utils/collapseBackgroundBashNotifications.ts +84 -0
  452. package/utils/collapseHookSummaries.ts +59 -0
  453. package/utils/collapseReadSearch.ts +1109 -0
  454. package/utils/collapseTeammateShutdowns.ts +55 -0
  455. package/utils/color-diff-mock.ts +27 -0
  456. package/utils/combinedAbortSignal.ts +47 -0
  457. package/utils/commandLifecycle.ts +21 -0
  458. package/utils/commitAttribution.ts +961 -0
  459. package/utils/completionCache.ts +166 -0
  460. package/utils/computerUse/appNames.ts +196 -0
  461. package/utils/computerUse/cleanup.ts +86 -0
  462. package/utils/computerUse/common.ts +61 -0
  463. package/utils/computerUse/computerUseLock.ts +215 -0
  464. package/utils/computerUse/drainRunLoop.ts +79 -0
  465. package/utils/computerUse/escHotkey.ts +54 -0
  466. package/utils/computerUse/executor.ts +658 -0
  467. package/utils/computerUse/gates.ts +72 -0
  468. package/utils/computerUse/hostAdapter.ts +69 -0
  469. package/utils/computerUse/inputLoader.ts +30 -0
  470. package/utils/computerUse/mcpServer.ts +106 -0
  471. package/utils/computerUse/setup.ts +53 -0
  472. package/utils/computerUse/swiftLoader.ts +23 -0
  473. package/utils/computerUse/toolRendering.tsx +125 -0
  474. package/utils/computerUse/wrapper.tsx +336 -0
  475. package/utils/concurrentSessions.ts +204 -0
  476. package/utils/config.ts +1817 -0
  477. package/utils/configConstants.ts +21 -0
  478. package/utils/contentArray.ts +51 -0
  479. package/utils/context.ts +221 -0
  480. package/utils/contextAnalysis.ts +272 -0
  481. package/utils/contextSuggestions.ts +235 -0
  482. package/utils/controlMessageCompat.ts +32 -0
  483. package/utils/conversationRecovery.ts +597 -0
  484. package/utils/cron.ts +308 -0
  485. package/utils/cronJitterConfig.ts +75 -0
  486. package/utils/cronScheduler.ts +565 -0
  487. package/utils/cronTasks.ts +458 -0
  488. package/utils/cronTasksLock.ts +195 -0
  489. package/utils/crossProjectResume.ts +75 -0
  490. package/utils/crypto.ts +13 -0
  491. package/utils/cwd.ts +32 -0
  492. package/utils/debug.ts +268 -0
  493. package/utils/debugFilter.ts +157 -0
  494. package/utils/deepLink/banner.ts +123 -0
  495. package/utils/deepLink/parseDeepLink.ts +170 -0
  496. package/utils/deepLink/protocolHandler.ts +136 -0
  497. package/utils/deepLink/registerProtocol.ts +348 -0
  498. package/utils/deepLink/terminalLauncher.ts +557 -0
  499. package/utils/deepLink/terminalPreference.ts +54 -0
  500. package/utils/desktopDeepLink.ts +236 -0
  501. package/utils/detectRepository.ts +178 -0
  502. package/utils/diagLogs.ts +94 -0
  503. package/utils/diff.ts +177 -0
  504. package/utils/directMemberMessage.ts +69 -0
  505. package/utils/displayTags.ts +51 -0
  506. package/utils/doctorContextWarnings.ts +265 -0
  507. package/utils/doctorDiagnostic.ts +625 -0
  508. package/utils/dxt/helpers.ts +88 -0
  509. package/utils/dxt/zip.ts +226 -0
  510. package/utils/earlyInput.ts +191 -0
  511. package/utils/editor.ts +183 -0
  512. package/utils/effort.ts +329 -0
  513. package/utils/embeddedTools.ts +29 -0
  514. package/utils/env.ts +347 -0
  515. package/utils/envDynamic.ts +151 -0
  516. package/utils/envUtils.ts +183 -0
  517. package/utils/envValidation.ts +38 -0
  518. package/utils/errorLogSink.ts +235 -0
  519. package/utils/errors.ts +238 -0
  520. package/utils/exampleCommands.ts +184 -0
  521. package/utils/execFileNoThrow.ts +150 -0
  522. package/utils/execFileNoThrowPortable.ts +89 -0
  523. package/utils/execSyncWrapper.ts +38 -0
  524. package/utils/exportRenderer.tsx +98 -0
  525. package/utils/extraUsage.ts +23 -0
  526. package/utils/fastMode.ts +532 -0
  527. package/utils/file.ts +584 -0
  528. package/utils/fileHistory.ts +1115 -0
  529. package/utils/fileOperationAnalytics.ts +71 -0
  530. package/utils/filePersistence/filePersistence.ts +287 -0
  531. package/utils/filePersistence/outputsScanner.ts +126 -0
  532. package/utils/fileRead.ts +102 -0
  533. package/utils/fileReadCache.ts +96 -0
  534. package/utils/fileStateCache.ts +142 -0
  535. package/utils/findExecutable.ts +17 -0
  536. package/utils/fingerprint.ts +76 -0
  537. package/utils/forkedAgent.ts +689 -0
  538. package/utils/format.ts +308 -0
  539. package/utils/formatBriefTimestamp.ts +81 -0
  540. package/utils/fpsTracker.ts +47 -0
  541. package/utils/frontmatterParser.ts +370 -0
  542. package/utils/fsOperations.ts +770 -0
  543. package/utils/fullscreen.ts +202 -0
  544. package/utils/generatedFiles.ts +136 -0
  545. package/utils/generators.ts +88 -0
  546. package/utils/genericProcessUtils.ts +184 -0
  547. package/utils/getWorktreePaths.ts +70 -0
  548. package/utils/getWorktreePathsPortable.ts +27 -0
  549. package/utils/ghPrStatus.ts +106 -0
  550. package/utils/git/gitConfigParser.ts +277 -0
  551. package/utils/git/gitFilesystem.ts +699 -0
  552. package/utils/git/gitignore.ts +99 -0
  553. package/utils/git.ts +926 -0
  554. package/utils/gitDiff.ts +532 -0
  555. package/utils/gitSettings.ts +18 -0
  556. package/utils/github/ghAuthStatus.ts +29 -0
  557. package/utils/githubRepoPathMapping.ts +162 -0
  558. package/utils/glob.ts +130 -0
  559. package/utils/gracefulShutdown.ts +529 -0
  560. package/utils/groupToolUses.ts +182 -0
  561. package/utils/handlePromptSubmit.ts +610 -0
  562. package/utils/hash.ts +46 -0
  563. package/utils/headlessProfiler.ts +178 -0
  564. package/utils/heapDumpService.ts +303 -0
  565. package/utils/heatmap.ts +198 -0
  566. package/utils/highlightMatch.tsx +28 -0
  567. package/utils/hooks/AsyncHookRegistry.ts +309 -0
  568. package/utils/hooks/apiQueryHookHelper.ts +141 -0
  569. package/utils/hooks/execAgentHook.ts +339 -0
  570. package/utils/hooks/execHttpHook.ts +242 -0
  571. package/utils/hooks/execPromptHook.ts +211 -0
  572. package/utils/hooks/fileChangedWatcher.ts +191 -0
  573. package/utils/hooks/hookEvents.ts +192 -0
  574. package/utils/hooks/hookHelpers.ts +83 -0
  575. package/utils/hooks/hooksConfigManager.ts +400 -0
  576. package/utils/hooks/hooksConfigSnapshot.ts +133 -0
  577. package/utils/hooks/hooksSettings.ts +271 -0
  578. package/utils/hooks/postSamplingHooks.ts +70 -0
  579. package/utils/hooks/registerFrontmatterHooks.ts +67 -0
  580. package/utils/hooks/registerSkillHooks.ts +64 -0
  581. package/utils/hooks/sessionHooks.ts +447 -0
  582. package/utils/hooks/skillImprovement.ts +267 -0
  583. package/utils/hooks/ssrfGuard.ts +294 -0
  584. package/utils/hooks.ts +5022 -0
  585. package/utils/horizontalScroll.ts +137 -0
  586. package/utils/http.ts +136 -0
  587. package/utils/hyperlink.ts +39 -0
  588. package/utils/iTermBackup.ts +73 -0
  589. package/utils/ide.ts +1494 -0
  590. package/utils/idePathConversion.ts +90 -0
  591. package/utils/idleTimeout.ts +53 -0
  592. package/utils/imagePaste.ts +416 -0
  593. package/utils/imageResizer.ts +880 -0
  594. package/utils/imageStore.ts +167 -0
  595. package/utils/imageValidation.ts +104 -0
  596. package/utils/immediateCommand.ts +15 -0
  597. package/utils/inProcessTeammateHelpers.ts +102 -0
  598. package/utils/ink.ts +26 -0
  599. package/utils/intl.ts +94 -0
  600. package/utils/jetbrains.ts +191 -0
  601. package/utils/json.ts +277 -0
  602. package/utils/jsonRead.ts +16 -0
  603. package/utils/keyboardShortcuts.ts +14 -0
  604. package/utils/lazySchema.ts +8 -0
  605. package/utils/listSessionsImpl.ts +454 -0
  606. package/utils/localInstaller.ts +162 -0
  607. package/utils/lockfile.ts +43 -0
  608. package/utils/log.ts +362 -0
  609. package/utils/logoV2Utils.ts +347 -0
  610. package/utils/mailbox.ts +73 -0
  611. package/utils/managedEnv.ts +199 -0
  612. package/utils/managedEnvConstants.ts +191 -0
  613. package/utils/markdown.ts +381 -0
  614. package/utils/markdownConfigLoader.ts +600 -0
  615. package/utils/mcp/dateTimeParser.ts +121 -0
  616. package/utils/mcp/elicitationValidation.ts +336 -0
  617. package/utils/mcpInstructionsDelta.ts +130 -0
  618. package/utils/mcpOutputStorage.ts +189 -0
  619. package/utils/mcpValidation.ts +208 -0
  620. package/utils/mcpWebSocketTransport.ts +200 -0
  621. package/utils/memoize.ts +269 -0
  622. package/utils/memory/types.ts +12 -0
  623. package/utils/memory/versions.ts +8 -0
  624. package/utils/memoryFileDetection.ts +289 -0
  625. package/utils/messagePredicates.ts +8 -0
  626. package/utils/messageQueueManager.ts +547 -0
  627. package/utils/messages/mappers.ts +290 -0
  628. package/utils/messages/systemInit.ts +96 -0
  629. package/utils/messages.ts +5520 -0
  630. package/utils/model/agent.ts +157 -0
  631. package/utils/model/aliases.ts +35 -0
  632. package/utils/model/antModels.ts +64 -0
  633. package/utils/model/bedrock.ts +265 -0
  634. package/utils/model/check1mAccess.ts +72 -0
  635. package/utils/model/configs.ts +158 -0
  636. package/utils/model/contextWindowUpgradeCheck.ts +47 -0
  637. package/utils/model/deprecation.ts +101 -0
  638. package/utils/model/model.ts +654 -0
  639. package/utils/model/modelAllowlist.ts +170 -0
  640. package/utils/model/modelCapabilities.ts +118 -0
  641. package/utils/model/modelOptions.ts +589 -0
  642. package/utils/model/modelStrings.ts +170 -0
  643. package/utils/model/modelSupportOverrides.ts +50 -0
  644. package/utils/model/providers.ts +42 -0
  645. package/utils/model/validateModel.ts +159 -0
  646. package/utils/modelCost.ts +231 -0
  647. package/utils/modifiers.ts +36 -0
  648. package/utils/mtls.ts +179 -0
  649. package/utils/nativeInstaller/download.ts +523 -0
  650. package/utils/nativeInstaller/index.ts +18 -0
  651. package/utils/nativeInstaller/installer.ts +1708 -0
  652. package/utils/nativeInstaller/packageManagers.ts +336 -0
  653. package/utils/nativeInstaller/pidLock.ts +433 -0
  654. package/utils/notebook.ts +224 -0
  655. package/utils/objectGroupBy.ts +18 -0
  656. package/utils/pasteStore.ts +104 -0
  657. package/utils/path.ts +155 -0
  658. package/utils/pdf.ts +300 -0
  659. package/utils/pdfUtils.ts +70 -0
  660. package/utils/peerAddress.ts +21 -0
  661. package/utils/permissions/PermissionMode.ts +141 -0
  662. package/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  663. package/utils/permissions/PermissionResult.ts +35 -0
  664. package/utils/permissions/PermissionRule.ts +40 -0
  665. package/utils/permissions/PermissionUpdate.ts +389 -0
  666. package/utils/permissions/PermissionUpdateSchema.ts +78 -0
  667. package/utils/permissions/autoModeState.ts +39 -0
  668. package/utils/permissions/bashClassifier.ts +61 -0
  669. package/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  670. package/utils/permissions/classifierDecision.ts +98 -0
  671. package/utils/permissions/classifierShared.ts +39 -0
  672. package/utils/permissions/dangerousPatterns.ts +80 -0
  673. package/utils/permissions/denialTracking.ts +45 -0
  674. package/utils/permissions/filesystem.ts +1777 -0
  675. package/utils/permissions/getNextPermissionMode.ts +101 -0
  676. package/utils/permissions/pathValidation.ts +485 -0
  677. package/utils/permissions/permissionExplainer.ts +250 -0
  678. package/utils/permissions/permissionRuleParser.ts +198 -0
  679. package/utils/permissions/permissionSetup.ts +1532 -0
  680. package/utils/permissions/permissions.ts +1486 -0
  681. package/utils/permissions/permissionsLoader.ts +296 -0
  682. package/utils/permissions/shadowedRuleDetection.ts +234 -0
  683. package/utils/permissions/shellRuleMatching.ts +228 -0
  684. package/utils/permissions/yoloClassifier.ts +1495 -0
  685. package/utils/planModeV2.ts +95 -0
  686. package/utils/plans.ts +397 -0
  687. package/utils/platform.ts +150 -0
  688. package/utils/plugins/addDirPluginSettings.ts +71 -0
  689. package/utils/plugins/cacheUtils.ts +196 -0
  690. package/utils/plugins/dependencyResolver.ts +305 -0
  691. package/utils/plugins/fetchTelemetry.ts +135 -0
  692. package/utils/plugins/gitAvailability.ts +69 -0
  693. package/utils/plugins/headlessPluginInstall.ts +174 -0
  694. package/utils/plugins/hintRecommendation.ts +164 -0
  695. package/utils/plugins/installCounts.ts +292 -0
  696. package/utils/plugins/installedPluginsManager.ts +1268 -0
  697. package/utils/plugins/loadPluginAgents.ts +348 -0
  698. package/utils/plugins/loadPluginCommands.ts +946 -0
  699. package/utils/plugins/loadPluginHooks.ts +287 -0
  700. package/utils/plugins/loadPluginOutputStyles.ts +178 -0
  701. package/utils/plugins/lspPluginIntegration.ts +387 -0
  702. package/utils/plugins/lspRecommendation.ts +374 -0
  703. package/utils/plugins/managedPlugins.ts +27 -0
  704. package/utils/plugins/marketplaceHelpers.ts +592 -0
  705. package/utils/plugins/marketplaceManager.ts +2643 -0
  706. package/utils/plugins/mcpPluginIntegration.ts +634 -0
  707. package/utils/plugins/mcpbHandler.ts +968 -0
  708. package/utils/plugins/officialMarketplace.ts +25 -0
  709. package/utils/plugins/officialMarketplaceGcs.ts +216 -0
  710. package/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  711. package/utils/plugins/orphanedPluginFilter.ts +114 -0
  712. package/utils/plugins/parseMarketplaceInput.ts +162 -0
  713. package/utils/plugins/performStartupChecks.tsx +70 -0
  714. package/utils/plugins/pluginAutoupdate.ts +284 -0
  715. package/utils/plugins/pluginBlocklist.ts +127 -0
  716. package/utils/plugins/pluginDirectories.ts +178 -0
  717. package/utils/plugins/pluginFlagging.ts +208 -0
  718. package/utils/plugins/pluginIdentifier.ts +123 -0
  719. package/utils/plugins/pluginInstallationHelpers.ts +595 -0
  720. package/utils/plugins/pluginLoader.ts +3302 -0
  721. package/utils/plugins/pluginOptionsStorage.ts +400 -0
  722. package/utils/plugins/pluginPolicy.ts +20 -0
  723. package/utils/plugins/pluginStartupCheck.ts +341 -0
  724. package/utils/plugins/pluginVersioning.ts +157 -0
  725. package/utils/plugins/reconciler.ts +265 -0
  726. package/utils/plugins/refresh.ts +215 -0
  727. package/utils/plugins/schemas.ts +1681 -0
  728. package/utils/plugins/validatePlugin.ts +903 -0
  729. package/utils/plugins/walkPluginMarkdown.ts +69 -0
  730. package/utils/plugins/zipCache.ts +406 -0
  731. package/utils/plugins/zipCacheAdapters.ts +164 -0
  732. package/utils/powershell/dangerousCmdlets.ts +185 -0
  733. package/utils/powershell/parser.ts +1804 -0
  734. package/utils/powershell/staticPrefix.ts +316 -0
  735. package/utils/preflightChecks.tsx +151 -0
  736. package/utils/privacyLevel.ts +55 -0
  737. package/utils/process.ts +68 -0
  738. package/utils/processUserInput/processBashCommand.tsx +140 -0
  739. package/utils/processUserInput/processSlashCommand.tsx +922 -0
  740. package/utils/processUserInput/processTextPrompt.ts +100 -0
  741. package/utils/processUserInput/processUserInput.ts +605 -0
  742. package/utils/profilerBase.ts +46 -0
  743. package/utils/promptCategory.ts +49 -0
  744. package/utils/promptEditor.ts +188 -0
  745. package/utils/promptShellExecution.ts +183 -0
  746. package/utils/proxy.ts +426 -0
  747. package/utils/queryContext.ts +179 -0
  748. package/utils/queryHelpers.ts +552 -0
  749. package/utils/queryProfiler.ts +301 -0
  750. package/utils/queueProcessor.ts +95 -0
  751. package/utils/readEditContext.ts +227 -0
  752. package/utils/readFileInRange.ts +383 -0
  753. package/utils/releaseNotes.ts +360 -0
  754. package/utils/renderOptions.ts +113 -0
  755. package/utils/ripgrep.ts +679 -0
  756. package/utils/sandbox/sandbox-adapter.ts +985 -0
  757. package/utils/sandbox/sandbox-ui-utils.ts +12 -0
  758. package/utils/sanitization.ts +91 -0
  759. package/utils/screenshotClipboard.ts +121 -0
  760. package/utils/sdkEventQueue.ts +134 -0
  761. package/utils/secureStorage/fallbackStorage.ts +70 -0
  762. package/utils/secureStorage/index.ts +17 -0
  763. package/utils/secureStorage/keychainPrefetch.ts +116 -0
  764. package/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  765. package/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  766. package/utils/secureStorage/plainTextStorage.ts +84 -0
  767. package/utils/semanticBoolean.ts +29 -0
  768. package/utils/semanticNumber.ts +36 -0
  769. package/utils/semver.ts +59 -0
  770. package/utils/sequential.ts +56 -0
  771. package/utils/sessionActivity.ts +133 -0
  772. package/utils/sessionEnvVars.ts +22 -0
  773. package/utils/sessionEnvironment.ts +166 -0
  774. package/utils/sessionFileAccessHooks.ts +250 -0
  775. package/utils/sessionIngressAuth.ts +140 -0
  776. package/utils/sessionRestore.ts +551 -0
  777. package/utils/sessionStart.ts +232 -0
  778. package/utils/sessionState.ts +150 -0
  779. package/utils/sessionStorage.ts +5105 -0
  780. package/utils/sessionStoragePortable.ts +793 -0
  781. package/utils/sessionTitle.ts +129 -0
  782. package/utils/sessionUrl.ts +64 -0
  783. package/utils/set.ts +53 -0
  784. package/utils/settings/allErrors.ts +32 -0
  785. package/utils/settings/applySettingsChange.ts +92 -0
  786. package/utils/settings/changeDetector.ts +488 -0
  787. package/utils/settings/constants.ts +202 -0
  788. package/utils/settings/internalWrites.ts +37 -0
  789. package/utils/settings/managedPath.ts +34 -0
  790. package/utils/settings/mdm/constants.ts +81 -0
  791. package/utils/settings/mdm/rawRead.ts +130 -0
  792. package/utils/settings/mdm/settings.ts +316 -0
  793. package/utils/settings/permissionValidation.ts +262 -0
  794. package/utils/settings/pluginOnlyPolicy.ts +60 -0
  795. package/utils/settings/schemaOutput.ts +8 -0
  796. package/utils/settings/settings.ts +1015 -0
  797. package/utils/settings/settingsCache.ts +80 -0
  798. package/utils/settings/toolValidationConfig.ts +103 -0
  799. package/utils/settings/types.ts +1149 -0
  800. package/utils/settings/validateEditTool.ts +45 -0
  801. package/utils/settings/validation.ts +265 -0
  802. package/utils/settings/validationTips.ts +164 -0
  803. package/utils/shell/bashProvider.ts +255 -0
  804. package/utils/shell/outputLimits.ts +14 -0
  805. package/utils/shell/powershellDetection.ts +107 -0
  806. package/utils/shell/powershellProvider.ts +123 -0
  807. package/utils/shell/prefix.ts +367 -0
  808. package/utils/shell/readOnlyCommandValidation.ts +1893 -0
  809. package/utils/shell/resolveDefaultShell.ts +14 -0
  810. package/utils/shell/shellProvider.ts +33 -0
  811. package/utils/shell/shellToolUtils.ts +22 -0
  812. package/utils/shell/specPrefix.ts +241 -0
  813. package/utils/shellConfig.ts +167 -0
  814. package/utils/sideQuery.ts +222 -0
  815. package/utils/sideQuestion.ts +155 -0
  816. package/utils/signal.ts +43 -0
  817. package/utils/sinks.ts +16 -0
  818. package/utils/skills/skillChangeDetector.ts +311 -0
  819. package/utils/slashCommandParsing.ts +60 -0
  820. package/utils/sleep.ts +84 -0
  821. package/utils/sliceAnsi.ts +91 -0
  822. package/utils/slowOperations.ts +286 -0
  823. package/utils/standaloneAgent.ts +23 -0
  824. package/utils/startupProfiler.ts +194 -0
  825. package/utils/staticRender.tsx +116 -0
  826. package/utils/stats.ts +1061 -0
  827. package/utils/statsCache.ts +434 -0
  828. package/utils/status.tsx +362 -0
  829. package/utils/statusNoticeDefinitions.tsx +198 -0
  830. package/utils/statusNoticeHelpers.ts +20 -0
  831. package/utils/stream.ts +76 -0
  832. package/utils/streamJsonStdoutGuard.ts +123 -0
  833. package/utils/streamlinedTransform.ts +201 -0
  834. package/utils/stringUtils.ts +235 -0
  835. package/utils/subprocessEnv.ts +99 -0
  836. package/utils/suggestions/commandSuggestions.ts +567 -0
  837. package/utils/suggestions/directoryCompletion.ts +263 -0
  838. package/utils/suggestions/shellHistoryCompletion.ts +119 -0
  839. package/utils/suggestions/skillUsageTracking.ts +55 -0
  840. package/utils/suggestions/slackChannelSuggestions.ts +209 -0
  841. package/utils/swarm/It2SetupPrompt.tsx +380 -0
  842. package/utils/swarm/backends/ITermBackend.ts +370 -0
  843. package/utils/swarm/backends/InProcessBackend.ts +339 -0
  844. package/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  845. package/utils/swarm/backends/TmuxBackend.ts +764 -0
  846. package/utils/swarm/backends/detection.ts +128 -0
  847. package/utils/swarm/backends/it2Setup.ts +245 -0
  848. package/utils/swarm/backends/registry.ts +464 -0
  849. package/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  850. package/utils/swarm/backends/types.ts +311 -0
  851. package/utils/swarm/constants.ts +33 -0
  852. package/utils/swarm/inProcessRunner.ts +1552 -0
  853. package/utils/swarm/leaderPermissionBridge.ts +54 -0
  854. package/utils/swarm/permissionSync.ts +928 -0
  855. package/utils/swarm/reconnection.ts +119 -0
  856. package/utils/swarm/spawnInProcess.ts +328 -0
  857. package/utils/swarm/spawnUtils.ts +146 -0
  858. package/utils/swarm/teamHelpers.ts +683 -0
  859. package/utils/swarm/teammateInit.ts +129 -0
  860. package/utils/swarm/teammateLayoutManager.ts +107 -0
  861. package/utils/swarm/teammateModel.ts +10 -0
  862. package/utils/swarm/teammatePromptAddendum.ts +18 -0
  863. package/utils/systemDirectories.ts +74 -0
  864. package/utils/systemPrompt.ts +123 -0
  865. package/utils/systemPromptType.ts +14 -0
  866. package/utils/systemTheme.ts +119 -0
  867. package/utils/taggedId.ts +54 -0
  868. package/utils/task/TaskOutput.ts +390 -0
  869. package/utils/task/diskOutput.ts +451 -0
  870. package/utils/task/framework.ts +308 -0
  871. package/utils/task/outputFormatting.ts +38 -0
  872. package/utils/task/sdkProgress.ts +36 -0
  873. package/utils/tasks.ts +862 -0
  874. package/utils/teamDiscovery.ts +81 -0
  875. package/utils/teamMemoryOps.ts +88 -0
  876. package/utils/teammate.ts +292 -0
  877. package/utils/teammateContext.ts +96 -0
  878. package/utils/teammateMailbox.ts +1183 -0
  879. package/utils/telemetry/betaSessionTracing.ts +491 -0
  880. package/utils/telemetry/bigqueryExporter.ts +252 -0
  881. package/utils/telemetry/events.ts +75 -0
  882. package/utils/telemetry/instrumentation.ts +825 -0
  883. package/utils/telemetry/logger.ts +26 -0
  884. package/utils/telemetry/perfettoTracing.ts +1120 -0
  885. package/utils/telemetry/pluginTelemetry.ts +289 -0
  886. package/utils/telemetry/sessionTracing.ts +927 -0
  887. package/utils/telemetry/skillLoadedEvent.ts +39 -0
  888. package/utils/telemetryAttributes.ts +71 -0
  889. package/utils/teleport/api.ts +466 -0
  890. package/utils/teleport/environmentSelection.ts +77 -0
  891. package/utils/teleport/environments.ts +120 -0
  892. package/utils/teleport/gitBundle.ts +292 -0
  893. package/utils/teleport.tsx +1226 -0
  894. package/utils/tempfile.ts +31 -0
  895. package/utils/terminal.ts +131 -0
  896. package/utils/terminalPanel.ts +191 -0
  897. package/utils/textHighlighting.ts +166 -0
  898. package/utils/theme.ts +639 -0
  899. package/utils/thinking.ts +162 -0
  900. package/utils/timeouts.ts +39 -0
  901. package/utils/tmuxSocket.ts +427 -0
  902. package/utils/todo/types.ts +18 -0
  903. package/utils/tokenBudget.ts +73 -0
  904. package/utils/tokens.ts +261 -0
  905. package/utils/toolErrors.ts +132 -0
  906. package/utils/toolPool.ts +79 -0
  907. package/utils/toolResultStorage.ts +1040 -0
  908. package/utils/toolSchemaCache.ts +26 -0
  909. package/utils/toolSearch.ts +756 -0
  910. package/utils/transcriptSearch.ts +202 -0
  911. package/utils/treeify.ts +170 -0
  912. package/utils/truncate.ts +179 -0
  913. package/utils/ultraplan/ccrSession.ts +349 -0
  914. package/utils/ultraplan/keyword.ts +127 -0
  915. package/utils/ultraplan/prompt.txt +1 -0
  916. package/utils/unaryLogging.ts +39 -0
  917. package/utils/undercover.ts +89 -0
  918. package/utils/user.ts +194 -0
  919. package/utils/userAgent.ts +10 -0
  920. package/utils/userPromptKeywords.ts +27 -0
  921. package/utils/uuid.ts +27 -0
  922. package/utils/warningHandler.ts +121 -0
  923. package/utils/which.ts +82 -0
  924. package/utils/windowsPaths.ts +173 -0
  925. package/utils/withResolvers.ts +13 -0
  926. package/utils/words.ts +800 -0
  927. package/utils/workloadContext.ts +57 -0
  928. package/utils/worktree.ts +1519 -0
  929. package/utils/worktreeModeEnabled.ts +11 -0
  930. package/utils/xdg.ts +65 -0
  931. package/utils/xmem.ts +6 -0
  932. package/utils/xml.ts +16 -0
  933. package/utils/yaml.ts +15 -0
  934. package/utils/zodToJsonSchema.ts +23 -0
@@ -0,0 +1,495 @@
1
+ /**
2
+ * Session Memory automatically maintains a markdown file with notes about the current conversation.
3
+ * It runs periodically in the background using a forked subagent to extract key information
4
+ * without interrupting the main conversation flow.
5
+ */
6
+
7
+ import { writeFile } from 'fs/promises'
8
+ import memoize from 'lodash-es/memoize.js'
9
+ import { getIsRemoteMode } from '../../bootstrap/state.js'
10
+ import { getSystemPrompt } from '../../constants/prompts.js'
11
+ import { getSystemContext, getUserContext } from '../../context.js'
12
+ import type { CanUseToolFn } from '../../hooks/useCanUseTool.js'
13
+ import type { Tool, ToolUseContext } from '../../Tool.js'
14
+ import { FILE_EDIT_TOOL_NAME } from '../../tools/FileEditTool/constants.js'
15
+ import {
16
+ FileReadTool,
17
+ type Output as FileReadToolOutput,
18
+ } from '../../tools/FileReadTool/FileReadTool.js'
19
+ import type { Message } from '../../types/message.js'
20
+ import { count } from '../../utils/array.js'
21
+ import {
22
+ createCacheSafeParams,
23
+ createSubagentContext,
24
+ runForkedAgent,
25
+ } from '../../utils/forkedAgent.js'
26
+ import { getFsImplementation } from '../../utils/fsOperations.js'
27
+ import {
28
+ type REPLHookContext,
29
+ registerPostSamplingHook,
30
+ } from '../../utils/hooks/postSamplingHooks.js'
31
+ import {
32
+ createUserMessage,
33
+ hasToolCallsInLastAssistantTurn,
34
+ } from '../../utils/messages.js'
35
+ import {
36
+ getSessionMemoryDir,
37
+ getSessionMemoryPath,
38
+ } from '../../utils/permissions/filesystem.js'
39
+ import { sequential } from '../../utils/sequential.js'
40
+ import { asSystemPrompt } from '../../utils/systemPromptType.js'
41
+ import { getTokenUsage, tokenCountWithEstimation } from '../../utils/tokens.js'
42
+ import { logEvent } from '../analytics/index.js'
43
+ import { isAutoCompactEnabled } from '../compact/autoCompact.js'
44
+ import {
45
+ buildSessionMemoryUpdatePrompt,
46
+ loadSessionMemoryTemplate,
47
+ } from './prompts.js'
48
+ import {
49
+ DEFAULT_SESSION_MEMORY_CONFIG,
50
+ getSessionMemoryConfig,
51
+ getToolCallsBetweenUpdates,
52
+ hasMetInitializationThreshold,
53
+ hasMetUpdateThreshold,
54
+ isSessionMemoryInitialized,
55
+ markExtractionCompleted,
56
+ markExtractionStarted,
57
+ markSessionMemoryInitialized,
58
+ recordExtractionTokenCount,
59
+ type SessionMemoryConfig,
60
+ setLastSummarizedMessageId,
61
+ setSessionMemoryConfig,
62
+ } from './sessionMemoryUtils.js'
63
+
64
+ // ============================================================================
65
+ // Feature Gate and Config (Cached - Non-blocking)
66
+ // ============================================================================
67
+ // These functions return cached values from disk immediately without blocking
68
+ // on GrowthBook initialization. Values may be stale but are updated in background.
69
+
70
+ import { errorMessage, getErrnoCode } from '../../utils/errors.js'
71
+ import {
72
+ getDynamicConfig_CACHED_MAY_BE_STALE,
73
+ getFeatureValue_CACHED_MAY_BE_STALE,
74
+ } from '../analytics/growthbook.js'
75
+
76
+ /**
77
+ * Check if session memory feature is enabled.
78
+ * Uses cached gate value - returns immediately without blocking.
79
+ */
80
+ function isSessionMemoryGateEnabled(): boolean {
81
+ return getFeatureValue_CACHED_MAY_BE_STALE('tengu_session_memory', false)
82
+ }
83
+
84
+ /**
85
+ * Get session memory config from cache.
86
+ * Returns immediately without blocking - value may be stale.
87
+ */
88
+ function getSessionMemoryRemoteConfig(): Partial<SessionMemoryConfig> {
89
+ return getDynamicConfig_CACHED_MAY_BE_STALE<Partial<SessionMemoryConfig>>(
90
+ 'tengu_sm_config',
91
+ {},
92
+ )
93
+ }
94
+
95
+ // ============================================================================
96
+ // Module State
97
+ // ============================================================================
98
+
99
+ let lastMemoryMessageUuid: string | undefined
100
+
101
+ /**
102
+ * Reset the last memory message UUID (for testing)
103
+ */
104
+ export function resetLastMemoryMessageUuid(): void {
105
+ lastMemoryMessageUuid = undefined
106
+ }
107
+
108
+ function countToolCallsSince(
109
+ messages: Message[],
110
+ sinceUuid: string | undefined,
111
+ ): number {
112
+ let toolCallCount = 0
113
+ let foundStart = sinceUuid === null || sinceUuid === undefined
114
+
115
+ for (const message of messages) {
116
+ if (!foundStart) {
117
+ if (message.uuid === sinceUuid) {
118
+ foundStart = true
119
+ }
120
+ continue
121
+ }
122
+
123
+ if (message.type === 'assistant') {
124
+ const content = message.message.content
125
+ if (Array.isArray(content)) {
126
+ toolCallCount += count(content, block => block.type === 'tool_use')
127
+ }
128
+ }
129
+ }
130
+
131
+ return toolCallCount
132
+ }
133
+
134
+ export function shouldExtractMemory(messages: Message[]): boolean {
135
+ // Check if we've met the initialization threshold
136
+ // Uses total context window tokens (same as autocompact) for consistent behavior
137
+ const currentTokenCount = tokenCountWithEstimation(messages)
138
+ if (!isSessionMemoryInitialized()) {
139
+ if (!hasMetInitializationThreshold(currentTokenCount)) {
140
+ return false
141
+ }
142
+ markSessionMemoryInitialized()
143
+ }
144
+
145
+ // Check if we've met the minimum tokens between updates threshold
146
+ // Uses context window growth since last extraction (same metric as init threshold)
147
+ const hasMetTokenThreshold = hasMetUpdateThreshold(currentTokenCount)
148
+
149
+ // Check if we've met the tool calls threshold
150
+ const toolCallsSinceLastUpdate = countToolCallsSince(
151
+ messages,
152
+ lastMemoryMessageUuid,
153
+ )
154
+ const hasMetToolCallThreshold =
155
+ toolCallsSinceLastUpdate >= getToolCallsBetweenUpdates()
156
+
157
+ // Check if the last assistant turn has no tool calls (safe to extract)
158
+ const hasToolCallsInLastTurn = hasToolCallsInLastAssistantTurn(messages)
159
+
160
+ // Trigger extraction when:
161
+ // 1. Both thresholds are met (tokens AND tool calls), OR
162
+ // 2. No tool calls in last turn AND token threshold is met
163
+ // (to ensure we extract at natural conversation breaks)
164
+ //
165
+ // IMPORTANT: The token threshold (minimumTokensBetweenUpdate) is ALWAYS required.
166
+ // Even if the tool call threshold is met, extraction won't happen until the
167
+ // token threshold is also satisfied. This prevents excessive extractions.
168
+ const shouldExtract =
169
+ (hasMetTokenThreshold && hasMetToolCallThreshold) ||
170
+ (hasMetTokenThreshold && !hasToolCallsInLastTurn)
171
+
172
+ if (shouldExtract) {
173
+ const lastMessage = messages[messages.length - 1]
174
+ if (lastMessage?.uuid) {
175
+ lastMemoryMessageUuid = lastMessage.uuid
176
+ }
177
+ return true
178
+ }
179
+
180
+ return false
181
+ }
182
+
183
+ async function setupSessionMemoryFile(
184
+ toolUseContext: ToolUseContext,
185
+ ): Promise<{ memoryPath: string; currentMemory: string }> {
186
+ const fs = getFsImplementation()
187
+
188
+ // Set up directory and file
189
+ const sessionMemoryDir = getSessionMemoryDir()
190
+ await fs.mkdir(sessionMemoryDir, { mode: 0o700 })
191
+
192
+ const memoryPath = getSessionMemoryPath()
193
+
194
+ // Create the memory file if it doesn't exist (wx = O_CREAT|O_EXCL)
195
+ try {
196
+ await writeFile(memoryPath, '', {
197
+ encoding: 'utf-8',
198
+ mode: 0o600,
199
+ flag: 'wx',
200
+ })
201
+ // Only load template if file was just created
202
+ const template = await loadSessionMemoryTemplate()
203
+ await writeFile(memoryPath, template, {
204
+ encoding: 'utf-8',
205
+ mode: 0o600,
206
+ })
207
+ } catch (e: unknown) {
208
+ const code = getErrnoCode(e)
209
+ if (code !== 'EEXIST') {
210
+ throw e
211
+ }
212
+ }
213
+
214
+ // Drop any cached entry so FileReadTool's dedup doesn't return a
215
+ // file_unchanged stub — we need the actual content. The Read repopulates it.
216
+ toolUseContext.readFileState.delete(memoryPath)
217
+ const result = await FileReadTool.call(
218
+ { file_path: memoryPath },
219
+ toolUseContext,
220
+ )
221
+ let currentMemory = ''
222
+
223
+ const output = result.data as FileReadToolOutput
224
+ if (output.type === 'text') {
225
+ currentMemory = output.file.content
226
+ }
227
+
228
+ logEvent('tengu_session_memory_file_read', {
229
+ content_length: currentMemory.length,
230
+ })
231
+
232
+ return { memoryPath, currentMemory }
233
+ }
234
+
235
+ /**
236
+ * Initialize session memory config from remote config (lazy initialization).
237
+ * Memoized - only runs once per session, subsequent calls return immediately.
238
+ * Uses cached config values - non-blocking.
239
+ */
240
+ const initSessionMemoryConfigIfNeeded = memoize((): void => {
241
+ // Load config from cache (non-blocking, may be stale)
242
+ const remoteConfig = getSessionMemoryRemoteConfig()
243
+
244
+ // Only use remote values if they are explicitly set (non-zero positive numbers)
245
+ // This ensures sensible defaults aren't overridden by zero values
246
+ const config: SessionMemoryConfig = {
247
+ minimumMessageTokensToInit:
248
+ remoteConfig.minimumMessageTokensToInit &&
249
+ remoteConfig.minimumMessageTokensToInit > 0
250
+ ? remoteConfig.minimumMessageTokensToInit
251
+ : DEFAULT_SESSION_MEMORY_CONFIG.minimumMessageTokensToInit,
252
+ minimumTokensBetweenUpdate:
253
+ remoteConfig.minimumTokensBetweenUpdate &&
254
+ remoteConfig.minimumTokensBetweenUpdate > 0
255
+ ? remoteConfig.minimumTokensBetweenUpdate
256
+ : DEFAULT_SESSION_MEMORY_CONFIG.minimumTokensBetweenUpdate,
257
+ toolCallsBetweenUpdates:
258
+ remoteConfig.toolCallsBetweenUpdates &&
259
+ remoteConfig.toolCallsBetweenUpdates > 0
260
+ ? remoteConfig.toolCallsBetweenUpdates
261
+ : DEFAULT_SESSION_MEMORY_CONFIG.toolCallsBetweenUpdates,
262
+ }
263
+ setSessionMemoryConfig(config)
264
+ })
265
+
266
+ /**
267
+ * Session memory post-sampling hook that extracts and updates session notes
268
+ */
269
+ // Track if we've logged the gate check failure this session (to avoid spam)
270
+ let hasLoggedGateFailure = false
271
+
272
+ const extractSessionMemory = sequential(async function (
273
+ context: REPLHookContext,
274
+ ): Promise<void> {
275
+ const { messages, toolUseContext, querySource } = context
276
+
277
+ // Only run session memory on main REPL thread
278
+ if (querySource !== 'repl_main_thread') {
279
+ // Don't log this - it's expected for subagents, teammates, etc.
280
+ return
281
+ }
282
+
283
+ // Check gate lazily when hook runs (cached, non-blocking)
284
+ if (!isSessionMemoryGateEnabled()) {
285
+ // Log gate failure once per session (ant-only)
286
+ if (process.env.USER_TYPE === 'ant' && !hasLoggedGateFailure) {
287
+ hasLoggedGateFailure = true
288
+ logEvent('tengu_session_memory_gate_disabled', {})
289
+ }
290
+ return
291
+ }
292
+
293
+ // Initialize config from remote (lazy, only once)
294
+ initSessionMemoryConfigIfNeeded()
295
+
296
+ if (!shouldExtractMemory(messages)) {
297
+ return
298
+ }
299
+
300
+ markExtractionStarted()
301
+
302
+ // Create isolated context for setup to avoid polluting parent's cache
303
+ const setupContext = createSubagentContext(toolUseContext)
304
+
305
+ // Set up file system and read current state with isolated context
306
+ const { memoryPath, currentMemory } =
307
+ await setupSessionMemoryFile(setupContext)
308
+
309
+ // Create extraction message
310
+ const userPrompt = await buildSessionMemoryUpdatePrompt(
311
+ currentMemory,
312
+ memoryPath,
313
+ )
314
+
315
+ // Run session memory extraction using runForkedAgent for prompt caching
316
+ // runForkedAgent creates an isolated context to prevent mutation of parent state
317
+ // Pass setupContext.readFileState so the forked agent can edit the memory file
318
+ await runForkedAgent({
319
+ promptMessages: [createUserMessage({ content: userPrompt })],
320
+ cacheSafeParams: createCacheSafeParams(context),
321
+ canUseTool: createMemoryFileCanUseTool(memoryPath),
322
+ querySource: 'session_memory',
323
+ forkLabel: 'session_memory',
324
+ overrides: { readFileState: setupContext.readFileState },
325
+ })
326
+
327
+ // Log extraction event for tracking frequency
328
+ // Use the token usage from the last message in the conversation
329
+ const lastMessage = messages[messages.length - 1]
330
+ const usage = lastMessage ? getTokenUsage(lastMessage) : undefined
331
+ const config = getSessionMemoryConfig()
332
+ logEvent('tengu_session_memory_extraction', {
333
+ input_tokens: usage?.input_tokens,
334
+ output_tokens: usage?.output_tokens,
335
+ cache_read_input_tokens: usage?.cache_read_input_tokens ?? undefined,
336
+ cache_creation_input_tokens:
337
+ usage?.cache_creation_input_tokens ?? undefined,
338
+ config_min_message_tokens_to_init: config.minimumMessageTokensToInit,
339
+ config_min_tokens_between_update: config.minimumTokensBetweenUpdate,
340
+ config_tool_calls_between_updates: config.toolCallsBetweenUpdates,
341
+ })
342
+
343
+ // Record the context size at extraction for tracking minimumTokensBetweenUpdate
344
+ recordExtractionTokenCount(tokenCountWithEstimation(messages))
345
+
346
+ // Update lastSummarizedMessageId after successful completion
347
+ updateLastSummarizedMessageIdIfSafe(messages)
348
+
349
+ markExtractionCompleted()
350
+ })
351
+
352
+ /**
353
+ * Initialize session memory by registering the post-sampling hook.
354
+ * This is synchronous to avoid race conditions during startup.
355
+ * The gate check and config loading happen lazily when the hook runs.
356
+ */
357
+ export function initSessionMemory(): void {
358
+ if (getIsRemoteMode()) return
359
+ // Session memory is used for compaction, so respect auto-compact settings
360
+ const autoCompactEnabled = isAutoCompactEnabled()
361
+
362
+ // Log initialization state (ant-only to avoid noise in external logs)
363
+ if (process.env.USER_TYPE === 'ant') {
364
+ logEvent('tengu_session_memory_init', {
365
+ auto_compact_enabled: autoCompactEnabled,
366
+ })
367
+ }
368
+
369
+ if (!autoCompactEnabled) {
370
+ return
371
+ }
372
+
373
+ // Register hook unconditionally - gate check happens lazily when hook runs
374
+ registerPostSamplingHook(extractSessionMemory)
375
+ }
376
+
377
+ export type ManualExtractionResult = {
378
+ success: boolean
379
+ memoryPath?: string
380
+ error?: string
381
+ }
382
+
383
+ /**
384
+ * Manually trigger session memory extraction, bypassing threshold checks.
385
+ * Used by the /summary command.
386
+ */
387
+ export async function manuallyExtractSessionMemory(
388
+ messages: Message[],
389
+ toolUseContext: ToolUseContext,
390
+ ): Promise<ManualExtractionResult> {
391
+ if (messages.length === 0) {
392
+ return { success: false, error: 'No messages to summarize' }
393
+ }
394
+ markExtractionStarted()
395
+
396
+ try {
397
+ // Create isolated context for setup to avoid polluting parent's cache
398
+ const setupContext = createSubagentContext(toolUseContext)
399
+
400
+ // Set up file system and read current state with isolated context
401
+ const { memoryPath, currentMemory } =
402
+ await setupSessionMemoryFile(setupContext)
403
+
404
+ // Create extraction message
405
+ const userPrompt = await buildSessionMemoryUpdatePrompt(
406
+ currentMemory,
407
+ memoryPath,
408
+ )
409
+
410
+ // Get system prompt for cache-safe params
411
+ const { tools, mainLoopModel } = toolUseContext.options
412
+ const [rawSystemPrompt, userContext, systemContext] = await Promise.all([
413
+ getSystemPrompt(tools, mainLoopModel),
414
+ getUserContext(),
415
+ getSystemContext(),
416
+ ])
417
+ const systemPrompt = asSystemPrompt(rawSystemPrompt)
418
+
419
+ // Run session memory extraction using runForkedAgent
420
+ await runForkedAgent({
421
+ promptMessages: [createUserMessage({ content: userPrompt })],
422
+ cacheSafeParams: {
423
+ systemPrompt,
424
+ userContext,
425
+ systemContext,
426
+ toolUseContext: setupContext,
427
+ forkContextMessages: messages,
428
+ },
429
+ canUseTool: createMemoryFileCanUseTool(memoryPath),
430
+ querySource: 'session_memory',
431
+ forkLabel: 'session_memory_manual',
432
+ overrides: { readFileState: setupContext.readFileState },
433
+ })
434
+
435
+ // Log manual extraction event
436
+ logEvent('tengu_session_memory_manual_extraction', {})
437
+
438
+ // Record the context size at extraction for tracking minimumTokensBetweenUpdate
439
+ recordExtractionTokenCount(tokenCountWithEstimation(messages))
440
+
441
+ // Update lastSummarizedMessageId after successful completion
442
+ updateLastSummarizedMessageIdIfSafe(messages)
443
+
444
+ return { success: true, memoryPath }
445
+ } catch (error) {
446
+ return {
447
+ success: false,
448
+ error: errorMessage(error),
449
+ }
450
+ } finally {
451
+ markExtractionCompleted()
452
+ }
453
+ }
454
+
455
+ // Helper functions
456
+
457
+ /**
458
+ * Creates a canUseTool function that only allows Edit for the exact memory file.
459
+ */
460
+ export function createMemoryFileCanUseTool(memoryPath: string): CanUseToolFn {
461
+ return async (tool: Tool, input: unknown) => {
462
+ if (
463
+ tool.name === FILE_EDIT_TOOL_NAME &&
464
+ typeof input === 'object' &&
465
+ input !== null &&
466
+ 'file_path' in input
467
+ ) {
468
+ const filePath = input.file_path
469
+ if (typeof filePath === 'string' && filePath === memoryPath) {
470
+ return { behavior: 'allow' as const, updatedInput: input }
471
+ }
472
+ }
473
+ return {
474
+ behavior: 'deny' as const,
475
+ message: `only ${FILE_EDIT_TOOL_NAME} on ${memoryPath} is allowed`,
476
+ decisionReason: {
477
+ type: 'other' as const,
478
+ reason: `only ${FILE_EDIT_TOOL_NAME} on ${memoryPath} is allowed`,
479
+ },
480
+ }
481
+ }
482
+ }
483
+
484
+ /**
485
+ * Updates lastSummarizedMessageId after successful extraction.
486
+ * Only sets it if the last message doesn't have tool calls (to avoid orphaned tool_results).
487
+ */
488
+ function updateLastSummarizedMessageIdIfSafe(messages: Message[]): void {
489
+ if (!hasToolCallsInLastAssistantTurn(messages)) {
490
+ const lastMessage = messages[messages.length - 1]
491
+ if (lastMessage?.uuid) {
492
+ setLastSummarizedMessageId(lastMessage.uuid)
493
+ }
494
+ }
495
+ }
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Session Memory utility functions that can be imported without circular dependencies.
3
+ * These are separate from the main sessionMemory.ts to avoid importing runAgent.
4
+ */
5
+
6
+ import { isFsInaccessible } from '../../utils/errors.js'
7
+ import { getFsImplementation } from '../../utils/fsOperations.js'
8
+ import { getSessionMemoryPath } from '../../utils/permissions/filesystem.js'
9
+ import { sleep } from '../../utils/sleep.js'
10
+ import { logEvent } from '../analytics/index.js'
11
+
12
+ const EXTRACTION_WAIT_TIMEOUT_MS = 15000
13
+ const EXTRACTION_STALE_THRESHOLD_MS = 60000 // 1 minute
14
+
15
+ /**
16
+ * Configuration for session memory extraction thresholds
17
+ */
18
+ export type SessionMemoryConfig = {
19
+ /** Minimum context window tokens before initializing session memory.
20
+ * Uses the same token counting as autocompact (input + output + cache tokens)
21
+ * to ensure consistent behavior between the two features. */
22
+ minimumMessageTokensToInit: number
23
+ /** Minimum context window growth (in tokens) between session memory updates.
24
+ * Uses the same token counting as autocompact (tokenCountWithEstimation)
25
+ * to measure actual context growth, not cumulative API usage. */
26
+ minimumTokensBetweenUpdate: number
27
+ /** Number of tool calls between session memory updates */
28
+ toolCallsBetweenUpdates: number
29
+ }
30
+
31
+ // Default configuration values
32
+ export const DEFAULT_SESSION_MEMORY_CONFIG: SessionMemoryConfig = {
33
+ minimumMessageTokensToInit: 10000,
34
+ minimumTokensBetweenUpdate: 5000,
35
+ toolCallsBetweenUpdates: 3,
36
+ }
37
+
38
+ // Current session memory configuration
39
+ let sessionMemoryConfig: SessionMemoryConfig = {
40
+ ...DEFAULT_SESSION_MEMORY_CONFIG,
41
+ }
42
+
43
+ // Track the last summarized message ID (shared state)
44
+ let lastSummarizedMessageId: string | undefined
45
+
46
+ // Track extraction state with timestamp (set by sessionMemory.ts)
47
+ let extractionStartedAt: number | undefined
48
+
49
+ // Track context size at last memory extraction (for minimumTokensBetweenUpdate)
50
+ let tokensAtLastExtraction = 0
51
+
52
+ // Track whether session memory has been initialized (met minimumMessageTokensToInit)
53
+ let sessionMemoryInitialized = false
54
+
55
+ /**
56
+ * Get the message ID up to which the session memory is current
57
+ */
58
+ export function getLastSummarizedMessageId(): string | undefined {
59
+ return lastSummarizedMessageId
60
+ }
61
+
62
+ /**
63
+ * Set the last summarized message ID (called from sessionMemory.ts)
64
+ */
65
+ export function setLastSummarizedMessageId(
66
+ messageId: string | undefined,
67
+ ): void {
68
+ lastSummarizedMessageId = messageId
69
+ }
70
+
71
+ /**
72
+ * Mark extraction as started (called from sessionMemory.ts)
73
+ */
74
+ export function markExtractionStarted(): void {
75
+ extractionStartedAt = Date.now()
76
+ }
77
+
78
+ /**
79
+ * Mark extraction as completed (called from sessionMemory.ts)
80
+ */
81
+ export function markExtractionCompleted(): void {
82
+ extractionStartedAt = undefined
83
+ }
84
+
85
+ /**
86
+ * Wait for any in-progress session memory extraction to complete (with 15s timeout)
87
+ * Returns immediately if no extraction is in progress or if extraction is stale (>1min old).
88
+ */
89
+ export async function waitForSessionMemoryExtraction(): Promise<void> {
90
+ const startTime = Date.now()
91
+ while (extractionStartedAt) {
92
+ const extractionAge = Date.now() - extractionStartedAt
93
+ if (extractionAge > EXTRACTION_STALE_THRESHOLD_MS) {
94
+ // Extraction is stale, don't wait
95
+ return
96
+ }
97
+
98
+ if (Date.now() - startTime > EXTRACTION_WAIT_TIMEOUT_MS) {
99
+ // Timeout - continue anyway
100
+ return
101
+ }
102
+
103
+ await sleep(1000)
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Get the current session memory content
109
+ */
110
+ export async function getSessionMemoryContent(): Promise<string | null> {
111
+ const fs = getFsImplementation()
112
+ const memoryPath = getSessionMemoryPath()
113
+
114
+ try {
115
+ const content = await fs.readFile(memoryPath, { encoding: 'utf-8' })
116
+
117
+ logEvent('tengu_session_memory_loaded', {
118
+ content_length: content.length,
119
+ })
120
+
121
+ return content
122
+ } catch (e: unknown) {
123
+ if (isFsInaccessible(e)) return null
124
+ throw e
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Set the session memory configuration
130
+ */
131
+ export function setSessionMemoryConfig(
132
+ config: Partial<SessionMemoryConfig>,
133
+ ): void {
134
+ sessionMemoryConfig = {
135
+ ...sessionMemoryConfig,
136
+ ...config,
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Get the current session memory configuration
142
+ */
143
+ export function getSessionMemoryConfig(): SessionMemoryConfig {
144
+ return { ...sessionMemoryConfig }
145
+ }
146
+
147
+ /**
148
+ * Record the context size at the time of extraction.
149
+ * Used to measure context growth for minimumTokensBetweenUpdate threshold.
150
+ */
151
+ export function recordExtractionTokenCount(currentTokenCount: number): void {
152
+ tokensAtLastExtraction = currentTokenCount
153
+ }
154
+
155
+ /**
156
+ * Check if session memory has been initialized (met minimumTokensToInit threshold)
157
+ */
158
+ export function isSessionMemoryInitialized(): boolean {
159
+ return sessionMemoryInitialized
160
+ }
161
+
162
+ /**
163
+ * Mark session memory as initialized
164
+ */
165
+ export function markSessionMemoryInitialized(): void {
166
+ sessionMemoryInitialized = true
167
+ }
168
+
169
+ /**
170
+ * Check if we've met the threshold to initialize session memory.
171
+ * Uses total context window tokens (same as autocompact) for consistent behavior.
172
+ */
173
+ export function hasMetInitializationThreshold(
174
+ currentTokenCount: number,
175
+ ): boolean {
176
+ return currentTokenCount >= sessionMemoryConfig.minimumMessageTokensToInit
177
+ }
178
+
179
+ /**
180
+ * Check if we've met the threshold for the next update.
181
+ * Measures actual context window growth since last extraction
182
+ * (same metric as autocompact and initialization threshold).
183
+ */
184
+ export function hasMetUpdateThreshold(currentTokenCount: number): boolean {
185
+ const tokensSinceLastExtraction = currentTokenCount - tokensAtLastExtraction
186
+ return (
187
+ tokensSinceLastExtraction >= sessionMemoryConfig.minimumTokensBetweenUpdate
188
+ )
189
+ }
190
+
191
+ /**
192
+ * Get the configured number of tool calls between updates
193
+ */
194
+ export function getToolCallsBetweenUpdates(): number {
195
+ return sessionMemoryConfig.toolCallsBetweenUpdates
196
+ }
197
+
198
+ /**
199
+ * Reset session memory state (useful for testing)
200
+ */
201
+ export function resetSessionMemoryState(): void {
202
+ sessionMemoryConfig = { ...DEFAULT_SESSION_MEMORY_CONFIG }
203
+ tokensAtLastExtraction = 0
204
+ sessionMemoryInitialized = false
205
+ lastSummarizedMessageId = undefined
206
+ extractionStartedAt = undefined
207
+ }