@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,138 @@
1
+ /**
2
+ * Scheduler class for managing agent schedule execution
3
+ *
4
+ * The Scheduler continuously checks all agents' interval schedules and triggers
5
+ * due agents according to their configured intervals.
6
+ */
7
+ import type { ResolvedAgent } from "../config/index.js";
8
+ import type { SchedulerOptions, SchedulerStatus, SchedulerState, StopOptions } from "./types.js";
9
+ /**
10
+ * Scheduler for managing agent schedule execution
11
+ *
12
+ * The Scheduler runs a polling loop that:
13
+ * 1. Checks all agents' interval schedules on each iteration
14
+ * 2. Skips non-interval schedule types (cron, webhook, chat)
15
+ * 3. Skips disabled schedules
16
+ * 4. Skips agents at max_concurrent capacity
17
+ * 5. Triggers due schedules via the onTrigger callback
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const scheduler = new Scheduler({
22
+ * stateDir: '.herdctl',
23
+ * checkInterval: 1000, // 1 second
24
+ * onTrigger: async (info) => {
25
+ * console.log(`Triggering ${info.agent.name}/${info.scheduleName}`);
26
+ * await runAgent(info.agent, info.schedule);
27
+ * },
28
+ * });
29
+ *
30
+ * // Start the scheduler
31
+ * await scheduler.start(agents);
32
+ *
33
+ * // Later, stop the scheduler
34
+ * await scheduler.stop();
35
+ * ```
36
+ */
37
+ export declare class Scheduler {
38
+ private readonly checkInterval;
39
+ private readonly stateDir;
40
+ private readonly logger;
41
+ private readonly onTrigger?;
42
+ private status;
43
+ private abortController;
44
+ private agents;
45
+ private runningSchedules;
46
+ private runningJobs;
47
+ private startedAt;
48
+ private checkCount;
49
+ private triggerCount;
50
+ private lastCheckAt;
51
+ constructor(options: SchedulerOptions);
52
+ /**
53
+ * Check if the scheduler is currently running
54
+ */
55
+ isRunning(): boolean;
56
+ /**
57
+ * Get the current scheduler status
58
+ */
59
+ getStatus(): SchedulerStatus;
60
+ /**
61
+ * Get detailed scheduler state for monitoring
62
+ */
63
+ getState(): SchedulerState;
64
+ /**
65
+ * Start the scheduler polling loop
66
+ *
67
+ * @param agents - The agents to schedule
68
+ * @throws Error if scheduler is already running
69
+ */
70
+ start(agents: ResolvedAgent[]): Promise<void>;
71
+ /**
72
+ * Stop the scheduler gracefully
73
+ *
74
+ * Signals the polling loop to stop and optionally waits for running jobs to complete.
75
+ *
76
+ * @param options - Options for shutdown behavior
77
+ * @param options.waitForJobs - Whether to wait for running jobs to complete (default: true)
78
+ * @param options.timeout - Maximum time to wait for jobs in milliseconds (default: 30000)
79
+ * @throws SchedulerShutdownError if timeout is reached while waiting for jobs
80
+ */
81
+ stop(options?: StopOptions): Promise<void>;
82
+ /**
83
+ * Update the list of agents to schedule
84
+ *
85
+ * Can be called while the scheduler is running to add/remove agents.
86
+ */
87
+ setAgents(agents: ResolvedAgent[]): void;
88
+ /**
89
+ * Main polling loop
90
+ */
91
+ private runLoop;
92
+ /**
93
+ * Sleep for the specified duration, interruptible via AbortSignal
94
+ */
95
+ private sleep;
96
+ /**
97
+ * Check all agents' schedules and trigger due ones
98
+ */
99
+ private checkAllSchedules;
100
+ /**
101
+ * Check if a single schedule should be triggered
102
+ */
103
+ private checkSchedule;
104
+ /**
105
+ * Get max_concurrent for an agent, defaulting to 1
106
+ *
107
+ * Reads from agent.instances.max_concurrent, which may come from:
108
+ * - Agent-specific config
109
+ * - Fleet defaults (merged during config loading)
110
+ */
111
+ private getMaxConcurrent;
112
+ /**
113
+ * Get the count of currently running jobs for a specific agent
114
+ *
115
+ * This is useful for monitoring and debugging concurrency behavior.
116
+ *
117
+ * @param agentName - The name of the agent to check
118
+ * @returns The number of currently running jobs for this agent
119
+ */
120
+ getRunningJobCount(agentName: string): number;
121
+ /**
122
+ * Get the total count of running jobs across all agents
123
+ *
124
+ * This is useful for monitoring overall scheduler load.
125
+ *
126
+ * @returns The total number of currently running jobs
127
+ */
128
+ getTotalRunningJobCount(): number;
129
+ /**
130
+ * Trigger a schedule and update state
131
+ */
132
+ private triggerSchedule;
133
+ /**
134
+ * Execute the actual job logic
135
+ */
136
+ private executeJob;
137
+ }
138
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOxD,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EAMd,WAAW,EACZ,MAAM,YAAY,CAAC;AAqCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA2B;IAEtD,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAuB;gBAE9B,OAAO,EAAE,gBAAgB;IAOrC;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,QAAQ,IAAI,cAAc;IAU1B;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD;;;;;;;;;OASG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDhD;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAKxC;;OAEG;YACW,OAAO;IAmBrB;;OAEG;IACH,OAAO,CAAC,KAAK;IAeb;;OAEG;YACW,iBAAiB;IAmB/B;;OAEG;YACW,aAAa;IAuG3B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;;;OAOG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI7C;;;;;;OAMG;IACH,uBAAuB,IAAI,MAAM;IAIjC;;OAEG;YACW,eAAe;IA2C7B;;OAEG;YACW,UAAU;CAqEzB"}
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Scheduler class for managing agent schedule execution
3
+ *
4
+ * The Scheduler continuously checks all agents' interval schedules and triggers
5
+ * due agents according to their configured intervals.
6
+ */
7
+ import { calculateNextTrigger, isScheduleDue } from "./interval.js";
8
+ import { getScheduleState, updateScheduleState, } from "./schedule-state.js";
9
+ import { SchedulerShutdownError } from "./errors.js";
10
+ // =============================================================================
11
+ // Constants
12
+ // =============================================================================
13
+ /**
14
+ * Default check interval in milliseconds (1 second)
15
+ */
16
+ const DEFAULT_CHECK_INTERVAL = 1000;
17
+ /**
18
+ * Default shutdown timeout in milliseconds (30 seconds)
19
+ */
20
+ const DEFAULT_SHUTDOWN_TIMEOUT = 30000;
21
+ // =============================================================================
22
+ // Default Logger
23
+ // =============================================================================
24
+ /**
25
+ * Create a default console-based logger
26
+ */
27
+ function createDefaultLogger() {
28
+ return {
29
+ debug: (message) => console.debug(`[scheduler] ${message}`),
30
+ info: (message) => console.info(`[scheduler] ${message}`),
31
+ warn: (message) => console.warn(`[scheduler] ${message}`),
32
+ error: (message) => console.error(`[scheduler] ${message}`),
33
+ };
34
+ }
35
+ // =============================================================================
36
+ // Scheduler Class
37
+ // =============================================================================
38
+ /**
39
+ * Scheduler for managing agent schedule execution
40
+ *
41
+ * The Scheduler runs a polling loop that:
42
+ * 1. Checks all agents' interval schedules on each iteration
43
+ * 2. Skips non-interval schedule types (cron, webhook, chat)
44
+ * 3. Skips disabled schedules
45
+ * 4. Skips agents at max_concurrent capacity
46
+ * 5. Triggers due schedules via the onTrigger callback
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const scheduler = new Scheduler({
51
+ * stateDir: '.herdctl',
52
+ * checkInterval: 1000, // 1 second
53
+ * onTrigger: async (info) => {
54
+ * console.log(`Triggering ${info.agent.name}/${info.scheduleName}`);
55
+ * await runAgent(info.agent, info.schedule);
56
+ * },
57
+ * });
58
+ *
59
+ * // Start the scheduler
60
+ * await scheduler.start(agents);
61
+ *
62
+ * // Later, stop the scheduler
63
+ * await scheduler.stop();
64
+ * ```
65
+ */
66
+ export class Scheduler {
67
+ checkInterval;
68
+ stateDir;
69
+ logger;
70
+ onTrigger;
71
+ status = "stopped";
72
+ abortController = null;
73
+ agents = [];
74
+ runningSchedules = new Map();
75
+ runningJobs = new Map();
76
+ startedAt = null;
77
+ checkCount = 0;
78
+ triggerCount = 0;
79
+ lastCheckAt = null;
80
+ constructor(options) {
81
+ this.checkInterval = options.checkInterval ?? DEFAULT_CHECK_INTERVAL;
82
+ this.stateDir = options.stateDir;
83
+ this.logger = options.logger ?? createDefaultLogger();
84
+ this.onTrigger = options.onTrigger;
85
+ }
86
+ /**
87
+ * Check if the scheduler is currently running
88
+ */
89
+ isRunning() {
90
+ return this.status === "running";
91
+ }
92
+ /**
93
+ * Get the current scheduler status
94
+ */
95
+ getStatus() {
96
+ return this.status;
97
+ }
98
+ /**
99
+ * Get detailed scheduler state for monitoring
100
+ */
101
+ getState() {
102
+ return {
103
+ status: this.status,
104
+ startedAt: this.startedAt,
105
+ checkCount: this.checkCount,
106
+ triggerCount: this.triggerCount,
107
+ lastCheckAt: this.lastCheckAt,
108
+ };
109
+ }
110
+ /**
111
+ * Start the scheduler polling loop
112
+ *
113
+ * @param agents - The agents to schedule
114
+ * @throws Error if scheduler is already running
115
+ */
116
+ async start(agents) {
117
+ if (this.status === "running") {
118
+ throw new Error("Scheduler is already running");
119
+ }
120
+ if (this.status === "stopping") {
121
+ throw new Error("Scheduler is stopping, wait for it to complete");
122
+ }
123
+ this.agents = agents;
124
+ this.status = "running";
125
+ this.abortController = new AbortController();
126
+ this.startedAt = new Date().toISOString();
127
+ this.checkCount = 0;
128
+ this.triggerCount = 0;
129
+ this.runningSchedules.clear();
130
+ this.runningJobs.clear();
131
+ this.logger.info(`Scheduler started with ${agents.length} agents, check interval: ${this.checkInterval}ms`);
132
+ // Run the polling loop
133
+ await this.runLoop();
134
+ }
135
+ /**
136
+ * Stop the scheduler gracefully
137
+ *
138
+ * Signals the polling loop to stop and optionally waits for running jobs to complete.
139
+ *
140
+ * @param options - Options for shutdown behavior
141
+ * @param options.waitForJobs - Whether to wait for running jobs to complete (default: true)
142
+ * @param options.timeout - Maximum time to wait for jobs in milliseconds (default: 30000)
143
+ * @throws SchedulerShutdownError if timeout is reached while waiting for jobs
144
+ */
145
+ async stop(options) {
146
+ if (this.status !== "running") {
147
+ return;
148
+ }
149
+ const waitForJobs = options?.waitForJobs ?? true;
150
+ const timeout = options?.timeout ?? DEFAULT_SHUTDOWN_TIMEOUT;
151
+ this.status = "stopping";
152
+ this.logger.info("Scheduler stopping...");
153
+ // Signal the loop to stop - this prevents new triggers from starting
154
+ this.abortController?.abort();
155
+ // Wait a tick for the loop to recognize the abort
156
+ await new Promise((resolve) => setImmediate(resolve));
157
+ // Optionally wait for running jobs to complete
158
+ if (waitForJobs && this.runningJobs.size > 0) {
159
+ this.logger.info(`Waiting for ${this.runningJobs.size} running job(s) to complete...`);
160
+ const runningJobPromises = Array.from(this.runningJobs.values());
161
+ // Create a timeout promise
162
+ const timeoutPromise = new Promise((resolve) => {
163
+ setTimeout(() => resolve("timeout"), timeout);
164
+ });
165
+ // Race all running jobs against the timeout
166
+ const result = await Promise.race([
167
+ Promise.all(runningJobPromises).then(() => "completed"),
168
+ timeoutPromise,
169
+ ]);
170
+ if (result === "timeout") {
171
+ const runningJobCount = this.runningJobs.size;
172
+ this.status = "stopped";
173
+ this.abortController = null;
174
+ this.logger.error(`Shutdown timed out with ${runningJobCount} job(s) still running`);
175
+ throw new SchedulerShutdownError(`Scheduler shutdown timed out after ${timeout}ms with ${runningJobCount} job(s) still running`, { timedOut: true, runningJobCount });
176
+ }
177
+ this.logger.info("All running jobs completed");
178
+ }
179
+ this.status = "stopped";
180
+ this.abortController = null;
181
+ this.logger.info("Scheduler stopped");
182
+ }
183
+ /**
184
+ * Update the list of agents to schedule
185
+ *
186
+ * Can be called while the scheduler is running to add/remove agents.
187
+ */
188
+ setAgents(agents) {
189
+ this.agents = agents;
190
+ this.logger.debug(`Updated agents list: ${agents.length} agents`);
191
+ }
192
+ /**
193
+ * Main polling loop
194
+ */
195
+ async runLoop() {
196
+ const signal = this.abortController?.signal;
197
+ while (this.status === "running" && !signal?.aborted) {
198
+ try {
199
+ await this.checkAllSchedules();
200
+ }
201
+ catch (error) {
202
+ this.logger.error(`Error during schedule check: ${error instanceof Error ? error.message : String(error)}`);
203
+ }
204
+ // Sleep until next check, but allow interruption via AbortController
205
+ if (this.status === "running" && !signal?.aborted) {
206
+ await this.sleep(this.checkInterval, signal);
207
+ }
208
+ }
209
+ }
210
+ /**
211
+ * Sleep for the specified duration, interruptible via AbortSignal
212
+ */
213
+ sleep(ms, signal) {
214
+ return new Promise((resolve) => {
215
+ const timeout = setTimeout(resolve, ms);
216
+ signal?.addEventListener("abort", () => {
217
+ clearTimeout(timeout);
218
+ resolve();
219
+ }, { once: true });
220
+ });
221
+ }
222
+ /**
223
+ * Check all agents' schedules and trigger due ones
224
+ */
225
+ async checkAllSchedules() {
226
+ this.checkCount++;
227
+ this.lastCheckAt = new Date().toISOString();
228
+ for (const agent of this.agents) {
229
+ if (!agent.schedules) {
230
+ continue;
231
+ }
232
+ for (const [scheduleName, schedule] of Object.entries(agent.schedules)) {
233
+ const result = await this.checkSchedule(agent, scheduleName, schedule);
234
+ if (result.shouldTrigger) {
235
+ await this.triggerSchedule(agent, scheduleName, schedule);
236
+ }
237
+ }
238
+ }
239
+ }
240
+ /**
241
+ * Check if a single schedule should be triggered
242
+ */
243
+ async checkSchedule(agent, scheduleName, schedule) {
244
+ const baseResult = {
245
+ agentName: agent.name,
246
+ scheduleName,
247
+ };
248
+ // Skip non-interval schedule types (cron, webhook, chat reserved for future)
249
+ if (schedule.type !== "interval") {
250
+ return {
251
+ ...baseResult,
252
+ shouldTrigger: false,
253
+ skipReason: "not_interval",
254
+ };
255
+ }
256
+ // Get current schedule state
257
+ const stateLogger = { warn: this.logger.warn };
258
+ const scheduleState = await getScheduleState(this.stateDir, agent.name, scheduleName, { logger: stateLogger });
259
+ // Skip disabled schedules
260
+ if (scheduleState.status === "disabled") {
261
+ this.logger.debug(`Skipping ${agent.name}/${scheduleName}: schedule is disabled`);
262
+ return {
263
+ ...baseResult,
264
+ shouldTrigger: false,
265
+ skipReason: "disabled",
266
+ };
267
+ }
268
+ // Skip if already running (tracked locally)
269
+ const agentRunning = this.runningSchedules.get(agent.name);
270
+ if (agentRunning?.has(scheduleName)) {
271
+ this.logger.debug(`Skipping ${agent.name}/${scheduleName}: already running`);
272
+ return {
273
+ ...baseResult,
274
+ shouldTrigger: false,
275
+ skipReason: "already_running",
276
+ };
277
+ }
278
+ // Check max_concurrent capacity
279
+ const maxConcurrent = agent.session?.max_turns
280
+ ? 1
281
+ : this.getMaxConcurrent(agent);
282
+ const runningCount = agentRunning?.size ?? 0;
283
+ if (runningCount >= maxConcurrent) {
284
+ this.logger.debug(`Skipping ${agent.name}/${scheduleName}: at max capacity (${runningCount}/${maxConcurrent})`);
285
+ return {
286
+ ...baseResult,
287
+ shouldTrigger: false,
288
+ skipReason: "at_capacity",
289
+ };
290
+ }
291
+ // Calculate next trigger time
292
+ const lastRunAt = scheduleState.last_run_at
293
+ ? new Date(scheduleState.last_run_at)
294
+ : null;
295
+ if (!schedule.interval) {
296
+ this.logger.warn(`Skipping ${agent.name}/${scheduleName}: interval schedule missing interval value`);
297
+ return {
298
+ ...baseResult,
299
+ shouldTrigger: false,
300
+ skipReason: "not_interval",
301
+ };
302
+ }
303
+ const nextTrigger = calculateNextTrigger(lastRunAt, schedule.interval);
304
+ // Check if schedule is due
305
+ if (!isScheduleDue(nextTrigger)) {
306
+ return {
307
+ ...baseResult,
308
+ shouldTrigger: false,
309
+ skipReason: "not_due",
310
+ };
311
+ }
312
+ return {
313
+ ...baseResult,
314
+ shouldTrigger: true,
315
+ };
316
+ }
317
+ /**
318
+ * Get max_concurrent for an agent, defaulting to 1
319
+ *
320
+ * Reads from agent.instances.max_concurrent, which may come from:
321
+ * - Agent-specific config
322
+ * - Fleet defaults (merged during config loading)
323
+ */
324
+ getMaxConcurrent(agent) {
325
+ return agent.instances?.max_concurrent ?? 1;
326
+ }
327
+ /**
328
+ * Get the count of currently running jobs for a specific agent
329
+ *
330
+ * This is useful for monitoring and debugging concurrency behavior.
331
+ *
332
+ * @param agentName - The name of the agent to check
333
+ * @returns The number of currently running jobs for this agent
334
+ */
335
+ getRunningJobCount(agentName) {
336
+ return this.runningSchedules.get(agentName)?.size ?? 0;
337
+ }
338
+ /**
339
+ * Get the total count of running jobs across all agents
340
+ *
341
+ * This is useful for monitoring overall scheduler load.
342
+ *
343
+ * @returns The total number of currently running jobs
344
+ */
345
+ getTotalRunningJobCount() {
346
+ return this.runningJobs.size;
347
+ }
348
+ /**
349
+ * Trigger a schedule and update state
350
+ */
351
+ async triggerSchedule(agent, scheduleName, schedule) {
352
+ this.logger.info(`Triggering ${agent.name}/${scheduleName}`);
353
+ this.triggerCount++;
354
+ // Create a unique key for this job
355
+ const jobKey = `${agent.name}/${scheduleName}`;
356
+ // Mark schedule as running
357
+ if (!this.runningSchedules.has(agent.name)) {
358
+ this.runningSchedules.set(agent.name, new Set());
359
+ }
360
+ this.runningSchedules.get(agent.name).add(scheduleName);
361
+ const stateLogger = { warn: this.logger.warn };
362
+ // Update schedule state to running
363
+ await updateScheduleState(this.stateDir, agent.name, scheduleName, {
364
+ status: "running",
365
+ last_run_at: new Date().toISOString(),
366
+ }, { logger: stateLogger });
367
+ // Create and track the job promise
368
+ const jobPromise = this.executeJob(agent, scheduleName, schedule);
369
+ this.runningJobs.set(jobKey, jobPromise);
370
+ try {
371
+ await jobPromise;
372
+ }
373
+ finally {
374
+ // Remove from running jobs tracking
375
+ this.runningJobs.delete(jobKey);
376
+ }
377
+ }
378
+ /**
379
+ * Execute the actual job logic
380
+ */
381
+ async executeJob(agent, scheduleName, schedule) {
382
+ const stateLogger = { warn: this.logger.warn };
383
+ try {
384
+ // Get current schedule state for trigger info
385
+ const scheduleState = await getScheduleState(this.stateDir, agent.name, scheduleName, { logger: stateLogger });
386
+ // Invoke the trigger callback if provided
387
+ if (this.onTrigger) {
388
+ const triggerInfo = {
389
+ agent,
390
+ scheduleName,
391
+ schedule: schedule,
392
+ scheduleState,
393
+ };
394
+ await this.onTrigger(triggerInfo);
395
+ }
396
+ // Calculate next trigger time
397
+ const nextTrigger = schedule.interval
398
+ ? calculateNextTrigger(new Date(), schedule.interval)
399
+ : null;
400
+ // Update schedule state to idle with next run time
401
+ await updateScheduleState(this.stateDir, agent.name, scheduleName, {
402
+ status: "idle",
403
+ next_run_at: nextTrigger?.toISOString() ?? null,
404
+ last_error: null,
405
+ }, { logger: stateLogger });
406
+ this.logger.info(`Completed ${agent.name}/${scheduleName}`);
407
+ }
408
+ catch (error) {
409
+ const errorMessage = error instanceof Error ? error.message : String(error);
410
+ // Update schedule state with error
411
+ await updateScheduleState(this.stateDir, agent.name, scheduleName, {
412
+ status: "idle",
413
+ last_error: errorMessage,
414
+ }, { logger: stateLogger });
415
+ this.logger.error(`Error in ${agent.name}/${scheduleName}: ${errorMessage}`);
416
+ }
417
+ finally {
418
+ // Mark schedule as no longer running
419
+ this.runningSchedules.get(agent.name)?.delete(scheduleName);
420
+ }
421
+ }
422
+ }
423
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"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"}