@herdctl/core 0.0.1 → 0.0.2

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 (275) hide show
  1. package/dist/config/__tests__/agent.test.js +31 -13
  2. package/dist/config/__tests__/agent.test.js.map +1 -1
  3. package/dist/config/__tests__/merge.test.js +9 -2
  4. package/dist/config/__tests__/merge.test.js.map +1 -1
  5. package/dist/config/__tests__/schema.test.js +350 -1
  6. package/dist/config/__tests__/schema.test.js.map +1 -1
  7. package/dist/config/index.d.ts +1 -1
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/index.js +3 -1
  10. package/dist/config/index.js.map +1 -1
  11. package/dist/config/schema.d.ts +828 -24
  12. package/dist/config/schema.d.ts.map +1 -1
  13. package/dist/config/schema.js +118 -6
  14. package/dist/config/schema.js.map +1 -1
  15. package/dist/fleet-manager/__tests__/coverage.test.js +11 -332
  16. package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
  17. package/dist/fleet-manager/__tests__/errors.test.js +1 -49
  18. package/dist/fleet-manager/__tests__/errors.test.js.map +1 -1
  19. package/dist/fleet-manager/__tests__/integration.test.js +109 -0
  20. package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
  21. package/dist/fleet-manager/__tests__/reload.test.js +1 -1
  22. package/dist/fleet-manager/__tests__/reload.test.js.map +1 -1
  23. package/dist/fleet-manager/config-reload.d.ts +164 -0
  24. package/dist/fleet-manager/config-reload.d.ts.map +1 -0
  25. package/dist/fleet-manager/config-reload.js +445 -0
  26. package/dist/fleet-manager/config-reload.js.map +1 -0
  27. package/dist/fleet-manager/context.d.ts +76 -0
  28. package/dist/fleet-manager/context.d.ts.map +1 -0
  29. package/dist/fleet-manager/context.js +11 -0
  30. package/dist/fleet-manager/context.js.map +1 -0
  31. package/dist/fleet-manager/errors.d.ts +0 -25
  32. package/dist/fleet-manager/errors.d.ts.map +1 -1
  33. package/dist/fleet-manager/errors.js +0 -38
  34. package/dist/fleet-manager/errors.js.map +1 -1
  35. package/dist/fleet-manager/event-emitters.d.ts +123 -0
  36. package/dist/fleet-manager/event-emitters.d.ts.map +1 -0
  37. package/dist/fleet-manager/event-emitters.js +136 -0
  38. package/dist/fleet-manager/event-emitters.js.map +1 -0
  39. package/dist/fleet-manager/event-types.d.ts +0 -15
  40. package/dist/fleet-manager/event-types.d.ts.map +1 -1
  41. package/dist/fleet-manager/fleet-manager.d.ts +40 -653
  42. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  43. package/dist/fleet-manager/fleet-manager.js +95 -1720
  44. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  45. package/dist/fleet-manager/index.d.ts +13 -2
  46. package/dist/fleet-manager/index.d.ts.map +1 -1
  47. package/dist/fleet-manager/index.js +19 -6
  48. package/dist/fleet-manager/index.js.map +1 -1
  49. package/dist/fleet-manager/job-control.d.ts +64 -0
  50. package/dist/fleet-manager/job-control.d.ts.map +1 -0
  51. package/dist/fleet-manager/job-control.js +296 -0
  52. package/dist/fleet-manager/job-control.js.map +1 -0
  53. package/dist/fleet-manager/log-streaming.d.ts +171 -0
  54. package/dist/fleet-manager/log-streaming.d.ts.map +1 -0
  55. package/dist/fleet-manager/log-streaming.js +503 -0
  56. package/dist/fleet-manager/log-streaming.js.map +1 -0
  57. package/dist/fleet-manager/schedule-executor.d.ts +63 -0
  58. package/dist/fleet-manager/schedule-executor.d.ts.map +1 -0
  59. package/dist/fleet-manager/schedule-executor.js +209 -0
  60. package/dist/fleet-manager/schedule-executor.js.map +1 -0
  61. package/dist/fleet-manager/schedule-management.d.ts +71 -0
  62. package/dist/fleet-manager/schedule-management.d.ts.map +1 -0
  63. package/dist/fleet-manager/schedule-management.js +171 -0
  64. package/dist/fleet-manager/schedule-management.js.map +1 -0
  65. package/dist/fleet-manager/status-queries.d.ts +105 -0
  66. package/dist/fleet-manager/status-queries.d.ts.map +1 -0
  67. package/dist/fleet-manager/status-queries.js +247 -0
  68. package/dist/fleet-manager/status-queries.js.map +1 -0
  69. package/dist/fleet-manager/types.d.ts +0 -39
  70. package/dist/fleet-manager/types.d.ts.map +1 -1
  71. package/dist/runner/__tests__/job-executor.test.js +206 -1
  72. package/dist/runner/__tests__/job-executor.test.js.map +1 -1
  73. package/dist/runner/job-executor.d.ts +9 -0
  74. package/dist/runner/job-executor.d.ts.map +1 -1
  75. package/dist/runner/job-executor.js +78 -4
  76. package/dist/runner/job-executor.js.map +1 -1
  77. package/dist/runner/types.d.ts +2 -0
  78. package/dist/runner/types.d.ts.map +1 -1
  79. package/dist/scheduler/__tests__/cron.test.d.ts +2 -0
  80. package/dist/scheduler/__tests__/cron.test.d.ts.map +1 -0
  81. package/dist/scheduler/__tests__/cron.test.js +867 -0
  82. package/dist/scheduler/__tests__/cron.test.js.map +1 -0
  83. package/dist/scheduler/__tests__/scheduler.test.js +164 -5
  84. package/dist/scheduler/__tests__/scheduler.test.js.map +1 -1
  85. package/dist/scheduler/cron.d.ts +126 -0
  86. package/dist/scheduler/cron.d.ts.map +1 -0
  87. package/dist/scheduler/cron.js +390 -0
  88. package/dist/scheduler/cron.js.map +1 -0
  89. package/dist/scheduler/errors.d.ts +81 -1
  90. package/dist/scheduler/errors.d.ts.map +1 -1
  91. package/dist/scheduler/errors.js +81 -6
  92. package/dist/scheduler/errors.js.map +1 -1
  93. package/dist/scheduler/index.d.ts +1 -0
  94. package/dist/scheduler/index.d.ts.map +1 -1
  95. package/dist/scheduler/index.js +2 -0
  96. package/dist/scheduler/index.js.map +1 -1
  97. package/dist/scheduler/schedule-runner.d.ts +2 -2
  98. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  99. package/dist/scheduler/schedule-runner.js +20 -8
  100. package/dist/scheduler/schedule-runner.js.map +1 -1
  101. package/dist/scheduler/scheduler.d.ts +4 -4
  102. package/dist/scheduler/scheduler.d.ts.map +1 -1
  103. package/dist/scheduler/scheduler.js +86 -20
  104. package/dist/scheduler/scheduler.js.map +1 -1
  105. package/dist/scheduler/types.d.ts +1 -1
  106. package/dist/scheduler/types.d.ts.map +1 -1
  107. package/dist/state/schemas/job-metadata.d.ts +2 -2
  108. package/package.json +33 -8
  109. package/.turbo/turbo-build.log +0 -4
  110. package/.turbo/turbo-test.log +0 -219
  111. package/.turbo/turbo-typecheck.log +0 -4
  112. package/coverage/base.css +0 -224
  113. package/coverage/block-navigation.js +0 -87
  114. package/coverage/coverage-final.json +0 -51
  115. package/coverage/favicon.png +0 -0
  116. package/coverage/index.html +0 -251
  117. package/coverage/prettify.css +0 -1
  118. package/coverage/prettify.js +0 -2
  119. package/coverage/sort-arrow-sprite.png +0 -0
  120. package/coverage/sorter.js +0 -210
  121. package/coverage/src/config/index.html +0 -191
  122. package/coverage/src/config/index.ts.html +0 -442
  123. package/coverage/src/config/interpolate.ts.html +0 -652
  124. package/coverage/src/config/loader.ts.html +0 -1501
  125. package/coverage/src/config/merge.ts.html +0 -823
  126. package/coverage/src/config/parser.ts.html +0 -1213
  127. package/coverage/src/config/schema.ts.html +0 -1123
  128. package/coverage/src/fleet-manager/errors.ts.html +0 -2326
  129. package/coverage/src/fleet-manager/event-types.ts.html +0 -1219
  130. package/coverage/src/fleet-manager/fleet-manager.ts.html +0 -7030
  131. package/coverage/src/fleet-manager/index.html +0 -206
  132. package/coverage/src/fleet-manager/index.ts.html +0 -469
  133. package/coverage/src/fleet-manager/job-manager.ts.html +0 -2074
  134. package/coverage/src/fleet-manager/job-queue.ts.html +0 -2479
  135. package/coverage/src/fleet-manager/types.ts.html +0 -2602
  136. package/coverage/src/index.html +0 -116
  137. package/coverage/src/index.ts.html +0 -181
  138. package/coverage/src/runner/errors.ts.html +0 -1006
  139. package/coverage/src/runner/index.html +0 -191
  140. package/coverage/src/runner/index.ts.html +0 -256
  141. package/coverage/src/runner/job-executor.ts.html +0 -1429
  142. package/coverage/src/runner/message-processor.ts.html +0 -1150
  143. package/coverage/src/runner/sdk-adapter.ts.html +0 -658
  144. package/coverage/src/runner/types.ts.html +0 -559
  145. package/coverage/src/scheduler/errors.ts.html +0 -388
  146. package/coverage/src/scheduler/index.html +0 -206
  147. package/coverage/src/scheduler/index.ts.html +0 -244
  148. package/coverage/src/scheduler/interval.ts.html +0 -652
  149. package/coverage/src/scheduler/schedule-runner.ts.html +0 -1411
  150. package/coverage/src/scheduler/schedule-state.ts.html +0 -718
  151. package/coverage/src/scheduler/scheduler.ts.html +0 -1795
  152. package/coverage/src/scheduler/types.ts.html +0 -733
  153. package/coverage/src/state/directory.ts.html +0 -736
  154. package/coverage/src/state/errors.ts.html +0 -376
  155. package/coverage/src/state/fleet-state.ts.html +0 -937
  156. package/coverage/src/state/index.html +0 -221
  157. package/coverage/src/state/index.ts.html +0 -322
  158. package/coverage/src/state/job-metadata.ts.html +0 -1420
  159. package/coverage/src/state/job-output.ts.html +0 -1033
  160. package/coverage/src/state/schemas/fleet-state.ts.html +0 -445
  161. package/coverage/src/state/schemas/index.html +0 -176
  162. package/coverage/src/state/schemas/index.ts.html +0 -286
  163. package/coverage/src/state/schemas/job-metadata.ts.html +0 -628
  164. package/coverage/src/state/schemas/job-output.ts.html +0 -616
  165. package/coverage/src/state/schemas/session-info.ts.html +0 -361
  166. package/coverage/src/state/session.ts.html +0 -844
  167. package/coverage/src/state/types.ts.html +0 -262
  168. package/coverage/src/state/utils/atomic.ts.html +0 -748
  169. package/coverage/src/state/utils/index.html +0 -146
  170. package/coverage/src/state/utils/index.ts.html +0 -103
  171. package/coverage/src/state/utils/reads.ts.html +0 -1621
  172. package/coverage/src/work-sources/adapters/github.ts.html +0 -3583
  173. package/coverage/src/work-sources/adapters/index.html +0 -131
  174. package/coverage/src/work-sources/adapters/index.ts.html +0 -277
  175. package/coverage/src/work-sources/errors.ts.html +0 -298
  176. package/coverage/src/work-sources/index.html +0 -176
  177. package/coverage/src/work-sources/index.ts.html +0 -529
  178. package/coverage/src/work-sources/manager.ts.html +0 -1324
  179. package/coverage/src/work-sources/registry.ts.html +0 -619
  180. package/coverage/src/work-sources/types.ts.html +0 -568
  181. package/dist/fleet-manager/__tests__/event-helpers.test.d.ts +0 -7
  182. package/dist/fleet-manager/__tests__/event-helpers.test.d.ts.map +0 -1
  183. package/dist/fleet-manager/__tests__/event-helpers.test.js +0 -368
  184. package/dist/fleet-manager/__tests__/event-helpers.test.js.map +0 -1
  185. package/src/config/__tests__/agent.test.ts +0 -864
  186. package/src/config/__tests__/interpolate.test.ts +0 -644
  187. package/src/config/__tests__/loader.test.ts +0 -784
  188. package/src/config/__tests__/merge.test.ts +0 -751
  189. package/src/config/__tests__/parser.test.ts +0 -533
  190. package/src/config/__tests__/schema.test.ts +0 -873
  191. package/src/config/index.ts +0 -119
  192. package/src/config/interpolate.ts +0 -189
  193. package/src/config/loader.ts +0 -472
  194. package/src/config/merge.ts +0 -246
  195. package/src/config/parser.ts +0 -376
  196. package/src/config/schema.ts +0 -346
  197. package/src/fleet-manager/__tests__/coverage.test.ts +0 -2869
  198. package/src/fleet-manager/__tests__/errors.test.ts +0 -660
  199. package/src/fleet-manager/__tests__/event-helpers.test.ts +0 -448
  200. package/src/fleet-manager/__tests__/integration.test.ts +0 -1209
  201. package/src/fleet-manager/__tests__/job-control.test.ts +0 -283
  202. package/src/fleet-manager/__tests__/job-manager.test.ts +0 -869
  203. package/src/fleet-manager/__tests__/job-queue.test.ts +0 -401
  204. package/src/fleet-manager/__tests__/reload.test.ts +0 -751
  205. package/src/fleet-manager/__tests__/status-queries.test.ts +0 -595
  206. package/src/fleet-manager/__tests__/trigger.test.ts +0 -601
  207. package/src/fleet-manager/errors.ts +0 -747
  208. package/src/fleet-manager/event-types.ts +0 -378
  209. package/src/fleet-manager/fleet-manager.ts +0 -2315
  210. package/src/fleet-manager/index.ts +0 -128
  211. package/src/fleet-manager/job-manager.ts +0 -663
  212. package/src/fleet-manager/job-queue.ts +0 -798
  213. package/src/fleet-manager/types.ts +0 -839
  214. package/src/index.ts +0 -32
  215. package/src/runner/__tests__/errors.test.ts +0 -382
  216. package/src/runner/__tests__/job-executor.test.ts +0 -1708
  217. package/src/runner/__tests__/message-processor.test.ts +0 -960
  218. package/src/runner/__tests__/sdk-adapter.test.ts +0 -626
  219. package/src/runner/errors.ts +0 -307
  220. package/src/runner/index.ts +0 -57
  221. package/src/runner/job-executor.ts +0 -448
  222. package/src/runner/message-processor.ts +0 -355
  223. package/src/runner/sdk-adapter.ts +0 -191
  224. package/src/runner/types.ts +0 -158
  225. package/src/scheduler/__tests__/errors.test.ts +0 -159
  226. package/src/scheduler/__tests__/interval.test.ts +0 -515
  227. package/src/scheduler/__tests__/schedule-runner.test.ts +0 -798
  228. package/src/scheduler/__tests__/schedule-state.test.ts +0 -671
  229. package/src/scheduler/__tests__/scheduler.test.ts +0 -1280
  230. package/src/scheduler/errors.ts +0 -101
  231. package/src/scheduler/index.ts +0 -53
  232. package/src/scheduler/interval.ts +0 -189
  233. package/src/scheduler/schedule-runner.ts +0 -442
  234. package/src/scheduler/schedule-state.ts +0 -211
  235. package/src/scheduler/scheduler.ts +0 -570
  236. package/src/scheduler/types.ts +0 -216
  237. package/src/state/__tests__/directory.test.ts +0 -595
  238. package/src/state/__tests__/fleet-state.test.ts +0 -868
  239. package/src/state/__tests__/job-metadata-schema.test.ts +0 -414
  240. package/src/state/__tests__/job-metadata.test.ts +0 -831
  241. package/src/state/__tests__/job-output.test.ts +0 -856
  242. package/src/state/__tests__/session-schema.test.ts +0 -378
  243. package/src/state/__tests__/session.test.ts +0 -604
  244. package/src/state/directory.ts +0 -217
  245. package/src/state/errors.ts +0 -97
  246. package/src/state/fleet-state.ts +0 -284
  247. package/src/state/index.ts +0 -79
  248. package/src/state/job-metadata.ts +0 -445
  249. package/src/state/job-output.ts +0 -316
  250. package/src/state/schemas/__tests__/job-output.test.ts +0 -338
  251. package/src/state/schemas/fleet-state.ts +0 -120
  252. package/src/state/schemas/index.ts +0 -67
  253. package/src/state/schemas/job-metadata.ts +0 -181
  254. package/src/state/schemas/job-output.ts +0 -177
  255. package/src/state/schemas/session-info.ts +0 -92
  256. package/src/state/session.ts +0 -253
  257. package/src/state/types.ts +0 -59
  258. package/src/state/utils/__tests__/atomic.test.ts +0 -723
  259. package/src/state/utils/__tests__/reads.test.ts +0 -1071
  260. package/src/state/utils/atomic.ts +0 -221
  261. package/src/state/utils/index.ts +0 -6
  262. package/src/state/utils/reads.ts +0 -512
  263. package/src/work-sources/__tests__/github.test.ts +0 -1800
  264. package/src/work-sources/__tests__/manager.test.ts +0 -529
  265. package/src/work-sources/__tests__/registry.test.ts +0 -477
  266. package/src/work-sources/__tests__/types.test.ts +0 -479
  267. package/src/work-sources/adapters/github.ts +0 -1166
  268. package/src/work-sources/adapters/index.ts +0 -64
  269. package/src/work-sources/errors.ts +0 -71
  270. package/src/work-sources/index.ts +0 -148
  271. package/src/work-sources/manager.ts +0 -413
  272. package/src/work-sources/registry.ts +0 -178
  273. package/src/work-sources/types.ts +0 -161
  274. package/tsconfig.json +0 -9
  275. package/vitest.config.ts +0 -19
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Status Queries Module
3
+ *
4
+ * Centralizes all status query logic for FleetManager.
5
+ * Provides methods to query fleet status, agent information, and related helpers.
6
+ *
7
+ * @module status-queries
8
+ */
9
+ import type { ResolvedAgent } from "../config/index.js";
10
+ import type { AgentState, FleetState } from "../state/schemas/fleet-state.js";
11
+ import type { Scheduler } from "../scheduler/index.js";
12
+ import type { FleetStatus, AgentInfo, ScheduleInfo, FleetCounts } from "./types.js";
13
+ import type { FleetManagerContext } from "./context.js";
14
+ /**
15
+ * Snapshot of fleet state from disk
16
+ *
17
+ * This is an alias for FleetState with required agents field
18
+ * (since we always ensure it's populated even if empty).
19
+ */
20
+ export type FleetStateSnapshot = FleetState;
21
+ /**
22
+ * StatusQueries provides all status query operations for the FleetManager.
23
+ *
24
+ * This class encapsulates the logic for querying fleet status, agent information,
25
+ * and related data using the FleetManagerContext pattern.
26
+ */
27
+ export declare class StatusQueries {
28
+ private ctx;
29
+ constructor(ctx: FleetManagerContext);
30
+ /**
31
+ * Read fleet state from disk for status queries
32
+ *
33
+ * This provides a consistent snapshot of the fleet state.
34
+ *
35
+ * @returns Fleet state snapshot with agents and fleet-level state
36
+ */
37
+ readFleetStateSnapshot(): Promise<FleetStateSnapshot>;
38
+ /**
39
+ * Get overall fleet status
40
+ *
41
+ * Returns a comprehensive snapshot of the fleet state including:
42
+ * - Current state and uptime
43
+ * - Agent counts (total, idle, running, error)
44
+ * - Job counts
45
+ * - Scheduler information
46
+ *
47
+ * This method works whether the fleet is running or stopped.
48
+ *
49
+ * @returns A consistent FleetStatus snapshot
50
+ */
51
+ getFleetStatus(): Promise<FleetStatus>;
52
+ /**
53
+ * Get information about all configured agents
54
+ *
55
+ * Returns detailed information for each agent including:
56
+ * - Current status and job information
57
+ * - Schedule details with runtime state
58
+ * - Configuration details
59
+ *
60
+ * This method works whether the fleet is running or stopped.
61
+ *
62
+ * @returns Array of AgentInfo objects with current state
63
+ */
64
+ getAgentInfo(): Promise<AgentInfo[]>;
65
+ /**
66
+ * Get information about a specific agent by name
67
+ *
68
+ * Returns detailed information for the specified agent including:
69
+ * - Current status and job information
70
+ * - Schedule details with runtime state
71
+ * - Configuration details
72
+ *
73
+ * This method works whether the fleet is running or stopped.
74
+ *
75
+ * @param name - The agent name to look up
76
+ * @returns AgentInfo for the specified agent
77
+ * @throws {AgentNotFoundError} If no agent with that name exists
78
+ */
79
+ getAgentInfoByName(name: string): Promise<AgentInfo>;
80
+ }
81
+ /**
82
+ * Build AgentInfo from configuration and state
83
+ *
84
+ * @param agent - Resolved agent configuration
85
+ * @param agentState - Runtime agent state (optional)
86
+ * @param scheduler - Scheduler instance for running job counts (optional)
87
+ * @returns Complete AgentInfo object
88
+ */
89
+ export declare function buildAgentInfo(agent: ResolvedAgent, agentState?: AgentState, scheduler?: Scheduler | null): AgentInfo;
90
+ /**
91
+ * Build schedule info list from agent configuration and state
92
+ *
93
+ * @param agent - Resolved agent configuration
94
+ * @param agentState - Runtime agent state (optional)
95
+ * @returns Array of ScheduleInfo objects
96
+ */
97
+ export declare function buildScheduleInfoList(agent: ResolvedAgent, agentState?: AgentState): ScheduleInfo[];
98
+ /**
99
+ * Compute fleet counts from agent info list
100
+ *
101
+ * @param agentInfoList - List of AgentInfo objects
102
+ * @returns FleetCounts with summary statistics
103
+ */
104
+ export declare function computeFleetCounts(agentInfoList: AgentInfo[]): FleetCounts;
105
+ //# sourceMappingURL=status-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-queries.d.ts","sourceRoot":"","sources":["../../src/fleet-manager/status-queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAOxD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAM5C;;;;;GAKG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,mBAAmB;IAE5C;;;;;;OAMG;IACG,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAc3D;;;;;;;;;;;;OAYG;IACG,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAuC5C;;;;;;;;;;;OAWG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAa1C;;;;;;;;;;;;;OAaG;IACG,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAe3D;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,UAAU,EACvB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,GAC3B,SAAS,CA6BX;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,UAAU,CAAC,EAAE,UAAU,GACtB,YAAY,EAAE,CAoBhB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,SAAS,EAAE,GAAG,WAAW,CAwC1E"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Status Queries Module
3
+ *
4
+ * Centralizes all status query logic for FleetManager.
5
+ * Provides methods to query fleet status, agent information, and related helpers.
6
+ *
7
+ * @module status-queries
8
+ */
9
+ import { readFleetState } from "../state/fleet-state.js";
10
+ import { AgentNotFoundError } from "./errors.js";
11
+ // =============================================================================
12
+ // StatusQueries Class
13
+ // =============================================================================
14
+ /**
15
+ * StatusQueries provides all status query operations for the FleetManager.
16
+ *
17
+ * This class encapsulates the logic for querying fleet status, agent information,
18
+ * and related data using the FleetManagerContext pattern.
19
+ */
20
+ export class StatusQueries {
21
+ ctx;
22
+ constructor(ctx) {
23
+ this.ctx = ctx;
24
+ }
25
+ /**
26
+ * Read fleet state from disk for status queries
27
+ *
28
+ * This provides a consistent snapshot of the fleet state.
29
+ *
30
+ * @returns Fleet state snapshot with agents and fleet-level state
31
+ */
32
+ async readFleetStateSnapshot() {
33
+ const stateDirInfo = this.ctx.getStateDirInfo();
34
+ const logger = this.ctx.getLogger();
35
+ if (!stateDirInfo) {
36
+ // Not initialized yet, return empty state
37
+ return { fleet: {}, agents: {} };
38
+ }
39
+ return await readFleetState(stateDirInfo.stateFile, {
40
+ logger: { warn: logger.warn },
41
+ });
42
+ }
43
+ /**
44
+ * Get overall fleet status
45
+ *
46
+ * Returns a comprehensive snapshot of the fleet state including:
47
+ * - Current state and uptime
48
+ * - Agent counts (total, idle, running, error)
49
+ * - Job counts
50
+ * - Scheduler information
51
+ *
52
+ * This method works whether the fleet is running or stopped.
53
+ *
54
+ * @returns A consistent FleetStatus snapshot
55
+ */
56
+ async getFleetStatus() {
57
+ // Get agent info to compute counts
58
+ const agentInfoList = await this.getAgentInfo();
59
+ // Compute counts from agent info
60
+ const counts = computeFleetCounts(agentInfoList);
61
+ // Compute uptime
62
+ const startedAt = this.ctx.getStartedAt();
63
+ const stoppedAt = this.ctx.getStoppedAt();
64
+ let uptimeSeconds = null;
65
+ if (startedAt) {
66
+ const startTime = new Date(startedAt).getTime();
67
+ const endTime = stoppedAt ? new Date(stoppedAt).getTime() : Date.now();
68
+ uptimeSeconds = Math.floor((endTime - startTime) / 1000);
69
+ }
70
+ // Get scheduler state
71
+ const scheduler = this.ctx.getScheduler();
72
+ const schedulerState = scheduler?.getState();
73
+ return {
74
+ state: this.ctx.getStatus(),
75
+ uptimeSeconds,
76
+ initializedAt: this.ctx.getInitializedAt(),
77
+ startedAt,
78
+ stoppedAt,
79
+ counts,
80
+ scheduler: {
81
+ status: schedulerState?.status ?? "stopped",
82
+ checkCount: schedulerState?.checkCount ?? 0,
83
+ triggerCount: schedulerState?.triggerCount ?? 0,
84
+ lastCheckAt: schedulerState?.lastCheckAt ?? null,
85
+ checkIntervalMs: this.ctx.getCheckInterval(),
86
+ },
87
+ lastError: this.ctx.getLastError(),
88
+ };
89
+ }
90
+ /**
91
+ * Get information about all configured agents
92
+ *
93
+ * Returns detailed information for each agent including:
94
+ * - Current status and job information
95
+ * - Schedule details with runtime state
96
+ * - Configuration details
97
+ *
98
+ * This method works whether the fleet is running or stopped.
99
+ *
100
+ * @returns Array of AgentInfo objects with current state
101
+ */
102
+ async getAgentInfo() {
103
+ const config = this.ctx.getConfig();
104
+ const agents = config?.agents ?? [];
105
+ // Read fleet state for runtime information
106
+ const fleetState = await this.readFleetStateSnapshot();
107
+ return agents.map((agent) => {
108
+ const agentState = fleetState.agents[agent.name];
109
+ return buildAgentInfo(agent, agentState, this.ctx.getScheduler());
110
+ });
111
+ }
112
+ /**
113
+ * Get information about a specific agent by name
114
+ *
115
+ * Returns detailed information for the specified agent including:
116
+ * - Current status and job information
117
+ * - Schedule details with runtime state
118
+ * - Configuration details
119
+ *
120
+ * This method works whether the fleet is running or stopped.
121
+ *
122
+ * @param name - The agent name to look up
123
+ * @returns AgentInfo for the specified agent
124
+ * @throws {AgentNotFoundError} If no agent with that name exists
125
+ */
126
+ async getAgentInfoByName(name) {
127
+ const config = this.ctx.getConfig();
128
+ const agents = config?.agents ?? [];
129
+ const agent = agents.find((a) => a.name === name);
130
+ if (!agent) {
131
+ throw new AgentNotFoundError(name);
132
+ }
133
+ // Read fleet state for runtime information
134
+ const fleetState = await this.readFleetStateSnapshot();
135
+ const agentState = fleetState.agents[name];
136
+ return buildAgentInfo(agent, agentState, this.ctx.getScheduler());
137
+ }
138
+ }
139
+ // =============================================================================
140
+ // Helper Functions
141
+ // =============================================================================
142
+ /**
143
+ * Build AgentInfo from configuration and state
144
+ *
145
+ * @param agent - Resolved agent configuration
146
+ * @param agentState - Runtime agent state (optional)
147
+ * @param scheduler - Scheduler instance for running job counts (optional)
148
+ * @returns Complete AgentInfo object
149
+ */
150
+ export function buildAgentInfo(agent, agentState, scheduler) {
151
+ // Build schedule info
152
+ const schedules = buildScheduleInfoList(agent, agentState);
153
+ // Get running count from scheduler or state
154
+ const runningCount = scheduler?.getRunningJobCount(agent.name) ?? 0;
155
+ // Determine workspace path
156
+ let workspace;
157
+ if (typeof agent.workspace === "string") {
158
+ workspace = agent.workspace;
159
+ }
160
+ else if (agent.workspace?.root) {
161
+ workspace = agent.workspace.root;
162
+ }
163
+ return {
164
+ name: agent.name,
165
+ description: agent.description,
166
+ status: agentState?.status ?? "idle",
167
+ currentJobId: agentState?.current_job ?? null,
168
+ lastJobId: agentState?.last_job ?? null,
169
+ maxConcurrent: agent.instances?.max_concurrent ?? 1,
170
+ runningCount,
171
+ errorMessage: agentState?.error_message ?? null,
172
+ scheduleCount: schedules.length,
173
+ schedules,
174
+ model: agent.model,
175
+ workspace,
176
+ };
177
+ }
178
+ /**
179
+ * Build schedule info list from agent configuration and state
180
+ *
181
+ * @param agent - Resolved agent configuration
182
+ * @param agentState - Runtime agent state (optional)
183
+ * @returns Array of ScheduleInfo objects
184
+ */
185
+ export function buildScheduleInfoList(agent, agentState) {
186
+ if (!agent.schedules) {
187
+ return [];
188
+ }
189
+ return Object.entries(agent.schedules).map(([name, schedule]) => {
190
+ const scheduleState = agentState?.schedules?.[name];
191
+ return {
192
+ name,
193
+ agentName: agent.name,
194
+ type: schedule.type,
195
+ interval: schedule.interval,
196
+ expression: schedule.expression,
197
+ status: scheduleState?.status ?? "idle",
198
+ lastRunAt: scheduleState?.last_run_at ?? null,
199
+ nextRunAt: scheduleState?.next_run_at ?? null,
200
+ lastError: scheduleState?.last_error ?? null,
201
+ };
202
+ });
203
+ }
204
+ /**
205
+ * Compute fleet counts from agent info list
206
+ *
207
+ * @param agentInfoList - List of AgentInfo objects
208
+ * @returns FleetCounts with summary statistics
209
+ */
210
+ export function computeFleetCounts(agentInfoList) {
211
+ let idleAgents = 0;
212
+ let runningAgents = 0;
213
+ let errorAgents = 0;
214
+ let totalSchedules = 0;
215
+ let runningSchedules = 0;
216
+ let runningJobs = 0;
217
+ for (const agent of agentInfoList) {
218
+ switch (agent.status) {
219
+ case "idle":
220
+ idleAgents++;
221
+ break;
222
+ case "running":
223
+ runningAgents++;
224
+ break;
225
+ case "error":
226
+ errorAgents++;
227
+ break;
228
+ }
229
+ totalSchedules += agent.scheduleCount;
230
+ runningJobs += agent.runningCount;
231
+ for (const schedule of agent.schedules) {
232
+ if (schedule.status === "running") {
233
+ runningSchedules++;
234
+ }
235
+ }
236
+ }
237
+ return {
238
+ totalAgents: agentInfoList.length,
239
+ idleAgents,
240
+ runningAgents,
241
+ errorAgents,
242
+ totalSchedules,
243
+ runningSchedules,
244
+ runningJobs,
245
+ };
246
+ }
247
+ //# sourceMappingURL=status-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-queries.js","sourceRoot":"","sources":["../../src/fleet-manager/status-queries.ts"],"names":[],"mappings":"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"}
@@ -93,45 +93,6 @@ export interface FleetManagerState {
93
93
  */
94
94
  lastError: string | null;
95
95
  }
