charness 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DEVELOPMENT.md +8 -2
  3. package/README.md +5 -5
  4. package/SETUP.md +17 -5
  5. package/agent-plugin/skills/charness-manager/SKILL.md +3 -3
  6. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  7. package/dist/adapters/openCodeAdapter.js +2 -1
  8. package/dist/adapters/openCodeAdapter.js.map +1 -1
  9. package/dist/bot.d.ts.map +1 -1
  10. package/dist/bot.js +50 -9
  11. package/dist/bot.js.map +1 -1
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +56 -6
  15. package/dist/cli.js.map +1 -1
  16. package/dist/configDirFile.d.ts +7 -3
  17. package/dist/configDirFile.d.ts.map +1 -1
  18. package/dist/configDirFile.js +12 -5
  19. package/dist/configDirFile.js.map +1 -1
  20. package/dist/connectors/telegram/commands/botCore.d.ts +5 -1
  21. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
  22. package/dist/connectors/telegram/commands/runners.d.ts +52 -0
  23. package/dist/connectors/telegram/commands/runners.d.ts.map +1 -0
  24. package/dist/connectors/telegram/commands/runners.js +524 -0
  25. package/dist/connectors/telegram/commands/runners.js.map +1 -0
  26. package/dist/connectors/telegram/runnerPairingMessages.d.ts +29 -0
  27. package/dist/connectors/telegram/runnerPairingMessages.d.ts.map +1 -0
  28. package/dist/connectors/telegram/runnerPairingMessages.js +112 -0
  29. package/dist/connectors/telegram/runnerPairingMessages.js.map +1 -0
  30. package/dist/i18n/de.d.ts.map +1 -1
  31. package/dist/i18n/de.js +60 -0
  32. package/dist/i18n/de.js.map +1 -1
  33. package/dist/i18n/en.d.ts.map +1 -1
  34. package/dist/i18n/en.js +60 -0
  35. package/dist/i18n/en.js.map +1 -1
  36. package/dist/i18n/es.d.ts.map +1 -1
  37. package/dist/i18n/es.js +60 -0
  38. package/dist/i18n/es.js.map +1 -1
  39. package/dist/i18n/fr.d.ts.map +1 -1
  40. package/dist/i18n/fr.js +60 -0
  41. package/dist/i18n/fr.js.map +1 -1
  42. package/dist/i18n/hi.d.ts.map +1 -1
  43. package/dist/i18n/hi.js +60 -0
  44. package/dist/i18n/hi.js.map +1 -1
  45. package/dist/i18n/ja.d.ts.map +1 -1
  46. package/dist/i18n/ja.js +60 -0
  47. package/dist/i18n/ja.js.map +1 -1
  48. package/dist/i18n/ka.d.ts.map +1 -1
  49. package/dist/i18n/ka.js +60 -0
  50. package/dist/i18n/ka.js.map +1 -1
  51. package/dist/i18n/pt.d.ts.map +1 -1
  52. package/dist/i18n/pt.js +60 -0
  53. package/dist/i18n/pt.js.map +1 -1
  54. package/dist/i18n/ru.d.ts.map +1 -1
  55. package/dist/i18n/ru.js +60 -0
  56. package/dist/i18n/ru.js.map +1 -1
  57. package/dist/i18n/uk.d.ts.map +1 -1
  58. package/dist/i18n/uk.js +60 -0
  59. package/dist/i18n/uk.js.map +1 -1
  60. package/dist/i18n/uz.d.ts.map +1 -1
  61. package/dist/i18n/uz.js +60 -0
  62. package/dist/i18n/uz.js.map +1 -1
  63. package/dist/i18n/zh.d.ts.map +1 -1
  64. package/dist/i18n/zh.js +60 -0
  65. package/dist/i18n/zh.js.map +1 -1
  66. package/dist/index.d.ts +1 -1
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +3 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/installManager.d.ts +57 -1
  71. package/dist/installManager.d.ts.map +1 -1
  72. package/dist/installManager.js +88 -10
  73. package/dist/installManager.js.map +1 -1
  74. package/dist/instanceSettings.d.ts +12 -2
  75. package/dist/instanceSettings.d.ts.map +1 -1
  76. package/dist/instanceSettings.js +17 -3
  77. package/dist/instanceSettings.js.map +1 -1
  78. package/dist/outputTrace.d.ts +6 -0
  79. package/dist/outputTrace.d.ts.map +1 -1
  80. package/dist/outputTrace.js +24 -1
  81. package/dist/outputTrace.js.map +1 -1
  82. package/dist/remoteRun/cliArgs.d.ts +2 -0
  83. package/dist/remoteRun/cliArgs.d.ts.map +1 -1
  84. package/dist/remoteRun/cliArgs.js +11 -2
  85. package/dist/remoteRun/cliArgs.js.map +1 -1
  86. package/dist/remoteRun/commands.d.ts +21 -0
  87. package/dist/remoteRun/commands.d.ts.map +1 -1
  88. package/dist/remoteRun/commands.js +38 -17
  89. package/dist/remoteRun/commands.js.map +1 -1
  90. package/dist/remoteRun/interrupts.d.ts +10 -0
  91. package/dist/remoteRun/interrupts.d.ts.map +1 -1
  92. package/dist/remoteRun/interrupts.js +43 -6
  93. package/dist/remoteRun/interrupts.js.map +1 -1
  94. package/dist/remoteRun/output.d.ts +2 -0
  95. package/dist/remoteRun/output.d.ts.map +1 -1
  96. package/dist/remoteRun/output.js +45 -0
  97. package/dist/remoteRun/output.js.map +1 -1
  98. package/dist/remoteRun/pairedRunners.d.ts +51 -0
  99. package/dist/remoteRun/pairedRunners.d.ts.map +1 -0
  100. package/dist/remoteRun/pairedRunners.js +165 -0
  101. package/dist/remoteRun/pairedRunners.js.map +1 -0
  102. package/dist/remoteRun/probe.d.ts +23 -1
  103. package/dist/remoteRun/probe.d.ts.map +1 -1
  104. package/dist/remoteRun/probe.js +45 -11
  105. package/dist/remoteRun/probe.js.map +1 -1
  106. package/dist/remoteRun/remoteRunCli.d.ts +13 -6
  107. package/dist/remoteRun/remoteRunCli.d.ts.map +1 -1
  108. package/dist/remoteRun/remoteRunCli.js +34 -59
  109. package/dist/remoteRun/remoteRunCli.js.map +1 -1
  110. package/dist/remoteRun/runnerClient.d.ts +2 -0
  111. package/dist/remoteRun/runnerClient.d.ts.map +1 -1
  112. package/dist/remoteRun/runnerClient.js +5 -1
  113. package/dist/remoteRun/runnerClient.js.map +1 -1
  114. package/dist/remoteRun/runnerSummary.d.ts +24 -0
  115. package/dist/remoteRun/runnerSummary.d.ts.map +1 -0
  116. package/dist/remoteRun/runnerSummary.js +86 -0
  117. package/dist/remoteRun/runnerSummary.js.map +1 -0
  118. package/dist/remoteRun/runnerWait.d.ts +68 -0
  119. package/dist/remoteRun/runnerWait.d.ts.map +1 -0
  120. package/dist/remoteRun/runnerWait.js +137 -0
  121. package/dist/remoteRun/runnerWait.js.map +1 -0
  122. package/dist/remoteRun/runnerWaitTiming.d.ts +16 -0
  123. package/dist/remoteRun/runnerWaitTiming.d.ts.map +1 -0
  124. package/dist/remoteRun/runnerWaitTiming.js +37 -0
  125. package/dist/remoteRun/runnerWaitTiming.js.map +1 -0
  126. package/dist/remoteRun/runners.d.ts +15 -8
  127. package/dist/remoteRun/runners.d.ts.map +1 -1
  128. package/dist/remoteRun/runners.js +59 -19
  129. package/dist/remoteRun/runners.js.map +1 -1
  130. package/dist/remoteRun/runnersCatalog.d.ts +14 -0
  131. package/dist/remoteRun/runnersCatalog.d.ts.map +1 -0
  132. package/dist/remoteRun/runnersCatalog.js +68 -0
  133. package/dist/remoteRun/runnersCatalog.js.map +1 -0
  134. package/dist/remoteRun/runnersConfig.d.ts +31 -20
  135. package/dist/remoteRun/runnersConfig.d.ts.map +1 -1
  136. package/dist/remoteRun/runnersConfig.js +14 -12
  137. package/dist/remoteRun/runnersConfig.js.map +1 -1
  138. package/dist/remoteRun/ssh.d.ts +22 -2
  139. package/dist/remoteRun/ssh.d.ts.map +1 -1
  140. package/dist/remoteRun/ssh.js +41 -7
  141. package/dist/remoteRun/ssh.js.map +1 -1
  142. package/dist/runnerUtility/adminCheck.d.ts +18 -0
  143. package/dist/runnerUtility/adminCheck.d.ts.map +1 -0
  144. package/dist/runnerUtility/adminCheck.js +69 -0
  145. package/dist/runnerUtility/adminCheck.js.map +1 -0
  146. package/dist/runnerUtility/adminService.d.ts +22 -0
  147. package/dist/runnerUtility/adminService.d.ts.map +1 -0
  148. package/dist/runnerUtility/adminService.js +145 -0
  149. package/dist/runnerUtility/adminService.js.map +1 -0
  150. package/dist/runnerUtility/appInstall.d.ts +25 -0
  151. package/dist/runnerUtility/appInstall.d.ts.map +1 -0
  152. package/dist/runnerUtility/appInstall.js +147 -0
  153. package/dist/runnerUtility/appInstall.js.map +1 -0
  154. package/dist/runnerUtility/appUpdate.d.ts +39 -0
  155. package/dist/runnerUtility/appUpdate.d.ts.map +1 -0
  156. package/dist/runnerUtility/appUpdate.js +90 -0
  157. package/dist/runnerUtility/appUpdate.js.map +1 -0
  158. package/dist/runnerUtility/execEnv.d.ts +21 -0
  159. package/dist/runnerUtility/execEnv.d.ts.map +1 -0
  160. package/dist/runnerUtility/execEnv.js +109 -0
  161. package/dist/runnerUtility/execEnv.js.map +1 -0
  162. package/dist/runnerUtility/execSession.d.ts +13 -0
  163. package/dist/runnerUtility/execSession.d.ts.map +1 -0
  164. package/dist/runnerUtility/execSession.js +58 -0
  165. package/dist/runnerUtility/execSession.js.map +1 -0
  166. package/dist/runnerUtility/hubClient.d.ts +30 -0
  167. package/dist/runnerUtility/hubClient.d.ts.map +1 -0
  168. package/dist/runnerUtility/hubClient.js +127 -0
  169. package/dist/runnerUtility/hubClient.js.map +1 -0
  170. package/dist/runnerUtility/injectStream.d.ts +9 -0
  171. package/dist/runnerUtility/injectStream.d.ts.map +1 -0
  172. package/dist/runnerUtility/injectStream.js +12 -0
  173. package/dist/runnerUtility/injectStream.js.map +1 -0
  174. package/dist/runnerUtility/iosCheck.d.ts +62 -0
  175. package/dist/runnerUtility/iosCheck.d.ts.map +1 -0
  176. package/dist/runnerUtility/iosCheck.js +200 -0
  177. package/dist/runnerUtility/iosCheck.js.map +1 -0
  178. package/dist/runnerUtility/launcher.d.ts +5 -0
  179. package/dist/runnerUtility/launcher.d.ts.map +1 -0
  180. package/dist/runnerUtility/launcher.js +85 -0
  181. package/dist/runnerUtility/launcher.js.map +1 -0
  182. package/dist/runnerUtility/linkLoop.d.ts +39 -0
  183. package/dist/runnerUtility/linkLoop.d.ts.map +1 -0
  184. package/dist/runnerUtility/linkLoop.js +274 -0
  185. package/dist/runnerUtility/linkLoop.js.map +1 -0
  186. package/dist/runnerUtility/localLinkStop.d.ts +23 -0
  187. package/dist/runnerUtility/localLinkStop.d.ts.map +1 -0
  188. package/dist/runnerUtility/localLinkStop.js +79 -0
  189. package/dist/runnerUtility/localLinkStop.js.map +1 -0
  190. package/dist/runnerUtility/machineReport.d.ts +39 -0
  191. package/dist/runnerUtility/machineReport.d.ts.map +1 -0
  192. package/dist/runnerUtility/machineReport.js +161 -0
  193. package/dist/runnerUtility/machineReport.js.map +1 -0
  194. package/dist/runnerUtility/packageId.d.ts +5 -0
  195. package/dist/runnerUtility/packageId.d.ts.map +1 -0
  196. package/dist/runnerUtility/packageId.js +64 -0
  197. package/dist/runnerUtility/packageId.js.map +1 -0
  198. package/dist/runnerUtility/pairArgs.d.ts +16 -0
  199. package/dist/runnerUtility/pairArgs.d.ts.map +1 -0
  200. package/dist/runnerUtility/pairArgs.js +17 -0
  201. package/dist/runnerUtility/pairArgs.js.map +1 -0
  202. package/dist/runnerUtility/pairingRecovery.d.ts +31 -0
  203. package/dist/runnerUtility/pairingRecovery.d.ts.map +1 -0
  204. package/dist/runnerUtility/pairingRecovery.js +24 -0
  205. package/dist/runnerUtility/pairingRecovery.js.map +1 -0
  206. package/dist/runnerUtility/pueueDaemon.d.ts +36 -0
  207. package/dist/runnerUtility/pueueDaemon.d.ts.map +1 -0
  208. package/dist/runnerUtility/pueueDaemon.js +165 -0
  209. package/dist/runnerUtility/pueueDaemon.js.map +1 -0
  210. package/dist/runnerUtility/rootServiceCli.d.ts +8 -0
  211. package/dist/runnerUtility/rootServiceCli.d.ts.map +1 -0
  212. package/dist/runnerUtility/rootServiceCli.js +31 -0
  213. package/dist/runnerUtility/rootServiceCli.js.map +1 -0
  214. package/dist/runnerUtility/runnerCli.d.ts +18 -0
  215. package/dist/runnerUtility/runnerCli.d.ts.map +1 -0
  216. package/dist/runnerUtility/runnerCli.js +190 -0
  217. package/dist/runnerUtility/runnerCli.js.map +1 -0
  218. package/dist/runnerUtility/runnerCommands.d.ts +76 -0
  219. package/dist/runnerUtility/runnerCommands.d.ts.map +1 -0
  220. package/dist/runnerUtility/runnerCommands.js +464 -0
  221. package/dist/runnerUtility/runnerCommands.js.map +1 -0
  222. package/dist/runnerUtility/runnerConfig.d.ts +63 -0
  223. package/dist/runnerUtility/runnerConfig.d.ts.map +1 -0
  224. package/dist/runnerUtility/runnerConfig.js +153 -0
  225. package/dist/runnerUtility/runnerConfig.js.map +1 -0
  226. package/dist/runnerUtility/runnerFlags.d.ts +9 -0
  227. package/dist/runnerUtility/runnerFlags.d.ts.map +1 -0
  228. package/dist/runnerUtility/runnerFlags.js +53 -0
  229. package/dist/runnerUtility/runnerFlags.js.map +1 -0
  230. package/dist/runnerUtility/runnerHome.d.ts +30 -0
  231. package/dist/runnerUtility/runnerHome.d.ts.map +1 -0
  232. package/dist/runnerUtility/runnerHome.js +82 -0
  233. package/dist/runnerUtility/runnerHome.js.map +1 -0
  234. package/dist/runnerUtility/runnerKeys.d.ts +11 -0
  235. package/dist/runnerUtility/runnerKeys.d.ts.map +1 -0
  236. package/dist/runnerUtility/runnerKeys.js +80 -0
  237. package/dist/runnerUtility/runnerKeys.js.map +1 -0
  238. package/dist/runnerUtility/runnerServers.d.ts +40 -0
  239. package/dist/runnerUtility/runnerServers.d.ts.map +1 -0
  240. package/dist/runnerUtility/runnerServers.js +79 -0
  241. package/dist/runnerUtility/runnerServers.js.map +1 -0
  242. package/dist/runnerUtility/serviceCommon.d.ts +97 -0
  243. package/dist/runnerUtility/serviceCommon.d.ts.map +1 -0
  244. package/dist/runnerUtility/serviceCommon.js +209 -0
  245. package/dist/runnerUtility/serviceCommon.js.map +1 -0
  246. package/dist/runnerUtility/serviceManager.d.ts +51 -0
  247. package/dist/runnerUtility/serviceManager.d.ts.map +1 -0
  248. package/dist/runnerUtility/serviceManager.js +344 -0
  249. package/dist/runnerUtility/serviceManager.js.map +1 -0
  250. package/dist/runnerUtility/serviceUnits.d.ts +38 -0
  251. package/dist/runnerUtility/serviceUnits.d.ts.map +1 -0
  252. package/dist/runnerUtility/serviceUnits.js +189 -0
  253. package/dist/runnerUtility/serviceUnits.js.map +1 -0
  254. package/dist/runnerUtility/toolInstall.d.ts +95 -0
  255. package/dist/runnerUtility/toolInstall.d.ts.map +1 -0
  256. package/dist/runnerUtility/toolInstall.js +232 -0
  257. package/dist/runnerUtility/toolInstall.js.map +1 -0
  258. package/dist/runnerUtility/versionPollTiming.d.ts +16 -0
  259. package/dist/runnerUtility/versionPollTiming.d.ts.map +1 -0
  260. package/dist/runnerUtility/versionPollTiming.js +36 -0
  261. package/dist/runnerUtility/versionPollTiming.js.map +1 -0
  262. package/dist/runners/authorizedKeys.d.ts +52 -0
  263. package/dist/runners/authorizedKeys.d.ts.map +1 -0
  264. package/dist/runners/authorizedKeys.js +153 -0
  265. package/dist/runners/authorizedKeys.js.map +1 -0
  266. package/dist/runners/bootstrapLine.d.ts +13 -0
  267. package/dist/runners/bootstrapLine.d.ts.map +1 -0
  268. package/dist/runners/bootstrapLine.js +154 -0
  269. package/dist/runners/bootstrapLine.js.map +1 -0
  270. package/dist/runners/gate.d.ts +41 -0
  271. package/dist/runners/gate.d.ts.map +1 -0
  272. package/dist/runners/gate.js +225 -0
  273. package/dist/runners/gate.js.map +1 -0
  274. package/dist/runners/gateLink.d.ts +26 -0
  275. package/dist/runners/gateLink.d.ts.map +1 -0
  276. package/dist/runners/gateLink.js +240 -0
  277. package/dist/runners/gateLink.js.map +1 -0
  278. package/dist/runners/gateProtocol.d.ts +104 -0
  279. package/dist/runners/gateProtocol.d.ts.map +1 -0
  280. package/dist/runners/gateProtocol.js +151 -0
  281. package/dist/runners/gateProtocol.js.map +1 -0
  282. package/dist/runners/gateWrapper.d.ts +6 -0
  283. package/dist/runners/gateWrapper.d.ts.map +1 -0
  284. package/dist/runners/gateWrapper.js +70 -0
  285. package/dist/runners/gateWrapper.js.map +1 -0
  286. package/dist/runners/hubAddress.d.ts +33 -0
  287. package/dist/runners/hubAddress.d.ts.map +1 -0
  288. package/dist/runners/hubAddress.js +88 -0
  289. package/dist/runners/hubAddress.js.map +1 -0
  290. package/dist/runners/hubAddressCandidates.d.ts +16 -0
  291. package/dist/runners/hubAddressCandidates.d.ts.map +1 -0
  292. package/dist/runners/hubAddressCandidates.js +96 -0
  293. package/dist/runners/hubAddressCandidates.js.map +1 -0
  294. package/dist/runners/hubIds.d.ts +16 -0
  295. package/dist/runners/hubIds.d.ts.map +1 -0
  296. package/dist/runners/hubIds.js +25 -0
  297. package/dist/runners/hubIds.js.map +1 -0
  298. package/dist/runners/hubKey.d.ts +6 -0
  299. package/dist/runners/hubKey.d.ts.map +1 -0
  300. package/dist/runners/hubKey.js +78 -0
  301. package/dist/runners/hubKey.js.map +1 -0
  302. package/dist/runners/hubLock.d.ts +7 -0
  303. package/dist/runners/hubLock.d.ts.map +1 -0
  304. package/dist/runners/hubLock.js +230 -0
  305. package/dist/runners/hubLock.js.map +1 -0
  306. package/dist/runners/hubPackage.d.ts +23 -0
  307. package/dist/runners/hubPackage.d.ts.map +1 -0
  308. package/dist/runners/hubPackage.js +184 -0
  309. package/dist/runners/hubPackage.js.map +1 -0
  310. package/dist/runners/hubPairing.d.ts +70 -0
  311. package/dist/runners/hubPairing.d.ts.map +1 -0
  312. package/dist/runners/hubPairing.js +277 -0
  313. package/dist/runners/hubPairing.js.map +1 -0
  314. package/dist/runners/hubPaths.d.ts +42 -0
  315. package/dist/runners/hubPaths.d.ts.map +1 -0
  316. package/dist/runners/hubPaths.js +96 -0
  317. package/dist/runners/hubPaths.js.map +1 -0
  318. package/dist/runners/hubRegistry.d.ts +134 -0
  319. package/dist/runners/hubRegistry.d.ts.map +1 -0
  320. package/dist/runners/hubRegistry.js +256 -0
  321. package/dist/runners/hubRegistry.js.map +1 -0
  322. package/dist/runners/linkControl.d.ts +38 -0
  323. package/dist/runners/linkControl.d.ts.map +1 -0
  324. package/dist/runners/linkControl.js +171 -0
  325. package/dist/runners/linkControl.js.map +1 -0
  326. package/dist/runners/pairCode.d.ts +30 -0
  327. package/dist/runners/pairCode.d.ts.map +1 -0
  328. package/dist/runners/pairCode.js +46 -0
  329. package/dist/runners/pairCode.js.map +1 -0
  330. package/dist/runners/pairingTiming.d.ts +18 -0
  331. package/dist/runners/pairingTiming.d.ts.map +1 -0
  332. package/dist/runners/pairingTiming.js +42 -0
  333. package/dist/runners/pairingTiming.js.map +1 -0
  334. package/dist/runners/removalTiming.d.ts +13 -0
  335. package/dist/runners/removalTiming.d.ts.map +1 -0
  336. package/dist/runners/removalTiming.js +17 -0
  337. package/dist/runners/removalTiming.js.map +1 -0
  338. package/dist/runners/runnerProxy.d.ts +9 -0
  339. package/dist/runners/runnerProxy.d.ts.map +1 -0
  340. package/dist/runners/runnerProxy.js +67 -0
  341. package/dist/runners/runnerProxy.js.map +1 -0
  342. package/dist/runners/runnerRemoval.d.ts +21 -0
  343. package/dist/runners/runnerRemoval.d.ts.map +1 -0
  344. package/dist/runners/runnerRemoval.js +94 -0
  345. package/dist/runners/runnerRemoval.js.map +1 -0
  346. package/dist/runners/runnerServiceKind.d.ts +10 -0
  347. package/dist/runners/runnerServiceKind.d.ts.map +1 -0
  348. package/dist/runners/runnerServiceKind.js +13 -0
  349. package/dist/runners/runnerServiceKind.js.map +1 -0
  350. package/dist/runners/runnersCli.d.ts +25 -0
  351. package/dist/runners/runnersCli.d.ts.map +1 -0
  352. package/dist/runners/runnersCli.js +239 -0
  353. package/dist/runners/runnersCli.js.map +1 -0
  354. package/dist/runners/runnersList.d.ts +14 -0
  355. package/dist/runners/runnersList.d.ts.map +1 -0
  356. package/dist/runners/runnersList.js +51 -0
  357. package/dist/runners/runnersList.js.map +1 -0
  358. package/dist/runners/runnersOverview.d.ts +20 -0
  359. package/dist/runners/runnersOverview.d.ts.map +1 -0
  360. package/dist/runners/runnersOverview.js +56 -0
  361. package/dist/runners/runnersOverview.js.map +1 -0
  362. package/dist/runners/sshKeys.d.ts +26 -0
  363. package/dist/runners/sshKeys.d.ts.map +1 -0
  364. package/dist/runners/sshKeys.js +60 -0
  365. package/dist/runners/sshKeys.js.map +1 -0
  366. package/dist/runners/tarArchive.d.ts +20 -0
  367. package/dist/runners/tarArchive.d.ts.map +1 -0
  368. package/dist/runners/tarArchive.js +70 -0
  369. package/dist/runners/tarArchive.js.map +1 -0
  370. package/dist/scheduler/mcpSurface.d.ts +11 -5
  371. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  372. package/dist/scheduler/mcpSurface.js +59 -26
  373. package/dist/scheduler/mcpSurface.js.map +1 -1
  374. package/dist/selfUpdate/selfCheck.d.ts +13 -0
  375. package/dist/selfUpdate/selfCheck.d.ts.map +1 -1
  376. package/dist/selfUpdate/selfCheck.js +9 -3
  377. package/dist/selfUpdate/selfCheck.js.map +1 -1
  378. package/dist/stt/sttInstallEntry.js +7 -4
  379. package/dist/stt/sttInstallEntry.js.map +1 -1
  380. package/dist/testTimings.d.ts +5 -2
  381. package/dist/testTimings.d.ts.map +1 -1
  382. package/dist/testTimings.js +10 -1
  383. package/dist/testTimings.js.map +1 -1
  384. package/dist/utils/agentEnvironment.d.ts +6 -2
  385. package/dist/utils/agentEnvironment.d.ts.map +1 -1
  386. package/dist/utils/agentEnvironment.js +13 -2
  387. package/dist/utils/agentEnvironment.js.map +1 -1
  388. package/dist/utils/runnersScreenPlan.d.ts +141 -0
  389. package/dist/utils/runnersScreenPlan.d.ts.map +1 -0
  390. package/dist/utils/runnersScreenPlan.js +272 -0
  391. package/dist/utils/runnersScreenPlan.js.map +1 -0
  392. package/package.json +5 -2
  393. package/remoteRun/runner.sh +81 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerServiceKind.js","sourceRoot":"","sources":["../../src/runners/runnerServiceKind.ts"],"names":[],"mappings":";;AASA,sDAEC;AARD;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,MAAoB,EAAE,KAAyB;IACnF,OAAO,KAAK,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;AAClD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { CliIo } from '../remoteRun/output';
