@herdctl/core 1.3.1 → 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.
Files changed (176) hide show
  1. package/dist/config/__tests__/agent.test.js +12 -12
  2. package/dist/config/__tests__/agent.test.js.map +1 -1
  3. package/dist/config/__tests__/loader.test.js +201 -4
  4. package/dist/config/__tests__/loader.test.js.map +1 -1
  5. package/dist/config/__tests__/merge.test.js +29 -4
  6. package/dist/config/__tests__/merge.test.js.map +1 -1
  7. package/dist/config/__tests__/parser.test.js +13 -13
  8. package/dist/config/__tests__/parser.test.js.map +1 -1
  9. package/dist/config/__tests__/schema.test.js +10 -10
  10. package/dist/config/__tests__/schema.test.js.map +1 -1
  11. package/dist/config/index.d.ts +1 -1
  12. package/dist/config/index.d.ts.map +1 -1
  13. package/dist/config/index.js +2 -2
  14. package/dist/config/index.js.map +1 -1
  15. package/dist/config/loader.d.ts.map +1 -1
  16. package/dist/config/loader.js +71 -0
  17. package/dist/config/loader.js.map +1 -1
  18. package/dist/config/merge.d.ts +4 -1
  19. package/dist/config/merge.d.ts.map +1 -1
  20. package/dist/config/merge.js +16 -0
  21. package/dist/config/merge.js.map +1 -1
  22. package/dist/config/schema.d.ts +906 -89
  23. package/dist/config/schema.d.ts.map +1 -1
  24. package/dist/config/schema.js +109 -7
  25. package/dist/config/schema.js.map +1 -1
  26. package/dist/fleet-manager/__tests__/coverage.test.js +25 -24
  27. package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
  28. package/dist/fleet-manager/__tests__/discord-manager.test.js +9 -2
  29. package/dist/fleet-manager/__tests__/discord-manager.test.js.map +1 -1
  30. package/dist/fleet-manager/__tests__/integration.test.js +27 -0
  31. package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
  32. package/dist/fleet-manager/__tests__/job-control.test.js +66 -0
  33. package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -1
  34. package/dist/fleet-manager/__tests__/status-queries.test.js +12 -11
  35. package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -1
  36. package/dist/fleet-manager/config-reload.js +9 -9
  37. package/dist/fleet-manager/config-reload.js.map +1 -1
  38. package/dist/fleet-manager/discord-manager.d.ts.map +1 -1
  39. package/dist/fleet-manager/discord-manager.js +27 -4
  40. package/dist/fleet-manager/discord-manager.js.map +1 -1
  41. package/dist/fleet-manager/fleet-manager.d.ts +11 -0
  42. package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
  43. package/dist/fleet-manager/fleet-manager.js +27 -0
  44. package/dist/fleet-manager/fleet-manager.js.map +1 -1
  45. package/dist/fleet-manager/job-control.d.ts +1 -1
  46. package/dist/fleet-manager/job-control.d.ts.map +1 -1
  47. package/dist/fleet-manager/job-control.js +36 -14
  48. package/dist/fleet-manager/job-control.js.map +1 -1
  49. package/dist/fleet-manager/schedule-executor.d.ts +1 -1
  50. package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
  51. package/dist/fleet-manager/schedule-executor.js +11 -14
  52. package/dist/fleet-manager/schedule-executor.js.map +1 -1
  53. package/dist/fleet-manager/status-queries.js +7 -7
  54. package/dist/fleet-manager/status-queries.js.map +1 -1
  55. package/dist/fleet-manager/types.d.ts +10 -2
  56. package/dist/fleet-manager/types.d.ts.map +1 -1
  57. package/dist/fleet-manager/working-directory-helper.d.ts +29 -0
  58. package/dist/fleet-manager/working-directory-helper.d.ts.map +1 -0
  59. package/dist/fleet-manager/working-directory-helper.js +36 -0
  60. package/dist/fleet-manager/working-directory-helper.js.map +1 -0
  61. package/dist/runner/__tests__/job-executor.test.js +449 -118
  62. package/dist/runner/__tests__/job-executor.test.js.map +1 -1
  63. package/dist/runner/__tests__/sdk-adapter.test.js +137 -2
  64. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
  65. package/dist/runner/index.d.ts +2 -0
  66. package/dist/runner/index.d.ts.map +1 -1
  67. package/dist/runner/index.js +1 -0
  68. package/dist/runner/index.js.map +1 -1
  69. package/dist/runner/job-executor.d.ts +12 -8
  70. package/dist/runner/job-executor.d.ts.map +1 -1
  71. package/dist/runner/job-executor.js +257 -132
  72. package/dist/runner/job-executor.js.map +1 -1
  73. package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts +2 -0
  74. package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts.map +1 -0
  75. package/dist/runner/runtime/__tests__/cli-session-path.test.js +150 -0
  76. package/dist/runner/runtime/__tests__/cli-session-path.test.js.map +1 -0
  77. package/dist/runner/runtime/__tests__/docker-config.test.d.ts +2 -0
  78. package/dist/runner/runtime/__tests__/docker-config.test.d.ts.map +1 -0
  79. package/dist/runner/runtime/__tests__/docker-config.test.js +352 -0
  80. package/dist/runner/runtime/__tests__/docker-config.test.js.map +1 -0
  81. package/dist/runner/runtime/__tests__/docker-security.test.d.ts +2 -0
  82. package/dist/runner/runtime/__tests__/docker-security.test.d.ts.map +1 -0
  83. package/dist/runner/runtime/__tests__/docker-security.test.js +384 -0
  84. package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -0
  85. package/dist/runner/runtime/__tests__/factory.test.d.ts +2 -0
  86. package/dist/runner/runtime/__tests__/factory.test.d.ts.map +1 -0
  87. package/dist/runner/runtime/__tests__/factory.test.js +149 -0
  88. package/dist/runner/runtime/__tests__/factory.test.js.map +1 -0
  89. package/dist/runner/runtime/__tests__/integration.test.d.ts +2 -0
  90. package/dist/runner/runtime/__tests__/integration.test.d.ts.map +1 -0
  91. package/dist/runner/runtime/__tests__/integration.test.js +274 -0
  92. package/dist/runner/runtime/__tests__/integration.test.js.map +1 -0
  93. package/dist/runner/runtime/cli-runtime.d.ts +107 -0
  94. package/dist/runner/runtime/cli-runtime.d.ts.map +1 -0
  95. package/dist/runner/runtime/cli-runtime.js +335 -0
  96. package/dist/runner/runtime/cli-runtime.js.map +1 -0
  97. package/dist/runner/runtime/cli-session-path.d.ts +108 -0
  98. package/dist/runner/runtime/cli-session-path.d.ts.map +1 -0
  99. package/dist/runner/runtime/cli-session-path.js +173 -0
  100. package/dist/runner/runtime/cli-session-path.js.map +1 -0
  101. package/dist/runner/runtime/cli-session-watcher.d.ts +55 -0
  102. package/dist/runner/runtime/cli-session-watcher.d.ts.map +1 -0
  103. package/dist/runner/runtime/cli-session-watcher.js +187 -0
  104. package/dist/runner/runtime/cli-session-watcher.js.map +1 -0
  105. package/dist/runner/runtime/container-manager.d.ts +76 -0
  106. package/dist/runner/runtime/container-manager.d.ts.map +1 -0
  107. package/dist/runner/runtime/container-manager.js +229 -0
  108. package/dist/runner/runtime/container-manager.js.map +1 -0
  109. package/dist/runner/runtime/container-runner.d.ts +62 -0
  110. package/dist/runner/runtime/container-runner.d.ts.map +1 -0
  111. package/dist/runner/runtime/container-runner.js +235 -0
  112. package/dist/runner/runtime/container-runner.js.map +1 -0
  113. package/dist/runner/runtime/docker-config.d.ts +100 -0
  114. package/dist/runner/runtime/docker-config.d.ts.map +1 -0
  115. package/dist/runner/runtime/docker-config.js +98 -0
  116. package/dist/runner/runtime/docker-config.js.map +1 -0
  117. package/dist/runner/runtime/factory.d.ts +63 -0
  118. package/dist/runner/runtime/factory.d.ts.map +1 -0
  119. package/dist/runner/runtime/factory.js +68 -0
  120. package/dist/runner/runtime/factory.js.map +1 -0
  121. package/dist/runner/runtime/index.d.ts +20 -0
  122. package/dist/runner/runtime/index.d.ts.map +1 -0
  123. package/dist/runner/runtime/index.js +21 -0
  124. package/dist/runner/runtime/index.js.map +1 -0
  125. package/dist/runner/runtime/interface.d.ts +59 -0
  126. package/dist/runner/runtime/interface.d.ts.map +1 -0
  127. package/dist/runner/runtime/interface.js +12 -0
  128. package/dist/runner/runtime/interface.js.map +1 -0
  129. package/dist/runner/runtime/sdk-runtime.d.ts +46 -0
  130. package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -0
  131. package/dist/runner/runtime/sdk-runtime.js +63 -0
  132. package/dist/runner/runtime/sdk-runtime.js.map +1 -0
  133. package/dist/runner/sdk-adapter.d.ts.map +1 -1
  134. package/dist/runner/sdk-adapter.js +28 -10
  135. package/dist/runner/sdk-adapter.js.map +1 -1
  136. package/dist/runner/types.d.ts +5 -1
  137. package/dist/runner/types.d.ts.map +1 -1
  138. package/dist/scheduler/__tests__/schedule-runner.test.js +61 -50
  139. package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -1
  140. package/dist/scheduler/schedule-runner.d.ts +1 -4
  141. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  142. package/dist/scheduler/schedule-runner.js +40 -8
  143. package/dist/scheduler/schedule-runner.js.map +1 -1
  144. package/dist/state/__tests__/session-schema.test.js +4 -0
  145. package/dist/state/__tests__/session-schema.test.js.map +1 -1
  146. package/dist/state/__tests__/session-validation.test.d.ts +2 -0
  147. package/dist/state/__tests__/session-validation.test.d.ts.map +1 -0
  148. package/dist/state/__tests__/session-validation.test.js +446 -0
  149. package/dist/state/__tests__/session-validation.test.js.map +1 -0
  150. package/dist/state/__tests__/session.test.js +68 -0
  151. package/dist/state/__tests__/session.test.js.map +1 -1
  152. package/dist/state/__tests__/working-directory-validation.test.d.ts +5 -0
  153. package/dist/state/__tests__/working-directory-validation.test.d.ts.map +1 -0
  154. package/dist/state/__tests__/working-directory-validation.test.js +101 -0
  155. package/dist/state/__tests__/working-directory-validation.test.js.map +1 -0
  156. package/dist/state/index.d.ts +2 -0
  157. package/dist/state/index.d.ts.map +1 -1
  158. package/dist/state/index.js +4 -0
  159. package/dist/state/index.js.map +1 -1
  160. package/dist/state/schemas/session-info.d.ts +32 -0
  161. package/dist/state/schemas/session-info.d.ts.map +1 -1
  162. package/dist/state/schemas/session-info.js +22 -0
  163. package/dist/state/schemas/session-info.js.map +1 -1
  164. package/dist/state/session-validation.d.ts +202 -0
  165. package/dist/state/session-validation.d.ts.map +1 -0
  166. package/dist/state/session-validation.js +407 -0
  167. package/dist/state/session-validation.js.map +1 -0
  168. package/dist/state/session.d.ts +23 -3
  169. package/dist/state/session.d.ts.map +1 -1
  170. package/dist/state/session.js +41 -6
  171. package/dist/state/session.js.map +1 -1
  172. package/dist/state/working-directory-validation.d.ts +52 -0
  173. package/dist/state/working-directory-validation.d.ts.map +1 -0
  174. package/dist/state/working-directory-validation.js +81 -0
  175. package/dist/state/working-directory-validation.js.map +1 -0
  176. package/package.json +7 -2
