@herdctl/core 0.0.1

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 (520) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test.log +219 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/coverage-final.json +51 -0
  7. package/coverage/favicon.png +0 -0
  8. package/coverage/index.html +251 -0
  9. package/coverage/prettify.css +1 -0
  10. package/coverage/prettify.js +2 -0
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +210 -0
  13. package/coverage/src/config/index.html +191 -0
  14. package/coverage/src/config/index.ts.html +442 -0
  15. package/coverage/src/config/interpolate.ts.html +652 -0
  16. package/coverage/src/config/loader.ts.html +1501 -0
  17. package/coverage/src/config/merge.ts.html +823 -0
  18. package/coverage/src/config/parser.ts.html +1213 -0
  19. package/coverage/src/config/schema.ts.html +1123 -0
  20. package/coverage/src/fleet-manager/errors.ts.html +2326 -0
  21. package/coverage/src/fleet-manager/event-types.ts.html +1219 -0
  22. package/coverage/src/fleet-manager/fleet-manager.ts.html +7030 -0
  23. package/coverage/src/fleet-manager/index.html +206 -0
  24. package/coverage/src/fleet-manager/index.ts.html +469 -0
  25. package/coverage/src/fleet-manager/job-manager.ts.html +2074 -0
  26. package/coverage/src/fleet-manager/job-queue.ts.html +2479 -0
  27. package/coverage/src/fleet-manager/types.ts.html +2602 -0
  28. package/coverage/src/index.html +116 -0
  29. package/coverage/src/index.ts.html +181 -0
  30. package/coverage/src/runner/errors.ts.html +1006 -0
  31. package/coverage/src/runner/index.html +191 -0
  32. package/coverage/src/runner/index.ts.html +256 -0
  33. package/coverage/src/runner/job-executor.ts.html +1429 -0
  34. package/coverage/src/runner/message-processor.ts.html +1150 -0
  35. package/coverage/src/runner/sdk-adapter.ts.html +658 -0
  36. package/coverage/src/runner/types.ts.html +559 -0
  37. package/coverage/src/scheduler/errors.ts.html +388 -0
  38. package/coverage/src/scheduler/index.html +206 -0
  39. package/coverage/src/scheduler/index.ts.html +244 -0
  40. package/coverage/src/scheduler/interval.ts.html +652 -0
  41. package/coverage/src/scheduler/schedule-runner.ts.html +1411 -0
  42. package/coverage/src/scheduler/schedule-state.ts.html +718 -0
  43. package/coverage/src/scheduler/scheduler.ts.html +1795 -0
  44. package/coverage/src/scheduler/types.ts.html +733 -0
  45. package/coverage/src/state/directory.ts.html +736 -0
  46. package/coverage/src/state/errors.ts.html +376 -0
  47. package/coverage/src/state/fleet-state.ts.html +937 -0
  48. package/coverage/src/state/index.html +221 -0
  49. package/coverage/src/state/index.ts.html +322 -0
  50. package/coverage/src/state/job-metadata.ts.html +1420 -0
  51. package/coverage/src/state/job-output.ts.html +1033 -0
  52. package/coverage/src/state/schemas/fleet-state.ts.html +445 -0
  53. package/coverage/src/state/schemas/index.html +176 -0
  54. package/coverage/src/state/schemas/index.ts.html +286 -0
  55. package/coverage/src/state/schemas/job-metadata.ts.html +628 -0
  56. package/coverage/src/state/schemas/job-output.ts.html +616 -0
  57. package/coverage/src/state/schemas/session-info.ts.html +361 -0
  58. package/coverage/src/state/session.ts.html +844 -0
  59. package/coverage/src/state/types.ts.html +262 -0
  60. package/coverage/src/state/utils/atomic.ts.html +748 -0
  61. package/coverage/src/state/utils/index.html +146 -0
  62. package/coverage/src/state/utils/index.ts.html +103 -0
  63. package/coverage/src/state/utils/reads.ts.html +1621 -0
  64. package/coverage/src/work-sources/adapters/github.ts.html +3583 -0
  65. package/coverage/src/work-sources/adapters/index.html +131 -0
  66. package/coverage/src/work-sources/adapters/index.ts.html +277 -0
  67. package/coverage/src/work-sources/errors.ts.html +298 -0
  68. package/coverage/src/work-sources/index.html +176 -0
  69. package/coverage/src/work-sources/index.ts.html +529 -0
  70. package/coverage/src/work-sources/manager.ts.html +1324 -0
  71. package/coverage/src/work-sources/registry.ts.html +619 -0
  72. package/coverage/src/work-sources/types.ts.html +568 -0
  73. package/dist/config/__tests__/agent.test.d.ts +2 -0
  74. package/dist/config/__tests__/agent.test.d.ts.map +1 -0
  75. package/dist/config/__tests__/agent.test.js +752 -0
  76. package/dist/config/__tests__/agent.test.js.map +1 -0
  77. package/dist/config/__tests__/interpolate.test.d.ts +2 -0
  78. package/dist/config/__tests__/interpolate.test.d.ts.map +1 -0
  79. package/dist/config/__tests__/interpolate.test.js +509 -0
  80. package/dist/config/__tests__/interpolate.test.js.map +1 -0
  81. package/dist/config/__tests__/loader.test.d.ts +2 -0
  82. package/dist/config/__tests__/loader.test.d.ts.map +1 -0
  83. package/dist/config/__tests__/loader.test.js +631 -0
  84. package/dist/config/__tests__/loader.test.js.map +1 -0
  85. package/dist/config/__tests__/merge.test.d.ts +2 -0
  86. package/dist/config/__tests__/merge.test.d.ts.map +1 -0
  87. package/dist/config/__tests__/merge.test.js +672 -0
  88. package/dist/config/__tests__/merge.test.js.map +1 -0
  89. package/dist/config/__tests__/parser.test.d.ts +2 -0
  90. package/dist/config/__tests__/parser.test.d.ts.map +1 -0
  91. package/dist/config/__tests__/parser.test.js +476 -0
  92. package/dist/config/__tests__/parser.test.js.map +1 -0
  93. package/dist/config/__tests__/schema.test.d.ts +2 -0
  94. package/dist/config/__tests__/schema.test.d.ts.map +1 -0
  95. package/dist/config/__tests__/schema.test.js +776 -0
  96. package/dist/config/__tests__/schema.test.js.map +1 -0
  97. package/dist/config/index.d.ts +11 -0
  98. package/dist/config/index.d.ts.map +1 -0
  99. package/dist/config/index.js +26 -0
  100. package/dist/config/index.js.map +1 -0
  101. package/dist/config/interpolate.d.ts +76 -0
  102. package/dist/config/interpolate.d.ts.map +1 -0
  103. package/dist/config/interpolate.js +143 -0
  104. package/dist/config/interpolate.js.map +1 -0
  105. package/dist/config/loader.d.ts +147 -0
  106. package/dist/config/loader.d.ts.map +1 -0
  107. package/dist/config/loader.js +336 -0
  108. package/dist/config/loader.js.map +1 -0
  109. package/dist/config/merge.d.ts +84 -0
  110. package/dist/config/merge.d.ts.map +1 -0
  111. package/dist/config/merge.js +138 -0
  112. package/dist/config/merge.js.map +1 -0
  113. package/dist/config/parser.d.ts +143 -0
  114. package/dist/config/parser.d.ts.map +1 -0
  115. package/dist/config/parser.js +316 -0
  116. package/dist/config/parser.js.map +1 -0
  117. package/dist/config/schema.d.ts +1906 -0
  118. package/dist/config/schema.d.ts.map +1 -0
  119. package/dist/config/schema.js +268 -0
  120. package/dist/config/schema.js.map +1 -0
  121. package/dist/fleet-manager/__tests__/coverage.test.d.ts +13 -0
  122. package/dist/fleet-manager/__tests__/coverage.test.d.ts.map +1 -0
  123. package/dist/fleet-manager/__tests__/coverage.test.js +2282 -0
  124. package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -0
  125. package/dist/fleet-manager/__tests__/errors.test.d.ts +7 -0
  126. package/dist/fleet-manager/__tests__/errors.test.d.ts.map +1 -0
  127. package/dist/fleet-manager/__tests__/errors.test.js +557 -0
  128. package/dist/fleet-manager/__tests__/errors.test.js.map +1 -0
  129. package/dist/fleet-manager/__tests__/event-helpers.test.d.ts +7 -0
  130. package/dist/fleet-manager/__tests__/event-helpers.test.d.ts.map +1 -0
  131. package/dist/fleet-manager/__tests__/event-helpers.test.js +368 -0
  132. package/dist/fleet-manager/__tests__/event-helpers.test.js.map +1 -0
  133. package/dist/fleet-manager/__tests__/integration.test.d.ts +11 -0
  134. package/dist/fleet-manager/__tests__/integration.test.d.ts.map +1 -0
  135. package/dist/fleet-manager/__tests__/integration.test.js +949 -0
  136. package/dist/fleet-manager/__tests__/integration.test.js.map +1 -0
  137. package/dist/fleet-manager/__tests__/job-control.test.d.ts +7 -0
  138. package/dist/fleet-manager/__tests__/job-control.test.d.ts.map +1 -0
  139. package/dist/fleet-manager/__tests__/job-control.test.js +215 -0
  140. package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -0
  141. package/dist/fleet-manager/__tests__/job-manager.test.d.ts +7 -0
  142. package/dist/fleet-manager/__tests__/job-manager.test.d.ts.map +1 -0
  143. package/dist/fleet-manager/__tests__/job-manager.test.js +659 -0
  144. package/dist/fleet-manager/__tests__/job-manager.test.js.map +1 -0
  145. package/dist/fleet-manager/__tests__/job-queue.test.d.ts +5 -0
  146. package/dist/fleet-manager/__tests__/job-queue.test.d.ts.map +1 -0
  147. package/dist/fleet-manager/__tests__/job-queue.test.js +315 -0
  148. package/dist/fleet-manager/__tests__/job-queue.test.js.map +1 -0
  149. package/dist/fleet-manager/__tests__/reload.test.d.ts +7 -0
  150. package/dist/fleet-manager/__tests__/reload.test.d.ts.map +1 -0
  151. package/dist/fleet-manager/__tests__/reload.test.js +609 -0
  152. package/dist/fleet-manager/__tests__/reload.test.js.map +1 -0
  153. package/dist/fleet-manager/__tests__/status-queries.test.d.ts +7 -0
  154. package/dist/fleet-manager/__tests__/status-queries.test.d.ts.map +1 -0
  155. package/dist/fleet-manager/__tests__/status-queries.test.js +488 -0
  156. package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -0
  157. package/dist/fleet-manager/__tests__/trigger.test.d.ts +7 -0
  158. package/dist/fleet-manager/__tests__/trigger.test.d.ts.map +1 -0
  159. package/dist/fleet-manager/__tests__/trigger.test.js +471 -0
  160. package/dist/fleet-manager/__tests__/trigger.test.js.map +1 -0
  161. package/dist/fleet-manager/errors.d.ts +407 -0
  162. package/dist/fleet-manager/errors.d.ts.map +1 -0
  163. package/dist/fleet-manager/errors.js +569 -0
  164. package/dist/fleet-manager/errors.js.map +1 -0
  165. package/dist/fleet-manager/event-types.d.ts +302 -0
  166. package/dist/fleet-manager/event-types.d.ts.map +1 -0
  167. package/dist/fleet-manager/event-types.js +9 -0
  168. package/dist/fleet-manager/event-types.js.map +1 -0
  169. package/dist/fleet-manager/fleet-manager.d.ts +699 -0
  170. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -0
  171. package/dist/fleet-manager/fleet-manager.js +1906 -0
  172. package/dist/fleet-manager/fleet-manager.js.map +1 -0
  173. package/dist/fleet-manager/index.d.ts +17 -0
  174. package/dist/fleet-manager/index.d.ts.map +1 -0
  175. package/dist/fleet-manager/index.js +29 -0
  176. package/dist/fleet-manager/index.js.map +1 -0
  177. package/dist/fleet-manager/job-manager.d.ts +271 -0
  178. package/dist/fleet-manager/job-manager.d.ts.map +1 -0
  179. package/dist/fleet-manager/job-manager.js +443 -0
  180. package/dist/fleet-manager/job-manager.js.map +1 -0
  181. package/dist/fleet-manager/job-queue.d.ts +422 -0
  182. package/dist/fleet-manager/job-queue.d.ts.map +1 -0
  183. package/dist/fleet-manager/job-queue.js +448 -0
  184. package/dist/fleet-manager/job-queue.js.map +1 -0
  185. package/dist/fleet-manager/types.d.ts +680 -0
  186. package/dist/fleet-manager/types.d.ts.map +1 -0
  187. package/dist/fleet-manager/types.js +8 -0
  188. package/dist/fleet-manager/types.js.map +1 -0
  189. package/dist/index.d.ts +20 -0
  190. package/dist/index.d.ts.map +1 -0
  191. package/dist/index.js +26 -0
  192. package/dist/index.js.map +1 -0
  193. package/dist/runner/__tests__/errors.test.d.ts +2 -0
  194. package/dist/runner/__tests__/errors.test.d.ts.map +1 -0
  195. package/dist/runner/__tests__/errors.test.js +264 -0
  196. package/dist/runner/__tests__/errors.test.js.map +1 -0
  197. package/dist/runner/__tests__/job-executor.test.d.ts +2 -0
  198. package/dist/runner/__tests__/job-executor.test.d.ts.map +1 -0
  199. package/dist/runner/__tests__/job-executor.test.js +1345 -0
  200. package/dist/runner/__tests__/job-executor.test.js.map +1 -0
  201. package/dist/runner/__tests__/message-processor.test.d.ts +2 -0
  202. package/dist/runner/__tests__/message-processor.test.d.ts.map +1 -0
  203. package/dist/runner/__tests__/message-processor.test.js +768 -0
  204. package/dist/runner/__tests__/message-processor.test.js.map +1 -0
  205. package/dist/runner/__tests__/sdk-adapter.test.d.ts +2 -0
  206. package/dist/runner/__tests__/sdk-adapter.test.d.ts.map +1 -0
  207. package/dist/runner/__tests__/sdk-adapter.test.js +554 -0
  208. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -0
  209. package/dist/runner/errors.d.ts +121 -0
  210. package/dist/runner/errors.d.ts.map +1 -0
  211. package/dist/runner/errors.js +212 -0
  212. package/dist/runner/errors.js.map +1 -0
  213. package/dist/runner/index.d.ts +12 -0
  214. package/dist/runner/index.d.ts.map +1 -0
  215. package/dist/runner/index.js +15 -0
  216. package/dist/runner/index.js.map +1 -0
  217. package/dist/runner/job-executor.d.ts +98 -0
  218. package/dist/runner/job-executor.d.ts.map +1 -0
  219. package/dist/runner/job-executor.js +333 -0
  220. package/dist/runner/job-executor.js.map +1 -0
  221. package/dist/runner/message-processor.d.ts +45 -0
  222. package/dist/runner/message-processor.d.ts.map +1 -0
  223. package/dist/runner/message-processor.js +294 -0
  224. package/dist/runner/message-processor.js.map +1 -0
  225. package/dist/runner/sdk-adapter.d.ts +60 -0
  226. package/dist/runner/sdk-adapter.d.ts.map +1 -0
  227. package/dist/runner/sdk-adapter.js +138 -0
  228. package/dist/runner/sdk-adapter.js.map +1 -0
  229. package/dist/runner/types.d.ts +135 -0
  230. package/dist/runner/types.d.ts.map +1 -0
  231. package/dist/runner/types.js +7 -0
  232. package/dist/runner/types.js.map +1 -0
  233. package/dist/scheduler/__tests__/errors.test.d.ts +2 -0
  234. package/dist/scheduler/__tests__/errors.test.d.ts.map +1 -0
  235. package/dist/scheduler/__tests__/errors.test.js +101 -0
  236. package/dist/scheduler/__tests__/errors.test.js.map +1 -0
  237. package/dist/scheduler/__tests__/interval.test.d.ts +2 -0
  238. package/dist/scheduler/__tests__/interval.test.d.ts.map +1 -0
  239. package/dist/scheduler/__tests__/interval.test.js +419 -0
  240. package/dist/scheduler/__tests__/interval.test.js.map +1 -0
  241. package/dist/scheduler/__tests__/schedule-runner.test.d.ts +2 -0
  242. package/dist/scheduler/__tests__/schedule-runner.test.d.ts.map +1 -0
  243. package/dist/scheduler/__tests__/schedule-runner.test.js +634 -0
  244. package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -0
  245. package/dist/scheduler/__tests__/schedule-state.test.d.ts +2 -0
  246. package/dist/scheduler/__tests__/schedule-state.test.d.ts.map +1 -0
  247. package/dist/scheduler/__tests__/schedule-state.test.js +572 -0
  248. package/dist/scheduler/__tests__/schedule-state.test.js.map +1 -0
  249. package/dist/scheduler/__tests__/scheduler.test.d.ts +2 -0
  250. package/dist/scheduler/__tests__/scheduler.test.d.ts.map +1 -0
  251. package/dist/scheduler/__tests__/scheduler.test.js +987 -0
  252. package/dist/scheduler/__tests__/scheduler.test.js.map +1 -0
  253. package/dist/scheduler/errors.d.ts +61 -0
  254. package/dist/scheduler/errors.d.ts.map +1 -0
  255. package/dist/scheduler/errors.js +81 -0
  256. package/dist/scheduler/errors.js.map +1 -0
  257. package/dist/scheduler/index.d.ts +13 -0
  258. package/dist/scheduler/index.d.ts.map +1 -0
  259. package/dist/scheduler/index.js +17 -0
  260. package/dist/scheduler/index.js.map +1 -0
  261. package/dist/scheduler/interval.d.ts +64 -0
  262. package/dist/scheduler/interval.d.ts.map +1 -0
  263. package/dist/scheduler/interval.js +139 -0
  264. package/dist/scheduler/interval.js.map +1 -0
  265. package/dist/scheduler/schedule-runner.d.ts +149 -0
  266. package/dist/scheduler/schedule-runner.d.ts.map +1 -0
  267. package/dist/scheduler/schedule-runner.js +277 -0
  268. package/dist/scheduler/schedule-runner.js.map +1 -0
  269. package/dist/scheduler/schedule-state.d.ts +105 -0
  270. package/dist/scheduler/schedule-state.d.ts.map +1 -0
  271. package/dist/scheduler/schedule-state.js +151 -0
  272. package/dist/scheduler/schedule-state.js.map +1 -0
  273. package/dist/scheduler/scheduler.d.ts +138 -0
  274. package/dist/scheduler/scheduler.d.ts.map +1 -0
  275. package/dist/scheduler/scheduler.js +423 -0
  276. package/dist/scheduler/scheduler.js.map +1 -0
  277. package/dist/scheduler/types.d.ts +160 -0
  278. package/dist/scheduler/types.d.ts.map +1 -0
  279. package/dist/scheduler/types.js +8 -0
  280. package/dist/scheduler/types.js.map +1 -0
  281. package/dist/state/__tests__/directory.test.d.ts +2 -0
  282. package/dist/state/__tests__/directory.test.d.ts.map +1 -0
  283. package/dist/state/__tests__/directory.test.js +414 -0
  284. package/dist/state/__tests__/directory.test.js.map +1 -0
  285. package/dist/state/__tests__/fleet-state.test.d.ts +2 -0
  286. package/dist/state/__tests__/fleet-state.test.d.ts.map +1 -0
  287. package/dist/state/__tests__/fleet-state.test.js +696 -0
  288. package/dist/state/__tests__/fleet-state.test.js.map +1 -0
  289. package/dist/state/__tests__/job-metadata-schema.test.d.ts +2 -0
  290. package/dist/state/__tests__/job-metadata-schema.test.d.ts.map +1 -0
  291. package/dist/state/__tests__/job-metadata-schema.test.js +329 -0
  292. package/dist/state/__tests__/job-metadata-schema.test.js.map +1 -0
  293. package/dist/state/__tests__/job-metadata.test.d.ts +2 -0
  294. package/dist/state/__tests__/job-metadata.test.d.ts.map +1 -0
  295. package/dist/state/__tests__/job-metadata.test.js +667 -0
  296. package/dist/state/__tests__/job-metadata.test.js.map +1 -0
  297. package/dist/state/__tests__/job-output.test.d.ts +2 -0
  298. package/dist/state/__tests__/job-output.test.d.ts.map +1 -0
  299. package/dist/state/__tests__/job-output.test.js +672 -0
  300. package/dist/state/__tests__/job-output.test.js.map +1 -0
  301. package/dist/state/__tests__/session-schema.test.d.ts +2 -0
  302. package/dist/state/__tests__/session-schema.test.d.ts.map +1 -0
  303. package/dist/state/__tests__/session-schema.test.js +323 -0
  304. package/dist/state/__tests__/session-schema.test.js.map +1 -0
  305. package/dist/state/__tests__/session.test.d.ts +2 -0
  306. package/dist/state/__tests__/session.test.d.ts.map +1 -0
  307. package/dist/state/__tests__/session.test.js +468 -0
  308. package/dist/state/__tests__/session.test.js.map +1 -0
  309. package/dist/state/directory.d.ts +42 -0
  310. package/dist/state/directory.d.ts.map +1 -0
  311. package/dist/state/directory.js +170 -0
  312. package/dist/state/directory.js.map +1 -0
  313. package/dist/state/errors.d.ts +44 -0
  314. package/dist/state/errors.d.ts.map +1 -0
  315. package/dist/state/errors.js +82 -0
  316. package/dist/state/errors.js.map +1 -0
  317. package/dist/state/fleet-state.d.ts +126 -0
  318. package/dist/state/fleet-state.d.ts.map +1 -0
  319. package/dist/state/fleet-state.js +196 -0
  320. package/dist/state/fleet-state.js.map +1 -0
  321. package/dist/state/index.d.ts +21 -0
  322. package/dist/state/index.d.ts.map +1 -0
  323. package/dist/state/index.js +30 -0
  324. package/dist/state/index.js.map +1 -0
  325. package/dist/state/job-metadata.d.ts +151 -0
  326. package/dist/state/job-metadata.d.ts.map +1 -0
  327. package/dist/state/job-metadata.js +287 -0
  328. package/dist/state/job-metadata.js.map +1 -0
  329. package/dist/state/job-output.d.ts +116 -0
  330. package/dist/state/job-output.d.ts.map +1 -0
  331. package/dist/state/job-output.js +218 -0
  332. package/dist/state/job-output.js.map +1 -0
  333. package/dist/state/schemas/__tests__/job-output.test.d.ts +2 -0
  334. package/dist/state/schemas/__tests__/job-output.test.d.ts.map +1 -0
  335. package/dist/state/schemas/__tests__/job-output.test.js +279 -0
  336. package/dist/state/schemas/__tests__/job-output.test.js.map +1 -0
  337. package/dist/state/schemas/fleet-state.d.ts +249 -0
  338. package/dist/state/schemas/fleet-state.d.ts.map +1 -0
  339. package/dist/state/schemas/fleet-state.js +97 -0
  340. package/dist/state/schemas/fleet-state.js.map +1 -0
  341. package/dist/state/schemas/index.d.ts +10 -0
  342. package/dist/state/schemas/index.d.ts.map +1 -0
  343. package/dist/state/schemas/index.js +10 -0
  344. package/dist/state/schemas/index.js.map +1 -0
  345. package/dist/state/schemas/job-metadata.d.ts +118 -0
  346. package/dist/state/schemas/job-metadata.d.ts.map +1 -0
  347. package/dist/state/schemas/job-metadata.js +123 -0
  348. package/dist/state/schemas/job-metadata.js.map +1 -0
  349. package/dist/state/schemas/job-output.d.ts +291 -0
  350. package/dist/state/schemas/job-output.d.ts.map +1 -0
  351. package/dist/state/schemas/job-output.js +132 -0
  352. package/dist/state/schemas/job-output.js.map +1 -0
  353. package/dist/state/schemas/session-info.d.ts +65 -0
  354. package/dist/state/schemas/session-info.d.ts.map +1 -0
  355. package/dist/state/schemas/session-info.js +58 -0
  356. package/dist/state/schemas/session-info.js.map +1 -0
  357. package/dist/state/session.d.ts +92 -0
  358. package/dist/state/session.d.ts.map +1 -0
  359. package/dist/state/session.js +173 -0
  360. package/dist/state/session.js.map +1 -0
  361. package/dist/state/types.d.ts +54 -0
  362. package/dist/state/types.d.ts.map +1 -0
  363. package/dist/state/types.js +18 -0
  364. package/dist/state/types.js.map +1 -0
  365. package/dist/state/utils/__tests__/atomic.test.d.ts +2 -0
  366. package/dist/state/utils/__tests__/atomic.test.d.ts.map +1 -0
  367. package/dist/state/utils/__tests__/atomic.test.js +537 -0
  368. package/dist/state/utils/__tests__/atomic.test.js.map +1 -0
  369. package/dist/state/utils/__tests__/reads.test.d.ts +2 -0
  370. package/dist/state/utils/__tests__/reads.test.d.ts.map +1 -0
  371. package/dist/state/utils/__tests__/reads.test.js +792 -0
  372. package/dist/state/utils/__tests__/reads.test.js.map +1 -0
  373. package/dist/state/utils/atomic.d.ts +89 -0
  374. package/dist/state/utils/atomic.d.ts.map +1 -0
  375. package/dist/state/utils/atomic.js +157 -0
  376. package/dist/state/utils/atomic.js.map +1 -0
  377. package/dist/state/utils/index.d.ts +6 -0
  378. package/dist/state/utils/index.d.ts.map +1 -0
  379. package/dist/state/utils/index.js +6 -0
  380. package/dist/state/utils/index.js.map +1 -0
  381. package/dist/state/utils/reads.d.ts +196 -0
  382. package/dist/state/utils/reads.d.ts.map +1 -0
  383. package/dist/state/utils/reads.js +346 -0
  384. package/dist/state/utils/reads.js.map +1 -0
  385. package/dist/work-sources/__tests__/github.test.d.ts +2 -0
  386. package/dist/work-sources/__tests__/github.test.d.ts.map +1 -0
  387. package/dist/work-sources/__tests__/github.test.js +1334 -0
  388. package/dist/work-sources/__tests__/github.test.js.map +1 -0
  389. package/dist/work-sources/__tests__/manager.test.d.ts +2 -0
  390. package/dist/work-sources/__tests__/manager.test.d.ts.map +1 -0
  391. package/dist/work-sources/__tests__/manager.test.js +424 -0
  392. package/dist/work-sources/__tests__/manager.test.js.map +1 -0
  393. package/dist/work-sources/__tests__/registry.test.d.ts +2 -0
  394. package/dist/work-sources/__tests__/registry.test.d.ts.map +1 -0
  395. package/dist/work-sources/__tests__/registry.test.js +381 -0
  396. package/dist/work-sources/__tests__/registry.test.js.map +1 -0
  397. package/dist/work-sources/__tests__/types.test.d.ts +2 -0
  398. package/dist/work-sources/__tests__/types.test.d.ts.map +1 -0
  399. package/dist/work-sources/__tests__/types.test.js +406 -0
  400. package/dist/work-sources/__tests__/types.test.js.map +1 -0
  401. package/dist/work-sources/adapters/github.d.ts +290 -0
  402. package/dist/work-sources/adapters/github.d.ts.map +1 -0
  403. package/dist/work-sources/adapters/github.js +803 -0
  404. package/dist/work-sources/adapters/github.js.map +1 -0
  405. package/dist/work-sources/adapters/index.d.ts +10 -0
  406. package/dist/work-sources/adapters/index.d.ts.map +1 -0
  407. package/dist/work-sources/adapters/index.js +31 -0
  408. package/dist/work-sources/adapters/index.js.map +1 -0
  409. package/dist/work-sources/errors.d.ts +40 -0
  410. package/dist/work-sources/errors.d.ts.map +1 -0
  411. package/dist/work-sources/errors.js +54 -0
  412. package/dist/work-sources/errors.js.map +1 -0
  413. package/dist/work-sources/index.d.ts +105 -0
  414. package/dist/work-sources/index.d.ts.map +1 -0
  415. package/dist/work-sources/index.js +24 -0
  416. package/dist/work-sources/index.js.map +1 -0
  417. package/dist/work-sources/manager.d.ts +370 -0
  418. package/dist/work-sources/manager.d.ts.map +1 -0
  419. package/dist/work-sources/manager.js +61 -0
  420. package/dist/work-sources/manager.js.map +1 -0
  421. package/dist/work-sources/registry.d.ts +128 -0
  422. package/dist/work-sources/registry.d.ts.map +1 -0
  423. package/dist/work-sources/registry.js +132 -0
  424. package/dist/work-sources/registry.js.map +1 -0
  425. package/dist/work-sources/types.d.ts +127 -0
  426. package/dist/work-sources/types.d.ts.map +1 -0
  427. package/dist/work-sources/types.js +8 -0
  428. package/dist/work-sources/types.js.map +1 -0
  429. package/package.json +23 -0
  430. package/src/config/__tests__/agent.test.ts +864 -0
  431. package/src/config/__tests__/interpolate.test.ts +644 -0
  432. package/src/config/__tests__/loader.test.ts +784 -0
  433. package/src/config/__tests__/merge.test.ts +751 -0
  434. package/src/config/__tests__/parser.test.ts +533 -0
  435. package/src/config/__tests__/schema.test.ts +873 -0
  436. package/src/config/index.ts +119 -0
  437. package/src/config/interpolate.ts +189 -0
  438. package/src/config/loader.ts +472 -0
  439. package/src/config/merge.ts +246 -0
  440. package/src/config/parser.ts +376 -0
  441. package/src/config/schema.ts +346 -0
  442. package/src/fleet-manager/__tests__/coverage.test.ts +2869 -0
  443. package/src/fleet-manager/__tests__/errors.test.ts +660 -0
  444. package/src/fleet-manager/__tests__/event-helpers.test.ts +448 -0
  445. package/src/fleet-manager/__tests__/integration.test.ts +1209 -0
  446. package/src/fleet-manager/__tests__/job-control.test.ts +283 -0
  447. package/src/fleet-manager/__tests__/job-manager.test.ts +869 -0
  448. package/src/fleet-manager/__tests__/job-queue.test.ts +401 -0
  449. package/src/fleet-manager/__tests__/reload.test.ts +751 -0
  450. package/src/fleet-manager/__tests__/status-queries.test.ts +595 -0
  451. package/src/fleet-manager/__tests__/trigger.test.ts +601 -0
  452. package/src/fleet-manager/errors.ts +747 -0
  453. package/src/fleet-manager/event-types.ts +378 -0
  454. package/src/fleet-manager/fleet-manager.ts +2315 -0
  455. package/src/fleet-manager/index.ts +128 -0
  456. package/src/fleet-manager/job-manager.ts +663 -0
  457. package/src/fleet-manager/job-queue.ts +798 -0
  458. package/src/fleet-manager/types.ts +839 -0
  459. package/src/index.ts +32 -0
  460. package/src/runner/__tests__/errors.test.ts +382 -0
  461. package/src/runner/__tests__/job-executor.test.ts +1708 -0
  462. package/src/runner/__tests__/message-processor.test.ts +960 -0
  463. package/src/runner/__tests__/sdk-adapter.test.ts +626 -0
  464. package/src/runner/errors.ts +307 -0
  465. package/src/runner/index.ts +57 -0
  466. package/src/runner/job-executor.ts +448 -0
  467. package/src/runner/message-processor.ts +355 -0
  468. package/src/runner/sdk-adapter.ts +191 -0
  469. package/src/runner/types.ts +158 -0
  470. package/src/scheduler/__tests__/errors.test.ts +159 -0
  471. package/src/scheduler/__tests__/interval.test.ts +515 -0
  472. package/src/scheduler/__tests__/schedule-runner.test.ts +798 -0
  473. package/src/scheduler/__tests__/schedule-state.test.ts +671 -0
  474. package/src/scheduler/__tests__/scheduler.test.ts +1280 -0
  475. package/src/scheduler/errors.ts +101 -0
  476. package/src/scheduler/index.ts +53 -0
  477. package/src/scheduler/interval.ts +189 -0
  478. package/src/scheduler/schedule-runner.ts +442 -0
  479. package/src/scheduler/schedule-state.ts +211 -0
  480. package/src/scheduler/scheduler.ts +570 -0
  481. package/src/scheduler/types.ts +216 -0
  482. package/src/state/__tests__/directory.test.ts +595 -0
  483. package/src/state/__tests__/fleet-state.test.ts +868 -0
  484. package/src/state/__tests__/job-metadata-schema.test.ts +414 -0
  485. package/src/state/__tests__/job-metadata.test.ts +831 -0
  486. package/src/state/__tests__/job-output.test.ts +856 -0
  487. package/src/state/__tests__/session-schema.test.ts +378 -0
  488. package/src/state/__tests__/session.test.ts +604 -0
  489. package/src/state/directory.ts +217 -0
  490. package/src/state/errors.ts +97 -0
  491. package/src/state/fleet-state.ts +284 -0
  492. package/src/state/index.ts +79 -0
  493. package/src/state/job-metadata.ts +445 -0
  494. package/src/state/job-output.ts +316 -0
  495. package/src/state/schemas/__tests__/job-output.test.ts +338 -0
  496. package/src/state/schemas/fleet-state.ts +120 -0
  497. package/src/state/schemas/index.ts +67 -0
  498. package/src/state/schemas/job-metadata.ts +181 -0
  499. package/src/state/schemas/job-output.ts +177 -0
  500. package/src/state/schemas/session-info.ts +92 -0
  501. package/src/state/session.ts +253 -0
  502. package/src/state/types.ts +59 -0
  503. package/src/state/utils/__tests__/atomic.test.ts +723 -0
  504. package/src/state/utils/__tests__/reads.test.ts +1071 -0
  505. package/src/state/utils/atomic.ts +221 -0
  506. package/src/state/utils/index.ts +6 -0
  507. package/src/state/utils/reads.ts +512 -0
  508. package/src/work-sources/__tests__/github.test.ts +1800 -0
  509. package/src/work-sources/__tests__/manager.test.ts +529 -0
  510. package/src/work-sources/__tests__/registry.test.ts +477 -0
  511. package/src/work-sources/__tests__/types.test.ts +479 -0
  512. package/src/work-sources/adapters/github.ts +1166 -0
  513. package/src/work-sources/adapters/index.ts +64 -0
  514. package/src/work-sources/errors.ts +71 -0
  515. package/src/work-sources/index.ts +148 -0
  516. package/src/work-sources/manager.ts +413 -0
  517. package/src/work-sources/registry.ts +178 -0
  518. package/src/work-sources/types.ts +161 -0
  519. package/tsconfig.json +9 -0
  520. package/vitest.config.ts +19 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * State directory management
