@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,747 @@
1
+ /**
2
+ * Error classes for fleet manager operations
3
+ *
4
+ * Provides typed errors with descriptive messages and error codes for fleet manager failures.
5
+ * All errors extend FleetManagerError and include relevant context for debugging.
6
+ */
7
+
8
+ // =============================================================================
9
+ // Error Codes
10
+ // =============================================================================
11
+
12
+ /**
13
+ * Error codes for fleet manager errors
14
+ * These codes provide a stable identifier for error types that can be used
15
+ * for programmatic error handling.
16
+ */
17
+ export const FleetManagerErrorCode = {
18
+ // Base error
19
+ FLEET_MANAGER_ERROR: "FLEET_MANAGER_ERROR",
20
+
21
+ // Configuration errors
22
+ CONFIGURATION_ERROR: "CONFIGURATION_ERROR",
23
+ CONFIG_LOAD_ERROR: "CONFIG_LOAD_ERROR",
24
+
25
+ // Not found errors
26
+ AGENT_NOT_FOUND: "AGENT_NOT_FOUND",
27
+ JOB_NOT_FOUND: "JOB_NOT_FOUND",
28
+ SCHEDULE_NOT_FOUND: "SCHEDULE_NOT_FOUND",
29
+
30
+ // State errors
31
+ INVALID_STATE: "INVALID_STATE",
32
+ STATE_DIR_ERROR: "STATE_DIR_ERROR",
33
+
34
+ // Operational errors
35
+ CONCURRENCY_LIMIT: "CONCURRENCY_LIMIT",
36
+ SHUTDOWN_ERROR: "SHUTDOWN_ERROR",
37
+
38
+ // Job control errors (US-6)
39
+ JOB_CANCEL_ERROR: "JOB_CANCEL_ERROR",
40
+ JOB_FORK_ERROR: "JOB_FORK_ERROR",
41
+ } as const;
42
+
43
+ export type FleetManagerErrorCode =
44
+ (typeof FleetManagerErrorCode)[keyof typeof FleetManagerErrorCode];
45
+
46
+ // =============================================================================
47
+ // Base Error Class
48
+ // =============================================================================
49
+
50
+ /**
51
+ * Base error class for all fleet manager errors
52
+ *
53
+ * All fleet manager errors extend this class and include:
54
+ * - A unique error code for programmatic handling
55
+ * - Descriptive error messages
56
+ * - Optional cause for error chaining
57
+ */
58
+ export class FleetManagerError extends Error {
59
+ /** Error code for programmatic handling */
60
+ public readonly code: FleetManagerErrorCode;
61
+
62
+ constructor(
63
+ message: string,
64
+ options?: { cause?: Error; code?: FleetManagerErrorCode }
65
+ ) {
66
+ super(message);
67
+ this.name = "FleetManagerError";
68
+ this.cause = options?.cause;
69
+ this.code = options?.code ?? FleetManagerErrorCode.FLEET_MANAGER_ERROR;
70
+ }
71
+ }
72
+
73
+ // =============================================================================
74
+ // Configuration Errors
75
+ // =============================================================================
76
+
77
+ /**
78
+ * Validation error detail for configuration errors
79
+ */
80
+ export interface ValidationError {
81
+ /** Path to the invalid field (e.g., "agents[0].schedules[0].interval") */
82
+ path: string;
83
+ /** Description of the validation error */
84
+ message: string;
85
+ /** The invalid value, if available */
86
+ value?: unknown;
87
+ }
88
+
89
+ /**
90
+ * Error thrown when configuration is invalid or cannot be loaded
91
+ *
92
+ * This error is thrown when:
93
+ * - The configuration file cannot be found or read
94
+ * - The configuration YAML is malformed
95
+ * - The configuration fails schema validation
96
+ * - Agent definitions are invalid
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * try {
101
+ * await fleetManager.initialize();
102
+ * } catch (error) {
103
+ * if (error instanceof ConfigurationError) {
104
+ * console.error(`Config error at ${error.configPath}:`);
105
+ * for (const ve of error.validationErrors) {
106
+ * console.error(` - ${ve.path}: ${ve.message}`);
107
+ * }
108
+ * }
109
+ * }
110
+ * ```
111
+ */
112
+ export class ConfigurationError extends FleetManagerError {
113
+ /** The path to the configuration file that failed */
114
+ public readonly configPath?: string;
115
+
116
+ /** Detailed validation errors, if any */
117
+ public readonly validationErrors: ValidationError[];
118
+
119
+ constructor(
120
+ message: string,
121
+ options?: {
122
+ configPath?: string;
123
+ validationErrors?: ValidationError[];
124
+ cause?: Error;
125
+ }
126
+ ) {
127
+ const validationErrors = options?.validationErrors ?? [];
128
+ const fullMessage = ConfigurationError.buildMessage(
129
+ message,
130
+ options?.configPath,
131
+ validationErrors
132
+ );
133
+
134
+ super(fullMessage, {
135
+ cause: options?.cause,
136
+ code: FleetManagerErrorCode.CONFIGURATION_ERROR,
137
+ });
138
+ this.name = "ConfigurationError";
139
+ this.configPath = options?.configPath;
140
+ this.validationErrors = validationErrors;
141
+ }
142
+
143
+ /**
144
+ * Build a detailed error message including validation errors
145
+ */
146
+ private static buildMessage(
147
+ message: string,
148
+ configPath?: string,
149
+ validationErrors?: ValidationError[]
150
+ ): string {
151
+ const parts = [message];
152
+
153
+ if (configPath) {
154
+ parts.push(`Config file: ${configPath}`);
155
+ }
156
+
157
+ if (validationErrors && validationErrors.length > 0) {
158
+ parts.push("Validation errors:");
159
+ for (const ve of validationErrors) {
160
+ parts.push(` - ${ve.path}: ${ve.message}`);
161
+ }
162
+ }
163
+
164
+ return parts.join("\n");
165
+ }
166
+
167
+ /**
168
+ * Check if this error has validation errors
169
+ */
170
+ hasValidationErrors(): boolean {
171
+ return this.validationErrors.length > 0;
172
+ }
173
+ }
174
+
175
+ // =============================================================================
176
+ // Not Found Errors
177
+ // =============================================================================
178
+
179
+ /**
180
+ * Error thrown when a requested agent is not found
181
+ *
182
+ * This error is thrown when:
183
+ * - Attempting to run an agent that doesn't exist in the configuration
184
+ * - Attempting to get status for an unknown agent
185
+ * - Referencing an agent name that hasn't been defined
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * try {
190
+ * await fleetManager.runAgent('nonexistent-agent');
191
+ * } catch (error) {
192
+ * if (error instanceof AgentNotFoundError) {
193
+ * console.error(`Agent "${error.agentName}" not found`);
194
+ * console.log('Available agents:', fleetManager.getAgentNames());
195
+ * }
196
+ * }
197
+ * ```
198
+ */
199
+ export class AgentNotFoundError extends FleetManagerError {
200
+ /** The name of the agent that was not found */
201
+ public readonly agentName: string;
202
+
203
+ /** Optional list of available agent names for helpful error messages */
204
+ public readonly availableAgents?: string[];
205
+
206
+ constructor(
207
+ agentName: string,
208
+ options?: { availableAgents?: string[]; cause?: Error }
209
+ ) {
210
+ const message = AgentNotFoundError.buildMessage(
211
+ agentName,
212
+ options?.availableAgents
213
+ );
214
+ super(message, {
215
+ cause: options?.cause,
216
+ code: FleetManagerErrorCode.AGENT_NOT_FOUND,
217
+ });
218
+ this.name = "AgentNotFoundError";
219
+ this.agentName = agentName;
220
+ this.availableAgents = options?.availableAgents;
221
+ }
222
+
223
+ private static buildMessage(
224
+ agentName: string,
225
+ availableAgents?: string[]
226
+ ): string {
227
+ let message = `Agent "${agentName}" not found`;
228
+
229
+ if (availableAgents && availableAgents.length > 0) {
230
+ message += `. Available agents: ${availableAgents.join(", ")}`;
231
+ } else if (availableAgents && availableAgents.length === 0) {
232
+ message += ". No agents are configured.";
233
+ }
234
+
235
+ return message;
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Error thrown when a requested job is not found
241
+ *
242
+ * This error is thrown when:
243
+ * - Attempting to get status for a job that doesn't exist
244
+ * - Attempting to cancel a job that has already completed or doesn't exist
245
+ * - Referencing a job ID that is unknown
246
+ *
247
+ * @example
248
+ * ```typescript
249
+ * try {
250
+ * const status = await fleetManager.getJobStatus('unknown-job-id');
251
+ * } catch (error) {
252
+ * if (error instanceof JobNotFoundError) {
253
+ * console.error(`Job "${error.jobId}" not found`);
254
+ * }
255
+ * }
256
+ * ```
257
+ */
258
+ export class JobNotFoundError extends FleetManagerError {
259
+ /** The ID of the job that was not found */
260
+ public readonly jobId: string;
261
+
262
+ constructor(jobId: string, options?: { cause?: Error }) {
263
+ super(`Job "${jobId}" not found`, {
264
+ cause: options?.cause,
265
+ code: FleetManagerErrorCode.JOB_NOT_FOUND,
266
+ });
267
+ this.name = "JobNotFoundError";
268
+ this.jobId = jobId;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Error thrown when a requested schedule is not found
274
+ *
275
+ * This error is thrown when:
276
+ * - Attempting to trigger a schedule that doesn't exist
277
+ * - Attempting to enable/disable a schedule that doesn't exist
278
+ * - Referencing a schedule name that hasn't been defined for an agent
279
+ *
280
+ * @example
281
+ * ```typescript
282
+ * try {
283
+ * await fleetManager.triggerSchedule('my-agent', 'nonexistent-schedule');
284
+ * } catch (error) {
285
+ * if (error instanceof ScheduleNotFoundError) {
286
+ * console.error(
287
+ * `Schedule "${error.scheduleName}" not found for agent "${error.agentName}"`
288
+ * );
289
+ * }
290
+ * }
291
+ * ```
292
+ */
293
+ export class ScheduleNotFoundError extends FleetManagerError {
294
+ /** The name of the agent the schedule was expected to belong to */
295
+ public readonly agentName: string;
296
+
297
+ /** The name of the schedule that was not found */
298
+ public readonly scheduleName: string;
299
+
300
+ /** Optional list of available schedule names for helpful error messages */
301
+ public readonly availableSchedules?: string[];
302
+
303
+ constructor(
304
+ agentName: string,
305
+ scheduleName: string,
306
+ options?: { availableSchedules?: string[]; cause?: Error }
307
+ ) {
308
+ const message = ScheduleNotFoundError.buildMessage(
309
+ agentName,
310
+ scheduleName,
311
+ options?.availableSchedules
312
+ );
313
+ super(message, {
314
+ cause: options?.cause,
315
+ code: FleetManagerErrorCode.SCHEDULE_NOT_FOUND,
316
+ });
317
+ this.name = "ScheduleNotFoundError";
318
+ this.agentName = agentName;
319
+ this.scheduleName = scheduleName;
320
+ this.availableSchedules = options?.availableSchedules;
321
+ }
322
+
323
+ private static buildMessage(
324
+ agentName: string,
325
+ scheduleName: string,
326
+ availableSchedules?: string[]
327
+ ): string {
328
+ let message = `Schedule "${scheduleName}" not found for agent "${agentName}"`;
329
+
330
+ if (availableSchedules && availableSchedules.length > 0) {
331
+ message += `. Available schedules: ${availableSchedules.join(", ")}`;
332
+ } else if (availableSchedules && availableSchedules.length === 0) {
333
+ message += `. Agent "${agentName}" has no schedules configured.`;
334
+ }
335
+
336
+ return message;
337
+ }
338
+ }
339
+
340
+ // =============================================================================
341
+ // State Errors
342
+ // =============================================================================
343
+
344
+ /**
345
+ * Error thrown when an operation is attempted in an invalid state
346
+ *
347
+ * This error is thrown when:
348
+ * - start() is called before initialize()
349
+ * - initialize() is called when already initialized
350
+ * - Operations are attempted while in an incompatible state
351
+ * - State transitions are invalid
352
+ *
353
+ * @example
354
+ * ```typescript
355
+ * try {
356
+ * await fleetManager.start(); // without calling initialize() first
357
+ * } catch (error) {
358
+ * if (error instanceof InvalidStateError) {
359
+ * console.error(
360
+ * `Cannot ${error.operation}: current state is "${error.currentState}", ` +
361
+ * `expected "${error.expectedState}"`
362
+ * );
363
+ * }
364
+ * }
365
+ * ```
366
+ */
367
+ export class InvalidStateError extends FleetManagerError {
368
+ /** The current state of the fleet manager */
369
+ public readonly currentState: string;
370
+
371
+ /** The state(s) expected/required for the operation */
372
+ public readonly expectedState: string | string[];
373
+
374
+ /** The operation that was attempted */
375
+ public readonly operation: string;
376
+
377
+ constructor(
378
+ operation: string,
379
+ currentState: string,
380
+ expectedState: string | string[],
381
+ options?: { cause?: Error }
382
+ ) {
383
+ const expected = Array.isArray(expectedState)
384
+ ? expectedState.join(" or ")
385
+ : expectedState;
386
+
387
+ super(
388
+ `Cannot ${operation}: fleet manager is in "${currentState}" state, must be "${expected}"`,
389
+ {
390
+ cause: options?.cause,
391
+ code: FleetManagerErrorCode.INVALID_STATE,
392
+ }
393
+ );
394
+ this.name = "InvalidStateError";
395
+ this.operation = operation;
396
+ this.currentState = currentState;
397
+ this.expectedState = expectedState;
398
+ }
399
+ }
400
+
401
+ /**
402
+ * Error thrown when the fleet manager is not in the correct state for an operation
403
+ *
404
+ * @deprecated Use InvalidStateError instead. This class is kept for backwards compatibility.
405
+ */
406
+ export class FleetManagerStateError extends InvalidStateError {
407
+ constructor(
408
+ operation: string,
409
+ currentState: string,
410
+ requiredState: string | string[]
411
+ ) {
412
+ super(operation, currentState, requiredState);
413
+ this.name = "FleetManagerStateError";
414
+ }
415
+
416
+ /**
417
+ * Alias for expectedState for backwards compatibility
418
+ */
419
+ get requiredState(): string | string[] {
420
+ return this.expectedState;
421
+ }
422
+ }
423
+
424
+ // =============================================================================
425
+ // Operational Errors
426
+ // =============================================================================
427
+
428
+ /**
429
+ * Error thrown when an operation would exceed concurrency limits
430
+ *
431
+ * This error is thrown when:
432
+ * - Attempting to start a new job when the agent has reached its concurrent job limit
433
+ * - Attempting to run more jobs than the system allows
434
+ *
435
+ * @example
436
+ * ```typescript
437
+ * try {
438
+ * await fleetManager.runAgent('my-agent');
439
+ * } catch (error) {
440
+ * if (error instanceof ConcurrencyLimitError) {
441
+ * console.error(
442
+ * `Agent "${error.agentName}" has ${error.currentJobs}/${error.limit} jobs running. ` +
443
+ * `Please wait for a job to complete.`
444
+ * );
445
+ * }
446
+ * }
447
+ * ```
448
+ */
449
+ export class ConcurrencyLimitError extends FleetManagerError {
450
+ /** The name of the agent that hit the concurrency limit */
451
+ public readonly agentName: string;
452
+
453
+ /** The current number of running jobs for this agent */
454
+ public readonly currentJobs: number;
455
+
456
+ /** The maximum allowed concurrent jobs for this agent */
457
+ public readonly limit: number;
458
+
459
+ constructor(
460
+ agentName: string,
461
+ currentJobs: number,
462
+ limit: number,
463
+ options?: { cause?: Error }
464
+ ) {
465
+ super(
466
+ `Agent "${agentName}" has reached its concurrency limit: ${currentJobs}/${limit} jobs running`,
467
+ {
468
+ cause: options?.cause,
469
+ code: FleetManagerErrorCode.CONCURRENCY_LIMIT,
470
+ }
471
+ );
472
+ this.name = "ConcurrencyLimitError";
473
+ this.agentName = agentName;
474
+ this.currentJobs = currentJobs;
475
+ this.limit = limit;
476
+ }
477
+
478
+ /**
479
+ * Check if the limit is completely maxed out (no room for more jobs)
480
+ */
481
+ isAtLimit(): boolean {
482
+ return this.currentJobs >= this.limit;
483
+ }
484
+ }
485
+
486
+ // =============================================================================
487
+ // Configuration Loading Errors (kept for backwards compatibility)
488
+ // =============================================================================
489
+
490
+ /**
491
+ * Error thrown when configuration loading fails
492
+ *
493
+ * @deprecated Use ConfigurationError instead for new code.
494
+ * This class is kept for backwards compatibility.
495
+ */
496
+ export class FleetManagerConfigError extends FleetManagerError {
497
+ /** The path that was being loaded */
498
+ public readonly configPath?: string;
499
+
500
+ constructor(
501
+ message: string,
502
+ configPath?: string,
503
+ options?: { cause?: Error }
504
+ ) {
505
+ super(message, {
506
+ cause: options?.cause,
507
+ code: FleetManagerErrorCode.CONFIG_LOAD_ERROR,
508
+ });
509
+ this.name = "FleetManagerConfigError";
510
+ this.configPath = configPath;
511
+ }
512
+ }
513
+
514
+ // =============================================================================
515
+ // State Directory Errors
516
+ // =============================================================================
517
+
518
+ /**
519
+ * Error thrown when state directory initialization fails
520
+ *
521
+ * This wraps state directory errors with fleet manager context.
522
+ */
523
+ export class FleetManagerStateDirError extends FleetManagerError {
524
+ /** The state directory path */
525
+ public readonly stateDir: string;
526
+
527
+ constructor(message: string, stateDir: string, options?: { cause?: Error }) {
528
+ super(message, {
529
+ cause: options?.cause,
530
+ code: FleetManagerErrorCode.STATE_DIR_ERROR,
531
+ });
532
+ this.name = "FleetManagerStateDirError";
533
+ this.stateDir = stateDir;
534
+ }
535
+ }
536
+
537
+ // =============================================================================
538
+ // Shutdown Errors
539
+ // =============================================================================
540
+
541
+ /**
542
+ * Error thrown when fleet manager shutdown fails
543
+ *
544
+ * This is thrown when the fleet manager cannot shut down cleanly.
545
+ */
546
+ export class FleetManagerShutdownError extends FleetManagerError {
547
+ /** Whether the shutdown timed out */
548
+ public readonly timedOut: boolean;
549
+
550
+ constructor(
551
+ message: string,
552
+ options: { timedOut: boolean; cause?: Error }
553
+ ) {
554
+ super(message, {
555
+ cause: options.cause,
556
+ code: FleetManagerErrorCode.SHUTDOWN_ERROR,
557
+ });
558
+ this.name = "FleetManagerShutdownError";
559
+ this.timedOut = options.timedOut;
560
+ }
561
+
562
+ /**
563
+ * Check if the shutdown failed due to timeout
564
+ */
565
+ isTimeout(): boolean {
566
+ return this.timedOut;
567
+ }
568
+ }
569
+
570
+ // =============================================================================
571
+ // Job Control Errors (US-6)
572
+ // =============================================================================
573
+
574
+ /**
575
+ * Error thrown when job cancellation fails
576
+ *
577
+ * This error is thrown when:
578
+ * - The job process cannot be terminated
579
+ * - The job is in an invalid state for cancellation
580
+ * - An error occurs during the cancellation process
581
+ *
582
+ * @example
583
+ * ```typescript
584
+ * try {
585
+ * await manager.cancelJob('job-2024-01-15-abc123');
586
+ * } catch (error) {
587
+ * if (error instanceof JobCancelError) {
588
+ * console.error(`Failed to cancel job: ${error.message}`);
589
+ * console.error(`Job ID: ${error.jobId}`);
590
+ * }
591
+ * }
592
+ * ```
593
+ */
594
+ export class JobCancelError extends FleetManagerError {
595
+ /** The ID of the job that failed to cancel */
596
+ public readonly jobId: string;
597
+
598
+ /** The reason the cancellation failed */
599
+ public readonly reason: 'not_running' | 'process_error' | 'timeout' | 'unknown';
600
+
601
+ constructor(
602
+ jobId: string,
603
+ reason: 'not_running' | 'process_error' | 'timeout' | 'unknown',
604
+ options?: { message?: string; cause?: Error }
605
+ ) {
606
+ const defaultMessages: Record<typeof reason, string> = {
607
+ not_running: `Job "${jobId}" is not running and cannot be cancelled`,
608
+ process_error: `Failed to terminate process for job "${jobId}"`,
609
+ timeout: `Timeout waiting for job "${jobId}" to terminate`,
610
+ unknown: `Unknown error cancelling job "${jobId}"`,
611
+ };
612
+
613
+ super(options?.message ?? defaultMessages[reason], {
614
+ cause: options?.cause,
615
+ code: FleetManagerErrorCode.JOB_CANCEL_ERROR,
616
+ });
617
+ this.name = "JobCancelError";
618
+ this.jobId = jobId;
619
+ this.reason = reason;
620
+ }
621
+ }
622
+
623
+ /**
624
+ * Error thrown when job forking fails
625
+ *
626
+ * This error is thrown when:
627
+ * - The original job cannot be found
628
+ * - The original job has no session to fork
629
+ * - An error occurs during the fork process
630
+ *
631
+ * @example
632
+ * ```typescript
633
+ * try {
634
+ * await manager.forkJob('job-2024-01-15-abc123');
635
+ * } catch (error) {
636
+ * if (error instanceof JobForkError) {
637
+ * console.error(`Failed to fork job: ${error.message}`);
638
+ * console.error(`Original Job ID: ${error.originalJobId}`);
639
+ * }
640
+ * }
641
+ * ```
642
+ */
643
+ export class JobForkError extends FleetManagerError {
644
+ /** The ID of the original job that failed to fork */
645
+ public readonly originalJobId: string;
646
+
647
+ /** The reason the fork failed */
648
+ public readonly reason: 'no_session' | 'job_not_found' | 'agent_not_found' | 'unknown';
649
+
650
+ constructor(
651
+ originalJobId: string,
652
+ reason: 'no_session' | 'job_not_found' | 'agent_not_found' | 'unknown',
653
+ options?: { message?: string; cause?: Error }
654
+ ) {
655
+ const defaultMessages: Record<typeof reason, string> = {
656
+ no_session: `Job "${originalJobId}" has no session ID and cannot be forked`,
657
+ job_not_found: `Job "${originalJobId}" not found`,
658
+ agent_not_found: `Agent for job "${originalJobId}" not found`,
659
+ unknown: `Unknown error forking job "${originalJobId}"`,
660
+ };
661
+
662
+ super(options?.message ?? defaultMessages[reason], {
663
+ cause: options?.cause,
664
+ code: FleetManagerErrorCode.JOB_FORK_ERROR,
665
+ });
666
+ this.name = "JobForkError";
667
+ this.originalJobId = originalJobId;
668
+ this.reason = reason;
669
+ }
670
+ }
671
+
672
+ // =============================================================================
673
+ // Type Guards
674
+ // =============================================================================
675
+
676
+ /**
677
+ * Type guard to check if an error is a FleetManagerError
678
+ */
679
+ export function isFleetManagerError(error: unknown): error is FleetManagerError {
680
+ return error instanceof FleetManagerError;
681
+ }
682
+
683
+ /**
684
+ * Type guard to check if an error is a ConfigurationError
685
+ */
686
+ export function isConfigurationError(
687
+ error: unknown
688
+ ): error is ConfigurationError {
689
+ return error instanceof ConfigurationError;
690
+ }
691
+
692
+ /**
693
+ * Type guard to check if an error is an AgentNotFoundError
694
+ */
695
+ export function isAgentNotFoundError(
696
+ error: unknown
697
+ ): error is AgentNotFoundError {
698
+ return error instanceof AgentNotFoundError;
699
+ }
700
+
701
+ /**
702
+ * Type guard to check if an error is a JobNotFoundError
703
+ */
704
+ export function isJobNotFoundError(error: unknown): error is JobNotFoundError {
705
+ return error instanceof JobNotFoundError;
706
+ }
707
+
708
+ /**
709
+ * Type guard to check if an error is a ScheduleNotFoundError
710
+ */
711
+ export function isScheduleNotFoundError(
712
+ error: unknown
713
+ ): error is ScheduleNotFoundError {
714
+ return error instanceof ScheduleNotFoundError;
715
+ }
716
+
717
+ /**
718
+ * Type guard to check if an error is an InvalidStateError
719
+ */
720
+ export function isInvalidStateError(
721
+ error: unknown
722
+ ): error is InvalidStateError {
723
+ return error instanceof InvalidStateError;
724
+ }
725
+
726
+ /**
727
+ * Type guard to check if an error is a ConcurrencyLimitError
728
+ */
729
+ export function isConcurrencyLimitError(
730
+ error: unknown
731
+ ): error is ConcurrencyLimitError {
732
+ return error instanceof ConcurrencyLimitError;
733
+ }
734
+
735
+ /**
736
+ * Type guard to check if an error is a JobCancelError
737
+ */
738
+ export function isJobCancelError(error: unknown): error is JobCancelError {
739
+ return error instanceof JobCancelError;
740
+ }
741
+
742
+ /**
743
+ * Type guard to check if an error is a JobForkError
744
+ */
745
+ export function isJobForkError(error: unknown): error is JobForkError {
746
+ return error instanceof JobForkError;
747
+ }