@@ -0,0 +1,150 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { encodePathForCli, getCliSessionDir, getCliSessionFile, } from "../cli-session-path.js";
5
+ describe("encodePathForCli", () => {
6
+ describe("Unix path encoding", () => {
7
+ it("encodes forward slashes to hyphens", () => {
8
+ expect(encodePathForCli("/home/user/project")).toBe("-home-user-project");
9
+ });
10
+ it("handles paths with multiple consecutive slashes", () => {
11
+ expect(encodePathForCli("/path//double")).toBe("-path--double");
12
+ });
13
+ it("handles root path", () => {
14
+ expect(encodePathForCli("/")).toBe("-");
15
+ });
16
+ it("handles relative path", () => {
17
+ expect(encodePathForCli("relative/path")).toBe("relative-path");
18
+ });
19
+ it("handles deeply nested paths", () => {
20
+ expect(encodePathForCli("/usr/local/share/project/src/components")).toBe("-usr-local-share-project-src-components");
21
+ });
22
+ it("handles path with trailing slash", () => {
23
+ expect(encodePathForCli("/path/to/project/")).toBe("-path-to-project-");
24
+ });
25
+ it("handles path with special characters", () => {
26
+ // Only slashes are encoded, other characters pass through
27
+ expect(encodePathForCli("/path/to/my-project_v2")).toBe("-path-to-my-project_v2");
28
+ });
29
+ });
30
+ describe("Windows path encoding", () => {
31
+ it("encodes backslashes to hyphens", () => {
32
+ expect(encodePathForCli("C:\\Users\\test")).toBe("C:-Users-test");
33
+ });
34
+ it("encodes forward slashes in Windows paths", () => {
35
+ expect(encodePathForCli("C:/Users/test")).toBe("C:-Users-test");
36
+ });
37
+ it("encodes mixed slashes", () => {
38
+ expect(encodePathForCli("C:\\Users/test\\project")).toBe("C:-Users-test-project");
39
+ });
40
+ it("handles UNC paths", () => {
41
+ expect(encodePathForCli("\\\\server\\share\\folder")).toBe("--server-share-folder");
42
+ });
43
+ });
44
+ describe("edge cases", () => {
45
+ it("handles empty string", () => {
46
+ expect(encodePathForCli("")).toBe("");
47
+ });
48
+ it("handles path with only slashes", () => {
49
+ expect(encodePathForCli("///")).toBe("---");
50
+ });
51
+ it("handles single segment", () => {
52
+ expect(encodePathForCli("project")).toBe("project");
53
+ });
54
+ });
55
+ });
56
+ describe("getCliSessionDir", () => {
57
+ it("returns .claude/projects/encoded-path inside home dir", () => {
58
+ const workspacePath = "/workspace/myproject";
59
+ const result = getCliSessionDir(workspacePath);
60
+ expect(result).toContain(".claude");
61
+ expect(result).toContain("projects");
62
+ expect(result).toContain("-workspace-myproject");
63
+ });
64
+ it("uses homedir as base", () => {
65
+ const workspacePath = "/workspace/myproject";
66
+ const result = getCliSessionDir(workspacePath);
67
+ const expectedBase = join(homedir(), ".claude", "projects");
68
+ expect(result.startsWith(expectedBase)).toBe(true);
69
+ });
70
+ it("encodes workspace path correctly", () => {
71
+ const workspacePath = "/Users/ed/Code/herdctl";
72
+ const result = getCliSessionDir(workspacePath);
73
+ expect(result).toBe(join(homedir(), ".claude", "projects", "-Users-ed-Code-herdctl"));
74
+ });
75
+ it("handles different workspace paths", () => {
76
+ const paths = [
77
+ "/workspace/project1",
78
+ "/workspace/project2",
79
+ "/different/path",
80
+ ];
81
+ const results = paths.map((p) => getCliSessionDir(p));
82
+ // Each should be unique
83
+ expect(new Set(results).size).toBe(paths.length);
84
+ // All should be in .claude/projects
85
+ results.forEach((r) => {
86
+ expect(r).toContain(".claude");
87
+ expect(r).toContain("projects");
88
+ });
89
+ });
90
+ it("handles workspace path with trailing slash", () => {
91
+ const result1 = getCliSessionDir("/workspace/project");
92
+ const result2 = getCliSessionDir("/workspace/project/");
93
+ // Should differ by one trailing hyphen
94
+ expect(result2).toBe(result1 + "-");
95
+ });
96
+ });
97
+ describe("getCliSessionFile", () => {
98
+ it("returns session file path with .jsonl extension", () => {
99
+ const workspacePath = "/workspace/myproject";
100
+ const sessionId = "dda6da5b-8788-4990-a582-d5a2c63fbfba";
101
+ const result = getCliSessionFile(workspacePath, sessionId);
102
+ expect(result).toContain(".claude");
103
+ expect(result).toContain("projects");
104
+ expect(result).toContain("-workspace-myproject");
105
+ expect(result).toContain(sessionId);
106
+ expect(result.endsWith(".jsonl")).toBe(true);
107
+ });
108
+ it("joins session dir and session file correctly", () => {
109
+ const workspacePath = "/Users/ed/Code/herdctl";
110
+ const sessionId = "abc123";
111
+ const result = getCliSessionFile(workspacePath, sessionId);
112
+ const expectedDir = getCliSessionDir(workspacePath);
113
+ const expectedFile = join(expectedDir, `${sessionId}.jsonl`);
114
+ expect(result).toBe(expectedFile);
115
+ });
116
+ it("handles different session IDs", () => {
117
+ const workspacePath = "/workspace/project";
118
+ const sessionIds = [
119
+ "session-1",
120
+ "session-2",
121
+ "dda6da5b-8788-4990-a582-d5a2c63fbfba",
122
+ ];
123
+ const results = sessionIds.map((id) => getCliSessionFile(workspacePath, id));
124
+ // Each should be unique
125
+ expect(new Set(results).size).toBe(sessionIds.length);
126
+ // All should end with .jsonl
127
+ results.forEach((r) => {
128
+ expect(r.endsWith(".jsonl")).toBe(true);
129
+ });
130
+ // All should contain the session ID
131
+ results.forEach((r, i) => {
132
+ expect(r).toContain(sessionIds[i]);
133
+ });
134
+ });
135
+ it("constructs correct path components", () => {
136
+ const workspacePath = "/workspace/project";
137
+ const sessionId = "test-session";
138
+ const result = getCliSessionFile(workspacePath, sessionId);
139
+ const expectedPath = join(homedir(), ".claude", "projects", "-workspace-project", "test-session.jsonl");
140
+ expect(result).toBe(expectedPath);
141
+ });
142
+ it("handles UUID format session IDs", () => {
143
+ const workspacePath = "/workspace/project";
144
+ const sessionId = "dda6da5b-8788-4990-a582-d5a2c63fbfba";
145
+ const result = getCliSessionFile(workspacePath, sessionId);
146
+ expect(result).toContain(sessionId);
147
+ expect(result).toMatch(/dda6da5b-8788-4990-a582-d5a2c63fbfba\.jsonl$/);
148
+ });
149
+ });
150
+ //# sourceMappingURL=cli-session-path.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-session-path.test.js","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/cli-session-path.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=docker-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-config.test.d.ts","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/docker-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,352 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { parseMemoryToBytes, parseVolumeMount, getHostUser, resolveDockerConfig, DEFAULT_DOCKER_IMAGE, DEFAULT_MEMORY_LIMIT, DEFAULT_MAX_CONTAINERS, } from "../docker-config.js";
3
+ describe("parseMemoryToBytes", () => {
4
+ describe("valid formats", () => {
5
+ it("parses bytes (no suffix)", () => {
6
+ expect(parseMemoryToBytes("1024")).toBe(1024);
7
+ expect(parseMemoryToBytes("2048")).toBe(2048);
8
+ });
9
+ it("parses kilobytes", () => {
10
+ expect(parseMemoryToBytes("1k")).toBe(1024);
11
+ expect(parseMemoryToBytes("1K")).toBe(1024);
12
+ expect(parseMemoryToBytes("1kb")).toBe(1024);
13
+ expect(parseMemoryToBytes("1KB")).toBe(1024);
14
+ expect(parseMemoryToBytes("512k")).toBe(512 * 1024);
15
+ });
16
+ it("parses megabytes", () => {
17
+ expect(parseMemoryToBytes("1m")).toBe(1024 * 1024);
18
+ expect(parseMemoryToBytes("512M")).toBe(512 * 1024 * 1024);
19
+ expect(parseMemoryToBytes("1mb")).toBe(1024 * 1024);
20
+ expect(parseMemoryToBytes("1MB")).toBe(1024 * 1024);
21
+ });
22
+ it("parses gigabytes", () => {
23
+ expect(parseMemoryToBytes("1g")).toBe(1024 * 1024 * 1024);
24
+ expect(parseMemoryToBytes("2G")).toBe(2 * 1024 * 1024 * 1024);
25
+ expect(parseMemoryToBytes("2gb")).toBe(2 * 1024 * 1024 * 1024);
26
+ expect(parseMemoryToBytes("2GB")).toBe(2 * 1024 * 1024 * 1024);
27
+ });
28
+ it("parses terabytes", () => {
29
+ expect(parseMemoryToBytes("1t")).toBe(1024 * 1024 * 1024 * 1024);
30
+ expect(parseMemoryToBytes("1T")).toBe(1024 * 1024 * 1024 * 1024);
31
+ expect(parseMemoryToBytes("1tb")).toBe(1024 * 1024 * 1024 * 1024);
32
+ });
33
+ it("handles decimal values", () => {
34
+ expect(parseMemoryToBytes("1.5g")).toBe(Math.floor(1.5 * 1024 * 1024 * 1024));
35
+ expect(parseMemoryToBytes("0.5m")).toBe(Math.floor(0.5 * 1024 * 1024));
36
+ expect(parseMemoryToBytes("2.25g")).toBe(Math.floor(2.25 * 1024 * 1024 * 1024));
37
+ });
38
+ it("handles whitespace around value", () => {
39
+ expect(parseMemoryToBytes("1 g")).toBe(1024 * 1024 * 1024);
40
+ expect(parseMemoryToBytes("512 m")).toBe(512 * 1024 * 1024);
41
+ });
42
+ it("handles case-insensitive units", () => {
43
+ expect(parseMemoryToBytes("1K")).toBe(parseMemoryToBytes("1k"));
44
+ expect(parseMemoryToBytes("1M")).toBe(parseMemoryToBytes("1m"));
45
+ expect(parseMemoryToBytes("1G")).toBe(parseMemoryToBytes("1g"));
46
+ expect(parseMemoryToBytes("1T")).toBe(parseMemoryToBytes("1t"));
47
+ });
48
+ });
49
+ describe("invalid formats", () => {
50
+ it("throws for empty string", () => {
51
+ expect(() => parseMemoryToBytes("")).toThrow("Invalid memory format");
52
+ });
53
+ it("throws for invalid suffix", () => {
54
+ expect(() => parseMemoryToBytes("1x")).toThrow("Invalid memory format");
55
+ expect(() => parseMemoryToBytes("1z")).toThrow("Invalid memory format");
56
+ });
57
+ it("throws for negative values", () => {
58
+ expect(() => parseMemoryToBytes("-1g")).toThrow("Invalid memory format");
59
+ expect(() => parseMemoryToBytes("-512m")).toThrow("Invalid memory format");
60
+ });
61
+ it("throws for non-numeric", () => {
62
+ expect(() => parseMemoryToBytes("abc")).toThrow("Invalid memory format");
63
+ expect(() => parseMemoryToBytes("notanumber")).toThrow("Invalid memory format");
64
+ });
65
+ it("throws for just units", () => {
66
+ expect(() => parseMemoryToBytes("g")).toThrow("Invalid memory format");
67
+ expect(() => parseMemoryToBytes("mb")).toThrow("Invalid memory format");
68
+ });
69
+ });
70
+ });
71
+ describe("parseVolumeMount", () => {
72
+ describe("valid formats", () => {
73
+ it("parses host:container (default rw)", () => {
74
+ const result = parseVolumeMount("/host/path:/container/path");
75
+ expect(result).toEqual({
76
+ hostPath: "/host/path",
77
+ containerPath: "/container/path",
78
+ mode: "rw",
79
+ });
80
+ });
81
+ it("parses host:container:ro", () => {
82
+ const result = parseVolumeMount("/host/path:/container/path:ro");
83
+ expect(result).toEqual({
84
+ hostPath: "/host/path",
85
+ containerPath: "/container/path",
86
+ mode: "ro",
87
+ });
88
+ });
89
+ it("parses host:container:rw explicitly", () => {
90
+ const result = parseVolumeMount("/host/path:/container/path:rw");
91
+ expect(result).toEqual({
92
+ hostPath: "/host/path",
93
+ containerPath: "/container/path",
94
+ mode: "rw",
95
+ });
96
+ });
97
+ it("handles paths with spaces", () => {
98
+ const result = parseVolumeMount("/path with spaces:/container path");
99
+ expect(result).toEqual({
100
+ hostPath: "/path with spaces",
101
+ containerPath: "/container path",
102
+ mode: "rw",
103
+ });
104
+ });
105
+ it("handles relative paths", () => {
106
+ const result = parseVolumeMount("./local:/container");
107
+ expect(result).toEqual({
108
+ hostPath: "./local",
109
+ containerPath: "/container",
110
+ mode: "rw",
111
+ });
112
+ });
113
+ });
114
+ describe("invalid formats", () => {
115
+ it("throws for single path", () => {
116
+ expect(() => parseVolumeMount("/only/one")).toThrow("Invalid volume format");
117
+ });
118
+ it("throws for too many colons", () => {
119
+ expect(() => parseVolumeMount("/a:/b:ro:extra")).toThrow("Invalid volume format");
120
+ });
121
+ it("throws for invalid mode", () => {
122
+ expect(() => parseVolumeMount("/a:/b:invalid")).toThrow("Invalid volume mode");
123
+ expect(() => parseVolumeMount("/a:/b:rw2")).toThrow("Invalid volume mode");
124
+ expect(() => parseVolumeMount("/a:/b:readonly")).toThrow("Invalid volume mode");
125
+ });
126
+ it("throws for empty string", () => {
127
+ expect(() => parseVolumeMount("")).toThrow("Invalid volume format");
128
+ });
129
+ it("allows empty path components (Docker accepts them)", () => {
130
+ // Docker allows :: which creates empty paths
131
+ const result = parseVolumeMount("::");
132
+ expect(result).toEqual({
133
+ hostPath: "",
134
+ containerPath: "",
135
+ mode: "rw",
136
+ });
137
+ });
138
+ });
139
+ });
140
+ describe("getHostUser", () => {
141
+ it("returns UID:GID format", () => {
142
+ const user = getHostUser();
143
+ expect(user).toMatch(/^\d+:\d+$/);
144
+ });
145
+ it("returns consistent value on multiple calls", () => {
146
+ const user1 = getHostUser();
147
+ const user2 = getHostUser();
148
+ expect(user1).toBe(user2);
149
+ });
150
+ it("uses process.getuid and process.getgid when available", () => {
151
+ // On POSIX systems, these should return actual values
152
+ if (process.getuid && process.getgid) {
153
+ const user = getHostUser();
154
+ const expectedUid = process.getuid();
155
+ const expectedGid = process.getgid();
156
+ expect(user).toBe(`${expectedUid}:${expectedGid}`);
157
+ }
158
+ });
159
+ it("falls back to 1000:1000 on Windows", () => {
160
+ // On Windows, getuid/getgid don't exist, should fall back
161
+ // Can't easily test this without platform detection
162
+ const user = getHostUser();
163
+ expect(user).toBeTruthy();
164
+ expect(user.split(":")).toHaveLength(2);
165
+ });
166
+ });
167
+ describe("resolveDockerConfig", () => {
168
+ describe("defaults", () => {
169
+ it("applies defaults when called with undefined", () => {
170
+ const config = resolveDockerConfig(undefined);
171
+ expect(config.enabled).toBe(false);
172
+ expect(config.ephemeral).toBe(true);
173
+ expect(config.image).toBe(DEFAULT_DOCKER_IMAGE);
174
+ expect(config.network).toBe("bridge");
175
+ expect(config.memoryBytes).toBe(parseMemoryToBytes(DEFAULT_MEMORY_LIMIT));
176
+ expect(config.maxContainers).toBe(DEFAULT_MAX_CONTAINERS);
177
+ expect(config.workspaceMode).toBe("rw");
178
+ expect(config.volumes).toEqual([]);
179
+ expect(config.user).toMatch(/^\d+:\d+$/);
180
+ });
181
+ it("applies defaults when called with empty object", () => {
182
+ const config = resolveDockerConfig({});
183
+ expect(config.enabled).toBe(false);
184
+ expect(config.image).toBe(DEFAULT_DOCKER_IMAGE);
185
+ expect(config.network).toBe("bridge");
186
+ });
187
+ it("uses default memory limit", () => {
188
+ const config = resolveDockerConfig({});
189
+ expect(config.memoryBytes).toBe(parseMemoryToBytes("2g"));
190
+ });
191
+ it("uses default max containers", () => {
192
+ const config = resolveDockerConfig({});
193
+ expect(config.maxContainers).toBe(5);
194
+ });
195
+ it("defaults cpuShares to undefined", () => {
196
+ const config = resolveDockerConfig({});
197
+ expect(config.cpuShares).toBeUndefined();
198
+ });
199
+ });
200
+ describe("field overrides", () => {
201
+ it("respects enabled flag", () => {
202
+ const config = resolveDockerConfig({ enabled: true });
203
+ expect(config.enabled).toBe(true);
204
+ });
205
+ it("respects custom image", () => {
206
+ const config = resolveDockerConfig({ image: "custom:latest" });
207
+ expect(config.image).toBe("custom:latest");
208
+ });
209
+ it("respects network mode", () => {
210
+ const configNone = resolveDockerConfig({ network: "none" });
211
+ expect(configNone.network).toBe("none");
212
+ const configHost = resolveDockerConfig({ network: "host" });
213
+ expect(configHost.network).toBe("host");
214
+ const configBridge = resolveDockerConfig({ network: "bridge" });
215
+ expect(configBridge.network).toBe("bridge");
216
+ });
217
+ it("respects custom memory", () => {
218
+ const config = resolveDockerConfig({ memory: "4g" });
219
+ expect(config.memoryBytes).toBe(4 * 1024 * 1024 * 1024);
220
+ });
221
+ it("respects cpu_shares", () => {
222
+ const config = resolveDockerConfig({ cpu_shares: 512 });
223
+ expect(config.cpuShares).toBe(512);
224
+ });
225
+ it("respects custom user", () => {
226
+ const config = resolveDockerConfig({ user: "1001:1001" });
227
+ expect(config.user).toBe("1001:1001");
228
+ });
229
+ it("respects workspace_mode", () => {
230
+ const configRo = resolveDockerConfig({ workspace_mode: "ro" });
231
+ expect(configRo.workspaceMode).toBe("ro");
232
+ const configRw = resolveDockerConfig({ workspace_mode: "rw" });
233
+ expect(configRw.workspaceMode).toBe("rw");
234
+ });
235
+ it("respects ephemeral flag", () => {
236
+ const config = resolveDockerConfig({ ephemeral: true });
237
+ expect(config.ephemeral).toBe(true);
238
+ });
239
+ it("respects max_containers", () => {
240
+ const config = resolveDockerConfig({ max_containers: 10 });
241
+ expect(config.maxContainers).toBe(10);
242
+ });
243
+ });
244
+ describe("volume parsing", () => {
245
+ it("parses volume array", () => {
246
+ const config = resolveDockerConfig({
247
+ volumes: ["/data:/data:ro", "/cache:/cache:rw"],
248
+ });
249
+ expect(config.volumes).toHaveLength(2);
250
+ expect(config.volumes[0]).toEqual({
251
+ hostPath: "/data",
252
+ containerPath: "/data",
253
+ mode: "ro",
254
+ });
255
+ expect(config.volumes[1]).toEqual({
256
+ hostPath: "/cache",
257
+ containerPath: "/cache",
258
+ mode: "rw",
259
+ });
260
+ });
261
+ it("handles empty volumes array", () => {
262
+ const config = resolveDockerConfig({ volumes: [] });
263
+ expect(config.volumes).toEqual([]);
264
+ });
265
+ it("handles undefined volumes", () => {
266
+ const config = resolveDockerConfig({});
267
+ expect(config.volumes).toEqual([]);
268
+ });
269
+ });
270
+ describe("base_image alias", () => {
271
+ it("handles base_image as alias for image", () => {
272
+ const config = resolveDockerConfig({
273
+ enabled: true,
274
+ base_image: "legacy:tag",
275
+ });
276
+ expect(config.image).toBe("legacy:tag");
277
+ });
278
+ it("prefers image over base_image", () => {
279
+ const config = resolveDockerConfig({
280
+ enabled: true,
281
+ image: "preferred:tag",
282
+ base_image: "legacy:tag",
283
+ });
284
+ expect(config.image).toBe("preferred:tag");
285
+ });
286
+ it("uses base_image when image not specified", () => {
287
+ const config = resolveDockerConfig({
288
+ base_image: "myimage:v1",
289
+ });
290
+ expect(config.image).toBe("myimage:v1");
291
+ });
292
+ });
293
+ describe("complex configurations", () => {
294
+ it("handles all options together", () => {
295
+ const config = resolveDockerConfig({
296
+ enabled: true,
297
+ image: "custom:latest",
298
+ network: "none",
299
+ memory: "4g",
300
+ cpu_shares: 512,
301
+ user: "1001:1001",
302
+ workspace_mode: "ro",
303
+ ephemeral: true,
304
+ max_containers: 10,
305
+ volumes: ["/data:/data:ro"],
306
+ });
307
+ expect(config.enabled).toBe(true);
308
+ expect(config.image).toBe("custom:latest");
309
+ expect(config.network).toBe("none");
310
+ expect(config.memoryBytes).toBe(4 * 1024 * 1024 * 1024);
311
+ expect(config.cpuShares).toBe(512);
312
+ expect(config.user).toBe("1001:1001");
313
+ expect(config.workspaceMode).toBe("ro");
314
+ expect(config.ephemeral).toBe(true);
315
+ expect(config.maxContainers).toBe(10);
316
+ expect(config.volumes).toHaveLength(1);
317
+ expect(config.volumes[0].hostPath).toBe("/data");
318
+ });
319
+ it("mixes defaults and overrides", () => {
320
+ const config = resolveDockerConfig({
321
+ enabled: true,
322
+ memory: "8g",
323
+ volumes: ["/custom:/custom"],
324
+ });
325
+ // Overridden values
326
+ expect(config.enabled).toBe(true);
327
+ expect(config.memoryBytes).toBe(8 * 1024 * 1024 * 1024);
328
+ expect(config.volumes).toHaveLength(1);
329
+ // Default values
330
+ expect(config.image).toBe(DEFAULT_DOCKER_IMAGE);
331
+ expect(config.network).toBe("bridge");
332
+ expect(config.maxContainers).toBe(DEFAULT_MAX_CONTAINERS);
333
+ expect(config.workspaceMode).toBe("rw");
334
+ });
335
+ });
336
+ });
337
+ describe("constants", () => {
338
+ it("DEFAULT_DOCKER_IMAGE is set correctly", () => {
339
+ expect(DEFAULT_DOCKER_IMAGE).toBe("herdctl/runtime:latest");
340
+ });
341
+ it("DEFAULT_MEMORY_LIMIT is 2g", () => {
342
+ expect(DEFAULT_MEMORY_LIMIT).toBe("2g");
343
+ });
344
+ it("DEFAULT_MAX_CONTAINERS is 5", () => {
345
+ expect(DEFAULT_MAX_CONTAINERS).toBe(5);
346
+ });
347
+ it("default memory limit parses correctly", () => {
348
+ const bytes = parseMemoryToBytes(DEFAULT_MEMORY_LIMIT);
349
+ expect(bytes).toBe(2 * 1024 * 1024 * 1024);
350
+ });
351
+ });
352
+ //# sourceMappingURL=docker-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-config.test.js","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/docker-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=docker-security.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-security.test.d.ts","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/docker-security.test.ts"],"names":[],"mappings":""}