@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,333 @@
1
+ /**
2
+ * Job executor for running agents with streaming output to job logs
3
+ *
4
+ * Manages the lifecycle of agent execution including:
5
+ * - Creating job records before execution
6
+ * - Streaming all SDK messages to job output in real-time
7
+ * - Updating job status and metadata on completion
8
+ */
9
+ import { join } from "node:path";
10
+ import { SDKInitializationError, SDKStreamingError, MalformedResponseError, wrapError, classifyError, buildErrorMessage, } from "./errors.js";
11
+ import { toSDKOptions } from "./sdk-adapter.js";
12
+ import { processSDKMessage, isTerminalMessage, extractSummary, } from "./message-processor.js";
13
+ import { createJob, updateJob, appendJobOutput, getJobOutputPath, updateSessionInfo, getSessionInfo, } from "../state/index.js";
14
+ // =============================================================================
15
+ // Default Logger
16
+ // =============================================================================
17
+ const defaultLogger = {
18
+ warn: (message) => console.warn(`[herdctl] ${message}`),
19
+ error: (message) => console.error(`[herdctl] ${message}`),
20
+ info: (message) => console.info(`[herdctl] ${message}`),
21
+ };
22
+ // =============================================================================
23
+ // Job Executor Class
24
+ // =============================================================================
25
+ /**
26
+ * Executes agents with streaming output to job logs
27
+ *
28
+ * This class manages the complete lifecycle of agent execution:
29
+ * 1. Creates a job record before starting
30
+ * 2. Updates job status to 'running'
31
+ * 3. Streams all SDK messages to job output in real-time
32
+ * 4. Updates job with final status on completion
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const executor = new JobExecutor(sdkQuery);
37
+ *
38
+ * const result = await executor.execute({
39
+ * agent: resolvedAgent,
40
+ * prompt: "Fix the bug in auth.ts",
41
+ * stateDir: "/path/to/.herdctl",
42
+ * triggerType: "manual",
43
+ * });
44
+ *
45
+ * console.log(`Job ${result.jobId} completed: ${result.success}`);
46
+ * ```
47
+ */
48
+ export class JobExecutor {
49
+ sdkQuery;
50
+ logger;
51
+ /**
52
+ * Create a new job executor
53
+ *
54
+ * @param sdkQuery - The SDK query function to use for agent execution
55
+ * @param options - Optional configuration
56
+ */
57
+ constructor(sdkQuery, options = {}) {
58
+ this.sdkQuery = sdkQuery;
59
+ this.logger = options.logger ?? defaultLogger;
60
+ }
61
+ /**
62
+ * Execute an agent and stream output to job log
63
+ *
64
+ * @param options - Runner options including agent config and prompt
65
+ * @returns Result of the execution including job ID and status
66
+ */
67
+ async execute(options) {
68
+ const { agent, prompt, stateDir, triggerType, schedule, onMessage } = options;
69
+ const jobsDir = join(stateDir, "jobs");
70
+ let job;
71
+ let sessionId;
72
+ let summary;
73
+ let lastError;
74
+ let errorDetails;
75
+ let messagesReceived = 0;
76
+ // Determine trigger type: use 'fork' if forking, otherwise use provided or default to 'manual'
77
+ const effectiveTriggerType = options.fork
78
+ ? "fork"
79
+ : (triggerType ?? "manual");
80
+ // Step 1: Create job record
81
+ try {
82
+ job = await createJob(jobsDir, {
83
+ agent: agent.name,
84
+ trigger_type: effectiveTriggerType,
85
+ prompt,
86
+ schedule,
87
+ forked_from: options.fork ? options.forkedFrom : undefined,
88
+ });
89
+ this.logger.info?.(`Created job ${job.id} for agent ${agent.name}`);
90
+ }
91
+ catch (error) {
92
+ this.logger.error(`Failed to create job: ${error.message}`);
93
+ throw error;
94
+ }
95
+ // Step 2: Update job status to 'running'
96
+ try {
97
+ await updateJob(jobsDir, job.id, {
98
+ status: "running",
99
+ });
100
+ }
101
+ catch (error) {
102
+ this.logger.warn(`Failed to update job status to running: ${error.message}`);
103
+ // Continue execution - job was created
104
+ }
105
+ // Step 3: Build SDK options
106
+ const sdkOptions = toSDKOptions(agent, {
107
+ resume: options.resume,
108
+ fork: options.fork ? true : undefined,
109
+ });
110
+ // Step 4: Execute agent and stream output
111
+ try {
112
+ let messages;
113
+ // Catch SDK initialization errors (e.g., missing API key)
114
+ try {
115
+ messages = this.sdkQuery({
116
+ prompt,
117
+ options: sdkOptions,
118
+ });
119
+ }
120
+ catch (initError) {
121
+ // Wrap initialization errors with context
122
+ throw new SDKInitializationError(buildErrorMessage(initError.message, {
123
+ jobId: job.id,
124
+ agentName: agent.name,
125
+ }), {
126
+ jobId: job.id,
127
+ agentName: agent.name,
128
+ cause: initError,
129
+ });
130
+ }
131
+ for await (const sdkMessage of messages) {
132
+ messagesReceived++;
133
+ // Process the message safely (handles malformed responses)
134
+ let processed;
135
+ try {
136
+ processed = processSDKMessage(sdkMessage);
137
+ }
138
+ catch (processError) {
139
+ // Log but don't crash on malformed messages
140
+ this.logger.warn(`Malformed SDK message received: ${processError.message}`);
141
+ // Write a warning to job output
142
+ try {
143
+ await appendJobOutput(jobsDir, job.id, {
144
+ type: "error",
145
+ message: `Malformed SDK message: ${processError.message}`,
146
+ code: "MALFORMED_MESSAGE",
147
+ });
148
+ }
149
+ catch {
150
+ // Ignore output write failures for malformed message warnings
151
+ }
152
+ // Continue processing other messages
153
+ continue;
154
+ }
155
+ // Write to job output immediately (no buffering)
156
+ try {
157
+ await appendJobOutput(jobsDir, job.id, processed.output);
158
+ }
159
+ catch (outputError) {
160
+ this.logger.warn(`Failed to write job output: ${outputError.message}`);
161
+ // Continue processing - don't fail execution due to logging issues
162
+ }
163
+ // Extract session ID if present
164
+ if (processed.sessionId) {
165
+ sessionId = processed.sessionId;
166
+ }
167
+ // Extract summary if present
168
+ const messageSummary = extractSummary(sdkMessage);
169
+ if (messageSummary) {
170
+ summary = messageSummary;
171
+ }
172
+ // Call user's onMessage callback if provided
173
+ if (onMessage) {
174
+ try {
175
+ await onMessage(sdkMessage);
176
+ }
177
+ catch (callbackError) {
178
+ this.logger.warn(`onMessage callback error: ${callbackError.message}`);
179
+ }
180
+ }
181
+ // Check for terminal messages
182
+ if (isTerminalMessage(sdkMessage)) {
183
+ if (sdkMessage.type === "error") {
184
+ const errorMessage = sdkMessage.message ?? "Agent execution failed";
185
+ lastError = new SDKStreamingError(buildErrorMessage(errorMessage, {
186
+ jobId: job.id,
187
+ agentName: agent.name,
188
+ }), {
189
+ jobId: job.id,
190
+ agentName: agent.name,
191
+ code: sdkMessage.code,
192
+ messagesReceived,
193
+ });
194
+ }
195
+ break;
196
+ }
197
+ }
198
+ }
199
+ catch (error) {
200
+ // Wrap the error with context if not already a RunnerError
201
+ lastError = wrapError(error, {
202
+ jobId: job.id,
203
+ agentName: agent.name,
204
+ phase: messagesReceived === 0 ? "init" : "streaming",
205
+ });
206
+ // Add messages received count for streaming errors
207
+ if (lastError instanceof SDKStreamingError && messagesReceived > 0) {
208
+ lastError.messagesReceived = messagesReceived;
209
+ }
210
+ // Log the error with context
211
+ this.logger.error(`${lastError.name}: ${lastError.message}`);
212
+ // Write error to job output with full context
213
+ try {
214
+ await appendJobOutput(jobsDir, job.id, {
215
+ type: "error",
216
+ message: lastError.message,
217
+ code: lastError.code ?? lastError.cause?.code,
218
+ stack: lastError.stack,
219
+ });
220
+ }
221
+ catch (outputError) {
222
+ this.logger.warn(`Failed to write error to job output: ${outputError.message}`);
223
+ }
224
+ }
225
+ // Build error details for programmatic access
226
+ if (lastError) {
227
+ errorDetails = {
228
+ message: lastError.message,
229
+ code: lastError.code ??
230
+ lastError.cause?.code,
231
+ stack: lastError.stack,
232
+ };
233
+ // Determine error type
234
+ if (lastError instanceof SDKInitializationError) {
235
+ errorDetails.type = "initialization";
236
+ errorDetails.recoverable = lastError.isNetworkError();
237
+ }
238
+ else if (lastError instanceof SDKStreamingError) {
239
+ errorDetails.type = "streaming";
240
+ errorDetails.recoverable = lastError.isRecoverable();
241
+ errorDetails.messagesReceived = lastError.messagesReceived;
242
+ }
243
+ else if (lastError instanceof MalformedResponseError) {
244
+ errorDetails.type = "malformed_response";
245
+ errorDetails.recoverable = false;
246
+ }
247
+ else {
248
+ errorDetails.type = "unknown";
249
+ errorDetails.recoverable = false;
250
+ }
251
+ }
252
+ // Step 5: Update job with final status
253
+ const success = !lastError;
254
+ const finishedAt = new Date().toISOString();
255
+ // Determine exit reason based on error classification
256
+ const exitReason = success ? "success" : classifyError(lastError);
257
+ try {
258
+ await updateJob(jobsDir, job.id, {
259
+ status: success ? "completed" : "failed",
260
+ finished_at: finishedAt,
261
+ session_id: sessionId,
262
+ summary,
263
+ exit_reason: exitReason,
264
+ output_file: getJobOutputPath(jobsDir, job.id),
265
+ });
266
+ }
267
+ catch (error) {
268
+ this.logger.warn(`Failed to update job final status: ${error.message}`);
269
+ }
270
+ // Step 6: Persist session info for resume capability
271
+ if (sessionId) {
272
+ try {
273
+ const sessionsDir = join(stateDir, "sessions");
274
+ // Get existing session to determine if updating or creating
275
+ const existingSession = await getSessionInfo(sessionsDir, agent.name);
276
+ await updateSessionInfo(sessionsDir, agent.name, {
277
+ session_id: sessionId,
278
+ job_count: (existingSession?.job_count ?? 0) + 1,
279
+ mode: existingSession?.mode ?? "autonomous",
280
+ });
281
+ this.logger.info?.(`Persisted session ${sessionId} for agent ${agent.name}`);
282
+ }
283
+ catch (sessionError) {
284
+ this.logger.warn(`Failed to persist session info: ${sessionError.message}`);
285
+ // Continue - session persistence is non-fatal
286
+ }
287
+ }
288
+ // Calculate duration
289
+ const startTime = new Date(job.started_at).getTime();
290
+ const endTime = new Date(finishedAt).getTime();
291
+ const durationSeconds = Math.round((endTime - startTime) / 1000);
292
+ return {
293
+ success,
294
+ jobId: job.id,
295
+ sessionId,
296
+ summary,
297
+ error: lastError,
298
+ errorDetails,
299
+ durationSeconds,
300
+ };
301
+ }
302
+ }
303
+ // =============================================================================
304
+ // Convenience Function
305
+ // =============================================================================
306
+ /**
307
+ * Execute an agent with streaming output to job log
308
+ *
309
+ * This is a convenience function that creates a JobExecutor and runs
310
+ * a single execution. For multiple executions, prefer creating a
311
+ * JobExecutor instance directly.
312
+ *
313
+ * @param sdkQuery - The SDK query function
314
+ * @param options - Runner options including agent config and prompt
315
+ * @param executorOptions - Optional executor configuration
316
+ * @returns Result of the execution
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * import { query } from "@anthropic-ai/claude-agent-sdk";
321
+ *
322
+ * const result = await executeJob(query, {
323
+ * agent: resolvedAgent,
324
+ * prompt: "Fix the bug",
325
+ * stateDir: "/path/to/.herdctl",
326
+ * });
327
+ * ```
328
+ */
329
+ export async function executeJob(sdkQuery, options, executorOptions = {}) {
330
+ const executor = new JobExecutor(sdkQuery, executorOptions);
331
+ return executor.execute(options);
332
+ }
333
+ //# sourceMappingURL=job-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-executor.js","sourceRoot":"","sources":["../../src/runner/job-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Message processor for transforming SDK messages to job output format
3
+ *
4
+ * Handles all Claude SDK message types and converts them to the format
5
+ * expected by the job output logging system. Includes robust handling
6
+ * of malformed or unexpected SDK responses.
7
+ */
8
+ import type { SDKMessage, ProcessedMessage } from "./types.js";
9
+ /**
10
+ * Process an SDK message into job output format
11
+ *
12
+ * Takes a message from the Claude Agent SDK and transforms it into
13
+ * the format expected by the job output logging system. This function
14
+ * handles malformed responses gracefully without crashing.
15
+ *
16
+ * @param message - The SDK message to process
17
+ * @returns Processed message with output and optional metadata
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const sdkMessage = { type: "assistant", content: "Hello!" };
22
+ * const { output, sessionId } = processSDKMessage(sdkMessage);
23
+ * await appendJobOutput(jobsDir, jobId, output);
24
+ * ```
25
+ */
26
+ export declare function processSDKMessage(message: SDKMessage): ProcessedMessage;
27
+ /**
28
+ * Check if a message indicates the end of execution
29
+ *
30
+ * @param message - The SDK message to check
31
+ * @returns true if this is a terminal message
32
+ */
33
+ export declare function isTerminalMessage(message: SDKMessage): boolean;
34
+ /**
35
+ * Extract the final summary from a message if present
36
+ *
37
+ * Looks for summaries in the following order:
38
+ * 1. Explicit `summary` field on the message (truncated to 500 chars)
39
+ * 2. Short assistant message content (≤500 chars, non-partial)
40
+ *
41
+ * @param message - The SDK message to extract summary from
42
+ * @returns Summary string if present, undefined otherwise
43
+ */
44
+ export declare function extractSummary(message: SDKMessage): string | undefined;
45
+ //# sourceMappingURL=message-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processor.d.ts","sourceRoot":"","sources":["../../src/runner/message-processor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmM/D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAwDvE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAwB9D;AAeD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAqBtE"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Message processor for transforming SDK messages to job output format
3
+ *
4
+ * Handles all Claude SDK message types and converts them to the format
5
+ * expected by the job output logging system. Includes robust handling
6
+ * of malformed or unexpected SDK responses.
7
+ */
8
+ // =============================================================================
9
+ // Validation Helpers
10
+ // =============================================================================
11
+ /**
12
+ * Safely extract a string value from an unknown field
13
+ */
14
+ function safeString(value) {
15
+ if (typeof value === "string") {
16
+ return value;
17
+ }
18
+ if (value === null || value === undefined) {
19
+ return undefined;
20
+ }
21
+ // Convert other types to string for safety
22
+ try {
23
+ return String(value);
24
+ }
25
+ catch {
26
+ return undefined;
27
+ }
28
+ }
29
+ /**
30
+ * Safely extract a boolean value from an unknown field
31
+ */
32
+ function safeBoolean(value) {
33
+ if (typeof value === "boolean") {
34
+ return value;
35
+ }
36
+ return undefined;
37
+ }
38
+ /**
39
+ * Check if a value is a valid SDK message type
40
+ */
41
+ function isValidMessageType(type) {
42
+ return (type === "system" ||
43
+ type === "assistant" ||
44
+ type === "tool_use" ||
45
+ type === "tool_result" ||
46
+ type === "error");
47
+ }
48
+ // =============================================================================
49
+ // Message Type Handlers
50
+ // =============================================================================
51
+ /**
52
+ * Process a system message from the SDK
53
+ *
54
+ * Session ID is specifically extracted from messages with subtype "init",
55
+ * as this is when the Claude SDK provides the session identifier.
56
+ */
57
+ function processSystemMessage(message) {
58
+ const output = {
59
+ type: "system",
60
+ };
61
+ if (message.content) {
62
+ output.content = message.content;
63
+ }
64
+ if (message.subtype) {
65
+ output.subtype = message.subtype;
66
+ }
67
+ // Extract session ID specifically from init messages
68
+ // The Claude SDK provides session_id in the system message with subtype "init"
69
+ const sessionId = message.subtype === "init" ? message.session_id : undefined;
70
+ return {
71
+ output,
72
+ sessionId,
73
+ };
74
+ }
75
+ /**
76
+ * Process an assistant message from the SDK
77
+ */
78
+ function processAssistantMessage(message) {
79
+ const output = {
80
+ type: "assistant",
81
+ };
82
+ if (message.content !== undefined) {
83
+ output.content = message.content;
84
+ }
85
+ if (message.partial !== undefined) {
86
+ output.partial = message.partial;
87
+ }
88
+ // Handle usage statistics
89
+ if (message.usage) {
90
+ const usage = message.usage;
91
+ output.usage = {};
92
+ if (usage.input_tokens !== undefined) {
93
+ output.usage.input_tokens = usage.input_tokens;
94
+ }
95
+ if (usage.output_tokens !== undefined) {
96
+ output.usage.output_tokens = usage.output_tokens;
97
+ }
98
+ }
99
+ return { output };
100
+ }
101
+ /**
102
+ * Process a tool use message from the SDK
103
+ */
104
+ function processToolUseMessage(message) {
105
+ // Tool name is required - try multiple possible field names
106
+ const toolName = message.tool_name ?? message.name ?? "unknown";
107
+ const output = {
108
+ type: "tool_use",
109
+ tool_name: toolName,
110
+ };
111
+ if (message.tool_use_id) {
112
+ output.tool_use_id = message.tool_use_id;
113
+ }
114
+ if (message.input !== undefined) {
115
+ output.input = message.input;
116
+ }
117
+ return { output };
118
+ }
119
+ /**
120
+ * Process a tool result message from the SDK
121
+ */
122
+ function processToolResultMessage(message) {
123
+ const output = {
124
+ type: "tool_result",
125
+ };
126
+ if (message.tool_use_id) {
127
+ output.tool_use_id = message.tool_use_id;
128
+ }
129
+ if (message.result !== undefined) {
130
+ output.result = message.result;
131
+ }
132
+ if (message.success !== undefined) {
133
+ output.success = message.success;
134
+ }
135
+ if (message.error !== undefined) {
136
+ output.error = message.error;
137
+ }
138
+ return { output };
139
+ }
140
+ /**
141
+ * Process an error message from the SDK
142
+ */
143
+ function processErrorMessage(message) {
144
+ const output = {
145
+ type: "error",
146
+ message: message.message ?? "Unknown error",
147
+ };
148
+ if (message.code) {
149
+ output.code = message.code;
150
+ }
151
+ if (message.stack) {
152
+ output.stack = message.stack;
153
+ }
154
+ return {
155
+ output,
156
+ isFinal: true,
157
+ };
158
+ }
159
+ // =============================================================================
160
+ // Main Processing Function
161
+ // =============================================================================
162
+ /**
163
+ * Process an SDK message into job output format
164
+ *
165
+ * Takes a message from the Claude Agent SDK and transforms it into
166
+ * the format expected by the job output logging system. This function
167
+ * handles malformed responses gracefully without crashing.
168
+ *
169
+ * @param message - The SDK message to process
170
+ * @returns Processed message with output and optional metadata
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * const sdkMessage = { type: "assistant", content: "Hello!" };
175
+ * const { output, sessionId } = processSDKMessage(sdkMessage);
176
+ * await appendJobOutput(jobsDir, jobId, output);
177
+ * ```
178
+ */
179
+ export function processSDKMessage(message) {
180
+ // Handle null/undefined messages - log as system warning, not error
181
+ // to avoid terminating execution due to malformed SDK responses
182
+ if (message === null || message === undefined) {
183
+ return {
184
+ output: {
185
+ type: "system",
186
+ content: "Received null or undefined SDK message",
187
+ subtype: "malformed_message",
188
+ },
189
+ };
190
+ }
191
+ // Handle non-object messages - log as system warning
192
+ if (typeof message !== "object") {
193
+ return {
194
+ output: {
195
+ type: "system",
196
+ content: `Expected object message, received ${typeof message}`,
197
+ subtype: "malformed_message",
198
+ },
199
+ };
200
+ }
201
+ // Validate message type
202
+ const messageType = message.type;
203
+ if (!isValidMessageType(messageType)) {
204
+ // Handle unknown or missing message types gracefully
205
+ const unknownType = safeString(messageType) ?? "undefined";
206
+ return {
207
+ output: {
208
+ type: "system",
209
+ content: `Unknown message type: ${unknownType}`,
210
+ subtype: "unknown_type",
211
+ },
212
+ };
213
+ }
214
+ // Process known message types
215
+ switch (messageType) {
216
+ case "system":
217
+ return processSystemMessage(message);
218
+ case "assistant":
219
+ return processAssistantMessage(message);
220
+ case "tool_use":
221
+ return processToolUseMessage(message);
222
+ case "tool_result":
223
+ return processToolResultMessage(message);
224
+ case "error":
225
+ return processErrorMessage(message);
226
+ }
227
+ }
228
+ /**
229
+ * Check if a message indicates the end of execution
230
+ *
231
+ * @param message - The SDK message to check
232
+ * @returns true if this is a terminal message
233
+ */
234
+ export function isTerminalMessage(message) {
235
+ // Handle null/undefined/non-object messages - these are not terminal
236
+ if (message === null || message === undefined || typeof message !== "object") {
237
+ return false;
238
+ }
239
+ // Error messages are terminal
240
+ if (message.type === "error") {
241
+ return true;
242
+ }
243
+ // System messages with certain subtypes indicate completion
244
+ if (message.type === "system") {
245
+ const subtype = message.subtype;
246
+ if (subtype === "end" ||
247
+ subtype === "complete" ||
248
+ subtype === "session_end") {
249
+ return true;
250
+ }
251
+ }
252
+ return false;
253
+ }
254
+ /** Maximum summary length in characters */
255
+ const MAX_SUMMARY_LENGTH = 500;
256
+ /**
257
+ * Truncate a string to maximum length, adding ellipsis if truncated
258
+ */
259
+ function truncateSummary(text) {
260
+ if (text.length <= MAX_SUMMARY_LENGTH) {
261
+ return text;
262
+ }
263
+ return text.slice(0, MAX_SUMMARY_LENGTH - 3) + "...";
264
+ }
265
+ /**
266
+ * Extract the final summary from a message if present
267
+ *
268
+ * Looks for summaries in the following order:
269
+ * 1. Explicit `summary` field on the message (truncated to 500 chars)
270
+ * 2. Short assistant message content (≤500 chars, non-partial)
271
+ *
272
+ * @param message - The SDK message to extract summary from
273
+ * @returns Summary string if present, undefined otherwise
274
+ */
275
+ export function extractSummary(message) {
276
+ // Handle null/undefined/non-object messages
277
+ if (message === null || message === undefined || typeof message !== "object") {
278
+ return undefined;
279
+ }
280
+ // Check for explicit summary field (truncate if too long)
281
+ if (message.summary) {
282
+ const summaryStr = String(message.summary);
283
+ return truncateSummary(summaryStr);
284
+ }
285
+ // For assistant messages, use content as potential summary
286
+ if (message.type === "assistant" && message.content && !message.partial) {
287
+ // Only use if it looks like a conclusion (short enough)
288
+ if (message.content.length <= MAX_SUMMARY_LENGTH) {
289
+ return message.content;
290
+ }
291
+ }
292
+ return undefined;
293
+ }
294
+ //# sourceMappingURL=message-processor.js.map