charness 0.0.0-stage → 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 (988) hide show
  1. package/.env.example +88 -0
  2. package/DEVELOPMENT.md +110 -0
  3. package/LICENSE +21 -0
  4. package/MIGRATION_1_TO_2.md +24 -0
  5. package/README.md +1024 -2
  6. package/dist/accessControl.d.ts +71 -0
  7. package/dist/accessControl.d.ts.map +1 -0
  8. package/dist/accessControl.js +108 -0
  9. package/dist/accessControl.js.map +1 -0
  10. package/dist/adapters/adapterEventRouting.d.ts +51 -0
  11. package/dist/adapters/adapterEventRouting.d.ts.map +1 -0
  12. package/dist/adapters/adapterEventRouting.js +74 -0
  13. package/dist/adapters/adapterEventRouting.js.map +1 -0
  14. package/dist/adapters/adapterNames.d.ts +19 -0
  15. package/dist/adapters/adapterNames.d.ts.map +1 -0
  16. package/dist/adapters/adapterNames.js +25 -0
  17. package/dist/adapters/adapterNames.js.map +1 -0
  18. package/dist/adapters/claudeCliAdapter.d.ts +1336 -0
  19. package/dist/adapters/claudeCliAdapter.d.ts.map +1 -0
  20. package/dist/adapters/claudeCliAdapter.js +4204 -0
  21. package/dist/adapters/claudeCliAdapter.js.map +1 -0
  22. package/dist/adapters/claudeJsonStreamAdapter.d.ts +548 -0
  23. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -0
  24. package/dist/adapters/claudeJsonStreamAdapter.js +1810 -0
  25. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -0
  26. package/dist/adapters/claudePlatformFlags.d.ts +35 -0
  27. package/dist/adapters/claudePlatformFlags.d.ts.map +1 -0
  28. package/dist/adapters/claudePlatformFlags.js +46 -0
  29. package/dist/adapters/claudePlatformFlags.js.map +1 -0
  30. package/dist/adapters/createAdapter.d.ts +252 -0
  31. package/dist/adapters/createAdapter.d.ts.map +1 -0
  32. package/dist/adapters/createAdapter.js +475 -0
  33. package/dist/adapters/createAdapter.js.map +1 -0
  34. package/dist/adapters/openCodeAdapter.d.ts +1446 -0
  35. package/dist/adapters/openCodeAdapter.d.ts.map +1 -0
  36. package/dist/adapters/openCodeAdapter.js +4540 -0
  37. package/dist/adapters/openCodeAdapter.js.map +1 -0
  38. package/dist/adapters/sessionLaunchDefaults.d.ts +28 -0
  39. package/dist/adapters/sessionLaunchDefaults.d.ts.map +1 -0
  40. package/dist/adapters/sessionLaunchDefaults.js +15 -0
  41. package/dist/adapters/sessionLaunchDefaults.js.map +1 -0
  42. package/dist/adapters/terminalAdapter.d.ts +68 -0
  43. package/dist/adapters/terminalAdapter.d.ts.map +1 -0
  44. package/dist/adapters/terminalAdapter.js +371 -0
  45. package/dist/adapters/terminalAdapter.js.map +1 -0
  46. package/dist/agentLogin/agentLogin.d.ts +31 -0
  47. package/dist/agentLogin/agentLogin.d.ts.map +1 -0
  48. package/dist/agentLogin/agentLogin.js +493 -0
  49. package/dist/agentLogin/agentLogin.js.map +1 -0
  50. package/dist/agentTrigger.d.ts +28 -0
  51. package/dist/agentTrigger.d.ts.map +1 -0
  52. package/dist/agentTrigger.js +53 -0
  53. package/dist/agentTrigger.js.map +1 -0
  54. package/dist/apiErrorRetry.d.ts +209 -0
  55. package/dist/apiErrorRetry.d.ts.map +1 -0
  56. package/dist/apiErrorRetry.js +351 -0
  57. package/dist/apiErrorRetry.js.map +1 -0
  58. package/dist/apiRetryKick.d.ts +148 -0
  59. package/dist/apiRetryKick.d.ts.map +1 -0
  60. package/dist/apiRetryKick.js +158 -0
  61. package/dist/apiRetryKick.js.map +1 -0
  62. package/dist/bootClassifier.d.ts +46 -0
  63. package/dist/bootClassifier.d.ts.map +1 -0
  64. package/dist/bootClassifier.js +43 -0
  65. package/dist/bootClassifier.js.map +1 -0
  66. package/dist/bot.d.ts +207 -0
  67. package/dist/bot.d.ts.map +1 -0
  68. package/dist/bot.js +10611 -0
  69. package/dist/bot.js.map +1 -0
  70. package/dist/botFileStorage.d.ts +60 -0
  71. package/dist/botFileStorage.d.ts.map +1 -0
  72. package/dist/botFileStorage.js +205 -0
  73. package/dist/botFileStorage.js.map +1 -0
  74. package/dist/cli/applyDnsFix.d.ts +7 -0
  75. package/dist/cli/applyDnsFix.d.ts.map +1 -0
  76. package/dist/cli/applyDnsFix.js +46 -0
  77. package/dist/cli/applyDnsFix.js.map +1 -0
  78. package/dist/cli/bot.d.ts +27 -0
  79. package/dist/cli/bot.d.ts.map +1 -0
  80. package/dist/cli/bot.js +98 -0
  81. package/dist/cli/bot.js.map +1 -0
  82. package/dist/cli/botEntry.d.ts +3 -0
  83. package/dist/cli/botEntry.d.ts.map +1 -0
  84. package/dist/cli/botEntry.js +11 -0
  85. package/dist/cli/botEntry.js.map +1 -0
  86. package/dist/cli/connectorGuards.d.ts +31 -0
  87. package/dist/cli/connectorGuards.d.ts.map +1 -0
  88. package/dist/cli/connectorGuards.js +159 -0
  89. package/dist/cli/connectorGuards.js.map +1 -0
  90. package/dist/cli/envLoader.d.ts +34 -0
  91. package/dist/cli/envLoader.d.ts.map +1 -0
  92. package/dist/cli/envLoader.js +132 -0
  93. package/dist/cli/envLoader.js.map +1 -0
  94. package/dist/cli/hot.d.ts +82 -0
  95. package/dist/cli/hot.d.ts.map +1 -0
  96. package/dist/cli/hot.js +323 -0
  97. package/dist/cli/hot.js.map +1 -0
  98. package/dist/cli.d.ts +3 -0
  99. package/dist/cli.d.ts.map +1 -0
  100. package/dist/cli.js +130 -0
  101. package/dist/cli.js.map +1 -0
  102. package/dist/connectors/jira/adf.d.ts +72 -0
  103. package/dist/connectors/jira/adf.d.ts.map +1 -0
  104. package/dist/connectors/jira/adf.js +407 -0
  105. package/dist/connectors/jira/adf.js.map +1 -0
  106. package/dist/connectors/jira/agentBinaries.d.ts +14 -0
  107. package/dist/connectors/jira/agentBinaries.d.ts.map +1 -0
  108. package/dist/connectors/jira/agentBinaries.js +75 -0
  109. package/dist/connectors/jira/agentBinaries.js.map +1 -0
  110. package/dist/connectors/jira/answerSink.d.ts +52 -0
  111. package/dist/connectors/jira/answerSink.d.ts.map +1 -0
  112. package/dist/connectors/jira/answerSink.js +220 -0
  113. package/dist/connectors/jira/answerSink.js.map +1 -0
  114. package/dist/connectors/jira/attachmentDownload.d.ts +41 -0
  115. package/dist/connectors/jira/attachmentDownload.d.ts.map +1 -0
  116. package/dist/connectors/jira/attachmentDownload.js +92 -0
  117. package/dist/connectors/jira/attachmentDownload.js.map +1 -0
  118. package/dist/connectors/jira/attachmentTool.d.ts +43 -0
  119. package/dist/connectors/jira/attachmentTool.d.ts.map +1 -0
  120. package/dist/connectors/jira/attachmentTool.js +150 -0
  121. package/dist/connectors/jira/attachmentTool.js.map +1 -0
  122. package/dist/connectors/jira/client.d.ts +490 -0
  123. package/dist/connectors/jira/client.d.ts.map +1 -0
  124. package/dist/connectors/jira/client.js +453 -0
  125. package/dist/connectors/jira/client.js.map +1 -0
  126. package/dist/connectors/jira/config.d.ts +117 -0
  127. package/dist/connectors/jira/config.d.ts.map +1 -0
  128. package/dist/connectors/jira/config.js +350 -0
  129. package/dist/connectors/jira/config.js.map +1 -0
  130. package/dist/connectors/jira/configFile.d.ts +10 -0
  131. package/dist/connectors/jira/configFile.d.ts.map +1 -0
  132. package/dist/connectors/jira/configFile.js +50 -0
  133. package/dist/connectors/jira/configFile.js.map +1 -0
  134. package/dist/connectors/jira/connector.d.ts +68 -0
  135. package/dist/connectors/jira/connector.d.ts.map +1 -0
  136. package/dist/connectors/jira/connector.js +257 -0
  137. package/dist/connectors/jira/connector.js.map +1 -0
  138. package/dist/connectors/jira/contextLedger.d.ts +59 -0
  139. package/dist/connectors/jira/contextLedger.d.ts.map +1 -0
  140. package/dist/connectors/jira/contextLedger.js +194 -0
  141. package/dist/connectors/jira/contextLedger.js.map +1 -0
  142. package/dist/connectors/jira/contextPreamble.d.ts +18 -0
  143. package/dist/connectors/jira/contextPreamble.d.ts.map +1 -0
  144. package/dist/connectors/jira/contextPreamble.js +31 -0
  145. package/dist/connectors/jira/contextPreamble.js.map +1 -0
  146. package/dist/connectors/jira/inbound.d.ts +132 -0
  147. package/dist/connectors/jira/inbound.d.ts.map +1 -0
  148. package/dist/connectors/jira/inbound.js +316 -0
  149. package/dist/connectors/jira/inbound.js.map +1 -0
  150. package/dist/connectors/jira/issueBlocks.d.ts +51 -0
  151. package/dist/connectors/jira/issueBlocks.d.ts.map +1 -0
  152. package/dist/connectors/jira/issueBlocks.js +182 -0
  153. package/dist/connectors/jira/issueBlocks.js.map +1 -0
  154. package/dist/connectors/jira/issueContext.d.ts +25 -0
  155. package/dist/connectors/jira/issueContext.d.ts.map +1 -0
  156. package/dist/connectors/jira/issueContext.js +53 -0
  157. package/dist/connectors/jira/issueContext.js.map +1 -0
  158. package/dist/connectors/jira/issueDelta.d.ts +35 -0
  159. package/dist/connectors/jira/issueDelta.d.ts.map +1 -0
  160. package/dist/connectors/jira/issueDelta.js +50 -0
  161. package/dist/connectors/jira/issueDelta.js.map +1 -0
  162. package/dist/connectors/jira/mediaPlaceholders.d.ts +20 -0
  163. package/dist/connectors/jira/mediaPlaceholders.d.ts.map +1 -0
  164. package/dist/connectors/jira/mediaPlaceholders.js +92 -0
  165. package/dist/connectors/jira/mediaPlaceholders.js.map +1 -0
  166. package/dist/connectors/jira/outbound.d.ts +6 -0
  167. package/dist/connectors/jira/outbound.d.ts.map +1 -0
  168. package/dist/connectors/jira/outbound.js +38 -0
  169. package/dist/connectors/jira/outbound.js.map +1 -0
  170. package/dist/connectors/jira/prompt.d.ts +37 -0
  171. package/dist/connectors/jira/prompt.d.ts.map +1 -0
  172. package/dist/connectors/jira/prompt.js +99 -0
  173. package/dist/connectors/jira/prompt.js.map +1 -0
  174. package/dist/connectors/jira/promptSpill.d.ts +50 -0
  175. package/dist/connectors/jira/promptSpill.d.ts.map +1 -0
  176. package/dist/connectors/jira/promptSpill.js +157 -0
  177. package/dist/connectors/jira/promptSpill.js.map +1 -0
  178. package/dist/connectors/jira/promptText.d.ts +7 -0
  179. package/dist/connectors/jira/promptText.d.ts.map +1 -0
  180. package/dist/connectors/jira/promptText.js +26 -0
  181. package/dist/connectors/jira/promptText.js.map +1 -0
  182. package/dist/connectors/jira/sessionKeyCodec.d.ts +16 -0
  183. package/dist/connectors/jira/sessionKeyCodec.d.ts.map +1 -0
  184. package/dist/connectors/jira/sessionKeyCodec.js +101 -0
  185. package/dist/connectors/jira/sessionKeyCodec.js.map +1 -0
  186. package/dist/connectors/jira/trigger.d.ts +50 -0
  187. package/dist/connectors/jira/trigger.d.ts.map +1 -0
  188. package/dist/connectors/jira/trigger.js +93 -0
  189. package/dist/connectors/jira/trigger.js.map +1 -0
  190. package/dist/connectors/jira/triggerLog.d.ts +51 -0
  191. package/dist/connectors/jira/triggerLog.d.ts.map +1 -0
  192. package/dist/connectors/jira/triggerLog.js +78 -0
  193. package/dist/connectors/jira/triggerLog.js.map +1 -0
  194. package/dist/connectors/jira/unconfirmedPosts.d.ts +58 -0
  195. package/dist/connectors/jira/unconfirmedPosts.d.ts.map +1 -0
  196. package/dist/connectors/jira/unconfirmedPosts.js +105 -0
  197. package/dist/connectors/jira/unconfirmedPosts.js.map +1 -0
  198. package/dist/connectors/telegram/answerSink.d.ts +46 -0
  199. package/dist/connectors/telegram/answerSink.d.ts.map +1 -0
  200. package/dist/connectors/telegram/answerSink.js +71 -0
  201. package/dist/connectors/telegram/answerSink.js.map +1 -0
  202. package/dist/connectors/telegram/commands/autoContinueLimits.d.ts +31 -0
  203. package/dist/connectors/telegram/commands/autoContinueLimits.d.ts.map +1 -0
  204. package/dist/connectors/telegram/commands/autoContinueLimits.js +142 -0
  205. package/dist/connectors/telegram/commands/autoContinueLimits.js.map +1 -0
  206. package/dist/connectors/telegram/commands/botCore.d.ts +46 -0
  207. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -0
  208. package/dist/connectors/telegram/commands/botCore.js +3 -0
  209. package/dist/connectors/telegram/commands/botCore.js.map +1 -0
  210. package/dist/connectors/telegram/commands/callbackMessage.d.ts +12 -0
  211. package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -0
  212. package/dist/connectors/telegram/commands/callbackMessage.js +13 -0
  213. package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -0
  214. package/dist/connectors/telegram/commands/compaction.d.ts +47 -0
  215. package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -0
  216. package/dist/connectors/telegram/commands/compaction.js +868 -0
  217. package/dist/connectors/telegram/commands/compaction.js.map +1 -0
  218. package/dist/connectors/telegram/commands/displayModes.d.ts +13 -0
  219. package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -0
  220. package/dist/connectors/telegram/commands/displayModes.js +335 -0
  221. package/dist/connectors/telegram/commands/displayModes.js.map +1 -0
  222. package/dist/connectors/telegram/commands/modelProviders.d.ts +95 -0
  223. package/dist/connectors/telegram/commands/modelProviders.d.ts.map +1 -0
  224. package/dist/connectors/telegram/commands/modelProviders.js +841 -0
  225. package/dist/connectors/telegram/commands/modelProviders.js.map +1 -0
  226. package/dist/connectors/telegram/commands/reminders.d.ts +54 -0
  227. package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -0
  228. package/dist/connectors/telegram/commands/reminders.js +624 -0
  229. package/dist/connectors/telegram/commands/reminders.js.map +1 -0
  230. package/dist/connectors/telegram/fileIntake.d.ts +166 -0
  231. package/dist/connectors/telegram/fileIntake.d.ts.map +1 -0
  232. package/dist/connectors/telegram/fileIntake.js +304 -0
  233. package/dist/connectors/telegram/fileIntake.js.map +1 -0
  234. package/dist/connectors/telegram/fileSendGateway.d.ts +57 -0
  235. package/dist/connectors/telegram/fileSendGateway.d.ts.map +1 -0
  236. package/dist/connectors/telegram/fileSendGateway.js +221 -0
  237. package/dist/connectors/telegram/fileSendGateway.js.map +1 -0
  238. package/dist/connectors/telegram/foreignKeyFallbacks.d.ts +52 -0
  239. package/dist/connectors/telegram/foreignKeyFallbacks.d.ts.map +1 -0
  240. package/dist/connectors/telegram/foreignKeyFallbacks.js +71 -0
  241. package/dist/connectors/telegram/foreignKeyFallbacks.js.map +1 -0
  242. package/dist/connectors/telegram/inbound.d.ts +131 -0
  243. package/dist/connectors/telegram/inbound.d.ts.map +1 -0
  244. package/dist/connectors/telegram/inbound.js +278 -0
  245. package/dist/connectors/telegram/inbound.js.map +1 -0
  246. package/dist/connectors/telegram/languagePicker.d.ts +32 -0
  247. package/dist/connectors/telegram/languagePicker.d.ts.map +1 -0
  248. package/dist/connectors/telegram/languagePicker.js +55 -0
  249. package/dist/connectors/telegram/languagePicker.js.map +1 -0
  250. package/dist/connectors/telegram/messageSplit.d.ts +62 -0
  251. package/dist/connectors/telegram/messageSplit.d.ts.map +1 -0
  252. package/dist/connectors/telegram/messageSplit.js +119 -0
  253. package/dist/connectors/telegram/messageSplit.js.map +1 -0
  254. package/dist/connectors/telegram/outbound.d.ts +62 -0
  255. package/dist/connectors/telegram/outbound.d.ts.map +1 -0
  256. package/dist/connectors/telegram/outbound.js +116 -0
  257. package/dist/connectors/telegram/outbound.js.map +1 -0
  258. package/dist/connectors/telegram/output/createOutputTransport.d.ts +34 -0
  259. package/dist/connectors/telegram/output/createOutputTransport.d.ts.map +1 -0
  260. package/dist/connectors/telegram/output/createOutputTransport.js +77 -0
  261. package/dist/connectors/telegram/output/createOutputTransport.js.map +1 -0
  262. package/dist/connectors/telegram/output/dmOutputTransport.d.ts +47 -0
  263. package/dist/connectors/telegram/output/dmOutputTransport.d.ts.map +1 -0
  264. package/dist/connectors/telegram/output/dmOutputTransport.js +412 -0
  265. package/dist/connectors/telegram/output/dmOutputTransport.js.map +1 -0
  266. package/dist/connectors/telegram/outputBacklogGlue.d.ts +38 -0
  267. package/dist/connectors/telegram/outputBacklogGlue.d.ts.map +1 -0
  268. package/dist/connectors/telegram/outputBacklogGlue.js +49 -0
  269. package/dist/connectors/telegram/outputBacklogGlue.js.map +1 -0
  270. package/dist/connectors/telegram/outputFlushPlan.d.ts +93 -0
  271. package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -0
  272. package/dist/connectors/telegram/outputFlushPlan.js +120 -0
  273. package/dist/connectors/telegram/outputFlushPlan.js.map +1 -0
  274. package/dist/connectors/telegram/questionKeyboards.d.ts +30 -0
  275. package/dist/connectors/telegram/questionKeyboards.d.ts.map +1 -0
  276. package/dist/connectors/telegram/questionKeyboards.js +37 -0
  277. package/dist/connectors/telegram/questionKeyboards.js.map +1 -0
  278. package/dist/connectors/telegram/renderAgentHtml.d.ts +27 -0
  279. package/dist/connectors/telegram/renderAgentHtml.d.ts.map +1 -0
  280. package/dist/connectors/telegram/renderAgentHtml.js +97 -0
  281. package/dist/connectors/telegram/renderAgentHtml.js.map +1 -0
  282. package/dist/connectors/telegram/sessionKeyCodec.d.ts +28 -0
  283. package/dist/connectors/telegram/sessionKeyCodec.d.ts.map +1 -0
  284. package/dist/connectors/telegram/sessionKeyCodec.js +107 -0
  285. package/dist/connectors/telegram/sessionKeyCodec.js.map +1 -0
  286. package/dist/connectors/telegram/telegramCallGuard.d.ts +19 -0
  287. package/dist/connectors/telegram/telegramCallGuard.d.ts.map +1 -0
  288. package/dist/connectors/telegram/telegramCallGuard.js +35 -0
  289. package/dist/connectors/telegram/telegramCallGuard.js.map +1 -0
  290. package/dist/connectors/telegram/timezonePicker.d.ts +85 -0
  291. package/dist/connectors/telegram/timezonePicker.d.ts.map +1 -0
  292. package/dist/connectors/telegram/timezonePicker.js +142 -0
  293. package/dist/connectors/telegram/timezonePicker.js.map +1 -0
  294. package/dist/connectors/telegram/updateDispatcher.d.ts +85 -0
  295. package/dist/connectors/telegram/updateDispatcher.d.ts.map +1 -0
  296. package/dist/connectors/telegram/updateDispatcher.js +159 -0
  297. package/dist/connectors/telegram/updateDispatcher.js.map +1 -0
  298. package/dist/connectors/test/connector.d.ts +52 -0
  299. package/dist/connectors/test/connector.d.ts.map +1 -0
  300. package/dist/connectors/test/connector.js +143 -0
  301. package/dist/connectors/test/connector.js.map +1 -0
  302. package/dist/connectors/test/sessionKeyCodec.d.ts +25 -0
  303. package/dist/connectors/test/sessionKeyCodec.d.ts.map +1 -0
  304. package/dist/connectors/test/sessionKeyCodec.js +50 -0
  305. package/dist/connectors/test/sessionKeyCodec.js.map +1 -0
  306. package/dist/diagLog.d.ts +6 -0
  307. package/dist/diagLog.d.ts.map +1 -0
  308. package/dist/diagLog.js +58 -0
  309. package/dist/diagLog.js.map +1 -0
  310. package/dist/effortLevels.d.ts +68 -0
  311. package/dist/effortLevels.d.ts.map +1 -0
  312. package/dist/effortLevels.js +114 -0
  313. package/dist/effortLevels.js.map +1 -0
  314. package/dist/folderName.d.ts +42 -0
  315. package/dist/folderName.d.ts.map +1 -0
  316. package/dist/folderName.js +51 -0
  317. package/dist/folderName.js.map +1 -0
  318. package/dist/i18n/de.d.ts +2 -0
  319. package/dist/i18n/de.d.ts.map +1 -0
  320. package/dist/i18n/de.js +537 -0
  321. package/dist/i18n/de.js.map +1 -0
  322. package/dist/i18n/en.d.ts +7 -0
  323. package/dist/i18n/en.d.ts.map +1 -0
  324. package/dist/i18n/en.js +566 -0
  325. package/dist/i18n/en.js.map +1 -0
  326. package/dist/i18n/es.d.ts +2 -0
  327. package/dist/i18n/es.d.ts.map +1 -0
  328. package/dist/i18n/es.js +537 -0
  329. package/dist/i18n/es.js.map +1 -0
  330. package/dist/i18n/fr.d.ts +2 -0
  331. package/dist/i18n/fr.d.ts.map +1 -0
  332. package/dist/i18n/fr.js +537 -0
  333. package/dist/i18n/fr.js.map +1 -0
  334. package/dist/i18n/hi.d.ts +2 -0
  335. package/dist/i18n/hi.d.ts.map +1 -0
  336. package/dist/i18n/hi.js +537 -0
  337. package/dist/i18n/hi.js.map +1 -0
  338. package/dist/i18n/ja.d.ts +2 -0
  339. package/dist/i18n/ja.d.ts.map +1 -0
  340. package/dist/i18n/ja.js +537 -0
  341. package/dist/i18n/ja.js.map +1 -0
  342. package/dist/i18n/ka.d.ts +2 -0
  343. package/dist/i18n/ka.d.ts.map +1 -0
  344. package/dist/i18n/ka.js +537 -0
  345. package/dist/i18n/ka.js.map +1 -0
  346. package/dist/i18n/pt.d.ts +2 -0
  347. package/dist/i18n/pt.d.ts.map +1 -0
  348. package/dist/i18n/pt.js +537 -0
  349. package/dist/i18n/pt.js.map +1 -0
  350. package/dist/i18n/ru.d.ts +6 -0
  351. package/dist/i18n/ru.d.ts.map +1 -0
  352. package/dist/i18n/ru.js +540 -0
  353. package/dist/i18n/ru.js.map +1 -0
  354. package/dist/i18n/uk.d.ts +8 -0
  355. package/dist/i18n/uk.d.ts.map +1 -0
  356. package/dist/i18n/uk.js +542 -0
  357. package/dist/i18n/uk.js.map +1 -0
  358. package/dist/i18n/uz.d.ts +2 -0
  359. package/dist/i18n/uz.d.ts.map +1 -0
  360. package/dist/i18n/uz.js +537 -0
  361. package/dist/i18n/uz.js.map +1 -0
  362. package/dist/i18n/zh.d.ts +2 -0
  363. package/dist/i18n/zh.d.ts.map +1 -0
  364. package/dist/i18n/zh.js +537 -0
  365. package/dist/i18n/zh.js.map +1 -0
  366. package/dist/i18n.d.ts +115 -0
  367. package/dist/i18n.d.ts.map +1 -0
  368. package/dist/i18n.js +233 -0
  369. package/dist/i18n.js.map +1 -0
  370. package/dist/index.d.ts +3 -0
  371. package/dist/index.d.ts.map +1 -0
  372. package/dist/index.js +10 -0
  373. package/dist/index.js.map +1 -0
  374. package/dist/installManager.d.ts +99 -0
  375. package/dist/installManager.d.ts.map +1 -0
  376. package/dist/installManager.js +943 -0
  377. package/dist/installManager.js.map +1 -0
  378. package/dist/instanceLock.d.ts +161 -0
  379. package/dist/instanceLock.d.ts.map +1 -0
  380. package/dist/instanceLock.js +388 -0
  381. package/dist/instanceLock.js.map +1 -0
  382. package/dist/mcpConfig.d.ts +76 -0
  383. package/dist/mcpConfig.d.ts.map +1 -0
  384. package/dist/mcpConfig.js +270 -0
  385. package/dist/mcpConfig.js.map +1 -0
  386. package/dist/openCodeOpenQuestion.d.ts +44 -0
  387. package/dist/openCodeOpenQuestion.d.ts.map +1 -0
  388. package/dist/openCodeOpenQuestion.js +64 -0
  389. package/dist/openCodeOpenQuestion.js.map +1 -0
  390. package/dist/openCodeQuestionFlow.d.ts +105 -0
  391. package/dist/openCodeQuestionFlow.d.ts.map +1 -0
  392. package/dist/openCodeQuestionFlow.js +143 -0
  393. package/dist/openCodeQuestionFlow.js.map +1 -0
  394. package/dist/openCodeSessionRouting.d.ts +133 -0
  395. package/dist/openCodeSessionRouting.d.ts.map +1 -0
  396. package/dist/openCodeSessionRouting.js +253 -0
  397. package/dist/openCodeSessionRouting.js.map +1 -0
  398. package/dist/openCodeSessionTitle.d.ts +50 -0
  399. package/dist/openCodeSessionTitle.d.ts.map +1 -0
  400. package/dist/openCodeSessionTitle.js +84 -0
  401. package/dist/openCodeSessionTitle.js.map +1 -0
  402. package/dist/outputTrace.d.ts +108 -0
  403. package/dist/outputTrace.d.ts.map +1 -0
  404. package/dist/outputTrace.js +430 -0
  405. package/dist/outputTrace.js.map +1 -0
  406. package/dist/pendingQuestionRepost.d.ts +47 -0
  407. package/dist/pendingQuestionRepost.d.ts.map +1 -0
  408. package/dist/pendingQuestionRepost.js +29 -0
  409. package/dist/pendingQuestionRepost.js.map +1 -0
  410. package/dist/pinnedStatus.d.ts +52 -0
  411. package/dist/pinnedStatus.d.ts.map +1 -0
  412. package/dist/pinnedStatus.js +36 -0
  413. package/dist/pinnedStatus.js.map +1 -0
  414. package/dist/platform/answerSink.d.ts +93 -0
  415. package/dist/platform/answerSink.d.ts.map +1 -0
  416. package/dist/platform/answerSink.js +31 -0
  417. package/dist/platform/answerSink.js.map +1 -0
  418. package/dist/platform/capabilityFallback.d.ts +39 -0
  419. package/dist/platform/capabilityFallback.d.ts.map +1 -0
  420. package/dist/platform/capabilityFallback.js +55 -0
  421. package/dist/platform/capabilityFallback.js.map +1 -0
  422. package/dist/platform/commandRouter.d.ts +51 -0
  423. package/dist/platform/commandRouter.d.ts.map +1 -0
  424. package/dist/platform/commandRouter.js +53 -0
  425. package/dist/platform/commandRouter.js.map +1 -0
  426. package/dist/platform/connectorSet.d.ts +39 -0
  427. package/dist/platform/connectorSet.d.ts.map +1 -0
  428. package/dist/platform/connectorSet.js +55 -0
  429. package/dist/platform/connectorSet.js.map +1 -0
  430. package/dist/platform/inbound.d.ts +147 -0
  431. package/dist/platform/inbound.d.ts.map +1 -0
  432. package/dist/platform/inbound.js +18 -0
  433. package/dist/platform/inbound.js.map +1 -0
  434. package/dist/platform/outbound.d.ts +225 -0
  435. package/dist/platform/outbound.d.ts.map +1 -0
  436. package/dist/platform/outbound.js +30 -0
  437. package/dist/platform/outbound.js.map +1 -0
  438. package/dist/platform/unservedStateGuard.d.ts +27 -0
  439. package/dist/platform/unservedStateGuard.d.ts.map +1 -0
  440. package/dist/platform/unservedStateGuard.js +42 -0
  441. package/dist/platform/unservedStateGuard.js.map +1 -0
  442. package/dist/postToSession.d.ts +94 -0
  443. package/dist/postToSession.d.ts.map +1 -0
  444. package/dist/postToSession.js +56 -0
  445. package/dist/postToSession.js.map +1 -0
  446. package/dist/progressLine.d.ts +180 -0
  447. package/dist/progressLine.d.ts.map +1 -0
  448. package/dist/progressLine.js +293 -0
  449. package/dist/progressLine.js.map +1 -0
  450. package/dist/rateLimiter.d.ts +246 -0
  451. package/dist/rateLimiter.d.ts.map +1 -0
  452. package/dist/rateLimiter.js +555 -0
  453. package/dist/rateLimiter.js.map +1 -0
  454. package/dist/requests/answerRequest.d.ts +57 -0
  455. package/dist/requests/answerRequest.d.ts.map +1 -0
  456. package/dist/requests/answerRequest.js +96 -0
  457. package/dist/requests/answerRequest.js.map +1 -0
  458. package/dist/requests/answerTail.d.ts +83 -0
  459. package/dist/requests/answerTail.d.ts.map +1 -0
  460. package/dist/requests/answerTail.js +102 -0
  461. package/dist/requests/answerTail.js.map +1 -0
  462. package/dist/requests/limitWaitAnswer.d.ts +87 -0
  463. package/dist/requests/limitWaitAnswer.d.ts.map +1 -0
  464. package/dist/requests/limitWaitAnswer.js +83 -0
  465. package/dist/requests/limitWaitAnswer.js.map +1 -0
  466. package/dist/requests/requestGroup.d.ts +44 -0
  467. package/dist/requests/requestGroup.d.ts.map +1 -0
  468. package/dist/requests/requestGroup.js +63 -0
  469. package/dist/requests/requestGroup.js.map +1 -0
  470. package/dist/requests/requestHeader.d.ts +70 -0
  471. package/dist/requests/requestHeader.d.ts.map +1 -0
  472. package/dist/requests/requestHeader.js +83 -0
  473. package/dist/requests/requestHeader.js.map +1 -0
  474. package/dist/requests/requestLedger.d.ts +217 -0
  475. package/dist/requests/requestLedger.d.ts.map +1 -0
  476. package/dist/requests/requestLedger.js +468 -0
  477. package/dist/requests/requestLedger.js.map +1 -0
  478. package/dist/requests/sessionTurnProbe.d.ts +52 -0
  479. package/dist/requests/sessionTurnProbe.d.ts.map +1 -0
  480. package/dist/requests/sessionTurnProbe.js +29 -0
  481. package/dist/requests/sessionTurnProbe.js.map +1 -0
  482. package/dist/requests/types.d.ts +181 -0
  483. package/dist/requests/types.d.ts.map +1 -0
  484. package/dist/requests/types.js +9 -0
  485. package/dist/requests/types.js.map +1 -0
  486. package/dist/requests/wakeUpEngine.d.ts +160 -0
  487. package/dist/requests/wakeUpEngine.d.ts.map +1 -0
  488. package/dist/requests/wakeUpEngine.js +399 -0
  489. package/dist/requests/wakeUpEngine.js.map +1 -0
  490. package/dist/requests/wakeUpRules.d.ts +151 -0
  491. package/dist/requests/wakeUpRules.d.ts.map +1 -0
  492. package/dist/requests/wakeUpRules.js +167 -0
  493. package/dist/requests/wakeUpRules.js.map +1 -0
  494. package/dist/resumeContext.d.ts +87 -0
  495. package/dist/resumeContext.d.ts.map +1 -0
  496. package/dist/resumeContext.js +114 -0
  497. package/dist/resumeContext.js.map +1 -0
  498. package/dist/scheduler/checkRun.d.ts +95 -0
  499. package/dist/scheduler/checkRun.d.ts.map +1 -0
  500. package/dist/scheduler/checkRun.js +172 -0
  501. package/dist/scheduler/checkRun.js.map +1 -0
  502. package/dist/scheduler/delivery.d.ts +99 -0
  503. package/dist/scheduler/delivery.d.ts.map +1 -0
  504. package/dist/scheduler/delivery.js +212 -0
  505. package/dist/scheduler/delivery.js.map +1 -0
  506. package/dist/scheduler/deliveryKind.d.ts +29 -0
  507. package/dist/scheduler/deliveryKind.d.ts.map +1 -0
  508. package/dist/scheduler/deliveryKind.js +39 -0
  509. package/dist/scheduler/deliveryKind.js.map +1 -0
  510. package/dist/scheduler/directoryThreads.d.ts +19 -0
  511. package/dist/scheduler/directoryThreads.d.ts.map +1 -0
  512. package/dist/scheduler/directoryThreads.js +28 -0
  513. package/dist/scheduler/directoryThreads.js.map +1 -0
  514. package/dist/scheduler/engine.d.ts +77 -0
  515. package/dist/scheduler/engine.d.ts.map +1 -0
  516. package/dist/scheduler/engine.js +337 -0
  517. package/dist/scheduler/engine.js.map +1 -0
  518. package/dist/scheduler/injection.d.ts +102 -0
  519. package/dist/scheduler/injection.d.ts.map +1 -0
  520. package/dist/scheduler/injection.js +122 -0
  521. package/dist/scheduler/injection.js.map +1 -0
  522. package/dist/scheduler/mcpBoot.d.ts +65 -0
  523. package/dist/scheduler/mcpBoot.d.ts.map +1 -0
  524. package/dist/scheduler/mcpBoot.js +60 -0
  525. package/dist/scheduler/mcpBoot.js.map +1 -0
  526. package/dist/scheduler/mcpSurface.d.ts +355 -0
  527. package/dist/scheduler/mcpSurface.d.ts.map +1 -0
  528. package/dist/scheduler/mcpSurface.js +1257 -0
  529. package/dist/scheduler/mcpSurface.js.map +1 -0
  530. package/dist/scheduler/rebindResume.d.ts +27 -0
  531. package/dist/scheduler/rebindResume.d.ts.map +1 -0
  532. package/dist/scheduler/rebindResume.js +17 -0
  533. package/dist/scheduler/rebindResume.js.map +1 -0
  534. package/dist/scheduler/recurrence.d.ts +58 -0
  535. package/dist/scheduler/recurrence.d.ts.map +1 -0
  536. package/dist/scheduler/recurrence.js +210 -0
  537. package/dist/scheduler/recurrence.js.map +1 -0
  538. package/dist/scheduler/runLedger.d.ts +59 -0
  539. package/dist/scheduler/runLedger.d.ts.map +1 -0
  540. package/dist/scheduler/runLedger.js +54 -0
  541. package/dist/scheduler/runLedger.js.map +1 -0
  542. package/dist/scheduler/store.d.ts +97 -0
  543. package/dist/scheduler/store.d.ts.map +1 -0
  544. package/dist/scheduler/store.js +124 -0
  545. package/dist/scheduler/store.js.map +1 -0
  546. package/dist/scheduler/timezoneRecompute.d.ts +61 -0
  547. package/dist/scheduler/timezoneRecompute.d.ts.map +1 -0
  548. package/dist/scheduler/timezoneRecompute.js +46 -0
  549. package/dist/scheduler/timezoneRecompute.js.map +1 -0
  550. package/dist/scheduler/types.d.ts +139 -0
  551. package/dist/scheduler/types.d.ts.map +1 -0
  552. package/dist/scheduler/types.js +8 -0
  553. package/dist/scheduler/types.js.map +1 -0
  554. package/dist/sendErrorClassifier.d.ts +45 -0
  555. package/dist/sendErrorClassifier.d.ts.map +1 -0
  556. package/dist/sendErrorClassifier.js +65 -0
  557. package/dist/sendErrorClassifier.js.map +1 -0
  558. package/dist/sessionKey.d.ts +136 -0
  559. package/dist/sessionKey.d.ts.map +1 -0
  560. package/dist/sessionKey.js +153 -0
  561. package/dist/sessionKey.js.map +1 -0
  562. package/dist/sessionPick.d.ts +42 -0
  563. package/dist/sessionPick.d.ts.map +1 -0
  564. package/dist/sessionPick.js +39 -0
  565. package/dist/sessionPick.js.map +1 -0
  566. package/dist/shutdown.d.ts +126 -0
  567. package/dist/shutdown.d.ts.map +1 -0
  568. package/dist/shutdown.js +164 -0
  569. package/dist/shutdown.js.map +1 -0
  570. package/dist/startupPromptBuffer.d.ts +85 -0
  571. package/dist/startupPromptBuffer.d.ts.map +1 -0
  572. package/dist/startupPromptBuffer.js +123 -0
  573. package/dist/startupPromptBuffer.js.map +1 -0
  574. package/dist/state.d.ts +1245 -0
  575. package/dist/state.d.ts.map +1 -0
  576. package/dist/state.js +1830 -0
  577. package/dist/state.js.map +1 -0
  578. package/dist/threadContextPreamble.d.ts +89 -0
  579. package/dist/threadContextPreamble.d.ts.map +1 -0
  580. package/dist/threadContextPreamble.js +102 -0
  581. package/dist/threadContextPreamble.js.map +1 -0
  582. package/dist/threadRouting.d.ts +164 -0
  583. package/dist/threadRouting.d.ts.map +1 -0
  584. package/dist/threadRouting.js +182 -0
  585. package/dist/threadRouting.js.map +1 -0
  586. package/dist/types.d.ts +1015 -0
  587. package/dist/types.d.ts.map +1 -0
  588. package/dist/types.js +3 -0
  589. package/dist/types.js.map +1 -0
  590. package/dist/utils/abortableFifo.d.ts +10 -0
  591. package/dist/utils/abortableFifo.d.ts.map +1 -0
  592. package/dist/utils/abortableFifo.js +55 -0
  593. package/dist/utils/abortableFifo.js.map +1 -0
  594. package/dist/utils/adoptedToolList.d.ts +27 -0
  595. package/dist/utils/adoptedToolList.d.ts.map +1 -0
  596. package/dist/utils/adoptedToolList.js +22 -0
  597. package/dist/utils/adoptedToolList.js.map +1 -0
  598. package/dist/utils/agentEnvironment.d.ts +42 -0
  599. package/dist/utils/agentEnvironment.d.ts.map +1 -0
  600. package/dist/utils/agentEnvironment.js +122 -0
  601. package/dist/utils/agentEnvironment.js.map +1 -0
  602. package/dist/utils/ansiClean.d.ts +11 -0
  603. package/dist/utils/ansiClean.d.ts.map +1 -0
  604. package/dist/utils/ansiClean.js +139 -0
  605. package/dist/utils/ansiClean.js.map +1 -0
  606. package/dist/utils/autoContinueOnLimit.d.ts +49 -0
  607. package/dist/utils/autoContinueOnLimit.d.ts.map +1 -0
  608. package/dist/utils/autoContinueOnLimit.js +69 -0
  609. package/dist/utils/autoContinueOnLimit.js.map +1 -0
  610. package/dist/utils/canonicalPathContainment.d.ts +7 -0
  611. package/dist/utils/canonicalPathContainment.d.ts.map +1 -0
  612. package/dist/utils/canonicalPathContainment.js +48 -0
  613. package/dist/utils/canonicalPathContainment.js.map +1 -0
  614. package/dist/utils/claudeAuthLogin.d.ts +71 -0
  615. package/dist/utils/claudeAuthLogin.d.ts.map +1 -0
  616. package/dist/utils/claudeAuthLogin.js +93 -0
  617. package/dist/utils/claudeAuthLogin.js.map +1 -0
  618. package/dist/utils/claudeChunkClassifier.d.ts +97 -0
  619. package/dist/utils/claudeChunkClassifier.d.ts.map +1 -0
  620. package/dist/utils/claudeChunkClassifier.js +254 -0
  621. package/dist/utils/claudeChunkClassifier.js.map +1 -0
  622. package/dist/utils/claudeCodeVersion.d.ts +31 -0
  623. package/dist/utils/claudeCodeVersion.d.ts.map +1 -0
  624. package/dist/utils/claudeCodeVersion.js +62 -0
  625. package/dist/utils/claudeCodeVersion.js.map +1 -0
  626. package/dist/utils/claudeCompactHook.d.ts +64 -0
  627. package/dist/utils/claudeCompactHook.d.ts.map +1 -0
  628. package/dist/utils/claudeCompactHook.js +98 -0
  629. package/dist/utils/claudeCompactHook.js.map +1 -0
  630. package/dist/utils/claudeLivenessAction.d.ts +208 -0
  631. package/dist/utils/claudeLivenessAction.d.ts.map +1 -0
  632. package/dist/utils/claudeLivenessAction.js +135 -0
  633. package/dist/utils/claudeLivenessAction.js.map +1 -0
  634. package/dist/utils/claudeMcpHeal.d.ts +92 -0
  635. package/dist/utils/claudeMcpHeal.d.ts.map +1 -0
  636. package/dist/utils/claudeMcpHeal.js +91 -0
  637. package/dist/utils/claudeMcpHeal.js.map +1 -0
  638. package/dist/utils/claudeRelayRouting.d.ts +86 -0
  639. package/dist/utils/claudeRelayRouting.d.ts.map +1 -0
  640. package/dist/utils/claudeRelayRouting.js +159 -0
  641. package/dist/utils/claudeRelayRouting.js.map +1 -0
  642. package/dist/utils/claudeRuntimeInfo.d.ts +26 -0
  643. package/dist/utils/claudeRuntimeInfo.d.ts.map +1 -0
  644. package/dist/utils/claudeRuntimeInfo.js +151 -0
  645. package/dist/utils/claudeRuntimeInfo.js.map +1 -0
  646. package/dist/utils/claudeScrapeShapes.d.ts +256 -0
  647. package/dist/utils/claudeScrapeShapes.d.ts.map +1 -0
  648. package/dist/utils/claudeScrapeShapes.js +290 -0
  649. package/dist/utils/claudeScrapeShapes.js.map +1 -0
  650. package/dist/utils/claudeSessionTitle.d.ts +27 -0
  651. package/dist/utils/claudeSessionTitle.d.ts.map +1 -0
  652. package/dist/utils/claudeSessionTitle.js +90 -0
  653. package/dist/utils/claudeSessionTitle.js.map +1 -0
  654. package/dist/utils/claudeStreamJson.d.ts +202 -0
  655. package/dist/utils/claudeStreamJson.d.ts.map +1 -0
  656. package/dist/utils/claudeStreamJson.js +351 -0
  657. package/dist/utils/claudeStreamJson.js.map +1 -0
  658. package/dist/utils/claudeSubagentTail.d.ts +93 -0
  659. package/dist/utils/claudeSubagentTail.d.ts.map +1 -0
  660. package/dist/utils/claudeSubagentTail.js +136 -0
  661. package/dist/utils/claudeSubagentTail.js.map +1 -0
  662. package/dist/utils/clearThreadOutputQueues.d.ts +43 -0
  663. package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -0
  664. package/dist/utils/clearThreadOutputQueues.js +39 -0
  665. package/dist/utils/clearThreadOutputQueues.js.map +1 -0
  666. package/dist/utils/compactCommandRoute.d.ts +45 -0
  667. package/dist/utils/compactCommandRoute.d.ts.map +1 -0
  668. package/dist/utils/compactCommandRoute.js +36 -0
  669. package/dist/utils/compactCommandRoute.js.map +1 -0
  670. package/dist/utils/compactOnIdle.d.ts +329 -0
  671. package/dist/utils/compactOnIdle.d.ts.map +1 -0
  672. package/dist/utils/compactOnIdle.js +379 -0
  673. package/dist/utils/compactOnIdle.js.map +1 -0
  674. package/dist/utils/consoleFileTap.d.ts +51 -0
  675. package/dist/utils/consoleFileTap.d.ts.map +1 -0
  676. package/dist/utils/consoleFileTap.js +86 -0
  677. package/dist/utils/consoleFileTap.js.map +1 -0
  678. package/dist/utils/displayVerbosity.d.ts +44 -0
  679. package/dist/utils/displayVerbosity.d.ts.map +1 -0
  680. package/dist/utils/displayVerbosity.js +75 -0
  681. package/dist/utils/displayVerbosity.js.map +1 -0
  682. package/dist/utils/download.d.ts +72 -0
  683. package/dist/utils/download.d.ts.map +1 -0
  684. package/dist/utils/download.js +216 -0
  685. package/dist/utils/download.js.map +1 -0
  686. package/dist/utils/draftFinalize.d.ts +110 -0
  687. package/dist/utils/draftFinalize.d.ts.map +1 -0
  688. package/dist/utils/draftFinalize.js +100 -0
  689. package/dist/utils/draftFinalize.js.map +1 -0
  690. package/dist/utils/draftId.d.ts +36 -0
  691. package/dist/utils/draftId.d.ts.map +1 -0
  692. package/dist/utils/draftId.js +46 -0
  693. package/dist/utils/draftId.js.map +1 -0
  694. package/dist/utils/draftPacer.d.ts +72 -0
  695. package/dist/utils/draftPacer.d.ts.map +1 -0
  696. package/dist/utils/draftPacer.js +53 -0
  697. package/dist/utils/draftPacer.js.map +1 -0
  698. package/dist/utils/effortStartupKeystroke.d.ts +20 -0
  699. package/dist/utils/effortStartupKeystroke.d.ts.map +1 -0
  700. package/dist/utils/effortStartupKeystroke.js +28 -0
  701. package/dist/utils/effortStartupKeystroke.js.map +1 -0
  702. package/dist/utils/ensureSessionPlan.d.ts +70 -0
  703. package/dist/utils/ensureSessionPlan.d.ts.map +1 -0
  704. package/dist/utils/ensureSessionPlan.js +54 -0
  705. package/dist/utils/ensureSessionPlan.js.map +1 -0
  706. package/dist/utils/fileSendPlan.d.ts +217 -0
  707. package/dist/utils/fileSendPlan.d.ts.map +1 -0
  708. package/dist/utils/fileSendPlan.js +291 -0
  709. package/dist/utils/fileSendPlan.js.map +1 -0
  710. package/dist/utils/fileSendService.d.ts +94 -0
  711. package/dist/utils/fileSendService.d.ts.map +1 -0
  712. package/dist/utils/fileSendService.js +387 -0
  713. package/dist/utils/fileSendService.js.map +1 -0
  714. package/dist/utils/groupFinalizePlan.d.ts +38 -0
  715. package/dist/utils/groupFinalizePlan.d.ts.map +1 -0
  716. package/dist/utils/groupFinalizePlan.js +35 -0
  717. package/dist/utils/groupFinalizePlan.js.map +1 -0
  718. package/dist/utils/identicalOutputGuard.d.ts +83 -0
  719. package/dist/utils/identicalOutputGuard.d.ts.map +1 -0
  720. package/dist/utils/identicalOutputGuard.js +99 -0
  721. package/dist/utils/identicalOutputGuard.js.map +1 -0
  722. package/dist/utils/isoTimestamp.d.ts +16 -0
  723. package/dist/utils/isoTimestamp.d.ts.map +1 -0
  724. package/dist/utils/isoTimestamp.js +34 -0
  725. package/dist/utils/isoTimestamp.js.map +1 -0
  726. package/dist/utils/jsonStreamBusyWatchdog.d.ts +130 -0
  727. package/dist/utils/jsonStreamBusyWatchdog.d.ts.map +1 -0
  728. package/dist/utils/jsonStreamBusyWatchdog.js +122 -0
  729. package/dist/utils/jsonStreamBusyWatchdog.js.map +1 -0
  730. package/dist/utils/jsonStreamHost.d.ts +227 -0
  731. package/dist/utils/jsonStreamHost.d.ts.map +1 -0
  732. package/dist/utils/jsonStreamHost.js +417 -0
  733. package/dist/utils/jsonStreamHost.js.map +1 -0
  734. package/dist/utils/keyedTransitionQueue.d.ts +18 -0
  735. package/dist/utils/keyedTransitionQueue.d.ts.map +1 -0
  736. package/dist/utils/keyedTransitionQueue.js +34 -0
  737. package/dist/utils/keyedTransitionQueue.js.map +1 -0
  738. package/dist/utils/limitEpisodeRecovery.d.ts +92 -0
  739. package/dist/utils/limitEpisodeRecovery.d.ts.map +1 -0
  740. package/dist/utils/limitEpisodeRecovery.js +133 -0
  741. package/dist/utils/limitEpisodeRecovery.js.map +1 -0
  742. package/dist/utils/limitHeldPromptQueue.d.ts +48 -0
  743. package/dist/utils/limitHeldPromptQueue.d.ts.map +1 -0
  744. package/dist/utils/limitHeldPromptQueue.js +59 -0
  745. package/dist/utils/limitHeldPromptQueue.js.map +1 -0
  746. package/dist/utils/limitHeldPrompts.d.ts +58 -0
  747. package/dist/utils/limitHeldPrompts.d.ts.map +1 -0
  748. package/dist/utils/limitHeldPrompts.js +65 -0
  749. package/dist/utils/limitHeldPrompts.js.map +1 -0
  750. package/dist/utils/linkPreviewSuppression.d.ts +18 -0
  751. package/dist/utils/linkPreviewSuppression.d.ts.map +1 -0
  752. package/dist/utils/linkPreviewSuppression.js +37 -0
  753. package/dist/utils/linkPreviewSuppression.js.map +1 -0
  754. package/dist/utils/localClock.d.ts +15 -0
  755. package/dist/utils/localClock.d.ts.map +1 -0
  756. package/dist/utils/localClock.js +29 -0
  757. package/dist/utils/localClock.js.map +1 -0
  758. package/dist/utils/markdownTableRender.d.ts +83 -0
  759. package/dist/utils/markdownTableRender.d.ts.map +1 -0
  760. package/dist/utils/markdownTableRender.js +298 -0
  761. package/dist/utils/markdownTableRender.js.map +1 -0
  762. package/dist/utils/mediaGroupCollector.d.ts +51 -0
  763. package/dist/utils/mediaGroupCollector.d.ts.map +1 -0
  764. package/dist/utils/mediaGroupCollector.js +90 -0
  765. package/dist/utils/mediaGroupCollector.js.map +1 -0
  766. package/dist/utils/messageSendService.d.ts +136 -0
  767. package/dist/utils/messageSendService.d.ts.map +1 -0
  768. package/dist/utils/messageSendService.js +165 -0
  769. package/dist/utils/messageSendService.js.map +1 -0
  770. package/dist/utils/minutesOverride.d.ts +7 -0
  771. package/dist/utils/minutesOverride.d.ts.map +1 -0
  772. package/dist/utils/minutesOverride.js +16 -0
  773. package/dist/utils/minutesOverride.js.map +1 -0
  774. package/dist/utils/modelPickerPlan.d.ts +119 -0
  775. package/dist/utils/modelPickerPlan.d.ts.map +1 -0
  776. package/dist/utils/modelPickerPlan.js +171 -0
  777. package/dist/utils/modelPickerPlan.js.map +1 -0
  778. package/dist/utils/modelSetReplyDecision.d.ts +67 -0
  779. package/dist/utils/modelSetReplyDecision.d.ts.map +1 -0
  780. package/dist/utils/modelSetReplyDecision.js +27 -0
  781. package/dist/utils/modelSetReplyDecision.js.map +1 -0
  782. package/dist/utils/openCodeAuthLogin.d.ts +181 -0
  783. package/dist/utils/openCodeAuthLogin.d.ts.map +1 -0
  784. package/dist/utils/openCodeAuthLogin.js +393 -0
  785. package/dist/utils/openCodeAuthLogin.js.map +1 -0
  786. package/dist/utils/openCodeCompactPlugin.d.ts +81 -0
  787. package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -0
  788. package/dist/utils/openCodeCompactPlugin.js +146 -0
  789. package/dist/utils/openCodeCompactPlugin.js.map +1 -0
  790. package/dist/utils/openCodeTurnActivity.d.ts +67 -0
  791. package/dist/utils/openCodeTurnActivity.d.ts.map +1 -0
  792. package/dist/utils/openCodeTurnActivity.js +27 -0
  793. package/dist/utils/openCodeTurnActivity.js.map +1 -0
  794. package/dist/utils/outputDebounce.d.ts +24 -0
  795. package/dist/utils/outputDebounce.d.ts.map +1 -0
  796. package/dist/utils/outputDebounce.js +30 -0
  797. package/dist/utils/outputDebounce.js.map +1 -0
  798. package/dist/utils/outputFlushTiming.d.ts +54 -0
  799. package/dist/utils/outputFlushTiming.d.ts.map +1 -0
  800. package/dist/utils/outputFlushTiming.js +48 -0
  801. package/dist/utils/outputFlushTiming.js.map +1 -0
  802. package/dist/utils/paginateList.d.ts +25 -0
  803. package/dist/utils/paginateList.d.ts.map +1 -0
  804. package/dist/utils/paginateList.js +32 -0
  805. package/dist/utils/paginateList.js.map +1 -0
  806. package/dist/utils/paneDiff.d.ts +55 -0
  807. package/dist/utils/paneDiff.d.ts.map +1 -0
  808. package/dist/utils/paneDiff.js +88 -0
  809. package/dist/utils/paneDiff.js.map +1 -0
  810. package/dist/utils/paneResizeGuard.d.ts +69 -0
  811. package/dist/utils/paneResizeGuard.d.ts.map +1 -0
  812. package/dist/utils/paneResizeGuard.js +91 -0
  813. package/dist/utils/paneResizeGuard.js.map +1 -0
  814. package/dist/utils/persistAdapterSessionIds.d.ts +39 -0
  815. package/dist/utils/persistAdapterSessionIds.d.ts.map +1 -0
  816. package/dist/utils/persistAdapterSessionIds.js +28 -0
  817. package/dist/utils/persistAdapterSessionIds.js.map +1 -0
  818. package/dist/utils/pinnedBannerSkipDecision.d.ts +44 -0
  819. package/dist/utils/pinnedBannerSkipDecision.d.ts.map +1 -0
  820. package/dist/utils/pinnedBannerSkipDecision.js +20 -0
  821. package/dist/utils/pinnedBannerSkipDecision.js.map +1 -0
  822. package/dist/utils/pollBackoff.d.ts +45 -0
  823. package/dist/utils/pollBackoff.d.ts.map +1 -0
  824. package/dist/utils/pollBackoff.js +44 -0
  825. package/dist/utils/pollBackoff.js.map +1 -0
  826. package/dist/utils/promptDelivery.d.ts +46 -0
  827. package/dist/utils/promptDelivery.d.ts.map +1 -0
  828. package/dist/utils/promptDelivery.js +49 -0
  829. package/dist/utils/promptDelivery.js.map +1 -0
  830. package/dist/utils/providerDisconnectPlan.d.ts +82 -0
  831. package/dist/utils/providerDisconnectPlan.d.ts.map +1 -0
  832. package/dist/utils/providerDisconnectPlan.js +110 -0
  833. package/dist/utils/providerDisconnectPlan.js.map +1 -0
  834. package/dist/utils/rateLimitLog.d.ts +48 -0
  835. package/dist/utils/rateLimitLog.d.ts.map +1 -0
  836. package/dist/utils/rateLimitLog.js +43 -0
  837. package/dist/utils/rateLimitLog.js.map +1 -0
  838. package/dist/utils/recentRelayWindow.d.ts +165 -0
  839. package/dist/utils/recentRelayWindow.d.ts.map +1 -0
  840. package/dist/utils/recentRelayWindow.js +284 -0
  841. package/dist/utils/recentRelayWindow.js.map +1 -0
  842. package/dist/utils/recvPreviewRedaction.d.ts +23 -0
  843. package/dist/utils/recvPreviewRedaction.d.ts.map +1 -0
  844. package/dist/utils/recvPreviewRedaction.js +39 -0
  845. package/dist/utils/recvPreviewRedaction.js.map +1 -0
  846. package/dist/utils/reminderFlow.d.ts +148 -0
  847. package/dist/utils/reminderFlow.d.ts.map +1 -0
  848. package/dist/utils/reminderFlow.js +122 -0
  849. package/dist/utils/reminderFlow.js.map +1 -0
  850. package/dist/utils/reminderScheduleText.d.ts +87 -0
  851. package/dist/utils/reminderScheduleText.d.ts.map +1 -0
  852. package/dist/utils/reminderScheduleText.js +135 -0
  853. package/dist/utils/reminderScheduleText.js.map +1 -0
  854. package/dist/utils/reminderWizard.d.ts +710 -0
  855. package/dist/utils/reminderWizard.d.ts.map +1 -0
  856. package/dist/utils/reminderWizard.js +1164 -0
  857. package/dist/utils/reminderWizard.js.map +1 -0
  858. package/dist/utils/replyQuote.d.ts +111 -0
  859. package/dist/utils/replyQuote.d.ts.map +1 -0
  860. package/dist/utils/replyQuote.js +122 -0
  861. package/dist/utils/replyQuote.js.map +1 -0
  862. package/dist/utils/resolveBinary.d.ts +25 -0
  863. package/dist/utils/resolveBinary.d.ts.map +1 -0
  864. package/dist/utils/resolveBinary.js +99 -0
  865. package/dist/utils/resolveBinary.js.map +1 -0
  866. package/dist/utils/retryAfterHeader.d.ts +7 -0
  867. package/dist/utils/retryAfterHeader.d.ts.map +1 -0
  868. package/dist/utils/retryAfterHeader.js +17 -0
  869. package/dist/utils/retryAfterHeader.js.map +1 -0
  870. package/dist/utils/rotatingJsonlFile.d.ts +40 -0
  871. package/dist/utils/rotatingJsonlFile.d.ts.map +1 -0
  872. package/dist/utils/rotatingJsonlFile.js +106 -0
  873. package/dist/utils/rotatingJsonlFile.js.map +1 -0
  874. package/dist/utils/rotatingLogFile.d.ts +25 -0
  875. package/dist/utils/rotatingLogFile.d.ts.map +1 -0
  876. package/dist/utils/rotatingLogFile.js +74 -0
  877. package/dist/utils/rotatingLogFile.js.map +1 -0
  878. package/dist/utils/sendRateTracker.d.ts +59 -0
  879. package/dist/utils/sendRateTracker.d.ts.map +1 -0
  880. package/dist/utils/sendRateTracker.js +144 -0
  881. package/dist/utils/sendRateTracker.js.map +1 -0
  882. package/dist/utils/serialQueue.d.ts +5 -0
  883. package/dist/utils/serialQueue.d.ts.map +1 -0
  884. package/dist/utils/serialQueue.js +14 -0
  885. package/dist/utils/serialQueue.js.map +1 -0
  886. package/dist/utils/sseStreamLifecycle.d.ts +32 -0
  887. package/dist/utils/sseStreamLifecycle.d.ts.map +1 -0
  888. package/dist/utils/sseStreamLifecycle.js +41 -0
  889. package/dist/utils/sseStreamLifecycle.js.map +1 -0
  890. package/dist/utils/startupReadiness.d.ts +119 -0
  891. package/dist/utils/startupReadiness.d.ts.map +1 -0
  892. package/dist/utils/startupReadiness.js +148 -0
  893. package/dist/utils/startupReadiness.js.map +1 -0
  894. package/dist/utils/statusFlushDecision.d.ts +18 -0
  895. package/dist/utils/statusFlushDecision.d.ts.map +1 -0
  896. package/dist/utils/statusFlushDecision.js +53 -0
  897. package/dist/utils/statusFlushDecision.js.map +1 -0
  898. package/dist/utils/subagentRender.d.ts +52 -0
  899. package/dist/utils/subagentRender.d.ts.map +1 -0
  900. package/dist/utils/subagentRender.js +66 -0
  901. package/dist/utils/subagentRender.js.map +1 -0
  902. package/dist/utils/subagentStatusRender.d.ts +90 -0
  903. package/dist/utils/subagentStatusRender.d.ts.map +1 -0
  904. package/dist/utils/subagentStatusRender.js +124 -0
  905. package/dist/utils/subagentStatusRender.js.map +1 -0
  906. package/dist/utils/telegramError.d.ts +2 -0
  907. package/dist/utils/telegramError.d.ts.map +1 -0
  908. package/dist/utils/telegramError.js +16 -0
  909. package/dist/utils/telegramError.js.map +1 -0
  910. package/dist/utils/terminalEmitPlan.d.ts +74 -0
  911. package/dist/utils/terminalEmitPlan.d.ts.map +1 -0
  912. package/dist/utils/terminalEmitPlan.js +86 -0
  913. package/dist/utils/terminalEmitPlan.js.map +1 -0
  914. package/dist/utils/thinkingRender.d.ts +74 -0
  915. package/dist/utils/thinkingRender.d.ts.map +1 -0
  916. package/dist/utils/thinkingRender.js +85 -0
  917. package/dist/utils/thinkingRender.js.map +1 -0
  918. package/dist/utils/threadStatusReport.d.ts +55 -0
  919. package/dist/utils/threadStatusReport.d.ts.map +1 -0
  920. package/dist/utils/threadStatusReport.js +65 -0
  921. package/dist/utils/threadStatusReport.js.map +1 -0
  922. package/dist/utils/threadToggle.d.ts +29 -0
  923. package/dist/utils/threadToggle.d.ts.map +1 -0
  924. package/dist/utils/threadToggle.js +39 -0
  925. package/dist/utils/threadToggle.js.map +1 -0
  926. package/dist/utils/timezone.d.ts +125 -0
  927. package/dist/utils/timezone.d.ts.map +1 -0
  928. package/dist/utils/timezone.js +278 -0
  929. package/dist/utils/timezone.js.map +1 -0
  930. package/dist/utils/tmuxExec.d.ts +61 -0
  931. package/dist/utils/tmuxExec.d.ts.map +1 -0
  932. package/dist/utils/tmuxExec.js +109 -0
  933. package/dist/utils/tmuxExec.js.map +1 -0
  934. package/dist/utils/tmuxSessionName.d.ts +34 -0
  935. package/dist/utils/tmuxSessionName.d.ts.map +1 -0
  936. package/dist/utils/tmuxSessionName.js +51 -0
  937. package/dist/utils/tmuxSessionName.js.map +1 -0
  938. package/dist/utils/toolResultRender.d.ts +61 -0
  939. package/dist/utils/toolResultRender.d.ts.map +1 -0
  940. package/dist/utils/toolResultRender.js +62 -0
  941. package/dist/utils/toolResultRender.js.map +1 -0
  942. package/dist/utils/topicRequest.d.ts +61 -0
  943. package/dist/utils/topicRequest.d.ts.map +1 -0
  944. package/dist/utils/topicRequest.js +68 -0
  945. package/dist/utils/topicRequest.js.map +1 -0
  946. package/dist/utils/topicView.d.ts +55 -0
  947. package/dist/utils/topicView.d.ts.map +1 -0
  948. package/dist/utils/topicView.js +56 -0
  949. package/dist/utils/topicView.js.map +1 -0
  950. package/dist/utils/transcribeAudio.d.ts +89 -0
  951. package/dist/utils/transcribeAudio.d.ts.map +1 -0
  952. package/dist/utils/transcribeAudio.js +249 -0
  953. package/dist/utils/transcribeAudio.js.map +1 -0
  954. package/dist/utils/transientFrames.d.ts +52 -0
  955. package/dist/utils/transientFrames.d.ts.map +1 -0
  956. package/dist/utils/transientFrames.js +41 -0
  957. package/dist/utils/transientFrames.js.map +1 -0
  958. package/dist/utils/typingActive.d.ts +35 -0
  959. package/dist/utils/typingActive.d.ts.map +1 -0
  960. package/dist/utils/typingActive.js +22 -0
  961. package/dist/utils/typingActive.js.map +1 -0
  962. package/dist/utils/typingLoopBackstop.d.ts +64 -0
  963. package/dist/utils/typingLoopBackstop.d.ts.map +1 -0
  964. package/dist/utils/typingLoopBackstop.js +68 -0
  965. package/dist/utils/typingLoopBackstop.js.map +1 -0
  966. package/dist/utils/verbosityRender.d.ts +18 -0
  967. package/dist/utils/verbosityRender.d.ts.map +1 -0
  968. package/dist/utils/verbosityRender.js +17 -0
  969. package/dist/utils/verbosityRender.js.map +1 -0
  970. package/dist/utils/wedgeRecovery.d.ts +57 -0
  971. package/dist/utils/wedgeRecovery.d.ts.map +1 -0
  972. package/dist/utils/wedgeRecovery.js +24 -0
  973. package/dist/utils/wedgeRecovery.js.map +1 -0
  974. package/dist/utils.d.ts +30 -0
  975. package/dist/utils.d.ts.map +1 -0
  976. package/dist/utils.js +61 -0
  977. package/dist/utils.js.map +1 -0
  978. package/dist/validation.d.ts +113 -0
  979. package/dist/validation.d.ts.map +1 -0
  980. package/dist/validation.js +226 -0
  981. package/dist/validation.js.map +1 -0
  982. package/dist/voiceQueue.d.ts +7 -0
  983. package/dist/voiceQueue.d.ts.map +1 -0
  984. package/dist/voiceQueue.js +33 -0
  985. package/dist/voiceQueue.js.map +1 -0
  986. package/examples/.env.example +17 -0
  987. package/examples/docker-compose.yml +36 -0
  988. package/package.json +83 -4
