@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.
- package/dist/config/__tests__/agent.test.js +31 -13
- package/dist/config/__tests__/agent.test.js.map +1 -1
- package/dist/config/__tests__/merge.test.js +9 -2
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/__tests__/schema.test.js +350 -1
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +828 -24
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +118 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +11 -332
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/errors.test.js +1 -49
- package/dist/fleet-manager/__tests__/errors.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/integration.test.js +109 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/reload.test.js +1 -1
- package/dist/fleet-manager/__tests__/reload.test.js.map +1 -1
- package/dist/fleet-manager/config-reload.d.ts +164 -0
- package/dist/fleet-manager/config-reload.d.ts.map +1 -0
- package/dist/fleet-manager/config-reload.js +445 -0
- package/dist/fleet-manager/config-reload.js.map +1 -0
- package/dist/fleet-manager/context.d.ts +76 -0
- package/dist/fleet-manager/context.d.ts.map +1 -0
- package/dist/fleet-manager/context.js +11 -0
- package/dist/fleet-manager/context.js.map +1 -0
- package/dist/fleet-manager/errors.d.ts +0 -25
- package/dist/fleet-manager/errors.d.ts.map +1 -1
- package/dist/fleet-manager/errors.js +0 -38
- package/dist/fleet-manager/errors.js.map +1 -1
- package/dist/fleet-manager/event-emitters.d.ts +123 -0
- package/dist/fleet-manager/event-emitters.d.ts.map +1 -0
- package/dist/fleet-manager/event-emitters.js +136 -0
- package/dist/fleet-manager/event-emitters.js.map +1 -0
- package/dist/fleet-manager/event-types.d.ts +0 -15
- package/dist/fleet-manager/event-types.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +40 -653
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +95 -1720
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/index.d.ts +13 -2
- package/dist/fleet-manager/index.d.ts.map +1 -1
- package/dist/fleet-manager/index.js +19 -6
- package/dist/fleet-manager/index.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts +64 -0
- package/dist/fleet-manager/job-control.d.ts.map +1 -0
- package/dist/fleet-manager/job-control.js +296 -0
- package/dist/fleet-manager/job-control.js.map +1 -0
- package/dist/fleet-manager/log-streaming.d.ts +171 -0
- package/dist/fleet-manager/log-streaming.d.ts.map +1 -0
- package/dist/fleet-manager/log-streaming.js +503 -0
- package/dist/fleet-manager/log-streaming.js.map +1 -0
- package/dist/fleet-manager/schedule-executor.d.ts +63 -0
- package/dist/fleet-manager/schedule-executor.d.ts.map +1 -0
- package/dist/fleet-manager/schedule-executor.js +209 -0
- package/dist/fleet-manager/schedule-executor.js.map +1 -0
- package/dist/fleet-manager/schedule-management.d.ts +71 -0
- package/dist/fleet-manager/schedule-management.d.ts.map +1 -0
- package/dist/fleet-manager/schedule-management.js +171 -0
- package/dist/fleet-manager/schedule-management.js.map +1 -0
- package/dist/fleet-manager/status-queries.d.ts +105 -0
- package/dist/fleet-manager/status-queries.d.ts.map +1 -0
- package/dist/fleet-manager/status-queries.js +247 -0
- package/dist/fleet-manager/status-queries.js.map +1 -0
- package/dist/fleet-manager/types.d.ts +0 -39
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/runner/__tests__/job-executor.test.js +206 -1
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/job-executor.d.ts +9 -0
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +78 -4
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/types.d.ts +2 -0
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/__tests__/cron.test.d.ts +2 -0
- package/dist/scheduler/__tests__/cron.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/cron.test.js +867 -0
- package/dist/scheduler/__tests__/cron.test.js.map +1 -0
- package/dist/scheduler/__tests__/scheduler.test.js +164 -5
- package/dist/scheduler/__tests__/scheduler.test.js.map +1 -1
- package/dist/scheduler/cron.d.ts +126 -0
- package/dist/scheduler/cron.d.ts.map +1 -0
- package/dist/scheduler/cron.js +390 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/errors.d.ts +81 -1
- package/dist/scheduler/errors.d.ts.map +1 -1
- package/dist/scheduler/errors.js +81 -6
- package/dist/scheduler/errors.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts +2 -2
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +20 -8
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +4 -4
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +86 -20
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +1 -1
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/state/schemas/job-metadata.d.ts +2 -2
- package/package.json +33 -8
- package/.turbo/turbo-build.log +0 -4
- package/.turbo/turbo-test.log +0 -219
- package/.turbo/turbo-typecheck.log +0 -4
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-final.json +0 -51
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -251
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/config/index.html +0 -191
- package/coverage/src/config/index.ts.html +0 -442
- package/coverage/src/config/interpolate.ts.html +0 -652
- package/coverage/src/config/loader.ts.html +0 -1501
- package/coverage/src/config/merge.ts.html +0 -823
- package/coverage/src/config/parser.ts.html +0 -1213
- package/coverage/src/config/schema.ts.html +0 -1123
- package/coverage/src/fleet-manager/errors.ts.html +0 -2326
- package/coverage/src/fleet-manager/event-types.ts.html +0 -1219
- package/coverage/src/fleet-manager/fleet-manager.ts.html +0 -7030
- package/coverage/src/fleet-manager/index.html +0 -206
- package/coverage/src/fleet-manager/index.ts.html +0 -469
- package/coverage/src/fleet-manager/job-manager.ts.html +0 -2074
- package/coverage/src/fleet-manager/job-queue.ts.html +0 -2479
- package/coverage/src/fleet-manager/types.ts.html +0 -2602
- package/coverage/src/index.html +0 -116
- package/coverage/src/index.ts.html +0 -181
- package/coverage/src/runner/errors.ts.html +0 -1006
- package/coverage/src/runner/index.html +0 -191
- package/coverage/src/runner/index.ts.html +0 -256
- package/coverage/src/runner/job-executor.ts.html +0 -1429
- package/coverage/src/runner/message-processor.ts.html +0 -1150
- package/coverage/src/runner/sdk-adapter.ts.html +0 -658
- package/coverage/src/runner/types.ts.html +0 -559
- package/coverage/src/scheduler/errors.ts.html +0 -388
- package/coverage/src/scheduler/index.html +0 -206
- package/coverage/src/scheduler/index.ts.html +0 -244
- package/coverage/src/scheduler/interval.ts.html +0 -652
- package/coverage/src/scheduler/schedule-runner.ts.html +0 -1411
- package/coverage/src/scheduler/schedule-state.ts.html +0 -718
- package/coverage/src/scheduler/scheduler.ts.html +0 -1795
- package/coverage/src/scheduler/types.ts.html +0 -733
- package/coverage/src/state/directory.ts.html +0 -736
- package/coverage/src/state/errors.ts.html +0 -376
- package/coverage/src/state/fleet-state.ts.html +0 -937
- package/coverage/src/state/index.html +0 -221
- package/coverage/src/state/index.ts.html +0 -322
- package/coverage/src/state/job-metadata.ts.html +0 -1420
- package/coverage/src/state/job-output.ts.html +0 -1033
- package/coverage/src/state/schemas/fleet-state.ts.html +0 -445
- package/coverage/src/state/schemas/index.html +0 -176
- package/coverage/src/state/schemas/index.ts.html +0 -286
- package/coverage/src/state/schemas/job-metadata.ts.html +0 -628
- package/coverage/src/state/schemas/job-output.ts.html +0 -616
- package/coverage/src/state/schemas/session-info.ts.html +0 -361
- package/coverage/src/state/session.ts.html +0 -844
- package/coverage/src/state/types.ts.html +0 -262
- package/coverage/src/state/utils/atomic.ts.html +0 -748
- package/coverage/src/state/utils/index.html +0 -146
- package/coverage/src/state/utils/index.ts.html +0 -103
- package/coverage/src/state/utils/reads.ts.html +0 -1621
- package/coverage/src/work-sources/adapters/github.ts.html +0 -3583
- package/coverage/src/work-sources/adapters/index.html +0 -131
- package/coverage/src/work-sources/adapters/index.ts.html +0 -277
- package/coverage/src/work-sources/errors.ts.html +0 -298
- package/coverage/src/work-sources/index.html +0 -176
- package/coverage/src/work-sources/index.ts.html +0 -529
- package/coverage/src/work-sources/manager.ts.html +0 -1324
- package/coverage/src/work-sources/registry.ts.html +0 -619
- package/coverage/src/work-sources/types.ts.html +0 -568
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts +0 -7
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts.map +0 -1
- package/dist/fleet-manager/__tests__/event-helpers.test.js +0 -368
- package/dist/fleet-manager/__tests__/event-helpers.test.js.map +0 -1
- package/src/config/__tests__/agent.test.ts +0 -864
- package/src/config/__tests__/interpolate.test.ts +0 -644
- package/src/config/__tests__/loader.test.ts +0 -784
- package/src/config/__tests__/merge.test.ts +0 -751
- package/src/config/__tests__/parser.test.ts +0 -533
- package/src/config/__tests__/schema.test.ts +0 -873
- package/src/config/index.ts +0 -119
- package/src/config/interpolate.ts +0 -189
- package/src/config/loader.ts +0 -472
- package/src/config/merge.ts +0 -246
- package/src/config/parser.ts +0 -376
- package/src/config/schema.ts +0 -346
- package/src/fleet-manager/__tests__/coverage.test.ts +0 -2869
- package/src/fleet-manager/__tests__/errors.test.ts +0 -660
- package/src/fleet-manager/__tests__/event-helpers.test.ts +0 -448
- package/src/fleet-manager/__tests__/integration.test.ts +0 -1209
- package/src/fleet-manager/__tests__/job-control.test.ts +0 -283
- package/src/fleet-manager/__tests__/job-manager.test.ts +0 -869
- package/src/fleet-manager/__tests__/job-queue.test.ts +0 -401
- package/src/fleet-manager/__tests__/reload.test.ts +0 -751
- package/src/fleet-manager/__tests__/status-queries.test.ts +0 -595
- package/src/fleet-manager/__tests__/trigger.test.ts +0 -601
- package/src/fleet-manager/errors.ts +0 -747
- package/src/fleet-manager/event-types.ts +0 -378
- package/src/fleet-manager/fleet-manager.ts +0 -2315
- package/src/fleet-manager/index.ts +0 -128
- package/src/fleet-manager/job-manager.ts +0 -663
- package/src/fleet-manager/job-queue.ts +0 -798
- package/src/fleet-manager/types.ts +0 -839
- package/src/index.ts +0 -32
- package/src/runner/__tests__/errors.test.ts +0 -382
- package/src/runner/__tests__/job-executor.test.ts +0 -1708
- package/src/runner/__tests__/message-processor.test.ts +0 -960
- package/src/runner/__tests__/sdk-adapter.test.ts +0 -626
- package/src/runner/errors.ts +0 -307
- package/src/runner/index.ts +0 -57
- package/src/runner/job-executor.ts +0 -448
- package/src/runner/message-processor.ts +0 -355
- package/src/runner/sdk-adapter.ts +0 -191
- package/src/runner/types.ts +0 -158
- package/src/scheduler/__tests__/errors.test.ts +0 -159
- package/src/scheduler/__tests__/interval.test.ts +0 -515
- package/src/scheduler/__tests__/schedule-runner.test.ts +0 -798
- package/src/scheduler/__tests__/schedule-state.test.ts +0 -671
- package/src/scheduler/__tests__/scheduler.test.ts +0 -1280
- package/src/scheduler/errors.ts +0 -101
- package/src/scheduler/index.ts +0 -53
- package/src/scheduler/interval.ts +0 -189
- package/src/scheduler/schedule-runner.ts +0 -442
- package/src/scheduler/schedule-state.ts +0 -211
- package/src/scheduler/scheduler.ts +0 -570
- package/src/scheduler/types.ts +0 -216
- package/src/state/__tests__/directory.test.ts +0 -595
- package/src/state/__tests__/fleet-state.test.ts +0 -868
- package/src/state/__tests__/job-metadata-schema.test.ts +0 -414
- package/src/state/__tests__/job-metadata.test.ts +0 -831
- package/src/state/__tests__/job-output.test.ts +0 -856
- package/src/state/__tests__/session-schema.test.ts +0 -378
- package/src/state/__tests__/session.test.ts +0 -604
- package/src/state/directory.ts +0 -217
- package/src/state/errors.ts +0 -97
- package/src/state/fleet-state.ts +0 -284
- package/src/state/index.ts +0 -79
- package/src/state/job-metadata.ts +0 -445
- package/src/state/job-output.ts +0 -316
- package/src/state/schemas/__tests__/job-output.test.ts +0 -338
- package/src/state/schemas/fleet-state.ts +0 -120
- package/src/state/schemas/index.ts +0 -67
- package/src/state/schemas/job-metadata.ts +0 -181
- package/src/state/schemas/job-output.ts +0 -177
- package/src/state/schemas/session-info.ts +0 -92
- package/src/state/session.ts +0 -253
- package/src/state/types.ts +0 -59
- package/src/state/utils/__tests__/atomic.test.ts +0 -723
- package/src/state/utils/__tests__/reads.test.ts +0 -1071
- package/src/state/utils/atomic.ts +0 -221
- package/src/state/utils/index.ts +0 -6
- package/src/state/utils/reads.ts +0 -512
- package/src/work-sources/__tests__/github.test.ts +0 -1800
- package/src/work-sources/__tests__/manager.test.ts +0 -529
- package/src/work-sources/__tests__/registry.test.ts +0 -477
- package/src/work-sources/__tests__/types.test.ts +0 -479
- package/src/work-sources/adapters/github.ts +0 -1166
- package/src/work-sources/adapters/index.ts +0 -64
- package/src/work-sources/errors.ts +0 -71
- package/src/work-sources/index.ts +0 -148
- package/src/work-sources/manager.ts +0 -413
- package/src/work-sources/registry.ts +0 -178
- package/src/work-sources/types.ts +0 -161
- package/tsconfig.json +0 -9
- 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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,uBAAuB,CAAC;AAG7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGzD,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAEhB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAM1B;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAE5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,eAAe,GACf,aAAa,GACb,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,EAAE,kBAAkB,CAAC;IAE3B;;OAEG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD
|
|
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
|