@agimon-ai/doompi-runner 0.0.1-alpha.3 → 0.0.1-alpha.30

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 (666) hide show
  1. package/README.md +102 -23
  2. package/dist/bin/cli.cjs +3 -3
  3. package/dist/bin/cli.cjs.map +1 -1
  4. package/dist/bin/cli.d.cts.map +1 -1
  5. package/dist/bin/cli.d.mts.map +1 -1
  6. package/dist/bin/cli.mjs +3 -3
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/logSink.cjs +1 -1
  9. package/dist/bin/logSink.cjs.map +1 -1
  10. package/dist/bin/logSink.mjs +1 -1
  11. package/dist/bin/logSink.mjs.map +1 -1
  12. package/dist/bin/runnerHost.cjs +1 -1
  13. package/dist/bin/runnerHost.cjs.map +1 -1
  14. package/dist/bin/runnerHost.mjs +1 -1
  15. package/dist/bin/runnerHost.mjs.map +1 -1
  16. package/dist/cli/cliApp.cjs +1 -6
  17. package/dist/cli/cliApp.d.cts +2 -23
  18. package/dist/cli/cliApp.d.mts +2 -23
  19. package/dist/cli/cliApp.mjs +1 -6
  20. package/dist/compaction.cjs +1 -4
  21. package/dist/compaction.d.cts +2 -14
  22. package/dist/compaction.d.mts +2 -14
  23. package/dist/compaction.mjs +1 -4
  24. package/dist/config.cjs +1 -2
  25. package/dist/config.d.cts +2 -32
  26. package/dist/config.d.mts +2 -32
  27. package/dist/config.mjs +1 -2
  28. package/dist/container/index.cjs +1 -2
  29. package/dist/container/index.d.cts +2 -14
  30. package/dist/container/index.d.mts +2 -14
  31. package/dist/container/index.mjs +1 -2
  32. package/dist/extensions/pi.cjs +1 -2
  33. package/dist/extensions/pi.d.cts +2 -2
  34. package/dist/extensions/pi.d.mts +2 -2
  35. package/dist/extensions/pi.mjs +1 -2
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.cts +5 -7
  38. package/dist/index.d.mts +5 -7
  39. package/dist/index.mjs +1 -1
  40. package/dist/reconcile.cjs +1 -2
  41. package/dist/reconcile.d.cts +2 -37
  42. package/dist/reconcile.d.mts +2 -37
  43. package/dist/reconcile.mjs +1 -2
  44. package/dist/services/AnsiScrub/ansiScrub.cjs +1 -5
  45. package/dist/services/AnsiScrub/ansiScrub.d.cts +2 -34
  46. package/dist/services/AnsiScrub/ansiScrub.d.mts +2 -34
  47. package/dist/services/AnsiScrub/ansiScrub.mjs +1 -5
  48. package/dist/services/AnsiScrub/index.cjs +1 -1
  49. package/dist/services/AnsiScrub/index.d.cts +1 -1
  50. package/dist/services/AnsiScrub/index.d.mts +1 -1
  51. package/dist/services/AnsiScrub/index.mjs +1 -1
  52. package/dist/services/BashRunService/BashRunService.cjs +1 -2
  53. package/dist/services/BashRunService/BashRunService.d.cts +2 -38
  54. package/dist/services/BashRunService/BashRunService.d.mts +2 -38
  55. package/dist/services/BashRunService/BashRunService.mjs +1 -2
  56. package/dist/services/BashRunService/index.cjs +1 -1
  57. package/dist/services/BashRunService/index.d.cts +2 -2
  58. package/dist/services/BashRunService/index.d.mts +2 -2
  59. package/dist/services/BashRunService/index.mjs +1 -1
  60. package/dist/services/Clock/SystemClock.cjs +1 -2
  61. package/dist/services/Clock/SystemClock.d.cts +2 -11
  62. package/dist/services/Clock/SystemClock.d.mts +2 -11
  63. package/dist/services/Clock/SystemClock.mjs +1 -2
  64. package/dist/services/Clock/index.cjs +1 -1
  65. package/dist/services/Clock/index.d.cts +2 -2
  66. package/dist/services/Clock/index.d.mts +2 -2
  67. package/dist/services/Clock/index.mjs +1 -1
  68. package/dist/services/Launcher/Launcher.cjs +1 -2
  69. package/dist/services/Launcher/Launcher.d.cts +2 -27
  70. package/dist/services/Launcher/Launcher.d.mts +2 -27
  71. package/dist/services/Launcher/Launcher.mjs +1 -2
  72. package/dist/services/Launcher/index.cjs +1 -1
  73. package/dist/services/Launcher/index.d.cts +2 -2
  74. package/dist/services/Launcher/index.d.mts +2 -2
  75. package/dist/services/Launcher/index.mjs +1 -1
  76. package/dist/services/Lifeline/NodeLifeline.cjs +1 -2
  77. package/dist/services/Lifeline/NodeLifeline.d.cts +2 -21
  78. package/dist/services/Lifeline/NodeLifeline.d.mts +2 -21
  79. package/dist/services/Lifeline/NodeLifeline.mjs +1 -2
  80. package/dist/services/Lifeline/client.cjs +1 -2
  81. package/dist/services/Lifeline/client.d.cts +2 -23
  82. package/dist/services/Lifeline/client.d.mts +2 -23
  83. package/dist/services/Lifeline/client.mjs +1 -2
  84. package/dist/services/Lifeline/index.cjs +1 -1
  85. package/dist/services/Lifeline/index.d.cts +3 -3
  86. package/dist/services/Lifeline/index.d.mts +3 -3
  87. package/dist/services/Lifeline/index.mjs +1 -1
  88. package/dist/services/LogFile/LogFile.cjs +1 -2
  89. package/dist/services/LogFile/LogFile.d.cts +2 -13
  90. package/dist/services/LogFile/LogFile.d.mts +2 -13
  91. package/dist/services/LogFile/LogFile.mjs +1 -2
  92. package/dist/services/LogFile/index.cjs +1 -1
  93. package/dist/services/LogFile/index.d.cts +2 -2
  94. package/dist/services/LogFile/index.d.mts +2 -2
  95. package/dist/services/LogFile/index.mjs +1 -1
  96. package/dist/services/LogReader/LogReader.cjs +1 -10
  97. package/dist/services/LogReader/LogReader.d.cts +2 -14
  98. package/dist/services/LogReader/LogReader.d.mts +2 -14
  99. package/dist/services/LogReader/LogReader.mjs +1 -10
  100. package/dist/services/LogReader/index.cjs +1 -1
  101. package/dist/services/LogReader/index.d.cts +2 -2
  102. package/dist/services/LogReader/index.d.mts +2 -2
  103. package/dist/services/LogReader/index.mjs +1 -1
  104. package/dist/services/ProcessControl/NodeProcessControl.cjs +1 -2
  105. package/dist/services/ProcessControl/NodeProcessControl.d.cts +2 -11
  106. package/dist/services/ProcessControl/NodeProcessControl.d.mts +2 -11
  107. package/dist/services/ProcessControl/NodeProcessControl.mjs +1 -2
  108. package/dist/services/ProcessControl/index.cjs +1 -1
  109. package/dist/services/ProcessControl/index.d.cts +2 -2
  110. package/dist/services/ProcessControl/index.d.mts +2 -2
  111. package/dist/services/ProcessControl/index.mjs +1 -1
  112. package/dist/services/PtyHost/PtyHost.cjs +1 -5
  113. package/dist/services/PtyHost/PtyHost.d.cts +2 -28
  114. package/dist/services/PtyHost/PtyHost.d.mts +2 -28
  115. package/dist/services/PtyHost/PtyHost.mjs +1 -5
  116. package/dist/services/PtyHost/index.cjs +1 -1
  117. package/dist/services/PtyHost/index.d.cts +2 -2
  118. package/dist/services/PtyHost/index.d.mts +2 -2
  119. package/dist/services/PtyHost/index.mjs +1 -1
  120. package/dist/services/PtySpawner/NodePtySpawner.cjs +1 -2
  121. package/dist/services/PtySpawner/NodePtySpawner.d.cts +2 -18
  122. package/dist/services/PtySpawner/NodePtySpawner.d.mts +2 -18
  123. package/dist/services/PtySpawner/NodePtySpawner.mjs +1 -2
  124. package/dist/services/PtySpawner/index.cjs +1 -1
  125. package/dist/services/PtySpawner/index.d.cts +2 -2
  126. package/dist/services/PtySpawner/index.d.mts +2 -2
  127. package/dist/services/PtySpawner/index.mjs +1 -1
  128. package/dist/services/RmuxBackend/RmuxBackend.cjs +1 -2
  129. package/dist/services/RmuxBackend/RmuxBackend.d.cts +2 -36
  130. package/dist/services/RmuxBackend/RmuxBackend.d.mts +2 -36
  131. package/dist/services/RmuxBackend/RmuxBackend.mjs +1 -2
  132. package/dist/services/RmuxBackend/index.cjs +1 -1
  133. package/dist/services/RmuxBackend/index.d.cts +2 -2
  134. package/dist/services/RmuxBackend/index.d.mts +2 -2
  135. package/dist/services/RmuxBackend/index.mjs +1 -1
  136. package/dist/services/RunnerNamer/RunnerNamer.cjs +1 -2
  137. package/dist/services/RunnerNamer/RunnerNamer.d.cts +2 -13
  138. package/dist/services/RunnerNamer/RunnerNamer.d.mts +2 -13
  139. package/dist/services/RunnerNamer/RunnerNamer.mjs +1 -2
  140. package/dist/services/RunnerNamer/index.cjs +1 -1
  141. package/dist/services/RunnerNamer/index.d.cts +2 -2
  142. package/dist/services/RunnerNamer/index.d.mts +2 -2
  143. package/dist/services/RunnerNamer/index.mjs +1 -1
  144. package/dist/services/RunnerPaths/RunnerPaths.cjs +1 -2
  145. package/dist/services/RunnerPaths/RunnerPaths.d.cts +2 -31
  146. package/dist/services/RunnerPaths/RunnerPaths.d.mts +2 -31
  147. package/dist/services/RunnerPaths/RunnerPaths.mjs +1 -2
  148. package/dist/services/RunnerPaths/index.cjs +1 -1
  149. package/dist/services/RunnerPaths/index.d.cts +2 -2
  150. package/dist/services/RunnerPaths/index.d.mts +2 -2
  151. package/dist/services/RunnerPaths/index.mjs +1 -1
  152. package/dist/services/RunnerRegistry/RunnerRegistry.cjs +1 -2
  153. package/dist/services/RunnerRegistry/RunnerRegistry.d.cts +2 -40
  154. package/dist/services/RunnerRegistry/RunnerRegistry.d.mts +2 -40
  155. package/dist/services/RunnerRegistry/RunnerRegistry.mjs +1 -2
  156. package/dist/services/RunnerRegistry/index.cjs +1 -1
  157. package/dist/services/RunnerRegistry/index.d.cts +2 -2
  158. package/dist/services/RunnerRegistry/index.d.mts +2 -2
  159. package/dist/services/RunnerRegistry/index.mjs +1 -1
  160. package/dist/services/Spawner/NodeSpawner.cjs +1 -2
  161. package/dist/services/Spawner/NodeSpawner.d.cts +2 -10
  162. package/dist/services/Spawner/NodeSpawner.d.mts +2 -10
  163. package/dist/services/Spawner/NodeSpawner.mjs +1 -2
  164. package/dist/services/Spawner/index.cjs +1 -1
  165. package/dist/services/Spawner/index.d.cts +2 -2
  166. package/dist/services/Spawner/index.d.mts +2 -2
  167. package/dist/services/Spawner/index.mjs +1 -1
  168. package/dist/session.cjs +1 -2
  169. package/dist/session.d.cts +2 -10
  170. package/dist/session.d.mts +2 -10
  171. package/dist/session.mjs +1 -2
  172. package/dist/src/adapters/BashRunService/BashRunService.cjs +2 -0
  173. package/dist/src/adapters/BashRunService/BashRunService.cjs.map +1 -0
  174. package/dist/src/adapters/BashRunService/BashRunService.d.cts +31 -0
  175. package/dist/src/adapters/BashRunService/BashRunService.d.cts.map +1 -0
  176. package/dist/src/adapters/BashRunService/BashRunService.d.mts +31 -0
  177. package/dist/src/adapters/BashRunService/BashRunService.d.mts.map +1 -0
  178. package/dist/src/adapters/BashRunService/BashRunService.mjs +2 -0
  179. package/dist/{services → src/adapters}/BashRunService/BashRunService.mjs.map +1 -1
  180. package/dist/src/adapters/Clock/SystemClock.cjs +2 -0
  181. package/dist/src/adapters/Clock/SystemClock.cjs.map +1 -0
  182. package/dist/src/adapters/Clock/SystemClock.d.cts +10 -0
  183. package/dist/src/adapters/Clock/SystemClock.d.cts.map +1 -0
  184. package/dist/src/adapters/Clock/SystemClock.d.mts +10 -0
  185. package/dist/src/adapters/Clock/SystemClock.d.mts.map +1 -0
  186. package/dist/src/adapters/Clock/SystemClock.mjs +2 -0
  187. package/dist/src/adapters/Clock/SystemClock.mjs.map +1 -0
  188. package/dist/src/adapters/Launcher/Launcher.cjs +2 -0
  189. package/dist/src/adapters/Launcher/Launcher.cjs.map +1 -0
  190. package/dist/src/adapters/Launcher/Launcher.d.cts +21 -0
  191. package/dist/src/adapters/Launcher/Launcher.d.cts.map +1 -0
  192. package/dist/src/adapters/Launcher/Launcher.d.mts +21 -0
  193. package/dist/src/adapters/Launcher/Launcher.d.mts.map +1 -0
  194. package/dist/src/adapters/Launcher/Launcher.mjs +2 -0
  195. package/dist/src/adapters/Launcher/Launcher.mjs.map +1 -0
  196. package/dist/src/adapters/Lifeline/NodeLifeline.cjs +2 -0
  197. package/dist/src/adapters/Lifeline/NodeLifeline.cjs.map +1 -0
  198. package/dist/src/adapters/Lifeline/NodeLifeline.d.cts +19 -0
  199. package/dist/src/adapters/Lifeline/NodeLifeline.d.cts.map +1 -0
  200. package/dist/src/adapters/Lifeline/NodeLifeline.d.mts +19 -0
  201. package/dist/src/adapters/Lifeline/NodeLifeline.d.mts.map +1 -0
  202. package/dist/src/adapters/Lifeline/NodeLifeline.mjs +2 -0
  203. package/dist/src/adapters/Lifeline/NodeLifeline.mjs.map +1 -0
  204. package/dist/src/adapters/Lifeline/client.cjs +2 -0
  205. package/dist/src/adapters/Lifeline/client.cjs.map +1 -0
  206. package/dist/src/adapters/Lifeline/client.d.cts +23 -0
  207. package/dist/src/adapters/Lifeline/client.d.cts.map +1 -0
  208. package/dist/src/adapters/Lifeline/client.d.mts +23 -0
  209. package/dist/src/adapters/Lifeline/client.d.mts.map +1 -0
  210. package/dist/src/adapters/Lifeline/client.mjs +2 -0
  211. package/dist/src/adapters/Lifeline/client.mjs.map +1 -0
  212. package/dist/src/adapters/LogFile/LogFile.cjs +2 -0
  213. package/dist/src/adapters/LogFile/LogFile.cjs.map +1 -0
  214. package/dist/src/adapters/LogFile/LogFile.d.cts +11 -0
  215. package/dist/src/adapters/LogFile/LogFile.d.cts.map +1 -0
  216. package/dist/src/adapters/LogFile/LogFile.d.mts +11 -0
  217. package/dist/src/adapters/LogFile/LogFile.d.mts.map +1 -0
  218. package/dist/src/adapters/LogFile/LogFile.mjs +2 -0
  219. package/dist/src/adapters/LogFile/LogFile.mjs.map +1 -0
  220. package/dist/src/adapters/LogReader/LogReader.cjs +10 -0
  221. package/dist/src/adapters/LogReader/LogReader.cjs.map +1 -0
  222. package/dist/src/adapters/LogReader/LogReader.d.cts +13 -0
  223. package/dist/src/adapters/LogReader/LogReader.d.cts.map +1 -0
  224. package/dist/src/adapters/LogReader/LogReader.d.mts +13 -0
  225. package/dist/src/adapters/LogReader/LogReader.d.mts.map +1 -0
  226. package/dist/src/adapters/LogReader/LogReader.mjs +10 -0
  227. package/dist/src/adapters/LogReader/LogReader.mjs.map +1 -0
  228. package/dist/src/adapters/ProcessControl/NodeProcessControl.cjs +2 -0
  229. package/dist/src/adapters/ProcessControl/NodeProcessControl.cjs.map +1 -0
  230. package/dist/src/adapters/ProcessControl/NodeProcessControl.d.cts +10 -0
  231. package/dist/src/adapters/ProcessControl/NodeProcessControl.d.cts.map +1 -0
  232. package/dist/src/adapters/ProcessControl/NodeProcessControl.d.mts +10 -0
  233. package/dist/src/adapters/ProcessControl/NodeProcessControl.d.mts.map +1 -0
  234. package/dist/src/adapters/ProcessControl/NodeProcessControl.mjs +2 -0
  235. package/dist/src/adapters/ProcessControl/NodeProcessControl.mjs.map +1 -0
  236. package/dist/src/adapters/PtyHost/PtyHost.cjs +5 -0
  237. package/dist/src/adapters/PtyHost/PtyHost.cjs.map +1 -0
  238. package/dist/src/adapters/PtyHost/PtyHost.d.cts +23 -0
  239. package/dist/src/adapters/PtyHost/PtyHost.d.cts.map +1 -0
  240. package/dist/src/adapters/PtyHost/PtyHost.d.mts +23 -0
  241. package/dist/src/adapters/PtyHost/PtyHost.d.mts.map +1 -0
  242. package/dist/src/adapters/PtyHost/PtyHost.mjs +5 -0
  243. package/dist/src/adapters/PtyHost/PtyHost.mjs.map +1 -0
  244. package/dist/src/adapters/PtySpawner/NodePtySpawner.cjs +2 -0
  245. package/dist/src/adapters/PtySpawner/NodePtySpawner.cjs.map +1 -0
  246. package/dist/src/adapters/PtySpawner/NodePtySpawner.d.cts +17 -0
  247. package/dist/src/adapters/PtySpawner/NodePtySpawner.d.cts.map +1 -0
  248. package/dist/src/adapters/PtySpawner/NodePtySpawner.d.mts +17 -0
  249. package/dist/src/adapters/PtySpawner/NodePtySpawner.d.mts.map +1 -0
  250. package/dist/src/adapters/PtySpawner/NodePtySpawner.mjs +2 -0
  251. package/dist/src/adapters/PtySpawner/NodePtySpawner.mjs.map +1 -0
  252. package/dist/src/adapters/RmuxBackend/RmuxBackend.cjs +2 -0
  253. package/dist/src/adapters/RmuxBackend/RmuxBackend.cjs.map +1 -0
  254. package/dist/src/adapters/RmuxBackend/RmuxBackend.d.cts +31 -0
  255. package/dist/src/adapters/RmuxBackend/RmuxBackend.d.cts.map +1 -0
  256. package/dist/src/adapters/RmuxBackend/RmuxBackend.d.mts +31 -0
  257. package/dist/src/adapters/RmuxBackend/RmuxBackend.d.mts.map +1 -0
  258. package/dist/src/adapters/RmuxBackend/RmuxBackend.mjs +2 -0
  259. package/dist/src/adapters/RmuxBackend/RmuxBackend.mjs.map +1 -0
  260. package/dist/src/adapters/RunnerPaths.cjs +2 -0
  261. package/dist/src/adapters/RunnerPaths.cjs.map +1 -0
  262. package/dist/src/adapters/RunnerPaths.d.cts +34 -0
  263. package/dist/src/adapters/RunnerPaths.d.cts.map +1 -0
  264. package/dist/src/adapters/RunnerPaths.d.mts +34 -0
  265. package/dist/src/adapters/RunnerPaths.d.mts.map +1 -0
  266. package/dist/src/adapters/RunnerPaths.mjs +2 -0
  267. package/dist/src/adapters/RunnerPaths.mjs.map +1 -0
  268. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.cjs +2 -0
  269. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.cjs.map +1 -0
  270. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.d.cts +37 -0
  271. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.d.cts.map +1 -0
  272. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.d.mts +37 -0
  273. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.d.mts.map +1 -0
  274. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.mjs +2 -0
  275. package/dist/src/adapters/RunnerRegistry/RunnerRegistry.mjs.map +1 -0
  276. package/dist/src/adapters/Spawner/NodeSpawner.cjs +2 -0
  277. package/dist/src/adapters/Spawner/NodeSpawner.cjs.map +1 -0
  278. package/dist/src/adapters/Spawner/NodeSpawner.d.cts +9 -0
  279. package/dist/src/adapters/Spawner/NodeSpawner.d.cts.map +1 -0
  280. package/dist/src/adapters/Spawner/NodeSpawner.d.mts +9 -0
  281. package/dist/src/adapters/Spawner/NodeSpawner.d.mts.map +1 -0
  282. package/dist/src/adapters/Spawner/NodeSpawner.mjs +2 -0
  283. package/dist/src/adapters/Spawner/NodeSpawner.mjs.map +1 -0
  284. package/dist/src/adapters/pi/extension.cjs +3 -0
  285. package/dist/src/adapters/pi/extension.cjs.map +1 -0
  286. package/dist/src/adapters/pi/extension.d.cts +8 -0
  287. package/dist/src/adapters/pi/extension.d.cts.map +1 -0
  288. package/dist/src/adapters/pi/extension.d.mts +8 -0
  289. package/dist/src/adapters/pi/extension.d.mts.map +1 -0
  290. package/dist/src/adapters/pi/extension.mjs +3 -0
  291. package/dist/src/adapters/pi/extension.mjs.map +1 -0
  292. package/dist/src/commands/bash/bashTool.cjs +6 -0
  293. package/dist/src/commands/bash/bashTool.cjs.map +1 -0
  294. package/dist/src/commands/bash/bashTool.d.cts +24 -0
  295. package/dist/src/commands/bash/bashTool.d.cts.map +1 -0
  296. package/dist/src/commands/bash/bashTool.d.mts +24 -0
  297. package/dist/src/commands/bash/bashTool.d.mts.map +1 -0
  298. package/dist/src/commands/bash/bashTool.mjs +6 -0
  299. package/dist/src/commands/bash/bashTool.mjs.map +1 -0
  300. package/dist/src/commands/bash/responseEnvelope.cjs +10 -0
  301. package/dist/src/commands/bash/responseEnvelope.cjs.map +1 -0
  302. package/dist/src/commands/bash/responseEnvelope.d.cts +44 -0
  303. package/dist/src/commands/bash/responseEnvelope.d.cts.map +1 -0
  304. package/dist/src/commands/bash/responseEnvelope.d.mts +44 -0
  305. package/dist/src/commands/bash/responseEnvelope.d.mts.map +1 -0
  306. package/dist/src/commands/bash/responseEnvelope.mjs +10 -0
  307. package/dist/src/commands/bash/responseEnvelope.mjs.map +1 -0
  308. package/dist/src/commands/cli/cliApp.cjs +6 -0
  309. package/dist/src/commands/cli/cliApp.cjs.map +1 -0
  310. package/dist/src/commands/cli/cliApp.d.cts +19 -0
  311. package/dist/src/commands/cli/cliApp.d.cts.map +1 -0
  312. package/dist/src/commands/cli/cliApp.d.mts +19 -0
  313. package/dist/src/commands/cli/cliApp.d.mts.map +1 -0
  314. package/dist/src/commands/cli/cliApp.mjs +6 -0
  315. package/dist/src/commands/cli/cliApp.mjs.map +1 -0
  316. package/dist/src/container/index.cjs +2 -0
  317. package/dist/src/container/index.cjs.map +1 -0
  318. package/dist/src/container/index.d.cts +17 -0
  319. package/dist/src/container/index.d.cts.map +1 -0
  320. package/dist/src/container/index.d.mts +17 -0
  321. package/dist/src/container/index.d.mts.map +1 -0
  322. package/dist/src/container/index.mjs +2 -0
  323. package/dist/src/container/index.mjs.map +1 -0
  324. package/dist/src/container/types.d.cts +38 -0
  325. package/dist/src/container/types.d.cts.map +1 -0
  326. package/dist/src/container/types.d.mts +38 -0
  327. package/dist/src/container/types.d.mts.map +1 -0
  328. package/dist/src/schemas/bashTool.cjs +2 -0
  329. package/dist/src/schemas/bashTool.cjs.map +1 -0
  330. package/dist/src/schemas/bashTool.d.cts +25 -0
  331. package/dist/src/schemas/bashTool.d.cts.map +1 -0
  332. package/dist/src/schemas/bashTool.d.mts +25 -0
  333. package/dist/src/schemas/bashTool.d.mts.map +1 -0
  334. package/dist/src/schemas/bashTool.mjs +2 -0
  335. package/dist/src/schemas/bashTool.mjs.map +1 -0
  336. package/dist/src/schemas/runnerSpec.cjs +2 -0
  337. package/dist/src/schemas/runnerSpec.cjs.map +1 -0
  338. package/dist/{runnerSpec.mjs → src/schemas/runnerSpec.mjs} +1 -1
  339. package/dist/src/schemas/runnerSpec.mjs.map +1 -0
  340. package/dist/src/services/AnsiScrub/ansiScrub.cjs +5 -0
  341. package/dist/src/services/AnsiScrub/ansiScrub.cjs.map +1 -0
  342. package/dist/src/services/AnsiScrub/ansiScrub.d.cts +34 -0
  343. package/dist/src/services/AnsiScrub/ansiScrub.d.cts.map +1 -0
  344. package/dist/src/services/AnsiScrub/ansiScrub.d.mts +34 -0
  345. package/dist/src/services/AnsiScrub/ansiScrub.d.mts.map +1 -0
  346. package/dist/src/services/AnsiScrub/ansiScrub.mjs +5 -0
  347. package/dist/src/services/AnsiScrub/ansiScrub.mjs.map +1 -0
  348. package/dist/src/services/RunnerNamer/RunnerNamer.cjs +2 -0
  349. package/dist/src/services/RunnerNamer/RunnerNamer.cjs.map +1 -0
  350. package/dist/src/services/RunnerNamer/RunnerNamer.d.cts +11 -0
  351. package/dist/src/services/RunnerNamer/RunnerNamer.d.cts.map +1 -0
  352. package/dist/src/services/RunnerNamer/RunnerNamer.d.mts +11 -0
  353. package/dist/src/services/RunnerNamer/RunnerNamer.d.mts.map +1 -0
  354. package/dist/src/services/RunnerNamer/RunnerNamer.mjs +2 -0
  355. package/dist/src/services/RunnerNamer/RunnerNamer.mjs.map +1 -0
  356. package/dist/src/services/RunnerNamer/types.d.cts.map +1 -0
  357. package/dist/src/services/RunnerNamer/types.d.mts.map +1 -0
  358. package/dist/{services → src/services}/RunnerPaths/types.d.cts +2 -0
  359. package/dist/src/services/RunnerPaths/types.d.cts.map +1 -0
  360. package/dist/{services → src/services}/RunnerPaths/types.d.mts +2 -0
  361. package/dist/src/services/RunnerPaths/types.d.mts.map +1 -0
  362. package/dist/src/services/runs/compaction.cjs +4 -0
  363. package/dist/src/services/runs/compaction.cjs.map +1 -0
  364. package/dist/src/services/runs/compaction.d.cts +13 -0
  365. package/dist/src/services/runs/compaction.d.cts.map +1 -0
  366. package/dist/src/services/runs/compaction.d.mts +13 -0
  367. package/dist/src/services/runs/compaction.d.mts.map +1 -0
  368. package/dist/src/services/runs/compaction.mjs +4 -0
  369. package/dist/src/services/runs/compaction.mjs.map +1 -0
  370. package/dist/src/services/runs/reconcile.cjs +2 -0
  371. package/dist/src/services/runs/reconcile.cjs.map +1 -0
  372. package/dist/src/services/runs/reconcile.d.cts +32 -0
  373. package/dist/src/services/runs/reconcile.d.cts.map +1 -0
  374. package/dist/src/services/runs/reconcile.d.mts +32 -0
  375. package/dist/src/services/runs/reconcile.d.mts.map +1 -0
  376. package/dist/src/services/runs/reconcile.mjs +2 -0
  377. package/dist/src/services/runs/reconcile.mjs.map +1 -0
  378. package/dist/src/services/runs/session.cjs +2 -0
  379. package/dist/src/services/runs/session.cjs.map +1 -0
  380. package/dist/src/services/runs/session.d.cts +10 -0
  381. package/dist/src/services/runs/session.d.cts.map +1 -0
  382. package/dist/src/services/runs/session.d.mts +10 -0
  383. package/dist/src/services/runs/session.d.mts.map +1 -0
  384. package/dist/src/services/runs/session.mjs +2 -0
  385. package/dist/src/services/runs/session.mjs.map +1 -0
  386. package/dist/src/tui/bashRender.cjs +5 -0
  387. package/dist/src/tui/bashRender.cjs.map +1 -0
  388. package/dist/src/tui/bashRender.d.cts +51 -0
  389. package/dist/src/tui/bashRender.d.cts.map +1 -0
  390. package/dist/src/tui/bashRender.d.mts +51 -0
  391. package/dist/src/tui/bashRender.d.mts.map +1 -0
  392. package/dist/src/tui/bashRender.mjs +5 -0
  393. package/dist/src/tui/bashRender.mjs.map +1 -0
  394. package/dist/src/tui/format.cjs +2 -0
  395. package/dist/{tui → src/tui}/format.cjs.map +1 -1
  396. package/dist/src/tui/format.d.cts +24 -0
  397. package/dist/src/tui/format.d.cts.map +1 -0
  398. package/dist/src/tui/format.d.mts +24 -0
  399. package/dist/src/tui/format.d.mts.map +1 -0
  400. package/dist/src/tui/format.mjs +2 -0
  401. package/dist/{tui → src/tui}/format.mjs.map +1 -1
  402. package/dist/src/tui/runnerSpace.cjs +6 -0
  403. package/dist/src/tui/runnerSpace.cjs.map +1 -0
  404. package/dist/src/tui/runnerSpace.d.cts +50 -0
  405. package/dist/src/tui/runnerSpace.d.cts.map +1 -0
  406. package/dist/src/tui/runnerSpace.d.mts +50 -0
  407. package/dist/src/tui/runnerSpace.d.mts.map +1 -0
  408. package/dist/src/tui/runnerSpace.mjs +6 -0
  409. package/dist/src/tui/runnerSpace.mjs.map +1 -0
  410. package/dist/{services/BashRunService/types.d.cts → src/types/bashRunService.d.cts} +2 -2
  411. package/dist/{services/BashRunService/types.d.cts.map → src/types/bashRunService.d.cts.map} +1 -1
  412. package/dist/{services/BashRunService/types.d.mts → src/types/bashRunService.d.mts} +2 -2
  413. package/dist/{services/BashRunService/types.d.mts.map → src/types/bashRunService.d.mts.map} +1 -1
  414. package/dist/{services/Clock/types.d.cts → src/types/clock.d.cts} +2 -2
  415. package/dist/src/types/clock.d.cts.map +1 -0
  416. package/dist/{services/Clock/types.d.mts → src/types/clock.d.mts} +2 -2
  417. package/dist/src/types/clock.d.mts.map +1 -0
  418. package/dist/src/types/config.cjs +2 -0
  419. package/dist/src/types/config.cjs.map +1 -0
  420. package/dist/src/types/config.d.cts +32 -0
  421. package/dist/src/types/config.d.cts.map +1 -0
  422. package/dist/src/types/config.d.mts +32 -0
  423. package/dist/src/types/config.d.mts.map +1 -0
  424. package/dist/src/types/config.mjs +2 -0
  425. package/dist/src/types/config.mjs.map +1 -0
  426. package/dist/{services/Launcher/types.d.cts → src/types/launcher.d.cts} +3 -4
  427. package/dist/src/types/launcher.d.cts.map +1 -0
  428. package/dist/{services/Launcher/types.d.mts → src/types/launcher.d.mts} +3 -4
  429. package/dist/src/types/launcher.d.mts.map +1 -0
  430. package/dist/{services/Lifeline/types.d.cts → src/types/lifeline.d.cts} +2 -2
  431. package/dist/src/types/lifeline.d.cts.map +1 -0
  432. package/dist/{services/Lifeline/types.d.mts → src/types/lifeline.d.mts} +2 -2
  433. package/dist/src/types/lifeline.d.mts.map +1 -0
  434. package/dist/{services/LogFile/types.d.cts → src/types/logFile.d.cts} +2 -2
  435. package/dist/src/types/logFile.d.cts.map +1 -0
  436. package/dist/{services/LogFile/types.d.mts → src/types/logFile.d.mts} +2 -2
  437. package/dist/src/types/logFile.d.mts.map +1 -0
  438. package/dist/{services/LogReader/types.d.cts → src/types/logReader.d.cts} +2 -2
  439. package/dist/src/types/logReader.d.cts.map +1 -0
  440. package/dist/{services/LogReader/types.d.mts → src/types/logReader.d.mts} +2 -2
  441. package/dist/src/types/logReader.d.mts.map +1 -0
  442. package/dist/{services/ProcessControl/types.d.cts → src/types/processControl.d.cts} +2 -2
  443. package/dist/src/types/processControl.d.cts.map +1 -0
  444. package/dist/{services/ProcessControl/types.d.mts → src/types/processControl.d.mts} +2 -2
  445. package/dist/src/types/processControl.d.mts.map +1 -0
  446. package/dist/{services/PtyHost/types.d.cts → src/types/ptyHost.d.cts} +3 -4
  447. package/dist/src/types/ptyHost.d.cts.map +1 -0
  448. package/dist/{services/PtyHost/types.d.mts → src/types/ptyHost.d.mts} +3 -4
  449. package/dist/src/types/ptyHost.d.mts.map +1 -0
  450. package/dist/{services/PtySpawner/types.d.cts → src/types/ptySpawner.d.cts} +2 -2
  451. package/dist/src/types/ptySpawner.d.cts.map +1 -0
  452. package/dist/{services/PtySpawner/types.d.mts → src/types/ptySpawner.d.mts} +2 -2
  453. package/dist/src/types/ptySpawner.d.mts.map +1 -0
  454. package/dist/{services/RmuxBackend/types.d.cts → src/types/rmuxBackend.d.cts} +5 -8
  455. package/dist/src/types/rmuxBackend.d.cts.map +1 -0
  456. package/dist/{services/RmuxBackend/types.d.mts → src/types/rmuxBackend.d.mts} +5 -8
  457. package/dist/src/types/rmuxBackend.d.mts.map +1 -0
  458. package/dist/{services/RunnerRegistry/types.d.cts → src/types/runnerRegistry.d.cts} +2 -2
  459. package/dist/{services/RunnerRegistry/types.d.cts.map → src/types/runnerRegistry.d.cts.map} +1 -1
  460. package/dist/{services/RunnerRegistry/types.d.mts → src/types/runnerRegistry.d.mts} +2 -2
  461. package/dist/{services/RunnerRegistry/types.d.mts.map → src/types/runnerRegistry.d.mts.map} +1 -1
  462. package/dist/{services/Spawner/types.d.cts → src/types/spawner.d.cts} +2 -2
  463. package/dist/src/types/spawner.d.cts.map +1 -0
  464. package/dist/{services/Spawner/types.d.mts → src/types/spawner.d.mts} +2 -2
  465. package/dist/src/types/spawner.d.mts.map +1 -0
  466. package/dist/tool/bashTool.cjs +1 -7
  467. package/dist/tool/bashTool.d.cts +2 -25
  468. package/dist/tool/bashTool.d.mts +2 -25
  469. package/dist/tool/bashTool.mjs +1 -7
  470. package/dist/tool/responseEnvelope.cjs +1 -10
  471. package/dist/tool/responseEnvelope.d.cts +2 -45
  472. package/dist/tool/responseEnvelope.d.mts +2 -45
  473. package/dist/tool/responseEnvelope.mjs +1 -10
  474. package/dist/tool/schema.cjs +1 -2
  475. package/dist/tool/schema.d.cts +2 -25
  476. package/dist/tool/schema.d.mts +2 -25
  477. package/dist/tool/schema.mjs +1 -2
  478. package/dist/tui/bashRender.cjs +1 -8
  479. package/dist/tui/bashRender.d.cts +2 -51
  480. package/dist/tui/bashRender.d.mts +2 -51
  481. package/dist/tui/bashRender.mjs +1 -8
  482. package/dist/tui/format.cjs +1 -2
  483. package/dist/tui/format.d.cts +2 -25
  484. package/dist/tui/format.d.mts +2 -25
  485. package/dist/tui/format.mjs +1 -2
  486. package/dist/tui/runnerSpace.cjs +1 -6
  487. package/dist/tui/runnerSpace.d.cts +2 -52
  488. package/dist/tui/runnerSpace.d.mts +2 -52
  489. package/dist/tui/runnerSpace.mjs +1 -6
  490. package/dist/types.cjs +0 -2
  491. package/dist/types.d.cts +2 -28
  492. package/dist/types.d.mts +2 -28
  493. package/dist/types.mjs +1 -2
  494. package/llms.txt +9 -0
  495. package/package.json +38 -32
  496. package/src/prompts/doompi-use-runner/SKILL.md +38 -0
  497. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs +0 -1
  498. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs +0 -1
  499. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.cjs +0 -1
  500. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.mjs +0 -1
  501. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.cjs +0 -1
  502. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.mjs +0 -1
  503. package/dist/cli/cliApp.cjs.map +0 -1
  504. package/dist/cli/cliApp.d.cts.map +0 -1
  505. package/dist/cli/cliApp.d.mts.map +0 -1
  506. package/dist/cli/cliApp.mjs.map +0 -1
  507. package/dist/compaction.cjs.map +0 -1
  508. package/dist/compaction.d.cts.map +0 -1
  509. package/dist/compaction.d.mts.map +0 -1
  510. package/dist/compaction.mjs.map +0 -1
  511. package/dist/config.cjs.map +0 -1
  512. package/dist/config.d.cts.map +0 -1
  513. package/dist/config.d.mts.map +0 -1
  514. package/dist/config.mjs.map +0 -1
  515. package/dist/container/index.cjs.map +0 -1
  516. package/dist/container/index.d.cts.map +0 -1
  517. package/dist/container/index.d.mts.map +0 -1
  518. package/dist/container/index.mjs.map +0 -1
  519. package/dist/extension.cjs +0 -3
  520. package/dist/extension.cjs.map +0 -1
  521. package/dist/extension.d.cts +0 -10
  522. package/dist/extension.d.cts.map +0 -1
  523. package/dist/extension.d.mts +0 -10
  524. package/dist/extension.d.mts.map +0 -1
  525. package/dist/extension.mjs +0 -3
  526. package/dist/extension.mjs.map +0 -1
  527. package/dist/extensions/pi.cjs.map +0 -1
  528. package/dist/extensions/pi.mjs.map +0 -1
  529. package/dist/ptyProvider.cjs +0 -2
  530. package/dist/ptyProvider.cjs.map +0 -1
  531. package/dist/ptyProvider.d.cts +0 -13
  532. package/dist/ptyProvider.d.cts.map +0 -1
  533. package/dist/ptyProvider.d.mts +0 -13
  534. package/dist/ptyProvider.d.mts.map +0 -1
  535. package/dist/ptyProvider.mjs +0 -2
  536. package/dist/ptyProvider.mjs.map +0 -1
  537. package/dist/reconcile.cjs.map +0 -1
  538. package/dist/reconcile.d.cts.map +0 -1
  539. package/dist/reconcile.d.mts.map +0 -1
  540. package/dist/reconcile.mjs.map +0 -1
  541. package/dist/runnerSpec.cjs +0 -2
  542. package/dist/runnerSpec.cjs.map +0 -1
  543. package/dist/runnerSpec.d.cts +0 -50
  544. package/dist/runnerSpec.d.cts.map +0 -1
  545. package/dist/runnerSpec.d.mts +0 -50
  546. package/dist/runnerSpec.d.mts.map +0 -1
  547. package/dist/runnerSpec.mjs.map +0 -1
  548. package/dist/services/AnsiScrub/ansiScrub.cjs.map +0 -1
  549. package/dist/services/AnsiScrub/ansiScrub.d.cts.map +0 -1
  550. package/dist/services/AnsiScrub/ansiScrub.d.mts.map +0 -1
  551. package/dist/services/AnsiScrub/ansiScrub.mjs.map +0 -1
  552. package/dist/services/BashRunService/BashRunService.cjs.map +0 -1
  553. package/dist/services/BashRunService/BashRunService.d.cts.map +0 -1
  554. package/dist/services/BashRunService/BashRunService.d.mts.map +0 -1
  555. package/dist/services/Clock/SystemClock.cjs.map +0 -1
  556. package/dist/services/Clock/SystemClock.d.cts.map +0 -1
  557. package/dist/services/Clock/SystemClock.d.mts.map +0 -1
  558. package/dist/services/Clock/SystemClock.mjs.map +0 -1
  559. package/dist/services/Clock/types.d.cts.map +0 -1
  560. package/dist/services/Clock/types.d.mts.map +0 -1
  561. package/dist/services/Launcher/Launcher.cjs.map +0 -1
  562. package/dist/services/Launcher/Launcher.d.cts.map +0 -1
  563. package/dist/services/Launcher/Launcher.d.mts.map +0 -1
  564. package/dist/services/Launcher/Launcher.mjs.map +0 -1
  565. package/dist/services/Launcher/types.d.cts.map +0 -1
  566. package/dist/services/Launcher/types.d.mts.map +0 -1
  567. package/dist/services/Lifeline/NodeLifeline.cjs.map +0 -1
  568. package/dist/services/Lifeline/NodeLifeline.d.cts.map +0 -1
  569. package/dist/services/Lifeline/NodeLifeline.d.mts.map +0 -1
  570. package/dist/services/Lifeline/NodeLifeline.mjs.map +0 -1
  571. package/dist/services/Lifeline/client.cjs.map +0 -1
  572. package/dist/services/Lifeline/client.d.cts.map +0 -1
  573. package/dist/services/Lifeline/client.d.mts.map +0 -1
  574. package/dist/services/Lifeline/client.mjs.map +0 -1
  575. package/dist/services/Lifeline/types.d.cts.map +0 -1
  576. package/dist/services/Lifeline/types.d.mts.map +0 -1
  577. package/dist/services/LogFile/LogFile.cjs.map +0 -1
  578. package/dist/services/LogFile/LogFile.d.cts.map +0 -1
  579. package/dist/services/LogFile/LogFile.d.mts.map +0 -1
  580. package/dist/services/LogFile/LogFile.mjs.map +0 -1
  581. package/dist/services/LogFile/types.d.cts.map +0 -1
  582. package/dist/services/LogFile/types.d.mts.map +0 -1
  583. package/dist/services/LogReader/LogReader.cjs.map +0 -1
  584. package/dist/services/LogReader/LogReader.d.cts.map +0 -1
  585. package/dist/services/LogReader/LogReader.d.mts.map +0 -1
  586. package/dist/services/LogReader/LogReader.mjs.map +0 -1
  587. package/dist/services/LogReader/types.d.cts.map +0 -1
  588. package/dist/services/LogReader/types.d.mts.map +0 -1
  589. package/dist/services/ProcessControl/NodeProcessControl.cjs.map +0 -1
  590. package/dist/services/ProcessControl/NodeProcessControl.d.cts.map +0 -1
  591. package/dist/services/ProcessControl/NodeProcessControl.d.mts.map +0 -1
  592. package/dist/services/ProcessControl/NodeProcessControl.mjs.map +0 -1
  593. package/dist/services/ProcessControl/types.d.cts.map +0 -1
  594. package/dist/services/ProcessControl/types.d.mts.map +0 -1
  595. package/dist/services/PtyHost/PtyHost.cjs.map +0 -1
  596. package/dist/services/PtyHost/PtyHost.d.cts.map +0 -1
  597. package/dist/services/PtyHost/PtyHost.d.mts.map +0 -1
  598. package/dist/services/PtyHost/PtyHost.mjs.map +0 -1
  599. package/dist/services/PtyHost/types.d.cts.map +0 -1
  600. package/dist/services/PtyHost/types.d.mts.map +0 -1
  601. package/dist/services/PtySpawner/NodePtySpawner.cjs.map +0 -1
  602. package/dist/services/PtySpawner/NodePtySpawner.d.cts.map +0 -1
  603. package/dist/services/PtySpawner/NodePtySpawner.d.mts.map +0 -1
  604. package/dist/services/PtySpawner/NodePtySpawner.mjs.map +0 -1
  605. package/dist/services/PtySpawner/types.d.cts.map +0 -1
  606. package/dist/services/PtySpawner/types.d.mts.map +0 -1
  607. package/dist/services/RmuxBackend/RmuxBackend.cjs.map +0 -1
  608. package/dist/services/RmuxBackend/RmuxBackend.d.cts.map +0 -1
  609. package/dist/services/RmuxBackend/RmuxBackend.d.mts.map +0 -1
  610. package/dist/services/RmuxBackend/RmuxBackend.mjs.map +0 -1
  611. package/dist/services/RmuxBackend/types.d.cts.map +0 -1
  612. package/dist/services/RmuxBackend/types.d.mts.map +0 -1
  613. package/dist/services/RunnerNamer/RunnerNamer.cjs.map +0 -1
  614. package/dist/services/RunnerNamer/RunnerNamer.d.cts.map +0 -1
  615. package/dist/services/RunnerNamer/RunnerNamer.d.mts.map +0 -1
  616. package/dist/services/RunnerNamer/RunnerNamer.mjs.map +0 -1
  617. package/dist/services/RunnerNamer/types.d.cts.map +0 -1
  618. package/dist/services/RunnerNamer/types.d.mts.map +0 -1
  619. package/dist/services/RunnerPaths/RunnerPaths.cjs.map +0 -1
  620. package/dist/services/RunnerPaths/RunnerPaths.d.cts.map +0 -1
  621. package/dist/services/RunnerPaths/RunnerPaths.d.mts.map +0 -1
  622. package/dist/services/RunnerPaths/RunnerPaths.mjs.map +0 -1
  623. package/dist/services/RunnerPaths/types.d.cts.map +0 -1
  624. package/dist/services/RunnerPaths/types.d.mts.map +0 -1
  625. package/dist/services/RunnerRegistry/RunnerRegistry.cjs.map +0 -1
  626. package/dist/services/RunnerRegistry/RunnerRegistry.d.cts.map +0 -1
  627. package/dist/services/RunnerRegistry/RunnerRegistry.d.mts.map +0 -1
  628. package/dist/services/RunnerRegistry/RunnerRegistry.mjs.map +0 -1
  629. package/dist/services/Spawner/NodeSpawner.cjs.map +0 -1
  630. package/dist/services/Spawner/NodeSpawner.d.cts.map +0 -1
  631. package/dist/services/Spawner/NodeSpawner.d.mts.map +0 -1
  632. package/dist/services/Spawner/NodeSpawner.mjs.map +0 -1
  633. package/dist/services/Spawner/types.d.cts.map +0 -1
  634. package/dist/services/Spawner/types.d.mts.map +0 -1
  635. package/dist/session.cjs.map +0 -1
  636. package/dist/session.d.cts.map +0 -1
  637. package/dist/session.d.mts.map +0 -1
  638. package/dist/session.mjs.map +0 -1
  639. package/dist/tool/bashTool.cjs.map +0 -1
  640. package/dist/tool/bashTool.d.cts.map +0 -1
  641. package/dist/tool/bashTool.d.mts.map +0 -1
  642. package/dist/tool/bashTool.mjs.map +0 -1
  643. package/dist/tool/responseEnvelope.cjs.map +0 -1
  644. package/dist/tool/responseEnvelope.d.cts.map +0 -1
  645. package/dist/tool/responseEnvelope.d.mts.map +0 -1
  646. package/dist/tool/responseEnvelope.mjs.map +0 -1
  647. package/dist/tool/schema.cjs.map +0 -1
  648. package/dist/tool/schema.d.cts.map +0 -1
  649. package/dist/tool/schema.d.mts.map +0 -1
  650. package/dist/tool/schema.mjs.map +0 -1
  651. package/dist/tui/bashRender.cjs.map +0 -1
  652. package/dist/tui/bashRender.d.cts.map +0 -1
  653. package/dist/tui/bashRender.d.mts.map +0 -1
  654. package/dist/tui/bashRender.mjs.map +0 -1
  655. package/dist/tui/format.d.cts.map +0 -1
  656. package/dist/tui/format.d.mts.map +0 -1
  657. package/dist/tui/runnerSpace.cjs.map +0 -1
  658. package/dist/tui/runnerSpace.d.cts.map +0 -1
  659. package/dist/tui/runnerSpace.d.mts.map +0 -1
  660. package/dist/tui/runnerSpace.mjs.map +0 -1
  661. package/dist/types.cjs.map +0 -1
  662. package/dist/types.d.cts.map +0 -1
  663. package/dist/types.d.mts.map +0 -1
  664. package/dist/types.mjs.map +0 -1
  665. /package/dist/{services → src/services}/RunnerNamer/types.d.cts +0 -0
  666. /package/dist/{services → src/services}/RunnerNamer/types.d.mts +0 -0
