charness 3.7.0 → 3.9.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 (393) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DEVELOPMENT.md +8 -2
  3. package/README.md +5 -5
  4. package/SETUP.md +17 -5
  5. package/agent-plugin/skills/charness-manager/SKILL.md +3 -3
  6. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  7. package/dist/adapters/openCodeAdapter.js +2 -1
  8. package/dist/adapters/openCodeAdapter.js.map +1 -1
  9. package/dist/bot.d.ts.map +1 -1
  10. package/dist/bot.js +50 -9
  11. package/dist/bot.js.map +1 -1
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +56 -6
  15. package/dist/cli.js.map +1 -1
  16. package/dist/configDirFile.d.ts +7 -3
  17. package/dist/configDirFile.d.ts.map +1 -1
  18. package/dist/configDirFile.js +12 -5
  19. package/dist/configDirFile.js.map +1 -1
  20. package/dist/connectors/telegram/commands/botCore.d.ts +5 -1
  21. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
  22. package/dist/connectors/telegram/commands/runners.d.ts +52 -0
  23. package/dist/connectors/telegram/commands/runners.d.ts.map +1 -0
  24. package/dist/connectors/telegram/commands/runners.js +524 -0
  25. package/dist/connectors/telegram/commands/runners.js.map +1 -0
  26. package/dist/connectors/telegram/runnerPairingMessages.d.ts +29 -0
  27. package/dist/connectors/telegram/runnerPairingMessages.d.ts.map +1 -0
  28. package/dist/connectors/telegram/runnerPairingMessages.js +112 -0
  29. package/dist/connectors/telegram/runnerPairingMessages.js.map +1 -0
  30. package/dist/i18n/de.d.ts.map +1 -1
  31. package/dist/i18n/de.js +60 -0
  32. package/dist/i18n/de.js.map +1 -1
  33. package/dist/i18n/en.d.ts.map +1 -1
  34. package/dist/i18n/en.js +60 -0
  35. package/dist/i18n/en.js.map +1 -1
  36. package/dist/i18n/es.d.ts.map +1 -1
  37. package/dist/i18n/es.js +60 -0
  38. package/dist/i18n/es.js.map +1 -1
  39. package/dist/i18n/fr.d.ts.map +1 -1
  40. package/dist/i18n/fr.js +60 -0
  41. package/dist/i18n/fr.js.map +1 -1
  42. package/dist/i18n/hi.d.ts.map +1 -1
  43. package/dist/i18n/hi.js +60 -0
  44. package/dist/i18n/hi.js.map +1 -1
  45. package/dist/i18n/ja.d.ts.map +1 -1
  46. package/dist/i18n/ja.js +60 -0
  47. package/dist/i18n/ja.js.map +1 -1
  48. package/dist/i18n/ka.d.ts.map +1 -1
  49. package/dist/i18n/ka.js +60 -0
  50. package/dist/i18n/ka.js.map +1 -1
  51. package/dist/i18n/pt.d.ts.map +1 -1
  52. package/dist/i18n/pt.js +60 -0
  53. package/dist/i18n/pt.js.map +1 -1
  54. package/dist/i18n/ru.d.ts.map +1 -1
  55. package/dist/i18n/ru.js +60 -0
  56. package/dist/i18n/ru.js.map +1 -1
  57. package/dist/i18n/uk.d.ts.map +1 -1
  58. package/dist/i18n/uk.js +60 -0
  59. package/dist/i18n/uk.js.map +1 -1
  60. package/dist/i18n/uz.d.ts.map +1 -1
  61. package/dist/i18n/uz.js +60 -0
  62. package/dist/i18n/uz.js.map +1 -1
  63. package/dist/i18n/zh.d.ts.map +1 -1
  64. package/dist/i18n/zh.js +60 -0
  65. package/dist/i18n/zh.js.map +1 -1
  66. package/dist/index.d.ts +1 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +3 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/installManager.d.ts +57 -1
  71. package/dist/installManager.d.ts.map +1 -1
  72. package/dist/installManager.js +88 -10
  73. package/dist/installManager.js.map +1 -1
  74. package/dist/instanceSettings.d.ts +12 -2
  75. package/dist/instanceSettings.d.ts.map +1 -1
  76. package/dist/instanceSettings.js +17 -3
  77. package/dist/instanceSettings.js.map +1 -1
  78. package/dist/outputTrace.d.ts +6 -0
  79. package/dist/outputTrace.d.ts.map +1 -1
  80. package/dist/outputTrace.js +24 -1
  81. package/dist/outputTrace.js.map +1 -1
  82. package/dist/remoteRun/cliArgs.d.ts +2 -0
  83. package/dist/remoteRun/cliArgs.d.ts.map +1 -1
  84. package/dist/remoteRun/cliArgs.js +11 -2
  85. package/dist/remoteRun/cliArgs.js.map +1 -1
  86. package/dist/remoteRun/commands.d.ts +21 -0
  87. package/dist/remoteRun/commands.d.ts.map +1 -1
  88. package/dist/remoteRun/commands.js +38 -17
  89. package/dist/remoteRun/commands.js.map +1 -1
  90. package/dist/remoteRun/interrupts.d.ts +10 -0
  91. package/dist/remoteRun/interrupts.d.ts.map +1 -1
  92. package/dist/remoteRun/interrupts.js +43 -6
  93. package/dist/remoteRun/interrupts.js.map +1 -1
  94. package/dist/remoteRun/output.d.ts +2 -0
  95. package/dist/remoteRun/output.d.ts.map +1 -1
  96. package/dist/remoteRun/output.js +45 -0
  97. package/dist/remoteRun/output.js.map +1 -1
  98. package/dist/remoteRun/pairedRunners.d.ts +51 -0
  99. package/dist/remoteRun/pairedRunners.d.ts.map +1 -0
  100. package/dist/remoteRun/pairedRunners.js +165 -0
  101. package/dist/remoteRun/pairedRunners.js.map +1 -0
  102. package/dist/remoteRun/probe.d.ts +23 -1
  103. package/dist/remoteRun/probe.d.ts.map +1 -1
  104. package/dist/remoteRun/probe.js +45 -11
  105. package/dist/remoteRun/probe.js.map +1 -1
  106. package/dist/remoteRun/remoteRunCli.d.ts +13 -6
  107. package/dist/remoteRun/remoteRunCli.d.ts.map +1 -1
  108. package/dist/remoteRun/remoteRunCli.js +34 -59
  109. package/dist/remoteRun/remoteRunCli.js.map +1 -1
  110. package/dist/remoteRun/runnerClient.d.ts +2 -0
  111. package/dist/remoteRun/runnerClient.d.ts.map +1 -1
  112. package/dist/remoteRun/runnerClient.js +5 -1
  113. package/dist/remoteRun/runnerClient.js.map +1 -1
  114. package/dist/remoteRun/runnerSummary.d.ts +24 -0
  115. package/dist/remoteRun/runnerSummary.d.ts.map +1 -0
  116. package/dist/remoteRun/runnerSummary.js +86 -0
  117. package/dist/remoteRun/runnerSummary.js.map +1 -0
  118. package/dist/remoteRun/runnerWait.d.ts +68 -0
  119. package/dist/remoteRun/runnerWait.d.ts.map +1 -0
  120. package/dist/remoteRun/runnerWait.js +137 -0
  121. package/dist/remoteRun/runnerWait.js.map +1 -0
  122. package/dist/remoteRun/runnerWaitTiming.d.ts +16 -0
  123. package/dist/remoteRun/runnerWaitTiming.d.ts.map +1 -0
  124. package/dist/remoteRun/runnerWaitTiming.js +37 -0
  125. package/dist/remoteRun/runnerWaitTiming.js.map +1 -0
  126. package/dist/remoteRun/runners.d.ts +15 -8
  127. package/dist/remoteRun/runners.d.ts.map +1 -1
  128. package/dist/remoteRun/runners.js +59 -19
  129. package/dist/remoteRun/runners.js.map +1 -1
  130. package/dist/remoteRun/runnersCatalog.d.ts +14 -0
  131. package/dist/remoteRun/runnersCatalog.d.ts.map +1 -0
  132. package/dist/remoteRun/runnersCatalog.js +68 -0
  133. package/dist/remoteRun/runnersCatalog.js.map +1 -0
  134. package/dist/remoteRun/runnersConfig.d.ts +31 -20
  135. package/dist/remoteRun/runnersConfig.d.ts.map +1 -1
  136. package/dist/remoteRun/runnersConfig.js +14 -12
  137. package/dist/remoteRun/runnersConfig.js.map +1 -1
  138. package/dist/remoteRun/ssh.d.ts +22 -2
  139. package/dist/remoteRun/ssh.d.ts.map +1 -1
  140. package/dist/remoteRun/ssh.js +41 -7
  141. package/dist/remoteRun/ssh.js.map +1 -1
  142. package/dist/runnerUtility/adminCheck.d.ts +18 -0
  143. package/dist/runnerUtility/adminCheck.d.ts.map +1 -0
  144. package/dist/runnerUtility/adminCheck.js +69 -0
  145. package/dist/runnerUtility/adminCheck.js.map +1 -0
  146. package/dist/runnerUtility/adminService.d.ts +22 -0
  147. package/dist/runnerUtility/adminService.d.ts.map +1 -0
  148. package/dist/runnerUtility/adminService.js +145 -0
  149. package/dist/runnerUtility/adminService.js.map +1 -0
  150. package/dist/runnerUtility/appInstall.d.ts +25 -0
  151. package/dist/runnerUtility/appInstall.d.ts.map +1 -0
  152. package/dist/runnerUtility/appInstall.js +147 -0
  153. package/dist/runnerUtility/appInstall.js.map +1 -0
  154. package/dist/runnerUtility/appUpdate.d.ts +39 -0
  155. package/dist/runnerUtility/appUpdate.d.ts.map +1 -0
  156. package/dist/runnerUtility/appUpdate.js +90 -0
  157. package/dist/runnerUtility/appUpdate.js.map +1 -0
  158. package/dist/runnerUtility/execEnv.d.ts +21 -0
  159. package/dist/runnerUtility/execEnv.d.ts.map +1 -0
  160. package/dist/runnerUtility/execEnv.js +109 -0
  161. package/dist/runnerUtility/execEnv.js.map +1 -0
  162. package/dist/runnerUtility/execSession.d.ts +13 -0
  163. package/dist/runnerUtility/execSession.d.ts.map +1 -0
  164. package/dist/runnerUtility/execSession.js +58 -0
  165. package/dist/runnerUtility/execSession.js.map +1 -0
  166. package/dist/runnerUtility/hubClient.d.ts +30 -0
  167. package/dist/runnerUtility/hubClient.d.ts.map +1 -0
  168. package/dist/runnerUtility/hubClient.js +127 -0
  169. package/dist/runnerUtility/hubClient.js.map +1 -0
  170. package/dist/runnerUtility/injectStream.d.ts +9 -0
  171. package/dist/runnerUtility/injectStream.d.ts.map +1 -0
  172. package/dist/runnerUtility/injectStream.js +12 -0
  173. package/dist/runnerUtility/injectStream.js.map +1 -0
  174. package/dist/runnerUtility/iosCheck.d.ts +62 -0
  175. package/dist/runnerUtility/iosCheck.d.ts.map +1 -0
  176. package/dist/runnerUtility/iosCheck.js +200 -0
  177. package/dist/runnerUtility/iosCheck.js.map +1 -0
  178. package/dist/runnerUtility/launcher.d.ts +5 -0
  179. package/dist/runnerUtility/launcher.d.ts.map +1 -0
  180. package/dist/runnerUtility/launcher.js +85 -0
  181. package/dist/runnerUtility/launcher.js.map +1 -0
  182. package/dist/runnerUtility/linkLoop.d.ts +39 -0
  183. package/dist/runnerUtility/linkLoop.d.ts.map +1 -0
  184. package/dist/runnerUtility/linkLoop.js +274 -0
  185. package/dist/runnerUtility/linkLoop.js.map +1 -0
  186. package/dist/runnerUtility/localLinkStop.d.ts +23 -0
  187. package/dist/runnerUtility/localLinkStop.d.ts.map +1 -0
  188. package/dist/runnerUtility/localLinkStop.js +79 -0
  189. package/dist/runnerUtility/localLinkStop.js.map +1 -0
  190. package/dist/runnerUtility/machineReport.d.ts +39 -0
  191. package/dist/runnerUtility/machineReport.d.ts.map +1 -0
  192. package/dist/runnerUtility/machineReport.js +161 -0
  193. package/dist/runnerUtility/machineReport.js.map +1 -0
  194. package/dist/runnerUtility/packageId.d.ts +5 -0
  195. package/dist/runnerUtility/packageId.d.ts.map +1 -0
  196. package/dist/runnerUtility/packageId.js +64 -0
  197. package/dist/runnerUtility/packageId.js.map +1 -0
  198. package/dist/runnerUtility/pairArgs.d.ts +16 -0
  199. package/dist/runnerUtility/pairArgs.d.ts.map +1 -0
  200. package/dist/runnerUtility/pairArgs.js +17 -0
  201. package/dist/runnerUtility/pairArgs.js.map +1 -0
  202. package/dist/runnerUtility/pairingRecovery.d.ts +31 -0
  203. package/dist/runnerUtility/pairingRecovery.d.ts.map +1 -0
  204. package/dist/runnerUtility/pairingRecovery.js +24 -0
  205. package/dist/runnerUtility/pairingRecovery.js.map +1 -0
  206. package/dist/runnerUtility/pueueDaemon.d.ts +36 -0
  207. package/dist/runnerUtility/pueueDaemon.d.ts.map +1 -0
  208. package/dist/runnerUtility/pueueDaemon.js +165 -0
  209. package/dist/runnerUtility/pueueDaemon.js.map +1 -0
  210. package/dist/runnerUtility/rootServiceCli.d.ts +8 -0
  211. package/dist/runnerUtility/rootServiceCli.d.ts.map +1 -0
  212. package/dist/runnerUtility/rootServiceCli.js +31 -0
  213. package/dist/runnerUtility/rootServiceCli.js.map +1 -0
  214. package/dist/runnerUtility/runnerCli.d.ts +18 -0
  215. package/dist/runnerUtility/runnerCli.d.ts.map +1 -0
  216. package/dist/runnerUtility/runnerCli.js +190 -0
  217. package/dist/runnerUtility/runnerCli.js.map +1 -0
  218. package/dist/runnerUtility/runnerCommands.d.ts +76 -0
  219. package/dist/runnerUtility/runnerCommands.d.ts.map +1 -0
  220. package/dist/runnerUtility/runnerCommands.js +464 -0
  221. package/dist/runnerUtility/runnerCommands.js.map +1 -0
  222. package/dist/runnerUtility/runnerConfig.d.ts +63 -0
  223. package/dist/runnerUtility/runnerConfig.d.ts.map +1 -0
  224. package/dist/runnerUtility/runnerConfig.js +153 -0
  225. package/dist/runnerUtility/runnerConfig.js.map +1 -0
  226. package/dist/runnerUtility/runnerFlags.d.ts +9 -0
  227. package/dist/runnerUtility/runnerFlags.d.ts.map +1 -0
  228. package/dist/runnerUtility/runnerFlags.js +53 -0
  229. package/dist/runnerUtility/runnerFlags.js.map +1 -0
  230. package/dist/runnerUtility/runnerHome.d.ts +30 -0
  231. package/dist/runnerUtility/runnerHome.d.ts.map +1 -0
  232. package/dist/runnerUtility/runnerHome.js +82 -0
  233. package/dist/runnerUtility/runnerHome.js.map +1 -0
  234. package/dist/runnerUtility/runnerKeys.d.ts +11 -0
  235. package/dist/runnerUtility/runnerKeys.d.ts.map +1 -0
  236. package/dist/runnerUtility/runnerKeys.js +80 -0
  237. package/dist/runnerUtility/runnerKeys.js.map +1 -0
  238. package/dist/runnerUtility/runnerServers.d.ts +40 -0
  239. package/dist/runnerUtility/runnerServers.d.ts.map +1 -0
  240. package/dist/runnerUtility/runnerServers.js +79 -0
  241. package/dist/runnerUtility/runnerServers.js.map +1 -0
  242. package/dist/runnerUtility/serviceCommon.d.ts +97 -0
  243. package/dist/runnerUtility/serviceCommon.d.ts.map +1 -0
  244. package/dist/runnerUtility/serviceCommon.js +209 -0
  245. package/dist/runnerUtility/serviceCommon.js.map +1 -0
  246. package/dist/runnerUtility/serviceManager.d.ts +51 -0
  247. package/dist/runnerUtility/serviceManager.d.ts.map +1 -0
  248. package/dist/runnerUtility/serviceManager.js +344 -0
  249. package/dist/runnerUtility/serviceManager.js.map +1 -0
  250. package/dist/runnerUtility/serviceUnits.d.ts +38 -0
  251. package/dist/runnerUtility/serviceUnits.d.ts.map +1 -0
  252. package/dist/runnerUtility/serviceUnits.js +189 -0
  253. package/dist/runnerUtility/serviceUnits.js.map +1 -0
  254. package/dist/runnerUtility/toolInstall.d.ts +95 -0
  255. package/dist/runnerUtility/toolInstall.d.ts.map +1 -0
  256. package/dist/runnerUtility/toolInstall.js +232 -0
  257. package/dist/runnerUtility/toolInstall.js.map +1 -0
  258. package/dist/runnerUtility/versionPollTiming.d.ts +16 -0
  259. package/dist/runnerUtility/versionPollTiming.d.ts.map +1 -0
  260. package/dist/runnerUtility/versionPollTiming.js +36 -0
  261. package/dist/runnerUtility/versionPollTiming.js.map +1 -0
  262. package/dist/runners/authorizedKeys.d.ts +52 -0
  263. package/dist/runners/authorizedKeys.d.ts.map +1 -0
  264. package/dist/runners/authorizedKeys.js +153 -0
  265. package/dist/runners/authorizedKeys.js.map +1 -0
  266. package/dist/runners/bootstrapLine.d.ts +13 -0
  267. package/dist/runners/bootstrapLine.d.ts.map +1 -0
  268. package/dist/runners/bootstrapLine.js +154 -0
  269. package/dist/runners/bootstrapLine.js.map +1 -0
  270. package/dist/runners/gate.d.ts +41 -0
  271. package/dist/runners/gate.d.ts.map +1 -0
  272. package/dist/runners/gate.js +225 -0
  273. package/dist/runners/gate.js.map +1 -0
  274. package/dist/runners/gateLink.d.ts +26 -0
  275. package/dist/runners/gateLink.d.ts.map +1 -0
  276. package/dist/runners/gateLink.js +240 -0
  277. package/dist/runners/gateLink.js.map +1 -0
  278. package/dist/runners/gateProtocol.d.ts +104 -0
  279. package/dist/runners/gateProtocol.d.ts.map +1 -0
  280. package/dist/runners/gateProtocol.js +151 -0
  281. package/dist/runners/gateProtocol.js.map +1 -0
  282. package/dist/runners/gateWrapper.d.ts +6 -0
  283. package/dist/runners/gateWrapper.d.ts.map +1 -0
  284. package/dist/runners/gateWrapper.js +70 -0
  285. package/dist/runners/gateWrapper.js.map +1 -0
  286. package/dist/runners/hubAddress.d.ts +33 -0
  287. package/dist/runners/hubAddress.d.ts.map +1 -0
  288. package/dist/runners/hubAddress.js +88 -0
  289. package/dist/runners/hubAddress.js.map +1 -0
  290. package/dist/runners/hubAddressCandidates.d.ts +16 -0
  291. package/dist/runners/hubAddressCandidates.d.ts.map +1 -0
  292. package/dist/runners/hubAddressCandidates.js +96 -0
  293. package/dist/runners/hubAddressCandidates.js.map +1 -0
  294. package/dist/runners/hubIds.d.ts +16 -0
  295. package/dist/runners/hubIds.d.ts.map +1 -0
  296. package/dist/runners/hubIds.js +25 -0
  297. package/dist/runners/hubIds.js.map +1 -0
  298. package/dist/runners/hubKey.d.ts +6 -0
  299. package/dist/runners/hubKey.d.ts.map +1 -0
  300. package/dist/runners/hubKey.js +78 -0
  301. package/dist/runners/hubKey.js.map +1 -0
  302. package/dist/runners/hubLock.d.ts +7 -0
  303. package/dist/runners/hubLock.d.ts.map +1 -0
  304. package/dist/runners/hubLock.js +230 -0
  305. package/dist/runners/hubLock.js.map +1 -0
  306. package/dist/runners/hubPackage.d.ts +23 -0
  307. package/dist/runners/hubPackage.d.ts.map +1 -0
  308. package/dist/runners/hubPackage.js +184 -0
  309. package/dist/runners/hubPackage.js.map +1 -0
  310. package/dist/runners/hubPairing.d.ts +70 -0
  311. package/dist/runners/hubPairing.d.ts.map +1 -0
  312. package/dist/runners/hubPairing.js +277 -0
  313. package/dist/runners/hubPairing.js.map +1 -0
  314. package/dist/runners/hubPaths.d.ts +42 -0
  315. package/dist/runners/hubPaths.d.ts.map +1 -0
  316. package/dist/runners/hubPaths.js +96 -0
  317. package/dist/runners/hubPaths.js.map +1 -0
  318. package/dist/runners/hubRegistry.d.ts +134 -0
  319. package/dist/runners/hubRegistry.d.ts.map +1 -0
  320. package/dist/runners/hubRegistry.js +256 -0
  321. package/dist/runners/hubRegistry.js.map +1 -0
  322. package/dist/runners/linkControl.d.ts +38 -0
  323. package/dist/runners/linkControl.d.ts.map +1 -0
  324. package/dist/runners/linkControl.js +171 -0
  325. package/dist/runners/linkControl.js.map +1 -0
  326. package/dist/runners/pairCode.d.ts +30 -0
  327. package/dist/runners/pairCode.d.ts.map +1 -0
  328. package/dist/runners/pairCode.js +46 -0
  329. package/dist/runners/pairCode.js.map +1 -0
  330. package/dist/runners/pairingTiming.d.ts +18 -0
  331. package/dist/runners/pairingTiming.d.ts.map +1 -0
  332. package/dist/runners/pairingTiming.js +42 -0
  333. package/dist/runners/pairingTiming.js.map +1 -0
  334. package/dist/runners/removalTiming.d.ts +13 -0
  335. package/dist/runners/removalTiming.d.ts.map +1 -0
  336. package/dist/runners/removalTiming.js +17 -0
  337. package/dist/runners/removalTiming.js.map +1 -0
  338. package/dist/runners/runnerProxy.d.ts +9 -0
  339. package/dist/runners/runnerProxy.d.ts.map +1 -0
  340. package/dist/runners/runnerProxy.js +67 -0
  341. package/dist/runners/runnerProxy.js.map +1 -0
  342. package/dist/runners/runnerRemoval.d.ts +21 -0
  343. package/dist/runners/runnerRemoval.d.ts.map +1 -0
  344. package/dist/runners/runnerRemoval.js +94 -0
  345. package/dist/runners/runnerRemoval.js.map +1 -0
  346. package/dist/runners/runnerServiceKind.d.ts +10 -0
  347. package/dist/runners/runnerServiceKind.d.ts.map +1 -0
  348. package/dist/runners/runnerServiceKind.js +13 -0
  349. package/dist/runners/runnerServiceKind.js.map +1 -0
  350. package/dist/runners/runnersCli.d.ts +25 -0
  351. package/dist/runners/runnersCli.d.ts.map +1 -0
  352. package/dist/runners/runnersCli.js +239 -0
  353. package/dist/runners/runnersCli.js.map +1 -0
  354. package/dist/runners/runnersList.d.ts +14 -0
  355. package/dist/runners/runnersList.d.ts.map +1 -0
  356. package/dist/runners/runnersList.js +51 -0
  357. package/dist/runners/runnersList.js.map +1 -0
  358. package/dist/runners/runnersOverview.d.ts +20 -0
  359. package/dist/runners/runnersOverview.d.ts.map +1 -0
  360. package/dist/runners/runnersOverview.js +56 -0
  361. package/dist/runners/runnersOverview.js.map +1 -0
  362. package/dist/runners/sshKeys.d.ts +26 -0
  363. package/dist/runners/sshKeys.d.ts.map +1 -0
  364. package/dist/runners/sshKeys.js +60 -0
  365. package/dist/runners/sshKeys.js.map +1 -0
  366. package/dist/runners/tarArchive.d.ts +20 -0
  367. package/dist/runners/tarArchive.d.ts.map +1 -0
  368. package/dist/runners/tarArchive.js +70 -0
  369. package/dist/runners/tarArchive.js.map +1 -0
  370. package/dist/scheduler/mcpSurface.d.ts +11 -5
  371. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  372. package/dist/scheduler/mcpSurface.js +59 -26
  373. package/dist/scheduler/mcpSurface.js.map +1 -1
  374. package/dist/selfUpdate/selfCheck.d.ts +13 -0
  375. package/dist/selfUpdate/selfCheck.d.ts.map +1 -1
  376. package/dist/selfUpdate/selfCheck.js +9 -3
  377. package/dist/selfUpdate/selfCheck.js.map +1 -1
  378. package/dist/stt/sttInstallEntry.js +7 -4
  379. package/dist/stt/sttInstallEntry.js.map +1 -1
  380. package/dist/testTimings.d.ts +5 -2
  381. package/dist/testTimings.d.ts.map +1 -1
  382. package/dist/testTimings.js +10 -1
  383. package/dist/testTimings.js.map +1 -1
  384. package/dist/utils/agentEnvironment.d.ts +6 -2
  385. package/dist/utils/agentEnvironment.d.ts.map +1 -1
  386. package/dist/utils/agentEnvironment.js +13 -2
  387. package/dist/utils/agentEnvironment.js.map +1 -1
  388. package/dist/utils/runnersScreenPlan.d.ts +141 -0
  389. package/dist/utils/runnersScreenPlan.d.ts.map +1 -0
  390. package/dist/utils/runnersScreenPlan.js +272 -0
  391. package/dist/utils/runnersScreenPlan.js.map +1 -0
  392. package/package.json +5 -2
  393. package/remoteRun/runner.sh +81 -6
