@herdctl/core 1.3.1 → 2.0.1

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 (187) 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 +17 -17
  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/hooks/__tests__/discord-runner.test.js +16 -16
  62. package/dist/hooks/__tests__/discord-runner.test.js.map +1 -1
  63. package/dist/hooks/runners/discord.d.ts.map +1 -1
  64. package/dist/hooks/runners/discord.js +15 -12
  65. package/dist/hooks/runners/discord.js.map +1 -1
  66. package/dist/runner/__tests__/job-executor.test.js +461 -126
  67. package/dist/runner/__tests__/job-executor.test.js.map +1 -1
  68. package/dist/runner/__tests__/message-processor.test.js +12 -35
  69. package/dist/runner/__tests__/message-processor.test.js.map +1 -1
  70. package/dist/runner/__tests__/sdk-adapter.test.js +137 -2
  71. package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
  72. package/dist/runner/index.d.ts +2 -0
  73. package/dist/runner/index.d.ts.map +1 -1
  74. package/dist/runner/index.js +1 -0
  75. package/dist/runner/index.js.map +1 -1
  76. package/dist/runner/job-executor.d.ts +12 -8
  77. package/dist/runner/job-executor.d.ts.map +1 -1
  78. package/dist/runner/job-executor.js +280 -133
  79. package/dist/runner/job-executor.js.map +1 -1
  80. package/dist/runner/message-processor.d.ts +5 -2
  81. package/dist/runner/message-processor.d.ts.map +1 -1
  82. package/dist/runner/message-processor.js +9 -18
  83. package/dist/runner/message-processor.js.map +1 -1
  84. package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts +2 -0
  85. package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts.map +1 -0
  86. package/dist/runner/runtime/__tests__/cli-session-path.test.js +150 -0
  87. package/dist/runner/runtime/__tests__/cli-session-path.test.js.map +1 -0
  88. package/dist/runner/runtime/__tests__/docker-config.test.d.ts +2 -0
  89. package/dist/runner/runtime/__tests__/docker-config.test.d.ts.map +1 -0
  90. package/dist/runner/runtime/__tests__/docker-config.test.js +352 -0
  91. package/dist/runner/runtime/__tests__/docker-config.test.js.map +1 -0
  92. package/dist/runner/runtime/__tests__/docker-security.test.d.ts +2 -0
  93. package/dist/runner/runtime/__tests__/docker-security.test.d.ts.map +1 -0
  94. package/dist/runner/runtime/__tests__/docker-security.test.js +384 -0
  95. package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -0
  96. package/dist/runner/runtime/__tests__/factory.test.d.ts +2 -0
  97. package/dist/runner/runtime/__tests__/factory.test.d.ts.map +1 -0
  98. package/dist/runner/runtime/__tests__/factory.test.js +149 -0
  99. package/dist/runner/runtime/__tests__/factory.test.js.map +1 -0
  100. package/dist/runner/runtime/__tests__/integration.test.d.ts +2 -0
  101. package/dist/runner/runtime/__tests__/integration.test.d.ts.map +1 -0
  102. package/dist/runner/runtime/__tests__/integration.test.js +274 -0
  103. package/dist/runner/runtime/__tests__/integration.test.js.map +1 -0
  104. package/dist/runner/runtime/cli-runtime.d.ts +107 -0
  105. package/dist/runner/runtime/cli-runtime.d.ts.map +1 -0
  106. package/dist/runner/runtime/cli-runtime.js +341 -0
  107. package/dist/runner/runtime/cli-runtime.js.map +1 -0
  108. package/dist/runner/runtime/cli-session-path.d.ts +108 -0
  109. package/dist/runner/runtime/cli-session-path.d.ts.map +1 -0
  110. package/dist/runner/runtime/cli-session-path.js +173 -0
  111. package/dist/runner/runtime/cli-session-path.js.map +1 -0
  112. package/dist/runner/runtime/cli-session-watcher.d.ts +55 -0
  113. package/dist/runner/runtime/cli-session-watcher.d.ts.map +1 -0
  114. package/dist/runner/runtime/cli-session-watcher.js +187 -0
  115. package/dist/runner/runtime/cli-session-watcher.js.map +1 -0
  116. package/dist/runner/runtime/container-manager.d.ts +76 -0
  117. package/dist/runner/runtime/container-manager.d.ts.map +1 -0
  118. package/dist/runner/runtime/container-manager.js +229 -0
  119. package/dist/runner/runtime/container-manager.js.map +1 -0
  120. package/dist/runner/runtime/container-runner.d.ts +62 -0
  121. package/dist/runner/runtime/container-runner.d.ts.map +1 -0
  122. package/dist/runner/runtime/container-runner.js +235 -0
  123. package/dist/runner/runtime/container-runner.js.map +1 -0
  124. package/dist/runner/runtime/docker-config.d.ts +100 -0
  125. package/dist/runner/runtime/docker-config.d.ts.map +1 -0
  126. package/dist/runner/runtime/docker-config.js +98 -0
  127. package/dist/runner/runtime/docker-config.js.map +1 -0
  128. package/dist/runner/runtime/factory.d.ts +63 -0
  129. package/dist/runner/runtime/factory.d.ts.map +1 -0
  130. package/dist/runner/runtime/factory.js +68 -0
  131. package/dist/runner/runtime/factory.js.map +1 -0
  132. package/dist/runner/runtime/index.d.ts +20 -0
  133. package/dist/runner/runtime/index.d.ts.map +1 -0
  134. package/dist/runner/runtime/index.js +21 -0
  135. package/dist/runner/runtime/index.js.map +1 -0
  136. package/dist/runner/runtime/interface.d.ts +59 -0
  137. package/dist/runner/runtime/interface.d.ts.map +1 -0
  138. package/dist/runner/runtime/interface.js +12 -0
  139. package/dist/runner/runtime/interface.js.map +1 -0
  140. package/dist/runner/runtime/sdk-runtime.d.ts +46 -0
  141. package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -0
  142. package/dist/runner/runtime/sdk-runtime.js +63 -0
  143. package/dist/runner/runtime/sdk-runtime.js.map +1 -0
  144. package/dist/runner/sdk-adapter.d.ts.map +1 -1
  145. package/dist/runner/sdk-adapter.js +28 -10
  146. package/dist/runner/sdk-adapter.js.map +1 -1
  147. package/dist/runner/types.d.ts +11 -1
  148. package/dist/runner/types.d.ts.map +1 -1
  149. package/dist/scheduler/__tests__/schedule-runner.test.js +61 -50
  150. package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -1
  151. package/dist/scheduler/schedule-runner.d.ts +1 -4
  152. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  153. package/dist/scheduler/schedule-runner.js +40 -8
  154. package/dist/scheduler/schedule-runner.js.map +1 -1
  155. package/dist/state/__tests__/session-schema.test.js +4 -0
  156. package/dist/state/__tests__/session-schema.test.js.map +1 -1
  157. package/dist/state/__tests__/session-validation.test.d.ts +2 -0
  158. package/dist/state/__tests__/session-validation.test.d.ts.map +1 -0
  159. package/dist/state/__tests__/session-validation.test.js +446 -0
  160. package/dist/state/__tests__/session-validation.test.js.map +1 -0
  161. package/dist/state/__tests__/session.test.js +68 -0
  162. package/dist/state/__tests__/session.test.js.map +1 -1
  163. package/dist/state/__tests__/working-directory-validation.test.d.ts +5 -0
  164. package/dist/state/__tests__/working-directory-validation.test.d.ts.map +1 -0
  165. package/dist/state/__tests__/working-directory-validation.test.js +101 -0
  166. package/dist/state/__tests__/working-directory-validation.test.js.map +1 -0
  167. package/dist/state/index.d.ts +2 -0
  168. package/dist/state/index.d.ts.map +1 -1
  169. package/dist/state/index.js +4 -0
  170. package/dist/state/index.js.map +1 -1
  171. package/dist/state/schemas/session-info.d.ts +32 -0
  172. package/dist/state/schemas/session-info.d.ts.map +1 -1
  173. package/dist/state/schemas/session-info.js +22 -0
  174. package/dist/state/schemas/session-info.js.map +1 -1
  175. package/dist/state/session-validation.d.ts +227 -0
  176. package/dist/state/session-validation.d.ts.map +1 -0
  177. package/dist/state/session-validation.js +448 -0
  178. package/dist/state/session-validation.js.map +1 -0
  179. package/dist/state/session.d.ts +23 -3
  180. package/dist/state/session.d.ts.map +1 -1
  181. package/dist/state/session.js +41 -6
  182. package/dist/state/session.js.map +1 -1
  183. package/dist/state/working-directory-validation.d.ts +52 -0
  184. package/dist/state/working-directory-validation.d.ts.map +1 -0
  185. package/dist/state/working-directory-validation.js +81 -0
  186. package/dist/state/working-directory-validation.js.map +1 -0
  187. package/package.json +7 -2