package/README.md CHANGED
@@ -1,46 +1,125 @@
1
1
  # @agimon-ai/doompi-runner
2
2
 
3
- Pi bash tool replacement with background process supervision.
3
+ Supervised shell execution, background process control, durable logs, and Runner Space for Pi.
4
4
 
5
- Replaces the built-in bash tool with a supervised one. Long commands are backgrounded
6
- instead of blocking, a process tool manages them, and detached runs reconcile themselves
7
- after the context is rewritten.
5
+ Part of the [DoomPi distribution](https://www.npmjs.com/package/@agimon-ai/doompi).
8
6
 
9
- Part of [Doompi](https://www.npmjs.com/package/@agimon-ai/doompi), a coding agent that loads
10
- only the skills and tools you name. This package is composed by Doompi and is not usually
11
- installed on its own.
7
+ Runner replaces Pi's built-in `bash` tool only in sessions that load it. Short commands return
8
+ inline; long commands can be promoted to a background runner instead of blocking the agent.
9
+
10
+ > **Alpha:** tool and process contracts may change between releases.
11
+
12
+ ## Requirements
13
+
14
+ - Node.js 22.19.0 or newer
15
+ - Pi 0.84.2 and Pi TUI 0.84.2
16
+ - `/bin/bash`
17
+ - macOS or Linux on arm64 or x64 for bundled RMUX support
18
+
19
+ Linux native loading also depends on a compatible system loader and libc. Runner uses a `node-pty`
20
+ fallback when RMUX is unavailable.
12
21
 
13
22
  ## Install
14
23
 
24
+ DoomPi includes Runner in every composition, so no layer declaration is required. For direct Pi
25
+ installation:
26
+
27
+ ```bash
28
+ pi install npm:@agimon-ai/doompi-runner
29
+ ```
30
+
31
+ Pi discovers Runner's sole extension factory from `package.json.pi.extensions`. The extension joins
32
+ the runner-scoped Cordis host and releases its plugin resources and host lease when the Pi session
33
+ shuts down.
34
+
35
+ ## Use the `bash` tool
36
+
37
+ ```json
38
+ {
39
+ "command": "pnpm test",
40
+ "timeout": 60
41
+ }
42
+ ```
43
+
44
+ Commands crossing the promotion threshold move to a supervised runner. The default threshold is 60
45
+ seconds. Set `background: true` to detach immediately, or `interactive: true` only when a command
46
+ needs terminal input.
47
+
48
+ Runner requires `PI_SESSION_ID` for session ownership. Processes, controls, and logs remain
49
+ addressable after transcript compaction because their identity is outside model context.
50
+
51
+ ## Inspect and control runs
52
+
53
+ Use `/runners` or `SPC r r` in the TUI. The `doom-runner` CLI supports:
54
+
15
55
  ```bash
16
- npm install @agimon-ai/doompi-runner
56
+ doom-runner list
57
+ doom-runner status <runner-id>
58
+ doom-runner logs <runner-id>
59
+ doom-runner input <runner-id> --text "y" --enter
60
+ doom-runner stop <runner-id>
61
+ doom-runner stop-all
17
62
  ```
18
63
 
19
- ## How it loads
64
+ The `input` command requires a running interactive process backed by RMUX.
65
+
66
+ Stop runs that are no longer required.
20
67
 
21
- Name it in a layer in `.doom/modes.yaml`, then add that layer to a major mode:
68
+ ## Storage and limits
22
69
 
23
- ```yaml
24
- layers:
25
- runner:
26
- packages: ['@agimon-ai/doompi-runner/extensions/pi']
70
+ By default, session-scoped logs and registry data live under:
27
71
 
28
- majorMode:
29
- dev: [runner]
72
+ ```text
73
+ ~/.pi/agent/doom-runner/<session>/
30
74
  ```
31
75
 
32
- ## Leader
76
+ Logs rotate at 5 MiB by default and are eligible for cleanup after seven days. Limits and the
77
+ promotion threshold can be configured through Runner's exported configuration helpers and
78
+ environment-backed runtime settings.
79
+
80
+ Commands inherit the DoomPi process environment and the operating system user's privileges. Logs
81
+ may contain prompts, source, command output, credentials, or other secrets; restrict access and
82
+ retention accordingly.
83
+
84
+ ## Native artifacts
85
+
86
+ Runner selects one optional dependency automatically:
33
87
 
34
- `SPC r r` opens background processes, once the extension is loaded.
88
+ | Host | Package |
89
+ | ----------- | -------------------------------------------- |
90
+ | macOS arm64 | `@agimon-ai/doompi-runner-rmux-darwin-arm64` |
91
+ | macOS x64 | `@agimon-ai/doompi-runner-rmux-darwin-x64` |
92
+ | Linux arm64 | `@agimon-ai/doompi-runner-rmux-linux-arm64` |
93
+ | Linux x64 | `@agimon-ai/doompi-runner-rmux-linux-x64` |
35
94
 
36
- ## Notes
95
+ Do not install these platform packages directly. They contain native RMUX executables and export
96
+ only package metadata.
37
97
 
38
- Ships a prebuilt `rmux` binary per platform through the `@agimon-ai/doompi-runner-rmux-*`
39
- optional dependencies.
98
+ ## Public API
40
99
 
41
- ## Entry points
100
+ ```ts
101
+ import {
102
+ createRunnerContainer,
103
+ DEFAULT_BG_THRESHOLD_MS,
104
+ DEFAULT_LOG_MAX_BYTES,
105
+ DEFAULT_LOG_TTL_MS,
106
+ RmuxBackend,
107
+ } from '@agimon-ai/doompi-runner';
108
+ ```
109
+
110
+ Declared subpaths expose process supervision, configuration, tools, response envelopes, and TUI
111
+ integration for host authors.
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ pnpm build
117
+ pnpm typecheck
118
+ pnpm test
119
+ pnpm lint
120
+ ```
42
121
 
43
- 51 subpaths are declared in the `exports` field of `package.json`.
122
+ Maintained by [Agimon](https://agimon.ai/about).
44
123
 
45
124
  ## License
46
125
 
package/dist/bin/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../types.cjs"),t=require("../container/index.cjs"),n=require("../cli/cliApp.cjs");let r=require("node:url"),i=require("@agimon-ai/doompi-telemetry");async function a(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(t));return Buffer.concat(e).toString(`utf8`)}async function o(r=process.argv.slice(2)){let o=Date.now(),s=(0,i.createDoomTelemetry)({serviceName:`doom-runner-cli`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),c=t.createRunnerContainer(),l=c.get(e.TYPES.RunnerRegistry),u=0,d=0;try{let t=await n.runCli(r,{registry:l,launcher:c.get(e.TYPES.Launcher),rmuxBackend:c.get(e.TYPES.RmuxBackend),logReader:c.get(e.TYPES.LogReader),env:process.env,stdout:e=>{let t=e.endsWith(`
3
- `)?e:`${e}\n`;u+=Buffer.byteLength(t,`utf8`),process.stdout.write(t)},stderr:e=>{let t=e.endsWith(`
4
- `)?e:`${e}\n`;d+=Buffer.byteLength(t,`utf8`),process.stderr.write(t)},readStdin:a});return await s.recordEvent(`doom_runner.cli_finished`,{outcome:t===0?`completed`:`failed`,"runner.exit_code":t,duration_ms:Date.now()-o,"runner.argument_count":r.length,"runner.stdout_bytes":u,"runner.stderr_bytes":d}),t}catch(e){throw await s.recordError(`doom_runner.cli_failed`,e,{duration_ms:Date.now()-o,"runner.argument_count":r.length,"runner.stdout_bytes":u,"runner.stderr_bytes":d}),e}finally{l.close(),await s.shutdown()}}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,r.pathToFileURL)(process.argv[1]).href&&o().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=o;
2
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../src/container/index.cjs"),t=require("../src/commands/cli/cliApp.cjs");let n=require("node:url"),r=require("@agimon-ai/doompi-telemetry");async function i(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(t));return Buffer.concat(e).toString(`utf8`)}async function a(n=process.argv.slice(2)){let a=Date.now(),o=(0,r.createDoomTelemetry)({serviceName:`doom-runner-cli`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),s=e.createRunnerContainer(),c=s.runnerRegistry,l=0,u=0;try{let e=await t.runCli(n,{registry:c,launcher:s.launcher,rmuxBackend:s.rmuxBackend,logReader:s.logReader,env:process.env,stdout:e=>{let t=e.endsWith(`
3
+ `)?e:`${e}\n`;l+=Buffer.byteLength(t,`utf8`),process.stdout.write(t)},stderr:e=>{let t=e.endsWith(`
4
+ `)?e:`${e}\n`;u+=Buffer.byteLength(t,`utf8`),process.stderr.write(t)},readStdin:i});return await o.recordEvent(`doom_runner.cli_finished`,{outcome:e===0?`completed`:`failed`,"runner.exit_code":e,duration_ms:Date.now()-a,"runner.argument_count":n.length,"runner.stdout_bytes":l,"runner.stderr_bytes":u}),e}catch(e){throw await o.recordError(`doom_runner.cli_failed`,e,{duration_ms:Date.now()-a,"runner.argument_count":n.length,"runner.stdout_bytes":l,"runner.stderr_bytes":u}),e}finally{c.close(),await o.shutdown()}}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,n.pathToFileURL)(process.argv[1]).href&&a().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=a;
5
5
  //# sourceMappingURL=cli.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["createDoomTelemetry","createRunnerContainer","TYPES","runCli","pathToFileURL"],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { createRunnerContainer } from '../container/index.ts';\nimport { pathToFileURL } from 'node:url';\nimport type { ILauncher } from '../services/Launcher/index.ts';\nimport type { ILogReader } from '../services/LogReader/index.ts';\nimport type { IRunnerRegistry } from '../services/RunnerRegistry/index.ts';\nimport type { IRmuxBackend } from '../services/RmuxBackend/index.ts';\nimport { TYPES } from '../types.ts';\nimport { runCli } from '../cli/cliApp.ts';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerContainer();\n const registry = container.get<IRunnerRegistry>(TYPES.RunnerRegistry);\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.get<ILauncher>(TYPES.Launcher),\n rmuxBackend: container.get<IRmuxBackend>(TYPES.RmuxBackend),\n logReader: container.get<ILogReader>(TYPES.LogReader),\n env: process.env,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";yOAYA,eAAe,GAA6B,CAC1C,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAAO,EAAO,KAAK,OAAO,SAAS,CAAK,EAAI,EAAQ,OAAO,KAAK,CAAK,CAAC,EACxG,OAAO,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAC9C,CAEA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,GAAA,EAAYA,EAAAA,oBAAAA,CAAoB,CACpC,YAAa,kBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,EAAYC,EAAAA,sBAAsB,EAClC,EAAW,EAAU,IAAqBC,EAAAA,MAAM,cAAc,EAChE,EAAc,EACd,EAAc,EAClB,GAAI,CACF,IAAM,EAAW,MAAMC,EAAAA,OAAO,EAAM,CAClC,WACA,SAAU,EAAU,IAAeD,EAAAA,MAAM,QAAQ,EACjD,YAAa,EAAU,IAAkBA,EAAAA,MAAM,WAAW,EAC1D,UAAW,EAAU,IAAgBA,EAAAA,MAAM,SAAS,EACpD,IAAK,QAAQ,IACb,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,WACF,CAAC,EASD,OARA,MAAM,EAAU,YAAY,2BAA4B,CACtD,QAAS,IAAa,EAAI,YAAc,SACxC,mBAAoB,EACpB,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACM,CACT,OAAS,EAAO,CAOd,MANA,MAAM,EAAU,YAAY,yBAA0B,EAAO,CAC3D,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACK,CACR,QAAU,CACR,EAAS,MAAM,EACf,MAAM,EAAU,SAAS,CAC3B,CACF,CAEI,QAAQ,KAAK,IAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,QAAA,EAA0BE,EAAAA,cAAAA,CAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
1
+ {"version":3,"file":"cli.cjs","names":["createDoomTelemetry","createRunnerContainer","runCli","pathToFileURL"],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { runCli } from '../commands/cli/cliApp.ts';\nimport { createRunnerContainer } from '../container/index.ts';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerContainer();\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: process.env,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";gOAOA,eAAe,GAA6B,CAC1C,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAAO,EAAO,KAAK,OAAO,SAAS,CAAK,EAAI,EAAQ,OAAO,KAAK,CAAK,CAAC,EACxG,OAAO,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAC9C,CAEA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,GAAA,EAAYA,EAAAA,oBAAAA,CAAoB,CACpC,YAAa,kBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,EAAYC,EAAAA,sBAAsB,EAClC,EAAW,EAAU,eACvB,EAAc,EACd,EAAc,EAClB,GAAI,CACF,IAAM,EAAW,MAAMC,EAAAA,OAAO,EAAM,CAClC,WACA,SAAU,EAAU,SACpB,YAAa,EAAU,YACvB,UAAW,EAAU,UACrB,IAAK,QAAQ,IACb,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,WACF,CAAC,EASD,OARA,MAAM,EAAU,YAAY,2BAA4B,CACtD,QAAS,IAAa,EAAI,YAAc,SACxC,mBAAoB,EACpB,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACM,CACT,OAAS,EAAO,CAOd,MANA,MAAM,EAAU,YAAY,yBAA0B,EAAO,CAC3D,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACK,CACR,QAAU,CACR,EAAS,MAAM,EACf,MAAM,EAAU,SAAS,CAC3B,CACF,CAEI,QAAQ,KAAK,IAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,QAAA,EAA0BC,EAAAA,cAAAA,CAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.cts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";iBAkBsB,KAAK,2BAAkD"}
1
+ {"version":3,"file":"cli.d.cts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";iBAasB,KAAK,2BAAkD"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.mts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";iBAkBsB,KAAK,2BAAkD"}
1
+ {"version":3,"file":"cli.d.mts","names":[],"sources":["../../src/bin/cli.ts"],"mappings":";iBAasB,KAAK,2BAAkD"}
package/dist/bin/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{TYPES as e}from"../types.mjs";import{createRunnerContainer as t}from"../container/index.mjs";import{runCli as n}from"../cli/cliApp.mjs";import{pathToFileURL as r}from"node:url";import{createDoomTelemetry as i}from"@agimon-ai/doompi-telemetry";async function a(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(t));return Buffer.concat(e).toString(`utf8`)}async function o(r=process.argv.slice(2)){let o=Date.now(),s=i({serviceName:`doom-runner-cli`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),c=t(),l=c.get(e.RunnerRegistry),u=0,d=0;try{let t=await n(r,{registry:l,launcher:c.get(e.Launcher),rmuxBackend:c.get(e.RmuxBackend),logReader:c.get(e.LogReader),env:process.env,stdout:e=>{let t=e.endsWith(`
3
- `)?e:`${e}\n`;u+=Buffer.byteLength(t,`utf8`),process.stdout.write(t)},stderr:e=>{let t=e.endsWith(`
4
- `)?e:`${e}\n`;d+=Buffer.byteLength(t,`utf8`),process.stderr.write(t)},readStdin:a});return await s.recordEvent(`doom_runner.cli_finished`,{outcome:t===0?`completed`:`failed`,"runner.exit_code":t,duration_ms:Date.now()-o,"runner.argument_count":r.length,"runner.stdout_bytes":u,"runner.stderr_bytes":d}),t}catch(e){throw await s.recordError(`doom_runner.cli_failed`,e,{duration_ms:Date.now()-o,"runner.argument_count":r.length,"runner.stdout_bytes":u,"runner.stderr_bytes":d}),e}finally{l.close(),await s.shutdown()}}process.argv[1]&&import.meta.url===r(process.argv[1]).href&&o().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{o as main};
2
+ import{createRunnerContainer as e}from"../src/container/index.mjs";import{runCli as t}from"../src/commands/cli/cliApp.mjs";import{pathToFileURL as n}from"node:url";import{createDoomTelemetry as r}from"@agimon-ai/doompi-telemetry";async function i(){let e=[];for await(let t of process.stdin)e.push(Buffer.isBuffer(t)?t:Buffer.from(t));return Buffer.concat(e).toString(`utf8`)}async function a(n=process.argv.slice(2)){let a=Date.now(),o=r({serviceName:`doom-runner-cli`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),s=e(),c=s.runnerRegistry,l=0,u=0;try{let e=await t(n,{registry:c,launcher:s.launcher,rmuxBackend:s.rmuxBackend,logReader:s.logReader,env:process.env,stdout:e=>{let t=e.endsWith(`
3
+ `)?e:`${e}\n`;l+=Buffer.byteLength(t,`utf8`),process.stdout.write(t)},stderr:e=>{let t=e.endsWith(`
4
+ `)?e:`${e}\n`;u+=Buffer.byteLength(t,`utf8`),process.stderr.write(t)},readStdin:i});return await o.recordEvent(`doom_runner.cli_finished`,{outcome:e===0?`completed`:`failed`,"runner.exit_code":e,duration_ms:Date.now()-a,"runner.argument_count":n.length,"runner.stdout_bytes":l,"runner.stderr_bytes":u}),e}catch(e){throw await o.recordError(`doom_runner.cli_failed`,e,{duration_ms:Date.now()-a,"runner.argument_count":n.length,"runner.stdout_bytes":l,"runner.stderr_bytes":u}),e}finally{c.close(),await o.shutdown()}}process.argv[1]&&import.meta.url===n(process.argv[1]).href&&a().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{a as main};
5
5
  //# sourceMappingURL=cli.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { createRunnerContainer } from '../container/index.ts';\nimport { pathToFileURL } from 'node:url';\nimport type { ILauncher } from '../services/Launcher/index.ts';\nimport type { ILogReader } from '../services/LogReader/index.ts';\nimport type { IRunnerRegistry } from '../services/RunnerRegistry/index.ts';\nimport type { IRmuxBackend } from '../services/RmuxBackend/index.ts';\nimport { TYPES } from '../types.ts';\nimport { runCli } from '../cli/cliApp.ts';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerContainer();\n const registry = container.get<IRunnerRegistry>(TYPES.RunnerRegistry);\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.get<ILauncher>(TYPES.Launcher),\n rmuxBackend: container.get<IRmuxBackend>(TYPES.RmuxBackend),\n logReader: container.get<ILogReader>(TYPES.LogReader),\n env: process.env,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";0PAYA,eAAe,GAA6B,CAC1C,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAAO,EAAO,KAAK,OAAO,SAAS,CAAK,EAAI,EAAQ,OAAO,KAAK,CAAK,CAAC,EACxG,OAAO,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAC9C,CAEA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,EAAY,EAAoB,CACpC,YAAa,kBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,EAAY,EAAsB,EAClC,EAAW,EAAU,IAAqB,EAAM,cAAc,EAChE,EAAc,EACd,EAAc,EAClB,GAAI,CACF,IAAM,EAAW,MAAM,EAAO,EAAM,CAClC,WACA,SAAU,EAAU,IAAe,EAAM,QAAQ,EACjD,YAAa,EAAU,IAAkB,EAAM,WAAW,EAC1D,UAAW,EAAU,IAAgB,EAAM,SAAS,EACpD,IAAK,QAAQ,IACb,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,WACF,CAAC,EASD,OARA,MAAM,EAAU,YAAY,2BAA4B,CACtD,QAAS,IAAa,EAAI,YAAc,SACxC,mBAAoB,EACpB,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACM,CACT,OAAS,EAAO,CAOd,MANA,MAAM,EAAU,YAAY,yBAA0B,EAAO,CAC3D,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACK,CACR,QAAU,CACR,EAAS,MAAM,EACf,MAAM,EAAU,SAAS,CAC3B,CACF,CAEI,QAAQ,KAAK,IAAM,YAAY,MAAQ,EAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { runCli } from '../commands/cli/cliApp.ts';\nimport { createRunnerContainer } from '../container/index.ts';\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf8');\n}\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-cli',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const container = createRunnerContainer();\n const registry = container.runnerRegistry;\n let stdoutBytes = 0;\n let stderrBytes = 0;\n try {\n const exitCode = await runCli(argv, {\n registry,\n launcher: container.launcher,\n rmuxBackend: container.rmuxBackend,\n logReader: container.logReader,\n env: process.env,\n stdout: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stdoutBytes += Buffer.byteLength(output, 'utf8');\n process.stdout.write(output);\n },\n stderr: (text) => {\n const output = text.endsWith('\\n') ? text : `${text}\\n`;\n stderrBytes += Buffer.byteLength(output, 'utf8');\n process.stderr.write(output);\n },\n readStdin,\n });\n await telemetry.recordEvent('doom_runner.cli_finished', {\n outcome: exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError('doom_runner.cli_failed', error, {\n duration_ms: Date.now() - startedAt,\n 'runner.argument_count': argv.length,\n 'runner.stdout_bytes': stdoutBytes,\n 'runner.stderr_bytes': stderrBytes,\n });\n throw error;\n } finally {\n registry.close();\n await telemetry.shutdown();\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":";sOAOA,eAAe,GAA6B,CAC1C,IAAM,EAAmB,CAAC,EAC1B,UAAW,IAAM,KAAS,QAAQ,MAAO,EAAO,KAAK,OAAO,SAAS,CAAK,EAAI,EAAQ,OAAO,KAAK,CAAK,CAAC,EACxG,OAAO,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAC9C,CAEA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,EAAY,EAAoB,CACpC,YAAa,kBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,EAAY,EAAsB,EAClC,EAAW,EAAU,eACvB,EAAc,EACd,EAAc,EAClB,GAAI,CACF,IAAM,EAAW,MAAM,EAAO,EAAM,CAClC,WACA,SAAU,EAAU,SACpB,YAAa,EAAU,YACvB,UAAW,EAAU,UACrB,IAAK,QAAQ,IACb,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,OAAS,GAAS,CAChB,IAAM,EAAS,EAAK,SAAS;CAAI,EAAI,EAAO,GAAG,EAAK,IACpD,GAAe,OAAO,WAAW,EAAQ,MAAM,EAC/C,QAAQ,OAAO,MAAM,CAAM,CAC7B,EACA,WACF,CAAC,EASD,OARA,MAAM,EAAU,YAAY,2BAA4B,CACtD,QAAS,IAAa,EAAI,YAAc,SACxC,mBAAoB,EACpB,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACM,CACT,OAAS,EAAO,CAOd,MANA,MAAM,EAAU,YAAY,yBAA0B,EAAO,CAC3D,YAAa,KAAK,IAAI,EAAI,EAC1B,wBAAyB,EAAK,OAC9B,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EACK,CACR,QAAU,CACR,EAAS,MAAM,EACf,MAAM,EAAU,SAAS,CAC3B,CACF,CAEI,QAAQ,KAAK,IAAM,YAAY,MAAQ,EAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../services/AnsiScrub/ansiScrub.cjs");require("../services/AnsiScrub/index.cjs");let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:url"),i=require("@agimon-ai/doompi-telemetry");async function a(e=process.argv.slice(2)){let r=Date.now(),a=(0,i.createDoomTelemetry)({serviceName:`doom-runner-log-sink`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[s,c,l,u]=e,d;try{if(!s||!c||!l||!u)throw Error(`logSink requires log, rotated log, max bytes, and completion paths`);if(d=Number(l),!Number.isFinite(d)||d<=0)throw Error(`logSink max bytes must be positive`)}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),await a.shutdown(),e}let f,p;try{f=n.default.openSync(s,`a`),p=n.default.statSync(s).size}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),await a.shutdown(),e}let m=0,h=0;try{process.stdin.setEncoding(`utf8`);for await(let e of process.stdin){let r=t.scrubTerminalOutput(String(e));if(!r)continue;let i=Buffer.from(r,`utf8`);p+i.byteLength>d&&(n.default.closeSync(f),n.default.renameSync(s,c),f=n.default.openSync(s,`w`),p=0,h+=1),n.default.writeSync(f,i),p+=i.byteLength,m+=1}return n.default.closeSync(f),o(u),await a.recordEvent(`doom_runner.file_sink_finished`,{outcome:`completed`,"runner.chunk_count":m,"runner.bytes_written":p,"runner.rotation_count":h,duration_ms:Date.now()-r}),0}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),e}finally{await a.shutdown()}}function o(e){let t=`${e}.${process.pid}.tmp`;n.default.writeFileSync(t,``,{mode:384}),n.default.renameSync(t,e)}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,r.pathToFileURL)(process.argv[1]).href&&a().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../src/services/AnsiScrub/ansiScrub.cjs");let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:url"),i=require("@agimon-ai/doompi-telemetry");async function a(e=process.argv.slice(2)){let r=Date.now(),a=(0,i.createDoomTelemetry)({serviceName:`doom-runner-log-sink`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[s,c,l,u]=e,d;try{if(!s||!c||!l||!u)throw Error(`logSink requires log, rotated log, max bytes, and completion paths`);if(d=Number(l),!Number.isFinite(d)||d<=0)throw Error(`logSink max bytes must be positive`)}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),await a.shutdown(),e}let f,p;try{f=n.default.openSync(s,`a`),p=n.default.statSync(s).size}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),await a.shutdown(),e}let m=0,h=0;try{process.stdin.setEncoding(`utf8`);for await(let e of process.stdin){let r=t.scrubTerminalOutput(String(e));if(!r)continue;let i=Buffer.from(r,`utf8`);p+i.byteLength>d&&(n.default.closeSync(f),n.default.renameSync(s,c),f=n.default.openSync(s,`w`),p=0,h+=1),n.default.writeSync(f,i),p+=i.byteLength,m+=1}return n.default.closeSync(f),o(u),await a.recordEvent(`doom_runner.file_sink_finished`,{outcome:`completed`,"runner.chunk_count":m,"runner.bytes_written":p,"runner.rotation_count":h,duration_ms:Date.now()-r}),0}catch(e){throw await a.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-r}),e}finally{await a.shutdown()}}function o(e){let t=`${e}.${process.pid}.tmp`;n.default.writeFileSync(t,``,{mode:384}),n.default.renameSync(t,e)}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,r.pathToFileURL)(process.argv[1]).href&&a().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=a;
2
2
  //# sourceMappingURL=logSink.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logSink.cjs","names":["createDoomTelemetry","fs","scrubTerminalOutput","pathToFileURL"],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { scrubTerminalOutput } from '../services/AnsiScrub/index.ts';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath] = argv;\n let maxBytes: number;\n try {\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n maxBytes = Number(maxBytesRaw);\n if (!Number.isFinite(maxBytes) || maxBytes <= 0) throw new Error('logSink max bytes must be positive');\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n let rotations = 0;\n try {\n process.stdin.setEncoding('utf8');\n for await (const chunk of process.stdin) {\n const text = scrubTerminalOutput(String(chunk));\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n if (written + bytes.byteLength > maxBytes) {\n fs.closeSync(handle);\n fs.renameSync(logPath, rotatedPath);\n handle = fs.openSync(logPath, 'w');\n written = 0;\n rotations += 1;\n }\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n fs.closeSync(handle);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n 'runner.rotation_count': rotations,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"iUAKA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,GAAA,EAAYA,EAAAA,oBAAAA,CAAoB,CACpC,YAAa,uBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,CAAC,EAAS,EAAa,EAAa,GAAY,EAClD,EACJ,GAAI,CACF,GAAI,CAAC,GAAW,CAAC,GAAe,CAAC,GAAe,CAAC,EAC/C,MAAU,MAAM,oEAAoE,EAGtF,GADA,EAAW,OAAO,CAAW,EACzB,CAAC,OAAO,SAAS,CAAQ,GAAK,GAAY,EAAG,MAAU,MAAM,oCAAoC,CACvG,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CAEA,IAAI,EACA,EACJ,GAAI,CACF,EAASC,EAAAA,QAAG,SAAS,EAAS,GAAG,EACjC,EAAUA,EAAAA,QAAG,SAAS,CAAO,CAAC,CAAC,IACjC,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CACA,IAAI,EAAS,EACT,EAAY,EAChB,GAAI,CACF,QAAQ,MAAM,YAAY,MAAM,EAChC,UAAW,IAAM,KAAS,QAAQ,MAAO,CACvC,IAAM,EAAOC,EAAAA,oBAAoB,OAAO,CAAK,CAAC,EAC9C,GAAI,CAAC,EAAM,SACX,IAAM,EAAQ,OAAO,KAAK,EAAM,MAAM,EAClC,EAAU,EAAM,WAAa,IAC/B,EAAA,QAAG,UAAU,CAAM,EACnB,EAAA,QAAG,WAAW,EAAS,CAAW,EAClC,EAASD,EAAAA,QAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EACV,GAAa,GAEf,EAAA,QAAG,UAAU,EAAQ,CAAK,EAC1B,GAAW,EAAM,WACjB,GAAU,CACZ,CAUA,OATA,EAAA,QAAG,UAAU,CAAM,EACnB,EAAU,CAAQ,EAClB,MAAM,EAAU,YAAY,iCAAkC,CAC5D,QAAS,YACT,qBAAsB,EACtB,uBAAwB,EACxB,wBAAyB,EACzB,YAAa,KAAK,IAAI,EAAI,CAC5B,CAAC,EACM,CACT,OAAS,EAAO,CAEd,MADA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EACpG,CACR,QAAU,CACR,MAAM,EAAU,SAAS,CAC3B,CACF,CAEA,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,MAC3C,EAAA,QAAG,cAAc,EAAW,GAAI,CAAE,KAAM,GAAM,CAAC,EAC/C,EAAA,QAAG,WAAW,EAAW,CAAM,CACjC,CAEI,QAAQ,KAAK,IAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,QAAA,EAA0BE,EAAAA,cAAAA,CAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
1
+ {"version":3,"file":"logSink.cjs","names":["createDoomTelemetry","fs","scrubTerminalOutput","pathToFileURL"],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { scrubTerminalOutput } from '../services/AnsiScrub/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath] = argv;\n let maxBytes: number;\n try {\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n maxBytes = Number(maxBytesRaw);\n if (!Number.isFinite(maxBytes) || maxBytes <= 0) throw new Error('logSink max bytes must be positive');\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n let rotations = 0;\n try {\n process.stdin.setEncoding('utf8');\n for await (const chunk of process.stdin) {\n const text = scrubTerminalOutput(String(chunk));\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n if (written + bytes.byteLength > maxBytes) {\n fs.closeSync(handle);\n fs.renameSync(logPath, rotatedPath);\n handle = fs.openSync(logPath, 'w');\n written = 0;\n rotations += 1;\n }\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n fs.closeSync(handle);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n 'runner.rotation_count': rotations,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"0RAKA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,GAAA,EAAYA,EAAAA,oBAAAA,CAAoB,CACpC,YAAa,uBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,CAAC,EAAS,EAAa,EAAa,GAAY,EAClD,EACJ,GAAI,CACF,GAAI,CAAC,GAAW,CAAC,GAAe,CAAC,GAAe,CAAC,EAC/C,MAAU,MAAM,oEAAoE,EAGtF,GADA,EAAW,OAAO,CAAW,EACzB,CAAC,OAAO,SAAS,CAAQ,GAAK,GAAY,EAAG,MAAU,MAAM,oCAAoC,CACvG,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CAEA,IAAI,EACA,EACJ,GAAI,CACF,EAASC,EAAAA,QAAG,SAAS,EAAS,GAAG,EACjC,EAAUA,EAAAA,QAAG,SAAS,CAAO,CAAC,CAAC,IACjC,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CACA,IAAI,EAAS,EACT,EAAY,EAChB,GAAI,CACF,QAAQ,MAAM,YAAY,MAAM,EAChC,UAAW,IAAM,KAAS,QAAQ,MAAO,CACvC,IAAM,EAAOC,EAAAA,oBAAoB,OAAO,CAAK,CAAC,EAC9C,GAAI,CAAC,EAAM,SACX,IAAM,EAAQ,OAAO,KAAK,EAAM,MAAM,EAClC,EAAU,EAAM,WAAa,IAC/B,EAAA,QAAG,UAAU,CAAM,EACnB,EAAA,QAAG,WAAW,EAAS,CAAW,EAClC,EAASD,EAAAA,QAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EACV,GAAa,GAEf,EAAA,QAAG,UAAU,EAAQ,CAAK,EAC1B,GAAW,EAAM,WACjB,GAAU,CACZ,CAUA,OATA,EAAA,QAAG,UAAU,CAAM,EACnB,EAAU,CAAQ,EAClB,MAAM,EAAU,YAAY,iCAAkC,CAC5D,QAAS,YACT,qBAAsB,EACtB,uBAAwB,EACxB,wBAAyB,EACzB,YAAa,KAAK,IAAI,EAAI,CAC5B,CAAC,EACM,CACT,OAAS,EAAO,CAEd,MADA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EACpG,CACR,QAAU,CACR,MAAM,EAAU,SAAS,CAC3B,CACF,CAEA,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,MAC3C,EAAA,QAAG,cAAc,EAAW,GAAI,CAAE,KAAM,GAAM,CAAC,EAC/C,EAAA,QAAG,WAAW,EAAW,CAAM,CACjC,CAEI,QAAQ,KAAK,IAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,QAAA,EAA0BE,EAAAA,cAAAA,CAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
@@ -1,2 +1,2 @@
1
- import{scrubTerminalOutput as e}from"../services/AnsiScrub/ansiScrub.mjs";import"../services/AnsiScrub/index.mjs";import t from"node:fs";import{pathToFileURL as n}from"node:url";import{createDoomTelemetry as r}from"@agimon-ai/doompi-telemetry";async function i(n=process.argv.slice(2)){let i=Date.now(),o=r({serviceName:`doom-runner-log-sink`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[s,c,l,u]=n,d;try{if(!s||!c||!l||!u)throw Error(`logSink requires log, rotated log, max bytes, and completion paths`);if(d=Number(l),!Number.isFinite(d)||d<=0)throw Error(`logSink max bytes must be positive`)}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),await o.shutdown(),e}let f,p;try{f=t.openSync(s,`a`),p=t.statSync(s).size}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),await o.shutdown(),e}let m=0,h=0;try{process.stdin.setEncoding(`utf8`);for await(let n of process.stdin){let r=e(String(n));if(!r)continue;let i=Buffer.from(r,`utf8`);p+i.byteLength>d&&(t.closeSync(f),t.renameSync(s,c),f=t.openSync(s,`w`),p=0,h+=1),t.writeSync(f,i),p+=i.byteLength,m+=1}return t.closeSync(f),a(u),await o.recordEvent(`doom_runner.file_sink_finished`,{outcome:`completed`,"runner.chunk_count":m,"runner.bytes_written":p,"runner.rotation_count":h,duration_ms:Date.now()-i}),0}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),e}finally{await o.shutdown()}}function a(e){let n=`${e}.${process.pid}.tmp`;t.writeFileSync(n,``,{mode:384}),t.renameSync(n,e)}process.argv[1]&&import.meta.url===n(process.argv[1]).href&&i().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{i as main};
1
+ import{scrubTerminalOutput as e}from"../src/services/AnsiScrub/ansiScrub.mjs";import t from"node:fs";import{pathToFileURL as n}from"node:url";import{createDoomTelemetry as r}from"@agimon-ai/doompi-telemetry";async function i(n=process.argv.slice(2)){let i=Date.now(),o=r({serviceName:`doom-runner-log-sink`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[s,c,l,u]=n,d;try{if(!s||!c||!l||!u)throw Error(`logSink requires log, rotated log, max bytes, and completion paths`);if(d=Number(l),!Number.isFinite(d)||d<=0)throw Error(`logSink max bytes must be positive`)}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),await o.shutdown(),e}let f,p;try{f=t.openSync(s,`a`),p=t.statSync(s).size}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),await o.shutdown(),e}let m=0,h=0;try{process.stdin.setEncoding(`utf8`);for await(let n of process.stdin){let r=e(String(n));if(!r)continue;let i=Buffer.from(r,`utf8`);p+i.byteLength>d&&(t.closeSync(f),t.renameSync(s,c),f=t.openSync(s,`w`),p=0,h+=1),t.writeSync(f,i),p+=i.byteLength,m+=1}return t.closeSync(f),a(u),await o.recordEvent(`doom_runner.file_sink_finished`,{outcome:`completed`,"runner.chunk_count":m,"runner.bytes_written":p,"runner.rotation_count":h,duration_ms:Date.now()-i}),0}catch(e){throw await o.recordError(`doom_runner.file_sink_failed`,e,{duration_ms:Date.now()-i}),e}finally{await o.shutdown()}}function a(e){let n=`${e}.${process.pid}.tmp`;t.writeFileSync(n,``,{mode:384}),t.renameSync(n,e)}process.argv[1]&&import.meta.url===n(process.argv[1]).href&&i().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{i as main};
2
2
  //# sourceMappingURL=logSink.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logSink.mjs","names":[],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { scrubTerminalOutput } from '../services/AnsiScrub/index.ts';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath] = argv;\n let maxBytes: number;\n try {\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n maxBytes = Number(maxBytesRaw);\n if (!Number.isFinite(maxBytes) || maxBytes <= 0) throw new Error('logSink max bytes must be positive');\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n let rotations = 0;\n try {\n process.stdin.setEncoding('utf8');\n for await (const chunk of process.stdin) {\n const text = scrubTerminalOutput(String(chunk));\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n if (written + bytes.byteLength > maxBytes) {\n fs.closeSync(handle);\n fs.renameSync(logPath, rotatedPath);\n handle = fs.openSync(logPath, 'w');\n written = 0;\n rotations += 1;\n }\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n fs.closeSync(handle);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n 'runner.rotation_count': rotations,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"oPAKA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,EAAY,EAAoB,CACpC,YAAa,uBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,CAAC,EAAS,EAAa,EAAa,GAAY,EAClD,EACJ,GAAI,CACF,GAAI,CAAC,GAAW,CAAC,GAAe,CAAC,GAAe,CAAC,EAC/C,MAAU,MAAM,oEAAoE,EAGtF,GADA,EAAW,OAAO,CAAW,EACzB,CAAC,OAAO,SAAS,CAAQ,GAAK,GAAY,EAAG,MAAU,MAAM,oCAAoC,CACvG,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CAEA,IAAI,EACA,EACJ,GAAI,CACF,EAAS,EAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EAAG,SAAS,CAAO,CAAC,CAAC,IACjC,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CACA,IAAI,EAAS,EACT,EAAY,EAChB,GAAI,CACF,QAAQ,MAAM,YAAY,MAAM,EAChC,UAAW,IAAM,KAAS,QAAQ,MAAO,CACvC,IAAM,EAAO,EAAoB,OAAO,CAAK,CAAC,EAC9C,GAAI,CAAC,EAAM,SACX,IAAM,EAAQ,OAAO,KAAK,EAAM,MAAM,EAClC,EAAU,EAAM,WAAa,IAC/B,EAAG,UAAU,CAAM,EACnB,EAAG,WAAW,EAAS,CAAW,EAClC,EAAS,EAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EACV,GAAa,GAEf,EAAG,UAAU,EAAQ,CAAK,EAC1B,GAAW,EAAM,WACjB,GAAU,CACZ,CAUA,OATA,EAAG,UAAU,CAAM,EACnB,EAAU,CAAQ,EAClB,MAAM,EAAU,YAAY,iCAAkC,CAC5D,QAAS,YACT,qBAAsB,EACtB,uBAAwB,EACxB,wBAAyB,EACzB,YAAa,KAAK,IAAI,EAAI,CAC5B,CAAC,EACM,CACT,OAAS,EAAO,CAEd,MADA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EACpG,CACR,QAAU,CACR,MAAM,EAAU,SAAS,CAC3B,CACF,CAEA,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,MAC3C,EAAG,cAAc,EAAW,GAAI,CAAE,KAAM,GAAM,CAAC,EAC/C,EAAG,WAAW,EAAW,CAAM,CACjC,CAEI,QAAQ,KAAK,IAAM,YAAY,MAAQ,EAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
1
+ {"version":3,"file":"logSink.mjs","names":[],"sources":["../../src/bin/logSink.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { scrubTerminalOutput } from '../services/AnsiScrub/ansiScrub';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-log-sink',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [logPath, rotatedPath, maxBytesRaw, donePath] = argv;\n let maxBytes: number;\n try {\n if (!logPath || !rotatedPath || !maxBytesRaw || !donePath) {\n throw new Error('logSink requires log, rotated log, max bytes, and completion paths');\n }\n maxBytes = Number(maxBytesRaw);\n if (!Number.isFinite(maxBytes) || maxBytes <= 0) throw new Error('logSink max bytes must be positive');\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n\n let handle: number;\n let written: number;\n try {\n handle = fs.openSync(logPath, 'a');\n written = fs.statSync(logPath).size;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let chunks = 0;\n let rotations = 0;\n try {\n process.stdin.setEncoding('utf8');\n for await (const chunk of process.stdin) {\n const text = scrubTerminalOutput(String(chunk));\n if (!text) continue;\n const bytes = Buffer.from(text, 'utf8');\n if (written + bytes.byteLength > maxBytes) {\n fs.closeSync(handle);\n fs.renameSync(logPath, rotatedPath);\n handle = fs.openSync(logPath, 'w');\n written = 0;\n rotations += 1;\n }\n fs.writeSync(handle, bytes);\n written += bytes.byteLength;\n chunks += 1;\n }\n fs.closeSync(handle);\n writeDone(donePath);\n await telemetry.recordEvent('doom_runner.file_sink_finished', {\n outcome: 'completed',\n 'runner.chunk_count': chunks,\n 'runner.bytes_written': written,\n 'runner.rotation_count': rotations,\n duration_ms: Date.now() - startedAt,\n });\n return 0;\n } catch (error) {\n await telemetry.recordError('doom_runner.file_sink_failed', error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n await telemetry.shutdown();\n }\n}\n\nfunction writeDone(target: string): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, '', { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"gNAKA,eAAsB,EAAK,EAA0B,QAAQ,KAAK,MAAM,CAAC,EAAoB,CAC3F,IAAM,EAAY,KAAK,IAAI,EACrB,EAAY,EAAoB,CACpC,YAAa,uBACb,YAAa,2BACb,IAAK,QAAQ,IACb,WAAY,GACZ,aAAc,EAChB,CAAC,EACK,CAAC,EAAS,EAAa,EAAa,GAAY,EAClD,EACJ,GAAI,CACF,GAAI,CAAC,GAAW,CAAC,GAAe,CAAC,GAAe,CAAC,EAC/C,MAAU,MAAM,oEAAoE,EAGtF,GADA,EAAW,OAAO,CAAW,EACzB,CAAC,OAAO,SAAS,CAAQ,GAAK,GAAY,EAAG,MAAU,MAAM,oCAAoC,CACvG,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CAEA,IAAI,EACA,EACJ,GAAI,CACF,EAAS,EAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EAAG,SAAS,CAAO,CAAC,CAAC,IACjC,OAAS,EAAO,CAGd,MAFA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EAC1G,MAAM,EAAU,SAAS,EACnB,CACR,CACA,IAAI,EAAS,EACT,EAAY,EAChB,GAAI,CACF,QAAQ,MAAM,YAAY,MAAM,EAChC,UAAW,IAAM,KAAS,QAAQ,MAAO,CACvC,IAAM,EAAO,EAAoB,OAAO,CAAK,CAAC,EAC9C,GAAI,CAAC,EAAM,SACX,IAAM,EAAQ,OAAO,KAAK,EAAM,MAAM,EAClC,EAAU,EAAM,WAAa,IAC/B,EAAG,UAAU,CAAM,EACnB,EAAG,WAAW,EAAS,CAAW,EAClC,EAAS,EAAG,SAAS,EAAS,GAAG,EACjC,EAAU,EACV,GAAa,GAEf,EAAG,UAAU,EAAQ,CAAK,EAC1B,GAAW,EAAM,WACjB,GAAU,CACZ,CAUA,OATA,EAAG,UAAU,CAAM,EACnB,EAAU,CAAQ,EAClB,MAAM,EAAU,YAAY,iCAAkC,CAC5D,QAAS,YACT,qBAAsB,EACtB,uBAAwB,EACxB,wBAAyB,EACzB,YAAa,KAAK,IAAI,EAAI,CAC5B,CAAC,EACM,CACT,OAAS,EAAO,CAEd,MADA,MAAM,EAAU,YAAY,+BAAgC,EAAO,CAAE,YAAa,KAAK,IAAI,EAAI,CAAU,CAAC,EACpG,CACR,QAAU,CACR,MAAM,EAAU,SAAS,CAC3B,CACF,CAEA,SAAS,EAAU,EAAsB,CACvC,IAAM,EAAY,GAAG,EAAO,GAAG,QAAQ,IAAI,MAC3C,EAAG,cAAc,EAAW,GAAI,CAAE,KAAM,GAAM,CAAC,EAC/C,EAAG,WAAW,EAAW,CAAM,CACjC,CAEI,QAAQ,KAAK,IAAM,YAAY,MAAQ,EAAc,QAAQ,KAAK,EAAE,CAAC,CAAC,MACxE,EAAK,CAAC,CAAC,KACJ,GAAS,CACR,QAAQ,SAAW,CACrB,EACC,GAAmB,CAClB,QAAQ,OAAO,MAAM,GAAG,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,GAAG,EAClF,QAAQ,SAAW,CACrB,CACF"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../services/Lifeline/client.cjs");let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:url"),i=require("node:os");i=e.__toESM(i,1);let a=require("node:child_process"),o=require("@agimon-ai/doompi-telemetry");const s=`doom_runner.host_failed`,c=`invalid runner command spec`;async function l(e=process.argv.slice(2)){let n=Date.now(),r=(0,o.createDoomTelemetry)({serviceName:`doom-runner-host`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[c,l,p]=e,m;try{if(!c||!l||!p)throw Error(`runnerHost requires spec, gate, and exit paths`);m=u(c),await d(l)}catch(e){throw await r.recordError(s,e,{duration_ms:Date.now()-n}),await r.shutdown(),e}let h,g=null,_,v=e=>{if(h?.pid)try{process.kill(-h.pid,e)}catch{h.kill(e)}},y=e=>{g=e,v(e),_??=setTimeout(()=>v(`SIGKILL`),2e3)};for(let e of[`SIGTERM`,`SIGINT`,`SIGHUP`])process.once(e,()=>y(e));h=(0,a.spawn)(m.command,{cwd:m.cwd,env:m.env,shell:`/bin/bash`,stdio:`inherit`,detached:!0}),g&&y(g);let b=t.watchOwner(()=>y(`SIGTERM`),m.env[t.LIFELINE_ENV]);try{let e=await new Promise((e,t)=>{h?.once(`error`,t),h?.once(`exit`,(t,n)=>e({code:t,signal:n??g}))});f(p,e);let t=e.code===null?e.signal?128+i.default.constants.signals[e.signal]:1:e.code;return await r.recordEvent(`doom_runner.host_finished`,{outcome:e.signal||g?`signaled`:t===0?`completed`:`failed`,"runner.exit_code":t,...e.signal||g?{"runner.signal":e.signal??g??``}:{},duration_ms:Date.now()-n}),t}catch(e){throw await r.recordError(s,e,{duration_ms:Date.now()-n}),e}finally{b(),_&&clearTimeout(_),await r.shutdown()}}function u(e){let t=JSON.parse(n.default.readFileSync(e,`utf8`));if(typeof t!=`object`||!t)throw Error(c);let r=t;if(typeof r.command!=`string`||typeof r.cwd!=`string`||!r.env)throw Error(c);return{command:r.command,cwd:r.cwd,env:r.env}}async function d(e){for(;!n.default.existsSync(e);)await new Promise(e=>setTimeout(e,10))}function f(e,t){let r=`${e}.${process.pid}.tmp`;n.default.writeFileSync(r,`${JSON.stringify(t)}\n`,{mode:384}),n.default.renameSync(r,e)}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,r.pathToFileURL)(process.argv[1]).href&&l().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=l;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../src/adapters/Lifeline/client.cjs");let n=require("node:fs");n=e.__toESM(n,1);let r=require("node:url"),i=require("node:os");i=e.__toESM(i,1);let a=require("node:child_process"),o=require("@agimon-ai/doompi-telemetry");const s=`doom_runner.host_failed`,c=`invalid runner command spec`;async function l(e=process.argv.slice(2)){let n=Date.now(),r=(0,o.createDoomTelemetry)({serviceName:`doom-runner-host`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[c,l,p]=e,m;try{if(!c||!l||!p)throw Error(`runnerHost requires spec, gate, and exit paths`);m=u(c),await d(l)}catch(e){throw await r.recordError(s,e,{duration_ms:Date.now()-n}),await r.shutdown(),e}let h,g=null,_,v=e=>{if(h?.pid)try{process.kill(-h.pid,e)}catch{h.kill(e)}},y=e=>{g=e,v(e),_??=setTimeout(()=>v(`SIGKILL`),2e3)};for(let e of[`SIGTERM`,`SIGINT`,`SIGHUP`])process.once(e,()=>y(e));h=(0,a.spawn)(m.command,{cwd:m.cwd,env:m.env,shell:`/bin/bash`,stdio:`inherit`,detached:!0}),g&&y(g);let b=t.watchOwner(()=>y(`SIGTERM`),m.env[t.LIFELINE_ENV]);try{let e=await new Promise((e,t)=>{h?.once(`error`,t),h?.once(`exit`,(t,n)=>e({code:t,signal:n??g}))});f(p,e);let t=e.code===null?e.signal?128+i.default.constants.signals[e.signal]:1:e.code;return await r.recordEvent(`doom_runner.host_finished`,{outcome:e.signal||g?`signaled`:t===0?`completed`:`failed`,"runner.exit_code":t,...e.signal||g?{"runner.signal":e.signal??g??``}:{},duration_ms:Date.now()-n}),t}catch(e){throw await r.recordError(s,e,{duration_ms:Date.now()-n}),e}finally{b(),_&&clearTimeout(_),await r.shutdown()}}function u(e){let t=JSON.parse(n.default.readFileSync(e,`utf8`));if(typeof t!=`object`||!t)throw Error(c);let r=t;if(typeof r.command!=`string`||typeof r.cwd!=`string`||!r.env)throw Error(c);return{command:r.command,cwd:r.cwd,env:r.env}}async function d(e){for(;!n.default.existsSync(e);)await new Promise(e=>setTimeout(e,10))}function f(e,t){let r=`${e}.${process.pid}.tmp`;n.default.writeFileSync(r,`${JSON.stringify(t)}\n`,{mode:384}),n.default.renameSync(r,e)}process.argv[1]&&require("url").pathToFileURL(__filename).href===(0,r.pathToFileURL)(process.argv[1]).href&&l().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1}),exports.main=l;
2
2
  //# sourceMappingURL=runnerHost.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runnerHost.cjs","names":["createDoomTelemetry","spawn","watchOwner","LIFELINE_ENV","os","fs","pathToFileURL"],"sources":["../../src/bin/runnerHost.ts"],"sourcesContent":["import { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { pathToFileURL } from 'node:url';\nimport { LIFELINE_ENV, watchOwner } from '../services/Lifeline/client.ts';\n\ninterface CommandSpec {\n command: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nconst POLL_MS = 10;\nconst FORWARDED_SIGNAL_GRACE_MS = 2_000;\nconst HOST_FAILED_EVENT = 'doom_runner.host_failed';\nconst INVALID_COMMAND_SPEC_ERROR = 'invalid runner command spec';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-host',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [specPath, gatePath, exitPath] = argv;\n let spec: CommandSpec;\n try {\n if (!specPath || !gatePath || !exitPath) throw new Error('runnerHost requires spec, gate, and exit paths');\n spec = readSpec(specPath);\n await waitForGate(gatePath);\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let child: ChildProcess | undefined;\n let forwardedSignal: NodeJS.Signals | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n const signalChild = (signal: NodeJS.Signals): void => {\n if (!child?.pid) return;\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n };\n const forward = (signal: NodeJS.Signals): void => {\n forwardedSignal = signal;\n signalChild(signal);\n escalationTimer ??= setTimeout(() => signalChild('SIGKILL'), FORWARDED_SIGNAL_GRACE_MS);\n };\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT', 'SIGHUP'];\n for (const signal of signals) process.once(signal, () => forward(signal));\n\n child = spawn(spec.command, {\n cwd: spec.cwd,\n env: spec.env,\n shell: '/bin/bash',\n stdio: 'inherit',\n detached: true,\n });\n if (forwardedSignal) forward(forwardedSignal);\n\n // This process supervises the command for its whole life, so it is also the\n // right place to notice an owner that died without stopping it.\n //\n // The lifeline comes from the spec rather than this process's environment: an\n // rmux server outlives the session that started it, so its own environment can\n // still name a previous session's socket.\n const detachLifeline = watchOwner(() => forward('SIGTERM'), spec.env[LIFELINE_ENV]);\n\n try {\n const result = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child?.once('error', reject);\n child?.once('exit', (code, signal) => resolve({ code, signal: signal ?? forwardedSignal }));\n });\n writeAtomic(exitPath, result);\n const exitCode = result.code !== null ? result.code : result.signal ? 128 + os.constants.signals[result.signal] : 1;\n await telemetry.recordEvent('doom_runner.host_finished', {\n outcome: result.signal || forwardedSignal ? 'signaled' : exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n ...(result.signal || forwardedSignal ? { 'runner.signal': result.signal ?? forwardedSignal ?? '' } : {}),\n duration_ms: Date.now() - startedAt,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n detachLifeline();\n if (escalationTimer) clearTimeout(escalationTimer);\n await telemetry.shutdown();\n }\n}\n\nfunction readSpec(target: string): CommandSpec {\n const value: unknown = JSON.parse(fs.readFileSync(target, 'utf8'));\n if (typeof value !== 'object' || value === null) throw new Error(INVALID_COMMAND_SPEC_ERROR);\n const spec = value as Partial<CommandSpec>;\n if (typeof spec.command !== 'string' || typeof spec.cwd !== 'string' || !spec.env) {\n throw new Error(INVALID_COMMAND_SPEC_ERROR);\n }\n return { command: spec.command, cwd: spec.cwd, env: spec.env };\n}\n\nasync function waitForGate(target: string): Promise<void> {\n while (!fs.existsSync(target)) await new Promise((resolve) => setTimeout(resolve, POLL_MS));\n}\n\nfunction writeAtomic(target: string, value: unknown): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(value)}\\n`, { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runnerHost.cjs","names":["createDoomTelemetry","spawn","watchOwner","LIFELINE_ENV","os","fs","pathToFileURL"],"sources":["../../src/bin/runnerHost.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { LIFELINE_ENV, watchOwner } from '../adapters/Lifeline/client.ts';\n\ninterface CommandSpec {\n command: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nconst POLL_MS = 10;\nconst FORWARDED_SIGNAL_GRACE_MS = 2_000;\nconst HOST_FAILED_EVENT = 'doom_runner.host_failed';\nconst INVALID_COMMAND_SPEC_ERROR = 'invalid runner command spec';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-host',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [specPath, gatePath, exitPath] = argv;\n let spec: CommandSpec;\n try {\n if (!specPath || !gatePath || !exitPath) throw new Error('runnerHost requires spec, gate, and exit paths');\n spec = readSpec(specPath);\n await waitForGate(gatePath);\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let child: ChildProcess | undefined;\n let forwardedSignal: NodeJS.Signals | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n const signalChild = (signal: NodeJS.Signals): void => {\n if (!child?.pid) return;\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n };\n const forward = (signal: NodeJS.Signals): void => {\n forwardedSignal = signal;\n signalChild(signal);\n escalationTimer ??= setTimeout(() => signalChild('SIGKILL'), FORWARDED_SIGNAL_GRACE_MS);\n };\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT', 'SIGHUP'];\n for (const signal of signals) process.once(signal, () => forward(signal));\n\n child = spawn(spec.command, {\n cwd: spec.cwd,\n env: spec.env,\n shell: '/bin/bash',\n stdio: 'inherit',\n detached: true,\n });\n if (forwardedSignal) forward(forwardedSignal);\n\n // This process supervises the command for its whole life, so it is also the\n // right place to notice an owner that died without stopping it.\n //\n // The lifeline comes from the spec rather than this process's environment: an\n // rmux server outlives the session that started it, so its own environment can\n // still name a previous session's socket.\n const detachLifeline = watchOwner(() => forward('SIGTERM'), spec.env[LIFELINE_ENV]);\n\n try {\n const result = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child?.once('error', reject);\n child?.once('exit', (code, signal) => resolve({ code, signal: signal ?? forwardedSignal }));\n });\n writeAtomic(exitPath, result);\n const exitCode = result.code !== null ? result.code : result.signal ? 128 + os.constants.signals[result.signal] : 1;\n await telemetry.recordEvent('doom_runner.host_finished', {\n outcome: result.signal || forwardedSignal ? 'signaled' : exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n ...(result.signal || forwardedSignal ? { 'runner.signal': result.signal ?? forwardedSignal ?? '' } : {}),\n duration_ms: Date.now() - startedAt,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n detachLifeline();\n if (escalationTimer) clearTimeout(escalationTimer);\n await telemetry.shutdown();\n }\n}\n\nfunction readSpec(target: string): CommandSpec {\n const value: unknown = JSON.parse(fs.readFileSync(target, 'utf8'));\n if (typeof value !== 'object' || value === null) throw new Error(INVALID_COMMAND_SPEC_ERROR);\n const spec = value as Partial<CommandSpec>;\n if (typeof spec.command !== 'string' || typeof spec.cwd !== 'string' || !spec.env) {\n throw new Error(INVALID_COMMAND_SPEC_ERROR);\n }\n return { command: spec.command, cwd: spec.cwd, env: spec.env };\n}\n\nasync function waitForGate(target: string): Promise<void> {\n while (!fs.existsSync(target)) await new Promise((resolve) => setTimeout(resolve, POLL_MS));\n}\n\nfunction writeAtomic(target: string, value: unknown): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(value)}\\n`, { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{LIFELINE_ENV as e,watchOwner as t}from"../services/Lifeline/client.mjs";import n from"node:fs";import{pathToFileURL as r}from"node:url";import i from"node:os";import{spawn as a}from"node:child_process";import{createDoomTelemetry as o}from"@agimon-ai/doompi-telemetry";const s=`doom_runner.host_failed`,c=`invalid runner command spec`;async function l(n=process.argv.slice(2)){let r=Date.now(),c=o({serviceName:`doom-runner-host`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[l,p,m]=n,h;try{if(!l||!p||!m)throw Error(`runnerHost requires spec, gate, and exit paths`);h=u(l),await d(p)}catch(e){throw await c.recordError(s,e,{duration_ms:Date.now()-r}),await c.shutdown(),e}let g,_=null,v,y=e=>{if(g?.pid)try{process.kill(-g.pid,e)}catch{g.kill(e)}},b=e=>{_=e,y(e),v??=setTimeout(()=>y(`SIGKILL`),2e3)};for(let e of[`SIGTERM`,`SIGINT`,`SIGHUP`])process.once(e,()=>b(e));g=a(h.command,{cwd:h.cwd,env:h.env,shell:`/bin/bash`,stdio:`inherit`,detached:!0}),_&&b(_);let x=t(()=>b(`SIGTERM`),h.env[e]);try{let e=await new Promise((e,t)=>{g?.once(`error`,t),g?.once(`exit`,(t,n)=>e({code:t,signal:n??_}))});f(m,e);let t=e.code===null?e.signal?128+i.constants.signals[e.signal]:1:e.code;return await c.recordEvent(`doom_runner.host_finished`,{outcome:e.signal||_?`signaled`:t===0?`completed`:`failed`,"runner.exit_code":t,...e.signal||_?{"runner.signal":e.signal??_??``}:{},duration_ms:Date.now()-r}),t}catch(e){throw await c.recordError(s,e,{duration_ms:Date.now()-r}),e}finally{x(),v&&clearTimeout(v),await c.shutdown()}}function u(e){let t=JSON.parse(n.readFileSync(e,`utf8`));if(typeof t!=`object`||!t)throw Error(c);let r=t;if(typeof r.command!=`string`||typeof r.cwd!=`string`||!r.env)throw Error(c);return{command:r.command,cwd:r.cwd,env:r.env}}async function d(e){for(;!n.existsSync(e);)await new Promise(e=>setTimeout(e,10))}function f(e,t){let r=`${e}.${process.pid}.tmp`;n.writeFileSync(r,`${JSON.stringify(t)}\n`,{mode:384}),n.renameSync(r,e)}process.argv[1]&&import.meta.url===r(process.argv[1]).href&&l().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{l as main};
1
+ import{LIFELINE_ENV as e,watchOwner as t}from"../src/adapters/Lifeline/client.mjs";import n from"node:fs";import{pathToFileURL as r}from"node:url";import i from"node:os";import{spawn as a}from"node:child_process";import{createDoomTelemetry as o}from"@agimon-ai/doompi-telemetry";const s=`doom_runner.host_failed`,c=`invalid runner command spec`;async function l(n=process.argv.slice(2)){let r=Date.now(),c=o({serviceName:`doom-runner-host`,packageName:`@agimon-ai/doompi-runner`,env:process.env,enableLogs:!0,enableTraces:!0}),[l,p,m]=n,h;try{if(!l||!p||!m)throw Error(`runnerHost requires spec, gate, and exit paths`);h=u(l),await d(p)}catch(e){throw await c.recordError(s,e,{duration_ms:Date.now()-r}),await c.shutdown(),e}let g,_=null,v,y=e=>{if(g?.pid)try{process.kill(-g.pid,e)}catch{g.kill(e)}},b=e=>{_=e,y(e),v??=setTimeout(()=>y(`SIGKILL`),2e3)};for(let e of[`SIGTERM`,`SIGINT`,`SIGHUP`])process.once(e,()=>b(e));g=a(h.command,{cwd:h.cwd,env:h.env,shell:`/bin/bash`,stdio:`inherit`,detached:!0}),_&&b(_);let x=t(()=>b(`SIGTERM`),h.env[e]);try{let e=await new Promise((e,t)=>{g?.once(`error`,t),g?.once(`exit`,(t,n)=>e({code:t,signal:n??_}))});f(m,e);let t=e.code===null?e.signal?128+i.constants.signals[e.signal]:1:e.code;return await c.recordEvent(`doom_runner.host_finished`,{outcome:e.signal||_?`signaled`:t===0?`completed`:`failed`,"runner.exit_code":t,...e.signal||_?{"runner.signal":e.signal??_??``}:{},duration_ms:Date.now()-r}),t}catch(e){throw await c.recordError(s,e,{duration_ms:Date.now()-r}),e}finally{x(),v&&clearTimeout(v),await c.shutdown()}}function u(e){let t=JSON.parse(n.readFileSync(e,`utf8`));if(typeof t!=`object`||!t)throw Error(c);let r=t;if(typeof r.command!=`string`||typeof r.cwd!=`string`||!r.env)throw Error(c);return{command:r.command,cwd:r.cwd,env:r.env}}async function d(e){for(;!n.existsSync(e);)await new Promise(e=>setTimeout(e,10))}function f(e,t){let r=`${e}.${process.pid}.tmp`;n.writeFileSync(r,`${JSON.stringify(t)}\n`,{mode:384}),n.renameSync(r,e)}process.argv[1]&&import.meta.url===r(process.argv[1]).href&&l().then(e=>{process.exitCode=e},e=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exitCode=1});export{l as main};
2
2
  //# sourceMappingURL=runnerHost.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runnerHost.mjs","names":[],"sources":["../../src/bin/runnerHost.ts"],"sourcesContent":["import { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { pathToFileURL } from 'node:url';\nimport { LIFELINE_ENV, watchOwner } from '../services/Lifeline/client.ts';\n\ninterface CommandSpec {\n command: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nconst POLL_MS = 10;\nconst FORWARDED_SIGNAL_GRACE_MS = 2_000;\nconst HOST_FAILED_EVENT = 'doom_runner.host_failed';\nconst INVALID_COMMAND_SPEC_ERROR = 'invalid runner command spec';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-host',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [specPath, gatePath, exitPath] = argv;\n let spec: CommandSpec;\n try {\n if (!specPath || !gatePath || !exitPath) throw new Error('runnerHost requires spec, gate, and exit paths');\n spec = readSpec(specPath);\n await waitForGate(gatePath);\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let child: ChildProcess | undefined;\n let forwardedSignal: NodeJS.Signals | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n const signalChild = (signal: NodeJS.Signals): void => {\n if (!child?.pid) return;\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n };\n const forward = (signal: NodeJS.Signals): void => {\n forwardedSignal = signal;\n signalChild(signal);\n escalationTimer ??= setTimeout(() => signalChild('SIGKILL'), FORWARDED_SIGNAL_GRACE_MS);\n };\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT', 'SIGHUP'];\n for (const signal of signals) process.once(signal, () => forward(signal));\n\n child = spawn(spec.command, {\n cwd: spec.cwd,\n env: spec.env,\n shell: '/bin/bash',\n stdio: 'inherit',\n detached: true,\n });\n if (forwardedSignal) forward(forwardedSignal);\n\n // This process supervises the command for its whole life, so it is also the\n // right place to notice an owner that died without stopping it.\n //\n // The lifeline comes from the spec rather than this process's environment: an\n // rmux server outlives the session that started it, so its own environment can\n // still name a previous session's socket.\n const detachLifeline = watchOwner(() => forward('SIGTERM'), spec.env[LIFELINE_ENV]);\n\n try {\n const result = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child?.once('error', reject);\n child?.once('exit', (code, signal) => resolve({ code, signal: signal ?? forwardedSignal }));\n });\n writeAtomic(exitPath, result);\n const exitCode = result.code !== null ? result.code : result.signal ? 128 + os.constants.signals[result.signal] : 1;\n await telemetry.recordEvent('doom_runner.host_finished', {\n outcome: result.signal || forwardedSignal ? 'signaled' : exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n ...(result.signal || forwardedSignal ? { 'runner.signal': result.signal ?? forwardedSignal ?? '' } : {}),\n duration_ms: Date.now() - startedAt,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n detachLifeline();\n if (escalationTimer) clearTimeout(escalationTimer);\n await telemetry.shutdown();\n }\n}\n\nfunction readSpec(target: string): CommandSpec {\n const value: unknown = JSON.parse(fs.readFileSync(target, 'utf8'));\n if (typeof value !== 'object' || value === null) throw new Error(INVALID_COMMAND_SPEC_ERROR);\n const spec = value as Partial<CommandSpec>;\n if (typeof spec.command !== 'string' || typeof spec.cwd !== 'string' || !spec.env) {\n throw new Error(INVALID_COMMAND_SPEC_ERROR);\n }\n return { command: spec.command, cwd: spec.cwd, env: spec.env };\n}\n\nasync function waitForGate(target: string): Promise<void> {\n while (!fs.existsSync(target)) await new Promise((resolve) => setTimeout(resolve, POLL_MS));\n}\n\nfunction writeAtomic(target: string, value: unknown): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(value)}\\n`, { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runnerHost.mjs","names":[],"sources":["../../src/bin/runnerHost.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport { createDoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport { LIFELINE_ENV, watchOwner } from '../adapters/Lifeline/client.ts';\n\ninterface CommandSpec {\n command: string;\n cwd: string;\n env: Record<string, string>;\n}\n\nconst POLL_MS = 10;\nconst FORWARDED_SIGNAL_GRACE_MS = 2_000;\nconst HOST_FAILED_EVENT = 'doom_runner.host_failed';\nconst INVALID_COMMAND_SPEC_ERROR = 'invalid runner command spec';\n\nexport async function main(argv: readonly string[] = process.argv.slice(2)): Promise<number> {\n const startedAt = Date.now();\n const telemetry = createDoomTelemetry({\n serviceName: 'doom-runner-host',\n packageName: '@agimon-ai/doompi-runner',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const [specPath, gatePath, exitPath] = argv;\n let spec: CommandSpec;\n try {\n if (!specPath || !gatePath || !exitPath) throw new Error('runnerHost requires spec, gate, and exit paths');\n spec = readSpec(specPath);\n await waitForGate(gatePath);\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n await telemetry.shutdown();\n throw error;\n }\n let child: ChildProcess | undefined;\n let forwardedSignal: NodeJS.Signals | null = null;\n let escalationTimer: NodeJS.Timeout | undefined;\n const signalChild = (signal: NodeJS.Signals): void => {\n if (!child?.pid) return;\n try {\n process.kill(-child.pid, signal);\n } catch {\n child.kill(signal);\n }\n };\n const forward = (signal: NodeJS.Signals): void => {\n forwardedSignal = signal;\n signalChild(signal);\n escalationTimer ??= setTimeout(() => signalChild('SIGKILL'), FORWARDED_SIGNAL_GRACE_MS);\n };\n const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT', 'SIGHUP'];\n for (const signal of signals) process.once(signal, () => forward(signal));\n\n child = spawn(spec.command, {\n cwd: spec.cwd,\n env: spec.env,\n shell: '/bin/bash',\n stdio: 'inherit',\n detached: true,\n });\n if (forwardedSignal) forward(forwardedSignal);\n\n // This process supervises the command for its whole life, so it is also the\n // right place to notice an owner that died without stopping it.\n //\n // The lifeline comes from the spec rather than this process's environment: an\n // rmux server outlives the session that started it, so its own environment can\n // still name a previous session's socket.\n const detachLifeline = watchOwner(() => forward('SIGTERM'), spec.env[LIFELINE_ENV]);\n\n try {\n const result = await new Promise<{ code: number | null; signal: NodeJS.Signals | null }>((resolve, reject) => {\n child?.once('error', reject);\n child?.once('exit', (code, signal) => resolve({ code, signal: signal ?? forwardedSignal }));\n });\n writeAtomic(exitPath, result);\n const exitCode = result.code !== null ? result.code : result.signal ? 128 + os.constants.signals[result.signal] : 1;\n await telemetry.recordEvent('doom_runner.host_finished', {\n outcome: result.signal || forwardedSignal ? 'signaled' : exitCode === 0 ? 'completed' : 'failed',\n 'runner.exit_code': exitCode,\n ...(result.signal || forwardedSignal ? { 'runner.signal': result.signal ?? forwardedSignal ?? '' } : {}),\n duration_ms: Date.now() - startedAt,\n });\n return exitCode;\n } catch (error) {\n await telemetry.recordError(HOST_FAILED_EVENT, error, { duration_ms: Date.now() - startedAt });\n throw error;\n } finally {\n detachLifeline();\n if (escalationTimer) clearTimeout(escalationTimer);\n await telemetry.shutdown();\n }\n}\n\nfunction readSpec(target: string): CommandSpec {\n const value: unknown = JSON.parse(fs.readFileSync(target, 'utf8'));\n if (typeof value !== 'object' || value === null) throw new Error(INVALID_COMMAND_SPEC_ERROR);\n const spec = value as Partial<CommandSpec>;\n if (typeof spec.command !== 'string' || typeof spec.cwd !== 'string' || !spec.env) {\n throw new Error(INVALID_COMMAND_SPEC_ERROR);\n }\n return { command: spec.command, cwd: spec.cwd, env: spec.env };\n}\n\nasync function waitForGate(target: string): Promise<void> {\n while (!fs.existsSync(target)) await new Promise((resolve) => setTimeout(resolve, POLL_MS));\n}\n\nfunction writeAtomic(target: string, value: unknown): void {\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(value)}\\n`, { mode: 0o600 });\n fs.renameSync(temporary, target);\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n main().then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n },\n );\n}\n"],"mappings":"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"}
@@ -1,6 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../session.cjs"),n=require("../tool/responseEnvelope.cjs");let r=require("node:fs");r=e.__toESM(r,1);const i=`completed`,a=`rmux`,o=`stopped`,s=`SIGTERM`;async function c(e,n){let[r,...i]=e;if(r!==void 0&&r!==`--help`&&r!==`-h`&&!t.inheritedSessionId(n.env))return n.stderr(`PI_SESSION_ID is required for doom-runner commands`),1;switch(r){case`list`:return l(i,n);case`status`:return u(i,n);case`logs`:return d(i,n);case`stop`:return f(i,n);case`stop-all`:return p(i,n);case`input`:return m(i,n);case`--help`:case`-h`:case void 0:return n.stdout(S()),0;default:return n.stderr(`Unknown command: ${r}\n\n${S()}`),1}}async function l(e,n){let r=t.requiredSessionId(n.env),i=e.includes(`--all`)?await n.registry.listAll(r):await n.registry.listBySession(r);return n.stdout(i.length>0?i.map(g).join(`
2
- `):`No runners`),0}async function u(e,t){let n=await h(e[0],t);return n?(t.stdout([`ID: ${n.id}`,`Name: ${n.name}`,`State: ${n.state}`,`Backend: ${n.backend}`,...n.backendTarget?[`Backend target: ${n.backendTarget}`]:[],`PID: ${n.pid}`,`Command: ${n.command}`,`CWD: ${n.cwd}`,`Session: ${n.sessionId}`,`Log: ${n.logPath}`,...n.exit?[`Exit: ${_(n)}`]:[]].join(`
3
- `)),0):1}async function d(e,t){let n=await h(e[0],t);if(!n)return 1;let r=y(v(e,`--lines`))??200,i=t.logReader.read(n.logPath,{lines:r});return i.exists?(i.text&&t.stdout(i.text),e.includes(`--follow`)?b(n,i.fileSize,t):0):(t.stderr(`Runner ${n.id} has not written a log yet`),1)}async function f(e,t){let n=await h(e[0],t);if(!n)return 1;if(n.state!==`running`)return t.stderr(`Runner ${n.id} is already ${n.state}`),1;await x(n,t);let r=v(e,`--reason`);return await t.registry.complete(n.id,{reason:o,code:null,signal:s,...r?{stopReason:r}:{}},n.sessionId),t.stdout(`Stopped ${n.id}\nLog: ${n.logPath}`),0}async function p(e,n){let r=t.requiredSessionId(n.env),i=await n.registry.listBySession(r),a=v(e,`--reason`);for(let e of i)await x(e,n),await n.registry.complete(e.id,{reason:o,code:null,signal:s,...a?{stopReason:a}:{}},e.sessionId);return n.stdout(i.length>0?`Stopped ${i.length} runner(s) for session ${r}: ${i.map(e=>e.id).join(`, `)}`:`No active runners for session ${r}`),0}async function m(e,t){let n=await h(e[0],t);if(!n)return 1;if(n.state===i)return t.stderr(`Runner ${n.id} is already completed; use doom-runner logs ${n.id}`),1;if(!n.interactive)return t.stderr(`Runner ${n.id} was not started with interactive: true`),1;let r=v(e,`--text`)??await t.readStdin(),o=e.includes(`--enter`)&&!r.endsWith(`
4
- `)?`${r}\n`:r;return n.backend!==a||!n.backendTarget?(t.stderr(`Runner ${n.id} uses the ${n.backend} backend, which does not expose CLI input`),1):await t.rmuxBackend.input(n.backendTarget,o)?(t.stdout(`Sent input to ${n.id}`),0):(t.stderr(`Runner ${n.id} is no longer accepting RMUX input`),1)}async function h(e,n){if(!e){n.stderr(`A runner ID is required`);return}let r=t.requiredSessionId(n.env),i=await n.registry.get(e,r);if(!i){n.stderr(`No runner with id ${e}`);return}return i}function g(e){let t=n.formatRunnerLine(e);return`${e.id} ${e.state} ${e.backend} ${t}`}function _(e){let t=e.exit;if(!t)return`unknown`;let n=t.code===null?t.signal?` ${t.signal}`:``:` code ${t.code}`,r=t.stopReason?` (${t.stopReason})`:``;return`${t.reason}${n}${r}`}function v(e,t){let n=e.indexOf(t);return n>=0?e[n+1]:void 0}function y(e){if(e===void 0)return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}async function b(e,t,n){let a=t;return new Promise(t=>{let o=!1,s,c=t=>{if(t.size<a&&(a=0),t.size===a)return;let i=t.size-a,o=Buffer.alloc(i),s=r.default.openSync(e.logPath,`r`);try{let e=r.default.readSync(s,o,0,i,a);e>0&&n.stdout(o.subarray(0,e).toString(`utf8`))}finally{r.default.closeSync(s)}a=t.size},l=()=>{if(!o){o=!0;try{c(r.default.statSync(e.logPath))}catch(t){t.code!==`ENOENT`&&n.stderr(`Runner ${e.id} failed to flush its final log output: ${t.message}`)}r.default.unwatchFile(e.logPath,c),clearInterval(s),process.off(`SIGINT`,l),t(0)}};process.once(`SIGINT`,l),r.default.watchFile(e.logPath,{interval:250},c),s=setInterval(()=>{n.registry.get(e.id).then(e=>{e?.state===i&&l()})},250)})}async function x(e,t){return e.backend===a&&e.backendTarget?t.rmuxBackend.stop(e.backendTarget,e.pid):t.launcher.stop(e.pid)}function S(){return[`Usage: doom-runner <command>`,``,`Commands:`,` list [--all]`,` status <id>`,` logs <id> [--lines N] [--follow]`,` stop <id> [--reason <text>]`,` stop-all [--reason <text>]`,` input <id> [--text <text>] [--enter]`].join(`
5
- `)}exports.runCli=c;
6
- //# sourceMappingURL=cliApp.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../src/commands/cli/cliApp.cjs");exports.runCli=e.runCli;
@@ -1,23 +1,2 @@
1
- import { ILauncher } from "../services/Launcher/types.cjs";
2
- import "../services/Launcher/index.cjs";
3
- import { ILogReader } from "../services/LogReader/types.cjs";
4
- import "../services/LogReader/index.cjs";
5
- import { IRmuxBackend } from "../services/RmuxBackend/types.cjs";
6
- import "../services/RmuxBackend/index.cjs";
7
- import { IRunnerRegistry } from "../services/RunnerRegistry/types.cjs";
8
- import "../services/RunnerRegistry/index.cjs";
9
- //#region src/cli/cliApp.d.ts
10
- interface CliDependencies {
11
- registry: IRunnerRegistry;
12
- launcher: ILauncher;
13
- rmuxBackend: IRmuxBackend;
14
- logReader: ILogReader;
15
- env?: NodeJS.ProcessEnv;
16
- stdout(text: string): void;
17
- stderr(text: string): void;
18
- readStdin(): Promise<string>;
19
- }
20
- declare function runCli(argv: readonly string[], dependencies: CliDependencies): Promise<number>;
21
- //#endregion
22
- export { CliDependencies, runCli };
23
- //# sourceMappingURL=cliApp.d.cts.map
1
+ import { CliDependencies, runCli } from "../src/commands/cli/cliApp.cjs";
2
+ export { CliDependencies, runCli };
@@ -1,23 +1,2 @@
1
- import { ILauncher } from "../services/Launcher/types.mjs";
2
- import "../services/Launcher/index.mjs";
3
- import { ILogReader } from "../services/LogReader/types.mjs";
4
- import "../services/LogReader/index.mjs";
5
- import { IRmuxBackend } from "../services/RmuxBackend/types.mjs";
6
- import "../services/RmuxBackend/index.mjs";
7
- import { IRunnerRegistry } from "../services/RunnerRegistry/types.mjs";
8
- import "../services/RunnerRegistry/index.mjs";
9
- //#region src/cli/cliApp.d.ts
10
- interface CliDependencies {
11
- registry: IRunnerRegistry;
12
- launcher: ILauncher;
13
- rmuxBackend: IRmuxBackend;
14
- logReader: ILogReader;
15
- env?: NodeJS.ProcessEnv;
16
- stdout(text: string): void;
17
- stderr(text: string): void;
18
- readStdin(): Promise<string>;
19
- }
20
- declare function runCli(argv: readonly string[], dependencies: CliDependencies): Promise<number>;
21
- //#endregion
22
- export { CliDependencies, runCli };
23
- //# sourceMappingURL=cliApp.d.mts.map
1
+ import { CliDependencies, runCli } from "../src/commands/cli/cliApp.mjs";
2
+ export { CliDependencies, runCli };
@@ -1,6 +1 @@
1
- import{inheritedSessionId as e,requiredSessionId as t}from"../session.mjs";import{formatRunnerLine as n}from"../tool/responseEnvelope.mjs";import r from"node:fs";const i=`completed`,a=`rmux`,o=`stopped`,s=`SIGTERM`;async function c(t,n){let[r,...i]=t;if(r!==void 0&&r!==`--help`&&r!==`-h`&&!e(n.env))return n.stderr(`PI_SESSION_ID is required for doom-runner commands`),1;switch(r){case`list`:return l(i,n);case`status`:return u(i,n);case`logs`:return d(i,n);case`stop`:return f(i,n);case`stop-all`:return p(i,n);case`input`:return m(i,n);case`--help`:case`-h`:case void 0:return n.stdout(S()),0;default:return n.stderr(`Unknown command: ${r}\n\n${S()}`),1}}async function l(e,n){let r=t(n.env),i=e.includes(`--all`)?await n.registry.listAll(r):await n.registry.listBySession(r);return n.stdout(i.length>0?i.map(g).join(`
2
- `):`No runners`),0}async function u(e,t){let n=await h(e[0],t);return n?(t.stdout([`ID: ${n.id}`,`Name: ${n.name}`,`State: ${n.state}`,`Backend: ${n.backend}`,...n.backendTarget?[`Backend target: ${n.backendTarget}`]:[],`PID: ${n.pid}`,`Command: ${n.command}`,`CWD: ${n.cwd}`,`Session: ${n.sessionId}`,`Log: ${n.logPath}`,...n.exit?[`Exit: ${_(n)}`]:[]].join(`
3
- `)),0):1}async function d(e,t){let n=await h(e[0],t);if(!n)return 1;let r=y(v(e,`--lines`))??200,i=t.logReader.read(n.logPath,{lines:r});return i.exists?(i.text&&t.stdout(i.text),e.includes(`--follow`)?b(n,i.fileSize,t):0):(t.stderr(`Runner ${n.id} has not written a log yet`),1)}async function f(e,t){let n=await h(e[0],t);if(!n)return 1;if(n.state!==`running`)return t.stderr(`Runner ${n.id} is already ${n.state}`),1;await x(n,t);let r=v(e,`--reason`);return await t.registry.complete(n.id,{reason:o,code:null,signal:s,...r?{stopReason:r}:{}},n.sessionId),t.stdout(`Stopped ${n.id}\nLog: ${n.logPath}`),0}async function p(e,n){let r=t(n.env),i=await n.registry.listBySession(r),a=v(e,`--reason`);for(let e of i)await x(e,n),await n.registry.complete(e.id,{reason:o,code:null,signal:s,...a?{stopReason:a}:{}},e.sessionId);return n.stdout(i.length>0?`Stopped ${i.length} runner(s) for session ${r}: ${i.map(e=>e.id).join(`, `)}`:`No active runners for session ${r}`),0}async function m(e,t){let n=await h(e[0],t);if(!n)return 1;if(n.state===i)return t.stderr(`Runner ${n.id} is already completed; use doom-runner logs ${n.id}`),1;if(!n.interactive)return t.stderr(`Runner ${n.id} was not started with interactive: true`),1;let r=v(e,`--text`)??await t.readStdin(),o=e.includes(`--enter`)&&!r.endsWith(`
4
- `)?`${r}\n`:r;return n.backend!==a||!n.backendTarget?(t.stderr(`Runner ${n.id} uses the ${n.backend} backend, which does not expose CLI input`),1):await t.rmuxBackend.input(n.backendTarget,o)?(t.stdout(`Sent input to ${n.id}`),0):(t.stderr(`Runner ${n.id} is no longer accepting RMUX input`),1)}async function h(e,n){if(!e){n.stderr(`A runner ID is required`);return}let r=t(n.env),i=await n.registry.get(e,r);if(!i){n.stderr(`No runner with id ${e}`);return}return i}function g(e){let t=n(e);return`${e.id} ${e.state} ${e.backend} ${t}`}function _(e){let t=e.exit;if(!t)return`unknown`;let n=t.code===null?t.signal?` ${t.signal}`:``:` code ${t.code}`,r=t.stopReason?` (${t.stopReason})`:``;return`${t.reason}${n}${r}`}function v(e,t){let n=e.indexOf(t);return n>=0?e[n+1]:void 0}function y(e){if(e===void 0)return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}async function b(e,t,n){let a=t;return new Promise(t=>{let o=!1,s,c=t=>{if(t.size<a&&(a=0),t.size===a)return;let i=t.size-a,o=Buffer.alloc(i),s=r.openSync(e.logPath,`r`);try{let e=r.readSync(s,o,0,i,a);e>0&&n.stdout(o.subarray(0,e).toString(`utf8`))}finally{r.closeSync(s)}a=t.size},l=()=>{if(!o){o=!0;try{c(r.statSync(e.logPath))}catch(t){t.code!==`ENOENT`&&n.stderr(`Runner ${e.id} failed to flush its final log output: ${t.message}`)}r.unwatchFile(e.logPath,c),clearInterval(s),process.off(`SIGINT`,l),t(0)}};process.once(`SIGINT`,l),r.watchFile(e.logPath,{interval:250},c),s=setInterval(()=>{n.registry.get(e.id).then(e=>{e?.state===i&&l()})},250)})}async function x(e,t){return e.backend===a&&e.backendTarget?t.rmuxBackend.stop(e.backendTarget,e.pid):t.launcher.stop(e.pid)}function S(){return[`Usage: doom-runner <command>`,``,`Commands:`,` list [--all]`,` status <id>`,` logs <id> [--lines N] [--follow]`,` stop <id> [--reason <text>]`,` stop-all [--reason <text>]`,` input <id> [--text <text>] [--enter]`].join(`
5
- `)}export{c as runCli};
6
- //# sourceMappingURL=cliApp.mjs.map
1
+ import{runCli as e}from"../src/commands/cli/cliApp.mjs";export{e as runCli};
@@ -1,4 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=`Active background runners survived compaction:`;function t(t){if(t.length===0)return``;let n=t.flatMap(e=>[`- ${e.name} (${e.id}), log: ${e.logPath}`,` Check: doom-runner status ${e.id}`,` Stream: doom-runner logs ${e.id} --follow`]);return[e,...n,`Use these CLI commands to inspect existing runners before launching another command.`].join(`
2
- `)}function n(n,r){return r.length===0||n.includes(e)?n:[n,``,t(r)].join(`
3
- `)}function r(e,n){e.on(`session_compact`,async()=>{let r=n.getSessionId();if(!r)return;let i;try{i=await n.listBySession(r)}catch{return}let a=t(i);a&&e.sendMessage({customType:`doom-runner-compaction`,content:a,display:!1,details:{sessionId:r,runnerIds:i.map(e=>e.id)}},{triggerTurn:!1,deliverAs:`steer`})})}exports.activeRunnerRecovery=t,exports.appendActiveRunnersToSummary=n,exports.registerRunnerCompactionRecovery=r;
4
- //# sourceMappingURL=compaction.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/services/runs/compaction.cjs");exports.activeRunnerRecovery=e.activeRunnerRecovery,exports.appendActiveRunnersToSummary=e.appendActiveRunnersToSummary,exports.registerRunnerCompactionRecovery=e.registerRunnerCompactionRecovery;
@@ -1,14 +1,2 @@
1
- import { RunnerRecord } from "./services/RunnerRegistry/types.cjs";
2
- import "./services/RunnerRegistry/index.cjs";
3
- import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
4
- //#region src/compaction.d.ts
5
- interface RunnerCompactionDependencies {
6
- getSessionId(): string | undefined;
7
- listBySession(sessionId: string): Promise<RunnerRecord[]>;
8
- }
9
- declare function activeRunnerRecovery(active: readonly RunnerRecord[]): string;
10
- declare function appendActiveRunnersToSummary(summary: string, active: readonly RunnerRecord[]): string;
11
- declare function registerRunnerCompactionRecovery(pi: ExtensionAPI, dependencies: RunnerCompactionDependencies): void;
12
- //#endregion
13
- export { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery };
14
- //# sourceMappingURL=compaction.d.cts.map
1
+ import { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery } from "./src/services/runs/compaction.cjs";
2
+ export { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery };
@@ -1,14 +1,2 @@
1
- import { RunnerRecord } from "./services/RunnerRegistry/types.mjs";
2
- import "./services/RunnerRegistry/index.mjs";
3
- import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
4
- //#region src/compaction.d.ts
5
- interface RunnerCompactionDependencies {
6
- getSessionId(): string | undefined;
7
- listBySession(sessionId: string): Promise<RunnerRecord[]>;
8
- }
9
- declare function activeRunnerRecovery(active: readonly RunnerRecord[]): string;
10
- declare function appendActiveRunnersToSummary(summary: string, active: readonly RunnerRecord[]): string;
11
- declare function registerRunnerCompactionRecovery(pi: ExtensionAPI, dependencies: RunnerCompactionDependencies): void;
12
- //#endregion
13
- export { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery };
14
- //# sourceMappingURL=compaction.d.mts.map
1
+ import { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery } from "./src/services/runs/compaction.mjs";
2
+ export { RunnerCompactionDependencies, activeRunnerRecovery, appendActiveRunnersToSummary, registerRunnerCompactionRecovery };
@@ -1,4 +1 @@
1
- const e=`Active background runners survived compaction:`;function t(t){if(t.length===0)return``;let n=t.flatMap(e=>[`- ${e.name} (${e.id}), log: ${e.logPath}`,` Check: doom-runner status ${e.id}`,` Stream: doom-runner logs ${e.id} --follow`]);return[e,...n,`Use these CLI commands to inspect existing runners before launching another command.`].join(`
2
- `)}function n(n,r){return r.length===0||n.includes(e)?n:[n,``,t(r)].join(`
3
- `)}function r(e,n){e.on(`session_compact`,async()=>{let r=n.getSessionId();if(!r)return;let i;try{i=await n.listBySession(r)}catch{return}let a=t(i);a&&e.sendMessage({customType:`doom-runner-compaction`,content:a,display:!1,details:{sessionId:r,runnerIds:i.map(e=>e.id)}},{triggerTurn:!1,deliverAs:`steer`})})}export{t as activeRunnerRecovery,n as appendActiveRunnersToSummary,r as registerRunnerCompactionRecovery};
4
- //# sourceMappingURL=compaction.mjs.map
1
+ import{activeRunnerRecovery as e,appendActiveRunnersToSummary as t,registerRunnerCompactionRecovery as n}from"./src/services/runs/compaction.mjs";export{e as activeRunnerRecovery,t as appendActiveRunnersToSummary,n as registerRunnerCompactionRecovery};
package/dist/config.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=`DOOM_RUNNER_BG_THRESHOLD_MS`,t=`DOOM_RUNNER_RESULT_MAX_BYTES`,n=`DOOM_RUNNER_LOG_MAX_BYTES`,r=`DOOM_RUNNER_LOG_TTL_MS`,i=6e4,a=51200,o=5242880,s=6048e5;function c(e,t){let n=Number(e);return Number.isFinite(n)&&n>0?n:t}function l(t=process.env){return c(t[e],i)}function u(e=process.env){return c(e[t],a)}function d(e=process.env){return c(e[n],o)}function f(e=process.env){return c(e[r],s)}exports.BG_THRESHOLD_MS_ENV=e,exports.DEFAULT_BG_THRESHOLD_MS=i,exports.DEFAULT_LOG_MAX_BYTES=o,exports.DEFAULT_LOG_TTL_MS=s,exports.DEFAULT_RESULT_MAX_BYTES=a,exports.LOG_DIR_ENV=`DOOM_RUNNER_LOG_DIR`,exports.LOG_MAX_BYTES_ENV=n,exports.LOG_TTL_MS_ENV=r,exports.RESULT_MAX_BYTES_ENV=t,exports.getBackgroundThresholdMs=l,exports.getLogMaxBytes=d,exports.getLogTtlMs=f,exports.getResultMaxBytes=u;
2
- //# sourceMappingURL=config.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src/types/config.cjs");exports.BG_THRESHOLD_MS_ENV=e.BG_THRESHOLD_MS_ENV,exports.DEFAULT_BG_THRESHOLD_MS=e.DEFAULT_BG_THRESHOLD_MS,exports.DEFAULT_LOG_MAX_BYTES=e.DEFAULT_LOG_MAX_BYTES,exports.DEFAULT_LOG_TTL_MS=e.DEFAULT_LOG_TTL_MS,exports.DEFAULT_RESULT_MAX_BYTES=e.DEFAULT_RESULT_MAX_BYTES,exports.LOG_DIR_ENV=e.LOG_DIR_ENV,exports.LOG_MAX_BYTES_ENV=e.LOG_MAX_BYTES_ENV,exports.LOG_TTL_MS_ENV=e.LOG_TTL_MS_ENV,exports.RESULT_MAX_BYTES_ENV=e.RESULT_MAX_BYTES_ENV,exports.getBackgroundThresholdMs=e.getBackgroundThresholdMs,exports.getLogMaxBytes=e.getLogMaxBytes,exports.getLogTtlMs=e.getLogTtlMs,exports.getResultMaxBytes=e.getResultMaxBytes;