@herdctl/core 1.3.0 → 2.0.0
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 +12 -12
- package/dist/config/__tests__/agent.test.js.map +1 -1
- package/dist/config/__tests__/loader.test.js +201 -4
- package/dist/config/__tests__/loader.test.js.map +1 -1
- package/dist/config/__tests__/merge.test.js +29 -4
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/__tests__/parser.test.js +13 -13
- package/dist/config/__tests__/parser.test.js.map +1 -1
- package/dist/config/__tests__/schema.test.js +10 -10
- 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 +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +71 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.d.ts.map +1 -1
- package/dist/config/merge.js +16 -0
- package/dist/config/merge.js.map +1 -1
- package/dist/config/schema.d.ts +906 -89
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +109 -7
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +25 -24
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/discord-manager.test.js +9 -2
- package/dist/fleet-manager/__tests__/discord-manager.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/integration.test.js +27 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/job-control.test.js +66 -0
- package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/status-queries.test.js +12 -11
- package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -1
- package/dist/fleet-manager/config-reload.js +9 -9
- package/dist/fleet-manager/config-reload.js.map +1 -1
- package/dist/fleet-manager/discord-manager.d.ts.map +1 -1
- package/dist/fleet-manager/discord-manager.js +27 -4
- package/dist/fleet-manager/discord-manager.js.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +11 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +27 -0
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts +1 -1
- package/dist/fleet-manager/job-control.d.ts.map +1 -1
- package/dist/fleet-manager/job-control.js +36 -14
- package/dist/fleet-manager/job-control.js.map +1 -1
- package/dist/fleet-manager/schedule-executor.d.ts +1 -1
- package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
- package/dist/fleet-manager/schedule-executor.js +11 -14
- package/dist/fleet-manager/schedule-executor.js.map +1 -1
- package/dist/fleet-manager/status-queries.js +7 -7
- package/dist/fleet-manager/status-queries.js.map +1 -1
- package/dist/fleet-manager/types.d.ts +10 -2
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/fleet-manager/working-directory-helper.d.ts +29 -0
- package/dist/fleet-manager/working-directory-helper.d.ts.map +1 -0
- package/dist/fleet-manager/working-directory-helper.js +36 -0
- package/dist/fleet-manager/working-directory-helper.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/runner/__tests__/job-executor.test.js +449 -118
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/__tests__/sdk-adapter.test.js +147 -23
- package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
- package/dist/runner/index.d.ts +2 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +1 -0
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/job-executor.d.ts +12 -8
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +257 -126
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.js +150 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/docker-config.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/docker-config.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/docker-config.test.js +352 -0
- package/dist/runner/runtime/__tests__/docker-config.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/docker-security.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/docker-security.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/docker-security.test.js +384 -0
- package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/factory.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/factory.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/factory.test.js +149 -0
- package/dist/runner/runtime/__tests__/factory.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/integration.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/integration.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/integration.test.js +274 -0
- package/dist/runner/runtime/__tests__/integration.test.js.map +1 -0
- package/dist/runner/runtime/cli-runtime.d.ts +107 -0
- package/dist/runner/runtime/cli-runtime.d.ts.map +1 -0
- package/dist/runner/runtime/cli-runtime.js +335 -0
- package/dist/runner/runtime/cli-runtime.js.map +1 -0
- package/dist/runner/runtime/cli-session-path.d.ts +108 -0
- package/dist/runner/runtime/cli-session-path.d.ts.map +1 -0
- package/dist/runner/runtime/cli-session-path.js +173 -0
- package/dist/runner/runtime/cli-session-path.js.map +1 -0
- package/dist/runner/runtime/cli-session-watcher.d.ts +55 -0
- package/dist/runner/runtime/cli-session-watcher.d.ts.map +1 -0
- package/dist/runner/runtime/cli-session-watcher.js +187 -0
- package/dist/runner/runtime/cli-session-watcher.js.map +1 -0
- package/dist/runner/runtime/container-manager.d.ts +76 -0
- package/dist/runner/runtime/container-manager.d.ts.map +1 -0
- package/dist/runner/runtime/container-manager.js +229 -0
- package/dist/runner/runtime/container-manager.js.map +1 -0
- package/dist/runner/runtime/container-runner.d.ts +62 -0
- package/dist/runner/runtime/container-runner.d.ts.map +1 -0
- package/dist/runner/runtime/container-runner.js +235 -0
- package/dist/runner/runtime/container-runner.js.map +1 -0
- package/dist/runner/runtime/docker-config.d.ts +100 -0
- package/dist/runner/runtime/docker-config.d.ts.map +1 -0
- package/dist/runner/runtime/docker-config.js +98 -0
- package/dist/runner/runtime/docker-config.js.map +1 -0
- package/dist/runner/runtime/factory.d.ts +63 -0
- package/dist/runner/runtime/factory.d.ts.map +1 -0
- package/dist/runner/runtime/factory.js +68 -0
- package/dist/runner/runtime/factory.js.map +1 -0
- package/dist/runner/runtime/index.d.ts +20 -0
- package/dist/runner/runtime/index.d.ts.map +1 -0
- package/dist/runner/runtime/index.js +21 -0
- package/dist/runner/runtime/index.js.map +1 -0
- package/dist/runner/runtime/interface.d.ts +59 -0
- package/dist/runner/runtime/interface.d.ts.map +1 -0
- package/dist/runner/runtime/interface.js +12 -0
- package/dist/runner/runtime/interface.js.map +1 -0
- package/dist/runner/runtime/sdk-runtime.d.ts +46 -0
- package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -0
- package/dist/runner/runtime/sdk-runtime.js +63 -0
- package/dist/runner/runtime/sdk-runtime.js.map +1 -0
- package/dist/runner/sdk-adapter.d.ts +4 -0
- package/dist/runner/sdk-adapter.d.ts.map +1 -1
- package/dist/runner/sdk-adapter.js +35 -16
- package/dist/runner/sdk-adapter.js.map +1 -1
- package/dist/runner/types.d.ts +12 -6
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/__tests__/schedule-runner.test.js +61 -50
- package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts +1 -4
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +40 -8
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/state/__tests__/session-schema.test.js +4 -0
- package/dist/state/__tests__/session-schema.test.js.map +1 -1
- package/dist/state/__tests__/session-validation.test.d.ts +2 -0
- package/dist/state/__tests__/session-validation.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-validation.test.js +446 -0
- package/dist/state/__tests__/session-validation.test.js.map +1 -0
- package/dist/state/__tests__/session.test.js +68 -0
- package/dist/state/__tests__/session.test.js.map +1 -1
- package/dist/state/__tests__/working-directory-validation.test.d.ts +5 -0
- package/dist/state/__tests__/working-directory-validation.test.d.ts.map +1 -0
- package/dist/state/__tests__/working-directory-validation.test.js +101 -0
- package/dist/state/__tests__/working-directory-validation.test.js.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/schemas/session-info.d.ts +32 -0
- package/dist/state/schemas/session-info.d.ts.map +1 -1
- package/dist/state/schemas/session-info.js +22 -0
- package/dist/state/schemas/session-info.js.map +1 -1
- package/dist/state/session-validation.d.ts +202 -0
- package/dist/state/session-validation.d.ts.map +1 -0
- package/dist/state/session-validation.js +407 -0
- package/dist/state/session-validation.js.map +1 -0
- package/dist/state/session.d.ts +23 -3
- package/dist/state/session.d.ts.map +1 -1
- package/dist/state/session.js +41 -6
- package/dist/state/session.js.map +1 -1
- package/dist/state/working-directory-validation.d.ts +52 -0
- package/dist/state/working-directory-validation.d.ts.map +1 -0
- package/dist/state/working-directory-validation.js +81 -0
- package/dist/state/working-directory-validation.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { mkdir, rm, realpath } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { RuntimeFactory } from "../factory.js";
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Environment Detection
|
|
9
|
+
// =============================================================================
|
|
10
|
+
function isCliAvailable() {
|
|
11
|
+
try {
|
|
12
|
+
execSync("claude --version", { stdio: "ignore" });
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function isDockerAvailable() {
|
|
20
|
+
try {
|
|
21
|
+
execSync("docker info", { stdio: "ignore" });
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const CLI_AVAILABLE = isCliAvailable();
|
|
29
|
+
const DOCKER_AVAILABLE = isDockerAvailable();
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// Test Helpers
|
|
32
|
+
// =============================================================================
|
|
33
|
+
async function createTempDir() {
|
|
34
|
+
const baseDir = join(tmpdir(), `herdctl-runtime-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
35
|
+
await mkdir(baseDir, { recursive: true });
|
|
36
|
+
return await realpath(baseDir);
|
|
37
|
+
}
|
|
38
|
+
function createTestAgent(overrides = {}) {
|
|
39
|
+
return {
|
|
40
|
+
name: "test-agent",
|
|
41
|
+
configPath: "/path/to/agent.yaml",
|
|
42
|
+
...overrides,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// RuntimeFactory Integration Tests
|
|
47
|
+
// =============================================================================
|
|
48
|
+
describe("RuntimeFactory Integration", () => {
|
|
49
|
+
let tempDir;
|
|
50
|
+
beforeEach(async () => {
|
|
51
|
+
tempDir = await createTempDir();
|
|
52
|
+
});
|
|
53
|
+
afterEach(async () => {
|
|
54
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
55
|
+
});
|
|
56
|
+
describe("SDK Runtime", () => {
|
|
57
|
+
it("creates SDK runtime and returns RuntimeInterface", () => {
|
|
58
|
+
const agent = createTestAgent({ runtime: "sdk" });
|
|
59
|
+
const runtime = RuntimeFactory.create(agent);
|
|
60
|
+
expect(runtime).toBeDefined();
|
|
61
|
+
expect(runtime.execute).toBeDefined();
|
|
62
|
+
expect(typeof runtime.execute).toBe("function");
|
|
63
|
+
});
|
|
64
|
+
it("SDK runtime has correct constructor name", () => {
|
|
65
|
+
const agent = createTestAgent({ runtime: "sdk" });
|
|
66
|
+
const runtime = RuntimeFactory.create(agent);
|
|
67
|
+
// Verify it's actually an SDK runtime (not wrapped)
|
|
68
|
+
expect(runtime.constructor.name).toBe("SDKRuntime");
|
|
69
|
+
});
|
|
70
|
+
it("SDK runtime execute returns AsyncIterable interface", async () => {
|
|
71
|
+
const agent = createTestAgent({ runtime: "sdk" });
|
|
72
|
+
const runtime = RuntimeFactory.create(agent);
|
|
73
|
+
// Verify the method signature is correct
|
|
74
|
+
// We can't fully test without mocking SDK internals
|
|
75
|
+
// but we verify the interface is correct
|
|
76
|
+
expect(runtime.execute).toBeDefined();
|
|
77
|
+
expect(typeof runtime.execute).toBe("function");
|
|
78
|
+
});
|
|
79
|
+
it("defaults to SDK runtime when runtime not specified", () => {
|
|
80
|
+
const agent = createTestAgent(); // No runtime specified
|
|
81
|
+
const runtime = RuntimeFactory.create(agent);
|
|
82
|
+
expect(runtime.constructor.name).toBe("SDKRuntime");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("CLI Runtime", () => {
|
|
86
|
+
it.skipIf(!CLI_AVAILABLE)("creates CLI runtime with correct interface", () => {
|
|
87
|
+
const agent = createTestAgent({ runtime: "cli" });
|
|
88
|
+
const runtime = RuntimeFactory.create(agent);
|
|
89
|
+
expect(runtime).toBeDefined();
|
|
90
|
+
expect(runtime.execute).toBeDefined();
|
|
91
|
+
expect(typeof runtime.execute).toBe("function");
|
|
92
|
+
});
|
|
93
|
+
it.skipIf(!CLI_AVAILABLE)("CLI runtime has correct constructor name", () => {
|
|
94
|
+
const agent = createTestAgent({ runtime: "cli" });
|
|
95
|
+
const runtime = RuntimeFactory.create(agent);
|
|
96
|
+
// Note: Full CLI integration would require actual claude execution
|
|
97
|
+
// which uses API credits. This test verifies setup only.
|
|
98
|
+
expect(runtime.constructor.name).toBe("CLIRuntime");
|
|
99
|
+
});
|
|
100
|
+
it.skipIf(!CLI_AVAILABLE)("CLI runtime accepts workspace parameter", () => {
|
|
101
|
+
const agent = createTestAgent({ runtime: "cli" });
|
|
102
|
+
const runtime = RuntimeFactory.create(agent);
|
|
103
|
+
// Verify runtime can be created with workspace configuration
|
|
104
|
+
expect(runtime).toBeDefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("Docker Runtime", () => {
|
|
108
|
+
it.skipIf(!DOCKER_AVAILABLE)("wraps SDK with ContainerRunner when docker enabled", () => {
|
|
109
|
+
const agent = createTestAgent({
|
|
110
|
+
runtime: "sdk",
|
|
111
|
+
docker: {
|
|
112
|
+
enabled: true,
|
|
113
|
+
image: "alpine:latest",
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const runtime = RuntimeFactory.create(agent, { stateDir: tempDir });
|
|
117
|
+
// Verify it's wrapped (ContainerRunner wraps the base runtime)
|
|
118
|
+
expect(runtime.constructor.name).toBe("ContainerRunner");
|
|
119
|
+
});
|
|
120
|
+
it.skipIf(!DOCKER_AVAILABLE)("wraps CLI with ContainerRunner when docker enabled", () => {
|
|
121
|
+
const agent = createTestAgent({
|
|
122
|
+
runtime: "cli",
|
|
123
|
+
docker: {
|
|
124
|
+
enabled: true,
|
|
125
|
+
image: "alpine:latest",
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
const runtime = RuntimeFactory.create(agent, { stateDir: tempDir });
|
|
129
|
+
expect(runtime.constructor.name).toBe("ContainerRunner");
|
|
130
|
+
});
|
|
131
|
+
it.skipIf(!DOCKER_AVAILABLE)("creates docker-sessions directory in stateDir", async () => {
|
|
132
|
+
const stateDir = join(tempDir, ".herdctl");
|
|
133
|
+
await mkdir(stateDir, { recursive: true });
|
|
134
|
+
const agent = createTestAgent({
|
|
135
|
+
docker: {
|
|
136
|
+
enabled: true,
|
|
137
|
+
image: "alpine:latest",
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
// Just verify RuntimeFactory accepts stateDir
|
|
141
|
+
const runtime = RuntimeFactory.create(agent, { stateDir });
|
|
142
|
+
expect(runtime).toBeDefined();
|
|
143
|
+
});
|
|
144
|
+
it.skipIf(!DOCKER_AVAILABLE)("defaults stateDir to .herdctl when not provided", () => {
|
|
145
|
+
const agent = createTestAgent({
|
|
146
|
+
docker: {
|
|
147
|
+
enabled: true,
|
|
148
|
+
image: "alpine:latest",
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
// Should not throw even without stateDir (uses default)
|
|
152
|
+
const runtime = RuntimeFactory.create(agent);
|
|
153
|
+
expect(runtime).toBeDefined();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// Path Translation Tests
|
|
159
|
+
// =============================================================================
|
|
160
|
+
describe("Path Translation", () => {
|
|
161
|
+
let tempDir;
|
|
162
|
+
beforeEach(async () => {
|
|
163
|
+
tempDir = await createTempDir();
|
|
164
|
+
});
|
|
165
|
+
afterEach(async () => {
|
|
166
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
167
|
+
});
|
|
168
|
+
it("workspace paths are consistent across runtime types", () => {
|
|
169
|
+
const workspace = join(tempDir, "workspace");
|
|
170
|
+
// SDK runtime uses workspace directly
|
|
171
|
+
const sdkAgent = createTestAgent({ runtime: "sdk" });
|
|
172
|
+
const sdkRuntime = RuntimeFactory.create(sdkAgent);
|
|
173
|
+
// CLI runtime also uses workspace directly (but different session storage)
|
|
174
|
+
const cliAgent = createTestAgent({ runtime: "cli" });
|
|
175
|
+
const cliRuntime = RuntimeFactory.create(cliAgent);
|
|
176
|
+
// Both should accept the same workspace path
|
|
177
|
+
expect(sdkRuntime).toBeDefined();
|
|
178
|
+
expect(cliRuntime).toBeDefined();
|
|
179
|
+
});
|
|
180
|
+
it.skipIf(!DOCKER_AVAILABLE)("Docker sessions stored separately from host sessions", async () => {
|
|
181
|
+
const stateDir = join(tempDir, ".herdctl");
|
|
182
|
+
await mkdir(stateDir, { recursive: true });
|
|
183
|
+
const agent = createTestAgent({
|
|
184
|
+
docker: {
|
|
185
|
+
enabled: true,
|
|
186
|
+
image: "alpine:latest",
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
const runtime = RuntimeFactory.create(agent, { stateDir });
|
|
190
|
+
// Docker sessions should go to docker-sessions/, not sessions/
|
|
191
|
+
// This is verified by the ContainerRunner implementation
|
|
192
|
+
expect(runtime).toBeDefined();
|
|
193
|
+
});
|
|
194
|
+
it("workspace can be specified as string", () => {
|
|
195
|
+
const agent = createTestAgent({
|
|
196
|
+
runtime: "sdk",
|
|
197
|
+
working_directory: "/path/to/workspace",
|
|
198
|
+
});
|
|
199
|
+
const runtime = RuntimeFactory.create(agent);
|
|
200
|
+
expect(runtime).toBeDefined();
|
|
201
|
+
});
|
|
202
|
+
it("workspace can be specified as object with root", () => {
|
|
203
|
+
const agent = createTestAgent({
|
|
204
|
+
runtime: "sdk",
|
|
205
|
+
working_directory: {
|
|
206
|
+
root: "/path/to/workspace",
|
|
207
|
+
auto_clone: true,
|
|
208
|
+
clone_depth: 1,
|
|
209
|
+
default_branch: "main",
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
const runtime = RuntimeFactory.create(agent);
|
|
213
|
+
expect(runtime).toBeDefined();
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// =============================================================================
|
|
217
|
+
// Error Handling Tests
|
|
218
|
+
// =============================================================================
|
|
219
|
+
describe("Runtime Error Handling", () => {
|
|
220
|
+
it("throws for invalid runtime type", () => {
|
|
221
|
+
const agent = createTestAgent({ runtime: "invalid" });
|
|
222
|
+
expect(() => RuntimeFactory.create(agent)).toThrow(/Unknown runtime type/);
|
|
223
|
+
});
|
|
224
|
+
it("includes helpful message for unknown runtime", () => {
|
|
225
|
+
const agent = createTestAgent({ runtime: "postgres" });
|
|
226
|
+
expect(() => RuntimeFactory.create(agent)).toThrow(/Supported types/);
|
|
227
|
+
});
|
|
228
|
+
it("error message lists supported runtime types", () => {
|
|
229
|
+
const agent = createTestAgent({ runtime: "invalid" });
|
|
230
|
+
try {
|
|
231
|
+
RuntimeFactory.create(agent);
|
|
232
|
+
expect.fail("Should have thrown");
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
const message = error.message;
|
|
236
|
+
expect(message).toContain("sdk");
|
|
237
|
+
expect(message).toContain("cli");
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
// =============================================================================
|
|
242
|
+
// Runtime Interface Compliance Tests
|
|
243
|
+
// =============================================================================
|
|
244
|
+
describe("Runtime Interface Compliance", () => {
|
|
245
|
+
it("all runtimes expose execute method", () => {
|
|
246
|
+
const sdkAgent = createTestAgent({ runtime: "sdk" });
|
|
247
|
+
const sdkRuntime = RuntimeFactory.create(sdkAgent);
|
|
248
|
+
expect(sdkRuntime.execute).toBeDefined();
|
|
249
|
+
expect(typeof sdkRuntime.execute).toBe("function");
|
|
250
|
+
if (CLI_AVAILABLE) {
|
|
251
|
+
const cliAgent = createTestAgent({ runtime: "cli" });
|
|
252
|
+
const cliRuntime = RuntimeFactory.create(cliAgent);
|
|
253
|
+
expect(cliRuntime.execute).toBeDefined();
|
|
254
|
+
expect(typeof cliRuntime.execute).toBe("function");
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
it("ContainerRunner preserves RuntimeInterface", () => {
|
|
258
|
+
if (!DOCKER_AVAILABLE) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const agent = createTestAgent({
|
|
262
|
+
runtime: "sdk",
|
|
263
|
+
docker: {
|
|
264
|
+
enabled: true,
|
|
265
|
+
image: "alpine:latest",
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
const runtime = RuntimeFactory.create(agent);
|
|
269
|
+
// ContainerRunner should still expose execute
|
|
270
|
+
expect(runtime.execute).toBeDefined();
|
|
271
|
+
expect(typeof runtime.execute).toBe("function");
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Runtime implementation
|
|
3
|
+
*
|
|
4
|
+
* Executes Claude agents via the Claude CLI instead of the SDK, enabling Max plan
|
|
5
|
+
* pricing for agent execution. This runtime spawns the `claude` CLI command and
|
|
6
|
+
* watches the session file for messages (since claude only outputs to TTY).
|
|
7
|
+
*
|
|
8
|
+
* Requirements:
|
|
9
|
+
* - Claude CLI must be installed (`brew install claude-ai/tap/claude`)
|
|
10
|
+
* - CLI must be authenticated (`claude login`)
|
|
11
|
+
* - Uses Max plan pricing when available
|
|
12
|
+
*
|
|
13
|
+
* The CLIRuntime provides identical streaming interface to SDKRuntime, allowing
|
|
14
|
+
* seamless runtime switching via agent configuration.
|
|
15
|
+
*/
|
|
16
|
+
import { type Subprocess } from "execa";
|
|
17
|
+
import type { RuntimeInterface, RuntimeExecuteOptions } from "./interface.js";
|
|
18
|
+
import type { SDKMessage } from "../types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Process spawner function type
|
|
21
|
+
*
|
|
22
|
+
* Spawns a claude CLI process and returns a subprocess handle.
|
|
23
|
+
* Used to allow custom process spawning (e.g., inside Docker containers).
|
|
24
|
+
*
|
|
25
|
+
* Returns Subprocess directly (not wrapped in Promise) - execa returns
|
|
26
|
+
* a special promise-like object (Subprocess) that has extra properties.
|
|
27
|
+
*
|
|
28
|
+
* @param args - CLI arguments (without prompt)
|
|
29
|
+
* @param cwd - Working directory
|
|
30
|
+
* @param prompt - Prompt text to provide via stdin (required for -p mode)
|
|
31
|
+
* @param signal - AbortSignal for cancellation
|
|
32
|
+
*/
|
|
33
|
+
export type ProcessSpawner = (args: string[], cwd: string, prompt: string, signal?: AbortSignal) => Subprocess;
|
|
34
|
+
/**
|
|
35
|
+
* CLI runtime configuration options
|
|
36
|
+
*/
|
|
37
|
+
export interface CLIRuntimeOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Custom process spawner for claude CLI execution
|
|
40
|
+
*
|
|
41
|
+
* Defaults to local execa spawning. Provide custom spawner for Docker execution.
|
|
42
|
+
*/
|
|
43
|
+
processSpawner?: ProcessSpawner;
|
|
44
|
+
/**
|
|
45
|
+
* Custom session directory override
|
|
46
|
+
*
|
|
47
|
+
* For Docker execution, this should be the host-side mount point where
|
|
48
|
+
* container session files are visible (e.g., .herdctl/docker-sessions).
|
|
49
|
+
*/
|
|
50
|
+
sessionDirOverride?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* CLI runtime implementation
|
|
54
|
+
*
|
|
55
|
+
* This runtime uses the Claude CLI to execute agents, providing an alternative
|
|
56
|
+
* backend to the SDK runtime. It spawns `claude` CLI and watches the session file
|
|
57
|
+
* for new messages (since claude only outputs stream-json to TTY).
|
|
58
|
+
*
|
|
59
|
+
* The CLI runtime enables:
|
|
60
|
+
* - Max plan pricing (cost savings vs SDK/API pricing)
|
|
61
|
+
* - Full Claude Code capabilities (identical to manual CLI usage)
|
|
62
|
+
* - AbortController support for process cancellation
|
|
63
|
+
*
|
|
64
|
+
* Supports both local and Docker execution via configurable process spawning.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* // Local execution
|
|
69
|
+
* const runtime = new CLIRuntime();
|
|
70
|
+
*
|
|
71
|
+
* // Docker execution
|
|
72
|
+
* const runtime = new CLIRuntime({
|
|
73
|
+
* processSpawner: async (args, cwd, signal) => {
|
|
74
|
+
* return execa("docker", ["exec", containerId, "sh", "-c",
|
|
75
|
+
* `cd /workspace && claude ${args.join(" ")}`],
|
|
76
|
+
* { cancelSignal: signal });
|
|
77
|
+
* },
|
|
78
|
+
* sessionDirOverride: "/path/to/.herdctl/docker-sessions"
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare class CLIRuntime implements RuntimeInterface {
|
|
83
|
+
private processSpawner;
|
|
84
|
+
private sessionDirOverride?;
|
|
85
|
+
constructor(options?: CLIRuntimeOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Execute an agent using the Claude CLI
|
|
88
|
+
*
|
|
89
|
+
* Spawns `claude` CLI and watches the session file for messages. The session
|
|
90
|
+
* file approach is used because claude only outputs stream-json to TTY, not
|
|
91
|
+
* to pipes.
|
|
92
|
+
*
|
|
93
|
+
* Process flow:
|
|
94
|
+
* 1. Build CLI arguments from execution options
|
|
95
|
+
* 2. Spawn claude subprocess (output is ignored)
|
|
96
|
+
* 3. Find the CLI session directory for the workspace
|
|
97
|
+
* 4. Wait briefly for session file to be created
|
|
98
|
+
* 5. Find the newest .jsonl file (the one just created)
|
|
99
|
+
* 6. Watch that file and stream messages as they're appended
|
|
100
|
+
* 7. Handle process completion and exit codes
|
|
101
|
+
*
|
|
102
|
+
* @param options - Execution options including prompt, agent, and session info
|
|
103
|
+
* @returns AsyncIterable of SDK messages
|
|
104
|
+
*/
|
|
105
|
+
execute(options: RuntimeExecuteOptions): AsyncIterable<SDKMessage>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=cli-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-runtime.d.ts","sourceRoot":"","sources":["../../../src/runner/runtime/cli-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,KACjB,UAAU,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,UAAW,YAAW,gBAAgB;IACjD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAS;gBAExB,OAAO,CAAC,EAAE,iBAAiB;IAYvC;;;;;;;;;;;;;;;;;;OAkBG;IACI,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,UAAU,CAAC;CAoT1E"}
|