charness 3.7.0 → 3.8.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 (359) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/DEVELOPMENT.md +6 -2
  3. package/README.md +5 -5
  4. package/SETUP.md +16 -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.js +44 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/configDirFile.d.ts +7 -3
  15. package/dist/configDirFile.d.ts.map +1 -1
  16. package/dist/configDirFile.js +12 -5
  17. package/dist/configDirFile.js.map +1 -1
  18. package/dist/connectors/telegram/commands/botCore.d.ts +5 -1
  19. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
  20. package/dist/connectors/telegram/commands/runners.d.ts +52 -0
  21. package/dist/connectors/telegram/commands/runners.d.ts.map +1 -0
  22. package/dist/connectors/telegram/commands/runners.js +486 -0
  23. package/dist/connectors/telegram/commands/runners.js.map +1 -0
  24. package/dist/connectors/telegram/runnerPairingMessages.d.ts +27 -0
  25. package/dist/connectors/telegram/runnerPairingMessages.d.ts.map +1 -0
  26. package/dist/connectors/telegram/runnerPairingMessages.js +105 -0
  27. package/dist/connectors/telegram/runnerPairingMessages.js.map +1 -0
  28. package/dist/i18n/de.d.ts.map +1 -1
  29. package/dist/i18n/de.js +58 -0
  30. package/dist/i18n/de.js.map +1 -1
  31. package/dist/i18n/en.d.ts.map +1 -1
  32. package/dist/i18n/en.js +58 -0
  33. package/dist/i18n/en.js.map +1 -1
  34. package/dist/i18n/es.d.ts.map +1 -1
  35. package/dist/i18n/es.js +58 -0
  36. package/dist/i18n/es.js.map +1 -1
  37. package/dist/i18n/fr.d.ts.map +1 -1
  38. package/dist/i18n/fr.js +58 -0
  39. package/dist/i18n/fr.js.map +1 -1
  40. package/dist/i18n/hi.d.ts.map +1 -1
  41. package/dist/i18n/hi.js +58 -0
  42. package/dist/i18n/hi.js.map +1 -1
  43. package/dist/i18n/ja.d.ts.map +1 -1
  44. package/dist/i18n/ja.js +58 -0
  45. package/dist/i18n/ja.js.map +1 -1
  46. package/dist/i18n/ka.d.ts.map +1 -1
  47. package/dist/i18n/ka.js +58 -0
  48. package/dist/i18n/ka.js.map +1 -1
  49. package/dist/i18n/pt.d.ts.map +1 -1
  50. package/dist/i18n/pt.js +58 -0
  51. package/dist/i18n/pt.js.map +1 -1
  52. package/dist/i18n/ru.d.ts.map +1 -1
  53. package/dist/i18n/ru.js +58 -0
  54. package/dist/i18n/ru.js.map +1 -1
  55. package/dist/i18n/uk.d.ts.map +1 -1
  56. package/dist/i18n/uk.js +58 -0
  57. package/dist/i18n/uk.js.map +1 -1
  58. package/dist/i18n/uz.d.ts.map +1 -1
  59. package/dist/i18n/uz.js +58 -0
  60. package/dist/i18n/uz.js.map +1 -1
  61. package/dist/i18n/zh.d.ts.map +1 -1
  62. package/dist/i18n/zh.js +58 -0
  63. package/dist/i18n/zh.js.map +1 -1
  64. package/dist/installManager.d.ts +57 -1
  65. package/dist/installManager.d.ts.map +1 -1
  66. package/dist/installManager.js +88 -10
  67. package/dist/installManager.js.map +1 -1
  68. package/dist/instanceSettings.d.ts +12 -2
  69. package/dist/instanceSettings.d.ts.map +1 -1
  70. package/dist/instanceSettings.js +17 -3
  71. package/dist/instanceSettings.js.map +1 -1
  72. package/dist/outputTrace.d.ts +6 -0
  73. package/dist/outputTrace.d.ts.map +1 -1
  74. package/dist/outputTrace.js +24 -1
  75. package/dist/outputTrace.js.map +1 -1
  76. package/dist/remoteRun/cliArgs.d.ts +2 -0
  77. package/dist/remoteRun/cliArgs.d.ts.map +1 -1
  78. package/dist/remoteRun/cliArgs.js +11 -2
  79. package/dist/remoteRun/cliArgs.js.map +1 -1
  80. package/dist/remoteRun/commands.d.ts +21 -0
  81. package/dist/remoteRun/commands.d.ts.map +1 -1
  82. package/dist/remoteRun/commands.js +38 -17
  83. package/dist/remoteRun/commands.js.map +1 -1
  84. package/dist/remoteRun/interrupts.d.ts +10 -0
  85. package/dist/remoteRun/interrupts.d.ts.map +1 -1
  86. package/dist/remoteRun/interrupts.js +43 -6
  87. package/dist/remoteRun/interrupts.js.map +1 -1
  88. package/dist/remoteRun/output.d.ts +2 -0
  89. package/dist/remoteRun/output.d.ts.map +1 -1
  90. package/dist/remoteRun/output.js +45 -0
  91. package/dist/remoteRun/output.js.map +1 -1
  92. package/dist/remoteRun/pairedRunners.d.ts +51 -0
  93. package/dist/remoteRun/pairedRunners.d.ts.map +1 -0
  94. package/dist/remoteRun/pairedRunners.js +165 -0
  95. package/dist/remoteRun/pairedRunners.js.map +1 -0
  96. package/dist/remoteRun/probe.d.ts +23 -1
  97. package/dist/remoteRun/probe.d.ts.map +1 -1
  98. package/dist/remoteRun/probe.js +45 -11
  99. package/dist/remoteRun/probe.js.map +1 -1
  100. package/dist/remoteRun/remoteRunCli.d.ts +13 -6
  101. package/dist/remoteRun/remoteRunCli.d.ts.map +1 -1
  102. package/dist/remoteRun/remoteRunCli.js +34 -59
  103. package/dist/remoteRun/remoteRunCli.js.map +1 -1
  104. package/dist/remoteRun/runnerClient.d.ts +2 -0
  105. package/dist/remoteRun/runnerClient.d.ts.map +1 -1
  106. package/dist/remoteRun/runnerClient.js +5 -1
  107. package/dist/remoteRun/runnerClient.js.map +1 -1
  108. package/dist/remoteRun/runnerSummary.d.ts +24 -0
  109. package/dist/remoteRun/runnerSummary.d.ts.map +1 -0
  110. package/dist/remoteRun/runnerSummary.js +86 -0
  111. package/dist/remoteRun/runnerSummary.js.map +1 -0
  112. package/dist/remoteRun/runnerWait.d.ts +68 -0
  113. package/dist/remoteRun/runnerWait.d.ts.map +1 -0
  114. package/dist/remoteRun/runnerWait.js +137 -0
  115. package/dist/remoteRun/runnerWait.js.map +1 -0
  116. package/dist/remoteRun/runnerWaitTiming.d.ts +16 -0
  117. package/dist/remoteRun/runnerWaitTiming.d.ts.map +1 -0
  118. package/dist/remoteRun/runnerWaitTiming.js +37 -0
  119. package/dist/remoteRun/runnerWaitTiming.js.map +1 -0
  120. package/dist/remoteRun/runners.d.ts +7 -7
  121. package/dist/remoteRun/runners.d.ts.map +1 -1
  122. package/dist/remoteRun/runners.js +45 -17
  123. package/dist/remoteRun/runners.js.map +1 -1
  124. package/dist/remoteRun/runnersCatalog.d.ts +14 -0
  125. package/dist/remoteRun/runnersCatalog.d.ts.map +1 -0
  126. package/dist/remoteRun/runnersCatalog.js +68 -0
  127. package/dist/remoteRun/runnersCatalog.js.map +1 -0
  128. package/dist/remoteRun/runnersConfig.d.ts +29 -20
  129. package/dist/remoteRun/runnersConfig.d.ts.map +1 -1
  130. package/dist/remoteRun/runnersConfig.js +14 -12
  131. package/dist/remoteRun/runnersConfig.js.map +1 -1
  132. package/dist/remoteRun/ssh.d.ts +22 -2
  133. package/dist/remoteRun/ssh.d.ts.map +1 -1
  134. package/dist/remoteRun/ssh.js +41 -7
  135. package/dist/remoteRun/ssh.js.map +1 -1
  136. package/dist/runnerUtility/adminCheck.d.ts +11 -0
  137. package/dist/runnerUtility/adminCheck.d.ts.map +1 -0
  138. package/dist/runnerUtility/adminCheck.js +68 -0
  139. package/dist/runnerUtility/adminCheck.js.map +1 -0
  140. package/dist/runnerUtility/appInstall.d.ts +25 -0
  141. package/dist/runnerUtility/appInstall.d.ts.map +1 -0
  142. package/dist/runnerUtility/appInstall.js +147 -0
  143. package/dist/runnerUtility/appInstall.js.map +1 -0
  144. package/dist/runnerUtility/appUpdate.d.ts +39 -0
  145. package/dist/runnerUtility/appUpdate.d.ts.map +1 -0
  146. package/dist/runnerUtility/appUpdate.js +90 -0
  147. package/dist/runnerUtility/appUpdate.js.map +1 -0
  148. package/dist/runnerUtility/execEnv.d.ts +21 -0
  149. package/dist/runnerUtility/execEnv.d.ts.map +1 -0
  150. package/dist/runnerUtility/execEnv.js +109 -0
  151. package/dist/runnerUtility/execEnv.js.map +1 -0
  152. package/dist/runnerUtility/execSession.d.ts +13 -0
  153. package/dist/runnerUtility/execSession.d.ts.map +1 -0
  154. package/dist/runnerUtility/execSession.js +58 -0
  155. package/dist/runnerUtility/execSession.js.map +1 -0
  156. package/dist/runnerUtility/hubClient.d.ts +30 -0
  157. package/dist/runnerUtility/hubClient.d.ts.map +1 -0
  158. package/dist/runnerUtility/hubClient.js +127 -0
  159. package/dist/runnerUtility/hubClient.js.map +1 -0
  160. package/dist/runnerUtility/injectStream.d.ts +9 -0
  161. package/dist/runnerUtility/injectStream.d.ts.map +1 -0
  162. package/dist/runnerUtility/injectStream.js +12 -0
  163. package/dist/runnerUtility/injectStream.js.map +1 -0
  164. package/dist/runnerUtility/iosCheck.d.ts +62 -0
  165. package/dist/runnerUtility/iosCheck.d.ts.map +1 -0
  166. package/dist/runnerUtility/iosCheck.js +200 -0
  167. package/dist/runnerUtility/iosCheck.js.map +1 -0
  168. package/dist/runnerUtility/launcher.d.ts +5 -0
  169. package/dist/runnerUtility/launcher.d.ts.map +1 -0
  170. package/dist/runnerUtility/launcher.js +85 -0
  171. package/dist/runnerUtility/launcher.js.map +1 -0
  172. package/dist/runnerUtility/linkLoop.d.ts +47 -0
  173. package/dist/runnerUtility/linkLoop.d.ts.map +1 -0
  174. package/dist/runnerUtility/linkLoop.js +281 -0
  175. package/dist/runnerUtility/linkLoop.js.map +1 -0
  176. package/dist/runnerUtility/localLinkStop.d.ts +23 -0
  177. package/dist/runnerUtility/localLinkStop.d.ts.map +1 -0
  178. package/dist/runnerUtility/localLinkStop.js +79 -0
  179. package/dist/runnerUtility/localLinkStop.js.map +1 -0
  180. package/dist/runnerUtility/machineReport.d.ts +39 -0
  181. package/dist/runnerUtility/machineReport.d.ts.map +1 -0
  182. package/dist/runnerUtility/machineReport.js +161 -0
  183. package/dist/runnerUtility/machineReport.js.map +1 -0
  184. package/dist/runnerUtility/packageId.d.ts +5 -0
  185. package/dist/runnerUtility/packageId.d.ts.map +1 -0
  186. package/dist/runnerUtility/packageId.js +64 -0
  187. package/dist/runnerUtility/packageId.js.map +1 -0
  188. package/dist/runnerUtility/pairingRecovery.d.ts +31 -0
  189. package/dist/runnerUtility/pairingRecovery.d.ts.map +1 -0
  190. package/dist/runnerUtility/pairingRecovery.js +24 -0
  191. package/dist/runnerUtility/pairingRecovery.js.map +1 -0
  192. package/dist/runnerUtility/pueueDaemon.d.ts +36 -0
  193. package/dist/runnerUtility/pueueDaemon.d.ts.map +1 -0
  194. package/dist/runnerUtility/pueueDaemon.js +165 -0
  195. package/dist/runnerUtility/pueueDaemon.js.map +1 -0
  196. package/dist/runnerUtility/runnerCli.d.ts +18 -0
  197. package/dist/runnerUtility/runnerCli.d.ts.map +1 -0
  198. package/dist/runnerUtility/runnerCli.js +184 -0
  199. package/dist/runnerUtility/runnerCli.js.map +1 -0
  200. package/dist/runnerUtility/runnerCommands.d.ts +67 -0
  201. package/dist/runnerUtility/runnerCommands.d.ts.map +1 -0
  202. package/dist/runnerUtility/runnerCommands.js +418 -0
  203. package/dist/runnerUtility/runnerCommands.js.map +1 -0
  204. package/dist/runnerUtility/runnerConfig.d.ts +63 -0
  205. package/dist/runnerUtility/runnerConfig.d.ts.map +1 -0
  206. package/dist/runnerUtility/runnerConfig.js +153 -0
  207. package/dist/runnerUtility/runnerConfig.js.map +1 -0
  208. package/dist/runnerUtility/runnerFlags.d.ts +9 -0
  209. package/dist/runnerUtility/runnerFlags.d.ts.map +1 -0
  210. package/dist/runnerUtility/runnerFlags.js +53 -0
  211. package/dist/runnerUtility/runnerFlags.js.map +1 -0
  212. package/dist/runnerUtility/runnerHome.d.ts +30 -0
  213. package/dist/runnerUtility/runnerHome.d.ts.map +1 -0
  214. package/dist/runnerUtility/runnerHome.js +82 -0
  215. package/dist/runnerUtility/runnerHome.js.map +1 -0
  216. package/dist/runnerUtility/runnerKeys.d.ts +11 -0
  217. package/dist/runnerUtility/runnerKeys.d.ts.map +1 -0
  218. package/dist/runnerUtility/runnerKeys.js +80 -0
  219. package/dist/runnerUtility/runnerKeys.js.map +1 -0
  220. package/dist/runnerUtility/runnerServers.d.ts +40 -0
  221. package/dist/runnerUtility/runnerServers.d.ts.map +1 -0
  222. package/dist/runnerUtility/runnerServers.js +79 -0
  223. package/dist/runnerUtility/runnerServers.js.map +1 -0
  224. package/dist/runnerUtility/serviceManager.d.ts +54 -0
  225. package/dist/runnerUtility/serviceManager.d.ts.map +1 -0
  226. package/dist/runnerUtility/serviceManager.js +413 -0
  227. package/dist/runnerUtility/serviceManager.js.map +1 -0
  228. package/dist/runnerUtility/serviceUnits.d.ts +36 -0
  229. package/dist/runnerUtility/serviceUnits.d.ts.map +1 -0
  230. package/dist/runnerUtility/serviceUnits.js +169 -0
  231. package/dist/runnerUtility/serviceUnits.js.map +1 -0
  232. package/dist/runnerUtility/toolInstall.d.ts +95 -0
  233. package/dist/runnerUtility/toolInstall.d.ts.map +1 -0
  234. package/dist/runnerUtility/toolInstall.js +232 -0
  235. package/dist/runnerUtility/toolInstall.js.map +1 -0
  236. package/dist/runnerUtility/versionPollTiming.d.ts +16 -0
  237. package/dist/runnerUtility/versionPollTiming.d.ts.map +1 -0
  238. package/dist/runnerUtility/versionPollTiming.js +36 -0
  239. package/dist/runnerUtility/versionPollTiming.js.map +1 -0
  240. package/dist/runners/authorizedKeys.d.ts +52 -0
  241. package/dist/runners/authorizedKeys.d.ts.map +1 -0
  242. package/dist/runners/authorizedKeys.js +153 -0
  243. package/dist/runners/authorizedKeys.js.map +1 -0
  244. package/dist/runners/bootstrapLine.d.ts +4 -0
  245. package/dist/runners/bootstrapLine.d.ts.map +1 -0
  246. package/dist/runners/bootstrapLine.js +69 -0
  247. package/dist/runners/bootstrapLine.js.map +1 -0
  248. package/dist/runners/gate.d.ts +41 -0
  249. package/dist/runners/gate.d.ts.map +1 -0
  250. package/dist/runners/gate.js +216 -0
  251. package/dist/runners/gate.js.map +1 -0
  252. package/dist/runners/gateLink.d.ts +26 -0
  253. package/dist/runners/gateLink.d.ts.map +1 -0
  254. package/dist/runners/gateLink.js +240 -0
  255. package/dist/runners/gateLink.js.map +1 -0
  256. package/dist/runners/gateProtocol.d.ts +98 -0
  257. package/dist/runners/gateProtocol.d.ts.map +1 -0
  258. package/dist/runners/gateProtocol.js +149 -0
  259. package/dist/runners/gateProtocol.js.map +1 -0
  260. package/dist/runners/gateWrapper.d.ts +6 -0
  261. package/dist/runners/gateWrapper.d.ts.map +1 -0
  262. package/dist/runners/gateWrapper.js +70 -0
  263. package/dist/runners/gateWrapper.js.map +1 -0
  264. package/dist/runners/hubAddress.d.ts +33 -0
  265. package/dist/runners/hubAddress.d.ts.map +1 -0
  266. package/dist/runners/hubAddress.js +88 -0
  267. package/dist/runners/hubAddress.js.map +1 -0
  268. package/dist/runners/hubAddressCandidates.d.ts +16 -0
  269. package/dist/runners/hubAddressCandidates.d.ts.map +1 -0
  270. package/dist/runners/hubAddressCandidates.js +96 -0
  271. package/dist/runners/hubAddressCandidates.js.map +1 -0
  272. package/dist/runners/hubIds.d.ts +16 -0
  273. package/dist/runners/hubIds.d.ts.map +1 -0
  274. package/dist/runners/hubIds.js +25 -0
  275. package/dist/runners/hubIds.js.map +1 -0
  276. package/dist/runners/hubKey.d.ts +6 -0
  277. package/dist/runners/hubKey.d.ts.map +1 -0
  278. package/dist/runners/hubKey.js +78 -0
  279. package/dist/runners/hubKey.js.map +1 -0
  280. package/dist/runners/hubLock.d.ts +7 -0
  281. package/dist/runners/hubLock.d.ts.map +1 -0
  282. package/dist/runners/hubLock.js +230 -0
  283. package/dist/runners/hubLock.js.map +1 -0
  284. package/dist/runners/hubPackage.d.ts +23 -0
  285. package/dist/runners/hubPackage.d.ts.map +1 -0
  286. package/dist/runners/hubPackage.js +184 -0
  287. package/dist/runners/hubPackage.js.map +1 -0
  288. package/dist/runners/hubPairing.d.ts +63 -0
  289. package/dist/runners/hubPairing.d.ts.map +1 -0
  290. package/dist/runners/hubPairing.js +261 -0
  291. package/dist/runners/hubPairing.js.map +1 -0
  292. package/dist/runners/hubPaths.d.ts +38 -0
  293. package/dist/runners/hubPaths.d.ts.map +1 -0
  294. package/dist/runners/hubPaths.js +94 -0
  295. package/dist/runners/hubPaths.js.map +1 -0
  296. package/dist/runners/hubRegistry.d.ts +112 -0
  297. package/dist/runners/hubRegistry.d.ts.map +1 -0
  298. package/dist/runners/hubRegistry.js +210 -0
  299. package/dist/runners/hubRegistry.js.map +1 -0
  300. package/dist/runners/linkControl.d.ts +27 -0
  301. package/dist/runners/linkControl.d.ts.map +1 -0
  302. package/dist/runners/linkControl.js +124 -0
  303. package/dist/runners/linkControl.js.map +1 -0
  304. package/dist/runners/pairCode.d.ts +30 -0
  305. package/dist/runners/pairCode.d.ts.map +1 -0
  306. package/dist/runners/pairCode.js +46 -0
  307. package/dist/runners/pairCode.js.map +1 -0
  308. package/dist/runners/pairingTiming.d.ts +18 -0
  309. package/dist/runners/pairingTiming.d.ts.map +1 -0
  310. package/dist/runners/pairingTiming.js +42 -0
  311. package/dist/runners/pairingTiming.js.map +1 -0
  312. package/dist/runners/runnerProxy.d.ts +9 -0
  313. package/dist/runners/runnerProxy.d.ts.map +1 -0
  314. package/dist/runners/runnerProxy.js +67 -0
  315. package/dist/runners/runnerProxy.js.map +1 -0
  316. package/dist/runners/runnerRemoval.d.ts +21 -0
  317. package/dist/runners/runnerRemoval.d.ts.map +1 -0
  318. package/dist/runners/runnerRemoval.js +82 -0
  319. package/dist/runners/runnerRemoval.js.map +1 -0
  320. package/dist/runners/runnersCli.d.ts +16 -0
  321. package/dist/runners/runnersCli.d.ts.map +1 -0
  322. package/dist/runners/runnersCli.js +214 -0
  323. package/dist/runners/runnersCli.js.map +1 -0
  324. package/dist/runners/runnersList.d.ts +17 -0
  325. package/dist/runners/runnersList.d.ts.map +1 -0
  326. package/dist/runners/runnersList.js +49 -0
  327. package/dist/runners/runnersList.js.map +1 -0
  328. package/dist/runners/runnersOverview.d.ts +20 -0
  329. package/dist/runners/runnersOverview.d.ts.map +1 -0
  330. package/dist/runners/runnersOverview.js +55 -0
  331. package/dist/runners/runnersOverview.js.map +1 -0
  332. package/dist/runners/sshKeys.d.ts +26 -0
  333. package/dist/runners/sshKeys.d.ts.map +1 -0
  334. package/dist/runners/sshKeys.js +60 -0
  335. package/dist/runners/sshKeys.js.map +1 -0
  336. package/dist/runners/tarArchive.d.ts +20 -0
  337. package/dist/runners/tarArchive.d.ts.map +1 -0
  338. package/dist/runners/tarArchive.js +70 -0
  339. package/dist/runners/tarArchive.js.map +1 -0
  340. package/dist/scheduler/mcpSurface.d.ts +11 -5
  341. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  342. package/dist/scheduler/mcpSurface.js +59 -26
  343. package/dist/scheduler/mcpSurface.js.map +1 -1
  344. package/dist/selfUpdate/selfCheck.js +2 -2
  345. package/dist/selfUpdate/selfCheck.js.map +1 -1
  346. package/dist/testTimings.d.ts +5 -2
  347. package/dist/testTimings.d.ts.map +1 -1
  348. package/dist/testTimings.js +10 -1
  349. package/dist/testTimings.js.map +1 -1
  350. package/dist/utils/agentEnvironment.d.ts +6 -2
  351. package/dist/utils/agentEnvironment.d.ts.map +1 -1
  352. package/dist/utils/agentEnvironment.js +13 -2
  353. package/dist/utils/agentEnvironment.js.map +1 -1
  354. package/dist/utils/runnersScreenPlan.d.ts +130 -0
  355. package/dist/utils/runnersScreenPlan.d.ts.map +1 -0
  356. package/dist/utils/runnersScreenPlan.js +257 -0
  357. package/dist/utils/runnersScreenPlan.js.map +1 -0
  358. package/package.json +5 -2
  359. package/remoteRun/runner.sh +81 -6
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.renderLauncher = renderLauncher;
37
+ exports.ensureLauncher = ensureLauncher;
38
+ const fs = __importStar(require("fs"));
39
+ const configDirFile_1 = require("../configDirFile");
40
+ const tmuxExec_1 = require("../utils/tmuxExec");
41
+ const appInstall_1 = require("./appInstall");
42
+ /**
43
+ * @description `~/.charness-runner/bin/charness-runner`: a two-line `sh` loop that starts the app `current` points at and starts it
44
+ * AGAIN when it exits with {@link restartExitCode} (an update installed a newer copy). The app runs in the background of the
45
+ * script so that the script can pass TERM / INT / HUP on to it: under systemd's `KillMode=process` only the script is signalled, and
46
+ * without the forwarding the app would be left running unsupervised. Terminal runs, the systemd unit and the launchd
47
+ * job all start this one file, so an update needs no service reinstall. `node` is the one that made the file; if it has moved, the
48
+ * `node` on PATH is tried.
49
+ */
50
+ const launcherMode = 0o755;
51
+ function renderLauncher(paths, nodePath) {
52
+ const cli = `${paths.currentApp}/dist/runnerUtility/runnerCli.js`;
53
+ return [
54
+ '#!/bin/sh',
55
+ '# Written by charness-runner. Exit code 75 asks for a restart onto an updated copy; TERM / INT / HUP go to the app.',
56
+ `NODE=${(0, tmuxExec_1.shellSingleQuote)(nodePath)}`,
57
+ '[ -x "$NODE" ] || NODE=node',
58
+ 'child=',
59
+ 'trap \'[ -n "$child" ] && kill -TERM "$child" 2>/dev/null\' TERM INT HUP',
60
+ 'while :; do',
61
+ ` "$NODE" ${(0, tmuxExec_1.shellSingleQuote)(cli)} "$@" &`,
62
+ ' child=$!',
63
+ ' code=0',
64
+ ' while kill -0 "$child" 2>/dev/null; do wait "$child"; code=$?; done',
65
+ ` [ "$code" = ${appInstall_1.restartExitCode} ] || exit "$code"`,
66
+ 'done',
67
+ '',
68
+ ].join('\n');
69
+ }
70
+ /** @description Write the launcher (when it differs) and return its path. */
71
+ function ensureLauncher(paths, nodePath) {
72
+ fs.mkdirSync(paths.binDir, { recursive: true, mode: 0o700 });
73
+ const text = renderLauncher(paths, nodePath);
74
+ let current = null;
75
+ try {
76
+ current = fs.readFileSync(paths.launcher, 'utf8');
77
+ }
78
+ catch {
79
+ current = null;
80
+ }
81
+ if (current !== text)
82
+ (0, configDirFile_1.writeTextFileAtomically)(paths.launcher, text, launcherMode);
83
+ return paths.launcher;
84
+ }
85
+ //# sourceMappingURL=launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/runnerUtility/launcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,wCAkBC;AAGD,wCAWC;AAjDD,uCAAyB;AACzB,oDAA2D;AAC3D,gDAAqD;AACrD,6CAA+C;AAG/C;;;;;;;GAOG;AAEH,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,SAAgB,cAAc,CAAC,KAA0C,EAAE,QAAgB;IACzF,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,UAAU,kCAAkC,CAAC;IAClE,OAAO;QACL,WAAW;QACX,qHAAqH;QACrH,QAAQ,IAAA,2BAAgB,EAAC,QAAQ,CAAC,EAAE;QACpC,6BAA6B;QAC7B,QAAQ;QACR,0EAA0E;QAC1E,aAAa;QACb,aAAa,IAAA,2BAAgB,EAAC,GAAG,CAAC,SAAS;QAC3C,YAAY;QACZ,UAAU;QACV,uEAAuE;QACvE,iBAAiB,4BAAe,oBAAoB;QACpD,MAAM;QACN,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,SAAgB,cAAc,CAAC,KAAsB,EAAE,QAAgB;IACrE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,IAAI;QAAE,IAAA,uCAAuB,EAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { updateFromHub } from './appUpdate';
2
+ import { connectToHub } from './hubClient';
3
+ import { type RunnerConfig } from './runnerConfig';
4
+ import type { RunnerHomePaths } from './runnerHome';
5
+ import type { RunnerKeys } from './runnerKeys';
6
+ import type { RunnerServers } from './runnerServers';
7
+ export declare const removedRetryMs: number;
8
+ /** How long after the first refusal of the key a second one confirms that the runner was removed. */
9
+ export declare const removalConfirmMs: number;
10
+ /**
11
+ * How long the hub must have been refusing the key, without ever saying «this runner is not paired», before the runner takes the refusal
12
+ * for a removal worth killing its jobs for. A refused key alone is also what a hub with a locked home folder, a changed file mode or an
13
+ * edited sshd setting looks like, and those last hours (a night, until someone unlocks the volume); killing a long run for them is the
14
+ * wrong mistake. A hub that removes an ONLINE runner stops its jobs itself over the link (`runners/runnerRemoval.ts`), and a hub that can
15
+ * answer says so (`identity`), so this only covers a machine that was off when it was removed.
16
+ */
17
+ export declare const unconfirmedRemovalStopAfterMs: number;
18
+ /** @description The wait before attempt number `failures + 1` (0 failures: the first retry); `random` is in [0, 1). */
19
+ export declare function computeBackoffMs(failures: number, random: number): number;
20
+ export interface LinkLoopDeps {
21
+ paths: RunnerHomePaths;
22
+ config: RunnerConfig;
23
+ keys: RunnerKeys;
24
+ servers: RunnerServers;
25
+ now?: () => number;
26
+ /** How often a linked runner asks the hub for its package (default: {@link readRunnerVersionPollMs}). */
27
+ versionPollMs?: number;
28
+ /** Stops the jobs of the queue; called when the runner learns it was removed. */
29
+ stopJobs?: () => Promise<void>;
30
+ /** The wait between the two refusals that confirm a removal (default {@link removalConfirmMs}). */
31
+ removalConfirmMs?: number;
32
+ /** How long a bare refusal of the key must last before it stops the jobs (default {@link unconfirmedRemovalStopAfterMs}). */
33
+ unconfirmedRemovalStopAfterMs?: number;
34
+ random?: () => number;
35
+ sleep?: (ms: number, signal: AbortSignal) => Promise<void>;
36
+ connect?: typeof connectToHub;
37
+ update?: typeof updateFromHub;
38
+ log?: (line: string) => void;
39
+ }
40
+ export interface LinkLoopHandle {
41
+ /** Run until aborted (resolves 0) or until an update asks for a restart (resolves {@link restartExitCode}). */
42
+ run: (signal: AbortSignal) => Promise<number>;
43
+ /** The built-in server calls this whenever the number of running commands changes. */
44
+ notifyActiveCountChange: () => void;
45
+ }
46
+ export declare function createLinkLoop(deps: LinkLoopDeps): LinkLoopHandle;
47
+ //# sourceMappingURL=linkLoop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkLoop.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/linkLoop.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,aAAa,EAAsB,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAY,YAAY,EAAyD,MAAM,aAAa,CAAC;AAE5G,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAsBrD,eAAO,MAAM,cAAc,QAAiB,CAAC;AAC7C,qGAAqG;AACrG,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAC1C;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,QAAsB,CAAC;AAEjE,uHAAuH;AACvH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yGAAyG;IACzG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6HAA6H;IAC7H,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,+GAA+G;IAC/G,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,sFAAsF;IACtF,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC;AAoBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAuMjE"}
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unconfirmedRemovalStopAfterMs = exports.removalConfirmMs = exports.removedRetryMs = void 0;
4
+ exports.computeBackoffMs = computeBackoffMs;
5
+ exports.createLinkLoop = createLinkLoop;
6
+ const appInstall_1 = require("./appInstall");
7
+ const appUpdate_1 = require("./appUpdate");
8
+ const gateProtocol_1 = require("../runners/gateProtocol");
9
+ const hubClient_1 = require("./hubClient");
10
+ const versionPollTiming_1 = require("./versionPollTiming");
11
+ const runnerConfig_1 = require("./runnerConfig");
12
+ /**
13
+ * @description The runner's permanent link to the hub: connect (outbound ssh, host key pinned, the runner's own key), run `link`, hand the
14
+ * channel to the built-in ssh server, and when it drops come back — forever. The pairing survives restarts, reboots, sleep and network
15
+ * changes because nothing here is state but `config.json` and the keys.
16
+ *
17
+ * backoff 1 s, doubling, up to 5 min, ±20 % jitter; a link that held for 30 s starts the series again
18
+ * removed the hub no longer knows this runner: its key is refused (twice, a short time apart — one refusal could be a key file being
19
+ * rewritten), or the gate answers that the runner is not paired. Say so in the status, STOP THE QUEUE'S JOBS (Pueue outlives
20
+ * the link by design, so a removal must be told apart from an ordinary disconnection and end the work the hub's agents
21
+ * left running here), and ask again once an hour — never a flood that trips fail2ban
22
+ * update the `link` answer names the hub's package id, and a linked runner asks again every few minutes (`version`, over the
23
+ * connection it holds); an idle runner whose id differs updates and asks the launcher for a restart
24
+ * closing the attempt ends when the `link` CHANNEL ends or the connection does — the hub's gate dying, or the link being cut, closes
25
+ * the channel while the connection to sshd stays up and keeps answering keepalives, so the connection alone proves nothing
26
+ */
27
+ const initialBackoffMs = 1000;
28
+ const maxBackoffMs = 5 * 60 * 1000;
29
+ const jitterRatio = 0.2;
30
+ const stableLinkMs = 30 * 1000;
31
+ exports.removedRetryMs = 60 * 60 * 1000;
32
+ /** How long after the first refusal of the key a second one confirms that the runner was removed. */
33
+ exports.removalConfirmMs = 15 * 1000;
34
+ /**
35
+ * How long the hub must have been refusing the key, without ever saying «this runner is not paired», before the runner takes the refusal
36
+ * for a removal worth killing its jobs for. A refused key alone is also what a hub with a locked home folder, a changed file mode or an
37
+ * edited sshd setting looks like, and those last hours (a night, until someone unlocks the volume); killing a long run for them is the
38
+ * wrong mistake. A hub that removes an ONLINE runner stops its jobs itself over the link (`runners/runnerRemoval.ts`), and a hub that can
39
+ * answer says so (`identity`), so this only covers a machine that was off when it was removed.
40
+ */
41
+ exports.unconfirmedRemovalStopAfterMs = 12 * 60 * 60 * 1000;
42
+ /** @description The wait before attempt number `failures + 1` (0 failures: the first retry); `random` is in [0, 1). */
43
+ function computeBackoffMs(failures, random) {
44
+ const base = Math.min(maxBackoffMs, initialBackoffMs * 2 ** Math.max(0, failures));
45
+ return Math.round(base * (1 - jitterRatio + 2 * jitterRatio * random));
46
+ }
47
+ function sleepUnlessAborted(ms, signal) {
48
+ return new Promise((resolve) => {
49
+ if (signal.aborted) {
50
+ resolve();
51
+ return;
52
+ }
53
+ const timer = setTimeout(done, ms);
54
+ function done() {
55
+ clearTimeout(timer);
56
+ signal.removeEventListener('abort', done);
57
+ resolve();
58
+ }
59
+ signal.addEventListener('abort', done, { once: true });
60
+ });
61
+ }
62
+ function createLinkLoop(deps) {
63
+ const now = deps.now ?? Date.now;
64
+ const random = deps.random ?? Math.random;
65
+ const sleep = deps.sleep ?? sleepUnlessAborted;
66
+ const connect = deps.connect ?? hubClient_1.connectToHub;
67
+ const update = deps.update ?? appUpdate_1.updateFromHub;
68
+ const log = deps.log ?? (() => undefined);
69
+ const versionPollMs = deps.versionPollMs ?? (0, versionPollTiming_1.readRunnerVersionPollMs)(process.env);
70
+ const confirmMs = deps.removalConfirmMs ?? exports.removalConfirmMs;
71
+ const stopAfterMs = deps.unconfirmedRemovalStopAfterMs ?? exports.unconfirmedRemovalStopAfterMs;
72
+ const endpoint = { host: deps.config.hub.host, port: deps.config.hub.port, user: deps.config.hub.user, hostKey: deps.config.hub.hostKey };
73
+ let installedPackageId = deps.config.packageId;
74
+ let state = 'connecting';
75
+ let stateSinceMs = now();
76
+ let lastError = null;
77
+ let failedUpdate = null;
78
+ let pendingUpdateId = null;
79
+ let onIdleUpdate = null;
80
+ const writeStatus = (nextState, error) => {
81
+ if (nextState !== state) {
82
+ state = nextState;
83
+ stateSinceMs = now();
84
+ }
85
+ lastError = error;
86
+ try {
87
+ (0, runnerConfig_1.writeRunnerStatus)(deps.paths, { pid: process.pid, state, sinceMs: stateSinceMs, updatedAtMs: now(), lastError, activeJobs: deps.servers.getActiveExecCount(), packageId: installedPackageId });
88
+ }
89
+ catch (writeError) {
90
+ log(`cannot write status.json (${writeError instanceof Error ? writeError.message : 'unknown'})`);
91
+ }
92
+ };
93
+ const tryUpdate = async (hubPackageId, signal) => {
94
+ log(`updating to the hub's package ${hubPackageId}`);
95
+ const outcome = await update({ paths: deps.paths, config: { ...deps.config, packageId: installedPackageId }, clientPrivateKey: deps.keys.client.privateKey });
96
+ if (outcome.ok)
97
+ installedPackageId = outcome.packageId;
98
+ else
99
+ failedUpdate = { packageId: hubPackageId, atMs: now() };
100
+ return signal.aborted ? null : outcome;
101
+ };
102
+ const runOnce = async (signal) => {
103
+ writeStatus('connecting', lastError);
104
+ let client;
105
+ try {
106
+ client = await connect(endpoint, deps.keys.client.privateKey);
107
+ }
108
+ catch (error) {
109
+ if (error instanceof hubClient_1.HubConnectionError && error.failure === 'auth')
110
+ return { kind: 'removed', isConfirmed: false };
111
+ return { kind: 'failed', reason: error instanceof Error ? error.message : 'could not connect' };
112
+ }
113
+ let answer;
114
+ try {
115
+ answer = await (0, hubClient_1.callGate)(client, 'link', null);
116
+ }
117
+ catch (error) {
118
+ client.end();
119
+ return { kind: 'failed', reason: error instanceof Error ? error.message : 'the link request failed' };
120
+ }
121
+ // A stop that came during the connect or the handshake fired before anything listened for it, and the listener added further down would
122
+ // never hear it: the link would stay up and `run` would never return. So the stop is looked at HERE, right after the awaited answer and
123
+ // before anything else is started on it — a refusal's follow-up request, an update (a download and a blocking install), the link itself.
124
+ // The branches that wait further (the follow-up request, the update) end the attempt, and on the way to the listener nothing waits.
125
+ if (signal.aborted) {
126
+ answer?.channel.destroy();
127
+ client.end();
128
+ return { kind: 'closed', lastedMs: 0 };
129
+ }
130
+ if (answer === null) {
131
+ // The gate refused (no marker). If the hub says it does not know this runner, that is a removal whose key line outlived the registry entry.
132
+ const identity = await (0, hubClient_1.requestGateJson)(client, 'identity', null, gateProtocol_1.redeemReplySchema).catch(() => null);
133
+ client.end();
134
+ if (identity !== null && !identity.ok)
135
+ return { kind: 'removed', isConfirmed: true };
136
+ return { kind: 'failed', reason: 'the hub did not start the link' };
137
+ }
138
+ let hubPackageId = answer.marker.fields.package;
139
+ const decide = () => (0, appUpdate_1.decideUpdate)({
140
+ hubPackageId,
141
+ installedPackageId,
142
+ activeExecCount: deps.servers.getActiveExecCount(),
143
+ failedPackageId: failedUpdate?.packageId ?? null,
144
+ failedAtMs: failedUpdate?.atMs ?? 0,
145
+ nowMs: now(),
146
+ });
147
+ if (decide() === 'update-now' && hubPackageId !== undefined) {
148
+ answer.channel.destroy();
149
+ client.end();
150
+ const outcome = await tryUpdate(hubPackageId, signal);
151
+ return outcome?.ok === true ? { kind: 'restart' } : { kind: 'failed', reason: outcome === null ? 'stopped' : `update failed: ${outcome.reason}` };
152
+ }
153
+ deps.servers.acceptLinkStream(answer.channel);
154
+ answer.channel.resume();
155
+ writeStatus('linked', null);
156
+ const linkedAtMs = now();
157
+ return new Promise((resolve) => {
158
+ let isDone = false;
159
+ // While an update is being installed the link is deliberately closed: its closing is not the attempt ending, and the attempt
160
+ // ends only with the update's outcome — otherwise the loop would reconnect and run the next attempt beside the install.
161
+ let isUpdating = false;
162
+ let pollTimer = null;
163
+ const closedResult = () => ({ kind: 'closed', lastedMs: now() - linkedAtMs });
164
+ const finish = (result) => {
165
+ if (isDone)
166
+ return;
167
+ isDone = true;
168
+ if (pollTimer !== null)
169
+ clearInterval(pollTimer);
170
+ onIdleUpdate = null;
171
+ signal.removeEventListener('abort', onAbort);
172
+ client.end();
173
+ resolve(result);
174
+ };
175
+ const onAbort = () => finish(closedResult());
176
+ const onLost = () => {
177
+ if (!isUpdating)
178
+ finish(closedResult());
179
+ };
180
+ const startUpdate = (targetId) => {
181
+ isUpdating = true;
182
+ pendingUpdateId = null;
183
+ onIdleUpdate = null;
184
+ if (pollTimer !== null)
185
+ clearInterval(pollTimer);
186
+ client.end();
187
+ void tryUpdate(targetId, signal).then((outcome) => finish(outcome?.ok === true ? { kind: 'restart' } : closedResult()));
188
+ };
189
+ const considerUpdate = () => {
190
+ const decision = decide();
191
+ if (decision === 'update-now' && hubPackageId !== undefined) {
192
+ startUpdate(hubPackageId);
193
+ }
194
+ else if (decision === 'wait-until-idle' && hubPackageId !== undefined) {
195
+ pendingUpdateId = hubPackageId;
196
+ onIdleUpdate = () => {
197
+ if (pendingUpdateId !== null && decide() === 'update-now')
198
+ startUpdate(pendingUpdateId);
199
+ };
200
+ }
201
+ };
202
+ const askHubForPackage = async () => {
203
+ if (isUpdating || isDone)
204
+ return;
205
+ try {
206
+ const versionAnswer = await (0, hubClient_1.callGate)(client, 'version', null);
207
+ if (versionAnswer === null)
208
+ return;
209
+ versionAnswer.channel.resume();
210
+ if (isUpdating || isDone)
211
+ return;
212
+ hubPackageId = versionAnswer.marker.fields.package;
213
+ considerUpdate();
214
+ }
215
+ catch (error) {
216
+ log(`could not ask the hub for its package (${error instanceof Error ? error.message : 'unknown'})`);
217
+ }
218
+ };
219
+ signal.addEventListener('abort', onAbort, { once: true });
220
+ client.once('close', onLost);
221
+ client.once('error', onLost);
222
+ answer.channel.once('close', onLost);
223
+ answer.channel.once('error', onLost);
224
+ considerUpdate();
225
+ if (!isUpdating)
226
+ pollTimer = setInterval(() => { void askHubForPackage(); }, versionPollMs);
227
+ });
228
+ };
229
+ return {
230
+ notifyActiveCountChange: () => {
231
+ if (deps.servers.getActiveExecCount() === 0)
232
+ onIdleUpdate?.();
233
+ },
234
+ run: async (signal) => {
235
+ let failures = 0;
236
+ let firstRefusalAtMs = null;
237
+ while (!signal.aborted) {
238
+ const result = await runOnce(signal);
239
+ if (result.kind === 'restart')
240
+ return appInstall_1.restartExitCode;
241
+ // A stop that came while the attempt was under way (any of its awaits: the connect, the answers, an update) is not an event of the link:
242
+ // whatever the attempt ended with — a refusal read as a removal, a failure, a closed link — is not acted on. No «removed» status, no
243
+ // job stopped on a hub's answer to a runner that was already leaving, no error line.
244
+ if (signal.aborted)
245
+ return 0;
246
+ if (result.kind === 'removed') {
247
+ const now0 = now();
248
+ firstRefusalAtMs ??= now0;
249
+ if (!result.isConfirmed && now0 - firstRefusalAtMs < confirmMs) {
250
+ writeStatus('error', 'the hub refused the key; asking once more before taking this for a removal');
251
+ await sleep(confirmMs, signal);
252
+ continue;
253
+ }
254
+ writeStatus('removed', `removed by ${deps.config.hub.label}`);
255
+ if (result.isConfirmed || now0 - firstRefusalAtMs >= stopAfterMs) {
256
+ log(`the hub no longer knows this runner: removed by ${deps.config.hub.label}; stopping its jobs, then asking again in an hour`);
257
+ await deps.stopJobs?.().catch((error) => log(`could not stop the jobs (${error instanceof Error ? error.message : 'unknown error'})`));
258
+ }
259
+ else {
260
+ log(`the hub refuses this runner's key (removed by ${deps.config.hub.label}?); its jobs are left alone unless that lasts ${Math.round(stopAfterMs / 3_600_000)} hours without the hub saying more, asking again in an hour`);
261
+ }
262
+ await sleep(exports.removedRetryMs, signal);
263
+ continue;
264
+ }
265
+ firstRefusalAtMs = null;
266
+ if (result.kind === 'failed') {
267
+ writeStatus('error', result.reason);
268
+ log(`link failed: ${result.reason}`);
269
+ failures += 1;
270
+ }
271
+ else {
272
+ failures = result.lastedMs >= stableLinkMs ? 0 : failures + 1;
273
+ writeStatus('connecting', null);
274
+ }
275
+ await sleep(computeBackoffMs(Math.max(0, failures - 1), random()), signal);
276
+ }
277
+ return 0;
278
+ },
279
+ };
280
+ }
281
+ //# sourceMappingURL=linkLoop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkLoop.js","sourceRoot":"","sources":["../../src/runnerUtility/linkLoop.ts"],"names":[],"mappings":";;;AA4CA,4CAGC;AAgDD,wCAuMC;AArSD,6CAA+C;AAC/C,2CAA8E;AAC9E,0DAA4D;AAC5D,2CAA4G;AAC5G,2DAA8D;AAC9D,iDAAsF;AAKtF;;;;;;;;;;;;;;GAcG;AAEH,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC;AAClB,QAAA,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,qGAAqG;AACxF,QAAA,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C;;;;;;GAMG;AACU,QAAA,6BAA6B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjE,uHAAuH;AACvH,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,GAAG,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;AACzE,CAAC;AA8BD,SAAS,kBAAkB,CAAC,EAAU,EAAE,MAAmB;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,SAAS,IAAI;YACX,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAID,SAAgB,cAAc,CAAC,IAAkB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,wBAAY,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,yBAAa,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAA,2CAAuB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,wBAAgB,CAAC;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,6BAA6B,IAAI,qCAA6B,CAAC;IACxF,MAAM,QAAQ,GAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACvJ,IAAI,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/C,IAAI,KAAK,GAAc,YAAY,CAAC;IACpC,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC;IACzB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,YAAY,GAA+C,IAAI,CAAC;IACpE,IAAI,eAAe,GAAkB,IAAI,CAAC;IAC1C,IAAI,YAAY,GAAwB,IAAI,CAAC;IAE7C,MAAM,WAAW,GAAG,CAAC,SAAoB,EAAE,KAAoB,EAAQ,EAAE;QACvE,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,KAAK,GAAG,SAAS,CAAC;YAClB,YAAY,GAAG,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,SAAS,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,IAAA,gCAAiB,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACjM,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,GAAG,CAAC,6BAA6B,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;QACpG,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,YAAoB,EAAE,MAAmB,EAAiC,EAAE;QACnG,GAAG,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9J,IAAI,OAAO,CAAC,EAAE;YAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;;YAClD,YAAY,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,MAAmB,EAA0B,EAAE;QACpE,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACrC,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,8BAAkB,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YACpH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;QAClG,CAAC;QACD,IAAI,MAA4C,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAA,oBAAQ,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;QACxG,CAAC;QACD,wIAAwI;QACxI,wIAAwI;QACxI,yIAAyI;QACzI,oIAAoI;QACpI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,4IAA4I;YAC5I,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAe,EAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gCAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACtG,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC;QACtE,CAAC;QACD,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,GAAG,GAAoC,EAAE,CAAC,IAAA,wBAAY,EAAC;YACjE,YAAY;YACZ,kBAAkB;YAClB,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;YAClD,eAAe,EAAE,YAAY,EAAE,SAAS,IAAI,IAAI;YAChD,UAAU,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC;YACnC,KAAK,EAAE,GAAG,EAAE;SACb,CAAC,CAAC;QACH,IAAI,MAAM,EAAE,KAAK,YAAY,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACtD,OAAO,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACpJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;YAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,6HAA6H;YAC7H,wHAAwH;YACxH,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,SAAS,GAA0B,IAAI,CAAC;YAC5C,MAAM,YAAY,GAAG,GAAkB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;YAC7F,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAQ,EAAE;gBAC7C,IAAI,MAAM;oBAAE,OAAO;gBACnB,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,SAAS,KAAK,IAAI;oBAAE,aAAa,CAAC,SAAS,CAAC,CAAC;gBACjD,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,GAAS,EAAE;gBACxB,IAAI,CAAC,UAAU;oBAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC;YACF,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAQ,EAAE;gBAC7C,UAAU,GAAG,IAAI,CAAC;gBAClB,eAAe,GAAG,IAAI,CAAC;gBACvB,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,SAAS,KAAK,IAAI;oBAAE,aAAa,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,KAAK,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAC1H,CAAC,CAAC;YACF,MAAM,cAAc,GAAG,GAAS,EAAE;gBAChC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;gBAC1B,IAAI,QAAQ,KAAK,YAAY,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC5D,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,QAAQ,KAAK,iBAAiB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBACxE,eAAe,GAAG,YAAY,CAAC;oBAC/B,YAAY,GAAG,GAAS,EAAE;wBACxB,IAAI,eAAe,KAAK,IAAI,IAAI,MAAM,EAAE,KAAK,YAAY;4BAAE,WAAW,CAAC,eAAe,CAAC,CAAC;oBAC1F,CAAC,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC;YACF,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;gBACjD,IAAI,UAAU,IAAI,MAAM;oBAAE,OAAO;gBACjC,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,IAAA,oBAAQ,EAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;oBAC9D,IAAI,aAAa,KAAK,IAAI;wBAAE,OAAO;oBACnC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC/B,IAAI,UAAU,IAAI,MAAM;wBAAE,OAAO;oBACjC,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;oBACnD,cAAc,EAAE,CAAC;gBACnB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,0CAA0C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;gBACvG,CAAC;YACH,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU;gBAAE,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,uBAAuB,EAAE,GAAG,EAAE;YAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC;gBAAE,YAAY,EAAE,EAAE,CAAC;QAChE,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpB,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,gBAAgB,GAAkB,IAAI,CAAC;YAC3C,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;oBAAE,OAAO,4BAAe,CAAC;gBACtD,yIAAyI;gBACzI,qIAAqI;gBACrI,qFAAqF;gBACrF,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,CAAC;gBAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC;oBACnB,gBAAgB,KAAK,IAAI,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,GAAG,gBAAgB,GAAG,SAAS,EAAE,CAAC;wBAC/D,WAAW,CAAC,OAAO,EAAE,4EAA4E,CAAC,CAAC;wBACnG,MAAM,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC/B,SAAS;oBACX,CAAC;oBACD,WAAW,CAAC,SAAS,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;oBAC9D,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,GAAG,gBAAgB,IAAI,WAAW,EAAE,CAAC;wBACjE,GAAG,CAAC,mDAAmD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,mDAAmD,CAAC,CAAC;wBACjI,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;oBACzI,CAAC;yBAAM,CAAC;wBACN,GAAG,CAAC,iDAAiD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,iDAAiD,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,6DAA6D,CAAC,CAAC;oBAC/N,CAAC;oBACD,MAAM,KAAK,CAAC,sBAAc,EAAE,MAAM,CAAC,CAAC;oBACpC,SAAS;gBACX,CAAC;gBACD,gBAAgB,GAAG,IAAI,CAAC;gBACxB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;oBACpC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrC,QAAQ,IAAI,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;oBAC9D,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { RunnerHomePaths } from './runnerHome';
2
+ export interface ProcessControl {
3
+ checkIsAlive: (pid: number) => boolean;
4
+ /** The command line of `pid`, or `null` when it cannot be read. */
5
+ readCommand: (pid: number) => string | null;
6
+ signal: (pid: number, signal: NodeJS.Signals) => void;
7
+ terminateGraceMs: number;
8
+ killGraceMs: number;
9
+ }
10
+ export declare function createProcessControl(): ProcessControl;
11
+ /** @description Is this command line the runner's link — `…/runnerCli.js run`? */
12
+ export declare function checkIsRunnerLinkCommand(command: string | null): boolean;
13
+ /**
14
+ * @description Is `pid` the runner's link — alive AND running `…/runnerCli.js run`? `status.json` is not removed when `run` exits, so after
15
+ * a reboot its pid may be dead or belong to an unrelated program: that is not a link (nothing to stop, nothing that blocks a service).
16
+ */
17
+ export declare function checkIsRunnerLinkProcess(pid: number, control?: ProcessControl): boolean;
18
+ /**
19
+ * @description Stop the link process named by `status.json` (a foreground `run`, or whatever a service started): TERM, then KILL. `null`
20
+ * when it is gone (or was never there); otherwise the reason it is still running.
21
+ */
22
+ export declare function stopLocalLink(paths: RunnerHomePaths, control?: ProcessControl): Promise<string | null>;
23
+ //# sourceMappingURL=localLinkStop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localLinkStop.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/localLinkStop.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAepD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,mEAAmE;IACnE,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IACtD,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAkBrD;AAED,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAExE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAuC,GAAG,OAAO,CAE/G;AAWD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,GAAE,cAAuC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWpI"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProcessControl = createProcessControl;
4
+ exports.checkIsRunnerLinkCommand = checkIsRunnerLinkCommand;
5
+ exports.checkIsRunnerLinkProcess = checkIsRunnerLinkProcess;
6
+ exports.stopLocalLink = stopLocalLink;
7
+ const child_process_1 = require("child_process");
8
+ const runnerConfig_1 = require("./runnerConfig");
9
+ /**
10
+ * @description Stopping the runner's link on THIS machine, and knowing it stopped. A process that holds a pairing holds the keys and the
11
+ * configuration in memory: deleting the files does not end its link, and it can go on serving the hub's commands and reconnect.
12
+ * So before a pairing is forgotten (`unpair`) the link process is asked to stop (TERM), then forced (KILL), and the answer is only
13
+ * «stopped» when the pid is really gone. The pid comes from `status.json`; a pid that now belongs to another program (it was reused) is
14
+ * recognised by its command line and left alone.
15
+ */
16
+ const terminateGraceMs = 10 * 1000;
17
+ const killGraceMs = 3 * 1000;
18
+ const pollMs = 100;
19
+ const commandProbeTimeoutMs = 5000;
20
+ function createProcessControl() {
21
+ return {
22
+ checkIsAlive: (pid) => {
23
+ try {
24
+ process.kill(pid, 0);
25
+ return true;
26
+ }
27
+ catch (error) {
28
+ return error instanceof Error && 'code' in error && error.code === 'EPERM';
29
+ }
30
+ },
31
+ readCommand: (pid) => {
32
+ const listing = (0, child_process_1.spawnSync)('ps', ['-p', pid.toString(), '-o', 'command='], { encoding: 'utf8', timeout: commandProbeTimeoutMs });
33
+ return listing.status === 0 && listing.stdout.trim() !== '' ? listing.stdout.trim() : null;
34
+ },
35
+ signal: (pid, signal) => { process.kill(pid, signal); },
36
+ terminateGraceMs,
37
+ killGraceMs,
38
+ };
39
+ }
40
+ /** @description Is this command line the runner's link — `…/runnerCli.js run`? */
41
+ function checkIsRunnerLinkCommand(command) {
42
+ return command !== null && /runnerCli\.js\s+run(\s|$)/.test(command);
43
+ }
44
+ /**
45
+ * @description Is `pid` the runner's link — alive AND running `…/runnerCli.js run`? `status.json` is not removed when `run` exits, so after
46
+ * a reboot its pid may be dead or belong to an unrelated program: that is not a link (nothing to stop, nothing that blocks a service).
47
+ */
48
+ function checkIsRunnerLinkProcess(pid, control = createProcessControl()) {
49
+ return control.checkIsAlive(pid) && checkIsRunnerLinkCommand(control.readCommand(pid));
50
+ }
51
+ async function waitUntilGone(pid, control, timeoutMs) {
52
+ const deadline = Date.now() + timeoutMs;
53
+ while (Date.now() < deadline) {
54
+ if (!control.checkIsAlive(pid))
55
+ return true;
56
+ await new Promise((resolve) => { setTimeout(resolve, pollMs); });
57
+ }
58
+ return !control.checkIsAlive(pid);
59
+ }
60
+ /**
61
+ * @description Stop the link process named by `status.json` (a foreground `run`, or whatever a service started): TERM, then KILL. `null`
62
+ * when it is gone (or was never there); otherwise the reason it is still running.
63
+ */
64
+ async function stopLocalLink(paths, control = createProcessControl()) {
65
+ const status = (0, runnerConfig_1.readRunnerStatus)(paths);
66
+ if (status === null || !checkIsRunnerLinkProcess(status.pid, control))
67
+ return null;
68
+ try {
69
+ control.signal(status.pid, 'SIGTERM');
70
+ if (await waitUntilGone(status.pid, control, control.terminateGraceMs))
71
+ return null;
72
+ control.signal(status.pid, 'SIGKILL');
73
+ }
74
+ catch (error) {
75
+ return `the link process (pid ${status.pid}) could not be signalled (${error instanceof Error ? error.message : 'unknown error'})`;
76
+ }
77
+ return (await waitUntilGone(status.pid, control, control.killGraceMs)) ? null : `the link process (pid ${status.pid}) did not end`;
78
+ }
79
+ //# sourceMappingURL=localLinkStop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localLinkStop.js","sourceRoot":"","sources":["../../src/runnerUtility/localLinkStop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type CommandRunner } from '../selfUpdate/commandRunner';
2
+ export interface CapabilityReport {
3
+ name: 'android' | 'ios' | 'playwright' | 'docker';
4
+ isAvailable: boolean;
5
+ detail: string;
6
+ }
7
+ export interface MachineReport {
8
+ osName: string;
9
+ arch: string;
10
+ cpuModel: string;
11
+ cpuCores: number;
12
+ ramBytes: number;
13
+ diskFreeBytes: number | null;
14
+ capabilities: CapabilityReport[];
15
+ }
16
+ export interface MachineProbe {
17
+ runner: CommandRunner;
18
+ platform: NodeJS.Platform;
19
+ nodeArch: string;
20
+ homeDir: string;
21
+ environment: NodeJS.ProcessEnv;
22
+ checkExists: (candidate: string) => boolean;
23
+ readTextFile: (filePath: string) => string | null;
24
+ cpus: () => Array<{
25
+ model: string;
26
+ }>;
27
+ totalMemoryBytes: () => number;
28
+ freeDiskBytes: (directory: string) => number | null;
29
+ }
30
+ export declare function createMachineProbe(homeDir?: string): MachineProbe;
31
+ /** @description `x86_64`/`arm64` for what Node calls `x64`/`arm64`. */
32
+ export declare function getArchName(nodeArch: string): string;
33
+ /** @description `Ubuntu 24.04` from `/etc/os-release`'s PRETTY_NAME, or the kernel's name. */
34
+ export declare function parseOsRelease(text: string | null): string | null;
35
+ /** @description Look at this machine. */
36
+ export declare function collectMachineReport(probe: MachineProbe, workRoot: string): Promise<MachineReport>;
37
+ /** @description The lines of the check screen for the machine: system, hardware, what it can do. */
38
+ export declare function formatMachineReport(report: MachineReport): string[];
39
+ //# sourceMappingURL=machineReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineReport.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/machineReport.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAc7E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;IAClD,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAClD,IAAI,EAAE,MAAM,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrC,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACrD;AAuBD,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAqB,GAAG,YAAY,CAa/E;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAGjE;AAyCD,yCAAyC;AACzC,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAYxG;AAMD,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAMnE"}