@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
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for FleetManager job control methods (US-6)
|
|
3
|
-
*
|
|
4
|
-
* Tests cancelJob, forkJob, and streamLogs functionality.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
8
|
-
import { mkdtemp, rm, mkdir, writeFile } from "fs/promises";
|
|
9
|
-
import { tmpdir } from "os";
|
|
10
|
-
import { join } from "path";
|
|
11
|
-
import { FleetManager } from "../fleet-manager.js";
|
|
12
|
-
import {
|
|
13
|
-
InvalidStateError,
|
|
14
|
-
JobNotFoundError,
|
|
15
|
-
JobForkError,
|
|
16
|
-
} from "../errors.js";
|
|
17
|
-
import type { FleetManagerLogger, JobCancelledPayload, JobForkedPayload } from "../types.js";
|
|
18
|
-
|
|
19
|
-
describe("FleetManager Job Control (US-6)", () => {
|
|
20
|
-
let tempDir: string;
|
|
21
|
-
let configDir: string;
|
|
22
|
-
let stateDir: string;
|
|
23
|
-
|
|
24
|
-
beforeEach(async () => {
|
|
25
|
-
tempDir = await mkdtemp(join(tmpdir(), "job-control-test-"));
|
|
26
|
-
configDir = join(tempDir, "config");
|
|
27
|
-
stateDir = join(tempDir, ".herdctl");
|
|
28
|
-
await mkdir(configDir, { recursive: true });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
async function createConfig(config: object) {
|
|
36
|
-
const configPath = join(configDir, "herdctl.yaml");
|
|
37
|
-
const yaml = await import("yaml");
|
|
38
|
-
await writeFile(configPath, yaml.stringify(config));
|
|
39
|
-
return configPath;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function createAgentConfig(name: string, config: object) {
|
|
43
|
-
const agentDir = join(configDir, "agents");
|
|
44
|
-
await mkdir(agentDir, { recursive: true });
|
|
45
|
-
const agentPath = join(agentDir, `${name}.yaml`);
|
|
46
|
-
const yaml = await import("yaml");
|
|
47
|
-
await writeFile(agentPath, yaml.stringify(config));
|
|
48
|
-
return agentPath;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function createSilentLogger(): FleetManagerLogger {
|
|
52
|
-
return {
|
|
53
|
-
debug: vi.fn(),
|
|
54
|
-
info: vi.fn(),
|
|
55
|
-
warn: vi.fn(),
|
|
56
|
-
error: vi.fn(),
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async function createInitializedManager() {
|
|
61
|
-
await createAgentConfig("test-agent", {
|
|
62
|
-
name: "test-agent",
|
|
63
|
-
description: "Test agent",
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
const configPath = await createConfig({
|
|
67
|
-
version: 1,
|
|
68
|
-
agents: [{ path: "./agents/test-agent.yaml" }],
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
const manager = new FleetManager({
|
|
72
|
-
configPath,
|
|
73
|
-
stateDir,
|
|
74
|
-
checkInterval: 10000,
|
|
75
|
-
logger: createSilentLogger(),
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
await manager.initialize();
|
|
79
|
-
return manager;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ===========================================================================
|
|
83
|
-
// cancelJob tests
|
|
84
|
-
// ===========================================================================
|
|
85
|
-
describe("cancelJob", () => {
|
|
86
|
-
it("throws InvalidStateError before initialization", async () => {
|
|
87
|
-
await createAgentConfig("test-agent", { name: "test-agent" });
|
|
88
|
-
const configPath = await createConfig({
|
|
89
|
-
version: 1,
|
|
90
|
-
agents: [{ path: "./agents/test-agent.yaml" }],
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
const manager = new FleetManager({
|
|
94
|
-
configPath,
|
|
95
|
-
stateDir,
|
|
96
|
-
logger: createSilentLogger(),
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
await expect(manager.cancelJob("job-123")).rejects.toThrow(
|
|
100
|
-
InvalidStateError
|
|
101
|
-
);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("throws JobNotFoundError for non-existent job", async () => {
|
|
105
|
-
const manager = await createInitializedManager();
|
|
106
|
-
|
|
107
|
-
await expect(manager.cancelJob("job-2099-01-01-nonexistent")).rejects.toThrow(
|
|
108
|
-
JobNotFoundError
|
|
109
|
-
);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it("cancels a running job successfully", async () => {
|
|
113
|
-
const manager = await createInitializedManager();
|
|
114
|
-
|
|
115
|
-
// Trigger a job first
|
|
116
|
-
const triggerResult = await manager.trigger("test-agent");
|
|
117
|
-
|
|
118
|
-
// Set up event listener
|
|
119
|
-
const cancelledHandler = vi.fn();
|
|
120
|
-
manager.on("job:cancelled", cancelledHandler);
|
|
121
|
-
|
|
122
|
-
// Cancel the job
|
|
123
|
-
const result = await manager.cancelJob(triggerResult.jobId);
|
|
124
|
-
|
|
125
|
-
expect(result.success).toBe(true);
|
|
126
|
-
expect(result.jobId).toBe(triggerResult.jobId);
|
|
127
|
-
expect(result.terminationType).toBe("graceful");
|
|
128
|
-
expect(result.canceledAt).toBeDefined();
|
|
129
|
-
|
|
130
|
-
// Verify event was emitted
|
|
131
|
-
expect(cancelledHandler).toHaveBeenCalledTimes(1);
|
|
132
|
-
expect(cancelledHandler).toHaveBeenCalledWith(
|
|
133
|
-
expect.objectContaining({
|
|
134
|
-
job: expect.objectContaining({ id: triggerResult.jobId }),
|
|
135
|
-
agentName: "test-agent",
|
|
136
|
-
terminationType: "graceful",
|
|
137
|
-
})
|
|
138
|
-
);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it("returns already_stopped for completed jobs", async () => {
|
|
142
|
-
const manager = await createInitializedManager();
|
|
143
|
-
|
|
144
|
-
// Trigger and then cancel a job (which marks it as cancelled)
|
|
145
|
-
const triggerResult = await manager.trigger("test-agent");
|
|
146
|
-
await manager.cancelJob(triggerResult.jobId);
|
|
147
|
-
|
|
148
|
-
// Try to cancel again
|
|
149
|
-
const result = await manager.cancelJob(triggerResult.jobId);
|
|
150
|
-
|
|
151
|
-
expect(result.success).toBe(true);
|
|
152
|
-
expect(result.terminationType).toBe("already_stopped");
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it("works with custom timeout option", async () => {
|
|
156
|
-
const manager = await createInitializedManager();
|
|
157
|
-
|
|
158
|
-
const triggerResult = await manager.trigger("test-agent");
|
|
159
|
-
const result = await manager.cancelJob(triggerResult.jobId, {
|
|
160
|
-
timeout: 5000,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
expect(result.success).toBe(true);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// ===========================================================================
|
|
168
|
-
// forkJob tests
|
|
169
|
-
// ===========================================================================
|
|
170
|
-
describe("forkJob", () => {
|
|
171
|
-
it("throws InvalidStateError before initialization", async () => {
|
|
172
|
-
await createAgentConfig("test-agent", { name: "test-agent" });
|
|
173
|
-
const configPath = await createConfig({
|
|
174
|
-
version: 1,
|
|
175
|
-
agents: [{ path: "./agents/test-agent.yaml" }],
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
const manager = new FleetManager({
|
|
179
|
-
configPath,
|
|
180
|
-
stateDir,
|
|
181
|
-
logger: createSilentLogger(),
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
await expect(manager.forkJob("job-123")).rejects.toThrow(InvalidStateError);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it("throws JobForkError for non-existent job", async () => {
|
|
188
|
-
const manager = await createInitializedManager();
|
|
189
|
-
|
|
190
|
-
await expect(manager.forkJob("job-2099-01-01-nonexistent")).rejects.toThrow(
|
|
191
|
-
JobForkError
|
|
192
|
-
);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("forks a job successfully", async () => {
|
|
196
|
-
const manager = await createInitializedManager();
|
|
197
|
-
|
|
198
|
-
// Trigger a job first
|
|
199
|
-
const triggerResult = await manager.trigger("test-agent", undefined, {
|
|
200
|
-
prompt: "Original prompt",
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Set up event listeners
|
|
204
|
-
const createdHandler = vi.fn();
|
|
205
|
-
const forkedHandler = vi.fn();
|
|
206
|
-
manager.on("job:created", createdHandler);
|
|
207
|
-
manager.on("job:forked", forkedHandler);
|
|
208
|
-
|
|
209
|
-
// Fork the job
|
|
210
|
-
const result = await manager.forkJob(triggerResult.jobId);
|
|
211
|
-
|
|
212
|
-
expect(result.jobId).toBeDefined();
|
|
213
|
-
expect(result.jobId).not.toBe(triggerResult.jobId);
|
|
214
|
-
expect(result.forkedFromJobId).toBe(triggerResult.jobId);
|
|
215
|
-
expect(result.agentName).toBe("test-agent");
|
|
216
|
-
expect(result.startedAt).toBeDefined();
|
|
217
|
-
|
|
218
|
-
// Verify job:created event was emitted
|
|
219
|
-
expect(createdHandler).toHaveBeenCalled();
|
|
220
|
-
|
|
221
|
-
// Verify job:forked event was emitted
|
|
222
|
-
expect(forkedHandler).toHaveBeenCalledTimes(1);
|
|
223
|
-
expect(forkedHandler).toHaveBeenCalledWith(
|
|
224
|
-
expect.objectContaining({
|
|
225
|
-
job: expect.objectContaining({ id: result.jobId }),
|
|
226
|
-
originalJob: expect.objectContaining({ id: triggerResult.jobId }),
|
|
227
|
-
agentName: "test-agent",
|
|
228
|
-
})
|
|
229
|
-
);
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it("forks a job with modified prompt", async () => {
|
|
233
|
-
const manager = await createInitializedManager();
|
|
234
|
-
|
|
235
|
-
const triggerResult = await manager.trigger("test-agent", undefined, {
|
|
236
|
-
prompt: "Original prompt",
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
const result = await manager.forkJob(triggerResult.jobId, {
|
|
240
|
-
prompt: "Modified prompt",
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
expect(result.prompt).toBe("Modified prompt");
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
it("throws JobForkError when agent no longer exists", async () => {
|
|
247
|
-
const manager = await createInitializedManager();
|
|
248
|
-
|
|
249
|
-
// Trigger a job
|
|
250
|
-
const triggerResult = await manager.trigger("test-agent");
|
|
251
|
-
|
|
252
|
-
// Reload config without the agent
|
|
253
|
-
await createConfig({
|
|
254
|
-
version: 1,
|
|
255
|
-
agents: [],
|
|
256
|
-
});
|
|
257
|
-
await manager.reload();
|
|
258
|
-
|
|
259
|
-
// Try to fork - should fail because agent doesn't exist
|
|
260
|
-
await expect(manager.forkJob(triggerResult.jobId)).rejects.toThrow(
|
|
261
|
-
JobForkError
|
|
262
|
-
);
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
// ===========================================================================
|
|
267
|
-
// streamLogs tests
|
|
268
|
-
// Note: streamLogs is an async generator that may keep running for live logs.
|
|
269
|
-
// These tests verify the method exists and basic parameter handling.
|
|
270
|
-
// ===========================================================================
|
|
271
|
-
describe("streamLogs", () => {
|
|
272
|
-
it("is a function that returns an async iterable", async () => {
|
|
273
|
-
const manager = await createInitializedManager();
|
|
274
|
-
|
|
275
|
-
// Verify it's a function
|
|
276
|
-
expect(typeof manager.streamLogs).toBe("function");
|
|
277
|
-
|
|
278
|
-
// Verify it returns an async iterable (has Symbol.asyncIterator)
|
|
279
|
-
const iterable = manager.streamLogs({ includeHistory: false });
|
|
280
|
-
expect(typeof iterable[Symbol.asyncIterator]).toBe("function");
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
});
|