@agimon-ai/doompi-runner 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs +1 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs +1 -0
  5. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.cjs +1 -0
  6. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.mjs +1 -0
  7. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.cjs +1 -0
  8. package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.mjs +1 -0
  9. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  10. package/dist/bin/cli.cjs +5 -0
  11. package/dist/bin/cli.cjs.map +1 -0
  12. package/dist/bin/cli.d.cts +5 -0
  13. package/dist/bin/cli.d.cts.map +1 -0
  14. package/dist/bin/cli.d.mts +5 -0
  15. package/dist/bin/cli.d.mts.map +1 -0
  16. package/dist/bin/cli.mjs +5 -0
  17. package/dist/bin/cli.mjs.map +1 -0
  18. package/dist/bin/logSink.cjs +2 -0
  19. package/dist/bin/logSink.cjs.map +1 -0
  20. package/dist/bin/logSink.d.cts +5 -0
  21. package/dist/bin/logSink.d.cts.map +1 -0
  22. package/dist/bin/logSink.d.mts +5 -0
  23. package/dist/bin/logSink.d.mts.map +1 -0
  24. package/dist/bin/logSink.mjs +2 -0
  25. package/dist/bin/logSink.mjs.map +1 -0
  26. package/dist/bin/runnerHost.cjs +2 -0
  27. package/dist/bin/runnerHost.cjs.map +1 -0
  28. package/dist/bin/runnerHost.d.cts +5 -0
  29. package/dist/bin/runnerHost.d.cts.map +1 -0
  30. package/dist/bin/runnerHost.d.mts +5 -0
  31. package/dist/bin/runnerHost.d.mts.map +1 -0
  32. package/dist/bin/runnerHost.mjs +2 -0
  33. package/dist/bin/runnerHost.mjs.map +1 -0
  34. package/dist/cli/cliApp.cjs +6 -0
  35. package/dist/cli/cliApp.cjs.map +1 -0
  36. package/dist/cli/cliApp.d.cts +23 -0
  37. package/dist/cli/cliApp.d.cts.map +1 -0
  38. package/dist/cli/cliApp.d.mts +23 -0
  39. package/dist/cli/cliApp.d.mts.map +1 -0
  40. package/dist/cli/cliApp.mjs +6 -0
  41. package/dist/cli/cliApp.mjs.map +1 -0
  42. package/dist/compaction.cjs +4 -0
  43. package/dist/compaction.cjs.map +1 -0
  44. package/dist/compaction.d.cts +14 -0
  45. package/dist/compaction.d.cts.map +1 -0
  46. package/dist/compaction.d.mts +14 -0
  47. package/dist/compaction.d.mts.map +1 -0
  48. package/dist/compaction.mjs +4 -0
  49. package/dist/compaction.mjs.map +1 -0
  50. package/dist/config.cjs +2 -0
  51. package/dist/config.cjs.map +1 -0
  52. package/dist/config.d.cts +32 -0
  53. package/dist/config.d.cts.map +1 -0
  54. package/dist/config.d.mts +32 -0
  55. package/dist/config.d.mts.map +1 -0
  56. package/dist/config.mjs +2 -0
  57. package/dist/config.mjs.map +1 -0
  58. package/dist/container/index.cjs +2 -0
  59. package/dist/container/index.cjs.map +1 -0
  60. package/dist/container/index.d.cts +14 -0
  61. package/dist/container/index.d.cts.map +1 -0
  62. package/dist/container/index.d.mts +14 -0
  63. package/dist/container/index.d.mts.map +1 -0
  64. package/dist/container/index.mjs +2 -0
  65. package/dist/container/index.mjs.map +1 -0
  66. package/dist/extension.cjs +3 -0
  67. package/dist/extension.cjs.map +1 -0
  68. package/dist/extension.d.cts +10 -0
  69. package/dist/extension.d.cts.map +1 -0
  70. package/dist/extension.d.mts +10 -0
  71. package/dist/extension.d.mts.map +1 -0
  72. package/dist/extension.mjs +3 -0
  73. package/dist/extension.mjs.map +1 -0
  74. package/dist/extensions/pi.cjs +2 -0
  75. package/dist/extensions/pi.cjs.map +1 -0
  76. package/dist/extensions/pi.d.cts +2 -0
  77. package/dist/extensions/pi.d.mts +2 -0
  78. package/dist/extensions/pi.mjs +2 -0
  79. package/dist/extensions/pi.mjs.map +1 -0
  80. package/dist/index.cjs +1 -0
  81. package/dist/index.d.cts +7 -0
  82. package/dist/index.d.mts +7 -0
  83. package/dist/index.mjs +1 -0
  84. package/dist/ptyProvider.cjs +2 -0
  85. package/dist/ptyProvider.cjs.map +1 -0
  86. package/dist/ptyProvider.d.cts +13 -0
  87. package/dist/ptyProvider.d.cts.map +1 -0
  88. package/dist/ptyProvider.d.mts +13 -0
  89. package/dist/ptyProvider.d.mts.map +1 -0
  90. package/dist/ptyProvider.mjs +2 -0
  91. package/dist/ptyProvider.mjs.map +1 -0
  92. package/dist/reconcile.cjs +2 -0
  93. package/dist/reconcile.cjs.map +1 -0
  94. package/dist/reconcile.d.cts +37 -0
  95. package/dist/reconcile.d.cts.map +1 -0
  96. package/dist/reconcile.d.mts +37 -0
  97. package/dist/reconcile.d.mts.map +1 -0
  98. package/dist/reconcile.mjs +2 -0
  99. package/dist/reconcile.mjs.map +1 -0
  100. package/dist/runnerSpec.cjs +2 -0
  101. package/dist/runnerSpec.cjs.map +1 -0
  102. package/dist/runnerSpec.d.cts +50 -0
  103. package/dist/runnerSpec.d.cts.map +1 -0
  104. package/dist/runnerSpec.d.mts +50 -0
  105. package/dist/runnerSpec.d.mts.map +1 -0
  106. package/dist/runnerSpec.mjs +2 -0
  107. package/dist/runnerSpec.mjs.map +1 -0
  108. package/dist/services/AnsiScrub/ansiScrub.cjs +5 -0
  109. package/dist/services/AnsiScrub/ansiScrub.cjs.map +1 -0
  110. package/dist/services/AnsiScrub/ansiScrub.d.cts +34 -0
  111. package/dist/services/AnsiScrub/ansiScrub.d.cts.map +1 -0
  112. package/dist/services/AnsiScrub/ansiScrub.d.mts +34 -0
  113. package/dist/services/AnsiScrub/ansiScrub.d.mts.map +1 -0
  114. package/dist/services/AnsiScrub/ansiScrub.mjs +5 -0
  115. package/dist/services/AnsiScrub/ansiScrub.mjs.map +1 -0
  116. package/dist/services/AnsiScrub/index.cjs +1 -0
  117. package/dist/services/AnsiScrub/index.d.cts +2 -0
  118. package/dist/services/AnsiScrub/index.d.mts +2 -0
  119. package/dist/services/AnsiScrub/index.mjs +1 -0
  120. package/dist/services/BashRunService/BashRunService.cjs +2 -0
  121. package/dist/services/BashRunService/BashRunService.cjs.map +1 -0
  122. package/dist/services/BashRunService/BashRunService.d.cts +38 -0
  123. package/dist/services/BashRunService/BashRunService.d.cts.map +1 -0
  124. package/dist/services/BashRunService/BashRunService.d.mts +38 -0
  125. package/dist/services/BashRunService/BashRunService.d.mts.map +1 -0
  126. package/dist/services/BashRunService/BashRunService.mjs +2 -0
  127. package/dist/services/BashRunService/BashRunService.mjs.map +1 -0
  128. package/dist/services/BashRunService/index.cjs +1 -0
  129. package/dist/services/BashRunService/index.d.cts +3 -0
  130. package/dist/services/BashRunService/index.d.mts +3 -0
  131. package/dist/services/BashRunService/index.mjs +1 -0
  132. package/dist/services/BashRunService/types.d.cts +62 -0
  133. package/dist/services/BashRunService/types.d.cts.map +1 -0
  134. package/dist/services/BashRunService/types.d.mts +62 -0
  135. package/dist/services/BashRunService/types.d.mts.map +1 -0
  136. package/dist/services/Clock/SystemClock.cjs +2 -0
  137. package/dist/services/Clock/SystemClock.cjs.map +1 -0
  138. package/dist/services/Clock/SystemClock.d.cts +11 -0
  139. package/dist/services/Clock/SystemClock.d.cts.map +1 -0
  140. package/dist/services/Clock/SystemClock.d.mts +11 -0
  141. package/dist/services/Clock/SystemClock.d.mts.map +1 -0
  142. package/dist/services/Clock/SystemClock.mjs +2 -0
  143. package/dist/services/Clock/SystemClock.mjs.map +1 -0
  144. package/dist/services/Clock/index.cjs +1 -0
  145. package/dist/services/Clock/index.d.cts +3 -0
  146. package/dist/services/Clock/index.d.mts +3 -0
  147. package/dist/services/Clock/index.mjs +1 -0
  148. package/dist/services/Clock/types.d.cts +11 -0
  149. package/dist/services/Clock/types.d.cts.map +1 -0
  150. package/dist/services/Clock/types.d.mts +11 -0
  151. package/dist/services/Clock/types.d.mts.map +1 -0
  152. package/dist/services/Launcher/Launcher.cjs +2 -0
  153. package/dist/services/Launcher/Launcher.cjs.map +1 -0
  154. package/dist/services/Launcher/Launcher.d.cts +27 -0
  155. package/dist/services/Launcher/Launcher.d.cts.map +1 -0
  156. package/dist/services/Launcher/Launcher.d.mts +27 -0
  157. package/dist/services/Launcher/Launcher.d.mts.map +1 -0
  158. package/dist/services/Launcher/Launcher.mjs +2 -0
  159. package/dist/services/Launcher/Launcher.mjs.map +1 -0
  160. package/dist/services/Launcher/index.cjs +1 -0
  161. package/dist/services/Launcher/index.d.cts +3 -0
  162. package/dist/services/Launcher/index.d.mts +3 -0
  163. package/dist/services/Launcher/index.mjs +1 -0
  164. package/dist/services/Launcher/types.d.cts +40 -0
  165. package/dist/services/Launcher/types.d.cts.map +1 -0
  166. package/dist/services/Launcher/types.d.mts +40 -0
  167. package/dist/services/Launcher/types.d.mts.map +1 -0
  168. package/dist/services/Lifeline/NodeLifeline.cjs +2 -0
  169. package/dist/services/Lifeline/NodeLifeline.cjs.map +1 -0
  170. package/dist/services/Lifeline/NodeLifeline.d.cts +21 -0
  171. package/dist/services/Lifeline/NodeLifeline.d.cts.map +1 -0
  172. package/dist/services/Lifeline/NodeLifeline.d.mts +21 -0
  173. package/dist/services/Lifeline/NodeLifeline.d.mts.map +1 -0
  174. package/dist/services/Lifeline/NodeLifeline.mjs +2 -0
  175. package/dist/services/Lifeline/NodeLifeline.mjs.map +1 -0
  176. package/dist/services/Lifeline/client.cjs +2 -0
  177. package/dist/services/Lifeline/client.cjs.map +1 -0
  178. package/dist/services/Lifeline/client.d.cts +23 -0
  179. package/dist/services/Lifeline/client.d.cts.map +1 -0
  180. package/dist/services/Lifeline/client.d.mts +23 -0
  181. package/dist/services/Lifeline/client.d.mts.map +1 -0
  182. package/dist/services/Lifeline/client.mjs +2 -0
  183. package/dist/services/Lifeline/client.mjs.map +1 -0
  184. package/dist/services/Lifeline/index.cjs +1 -0
  185. package/dist/services/Lifeline/index.d.cts +4 -0
  186. package/dist/services/Lifeline/index.d.mts +4 -0
  187. package/dist/services/Lifeline/index.mjs +1 -0
  188. package/dist/services/Lifeline/types.d.cts +19 -0
  189. package/dist/services/Lifeline/types.d.cts.map +1 -0
  190. package/dist/services/Lifeline/types.d.mts +19 -0
  191. package/dist/services/Lifeline/types.d.mts.map +1 -0
  192. package/dist/services/LogFile/LogFile.cjs +2 -0
  193. package/dist/services/LogFile/LogFile.cjs.map +1 -0
  194. package/dist/services/LogFile/LogFile.d.cts +13 -0
  195. package/dist/services/LogFile/LogFile.d.cts.map +1 -0
  196. package/dist/services/LogFile/LogFile.d.mts +13 -0
  197. package/dist/services/LogFile/LogFile.d.mts.map +1 -0
  198. package/dist/services/LogFile/LogFile.mjs +2 -0
  199. package/dist/services/LogFile/LogFile.mjs.map +1 -0
  200. package/dist/services/LogFile/index.cjs +1 -0
  201. package/dist/services/LogFile/index.d.cts +3 -0
  202. package/dist/services/LogFile/index.d.mts +3 -0
  203. package/dist/services/LogFile/index.mjs +1 -0
  204. package/dist/services/LogFile/types.d.cts +16 -0
  205. package/dist/services/LogFile/types.d.cts.map +1 -0
  206. package/dist/services/LogFile/types.d.mts +16 -0
  207. package/dist/services/LogFile/types.d.mts.map +1 -0
  208. package/dist/services/LogReader/LogReader.cjs +10 -0
  209. package/dist/services/LogReader/LogReader.cjs.map +1 -0
  210. package/dist/services/LogReader/LogReader.d.cts +14 -0
  211. package/dist/services/LogReader/LogReader.d.cts.map +1 -0
  212. package/dist/services/LogReader/LogReader.d.mts +14 -0
  213. package/dist/services/LogReader/LogReader.d.mts.map +1 -0
  214. package/dist/services/LogReader/LogReader.mjs +10 -0
  215. package/dist/services/LogReader/LogReader.mjs.map +1 -0
  216. package/dist/services/LogReader/index.cjs +1 -0
  217. package/dist/services/LogReader/index.d.cts +3 -0
  218. package/dist/services/LogReader/index.d.mts +3 -0
  219. package/dist/services/LogReader/index.mjs +1 -0
  220. package/dist/services/LogReader/types.d.cts +27 -0
  221. package/dist/services/LogReader/types.d.cts.map +1 -0
  222. package/dist/services/LogReader/types.d.mts +27 -0
  223. package/dist/services/LogReader/types.d.mts.map +1 -0
  224. package/dist/services/ProcessControl/NodeProcessControl.cjs +2 -0
  225. package/dist/services/ProcessControl/NodeProcessControl.cjs.map +1 -0
  226. package/dist/services/ProcessControl/NodeProcessControl.d.cts +11 -0
  227. package/dist/services/ProcessControl/NodeProcessControl.d.cts.map +1 -0
  228. package/dist/services/ProcessControl/NodeProcessControl.d.mts +11 -0
  229. package/dist/services/ProcessControl/NodeProcessControl.d.mts.map +1 -0
  230. package/dist/services/ProcessControl/NodeProcessControl.mjs +2 -0
  231. package/dist/services/ProcessControl/NodeProcessControl.mjs.map +1 -0
  232. package/dist/services/ProcessControl/index.cjs +1 -0
  233. package/dist/services/ProcessControl/index.d.cts +3 -0
  234. package/dist/services/ProcessControl/index.d.mts +3 -0
  235. package/dist/services/ProcessControl/index.mjs +1 -0
  236. package/dist/services/ProcessControl/types.d.cts +14 -0
  237. package/dist/services/ProcessControl/types.d.cts.map +1 -0
  238. package/dist/services/ProcessControl/types.d.mts +14 -0
  239. package/dist/services/ProcessControl/types.d.mts.map +1 -0
  240. package/dist/services/PtyHost/PtyHost.cjs +5 -0
  241. package/dist/services/PtyHost/PtyHost.cjs.map +1 -0
  242. package/dist/services/PtyHost/PtyHost.d.cts +28 -0
  243. package/dist/services/PtyHost/PtyHost.d.cts.map +1 -0
  244. package/dist/services/PtyHost/PtyHost.d.mts +28 -0
  245. package/dist/services/PtyHost/PtyHost.d.mts.map +1 -0
  246. package/dist/services/PtyHost/PtyHost.mjs +5 -0
  247. package/dist/services/PtyHost/PtyHost.mjs.map +1 -0
  248. package/dist/services/PtyHost/index.cjs +1 -0
  249. package/dist/services/PtyHost/index.d.cts +3 -0
  250. package/dist/services/PtyHost/index.d.mts +3 -0
  251. package/dist/services/PtyHost/index.mjs +1 -0
  252. package/dist/services/PtyHost/types.d.cts +39 -0
  253. package/dist/services/PtyHost/types.d.cts.map +1 -0
  254. package/dist/services/PtyHost/types.d.mts +39 -0
  255. package/dist/services/PtyHost/types.d.mts.map +1 -0
  256. package/dist/services/PtySpawner/NodePtySpawner.cjs +2 -0
  257. package/dist/services/PtySpawner/NodePtySpawner.cjs.map +1 -0
  258. package/dist/services/PtySpawner/NodePtySpawner.d.cts +18 -0
  259. package/dist/services/PtySpawner/NodePtySpawner.d.cts.map +1 -0
  260. package/dist/services/PtySpawner/NodePtySpawner.d.mts +18 -0
  261. package/dist/services/PtySpawner/NodePtySpawner.d.mts.map +1 -0
  262. package/dist/services/PtySpawner/NodePtySpawner.mjs +2 -0
  263. package/dist/services/PtySpawner/NodePtySpawner.mjs.map +1 -0
  264. package/dist/services/PtySpawner/index.cjs +1 -0
  265. package/dist/services/PtySpawner/index.d.cts +3 -0
  266. package/dist/services/PtySpawner/index.d.mts +3 -0
  267. package/dist/services/PtySpawner/index.mjs +1 -0
  268. package/dist/services/PtySpawner/types.d.cts +28 -0
  269. package/dist/services/PtySpawner/types.d.cts.map +1 -0
  270. package/dist/services/PtySpawner/types.d.mts +28 -0
  271. package/dist/services/PtySpawner/types.d.mts.map +1 -0
  272. package/dist/services/RmuxBackend/RmuxBackend.cjs +2 -0
  273. package/dist/services/RmuxBackend/RmuxBackend.cjs.map +1 -0
  274. package/dist/services/RmuxBackend/RmuxBackend.d.cts +36 -0
  275. package/dist/services/RmuxBackend/RmuxBackend.d.cts.map +1 -0
  276. package/dist/services/RmuxBackend/RmuxBackend.d.mts +36 -0
  277. package/dist/services/RmuxBackend/RmuxBackend.d.mts.map +1 -0
  278. package/dist/services/RmuxBackend/RmuxBackend.mjs +2 -0
  279. package/dist/services/RmuxBackend/RmuxBackend.mjs.map +1 -0
  280. package/dist/services/RmuxBackend/index.cjs +1 -0
  281. package/dist/services/RmuxBackend/index.d.cts +3 -0
  282. package/dist/services/RmuxBackend/index.d.mts +3 -0
  283. package/dist/services/RmuxBackend/index.mjs +1 -0
  284. package/dist/services/RmuxBackend/types.d.cts +29 -0
  285. package/dist/services/RmuxBackend/types.d.cts.map +1 -0
  286. package/dist/services/RmuxBackend/types.d.mts +29 -0
  287. package/dist/services/RmuxBackend/types.d.mts.map +1 -0
  288. package/dist/services/RunnerNamer/RunnerNamer.cjs +2 -0
  289. package/dist/services/RunnerNamer/RunnerNamer.cjs.map +1 -0
  290. package/dist/services/RunnerNamer/RunnerNamer.d.cts +13 -0
  291. package/dist/services/RunnerNamer/RunnerNamer.d.cts.map +1 -0
  292. package/dist/services/RunnerNamer/RunnerNamer.d.mts +13 -0
  293. package/dist/services/RunnerNamer/RunnerNamer.d.mts.map +1 -0
  294. package/dist/services/RunnerNamer/RunnerNamer.mjs +2 -0
  295. package/dist/services/RunnerNamer/RunnerNamer.mjs.map +1 -0
  296. package/dist/services/RunnerNamer/index.cjs +1 -0
  297. package/dist/services/RunnerNamer/index.d.cts +3 -0
  298. package/dist/services/RunnerNamer/index.d.mts +3 -0
  299. package/dist/services/RunnerNamer/index.mjs +1 -0
  300. package/dist/services/RunnerNamer/types.d.cts +12 -0
  301. package/dist/services/RunnerNamer/types.d.cts.map +1 -0
  302. package/dist/services/RunnerNamer/types.d.mts +12 -0
  303. package/dist/services/RunnerNamer/types.d.mts.map +1 -0
  304. package/dist/services/RunnerPaths/RunnerPaths.cjs +2 -0
  305. package/dist/services/RunnerPaths/RunnerPaths.cjs.map +1 -0
  306. package/dist/services/RunnerPaths/RunnerPaths.d.cts +31 -0
  307. package/dist/services/RunnerPaths/RunnerPaths.d.cts.map +1 -0
  308. package/dist/services/RunnerPaths/RunnerPaths.d.mts +31 -0
  309. package/dist/services/RunnerPaths/RunnerPaths.d.mts.map +1 -0
  310. package/dist/services/RunnerPaths/RunnerPaths.mjs +2 -0
  311. package/dist/services/RunnerPaths/RunnerPaths.mjs.map +1 -0
  312. package/dist/services/RunnerPaths/index.cjs +1 -0
  313. package/dist/services/RunnerPaths/index.d.cts +3 -0
  314. package/dist/services/RunnerPaths/index.d.mts +3 -0
  315. package/dist/services/RunnerPaths/index.mjs +1 -0
  316. package/dist/services/RunnerPaths/types.d.cts +33 -0
  317. package/dist/services/RunnerPaths/types.d.cts.map +1 -0
  318. package/dist/services/RunnerPaths/types.d.mts +33 -0
  319. package/dist/services/RunnerPaths/types.d.mts.map +1 -0
  320. package/dist/services/RunnerRegistry/RunnerRegistry.cjs +2 -0
  321. package/dist/services/RunnerRegistry/RunnerRegistry.cjs.map +1 -0
  322. package/dist/services/RunnerRegistry/RunnerRegistry.d.cts +40 -0
  323. package/dist/services/RunnerRegistry/RunnerRegistry.d.cts.map +1 -0
  324. package/dist/services/RunnerRegistry/RunnerRegistry.d.mts +40 -0
  325. package/dist/services/RunnerRegistry/RunnerRegistry.d.mts.map +1 -0
  326. package/dist/services/RunnerRegistry/RunnerRegistry.mjs +2 -0
  327. package/dist/services/RunnerRegistry/RunnerRegistry.mjs.map +1 -0
  328. package/dist/services/RunnerRegistry/index.cjs +1 -0
  329. package/dist/services/RunnerRegistry/index.d.cts +3 -0
  330. package/dist/services/RunnerRegistry/index.d.mts +3 -0
  331. package/dist/services/RunnerRegistry/index.mjs +1 -0
  332. package/dist/services/RunnerRegistry/types.d.cts +98 -0
  333. package/dist/services/RunnerRegistry/types.d.cts.map +1 -0
  334. package/dist/services/RunnerRegistry/types.d.mts +98 -0
  335. package/dist/services/RunnerRegistry/types.d.mts.map +1 -0
  336. package/dist/services/Spawner/NodeSpawner.cjs +2 -0
  337. package/dist/services/Spawner/NodeSpawner.cjs.map +1 -0
  338. package/dist/services/Spawner/NodeSpawner.d.cts +10 -0
  339. package/dist/services/Spawner/NodeSpawner.d.cts.map +1 -0
  340. package/dist/services/Spawner/NodeSpawner.d.mts +10 -0
  341. package/dist/services/Spawner/NodeSpawner.d.mts.map +1 -0
  342. package/dist/services/Spawner/NodeSpawner.mjs +2 -0
  343. package/dist/services/Spawner/NodeSpawner.mjs.map +1 -0
  344. package/dist/services/Spawner/index.cjs +1 -0
  345. package/dist/services/Spawner/index.d.cts +3 -0
  346. package/dist/services/Spawner/index.d.mts +3 -0
  347. package/dist/services/Spawner/index.mjs +1 -0
  348. package/dist/services/Spawner/types.d.cts +31 -0
  349. package/dist/services/Spawner/types.d.cts.map +1 -0
  350. package/dist/services/Spawner/types.d.mts +31 -0
  351. package/dist/services/Spawner/types.d.mts.map +1 -0
  352. package/dist/session.cjs +2 -0
  353. package/dist/session.cjs.map +1 -0
  354. package/dist/session.d.cts +10 -0
  355. package/dist/session.d.cts.map +1 -0
  356. package/dist/session.d.mts +10 -0
  357. package/dist/session.d.mts.map +1 -0
  358. package/dist/session.mjs +2 -0
  359. package/dist/session.mjs.map +1 -0
  360. package/dist/tool/bashTool.cjs +7 -0
  361. package/dist/tool/bashTool.cjs.map +1 -0
  362. package/dist/tool/bashTool.d.cts +25 -0
  363. package/dist/tool/bashTool.d.cts.map +1 -0
  364. package/dist/tool/bashTool.d.mts +25 -0
  365. package/dist/tool/bashTool.d.mts.map +1 -0
  366. package/dist/tool/bashTool.mjs +7 -0
  367. package/dist/tool/bashTool.mjs.map +1 -0
  368. package/dist/tool/responseEnvelope.cjs +10 -0
  369. package/dist/tool/responseEnvelope.cjs.map +1 -0
  370. package/dist/tool/responseEnvelope.d.cts +45 -0
  371. package/dist/tool/responseEnvelope.d.cts.map +1 -0
  372. package/dist/tool/responseEnvelope.d.mts +45 -0
  373. package/dist/tool/responseEnvelope.d.mts.map +1 -0
  374. package/dist/tool/responseEnvelope.mjs +10 -0
  375. package/dist/tool/responseEnvelope.mjs.map +1 -0
  376. package/dist/tool/schema.cjs +2 -0
  377. package/dist/tool/schema.cjs.map +1 -0
  378. package/dist/tool/schema.d.cts +25 -0
  379. package/dist/tool/schema.d.cts.map +1 -0
  380. package/dist/tool/schema.d.mts +25 -0
  381. package/dist/tool/schema.d.mts.map +1 -0
  382. package/dist/tool/schema.mjs +2 -0
  383. package/dist/tool/schema.mjs.map +1 -0
  384. package/dist/tui/bashRender.cjs +8 -0
  385. package/dist/tui/bashRender.cjs.map +1 -0
  386. package/dist/tui/bashRender.d.cts +51 -0
  387. package/dist/tui/bashRender.d.cts.map +1 -0
  388. package/dist/tui/bashRender.d.mts +51 -0
  389. package/dist/tui/bashRender.d.mts.map +1 -0
  390. package/dist/tui/bashRender.mjs +8 -0
  391. package/dist/tui/bashRender.mjs.map +1 -0
  392. package/dist/tui/format.cjs +2 -0
  393. package/dist/tui/format.cjs.map +1 -0
  394. package/dist/tui/format.d.cts +25 -0
  395. package/dist/tui/format.d.cts.map +1 -0
  396. package/dist/tui/format.d.mts +25 -0
  397. package/dist/tui/format.d.mts.map +1 -0
  398. package/dist/tui/format.mjs +2 -0
  399. package/dist/tui/format.mjs.map +1 -0
  400. package/dist/tui/runnerSpace.cjs +6 -0
  401. package/dist/tui/runnerSpace.cjs.map +1 -0
  402. package/dist/tui/runnerSpace.d.cts +52 -0
  403. package/dist/tui/runnerSpace.d.cts.map +1 -0
  404. package/dist/tui/runnerSpace.d.mts +52 -0
  405. package/dist/tui/runnerSpace.d.mts.map +1 -0
  406. package/dist/tui/runnerSpace.mjs +6 -0
  407. package/dist/tui/runnerSpace.mjs.map +1 -0
  408. package/dist/types.cjs +2 -0
  409. package/dist/types.cjs.map +1 -0
  410. package/dist/types.d.cts +28 -0
  411. package/dist/types.d.cts.map +1 -0
  412. package/dist/types.d.mts +28 -0
  413. package/dist/types.d.mts.map +1 -0
  414. package/dist/types.mjs +2 -0
  415. package/dist/types.mjs.map +1 -0
  416. package/package.json +335 -0
  417. package/skills/doom-runner/SKILL.md +69 -0