96
- /**
97
- * Events emitted by the FleetManager
98
- *
99
- * @deprecated Use FleetManagerEventMap from ./event-types.js for strongly-typed events.
100
- * This interface is kept for backwards compatibility but may be removed in a future version.
101
- */
102
- export interface FleetManagerEvents {
103
- /**
104
- * Emitted when initialization completes successfully
105
- */
106
- initialized: [];
107
- /**
108
- * Emitted when the fleet manager starts running
109
- */
110
- started: [];
111
- /**
112
- * Emitted when the fleet manager stops
113
- */
114
- stopped: [];
115
- /**
116
- * Emitted when an error occurs
117
- */
118
- error: [error: Error];
119
- /**
120
- * Emitted when a schedule triggers an agent run
121
- * @deprecated Use 'schedule:triggered' event instead
122
- */
123
- "schedule:trigger": [agentName: string, scheduleName: string];
124
- /**
125
- * Emitted when an agent run completes successfully
126
- * @deprecated Use 'job:completed' event instead
127
- */
128
- "schedule:complete": [agentName: string, scheduleName: string];
129
- /**
130
- * Emitted when an agent run fails
131
- * @deprecated Use 'job:failed' event instead
132
- */
133
- "schedule:error": [agentName: string, scheduleName: string, error: Error];
134
- }
135
96
  /**
136
97
  * Schedule information within an AgentInfo
137
98
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fleet-manager/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/fleet-manager/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { mkdir, rm, realpath } from "node:fs/promises";
2
+ import { mkdir, rm, realpath, readFile, stat } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { tmpdir } from "node:os";
5
5
  import { JobExecutor, executeJob } from "../job-executor.js";
@@ -1342,4 +1342,209 @@ describe("error handling (US-7)", () => {
1342
1342
  });
1343
1343
  });
1344
1344
  });
1345
+ // =============================================================================
1346
+ // Output to file tests (US-9)
1347
+ // =============================================================================
1348
+ describe("outputToFile (US-9)", () => {
1349
+ let tempDir;
1350
+ let stateDir;
1351
+ beforeEach(async () => {
1352
+ tempDir = await createTempDir();
1353
+ stateDir = join(tempDir, ".herdctl");
1354
+ await initStateDirectory({ path: stateDir });
1355
+ });
1356
+ afterEach(async () => {
1357
+ await rm(tempDir, { recursive: true, force: true });
1358
+ });
1359
+ it("creates job output directory when outputToFile is true", async () => {
1360
+ const messages = [
1361
+ { type: "system", content: "Init" },
1362
+ { type: "assistant", content: "Hello" },
1363
+ ];
1364
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1365
+ logger: createMockLogger(),
1366
+ });
1367
+ const result = await executor.execute({
1368
+ agent: createTestAgent(),
1369
+ prompt: "Test prompt",
1370
+ stateDir,
1371
+ outputToFile: true,
1372
+ });
1373
+ // Verify directory was created
1374
+ const jobOutputDir = join(stateDir, "jobs", result.jobId);
1375
+ const dirStat = await stat(jobOutputDir);
1376
+ expect(dirStat.isDirectory()).toBe(true);
1377
+ });
1378
+ it("writes output.log file when outputToFile is true", async () => {
1379
+ const messages = [
1380
+ { type: "system", content: "Init" },
1381
+ { type: "assistant", content: "Hello world" },
1382
+ ];
1383
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1384
+ logger: createMockLogger(),
1385
+ });
1386
+ const result = await executor.execute({
1387
+ agent: createTestAgent(),
1388
+ prompt: "Test prompt",
1389
+ stateDir,
1390
+ outputToFile: true,
1391
+ });
1392
+ // Verify output.log file exists
1393
+ const outputLogPath = join(stateDir, "jobs", result.jobId, "output.log");
1394
+ const logContent = await readFile(outputLogPath, "utf-8");
1395
+ expect(logContent).toContain("[SYSTEM] Init");
1396
+ expect(logContent).toContain("[ASSISTANT] Hello world");
1397
+ });
1398
+ it("does not create job output directory when outputToFile is false", async () => {
1399
+ const messages = [
1400
+ { type: "system", content: "Init" },
1401
+ { type: "assistant", content: "Hello" },
1402
+ ];
1403
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1404
+ logger: createMockLogger(),
1405
+ });
1406
+ const result = await executor.execute({
1407
+ agent: createTestAgent(),
1408
+ prompt: "Test prompt",
1409
+ stateDir,
1410
+ outputToFile: false,
1411
+ });
1412
+ // Verify directory was NOT created
1413
+ const jobOutputDir = join(stateDir, "jobs", result.jobId);
1414
+ try {
1415
+ await stat(jobOutputDir);
1416
+ expect.fail("Directory should not exist");
1417
+ }
1418
+ catch (error) {
1419
+ expect(error.code).toBe("ENOENT");
1420
+ }
1421
+ });
1422
+ it("does not create job output directory when outputToFile is not specified", async () => {
1423
+ const messages = [
1424
+ { type: "system", content: "Init" },
1425
+ { type: "assistant", content: "Hello" },
1426
+ ];
1427
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1428
+ logger: createMockLogger(),
1429
+ });
1430
+ const result = await executor.execute({
1431
+ agent: createTestAgent(),
1432
+ prompt: "Test prompt",
1433
+ stateDir,
1434
+ // outputToFile not specified (defaults to false)
1435
+ });
1436
+ // Verify directory was NOT created
1437
+ const jobOutputDir = join(stateDir, "jobs", result.jobId);
1438
+ try {
1439
+ await stat(jobOutputDir);
1440
+ expect.fail("Directory should not exist");
1441
+ }
1442
+ catch (error) {
1443
+ expect(error.code).toBe("ENOENT");
1444
+ }
1445
+ });
1446
+ it("writes all message types to output.log", async () => {
1447
+ const messages = [
1448
+ { type: "system", content: "System message" },
1449
+ { type: "assistant", content: "Assistant response" },
1450
+ { type: "tool_use", tool_name: "read_file", input: { path: "/etc/hosts" } },
1451
+ { type: "tool_result", result: "localhost", success: true },
1452
+ { type: "error", message: "An error occurred" },
1453
+ ];
1454
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1455
+ logger: createMockLogger(),
1456
+ });
1457
+ const result = await executor.execute({
1458
+ agent: createTestAgent(),
1459
+ prompt: "Test prompt",
1460
+ stateDir,
1461
+ outputToFile: true,
1462
+ });
1463
+ const outputLogPath = join(stateDir, "jobs", result.jobId, "output.log");
1464
+ const logContent = await readFile(outputLogPath, "utf-8");
1465
+ expect(logContent).toContain("[SYSTEM] System message");
1466
+ expect(logContent).toContain("[ASSISTANT] Assistant response");
1467
+ expect(logContent).toContain("[TOOL] read_file");
1468
+ expect(logContent).toContain("[TOOL_RESULT] (OK) localhost");
1469
+ expect(logContent).toContain("[ERROR] An error occurred");
1470
+ });
1471
+ it("includes timestamps in output.log lines", async () => {
1472
+ const messages = [
1473
+ { type: "assistant", content: "Hello" },
1474
+ ];
1475
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1476
+ logger: createMockLogger(),
1477
+ });
1478
+ const result = await executor.execute({
1479
+ agent: createTestAgent(),
1480
+ prompt: "Test prompt",
1481
+ stateDir,
1482
+ outputToFile: true,
1483
+ });
1484
+ const outputLogPath = join(stateDir, "jobs", result.jobId, "output.log");
1485
+ const logContent = await readFile(outputLogPath, "utf-8");
1486
+ // Check for ISO timestamp format: [YYYY-MM-DDTHH:MM:SS.sssZ]
1487
+ expect(logContent).toMatch(/\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z\]/);
1488
+ });
1489
+ it("still writes to JSONL even when outputToFile is true", async () => {
1490
+ const messages = [
1491
+ { type: "system", content: "Init" },
1492
+ { type: "assistant", content: "Response" },
1493
+ ];
1494
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1495
+ logger: createMockLogger(),
1496
+ });
1497
+ const result = await executor.execute({
1498
+ agent: createTestAgent(),
1499
+ prompt: "Test prompt",
1500
+ stateDir,
1501
+ outputToFile: true,
1502
+ });
1503
+ // Verify JSONL still exists
1504
+ const output = await readJobOutputAll(join(stateDir, "jobs"), result.jobId);
1505
+ expect(output).toHaveLength(2);
1506
+ expect(output[0].type).toBe("system");
1507
+ expect(output[1].type).toBe("assistant");
1508
+ });
1509
+ it("handles failed tool results in output.log", async () => {
1510
+ const messages = [
1511
+ { type: "tool_result", result: "File not found", success: false },
1512
+ ];
1513
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1514
+ logger: createMockLogger(),
1515
+ });
1516
+ const result = await executor.execute({
1517
+ agent: createTestAgent(),
1518
+ prompt: "Test prompt",
1519
+ stateDir,
1520
+ outputToFile: true,
1521
+ });
1522
+ const outputLogPath = join(stateDir, "jobs", result.jobId, "output.log");
1523
+ const logContent = await readFile(outputLogPath, "utf-8");
1524
+ expect(logContent).toContain("[TOOL_RESULT] (FAILED) File not found");
1525
+ });
1526
+ it("events still stream regardless of outputToFile setting", async () => {
1527
+ const receivedMessages = [];
1528
+ const onMessage = vi.fn((msg) => {
1529
+ receivedMessages.push(msg);
1530
+ });
1531
+ const messages = [
1532
+ { type: "system", content: "Init" },
1533
+ { type: "assistant", content: "Hello" },
1534
+ ];
1535
+ const executor = new JobExecutor(createMockSDKQuery(messages), {
1536
+ logger: createMockLogger(),
1537
+ });
1538
+ await executor.execute({
1539
+ agent: createTestAgent(),
1540
+ prompt: "Test prompt",
1541
+ stateDir,
1542
+ outputToFile: true,
1543
+ onMessage,
1544
+ });
1545
+ // Events should still be emitted
1546
+ expect(onMessage).toHaveBeenCalledTimes(2);
1547
+ expect(receivedMessages).toHaveLength(2);
1548
+ });
1549
+ });
1345
1550
  //# sourceMappingURL=job-executor.test.js.map