@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
package/src/index.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @herdctl/core
|
|
3
|
-
*
|
|
4
|
-
* Core library for herdctl - Autonomous Agent Fleet Management for Claude Code
|
|
5
|
-
*
|
|
6
|
-
* This package provides:
|
|
7
|
-
* - Config parsing (herdctl.yaml and agent YAML files)
|
|
8
|
-
* - State management (.herdctl/ directory)
|
|
9
|
-
* - Agent runner (Claude SDK wrapper)
|
|
10
|
-
* - Work sources (GitHub Issues, etc.)
|
|
11
|
-
* - Scheduler (interval, cron)
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
export const VERSION = "0.0.1";
|
|
15
|
-
|
|
16
|
-
// Config exports (PRD 1)
|
|
17
|
-
export * from "./config/index.js";
|
|
18
|
-
|
|
19
|
-
// State exports (PRD 2)
|
|
20
|
-
export * from "./state/index.js";
|
|
21
|
-
|
|
22
|
-
// Runner exports (PRD 4)
|
|
23
|
-
export * from "./runner/index.js";
|
|
24
|
-
|
|
25
|
-
// Work source exports (PRD 5)
|
|
26
|
-
export * from "./work-sources/index.js";
|
|
27
|
-
|
|
28
|
-
// Scheduler exports (PRD 6)
|
|
29
|
-
export * from "./scheduler/index.js";
|
|
30
|
-
|
|
31
|
-
// Fleet Manager exports (PRD 7)
|
|
32
|
-
export * from "./fleet-manager/index.js";
|
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
RunnerError,
|
|
4
|
-
SDKInitializationError,
|
|
5
|
-
SDKStreamingError,
|
|
6
|
-
MalformedResponseError,
|
|
7
|
-
buildErrorMessage,
|
|
8
|
-
classifyError,
|
|
9
|
-
wrapError,
|
|
10
|
-
} from "../errors.js";
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// RunnerError tests
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
describe("RunnerError", () => {
|
|
17
|
-
it("creates error with message only", () => {
|
|
18
|
-
const error = new RunnerError("Something went wrong");
|
|
19
|
-
|
|
20
|
-
expect(error.message).toBe("Something went wrong");
|
|
21
|
-
expect(error.name).toBe("RunnerError");
|
|
22
|
-
expect(error.jobId).toBeUndefined();
|
|
23
|
-
expect(error.agentName).toBeUndefined();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("creates error with job ID and agent name", () => {
|
|
27
|
-
const error = new RunnerError("Something went wrong", {
|
|
28
|
-
jobId: "job-2024-01-15-abc123",
|
|
29
|
-
agentName: "test-agent",
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
expect(error.jobId).toBe("job-2024-01-15-abc123");
|
|
33
|
-
expect(error.agentName).toBe("test-agent");
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("preserves cause error", () => {
|
|
37
|
-
const cause = new Error("Original error");
|
|
38
|
-
const error = new RunnerError("Wrapped error", { cause });
|
|
39
|
-
|
|
40
|
-
expect(error.cause).toBe(cause);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// =============================================================================
|
|
45
|
-
// SDKInitializationError tests
|
|
46
|
-
// =============================================================================
|
|
47
|
-
|
|
48
|
-
describe("SDKInitializationError", () => {
|
|
49
|
-
it("creates initialization error with context", () => {
|
|
50
|
-
const error = new SDKInitializationError("API key not found", {
|
|
51
|
-
jobId: "job-123",
|
|
52
|
-
agentName: "my-agent",
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
expect(error.name).toBe("SDKInitializationError");
|
|
56
|
-
expect(error.message).toBe("API key not found");
|
|
57
|
-
expect(error.jobId).toBe("job-123");
|
|
58
|
-
expect(error.agentName).toBe("my-agent");
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("extracts code from cause error", () => {
|
|
62
|
-
const cause = new Error("Connection failed") as NodeJS.ErrnoException;
|
|
63
|
-
cause.code = "ECONNREFUSED";
|
|
64
|
-
|
|
65
|
-
const error = new SDKInitializationError("Failed to initialize", { cause });
|
|
66
|
-
|
|
67
|
-
expect(error.code).toBe("ECONNREFUSED");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
it("uses provided code over cause code", () => {
|
|
71
|
-
const cause = new Error("Error") as NodeJS.ErrnoException;
|
|
72
|
-
cause.code = "ORIGINAL_CODE";
|
|
73
|
-
|
|
74
|
-
const error = new SDKInitializationError("Failed", {
|
|
75
|
-
cause,
|
|
76
|
-
code: "CUSTOM_CODE",
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
expect(error.code).toBe("CUSTOM_CODE");
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe("isMissingApiKey", () => {
|
|
83
|
-
it("returns true for API key errors", () => {
|
|
84
|
-
expect(
|
|
85
|
-
new SDKInitializationError("Missing API key").isMissingApiKey()
|
|
86
|
-
).toBe(true);
|
|
87
|
-
expect(
|
|
88
|
-
new SDKInitializationError("ANTHROPIC_API_KEY not set").isMissingApiKey()
|
|
89
|
-
).toBe(true);
|
|
90
|
-
expect(
|
|
91
|
-
new SDKInitializationError("Authentication failed").isMissingApiKey()
|
|
92
|
-
).toBe(true);
|
|
93
|
-
expect(
|
|
94
|
-
new SDKInitializationError("Unauthorized request").isMissingApiKey()
|
|
95
|
-
).toBe(true);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("returns true for ENOKEY code", () => {
|
|
99
|
-
const error = new SDKInitializationError("Error", { code: "ENOKEY" });
|
|
100
|
-
expect(error.isMissingApiKey()).toBe(true);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("returns false for other errors", () => {
|
|
104
|
-
expect(
|
|
105
|
-
new SDKInitializationError("Network timeout").isMissingApiKey()
|
|
106
|
-
).toBe(false);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
describe("isNetworkError", () => {
|
|
111
|
-
it("returns true for network error codes", () => {
|
|
112
|
-
expect(
|
|
113
|
-
new SDKInitializationError("Failed", { code: "ECONNREFUSED" }).isNetworkError()
|
|
114
|
-
).toBe(true);
|
|
115
|
-
expect(
|
|
116
|
-
new SDKInitializationError("Failed", { code: "ENOTFOUND" }).isNetworkError()
|
|
117
|
-
).toBe(true);
|
|
118
|
-
expect(
|
|
119
|
-
new SDKInitializationError("Failed", { code: "ETIMEDOUT" }).isNetworkError()
|
|
120
|
-
).toBe(true);
|
|
121
|
-
expect(
|
|
122
|
-
new SDKInitializationError("Failed", { code: "ECONNRESET" }).isNetworkError()
|
|
123
|
-
).toBe(true);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it("returns false for other codes", () => {
|
|
127
|
-
expect(
|
|
128
|
-
new SDKInitializationError("Failed", { code: "ENOENT" }).isNetworkError()
|
|
129
|
-
).toBe(false);
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// =============================================================================
|
|
135
|
-
// SDKStreamingError tests
|
|
136
|
-
// =============================================================================
|
|
137
|
-
|
|
138
|
-
describe("SDKStreamingError", () => {
|
|
139
|
-
it("creates streaming error with context", () => {
|
|
140
|
-
const error = new SDKStreamingError("Stream interrupted", {
|
|
141
|
-
jobId: "job-456",
|
|
142
|
-
agentName: "streaming-agent",
|
|
143
|
-
messagesReceived: 42,
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
expect(error.name).toBe("SDKStreamingError");
|
|
147
|
-
expect(error.messagesReceived).toBe(42);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
describe("isRateLimited", () => {
|
|
151
|
-
it("returns true for rate limit errors", () => {
|
|
152
|
-
expect(
|
|
153
|
-
new SDKStreamingError("Rate limit exceeded").isRateLimited()
|
|
154
|
-
).toBe(true);
|
|
155
|
-
expect(
|
|
156
|
-
new SDKStreamingError("Too many requests").isRateLimited()
|
|
157
|
-
).toBe(true);
|
|
158
|
-
expect(
|
|
159
|
-
new SDKStreamingError("Error", { code: "ERATELIMIT" }).isRateLimited()
|
|
160
|
-
).toBe(true);
|
|
161
|
-
expect(
|
|
162
|
-
new SDKStreamingError("Error", { code: "429" }).isRateLimited()
|
|
163
|
-
).toBe(true);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("returns false for other errors", () => {
|
|
167
|
-
expect(
|
|
168
|
-
new SDKStreamingError("Connection failed").isRateLimited()
|
|
169
|
-
).toBe(false);
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
describe("isConnectionError", () => {
|
|
174
|
-
it("returns true for connection error codes", () => {
|
|
175
|
-
expect(
|
|
176
|
-
new SDKStreamingError("Error", { code: "ECONNREFUSED" }).isConnectionError()
|
|
177
|
-
).toBe(true);
|
|
178
|
-
expect(
|
|
179
|
-
new SDKStreamingError("Error", { code: "ECONNRESET" }).isConnectionError()
|
|
180
|
-
).toBe(true);
|
|
181
|
-
expect(
|
|
182
|
-
new SDKStreamingError("Error", { code: "EPIPE" }).isConnectionError()
|
|
183
|
-
).toBe(true);
|
|
184
|
-
expect(
|
|
185
|
-
new SDKStreamingError("Error", { code: "ETIMEDOUT" }).isConnectionError()
|
|
186
|
-
).toBe(true);
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
describe("isRecoverable", () => {
|
|
191
|
-
it("returns true for recoverable errors", () => {
|
|
192
|
-
expect(
|
|
193
|
-
new SDKStreamingError("Rate limited", { code: "429" }).isRecoverable()
|
|
194
|
-
).toBe(true);
|
|
195
|
-
expect(
|
|
196
|
-
new SDKStreamingError("Connection reset", { code: "ECONNRESET" }).isRecoverable()
|
|
197
|
-
).toBe(true);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it("returns false for non-recoverable errors", () => {
|
|
201
|
-
expect(
|
|
202
|
-
new SDKStreamingError("Invalid request").isRecoverable()
|
|
203
|
-
).toBe(false);
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
// =============================================================================
|
|
209
|
-
// MalformedResponseError tests
|
|
210
|
-
// =============================================================================
|
|
211
|
-
|
|
212
|
-
describe("MalformedResponseError", () => {
|
|
213
|
-
it("creates error with raw response", () => {
|
|
214
|
-
const rawResponse = { invalid: "structure" };
|
|
215
|
-
const error = new MalformedResponseError("Invalid message format", {
|
|
216
|
-
rawResponse,
|
|
217
|
-
expected: "SDKMessage with type field",
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
expect(error.name).toBe("MalformedResponseError");
|
|
221
|
-
expect(error.rawResponse).toEqual(rawResponse);
|
|
222
|
-
expect(error.expected).toBe("SDKMessage with type field");
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// =============================================================================
|
|
227
|
-
// buildErrorMessage tests
|
|
228
|
-
// =============================================================================
|
|
229
|
-
|
|
230
|
-
describe("buildErrorMessage", () => {
|
|
231
|
-
it("returns base message when no context", () => {
|
|
232
|
-
expect(buildErrorMessage("Error occurred")).toBe("Error occurred");
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
it("includes agent name in message", () => {
|
|
236
|
-
expect(
|
|
237
|
-
buildErrorMessage("Error occurred", { agentName: "my-agent" })
|
|
238
|
-
).toBe("Error occurred | Agent: my-agent");
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it("includes job ID in message", () => {
|
|
242
|
-
expect(
|
|
243
|
-
buildErrorMessage("Error occurred", { jobId: "job-123" })
|
|
244
|
-
).toBe("Error occurred | Job: job-123");
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it("includes both agent name and job ID", () => {
|
|
248
|
-
expect(
|
|
249
|
-
buildErrorMessage("Error occurred", {
|
|
250
|
-
agentName: "my-agent",
|
|
251
|
-
jobId: "job-123",
|
|
252
|
-
})
|
|
253
|
-
).toBe("Error occurred | Agent: my-agent | Job: job-123");
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
// =============================================================================
|
|
258
|
-
// classifyError tests
|
|
259
|
-
// =============================================================================
|
|
260
|
-
|
|
261
|
-
describe("classifyError", () => {
|
|
262
|
-
it("classifies timeout errors", () => {
|
|
263
|
-
expect(classifyError(new Error("Request timeout"))).toBe("timeout");
|
|
264
|
-
expect(classifyError(new Error("Operation timed out"))).toBe("timeout");
|
|
265
|
-
|
|
266
|
-
const timeoutError = new Error("Error") as NodeJS.ErrnoException;
|
|
267
|
-
timeoutError.code = "ETIMEDOUT";
|
|
268
|
-
expect(classifyError(timeoutError)).toBe("timeout");
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it("classifies cancelled errors", () => {
|
|
272
|
-
expect(classifyError(new Error("Request aborted"))).toBe("cancelled");
|
|
273
|
-
expect(classifyError(new Error("Operation cancelled"))).toBe("cancelled");
|
|
274
|
-
|
|
275
|
-
const abortError = new Error("Aborted");
|
|
276
|
-
abortError.name = "AbortError";
|
|
277
|
-
expect(classifyError(abortError)).toBe("cancelled");
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
it("classifies max turns errors", () => {
|
|
281
|
-
expect(classifyError(new Error("Max turns reached"))).toBe("max_turns");
|
|
282
|
-
expect(classifyError(new Error("Exceeded max_turns limit"))).toBe("max_turns");
|
|
283
|
-
expect(classifyError(new Error("Turn limit exceeded"))).toBe("max_turns");
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
it("classifies other errors as generic error", () => {
|
|
287
|
-
expect(classifyError(new Error("Something went wrong"))).toBe("error");
|
|
288
|
-
expect(classifyError(new Error("Unknown failure"))).toBe("error");
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// =============================================================================
|
|
293
|
-
// wrapError tests
|
|
294
|
-
// =============================================================================
|
|
295
|
-
|
|
296
|
-
describe("wrapError", () => {
|
|
297
|
-
it("returns RunnerError as-is", () => {
|
|
298
|
-
const runnerError = new RunnerError("Already wrapped");
|
|
299
|
-
const result = wrapError(runnerError, {
|
|
300
|
-
jobId: "job-123",
|
|
301
|
-
agentName: "agent",
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
expect(result).toBe(runnerError);
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it("wraps regular Error as SDKStreamingError by default", () => {
|
|
308
|
-
const error = new Error("Something failed");
|
|
309
|
-
const result = wrapError(error, {
|
|
310
|
-
jobId: "job-123",
|
|
311
|
-
agentName: "agent",
|
|
312
|
-
phase: "streaming",
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
expect(result).toBeInstanceOf(SDKStreamingError);
|
|
316
|
-
expect(result.jobId).toBe("job-123");
|
|
317
|
-
expect(result.agentName).toBe("agent");
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
it("wraps init phase errors as SDKInitializationError", () => {
|
|
321
|
-
const error = new Error("Initialization failed");
|
|
322
|
-
const result = wrapError(error, {
|
|
323
|
-
jobId: "job-123",
|
|
324
|
-
agentName: "agent",
|
|
325
|
-
phase: "init",
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
expect(result).toBeInstanceOf(SDKInitializationError);
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it("wraps malformed response errors as MalformedResponseError", () => {
|
|
332
|
-
const error = new Error("Unexpected response format");
|
|
333
|
-
const result = wrapError(error, {
|
|
334
|
-
jobId: "job-123",
|
|
335
|
-
agentName: "agent",
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
expect(result).toBeInstanceOf(MalformedResponseError);
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
it("wraps invalid JSON errors as MalformedResponseError", () => {
|
|
342
|
-
const error = new Error("Invalid JSON in response");
|
|
343
|
-
const result = wrapError(error, {
|
|
344
|
-
jobId: "job-123",
|
|
345
|
-
agentName: "agent",
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
expect(result).toBeInstanceOf(MalformedResponseError);
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
it("wraps parse errors as MalformedResponseError", () => {
|
|
352
|
-
const error = new Error("Parse error: unexpected token");
|
|
353
|
-
const result = wrapError(error, {
|
|
354
|
-
jobId: "job-123",
|
|
355
|
-
agentName: "agent",
|
|
356
|
-
});
|
|
357
|
-
|
|
358
|
-
expect(result).toBeInstanceOf(MalformedResponseError);
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it("converts non-Error values to SDKStreamingError", () => {
|
|
362
|
-
const result = wrapError("string error", {
|
|
363
|
-
jobId: "job-123",
|
|
364
|
-
agentName: "agent",
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
expect(result).toBeInstanceOf(SDKStreamingError);
|
|
368
|
-
expect(result.message).toContain("string error");
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it("includes context in wrapped error message", () => {
|
|
372
|
-
const error = new Error("Original message");
|
|
373
|
-
const result = wrapError(error, {
|
|
374
|
-
jobId: "job-123",
|
|
375
|
-
agentName: "my-agent",
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
expect(result.message).toContain("Original message");
|
|
379
|
-
expect(result.message).toContain("my-agent");
|
|
380
|
-
expect(result.message).toContain("job-123");
|
|
381
|
-
});
|
|
382
|
-
});
|