charness 3.6.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (828) hide show
  1. package/CHANGELOG.md +297 -0
  2. package/DEVELOPMENT.md +35 -5
  3. package/MIGRATION_RENAME_TO_CHARNESS.md +3 -2
  4. package/README.md +84 -782
  5. package/SETUP.md +48 -10
  6. package/agent-plugin/.claude-plugin/plugin.json +7 -0
  7. package/agent-plugin/README.md +35 -0
  8. package/agent-plugin/skills/charness-delegate-claude/SKILL.md +85 -0
  9. package/agent-plugin/skills/charness-delegate-claude/summarize-events.py +90 -0
  10. package/agent-plugin/skills/charness-delegate-opencode/SKILL.md +68 -0
  11. package/agent-plugin/skills/charness-manager/SKILL.md +152 -0
  12. package/dist/adapters/adapterNames.d.ts +6 -0
  13. package/dist/adapters/adapterNames.d.ts.map +1 -1
  14. package/dist/adapters/adapterNames.js +8 -2
  15. package/dist/adapters/adapterNames.js.map +1 -1
  16. package/dist/adapters/claudeCliAdapter.d.ts +8 -0
  17. package/dist/adapters/claudeCliAdapter.d.ts.map +1 -1
  18. package/dist/adapters/claudeCliAdapter.js +42 -5
  19. package/dist/adapters/claudeCliAdapter.js.map +1 -1
  20. package/dist/adapters/claudeJsonStreamAdapter.d.ts +10 -9
  21. package/dist/adapters/claudeJsonStreamAdapter.d.ts.map +1 -1
  22. package/dist/adapters/claudeJsonStreamAdapter.js +53 -55
  23. package/dist/adapters/claudeJsonStreamAdapter.js.map +1 -1
  24. package/dist/adapters/createAdapter.d.ts +8 -0
  25. package/dist/adapters/createAdapter.d.ts.map +1 -1
  26. package/dist/adapters/createAdapter.js +14 -2
  27. package/dist/adapters/createAdapter.js.map +1 -1
  28. package/dist/adapters/openCodeAdapter.d.ts +43 -6
  29. package/dist/adapters/openCodeAdapter.d.ts.map +1 -1
  30. package/dist/adapters/openCodeAdapter.js +97 -7
  31. package/dist/adapters/openCodeAdapter.js.map +1 -1
  32. package/dist/agentLogin/agentLogin.d.ts +1 -1
  33. package/dist/agentLogin/agentLogin.d.ts.map +1 -1
  34. package/dist/apiRetryKick.d.ts +4 -3
  35. package/dist/apiRetryKick.d.ts.map +1 -1
  36. package/dist/apiRetryKick.js +16 -9
  37. package/dist/apiRetryKick.js.map +1 -1
  38. package/dist/bot.d.ts.map +1 -1
  39. package/dist/bot.js +1360 -387
  40. package/dist/bot.js.map +1 -1
  41. package/dist/cli/claudeProfiles.d.ts +11 -6
  42. package/dist/cli/claudeProfiles.d.ts.map +1 -1
  43. package/dist/cli/claudeProfiles.js +50 -22
  44. package/dist/cli/claudeProfiles.js.map +1 -1
  45. package/dist/cli/hot.d.ts +5 -0
  46. package/dist/cli/hot.d.ts.map +1 -1
  47. package/dist/cli/hot.js +71 -25
  48. package/dist/cli/hot.js.map +1 -1
  49. package/dist/cli/tscWatchGuard.d.ts +95 -0
  50. package/dist/cli/tscWatchGuard.d.ts.map +1 -0
  51. package/dist/cli/tscWatchGuard.js +295 -0
  52. package/dist/cli/tscWatchGuard.js.map +1 -0
  53. package/dist/cli.js +55 -1
  54. package/dist/cli.js.map +1 -1
  55. package/dist/configDirFile.d.ts +7 -3
  56. package/dist/configDirFile.d.ts.map +1 -1
  57. package/dist/configDirFile.js +12 -5
  58. package/dist/configDirFile.js.map +1 -1
  59. package/dist/connectors/jira/answerSink.d.ts +10 -0
  60. package/dist/connectors/jira/answerSink.d.ts.map +1 -1
  61. package/dist/connectors/jira/answerSink.js +13 -0
  62. package/dist/connectors/jira/answerSink.js.map +1 -1
  63. package/dist/connectors/jira/config.d.ts +2 -0
  64. package/dist/connectors/jira/config.d.ts.map +1 -1
  65. package/dist/connectors/jira/config.js +9 -1
  66. package/dist/connectors/jira/config.js.map +1 -1
  67. package/dist/connectors/jira/connector.d.ts +11 -1
  68. package/dist/connectors/jira/connector.d.ts.map +1 -1
  69. package/dist/connectors/jira/connector.js +7 -0
  70. package/dist/connectors/jira/connector.js.map +1 -1
  71. package/dist/connectors/jira/inbound.d.ts +27 -4
  72. package/dist/connectors/jira/inbound.d.ts.map +1 -1
  73. package/dist/connectors/jira/inbound.js +69 -8
  74. package/dist/connectors/jira/inbound.js.map +1 -1
  75. package/dist/connectors/jira/issueBlocks.d.ts +5 -0
  76. package/dist/connectors/jira/issueBlocks.d.ts.map +1 -1
  77. package/dist/connectors/jira/issueBlocks.js +11 -0
  78. package/dist/connectors/jira/issueBlocks.js.map +1 -1
  79. package/dist/connectors/telegram/bindPicker.d.ts +5 -0
  80. package/dist/connectors/telegram/bindPicker.d.ts.map +1 -1
  81. package/dist/connectors/telegram/bindPicker.js +18 -1
  82. package/dist/connectors/telegram/bindPicker.js.map +1 -1
  83. package/dist/connectors/telegram/bindPickerClaims.d.ts +46 -0
  84. package/dist/connectors/telegram/bindPickerClaims.d.ts.map +1 -0
  85. package/dist/connectors/telegram/bindPickerClaims.js +83 -0
  86. package/dist/connectors/telegram/bindPickerClaims.js.map +1 -0
  87. package/dist/connectors/telegram/bindSweep.d.ts +32 -0
  88. package/dist/connectors/telegram/bindSweep.d.ts.map +1 -0
  89. package/dist/connectors/telegram/bindSweep.js +47 -0
  90. package/dist/connectors/telegram/bindSweep.js.map +1 -0
  91. package/dist/connectors/telegram/bindingWelcome.d.ts +23 -0
  92. package/dist/connectors/telegram/bindingWelcome.d.ts.map +1 -0
  93. package/dist/connectors/telegram/bindingWelcome.js +26 -0
  94. package/dist/connectors/telegram/bindingWelcome.js.map +1 -0
  95. package/dist/connectors/telegram/botApiConnection.d.ts +74 -0
  96. package/dist/connectors/telegram/botApiConnection.d.ts.map +1 -0
  97. package/dist/connectors/telegram/botApiConnection.js +201 -0
  98. package/dist/connectors/telegram/botApiConnection.js.map +1 -0
  99. package/dist/connectors/telegram/commands/botCore.d.ts +13 -3
  100. package/dist/connectors/telegram/commands/botCore.d.ts.map +1 -1
  101. package/dist/connectors/telegram/commands/botSkills.d.ts +21 -0
  102. package/dist/connectors/telegram/commands/botSkills.d.ts.map +1 -0
  103. package/dist/connectors/telegram/commands/botSkills.js +133 -0
  104. package/dist/connectors/telegram/commands/botSkills.js.map +1 -0
  105. package/dist/connectors/telegram/commands/callbackMessage.d.ts +5 -0
  106. package/dist/connectors/telegram/commands/callbackMessage.d.ts.map +1 -1
  107. package/dist/connectors/telegram/commands/callbackMessage.js +9 -0
  108. package/dist/connectors/telegram/commands/callbackMessage.js.map +1 -1
  109. package/dist/connectors/telegram/commands/compaction.d.ts +65 -3
  110. package/dist/connectors/telegram/commands/compaction.d.ts.map +1 -1
  111. package/dist/connectors/telegram/commands/compaction.js +512 -94
  112. package/dist/connectors/telegram/commands/compaction.js.map +1 -1
  113. package/dist/connectors/telegram/commands/displayModes.d.ts +1 -1
  114. package/dist/connectors/telegram/commands/displayModes.d.ts.map +1 -1
  115. package/dist/connectors/telegram/commands/displayModes.js +6 -18
  116. package/dist/connectors/telegram/commands/displayModes.js.map +1 -1
  117. package/dist/connectors/telegram/commands/fallbackChain.js +5 -5
  118. package/dist/connectors/telegram/commands/fallbackChain.js.map +1 -1
  119. package/dist/connectors/telegram/commands/reminders.d.ts +1 -1
  120. package/dist/connectors/telegram/commands/reminders.d.ts.map +1 -1
  121. package/dist/connectors/telegram/commands/reminders.js +4 -15
  122. package/dist/connectors/telegram/commands/reminders.js.map +1 -1
  123. package/dist/connectors/telegram/commands/runners.d.ts +52 -0
  124. package/dist/connectors/telegram/commands/runners.d.ts.map +1 -0
  125. package/dist/connectors/telegram/commands/runners.js +486 -0
  126. package/dist/connectors/telegram/commands/runners.js.map +1 -0
  127. package/dist/connectors/telegram/commands/selfUpdate.d.ts.map +1 -1
  128. package/dist/connectors/telegram/commands/selfUpdate.js +1 -11
  129. package/dist/connectors/telegram/commands/selfUpdate.js.map +1 -1
  130. package/dist/connectors/telegram/commands/taskAgents.d.ts +22 -0
  131. package/dist/connectors/telegram/commands/taskAgents.d.ts.map +1 -0
  132. package/dist/connectors/telegram/commands/taskAgents.js +104 -0
  133. package/dist/connectors/telegram/commands/taskAgents.js.map +1 -0
  134. package/dist/connectors/telegram/commands/todo.d.ts +82 -0
  135. package/dist/connectors/telegram/commands/todo.d.ts.map +1 -0
  136. package/dist/connectors/telegram/commands/todo.js +384 -0
  137. package/dist/connectors/telegram/commands/todo.js.map +1 -0
  138. package/dist/connectors/telegram/commands/topicCommand.d.ts +6 -2
  139. package/dist/connectors/telegram/commands/topicCommand.d.ts.map +1 -1
  140. package/dist/connectors/telegram/commands/topicCommand.js +6 -9
  141. package/dist/connectors/telegram/commands/topicCommand.js.map +1 -1
  142. package/dist/connectors/telegram/openBindMessages.d.ts +45 -0
  143. package/dist/connectors/telegram/openBindMessages.d.ts.map +1 -0
  144. package/dist/connectors/telegram/openBindMessages.js +67 -0
  145. package/dist/connectors/telegram/openBindMessages.js.map +1 -0
  146. package/dist/connectors/telegram/outputFlushPlan.d.ts +49 -0
  147. package/dist/connectors/telegram/outputFlushPlan.d.ts.map +1 -1
  148. package/dist/connectors/telegram/outputFlushPlan.js +46 -0
  149. package/dist/connectors/telegram/outputFlushPlan.js.map +1 -1
  150. package/dist/connectors/telegram/pendingTopicName.d.ts +26 -0
  151. package/dist/connectors/telegram/pendingTopicName.d.ts.map +1 -0
  152. package/dist/connectors/telegram/pendingTopicName.js +27 -0
  153. package/dist/connectors/telegram/pendingTopicName.js.map +1 -0
  154. package/dist/connectors/telegram/runnerPairingMessages.d.ts +27 -0
  155. package/dist/connectors/telegram/runnerPairingMessages.d.ts.map +1 -0
  156. package/dist/connectors/telegram/runnerPairingMessages.js +105 -0
  157. package/dist/connectors/telegram/runnerPairingMessages.js.map +1 -0
  158. package/dist/connectors/test/connector.d.ts.map +1 -1
  159. package/dist/connectors/test/connector.js +6 -1
  160. package/dist/connectors/test/connector.js.map +1 -1
  161. package/dist/i18n/de.d.ts.map +1 -1
  162. package/dist/i18n/de.js +148 -7
  163. package/dist/i18n/de.js.map +1 -1
  164. package/dist/i18n/en.d.ts.map +1 -1
  165. package/dist/i18n/en.js +148 -7
  166. package/dist/i18n/en.js.map +1 -1
  167. package/dist/i18n/es.d.ts.map +1 -1
  168. package/dist/i18n/es.js +148 -7
  169. package/dist/i18n/es.js.map +1 -1
  170. package/dist/i18n/fr.d.ts.map +1 -1
  171. package/dist/i18n/fr.js +148 -7
  172. package/dist/i18n/fr.js.map +1 -1
  173. package/dist/i18n/hi.d.ts.map +1 -1
  174. package/dist/i18n/hi.js +148 -7
  175. package/dist/i18n/hi.js.map +1 -1
  176. package/dist/i18n/ja.d.ts.map +1 -1
  177. package/dist/i18n/ja.js +148 -7
  178. package/dist/i18n/ja.js.map +1 -1
  179. package/dist/i18n/ka.d.ts.map +1 -1
  180. package/dist/i18n/ka.js +148 -7
  181. package/dist/i18n/ka.js.map +1 -1
  182. package/dist/i18n/pt.d.ts.map +1 -1
  183. package/dist/i18n/pt.js +148 -7
  184. package/dist/i18n/pt.js.map +1 -1
  185. package/dist/i18n/ru.d.ts.map +1 -1
  186. package/dist/i18n/ru.js +148 -7
  187. package/dist/i18n/ru.js.map +1 -1
  188. package/dist/i18n/uk.d.ts.map +1 -1
  189. package/dist/i18n/uk.js +148 -7
  190. package/dist/i18n/uk.js.map +1 -1
  191. package/dist/i18n/uz.d.ts.map +1 -1
  192. package/dist/i18n/uz.js +148 -7
  193. package/dist/i18n/uz.js.map +1 -1
  194. package/dist/i18n/zh.d.ts.map +1 -1
  195. package/dist/i18n/zh.js +148 -7
  196. package/dist/i18n/zh.js.map +1 -1
  197. package/dist/i18n.d.ts +1 -1
  198. package/dist/i18n.js +1 -1
  199. package/dist/installManager.d.ts +70 -1
  200. package/dist/installManager.d.ts.map +1 -1
  201. package/dist/installManager.js +125 -13
  202. package/dist/installManager.js.map +1 -1
  203. package/dist/instanceSettings.d.ts +50 -1
  204. package/dist/instanceSettings.d.ts.map +1 -1
  205. package/dist/instanceSettings.js +119 -26
  206. package/dist/instanceSettings.js.map +1 -1
  207. package/dist/openCodeQuestionFlow.d.ts +30 -0
  208. package/dist/openCodeQuestionFlow.d.ts.map +1 -1
  209. package/dist/openCodeQuestionFlow.js +43 -0
  210. package/dist/openCodeQuestionFlow.js.map +1 -1
  211. package/dist/outputTrace.d.ts +6 -0
  212. package/dist/outputTrace.d.ts.map +1 -1
  213. package/dist/outputTrace.js +24 -1
  214. package/dist/outputTrace.js.map +1 -1
  215. package/dist/postToSession.d.ts +20 -5
  216. package/dist/postToSession.d.ts.map +1 -1
  217. package/dist/postToSession.js +38 -7
  218. package/dist/postToSession.js.map +1 -1
  219. package/dist/remoteRun/cliArgs.d.ts +75 -0
  220. package/dist/remoteRun/cliArgs.d.ts.map +1 -0
  221. package/dist/remoteRun/cliArgs.js +206 -0
  222. package/dist/remoteRun/cliArgs.js.map +1 -0
  223. package/dist/remoteRun/commands.d.ts +77 -0
  224. package/dist/remoteRun/commands.d.ts.map +1 -0
  225. package/dist/remoteRun/commands.js +327 -0
  226. package/dist/remoteRun/commands.js.map +1 -0
  227. package/dist/remoteRun/depsPlan.d.ts +16 -0
  228. package/dist/remoteRun/depsPlan.d.ts.map +1 -0
  229. package/dist/remoteRun/depsPlan.js +82 -0
  230. package/dist/remoteRun/depsPlan.js.map +1 -0
  231. package/dist/remoteRun/exitCodes.d.ts +34 -0
  232. package/dist/remoteRun/exitCodes.d.ts.map +1 -0
  233. package/dist/remoteRun/exitCodes.js +38 -0
  234. package/dist/remoteRun/exitCodes.js.map +1 -0
  235. package/dist/remoteRun/foreground.d.ts +29 -0
  236. package/dist/remoteRun/foreground.d.ts.map +1 -0
  237. package/dist/remoteRun/foreground.js +159 -0
  238. package/dist/remoteRun/foreground.js.map +1 -0
  239. package/dist/remoteRun/interrupts.d.ts +27 -0
  240. package/dist/remoteRun/interrupts.d.ts.map +1 -0
  241. package/dist/remoteRun/interrupts.js +78 -0
  242. package/dist/remoteRun/interrupts.js.map +1 -0
  243. package/dist/remoteRun/jobFiles.d.ts +31 -0
  244. package/dist/remoteRun/jobFiles.d.ts.map +1 -0
  245. package/dist/remoteRun/jobFiles.js +84 -0
  246. package/dist/remoteRun/jobFiles.js.map +1 -0
  247. package/dist/remoteRun/jobFormat.d.ts +16 -0
  248. package/dist/remoteRun/jobFormat.d.ts.map +1 -0
  249. package/dist/remoteRun/jobFormat.js +130 -0
  250. package/dist/remoteRun/jobFormat.js.map +1 -0
  251. package/dist/remoteRun/jobId.d.ts +15 -0
  252. package/dist/remoteRun/jobId.d.ts.map +1 -0
  253. package/dist/remoteRun/jobId.js +85 -0
  254. package/dist/remoteRun/jobId.js.map +1 -0
  255. package/dist/remoteRun/jobMeta.d.ts +18 -0
  256. package/dist/remoteRun/jobMeta.d.ts.map +1 -0
  257. package/dist/remoteRun/jobMeta.js +33 -0
  258. package/dist/remoteRun/jobMeta.js.map +1 -0
  259. package/dist/remoteRun/jobQuery.d.ts +12 -0
  260. package/dist/remoteRun/jobQuery.d.ts.map +1 -0
  261. package/dist/remoteRun/jobQuery.js +22 -0
  262. package/dist/remoteRun/jobQuery.js.map +1 -0
  263. package/dist/remoteRun/jobRecords.d.ts +22 -0
  264. package/dist/remoteRun/jobRecords.d.ts.map +1 -0
  265. package/dist/remoteRun/jobRecords.js +145 -0
  266. package/dist/remoteRun/jobRecords.js.map +1 -0
  267. package/dist/remoteRun/jobState.d.ts +62 -0
  268. package/dist/remoteRun/jobState.d.ts.map +1 -0
  269. package/dist/remoteRun/jobState.js +132 -0
  270. package/dist/remoteRun/jobState.js.map +1 -0
  271. package/dist/remoteRun/leaseTiming.d.ts +18 -0
  272. package/dist/remoteRun/leaseTiming.d.ts.map +1 -0
  273. package/dist/remoteRun/leaseTiming.js +43 -0
  274. package/dist/remoteRun/leaseTiming.js.map +1 -0
  275. package/dist/remoteRun/output.d.ts +37 -0
  276. package/dist/remoteRun/output.d.ts.map +1 -0
  277. package/dist/remoteRun/output.js +127 -0
  278. package/dist/remoteRun/output.js.map +1 -0
  279. package/dist/remoteRun/pairedRunners.d.ts +51 -0
  280. package/dist/remoteRun/pairedRunners.d.ts.map +1 -0
  281. package/dist/remoteRun/pairedRunners.js +165 -0
  282. package/dist/remoteRun/pairedRunners.js.map +1 -0
  283. package/dist/remoteRun/pathPatterns.d.ts +33 -0
  284. package/dist/remoteRun/pathPatterns.d.ts.map +1 -0
  285. package/dist/remoteRun/pathPatterns.js +115 -0
  286. package/dist/remoteRun/pathPatterns.js.map +1 -0
  287. package/dist/remoteRun/probe.d.ts +78 -0
  288. package/dist/remoteRun/probe.d.ts.map +1 -0
  289. package/dist/remoteRun/probe.js +157 -0
  290. package/dist/remoteRun/probe.js.map +1 -0
  291. package/dist/remoteRun/project.d.ts +26 -0
  292. package/dist/remoteRun/project.d.ts.map +1 -0
  293. package/dist/remoteRun/project.js +159 -0
  294. package/dist/remoteRun/project.js.map +1 -0
  295. package/dist/remoteRun/projectConfig.d.ts +38 -0
  296. package/dist/remoteRun/projectConfig.d.ts.map +1 -0
  297. package/dist/remoteRun/projectConfig.js +87 -0
  298. package/dist/remoteRun/projectConfig.js.map +1 -0
  299. package/dist/remoteRun/remoteRunCli.d.ts +22 -0
  300. package/dist/remoteRun/remoteRunCli.d.ts.map +1 -0
  301. package/dist/remoteRun/remoteRunCli.js +119 -0
  302. package/dist/remoteRun/remoteRunCli.js.map +1 -0
  303. package/dist/remoteRun/remoteRunError.d.ts +14 -0
  304. package/dist/remoteRun/remoteRunError.d.ts.map +1 -0
  305. package/dist/remoteRun/remoteRunError.js +28 -0
  306. package/dist/remoteRun/remoteRunError.js.map +1 -0
  307. package/dist/remoteRun/rsync.d.ts +17 -0
  308. package/dist/remoteRun/rsync.d.ts.map +1 -0
  309. package/dist/remoteRun/rsync.js +39 -0
  310. package/dist/remoteRun/rsync.js.map +1 -0
  311. package/dist/remoteRun/runnerClient.d.ts +52 -0
  312. package/dist/remoteRun/runnerClient.d.ts.map +1 -0
  313. package/dist/remoteRun/runnerClient.js +143 -0
  314. package/dist/remoteRun/runnerClient.js.map +1 -0
  315. package/dist/remoteRun/runnerSummary.d.ts +24 -0
  316. package/dist/remoteRun/runnerSummary.d.ts.map +1 -0
  317. package/dist/remoteRun/runnerSummary.js +86 -0
  318. package/dist/remoteRun/runnerSummary.js.map +1 -0
  319. package/dist/remoteRun/runnerWait.d.ts +68 -0
  320. package/dist/remoteRun/runnerWait.d.ts.map +1 -0
  321. package/dist/remoteRun/runnerWait.js +137 -0
  322. package/dist/remoteRun/runnerWait.js.map +1 -0
  323. package/dist/remoteRun/runnerWaitTiming.d.ts +16 -0
  324. package/dist/remoteRun/runnerWaitTiming.d.ts.map +1 -0
  325. package/dist/remoteRun/runnerWaitTiming.js +37 -0
  326. package/dist/remoteRun/runnerWaitTiming.js.map +1 -0
  327. package/dist/remoteRun/runners.d.ts +57 -0
  328. package/dist/remoteRun/runners.d.ts.map +1 -0
  329. package/dist/remoteRun/runners.js +209 -0
  330. package/dist/remoteRun/runners.js.map +1 -0
  331. package/dist/remoteRun/runnersCatalog.d.ts +14 -0
  332. package/dist/remoteRun/runnersCatalog.d.ts.map +1 -0
  333. package/dist/remoteRun/runnersCatalog.js +68 -0
  334. package/dist/remoteRun/runnersCatalog.js.map +1 -0
  335. package/dist/remoteRun/runnersConfig.d.ts +53 -0
  336. package/dist/remoteRun/runnersConfig.d.ts.map +1 -0
  337. package/dist/remoteRun/runnersConfig.js +109 -0
  338. package/dist/remoteRun/runnersConfig.js.map +1 -0
  339. package/dist/remoteRun/safeCopy.d.ts +31 -0
  340. package/dist/remoteRun/safeCopy.d.ts.map +1 -0
  341. package/dist/remoteRun/safeCopy.js +137 -0
  342. package/dist/remoteRun/safeCopy.js.map +1 -0
  343. package/dist/remoteRun/sendPlan.d.ts +67 -0
  344. package/dist/remoteRun/sendPlan.d.ts.map +1 -0
  345. package/dist/remoteRun/sendPlan.js +139 -0
  346. package/dist/remoteRun/sendPlan.js.map +1 -0
  347. package/dist/remoteRun/ssh.d.ts +82 -0
  348. package/dist/remoteRun/ssh.d.ts.map +1 -0
  349. package/dist/remoteRun/ssh.js +236 -0
  350. package/dist/remoteRun/ssh.js.map +1 -0
  351. package/dist/remoteRun/submit.d.ts +29 -0
  352. package/dist/remoteRun/submit.d.ts.map +1 -0
  353. package/dist/remoteRun/submit.js +142 -0
  354. package/dist/remoteRun/submit.js.map +1 -0
  355. package/dist/requests/answerRequest.d.ts +5 -0
  356. package/dist/requests/answerRequest.d.ts.map +1 -1
  357. package/dist/requests/answerRequest.js +16 -1
  358. package/dist/requests/answerRequest.js.map +1 -1
  359. package/dist/requests/requestLedger.d.ts +13 -0
  360. package/dist/requests/requestLedger.d.ts.map +1 -1
  361. package/dist/requests/requestLedger.js +9 -0
  362. package/dist/requests/requestLedger.js.map +1 -1
  363. package/dist/requests/topicRequestSettle.d.ts +30 -0
  364. package/dist/requests/topicRequestSettle.d.ts.map +1 -0
  365. package/dist/requests/topicRequestSettle.js +23 -0
  366. package/dist/requests/topicRequestSettle.js.map +1 -0
  367. package/dist/requests/wakeUpEngine.d.ts +4 -0
  368. package/dist/requests/wakeUpEngine.d.ts.map +1 -1
  369. package/dist/requests/wakeUpEngine.js +5 -1
  370. package/dist/requests/wakeUpEngine.js.map +1 -1
  371. package/dist/runnerUtility/adminCheck.d.ts +11 -0
  372. package/dist/runnerUtility/adminCheck.d.ts.map +1 -0
  373. package/dist/runnerUtility/adminCheck.js +68 -0
  374. package/dist/runnerUtility/adminCheck.js.map +1 -0
  375. package/dist/runnerUtility/appInstall.d.ts +25 -0
  376. package/dist/runnerUtility/appInstall.d.ts.map +1 -0
  377. package/dist/runnerUtility/appInstall.js +147 -0
  378. package/dist/runnerUtility/appInstall.js.map +1 -0
  379. package/dist/runnerUtility/appUpdate.d.ts +39 -0
  380. package/dist/runnerUtility/appUpdate.d.ts.map +1 -0
  381. package/dist/runnerUtility/appUpdate.js +90 -0
  382. package/dist/runnerUtility/appUpdate.js.map +1 -0
  383. package/dist/runnerUtility/execEnv.d.ts +21 -0
  384. package/dist/runnerUtility/execEnv.d.ts.map +1 -0
  385. package/dist/runnerUtility/execEnv.js +109 -0
  386. package/dist/runnerUtility/execEnv.js.map +1 -0
  387. package/dist/runnerUtility/execSession.d.ts +13 -0
  388. package/dist/runnerUtility/execSession.d.ts.map +1 -0
  389. package/dist/runnerUtility/execSession.js +58 -0
  390. package/dist/runnerUtility/execSession.js.map +1 -0
  391. package/dist/runnerUtility/hubClient.d.ts +30 -0
  392. package/dist/runnerUtility/hubClient.d.ts.map +1 -0
  393. package/dist/runnerUtility/hubClient.js +127 -0
  394. package/dist/runnerUtility/hubClient.js.map +1 -0
  395. package/dist/runnerUtility/injectStream.d.ts +9 -0
  396. package/dist/runnerUtility/injectStream.d.ts.map +1 -0
  397. package/dist/runnerUtility/injectStream.js +12 -0
  398. package/dist/runnerUtility/injectStream.js.map +1 -0
  399. package/dist/runnerUtility/iosCheck.d.ts +62 -0
  400. package/dist/runnerUtility/iosCheck.d.ts.map +1 -0
  401. package/dist/runnerUtility/iosCheck.js +200 -0
  402. package/dist/runnerUtility/iosCheck.js.map +1 -0
  403. package/dist/runnerUtility/launcher.d.ts +5 -0
  404. package/dist/runnerUtility/launcher.d.ts.map +1 -0
  405. package/dist/runnerUtility/launcher.js +85 -0
  406. package/dist/runnerUtility/launcher.js.map +1 -0
  407. package/dist/runnerUtility/linkLoop.d.ts +47 -0
  408. package/dist/runnerUtility/linkLoop.d.ts.map +1 -0
  409. package/dist/runnerUtility/linkLoop.js +281 -0
  410. package/dist/runnerUtility/linkLoop.js.map +1 -0
  411. package/dist/runnerUtility/localLinkStop.d.ts +23 -0
  412. package/dist/runnerUtility/localLinkStop.d.ts.map +1 -0
  413. package/dist/runnerUtility/localLinkStop.js +79 -0
  414. package/dist/runnerUtility/localLinkStop.js.map +1 -0
  415. package/dist/runnerUtility/machineReport.d.ts +39 -0
  416. package/dist/runnerUtility/machineReport.d.ts.map +1 -0
  417. package/dist/runnerUtility/machineReport.js +161 -0
  418. package/dist/runnerUtility/machineReport.js.map +1 -0
  419. package/dist/runnerUtility/packageId.d.ts +5 -0
  420. package/dist/runnerUtility/packageId.d.ts.map +1 -0
  421. package/dist/runnerUtility/packageId.js +64 -0
  422. package/dist/runnerUtility/packageId.js.map +1 -0
  423. package/dist/runnerUtility/pairingRecovery.d.ts +31 -0
  424. package/dist/runnerUtility/pairingRecovery.d.ts.map +1 -0
  425. package/dist/runnerUtility/pairingRecovery.js +24 -0
  426. package/dist/runnerUtility/pairingRecovery.js.map +1 -0
  427. package/dist/runnerUtility/pueueDaemon.d.ts +36 -0
  428. package/dist/runnerUtility/pueueDaemon.d.ts.map +1 -0
  429. package/dist/runnerUtility/pueueDaemon.js +165 -0
  430. package/dist/runnerUtility/pueueDaemon.js.map +1 -0
  431. package/dist/runnerUtility/runnerCli.d.ts +18 -0
  432. package/dist/runnerUtility/runnerCli.d.ts.map +1 -0
  433. package/dist/runnerUtility/runnerCli.js +184 -0
  434. package/dist/runnerUtility/runnerCli.js.map +1 -0
  435. package/dist/runnerUtility/runnerCommands.d.ts +67 -0
  436. package/dist/runnerUtility/runnerCommands.d.ts.map +1 -0
  437. package/dist/runnerUtility/runnerCommands.js +418 -0
  438. package/dist/runnerUtility/runnerCommands.js.map +1 -0
  439. package/dist/runnerUtility/runnerConfig.d.ts +63 -0
  440. package/dist/runnerUtility/runnerConfig.d.ts.map +1 -0
  441. package/dist/runnerUtility/runnerConfig.js +153 -0
  442. package/dist/runnerUtility/runnerConfig.js.map +1 -0
  443. package/dist/runnerUtility/runnerFlags.d.ts +9 -0
  444. package/dist/runnerUtility/runnerFlags.d.ts.map +1 -0
  445. package/dist/runnerUtility/runnerFlags.js +53 -0
  446. package/dist/runnerUtility/runnerFlags.js.map +1 -0
  447. package/dist/runnerUtility/runnerHome.d.ts +30 -0
  448. package/dist/runnerUtility/runnerHome.d.ts.map +1 -0
  449. package/dist/runnerUtility/runnerHome.js +82 -0
  450. package/dist/runnerUtility/runnerHome.js.map +1 -0
  451. package/dist/runnerUtility/runnerKeys.d.ts +11 -0
  452. package/dist/runnerUtility/runnerKeys.d.ts.map +1 -0
  453. package/dist/runnerUtility/runnerKeys.js +80 -0
  454. package/dist/runnerUtility/runnerKeys.js.map +1 -0
  455. package/dist/runnerUtility/runnerServers.d.ts +40 -0
  456. package/dist/runnerUtility/runnerServers.d.ts.map +1 -0
  457. package/dist/runnerUtility/runnerServers.js +79 -0
  458. package/dist/runnerUtility/runnerServers.js.map +1 -0
  459. package/dist/runnerUtility/serviceManager.d.ts +54 -0
  460. package/dist/runnerUtility/serviceManager.d.ts.map +1 -0
  461. package/dist/runnerUtility/serviceManager.js +413 -0
  462. package/dist/runnerUtility/serviceManager.js.map +1 -0
  463. package/dist/runnerUtility/serviceUnits.d.ts +36 -0
  464. package/dist/runnerUtility/serviceUnits.d.ts.map +1 -0
  465. package/dist/runnerUtility/serviceUnits.js +169 -0
  466. package/dist/runnerUtility/serviceUnits.js.map +1 -0
  467. package/dist/runnerUtility/toolInstall.d.ts +95 -0
  468. package/dist/runnerUtility/toolInstall.d.ts.map +1 -0
  469. package/dist/runnerUtility/toolInstall.js +232 -0
  470. package/dist/runnerUtility/toolInstall.js.map +1 -0
  471. package/dist/runnerUtility/versionPollTiming.d.ts +16 -0
  472. package/dist/runnerUtility/versionPollTiming.d.ts.map +1 -0
  473. package/dist/runnerUtility/versionPollTiming.js +36 -0
  474. package/dist/runnerUtility/versionPollTiming.js.map +1 -0
  475. package/dist/runners/authorizedKeys.d.ts +52 -0
  476. package/dist/runners/authorizedKeys.d.ts.map +1 -0
  477. package/dist/runners/authorizedKeys.js +153 -0
  478. package/dist/runners/authorizedKeys.js.map +1 -0
  479. package/dist/runners/bootstrapLine.d.ts +4 -0
  480. package/dist/runners/bootstrapLine.d.ts.map +1 -0
  481. package/dist/runners/bootstrapLine.js +69 -0
  482. package/dist/runners/bootstrapLine.js.map +1 -0
  483. package/dist/runners/gate.d.ts +41 -0
  484. package/dist/runners/gate.d.ts.map +1 -0
  485. package/dist/runners/gate.js +216 -0
  486. package/dist/runners/gate.js.map +1 -0
  487. package/dist/runners/gateLink.d.ts +26 -0
  488. package/dist/runners/gateLink.d.ts.map +1 -0
  489. package/dist/runners/gateLink.js +240 -0
  490. package/dist/runners/gateLink.js.map +1 -0
  491. package/dist/runners/gateProtocol.d.ts +98 -0
  492. package/dist/runners/gateProtocol.d.ts.map +1 -0
  493. package/dist/runners/gateProtocol.js +149 -0
  494. package/dist/runners/gateProtocol.js.map +1 -0
  495. package/dist/runners/gateWrapper.d.ts +6 -0
  496. package/dist/runners/gateWrapper.d.ts.map +1 -0
  497. package/dist/runners/gateWrapper.js +70 -0
  498. package/dist/runners/gateWrapper.js.map +1 -0
  499. package/dist/runners/hubAddress.d.ts +33 -0
  500. package/dist/runners/hubAddress.d.ts.map +1 -0
  501. package/dist/runners/hubAddress.js +88 -0
  502. package/dist/runners/hubAddress.js.map +1 -0
  503. package/dist/runners/hubAddressCandidates.d.ts +16 -0
  504. package/dist/runners/hubAddressCandidates.d.ts.map +1 -0
  505. package/dist/runners/hubAddressCandidates.js +96 -0
  506. package/dist/runners/hubAddressCandidates.js.map +1 -0
  507. package/dist/runners/hubIds.d.ts +16 -0
  508. package/dist/runners/hubIds.d.ts.map +1 -0
  509. package/dist/runners/hubIds.js +25 -0
  510. package/dist/runners/hubIds.js.map +1 -0
  511. package/dist/runners/hubKey.d.ts +6 -0
  512. package/dist/runners/hubKey.d.ts.map +1 -0
  513. package/dist/runners/hubKey.js +78 -0
  514. package/dist/runners/hubKey.js.map +1 -0
  515. package/dist/runners/hubLock.d.ts +7 -0
  516. package/dist/runners/hubLock.d.ts.map +1 -0
  517. package/dist/runners/hubLock.js +230 -0
  518. package/dist/runners/hubLock.js.map +1 -0
  519. package/dist/runners/hubPackage.d.ts +23 -0
  520. package/dist/runners/hubPackage.d.ts.map +1 -0
  521. package/dist/runners/hubPackage.js +184 -0
  522. package/dist/runners/hubPackage.js.map +1 -0
  523. package/dist/runners/hubPairing.d.ts +63 -0
  524. package/dist/runners/hubPairing.d.ts.map +1 -0
  525. package/dist/runners/hubPairing.js +261 -0
  526. package/dist/runners/hubPairing.js.map +1 -0
  527. package/dist/runners/hubPaths.d.ts +38 -0
  528. package/dist/runners/hubPaths.d.ts.map +1 -0
  529. package/dist/runners/hubPaths.js +94 -0
  530. package/dist/runners/hubPaths.js.map +1 -0
  531. package/dist/runners/hubRegistry.d.ts +112 -0
  532. package/dist/runners/hubRegistry.d.ts.map +1 -0
  533. package/dist/runners/hubRegistry.js +210 -0
  534. package/dist/runners/hubRegistry.js.map +1 -0
  535. package/dist/runners/linkControl.d.ts +27 -0
  536. package/dist/runners/linkControl.d.ts.map +1 -0
  537. package/dist/runners/linkControl.js +124 -0
  538. package/dist/runners/linkControl.js.map +1 -0
  539. package/dist/runners/pairCode.d.ts +30 -0
  540. package/dist/runners/pairCode.d.ts.map +1 -0
  541. package/dist/runners/pairCode.js +46 -0
  542. package/dist/runners/pairCode.js.map +1 -0
  543. package/dist/runners/pairingTiming.d.ts +18 -0
  544. package/dist/runners/pairingTiming.d.ts.map +1 -0
  545. package/dist/runners/pairingTiming.js +42 -0
  546. package/dist/runners/pairingTiming.js.map +1 -0
  547. package/dist/runners/runnerProxy.d.ts +9 -0
  548. package/dist/runners/runnerProxy.d.ts.map +1 -0
  549. package/dist/runners/runnerProxy.js +67 -0
  550. package/dist/runners/runnerProxy.js.map +1 -0
  551. package/dist/runners/runnerRemoval.d.ts +21 -0
  552. package/dist/runners/runnerRemoval.d.ts.map +1 -0
  553. package/dist/runners/runnerRemoval.js +82 -0
  554. package/dist/runners/runnerRemoval.js.map +1 -0
  555. package/dist/runners/runnersCli.d.ts +16 -0
  556. package/dist/runners/runnersCli.d.ts.map +1 -0
  557. package/dist/runners/runnersCli.js +214 -0
  558. package/dist/runners/runnersCli.js.map +1 -0
  559. package/dist/runners/runnersList.d.ts +17 -0
  560. package/dist/runners/runnersList.d.ts.map +1 -0
  561. package/dist/runners/runnersList.js +49 -0
  562. package/dist/runners/runnersList.js.map +1 -0
  563. package/dist/runners/runnersOverview.d.ts +20 -0
  564. package/dist/runners/runnersOverview.d.ts.map +1 -0
  565. package/dist/runners/runnersOverview.js +55 -0
  566. package/dist/runners/runnersOverview.js.map +1 -0
  567. package/dist/runners/sshKeys.d.ts +26 -0
  568. package/dist/runners/sshKeys.d.ts.map +1 -0
  569. package/dist/runners/sshKeys.js +60 -0
  570. package/dist/runners/sshKeys.js.map +1 -0
  571. package/dist/runners/tarArchive.d.ts +20 -0
  572. package/dist/runners/tarArchive.d.ts.map +1 -0
  573. package/dist/runners/tarArchive.js +70 -0
  574. package/dist/runners/tarArchive.js.map +1 -0
  575. package/dist/scheduler/delivery.d.ts +2 -0
  576. package/dist/scheduler/delivery.d.ts.map +1 -1
  577. package/dist/scheduler/delivery.js +8 -4
  578. package/dist/scheduler/delivery.js.map +1 -1
  579. package/dist/scheduler/mcpSurface.d.ts +65 -10
  580. package/dist/scheduler/mcpSurface.d.ts.map +1 -1
  581. package/dist/scheduler/mcpSurface.js +319 -89
  582. package/dist/scheduler/mcpSurface.js.map +1 -1
  583. package/dist/scheduler/recurrence.d.ts +5 -0
  584. package/dist/scheduler/recurrence.d.ts.map +1 -1
  585. package/dist/scheduler/recurrence.js +12 -2
  586. package/dist/scheduler/recurrence.js.map +1 -1
  587. package/dist/scheduler/strictToolInput.d.ts +45 -0
  588. package/dist/scheduler/strictToolInput.d.ts.map +1 -0
  589. package/dist/scheduler/strictToolInput.js +155 -0
  590. package/dist/scheduler/strictToolInput.js.map +1 -0
  591. package/dist/scheduler/types.d.ts +5 -0
  592. package/dist/scheduler/types.d.ts.map +1 -1
  593. package/dist/scheduler/workerWatch.d.ts +23 -0
  594. package/dist/scheduler/workerWatch.d.ts.map +1 -0
  595. package/dist/scheduler/workerWatch.js +26 -0
  596. package/dist/scheduler/workerWatch.js.map +1 -0
  597. package/dist/selfUpdate/emittedSource.d.ts +11 -0
  598. package/dist/selfUpdate/emittedSource.d.ts.map +1 -0
  599. package/dist/selfUpdate/emittedSource.js +24 -0
  600. package/dist/selfUpdate/emittedSource.js.map +1 -0
  601. package/dist/selfUpdate/gitSource.d.ts +0 -6
  602. package/dist/selfUpdate/gitSource.d.ts.map +1 -1
  603. package/dist/selfUpdate/gitSource.js +2 -18
  604. package/dist/selfUpdate/gitSource.js.map +1 -1
  605. package/dist/selfUpdate/selfCheck.js +2 -2
  606. package/dist/selfUpdate/selfCheck.js.map +1 -1
  607. package/dist/selfUpdate/updatePending.d.ts +1 -1
  608. package/dist/sendErrorClassifier.d.ts +10 -0
  609. package/dist/sendErrorClassifier.d.ts.map +1 -1
  610. package/dist/sendErrorClassifier.js +22 -0
  611. package/dist/sendErrorClassifier.js.map +1 -1
  612. package/dist/state.d.ts +78 -7
  613. package/dist/state.d.ts.map +1 -1
  614. package/dist/state.js +125 -8
  615. package/dist/state.js.map +1 -1
  616. package/dist/stateFile.d.ts +9 -0
  617. package/dist/stateFile.d.ts.map +1 -0
  618. package/dist/stateFile.js +57 -0
  619. package/dist/stateFile.js.map +1 -0
  620. package/dist/stt/sttInstall.d.ts +7 -3
  621. package/dist/stt/sttInstall.d.ts.map +1 -1
  622. package/dist/stt/sttInstall.js +8 -4
  623. package/dist/stt/sttInstall.js.map +1 -1
  624. package/dist/stt/sttSettings.d.ts +2 -1
  625. package/dist/stt/sttSettings.d.ts.map +1 -1
  626. package/dist/stt/sttSettings.js +3 -2
  627. package/dist/stt/sttSettings.js.map +1 -1
  628. package/dist/stt/transcribeChain.js +2 -0
  629. package/dist/stt/transcribeChain.js.map +1 -1
  630. package/dist/testTimings.d.ts +16 -3
  631. package/dist/testTimings.d.ts.map +1 -1
  632. package/dist/testTimings.js +35 -2
  633. package/dist/testTimings.js.map +1 -1
  634. package/dist/todos/board.d.ts +83 -0
  635. package/dist/todos/board.d.ts.map +1 -0
  636. package/dist/todos/board.js +227 -0
  637. package/dist/todos/board.js.map +1 -0
  638. package/dist/todos/format.d.ts +33 -0
  639. package/dist/todos/format.d.ts.map +1 -0
  640. package/dist/todos/format.js +90 -0
  641. package/dist/todos/format.js.map +1 -0
  642. package/dist/todos/merge.d.ts +46 -0
  643. package/dist/todos/merge.d.ts.map +1 -0
  644. package/dist/todos/merge.js +137 -0
  645. package/dist/todos/merge.js.map +1 -0
  646. package/dist/todos/midTurn.d.ts +75 -0
  647. package/dist/todos/midTurn.d.ts.map +1 -0
  648. package/dist/todos/midTurn.js +214 -0
  649. package/dist/todos/midTurn.js.map +1 -0
  650. package/dist/todos/nag.d.ts +85 -0
  651. package/dist/todos/nag.d.ts.map +1 -0
  652. package/dist/todos/nag.js +103 -0
  653. package/dist/todos/nag.js.map +1 -0
  654. package/dist/todos/order.d.ts +25 -0
  655. package/dist/todos/order.d.ts.map +1 -0
  656. package/dist/todos/order.js +61 -0
  657. package/dist/todos/order.js.map +1 -0
  658. package/dist/todos/projects.d.ts +102 -0
  659. package/dist/todos/projects.d.ts.map +1 -0
  660. package/dist/todos/projects.js +342 -0
  661. package/dist/todos/projects.js.map +1 -0
  662. package/dist/todos/registry.d.ts +64 -0
  663. package/dist/todos/registry.d.ts.map +1 -0
  664. package/dist/todos/registry.js +116 -0
  665. package/dist/todos/registry.js.map +1 -0
  666. package/dist/todos/reminderEngine.d.ts +78 -0
  667. package/dist/todos/reminderEngine.d.ts.map +1 -0
  668. package/dist/todos/reminderEngine.js +162 -0
  669. package/dist/todos/reminderEngine.js.map +1 -0
  670. package/dist/todos/store.d.ts +34 -0
  671. package/dist/todos/store.d.ts.map +1 -0
  672. package/dist/todos/store.js +208 -0
  673. package/dist/todos/store.js.map +1 -0
  674. package/dist/todos/tools.d.ts +26 -0
  675. package/dist/todos/tools.d.ts.map +1 -0
  676. package/dist/todos/tools.js +25 -0
  677. package/dist/todos/tools.js.map +1 -0
  678. package/dist/todos/types.d.ts +85 -0
  679. package/dist/todos/types.d.ts.map +1 -0
  680. package/dist/todos/types.js +30 -0
  681. package/dist/todos/types.js.map +1 -0
  682. package/dist/trackers/taskAgentLimit.d.ts +58 -0
  683. package/dist/trackers/taskAgentLimit.d.ts.map +1 -0
  684. package/dist/trackers/taskAgentLimit.js +62 -0
  685. package/dist/trackers/taskAgentLimit.js.map +1 -0
  686. package/dist/trackers/taskAgentSlots.d.ts +109 -0
  687. package/dist/trackers/taskAgentSlots.d.ts.map +1 -0
  688. package/dist/trackers/taskAgentSlots.js +227 -0
  689. package/dist/trackers/taskAgentSlots.js.map +1 -0
  690. package/dist/trackers/types.d.ts +14 -0
  691. package/dist/trackers/types.d.ts.map +1 -0
  692. package/dist/trackers/types.js +3 -0
  693. package/dist/trackers/types.js.map +1 -0
  694. package/dist/types.d.ts +80 -4
  695. package/dist/types.d.ts.map +1 -1
  696. package/dist/utils/adoptReplayGate.d.ts +16 -0
  697. package/dist/utils/adoptReplayGate.d.ts.map +1 -0
  698. package/dist/utils/adoptReplayGate.js +35 -0
  699. package/dist/utils/adoptReplayGate.js.map +1 -0
  700. package/dist/utils/agentEnvironment.d.ts +6 -2
  701. package/dist/utils/agentEnvironment.d.ts.map +1 -1
  702. package/dist/utils/agentEnvironment.js +13 -2
  703. package/dist/utils/agentEnvironment.js.map +1 -1
  704. package/dist/utils/agentPlugin.d.ts +113 -0
  705. package/dist/utils/agentPlugin.d.ts.map +1 -0
  706. package/dist/utils/agentPlugin.js +192 -0
  707. package/dist/utils/agentPlugin.js.map +1 -0
  708. package/dist/utils/autoContinueOnLimit.d.ts +7 -4
  709. package/dist/utils/autoContinueOnLimit.d.ts.map +1 -1
  710. package/dist/utils/autoContinueOnLimit.js +8 -5
  711. package/dist/utils/autoContinueOnLimit.js.map +1 -1
  712. package/dist/utils/botSkills.d.ts +62 -0
  713. package/dist/utils/botSkills.d.ts.map +1 -0
  714. package/dist/utils/botSkills.js +53 -0
  715. package/dist/utils/botSkills.js.map +1 -0
  716. package/dist/utils/botSkillsSetting.d.ts +7 -0
  717. package/dist/utils/botSkillsSetting.d.ts.map +1 -0
  718. package/dist/utils/botSkillsSetting.js +9 -0
  719. package/dist/utils/botSkillsSetting.js.map +1 -0
  720. package/dist/utils/claudeCodeVersion.d.ts +7 -0
  721. package/dist/utils/claudeCodeVersion.d.ts.map +1 -1
  722. package/dist/utils/claudeCodeVersion.js +14 -1
  723. package/dist/utils/claudeCodeVersion.js.map +1 -1
  724. package/dist/utils/claudeCompactHook.d.ts +33 -15
  725. package/dist/utils/claudeCompactHook.d.ts.map +1 -1
  726. package/dist/utils/claudeCompactHook.js +36 -17
  727. package/dist/utils/claudeCompactHook.js.map +1 -1
  728. package/dist/utils/claudeCompactSummary.d.ts +15 -0
  729. package/dist/utils/claudeCompactSummary.d.ts.map +1 -0
  730. package/dist/utils/claudeCompactSummary.js +96 -0
  731. package/dist/utils/claudeCompactSummary.js.map +1 -0
  732. package/dist/utils/claudeLimitSwitch.d.ts +11 -9
  733. package/dist/utils/claudeLimitSwitch.d.ts.map +1 -1
  734. package/dist/utils/claudeLimitSwitch.js +18 -16
  735. package/dist/utils/claudeLimitSwitch.js.map +1 -1
  736. package/dist/utils/claudeProfiles.d.ts +5 -0
  737. package/dist/utils/claudeProfiles.d.ts.map +1 -1
  738. package/dist/utils/claudeProfiles.js +14 -0
  739. package/dist/utils/claudeProfiles.js.map +1 -1
  740. package/dist/utils/claudeSessionTitle.d.ts +2 -1
  741. package/dist/utils/claudeSessionTitle.d.ts.map +1 -1
  742. package/dist/utils/claudeSessionTitle.js +14 -14
  743. package/dist/utils/claudeSessionTitle.js.map +1 -1
  744. package/dist/utils/claudeUsage.d.ts +95 -15
  745. package/dist/utils/claudeUsage.d.ts.map +1 -1
  746. package/dist/utils/claudeUsage.js +241 -41
  747. package/dist/utils/claudeUsage.js.map +1 -1
  748. package/dist/utils/claudeUsageRefresher.d.ts +10 -0
  749. package/dist/utils/claudeUsageRefresher.d.ts.map +1 -1
  750. package/dist/utils/claudeUsageRefresher.js +11 -0
  751. package/dist/utils/claudeUsageRefresher.js.map +1 -1
  752. package/dist/utils/claudeUserEntry.d.ts +50 -0
  753. package/dist/utils/claudeUserEntry.d.ts.map +1 -0
  754. package/dist/utils/claudeUserEntry.js +120 -0
  755. package/dist/utils/claudeUserEntry.js.map +1 -0
  756. package/dist/utils/clearThreadOutputQueues.d.ts +4 -3
  757. package/dist/utils/clearThreadOutputQueues.d.ts.map +1 -1
  758. package/dist/utils/clearThreadOutputQueues.js +1 -1
  759. package/dist/utils/clearThreadOutputQueues.js.map +1 -1
  760. package/dist/utils/compactOnIdle.d.ts +33 -13
  761. package/dist/utils/compactOnIdle.d.ts.map +1 -1
  762. package/dist/utils/compactOnIdle.js +35 -15
  763. package/dist/utils/compactOnIdle.js.map +1 -1
  764. package/dist/utils/fallbackBridge.d.ts +5 -0
  765. package/dist/utils/fallbackBridge.d.ts.map +1 -1
  766. package/dist/utils/fallbackBridge.js +19 -3
  767. package/dist/utils/fallbackBridge.js.map +1 -1
  768. package/dist/utils/fallbackChain.d.ts +9 -3
  769. package/dist/utils/fallbackChain.d.ts.map +1 -1
  770. package/dist/utils/fallbackChain.js +21 -3
  771. package/dist/utils/fallbackChain.js.map +1 -1
  772. package/dist/utils/fileSendPlan.d.ts +6 -0
  773. package/dist/utils/fileSendPlan.d.ts.map +1 -1
  774. package/dist/utils/fileSendPlan.js +11 -0
  775. package/dist/utils/fileSendPlan.js.map +1 -1
  776. package/dist/utils/fileSendService.d.ts +7 -1
  777. package/dist/utils/fileSendService.d.ts.map +1 -1
  778. package/dist/utils/fileSendService.js +6 -2
  779. package/dist/utils/fileSendService.js.map +1 -1
  780. package/dist/utils/groupFinalizePlan.d.ts +8 -10
  781. package/dist/utils/groupFinalizePlan.d.ts.map +1 -1
  782. package/dist/utils/groupFinalizePlan.js +8 -12
  783. package/dist/utils/groupFinalizePlan.js.map +1 -1
  784. package/dist/utils/jsonStreamHost.d.ts +13 -0
  785. package/dist/utils/jsonStreamHost.d.ts.map +1 -1
  786. package/dist/utils/jsonStreamHost.js +13 -0
  787. package/dist/utils/jsonStreamHost.js.map +1 -1
  788. package/dist/utils/messageSendService.d.ts +5 -3
  789. package/dist/utils/messageSendService.d.ts.map +1 -1
  790. package/dist/utils/messageSendService.js +12 -5
  791. package/dist/utils/messageSendService.js.map +1 -1
  792. package/dist/utils/openCodeCompactPlugin.d.ts +39 -14
  793. package/dist/utils/openCodeCompactPlugin.d.ts.map +1 -1
  794. package/dist/utils/openCodeCompactPlugin.js +106 -38
  795. package/dist/utils/openCodeCompactPlugin.js.map +1 -1
  796. package/dist/utils/promptDelivery.d.ts +29 -12
  797. package/dist/utils/promptDelivery.d.ts.map +1 -1
  798. package/dist/utils/promptDelivery.js +13 -5
  799. package/dist/utils/promptDelivery.js.map +1 -1
  800. package/dist/utils/runnersScreenPlan.d.ts +130 -0
  801. package/dist/utils/runnersScreenPlan.d.ts.map +1 -0
  802. package/dist/utils/runnersScreenPlan.js +257 -0
  803. package/dist/utils/runnersScreenPlan.js.map +1 -0
  804. package/dist/utils/sentKindsSummary.d.ts +10 -0
  805. package/dist/utils/sentKindsSummary.d.ts.map +1 -0
  806. package/dist/utils/sentKindsSummary.js +18 -0
  807. package/dist/utils/sentKindsSummary.js.map +1 -0
  808. package/dist/utils/telegramError.d.ts +6 -0
  809. package/dist/utils/telegramError.d.ts.map +1 -1
  810. package/dist/utils/telegramError.js +12 -0
  811. package/dist/utils/telegramError.js.map +1 -1
  812. package/dist/utils/topicView.d.ts +1 -1
  813. package/dist/utils/topicView.js +1 -1
  814. package/dist/utils/transcribeAudio.d.ts +10 -0
  815. package/dist/utils/transcribeAudio.d.ts.map +1 -1
  816. package/dist/utils/transcribeAudio.js +22 -3
  817. package/dist/utils/transcribeAudio.js.map +1 -1
  818. package/dist/utils/transcriptErrorTime.d.ts +8 -0
  819. package/dist/utils/transcriptErrorTime.d.ts.map +1 -0
  820. package/dist/utils/transcriptErrorTime.js +56 -0
  821. package/dist/utils/transcriptErrorTime.js.map +1 -0
  822. package/dist/utils/wedgeRecovery.d.ts +2 -0
  823. package/dist/utils/wedgeRecovery.d.ts.map +1 -1
  824. package/dist/utils/wedgeRecovery.js +1 -1
  825. package/dist/utils/wedgeRecovery.js.map +1 -1
  826. package/package.json +15 -4
  827. package/remoteRun/runner.sh +1317 -0
  828. package/stt/gigaam_sidecar.py +555 -50
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanHostKey = void 0;
4
+ exports.parseHubAddress = parseHubAddress;
5
+ exports.parseKeyscanOutput = parseKeyscanOutput;
6
+ exports.checkHubAddress = checkHubAddress;
7
+ const child_process_1 = require("child_process");
8
+ const hubIds_1 = require("./hubIds");
9
+ const sshKeys_1 = require("./sshKeys");
10
+ /**
11
+ * @description The address runners dial and the check that it really is THIS machine's sshd. A pairing code pins the host key found
12
+ * at that address, so a mistyped address, or one that reaches another machine, must be caught before a code is made — otherwise the
13
+ * runner would be told to trust somebody else's key. The check compares what `ssh-keyscan` reads at the address with what it reads
14
+ * on the machine's own loopback port.
15
+ */
16
+ const defaultSshPort = 22;
17
+ const scanTimeoutSeconds = 5;
18
+ const scanKillMs = 8 * 1000;
19
+ const loopbackHosts = ['127.0.0.1', 'localhost', '::1'];
20
+ const loopbackAddress = '127.0.0.1';
21
+ /** Host key types in the order a pairing prefers them. */
22
+ const hostKeyTypePreference = ['ssh-ed25519', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-rsa'];
23
+ /** @description `host`, `host:port`, `[v6]:port` or a bare IPv6 address, as an address (port 22 when none is given). */
24
+ function parseHubAddress(text) {
25
+ const trimmed = text.trim();
26
+ const bracketed = /^\[([^\]]+)\](?::(\d+))?$/.exec(trimmed);
27
+ const hostAndPort = /^([^:]+):(\d+)$/.exec(trimmed);
28
+ const [host, portText] = bracketed !== null ? [bracketed[1], bracketed[2]] : hostAndPort !== null ? [hostAndPort[1], hostAndPort[2]] : [trimmed, undefined];
29
+ const port = portText === undefined ? defaultSshPort : Number(portText);
30
+ if (!hubIds_1.hubHostSchema.safeParse(host).success)
31
+ return { ok: false, error: 'the address must be a host name or an IP address, optionally with :port' };
32
+ if (!hubIds_1.hubPortSchema.safeParse(port).success)
33
+ return { ok: false, error: 'the port must be a number from 1 to 65535' };
34
+ return { ok: true, address: { host, port } };
35
+ }
36
+ /** @description The host key to pin out of `ssh-keyscan` output: the most preferred type that is a well-formed key, as `<type> <base64>`. */
37
+ function parseKeyscanOutput(output) {
38
+ const keys = output
39
+ .split('\n')
40
+ .filter((line) => !line.startsWith('#'))
41
+ .map((line) => line.trim().split(/\s+/).slice(1, 3).join(' '))
42
+ .filter((key) => (0, sshKeys_1.parsePublicKey)(key) !== null);
43
+ for (const type of hostKeyTypePreference) {
44
+ const found = keys.find((key) => key.startsWith(`${type} `));
45
+ if (found !== undefined)
46
+ return found;
47
+ }
48
+ return null;
49
+ }
50
+ /** @description The real scanner: `ssh-keyscan`, bounded. */
51
+ const scanHostKey = (host, port) => new Promise((resolve) => {
52
+ const child = (0, child_process_1.spawn)('ssh-keyscan', ['-T', scanTimeoutSeconds.toString(), '-p', port.toString(), host], { stdio: ['ignore', 'pipe', 'ignore'] });
53
+ let output = '';
54
+ const killTimer = setTimeout(() => child.kill('SIGKILL'), scanKillMs);
55
+ child.stdout.setEncoding('utf8');
56
+ child.stdout.on('data', (chunk) => { output += chunk; });
57
+ child.on('error', () => {
58
+ clearTimeout(killTimer);
59
+ resolve(null);
60
+ });
61
+ child.on('close', () => {
62
+ clearTimeout(killTimer);
63
+ resolve(parseKeyscanOutput(output));
64
+ });
65
+ });
66
+ exports.scanHostKey = scanHostKey;
67
+ function describeKey(key) {
68
+ return (0, sshKeys_1.getPublicKeyFingerprint)(key);
69
+ }
70
+ /**
71
+ * @description Does `address` answer with an ssh server, and is it this machine's own? Returns the host key to pin. The machine's own
72
+ * sshd is read on its loopback; when that cannot be read the address is accepted with a note that it was not compared.
73
+ */
74
+ async function checkHubAddress(address, scan) {
75
+ const found = await scan(address.host, address.port);
76
+ if (found === null)
77
+ return { ok: false, error: `nothing answers with an ssh host key at ${address.host}:${address.port} (is sshd running, and is the port reachable from outside?)` };
78
+ if (loopbackHosts.includes(address.host))
79
+ return { ok: true, hostKey: found, note: null };
80
+ const own = await scan(loopbackAddress, address.port);
81
+ if (own === null)
82
+ return { ok: true, hostKey: found, note: `this machine's own sshd could not be read on ${loopbackAddress}:${address.port}, so the address was not compared with it` };
83
+ if (own !== found) {
84
+ return { ok: false, error: `${address.host}:${address.port} answers with the ssh key ${describeKey(found)}, not this machine's own (${describeKey(own)}) — it is another machine, or a forward to one` };
85
+ }
86
+ return { ok: true, hostKey: found, note: null };
87
+ }
88
+ //# sourceMappingURL=hubAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubAddress.js","sourceRoot":"","sources":["../../src/runners/hubAddress.ts"],"names":[],"mappings":";;;AA2BA,0CASC;AAGD,gDAWC;AAgCD,0CAUC;AA5FD,iDAAsC;AACtC,qCAAwD;AACxD,uCAAoE;AAEpE;;;;;GAKG;AAEH,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC;AAC5B,MAAM,aAAa,GAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAC3E,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,0DAA0D;AAC1D,MAAM,qBAAqB,GAAsB,CAAC,aAAa,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;AASjJ,wHAAwH;AACxH,SAAgB,eAAe,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5J,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,sBAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yEAAyE,EAAE,CAAC;IACnJ,IAAI,CAAC,sBAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IACrH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED,6IAA6I;AAC7I,SAAgB,kBAAkB,CAAC,MAAc;IAC/C,MAAM,IAAI,GAAG,MAAM;SAChB,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;IACjD,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,6DAA6D;AACtD,MAAM,WAAW,GAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACjF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,aAAa,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChJ,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IACtE,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAdU,QAAA,WAAW,eAcrB;AAIH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,IAAA,iCAAuB,EAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,eAAe,CAAC,OAAmB,EAAE,IAAoB;IAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2CAA2C,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,6DAA6D,EAAE,CAAC;IACtL,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,gDAAgD,eAAe,IAAI,OAAO,CAAC,IAAI,2CAA2C,EAAE,CAAC;IACxL,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,6BAA6B,WAAW,CAAC,KAAK,CAAC,6BAA6B,WAAW,CAAC,GAAG,CAAC,gDAAgD,EAAE,CAAC;IAC3M,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import * as os from 'os';
2
+ import { type HostKeyScanner, type HubAddress } from './hubAddress';
3
+ /** @description `host:port`, a bare IPv6 host in brackets (`[2001:db8::1]:22`) — the spelling `parseHubAddress` reads back. */
4
+ export declare function formatHubAddress(address: HubAddress): string;
5
+ /** @description The globally routable addresses among `interfaces` (default: this machine's), IPv4 before IPv6, each once. */
6
+ export declare function listPublicAddressCandidates(interfaces?: NodeJS.Dict<os.NetworkInterfaceInfo[]>): string[];
7
+ export interface ProposedHubAddress {
8
+ address: HubAddress;
9
+ hostKey: string;
10
+ }
11
+ /**
12
+ * @description The first of `candidates` (on port 22) that answers with this machine's own ssh host key, or `null` when none does.
13
+ * A candidate whose own sshd could not be compared (`note` set) is not proposed: a proposal is a promise that the check passed.
14
+ */
15
+ export declare function findProposedHubAddress(candidates: readonly string[], scan: HostKeyScanner): Promise<ProposedHubAddress | null>;
16
+ //# sourceMappingURL=hubAddressCandidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubAddressCandidates.d.ts","sourceRoot":"","sources":["../../src/runners/hubAddressCandidates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAerF,+HAA+H;AAC/H,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAE5D;AAwBD,8HAA8H;AAC9H,wBAAgB,2BAA2B,CAAC,UAAU,GAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAA0B,GAAG,MAAM,EAAE,CAKjI;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAOpI"}
@@ -0,0 +1,96 @@
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.formatHubAddress = formatHubAddress;
37
+ exports.listPublicAddressCandidates = listPublicAddressCandidates;
38
+ exports.findProposedHubAddress = findProposedHubAddress;
39
+ const os = __importStar(require("os"));
40
+ const hubAddress_1 = require("./hubAddress");
41
+ /**
42
+ * @description The public address `/runners` proposes to the operator at the first pairing: the globally routable addresses of this
43
+ * machine's own network interfaces, on the ssh port 22, the first of which that answers with THIS machine's own sshd (the check of
44
+ * `hubAddress.ts`). A machine behind NAT (a cloud VPS whose public address lives on the provider's router) has none, and the
45
+ * operator types one — nothing is asked of a third-party service to learn it.
46
+ */
47
+ const defaultCandidatePort = 22;
48
+ const ipv6GlobalUnicastMask = 0xe000;
49
+ const ipv6GlobalUnicastPrefix = 0x2000;
50
+ const hexRadix = 16;
51
+ const octetCount = 4;
52
+ /** @description `host:port`, a bare IPv6 host in brackets (`[2001:db8::1]:22`) — the spelling `parseHubAddress` reads back. */
53
+ function formatHubAddress(address) {
54
+ return address.host.includes(':') ? `[${address.host}]:${address.port}` : `${address.host}:${address.port}`;
55
+ }
56
+ function checkIsPublicIpv4(address) {
57
+ const octets = address.split('.').map(Number);
58
+ if (octets.length !== octetCount || octets.some((octet) => !Number.isInteger(octet)))
59
+ return false;
60
+ const [first, second] = octets;
61
+ const isPrivateOrReserved = first === 0 ||
62
+ first === 10 ||
63
+ first === 127 ||
64
+ (first === 100 && second >= 64 && second <= 127) ||
65
+ (first === 169 && second === 254) ||
66
+ (first === 172 && second >= 16 && second <= 31) ||
67
+ (first === 192 && second === 168) ||
68
+ first >= 224;
69
+ return !isPrivateOrReserved;
70
+ }
71
+ /** Global unicast is 2000::/3; a link-local, unique-local or loopback address never is. */
72
+ function checkIsPublicIpv6(address) {
73
+ const firstGroup = Number.parseInt(address.split(':')[0], hexRadix);
74
+ return Number.isInteger(firstGroup) && (firstGroup & ipv6GlobalUnicastMask) === ipv6GlobalUnicastPrefix;
75
+ }
76
+ /** @description The globally routable addresses among `interfaces` (default: this machine's), IPv4 before IPv6, each once. */
77
+ function listPublicAddressCandidates(interfaces = os.networkInterfaces()) {
78
+ const addresses = Object.values(interfaces).flatMap((entries) => entries ?? []).filter((entry) => !entry.internal);
79
+ const ipv4 = addresses.filter((entry) => entry.family === 'IPv4' && checkIsPublicIpv4(entry.address)).map((entry) => entry.address);
80
+ const ipv6 = addresses.filter((entry) => entry.family === 'IPv6' && checkIsPublicIpv6(entry.address)).map((entry) => entry.address);
81
+ return [...new Set([...ipv4, ...ipv6])];
82
+ }
83
+ /**
84
+ * @description The first of `candidates` (on port 22) that answers with this machine's own ssh host key, or `null` when none does.
85
+ * A candidate whose own sshd could not be compared (`note` set) is not proposed: a proposal is a promise that the check passed.
86
+ */
87
+ async function findProposedHubAddress(candidates, scan) {
88
+ for (const host of candidates) {
89
+ const address = { host, port: defaultCandidatePort };
90
+ const check = await (0, hubAddress_1.checkHubAddress)(address, scan);
91
+ if (check.ok && check.note === null)
92
+ return { address, hostKey: check.hostKey };
93
+ }
94
+ return null;
95
+ }
96
+ //# sourceMappingURL=hubAddressCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubAddressCandidates.js","sourceRoot":"","sources":["../../src/runners/hubAddressCandidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * @description The shapes of the identifiers that travel through ssh command lines, file names and the registry. Every one is matched
4
+ * against a strict pattern at the boundary it enters by (a gate's arguments, a pair code, a registry file), so none can carry a quote,
5
+ * a space, a slash or a leading dash into a shell word, a path or an `authorized_keys` option.
6
+ */
7
+ /** Ids made by {@link createRandomId}: 12 lowercase hex digits. */
8
+ export declare const hubIdPattern: RegExp;
9
+ export declare const hubIdSchema: z.ZodString;
10
+ /** A host name or address a runner dials: no spaces, no leading dash or dot, nothing a shell or ssh would read as an option. */
11
+ export declare const hubHostSchema: z.ZodString;
12
+ export declare const hubPortSchema: z.ZodNumber;
13
+ export declare const hubSshUserSchema: z.ZodString;
14
+ /** The hub's ssh host key as `<type> <base64>` — what a runner pins. */
15
+ export declare const hubHostKeySchema: z.ZodString;
16
+ //# sourceMappingURL=hubIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubIds.d.ts","sourceRoot":"","sources":["../../src/runners/hubIds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAAmB,CAAC;AAQ7C,eAAO,MAAM,WAAW,aAA8D,CAAC;AACvF,gIAAgI;AAChI,eAAO,MAAM,aAAa,aAA4H,CAAC;AACvJ,eAAO,MAAM,aAAa,aAAuC,CAAC;AAClE,eAAO,MAAM,gBAAgB,aAAmE,CAAC;AAGjG,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,aAAgE,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hubHostKeySchema = exports.hubSshUserSchema = exports.hubPortSchema = exports.hubHostSchema = exports.hubIdSchema = exports.hubIdPattern = void 0;
4
+ const zod_1 = require("zod");
5
+ /**
6
+ * @description The shapes of the identifiers that travel through ssh command lines, file names and the registry. Every one is matched
7
+ * against a strict pattern at the boundary it enters by (a gate's arguments, a pair code, a registry file), so none can carry a quote,
8
+ * a space, a slash or a leading dash into a shell word, a path or an `authorized_keys` option.
9
+ */
10
+ /** Ids made by {@link createRandomId}: 12 lowercase hex digits. */
11
+ exports.hubIdPattern = /^[0-9a-f]{12}$/;
12
+ const hostNamePattern = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,252}$/;
13
+ /** An IPv6 literal: hex digits, colons (at least two) and an optional dotted tail. */
14
+ const ipv6Pattern = /^(?=(?:[^:]*:){2})[0-9A-Fa-f:.]{2,45}$/;
15
+ const sshUserPattern = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,63}$/;
16
+ const maxPort = 65535;
17
+ exports.hubIdSchema = zod_1.z.string().regex(exports.hubIdPattern, 'must be a 12-digit hex id');
18
+ /** A host name or address a runner dials: no spaces, no leading dash or dot, nothing a shell or ssh would read as an option. */
19
+ exports.hubHostSchema = zod_1.z.string().refine((host) => hostNamePattern.test(host) || ipv6Pattern.test(host), 'must be a host name or an IP address');
20
+ exports.hubPortSchema = zod_1.z.number().int().min(1).max(maxPort);
21
+ exports.hubSshUserSchema = zod_1.z.string().regex(sshUserPattern, 'must be a plain account name');
22
+ const hostKeyPattern = /^(ssh-ed25519|ecdsa-sha2-nistp(?:256|384|521)|ssh-rsa) [A-Za-z0-9+/]+={0,2}$/;
23
+ /** The hub's ssh host key as `<type> <base64>` — what a runner pins. */
24
+ exports.hubHostKeySchema = zod_1.z.string().regex(hostKeyPattern, 'must be an ssh public key');
25
+ //# sourceMappingURL=hubIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubIds.js","sourceRoot":"","sources":["../../src/runners/hubIds.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB;;;;GAIG;AAEH,mEAAmE;AACtD,QAAA,YAAY,GAAG,gBAAgB,CAAC;AAE7C,MAAM,eAAe,GAAG,qCAAqC,CAAC;AAC9D,sFAAsF;AACtF,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAC7D,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAC5D,MAAM,OAAO,GAAG,KAAK,CAAC;AAET,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,oBAAY,EAAE,2BAA2B,CAAC,CAAC;AACvF,gIAAgI;AACnH,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,sCAAsC,CAAC,CAAC;AAC1I,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrD,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,8BAA8B,CAAC,CAAC;AAEjG,MAAM,cAAc,GAAG,8EAA8E,CAAC;AACtG,wEAAwE;AAC3D,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type SshKeyPair } from './sshKeys';
2
+ /** @description The hub key, or `null` when none was made yet (or its files do not read). */
3
+ export declare function readHubKey(dir: string): SshKeyPair | null;
4
+ /** @description The hub key, made now when it is missing. The registry lock must be held (two first pairings must not make two keys). */
5
+ export declare function readOrCreateHubKeyLocked(dir: string): SshKeyPair;
6
+ //# sourceMappingURL=hubKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubKey.d.ts","sourceRoot":"","sources":["../../src/runners/hubKey.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAY7F,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CASzD;AAED,yIAAyI;AACzI,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAYhE"}
@@ -0,0 +1,78 @@
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.readHubKey = readHubKey;
37
+ exports.readOrCreateHubKeyLocked = readOrCreateHubKeyLocked;
38
+ const fs = __importStar(require("fs"));
39
+ const configDirFile_1 = require("../configDirFile");
40
+ const hubPaths_1 = require("./hubPaths");
41
+ const hubRegistry_1 = require("./hubRegistry");
42
+ const sshKeys_1 = require("./sshKeys");
43
+ /**
44
+ * @description The hub's own client key (`hub_ed25519`): the one key every runner's built-in ssh server accepts, and the one the
45
+ * stock `ssh` calls of `remote-run` log in with. It is made on the first pairing; one key for all runners, because it only proves
46
+ * "this is the hub" to a machine that already trusts this hub.
47
+ */
48
+ const privateKeyMode = 0o600;
49
+ const publicKeyMode = 0o644;
50
+ const hubKeyComment = 'charness-hub';
51
+ /** @description The hub key, or `null` when none was made yet (or its files do not read). */
52
+ function readHubKey(dir) {
53
+ const paths = (0, hubPaths_1.getHubFilePaths)(dir);
54
+ try {
55
+ const privateKey = fs.readFileSync(paths.hubKey, 'utf8');
56
+ const publicKey = fs.readFileSync(paths.hubPublicKey, 'utf8').trim().split(' ').slice(0, 2).join(' ');
57
+ return (0, sshKeys_1.checkIsEd25519PublicKey)(publicKey) ? { privateKey, publicKey } : null;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /** @description The hub key, made now when it is missing. The registry lock must be held (two first pairings must not make two keys). */
64
+ function readOrCreateHubKeyLocked(dir) {
65
+ const existing = readHubKey(dir);
66
+ if (existing !== null)
67
+ return existing;
68
+ const paths = (0, hubPaths_1.getHubFilePaths)(dir);
69
+ // Every paired runner trusts THIS key: a half-present pair is never quietly replaced by a new one.
70
+ if (fs.existsSync(paths.hubKey) || fs.existsSync(paths.hubPublicKey)) {
71
+ throw new hubRegistry_1.HubRegistryError('hub_ed25519 and hub_ed25519.pub do not read as a pair; restore them, or delete both and pair the runners again');
72
+ }
73
+ const created = (0, sshKeys_1.generateEd25519KeyPair)(hubKeyComment);
74
+ (0, configDirFile_1.writeTextFileAtomically)(paths.hubKey, created.privateKey, privateKeyMode);
75
+ (0, configDirFile_1.writeTextFileAtomically)(paths.hubPublicKey, `${created.publicKey} ${hubKeyComment}\n`, publicKeyMode);
76
+ return created;
77
+ }
78
+ //# sourceMappingURL=hubKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubKey.js","sourceRoot":"","sources":["../../src/runners/hubKey.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,gCASC;AAGD,4DAYC;AAzCD,uCAAyB;AACzB,oDAA2D;AAC3D,yCAA6C;AAC7C,+CAAiD;AACjD,uCAA6F;AAE7F;;;;GAIG;AAEH,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,6FAA6F;AAC7F,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,IAAA,0BAAe,EAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtG,OAAO,IAAA,iCAAuB,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yIAAyI;AACzI,SAAgB,wBAAwB,CAAC,GAAW;IAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,KAAK,GAAG,IAAA,0BAAe,EAAC,GAAG,CAAC,CAAC;IACnC,mGAAmG;IACnG,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,8BAAgB,CAAC,gHAAgH,CAAC,CAAC;IAC/I,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,gCAAsB,EAAC,aAAa,CAAC,CAAC;IACtD,IAAA,uCAAuB,EAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1E,IAAA,uCAAuB,EAAC,KAAK,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,IAAI,aAAa,IAAI,EAAE,aAAa,CAAC,CAAC;IACtG,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** @description Make the registry folder (0700) if it is missing. */
2
+ export declare function ensureHubDir(dir: string): void;
3
+ /** @description What tells one process from another that has the same pid: the start time (`/proc` on Linux, `ps` elsewhere), or `null`. */
4
+ export declare function getProcessStartKey(pid: number): string | null;
5
+ /** @description Run `action` while holding the registry lock; waits up to 15 s for it, then throws. */
6
+ export declare function withHubLock<TResult>(dir: string, action: () => TResult | Promise<TResult>): Promise<TResult>;
7
+ //# sourceMappingURL=hubLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubLock.d.ts","sourceRoot":"","sources":["../../src/runners/hubLock.ts"],"names":[],"mappings":"AAuDA,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C;AA4BD,4IAA4I;AAC5I,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAoFD,uGAAuG;AACvG,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAelH"}
@@ -0,0 +1,230 @@
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.ensureHubDir = ensureHubDir;
37
+ exports.getProcessStartKey = getProcessStartKey;
38
+ exports.withHubLock = withHubLock;
39
+ const child_process_1 = require("child_process");
40
+ const crypto_1 = require("crypto");
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const zod_1 = require("zod");
44
+ /**
45
+ * @description The ONE lock of the runner registry: the gate processes sshd starts (a redeem, an unpair), the bot and the CLI all change
46
+ * `paired.json`, `pending.json`, `known_hosts` and the managed `authorized_keys` block, and a change reads what the others wrote first.
47
+ *
48
+ * A lock that is taken over by DELETING a dead holder's file cannot be made safe: two processes that judged the same holder dead can
49
+ * each delete «the» file, the second one deleting the lock the first has just taken. So nothing here is ever deleted on someone else's
50
+ * word. The lock is a numbered file, `lock.<n>`, and the holder is whoever created the HIGHEST number:
51
+ *
52
+ * - to take the lock, create `lock.<top + 1>` exclusively (a hard link of a finished temp file, so it never shows half written;
53
+ * `link` fails with EEXIST like `O_EXCL`) — of any number of contenders exactly one creates a given number, which is the whole
54
+ * arbitration, also when they all found the same dead holder;
55
+ * - the top file is free when its holder released it (the record says so) or is dead (its pid is gone, or belongs to a process that
56
+ * started at another time — pid reuse); otherwise the contender waits. A holder that is ALIVE is never overtaken, however long it
57
+ * has held: a process that is suspended inside its critical section (a stopped job, a laptop asleep) resumes where it was, and
58
+ * overtaking it would let both write the registry. A holder that hangs for good blocks the registry loudly (the waiting caller
59
+ * fails after 15 s naming the lock) instead of silently risking two writers;
60
+ * - after creating its file the contender lists the folder again: if a higher number exists, its judgement was out of date (it saw
61
+ * an old listing) — it removes its own file and starts over;
62
+ * - a released lock stays as a marker (the next number is made after it, so numbers never repeat while a stale observer could still
63
+ * be acting on them); the new holder removes the lower files.
64
+ */
65
+ const lockFilePattern = /^lock\.(\d+)$/;
66
+ const lockFilePrefix = 'lock.';
67
+ const lockTempPrefix = 'lock-temp.';
68
+ const lockPollMs = 25;
69
+ const lockWaitLimitMs = 15 * 1000;
70
+ /** A temp file of a process that died between writing it and linking it is swept after this long. */
71
+ const abandonedTempAgeMs = 60 * 1000;
72
+ const registryDirMode = 0o700;
73
+ const tokenBytes = 8;
74
+ const lockRecordSchema = zod_1.z.strictObject({
75
+ pid: zod_1.z.number().int().positive(),
76
+ /** Tells this holder's file from another's with the same number. */
77
+ token: zod_1.z.string(),
78
+ startedAtMs: zod_1.z.number(),
79
+ /** Identifies the holder's process beyond its pid (its start time), so a reused pid is not taken for the holder; `null` where it cannot be read. */
80
+ startKey: zod_1.z.string().nullable(),
81
+ /** Set when the holder gives the lock back; the file then stays as the marker of the number. */
82
+ releasedAtMs: zod_1.z.number().nullable(),
83
+ });
84
+ /** @description Make the registry folder (0700) if it is missing. */
85
+ function ensureHubDir(dir) {
86
+ fs.mkdirSync(dir, { recursive: true, mode: registryDirMode });
87
+ }
88
+ function sleep(ms) {
89
+ return new Promise((resolve) => { setTimeout(resolve, ms); });
90
+ }
91
+ function getLockFilePath(dir, generation) {
92
+ return path.join(dir, `${lockFilePrefix}${generation}`);
93
+ }
94
+ function listGenerations(dir) {
95
+ return fs.readdirSync(dir)
96
+ .flatMap((name) => {
97
+ const match = lockFilePattern.exec(name);
98
+ return match === null ? [] : [Number(match[1])];
99
+ })
100
+ .sort((left, right) => left - right);
101
+ }
102
+ function readRecord(filePath) {
103
+ try {
104
+ const parsed = lockRecordSchema.safeParse(JSON.parse(fs.readFileSync(filePath, 'utf8')));
105
+ return parsed.success ? parsed.data : null;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ /** @description What tells one process from another that has the same pid: the start time (`/proc` on Linux, `ps` elsewhere), or `null`. */
112
+ function getProcessStartKey(pid) {
113
+ try {
114
+ const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf8');
115
+ // Field 22 counts from the state field that follows the command name's closing parenthesis.
116
+ return stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19] ?? null;
117
+ }
118
+ catch {
119
+ const listing = (0, child_process_1.spawnSync)('ps', ['-p', pid.toString(), '-o', 'lstart='], { encoding: 'utf8', timeout: 5000 });
120
+ return listing.status === 0 && listing.stdout.trim() !== '' ? listing.stdout.trim() : null;
121
+ }
122
+ }
123
+ function checkIsProcessAlive(record) {
124
+ try {
125
+ process.kill(record.pid, 0);
126
+ }
127
+ catch (error) {
128
+ // EPERM: the process exists but is another account's.
129
+ if (!(error instanceof Error && 'code' in error && error.code === 'EPERM'))
130
+ return false;
131
+ }
132
+ if (record.startKey === null)
133
+ return true;
134
+ const currentKey = getProcessStartKey(record.pid);
135
+ return currentKey === null || currentKey === record.startKey;
136
+ }
137
+ /** A record that does not read counts as a dead holder: a file nobody finished writing is never left by a live one (it is linked whole). */
138
+ function checkIsHeld(record) {
139
+ return record !== null && record.releasedAtMs === null && checkIsProcessAlive(record);
140
+ }
141
+ function writeTempRecord(dir, record) {
142
+ const temporaryPath = path.join(dir, `${lockTempPrefix}${process.pid}.${(0, crypto_1.randomBytes)(tokenBytes).toString('hex')}`);
143
+ fs.writeFileSync(temporaryPath, JSON.stringify(record));
144
+ return temporaryPath;
145
+ }
146
+ /** Create `lock.<generation>` holding `record`, whole, only if no such file exists. */
147
+ function createGenerationFile(dir, generation, record) {
148
+ const temporaryPath = writeTempRecord(dir, record);
149
+ try {
150
+ fs.linkSync(temporaryPath, getLockFilePath(dir, generation));
151
+ return true;
152
+ }
153
+ catch (error) {
154
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST')
155
+ return false;
156
+ throw error;
157
+ }
158
+ finally {
159
+ fs.rmSync(temporaryPath, { force: true });
160
+ }
161
+ }
162
+ function removeGenerationFileIfOwned(dir, generation, token) {
163
+ const filePath = getLockFilePath(dir, generation);
164
+ if (readRecord(filePath)?.token === token)
165
+ fs.rmSync(filePath, { force: true });
166
+ }
167
+ function createRelease(dir, generation, record) {
168
+ return () => {
169
+ const filePath = getLockFilePath(dir, generation);
170
+ if (readRecord(filePath)?.token !== record.token)
171
+ return;
172
+ const temporaryPath = writeTempRecord(dir, { ...record, releasedAtMs: Date.now() });
173
+ fs.renameSync(temporaryPath, filePath);
174
+ };
175
+ }
176
+ /** A process killed between writing its temp file and linking it leaves the temp file behind. */
177
+ function removeAbandonedTempFiles(dir, nowMs) {
178
+ for (const name of fs.readdirSync(dir)) {
179
+ if (!name.startsWith(lockTempPrefix))
180
+ continue;
181
+ const filePath = path.join(dir, name);
182
+ try {
183
+ if (nowMs - fs.statSync(filePath).mtimeMs > abandonedTempAgeMs)
184
+ fs.rmSync(filePath, { force: true });
185
+ }
186
+ catch {
187
+ // Gone already: another contender swept it.
188
+ }
189
+ }
190
+ }
191
+ /** Try once. `null`: somebody holds the lock, or this attempt lost a race — the caller waits and tries again. */
192
+ function tryAcquire(dir, nowMs) {
193
+ const generations = listGenerations(dir);
194
+ const top = generations.at(-1) ?? 0;
195
+ if (top > 0 && checkIsHeld(readRecord(getLockFilePath(dir, top))))
196
+ return null;
197
+ const generation = top + 1;
198
+ const record = { pid: process.pid, token: (0, crypto_1.randomBytes)(tokenBytes).toString('hex'), startedAtMs: nowMs, startKey: getProcessStartKey(process.pid), releasedAtMs: null };
199
+ if (!createGenerationFile(dir, generation, record))
200
+ return null;
201
+ const after = listGenerations(dir);
202
+ if (after.some((other) => other > generation)) {
203
+ removeGenerationFileIfOwned(dir, generation, record.token);
204
+ return null;
205
+ }
206
+ for (const lower of after.filter((other) => other < generation))
207
+ fs.rmSync(getLockFilePath(dir, lower), { force: true });
208
+ removeAbandonedTempFiles(dir, nowMs);
209
+ return { release: createRelease(dir, generation, record) };
210
+ }
211
+ /** @description Run `action` while holding the registry lock; waits up to 15 s for it, then throws. */
212
+ async function withHubLock(dir, action) {
213
+ ensureHubDir(dir);
214
+ const deadline = Date.now() + lockWaitLimitMs;
215
+ for (;;) {
216
+ const lock = tryAcquire(dir, Date.now());
217
+ if (lock !== null) {
218
+ try {
219
+ return await action();
220
+ }
221
+ finally {
222
+ lock.release();
223
+ }
224
+ }
225
+ if (Date.now() >= deadline)
226
+ throw new Error('the runner registry is locked by another process (waited 15 s)');
227
+ await sleep(lockPollMs);
228
+ }
229
+ }
230
+ //# sourceMappingURL=hubLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hubLock.js","sourceRoot":"","sources":["../../src/runners/hubLock.ts"],"names":[],"mappings":"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"}