@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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,aAAa,CAAC;AAG5B,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,30 @@
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
+ // Re-export types
13
+ export * from "./types.js";
14
+ // Re-export errors
15
+ export * from "./errors.js";
16
+ // Re-export schemas
17
+ export * from "./schemas/index.js";
18
+ // Re-export directory functions
19
+ export { initStateDirectory, getStateDirectory, validateStateDirectory, } from "./directory.js";
20
+ // Re-export file utilities
21
+ export * from "./utils/index.js";
22
+ // Re-export fleet state functions
23
+ export { readFleetState, writeFleetState, updateAgentState, initializeFleetState, removeAgentState, } from "./fleet-state.js";
24
+ // Re-export job metadata functions
25
+ export { createJob, updateJob, getJob, listJobs, deleteJob, } from "./job-metadata.js";
26
+ // Re-export job output functions
27
+ export { getJobOutputPath, appendJobOutput, appendJobOutputBatch, readJobOutput, readJobOutputAll, } from "./job-output.js";
28
+ // Re-export session functions
29
+ export { getSessionInfo, updateSessionInfo, clearSession, } from "./session.js";
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,mBAAmB;AACnB,cAAc,aAAa,CAAC;AAE5B,oBAAoB;AACpB,cAAc,oBAAoB,CAAC;AAEnC,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,2BAA2B;AAC3B,cAAc,kBAAkB,CAAC;AAEjC,kCAAkC;AAClC,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GAKjB,MAAM,kBAAkB,CAAC;AAE1B,mCAAmC;AACnC,OAAO,EACL,SAAS,EACT,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,GAMV,MAAM,mBAAmB,CAAC;AAE3B,iCAAiC;AACjC,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AAEzB,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,GAIb,MAAM,cAAc,CAAC"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Job metadata persistence operations
3
+ *
4
+ * Provides CRUD operations for job metadata files stored at
5
+ * .herdctl/jobs/job-<id>.yaml
6
+ */
7
+ import { type JobMetadata, type JobStatus, type CreateJobOptions } from "./schemas/job-metadata.js";
8
+ /**
9
+ * Options for reading/writing job metadata
10
+ */
11
+ export interface JobMetadataOptions {
12
+ /** Logger for warnings */
13
+ logger?: JobLogger;
14
+ }
15
+ /**
16
+ * Logger interface for job operations
17
+ */
18
+ export interface JobLogger {
19
+ warn: (message: string) => void;
20
+ }
21
+ /**
22
+ * Partial updates for job metadata
23
+ */
24
+ export type JobMetadataUpdates = Partial<Omit<JobMetadata, "id" | "agent" | "trigger_type" | "started_at">>;
25
+ /**
26
+ * Filter options for listing jobs
27
+ */
28
+ export interface ListJobsFilter {
29
+ /** Filter by agent name */
30
+ agent?: string;
31
+ /** Filter by job status */
32
+ status?: JobStatus;
33
+ /** Filter jobs started on or after this date (ISO string or Date) */
34
+ startedAfter?: string | Date;
35
+ /** Filter jobs started on or before this date (ISO string or Date) */
36
+ startedBefore?: string | Date;
37
+ }
38
+ /**
39
+ * Result of listing jobs
40
+ */
41
+ export interface ListJobsResult {
42
+ /** Array of job metadata */
43
+ jobs: JobMetadata[];
44
+ /** Number of jobs that failed to parse */
45
+ errors: number;
46
+ }
47
+ /**
48
+ * Create a new job and persist it to disk
49
+ *
50
+ * Creates a job metadata file at .herdctl/jobs/job-<id>.yaml
51
+ *
52
+ * @param jobsDir - Path to the jobs directory
53
+ * @param options - Job creation options
54
+ * @returns The created job metadata
55
+ * @throws StateFileError if the file cannot be written
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const job = await createJob('/path/to/.herdctl/jobs', {
60
+ * agent: 'my-agent',
61
+ * trigger_type: 'manual',
62
+ * prompt: 'Fix the bug in auth.ts'
63
+ * });
64
+ * console.log(job.id); // 'job-2024-01-15-abc123'
65
+ * ```
66
+ */
67
+ export declare function createJob(jobsDir: string, options: CreateJobOptions): Promise<JobMetadata>;
68
+ /**
69
+ * Update an existing job's metadata
70
+ *
71
+ * Uses atomic writes to prevent corruption. Automatically calculates
72
+ * duration_seconds when finished_at is set.
73
+ *
74
+ * @param jobsDir - Path to the jobs directory
75
+ * @param jobId - The job ID to update
76
+ * @param updates - Partial updates to apply
77
+ * @returns The updated job metadata
78
+ * @throws StateFileError if the file cannot be read or written
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const job = await updateJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123', {
83
+ * status: 'completed',
84
+ * exit_reason: 'success',
85
+ * finished_at: new Date().toISOString(),
86
+ * summary: 'Fixed the auth bug'
87
+ * });
88
+ * ```
89
+ */
90
+ export declare function updateJob(jobsDir: string, jobId: string, updates: JobMetadataUpdates): Promise<JobMetadata>;
91
+ /**
92
+ * Get a job by its ID
93
+ *
94
+ * @param jobsDir - Path to the jobs directory
95
+ * @param jobId - The job ID to retrieve
96
+ * @returns The job metadata, or null if not found
97
+ * @throws StateFileError if the file exists but cannot be parsed
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const job = await getJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123');
102
+ * if (job) {
103
+ * console.log(job.status); // 'running'
104
+ * }
105
+ * ```
106
+ */
107
+ export declare function getJob(jobsDir: string, jobId: string, options?: JobMetadataOptions): Promise<JobMetadata | null>;
108
+ /**
109
+ * List all jobs, optionally filtered
110
+ *
111
+ * Supports filtering by agent, status, and date range. Returns jobs
112
+ * sorted by started_at in descending order (most recent first).
113
+ *
114
+ * @param jobsDir - Path to the jobs directory
115
+ * @param filter - Optional filter criteria
116
+ * @param options - Optional operation options
117
+ * @returns List of matching jobs and count of parse errors
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * // List all jobs for an agent
122
+ * const { jobs } = await listJobs('/path/to/.herdctl/jobs', {
123
+ * agent: 'my-agent'
124
+ * });
125
+ *
126
+ * // List failed jobs from the last 24 hours
127
+ * const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000);
128
+ * const { jobs } = await listJobs('/path/to/.herdctl/jobs', {
129
+ * status: 'failed',
130
+ * startedAfter: yesterday
131
+ * });
132
+ * ```
133
+ */
134
+ export declare function listJobs(jobsDir: string, filter?: ListJobsFilter, options?: JobMetadataOptions): Promise<ListJobsResult>;
135
+ /**
136
+ * Delete a job's metadata file
137
+ *
138
+ * @param jobsDir - Path to the jobs directory
139
+ * @param jobId - The job ID to delete
140
+ * @returns true if deleted, false if not found
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * const deleted = await deleteJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123');
145
+ * if (deleted) {
146
+ * console.log('Job deleted');
147
+ * }
148
+ * ```
149
+ */
150
+ export declare function deleteJob(jobsDir: string, jobId: string): Promise<boolean>;
151
+ //# sourceMappingURL=job-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-metadata.d.ts","sourceRoot":"","sources":["../../src/state/job-metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAOnC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC,CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB;AAiCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,WAAW,CAAC,CAoBtB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAyDtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8B7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,cAAmB,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CA4FzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Job metadata persistence operations
3
+ *
4
+ * Provides CRUD operations for job metadata files stored at
5
+ * .herdctl/jobs/job-<id>.yaml
6
+ */
7
+ import { readdir } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ import { atomicWriteYaml } from "./utils/atomic.js";
10
+ import { safeReadYaml } from "./utils/reads.js";
11
+ import { JobMetadataSchema, createJobMetadata, generateJobId, } from "./schemas/job-metadata.js";
12
+ import { StateFileError } from "./errors.js";
13
+ // =============================================================================
14
+ // Helper Functions
15
+ // =============================================================================
16
+ /**
17
+ * Get the file path for a job
18
+ */
19
+ function getJobFilePath(jobsDir, jobId) {
20
+ return join(jobsDir, `${jobId}.yaml`);
21
+ }
22
+ /**
23
+ * Parse an ISO date string or Date to a Date object
24
+ */
25
+ function toDate(value) {
26
+ return value instanceof Date ? value : new Date(value);
27
+ }
28
+ /**
29
+ * Calculate duration in seconds between two ISO timestamps
30
+ */
31
+ function calculateDuration(startedAt, finishedAt) {
32
+ const start = new Date(startedAt).getTime();
33
+ const end = new Date(finishedAt).getTime();
34
+ return Math.round((end - start) / 1000);
35
+ }
36
+ // =============================================================================
37
+ // CRUD Operations
38
+ // =============================================================================
39
+ /**
40
+ * Create a new job and persist it to disk
41
+ *
42
+ * Creates a job metadata file at .herdctl/jobs/job-<id>.yaml
43
+ *
44
+ * @param jobsDir - Path to the jobs directory
45
+ * @param options - Job creation options
46
+ * @returns The created job metadata
47
+ * @throws StateFileError if the file cannot be written
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const job = await createJob('/path/to/.herdctl/jobs', {
52
+ * agent: 'my-agent',
53
+ * trigger_type: 'manual',
54
+ * prompt: 'Fix the bug in auth.ts'
55
+ * });
56
+ * console.log(job.id); // 'job-2024-01-15-abc123'
57
+ * ```
58
+ */
59
+ export async function createJob(jobsDir, options) {
60
+ const job = createJobMetadata(options, generateJobId);
61
+ // Validate the generated job metadata
62
+ const validated = JobMetadataSchema.parse(job);
63
+ const filePath = getJobFilePath(jobsDir, validated.id);
64
+ try {
65
+ await atomicWriteYaml(filePath, validated);
66
+ }
67
+ catch (error) {
68
+ throw new StateFileError(`Failed to create job file: ${error.message}`, filePath, "write", error);
69
+ }
70
+ return validated;
71
+ }
72
+ /**
73
+ * Update an existing job's metadata
74
+ *
75
+ * Uses atomic writes to prevent corruption. Automatically calculates
76
+ * duration_seconds when finished_at is set.
77
+ *
78
+ * @param jobsDir - Path to the jobs directory
79
+ * @param jobId - The job ID to update
80
+ * @param updates - Partial updates to apply
81
+ * @returns The updated job metadata
82
+ * @throws StateFileError if the file cannot be read or written
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * const job = await updateJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123', {
87
+ * status: 'completed',
88
+ * exit_reason: 'success',
89
+ * finished_at: new Date().toISOString(),
90
+ * summary: 'Fixed the auth bug'
91
+ * });
92
+ * ```
93
+ */
94
+ export async function updateJob(jobsDir, jobId, updates) {
95
+ const filePath = getJobFilePath(jobsDir, jobId);
96
+ // Read existing job
97
+ const result = await safeReadYaml(filePath);
98
+ if (!result.success) {
99
+ throw new StateFileError(`Failed to read job file for update: ${result.error.message}`, filePath, "read", result.error);
100
+ }
101
+ // Parse and validate existing job
102
+ const parseResult = JobMetadataSchema.safeParse(result.data);
103
+ if (!parseResult.success) {
104
+ throw new StateFileError(`Job file is corrupted: ${parseResult.error.message}`, filePath, "read");
105
+ }
106
+ const existingJob = parseResult.data;
107
+ // Apply updates
108
+ const updatedJob = {
109
+ ...existingJob,
110
+ ...updates,
111
+ };
112
+ // Auto-calculate duration if finished_at is being set
113
+ if (updates.finished_at && !updates.duration_seconds) {
114
+ updatedJob.duration_seconds = calculateDuration(existingJob.started_at, updates.finished_at);
115
+ }
116
+ // Validate the updated job
117
+ const validated = JobMetadataSchema.parse(updatedJob);
118
+ // Write atomically
119
+ try {
120
+ await atomicWriteYaml(filePath, validated);
121
+ }
122
+ catch (error) {
123
+ throw new StateFileError(`Failed to update job file: ${error.message}`, filePath, "write", error);
124
+ }
125
+ return validated;
126
+ }
127
+ /**
128
+ * Get a job by its ID
129
+ *
130
+ * @param jobsDir - Path to the jobs directory
131
+ * @param jobId - The job ID to retrieve
132
+ * @returns The job metadata, or null if not found
133
+ * @throws StateFileError if the file exists but cannot be parsed
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * const job = await getJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123');
138
+ * if (job) {
139
+ * console.log(job.status); // 'running'
140
+ * }
141
+ * ```
142
+ */
143
+ export async function getJob(jobsDir, jobId, options = {}) {
144
+ const { logger = console } = options;
145
+ const filePath = getJobFilePath(jobsDir, jobId);
146
+ const result = await safeReadYaml(filePath);
147
+ if (!result.success) {
148
+ // File not found is not an error - return null
149
+ if (result.error.code === "ENOENT") {
150
+ return null;
151
+ }
152
+ throw new StateFileError(`Failed to read job file: ${result.error.message}`, filePath, "read", result.error);
153
+ }
154
+ // Parse and validate
155
+ const parseResult = JobMetadataSchema.safeParse(result.data);
156
+ if (!parseResult.success) {
157
+ logger.warn(`Corrupted job file ${filePath}: ${parseResult.error.message}. Skipping.`);
158
+ return null;
159
+ }
160
+ return parseResult.data;
161
+ }
162
+ /**
163
+ * List all jobs, optionally filtered
164
+ *
165
+ * Supports filtering by agent, status, and date range. Returns jobs
166
+ * sorted by started_at in descending order (most recent first).
167
+ *
168
+ * @param jobsDir - Path to the jobs directory
169
+ * @param filter - Optional filter criteria
170
+ * @param options - Optional operation options
171
+ * @returns List of matching jobs and count of parse errors
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * // List all jobs for an agent
176
+ * const { jobs } = await listJobs('/path/to/.herdctl/jobs', {
177
+ * agent: 'my-agent'
178
+ * });
179
+ *
180
+ * // List failed jobs from the last 24 hours
181
+ * const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000);
182
+ * const { jobs } = await listJobs('/path/to/.herdctl/jobs', {
183
+ * status: 'failed',
184
+ * startedAfter: yesterday
185
+ * });
186
+ * ```
187
+ */
188
+ export async function listJobs(jobsDir, filter = {}, options = {}) {
189
+ const { logger = console } = options;
190
+ // Read directory
191
+ let files;
192
+ try {
193
+ files = await readdir(jobsDir);
194
+ }
195
+ catch (error) {
196
+ // Directory doesn't exist - return empty list
197
+ if (error.code === "ENOENT") {
198
+ return { jobs: [], errors: 0 };
199
+ }
200
+ throw new StateFileError(`Failed to read jobs directory: ${error.message}`, jobsDir, "read", error);
201
+ }
202
+ // Filter to job YAML files
203
+ const jobFiles = files.filter((f) => f.startsWith("job-") && f.endsWith(".yaml"));
204
+ const jobs = [];
205
+ let errors = 0;
206
+ // Parse date filters once
207
+ const startedAfter = filter.startedAfter
208
+ ? toDate(filter.startedAfter)
209
+ : undefined;
210
+ const startedBefore = filter.startedBefore
211
+ ? toDate(filter.startedBefore)
212
+ : undefined;
213
+ // Read and filter each job
214
+ for (const file of jobFiles) {
215
+ const filePath = join(jobsDir, file);
216
+ const result = await safeReadYaml(filePath);
217
+ if (!result.success) {
218
+ logger.warn(`Failed to read job file ${filePath}: ${result.error.message}`);
219
+ errors++;
220
+ continue;
221
+ }
222
+ const parseResult = JobMetadataSchema.safeParse(result.data);
223
+ if (!parseResult.success) {
224
+ logger.warn(`Corrupted job file ${filePath}: ${parseResult.error.message}`);
225
+ errors++;
226
+ continue;
227
+ }
228
+ const job = parseResult.data;
229
+ // Apply filters
230
+ if (filter.agent && job.agent !== filter.agent) {
231
+ continue;
232
+ }
233
+ if (filter.status && job.status !== filter.status) {
234
+ continue;
235
+ }
236
+ if (startedAfter) {
237
+ const jobDate = new Date(job.started_at);
238
+ if (jobDate < startedAfter) {
239
+ continue;
240
+ }
241
+ }
242
+ if (startedBefore) {
243
+ const jobDate = new Date(job.started_at);
244
+ if (jobDate > startedBefore) {
245
+ continue;
246
+ }
247
+ }
248
+ jobs.push(job);
249
+ }
250
+ // Sort by started_at descending (most recent first)
251
+ jobs.sort((a, b) => {
252
+ const dateA = new Date(a.started_at).getTime();
253
+ const dateB = new Date(b.started_at).getTime();
254
+ return dateB - dateA;
255
+ });
256
+ return { jobs, errors };
257
+ }
258
+ /**
259
+ * Delete a job's metadata file
260
+ *
261
+ * @param jobsDir - Path to the jobs directory
262
+ * @param jobId - The job ID to delete
263
+ * @returns true if deleted, false if not found
264
+ *
265
+ * @example
266
+ * ```typescript
267
+ * const deleted = await deleteJob('/path/to/.herdctl/jobs', 'job-2024-01-15-abc123');
268
+ * if (deleted) {
269
+ * console.log('Job deleted');
270
+ * }
271
+ * ```
272
+ */
273
+ export async function deleteJob(jobsDir, jobId) {
274
+ const { unlink } = await import("node:fs/promises");
275
+ const filePath = getJobFilePath(jobsDir, jobId);
276
+ try {
277
+ await unlink(filePath);
278
+ return true;
279
+ }
280
+ catch (error) {
281
+ if (error.code === "ENOENT") {
282
+ return false;
283
+ }
284
+ throw new StateFileError(`Failed to delete job file: ${error.message}`, filePath, "write", error);
285
+ }
286
+ }
287
+ //# sourceMappingURL=job-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-metadata.js","sourceRoot":"","sources":["../../src/state/job-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Job output logging operations
3
+ *
4
+ * Provides functions for streaming job output to JSONL files.
5
+ * Supports real-time monitoring with immediate writes (no buffering).
6
+ *
7
+ * Output files are stored at: .herdctl/jobs/job-<id>.jsonl
8
+ */
9
+ import { type JobOutputMessage, type JobOutputInput } from "./schemas/job-output.js";
10
+ /**
11
+ * Logger interface for job output operations
12
+ */
13
+ export interface JobOutputLogger {
14
+ warn: (message: string) => void;
15
+ }
16
+ /**
17
+ * Options for job output operations
18
+ */
19
+ export interface JobOutputOptions {
20
+ /** Logger for warnings and errors */
21
+ logger?: JobOutputLogger;
22
+ }
23
+ /**
24
+ * Options for reading job output
25
+ */
26
+ export interface ReadJobOutputOptions extends JobOutputOptions {
27
+ /** Whether to skip invalid lines instead of failing */
28
+ skipInvalidLines?: boolean;
29
+ }
30
+ /**
31
+ * Get the path to a job's output file
32
+ *
33
+ * @param jobsDir - Path to the jobs directory (.herdctl/jobs)
34
+ * @param jobId - Job ID (e.g., job-2024-01-15-abc123)
35
+ * @returns Path to the JSONL output file
36
+ */
37
+ export declare function getJobOutputPath(jobsDir: string, jobId: string): string;
38
+ /**
39
+ * Append a single message to a job's output log
40
+ *
41
+ * Writes immediately to disk for real-time monitoring (no buffering).
42
+ * Uses append mode which is safe for concurrent appends.
43
+ *
44
+ * @param jobsDir - Path to the jobs directory
45
+ * @param jobId - Job ID
46
+ * @param message - Message to append (timestamp added automatically)
47
+ * @throws StateFileError if write fails or message is invalid
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * await appendJobOutput(jobsDir, jobId, {
52
+ * type: "assistant",
53
+ * content: "Hello, world!"
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function appendJobOutput(jobsDir: string, jobId: string, message: JobOutputInput): Promise<void>;
58
+ /**
59
+ * Append multiple messages to a job's output log
60
+ *
61
+ * Writes all messages immediately in sequence.
62
+ * Each message is validated before writing begins.
63
+ *
64
+ * @param jobsDir - Path to the jobs directory
65
+ * @param jobId - Job ID
66
+ * @param messages - Messages to append (timestamps added automatically)
67
+ * @throws StateFileError if write fails or any message is invalid
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * await appendJobOutputBatch(jobsDir, jobId, [
72
+ * { type: "tool_use", tool_name: "read_file", input: { path: "/etc/hosts" } },
73
+ * { type: "tool_result", result: "127.0.0.1 localhost", success: true }
74
+ * ]);
75
+ * ```
76
+ */
77
+ export declare function appendJobOutputBatch(jobsDir: string, jobId: string, messages: JobOutputInput[]): Promise<void>;
78
+ /**
79
+ * Read job output as an async generator for streaming reads
80
+ *
81
+ * Yields messages one at a time, allowing for memory-efficient
82
+ * processing of large output files.
83
+ *
84
+ * @param jobsDir - Path to the jobs directory
85
+ * @param jobId - Job ID
86
+ * @param options - Read options
87
+ * @yields JobOutputMessage objects
88
+ * @throws StateFileError if file cannot be read (except ENOENT which yields nothing)
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * for await (const message of readJobOutput(jobsDir, jobId)) {
93
+ * console.log(`[${message.type}] ${message.timestamp}`);
94
+ * }
95
+ * ```
96
+ */
97
+ export declare function readJobOutput(jobsDir: string, jobId: string, options?: ReadJobOutputOptions): AsyncGenerator<JobOutputMessage, void, undefined>;
98
+ /**
99
+ * Read all job output messages into an array
100
+ *
101
+ * Convenience function that collects all messages from readJobOutput.
102
+ * For large files, prefer using readJobOutput directly as a generator.
103
+ *
104
+ * @param jobsDir - Path to the jobs directory
105
+ * @param jobId - Job ID
106
+ * @param options - Read options
107
+ * @returns Array of all job output messages
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * const messages = await readJobOutputAll(jobsDir, jobId);
112
+ * console.log(`Total messages: ${messages.length}`);
113
+ * ```
114
+ */
115
+ export declare function readJobOutputAll(jobsDir: string, jobId: string, options?: ReadJobOutputOptions): Promise<JobOutputMessage[]>;
116
+ //# sourceMappingURL=job-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-output.d.ts","sourceRoot":"","sources":["../../src/state/job-output.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAGpB,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvE;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAuB,aAAa,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,SAAS,CAAC,CAgFnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM7B"}