3
+ *
4
+ * Provides functions to initialize and access the .herdctl/ state directory
5
+ */
6
+ import { mkdir, stat, access, constants } from "node:fs/promises";
7
+ import { join, resolve } from "node:path";
8
+ import { STATE_SUBDIRECTORIES, DEFAULT_STATE_DIR_NAME, STATE_FILE_NAME, } from "./types.js";
9
+ import { StateDirectoryCreateError, StateDirectoryValidationError, StateFileError, getPermissionErrorMessage, } from "./errors.js";
10
+ import { createInitialFleetState, FleetStateSchema } from "./schemas/index.js";
11
+ import { atomicWriteYaml } from "./utils/index.js";
12
+ import { safeReadYaml } from "./utils/reads.js";
13
+ /**
14
+ * Get the paths for all state directory components
15
+ *
16
+ * @param rootPath - Root path to the state directory (e.g., /path/to/.herdctl)
17
+ * @returns StateDirectory object with paths to all subdirectories and files
18
+ */
19
+ export function getStateDirectory(rootPath) {
20
+ const root = rootPath
21
+ ? resolve(rootPath)
22
+ : resolve(process.cwd(), DEFAULT_STATE_DIR_NAME);
23
+ return {
24
+ root,
25
+ jobs: join(root, "jobs"),
26
+ sessions: join(root, "sessions"),
27
+ logs: join(root, "logs"),
28
+ stateFile: join(root, STATE_FILE_NAME),
29
+ };
30
+ }
31
+ /**
32
+ * Check if a path exists and is a directory
33
+ */
34
+ async function isDirectory(path) {
35
+ try {
36
+ const stats = await stat(path);
37
+ return stats.isDirectory();
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Check if a path exists (file or directory)
45
+ */
46
+ async function pathExists(path) {
47
+ try {
48
+ await access(path, constants.F_OK);
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ /**
56
+ * Validate that the state directory structure exists and is accessible
57
+ *
58
+ * @param stateDir - StateDirectory object to validate
59
+ * @returns Validation result with any missing paths or errors
60
+ */
61
+ export async function validateStateDirectory(stateDir) {
62
+ const missing = [];
63
+ const errors = [];
64
+ // Check root directory
65
+ if (!(await isDirectory(stateDir.root))) {
66
+ const exists = await pathExists(stateDir.root);
67
+ if (exists) {
68
+ errors.push(`'${stateDir.root}' exists but is not a directory`);
69
+ }
70
+ else {
71
+ missing.push(stateDir.root);
72
+ }
73
+ }
74
+ // Check subdirectories
75
+ for (const subdir of STATE_SUBDIRECTORIES) {
76
+ const subdirPath = stateDir[subdir];
77
+ if (!(await isDirectory(subdirPath))) {
78
+ const exists = await pathExists(subdirPath);
79
+ if (exists) {
80
+ errors.push(`'${subdirPath}' exists but is not a directory`);
81
+ }
82
+ else {
83
+ missing.push(subdirPath);
84
+ }
85
+ }
86
+ }
87
+ // Check state file (should exist, can be file)
88
+ if (!(await pathExists(stateDir.stateFile))) {
89
+ missing.push(stateDir.stateFile);
90
+ }
91
+ return {
92
+ valid: missing.length === 0 && errors.length === 0,
93
+ missing,
94
+ errors,
95
+ };
96
+ }
97
+ /**
98
+ * Create a single directory with descriptive error handling
99
+ */
100
+ async function createDirectory(path) {
101
+ try {
102
+ await mkdir(path, { recursive: true });
103
+ }
104
+ catch (error) {
105
+ const code = error.code;
106
+ throw new StateDirectoryCreateError(getPermissionErrorMessage(code, path), path, error);
107
+ }
108
+ }
109
+ /**
110
+ * Initialize the state directory structure
111
+ *
112
+ * Creates the .herdctl/ directory and its subdirectories (jobs/, sessions/, logs/)
113
+ * if they don't exist. Also creates an initial state.yaml file with empty fleet state.
114
+ *
115
+ * @param options - Options for initialization
116
+ * @returns StateDirectory object with paths to all subdirectories
117
+ * @throws {StateDirectoryCreateError} If directories cannot be created
118
+ * @throws {StateFileError} If state.yaml cannot be created
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * // Initialize in current directory
123
+ * const stateDir = await initStateDirectory();
124
+ *
125
+ * // Initialize in custom location
126
+ * const stateDir = await initStateDirectory({ path: '/custom/path/.herdctl' });
127
+ * ```
128
+ */
129
+ export async function initStateDirectory(options = {}) {
130
+ const stateDir = getStateDirectory(options.path);
131
+ // Create root directory
132
+ await createDirectory(stateDir.root);
133
+ // Create subdirectories
134
+ for (const subdir of STATE_SUBDIRECTORIES) {
135
+ await createDirectory(stateDir[subdir]);
136
+ }
137
+ // Create state.yaml if it doesn't exist
138
+ if (!(await pathExists(stateDir.stateFile))) {
139
+ try {
140
+ const initialState = createInitialFleetState();
141
+ await atomicWriteYaml(stateDir.stateFile, initialState);
142
+ }
143
+ catch (error) {
144
+ throw new StateFileError(`Failed to create initial state file: ${error.message}`, stateDir.stateFile, "write", error);
145
+ }
146
+ }
147
+ else {
148
+ // Validate existing state.yaml is readable and valid
149
+ const result = await safeReadYaml(stateDir.stateFile);
150
+ if (!result.success) {
151
+ throw new StateFileError(`Existing state file is corrupted or unreadable: ${result.error.message}`, stateDir.stateFile, "read", result.error);
152
+ }
153
+ // Validate against schema
154
+ const parseResult = FleetStateSchema.safeParse(result.data);
155
+ if (!parseResult.success) {
156
+ const issues = parseResult.error.issues
157
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
158
+ .join("; ");
159
+ throw new StateFileError(`Existing state file has invalid schema: ${issues}`, stateDir.stateFile, "read");
160
+ }
161
+ }
162
+ // Final validation
163
+ const validation = await validateStateDirectory(stateDir);
164
+ if (!validation.valid) {
165
+ const allIssues = [...validation.missing, ...validation.errors];
166
+ throw new StateDirectoryValidationError(`State directory validation failed: ${allIssues.join(", ")}`, validation.missing);
167
+ }
168
+ return stateDir;
169
+ }
170
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/state/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Error classes for state management operations
3
+ *
4
+ * Provides typed errors with descriptive messages for state-related failures
5
+ */
6
+ /**
7
+ * Base error class for state management errors
8
+ */
9
+ export declare class StateError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ /**
13
+ * Error thrown when the state directory cannot be created
14
+ */
15
+ export declare class StateDirectoryCreateError extends StateError {
16
+ /** Path that could not be created */
17
+ readonly path: string;
18
+ /** System error code if available (e.g., EACCES, ENOENT) */
19
+ readonly code?: string;
20
+ constructor(message: string, path: string, cause?: Error);
21
+ }
22
+ /**
23
+ * Error thrown when the state directory validation fails
24
+ */
25
+ export declare class StateDirectoryValidationError extends StateError {
26
+ /** Paths that failed validation */
27
+ readonly missingPaths: string[];
28
+ constructor(message: string, missingPaths: string[]);
29
+ }
30
+ /**
31
+ * Error thrown when the state file cannot be read or written
32
+ */
33
+ export declare class StateFileError extends StateError {
34
+ /** Path to the state file */
35
+ readonly path: string;
36
+ /** The operation that failed */
37
+ readonly operation: "read" | "write";
38
+ constructor(message: string, path: string, operation: "read" | "write", cause?: Error);
39
+ }
40
+ /**
41
+ * Get a descriptive error message for common permission errors
42
+ */
43
+ export declare function getPermissionErrorMessage(code: string | undefined, path: string): string;
44
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,UAAU;IACvD,qCAAqC;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAOzD;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,UAAU;IAC3D,mCAAmC;IACnC,SAAgB,YAAY,EAAE,MAAM,EAAE,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE;CAKpD;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,6BAA6B;IAC7B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,SAAgB,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;gBAG1C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,KAAK,CAAC,EAAE,KAAK;CAQhB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Error classes for state management operations
3
+ *
4
+ * Provides typed errors with descriptive messages for state-related failures
5
+ */
6
+ /**
7
+ * Base error class for state management errors
8
+ */
9
+ export class StateError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = "StateError";
13
+ }
14
+ }
15
+ /**
16
+ * Error thrown when the state directory cannot be created
17
+ */
18
+ export class StateDirectoryCreateError extends StateError {
19
+ /** Path that could not be created */
20
+ path;
21
+ /** System error code if available (e.g., EACCES, ENOENT) */
22
+ code;
23
+ constructor(message, path, cause) {
24
+ super(message);
25
+ this.name = "StateDirectoryCreateError";
26
+ this.path = path;
27
+ this.cause = cause;
28
+ this.code = cause?.code;
29
+ }
30
+ }
31
+ /**
32
+ * Error thrown when the state directory validation fails
33
+ */
34
+ export class StateDirectoryValidationError extends StateError {
35
+ /** Paths that failed validation */
36
+ missingPaths;
37
+ constructor(message, missingPaths) {
38
+ super(message);
39
+ this.name = "StateDirectoryValidationError";
40
+ this.missingPaths = missingPaths;
41
+ }
42
+ }
43
+ /**
44
+ * Error thrown when the state file cannot be read or written
45
+ */
46
+ export class StateFileError extends StateError {
47
+ /** Path to the state file */
48
+ path;
49
+ /** The operation that failed */
50
+ operation;
51
+ constructor(message, path, operation, cause) {
52
+ super(message);
53
+ this.name = "StateFileError";
54
+ this.path = path;
55
+ this.operation = operation;
56
+ this.cause = cause;
57
+ }
58
+ }
59
+ /**
60
+ * Get a descriptive error message for common permission errors
61
+ */
62
+ export function getPermissionErrorMessage(code, path) {
63
+ switch (code) {
64
+ case "EACCES":
65
+ return `Permission denied: Cannot access '${path}'. Check file permissions.`;
66
+ case "EPERM":
67
+ return `Operation not permitted: Cannot modify '${path}'. This may require elevated privileges.`;
68
+ case "EROFS":
69
+ return `Read-only filesystem: Cannot write to '${path}'.`;
70
+ case "ENOSPC":
71
+ return `No space left on device: Cannot create '${path}'.`;
72
+ case "ENOENT":
73
+ return `Path does not exist: '${path}' or one of its parent directories is missing.`;
74
+ case "ENOTDIR":
75
+ return `Not a directory: A component of '${path}' is not a directory.`;
76
+ case "EEXIST":
77
+ return `Path already exists: '${path}' already exists as a file but should be a directory.`;
78
+ default:
79
+ return `Failed to access '${path}'${code ? ` (${code})` : ""}.`;
80
+ }
81
+ }
82
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,UAAU;IACvD,qCAAqC;IACrB,IAAI,CAAS;IAC7B,4DAA4D;IAC5C,IAAI,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAY,EAAE,KAAa;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAI,KAA2C,EAAE,IAAI,CAAC;IACjE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,6BAA8B,SAAQ,UAAU;IAC3D,mCAAmC;IACnB,YAAY,CAAW;IAEvC,YAAY,OAAe,EAAE,YAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,6BAA6B;IACb,IAAI,CAAS;IAC7B,gCAAgC;IAChB,SAAS,CAAmB;IAE5C,YACE,OAAe,EACf,IAAY,EACZ,SAA2B,EAC3B,KAAa;QAEb,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAwB,EACxB,IAAY;IAEZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,qCAAqC,IAAI,4BAA4B,CAAC;QAC/E,KAAK,OAAO;YACV,OAAO,2CAA2C,IAAI,0CAA0C,CAAC;QACnG,KAAK,OAAO;YACV,OAAO,0CAA0C,IAAI,IAAI,CAAC;QAC5D,KAAK,QAAQ;YACX,OAAO,2CAA2C,IAAI,IAAI,CAAC;QAC7D,KAAK,QAAQ;YACX,OAAO,yBAAyB,IAAI,gDAAgD,CAAC;QACvF,KAAK,SAAS;YACZ,OAAO,oCAAoC,IAAI,uBAAuB,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,yBAAyB,IAAI,uDAAuD,CAAC;QAC9F;YACE,OAAO,qBAAqB,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Fleet state management (state.yaml)
3
+ *
4
+ * Provides functions for reading, writing, and updating fleet state.
5
+ * Handles missing files gracefully and corrupted files with warnings.
6
+ */
7
+ import { type FleetState, type AgentState } from "./schemas/fleet-state.js";
8
+ /**
9
+ * Logger interface for warning messages
10
+ */
11
+ export interface StateLogger {
12
+ warn: (message: string) => void;
13
+ }
14
+ /**
15
+ * Options for reading fleet state
16
+ */
17
+ export interface ReadFleetStateOptions {
18
+ /**
19
+ * Logger for warning messages (e.g., corrupted file warnings)
20
+ * Default: console.warn
21
+ */
22
+ logger?: StateLogger;
23
+ }
24
+ /**
25
+ * Options for writing fleet state
26
+ */
27
+ export interface WriteFleetStateOptions {
28
+ /**
29
+ * YAML indent level
30
+ * Default: 2
31
+ */
32
+ indent?: number;
33
+ }
34
+ /**
35
+ * Read and validate fleet state from state.yaml
36
+ *
37
+ * Handles:
38
+ * - Missing file: Returns default empty state
39
+ * - Corrupted file: Logs warning, returns default empty state
40
+ * - Valid file: Returns validated FleetState
41
+ *
42
+ * @param stateFilePath - Path to state.yaml file
43
+ * @param options - Read options including logger
44
+ * @returns Validated FleetState object
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const state = await readFleetState('.herdctl/state.yaml');
49
+ * console.log(state.fleet.started_at);
50
+ * console.log(state.agents);
51
+ * ```
52
+ */
53
+ export declare function readFleetState(stateFilePath: string, options?: ReadFleetStateOptions): Promise<FleetState>;
54
+ /**
55
+ * Write fleet state to state.yaml atomically
56
+ *
57
+ * Uses atomic write (write to temp file, then rename) to prevent corruption.
58
+ *
59
+ * @param stateFilePath - Path to state.yaml file
60
+ * @param state - FleetState object to write
61
+ * @param options - Write options
62
+ * @throws {StateFileError} If write fails
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const state = await readFleetState('.herdctl/state.yaml');
67
+ * state.fleet.started_at = new Date().toISOString();
68
+ * await writeFleetState('.herdctl/state.yaml', state);
69
+ * ```
70
+ */
71
+ export declare function writeFleetState(stateFilePath: string, state: FleetState, options?: WriteFleetStateOptions): Promise<void>;
72
+ /**
73
+ * Partial updates for agent state
74
+ */
75
+ export type AgentStateUpdates = Partial<AgentState>;
76
+ /**
77
+ * Update a single agent's state within the fleet state
78
+ *
79
+ * This is a convenience function that:
80
+ * 1. Reads current state
81
+ * 2. Applies partial updates to the specified agent
82
+ * 3. Writes the updated state back atomically
83
+ *
84
+ * If the agent doesn't exist, it will be created with the provided updates.
85
+ *
86
+ * @param stateFilePath - Path to state.yaml file
87
+ * @param agentName - Name of the agent to update
88
+ * @param updates - Partial AgentState updates to apply
89
+ * @param options - Options for read/write operations
90
+ * @returns The updated FleetState
91
+ * @throws {StateFileError} If write fails
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * // Mark agent as running with a job
96
+ * await updateAgentState('.herdctl/state.yaml', 'my-agent', {
97
+ * status: 'running',
98
+ * current_job: 'job-123',
99
+ * });
100
+ *
101
+ * // Clear error state
102
+ * await updateAgentState('.herdctl/state.yaml', 'my-agent', {
103
+ * status: 'idle',
104
+ * error_message: null,
105
+ * });
106
+ * ```
107
+ */
108
+ export declare function updateAgentState(stateFilePath: string, agentName: string, updates: AgentStateUpdates, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
109
+ /**
110
+ * Initialize fleet state with started_at timestamp if not already set
111
+ *
112
+ * @param stateFilePath - Path to state.yaml file
113
+ * @param options - Options for read/write operations
114
+ * @returns The initialized FleetState
115
+ */
116
+ export declare function initializeFleetState(stateFilePath: string, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
117
+ /**
118
+ * Remove an agent from the fleet state
119
+ *
120
+ * @param stateFilePath - Path to state.yaml file
121
+ * @param agentName - Name of the agent to remove
122
+ * @param options - Options for read/write operations
123
+ * @returns The updated FleetState
124
+ */
125
+ export declare function removeAgentState(stateFilePath: string, agentName: string, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
126
+ //# sourceMappingURL=fleet-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-state.d.ts","sourceRoot":"","sources":["../../src/state/fleet-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAKlC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AASD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,CAAC,CA0CrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Fleet state management (state.yaml)
3
+ *
4
+ * Provides functions for reading, writing, and updating fleet state.
5
+ * Handles missing files gracefully and corrupted files with warnings.
6
+ */
7
+ import { ZodError } from "zod";
8
+ import { FleetStateSchema, createInitialFleetState, } from "./schemas/fleet-state.js";
9
+ import { safeReadYaml } from "./utils/reads.js";
10
+ import { atomicWriteYaml } from "./utils/atomic.js";
11
+ import { StateFileError } from "./errors.js";
12
+ /**
13
+ * Default console logger
14
+ */
15
+ const defaultLogger = {
16
+ warn: (message) => console.warn(`[herdctl] ${message}`),
17
+ };
18
+ /**
19
+ * Read and validate fleet state from state.yaml
20
+ *
21
+ * Handles:
22
+ * - Missing file: Returns default empty state
23
+ * - Corrupted file: Logs warning, returns default empty state
24
+ * - Valid file: Returns validated FleetState
25
+ *
26
+ * @param stateFilePath - Path to state.yaml file
27
+ * @param options - Read options including logger
28
+ * @returns Validated FleetState object
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const state = await readFleetState('.herdctl/state.yaml');
33
+ * console.log(state.fleet.started_at);
34
+ * console.log(state.agents);
35
+ * ```
36
+ */
37
+ export async function readFleetState(stateFilePath, options = {}) {
38
+ const logger = options.logger ?? defaultLogger;
39
+ // Attempt to read the file
40
+ const readResult = await safeReadYaml(stateFilePath);
41
+ // Handle file not found - return default state
42
+ if (!readResult.success) {
43
+ if (readResult.error.code === "ENOENT") {
44
+ return createInitialFleetState();
45
+ }
46
+ // For other read errors, log and return default
47
+ logger.warn(`Failed to read state file '${stateFilePath}': ${readResult.error.message}. Using default state.`);
48
+ return createInitialFleetState();
49
+ }
50
+ // Handle empty file - return default state
51
+ if (readResult.data === null || readResult.data === undefined) {
52
+ return createInitialFleetState();
53
+ }
54
+ // Validate against schema
55
+ try {
56
+ return FleetStateSchema.parse(readResult.data);
57
+ }
58
+ catch (error) {
59
+ if (error instanceof ZodError) {
60
+ const issues = error.issues
61
+ .map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
62
+ .join(", ");
63
+ logger.warn(`Corrupted state file '${stateFilePath}': ${issues}. Using default state.`);
64
+ return createInitialFleetState();
65
+ }
66
+ // Unexpected error - log and return default
67
+ logger.warn(`Unexpected error parsing state file '${stateFilePath}': ${error.message}. Using default state.`);
68
+ return createInitialFleetState();
69
+ }
70
+ }
71
+ /**
72
+ * Write fleet state to state.yaml atomically
73
+ *
74
+ * Uses atomic write (write to temp file, then rename) to prevent corruption.
75
+ *
76
+ * @param stateFilePath - Path to state.yaml file
77
+ * @param state - FleetState object to write
78
+ * @param options - Write options
79
+ * @throws {StateFileError} If write fails
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const state = await readFleetState('.herdctl/state.yaml');
84
+ * state.fleet.started_at = new Date().toISOString();
85
+ * await writeFleetState('.herdctl/state.yaml', state);
86
+ * ```
87
+ */
88
+ export async function writeFleetState(stateFilePath, state, options = {}) {
89
+ // Validate before writing
90
+ const validatedState = FleetStateSchema.parse(state);
91
+ try {
92
+ await atomicWriteYaml(stateFilePath, validatedState, {
93
+ indent: options.indent ?? 2,
94
+ });
95
+ }
96
+ catch (error) {
97
+ throw new StateFileError(`Failed to write state file '${stateFilePath}': ${error.message}`, stateFilePath, "write", error);
98
+ }
99
+ }
100
+ /**
101
+ * Update a single agent's state within the fleet state
102
+ *
103
+ * This is a convenience function that:
104
+ * 1. Reads current state
105
+ * 2. Applies partial updates to the specified agent
106
+ * 3. Writes the updated state back atomically
107
+ *
108
+ * If the agent doesn't exist, it will be created with the provided updates.
109
+ *
110
+ * @param stateFilePath - Path to state.yaml file
111
+ * @param agentName - Name of the agent to update
112
+ * @param updates - Partial AgentState updates to apply
113
+ * @param options - Options for read/write operations
114
+ * @returns The updated FleetState
115
+ * @throws {StateFileError} If write fails
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * // Mark agent as running with a job
120
+ * await updateAgentState('.herdctl/state.yaml', 'my-agent', {
121
+ * status: 'running',
122
+ * current_job: 'job-123',
123
+ * });
124
+ *
125
+ * // Clear error state
126
+ * await updateAgentState('.herdctl/state.yaml', 'my-agent', {
127
+ * status: 'idle',
128
+ * error_message: null,
129
+ * });
130
+ * ```
131
+ */
132
+ export async function updateAgentState(stateFilePath, agentName, updates, options = {}) {
133
+ // Read current state
134
+ const currentState = await readFleetState(stateFilePath, options);
135
+ // Get current agent state or create new one
136
+ const currentAgentState = currentState.agents[agentName] ?? { status: "idle" };
137
+ // Merge updates
138
+ const updatedAgentState = {
139
+ ...currentAgentState,
140
+ ...updates,
141
+ };
142
+ // Update the state
143
+ const updatedState = {
144
+ ...currentState,
145
+ agents: {
146
+ ...currentState.agents,
147
+ [agentName]: updatedAgentState,
148
+ },
149
+ };
150
+ // Write back
151
+ await writeFleetState(stateFilePath, updatedState, options);
152
+ return updatedState;
153
+ }
154
+ /**
155
+ * Initialize fleet state with started_at timestamp if not already set
156
+ *
157
+ * @param stateFilePath - Path to state.yaml file
158
+ * @param options - Options for read/write operations
159
+ * @returns The initialized FleetState
160
+ */
161
+ export async function initializeFleetState(stateFilePath, options = {}) {
162
+ const currentState = await readFleetState(stateFilePath, options);
163
+ // Only set started_at if not already set
164
+ if (!currentState.fleet.started_at) {
165
+ const updatedState = {
166
+ ...currentState,
167
+ fleet: {
168
+ ...currentState.fleet,
169
+ started_at: new Date().toISOString(),
170
+ },
171
+ };
172
+ await writeFleetState(stateFilePath, updatedState, options);
173
+ return updatedState;
174
+ }
175
+ return currentState;
176
+ }
177
+ /**
178
+ * Remove an agent from the fleet state
179
+ *
180
+ * @param stateFilePath - Path to state.yaml file
181
+ * @param agentName - Name of the agent to remove
182
+ * @param options - Options for read/write operations
183
+ * @returns The updated FleetState
184
+ */
185
+ export async function removeAgentState(stateFilePath, agentName, options = {}) {
186
+ const currentState = await readFleetState(stateFilePath, options);
187
+ // Create new agents map without the specified agent
188
+ const { [agentName]: _, ...remainingAgents } = currentState.agents;
189
+ const updatedState = {
190
+ ...currentState,
191
+ agents: remainingAgents,
192
+ };
193
+ await writeFleetState(stateFilePath, updatedState, options);
194
+ return updatedState;
195
+ }
196
+ //# sourceMappingURL=fleet-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-state.js","sourceRoot":"","sources":["../../src/state/fleet-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * State management module
3
+ *
4
+ * Provides utilities for managing herdctl state files including:
5
+ * - State directory initialization and management
6
+ * - Atomic file writes to prevent corruption
7
+ * - YAML and JSONL file operations
8
+ * - Safe reads with validation
9
+ * - Fleet state (state.yaml) management
10
+ * - Job metadata (job-<id>.yaml) management
11
+ */
12
+ export * from "./types.js";
13
+ export * from "./errors.js";
14
+ export * from "./schemas/index.js";
15
+ export { initStateDirectory, getStateDirectory, validateStateDirectory, } from "./directory.js";
16
+ export * from "./utils/index.js";
17
+ export { readFleetState, writeFleetState, updateAgentState, initializeFleetState, removeAgentState, type StateLogger, type ReadFleetStateOptions, type WriteFleetStateOptions, type AgentStateUpdates, } from "./fleet-state.js";
18
+ export { createJob, updateJob, getJob, listJobs, deleteJob, type JobMetadataOptions, type JobLogger, type JobMetadataUpdates, type ListJobsFilter, type ListJobsResult, } from "./job-metadata.js";
19
+ export { getJobOutputPath, appendJobOutput, appendJobOutputBatch, readJobOutput, readJobOutputAll, type JobOutputLogger, type JobOutputOptions, type ReadJobOutputOptions, } from "./job-output.js";
20
+ export { getSessionInfo, updateSessionInfo, clearSession, type SessionOptions, type SessionLogger, type SessionInfoUpdates, } from "./session.js";
21
+ //# sourceMappingURL=index.d.ts.map