@@ -0,0 +1,524 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatRunnersTime = exports.runnersWatchIntervalMs = void 0;
4
+ exports.createRunners = createRunners;
5
+ /**
6
+ * `/runners` — the machines that run the agents' tests and builds, paired from Telegram. In General only (admins): one message that
7
+ * lists the machines (online or not, what they are, what they can do) with Pause / Resume / Remove per machine, and a button that pairs
8
+ * another one — two one-time lines for the new machine (one for an admin account, one for the runner account itself), valid 10 minutes, in
9
+ * two messages that turn into «paired» or «expired».
10
+ * The hub itself is `src/runners/`; this file is only the screen, its buttons and the two background jobs (editing the pairing message,
11
+ * refreshing a list with live data). See `src/runners/README.md` for the safety line and `utils/runnersScreenPlan.ts` for the texts.
12
+ *
13
+ * Two rules keep the screen true under concurrency. (1) A render is claimed BEFORE its Telegram edit is awaited: every message has a
14
+ * generation, and a background job (the live probe) draws only if the message still carries the generation it started from — so a
15
+ * question that replaced the list while its edit was still queued is never drawn over. (2) The messages that offer a pairing code are
16
+ * this instance's own record (`runnerPairingMessages.ts`, an entry per message), each kept until the edit that settles it was accepted. A
17
+ * message settles to «paired» (a runner carries its code), «closed» (the code was closed unused: its line was pasted for a machine that
18
+ * was already paired) or «expired».
19
+ */
20
+ const telegraf_1 = require("telegraf");
21
+ const configDirFile_1 = require("../../../configDirFile");
22
+ const i18n_1 = require("../../../i18n");
23
+ const renderAgentHtml_1 = require("../renderAgentHtml");
24
+ const sessionKey_1 = require("../../../sessionKey");
25
+ const bootstrapLine_1 = require("../../../runners/bootstrapLine");
26
+ const hubAddress_1 = require("../../../runners/hubAddress");
27
+ const hubAddressCandidates_1 = require("../../../runners/hubAddressCandidates");
28
+ const hubPairing_1 = require("../../../runners/hubPairing");
29
+ const hubRegistry_1 = require("../../../runners/hubRegistry");
30
+ const pairingTiming_1 = require("../../../runners/pairingTiming");
31
+ const runnerRemoval_1 = require("../../../runners/runnerRemoval");
32
+ const runnersScreenPlan_1 = require("../../../utils/runnersScreenPlan");
33
+ const runnerPairingMessages_1 = require("../runnerPairingMessages");
34
+ const callbackToast_1 = require("./callbackToast");
35
+ const callbackMessage_1 = require("./callbackMessage");
36
+ /** The pairing messages and screens of this many messages are remembered; an older keyboard answers «out of date». */
37
+ const messageSnapshotLimit = 50;
38
+ /** How long the next General message is read as an address after «Enter another address». */
39
+ const addressWaitMs = 10 * 60 * 1000;
40
+ /** How often the pairing messages are checked for «used» or «expired» (the registry is two small files). */
41
+ exports.runnersWatchIntervalMs = 5 * 1000;
42
+ /** A pairing message whose edits have been failing for a day is given up on (the code lived 10 minutes; the message may be gone). */
43
+ const pairingMessageGiveUpAfterFailingMs = 24 * 60 * 60 * 1000;
44
+ /** After a failed edit of a pairing message the next try waits this long, doubling each time up to the cap. */
45
+ const settleRetryFirstDelayMs = 5 * 1000;
46
+ const settleRetryMaxDelayMs = 5 * 60 * 1000;
47
+ const logTag = 'runners';
48
+ /** @description What a caught failure says to the operator: a registry error names its file and field, anything else its kind and message. */
49
+ function describeCaughtError(caught) {
50
+ if (caught instanceof hubRegistry_1.HubRegistryError)
51
+ return caught.message;
52
+ return caught instanceof Error ? `${caught.name}: ${caught.message}` : 'unknown error';
53
+ }
54
+ /** `1 Nov 14:02` in the bot's timezone (`process.env.TZ`) and the topic's language: the parts in one fixed order, so it reads the same in every locale. */
55
+ const formatRunnersTime = (epochMs) => {
56
+ const parts = new Intl.DateTimeFormat((0, i18n_1.getActiveLang)(), { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }).formatToParts(epochMs);
57
+ const read = (type) => parts.find((part) => part.type === type)?.value ?? '';
58
+ return `${read('day')} ${read('month')} ${read('hour')}:${read('minute')}`;
59
+ };
60
+ exports.formatRunnersTime = formatRunnersTime;
61
+ function buildKeyboard(screen) {
62
+ return telegraf_1.Markup.inlineKeyboard(screen.rows.map((row) => row.map((button) => telegraf_1.Markup.button.callback(button.text, button.data))));
63
+ }
64
+ /**
65
+ * @description Build the `/runners` screen over its ports. `registerRunnersCommands` / `registerRunnersCallbacks` register the command and
66
+ * the buttons; `handleRunnersAddressText` is called by the text handler for a General message (true = taken as the address) and
67
+ * `cancelRunnersAddressWait` for a slash command (it ends the wait);
68
+ * `startRunnersWatcher` starts the job that edits the pairing messages and returns the way to stop it (`watchPairingsOnce` is one
69
+ * look of that job, for a test to run on its own clock).
70
+ */
71
+ function createRunners(ports) {
72
+ const { bot, command, replyToThread, editThreadMessage, editThreadKeyboard, authoriseContext, withThreadLocale, checkIsGeneral, hub, now } = ports;
73
+ const shownScreens = new Map();
74
+ const addressProposals = new Map();
75
+ /** General keys whose next message is an address → when the wait began. */
76
+ const addressWaits = new Map();
77
+ /** Pairing messages whose edit failed, by {@link getPairingMessageId}: when the next try may be, and the delay after it (in memory — a restart tries at once). */
78
+ const settleRetries = new Map();
79
+ let isWatchTickRunning = false;
80
+ let lastGeneration = 0;
81
+ let lastStoreProblem = null;
82
+ let lastClosedProblem = null;
83
+ /** Claim `messageId` for a render: whatever started from an earlier claim no longer draws on it. Returns the claim. */
84
+ function claimMessage(key, messageId, kind, page) {
85
+ lastGeneration += 1;
86
+ const shown = { kind, generation: lastGeneration, page };
87
+ (0, callbackMessage_1.rememberBoundedSnapshot)(shownScreens, (0, callbackMessage_1.buildMessageSnapshotKey)(key, messageId), shown, messageSnapshotLimit);
88
+ return shown;
89
+ }
90
+ /** The claim `messageId` carries now; `undefined` for a message this module never drew (or forgot). */
91
+ function readClaim(key, messageId) {
92
+ return shownScreens.get((0, callbackMessage_1.buildMessageSnapshotKey)(key, messageId));
93
+ }
94
+ /** The page of the list `messageId` shows — or showed, when a question has replaced it (the question keeps the page it came from); 0 for a message never drawn. */
95
+ function readShownPage(key, messageId) {
96
+ return readClaim(key, messageId)?.page ?? 0;
97
+ }
98
+ async function reportRegistryError(key, caught) {
99
+ await replyToThread(key, (0, i18n_1.t)('runners.registryErrorText', { reason: describeCaughtError(caught) }));
100
+ }
101
+ /**
102
+ * Draw page `page` of `overview` — as a new message, or over `messageId` — and, when machines are online, ask them in the background and
103
+ * draw again. A message that is edited is claimed BEFORE the edit is awaited, so a probe that started from an earlier claim cannot draw
104
+ * over it; a new message is claimed once it exists (nothing can have started from it).
105
+ */
106
+ async function drawList(key, overview, page, target) {
107
+ const isChecking = overview.entries.some((entry) => entry.isOnline);
108
+ const screen = (0, runnersScreenPlan_1.buildRunnersScreen)({ ...overview, isChecking }, i18n_1.t, exports.formatRunnersTime, page);
109
+ let messageId;
110
+ let claim = null;
111
+ if (target.messageId === null) {
112
+ messageId = await replyToThread(key, screen.text, buildKeyboard(screen));
113
+ if (messageId !== null)
114
+ claim = claimMessage(key, messageId, 'list', screen.page);
115
+ }
116
+ else {
117
+ claim = claimMessage(key, target.messageId, 'list', screen.page);
118
+ messageId = (await editThreadMessage(key, target.messageId, screen.text, buildKeyboard(screen))) ? target.messageId : null;
119
+ }
120
+ if (messageId === null || claim === null || !isChecking)
121
+ return;
122
+ const startedFrom = claim;
123
+ void probeAndRedraw(key, messageId, overview, startedFrom).catch((error) => console.warn(`[${logTag}] live check failed: ${describeCaughtError(error)}`));
124
+ }
125
+ async function probeAndRedraw(key, messageId, overview, startedFrom) {
126
+ const probed = await ports.probeOverview(overview, now());
127
+ // No await between this check and the edit being queued: a claim made later queues its own edit behind this one.
128
+ if (readClaim(key, messageId)?.generation !== startedFrom.generation)
129
+ return;
130
+ await withThreadLocale(key, async () => {
131
+ const screen = (0, runnersScreenPlan_1.buildRunnersScreen)({ ...probed, isChecking: false }, i18n_1.t, exports.formatRunnersTime, startedFrom.page);
132
+ await editThreadMessage(key, messageId, screen.text, buildKeyboard(screen));
133
+ });
134
+ }
135
+ async function showScreen(key) {
136
+ await withThreadLocale(key, async () => {
137
+ let overview;
138
+ try {
139
+ overview = await ports.readOverview(now());
140
+ }
141
+ catch (error) {
142
+ await reportRegistryError(key, error);
143
+ return;
144
+ }
145
+ await drawList(key, overview, 0, { messageId: null });
146
+ });
147
+ }
148
+ /** Draw the list over the message a button sits on — page `page`, else the page it already shows. */
149
+ async function redrawList(key, messageId, page = readShownPage(key, messageId)) {
150
+ let overview;
151
+ try {
152
+ overview = await ports.readOverview(now());
153
+ }
154
+ catch (error) {
155
+ await reportRegistryError(key, error);
156
+ return;
157
+ }
158
+ await drawList(key, overview, page, { messageId });
159
+ }
160
+ async function showAddressStep(key) {
161
+ const proposed = await (0, hubAddressCandidates_1.findProposedHubAddress)(ports.listAddressCandidates(), ports.scanHostKey);
162
+ const step = (0, runnersScreenPlan_1.buildAddressStep)(proposed === null ? null : (0, hubAddressCandidates_1.formatHubAddress)(proposed.address), i18n_1.t);
163
+ const messageId = await replyToThread(key, step.text, buildKeyboard(step));
164
+ if (messageId === null)
165
+ return;
166
+ (0, callbackMessage_1.rememberBoundedSnapshot)(addressProposals, (0, callbackMessage_1.buildMessageSnapshotKey)(key, messageId), proposed === null ? null : proposed.address, messageSnapshotLimit);
167
+ if (proposed === null)
168
+ addressWaits.set((0, sessionKey_1.keyToString)(key), now());
169
+ }
170
+ /** The next General message is the address. */
171
+ function armAddressWait(key) {
172
+ addressWaits.set((0, sessionKey_1.keyToString)(key), now());
173
+ }
174
+ /** The address was refused: say why and keep listening for another. */
175
+ async function rejectAddress(key, reason) {
176
+ armAddressWait(key);
177
+ await replyToThread(key, (0, i18n_1.t)('runners.addressRejected', { reason }));
178
+ }
179
+ /** `intro`, the line in a `<pre>`, and `outro` when there is one — the HTML of a pairing message. */
180
+ function renderPairingMessage(intro, line, outro) {
181
+ return `${(0, renderAgentHtml_1.escapeHtmlText)(intro)}\n\n<pre>${(0, renderAgentHtml_1.escapeHtmlText)(line)}</pre>${outro === null ? '' : `\n\n${(0, renderAgentHtml_1.escapeHtmlText)(outro)}`}`;
182
+ }
183
+ /** Post a message that carries a pairing line (a secret: the trace keeps only its length) and remember it so it can turn into «paired» / «expired». */
184
+ async function postPairingLine(key, pairId, text) {
185
+ const messageId = await replyToThread(key, text, { parse_mode: 'HTML' }, { isSecret: true });
186
+ if (messageId === null)
187
+ return false;
188
+ try {
189
+ (0, runnerPairingMessages_1.addPairingMessage)(ports.pairingMessagesPath, { pairId, key: (0, sessionKey_1.keyToString)(key), messageId, offeredAtMs: now() });
190
+ }
191
+ catch (error) {
192
+ // The line is out and works; only its turning into «paired» / «expired» is lost.
193
+ console.warn(`[${logTag}] the pairing message could not be recorded (${(0, configDirFile_1.getCaughtErrnoCode)(error)}); it will not turn into «paired» or «expired»`);
194
+ }
195
+ return true;
196
+ }
197
+ /**
198
+ * Make a code and post the two lines that carry it, one message each (together they are longer than a Telegram message): the line for an
199
+ * ADMIN account first, the plain one second. Both settle together, whichever line is used.
200
+ */
201
+ async function offerPairing(key, address, knownCheck) {
202
+ const check = knownCheck ?? (await (0, hubAddress_1.checkHubAddress)(address, ports.scanHostKey));
203
+ if (!check.ok) {
204
+ await rejectAddress(key, check.error);
205
+ return;
206
+ }
207
+ try {
208
+ ports.ensureGateWrapper();
209
+ const pairing = await (0, hubPairing_1.createPairing)(hub, { host: address.host, port: address.port, hostKey: check.hostKey, label: ports.getBotLabel(), nowMs: now() });
210
+ const parts = (0, runnersScreenPlan_1.buildPairingMessageParts)(pairingTiming_1.pairingLifetimeMinutes, bootstrapLine_1.defaultRunnerAccount, i18n_1.t);
211
+ if (!(await postPairingLine(key, pairing.pairId, renderPairingMessage(parts.adminIntro, (0, bootstrapLine_1.buildAdminBootstrapLine)(pairing.payload, bootstrapLine_1.defaultRunnerAccount), null)))) {
212
+ await replyToThread(key, (0, i18n_1.t)('runners.pairFailedText', { reason: 'the message could not be sent' }));
213
+ return;
214
+ }
215
+ // The admin line is out and works whatever happens to this one.
216
+ if (!(await postPairingLine(key, pairing.pairId, renderPairingMessage(parts.alternativeIntro, (0, bootstrapLine_1.buildBootstrapLine)(pairing.payload), parts.alternativeOutro)))) {
217
+ console.warn(`[${logTag}] the second pairing message (the line for the runner account itself) could not be sent`);
218
+ }
219
+ }
220
+ catch (error) {
221
+ await replyToThread(key, (0, i18n_1.t)('runners.pairFailedText', { reason: describeCaughtError(error) }));
222
+ }
223
+ }
224
+ async function startPairing(key) {
225
+ const address = ports.readRunnerHost();
226
+ if (address === null)
227
+ await showAddressStep(key);
228
+ else
229
+ await offerPairing(key, address, null);
230
+ }
231
+ async function useAddress(key, messageId) {
232
+ const address = messageId === null ? undefined : addressProposals.get((0, callbackMessage_1.buildMessageSnapshotKey)(key, messageId));
233
+ if (address === undefined || address === null) {
234
+ await replyToThread(key, (0, i18n_1.t)('runners.addressExpired'));
235
+ return;
236
+ }
237
+ if (messageId !== null)
238
+ await editThreadKeyboard(key, messageId, null, logTag);
239
+ const saveError = ports.saveRunnerHost(address);
240
+ if (saveError !== null)
241
+ console.warn(`[${logTag}] the address could not be saved (${saveError}); it is used for this pairing only`);
242
+ await offerPairing(key, address, null);
243
+ }
244
+ /** A slash command ends the wait for the address (the command itself runs normally); the text handler calls it before a bot command returns. */
245
+ function cancelRunnersAddressWait(key) {
246
+ addressWaits.delete((0, sessionKey_1.keyToString)(key));
247
+ }
248
+ /**
249
+ * @description A General message while the address is awaited: parse it, check that it answers with this machine's own sshd, keep it
250
+ * and make the pairing line. A failed check keeps the wait (the reason is posted). A slash command ends the wait and runs normally.
251
+ * Resolves to whether the message was taken here.
252
+ */
253
+ async function handleRunnersAddressText(key, text) {
254
+ const keyText = (0, sessionKey_1.keyToString)(key);
255
+ const waitStartedAt = addressWaits.get(keyText);
256
+ if (waitStartedAt === undefined || !checkIsGeneral(key))
257
+ return false;
258
+ if (now() - waitStartedAt > addressWaitMs || text.startsWith('/')) {
259
+ cancelRunnersAddressWait(key);
260
+ return false;
261
+ }
262
+ await withThreadLocale(key, async () => {
263
+ const parsed = (0, hubAddress_1.parseHubAddress)(text);
264
+ if (!parsed.ok) {
265
+ await rejectAddress(key, parsed.error);
266
+ return;
267
+ }
268
+ const check = await (0, hubAddress_1.checkHubAddress)(parsed.address, ports.scanHostKey);
269
+ if (!check.ok) {
270
+ await rejectAddress(key, check.error);
271
+ return;
272
+ }
273
+ addressWaits.delete(keyText);
274
+ const saveError = ports.saveRunnerHost(parsed.address);
275
+ if (saveError !== null)
276
+ console.warn(`[${logTag}] the address could not be saved (${saveError}); it is used for this pairing only`);
277
+ if (check.note !== null)
278
+ await replyToThread(key, (0, i18n_1.t)('runners.addressNote', { note: check.note }));
279
+ await offerPairing(key, parsed.address, check);
280
+ });
281
+ return true;
282
+ }
283
+ async function handleRunnerAction(ctx, key, messageId, callback) {
284
+ let paired;
285
+ try {
286
+ paired = (0, hubRegistry_1.readPairedFile)(hub.dir);
287
+ }
288
+ catch (error) {
289
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
290
+ await reportRegistryError(key, error);
291
+ return;
292
+ }
293
+ const runner = paired.rev === callback.revision ? paired.runners[callback.index] : undefined;
294
+ if (runner === undefined) {
295
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx, (0, i18n_1.t)('runners.staleToast'));
296
+ if (messageId !== null)
297
+ await redrawList(key, messageId);
298
+ return;
299
+ }
300
+ switch (callback.action) {
301
+ case 'remove': {
302
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
303
+ if (messageId === null)
304
+ return;
305
+ const question = (0, runnersScreenPlan_1.buildRemoveConfirmation)(runner.name, paired.rev, callback.index, i18n_1.t);
306
+ // Claimed first: a live check that finishes while this edit is still queued must not draw the list over the question.
307
+ const listClaim = readClaim(key, messageId);
308
+ claimMessage(key, messageId, 'question', listClaim?.page ?? 0);
309
+ await editThreadMessage(key, messageId, question.text, buildKeyboard(question));
310
+ return;
311
+ }
312
+ case 'removeNo':
313
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
314
+ break;
315
+ case 'removeYes': {
316
+ // The tap is answered at once, without text: stopping the jobs on the machine can take 20 s and more, and a tap left unanswered for
317
+ // long is «too old». What happened — including whether the jobs were stopped — is told in a message of its own once it is known.
318
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
319
+ try {
320
+ const removal = await (0, runnerRemoval_1.removeRunnerAndEndItsWork)(hub, runner.id, now());
321
+ if (removal !== null)
322
+ await replyToThread(key, (0, runnersScreenPlan_1.buildRemovalOutcomeText)(removal.runner.name, removal.jobs, i18n_1.t));
323
+ }
324
+ catch (error) {
325
+ await reportRegistryError(key, error);
326
+ return;
327
+ }
328
+ break;
329
+ }
330
+ case 'pause':
331
+ case 'resume': {
332
+ await (0, hubPairing_1.setPairedRunnerPaused)(hub, runner.id, callback.action === 'pause');
333
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx, (0, i18n_1.t)(callback.action === 'pause' ? 'runners.pausedToast' : 'runners.resumedToast', { name: runner.name }));
334
+ break;
335
+ }
336
+ }
337
+ if (messageId === null)
338
+ await showScreen(key);
339
+ else
340
+ await redrawList(key, messageId);
341
+ }
342
+ async function handleCallback(ctx, callback) {
343
+ const key = await authoriseContext(ctx);
344
+ if (!key) {
345
+ await ctx.answerCbQuery((0, i18n_1.t)('cb.access_denied'));
346
+ return;
347
+ }
348
+ const messageId = (0, callbackMessage_1.getCallbackMessageId)(ctx);
349
+ await withThreadLocale(key, async () => {
350
+ // The screen only ever stands in General, but a tap is checked where it lands.
351
+ if (!checkIsGeneral(key)) {
352
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx, (0, i18n_1.t)('runners.generalOnlyText'));
353
+ return;
354
+ }
355
+ switch (callback.kind) {
356
+ case 'pair':
357
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
358
+ await startPairing(key);
359
+ return;
360
+ case 'refresh':
361
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
362
+ if (messageId === null)
363
+ await showScreen(key);
364
+ else
365
+ await redrawList(key, messageId);
366
+ return;
367
+ case 'addressUse':
368
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
369
+ await useAddress(key, messageId);
370
+ return;
371
+ case 'addressOther':
372
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
373
+ if (messageId !== null)
374
+ await editThreadKeyboard(key, messageId, null, logTag);
375
+ armAddressWait(key);
376
+ await replyToThread(key, (0, i18n_1.t)('runners.addressAsk'));
377
+ return;
378
+ case 'page':
379
+ await (0, callbackToast_1.answerCallbackQuerySafely)(ctx);
380
+ if (messageId === null)
381
+ await showScreen(key);
382
+ else
383
+ await redrawList(key, messageId, callback.page);
384
+ return;
385
+ case 'runner':
386
+ await handleRunnerAction(ctx, key, messageId, callback);
387
+ }
388
+ });
389
+ }
390
+ /**
391
+ * @description One look at this instance's unsettled pairing messages (`runnerPairingMessages.ts`): a code that became a runner turns its
392
+ * message into «paired», one that is no longer open (expired, swept) into «expired». An entry is dropped only after Telegram accepted
393
+ * the edit — a failed one is tried again later (5 s, doubling to 5 min) and survives a restart; one whose edits have been failing for a
394
+ * day is given up on (counted from the first failed attempt: a message older than that is still tried once). Expired credentials are
395
+ * swept from the shared registry here too, but the messages never depend on what the sweep left (they are this instance's own record,
396
+ * and another instance may have swept or even spent the code while this one was down).
397
+ *
398
+ * ORDER matters: the record is read FIRST, the registry right after, with no await between. A message is recorded after its code was
399
+ * created, so a registry read after the record holds the code of every message in it — a message is never judged against a registry
400
+ * older than itself (reading them the other way round, an offer that finishes while the sweep waits for the hub lock would be taken for
401
+ * an expired code and its live line edited away).
402
+ */
403
+ async function watchPairingsOnce() {
404
+ const nowMs = now();
405
+ const { messages, problem } = (0, runnerPairingMessages_1.readPairingMessages)(ports.pairingMessagesPath);
406
+ const pending = (0, hubRegistry_1.readPendingFile)(hub.dir).pending;
407
+ const runners = (0, hubRegistry_1.readPairedFile)(hub.dir).runners;
408
+ // A broken record fails every look: say it once, not every five seconds.
409
+ if (problem !== null && problem !== lastStoreProblem)
410
+ console.warn(`[${logTag}] ${problem}; the pairing messages it held are not followed`);
411
+ lastStoreProblem = problem;
412
+ if (pending.some((pairing) => pairing.expiresAtMs <= nowMs))
413
+ await ports.sweepExpiredCodes(nowMs);
414
+ const settledMessageIds = new Set();
415
+ /** The closed codes — read when a message first settles without a runner, and not before, and not on a look that has nothing to settle. */
416
+ let closedPairIds = null;
417
+ /** Is `pairId` a code that was closed unused AND is gone from the pending list? A trace of a code that is still listed (its write was followed by a failed one) is not a closing. */
418
+ const checkIsClosed = (pairId) => {
419
+ if (pending.some((pairing) => pairing.pairId === pairId))
420
+ return false;
421
+ if (closedPairIds === null) {
422
+ // After the pending list: a code is noted as closed BEFORE it leaves that list, so a code seen gone from it is already noted here.
423
+ const { codes, problem } = (0, hubRegistry_1.readClosedCodes)(hub.dir);
424
+ // A broken trace file fails every read: say it once, not at every look.
425
+ if (problem !== null && problem !== lastClosedProblem)
426
+ console.warn(`[${logTag}] ${problem}`);
427
+ lastClosedProblem = problem;
428
+ closedPairIds = new Set(codes.map((entry) => entry.pairId));
429
+ }
430
+ return closedPairIds.has(pairId);
431
+ };
432
+ for (const message of messages) {
433
+ const messageId = (0, runnerPairingMessages_1.getPairingMessageId)(message);
434
+ if ((settleRetries.get(messageId)?.nextAttemptAtMs ?? 0) > nowMs)
435
+ continue;
436
+ const runner = runners.find((candidate) => candidate.pairId === message.pairId);
437
+ const isOpen = pending.some((pairing) => pairing.pairId === message.pairId && pairing.expiresAtMs > nowMs);
438
+ if (runner === undefined && isOpen)
439
+ continue;
440
+ const key = (0, sessionKey_1.keyFromString)(message.key);
441
+ const isEdited = await withThreadLocale(key, () => editThreadMessage(key, message.messageId, runner !== undefined ? (0, runnersScreenPlan_1.buildPairedText)(runner.name, runner.pairedAtMs, i18n_1.t, exports.formatRunnersTime) : checkIsClosed(message.pairId) ? (0, runnersScreenPlan_1.buildClosedText)(i18n_1.t) : (0, runnersScreenPlan_1.buildExpiredText)(i18n_1.t)));
442
+ if (isEdited) {
443
+ settledMessageIds.add(messageId);
444
+ settleRetries.delete(messageId);
445
+ continue;
446
+ }
447
+ if (nowMs - (message.firstFailedAtMs ?? nowMs) > pairingMessageGiveUpAfterFailingMs) {
448
+ console.warn(`[${logTag}] a pairing message could not be edited for a day; giving up on it`);
449
+ settledMessageIds.add(messageId);
450
+ settleRetries.delete(messageId);
451
+ continue;
452
+ }
453
+ (0, runnerPairingMessages_1.markPairingMessageFailed)(ports.pairingMessagesPath, message, nowMs);
454
+ const delayMs = Math.min((settleRetries.get(messageId)?.delayMs ?? settleRetryFirstDelayMs / 2) * 2, settleRetryMaxDelayMs);
455
+ settleRetries.set(messageId, { nextAttemptAtMs: nowMs + delayMs, delayMs });
456
+ }
457
+ if (settledMessageIds.size > 0)
458
+ (0, runnerPairingMessages_1.removePairingMessages)(ports.pairingMessagesPath, settledMessageIds);
459
+ }
460
+ /**
461
+ * Keep the `gate` wrapper that the runners' `authorized_keys` lines run pointing at THIS install (a Node upgrade or a moved checkout would
462
+ * leave them pointing at nothing). Done only for an instance that has runners or open codes: another one touches nothing under `~/.config`.
463
+ */
464
+ function refreshGateWrapper() {
465
+ try {
466
+ if ((0, hubRegistry_1.readPairedFile)(hub.dir).runners.length > 0 || (0, hubRegistry_1.readPendingFile)(hub.dir).pending.length > 0)
467
+ ports.ensureGateWrapper();
468
+ }
469
+ catch (error) {
470
+ console.warn(`[${logTag}] the gate wrapper could not be refreshed: ${describeCaughtError(error)}`);
471
+ }
472
+ }
473
+ /** @description Start the watch (one look now, then every interval); returns the way to stop it. */
474
+ function startRunnersWatcher() {
475
+ refreshGateWrapper();
476
+ let lastFailure = '';
477
+ const look = () => {
478
+ if (isWatchTickRunning)
479
+ return;
480
+ isWatchTickRunning = true;
481
+ watchPairingsOnce()
482
+ .then(() => { lastFailure = ''; })
483
+ .catch((error) => {
484
+ // A broken registry file fails every look: say it once, not every five seconds.
485
+ const failure = describeCaughtError(error);
486
+ if (failure !== lastFailure)
487
+ console.warn(`[${logTag}] pairing watch failed: ${failure}`);
488
+ lastFailure = failure;
489
+ })
490
+ .finally(() => { isWatchTickRunning = false; });
491
+ };
492
+ look();
493
+ const timer = setInterval(look, ports.watchIntervalMs ?? exports.runnersWatchIntervalMs);
494
+ timer.unref();
495
+ return () => clearInterval(timer);
496
+ }
497
+ function registerRunnersCommands() {
498
+ // `/runners` — in General the list with its buttons; anywhere else a pointer to General. Not gated on an adapter or a session:
499
+ // the machines belong to the whole bot.
500
+ command('runners', async (_ctx, key) => {
501
+ if (!checkIsGeneral(key)) {
502
+ await replyToThread(key, (0, i18n_1.t)('runners.generalOnlyText'));
503
+ return;
504
+ }
505
+ await showScreen(key);
506
+ });
507
+ }
508
+ function registerRunnersCallbacks() {
509
+ for (const data of [runnersScreenPlan_1.runnersPairCallback, runnersScreenPlan_1.runnersRefreshCallback, runnersScreenPlan_1.runnersAddressUseCallback, runnersScreenPlan_1.runnersAddressOtherCallback]) {
510
+ bot.action(data, (ctx) => {
511
+ const callback = (0, runnersScreenPlan_1.parseRunnersCallback)(data);
512
+ return callback === null ? Promise.resolve() : handleCallback(ctx, callback);
513
+ });
514
+ }
515
+ for (const pattern of [runnersScreenPlan_1.runnersPageCallbackRe, runnersScreenPlan_1.runnerActionCallbackRe]) {
516
+ bot.action(pattern, (ctx) => {
517
+ const callback = (0, runnersScreenPlan_1.parseRunnersCallback)(ctx.match[0]);
518
+ return callback === null ? Promise.resolve() : handleCallback(ctx, callback);
519
+ });
520
+ }
521
+ }
522
+ return { registerRunnersCommands, registerRunnersCallbacks, handleRunnersAddressText, cancelRunnersAddressWait, startRunnersWatcher, watchPairingsOnce };
523
+ }
524
+ //# sourceMappingURL=runners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runners.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/commands/runners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ declare const pairingMessageSchema: z.ZodObject<{
3
+ pairId: z.ZodString;
4
+ key: z.ZodString;
5
+ messageId: z.ZodNumber;
6
+ offeredAtMs: z.ZodNumber;
7
+ firstFailedAtMs: z.ZodOptional<z.ZodNumber>;
8
+ }, z.core.$strict>;
9
+ /** @name PairingMessage @description One message that offers a code. */
10
+ export type PairingMessage = z.infer<typeof pairingMessageSchema>;
11
+ export interface PairingMessagesRead {
12
+ messages: PairingMessage[];
13
+ /** Why the file could not be used (it reads as empty and the next write replaces it); `null` when it was fine or missing. */
14
+ problem: string | null;
15
+ }
16
+ /** @description The entries in `filePath`. A missing file is none; one that is not valid reads as none and says why (the next write replaces it). */
17
+ export declare function readPairingMessages(filePath: string): PairingMessagesRead;
18
+ /** @description Write the entries (the newest {@link maxEntries}), through a temp file and a rename. */
19
+ export declare function writePairingMessages(filePath: string, messages: readonly PairingMessage[]): void;
20
+ /** @description What names one message of the record: its code and its Telegram message id (a conversation holds both messages of a code). */
21
+ export declare function getPairingMessageId(message: Pick<PairingMessage, 'pairId' | 'messageId'>): string;
22
+ /** @description Add `message` (an older entry for the same message is replaced; the code's other message stays). */
23
+ export declare function addPairingMessage(filePath: string, message: PairingMessage): void;
24
+ /** @description Take the entries named by `messageIds` ({@link getPairingMessageId}) out. */
25
+ export declare function removePairingMessages(filePath: string, messageIds: ReadonlySet<string>): void;
26
+ /** @description Note that an edit of `message` failed at `nowMs`: the first failure is kept, later ones change nothing. */
27
+ export declare function markPairingMessageFailed(filePath: string, message: Pick<PairingMessage, 'pairId' | 'messageId'>, nowMs: number): void;
28
+ export {};
29
+ //# sourceMappingURL=runnerPairingMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerPairingMessages.d.ts","sourceRoot":"","sources":["../../../src/connectors/telegram/runnerPairingMessages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,QAAA,MAAM,oBAAoB;;;;;;kBAOxB,CAAC;AAIH,wEAAwE;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,6HAA6H;IAC7H,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,qJAAqJ;AACrJ,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAazE;AAED,wGAAwG;AACxG,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAEhG;AAED,8IAA8I;AAC9I,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,WAAW,CAAC,GAAG,MAAM,CAEjG;AAED,oHAAoH;AACpH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAGjF;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAG7F;AAED,2HAA2H;AAC3H,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKrI"}