@@ -0,0 +1,1336 @@
1
+ import { EventEmitter } from 'events';
2
+ import type { AgentAdapter, AgentRuntimeInfo, AgentSession, ClaudeSurveyOption, DisplayPrefsReader, ReattachRecap, RecentTurn, ResumeSessionOptions, SeenWatermark, SeenWatermarkWriter, SendInputOptions, ThreadLocaleReader } from '../types';
3
+ import type { SessionKey } from '../sessionKey';
4
+ import { type ToolResultKind } from '../utils/claudeScrapeShapes';
5
+ import { type SerialQueue } from '../utils/serialQueue';
6
+ import { tmuxAsync } from '../utils/tmuxExec';
7
+ import { convertAnsiToMarkdown, cleanOutput } from '../utils/ansiClean';
8
+ import { getNewPaneContent, type NewPaneContent } from '../utils/paneDiff';
9
+ import { type SubagentTailState } from '../utils/claudeSubagentTail';
10
+ import { type RecentRelayWindow } from '../utils/recentRelayWindow';
11
+ import { type ClaudeChunkContext } from '../utils/claudeChunkClassifier';
12
+ /**
13
+ * @description Per-thread Claude CLI session state.
14
+ *
15
+ * One tmux session is spawned per `SessionKey`. The tmux session name embeds
16
+ * both `chatId` and `threadId` so multiple threads sharing the same `workDir`
17
+ * stay fully isolated (plan §10.2, D8).
18
+ */
19
+ export interface ClaudeSession {
20
+ key: SessionKey;
21
+ workDir: string;
22
+ sessionName: string;
23
+ /** UUID we pass via `--session-id` (or, on resume, via `--resume`). */
24
+ claudeSessionId: string;
25
+ queue: SerialQueue;
26
+ pollTimer: NodeJS.Timeout | null;
27
+ lastContent: string;
28
+ isActive: boolean;
29
+ handledAutoEnter: boolean;
30
+ handledAutoAccept: boolean;
31
+ /**
32
+ * One-shot guard for the auto-retry `apiError` emit. Armed when the terminal
33
+ * `API Error:` line first classifies as retryable, reset by the same
34
+ * `newPart.length > 50` rule as the sibling `handled*` flags — so a later,
35
+ * distinct error in the same session re-arms, but a static error frame
36
+ * doesn't re-emit on every poll.
37
+ */
38
+ handledApiError: boolean;
39
+ /** Normalized text of last emitted status (for deduplication of spinner updates) */
40
+ lastStatusText: string;
41
+ /**
42
+ * The last text the bot typed into this session via {@link ClaudeCliAdapter.sendInput}
43
+ * (the preamble-glued prompt, a `/c continue` nudge, a buffered replay — every
44
+ * typed path). Used by the CONTENT-based echo gate (S1): Claude echoes typed
45
+ * input back in the pane, and when that echo carries no `❯` (a wrapped row, the
46
+ * `[Telegram thread context]` preamble, a voice-transcript tail) the shape-only
47
+ * {@link checkIsInputEchoFrame} misses it and it leaks into the topic. Empty
48
+ * until the first send.
49
+ */
50
+ lastForwardedText: string;
51
+ /**
52
+ * Epoch ms of the last {@link lastForwardedText} capture. The content echo gate
53
+ * only fires within a short window after a send (the echo appears right at
54
+ * submit), so a much later real reply that coincidentally repeats prompt words
55
+ * is never suppressed.
56
+ */
57
+ lastForwardedTextAt: number;
58
+ /**
59
+ * Signature of the last emitted interactive-question block (the option-label
60
+ * set, ignoring which option is highlighted). Moving the `❯` cursor repaints
61
+ * the whole box every keystroke; comparing signatures lets us deliver the
62
+ * question once and suppress the cursor-move repaints. Cleared when real
63
+ * prose follows (the question is over). See {@link extractClaudeQuestion}.
64
+ */
65
+ lastQuestionSignature: string;
66
+ /**
67
+ * Consecutive poll diffs (while a question is pending) in which
68
+ * {@link extractClaudeQuestion} found NO selector on screen. The selector
69
+ * repaints constantly, so a single scrape can momentarily fail to match while
70
+ * it is still up; resolving the question (emit `questionGone`) on that lone
71
+ * null both unpins prematurely AND re-emits a duplicate question + notification
72
+ * the next poll (the signature was cleared). We only treat the question as gone
73
+ * after it has been absent for {@link questionAbsentPollThreshold} consecutive
74
+ * diffs. Reset to 0 on any detection.
75
+ */
76
+ questionAbsentPolls: number;
77
+ /**
78
+ * Signature of the last AUTO-DISMISSED Claude CLI bare-digit survey (header +
79
+ * option digits/labels). Same de-dup mechanism as
80
+ * {@link lastQuestionSignature}: the survey repaints every poll while on
81
+ * screen, so comparing signatures sends the dismiss keystroke exactly once.
82
+ * Cleared when the survey leaves the pane, so a genuinely new survey later is
83
+ * re-dismissed. Drives {@link checkShouldDismissSurvey}. See
84
+ * {@link extractClaudeSurvey}.
85
+ */
86
+ lastSurveySignature: string;
87
+ /**
88
+ * Handles for the auto-Enter / auto-Accept `setTimeout`s. Audit S9 / #10:
89
+ * the callbacks used to fire 300–400 ms after detection regardless of
90
+ * whether the session was still alive; on rapid stop/start the keystroke
91
+ * would land in a different invocation (e.g. auto-accepting a permission
92
+ * prompt belonging to a replacement session). Cleared on `stopSession`;
93
+ * callbacks also re-check `session.isActive` before issuing tmux keys.
94
+ */
95
+ autoEnterTimer: NodeJS.Timeout | null;
96
+ autoAcceptOuterTimer: NodeJS.Timeout | null;
97
+ autoAcceptInnerTimer: NodeJS.Timeout | null;
98
+ /**
99
+ * Re-entrancy guard for `pollOutput`. Audit S9 / #37: a `tmux capture-pane`
100
+ * under load can take longer than the 300 ms poll interval, and the next
101
+ * `setInterval` tick would fire before the previous one finished, leading
102
+ * to duplicate `output` emissions. With self-rescheduling `setTimeout`
103
+ * and this flag we serialise polls; ticks that overlap with an in-flight
104
+ * one are skipped silently.
105
+ */
106
+ isPolling: boolean;
107
+ /**
108
+ * Tool-result kind still open at the end of the last emitted poll, threaded
109
+ * into the next poll so a slow command's orphan output (whose `● Bash(…)`
110
+ * header was suppressed by the line-set diff) is still fenced (B2). See
111
+ * {@link fenceToolResultBodies}.
112
+ */
113
+ openToolKind: ToolResultKind | null;
114
+ /**
115
+ * Resume flood-suppression mode. On `--resume`, Claude repaints the ENTIRE
116
+ * restored transcript into the pane over several polls; relaying that diff
117
+ * would dump hours of old conversation into the topic. While seeding we
118
+ * advance the baseline (`lastContent`) every poll but emit NOTHING, so once
119
+ * the pane stops growing the baseline equals the full restored transcript
120
+ * and later diffs are genuine new output. The short last-3-turn context block
121
+ * is posted separately (read from the `.jsonl`). The auto-Enter / auto-Accept
122
+ * machinery KEEPS running during seeding — we suppress conversation text, not
123
+ * lifecycle. See {@link getResumeSeedDecision}.
124
+ */
125
+ resumeSeeding: boolean;
126
+ /** Polls elapsed in {@link resumeSeeding} mode — drives the stable/cap exit. */
127
+ resumeSeedPolls: number;
128
+ /** Pane content seen on the previous seeding poll, for the "unchanged across 2 polls" exit. */
129
+ resumeSeedPrevContent: string;
130
+ /**
131
+ * Raw `capture-pane` text from the previous poll. When the new capture is
132
+ * byte-identical we skip `cleanOutput` entirely (S1) — identical raw ⇒
133
+ * identical cleaned content, so the ~15-regex parse is pure wasted work on
134
+ * an idle pane. Reset wherever {@link lastContent} resets.
135
+ */
136
+ lastRawCapture: string;
137
+ /**
138
+ * Current poll delay in ms (S2 adaptive backoff). Starts at
139
+ * {@link basePollIntervalMs}; {@link getNextPollDelay} grows it toward
140
+ * {@link maxPollIntervalMs} while the pane stays unchanged and snaps it back
141
+ * to base on any change or explicit write (see {@link resetPollCadence}).
142
+ */
143
+ currentPollDelayMs: number;
144
+ /** Consecutive unchanged polls — drives {@link getNextPollDelay}'s backoff. */
145
+ unchangedPollStreak: number;
146
+ /**
147
+ * Epoch ms of the last poll whose raw `capture-pane` DIFFERED from the
148
+ * previous one (i.e. the TUI pane actually changed). Drives the bot's
149
+ * pane-static idle net via {@link ClaudeCliAdapter.getMsSincePaneChange}: a
150
+ * genuinely working agent repaints the pane every second (animated spinner +
151
+ * the TUI's own elapsed timer), so a long gap since the last change means the
152
+ * agent is idle even if the footer busy signal is stuck. Seeded to "now" at
153
+ * session creation / adopt so a fresh session never reads as instantly stale.
154
+ */
155
+ lastContentChangeAt: number;
156
+ /**
157
+ * S7 one-shot: the stored `/effort` level to re-type ONCE the TUI input box
158
+ * first appears, so a fresh spawn doesn't inherit claude's GLOBAL effort
159
+ * state (possibly set in another topic). Set at spawn from the per-thread
160
+ * pref ({@link applyStoredEffortOnSpawn}); `null` when no pref or already
161
+ * applied. Consumed by the first poll that sees a ready prompt
162
+ * ({@link checkIsClaudePromptReady}), BEFORE the bot replays buffered prompts
163
+ * onto the same serial tmux queue. NOT set on adopt/reattach (that claude
164
+ * process kept its in-TUI effort and may be mid-turn).
165
+ */
166
+ pendingEffortReapply: string | null;
167
+ /**
168
+ * Last transcript byte size persisted as the seen-{@link SeenWatermark} for
169
+ * this session (in-memory monotonic high-water mark). The poll loop advances
170
+ * the watermark to the current transcript EOF on EVERY idle+ready poll (not
171
+ * just the single busy→ready edge), but writes only when EOF actually grew —
172
+ * this field is the comparison anchor. `undefined` until the first advance,
173
+ * treated as `-1` (the first idle poll always writes). Fresh per session object
174
+ * (start / resume / adopt); correctness across a restart is protected by the
175
+ * recap's PRE-adopt watermark snapshot, not by seeding this from disk. Lets a
176
+ * bot restart count the assistant turns produced while it was down, and — vs
177
+ * the old edge-only gate — corrects a premature mid-turn idle advance and
178
+ * catches a final assistant line flushed just after the turn ends. See
179
+ * {@link checkShouldAdvanceWatermark} / {@link ClaudeCliAdapter.advanceClaudeWatermarkIfGrown}.
180
+ */
181
+ lastWatermarkOffset?: number;
182
+ /**
183
+ * Long-horizon dedup of lines already RELAYED to this topic (incident
184
+ * 2026-06-10: a TUI re-render of an hours-old ~1400-line diff re-relayed as
185
+ * a ~12-message flood — {@link getNewPaneContent} only knows the previous
186
+ * capture, so a redraw of old scrollback looks "new" to it). The poll loop
187
+ * filters every diff chunk through this window before emitting and records
188
+ * a chunk ONLY when it was emitted as permanent output (status frames roll
189
+ * in place; questions/surveys carry their own signature de-dup). Fresh per
190
+ * session object (start / resume / adopt), dies with the session on stop,
191
+ * and reset again when resume seeding ends — the window must start empty
192
+ * AFTER the restored transcript was swallowed. See
193
+ * `utils/recentRelayWindow.ts` for the locked drop-over-resend tradeoff.
194
+ */
195
+ recentRelayWindow: RecentRelayWindow;
196
+ /**
197
+ * Sub-agent transcript tail state (`/subagent full` on Claude, plan
198
+ * 2026-06-11 S3). The poll loop scans
199
+ * `<projectsRoot>/<slug>/<claudeSessionId>/subagents/` every tick and feeds
200
+ * file sizes / appended bytes into the pure `claudeSubagentTail` helpers;
201
+ * this holds the per-file byte offsets + partial-line carries. Fresh per
202
+ * session object (start / resume / adopt all flow through `createSession`),
203
+ * so the helper's first-scan EOF seeding kills backlog replay on
204
+ * resume/adopt — see {@link ClaudeCliAdapter.scanSubagentTranscripts}.
205
+ */
206
+ subagentTail: SubagentTailState;
207
+ /**
208
+ * Cross-poll classifier context for the verbosity relay (S4). A tool body /
209
+ * thinking block / sub-agent panel can span the boundary between two scraped
210
+ * chunks (Claude redraws the whole pane each poll; the diff emits only NEW
211
+ * lines, so a slow command's body arrives in a later poll without its
212
+ * header). {@link classifyClaudeChunk} threads this so the later chunk still
213
+ * tags those orphan lines correctly. Fresh per session object (start /
214
+ * resume / adopt all flow through `createSession`).
215
+ */
216
+ chunkContext: ClaudeChunkContext;
217
+ /**
218
+ * Last known pane size (`<width>x<height>`, e.g. `300x50`) from the per-poll
219
+ * `#{pane_width}x#{pane_height}` query; `null` until the first successful
220
+ * read. A CHANGE means tmux re-wrapped the whole scrollback (an interactive
221
+ * `tmux attach`/detach resizes the window — live incident 2026-07-02)
222
+ * and the poll's giant line-SET diff is repaint, not output. See
223
+ * {@link getPaneResizeGuardDecision}.
224
+ */
225
+ lastPaneSize: string | null;
226
+ /**
227
+ * Whether the session is swallowing a resize repaint: baseline advances
228
+ * every poll but NOTHING is emitted, until a poll sees the capture unchanged
229
+ * (or the settle cap fires). Same suppress-and-advance shape as
230
+ * {@link resumeSeeding}, but for pane-size changes.
231
+ */
232
+ isResizeSettling: boolean;
233
+ /** Consecutive suppressed polls spent in {@link isResizeSettling} — drives the cap. */
234
+ resizeSettlePolls: number;
235
+ /**
236
+ * Streaming-table stabilizer state (live incident 2026-06-11, plan
237
+ * `2026-06-11-claude-wide-table-content-loss`). A wide markdown table re-flows
238
+ * its column widths as longer cells stream in; the line-SET diff treats each
239
+ * intermediate layout as "new" and would ship the table once per layout (empty
240
+ * skeleton → 1 row → full), with the final full frame often dropped under the
241
+ * coalescer's debounce / a 429. We hold the table back until it settles, then
242
+ * emit the complete version once. `null` = no table currently held. Reset at
243
+ * the same lifecycle points as {@link recentRelayWindow} (fresh per session
244
+ * object via `createSession`, and on the resume-seed exit). See
245
+ * {@link getTableStabilizationDecision}.
246
+ */
247
+ streamingTable: StreamingTableState | null;
248
+ }
249
+ export declare function loadEffortPrefs(): Record<string, string>;
250
+ export declare function saveEffortPref(key: SessionKey, level: string): void;
251
+ /**
252
+ * @description Tmux session name for a `SessionKey`.
253
+ *
254
+ * Format: `claude-<chatId>-<threadId>`. Negative chat ids (forum supergroups
255
+ * are negative) keep their minus sign — tmux session names accept it. The
256
+ * format is `parse`-able back to `SessionKey` via {@link parseTmuxSessionName}.
257
+ */
258
+ declare function buildTmuxSessionName(key: SessionKey): string;
259
+ /**
260
+ * @description Inverse of {@link buildTmuxSessionName}. Returns `null` for
261
+ * names that don't match our format (e.g. unrelated tmux sessions a user
262
+ * started by hand).
263
+ *
264
+ * Carefully handles negative chat ids: `claude--1001234-42` is `chatId=-1001234, threadId=42`.
265
+ */
266
+ declare function parseTmuxSessionName(name: string): SessionKey | null;
267
+ /**
268
+ * @description Validate a UUID-shaped session id before it ever reaches a
269
+ * tmux command line. Defence-in-depth (audit S1): even though we now route
270
+ * every tmux call through argv (no shell interpolation), the UUID is later
271
+ * concatenated into the `shell-command` we hand to `tmux new-session`,
272
+ * which tmux execs via `$SHELL -c`. If a non-UUID value ever sneaks in
273
+ * (corrupted state.json, future user-facing `/resume <id>`), it would land
274
+ * in that shell. Rejecting up front keeps the surface tight.
275
+ */
276
+ export declare function checkIsValidUuid(s: string): boolean;
277
+ /**
278
+ * @description Pure parser — pulls a `--session-id <uuid>` value out of a
279
+ * claude command line. Lives outside the adapter class so it can be
280
+ * unit-tested without booting tmux. Quoting in the input is flexible
281
+ * because `pane_start_command` can come back as `--session-id 'uuid'`,
282
+ * `--session-id "uuid"`, `--session-id=uuid`, or just `--session-id uuid`,
283
+ * depending on how the original shell-command was assembled. Returns the
284
+ * lowercase UUID, or `null` if no valid UUID is found.
285
+ */
286
+ export declare function parseClaudeSessionIdFromCommand(cmd: string): string | null;
287
+ export { tmuxAsync };
288
+ export { convertAnsiToMarkdown, cleanOutput };
289
+ /**
290
+ * @description Check if output consists only of transient status lines (spinners, progress).
291
+ * Uses generic heuristics instead of hardcoded spinner chars/words,
292
+ * because Claude CLI can change its TUI symbols and wording at any time.
293
+ *
294
+ * Key insight: real Claude content is substantial (> 200 chars, multi-sentence).
295
+ * Status/progress is short, has few lines, and contains indicators like … or time/token stats.
296
+ */
297
+ export declare function checkIsStatusOutput(text: string): boolean;
298
+ /**
299
+ * @description A single interactive question Claude scraped from the pane,
300
+ * rendered for durable delivery.
301
+ */
302
+ export interface ClaudeQuestion {
303
+ /**
304
+ * Header + every numbered option (highlighted one kept), each followed by
305
+ * its indented description sub-line(s) when the TUI shows any, ready to send.
306
+ */
307
+ text: string;
308
+ /**
309
+ * Stable across cursor moves — the option-label set, ignoring which option
310
+ * is currently highlighted. Two `❯`-cursor positions over the same options
311
+ * yield the same signature, so the bot delivers the question once.
312
+ */
313
+ signature: string;
314
+ }
315
+ /**
316
+ * @description Detect + extract the active interactive question/choice block
317
+ * from the FULL Claude pane, returning a durable rendering and a
318
+ * cursor-invariant signature, or `null` when the pane isn't confidently
319
+ * showing a question.
320
+ *
321
+ * Operates on the whole pane (not a poll diff) on purpose: moving the `❯`
322
+ * cursor repaints only the two changed option lines, so a signature taken
323
+ * from the diff would be a partial option set and wouldn't match the full
324
+ * box — the de-dup would fail and every keystroke would re-spam the thread.
325
+ * Reading the full option group makes the signature stable across cursor
326
+ * moves. We take the LAST option group (the active prompt sits at the bottom
327
+ * of the pane) and the header line(s) just above it.
328
+ *
329
+ * Conservative (plan §2026-05-30 / S2): requires a `❯` cursor on an option
330
+ * OR an "Enter to select"-style hint right below the group — a plain numbered
331
+ * list in prose has neither, so it returns `null` and falls through to the
332
+ * normal output path. The `❯`-highlighted option text is preserved (the old
333
+ * `stripTuiElements` path discarded every `^❯` line, losing the selection).
334
+ *
335
+ * Two layouts (plan §2026-06-09 question-ux / S4):
336
+ * - single-column — options with optional indented description sub-lines,
337
+ * which are ATTACHED to their option in the rendering (S1: previously
338
+ * discarded);
339
+ * - side-by-side (options WITH `preview` content) — each option line carries
340
+ * a right-hand preview-box fragment that is CUT off; the preview body is
341
+ * deliberately NOT relayed (Telegram gets labels + descriptions, the
342
+ * preview is a TUI-only nicety). See {@link PREVIEW_BOX_GLYPH_CLASS} and
343
+ * {@link HIGHLIGHTED_OPTION_BOLD_ARTIFACT_REGEX} for the live bug both
344
+ * rules close.
345
+ */
346
+ export declare function extractClaudeQuestion(text: string): ClaudeQuestion | null;
347
+ /** Whether `text` is confidently showing an interactive question/choice block. */
348
+ export declare function checkIsClaudeQuestionBlock(text: string): boolean;
349
+ /**
350
+ * @description Classify a user reply sent WHILE a selector is on screen. A
351
+ * "control" reply is meant to drive the selector in place — a bare option
352
+ * number (1–2 digits) or a single `y`/`n` — so it must be typed straight into
353
+ * the TUI with no Escape. Anything else (a sentence, a new instruction) is a
354
+ * free-form message: the bot first sends Escape to cancel the selector, then
355
+ * forwards it as a fresh turn. Kept pure + exported so the routing decision is
356
+ * unit-testable without a live tmux session.
357
+ */
358
+ export declare function checkIsSelectorControlReply(text: string): boolean;
359
+ /**
360
+ * @description A Claude CLI bare-digit survey scraped from the pane, ready for
361
+ * answerable delivery. Distinct from {@link ClaudeQuestion} (a real
362
+ * AskUserQuestion box): a survey is a fixed-shape one-keystroke prompt.
363
+ */
364
+ export interface ClaudeSurvey {
365
+ /** Header line, e.g. `How is Claude doing this session?`. */
366
+ header: string;
367
+ /** Options parsed from the inline `N: Label` row, in display order. */
368
+ options: ClaudeSurveyOption[];
369
+ /**
370
+ * Stable signature derived ONLY from header + option digits/labels — NOTHING
371
+ * volatile (no spinner glyph, no elapsed time, no surrounding pane). So the
372
+ * same survey across polls yields an identical signature → the bot emits it
373
+ * exactly once (mirrors {@link ClaudeQuestion.signature}).
374
+ */
375
+ signature: string;
376
+ }
377
+ /**
378
+ * @description AIRTIGHT detector for the Claude CLI bare-digit survey. Returns
379
+ * a survey ONLY when BOTH hold:
380
+ *
381
+ * 1. Some line, after stripping an optional leading `● ` bullet, matches
382
+ * {@link CLAUDE_SURVEY_HEADER_REGEX} ANCHORED start-to-end (the WHOLE
383
+ * line) — so a header quoted mid-sentence is rejected.
384
+ * 2. The IMMEDIATELY-FOLLOWING non-empty line is an inline option row
385
+ * ({@link CLAUDE_SURVEY_OPTION_ROW_REGEX}) parsing to ≥2 options.
386
+ *
387
+ * Kept fully SEPARATE from {@link extractClaudeQuestion} (the per-line
388
+ * AskUserQuestion selector): this is a lighter fixed-shape prompt. The
389
+ * signature is header + the option digits/labels only (no volatile chrome), so
390
+ * the same survey across polls de-dups to a single emit.
391
+ */
392
+ export declare function extractClaudeSurvey(text: string): ClaudeSurvey | null;
393
+ /** Whether `text` is confidently showing a Claude CLI bare-digit survey. */
394
+ export declare function checkIsClaudeSurvey(text: string): boolean;
395
+ /**
396
+ * @description Whether the poll loop should AUTO-DISMISS the survey on screen
397
+ * this poll (S4). True only when a survey is present AND its signature differs
398
+ * from the one we last dismissed — the survey repaints every poll, so the
399
+ * signature dedup makes us send the dismiss keystroke exactly ONCE per
400
+ * appearance, and re-dismiss a genuinely new survey later (the caller clears the
401
+ * stored signature when the survey leaves the pane). Pure + exported so the
402
+ * once-per-appearance rule is unit-testable without a live session.
403
+ */
404
+ export declare function checkShouldDismissSurvey(surveySignature: string | null, lastDismissedSignature: string): boolean;
405
+ /**
406
+ * @description Drop the survey's header + option-row lines from a relay chunk
407
+ * (S4) so the auto-dismissed survey's chrome never leaks into the topic — those
408
+ * lines match no tool/spinner/chrome rule and would otherwise classify as prose
409
+ * and post as a stray message. The CALLER gates this on a survey actually being
410
+ * detected on the pane this poll, so a legitimate "1: Yes 2: No" list in normal
411
+ * agent output is never stripped. Pure + exported for unit testing.
412
+ */
413
+ export declare function stripSurveyChromeLines(text: string): string;
414
+ /**
415
+ * @description One ordered tmux send-keys step the adapter will enqueue for a
416
+ * {@link ClaudeCliAdapter.sendInput} call. Extracted as a pure plan so the
417
+ * "no Enter" decision is unit-testable WITHOUT a live tmux session.
418
+ *
419
+ * - `literal` — `send-keys -l <input>` (the typed text, literal bytes);
420
+ * - `instantEnter` — `send-keys Enter` immediately (short control reply);
421
+ * - `slashEnter` — `send-keys Enter` deferred so the slash-popup settles;
422
+ * - `verifiedEnter` — `send-keys Enter` deferred past the paste-aggregation
423
+ * window, plus a post-Enter unsubmitted re-check (a plain prompt).
424
+ */
425
+ export type ClaudeSendKeyStep = 'literal' | 'instantEnter' | 'slashEnter' | 'verifiedEnter';
426
+ /**
427
+ * @description Pure plan of the tmux send-keys steps for one `sendInput` call.
428
+ *
429
+ * Mirrors the three historical Enter branches (bare slash command → deferred
430
+ * Enter; short control reply → instant Enter; plain prompt → paste-race
431
+ * deferred Enter + verification). When `appendEnter === false` ONLY the literal
432
+ * keystrokes are sent — every Enter branch is skipped (for a keystroke that
433
+ * auto-submits on its own). `appendEnter` defaults to `true`, so every existing
434
+ * caller's plan is byte-for-byte unchanged.
435
+ */
436
+ export declare function getClaudeSendKeysPlan(input: string, appendEnter: boolean): ClaudeSendKeyStep[];
437
+ /** Where a Claude text reply should be routed while a prompt may be on screen. */
438
+ export type ClaudeReplyRoute = 'selector' | 'loginPaste' | 'prompt';
439
+ /**
440
+ * @description Decide how to route a user TEXT reply for a Claude thread,
441
+ * given which interactive prompts are currently pending. Pure so the
442
+ * precedence is unit-testable.
443
+ *
444
+ * Precedence (a real AskUserQuestion always wins):
445
+ * 1. A selector (AskUserQuestion) pending + a bare control reply
446
+ * (digit / y / n) → `'selector'` (drive the menu in place).
447
+ * 2. Else the `/login` "Paste code here" box is on screen → `'loginPaste'`:
448
+ * the OAuth code is a long free-form string, so route it VERBATIM into
449
+ * the box (see {@link checkIsClaudeLoginPaste}). Without this it falls to
450
+ * `'prompt'`, whose Escape cancels the login flow and whose preamble
451
+ * corrupts the code (live bug: "login can't be done via the bot").
452
+ * 3. Else → `'prompt'` (a fresh turn; free-form prose breaks out of any
453
+ * pending prompt, mirroring the existing selector break-out behavior).
454
+ *
455
+ * Claude's native session SURVEY is NOT routed here: the adapter auto-dismisses
456
+ * it (Escape) and never surfaces it to the user, so a bare digit typed during a
457
+ * survey window falls through to `'prompt'` (or `'selector'` when a real
458
+ * question is also up) — never silently dropped.
459
+ */
460
+ export declare function getClaudeReplyRoute(input: {
461
+ isQuestionPending: boolean;
462
+ isLoginPastePending: boolean;
463
+ text: string;
464
+ }): ClaudeReplyRoute;
465
+ export declare function checkIsClaudeLoginPaste(paneText: string): boolean;
466
+ /**
467
+ * @description Per-session state for the streaming-table stabilizer (live
468
+ * incident 2026-06-11, plan `2026-06-11-claude-wide-table-content-loss`): the
469
+ * sharp-corner table block currently being held back, and how many polls it has
470
+ * been held. Held back because a wide markdown table RE-FLOWS its column widths
471
+ * as longer cells stream in, so every border/row line is byte-distinct between
472
+ * layouts → {@link getNewPaneContent} (line-SET diff) classifies the whole table
473
+ * "new" each poll and it would otherwise ship once per intermediate layout
474
+ * (empty skeleton → 1 row → full). We withhold the table until it settles, then
475
+ * emit the complete version exactly once.
476
+ */
477
+ interface StreamingTableState {
478
+ /** The full last-contiguous sharp-table block text seen on the previous poll. */
479
+ block: string;
480
+ /** Consecutive polls this table has been held without settling — runaway guard. */
481
+ heldPolls: number;
482
+ }
483
+ /**
484
+ * @description The action {@link getTableStabilizationDecision} tells the poll
485
+ * loop to take for a re-flowing sharp-corner table.
486
+ *
487
+ * - `none` — no table in flux; emit the poll's delta as usual.
488
+ * - `hold` — the table is still laying out; mask its lines out of this poll's
489
+ * delta ({@link maskSharpTableLines}) so no intermediate frame ships,
490
+ * and carry `nextStreamingTable` forward.
491
+ * - `emit` — the table is DONE (prose follows it / the turn went idle / the
492
+ * safety cap fired); emit `block` once via the normal fence path and
493
+ * clear the held state.
494
+ */
495
+ interface TableStabilizationDecision {
496
+ kind: 'none' | 'hold' | 'emit';
497
+ /** The complete table block to emit, set only for `kind: 'emit'`. */
498
+ block: string | null;
499
+ /** Held state to store back on the session (null clears it). */
500
+ nextStreamingTable: StreamingTableState | null;
501
+ }
502
+ /**
503
+ * @description Find the LAST contiguous sharp-corner (markdown) table block in a
504
+ * full pane snapshot, or `null` when none is present. Returns the raw block text
505
+ * so the stabilizer can compare it across polls. Pure + exported for unit tests.
506
+ */
507
+ export declare function getLastSharpTableBlock(content: string): string | null;
508
+ /**
509
+ * @description Whether any REAL prose line follows the last sharp-corner table in
510
+ * the pane — the "the table is done, content moved past it" signal the stabilizer
511
+ * uses to emit the held table BEFORE that trailing prose (preserving order).
512
+ *
513
+ * Deliberately CONSERVATIVE (errs toward `false`): a line after the table counts
514
+ * as content only when it is none of the recognised non-content shapes —
515
+ * blank/whitespace, another sharp-table line, TUI chrome
516
+ * ({@link checkIsClaudeChromeLine} — covers the `❯ …` input box and its `───`
517
+ * rules, box-drawing borders, the `⏵⏵ bypass permissions…` footer, nav hints),
518
+ * any progress/spinner/sub-agent frame ({@link checkIsProgressChunk} per line),
519
+ * a live spinner tick ({@link SPINNER_TICK_RE}), a `✻ … for Ns` post-thinking
520
+ * trailer ({@link POST_THINKING_TRAILER_RE}), or a `Thinking for Ns…` header
521
+ * ({@link THINKING_HEADER_RE}). Reuses the SAME predicates the relay already
522
+ * trusts as chrome — it never invents a looser matcher — so it cannot
523
+ * false-positive on the input box / spinner / trailers (the failure mode that
524
+ * would emit a table prematurely). The turn-idle signal and the hold safety cap
525
+ * are the backstops when this stays `false`. Pure + exported for unit tests.
526
+ */
527
+ export declare function checkHasContentAfterLastSharpTable(content: string): boolean;
528
+ /**
529
+ * @description Drop every sharp-corner table line from a poll's delta text so a
530
+ * mid-layout table frame never ships while the stabilizer is holding the table.
531
+ * Only table-shaped lines are removed — surrounding prose streams as usual.
532
+ * Pure + exported for unit tests.
533
+ */
534
+ export declare function maskSharpTableLines(deltaText: string): string;
535
+ /**
536
+ * @description Decide what the poll loop does with a re-flowing sharp-corner
537
+ * table. A held table is emitted ONLY when the turn is genuinely DONE — never on
538
+ * a mere "byte-stable for one poll", because Claude streams a table in stages and
539
+ * briefly PAUSES at an intermediate row count (e.g. 4 rows), which is byte-stable
540
+ * across a poll yet not the final table. The old "stable one poll → emit" rule
541
+ * shipped that 4-row intermediate, then the table grew to 6 rows and shipped
542
+ * again → the topic got two tables (live incident 2026-06-15). Pure + exported
543
+ * for unit tests. Rules, in order:
544
+ *
545
+ * 1. no table in the pane: flush whatever was held, once (table scrolled away /
546
+ * message moved on); else no-op.
547
+ * 2. real PROSE now follows the table (`hasContentAfterTable`) AND the table's
548
+ * width has settled (`sameBlock` — byte-stable since the previous poll) → the
549
+ * table is done; emit it BEFORE that trailing prose (the poll loop withholds
550
+ * the prose this tick), so ordering is table-then-prose. A table still
551
+ * re-flowing wider while prose is already on the pane HOLDS instead — only the
552
+ * settled width ships (live flood 2026-07-04).
553
+ * 3. the turn is IDLE (`isTurnIdle`) → emit promptly (covers a table-only
554
+ * answer, which never gets trailing prose).
555
+ * 4. otherwise HOLD — update the held block and advance `heldPolls` only while
556
+ * the block is unchanged (a changed/new block resets the counter); past
557
+ * {@link maxTableHoldPolls} force-emit so a never-settling pane can't swallow
558
+ * the table forever. A still-busy table is held even when byte-identical
559
+ * across polls — that is exactly the mid-stream pause.
560
+ */
561
+ export declare function getTableStabilizationDecision(input: {
562
+ currentTable: string | null;
563
+ streamingTable: StreamingTableState | null;
564
+ hasContentAfterTable: boolean;
565
+ isTurnIdle: boolean;
566
+ }): TableStabilizationDecision;
567
+ /**
568
+ * @description Merge two same-language fenced blocks separated by NOTHING but
569
+ * blank line(s) into one continuous fence (#14). One logical tool output that
570
+ * {@link fenceToolResultBodies} split into multiple `getFenced` runs renders as
571
+ * two adjacent `<pre>` ({@link FENCE_REGEX} makes one per fence) — visually two
572
+ * boxes for one output. A NON-blank line between the fences (a `● Bash(…)`
573
+ * header, prose) BLOCKS the merge, so DIFFERENT tool calls stay separate; only
574
+ * blank-separated same-language fences are joined, keeping one blank inside.
575
+ * Languages must match (or both be empty) so a plain output block and a `ts`
576
+ * block are never fused.
577
+ */
578
+ export declare function mergeAdjacentFences(lines: string[]): string[];
579
+ /**
580
+ * @description Strip Claude TUI chrome from a pane diff and fence tool-result
581
+ * bodies, returning the cleaned text AND the tool-result kind still open at the
582
+ * end of the chunk. The caller (`pollOutput`) threads `toolKind` back in as the
583
+ * next poll's `incomingKind` so a slow command's orphan output is fenced (B2).
584
+ */
585
+ export declare function stripTuiElementsWithContext(text: string, incomingKind?: ToolResultKind | null): {
586
+ text: string;
587
+ toolKind: ToolResultKind | null;
588
+ };
589
+ /**
590
+ * @description Strip Claude TUI chrome and fence tool-result bodies (B2),
591
+ * returning just the cleaned text. Thin wrapper over
592
+ * {@link stripTuiElementsWithContext} for call sites (and tests) that don't
593
+ * thread the cross-poll tool kind.
594
+ */
595
+ export declare function stripTuiElements(text: string, incomingKind?: ToolResultKind | null): string;
596
+ /**
597
+ * @description Turn an absolute workDir into Claude's transcript-folder slug.
598
+ *
599
+ * Claude stores per-project transcripts under
600
+ * `~/.claude/projects/<slug>/<sessionUuid>.jsonl`, where the slug is the
601
+ * absolute path with every non-alphanumeric character replaced by `-`
602
+ * (e.g. `/home/user/src/telegramCode` → `-home-user-src-telegramCode`).
603
+ *
604
+ * The slug encoding is undocumented and could drift across Claude versions,
605
+ * so it is used only to *locate* the candidate folder — the authoritative
606
+ * correctness gate is the `recordedCwd === workDir` filter in
607
+ * {@link listClaudeSessionsForWorkDir}.
608
+ */
609
+ export declare function getClaudeProjectSlug(workDir: string): string;
610
+ /**
611
+ * @description Root of Claude's on-disk transcript store
612
+ * (`~/.claude/projects`). Single source for every path built from it —
613
+ * session listing, resume-context reads, and the sub-agent transcript scan.
614
+ */
615
+ export declare function getClaudeProjectsRoot(): string;
616
+ /**
617
+ * @description Absolute path of ONE session's transcript
618
+ * (`<projectsRoot>/<slug>/<sessionId>.jsonl`).
619
+ *
620
+ * Single source for the layout: both Claude backends resolve it for the
621
+ * watermark advance, the runtime-info read, the resume-context turns, and the
622
+ * reattach recap — a hand-built copy in any of them would silently read nothing
623
+ * if the layout ever drifts.
624
+ */
625
+ export declare function getClaudeTranscriptPath(workDir: string, sessionId: string): string;
626
+ /**
627
+ * @description Read the last `limit` conversational turns (user/assistant
628
+ * messages with renderable text, oldest→newest) from a Claude `.jsonl`
629
+ * transcript, for the resume context block.
630
+ *
631
+ * Exported and pure (filesystem-only) so it is unit-testable against a temp
632
+ * `.jsonl`. Streams the whole file via {@link parseClaudeTurnLine}, keeping only
633
+ * the last `limit` in a rolling window so a huge transcript stays cheap.
634
+ * Tolerates a half-written trailing line; a missing/unreadable file → `[]`.
635
+ */
636
+ export declare function readRecentClaudeTurns(filePath: string, limit: number): RecentTurn[];
637
+ /**
638
+ * @description Combined transcript read for the silent-reattach recap: ONE
639
+ * `fs.readFileSync` yields BOTH the missed-message count and the recap turn
640
+ * body, so the transcript is not read twice.
641
+ *
642
+ * - `missedCount` — renderable `type:'assistant'` turns appended AFTER byte
643
+ * `offset` (the seen-watermark = transcript size at the last turn end), counted
644
+ * over the `[offset, EOF)` byte tail. A torn leading line (offset mid-record)
645
+ * fails to parse and is skipped. `offset >= size` → `0` (nothing appended /
646
+ * transcript truncated or rewritten smaller).
647
+ * - `turns` — the last `limit` renderable turns of the WHOLE session (NOT just
648
+ * the missed region), identical to {@link readRecentClaudeTurns}.
649
+ * - `headOffset` — the transcript's CURRENT byte size (`buffer.length`), i.e.
650
+ * the watermark value meaning "everything currently on disk is accounted for".
651
+ * The reattach recap advances the persisted watermark to it for idempotency.
652
+ * Absent on an unreadable file (head unknown → the caller omits the watermark).
653
+ *
654
+ * Exported and pure (filesystem-only) so it is unit-testable. `fs.readFileSync`
655
+ * reads the whole file in one call (it handles short reads internally), so a
656
+ * large `[offset, EOF)` tail never loses its last lines to a partial `read` —
657
+ * the silent undercount a manual `Buffer.alloc` + `fs.readSync` would hit on
658
+ * exactly the long-downtime case this feature targets. A missing/unreadable
659
+ * file → `{ missedCount: 0, turns: [] }` (no `headOffset`).
660
+ */
661
+ export declare function readClaudeReattachTranscript(filePath: string, offset: number, limit: number): {
662
+ missedCount: number;
663
+ turns: RecentTurn[];
664
+ headOffset?: number;
665
+ };
666
+ /**
667
+ * @description List resumable Claude sessions for a workDir by reading the
668
+ * real `~/.claude/projects/<slug>/*.jsonl` transcripts.
669
+ *
670
+ * Exported and pure (filesystem-only, no tmux/adapter boot) so it can be
671
+ * unit-tested against a temp `projectsRoot`. Steps:
672
+ *
673
+ * 1. Resolve `<projectsRoot>/<slug>`; if missing → `[]`.
674
+ * 2. Take the {@link sessionsParseLimit} most-recently-modified `.jsonl`.
675
+ * 3. Parse each; KEEP only files whose recorded cwd === `workDir`
676
+ * (the load-bearing correctness gate — slug collisions / version drift).
677
+ * 4. id = filename stem, MUST pass {@link checkIsValidUuid} (else skip).
678
+ * 5. title = summaryTitle ?? firstMeaningfulPrompt ?? id (trimmed, capped).
679
+ * `summaryTitle` is legacy (current Claude no longer writes it); the
680
+ * primary source is the first REAL prompt topic
681
+ * ({@link getSessionTitleCandidate}) — preamble/marker stripped, tooling
682
+ * noise skipped — NOT the last (often noise) prompt. A session with no
683
+ * meaningful prompt (all turns were command echoes / noise) falls back to
684
+ * the bare id. updatedAt = file mtime; createdAt = first timestamp ?? mtime.
685
+ *
686
+ * Result is newest-first by mtime.
687
+ */
688
+ export declare function listClaudeSessionsForWorkDir(projectsRoot: string, workDir: string): AgentSession[];
689
+ /**
690
+ * @description Whether `input` is a bare slash command (matches
691
+ * {@link BARE_SLASH_COMMAND_RE} after trimming). Exported so the
692
+ * popup-settle decision is unit-testable without a live tmux session.
693
+ */
694
+ export declare function checkIsBareSlashCommand(input: string): boolean;
695
+ /**
696
+ * @description Whether Claude is mid-turn, judged from a captured pane. A
697
+ * selector/permission prompt shows `Esc to cancel`, NOT `esc to interrupt`, so
698
+ * it reads as idle here (correct — we only wait out a running turn). Only the
699
+ * footer tail is inspected ({@link CLAUDE_BUSY_FOOTER_TAIL_LINES}) and the hint
700
+ * must carry footer chrome ({@link CLAUDE_BUSY_FOOTER_RE}), so scrollback prose
701
+ * mentioning the phrase can't false-positive. Exported so the busy detection is
702
+ * unit-testable without a live tmux session.
703
+ */
704
+ export declare function checkIsClaudeBusy(paneText: string): boolean;
705
+ /**
706
+ * @description Sync, in-memory "is this session mid-turn?" decision for the
707
+ * scheduler's wait-for-idle loop ({@link AgentAdapter.checkIsBusy}). Reuses the
708
+ * SAME pane predicate {@link interruptAndWaitIdle} polls
709
+ * ({@link checkIsClaudeBusy} on the `esc to interrupt` footer), evaluated
710
+ * against the session's last CLEANED pane content instead of a fresh `tmux`
711
+ * call — so it stays synchronous and adds no tmux load. The cleaned text is
712
+ * load-bearing: the raw `-e` capture carries ANSI/SGR runs that can split the
713
+ * footer marker mid-word and make the regex miss (the predicate's other
714
+ * callers read plain no-`-e` captures for the same reason). A dead/missing
715
+ * session is never busy. Exported pure so the gate is unit-testable without a
716
+ * live session.
717
+ */
718
+ export declare function checkIsClaudeSessionBusy(args: {
719
+ isActive: boolean;
720
+ lastContent: string;
721
+ }): boolean;
722
+ /**
723
+ * @description Whether a cleaned output frame is nothing but the TUI input box
724
+ * echoing typed text (`❯ <draft>`). The poll can catch the input row between
725
+ * the literal-text keystrokes and the deferred submit Enter (B5 window), and
726
+ * that draft echo is pure noise in Telegram — the user already sees their own
727
+ * message (B7).
728
+ *
729
+ * A frame is an echo when its FIRST non-empty line starts with `❯` AND no line
730
+ * carries a content marker (`●`, `⎿`, or a ``` ``` ``` fence). The old
731
+ * predicate required EVERY line to start with `❯`, but a long draft wraps in
732
+ * the input box so only the first row carries `❯` and the continuation rows are
733
+ * plain — those frames leaked into the topic (B7b). Anchoring on the first line
734
+ * + a content-marker veto keeps a `❯` inside real tool output (e.g. a pane
735
+ * capture printed by a Bash command) classified as content, not an echo.
736
+ *
737
+ * MAINTENANCE — Claude Code's TUI rendering drifts between versions, back and
738
+ * forth (the prompt glyph, the echo indentation, the content markers — e.g. the
739
+ * `●`→`⏺` bullet change noted in `utils/claudeScrapeShapes.ts`). This detector
740
+ * must tolerate ALL known formatting variants, not assume the current one: when
741
+ * an echo starts leaking into the topic, WIDEN the predicate to also cover the
742
+ * new shape (keep the old variants), don't swap one shape for another.
743
+ */
744
+ export declare function checkIsInputEchoFrame(frameText: string): boolean;
745
+ /**
746
+ * @description CONTENT-based echo gate (S1), complementing the shape-only
747
+ * {@link checkIsInputEchoFrame}. The bot types the user's prompt into the Claude
748
+ * TUI and Claude echoes it back in the pane; when that echo carries NO `❯`
749
+ * (a wrapped continuation row, the `[Telegram thread context]` preamble, or the
750
+ * tail of a long voice transcript) the shape gate misses it and it leaks into
751
+ * the topic as a ghost "bot message" (live 2026-06-28).
752
+ *
753
+ * A cleaned frame is the user's own echo when EITHER:
754
+ * - it carries the deterministic thread-context preamble signature (the
755
+ * `[Telegram thread context]` header — the agent never emits that itself), OR
756
+ * - its normalized text is a contiguous slice of the normalized forwarded text
757
+ * (a prefix, suffix, or interior run) of at least
758
+ * {@link claudeEchoMinMatchChars} — i.e. the whole frame is nothing but a
759
+ * chunk of what we just typed.
760
+ *
761
+ * The containment DIRECTION is load-bearing: the FRAME must be contained in the
762
+ * forwarded text, never the reverse — so a genuine reply that QUOTES part of the
763
+ * prompt and then adds an answer is NOT a substring of the prompt and is kept.
764
+ * The caller additionally gates this on a short post-forward time window.
765
+ *
766
+ * WIDENED (live 2026-07-06): the poll can catch the just-submitted
767
+ * echo's wrapped row GLUED to the new turn's first spinner tick in ONE frame
768
+ * (`<echo row>\n\n* Twisting…`). The glued chrome is not part of the forwarded
769
+ * text, so whole-frame containment failed and the row leaked as a permanent
770
+ * message. When the whole frame misses, transient-shaped lines (per-line
771
+ * {@link checkIsStatusOutput}) are dropped and the remaining content is
772
+ * re-tested — only a frame whose real content is nothing but a slice of the
773
+ * forwarded text is suppressed, so an answer glued to a spinner is still kept.
774
+ *
775
+ * Pure + exported so every observed echo variant is unit-testable. MAINTENANCE:
776
+ * like {@link checkIsInputEchoFrame}, WIDEN (never swap) when a new echo shape
777
+ * leaks — keep the old variants.
778
+ */
779
+ export declare function checkIsForwardedEcho(frameText: string, forwardedText: string): boolean;
780
+ /**
781
+ * @description Whether a captured pane looks like the typed prompt is still
782
+ * sitting UNSUBMITTED in Claude's live input box (the B5 paste-race symptom).
783
+ *
784
+ * Submission predicate (the load-bearing "did it submit?" check): a prompt has
785
+ * submitted iff EITHER Claude went busy (`esc to interrupt` in the footer — the
786
+ * turn started) OR the live input box at the bottom is empty (`❯ ` with no
787
+ * text — Claude consumed the input and is idle again, e.g. a fast/no-op turn).
788
+ * It looks UNSUBMITTED only when Claude is idle AND the last `❯`-led input row
789
+ * still carries the typed text. We deliberately key on the LAST `❯` line: a
790
+ * SUBMITTED prompt echoes as a `❯ <text>` user-turn block in scrollback, but
791
+ * the live input box below it is the final `❯` line and is empty — so matching
792
+ * the last one ignores the harmless scrollback echo.
793
+ *
794
+ * Tradeoff (locked in plan B5): if a single verification capture is ambiguous
795
+ * we err toward reporting unsubmitted and let the caller retry Enter once — a
796
+ * duplicate Enter on an already-submitted prompt is a harmless no-op in the
797
+ * Claude TUI (submits an empty input = ignored), whereas a missed submit silently
798
+ * loses the user's message.
799
+ *
800
+ * Exported so the predicate is unit-testable without a live tmux session.
801
+ */
802
+ export declare function checkLooksUnsubmitted(paneText: string, typedText: string): boolean;
803
+ /**
804
+ * @description Find the ONE line in a scraped pane that is a terminal
805
+ * provider / auth error, or `null` if none. `content` is `cleanOutput(raw)`,
806
+ * which RETAINS the `⎿` result marker. Three accepted shapes:
807
+ * a) `API Error: …` at line start — the classic provider row
808
+ * (`API Error: … (not your usage limit) · Rate limited`).
809
+ * b) a `⎿` result row that also contains `API Error:`
810
+ * (`⎿ overloaded · API Error: 429` — the render the old start-anchored gate
811
+ * MISSED, which is why a `⎿`-prefixed rate-limit never auto-retried).
812
+ * c) a `⎿` result row whose content LEADS with an auth phrase
813
+ * (`⎿ Not logged in · Please run /login` — the logged-out render).
814
+ * d) a row whose content LEADS with a usage/session-limit phrase AND reads like
815
+ * an error ({@link CLAUDE_LIMIT_ROW_SHAPE_RE}) — `You've hit your session
816
+ * limit · resets 10:50pm (UTC)` carries no `API Error:` marker at all, so
817
+ * (a)–(c) all missed it.
818
+ * FALSE-POSITIVE GUARD: prose never starts a line with the `⎿` glyph nor with
819
+ * `API Error:`. But TOOL results (Bash/Read/Grep output) ARE rendered by the TUI
820
+ * under a `⎿` marker, so a result row that QUOTES an auth phrase deeper in the
821
+ * line (the agent grepping the bot's own logs/source, or a `gh`/`npm` "not
822
+ * logged in" line) would fire case (c) if we matched the phrase anywhere. So (c)
823
+ * — and (d), for the same reason — anchor the phrase to the row START: a real
824
+ * error row leads with it; a quote embeds it after other text (live 2026-07-03).
825
+ * The returned line is fed VERBATIM to
826
+ * {@link classifyAgentApiError}. Exported for unit testing without a live tmux
827
+ * pane.
828
+ */
829
+ export declare function getClaudeAgentErrorLine(content: string): string | null;
830
+ /**
831
+ * @description Whether a captured pane shows the Claude TUI has finished
832
+ * booting and is ready to accept a typed slash command (S7 readiness signal).
833
+ *
834
+ * Ready means: the live input box `❯` is on screen AND no boot-time lifecycle
835
+ * gate is still up — neither the "Press Enter to continue" / login gate nor the
836
+ * bypass-permissions warning, both of which `handleAutoLifecycle` dismisses
837
+ * over the next polls. We do NOT require idle: a fresh spawn is idle, and
838
+ * gating on "not busy" would only delay the re-apply past the box first
839
+ * appearing. Keeping the predicate to "input box up, no lifecycle gate" matches
840
+ * the single observable moment the box first accepts keys. Exported for unit
841
+ * testing without a live tmux pane.
842
+ */
843
+ export declare function checkIsClaudePromptReady(paneText: string): boolean;
844
+ /**
845
+ * @description Pure decision for the seen-watermark advance: persist the
846
+ * transcript's current EOF as "relayed live up to here" whenever the input box
847
+ * is ready AND the file grew past the last persisted offset — busy or idle.
848
+ *
849
+ * S7 dropped the old `!isBusy` gate. A live Claude adapter relays the pane on
850
+ * EVERY poll, so EOF-on-growth already means "shown up to here" mid-turn, not
851
+ * only at turn end; the old idle-only advance left the watermark at the previous
852
+ * turn end all through a multi-message turn, so a mid-turn restart re-counted
853
+ * every already-relayed message as a false "missed N" (live 2026-07-04). The
854
+ * `isReady` gate stays (don't advance before the box is up / while a boot or
855
+ * lifecycle gate is on screen — that isn't a settled relay), and the growth
856
+ * guard (`eof > lastOffset`) stays so idle metadata rewrites cost no write and a
857
+ * smaller rewrite never rewinds the monotonic anchor. `isBusy` is accepted so
858
+ * the caller passes the poll's busy flag and the truth table documents that busy
859
+ * no longer blocks; it is intentionally unread.
860
+ *
861
+ * Exported so the truth table is unit-testable without a live tmux;
862
+ * {@link ClaudeCliAdapter.advanceClaudeWatermarkIfGrown} is the thin fs+writer
863
+ * wrapper. Callers pass `lastOffset = session.lastWatermarkOffset ?? -1` so a
864
+ * never-advanced session writes on its first ready poll.
865
+ */
866
+ export declare function checkShouldAdvanceWatermark(args: {
867
+ isBusy: boolean;
868
+ isReady: boolean;
869
+ eof: number;
870
+ lastOffset: number;
871
+ }): boolean;
872
+ /**
873
+ * @description Whether Claude is doing work that must NOT be interrupted: a
874
+ * running sub-agent (Escape would kill the child) or an in-flight compaction
875
+ * (Escape would abort it and lose the summary). In these states the caller
876
+ * forwards the prompt without Escape so it queues behind the current turn and
877
+ * runs once the work finishes. Exported for unit testing without a live tmux.
878
+ */
879
+ export declare function checkIsClaudeUninterruptible(paneText: string): boolean;
880
+ export { getNewPaneContent, type NewPaneContent };
881
+ /**
882
+ * @description Input snapshot of one resume-seeding poll, fed to
883
+ * {@link getResumeSeedDecision}.
884
+ */
885
+ export interface ResumeSeedState {
886
+ /** Cleaned pane content captured on THIS poll. */
887
+ content: string;
888
+ /** Cleaned pane content captured on the PREVIOUS poll (empty before the first). */
889
+ prevContent: string;
890
+ /** Number of polls already spent in seeding mode (0 on the first seeding poll). */
891
+ polls: number;
892
+ }
893
+ /**
894
+ * @description Decide whether to stay in resume flood-suppression mode or exit.
895
+ *
896
+ * While `keepSeeding` is true, `pollOutput` advances the baseline but emits no
897
+ * conversation text, so the entire restored transcript Claude repaints on
898
+ * `--resume` is swallowed instead of dumped into the topic. We exit (and let
899
+ * the NEXT poll's diff be genuine new output) when either:
900
+ *
901
+ * - the pane is non-empty AND unchanged across two consecutive polls (the
902
+ * restored transcript finished painting — the common case), or
903
+ * - the hard cap {@link resumeSeedMaxPolls} is hit (paint stuttered forever;
904
+ * force-exit so a session can never be wedged into permanent silence).
905
+ *
906
+ * Pure + exported so the swallow → exit-on-stable → emit-new transition is
907
+ * unit-testable without a live tmux pane.
908
+ */
909
+ export declare function getResumeSeedDecision(state: ResumeSeedState): {
910
+ keepSeeding: boolean;
911
+ };
912
+ export declare class ClaudeCliAdapter extends EventEmitter implements AgentAdapter {
913
+ readonly name = "claude";
914
+ readonly label = "Claude Code";
915
+ readonly outputsDeltas = true;
916
+ readonly selfGreetsOnStart = true;
917
+ /**
918
+ * Map of serialised `SessionKey` (`"<chatId>:<threadId>"`) → live session.
919
+ * Keyed by string rather than `SessionKey` object so map lookups work — JS
920
+ * Map compares object identity, not structural equality.
921
+ */
922
+ private sessions;
923
+ /**
924
+ * Per-thread display-prefs reader, injected by the bot at boot via
925
+ * `createAdapter.registerDisplayPrefsReader` (S4; same idiom as the OpenCode
926
+ * adapter). Consulted on the poll hot path: the relay branches each chunk's
927
+ * tool / panel segments on `toolResults` (S4), and the transcript scan
928
+ * fast-forwards (non-`full` `subagent`) or streams (`full`). `null` until
929
+ * wired → reads fall back to all-fields-`minimal`.
930
+ */
931
+ private displayPrefsReader;
932
+ /** @description Inject the per-thread display-prefs reader (see the field's JSDoc). */
933
+ setDisplayPrefsReader(reader: DisplayPrefsReader): void;
934
+ /** Per-thread locale reader, injected at boot via `createAdapter.registerThreadLocaleReader`. */
935
+ private threadLocaleReader;
936
+ /** @description Inject the per-thread locale reader (for adapter-side `t(...)` calls). */
937
+ setThreadLocaleReader(reader: ThreadLocaleReader): void;
938
+ /** @description Run `fn` inside the thread's locale context so `t(...)` resolves correctly. */
939
+ private tl;
940
+ /**
941
+ * Per-thread seen-watermark writer, injected by the bot at boot via
942
+ * `createAdapter.registerSeenWatermarkWriter`. Called on every idle+ready poll
943
+ * whose transcript EOF grew past the last persisted offset (via
944
+ * {@link ClaudeCliAdapter.advanceClaudeWatermarkIfGrown}) to persist the new
945
+ * EOF. `null` until wired → {@link advanceSeenWatermark} is a no-op.
946
+ */
947
+ private seenWatermarkWriter;
948
+ /** @description Inject the per-thread seen-watermark writer (see the field's JSDoc). */
949
+ setSeenWatermarkWriter(writer: SeenWatermarkWriter): void;
950
+ /** @description Advance the persisted seen-watermark for `key` (no-op until the
951
+ * writer is wired). */
952
+ private advanceSeenWatermark;
953
+ /**
954
+ * @description Advance the seen-watermark to the transcript's current EOF when
955
+ * the input box is ready and the file grew since the last write (S7) — the
956
+ * fs+writer wrapper around {@link checkShouldAdvanceWatermark}. Called every
957
+ * non-seeding poll with the poll's `isBusy` / `isReady`; it early-returns only
958
+ * on a NOT-ready poll BEFORE the `fs.stat` (a boot / lifecycle-gate frame isn't
959
+ * a settled relay). S7 dropped the busy early-return so a BUSY-but-ready poll
960
+ * mid-turn advances too — the pane is relayed every poll, so tracking EOF as it
961
+ * grows keeps the watermark at "relayed up to here" instead of stranding it at
962
+ * the previous turn end (the mid-turn false-"missed N" fix). It still writes
963
+ * only when EOF actually grew — so idle metadata churn (Claude rewrites
964
+ * `last-prompt`/`mode`/… for hours) costs no more than one bounded write per
965
+ * real growth, and a smaller rewrite never rewinds the in-memory anchor
966
+ * (monotonic). Best-effort — a transcript not yet on disk (UUID just born)
967
+ * leaves the watermark where it was, the next poll re-tries. The path resolves
968
+ * the same way {@link getRecentTurns} / {@link getReattachRecap} do.
969
+ */
970
+ private advanceClaudeWatermarkIfGrown;
971
+ /** @description Resolve the thread's full display prefs, defaulting every
972
+ * field to `minimal` for any read before the bot wires the reader at boot. */
973
+ private getDisplayPrefs;
974
+ /** @description Resolve the thread's `/subagent` mode (consulted by the
975
+ * transcript-tail scan), via the full prefs reader. */
976
+ private getSubagentMode;
977
+ private createSession;
978
+ private enqueueTmux;
979
+ private enqueueTmuxBestEffort;
980
+ private stopSessionInternal;
981
+ /**
982
+ * @description Schedule the next `pollOutput` for a session. Audit S9 /
983
+ * #37: replaces `setInterval` so a slow `tmux capture-pane` cannot
984
+ * cause overlapping invocations. The handle is stored back on
985
+ * `session.pollTimer` so `stopSession` can cancel the next tick.
986
+ */
987
+ private schedulePoll;
988
+ /**
989
+ * @description Per-poll-tick scan of the session's on-disk sub-agent
990
+ * transcripts (`/subagent` on Claude, plan 2026-06-11 S3). Claude writes
991
+ * each Task-tool child transcript to
992
+ * `<projectsRoot>/<slug>/<claudeSessionId>/subagents/agent-<agentId>.jsonl`;
993
+ * the pure `claudeSubagentTail` helpers own all decisions — first-scan EOF
994
+ * seeding (no backlog replay on resume/adopt), compact-mode fast-forward
995
+ * without reading, and assistant-text-block extraction (child thinking /
996
+ * tool_use never rendered). In `full` mode every appended text block is
997
+ * emitted as a marked output (`meta.isSubagent`) which the bot renders as a
998
+ * standalone "🤖 ⤷" message outside the parent's continuation chain.
999
+ *
1000
+ * A missing dir (`ENOENT` — no sub-agent yet, or an older claude version)
1001
+ * short-circuits cheaply but still runs the empty scan, so the first-scan
1002
+ * flag flips and a transcript created later streams from byte 0. Any other
1003
+ * error is logged and swallowed here — this method must never reject, or
1004
+ * the rejection would escape `schedulePoll`'s void'd poll chain.
1005
+ */
1006
+ private scanSubagentTranscripts;
1007
+ /**
1008
+ * @description Snap a session's poll cadence back to base (S2). Called on
1009
+ * every explicit write (keystroke / signal) and on session start/resume so a
1010
+ * fresh prompt never waits up to {@link maxPollIntervalMs} for the next
1011
+ * capture — user-visible latency after a write must stay at base cadence.
1012
+ *
1013
+ * If a poll timer is already pending we re-arm it at the base delay so the
1014
+ * backed-off idle timer can't keep the next capture far in the future. The
1015
+ * existing {@link ClaudeSession.isPolling} guard is respected: a poll already
1016
+ * in flight will reschedule itself from the (now reset) delay, so we never
1017
+ * double-poll.
1018
+ */
1019
+ private resetPollCadence;
1020
+ startSession(key: SessionKey, workDir: string, args?: string, sessionId?: string): Promise<void>;
1021
+ stopSession(key: SessionKey): void;
1022
+ checkIsActive(key: SessionKey): boolean;
1023
+ checkIsBusy(key: SessionKey): boolean;
1024
+ getRuntimeInfo(key: SessionKey): Promise<AgentRuntimeInfo>;
1025
+ /**
1026
+ * @description Ms since the TUI pane last actually changed (raw `capture-pane`
1027
+ * differed), or `null` when there is no live session for this thread. Feeds
1028
+ * the bot's S2 pane-static idle net: a genuinely working agent repaints the
1029
+ * pane every second, so a large value means the agent is idle even if the
1030
+ * footer busy signal is stuck. `null` is never treated as idle.
1031
+ */
1032
+ getMsSincePaneChange(key: SessionKey): number | null;
1033
+ sendInput(key: SessionKey, input: string, options?: SendInputOptions): void;
1034
+ /**
1035
+ * @description Post-Enter verification for a plain prompt (B5). After a short
1036
+ * settle, capture the pane through the session queue and — if the prompt still
1037
+ * looks unsubmitted (see {@link checkLooksUnsubmitted}) — re-send Enter exactly
1038
+ * ONCE. No further retries: a duplicate Enter on an already-submitted prompt is
1039
+ * a harmless no-op, but an unbounded retry loop on a genuinely-stuck pane would
1040
+ * spam keystrokes. Same staleness guards as the deferred Enter.
1041
+ */
1042
+ private scheduleEnterVerification;
1043
+ sendSignal(key: SessionKey, signal: string): void;
1044
+ sendEnter(key: SessionKey): void;
1045
+ sendArrow(key: SessionKey, direction: 'Up' | 'Down'): void;
1046
+ sendTab(key: SessionKey): void;
1047
+ /**
1048
+ * @description S4: auto-dismiss the native Claude session-feedback survey by
1049
+ * sending a single Escape into the pane (Escape clears the survey overlay the
1050
+ * same way it dismisses a selector). Fire-and-forget through the session queue,
1051
+ * like {@link sendEscape}; the caller's {@link checkShouldDismissSurvey}
1052
+ * signature dedup guarantees it fires once per appearance. Never surfaced to
1053
+ * the topic — the survey must not occupy input / disrupt the scrape.
1054
+ */
1055
+ private dismissClaudeSurvey;
1056
+ sendEscape(key: SessionKey): void;
1057
+ /**
1058
+ * @description Interrupt the current turn, then wait until Claude is
1059
+ * actually idle before resolving, so the caller can type a fresh prompt
1060
+ * without it being queued behind the running turn.
1061
+ *
1062
+ * Sends a single Escape — which both cancels an on-screen selector AND
1063
+ * breaks Claude out of the "busy" state — then polls the pane footer until
1064
+ * the `esc to interrupt` hint clears. A fixed post-Escape delay was
1065
+ * unreliable: heavy extended-thinking turns take longer than the old 120 ms
1066
+ * to tear down, so the prompt landed while Claude was still busy and got
1067
+ * queued (the "voice message arrives before the interrupt, then the agent
1068
+ * waits" bug). On timeout we forward anyway rather than drop the message.
1069
+ *
1070
+ * Exception: if Claude is running a sub-agent or compacting context, we do
1071
+ * NOT interrupt — Escape would kill the child / abort the compaction. We
1072
+ * return without Escape so the caller's prompt queues behind the current
1073
+ * turn and runs once that work finishes.
1074
+ */
1075
+ interruptAndWaitIdle(key: SessionKey): Promise<void>;
1076
+ /**
1077
+ * @description Whether a selector is currently on screen. Backed by the same
1078
+ * `lastQuestionSignature` the output pump sets when it scrapes a question
1079
+ * block (see the `extractClaudeQuestion` call in the poll loop) — non-empty
1080
+ * means a question is being shown and awaiting an answer.
1081
+ */
1082
+ isQuestionPending(key: SessionKey): boolean;
1083
+ /**
1084
+ * @description Whether Claude's `/login` OAuth "paste the code" box is on
1085
+ * screen right now, read live off the last captured pane ({@link checkIsClaudeLoginPaste}).
1086
+ * No signature/de-dup is needed — nothing is emitted; this only answers
1087
+ * "should the next text reply be typed verbatim into the paste box?" when a
1088
+ * message arrives, so the bot skips the prompt path (Escape + preamble) that
1089
+ * would otherwise cancel the login and corrupt the code.
1090
+ */
1091
+ isLoginPastePending(key: SessionKey): boolean;
1092
+ /**
1093
+ * @description For Claude CLI, model switching is done via the /model slash command.
1094
+ * Sends "/model <modelId>" as input to the tmux session. Returns `null`
1095
+ * on success (best-effort: claude doesn't ack the change synchronously).
1096
+ * Audit S10 / #39: unified signature with OpenCode adapter.
1097
+ *
1098
+ * Unlike OpenCode, Claude has NO model-pref persistence — model switching is
1099
+ * a TUI keystroke with no on-disk pref to replay at next start. So with no
1100
+ * active session there is nothing to do but refuse, otherwise `sendInput`
1101
+ * silently no-ops and the caller would report a false "model set" success
1102
+ * (reachable today via the ungated numeric-pick path).
1103
+ */
1104
+ setModel(key: SessionKey, modelId: string): Promise<string | null>;
1105
+ getCurrentModel(_key: SessionKey): string | null;
1106
+ /**
1107
+ * @description Set the reasoning effort for this thread by typing claude's
1108
+ * native `/effort <level>` slash command into the running TUI.
1109
+ *
1110
+ * Plan 2026-05-30-effort-command / S3, D2/D6:
1111
+ *
1112
+ * - **Validation** is against the canonical Claude set (`getClaudeAvailableLevels`),
1113
+ * not per-model: the adapter can't read claude's live model after a
1114
+ * `/model` switch (`getCurrentModel` returns `null`), so we trust claude
1115
+ * to clamp an unsupported level for the actual model down to its nearest
1116
+ * supported one. Caller already filtered against the same canonical list
1117
+ * when building the picker.
1118
+ * - **Apply** is best-effort via {@link sendInput} (the keystroke path used
1119
+ * by `setModel`). Returns `null` immediately — claude's TUI doesn't
1120
+ * acknowledge the change synchronously and we don't poll-and-wait for it.
1121
+ * - **Persist** to the per-thread prefs file so the banner / `/effort`
1122
+ * picker survives a bot restart (claude's own settings.json is global).
1123
+ *
1124
+ * Returns a short notice instead of `null` when the session isn't running
1125
+ * (we still persist the choice so the next /claude picks it up in the
1126
+ * banner; live apply happens once the agent actually exists).
1127
+ */
1128
+ setEffort(key: SessionKey, level: string): Promise<string | null>;
1129
+ /**
1130
+ * @description Last bot-set effort for this thread, or `null` if none.
1131
+ *
1132
+ * Reads from the on-disk prefs file (not an in-memory cache): the file is
1133
+ * tiny and the read happens only on menu / banner refresh paths, so a
1134
+ * cache would just be drift surface. Whatever claude itself stores in
1135
+ * its global `settings.json` is invisible to us by design (D2).
1136
+ */
1137
+ getEffort(key: SessionKey): string | null;
1138
+ /**
1139
+ * @description ARM the thread's stored `/effort` choice for re-apply on a
1140
+ * FRESH TUI spawn (S7) — deferred, not typed immediately. claude persists
1141
+ * effort GLOBALLY in its own settings.json, so a fresh `startSession` /
1142
+ * `resumeSession` would otherwise inherit the last globally-set level —
1143
+ * possibly chosen in another topic.
1144
+ *
1145
+ * Timing is the whole point: a fresh tmux session returns the instant
1146
+ * `new-session` succeeds, while the claude TUI is still painting its boot
1147
+ * banner — typing into it then interleaves keystrokes with the paint and the
1148
+ * command sits unsubmitted (live bug 2026-06-05). So we do NOT type here; we
1149
+ * stash the level on `session.pendingEffortReapply` and let the poll loop
1150
+ * consume it the FIRST time the pane shows a ready input box
1151
+ * ({@link checkIsClaudePromptReady}). That readiness moment is strictly after
1152
+ * the banner paints and strictly before the box can echo a buffered prompt,
1153
+ * giving the required ordering (effort BEFORE buffered prompts) via the same
1154
+ * serial tmux queue.
1155
+ *
1156
+ * Called at the END of `startSession` / `resumeSession`. NOT called from
1157
+ * `adoptExistingTmuxSession` — that claude process survived the restart with
1158
+ * its in-TUI effort intact and may be mid-turn, so re-applying would be both
1159
+ * unnecessary and risk interleaving with a running stream.
1160
+ *
1161
+ * No stored pref → the bot's default (`defaultEffortLevel` = xhigh) is armed
1162
+ * instead of claude's own default, so a no-pref spawn types `/effort xhigh`
1163
+ * (claude clamps per model — same as a manual `/effort` or an explicit pref).
1164
+ * An explicit per-thread pref still wins and is armed verbatim.
1165
+ */
1166
+ private applyStoredEffortOnSpawn;
1167
+ /**
1168
+ * @description S7 consumption point: once the poll loop sees the TUI input
1169
+ * box is up and no boot gate is left, type the armed `/effort <level>` ONCE
1170
+ * and clear the pending flag (one-shot, can't fire twice). Reuses the exact
1171
+ * keystroke path a manual `/effort` uses ({@link sendInput} with its
1172
+ * bare-slash deferred-Enter handling) so there is no duplicate keystroke
1173
+ * logic. Enqueuing onto the session's serial tmux queue at this ready moment
1174
+ * guarantees the keystroke lands in a usable input box (not the boot paint)
1175
+ * and ahead of any buffered prompt the bot replays onto the same queue.
1176
+ */
1177
+ private consumePendingEffortReapply;
1178
+ /**
1179
+ * @description Effort levels offered by the `/effort` picker for Claude.
1180
+ *
1181
+ * Returns the canonical set unconditionally (plan D2). The `key` argument
1182
+ * is accepted for interface symmetry with OpenCode (whose set depends on
1183
+ * the per-thread current model) but is intentionally unused here.
1184
+ */
1185
+ getAvailableEffortLevels(_key: SessionKey): Promise<string[]>;
1186
+ getFullOutput(key: SessionKey, lines?: number): string | null;
1187
+ /**
1188
+ * @description Expose the Claude `--session-id` UUID for a live session.
1189
+ * The bot calls this right after `startSession()` so the UUID can be
1190
+ * persisted in state.json and reused on later resumes (plan §13.1, D14).
1191
+ */
1192
+ getClaudeSessionId(key: SessionKey): string | null;
1193
+ getSessions(_key: SessionKey, workDir: string): Promise<AgentSession[]>;
1194
+ /**
1195
+ * @description Read the last `limit` conversational turns of a resumable
1196
+ * Claude session for the resume context block. Resolves the same
1197
+ * `~/.claude/projects/<slug>/<sessionId>.jsonl` path the session listing uses
1198
+ * (`key` is unused — Claude scopes transcripts by folder, not by thread) and
1199
+ * delegates to the pure {@link readRecentClaudeTurns}. A missing transcript
1200
+ * (unknown / pruned UUID) yields `[]`, so the caller posts no context block.
1201
+ */
1202
+ getRecentTurns(_key: SessionKey, workDir: string, sessionId: string, limit: number): Promise<RecentTurn[]>;
1203
+ /**
1204
+ * @description Assemble the silent-reattach recap for Claude from the on-disk
1205
+ * transcript via ONE {@link readClaudeReattachTranscript} read: the
1206
+ * missed-message count is the assistant turns appended after the watermark
1207
+ * byte offset, the body is the last {@link resumeContextTurnLimit} turns, and
1208
+ * `isActive` is the best-effort in-memory busy flag (the just-adopted session
1209
+ * seeds `lastContent` from the current pane, so an `esc to interrupt` footer
1210
+ * reads as still-working). The offset is trusted only when the watermark's
1211
+ * `sessionId` matches the session being recapped — a stale watermark from a
1212
+ * different session (`/new`, `/sessions` resume keep the agent row) is treated
1213
+ * as unknown. A `null`/mismatched/offset-less watermark yields
1214
+ * `isWatermarkKnown: false` and `missedCount: 0` (the fallback recap), while
1215
+ * the body still shows the last turns.
1216
+ */
1217
+ getReattachRecap(key: SessionKey, workDir: string, sessionId: string, watermark: SeenWatermark | null): Promise<ReattachRecap>;
1218
+ /**
1219
+ * @description Resume a Claude session by UUID.
1220
+ *
1221
+ * Two fixes vs. the legacy implementation:
1222
+ *
1223
+ * 1. **Required `workDir`.** The old `resumeSession` fell back to
1224
+ * `process.env.WORK_DIR || '/workspace'`, which is wrong as soon as the
1225
+ * bot manages multiple folders. The bot now passes the correct workDir
1226
+ * from the thread binding.
1227
+ *
1228
+ * 2. **Use `--resume <uuid>` instead of `--resume` with no argument.** The
1229
+ * no-arg form opens an interactive picker that can't be driven from a
1230
+ * headless tmux pane, which manifested as a silent hang (see plan
1231
+ * §13.1, fix to claudeCliAdapter.ts:455). If Claude can't find the UUID
1232
+ * (history pruned, different machine), it just starts a new session;
1233
+ * we surface that to the user (T8 in plan §16.3).
1234
+ */
1235
+ resumeSession(key: SessionKey, workDir: string, sessionId: string, options?: ResumeSessionOptions): Promise<void>;
1236
+ /**
1237
+ * @description Pick up tmux sessions that outlived the bot process.
1238
+ *
1239
+ * Called by `bot.ts` on startup, BEFORE `bot.launch()`. Scans
1240
+ * `tmux list-sessions` for names matching our `claude-<chatId>-<threadId>`
1241
+ * convention. For each match, returns the parsed key + tmux session name —
1242
+ * the bot then decides which ones to re-adopt (must have a live binding in
1243
+ * state.json) and which are orphans to garbage-collect (plan §10.2 / §13.19, E1).
1244
+ *
1245
+ * This method does NOT itself adopt sessions: it has no knowledge of state.json
1246
+ * or which sessions are still bound. The actual re-attach is done by the bot
1247
+ * calling {@link adoptExistingTmuxSession} for each key it wants to keep.
1248
+ *
1249
+ * Returns an empty array if tmux isn't installed or no matching sessions exist.
1250
+ */
1251
+ listExistingTmuxSessions(): Promise<Array<{
1252
+ key: SessionKey;
1253
+ sessionName: string;
1254
+ }>>;
1255
+ /**
1256
+ * @description Recover the `--session-id <uuid>` flag from a live tmux
1257
+ * session's start command.
1258
+ *
1259
+ * Used by the bot's reattach loop to reconcile state with reality when
1260
+ * `state.agents[key]` is missing a `claudeSessionId` (or names a
1261
+ * different adapter) but a `claude-<chatId>-<threadId>` tmux session is
1262
+ * still running. Previously such cases were treated as orphans and the
1263
+ * tmux session was killed, throwing away the user's live work.
1264
+ *
1265
+ * Implementation: read `pane_start_command` for the session's first
1266
+ * pane and parse the UUID out via {@link parseClaudeSessionIdFromCommand}.
1267
+ * `pane_start_command` survives across restarts because tmux keeps the
1268
+ * original command line for the pane.
1269
+ *
1270
+ * Returns `null` if no UUID can be recovered (caller falls back to
1271
+ * killing the session as an orphan).
1272
+ */
1273
+ recoverSessionIdFromTmux(sessionName: string): Promise<string | null>;
1274
+ /**
1275
+ * @description Adopt a tmux session that survived a bot restart.
1276
+ *
1277
+ * The bot calls this after `listExistingTmuxSessions()` for each
1278
+ * `(key, sessionName)` pair it wants to keep alive. Restores the in-memory
1279
+ * `ClaudeSession` and resumes polling so output flows back to Telegram.
1280
+ *
1281
+ * `workDir` and `claudeSessionId` come from state.json (the bot keeps a
1282
+ * binding `(key → subdir, claudeSessionId)`). If we ever lose them, the
1283
+ * caller should kill the tmux session as an orphan instead.
1284
+ *
1285
+ * Returns `true` on success, `false` if the tmux session disappeared between
1286
+ * the `list` call and now (race with manual `tmux kill-session`).
1287
+ */
1288
+ adoptExistingTmuxSession(key: SessionKey, sessionName: string, workDir: string, claudeSessionId: string): Promise<boolean>;
1289
+ /**
1290
+ * @description Kill a tmux session by name without touching adapter state.
1291
+ *
1292
+ * The bot uses this on startup to garbage-collect orphan tmux sessions
1293
+ * (`claude-<chatId>-<threadId>` names with no corresponding binding in
1294
+ * state.json). See plan §10.2 / §13.19.
1295
+ */
1296
+ killOrphanTmuxSession(sessionName: string): Promise<void>;
1297
+ static parseTmuxSessionName: typeof parseTmuxSessionName;
1298
+ static buildTmuxSessionName: typeof buildTmuxSessionName;
1299
+ private probeSessionAlive;
1300
+ private pollOutput;
1301
+ /**
1302
+ * @description Emit a settled streaming table (S1) as ONE fenced `output`.
1303
+ *
1304
+ * Routes the held block through the SAME fence path as the inline table path
1305
+ * ({@link stripTuiElementsWithContext} fences a sharp-corner table) so the
1306
+ * `<pre>` rendering is byte-identical to today — only the TIMING/dedup change.
1307
+ * Records the raw block in {@link RecentRelayWindow} in the PANE-line domain
1308
+ * (pre-strip) so a later full repaint of the same table is suppressed by the
1309
+ * existing re-render dedup, exactly like the normal permanent-output path.
1310
+ * Emitted with `startsNewParagraph: true` — a table is its own visual block,
1311
+ * so it must not glue onto preceding prose in the append/draft join.
1312
+ */
1313
+ private emitStabilizedTable;
1314
+ /**
1315
+ * @description Auto-handle the two lifecycle prompts Claude can show — the
1316
+ * "Press Enter to continue" gate and the bypass-permissions warning — by
1317
+ * issuing the matching keystrokes. Extracted from {@link pollOutput} so the
1318
+ * resume-seeding path (which suppresses conversation TEXT) can still drive
1319
+ * these prompts; suppression must hide chatter, not the lifecycle.
1320
+ *
1321
+ * Also the detection seam for a terminal provider error / logged-out row
1322
+ * ({@link getClaudeAgentErrorLine}: `API Error: …`, `⎿ … · API Error: …`, or
1323
+ * `⎿ … Please run /login`): when it first classifies, emit one `apiError`
1324
+ * event — the trigger for the auto-retry (transient / usageLimit) OR the
1325
+ * surfaced logged-out notice (auth). Detection scans the NEW pane delta only
1326
+ * (never the full pane / arbitrary conversation text), so a recognized error
1327
+ * row fires exactly once — when it first renders.
1328
+ *
1329
+ * A large new chunk (`newPart.length > 50`) means real conversation moved on,
1330
+ * so the one-shot `handled*` guards are reset to re-arm for a later prompt.
1331
+ */
1332
+ private handleAutoLifecycle;
1333
+ private checkNeedsAutoEnter;
1334
+ private checkNeedsAutoAccept;
1335
+ }
1336
+ //# sourceMappingURL=claudeCliAdapter.d.ts.map