@@ -0,0 +1,3 @@
1
+ import { IRmuxBackend, RmuxLaunchRequest } from "./types.cjs";
2
+ import { RmuxBackend, rmuxPackageForTarget } from "./RmuxBackend.cjs";
3
+ export { type IRmuxBackend, RmuxBackend, type RmuxLaunchRequest, rmuxPackageForTarget };
@@ -0,0 +1,3 @@
1
+ import { IRmuxBackend, RmuxLaunchRequest } from "./types.mjs";
2
+ import { RmuxBackend, rmuxPackageForTarget } from "./RmuxBackend.mjs";
3
+ export { type IRmuxBackend, RmuxBackend, type RmuxLaunchRequest, rmuxPackageForTarget };
@@ -0,0 +1 @@
1
+ import{RmuxBackend as e,rmuxPackageForTarget as t}from"./RmuxBackend.mjs";export{e as RmuxBackend,t as rmuxPackageForTarget};
@@ -0,0 +1,29 @@
1
+ import { ExitResult } from "../Spawner/types.cjs";
2
+ import "../Spawner/index.cjs";
3
+ import { RunHandle } from "../Launcher/types.cjs";
4
+ import "../Launcher/index.cjs";
5
+ import { PtyRun } from "../PtyHost/types.cjs";
6
+ import "../PtyHost/index.cjs";
7
+ //#region src/services/RmuxBackend/types.d.ts
8
+ interface RmuxLaunchRequest {
9
+ id: string;
10
+ name: string;
11
+ command: string;
12
+ cwd: string;
13
+ sessionId: string;
14
+ interactive: boolean;
15
+ }
16
+ interface IRmuxBackend {
17
+ /** Returns undefined when no compatible RMUX binary is available before launch. */
18
+ launch(request: RmuxLaunchRequest): Promise<RunHandle | undefined>;
19
+ /** Reconnects completion monitoring for a persisted RMUX session. */
20
+ watch(id: string, target: string, sessionId?: string): Promise<ExitResult | undefined>;
21
+ /** Reads persisted terminal evidence without contacting RMUX. */
22
+ readOutcome(id: string, sessionId: string): ExitResult | undefined;
23
+ stop(target: string, expectedPid: number): Promise<boolean>;
24
+ input(target: string, text: string): Promise<boolean>;
25
+ get(name: string): PtyRun | undefined;
26
+ }
27
+ //#endregion
28
+ export { IRmuxBackend, RmuxLaunchRequest };
29
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/services/RmuxBackend/types.ts"],"mappings":";;;;;;;UAIiB;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;;EAEf,OAAO,SAAS,oBAAoB,QAAQ;;EAE5C,MAAM,YAAY,gBAAgB,qBAAqB,QAAQ;;EAE/D,YAAY,YAAY,oBAAoB;EAC5C,KAAK,gBAAgB,sBAAsB;EAC3C,MAAM,gBAAgB,eAAe;EACrC,IAAI,eAAe"}
@@ -0,0 +1,29 @@
1
+ import { ExitResult } from "../Spawner/types.mjs";
2
+ import "../Spawner/index.mjs";
3
+ import { RunHandle } from "../Launcher/types.mjs";
4
+ import "../Launcher/index.mjs";
5
+ import { PtyRun } from "../PtyHost/types.mjs";
6
+ import "../PtyHost/index.mjs";
7
+ //#region src/services/RmuxBackend/types.d.ts
8
+ interface RmuxLaunchRequest {
9
+ id: string;
10
+ name: string;
11
+ command: string;
12
+ cwd: string;
13
+ sessionId: string;
14
+ interactive: boolean;
15
+ }
16
+ interface IRmuxBackend {
17
+ /** Returns undefined when no compatible RMUX binary is available before launch. */
18
+ launch(request: RmuxLaunchRequest): Promise<RunHandle | undefined>;
19
+ /** Reconnects completion monitoring for a persisted RMUX session. */
20
+ watch(id: string, target: string, sessionId?: string): Promise<ExitResult | undefined>;
21
+ /** Reads persisted terminal evidence without contacting RMUX. */
22
+ readOutcome(id: string, sessionId: string): ExitResult | undefined;
23
+ stop(target: string, expectedPid: number): Promise<boolean>;
24
+ input(target: string, text: string): Promise<boolean>;
25
+ get(name: string): PtyRun | undefined;
26
+ }
27
+ //#endregion
28
+ export { IRmuxBackend, RmuxLaunchRequest };
29
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/RmuxBackend/types.ts"],"mappings":";;;;;;;UAIiB;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;;EAEf,OAAO,SAAS,oBAAoB,QAAQ;;EAE5C,MAAM,YAAY,gBAAgB,qBAAqB,QAAQ;;EAE/D,YAAY,YAAY,oBAAoB;EAC5C,KAAK,gBAAgB,sBAAsB;EAC3C,MAAM,gBAAgB,eAAe;EACrC,IAAI,eAAe"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../types.cjs"),t=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.cjs"),n=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.cjs"),r=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs");let i=require("inversify");require("reflect-metadata/lite");const a=new Set([`sudo`,`env`,`time`,`nohup`,`exec`]);let o=class{registry;constructor(e){this.registry=e}async allocate(e,t,n){let r=c(n??s(e)),i=new Set((await this.registry.listBySession(t)).map(e=>e.name));if(!i.has(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!i.has(t))return t}throw Error(`Could not find a free runner name based on "${r}"`)}};o=r.default([(0,i.injectable)(),n.default(0,(0,i.inject)(e.TYPES.RunnerRegistry)),t.default(`design:paramtypes`,[Object])],o);function s(e){return e.split(/\s+/).filter(e=>e.length>0&&!e.startsWith(`-`)&&!e.includes(`=`)).filter(e=>!a.has(e)).slice(0,4).join(`-`)}function c(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,32).replace(/-+$/,``);return t.length>0?t:`runner`}Object.defineProperty(exports,"RunnerNamer",{enumerable:!0,get:function(){return o}});
2
+ //# sourceMappingURL=RunnerNamer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerNamer.cjs","names":["injectable","inject","TYPES"],"sources":["../../../src/services/RunnerNamer/RunnerNamer.ts"],"sourcesContent":["import { inject, injectable } from 'inversify';\nimport 'reflect-metadata/lite';\nimport { TYPES } from '../../types.ts';\nimport type { IRunnerRegistry } from '../RunnerRegistry/index.ts';\nimport type { IRunnerNamer } from './types.ts';\n\nconst MAX_SLUG_LENGTH = 32;\nconst MAX_ATTEMPTS = 1000;\nconst FALLBACK_SLUG = 'runner';\n/** Shell noise that says nothing about what the command actually runs. */\nconst IGNORED_LEADING_WORDS = new Set(['sudo', 'env', 'time', 'nohup', 'exec']);\n\n@injectable()\nexport class RunnerNamer implements IRunnerNamer {\n constructor(@inject(TYPES.RunnerRegistry) private readonly registry: IRunnerRegistry) {}\n\n async allocate(command: string, sessionId: string, requested?: string): Promise<string> {\n const base = slugify(requested ?? deriveSlug(command));\n const taken = new Set((await this.registry.listBySession(sessionId)).map((record) => record.name));\n if (!taken.has(base)) return base;\n for (let suffix = 2; suffix < MAX_ATTEMPTS; suffix += 1) {\n const candidate = `${base}-${suffix}`;\n if (!taken.has(candidate)) return candidate;\n }\n throw new Error(`Could not find a free runner name based on \"${base}\"`);\n }\n}\n\n/**\n * Names come from the first few meaningful words of the command, which is what\n * a reader recognises in a runner list: `nx-dev-start-api`, not `runner-3`.\n */\nfunction deriveSlug(command: string): string {\n const words = command.split(/\\s+/).filter((word) => word.length > 0 && !word.startsWith('-') && !word.includes('='));\n const meaningful = words.filter((word) => !IGNORED_LEADING_WORDS.has(word));\n return meaningful.slice(0, 4).join('-');\n}\n\nfunction slugify(value: string): string {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, MAX_SLUG_LENGTH)\n .replace(/-+$/, '');\n return slug.length > 0 ? slug : FALLBACK_SLUG;\n}\n"],"mappings":"waAMA,MAIM,EAAwB,IAAI,IAAI,CAAC,OAAQ,MAAO,OAAQ,QAAS,MAAM,CAAC,EAGvE,IAAM,EAAN,KAA0C,CACY,SAA3D,YAAY,EAA0E,CAA3B,KAAA,SAAA,CAA4B,CAEvF,MAAM,SAAS,EAAiB,EAAmB,EAAqC,CACtF,IAAM,EAAO,EAAQ,GAAa,EAAW,CAAO,CAAC,EAC/C,EAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,cAAc,CAAS,EAAA,CAAG,IAAK,GAAW,EAAO,IAAI,CAAC,EACjG,GAAI,CAAC,EAAM,IAAI,CAAI,EAAG,OAAO,EAC7B,IAAK,IAAI,EAAS,EAAG,EAAS,IAAc,GAAU,EAAG,CACvD,IAAM,EAAY,GAAG,EAAK,GAAG,IAC7B,GAAI,CAAC,EAAM,IAAI,CAAS,EAAG,OAAO,CACpC,CACA,MAAU,MAAM,+CAA+C,EAAK,EAAE,CACxE,CACF,gBAdCA,EAAAA,EAAAA,WAAAA,CAAW,EAEGC,EAAAA,QAAAA,GAAAA,EAAAA,EAAAA,OAAAA,CAAOC,EAAAA,MAAM,cAAc,CAAA,8CAkB1C,SAAS,EAAW,EAAyB,CAG3C,OAFc,EAAQ,MAAM,KAAK,CAAC,CAAC,OAAQ,GAAS,EAAK,OAAS,GAAK,CAAC,EAAK,WAAW,GAAG,GAAK,CAAC,EAAK,SAAS,GAAG,CAC3F,CAAC,CAAC,OAAQ,GAAS,CAAC,EAAsB,IAAI,CAAI,CACzD,CAAC,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CACxC,CAEA,SAAS,EAAQ,EAAuB,CACtC,IAAM,EAAO,EACV,YAAY,CAAC,CACb,QAAQ,cAAe,GAAG,CAAC,CAC3B,QAAQ,WAAY,EAAE,CAAC,CACvB,MAAM,EAAG,EAAe,CAAC,CACzB,QAAQ,MAAO,EAAE,EACpB,OAAO,EAAK,OAAS,EAAI,EAAO,QAClC"}
@@ -0,0 +1,13 @@
1
+ import { IRunnerRegistry } from "../RunnerRegistry/types.cjs";
2
+ import "../RunnerRegistry/index.cjs";
3
+ import { IRunnerNamer } from "./types.cjs";
4
+ import "reflect-metadata/lite";
5
+ //#region src/services/RunnerNamer/RunnerNamer.d.ts
6
+ declare class RunnerNamer implements IRunnerNamer {
7
+ private readonly registry;
8
+ constructor(registry: IRunnerRegistry);
9
+ allocate(command: string, sessionId: string, requested?: string): Promise<string>;
10
+ }
11
+ //#endregion
12
+ export { RunnerNamer };
13
+ //# sourceMappingURL=RunnerNamer.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerNamer.d.cts","names":[],"sources":["../../../src/services/RunnerNamer/RunnerNamer.ts"],"mappings":";;;;;cAaa,uBAAuB;mBACyB;EAAA,YAAA,UAAU;EAE/D,SAAS,iBAAiB,mBAAmB,qBAAqB"}
@@ -0,0 +1,13 @@
1
+ import { IRunnerRegistry } from "../RunnerRegistry/types.mjs";
2
+ import "../RunnerRegistry/index.mjs";
3
+ import { IRunnerNamer } from "./types.mjs";
4
+ import "reflect-metadata/lite";
5
+ //#region src/services/RunnerNamer/RunnerNamer.d.ts
6
+ declare class RunnerNamer implements IRunnerNamer {
7
+ private readonly registry;
8
+ constructor(registry: IRunnerRegistry);
9
+ allocate(command: string, sessionId: string, requested?: string): Promise<string>;
10
+ }
11
+ //#endregion
12
+ export { RunnerNamer };
13
+ //# sourceMappingURL=RunnerNamer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerNamer.d.mts","names":[],"sources":["../../../src/services/RunnerNamer/RunnerNamer.ts"],"mappings":";;;;;cAaa,uBAAuB;mBACyB;EAAA,YAAA,UAAU;EAE/D,SAAS,iBAAiB,mBAAmB,qBAAqB"}
@@ -0,0 +1,2 @@
1
+ import{TYPES as e}from"../../types.mjs";import t from"../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.mjs";import n from"../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.mjs";import r from"../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs";import{inject as i,injectable as a}from"inversify";import"reflect-metadata/lite";const o=new Set([`sudo`,`env`,`time`,`nohup`,`exec`]);let s=class{registry;constructor(e){this.registry=e}async allocate(e,t,n){let r=l(n??c(e)),i=new Set((await this.registry.listBySession(t)).map(e=>e.name));if(!i.has(r))return r;for(let e=2;e<1e3;e+=1){let t=`${r}-${e}`;if(!i.has(t))return t}throw Error(`Could not find a free runner name based on "${r}"`)}};s=r([a(),n(0,i(e.RunnerRegistry)),t(`design:paramtypes`,[Object])],s);function c(e){return e.split(/\s+/).filter(e=>e.length>0&&!e.startsWith(`-`)&&!e.includes(`=`)).filter(e=>!o.has(e)).slice(0,4).join(`-`)}function l(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,32).replace(/-+$/,``);return t.length>0?t:`runner`}export{s as RunnerNamer};
2
+ //# sourceMappingURL=RunnerNamer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerNamer.mjs","names":[],"sources":["../../../src/services/RunnerNamer/RunnerNamer.ts"],"sourcesContent":["import { inject, injectable } from 'inversify';\nimport 'reflect-metadata/lite';\nimport { TYPES } from '../../types.ts';\nimport type { IRunnerRegistry } from '../RunnerRegistry/index.ts';\nimport type { IRunnerNamer } from './types.ts';\n\nconst MAX_SLUG_LENGTH = 32;\nconst MAX_ATTEMPTS = 1000;\nconst FALLBACK_SLUG = 'runner';\n/** Shell noise that says nothing about what the command actually runs. */\nconst IGNORED_LEADING_WORDS = new Set(['sudo', 'env', 'time', 'nohup', 'exec']);\n\n@injectable()\nexport class RunnerNamer implements IRunnerNamer {\n constructor(@inject(TYPES.RunnerRegistry) private readonly registry: IRunnerRegistry) {}\n\n async allocate(command: string, sessionId: string, requested?: string): Promise<string> {\n const base = slugify(requested ?? deriveSlug(command));\n const taken = new Set((await this.registry.listBySession(sessionId)).map((record) => record.name));\n if (!taken.has(base)) return base;\n for (let suffix = 2; suffix < MAX_ATTEMPTS; suffix += 1) {\n const candidate = `${base}-${suffix}`;\n if (!taken.has(candidate)) return candidate;\n }\n throw new Error(`Could not find a free runner name based on \"${base}\"`);\n }\n}\n\n/**\n * Names come from the first few meaningful words of the command, which is what\n * a reader recognises in a runner list: `nx-dev-start-api`, not `runner-3`.\n */\nfunction deriveSlug(command: string): string {\n const words = command.split(/\\s+/).filter((word) => word.length > 0 && !word.startsWith('-') && !word.includes('='));\n const meaningful = words.filter((word) => !IGNORED_LEADING_WORDS.has(word));\n return meaningful.slice(0, 4).join('-');\n}\n\nfunction slugify(value: string): string {\n const slug = value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, MAX_SLUG_LENGTH)\n .replace(/-+$/, '');\n return slug.length > 0 ? slug : FALLBACK_SLUG;\n}\n"],"mappings":"qYAMA,MAIM,EAAwB,IAAI,IAAI,CAAC,OAAQ,MAAO,OAAQ,QAAS,MAAM,CAAC,EAGvE,IAAM,EAAN,KAA0C,CACY,SAA3D,YAAY,EAA0E,CAA3B,KAAA,SAAA,CAA4B,CAEvF,MAAM,SAAS,EAAiB,EAAmB,EAAqC,CACtF,IAAM,EAAO,EAAQ,GAAa,EAAW,CAAO,CAAC,EAC/C,EAAQ,IAAI,KAAK,MAAM,KAAK,SAAS,cAAc,CAAS,EAAA,CAAG,IAAK,GAAW,EAAO,IAAI,CAAC,EACjG,GAAI,CAAC,EAAM,IAAI,CAAI,EAAG,OAAO,EAC7B,IAAK,IAAI,EAAS,EAAG,EAAS,IAAc,GAAU,EAAG,CACvD,IAAM,EAAY,GAAG,EAAK,GAAG,IAC7B,GAAI,CAAC,EAAM,IAAI,CAAS,EAAG,OAAO,CACpC,CACA,MAAU,MAAM,+CAA+C,EAAK,EAAE,CACxE,CACF,OAdC,EAAW,EAEG,EAAA,EAAA,EAAO,EAAM,cAAc,CAAA,sCAkB1C,SAAS,EAAW,EAAyB,CAG3C,OAFc,EAAQ,MAAM,KAAK,CAAC,CAAC,OAAQ,GAAS,EAAK,OAAS,GAAK,CAAC,EAAK,WAAW,GAAG,GAAK,CAAC,EAAK,SAAS,GAAG,CAC3F,CAAC,CAAC,OAAQ,GAAS,CAAC,EAAsB,IAAI,CAAI,CACzD,CAAC,CAAC,MAAM,EAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CACxC,CAEA,SAAS,EAAQ,EAAuB,CACtC,IAAM,EAAO,EACV,YAAY,CAAC,CACb,QAAQ,cAAe,GAAG,CAAC,CAC3B,QAAQ,WAAY,EAAE,CAAC,CACvB,MAAM,EAAG,EAAe,CAAC,CACzB,QAAQ,MAAO,EAAE,EACpB,OAAO,EAAK,OAAS,EAAI,EAAO,QAClC"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./RunnerNamer.cjs");Object.defineProperty(exports,"RunnerNamer",{enumerable:!0,get:function(){return e.RunnerNamer}});
@@ -0,0 +1,3 @@
1
+ import { IRunnerNamer } from "./types.cjs";
2
+ import { RunnerNamer } from "./RunnerNamer.cjs";
3
+ export { type IRunnerNamer, RunnerNamer };
@@ -0,0 +1,3 @@
1
+ import { IRunnerNamer } from "./types.mjs";
2
+ import { RunnerNamer } from "./RunnerNamer.mjs";
3
+ export { type IRunnerNamer, RunnerNamer };
@@ -0,0 +1 @@
1
+ import{RunnerNamer as e}from"./RunnerNamer.mjs";export{e as RunnerNamer};
@@ -0,0 +1,12 @@
1
+ //#region src/services/RunnerNamer/types.d.ts
2
+ /** Derives a stable, readable runner name that no live runner already holds. */
3
+ interface IRunnerNamer {
4
+ /**
5
+ * Returns `requested` when it is free, otherwise a numbered variant.
6
+ * With no `requested` name, one is derived from the command line.
7
+ */
8
+ allocate(command: string, sessionId: string, requested?: string): Promise<string>;
9
+ }
10
+ //#endregion
11
+ export { IRunnerNamer };
12
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/services/RunnerNamer/types.ts"],"mappings":";;UACiB;;;;;EAKf,SAAS,iBAAiB,mBAAmB,qBAAqB"}
@@ -0,0 +1,12 @@
1
+ //#region src/services/RunnerNamer/types.d.ts
2
+ /** Derives a stable, readable runner name that no live runner already holds. */
3
+ interface IRunnerNamer {
4
+ /**
5
+ * Returns `requested` when it is free, otherwise a numbered variant.
6
+ * With no `requested` name, one is derived from the command line.
7
+ */
8
+ allocate(command: string, sessionId: string, requested?: string): Promise<string>;
9
+ }
10
+ //#endregion
11
+ export { IRunnerNamer };
12
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/RunnerNamer/types.ts"],"mappings":";;UACiB;;;;;EAKf,SAAS,iBAAiB,mBAAmB,qBAAqB"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../config.cjs"),n=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs"),r=require("../../session.cjs");let i=require("inversify");require("reflect-metadata/lite");let a=require("node:fs");a=e.__toESM(a,1);let o=require("node:path");o=e.__toESM(o,1);let s=require("node:os");s=e.__toESM(s,1);let c=require("node:child_process");const l=`doom-runner`,u=`runs`,d=`.json`,f=`utf8`,p=`ENOENT`;function m(e,t){try{let n=(0,c.execFileSync)(`git`,e,{cwd:t,encoding:f,stdio:[`ignore`,`pipe`,`ignore`]}).trim();return n.length>0?n:void 0}catch{return}}function h(e){try{return a.default.realpathSync(e)}catch{return e}}function g(e){let t=e.PI_CODING_AGENT_DIR?.trim();return t===`~`?s.default.homedir():t?.startsWith(`~/`)?o.default.join(s.default.homedir(),t.slice(2)):t?o.default.resolve(t):o.default.join(s.default.homedir(),`.pi`,`agent`)}function _(e){let t=a.default.statSync(e).mtimeMs;for(let n of a.default.readdirSync(e,{withFileTypes:!0})){let r=o.default.join(e,n.name);if(t=Math.max(t,a.default.statSync(r).mtimeMs),n.isDirectory())for(let e of a.default.readdirSync(r))t=Math.max(t,a.default.statSync(o.default.join(r,e)).mtimeMs)}return t}function v(e){let t;try{t=a.default.readdirSync(e)}catch{return!1}for(let n of t)if(n.endsWith(d))try{let t=JSON.parse(a.default.readFileSync(o.default.join(e,n),f)).hostPid;if(typeof t!=`number`)continue;return process.kill(t,0),!0}catch{}return!1}function y(e){if(typeof e!=`object`||!e)return;let t=e;if(t.state!==`completed`||typeof t.exit?.finishedAt!=`string`)return;let n=Date.parse(t.exit.finishedAt);return Number.isFinite(n)?n:void 0}let b=class{adoptedSessionId;repository;repositoryPath(){return this.repository??=h(m([`rev-parse`,`--show-toplevel`],process.cwd())??process.cwd()),this.repository}setSessionId(e){let t=e.trim();if(!t)throw Error(`doom-runner session id cannot be blank`);this.adoptedSessionId=t}logDirectory(e){let n=process.env[t.LOG_DIR_ENV]?.trim();return n?o.default.resolve(n):o.default.join(this.sessionDirectory(e),`logs`)}stateDirectory(e){let n=process.env[t.LOG_DIR_ENV]?.trim();return n?o.default.join(o.default.resolve(n),`..`,u):o.default.join(this.sessionDirectory(e),u)}logPathFor(e,t){return o.default.join(this.logDirectory(t),`${e}.log`)}rotatedLogPathFor(e,t){return`${this.logPathFor(e,t)}.1`}statePathFor(e,t){return o.default.join(this.stateDirectory(t),`${e}${d}`)}ensureDirectories(e){a.default.mkdirSync(this.logDirectory(e),{recursive:!0}),a.default.mkdirSync(this.stateDirectory(e),{recursive:!0})}sweepHistory(e,t=Date.now()){let n={removed:[],errors:[]};if(process.env.DOOM_RUNNER_LOG_DIR?.trim())return this.sweepStateDirectory(this.stateDirectory(),this.sessionId(),e,t,n),n;let r=this.storeDirectory(),i;try{i=a.default.readdirSync(r)}catch(e){return e.code===p||n.errors.push(`Could not read runner history directory ${r}: ${String(e)}`),n}let s=this.currentSessionId();for(let a of i)a!==s&&this.sweepSessionDirectory(o.default.join(r,a),e,t,n);return n}legacyDirectory(){let e=m([`rev-parse`,`--path-format=absolute`,`--git-common-dir`],process.cwd());return e?o.default.join(e,l):void 0}removeLegacyStore(){let e=this.legacyDirectory();if(!(!e||o.default.basename(e)!==l||!a.default.existsSync(e)))return a.default.rmSync(e,{recursive:!0,force:!0}),e}currentSessionId(){try{return this.sessionId()}catch{return}}sweepSessionDirectory(e,t,n,r){try{if(n-_(e)<=t||v(o.default.join(e,u)))return;a.default.rmSync(e,{recursive:!0,force:!0}),r.removed.push(e)}catch(t){t.code!==p&&r.errors.push(`Could not sweep runner session ${e}: ${String(t)}`)}}sessionId(e){let t=e?.trim()||this.adoptedSessionId||r.inheritedSessionId();if(!t)throw Error(`PI_SESSION_ID is required for doom-runner storage`);return t}storeDirectory(){let e=process.env[t.LOG_DIR_ENV]?.trim();return e?o.default.dirname(o.default.resolve(e)):o.default.join(g(process.env),l)}sessionDirectory(e){return o.default.join(this.storeDirectory(),this.sessionId(e))}sweepStateDirectory(e,t,n,r,i){let s;try{s=a.default.readdirSync(e)}catch(t){t.code!==p&&i.errors.push(`Could not read runner state directory ${e}: ${String(t)}`);return}for(let c of s){if(!c.endsWith(d))continue;let s=o.default.join(e,c);try{let e=y(JSON.parse(a.default.readFileSync(s,f)));if(e===void 0||r-e<=n)continue;let o=c.slice(0,-5);this.removeHistoryFiles(t,o,s,i)}catch(e){i.errors.push(`Could not sweep runner metadata ${s}: ${String(e)}`)}}}removeHistoryFiles(e,t,n,r){let i=[n,this.logPathFor(t,e),this.rotatedLogPathFor(t,e)];for(let e of i)try{a.default.unlinkSync(e),r.removed.push(e)}catch(t){t.code!==p&&r.errors.push(`Could not remove runner history ${e}: ${String(t)}`)}}};b=n.default([(0,i.injectable)()],b),Object.defineProperty(exports,"RunnerPaths",{enumerable:!0,get:function(){return b}});
2
+ //# sourceMappingURL=RunnerPaths.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerPaths.cjs","names":["execFileSync","fs","os","path","LOG_DIR_ENV","inheritedSessionId","injectable"],"sources":["../../../src/services/RunnerPaths/RunnerPaths.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { injectable } from 'inversify';\nimport 'reflect-metadata/lite';\nimport { LOG_DIR_ENV } from '../../config.ts';\nimport { inheritedSessionId } from '../../session.ts';\nimport type { IRunnerPaths, LogSweepResult } from './types.ts';\n\nconst STORE_DIR_NAME = 'doom-runner';\nconst DEFAULT_CONFIG_DIR_NAME = '.pi';\nconst AGENT_DIR_NAME = 'agent';\nconst LOG_DIR_NAME = 'logs';\nconst STATE_DIR_NAME = 'runs';\nconst LOG_EXTENSION = '.log';\nconst STATE_EXTENSION = '.json';\nconst ROTATED_SUFFIX = '.1';\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\nconst FILE_ENCODING = 'utf8';\nconst NOT_FOUND_ERROR_CODE = 'ENOENT';\n\nfunction git(args: string[], cwd: string): string | undefined {\n try {\n const output = execFileSync('git', args, { cwd, encoding: FILE_ENCODING, stdio: ['ignore', 'pipe', 'ignore'] });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return target;\n }\n}\n\nfunction resolveAgentDirectory(env: NodeJS.ProcessEnv): string {\n const configured = env[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (configured === HOME_ALIAS) return os.homedir();\n if (configured?.startsWith(HOME_ALIAS_PREFIX)) {\n return path.join(os.homedir(), configured.slice(HOME_ALIAS_PREFIX.length));\n }\n return configured ? path.resolve(configured) : path.join(os.homedir(), DEFAULT_CONFIG_DIR_NAME, AGENT_DIR_NAME);\n}\n\n/**\n * Newest mtime anywhere one level inside the session, falling back to the\n * directory itself. A session still being written to therefore always looks\n * recent, whatever state its individual records are in.\n */\nfunction newestEntryTime(directory: string): number {\n let newest = fs.statSync(directory).mtimeMs;\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const target = path.join(directory, entry.name);\n newest = Math.max(newest, fs.statSync(target).mtimeMs);\n if (!entry.isDirectory()) continue;\n for (const child of fs.readdirSync(target)) {\n newest = Math.max(newest, fs.statSync(path.join(target, child)).mtimeMs);\n }\n }\n return newest;\n}\n\n/**\n * Whether any run in this session names a pi process that is still running.\n *\n * One live record is enough: records are only ever written by their owner, so a\n * live host pid means the session is still in use however old its files look.\n */\nfunction ownerAlive(stateDirectory: string): boolean {\n let entries: string[];\n try {\n entries = fs.readdirSync(stateDirectory);\n } catch {\n // No records left to consult, so nothing claims the directory.\n return false;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(STATE_EXTENSION)) continue;\n try {\n const value: unknown = JSON.parse(fs.readFileSync(path.join(stateDirectory, entry), FILE_ENCODING));\n const hostPid = (value as { hostPid?: unknown }).hostPid;\n if (typeof hostPid !== 'number') continue;\n process.kill(hostPid, 0);\n return true;\n } catch {\n // An unreadable record and a dead pid mean the same thing here: no claim.\n }\n }\n return false;\n}\n\nfunction completedAt(value: unknown): number | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const record = value as { state?: unknown; exit?: { finishedAt?: unknown } };\n if (record.state !== 'completed' || typeof record.exit?.finishedAt !== 'string') return undefined;\n const timestamp = Date.parse(record.exit.finishedAt);\n return Number.isFinite(timestamp) ? timestamp : undefined;\n}\n\n/** Session-scoped runner storage under the Pi agent directory. */\n@injectable()\nexport class RunnerPaths implements IRunnerPaths {\n private adoptedSessionId: string | undefined;\n private repository: string | undefined;\n\n repositoryPath(): string {\n this.repository ??= realPath(git(['rev-parse', '--show-toplevel'], process.cwd()) ?? process.cwd());\n return this.repository;\n }\n\n setSessionId(sessionId: string): void {\n const trimmed = sessionId.trim();\n if (!trimmed) throw new Error('doom-runner session id cannot be blank');\n this.adoptedSessionId = trimmed;\n }\n\n logDirectory(sessionId?: string): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.resolve(override);\n return path.join(this.sessionDirectory(sessionId), LOG_DIR_NAME);\n }\n\n stateDirectory(sessionId?: string): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.join(path.resolve(override), '..', STATE_DIR_NAME);\n return path.join(this.sessionDirectory(sessionId), STATE_DIR_NAME);\n }\n\n logPathFor(id: string, sessionId?: string): string {\n return path.join(this.logDirectory(sessionId), `${id}${LOG_EXTENSION}`);\n }\n\n rotatedLogPathFor(id: string, sessionId?: string): string {\n return `${this.logPathFor(id, sessionId)}${ROTATED_SUFFIX}`;\n }\n\n statePathFor(id: string, sessionId?: string): string {\n return path.join(this.stateDirectory(sessionId), `${id}${STATE_EXTENSION}`);\n }\n\n ensureDirectories(sessionId?: string): void {\n fs.mkdirSync(this.logDirectory(sessionId), { recursive: true });\n fs.mkdirSync(this.stateDirectory(sessionId), { recursive: true });\n }\n\n sweepHistory(ttlMs: number, now: number = Date.now()): LogSweepResult {\n const result: LogSweepResult = { removed: [], errors: [] };\n // A pinned log directory belongs to whoever pinned it, so that branch only\n // ever removes the files this package put there.\n if (process.env[LOG_DIR_ENV]?.trim()) {\n this.sweepStateDirectory(this.stateDirectory(), this.sessionId(), ttlMs, now, result);\n return result;\n }\n const root = this.storeDirectory();\n let sessions: string[];\n try {\n sessions = fs.readdirSync(root);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === NOT_FOUND_ERROR_CODE) return result;\n result.errors.push(`Could not read runner history directory ${root}: ${String(error)}`);\n return result;\n }\n\n // Sweeping whole session directories rather than the three files a completed\n // record names is what keeps sockets, sidecars, runs that never reached a\n // terminal state, and the emptied directories themselves from accumulating.\n const active = this.currentSessionId();\n for (const sessionId of sessions) {\n if (sessionId === active) continue;\n this.sweepSessionDirectory(path.join(root, sessionId), ttlMs, now, result);\n }\n return result;\n }\n\n legacyDirectory(): string | undefined {\n const commonDirectory = git(['rev-parse', '--path-format=absolute', '--git-common-dir'], process.cwd());\n return commonDirectory ? path.join(commonDirectory, STORE_DIR_NAME) : undefined;\n }\n\n removeLegacyStore(): string | undefined {\n const target = this.legacyDirectory();\n if (!target || path.basename(target) !== STORE_DIR_NAME || !fs.existsSync(target)) return undefined;\n fs.rmSync(target, { recursive: true, force: true });\n return target;\n }\n\n /** The live session, if one is known, so a sweep never deletes underneath itself. */\n private currentSessionId(): string | undefined {\n try {\n return this.sessionId();\n } catch {\n // A CLI invocation outside a session still sweeps; it just has nothing to spare.\n return undefined;\n }\n }\n\n /** Removes a session's whole directory once its newest entry is past the TTL. */\n private sweepSessionDirectory(directory: string, ttlMs: number, now: number, result: LogSweepResult): void {\n try {\n if (now - newestEntryTime(directory) <= ttlMs) return;\n // An idle session can go quiet for longer than the TTL, and deleting one\n // takes its lifeline socket with it, which would read to its own runners\n // as an owner that had died. Its records name the owner, so ask.\n if (ownerAlive(path.join(directory, STATE_DIR_NAME))) return;\n fs.rmSync(directory, { recursive: true, force: true });\n result.removed.push(directory);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not sweep runner session ${directory}: ${String(error)}`);\n }\n }\n }\n\n private sessionId(explicit?: string): string {\n const sessionId = explicit?.trim() || this.adoptedSessionId || inheritedSessionId();\n if (!sessionId) throw new Error('PI_SESSION_ID is required for doom-runner storage');\n return sessionId;\n }\n\n private storeDirectory(): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.dirname(path.resolve(override));\n return path.join(resolveAgentDirectory(process.env), STORE_DIR_NAME);\n }\n\n private sessionDirectory(sessionId?: string): string {\n return path.join(this.storeDirectory(), this.sessionId(sessionId));\n }\n\n private sweepStateDirectory(\n directory: string,\n sessionId: string,\n ttlMs: number,\n now: number,\n result: LogSweepResult,\n ): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(directory);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not read runner state directory ${directory}: ${String(error)}`);\n }\n return;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(STATE_EXTENSION)) continue;\n const statePath = path.join(directory, entry);\n try {\n const value: unknown = JSON.parse(fs.readFileSync(statePath, FILE_ENCODING));\n const finishedAt = completedAt(value);\n if (finishedAt === undefined || now - finishedAt <= ttlMs) continue;\n const id = entry.slice(0, -STATE_EXTENSION.length);\n this.removeHistoryFiles(sessionId, id, statePath, result);\n } catch (error) {\n result.errors.push(`Could not sweep runner metadata ${statePath}: ${String(error)}`);\n }\n }\n }\n\n private removeHistoryFiles(sessionId: string, id: string, statePath: string, result: LogSweepResult): void {\n const candidates = [statePath, this.logPathFor(id, sessionId), this.rotatedLogPathFor(id, sessionId)];\n for (const candidate of candidates) {\n try {\n fs.unlinkSync(candidate);\n result.removed.push(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not remove runner history ${candidate}: ${String(error)}`);\n }\n }\n }\n }\n}\n"],"mappings":"2eAUA,MAAM,EAAiB,cAIjB,EAAiB,OAEjB,EAAkB,QAKlB,EAAgB,OAChB,EAAuB,SAE7B,SAAS,EAAI,EAAgB,EAAiC,CAC5D,GAAI,CAEF,IAAM,GAAA,EADSA,EAAAA,aAAAA,CAAa,MAAO,EAAM,CAAE,MAAK,SAAU,EAAe,MAAO,CAAC,SAAU,OAAQ,QAAQ,CAAE,CACxF,CAAC,CAAC,KAAK,EAC5B,OAAO,EAAQ,OAAS,EAAI,EAAU,IAAA,EACxC,MAAQ,CACN,MACF,CACF,CAEA,SAAS,EAAS,EAAwB,CACxC,GAAI,CACF,OAAOC,EAAAA,QAAG,aAAa,CAAM,CAC/B,MAAQ,CACN,OAAO,CACT,CACF,CAEA,SAAS,EAAsB,EAAgC,CAC7D,IAAM,EAAa,EAAI,qBAA0B,KAAK,EAKtD,OAJI,IAAe,IAAmBC,EAAAA,QAAG,QAAQ,EAC7C,GAAY,WAAW,IAAiB,EACnCC,EAAAA,QAAK,KAAKD,EAAAA,QAAG,QAAQ,EAAG,EAAW,MAAM,CAAwB,CAAC,EAEpE,EAAaC,EAAAA,QAAK,QAAQ,CAAU,EAAIA,EAAAA,QAAK,KAAKD,EAAAA,QAAG,QAAQ,EAAG,MAAyB,OAAc,CAChH,CAOA,SAAS,EAAgB,EAA2B,CAClD,IAAI,EAASD,EAAAA,QAAG,SAAS,CAAS,CAAC,CAAC,QACpC,IAAK,IAAM,KAASA,EAAAA,QAAG,YAAY,EAAW,CAAE,cAAe,EAAK,CAAC,EAAG,CACtE,IAAM,EAASE,EAAAA,QAAK,KAAK,EAAW,EAAM,IAAI,EAC9C,KAAS,KAAK,IAAI,EAAQF,EAAAA,QAAG,SAAS,CAAM,CAAC,CAAC,OAAO,EAChD,EAAM,YAAY,EACvB,IAAK,IAAM,KAASA,EAAAA,QAAG,YAAY,CAAM,EACvC,EAAS,KAAK,IAAI,EAAQA,EAAAA,QAAG,SAASE,EAAAA,QAAK,KAAK,EAAQ,CAAK,CAAC,CAAC,CAAC,OAAO,CAE3E,CACA,OAAO,CACT,CAQA,SAAS,EAAW,EAAiC,CACnD,IAAI,EACJ,GAAI,CACF,EAAUF,EAAAA,QAAG,YAAY,CAAc,CACzC,MAAQ,CAEN,MAAO,EACT,CAEA,IAAK,IAAM,KAAS,EACb,KAAM,SAAS,CAAe,EACnC,GAAI,CAEF,IAAM,EADiB,KAAK,MAAMA,EAAAA,QAAG,aAAaE,EAAAA,QAAK,KAAK,EAAgB,CAAK,EAAG,CAAa,CAC5E,CAAC,CAA2B,QACjD,GAAI,OAAO,GAAY,SAAU,SAEjC,OADA,QAAQ,KAAK,EAAS,CAAC,EAChB,EACT,MAAQ,CAER,CAEF,MAAO,EACT,CAEA,SAAS,EAAY,EAAoC,CACvD,GAAI,OAAO,GAAU,WAAY,EAAgB,OACjD,IAAM,EAAS,EACf,GAAI,EAAO,QAAU,aAAe,OAAO,EAAO,MAAM,YAAe,SAAU,OACjF,IAAM,EAAY,KAAK,MAAM,EAAO,KAAK,UAAU,EACnD,OAAO,OAAO,SAAS,CAAS,EAAI,EAAY,IAAA,EAClD,CAIO,IAAM,EAAN,KAA0C,CAC/C,iBACA,WAEA,gBAAyB,CAEvB,MADA,MAAK,aAAe,EAAS,EAAI,CAAC,YAAa,iBAAiB,EAAG,QAAQ,IAAI,CAAC,GAAK,QAAQ,IAAI,CAAC,EAC3F,KAAK,UACd,CAEA,aAAa,EAAyB,CACpC,IAAM,EAAU,EAAU,KAAK,EAC/B,GAAI,CAAC,EAAS,MAAU,MAAM,wCAAwC,EACtE,KAAK,iBAAmB,CAC1B,CAEA,aAAa,EAA4B,CACvC,IAAM,EAAW,QAAQ,IAAIC,EAAAA,YAAY,EAAE,KAAK,EAEhD,OADI,EAAiBD,EAAAA,QAAK,QAAQ,CAAQ,EACnCA,EAAAA,QAAK,KAAK,KAAK,iBAAiB,CAAS,EAAG,MAAY,CACjE,CAEA,eAAe,EAA4B,CACzC,IAAM,EAAW,QAAQ,IAAIC,EAAAA,YAAY,EAAE,KAAK,EAEhD,OADI,EAAiBD,EAAAA,QAAK,KAAKA,EAAAA,QAAK,QAAQ,CAAQ,EAAG,KAAM,CAAc,EACpEA,EAAAA,QAAK,KAAK,KAAK,iBAAiB,CAAS,EAAG,CAAc,CACnE,CAEA,WAAW,EAAY,EAA4B,CACjD,OAAOA,EAAAA,QAAK,KAAK,KAAK,aAAa,CAAS,EAAG,GAAG,OAAoB,CACxE,CAEA,kBAAkB,EAAY,EAA4B,CACxD,MAAO,GAAG,KAAK,WAAW,EAAI,CAAS,KACzC,CAEA,aAAa,EAAY,EAA4B,CACnD,OAAOA,EAAAA,QAAK,KAAK,KAAK,eAAe,CAAS,EAAG,GAAG,IAAK,GAAiB,CAC5E,CAEA,kBAAkB,EAA0B,CAC1C,EAAA,QAAG,UAAU,KAAK,aAAa,CAAS,EAAG,CAAE,UAAW,EAAK,CAAC,EAC9D,EAAA,QAAG,UAAU,KAAK,eAAe,CAAS,EAAG,CAAE,UAAW,EAAK,CAAC,CAClE,CAEA,aAAa,EAAe,EAAc,KAAK,IAAI,EAAmB,CACpE,IAAM,EAAyB,CAAE,QAAS,CAAC,EAAG,OAAQ,CAAC,CAAE,EAGzD,GAAI,QAAQ,IAAA,qBAAkB,KAAK,EAEjC,OADA,KAAK,oBAAoB,KAAK,eAAe,EAAG,KAAK,UAAU,EAAG,EAAO,EAAK,CAAM,EAC7E,EAET,IAAM,EAAO,KAAK,eAAe,EAC7B,EACJ,GAAI,CACF,EAAWF,EAAAA,QAAG,YAAY,CAAI,CAChC,OAAS,EAAO,CAGd,OAFK,EAAgC,OAAS,GAC9C,EAAO,OAAO,KAAK,2CAA2C,EAAK,IAAI,OAAO,CAAK,GAAG,EADX,CAG7E,CAKA,IAAM,EAAS,KAAK,iBAAiB,EACrC,IAAK,IAAM,KAAa,EAClB,IAAc,GAClB,KAAK,sBAAsBE,EAAAA,QAAK,KAAK,EAAM,CAAS,EAAG,EAAO,EAAK,CAAM,EAE3E,OAAO,CACT,CAEA,iBAAsC,CACpC,IAAM,EAAkB,EAAI,CAAC,YAAa,yBAA0B,kBAAkB,EAAG,QAAQ,IAAI,CAAC,EACtG,OAAO,EAAkBA,EAAAA,QAAK,KAAK,EAAiB,CAAc,EAAI,IAAA,EACxE,CAEA,mBAAwC,CACtC,IAAM,EAAS,KAAK,gBAAgB,EAChC,MAAC,GAAUA,EAAAA,QAAK,SAAS,CAAM,IAAM,GAAkB,CAACF,EAAAA,QAAG,WAAW,CAAM,GAEhF,OADA,EAAA,QAAG,OAAO,EAAQ,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,EAC3C,CACT,CAGA,kBAA+C,CAC7C,GAAI,CACF,OAAO,KAAK,UAAU,CACxB,MAAQ,CAEN,MACF,CACF,CAGA,sBAA8B,EAAmB,EAAe,EAAa,EAA8B,CACzG,GAAI,CAKF,GAJI,EAAM,EAAgB,CAAS,GAAK,GAIpC,EAAWE,EAAAA,QAAK,KAAK,EAAW,CAAc,CAAC,EAAG,OACtD,EAAA,QAAG,OAAO,EAAW,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,EACrD,EAAO,QAAQ,KAAK,CAAS,CAC/B,OAAS,EAAO,CACT,EAAgC,OAAS,GAC5C,EAAO,OAAO,KAAK,kCAAkC,EAAU,IAAI,OAAO,CAAK,GAAG,CAEtF,CACF,CAEA,UAAkB,EAA2B,CAC3C,IAAM,EAAY,GAAU,KAAK,GAAK,KAAK,kBAAoBE,EAAAA,mBAAmB,EAClF,GAAI,CAAC,EAAW,MAAU,MAAM,mDAAmD,EACnF,OAAO,CACT,CAEA,gBAAiC,CAC/B,IAAM,EAAW,QAAQ,IAAID,EAAAA,YAAY,EAAE,KAAK,EAEhD,OADI,EAAiBD,EAAAA,QAAK,QAAQA,EAAAA,QAAK,QAAQ,CAAQ,CAAC,EACjDA,EAAAA,QAAK,KAAK,EAAsB,QAAQ,GAAG,EAAG,CAAc,CACrE,CAEA,iBAAyB,EAA4B,CACnD,OAAOA,EAAAA,QAAK,KAAK,KAAK,eAAe,EAAG,KAAK,UAAU,CAAS,CAAC,CACnE,CAEA,oBACE,EACA,EACA,EACA,EACA,EACM,CACN,IAAI,EACJ,GAAI,CACF,EAAUF,EAAAA,QAAG,YAAY,CAAS,CACpC,OAAS,EAAO,CACT,EAAgC,OAAS,GAC5C,EAAO,OAAO,KAAK,yCAAyC,EAAU,IAAI,OAAO,CAAK,GAAG,EAE3F,MACF,CAEA,IAAK,IAAM,KAAS,EAAS,CAC3B,GAAI,CAAC,EAAM,SAAS,CAAe,EAAG,SACtC,IAAM,EAAYE,EAAAA,QAAK,KAAK,EAAW,CAAK,EAC5C,GAAI,CAEF,IAAM,EAAa,EADI,KAAK,MAAMF,EAAAA,QAAG,aAAa,EAAW,CAAa,CACvC,CAAC,EACpC,GAAI,IAAe,IAAA,IAAa,EAAM,GAAc,EAAO,SAC3D,IAAM,EAAK,EAAM,MAAM,EAAG,EAAuB,EACjD,KAAK,mBAAmB,EAAW,EAAI,EAAW,CAAM,CAC1D,OAAS,EAAO,CACd,EAAO,OAAO,KAAK,mCAAmC,EAAU,IAAI,OAAO,CAAK,GAAG,CACrF,CACF,CACF,CAEA,mBAA2B,EAAmB,EAAY,EAAmB,EAA8B,CACzG,IAAM,EAAa,CAAC,EAAW,KAAK,WAAW,EAAI,CAAS,EAAG,KAAK,kBAAkB,EAAI,CAAS,CAAC,EACpG,IAAK,IAAM,KAAa,EACtB,GAAI,CACF,EAAA,QAAG,WAAW,CAAS,EACvB,EAAO,QAAQ,KAAK,CAAS,CAC/B,OAAS,EAAO,CACT,EAAgC,OAAS,GAC5C,EAAO,OAAO,KAAK,mCAAmC,EAAU,IAAI,OAAO,CAAK,GAAG,CAEvF,CAEJ,CACF,EA9KCK,EAAAA,EAAAA,QAAAA,EAAAA,EAAAA,EAAAA,WAAAA,CAAW,CAAA,EAAA,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { IRunnerPaths, LogSweepResult } from "./types.cjs";
2
+ import "reflect-metadata/lite";
3
+ //#region src/services/RunnerPaths/RunnerPaths.d.ts
4
+ /** Session-scoped runner storage under the Pi agent directory. */
5
+ declare class RunnerPaths implements IRunnerPaths {
6
+ private adoptedSessionId;
7
+ private repository;
8
+ repositoryPath(): string;
9
+ setSessionId(sessionId: string): void;
10
+ logDirectory(sessionId?: string): string;
11
+ stateDirectory(sessionId?: string): string;
12
+ logPathFor(id: string, sessionId?: string): string;
13
+ rotatedLogPathFor(id: string, sessionId?: string): string;
14
+ statePathFor(id: string, sessionId?: string): string;
15
+ ensureDirectories(sessionId?: string): void;
16
+ sweepHistory(ttlMs: number, now?: number): LogSweepResult;
17
+ legacyDirectory(): string | undefined;
18
+ removeLegacyStore(): string | undefined;
19
+ /** The live session, if one is known, so a sweep never deletes underneath itself. */
20
+ private currentSessionId;
21
+ /** Removes a session's whole directory once its newest entry is past the TTL. */
22
+ private sweepSessionDirectory;
23
+ private sessionId;
24
+ private storeDirectory;
25
+ private sessionDirectory;
26
+ private sweepStateDirectory;
27
+ private removeHistoryFiles;
28
+ }
29
+ //#endregion
30
+ export { RunnerPaths };
31
+ //# sourceMappingURL=RunnerPaths.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerPaths.d.cts","names":[],"sources":["../../../src/services/RunnerPaths/RunnerPaths.ts"],"mappings":";;;;cA6Ga,uBAAuB;UAC1B;UACA;EAER;EAKA,aAAa;EAMb,aAAa;EAMb,eAAe;EAMf,WAAW,YAAY;EAIvB,kBAAkB,YAAY;EAI9B,aAAa,YAAY;EAIzB,kBAAkB;EAKlB,aAAa,eAAe,eAA2B;EA6BvD;EAKA;;UAQQ;;UAUA;UAgBA;UAMA;UAMA;UAIA;UAgCA"}
@@ -0,0 +1,31 @@
1
+ import { IRunnerPaths, LogSweepResult } from "./types.mjs";
2
+ import "reflect-metadata/lite";
3
+ //#region src/services/RunnerPaths/RunnerPaths.d.ts
4
+ /** Session-scoped runner storage under the Pi agent directory. */
5
+ declare class RunnerPaths implements IRunnerPaths {
6
+ private adoptedSessionId;
7
+ private repository;
8
+ repositoryPath(): string;
9
+ setSessionId(sessionId: string): void;
10
+ logDirectory(sessionId?: string): string;
11
+ stateDirectory(sessionId?: string): string;
12
+ logPathFor(id: string, sessionId?: string): string;
13
+ rotatedLogPathFor(id: string, sessionId?: string): string;
14
+ statePathFor(id: string, sessionId?: string): string;
15
+ ensureDirectories(sessionId?: string): void;
16
+ sweepHistory(ttlMs: number, now?: number): LogSweepResult;
17
+ legacyDirectory(): string | undefined;
18
+ removeLegacyStore(): string | undefined;
19
+ /** The live session, if one is known, so a sweep never deletes underneath itself. */
20
+ private currentSessionId;
21
+ /** Removes a session's whole directory once its newest entry is past the TTL. */
22
+ private sweepSessionDirectory;
23
+ private sessionId;
24
+ private storeDirectory;
25
+ private sessionDirectory;
26
+ private sweepStateDirectory;
27
+ private removeHistoryFiles;
28
+ }
29
+ //#endregion
30
+ export { RunnerPaths };
31
+ //# sourceMappingURL=RunnerPaths.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerPaths.d.mts","names":[],"sources":["../../../src/services/RunnerPaths/RunnerPaths.ts"],"mappings":";;;;cA6Ga,uBAAuB;UAC1B;UACA;EAER;EAKA,aAAa;EAMb,aAAa;EAMb,eAAe;EAMf,WAAW,YAAY;EAIvB,kBAAkB,YAAY;EAI9B,aAAa,YAAY;EAIzB,kBAAkB;EAKlB,aAAa,eAAe,eAA2B;EA6BvD;EAKA;;UAQQ;;UAUA;UAgBA;UAMA;UAMA;UAIA;UAgCA"}
@@ -0,0 +1,2 @@
1
+ import{LOG_DIR_ENV as e}from"../../config.mjs";import t from"../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs";import{inheritedSessionId as n}from"../../session.mjs";import{injectable as r}from"inversify";import"reflect-metadata/lite";import i from"node:fs";import a from"node:path";import o from"node:os";import{execFileSync as s}from"node:child_process";const c=`doom-runner`,l=`runs`,u=`.json`,d=`utf8`,f=`ENOENT`;function p(e,t){try{let n=s(`git`,e,{cwd:t,encoding:d,stdio:[`ignore`,`pipe`,`ignore`]}).trim();return n.length>0?n:void 0}catch{return}}function m(e){try{return i.realpathSync(e)}catch{return e}}function h(e){let t=e.PI_CODING_AGENT_DIR?.trim();return t===`~`?o.homedir():t?.startsWith(`~/`)?a.join(o.homedir(),t.slice(2)):t?a.resolve(t):a.join(o.homedir(),`.pi`,`agent`)}function g(e){let t=i.statSync(e).mtimeMs;for(let n of i.readdirSync(e,{withFileTypes:!0})){let r=a.join(e,n.name);if(t=Math.max(t,i.statSync(r).mtimeMs),n.isDirectory())for(let e of i.readdirSync(r))t=Math.max(t,i.statSync(a.join(r,e)).mtimeMs)}return t}function _(e){let t;try{t=i.readdirSync(e)}catch{return!1}for(let n of t)if(n.endsWith(u))try{let t=JSON.parse(i.readFileSync(a.join(e,n),d)).hostPid;if(typeof t!=`number`)continue;return process.kill(t,0),!0}catch{}return!1}function v(e){if(typeof e!=`object`||!e)return;let t=e;if(t.state!==`completed`||typeof t.exit?.finishedAt!=`string`)return;let n=Date.parse(t.exit.finishedAt);return Number.isFinite(n)?n:void 0}let y=class{adoptedSessionId;repository;repositoryPath(){return this.repository??=m(p([`rev-parse`,`--show-toplevel`],process.cwd())??process.cwd()),this.repository}setSessionId(e){let t=e.trim();if(!t)throw Error(`doom-runner session id cannot be blank`);this.adoptedSessionId=t}logDirectory(t){let n=process.env[e]?.trim();return n?a.resolve(n):a.join(this.sessionDirectory(t),`logs`)}stateDirectory(t){let n=process.env[e]?.trim();return n?a.join(a.resolve(n),`..`,l):a.join(this.sessionDirectory(t),l)}logPathFor(e,t){return a.join(this.logDirectory(t),`${e}.log`)}rotatedLogPathFor(e,t){return`${this.logPathFor(e,t)}.1`}statePathFor(e,t){return a.join(this.stateDirectory(t),`${e}${u}`)}ensureDirectories(e){i.mkdirSync(this.logDirectory(e),{recursive:!0}),i.mkdirSync(this.stateDirectory(e),{recursive:!0})}sweepHistory(e,t=Date.now()){let n={removed:[],errors:[]};if(process.env.DOOM_RUNNER_LOG_DIR?.trim())return this.sweepStateDirectory(this.stateDirectory(),this.sessionId(),e,t,n),n;let r=this.storeDirectory(),o;try{o=i.readdirSync(r)}catch(e){return e.code===f||n.errors.push(`Could not read runner history directory ${r}: ${String(e)}`),n}let s=this.currentSessionId();for(let i of o)i!==s&&this.sweepSessionDirectory(a.join(r,i),e,t,n);return n}legacyDirectory(){let e=p([`rev-parse`,`--path-format=absolute`,`--git-common-dir`],process.cwd());return e?a.join(e,c):void 0}removeLegacyStore(){let e=this.legacyDirectory();if(!(!e||a.basename(e)!==c||!i.existsSync(e)))return i.rmSync(e,{recursive:!0,force:!0}),e}currentSessionId(){try{return this.sessionId()}catch{return}}sweepSessionDirectory(e,t,n,r){try{if(n-g(e)<=t||_(a.join(e,l)))return;i.rmSync(e,{recursive:!0,force:!0}),r.removed.push(e)}catch(t){t.code!==f&&r.errors.push(`Could not sweep runner session ${e}: ${String(t)}`)}}sessionId(e){let t=e?.trim()||this.adoptedSessionId||n();if(!t)throw Error(`PI_SESSION_ID is required for doom-runner storage`);return t}storeDirectory(){let t=process.env[e]?.trim();return t?a.dirname(a.resolve(t)):a.join(h(process.env),c)}sessionDirectory(e){return a.join(this.storeDirectory(),this.sessionId(e))}sweepStateDirectory(e,t,n,r,o){let s;try{s=i.readdirSync(e)}catch(t){t.code!==f&&o.errors.push(`Could not read runner state directory ${e}: ${String(t)}`);return}for(let c of s){if(!c.endsWith(u))continue;let s=a.join(e,c);try{let e=v(JSON.parse(i.readFileSync(s,d)));if(e===void 0||r-e<=n)continue;let a=c.slice(0,-5);this.removeHistoryFiles(t,a,s,o)}catch(e){o.errors.push(`Could not sweep runner metadata ${s}: ${String(e)}`)}}}removeHistoryFiles(e,t,n,r){let a=[n,this.logPathFor(t,e),this.rotatedLogPathFor(t,e)];for(let e of a)try{i.unlinkSync(e),r.removed.push(e)}catch(t){t.code!==f&&r.errors.push(`Could not remove runner history ${e}: ${String(t)}`)}}};y=t([r()],y);export{y as RunnerPaths};
2
+ //# sourceMappingURL=RunnerPaths.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerPaths.mjs","names":[],"sources":["../../../src/services/RunnerPaths/RunnerPaths.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { injectable } from 'inversify';\nimport 'reflect-metadata/lite';\nimport { LOG_DIR_ENV } from '../../config.ts';\nimport { inheritedSessionId } from '../../session.ts';\nimport type { IRunnerPaths, LogSweepResult } from './types.ts';\n\nconst STORE_DIR_NAME = 'doom-runner';\nconst DEFAULT_CONFIG_DIR_NAME = '.pi';\nconst AGENT_DIR_NAME = 'agent';\nconst LOG_DIR_NAME = 'logs';\nconst STATE_DIR_NAME = 'runs';\nconst LOG_EXTENSION = '.log';\nconst STATE_EXTENSION = '.json';\nconst ROTATED_SUFFIX = '.1';\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\nconst FILE_ENCODING = 'utf8';\nconst NOT_FOUND_ERROR_CODE = 'ENOENT';\n\nfunction git(args: string[], cwd: string): string | undefined {\n try {\n const output = execFileSync('git', args, { cwd, encoding: FILE_ENCODING, stdio: ['ignore', 'pipe', 'ignore'] });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return target;\n }\n}\n\nfunction resolveAgentDirectory(env: NodeJS.ProcessEnv): string {\n const configured = env[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (configured === HOME_ALIAS) return os.homedir();\n if (configured?.startsWith(HOME_ALIAS_PREFIX)) {\n return path.join(os.homedir(), configured.slice(HOME_ALIAS_PREFIX.length));\n }\n return configured ? path.resolve(configured) : path.join(os.homedir(), DEFAULT_CONFIG_DIR_NAME, AGENT_DIR_NAME);\n}\n\n/**\n * Newest mtime anywhere one level inside the session, falling back to the\n * directory itself. A session still being written to therefore always looks\n * recent, whatever state its individual records are in.\n */\nfunction newestEntryTime(directory: string): number {\n let newest = fs.statSync(directory).mtimeMs;\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const target = path.join(directory, entry.name);\n newest = Math.max(newest, fs.statSync(target).mtimeMs);\n if (!entry.isDirectory()) continue;\n for (const child of fs.readdirSync(target)) {\n newest = Math.max(newest, fs.statSync(path.join(target, child)).mtimeMs);\n }\n }\n return newest;\n}\n\n/**\n * Whether any run in this session names a pi process that is still running.\n *\n * One live record is enough: records are only ever written by their owner, so a\n * live host pid means the session is still in use however old its files look.\n */\nfunction ownerAlive(stateDirectory: string): boolean {\n let entries: string[];\n try {\n entries = fs.readdirSync(stateDirectory);\n } catch {\n // No records left to consult, so nothing claims the directory.\n return false;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(STATE_EXTENSION)) continue;\n try {\n const value: unknown = JSON.parse(fs.readFileSync(path.join(stateDirectory, entry), FILE_ENCODING));\n const hostPid = (value as { hostPid?: unknown }).hostPid;\n if (typeof hostPid !== 'number') continue;\n process.kill(hostPid, 0);\n return true;\n } catch {\n // An unreadable record and a dead pid mean the same thing here: no claim.\n }\n }\n return false;\n}\n\nfunction completedAt(value: unknown): number | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const record = value as { state?: unknown; exit?: { finishedAt?: unknown } };\n if (record.state !== 'completed' || typeof record.exit?.finishedAt !== 'string') return undefined;\n const timestamp = Date.parse(record.exit.finishedAt);\n return Number.isFinite(timestamp) ? timestamp : undefined;\n}\n\n/** Session-scoped runner storage under the Pi agent directory. */\n@injectable()\nexport class RunnerPaths implements IRunnerPaths {\n private adoptedSessionId: string | undefined;\n private repository: string | undefined;\n\n repositoryPath(): string {\n this.repository ??= realPath(git(['rev-parse', '--show-toplevel'], process.cwd()) ?? process.cwd());\n return this.repository;\n }\n\n setSessionId(sessionId: string): void {\n const trimmed = sessionId.trim();\n if (!trimmed) throw new Error('doom-runner session id cannot be blank');\n this.adoptedSessionId = trimmed;\n }\n\n logDirectory(sessionId?: string): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.resolve(override);\n return path.join(this.sessionDirectory(sessionId), LOG_DIR_NAME);\n }\n\n stateDirectory(sessionId?: string): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.join(path.resolve(override), '..', STATE_DIR_NAME);\n return path.join(this.sessionDirectory(sessionId), STATE_DIR_NAME);\n }\n\n logPathFor(id: string, sessionId?: string): string {\n return path.join(this.logDirectory(sessionId), `${id}${LOG_EXTENSION}`);\n }\n\n rotatedLogPathFor(id: string, sessionId?: string): string {\n return `${this.logPathFor(id, sessionId)}${ROTATED_SUFFIX}`;\n }\n\n statePathFor(id: string, sessionId?: string): string {\n return path.join(this.stateDirectory(sessionId), `${id}${STATE_EXTENSION}`);\n }\n\n ensureDirectories(sessionId?: string): void {\n fs.mkdirSync(this.logDirectory(sessionId), { recursive: true });\n fs.mkdirSync(this.stateDirectory(sessionId), { recursive: true });\n }\n\n sweepHistory(ttlMs: number, now: number = Date.now()): LogSweepResult {\n const result: LogSweepResult = { removed: [], errors: [] };\n // A pinned log directory belongs to whoever pinned it, so that branch only\n // ever removes the files this package put there.\n if (process.env[LOG_DIR_ENV]?.trim()) {\n this.sweepStateDirectory(this.stateDirectory(), this.sessionId(), ttlMs, now, result);\n return result;\n }\n const root = this.storeDirectory();\n let sessions: string[];\n try {\n sessions = fs.readdirSync(root);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === NOT_FOUND_ERROR_CODE) return result;\n result.errors.push(`Could not read runner history directory ${root}: ${String(error)}`);\n return result;\n }\n\n // Sweeping whole session directories rather than the three files a completed\n // record names is what keeps sockets, sidecars, runs that never reached a\n // terminal state, and the emptied directories themselves from accumulating.\n const active = this.currentSessionId();\n for (const sessionId of sessions) {\n if (sessionId === active) continue;\n this.sweepSessionDirectory(path.join(root, sessionId), ttlMs, now, result);\n }\n return result;\n }\n\n legacyDirectory(): string | undefined {\n const commonDirectory = git(['rev-parse', '--path-format=absolute', '--git-common-dir'], process.cwd());\n return commonDirectory ? path.join(commonDirectory, STORE_DIR_NAME) : undefined;\n }\n\n removeLegacyStore(): string | undefined {\n const target = this.legacyDirectory();\n if (!target || path.basename(target) !== STORE_DIR_NAME || !fs.existsSync(target)) return undefined;\n fs.rmSync(target, { recursive: true, force: true });\n return target;\n }\n\n /** The live session, if one is known, so a sweep never deletes underneath itself. */\n private currentSessionId(): string | undefined {\n try {\n return this.sessionId();\n } catch {\n // A CLI invocation outside a session still sweeps; it just has nothing to spare.\n return undefined;\n }\n }\n\n /** Removes a session's whole directory once its newest entry is past the TTL. */\n private sweepSessionDirectory(directory: string, ttlMs: number, now: number, result: LogSweepResult): void {\n try {\n if (now - newestEntryTime(directory) <= ttlMs) return;\n // An idle session can go quiet for longer than the TTL, and deleting one\n // takes its lifeline socket with it, which would read to its own runners\n // as an owner that had died. Its records name the owner, so ask.\n if (ownerAlive(path.join(directory, STATE_DIR_NAME))) return;\n fs.rmSync(directory, { recursive: true, force: true });\n result.removed.push(directory);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not sweep runner session ${directory}: ${String(error)}`);\n }\n }\n }\n\n private sessionId(explicit?: string): string {\n const sessionId = explicit?.trim() || this.adoptedSessionId || inheritedSessionId();\n if (!sessionId) throw new Error('PI_SESSION_ID is required for doom-runner storage');\n return sessionId;\n }\n\n private storeDirectory(): string {\n const override = process.env[LOG_DIR_ENV]?.trim();\n if (override) return path.dirname(path.resolve(override));\n return path.join(resolveAgentDirectory(process.env), STORE_DIR_NAME);\n }\n\n private sessionDirectory(sessionId?: string): string {\n return path.join(this.storeDirectory(), this.sessionId(sessionId));\n }\n\n private sweepStateDirectory(\n directory: string,\n sessionId: string,\n ttlMs: number,\n now: number,\n result: LogSweepResult,\n ): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(directory);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not read runner state directory ${directory}: ${String(error)}`);\n }\n return;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith(STATE_EXTENSION)) continue;\n const statePath = path.join(directory, entry);\n try {\n const value: unknown = JSON.parse(fs.readFileSync(statePath, FILE_ENCODING));\n const finishedAt = completedAt(value);\n if (finishedAt === undefined || now - finishedAt <= ttlMs) continue;\n const id = entry.slice(0, -STATE_EXTENSION.length);\n this.removeHistoryFiles(sessionId, id, statePath, result);\n } catch (error) {\n result.errors.push(`Could not sweep runner metadata ${statePath}: ${String(error)}`);\n }\n }\n }\n\n private removeHistoryFiles(sessionId: string, id: string, statePath: string, result: LogSweepResult): void {\n const candidates = [statePath, this.logPathFor(id, sessionId), this.rotatedLogPathFor(id, sessionId)];\n for (const candidate of candidates) {\n try {\n fs.unlinkSync(candidate);\n result.removed.push(candidate);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== NOT_FOUND_ERROR_CODE) {\n result.errors.push(`Could not remove runner history ${candidate}: ${String(error)}`);\n }\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./RunnerPaths.cjs");Object.defineProperty(exports,"RunnerPaths",{enumerable:!0,get:function(){return e.RunnerPaths}});
@@ -0,0 +1,3 @@
1
+ import { IRunnerPaths, LogSweepResult } from "./types.cjs";
2
+ import { RunnerPaths } from "./RunnerPaths.cjs";
3
+ export { type IRunnerPaths, type LogSweepResult, RunnerPaths };
@@ -0,0 +1,3 @@
1
+ import { IRunnerPaths, LogSweepResult } from "./types.mjs";
2
+ import { RunnerPaths } from "./RunnerPaths.mjs";
3
+ export { type IRunnerPaths, type LogSweepResult, RunnerPaths };
@@ -0,0 +1 @@
1
+ import{RunnerPaths as e}from"./RunnerPaths.mjs";export{e as RunnerPaths};
@@ -0,0 +1,33 @@
1
+ //#region src/services/RunnerPaths/types.d.ts
2
+ interface LogSweepResult {
3
+ removed: string[];
4
+ errors: string[];
5
+ }
6
+ /** Filesystem layout for runner state, scoped to one Pi session. */
7
+ interface IRunnerPaths {
8
+ /** Worktree root, used as the registry scope key. */
9
+ repositoryPath(): string;
10
+ /** Adopt the Pi session before the extension reads or writes runner state. */
11
+ setSessionId(sessionId: string): void;
12
+ /** Directory holding one session's runner logs. */
13
+ logDirectory(sessionId?: string): string;
14
+ /** Directory holding one session's persistent metadata for CLI access. */
15
+ stateDirectory(sessionId?: string): string;
16
+ logPathFor(id: string, sessionId?: string): string;
17
+ /** Single rotation target for `logPathFor(id)`. */
18
+ rotatedLogPathFor(id: string, sessionId?: string): string;
19
+ statePathFor(id: string, sessionId?: string): string;
20
+ ensureDirectories(sessionId?: string): void;
21
+ /**
22
+ * Deletes completed metadata and matching logs after the retention window.
23
+ * Running records are never removed.
24
+ */
25
+ sweepHistory(ttlMs: number, now?: number): LogSweepResult;
26
+ /** Exact legacy Git-directory store, if this repository has one. */
27
+ legacyDirectory(): string | undefined;
28
+ /** Removes only the validated legacy doom-runner directory. */
29
+ removeLegacyStore(): string | undefined;
30
+ }
31
+ //#endregion
32
+ export { IRunnerPaths, LogSweepResult };
33
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../../src/services/RunnerPaths/types.ts"],"mappings":";UAAiB;EACf;EACA;;;UAIe;;EAEf;;EAEA,aAAa;;EAEb,aAAa;;EAEb,eAAe;EACf,WAAW,YAAY;;EAEvB,kBAAkB,YAAY;EAC9B,aAAa,YAAY;EACzB,kBAAkB;;;;;EAKlB,aAAa,eAAe,eAAe;;EAE3C;;EAEA"}
@@ -0,0 +1,33 @@
1
+ //#region src/services/RunnerPaths/types.d.ts
2
+ interface LogSweepResult {
3
+ removed: string[];
4
+ errors: string[];
5
+ }
6
+ /** Filesystem layout for runner state, scoped to one Pi session. */
7
+ interface IRunnerPaths {
8
+ /** Worktree root, used as the registry scope key. */
9
+ repositoryPath(): string;
10
+ /** Adopt the Pi session before the extension reads or writes runner state. */
11
+ setSessionId(sessionId: string): void;
12
+ /** Directory holding one session's runner logs. */
13
+ logDirectory(sessionId?: string): string;
14
+ /** Directory holding one session's persistent metadata for CLI access. */
15
+ stateDirectory(sessionId?: string): string;
16
+ logPathFor(id: string, sessionId?: string): string;
17
+ /** Single rotation target for `logPathFor(id)`. */
18
+ rotatedLogPathFor(id: string, sessionId?: string): string;
19
+ statePathFor(id: string, sessionId?: string): string;
20
+ ensureDirectories(sessionId?: string): void;
21
+ /**
22
+ * Deletes completed metadata and matching logs after the retention window.
23
+ * Running records are never removed.
24
+ */
25
+ sweepHistory(ttlMs: number, now?: number): LogSweepResult;
26
+ /** Exact legacy Git-directory store, if this repository has one. */
27
+ legacyDirectory(): string | undefined;
28
+ /** Removes only the validated legacy doom-runner directory. */
29
+ removeLegacyStore(): string | undefined;
30
+ }
31
+ //#endregion
32
+ export { IRunnerPaths, LogSweepResult };
33
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/services/RunnerPaths/types.ts"],"mappings":";UAAiB;EACf;EACA;;;UAIe;;EAEf;;EAEA,aAAa;;EAEb,aAAa;;EAEb,eAAe;EACf,WAAW,YAAY;;EAEvB,kBAAkB,YAAY;EAC9B,aAAa,YAAY;EACzB,kBAAkB;;;;;EAKlB,aAAa,eAAe,eAAe;;EAE3C;;EAEA"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../types.cjs"),n=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateMetadata.cjs"),r=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorateParam.cjs"),i=require("../../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs");let a=require("inversify");require("reflect-metadata/lite");let o=require("node:fs");o=e.__toESM(o,1);let s=require("node:path");s=e.__toESM(s,1);let c=require("@agimon-ai/doompi-extension-contracts/child-process"),l=require("@agimon-ai/foundation-process-registry");const u=`tool`,d=`doom-runner:`,f=`doom-runner`;function p(){return(0,l.createProcessRegistryService)(process.env.PROCESS_REGISTRY_PATH)}function m(e){return`session:${e}`}function h(e,t){let n=e.metadata?.[t];return typeof n==`string`?n:``}function g(e,t){let n=e.metadata?.[t];return typeof n==`number`?n:0}let _=class{paths;processControl;registry;listeners=new Set;constructor(e,t,n){this.paths=e,this.processControl=t,this.registry=n}async register(e){let t=new Date().toISOString(),n=(0,c.resolveRootSessionId)(e.sessionId),r=await this.registry.registerProcess({repositoryPath:this.repositoryPath(),serviceName:`${d}${e.id}`,serviceType:u,pid:e.pid,command:e.command,tags:(0,l.resolveProcessTags)([f,`runner:${e.id}`,m(e.sessionId)]),metadata:{id:e.id,name:e.name,command:e.command,cwd:e.cwd,logPath:e.logPath,interactive:e.interactive,sessionId:e.sessionId,rootSessionId:n,backend:e.backend,...e.backendTarget?{backendTarget:e.backendTarget}:{},startedAt:t,hostPid:process.pid},force:!0});if(!r.success)throw Error(r.error??`Failed to register runner ${e.name}`);let i={id:e.id,name:e.name,pid:e.pid,command:e.command,cwd:e.cwd,logPath:e.logPath,interactive:e.interactive,sessionId:e.sessionId,rootSessionId:n,startedAt:t,state:`running`,promoted:!1,backend:e.backend,...e.backendTarget?{backendTarget:e.backendTarget}:{},...e.alarmMs?{alarm:{intervalMs:e.alarmMs,lastFiredAt:t}}:{},hostPid:process.pid};return this.writeRecord(i),this.notify(),i}async list(){return(await this.registry.listProcesses({repositoryPath:this.repositoryPath(),serviceType:u,tags:(0,l.resolveProcessTags)([f])})).map(v)}async listAcrossRepositories(){return(await this.registry.listProcesses({serviceType:u,tags:(0,l.resolveProcessTags)([f])})).map(v)}async listBySession(e){return(await this.list()).filter(t=>t.sessionId===e)}async listByRootSession(e){return(await this.list()).filter(t=>(t.rootSessionId??t.sessionId)===e)}async listAll(e){this.paths.ensureDirectories(e);let t=[],n=this.paths.stateDirectory(e);for(let e of o.default.readdirSync(n))if(b(e))try{let r=JSON.parse(o.default.readFileSync(`${n}/${e}`,`utf8`));x(r)&&t.push(r)}catch(t){process.emitWarning(`Could not read runner metadata ${e}: ${String(t)}`)}return t.sort((e,t)=>t.startedAt.localeCompare(e.startedAt))}async get(e,t){let n=this.paths.statePathFor(e,t);try{let t=JSON.parse(o.default.readFileSync(n,`utf8`));if(!x(t)||t.id!==e){process.emitWarning(`Could not read runner metadata ${s.default.basename(n)}: invalid runner record`);return}return t}catch(e){if(e.code===`ENOENT`)return;process.emitWarning(`Could not read runner metadata ${s.default.basename(n)}: ${String(e)}`);return}}async markPromoted(e){let t=await this.get(e);if(!t)return;let n={...t,promoted:!0};return this.writeRecord(n),this.notify(),n}async clearAlarm(e,t){let n=await this.get(e,t);if(!n)return;if(!n.alarm)return n;let r={...n};return delete r.alarm,this.writeRecord(r),this.notify(),r}async markAlarmFired(e,t){let n=await this.get(e);if(!n?.alarm||n.state!==`running`)return;let r={...n,alarm:{...n.alarm,lastFiredAt:t}};return this.writeRecord(r),this.notify(),r}async complete(e,t,n){let r=await this.get(e,n);if(r?.state===`completed`)return await this.release(e),r;let i=await this.list(),a=r??i.find(t=>t.id===e&&(n===void 0||t.sessionId===n));if(!a){n!==void 0&&i.some(t=>t.id===e&&t.sessionId!==n)||await this.release(e);return}let o={...a,state:`completed`,exit:{...t,finishedAt:new Date().toISOString()}};return this.writeRecord(o),await this.release(e),o}async release(e){let t=await this.registry.releaseProcess({repositoryPath:this.repositoryPath(),serviceName:`${d}${e}`,serviceType:u,kill:!1,releasePort:!1,force:!0});if(!t.success&&!t.error?.includes(`No matching process entry`))throw Error(t.error??`Failed to release runner ${e}`);this.notify()}async pruneDead(){let e=(await this.list()).filter(e=>!this.processControl.isAlive(e.pid));for(let t of e)await this.complete(t.id,{reason:`backend_lost`,code:null,signal:null},t.sessionId);return e.map(e=>e.id)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}close(){this.listeners.clear(),this.registry.close()}notify(){for(let e of this.listeners)e()}repositoryPath(){return(0,l.normalizeRepositoryPath)(this.paths.repositoryPath())}writeRecord(e){this.paths.ensureDirectories(e.sessionId);let t=this.paths.statePathFor(e.id,e.sessionId),n=`${t}.${process.pid}.tmp`;o.default.writeFileSync(n,`${JSON.stringify(e,null,2)}\n`,`utf8`),o.default.renameSync(n,t)}};_=i.default([(0,a.injectable)(),r.default(0,(0,a.inject)(t.TYPES.RunnerPaths)),r.default(1,(0,a.inject)(t.TYPES.ProcessControl)),r.default(2,(0,a.inject)(t.TYPES.ProcessRegistry)),n.default(`design:paramtypes`,[Object,Object,Object])],_);function v(e){return{id:h(e,`id`),name:h(e,`name`),pid:e.pid,command:h(e,`command`),cwd:h(e,`cwd`),logPath:h(e,`logPath`),interactive:e.metadata?.interactive===!0,sessionId:h(e,`sessionId`),...h(e,`rootSessionId`)?{rootSessionId:h(e,`rootSessionId`)}:{},startedAt:h(e,`startedAt`),state:`running`,promoted:!1,backend:y(e.metadata?.backend),...h(e,`backendTarget`)?{backendTarget:h(e,`backendTarget`)}:{},hostPid:g(e,`hostPid`)}}function y(e){return e===`rmux`||e===`tmux`?e:`native`}function b(e){return e.endsWith(`.json`)&&!e.endsWith(`.command.json`)&&!e.endsWith(`.exit.json`)}function x(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&typeof t.name==`string`&&typeof t.pid==`number`&&typeof t.command==`string`&&typeof t.cwd==`string`&&typeof t.logPath==`string`&&typeof t.sessionId==`string`&&typeof t.startedAt==`string`&&(t.state===`running`||t.state===`completed`)&&typeof t.promoted==`boolean`&&(t.backend===`rmux`||t.backend===`tmux`||t.backend===`native`)}Object.defineProperty(exports,"RunnerRegistry",{enumerable:!0,get:function(){return _}}),exports.createDefaultProcessRegistry=p;
2
+ //# sourceMappingURL=RunnerRegistry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerRegistry.cjs","names":["createProcessRegistryService","resolveRootSessionId","resolveProcessTags","fs","path","normalizeRepositoryPath","injectable","inject","TYPES"],"sources":["../../../src/services/RunnerRegistry/RunnerRegistry.ts"],"sourcesContent":["import { resolveRootSessionId } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport {\n createProcessRegistryService,\n normalizeRepositoryPath,\n type ProcessRegistryRecord,\n type ProcessRegistryService,\n resolveProcessTags,\n} from '@agimon-ai/foundation-process-registry';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { inject, injectable } from 'inversify';\nimport 'reflect-metadata/lite';\nimport type { IProcessControl } from '../ProcessControl/index.ts';\nimport type { IRunnerPaths } from '../RunnerPaths/index.ts';\nimport { TYPES } from '../../types.ts';\nimport type { CompleteRunnerInput, IRunnerRegistry, RegisterRunnerInput, RunnerRecord } from './types.ts';\n\nconst SERVICE_TYPE = 'tool';\nconst SERVICE_PREFIX = 'doom-runner:';\nconst RUNNER_TAG = 'doom-runner';\nconst REGISTRY_PATH_ENV = 'PROCESS_REGISTRY_PATH';\nconst JSON_EXTENSION = '.json';\nconst COMMAND_SIDECAR_SUFFIX = '.command.json';\nconst EXIT_SIDECAR_SUFFIX = '.exit.json';\nconst NOT_FOUND_ERROR_CODE = 'ENOENT';\n\n/** The slice of the shared registry service this wrapper depends on. */\nexport type ProcessRegistryPort = Pick<\n ProcessRegistryService,\n 'registerProcess' | 'releaseProcess' | 'listProcesses' | 'close'\n>;\n\n/** Opens the SQLite-backed registry the rest of the monorepo already shares. */\nexport function createDefaultProcessRegistry(): ProcessRegistryPort {\n return createProcessRegistryService(process.env[REGISTRY_PATH_ENV]);\n}\n\nfunction sessionTag(sessionId: string): string {\n return `session:${sessionId}`;\n}\n\nfunction readString(record: ProcessRegistryRecord, key: string): string {\n const value = record.metadata?.[key];\n return typeof value === 'string' ? value : '';\n}\n\nfunction readNumber(record: ProcessRegistryRecord, key: string): number {\n const value = record.metadata?.[key];\n return typeof value === 'number' ? value : 0;\n}\n\n@injectable()\nexport class RunnerRegistry implements IRunnerRegistry {\n private readonly listeners = new Set<() => void>();\n\n constructor(\n @inject(TYPES.RunnerPaths) private readonly paths: IRunnerPaths,\n @inject(TYPES.ProcessControl) private readonly processControl: IProcessControl,\n @inject(TYPES.ProcessRegistry) private readonly registry: ProcessRegistryPort,\n ) {}\n\n async register(input: RegisterRunnerInput): Promise<RunnerRecord> {\n const startedAt = new Date().toISOString();\n const rootSessionId = resolveRootSessionId(input.sessionId);\n const response = await this.registry.registerProcess({\n repositoryPath: this.repositoryPath(),\n serviceName: `${SERVICE_PREFIX}${input.id}`,\n serviceType: SERVICE_TYPE,\n pid: input.pid,\n command: input.command,\n tags: resolveProcessTags([RUNNER_TAG, `runner:${input.id}`, sessionTag(input.sessionId)]),\n metadata: {\n id: input.id,\n name: input.name,\n command: input.command,\n cwd: input.cwd,\n logPath: input.logPath,\n interactive: input.interactive,\n sessionId: input.sessionId,\n rootSessionId,\n backend: input.backend,\n ...(input.backendTarget ? { backendTarget: input.backendTarget } : {}),\n startedAt,\n hostPid: process.pid,\n },\n // The caller has already resolved name collisions against live records,\n // so anything still holding this name is stale.\n force: true,\n });\n if (!response.success) throw new Error(response.error ?? `Failed to register runner ${input.name}`);\n const record: RunnerRecord = {\n id: input.id,\n name: input.name,\n pid: input.pid,\n command: input.command,\n cwd: input.cwd,\n logPath: input.logPath,\n interactive: input.interactive,\n sessionId: input.sessionId,\n rootSessionId,\n startedAt,\n state: 'running',\n promoted: false,\n backend: input.backend,\n ...(input.backendTarget ? { backendTarget: input.backendTarget } : {}),\n ...(input.alarmMs ? { alarm: { intervalMs: input.alarmMs, lastFiredAt: startedAt } } : {}),\n hostPid: process.pid,\n };\n this.writeRecord(record);\n this.notify();\n return record;\n }\n\n async list(): Promise<RunnerRecord[]> {\n const records = await this.registry.listProcesses({\n repositoryPath: this.repositoryPath(),\n serviceType: SERVICE_TYPE,\n tags: resolveProcessTags([RUNNER_TAG]),\n });\n return records.map(toRunnerRecord);\n }\n\n async listAcrossRepositories(): Promise<RunnerRecord[]> {\n const records = await this.registry.listProcesses({\n serviceType: SERVICE_TYPE,\n tags: resolveProcessTags([RUNNER_TAG]),\n });\n return records.map(toRunnerRecord);\n }\n\n async listBySession(sessionId: string): Promise<RunnerRecord[]> {\n const records = await this.list();\n return records.filter((record) => record.sessionId === sessionId);\n }\n\n async listByRootSession(rootSessionId: string): Promise<RunnerRecord[]> {\n const records = await this.list();\n return records.filter((record) => (record.rootSessionId ?? record.sessionId) === rootSessionId);\n }\n\n async listAll(sessionId?: string): Promise<RunnerRecord[]> {\n this.paths.ensureDirectories(sessionId);\n const records: RunnerRecord[] = [];\n const directory = this.paths.stateDirectory(sessionId);\n for (const entry of fs.readdirSync(directory)) {\n if (!isPrimaryMetadataEntry(entry)) continue;\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(`${directory}/${entry}`, 'utf8'));\n if (isRunnerRecord(parsed)) records.push(parsed);\n } catch (error) {\n process.emitWarning(`Could not read runner metadata ${entry}: ${String(error)}`);\n }\n }\n return records.sort((left, right) => right.startedAt.localeCompare(left.startedAt));\n }\n\n async get(id: string, sessionId?: string): Promise<RunnerRecord | undefined> {\n const target = this.paths.statePathFor(id, sessionId);\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(target, 'utf8'));\n if (!isRunnerRecord(parsed) || parsed.id !== id) {\n process.emitWarning(`Could not read runner metadata ${path.basename(target)}: invalid runner record`);\n return undefined;\n }\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === NOT_FOUND_ERROR_CODE) return undefined;\n process.emitWarning(`Could not read runner metadata ${path.basename(target)}: ${String(error)}`);\n return undefined;\n }\n }\n\n async markPromoted(id: string): Promise<RunnerRecord | undefined> {\n const record = await this.get(id);\n if (!record) return undefined;\n const promoted = { ...record, promoted: true };\n this.writeRecord(promoted);\n this.notify();\n return promoted;\n }\n\n async clearAlarm(id: string, sessionId?: string): Promise<RunnerRecord | undefined> {\n const record = await this.get(id, sessionId);\n if (!record) return undefined;\n if (!record.alarm) return record;\n const cleared: RunnerRecord = { ...record };\n delete cleared.alarm;\n this.writeRecord(cleared);\n this.notify();\n return cleared;\n }\n\n async markAlarmFired(id: string, firedAt: string): Promise<RunnerRecord | undefined> {\n const record = await this.get(id);\n if (!record?.alarm || record.state !== 'running') return undefined;\n const fired: RunnerRecord = { ...record, alarm: { ...record.alarm, lastFiredAt: firedAt } };\n this.writeRecord(fired);\n this.notify();\n return fired;\n }\n\n async complete(id: string, outcome: CompleteRunnerInput, sessionId?: string): Promise<RunnerRecord | undefined> {\n const persisted = await this.get(id, sessionId);\n if (persisted?.state === 'completed') {\n await this.release(id);\n return persisted;\n }\n const active = await this.list();\n const record =\n persisted ??\n active.find((candidate) => candidate.id === id && (sessionId === undefined || candidate.sessionId === sessionId));\n if (!record) {\n const belongsToAnotherSession =\n sessionId !== undefined && active.some((candidate) => candidate.id === id && candidate.sessionId !== sessionId);\n if (!belongsToAnotherSession) await this.release(id);\n return undefined;\n }\n const completed: RunnerRecord = {\n ...record,\n state: 'completed',\n exit: { ...outcome, finishedAt: new Date().toISOString() },\n };\n this.writeRecord(completed);\n await this.release(id);\n return completed;\n }\n\n async release(id: string): Promise<void> {\n const response = await this.registry.releaseProcess({\n repositoryPath: this.repositoryPath(),\n serviceName: `${SERVICE_PREFIX}${id}`,\n serviceType: SERVICE_TYPE,\n kill: false,\n releasePort: false,\n force: true,\n });\n if (!response.success && !response.error?.includes('No matching process entry')) {\n throw new Error(response.error ?? `Failed to release runner ${id}`);\n }\n this.notify();\n }\n\n async pruneDead(): Promise<string[]> {\n const dead = (await this.list()).filter((record) => !this.processControl.isAlive(record.pid));\n for (const record of dead) {\n await this.complete(record.id, { reason: 'backend_lost', code: null, signal: null }, record.sessionId);\n }\n return dead.map((record) => record.id);\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n close(): void {\n this.listeners.clear();\n this.registry.close();\n }\n\n private notify(): void {\n for (const listener of this.listeners) listener();\n }\n\n private repositoryPath(): string {\n return normalizeRepositoryPath(this.paths.repositoryPath());\n }\n\n private writeRecord(record: RunnerRecord): void {\n this.paths.ensureDirectories(record.sessionId);\n const target = this.paths.statePathFor(record.id, record.sessionId);\n const temporary = `${target}.${process.pid}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(record, null, 2)}\\n`, 'utf8');\n fs.renameSync(temporary, target);\n }\n}\n\n/** Every field is read back from metadata this class wrote on registration. */\nfunction toRunnerRecord(record: ProcessRegistryRecord): RunnerRecord {\n return {\n id: readString(record, 'id'),\n name: readString(record, 'name'),\n pid: record.pid,\n command: readString(record, 'command'),\n cwd: readString(record, 'cwd'),\n logPath: readString(record, 'logPath'),\n interactive: record.metadata?.interactive === true,\n sessionId: readString(record, 'sessionId'),\n ...(readString(record, 'rootSessionId') ? { rootSessionId: readString(record, 'rootSessionId') } : {}),\n startedAt: readString(record, 'startedAt'),\n state: 'running',\n promoted: false,\n backend: readBackend(record.metadata?.backend),\n ...(readString(record, 'backendTarget') ? { backendTarget: readString(record, 'backendTarget') } : {}),\n hostPid: readNumber(record, 'hostPid'),\n };\n}\n\nfunction readBackend(value: unknown): RunnerRecord['backend'] {\n return value === 'rmux' || value === 'tmux' ? value : 'native';\n}\n\nfunction isPrimaryMetadataEntry(entry: string): boolean {\n return (\n entry.endsWith(JSON_EXTENSION) && !entry.endsWith(COMMAND_SIDECAR_SUFFIX) && !entry.endsWith(EXIT_SIDECAR_SUFFIX)\n );\n}\n\nfunction isRunnerRecord(value: unknown): value is RunnerRecord {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Partial<RunnerRecord>;\n return (\n typeof record.id === 'string' &&\n typeof record.name === 'string' &&\n typeof record.pid === 'number' &&\n typeof record.command === 'string' &&\n typeof record.cwd === 'string' &&\n typeof record.logPath === 'string' &&\n typeof record.sessionId === 'string' &&\n typeof record.startedAt === 'string' &&\n (record.state === 'running' || record.state === 'completed') &&\n typeof record.promoted === 'boolean' &&\n (record.backend === 'rmux' || record.backend === 'tmux' || record.backend === 'native')\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { IRunnerPaths } from "../RunnerPaths/types.cjs";
2
+ import "../RunnerPaths/index.cjs";
3
+ import { IProcessControl } from "../ProcessControl/types.cjs";
4
+ import "../ProcessControl/index.cjs";
5
+ import { CompleteRunnerInput, IRunnerRegistry, RegisterRunnerInput, RunnerRecord } from "./types.cjs";
6
+ import "reflect-metadata/lite";
7
+ import { ProcessRegistryService } from "@agimon-ai/foundation-process-registry";
8
+ //#region src/services/RunnerRegistry/RunnerRegistry.d.ts
9
+ /** The slice of the shared registry service this wrapper depends on. */
10
+ type ProcessRegistryPort = Pick<ProcessRegistryService, 'registerProcess' | 'releaseProcess' | 'listProcesses' | 'close'>;
11
+ /** Opens the SQLite-backed registry the rest of the monorepo already shares. */
12
+ declare function createDefaultProcessRegistry(): ProcessRegistryPort;
13
+ declare class RunnerRegistry implements IRunnerRegistry {
14
+ private readonly paths;
15
+ private readonly processControl;
16
+ private readonly registry;
17
+ private readonly listeners;
18
+ constructor(paths: IRunnerPaths, processControl: IProcessControl, registry: ProcessRegistryPort);
19
+ register(input: RegisterRunnerInput): Promise<RunnerRecord>;
20
+ list(): Promise<RunnerRecord[]>;
21
+ listAcrossRepositories(): Promise<RunnerRecord[]>;
22
+ listBySession(sessionId: string): Promise<RunnerRecord[]>;
23
+ listByRootSession(rootSessionId: string): Promise<RunnerRecord[]>;
24
+ listAll(sessionId?: string): Promise<RunnerRecord[]>;
25
+ get(id: string, sessionId?: string): Promise<RunnerRecord | undefined>;
26
+ markPromoted(id: string): Promise<RunnerRecord | undefined>;
27
+ clearAlarm(id: string, sessionId?: string): Promise<RunnerRecord | undefined>;
28
+ markAlarmFired(id: string, firedAt: string): Promise<RunnerRecord | undefined>;
29
+ complete(id: string, outcome: CompleteRunnerInput, sessionId?: string): Promise<RunnerRecord | undefined>;
30
+ release(id: string): Promise<void>;
31
+ pruneDead(): Promise<string[]>;
32
+ subscribe(listener: () => void): () => void;
33
+ close(): void;
34
+ private notify;
35
+ private repositoryPath;
36
+ private writeRecord;
37
+ }
38
+ //#endregion
39
+ export { ProcessRegistryPort, RunnerRegistry, createDefaultProcessRegistry };
40
+ //# sourceMappingURL=RunnerRegistry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunnerRegistry.d.cts","names":[],"sources":["../../../src/services/RunnerRegistry/RunnerRegistry.ts"],"mappings":";;;;;;;;;KA2BY,sBAAsB,KAChC;;iBAKc,gCAAgC;cAmBnC,0BAA0B;mBAIS;mBACG;mBACC;mBALjC;EAG6B,YAAA,OAAO,cACJ,gBAAgB,iBACf,UAAU;EAGtD,SAAS,OAAO,sBAAsB,QAAQ;EAoD9C,QAAQ,QAAQ;EAShB,0BAA0B,QAAQ;EAQlC,cAAc,oBAAoB,QAAQ;EAK1C,kBAAkB,wBAAwB,QAAQ;EAKlD,QAAQ,qBAAqB,QAAQ;EAgBrC,IAAI,YAAY,qBAAqB,QAAQ;EAgB7C,aAAa,aAAa,QAAQ;EASlC,WAAW,YAAY,qBAAqB,QAAQ;EAWpD,eAAe,YAAY,kBAAkB,QAAQ;EASrD,SAAS,YAAY,SAAS,qBAAqB,qBAAqB,QAAQ;EA0BhF,QAAQ,aAAa;EAerB,aAAa;EAQnB,UAAU;EAKV;UAKQ;UAIA;UAIA"}