2
+ import { type HostKeyScanner } from './hubAddress';
3
+ import { type HubContext } from './hubPaths';
4
+ /**
5
+ * @description `charness runners [ls | pair | remove <name> | pause <name> | resume <name>]` — the headless twin of `/runners`, for an
6
+ * instance without Telegram (a Jira-only one) and for the flow tests. It works on the registry of the OS user
7
+ * (`~/.config/charness/runners/`), loads no env file and never touches `DATA_DIR`.
8
+ */
9
+ /** What the admin line does to the machine it is pasted on, in the words every place that offers it uses (the Telegram message has it in each language). */
10
+ export declare const adminLineTrustSentence = "It runs code from this charness host as root on that machine";
11
+ export declare const runnersUsage = "Usage:\n charness runners [ls] the machines paired as runners: online or not, OS, how they are kept running\n (as each machine last reported it; no ssh call)\n charness runners pair --host <host[:port]> [--label <text>] [--account <name>] [--wait]\n make two pairing lines (valid 10 minutes, single use, the first one used wins) to run on\n the runner machine: one for an ADMIN account there (it pairs <name>, default \"runner\", and\n installs its always-on service), one for the runner account itself;\n <host[:port]> is the address the runner dials to reach this machine's sshd;\n --wait blocks until a line is used or the code expires (a line pasted for a machine that\n was already paired ends it too, with exit 0: nothing new was paired)\n charness runners remove <name> detach a runner: its key is deleted and its link cut\n charness runners pause <name> keep a runner attached but send it no jobs\n charness runners resume <name>\n";
12
+ /** @description What the CLI needs from outside; tests replace the scanner, the clock and the wait. */
13
+ export interface RunnersCliDeps {
14
+ ctx: HubContext;
15
+ /** Where remote-run keeps the last probe snapshot of each machine: `ls` reads them (it makes no ssh call). */
16
+ cacheDir: string;
17
+ scanHostKey: HostKeyScanner;
18
+ now: () => number;
19
+ sleep: (ms: number) => Promise<void>;
20
+ sshUser?: string;
21
+ }
22
+ export declare function createRunnersCliDeps(io: Pick<CliIo, 'homeDir' | 'env'>): RunnersCliDeps;
23
+ /** @description Run the command line (the words after `runners`); resolves with the exit code. */
24
+ export declare function runRunnersCli(argv: readonly string[], io: CliIo, deps?: RunnersCliDeps): Promise<number>;
25
+ //# sourceMappingURL=runnersCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersCli.d.ts","sourceRoot":"","sources":["../../src/runners/runnersCli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjD,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ/D;;;;GAIG;AAEH,4JAA4J;AAC5J,eAAO,MAAM,sBAAsB,iEAAiE,CAAC;AAMrG,eAAO,MAAM,YAAY,iyCAaxB,CAAC;AAEF,uGAAuG;AACvG,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,UAAU,CAAC;IAChB,8GAA8G;IAC9G,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,CAAC;IAC5B,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC,GAAG,cAAc,CAQvF;AAkID,kGAAkG;AAClG,wBAAsB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,GAAE,cAAyC,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BxI"}
@@ -0,0 +1,239 @@
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.runnersUsage = exports.adminLineTrustSentence = void 0;
37
+ exports.createRunnersCliDeps = createRunnersCliDeps;
38
+ exports.runRunnersCli = runRunnersCli;
39
+ const os = __importStar(require("os"));
40
+ const ssh_1 = require("../remoteRun/ssh");
41
+ const bootstrapLine_1 = require("./bootstrapLine");
42
+ const gateWrapper_1 = require("./gateWrapper");
43
+ const hubAddress_1 = require("./hubAddress");
44
+ const hubPaths_1 = require("./hubPaths");
45
+ const hubPairing_1 = require("./hubPairing");
46
+ const pairingTiming_1 = require("./pairingTiming");
47
+ const hubRegistry_1 = require("./hubRegistry");
48
+ const runnerRemoval_1 = require("./runnerRemoval");
49
+ const runnersOverview_1 = require("./runnersOverview");
50
+ const runnersList_1 = require("./runnersList");
51
+ /**
52
+ * @description `charness runners [ls | pair | remove <name> | pause <name> | resume <name>]` — the headless twin of `/runners`, for an
53
+ * instance without Telegram (a Jira-only one) and for the flow tests. It works on the registry of the OS user
54
+ * (`~/.config/charness/runners/`), loads no env file and never touches `DATA_DIR`.
55
+ */
56
+ /** What the admin line does to the machine it is pasted on, in the words every place that offers it uses (the Telegram message has it in each language). */
57
+ exports.adminLineTrustSentence = 'It runs code from this charness host as root on that machine';
58
+ const usageExitCode = 2;
59
+ const failedExitCode = 1;
60
+ const waitPollMs = 1000;
61
+ exports.runnersUsage = `Usage:
62
+ charness runners [ls] the machines paired as runners: online or not, OS, how they are kept running
63
+ (as each machine last reported it; no ssh call)
64
+ charness runners pair --host <host[:port]> [--label <text>] [--account <name>] [--wait]
65
+ make two pairing lines (valid 10 minutes, single use, the first one used wins) to run on
66
+ the runner machine: one for an ADMIN account there (it pairs <name>, default "runner", and
67
+ installs its always-on service), one for the runner account itself;
68
+ <host[:port]> is the address the runner dials to reach this machine's sshd;
69
+ --wait blocks until a line is used or the code expires (a line pasted for a machine that
70
+ was already paired ends it too, with exit 0: nothing new was paired)
71
+ charness runners remove <name> detach a runner: its key is deleted and its link cut
72
+ charness runners pause <name> keep a runner attached but send it no jobs
73
+ charness runners resume <name>
74
+ `;
75
+ function createRunnersCliDeps(io) {
76
+ return {
77
+ ctx: (0, hubPaths_1.createHubContext)({ homeDir: io.homeDir }),
78
+ cacheDir: (0, ssh_1.getRemoteRunCacheDir)(io.env, io.homeDir),
79
+ scanHostKey: hubAddress_1.scanHostKey,
80
+ now: Date.now,
81
+ sleep: (ms) => new Promise((resolve) => { setTimeout(resolve, ms); }),
82
+ };
83
+ }
84
+ function parsePairOptions(args) {
85
+ const options = { host: null, label: null, account: bootstrapLine_1.defaultRunnerAccount, isWaiting: false };
86
+ for (let index = 0; index < args.length; index += 1) {
87
+ const argument = args[index];
88
+ if (argument === '--wait') {
89
+ options.isWaiting = true;
90
+ }
91
+ else if (argument === '--host' || argument === '--label' || argument === '--account') {
92
+ const value = args[index + 1];
93
+ if (value === undefined)
94
+ return `${argument} needs a value`;
95
+ if (argument === '--host')
96
+ options.host = value;
97
+ else if (argument === '--label')
98
+ options.label = value;
99
+ else if ((0, bootstrapLine_1.checkIsAccountName)(value))
100
+ options.account = value;
101
+ else
102
+ return '--account must be a plain account name (letters, digits, ".", "_", "-")';
103
+ index += 1;
104
+ }
105
+ else {
106
+ return `unknown argument: ${argument}`;
107
+ }
108
+ }
109
+ return options;
110
+ }
111
+ async function runPairCommand(args, io, deps) {
112
+ const options = parsePairOptions(args);
113
+ if (typeof options === 'string' || options.host === null) {
114
+ io.stderr(`runners: ${typeof options === 'string' ? options : '--host <host[:port]> is required (the address runners dial to reach this machine over ssh)'}\n\n${exports.runnersUsage}`);
115
+ return usageExitCode;
116
+ }
117
+ const parsedAddress = (0, hubAddress_1.parseHubAddress)(options.host);
118
+ if (!parsedAddress.ok) {
119
+ io.stderr(`runners: ${parsedAddress.error}\n`);
120
+ return usageExitCode;
121
+ }
122
+ const check = await (0, hubAddress_1.checkHubAddress)(parsedAddress.address, deps.scanHostKey);
123
+ if (!check.ok) {
124
+ io.stderr(`runners: ${check.error}\n`);
125
+ return failedExitCode;
126
+ }
127
+ if (check.note !== null)
128
+ io.stderr(`runners: ${check.note}\n`);
129
+ (0, gateWrapper_1.ensureGateWrapper)(deps.ctx);
130
+ const pairing = await (0, hubPairing_1.createPairing)(deps.ctx, {
131
+ host: parsedAddress.address.host,
132
+ port: parsedAddress.address.port,
133
+ hostKey: check.hostKey,
134
+ label: options.label ?? os.hostname(),
135
+ nowMs: deps.now(),
136
+ lifetimeMs: (0, pairingTiming_1.readPairingLifetimeMs)(io.env),
137
+ sshUser: deps.sshUser,
138
+ });
139
+ io.stdout(`Pair a runner — valid ${(0, pairingTiming_1.formatLifetime)((0, pairingTiming_1.readPairingLifetimeMs)(io.env))}, single use.\n\n` +
140
+ `1) From an admin account of the runner machine: it pairs "${options.account}" (the last word of the line — change it if the account is named otherwise) and keeps it running. ${exports.adminLineTrustSentence}:\n\n` +
141
+ `${(0, bootstrapLine_1.buildAdminBootstrapLine)(pairing.payload, options.account)}\n\n` +
142
+ `2) Without admin rights: run this one in the terminal of the runner account itself:\n\n` +
143
+ `${(0, bootstrapLine_1.buildBootstrapLine)(pairing.payload)}\n\n` +
144
+ `The account must be an existing standard user, not your main account — it runs the agents' code.\n` +
145
+ `Anyone with either line can attach a machine to this charness until one of them is used or expires.\n`);
146
+ return options.isWaiting ? waitForPairing(pairing.pairId, io, deps) : 0;
147
+ }
148
+ async function waitForPairing(pairId, io, deps) {
149
+ for (;;) {
150
+ const runner = (0, hubRegistry_1.readPairedFile)(deps.ctx.dir).runners.find((candidate) => candidate.pairId === pairId);
151
+ if (runner !== undefined) {
152
+ io.stdout(`Runner "${runner.name}" paired ${(0, runnersList_1.formatListTimestamp)(runner.pairedAtMs)}.\n`);
153
+ return 0;
154
+ }
155
+ const pairing = (0, hubRegistry_1.readPendingFile)(deps.ctx.dir).pending.find((candidate) => candidate.pairId === pairId);
156
+ // A code closed unused is not a failure: its line was pasted for a machine that was already paired, and did its job (the service).
157
+ if (pairing === undefined) {
158
+ const { codes, problem } = (0, hubRegistry_1.readClosedCodes)(deps.ctx.dir);
159
+ if (problem !== null)
160
+ io.stderr(`runners: ${problem}\n`);
161
+ if (codes.some((entry) => entry.pairId === pairId)) {
162
+ io.stdout('The pairing line was used on a machine that was already paired: nothing new was paired.\n');
163
+ return 0;
164
+ }
165
+ }
166
+ if (pairing === undefined || pairing.expiresAtMs <= deps.now()) {
167
+ await (0, hubPairing_1.sweepExpiredPairings)(deps.ctx, deps.now());
168
+ io.stderr('runners: the pairing code expired unused.\n');
169
+ return failedExitCode;
170
+ }
171
+ await deps.sleep(waitPollMs);
172
+ }
173
+ }
174
+ async function runListCommand(io, deps) {
175
+ await (0, hubPairing_1.sweepExpiredPairings)(deps.ctx, deps.now());
176
+ // The screen's first step: the registry, which links are up and the last snapshot of each machine — no ssh call, so `ls` stays instant and a
177
+ // machine is online exactly when its link is (the screen's second step, the live probe, may demote one whose ssh does not answer).
178
+ const overview = await (0, runnersOverview_1.readRunnersOverview)(deps.ctx, deps.cacheDir, deps.now());
179
+ io.stdout((0, runnersList_1.formatRunnerList)(overview.entries, (0, hubRegistry_1.readPendingFile)(deps.ctx.dir).pending, deps.now()));
180
+ return 0;
181
+ }
182
+ async function runRemoveCommand(name, io, deps) {
183
+ const removal = await (0, runnerRemoval_1.removeRunnerAndEndItsWork)(deps.ctx, name, deps.now());
184
+ if (removal === null) {
185
+ io.stderr(`runners: no runner named "${name}"\n`);
186
+ return failedExitCode;
187
+ }
188
+ const jobsNote = {
189
+ stopped: 'the jobs it had running are stopped',
190
+ failed: 'the jobs it had running could not be stopped from here (it stops them itself once it finds out it was removed)',
191
+ offline: 'it is offline: it stops the jobs it had running itself once it finds out it was removed',
192
+ }[removal.jobs];
193
+ io.stdout(`Runner "${removal.runner.name}" removed: its key is deleted and its link cut; ${jobsNote}.\n`);
194
+ return 0;
195
+ }
196
+ async function runPauseCommand(name, isPaused, io, deps) {
197
+ const runner = (0, hubPairing_1.findPairedRunner)((0, hubRegistry_1.readPairedFile)(deps.ctx.dir).runners, name);
198
+ const updated = runner === undefined ? null : await (0, hubPairing_1.setPairedRunnerPaused)(deps.ctx, runner.id, isPaused);
199
+ if (updated === null) {
200
+ io.stderr(`runners: no runner named "${name}"\n`);
201
+ return failedExitCode;
202
+ }
203
+ io.stdout(`Runner "${updated.name}" ${isPaused ? 'paused: it gets no jobs until resumed' : 'resumed'}.\n`);
204
+ return 0;
205
+ }
206
+ /** @description Run the command line (the words after `runners`); resolves with the exit code. */
207
+ async function runRunnersCli(argv, io, deps = createRunnersCliDeps(io)) {
208
+ const [command = 'ls', ...args] = argv;
209
+ try {
210
+ switch (command) {
211
+ case 'ls':
212
+ return await runListCommand(io, deps);
213
+ case 'pair':
214
+ return await runPairCommand(args, io, deps);
215
+ case 'remove':
216
+ case 'pause':
217
+ case 'resume': {
218
+ if (args.length !== 1) {
219
+ io.stderr(`runners: ${command} needs exactly one runner name\n\n${exports.runnersUsage}`);
220
+ return usageExitCode;
221
+ }
222
+ return command === 'remove' ? await runRemoveCommand(args[0], io, deps) : await runPauseCommand(args[0], command === 'pause', io, deps);
223
+ }
224
+ case '--help':
225
+ case '-h':
226
+ case 'help':
227
+ io.stdout(exports.runnersUsage);
228
+ return 0;
229
+ default:
230
+ io.stderr(`runners: unknown command: ${command}\n\n${exports.runnersUsage}`);
231
+ return usageExitCode;
232
+ }
233
+ }
234
+ catch (error) {
235
+ io.stderr(`runners: ${error instanceof hubRegistry_1.HubRegistryError ? error.message : `failed (${error instanceof Error ? error.name : 'unknown error'}: ${error instanceof Error ? error.message : ''})`}\n`);
236
+ return failedExitCode;
237
+ }
238
+ }
239
+ //# sourceMappingURL=runnersCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersCli.js","sourceRoot":"","sources":["../../src/runners/runnersCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { RunnerScreenEntry } from '../utils/runnersScreenPlan';
2
+ import type { PendingPairing, RunnerServiceKind } from './hubRegistry';
3
+ /**
4
+ * @description The text of `charness runners ls`: one line per paired runner (name, online or offline since when, paused, OS, how it
5
+ * is kept running, version) and a line for each pairing code still open. Pure: the entries — the same ones the `/runners` screen is built
6
+ * from, with the probe — are read by the caller, and how a runner is kept running is the one rule of `getCurrentServiceKind`.
7
+ */
8
+ export declare const serviceKindLabels: Record<RunnerServiceKind, string>;
9
+ /** @description `2026-11-01 14:05` in the zone of this process. */
10
+ export declare function formatListTimestamp(epochMs: number): string;
11
+ export declare function formatRunnerListLine(entry: RunnerScreenEntry): string;
12
+ /** @description The whole `ls` output. */
13
+ export declare function formatRunnerList(entries: readonly RunnerScreenEntry[], pending: readonly PendingPairing[], nowMs: number): string;
14
+ //# sourceMappingURL=runnersList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersList.d.ts","sourceRoot":"","sources":["../../src/runners/runnersList.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvE;;;;GAIG;AAEH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAK/D,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI3D;AAOD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAWrE;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EAAE,OAAO,EAAE,SAAS,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjI"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serviceKindLabels = void 0;
4
+ exports.formatListTimestamp = formatListTimestamp;
5
+ exports.formatRunnerListLine = formatRunnerListLine;
6
+ exports.formatRunnerList = formatRunnerList;
7
+ const runnerServiceKind_1 = require("./runnerServiceKind");
8
+ /**
9
+ * @description The text of `charness runners ls`: one line per paired runner (name, online or offline since when, paused, OS, how it
10
+ * is kept running, version) and a line for each pairing code still open. Pure: the entries — the same ones the `/runners` screen is built
11
+ * from, with the probe — are read by the caller, and how a runner is kept running is the one rule of `getCurrentServiceKind`.
12
+ */
13
+ exports.serviceKindLabels = {
14
+ foreground: 'run by hand',
15
+ 'user-service': 'user service',
16
+ 'system-service': 'system service',
17
+ unknown: 'service unknown',
18
+ };
19
+ /** @description `2026-11-01 14:05` in the zone of this process. */
20
+ function formatListTimestamp(epochMs) {
21
+ const date = new Date(epochMs);
22
+ const pad = (value) => value.toString().padStart(2, '0');
23
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`;
24
+ }
25
+ function describeConnection(entry) {
26
+ if (entry.isOnline)
27
+ return 'online';
28
+ return entry.lastSeenMs === null ? 'offline, never connected' : `offline since ${formatListTimestamp(entry.lastSeenMs)}`;
29
+ }
30
+ function formatRunnerListLine(entry) {
31
+ const { runner, probe } = entry;
32
+ const parts = [
33
+ describeConnection(entry),
34
+ ...(runner.isPaused ? ['paused'] : []),
35
+ `${runner.os} (${runner.arch})`,
36
+ exports.serviceKindLabels[(0, runnerServiceKind_1.getCurrentServiceKind)(runner, probe)],
37
+ `charness ${runner.version}`,
38
+ `paired ${formatListTimestamp(runner.pairedAtMs)}`,
39
+ ];
40
+ return `${runner.name} — ${parts.join(' · ')}`;
41
+ }
42
+ /** @description The whole `ls` output. */
43
+ function formatRunnerList(entries, pending, nowMs) {
44
+ const lines = entries.length === 0 ? ['No runners paired yet. `charness runners pair --host <address>` makes a pairing line.'] : entries.map(formatRunnerListLine);
45
+ const open = pending.filter((pairing) => pairing.expiresAtMs > nowMs);
46
+ if (open.length > 0) {
47
+ lines.push('', ...open.map((pairing) => `Pairing code open until ${formatListTimestamp(pairing.expiresAtMs)} (${pairing.host}:${pairing.port})`));
48
+ }
49
+ return `${lines.join('\n')}\n`;
50
+ }
51
+ //# sourceMappingURL=runnersList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersList.js","sourceRoot":"","sources":["../../src/runners/runnersList.ts"],"names":[],"mappings":";;;AAkBA,kDAIC;AAOD,oDAWC;AAGD,4CAOC;AAhDD,2DAA4D;AAE5D;;;;GAIG;AAEU,QAAA,iBAAiB,GAAsC;IAClE,UAAU,EAAE,aAAa;IACzB,cAAc,EAAE,cAAc;IAC9B,gBAAgB,EAAE,gBAAgB;IAClC,OAAO,EAAE,iBAAiB;CAC3B,CAAC;AAEF,mEAAmE;AACnE,SAAgB,mBAAmB,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzE,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AACtI,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAwB;IAClD,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,iBAAiB,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;AAC3H,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAwB;IAC3D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,KAAK,GAAG;QACZ,kBAAkB,CAAC,KAAK,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,GAAG;QAC/B,yBAAiB,CAAC,IAAA,yCAAqB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,UAAU,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;KACnD,CAAC;IACF,OAAO,GAAG,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,0CAA0C;AAC1C,SAAgB,gBAAgB,CAAC,OAAqC,EAAE,OAAkC,EAAE,KAAa;IACvH,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,uFAAuF,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnK,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,2BAA2B,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACpJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { RunnerScreenEntry } from '../utils/runnersScreenPlan';
2
+ import type { HubContext } from './hubPaths';
3
+ /**
4
+ * @description What the `/runners` screen shows, read in two steps so it can open at once: {@link readRunnersOverview} is the registry,
5
+ * the links (does the socket accept?) and the last snapshot each machine left — no ssh, milliseconds — and
6
+ * {@link probeRunnersOverview} asks the machines that are online what they are like right now (one shared 20 s deadline, the phase-1
7
+ * probe), keeping the snapshot of a machine that does not answer.
8
+ */
9
+ export interface RunnersOverview {
10
+ /** The registry revision (`paired.json` `rev`): what a keyboard built from this overview is valid for. */
11
+ revision: number;
12
+ entries: RunnerScreenEntry[];
13
+ /** Expiry of every pairing code that is still open. */
14
+ openPairingExpiries: number[];
15
+ }
16
+ /** @description The overview without any ssh call: the registry, which links are up, the last snapshots. */
17
+ export declare function readRunnersOverview(ctx: HubContext, cacheDir: string, nowMs: number): Promise<RunnersOverview>;
18
+ /** @description `overview` with the machines that are online asked for their live state. Offline ones are not called. */
19
+ export declare function probeRunnersOverview(ctx: HubContext, overview: RunnersOverview, cacheDir: string, nowMs: number): Promise<RunnersOverview>;
20
+ //# sourceMappingURL=runnersOverview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersOverview.d.ts","sourceRoot":"","sources":["../../src/runners/runnersOverview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,0GAA0G;IAC1G,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,uDAAuD;IACvD,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AASD,4GAA4G;AAC5G,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAOpH;AASD,yHAAyH;AACzH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiBhJ"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readRunnersOverview = readRunnersOverview;
4
+ exports.probeRunnersOverview = probeRunnersOverview;
5
+ const pairedRunners_1 = require("../remoteRun/pairedRunners");
6
+ const runners_1 = require("../remoteRun/runners");
7
+ const runnerClient_1 = require("../remoteRun/runnerClient");
8
+ const ssh_1 = require("../remoteRun/ssh");
9
+ const hubRegistry_1 = require("./hubRegistry");
10
+ const linkControl_1 = require("./linkControl");
11
+ async function readEntry(ctx, runner, cacheDir) {
12
+ const status = await (0, linkControl_1.getRunnerLinkStatus)(ctx.dir, runner.id);
13
+ // Only a report taken since this machine was paired is its own: its name may have belonged to a machine that was removed.
14
+ const snapshot = (0, runners_1.readLastProbe)(cacheDir, runner.name, runner.pairedAtMs);
15
+ return { runner, isOnline: status.isOnline, lastSeenMs: status.lastSeenMs ?? snapshot?.seenAtMs ?? null, probe: snapshot?.probe ?? null };
16
+ }
17
+ /** @description The overview without any ssh call: the registry, which links are up, the last snapshots. */
18
+ async function readRunnersOverview(ctx, cacheDir, nowMs) {
19
+ const paired = (0, hubRegistry_1.readPairedFile)(ctx.dir);
20
+ return {
21
+ revision: paired.rev,
22
+ entries: await Promise.all(paired.runners.map((runner) => readEntry(ctx, runner, cacheDir))),
23
+ openPairingExpiries: (0, hubRegistry_1.readPendingFile)(ctx.dir).pending.filter((pairing) => pairing.expiresAtMs > nowMs).map((pairing) => pairing.expiresAtMs),
24
+ };
25
+ }
26
+ function applyReport(entry, report) {
27
+ if (report === undefined)
28
+ return entry;
29
+ if (report.status === 'online')
30
+ return { ...entry, probe: report.probe };
31
+ // It answered the socket probe but not the ssh one: it is shown as it was, offline.
32
+ return { ...entry, isOnline: false, lastSeenMs: report.lastSeenAtMs ?? entry.lastSeenMs, probe: report.lastProbe ?? entry.probe };
33
+ }
34
+ /** @description `overview` with the machines that are online asked for their live state. Offline ones are not called. */
35
+ async function probeRunnersOverview(ctx, overview, cacheDir, nowMs) {
36
+ const hub = { hubDir: ctx.dir, nodePath: ctx.nodePath, cliPath: ctx.cliPath };
37
+ const clients = overview.entries
38
+ .filter((entry) => entry.isOnline)
39
+ .flatMap((entry) => {
40
+ try {
41
+ return [(0, runnerClient_1.createRunnerClient)((0, pairedRunners_1.buildPairedRunnerConfig)(entry.runner, hub), cacheDir)];
42
+ }
43
+ catch (error) {
44
+ // A path of this machine that ssh cannot be given safely: that machine is shown as its last snapshot says, not probed.
45
+ if (error instanceof pairedRunners_1.PairedRunnerSetupError)
46
+ return [];
47
+ throw error;
48
+ }
49
+ });
50
+ if (clients.length === 0)
51
+ return overview;
52
+ (0, ssh_1.ensureRemoteRunCacheDir)(cacheDir);
53
+ const reports = await (0, runners_1.probeRunners)(clients, nowMs);
54
+ return { ...overview, entries: overview.entries.map((entry) => applyReport(entry, reports.find((report) => report.name === entry.runner.name))) };
55
+ }
56
+ //# sourceMappingURL=runnersOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnersOverview.js","sourceRoot":"","sources":["../../src/runners/runnersOverview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface SshKeyPair {
2
+ /** OpenSSH private key text (what `ssh -i` reads). */
3
+ privateKey: string;
4
+ /** `ssh-ed25519 <base64>`. */
5
+ publicKey: string;
6
+ }
7
+ export interface ParsedPublicKey {
8
+ type: string;
9
+ /** The key as the ssh wire protocol carries it (what a host key verifier is handed). */
10
+ blob: Buffer;
11
+ }
12
+ /**
13
+ * @description A new ed25519 pair; `comment` is kept in the private key only. `ssh2`'s generator drops a leading zero byte of the key
14
+ * now and then (about 1 key in 300 comes out with a 31-byte public key, which neither `ssh2` nor OpenSSH can read), so every pair is
15
+ * read back before it is returned and a bad one is made again.
16
+ */
17
+ export declare function generateEd25519KeyPair(comment: string): SshKeyPair;
18
+ /** @description `value` as a public key, or `null` when it is not exactly `<type> <base64>`. */
19
+ export declare function parsePublicKey(value: string): ParsedPublicKey | null;
20
+ /** @description Is `value` a public key of the type charness issues to runners and the hub — ed25519 — in the strict form? */
21
+ export declare function checkIsEd25519PublicKey(value: string): boolean;
22
+ /** @description `SHA256:…`, the fingerprint `ssh-keygen -l` prints. */
23
+ export declare function getPublicKeyFingerprint(publicKey: string): string;
24
+ /** @description A random identifier (12 lowercase hex digits) safe in a file name, a shell word, an `authorized_keys` option and as the first word of an argument list. */
25
+ export declare function createRandomId(): string;
26
+ //# sourceMappingURL=sshKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sshKeys.d.ts","sourceRoot":"","sources":["../../src/runners/sshKeys.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CASlE;AAED,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAKpE;AAED,8HAA8H;AAC9H,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,2KAA2K;AAC3K,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateEd25519KeyPair = generateEd25519KeyPair;
4
+ exports.parsePublicKey = parsePublicKey;
5
+ exports.checkIsEd25519PublicKey = checkIsEd25519PublicKey;
6
+ exports.getPublicKeyFingerprint = getPublicKeyFingerprint;
7
+ exports.createRandomId = createRandomId;
8
+ const crypto_1 = require("crypto");
9
+ const ssh2_1 = require("ssh2");
10
+ /**
11
+ * @description The few things charness does with ssh keys: make an ed25519 pair (the runner's own, the hub's, a pairing's temporary
12
+ * one), write a public key the way `authorized_keys` and `known_hosts` read it, and its fingerprint. Public keys are kept as the
13
+ * two-field `<type> <base64>` text — no comment — and checked against a strict pattern before they are ever written into a file
14
+ * sshd reads: a key that carried a newline or an option would be a line of its own.
15
+ */
16
+ const base64Alphabet = 'A-Za-z0-9+/';
17
+ const publicKeyPattern = new RegExp(`^(ssh-ed25519|ecdsa-sha2-nistp(?:256|384|521)|ssh-rsa) ([${base64Alphabet}]+={0,2})$`);
18
+ const ed25519Type = 'ssh-ed25519';
19
+ const idByteLength = 6;
20
+ /** The odds of a bad key are about 1 in 300: ten tries in a row failing is not luck. */
21
+ const maxKeyGenerationAttempts = 10;
22
+ /**
23
+ * @description A new ed25519 pair; `comment` is kept in the private key only. `ssh2`'s generator drops a leading zero byte of the key
24
+ * now and then (about 1 key in 300 comes out with a 31-byte public key, which neither `ssh2` nor OpenSSH can read), so every pair is
25
+ * read back before it is returned and a bad one is made again.
26
+ */
27
+ function generateEd25519KeyPair(comment) {
28
+ for (let attempt = 0; attempt < maxKeyGenerationAttempts; attempt += 1) {
29
+ const generated = ssh2_1.utils.generateKeyPairSync('ed25519', { comment });
30
+ const publicKey = generated.public.split(' ').slice(0, 2).join(' ');
31
+ if (!(ssh2_1.utils.parseKey(publicKey) instanceof Error) && !(ssh2_1.utils.parseKey(generated.private) instanceof Error)) {
32
+ return { privateKey: generated.private, publicKey };
33
+ }
34
+ }
35
+ throw new Error('could not generate a readable ed25519 key');
36
+ }
37
+ /** @description `value` as a public key, or `null` when it is not exactly `<type> <base64>`. */
38
+ function parsePublicKey(value) {
39
+ const match = publicKeyPattern.exec(value);
40
+ if (match === null)
41
+ return null;
42
+ const blob = Buffer.from(match[2], 'base64');
43
+ return blob.length === 0 ? null : { type: match[1], blob };
44
+ }
45
+ /** @description Is `value` a public key of the type charness issues to runners and the hub — ed25519 — in the strict form? */
46
+ function checkIsEd25519PublicKey(value) {
47
+ return parsePublicKey(value)?.type === ed25519Type;
48
+ }
49
+ /** @description `SHA256:…`, the fingerprint `ssh-keygen -l` prints. */
50
+ function getPublicKeyFingerprint(publicKey) {
51
+ const parsed = parsePublicKey(publicKey);
52
+ if (parsed === null)
53
+ throw new Error('not a public key');
54
+ return `SHA256:${(0, crypto_1.createHash)('sha256').update(parsed.blob).digest('base64').replace(/=+$/, '')}`;
55
+ }
56
+ /** @description A random identifier (12 lowercase hex digits) safe in a file name, a shell word, an `authorized_keys` option and as the first word of an argument list. */
57
+ function createRandomId() {
58
+ return (0, crypto_1.randomBytes)(idByteLength).toString('hex');
59
+ }
60
+ //# sourceMappingURL=sshKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sshKeys.js","sourceRoot":"","sources":["../../src/runners/sshKeys.ts"],"names":[],"mappings":";;AAmCA,wDASC;AAGD,wCAKC;AAGD,0DAEC;AAGD,0DAIC;AAGD,wCAEC;AArED,mCAAiD;AACjD,+BAA6B;AAE7B;;;;;GAKG;AAEH,MAAM,cAAc,GAAG,aAAa,CAAC;AACrC,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,4DAA4D,cAAc,YAAY,CAAC,CAAC;AAC5H,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,wFAAwF;AACxF,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAepC;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,OAAe;IACpD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,wBAAwB,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,YAAK,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,CAAC,YAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,YAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YAC3G,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC/D,CAAC;AAED,gGAAgG;AAChG,SAAgB,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED,8HAA8H;AAC9H,SAAgB,uBAAuB,CAAC,KAAa;IACnD,OAAO,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC;AACrD,CAAC;AAED,uEAAuE;AACvE,SAAgB,uBAAuB,CAAC,SAAiB;IACvD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACzD,OAAO,UAAU,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;AAClG,CAAC;AAED,2KAA2K;AAC3K,SAAgB,cAAc;IAC5B,OAAO,IAAA,oBAAW,EAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @description A minimal, DETERMINISTIC tar writer (ustar): the same entries always give the same bytes, so the hash of the archive is
3
+ * a stable id of the package it carries (a system `tar` writes its own timestamps and ordering). Regular files only — a runner
4
+ * extracts the archive with the `tar` of its machine, which creates the folders on the way.
5
+ */
6
+ export interface TarEntry {
7
+ /** A relative path with `/` separators. */
8
+ path: string;
9
+ content: Buffer;
10
+ /** `0o755` for something that runs, else `0o644`. */
11
+ mode: number;
12
+ }
13
+ /** @description The ustar `name` and `prefix` fields for `entryPath`, or `null` when no `/` splits it into pieces that fit. */
14
+ export declare function splitTarPath(entryPath: string): {
15
+ name: string;
16
+ prefix: string;
17
+ } | null;
18
+ /** @description The archive of `entries`, in the order given, ended by the two empty blocks tar expects. */
19
+ export declare function createTarArchive(entries: readonly TarEntry[]): Buffer;
20
+ //# sourceMappingURL=tarArchive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tarArchive.d.ts","sourceRoot":"","sources":["../../src/runners/tarArchive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAWD,+HAA+H;AAC/H,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQvF;AAwBD,4GAA4G;AAC5G,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CASrE"}