@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
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/state/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,2BAA2B,CAAC;AAOnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,YAAY,CAAC,CAC/C,CAAC;AAiBF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6B7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAkEtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCxB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/state/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,2BAA2B,CAAC;AAOnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,YAAY,CAAC,CAC/C,CAAC;AAiBF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8D7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAmEtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCxB"}
@@ -25,25 +25,33 @@ function getSessionFilePath(sessionsDir, agentName) {
25
25
  /**
26
26
  * Get session info for an agent
27
27
  *
28
- * Returns null if no session exists (handles missing file gracefully).
28
+ * Returns null if no session exists, is corrupted, or has expired.
29
+ * When a timeout is provided, expired sessions are automatically cleared
30
+ * to prevent stale session IDs from being used for resume attempts.
29
31
  *
30
32
  * @param sessionsDir - Path to the sessions directory
31
33
  * @param agentName - Name of the agent
32
- * @param options - Optional operation options
33
- * @returns The session info, or null if not found
34
+ * @param options - Optional operation options including timeout for expiry validation
35
+ * @returns The session info, or null if not found/expired
34
36
  *
35
37
  * @example
36
38
  * ```typescript
39
+ * // Get session without expiry validation
37
40
  * const session = await getSessionInfo('/path/to/.herdctl/sessions', 'my-agent');
38
41
  * if (session) {
39
42
  * console.log(`Session ${session.session_id} has ${session.job_count} jobs`);
40
43
  * } else {
41
44
  * console.log('No existing session');
42
45
  * }
46
+ *
47
+ * // Get session with 24-hour expiry validation (prevents unexpected logouts)
48
+ * const session = await getSessionInfo('/path/to/.herdctl/sessions', 'my-agent', {
49
+ * timeout: '24h' // Sessions older than 24 hours will be treated as expired
50
+ * });
43
51
  * ```
44
52
  */
45
53
  export async function getSessionInfo(sessionsDir, agentName, options = {}) {
46
- const { logger = console } = options;
54
+ const { logger = console, timeout } = options;
47
55
  const filePath = getSessionFilePath(sessionsDir, agentName);
48
56
  const result = await safeReadJson(filePath);
49
57
  if (!result.success) {
@@ -55,13 +63,39 @@ export async function getSessionInfo(sessionsDir, agentName, options = {}) {
55
63
  logger.warn(`Failed to read session file for ${agentName}: ${result.error.message}`);
56
64
  return null;
57
65
  }
58
- // Parse and validate
66
+ // Parse and validate schema
59
67
  const parseResult = SessionInfoSchema.safeParse(result.data);
60
68
  if (!parseResult.success) {
61
69
  logger.warn(`Corrupted session file for ${agentName}: ${parseResult.error.message}. Returning null.`);
62
70
  return null;
63
71
  }
64
- return parseResult.data;
72
+ const session = parseResult.data;
73
+ // If timeout is provided, validate session expiry and optionally file existence
74
+ // Dynamic import to avoid circular dependency with session-validation.ts
75
+ if (timeout) {
76
+ const { validateSession, validateSessionWithFileCheck } = await import("./session-validation.js");
77
+ // For CLI runtime, check both expiration and file existence
78
+ // For SDK runtime (or unspecified), only check expiration
79
+ const validation = options.runtime === "cli"
80
+ ? await validateSessionWithFileCheck(session, timeout)
81
+ : validateSession(session, timeout);
82
+ if (!validation.valid) {
83
+ if (validation.reason === "expired" || validation.reason === "file_not_found") {
84
+ logger.warn(`Session for ${agentName} is invalid: ${validation.message}. Clearing stale session.`);
85
+ // Clear the invalid session to prevent stale session IDs from being used
86
+ await clearSession(sessionsDir, agentName).catch(() => {
87
+ // Ignore errors during cleanup - session is already treated as invalid
88
+ });
89
+ }
90
+ else if (validation.reason === "invalid_timeout") {
91
+ logger.warn(`Invalid timeout format for session validation: ${validation.message}`);
92
+ // Still return session if timeout format is invalid - don't fail the operation
93
+ return session;
94
+ }
95
+ return null;
96
+ }
97
+ }
98
+ return session;
65
99
  }
66
100
  /**
67
101
  * Update session info for an agent
@@ -120,6 +154,7 @@ export async function updateSessionInfo(sessionsDir, agentName, updates) {
120
154
  agent_name: agentName,
121
155
  session_id: updates.session_id,
122
156
  mode: updates.mode,
157
+ working_directory: updates.working_directory,
123
158
  });
124
159
  updatedSession = {
125
160
  ...newSession,
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/state/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/state/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Working directory validation utilities
3
+ *
4
+ * Provides validation to detect when a session's working directory has changed,
5
+ * which would cause Claude Code to look for the session file in the wrong
6
+ * project directory and fail to resume.
7
+ */
8
+ import type { SessionInfo } from "./schemas/session-info.js";
9
+ /**
10
+ * Result of working directory validation
11
+ */
12
+ export interface WorkingDirectoryValidation {
13
+ /** Whether the working directory is valid (unchanged) */
14
+ valid: boolean;
15
+ /** If invalid, the reason why */
16
+ reason?: "changed" | "missing";
17
+ /** Human-readable message */
18
+ message?: string;
19
+ /** Old working directory path from session */
20
+ oldPath?: string;
21
+ /** New working directory path from current config */
22
+ newPath?: string;
23
+ }
24
+ /**
25
+ * Validate that a session's working directory matches the current working directory
26
+ *
27
+ * Claude Code stores session files in project directories based on the cwd.
28
+ * If the working directory changes between sessions, Claude Code will look for
29
+ * the session file in a different directory and fail with ENOENT.
30
+ *
31
+ * This function compares the stored working_directory from the session with the
32
+ * current working_directory to detect this condition so we can clear the stale
33
+ * session and start fresh.
34
+ *
35
+ * @param session - The session info to validate (null if no session exists)
36
+ * @param currentWorkingDirectory - The current working directory from agent config
37
+ * @returns Validation result with change details
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const session = await getSessionInfo(sessionsDir, agentName);
42
+ * const currentWd = resolveWorkingDirectory(agent);
43
+ * const validation = validateWorkingDirectory(session, currentWd);
44
+ *
45
+ * if (!validation.valid) {
46
+ * logger.warn(`Working directory changed: ${validation.message}`);
47
+ * await clearSession(sessionsDir, agentName);
48
+ * }
49
+ * ```
50
+ */
51
+ export declare function validateWorkingDirectory(session: SessionInfo | null, currentWorkingDirectory: string | undefined): WorkingDirectoryValidation;
52
+ //# sourceMappingURL=working-directory-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-directory-validation.d.ts","sourceRoot":"","sources":["../../src/state/working-directory-validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAM7D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,yDAAyD;IACzD,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,uBAAuB,EAAE,MAAM,GAAG,SAAS,GAC1C,0BAA0B,CAgD5B"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Working directory validation utilities
3
+ *
4
+ * Provides validation to detect when a session's working directory has changed,
5
+ * which would cause Claude Code to look for the session file in the wrong
6
+ * project directory and fail to resume.
7
+ */
8
+ // =============================================================================
9
+ // Validation
10
+ // =============================================================================
11
+ /**
12
+ * Validate that a session's working directory matches the current working directory
13
+ *
14
+ * Claude Code stores session files in project directories based on the cwd.
15
+ * If the working directory changes between sessions, Claude Code will look for
16
+ * the session file in a different directory and fail with ENOENT.
17
+ *
18
+ * This function compares the stored working_directory from the session with the
19
+ * current working_directory to detect this condition so we can clear the stale
20
+ * session and start fresh.
21
+ *
22
+ * @param session - The session info to validate (null if no session exists)
23
+ * @param currentWorkingDirectory - The current working directory from agent config
24
+ * @returns Validation result with change details
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const session = await getSessionInfo(sessionsDir, agentName);
29
+ * const currentWd = resolveWorkingDirectory(agent);
30
+ * const validation = validateWorkingDirectory(session, currentWd);
31
+ *
32
+ * if (!validation.valid) {
33
+ * logger.warn(`Working directory changed: ${validation.message}`);
34
+ * await clearSession(sessionsDir, agentName);
35
+ * }
36
+ * ```
37
+ */
38
+ export function validateWorkingDirectory(session, currentWorkingDirectory) {
39
+ // No session to validate
40
+ if (!session) {
41
+ return { valid: true };
42
+ }
43
+ const oldPath = session.working_directory;
44
+ const newPath = currentWorkingDirectory;
45
+ // Both undefined - OK (backward compat: old sessions without working_directory)
46
+ if (!oldPath && !newPath) {
47
+ return { valid: true };
48
+ }
49
+ // One is undefined, other is defined - Changed
50
+ if (!oldPath && newPath) {
51
+ return {
52
+ valid: false,
53
+ reason: "changed",
54
+ message: `Working directory changed from undefined to ${newPath}`,
55
+ oldPath: undefined,
56
+ newPath,
57
+ };
58
+ }
59
+ if (oldPath && !newPath) {
60
+ return {
61
+ valid: false,
62
+ reason: "changed",
63
+ message: `Working directory changed from ${oldPath} to undefined`,
64
+ oldPath,
65
+ newPath: undefined,
66
+ };
67
+ }
68
+ // Both defined but different - Changed
69
+ if (oldPath !== newPath) {
70
+ return {
71
+ valid: false,
72
+ reason: "changed",
73
+ message: `Working directory changed from ${oldPath} to ${newPath}`,
74
+ oldPath,
75
+ newPath,
76
+ };
77
+ }
78
+ // Same working directory - Valid
79
+ return { valid: true };
80
+ }
81
+ //# sourceMappingURL=working-directory-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-directory-validation.js","sourceRoot":"","sources":["../../src/state/working-directory-validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA2B,EAC3B,uBAA2C;IAE3C,yBAAyB;IACzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAC1C,MAAM,OAAO,GAAG,uBAAuB,CAAC;IAExC,gFAAgF;IAChF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,+CAA+C,OAAO,EAAE;YACjE,OAAO,EAAE,SAAS;YAClB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,kCAAkC,OAAO,eAAe;YACjE,OAAO;YACP,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,kCAAkC,OAAO,OAAO,OAAO,EAAE;YAClE,OAAO;YACP,OAAO;SACR,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herdctl/core",
3
- "version": "1.3.1",
3
+ "version": "2.0.0",
4
4
  "description": "Core library for herdctl fleet management",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -11,13 +11,16 @@
11
11
  ],
12
12
  "dependencies": {
13
13
  "@anthropic-ai/claude-agent-sdk": "^0.1.0",
14
+ "chokidar": "^5",
14
15
  "cron-parser": "^4.9.0",
16
+ "dockerode": "^4.0.9",
15
17
  "dotenv": "^17.2.3",
18
+ "execa": "^9",
16
19
  "yaml": "^2.3.0",
17
20
  "zod": "^3.22.0"
18
21
  },
19
22
  "peerDependencies": {
20
- "@herdctl/discord": "0.1.4"
23
+ "@herdctl/discord": "0.1.5"
21
24
  },
22
25
  "peerDependenciesMeta": {
23
26
  "@herdctl/discord": {
@@ -25,6 +28,7 @@
25
28
  }
26
29
  },
27
30
  "devDependencies": {
31
+ "@types/dockerode": "^4.0.1",
28
32
  "@vitest/coverage-v8": "^4.0.17",
29
33
  "typescript": "^5",
30
34
  "vitest": "^4.0.17"
@@ -50,6 +54,7 @@
50
54
  },
51
55
  "scripts": {
52
56
  "build": "tsc",
57
+ "postbuild": "node --input-type=module -e \"import('./dist/index.js').then(() => console.log('✓ Core module loads successfully'))\"",
53
58
  "dev": "tsc --watch",
54
59
  "typecheck": "tsc --noEmit",
55
60
  "test": "vitest run --coverage"