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
@@ -36,7 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.sshFailureExitCode = void 0;
37
37
  exports.getRemoteRunCacheDir = getRemoteRunCacheDir;
38
38
  exports.ensureRemoteRunCacheDir = ensureRemoteRunCacheDir;
39
+ exports.checkIsSshPathQuotable = checkIsSshPathQuotable;
40
+ exports.escapeSshTokens = escapeSshTokens;
41
+ exports.quoteSshOptionPath = quoteSshOptionPath;
39
42
  exports.buildSshArgs = buildSshArgs;
43
+ exports.checkIsPlainShellWord = checkIsPlainShellWord;
40
44
  exports.quoteShellWord = quoteShellWord;
41
45
  exports.joinShellWords = joinShellWords;
42
46
  exports.buildRsyncSshCommand = buildRsyncSshCommand;
@@ -53,6 +57,7 @@ const fs = __importStar(require("fs"));
53
57
  const os = __importStar(require("os"));
54
58
  const path = __importStar(require("path"));
55
59
  const tmuxExec_1 = require("../utils/tmuxExec");
60
+ const interrupts_1 = require("./interrupts");
56
61
  /**
57
62
  * @description Everything that touches ssh: the argument lists (pure, unit-tested), the quoting for the remote shell, and the process
58
63
  * helpers. Always non-interactive (`BatchMode`: a password or an unknown host key is an error, never a prompt), host keys checked as the
@@ -79,25 +84,52 @@ function ensureRemoteRunCacheDir(cacheDir) {
79
84
  fs.chmodSync(cacheDir, cacheDirectoryMode);
80
85
  fs.chmodSync(path.join(cacheDir, 'ssh'), cacheDirectoryMode);
81
86
  }
82
- /** @description The ssh options of every call to `runner` (without the destination): the operator's own first — ssh keeps the first value of an option — then ours. */
87
+ /** A path that holds one of these cannot reach ssh's option parser AND rsync's `-e` parser as the same single word. */
88
+ const unquotablePathPattern = /["'\\$`\r\n]/;
89
+ /** @description Can `value` be put into an ssh option or a command line that ssh and rsync's `-e` both read back as one word? (Whitespace can; a quote, a backslash, a `$`, a backtick or a line break cannot.) */
90
+ function checkIsSshPathQuotable(value) {
91
+ return !unquotablePathPattern.test(value);
92
+ }
93
+ /** @description ssh expands `%`-tokens in a ProxyCommand, an identity file, a known-hosts path and a ControlPath: a literal `%` is written `%%`. */
94
+ function escapeSshTokens(value) {
95
+ return value.replace(/%/g, '%%');
96
+ }
97
+ /**
98
+ * @description A path as the VALUE of an `-o` option. ssh reads `-o` like a line of its config file: `UserKnownHostsFile` there is a LIST of
99
+ * files separated by whitespace and `ControlPath` takes one word followed by nothing, so `/home/my user/…` would be two words and ssh would
100
+ * fail or look in the wrong place. Double quotes keep one path one word (ssh_config(5): «arguments may optionally be enclosed in double
101
+ * quotes»); `-i` takes its path as a plain argument and needs none.
102
+ */
103
+ function quoteSshOptionPath(value) {
104
+ return /\s/.test(value) ? `"${value}"` : value;
105
+ }
106
+ /**
107
+ * @description The ssh options of every call to `runner` (without the destination): the operator's own first — ssh keeps the first value of an
108
+ * option — then ours. The shared connection is an optimisation: a cache path that is too long for a unix socket, or holds a character that
109
+ * cannot be quoted, turns it off instead of failing the call.
110
+ */
83
111
  function buildSshArgs(runner, cacheDir) {
84
112
  const controlDirectory = path.join(cacheDir, 'ssh');
85
- const isControlPathShortEnough = controlDirectory.length + 1 + controlPathHashLength <= unixSocketPathLimit;
113
+ const isControlPathUsable = controlDirectory.length + 1 + controlPathHashLength <= unixSocketPathLimit && checkIsSshPathQuotable(controlDirectory);
86
114
  return [
87
115
  ...(runner.sshOptions ?? []),
88
116
  '-o', 'BatchMode=yes',
89
117
  '-o', `ConnectTimeout=${connectTimeoutSeconds}`,
90
118
  '-o', `ServerAliveInterval=${serverAliveIntervalSeconds}`,
91
119
  '-o', `ServerAliveCountMax=${serverAliveCountMax}`,
92
- ...(isControlPathShortEnough
93
- ? ['-o', 'ControlMaster=auto', '-o', `ControlPath=${path.join(controlDirectory, '%C')}`, '-o', `ControlPersist=${controlPersistSeconds}`]
120
+ ...(isControlPathUsable
121
+ ? ['-o', 'ControlMaster=auto', '-o', `ControlPath=${quoteSshOptionPath(path.join(escapeSshTokens(controlDirectory), '%C'))}`, '-o', `ControlPersist=${controlPersistSeconds}`]
94
122
  : ['-o', 'ControlMaster=no']),
95
123
  ];
96
124
  }
97
125
  const safeWordPattern = /^[A-Za-z0-9_@%+=:,./-]+$/;
126
+ /** @description Is `word` one that needs no quoting for a POSIX shell (and for ssh's and rsync's own parsers)? */
127
+ function checkIsPlainShellWord(word) {
128
+ return safeWordPattern.test(word);
129
+ }
98
130
  /** @description One word quoted for a POSIX shell (`shellSingleQuote`; an already plain word stays as it is, so the commands read well in a log). */
99
131
  function quoteShellWord(word) {
100
- return word !== '' && safeWordPattern.test(word) ? word : (0, tmuxExec_1.shellSingleQuote)(word);
132
+ return word !== '' && checkIsPlainShellWord(word) ? word : (0, tmuxExec_1.shellSingleQuote)(word);
101
133
  }
102
134
  /** @description The words of an argument list as one string rsync's `-e` and a shell both read back as the same words. */
103
135
  function joinShellWords(words) {
@@ -173,9 +205,11 @@ function runSshCommand(params) {
173
205
  settle();
174
206
  resolve({ exitCode: exports.sshFailureExitCode, stdout, stderr: `${stderr}${error.message}\n`, isTimedOut });
175
207
  });
176
- child.on('close', (exitCode) => {
208
+ // Once cut off, its `exit` is enough: after login this ssh is only a client of a ControlPersist master that holds its pipes, so `close` would
209
+ // come when the remote command ends (or the master gives up), not when the client is gone — the call, a probe's deadline or a Ctrl-C, would hang.
210
+ void (0, interrupts_1.waitForChildEnd)(child, () => isTimedOut).then((exitCode) => {
177
211
  settle();
178
- resolve({ exitCode, stdout, stderr, isTimedOut });
212
+ resolve({ exitCode: isTimedOut ? null : exitCode, stdout, stderr, isTimedOut });
179
213
  });
180
214
  child.stdin.end(params.input ?? '');
181
215
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/remoteRun/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/remoteRun/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @description Is the account that runs the jobs an admin one? The agents' code runs with its rights, so a runner on an account that can
3
+ * `sudo` (or is root) gets a warning at pairing: make a standard user for it. macOS: member of the `admin` group; Linux: uid 0 or a
4
+ * member of `sudo`, `wheel` or `admin`.
5
+ */
6
+ export declare const linuxAdminGroups: readonly string[];
7
+ export declare const macAdminGroup = "admin";
8
+ export interface AccountFacts {
9
+ platform: NodeJS.Platform;
10
+ uid: number;
11
+ groups: readonly string[];
12
+ }
13
+ export declare function checkIsAdminAccount(account: AccountFacts): boolean;
14
+ /** @description The account's group names (`id -Gn`), empty when it cannot be asked. */
15
+ export declare function readAccountGroups(): string[];
16
+ export declare function readAccountFacts(): AccountFacts;
17
+ export declare function formatAdminWarning(accountName: string): string[];
18
+ //# sourceMappingURL=adminCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminCheck.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/adminCheck.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA+B,CAAC;AAC9E,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAGlE;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAG5C;AAED,wBAAgB,gBAAgB,IAAI,YAAY,CAE/C;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhE"}
@@ -0,0 +1,69 @@
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.macAdminGroup = exports.linuxAdminGroups = void 0;
37
+ exports.checkIsAdminAccount = checkIsAdminAccount;
38
+ exports.readAccountGroups = readAccountGroups;
39
+ exports.readAccountFacts = readAccountFacts;
40
+ exports.formatAdminWarning = formatAdminWarning;
41
+ const child_process_1 = require("child_process");
42
+ const os = __importStar(require("os"));
43
+ /**
44
+ * @description Is the account that runs the jobs an admin one? The agents' code runs with its rights, so a runner on an account that can
45
+ * `sudo` (or is root) gets a warning at pairing: make a standard user for it. macOS: member of the `admin` group; Linux: uid 0 or a
46
+ * member of `sudo`, `wheel` or `admin`.
47
+ */
48
+ exports.linuxAdminGroups = ['sudo', 'wheel', 'admin'];
49
+ exports.macAdminGroup = 'admin';
50
+ function checkIsAdminAccount(account) {
51
+ if (account.platform === 'darwin')
52
+ return account.groups.includes(exports.macAdminGroup);
53
+ return account.uid === 0 || account.groups.some((group) => exports.linuxAdminGroups.includes(group));
54
+ }
55
+ /** @description The account's group names (`id -Gn`), empty when it cannot be asked. */
56
+ function readAccountGroups() {
57
+ const result = (0, child_process_1.spawnSync)('id', ['-Gn'], { encoding: 'utf8', timeout: 4000 });
58
+ return result.status === 0 ? result.stdout.trim().split(/\s+/).filter((group) => group !== '') : [];
59
+ }
60
+ function readAccountFacts() {
61
+ return { platform: process.platform, uid: os.userInfo().uid, groups: readAccountGroups() };
62
+ }
63
+ function formatAdminWarning(accountName) {
64
+ return [
65
+ `⚠ «${accountName}» is an admin account: the agents' code would run with its rights.`,
66
+ ' Create a standard user for runs (System Settings → Users & Groups, or `adduser`) and run the line there.',
67
+ ];
68
+ }
69
+ //# sourceMappingURL=adminCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminCheck.js","sourceRoot":"","sources":["../../src/runnerUtility/adminCheck.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,kDAGC;AAGD,8CAGC;AAED,4CAEC;AAED,gDAKC;AAtCD,iDAA0C;AAC1C,uCAAyB;AAEzB;;;;GAIG;AAEU,QAAA,gBAAgB,GAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjE,QAAA,aAAa,GAAG,OAAO,CAAC;AAQrC,SAAgB,mBAAmB,CAAC,OAAqB;IACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAa,CAAC,CAAC;IACjF,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,wFAAwF;AACxF,SAAgB,iBAAiB;IAC/B,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtG,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC;AAC7F,CAAC;AAED,SAAgB,kBAAkB,CAAC,WAAmB;IACpD,OAAO;QACL,MAAM,WAAW,oEAAoE;QACrF,4GAA4G;KAC7G,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type CommandRunner } from '../selfUpdate/commandRunner';
2
+ import { type ServiceResult, type TargetAccount } from './serviceCommon';
3
+ export interface AdminServiceDeps {
4
+ runner: CommandRunner;
5
+ platform: NodeJS.Platform;
6
+ /** The uid of this process: the step is root's. */
7
+ uid: number;
8
+ /** The folder of the `node` that runs this step: the daemons' `PATH` starts with it, like the account's own services. */
9
+ nodeDir: string;
10
+ /** Where LaunchDaemons live (`/Library/LaunchDaemons`; a test's own folder). */
11
+ launchDaemonsDir: string;
12
+ /** Give a definition to root:wheel without following a link (`fs.lchownSync`; a test is not root). */
13
+ giveToRoot: (filePath: string, uid: number, gid: number) => void;
14
+ /** Who the account is, from the passwd database (never from the account's files); `null` when there is no such account. */
15
+ resolveAccount: (name: string) => Promise<TargetAccount | null>;
16
+ /** Wait between two looks at a starting user manager (a test does not wait). */
17
+ sleep: (ms: number) => Promise<void>;
18
+ }
19
+ export declare function createAdminServiceDeps(): AdminServiceDeps;
20
+ /** @description Install the always-on service of `accountName`, an account that is already paired. Needs root; touches nothing of the account's but through the account. */
21
+ export declare function installServiceForAccount(accountName: string, deps: AdminServiceDeps): Promise<ServiceResult>;
22
+ //# sourceMappingURL=adminService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminService.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/adminService.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EASL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AA6BzB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,yHAAyH;IACzH,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAC;IACzB,sGAAsG;IACtG,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,2HAA2H;IAC3H,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAChE,gFAAgF;IAChF,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAWzD;AAkDD,4KAA4K;AAC5K,wBAAsB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAOlH"}
@@ -0,0 +1,145 @@
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.createAdminServiceDeps = createAdminServiceDeps;
37
+ exports.installServiceForAccount = installServiceForAccount;
38
+ const fs = __importStar(require("fs"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
41
+ const commandRunner_1 = require("../selfUpdate/commandRunner");
42
+ const serviceCommon_1 = require("./serviceCommon");
43
+ const runnerHome_1 = require("./runnerHome");
44
+ const serviceUnits_1 = require("./serviceUnits");
45
+ /**
46
+ * @description The ROOT step of the admin pairing line: install the always-on service of a runner account that the line has just paired.
47
+ * It runs from a root-owned copy of the package (`rootServiceCli.ts`, which has no dependencies — hence Node built-ins only here), never
48
+ * from the account's files: the account runs the agents' code, so root must not exec, read through or write into anything the account can
49
+ * change. Everything of the account's — Pueue, its configuration, the service record, the user service's own units — is therefore done by
50
+ * the account's OWN program run AS the account (`sudo -u <account> -H`); root only
51
+ *
52
+ * macOS writes the two LaunchDaemon definitions into `/Library/LaunchDaemons` (a folder only root can write), `chown`s them with
53
+ * `lchown`, and calls `launchctl`. The definitions are rendered here from the account's name and home alone — the account's
54
+ * answer to `system-step prepare` decides nothing about their text — and they run as the account (`UserName`), with no extra rights
55
+ * Linux switches lingering on for the account (`loginctl enable-linger`), waits for its user manager, and has the account install its
56
+ * own user service — the same install it would run itself
57
+ *
58
+ * An account's tree is read by nobody here, so a planted link in it reaches nothing of root's.
59
+ */
60
+ /** The install run as the account starts two services and may wait for each. */
61
+ const installAsAccountTimeoutMs = 120 * 1000;
62
+ /** After `enable-linger` the user manager takes a moment to come up: it is asked once a second, for this many tries. */
63
+ const userManagerPollMs = 1000;
64
+ const userManagerPollAttempts = 20;
65
+ /** What `systemctl --user is-system-running` prints once the manager can take units (`degraded`: up, with some unit failed). */
66
+ const userManagerReadyStates = ['running', 'degraded'];
67
+ const freshLineText = 'paste a fresh admin line from /runners (it finds the account paired and only installs the service)';
68
+ function createAdminServiceDeps() {
69
+ return {
70
+ runner: commandRunner_1.runCommand,
71
+ platform: process.platform,
72
+ uid: os.userInfo().uid,
73
+ nodeDir: path.dirname(process.execPath),
74
+ launchDaemonsDir: '/Library/LaunchDaemons',
75
+ giveToRoot: fs.lchownSync,
76
+ resolveAccount: (name) => (process.platform === 'darwin' ? (0, serviceCommon_1.resolveMacAccount)(name, commandRunner_1.runCommand) : (0, serviceCommon_1.resolveLinuxAccount)(name, commandRunner_1.runCommand)),
77
+ sleep: (ms) => new Promise((resolve) => { setTimeout(resolve, ms); }),
78
+ };
79
+ }
80
+ /** The arguments of `sudo` that run the account's own launcher AS the account. */
81
+ function asAccountArgs(account) {
82
+ return ['-u', account.name, '-H'];
83
+ }
84
+ async function installDaemons(account, deps) {
85
+ const paths = (0, runnerHome_1.getRunnerHomePaths)(account.homeDir);
86
+ const stepArgs = (step) => [...asAccountArgs(account), paths.launcher, 'service', 'system-step', step];
87
+ const prepared = await deps.runner('sudo', stepArgs('prepare'), { timeoutMs: installAsAccountTimeoutMs });
88
+ const answer = (0, serviceCommon_1.parseSystemStepAnswer)(prepared.stdout);
89
+ if (answer === null)
90
+ return (0, serviceCommon_1.fail)(`The account ${account.name} gave no answer to its preparation (${(0, commandRunner_1.getOutputTail)(prepared, 2) || 'no output'}).`);
91
+ if (!answer.ok)
92
+ return (0, serviceCommon_1.fail)(...answer.lines);
93
+ const names = (0, serviceUnits_1.getServiceNames)(paths.root);
94
+ const accountJobs = (0, serviceUnits_1.planLaunchdJobs)(paths, names, account.name, deps.nodeDir, account.name);
95
+ const result = await (0, serviceCommon_1.installLaunchdJobs)({
96
+ runner: deps.runner,
97
+ domain: 'system',
98
+ files: (0, serviceCommon_1.getLaunchdFiles)(true, account.homeDir, names, deps.launchDaemonsDir),
99
+ names,
100
+ jobs: accountJobs,
101
+ hadService: answer.hadService,
102
+ isLogDirMade: false,
103
+ giveToRoot: deps.giveToRoot,
104
+ forgetFirstInstall: async () => { await deps.runner('sudo', stepArgs('abandon'), { timeoutMs: serviceCommon_1.commandTimeoutMs }); },
105
+ retryText: freshLineText,
106
+ render: serviceUnits_1.renderLaunchdPlist,
107
+ });
108
+ if (!result.ok)
109
+ return result;
110
+ return { ok: true, lines: [`Installed two LaunchDaemons (${names.launchdLink}, ${names.launchdPueued}) that run as ${account.name}: always on, also logged out.`] };
111
+ }
112
+ async function installUserServiceFor(account, deps) {
113
+ const paths = (0, runnerHome_1.getRunnerHomePaths)(account.homeDir);
114
+ const asAccount = [...asAccountArgs(account), 'env', `XDG_RUNTIME_DIR=/run/user/${account.uid}`];
115
+ const linger = await deps.runner('loginctl', ['enable-linger', account.name], { timeoutMs: serviceCommon_1.commandTimeoutMs });
116
+ if (!linger.ok)
117
+ return (0, serviceCommon_1.fail)(`\`loginctl enable-linger ${account.name}\` failed: ${(0, commandRunner_1.getOutputTail)(linger, 1) || 'no answer'}`);
118
+ for (let attempt = 1; attempt <= userManagerPollAttempts; attempt += 1) {
119
+ const state = await deps.runner('sudo', [...asAccount, 'systemctl', '--user', 'is-system-running'], { timeoutMs: serviceCommon_1.commandTimeoutMs });
120
+ if (userManagerReadyStates.includes(state.stdout.trim()))
121
+ break;
122
+ if (attempt === userManagerPollAttempts)
123
+ return (0, serviceCommon_1.fail)(`The user manager of ${account.name} did not come up within ${(userManagerPollAttempts * userManagerPollMs) / 1000} s after lingering was switched on.`);
124
+ await deps.sleep(userManagerPollMs);
125
+ }
126
+ const installed = await deps.runner('sudo', [...asAccount, paths.launcher, 'service', 'install'], { timeoutMs: installAsAccountTimeoutMs });
127
+ const lines = installed.stdout.split('\n').map((line) => line.trim()).filter((line) => line !== '');
128
+ if (installed.ok)
129
+ return { ok: true, lines };
130
+ return (0, serviceCommon_1.fail)(...lines, ...(lines.length === 0 ? [(0, commandRunner_1.getOutputTail)(installed) || 'the install gave no output'] : []));
131
+ }
132
+ /** @description Install the always-on service of `accountName`, an account that is already paired. Needs root; touches nothing of the account's but through the account. */
133
+ async function installServiceForAccount(accountName, deps) {
134
+ if (deps.platform !== 'linux' && deps.platform !== 'darwin')
135
+ return (0, serviceCommon_1.fail)(`Services are supported on Linux (systemd) and macOS (launchd), not on ${deps.platform}.`);
136
+ if (deps.uid !== serviceCommon_1.rootUid)
137
+ return (0, serviceCommon_1.fail)('This step is root\'s: it is started by the admin pairing line from /runners, which asks for sudo.');
138
+ const account = await deps.resolveAccount(accountName);
139
+ if (account === null)
140
+ return (0, serviceCommon_1.fail)(`There is no account named «${accountName}», or its home folder cannot be read from the directory service.`);
141
+ if (account.uid === serviceCommon_1.rootUid)
142
+ return (0, serviceCommon_1.fail)('The service must run as a standard account, not as root.');
143
+ return deps.platform === 'darwin' ? installDaemons(account, deps) : installUserServiceFor(account, deps);
144
+ }
145
+ //# sourceMappingURL=adminService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminService.js","sourceRoot":"","sources":["../../src/runnerUtility/adminService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,wDAWC;AAmDD,4DAOC;AAlID,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,+DAA4F;AAC5F,mDAWyB;AACzB,6CAAkD;AAClD,iDAAsF;AAEtF;;;;;;;;;;;;;;GAcG;AAEH,gFAAgF;AAChF,MAAM,yBAAyB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC7C,wHAAwH;AACxH,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,gIAAgI;AAChI,MAAM,sBAAsB,GAAsB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC1E,MAAM,aAAa,GAAG,oGAAoG,CAAC;AAmB3H,SAAgB,sBAAsB;IACpC,OAAO;QACL,MAAM,EAAE,0BAAU;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG;QACtB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QACvC,gBAAgB,EAAE,wBAAwB;QAC1C,UAAU,EAAE,EAAE,CAAC,UAAU;QACzB,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,iCAAiB,EAAC,IAAI,EAAE,0BAAU,CAAC,CAAC,CAAC,CAAC,IAAA,mCAAmB,EAAC,IAAI,EAAE,0BAAU,CAAC,CAAC;QACvI,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,aAAa,CAAC,OAAsB;IAC3C,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,OAAsB,EAAE,IAAsB;IAC1E,MAAM,KAAK,GAAG,IAAA,+BAAkB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,IAA2B,EAAY,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IACxI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAA,qCAAqB,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAA,oBAAI,EAAC,eAAe,OAAO,CAAC,IAAI,uCAAuC,IAAA,6BAAa,EAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC;IAClJ,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAA,oBAAI,EAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAA,8BAAe,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAA,8BAAe,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAkB,EAAC;QACtC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,IAAA,+BAAe,EAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC;QAC3E,KAAK;QACL,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,kBAAkB,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QACpH,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,iCAAkB;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,gCAAgC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,aAAa,iBAAiB,OAAO,CAAC,IAAI,+BAA+B,CAAC,EAAE,CAAC;AACtK,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,OAAsB,EAAE,IAAsB;IACjF,MAAM,KAAK,GAAG,IAAA,+BAAkB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,6BAA6B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgB,EAAE,CAAC,CAAC;IAC/G,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAA,oBAAI,EAAC,4BAA4B,OAAO,CAAC,IAAI,cAAc,IAAA,6BAAa,EAAC,MAAM,EAAE,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IAC7H,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,uBAAuB,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,gCAAgB,EAAE,CAAC,CAAC;QACrI,IAAI,sBAAsB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAAE,MAAM;QAChE,IAAI,OAAO,KAAK,uBAAuB;YAAE,OAAO,IAAA,oBAAI,EAAC,uBAAuB,OAAO,CAAC,IAAI,2BAA2B,CAAC,uBAAuB,GAAG,iBAAiB,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;QAC9M,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAC5I,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IACpG,IAAI,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7C,OAAO,IAAA,oBAAI,EAAC,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAa,EAAC,SAAS,CAAC,IAAI,4BAA4B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnH,CAAC;AAED,4KAA4K;AACrK,KAAK,UAAU,wBAAwB,CAAC,WAAmB,EAAE,IAAsB;IACxF,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAA,oBAAI,EAAC,yEAAyE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpK,IAAI,IAAI,CAAC,GAAG,KAAK,uBAAO;QAAE,OAAO,IAAA,oBAAI,EAAC,mGAAmG,CAAC,CAAC;IAC3I,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAA,oBAAI,EAAC,8BAA8B,WAAW,kEAAkE,CAAC,CAAC;IAC/I,IAAI,OAAO,CAAC,GAAG,KAAK,uBAAO;QAAE,OAAO,IAAA,oBAAI,EAAC,0DAA0D,CAAC,CAAC;IACrG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3G,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type RunnerHomePaths } from './runnerHome';
2
+ /**
3
+ * @description Installing a copy of the hub's charness package for the runner to run, and switching to it. BUILTINS ONLY: the first
4
+ * `charness-runner pair` is started from a package that has no `node_modules` yet, and this is the step that makes them.
5
+ *
6
+ * An app lives in `app.<random id>/` and is never renamed or changed once it runs; `current` is a symlink that is replaced whole. The
7
+ * launcher (`launcher.ts`) starts whatever `current` points at, so an update is: install next to the old one, point `current` at it,
8
+ * exit with {@link restartExitCode}.
9
+ */
10
+ /** The exit code that asks the launcher to start the app again (EX_TEMPFAIL) — after an update. */
11
+ export declare const restartExitCode = 75;
12
+ /** Test seam, set only by a flow's environment: the folder to link as `node_modules` instead of running `npm install` (no registry in a flow). */
13
+ export declare const testNodeModulesEnvName = "CHARNESS_TEST_RUNNER_NODE_MODULES";
14
+ export declare function createAppId(): string;
15
+ /** Install the production dependencies of the package in `appDir`; scripts are not run (nothing the runner needs builds). Throws with npm's last words. */
16
+ export declare function installDependencies(appDir: string, env?: NodeJS.ProcessEnv): void;
17
+ /** @description Copy an unpacked package into a new app folder and install its dependencies; returns the folder. Removes it again if the install fails. */
18
+ export declare function installAppFromDirectory(sourceDir: string, paths: RunnerHomePaths): string;
19
+ /** @description Unpack a gzip tar archive (the hub's package) into a new app folder with the system `tar`, and install its dependencies. */
20
+ export declare function installAppFromArchive(archivePath: string, paths: RunnerHomePaths): string;
21
+ /** @description Point `current` at `appDir` in one atomic step. */
22
+ export declare function switchCurrentApp(paths: RunnerHomePaths, appDir: string): void;
23
+ /** @description Remove old app folders: all but the one `current` points at and the newest other one (the previous version, in case the new one must be rolled back by hand). */
24
+ export declare function removeOldApps(paths: RunnerHomePaths): void;
25
+ //# sourceMappingURL=appInstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appInstall.d.ts","sourceRoot":"","sources":["../../src/runnerUtility/appInstall.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEnE;;;;;;;GAOG;AAEH,mGAAmG;AACnG,eAAO,MAAM,eAAe,KAAK,CAAC;AAOlC,kJAAkJ;AAClJ,eAAO,MAAM,sBAAsB,sCAAsC,CAAC;AAE1E,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAOD,2JAA2J;AAC3J,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAiB9F;AAED,2JAA2J;AAC3J,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAWzF;AAED,4IAA4I;AAC5I,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAYzF;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAK7E;AAED,iLAAiL;AACjL,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAa1D"}
@@ -0,0 +1,147 @@
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.testNodeModulesEnvName = exports.restartExitCode = void 0;
37
+ exports.createAppId = createAppId;
38
+ exports.installDependencies = installDependencies;
39
+ exports.installAppFromDirectory = installAppFromDirectory;
40
+ exports.installAppFromArchive = installAppFromArchive;
41
+ exports.switchCurrentApp = switchCurrentApp;
42
+ exports.removeOldApps = removeOldApps;
43
+ const child_process_1 = require("child_process");
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const runnerHome_1 = require("./runnerHome");
47
+ /**
48
+ * @description Installing a copy of the hub's charness package for the runner to run, and switching to it. BUILTINS ONLY: the first
49
+ * `charness-runner pair` is started from a package that has no `node_modules` yet, and this is the step that makes them.
50
+ *
51
+ * An app lives in `app.<random id>/` and is never renamed or changed once it runs; `current` is a symlink that is replaced whole. The
52
+ * launcher (`launcher.ts`) starts whatever `current` points at, so an update is: install next to the old one, point `current` at it,
53
+ * exit with {@link restartExitCode}.
54
+ */
55
+ /** The exit code that asks the launcher to start the app again (EX_TEMPFAIL) — after an update. */
56
+ exports.restartExitCode = 75;
57
+ const npmInstallTimeoutMs = 10 * 60 * 1000;
58
+ const appsToKeep = 2;
59
+ const appDirPattern = /^app\.[0-9a-f]+$/;
60
+ const randomIdBytes = 6;
61
+ const maxBufferBytes = 64 * 1024 * 1024;
62
+ /** Test seam, set only by a flow's environment: the folder to link as `node_modules` instead of running `npm install` (no registry in a flow). */
63
+ exports.testNodeModulesEnvName = 'CHARNESS_TEST_RUNNER_NODE_MODULES';
64
+ function createAppId() {
65
+ let id = '';
66
+ for (let index = 0; index < randomIdBytes; index += 1)
67
+ id += Math.floor(Math.random() * 256).toString(16).padStart(2, '0');
68
+ return id;
69
+ }
70
+ function findNpm() {
71
+ const besideNode = path.join(path.dirname(process.execPath), 'npm');
72
+ return fs.existsSync(besideNode) ? besideNode : 'npm';
73
+ }
74
+ /** Install the production dependencies of the package in `appDir`; scripts are not run (nothing the runner needs builds). Throws with npm's last words. */
75
+ function installDependencies(appDir, env = process.env) {
76
+ const linked = env[exports.testNodeModulesEnvName];
77
+ if (linked !== undefined && linked !== '') {
78
+ fs.symlinkSync(linked, path.join(appDir, 'node_modules'), 'dir');
79
+ return;
80
+ }
81
+ const result = (0, child_process_1.spawnSync)(findNpm(), ['install', '--omit=dev', '--ignore-scripts', '--no-audit', '--no-fund', '--no-progress'], {
82
+ cwd: appDir,
83
+ encoding: 'utf8',
84
+ timeout: npmInstallTimeoutMs,
85
+ maxBuffer: maxBufferBytes,
86
+ env,
87
+ });
88
+ if (result.error !== undefined || result.status !== 0) {
89
+ const detail = `${result.stderr ?? ''}`.trim().split('\n').slice(-3).join(' | ');
90
+ throw new Error(`npm install failed${result.error === undefined ? '' : ` (${result.error.message})`}${detail === '' ? '' : `: ${detail}`}`);
91
+ }
92
+ }
93
+ /** @description Copy an unpacked package into a new app folder and install its dependencies; returns the folder. Removes it again if the install fails. */
94
+ function installAppFromDirectory(sourceDir, paths) {
95
+ const appDir = (0, runnerHome_1.getAppDirPath)(paths, createAppId());
96
+ fs.mkdirSync(paths.root, { recursive: true, mode: 0o700 });
97
+ fs.cpSync(sourceDir, appDir, { recursive: true });
98
+ try {
99
+ installDependencies(appDir);
100
+ }
101
+ catch (error) {
102
+ fs.rmSync(appDir, { recursive: true, force: true });
103
+ throw error;
104
+ }
105
+ return appDir;
106
+ }
107
+ /** @description Unpack a gzip tar archive (the hub's package) into a new app folder with the system `tar`, and install its dependencies. */
108
+ function installAppFromArchive(archivePath, paths) {
109
+ const appDir = (0, runnerHome_1.getAppDirPath)(paths, createAppId());
110
+ fs.mkdirSync(appDir, { recursive: true, mode: 0o700 });
111
+ try {
112
+ const unpacked = (0, child_process_1.spawnSync)('tar', ['-xzf', archivePath, '-C', appDir], { encoding: 'utf8' });
113
+ if (unpacked.status !== 0)
114
+ throw new Error(`could not unpack the package (tar exit ${unpacked.status ?? 'none'})`);
115
+ installDependencies(appDir);
116
+ }
117
+ catch (error) {
118
+ fs.rmSync(appDir, { recursive: true, force: true });
119
+ throw error;
120
+ }
121
+ return appDir;
122
+ }
123
+ /** @description Point `current` at `appDir` in one atomic step. */
124
+ function switchCurrentApp(paths, appDir) {
125
+ const temporaryLink = `${paths.currentApp}.${process.pid}.tmp`;
126
+ fs.rmSync(temporaryLink, { force: true });
127
+ fs.symlinkSync(appDir, temporaryLink, 'dir');
128
+ fs.renameSync(temporaryLink, paths.currentApp);
129
+ }
130
+ /** @description Remove old app folders: all but the one `current` points at and the newest other one (the previous version, in case the new one must be rolled back by hand). */
131
+ function removeOldApps(paths) {
132
+ let currentTarget = null;
133
+ try {
134
+ currentTarget = fs.realpathSync(paths.currentApp);
135
+ }
136
+ catch {
137
+ currentTarget = null;
138
+ }
139
+ const apps = fs.readdirSync(paths.root)
140
+ .filter((name) => appDirPattern.test(name))
141
+ .map((name) => ({ name, dir: path.join(paths.root, name), modifiedAt: fs.statSync(path.join(paths.root, name)).mtimeMs }))
142
+ .filter((app) => currentTarget === null || fs.realpathSync(app.dir) !== currentTarget)
143
+ .sort((left, right) => right.modifiedAt - left.modifiedAt);
144
+ for (const app of apps.slice(appsToKeep - 1))
145
+ fs.rmSync(app.dir, { recursive: true, force: true });
146
+ }
147
+ //# sourceMappingURL=appInstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appInstall.js","sourceRoot":"","sources":["../../src/runnerUtility/appInstall.ts"],"names":[],"mappings":"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"}