@@ -461,24 +461,16 @@ export function isTerminalMessage(message) {
461
461
  }
462
462
  return false;
463
463
  }
464
- /** Maximum summary length in characters */
465
- const MAX_SUMMARY_LENGTH = 500;
466
- /**
467
- * Truncate a string to maximum length, adding ellipsis if truncated
468
- */
469
- function truncateSummary(text) {
470
- if (text.length <= MAX_SUMMARY_LENGTH) {
471
- return text;
472
- }
473
- return text.slice(0, MAX_SUMMARY_LENGTH - 3) + "...";
474
- }
475
464
  /**
476
465
  * Extract the final summary from a message if present
477
466
  *
478
467
  * Looks for summaries in the following order:
479
- * 1. Explicit `summary` field on the message (truncated to 500 chars)
468
+ * 1. Explicit `summary` field on the message
480
469
  * 2. Result message with `result` field (SDK final result)
481
- * 3. Short assistant message content (≤500 chars, non-partial)
470
+ * 3. Non-partial assistant message content
471
+ *
472
+ * Note: No truncation is applied here. Downstream consumers (e.g., Discord hook)
473
+ * are responsible for truncating to their specific limits (e.g., 4096 for Discord).
482
474
  *
483
475
  * @param message - The SDK message to extract summary from
484
476
  * @returns Summary string if present, undefined otherwise
@@ -488,16 +480,15 @@ export function extractSummary(message) {
488
480
  if (message === null || message === undefined || typeof message !== "object") {
489
481
  return undefined;
490
482
  }
491
- // Check for explicit summary field (truncate if too long)
483
+ // Check for explicit summary field
492
484
  if (message.summary) {
493
- const summaryStr = String(message.summary);
494
- return truncateSummary(summaryStr);
485
+ return String(message.summary);
495
486
  }
496
487
  // For result messages, use the result field as summary
497
488
  if (message.type === "result") {
498
489
  const resultMsg = message;
499
490
  if (resultMsg.result) {
500
- return truncateSummary(resultMsg.result);
491
+ return resultMsg.result;
501
492
  }
502
493
  }
503
494
  // For assistant messages, try to extract content from nested message
@@ -505,7 +496,7 @@ export function extractSummary(message) {
505
496
  const apiMessage = message.message;
506
497
  const content = apiMessage?.content ?? message.content;
507
498
  const textContent = extractTextFromContentBlocks(content);
508
- if (textContent && textContent.length <= MAX_SUMMARY_LENGTH) {
499
+ if (textContent) {
509
500
  return textContent;
510
501
  }
511
502
  }
@@ -1 +1 @@
1
- {"version":3,"file":"message-processor.js","sourceRoot":"","sources":["../../src/runner/message-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-processor.js","sourceRoot":"","sources":["../../src/runner/message-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-session-path.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-session-path.test.d.ts","sourceRoot":"","sources":["../../../../src/runner/runtime/__tests__/cli-session-path.test.ts"],"names":[],"mappings":""}
@@ -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