@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.
- package/dist/config/__tests__/agent.test.js +12 -12
- package/dist/config/__tests__/agent.test.js.map +1 -1
- package/dist/config/__tests__/loader.test.js +201 -4
- package/dist/config/__tests__/loader.test.js.map +1 -1
- package/dist/config/__tests__/merge.test.js +29 -4
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/__tests__/parser.test.js +13 -13
- package/dist/config/__tests__/parser.test.js.map +1 -1
- package/dist/config/__tests__/schema.test.js +10 -10
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +2 -2
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +71 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.d.ts.map +1 -1
- package/dist/config/merge.js +16 -0
- package/dist/config/merge.js.map +1 -1
- package/dist/config/schema.d.ts +906 -89
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +109 -7
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +25 -24
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/discord-manager.test.js +9 -2
- package/dist/fleet-manager/__tests__/discord-manager.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/integration.test.js +27 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/job-control.test.js +66 -0
- package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/status-queries.test.js +12 -11
- package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -1
- package/dist/fleet-manager/config-reload.js +9 -9
- package/dist/fleet-manager/config-reload.js.map +1 -1
- package/dist/fleet-manager/discord-manager.d.ts.map +1 -1
- package/dist/fleet-manager/discord-manager.js +27 -4
- package/dist/fleet-manager/discord-manager.js.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +11 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +27 -0
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts +1 -1
- package/dist/fleet-manager/job-control.d.ts.map +1 -1
- package/dist/fleet-manager/job-control.js +36 -14
- package/dist/fleet-manager/job-control.js.map +1 -1
- package/dist/fleet-manager/schedule-executor.d.ts +1 -1
- package/dist/fleet-manager/schedule-executor.d.ts.map +1 -1
- package/dist/fleet-manager/schedule-executor.js +11 -14
- package/dist/fleet-manager/schedule-executor.js.map +1 -1
- package/dist/fleet-manager/status-queries.js +7 -7
- package/dist/fleet-manager/status-queries.js.map +1 -1
- package/dist/fleet-manager/types.d.ts +10 -2
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/fleet-manager/working-directory-helper.d.ts +29 -0
- package/dist/fleet-manager/working-directory-helper.d.ts.map +1 -0
- package/dist/fleet-manager/working-directory-helper.js +36 -0
- package/dist/fleet-manager/working-directory-helper.js.map +1 -0
- package/dist/runner/__tests__/job-executor.test.js +449 -118
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/__tests__/sdk-adapter.test.js +137 -2
- package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -1
- package/dist/runner/index.d.ts +2 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js +1 -0
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/job-executor.d.ts +12 -8
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +257 -132
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.js +150 -0
- package/dist/runner/runtime/__tests__/cli-session-path.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/docker-config.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/docker-config.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/docker-config.test.js +352 -0
- package/dist/runner/runtime/__tests__/docker-config.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/docker-security.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/docker-security.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/docker-security.test.js +384 -0
- package/dist/runner/runtime/__tests__/docker-security.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/factory.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/factory.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/factory.test.js +149 -0
- package/dist/runner/runtime/__tests__/factory.test.js.map +1 -0
- package/dist/runner/runtime/__tests__/integration.test.d.ts +2 -0
- package/dist/runner/runtime/__tests__/integration.test.d.ts.map +1 -0
- package/dist/runner/runtime/__tests__/integration.test.js +274 -0
- package/dist/runner/runtime/__tests__/integration.test.js.map +1 -0
- package/dist/runner/runtime/cli-runtime.d.ts +107 -0
- package/dist/runner/runtime/cli-runtime.d.ts.map +1 -0
- package/dist/runner/runtime/cli-runtime.js +335 -0
- package/dist/runner/runtime/cli-runtime.js.map +1 -0
- package/dist/runner/runtime/cli-session-path.d.ts +108 -0
- package/dist/runner/runtime/cli-session-path.d.ts.map +1 -0
- package/dist/runner/runtime/cli-session-path.js +173 -0
- package/dist/runner/runtime/cli-session-path.js.map +1 -0
- package/dist/runner/runtime/cli-session-watcher.d.ts +55 -0
- package/dist/runner/runtime/cli-session-watcher.d.ts.map +1 -0
- package/dist/runner/runtime/cli-session-watcher.js +187 -0
- package/dist/runner/runtime/cli-session-watcher.js.map +1 -0
- package/dist/runner/runtime/container-manager.d.ts +76 -0
- package/dist/runner/runtime/container-manager.d.ts.map +1 -0
- package/dist/runner/runtime/container-manager.js +229 -0
- package/dist/runner/runtime/container-manager.js.map +1 -0
- package/dist/runner/runtime/container-runner.d.ts +62 -0
- package/dist/runner/runtime/container-runner.d.ts.map +1 -0
- package/dist/runner/runtime/container-runner.js +235 -0
- package/dist/runner/runtime/container-runner.js.map +1 -0
- package/dist/runner/runtime/docker-config.d.ts +100 -0
- package/dist/runner/runtime/docker-config.d.ts.map +1 -0
- package/dist/runner/runtime/docker-config.js +98 -0
- package/dist/runner/runtime/docker-config.js.map +1 -0
- package/dist/runner/runtime/factory.d.ts +63 -0
- package/dist/runner/runtime/factory.d.ts.map +1 -0
- package/dist/runner/runtime/factory.js +68 -0
- package/dist/runner/runtime/factory.js.map +1 -0
- package/dist/runner/runtime/index.d.ts +20 -0
- package/dist/runner/runtime/index.d.ts.map +1 -0
- package/dist/runner/runtime/index.js +21 -0
- package/dist/runner/runtime/index.js.map +1 -0
- package/dist/runner/runtime/interface.d.ts +59 -0
- package/dist/runner/runtime/interface.d.ts.map +1 -0
- package/dist/runner/runtime/interface.js +12 -0
- package/dist/runner/runtime/interface.js.map +1 -0
- package/dist/runner/runtime/sdk-runtime.d.ts +46 -0
- package/dist/runner/runtime/sdk-runtime.d.ts.map +1 -0
- package/dist/runner/runtime/sdk-runtime.js +63 -0
- package/dist/runner/runtime/sdk-runtime.js.map +1 -0
- package/dist/runner/sdk-adapter.d.ts.map +1 -1
- package/dist/runner/sdk-adapter.js +28 -10
- package/dist/runner/sdk-adapter.js.map +1 -1
- package/dist/runner/types.d.ts +5 -1
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/__tests__/schedule-runner.test.js +61 -50
- package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts +1 -4
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +40 -8
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/state/__tests__/session-schema.test.js +4 -0
- package/dist/state/__tests__/session-schema.test.js.map +1 -1
- package/dist/state/__tests__/session-validation.test.d.ts +2 -0
- package/dist/state/__tests__/session-validation.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-validation.test.js +446 -0
- package/dist/state/__tests__/session-validation.test.js.map +1 -0
- package/dist/state/__tests__/session.test.js +68 -0
- package/dist/state/__tests__/session.test.js.map +1 -1
- package/dist/state/__tests__/working-directory-validation.test.d.ts +5 -0
- package/dist/state/__tests__/working-directory-validation.test.d.ts.map +1 -0
- package/dist/state/__tests__/working-directory-validation.test.js +101 -0
- package/dist/state/__tests__/working-directory-validation.test.js.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -1
- package/dist/state/schemas/session-info.d.ts +32 -0
- package/dist/state/schemas/session-info.d.ts.map +1 -1
- package/dist/state/schemas/session-info.js +22 -0
- package/dist/state/schemas/session-info.js.map +1 -1
- package/dist/state/session-validation.d.ts +202 -0
- package/dist/state/session-validation.d.ts.map +1 -0
- package/dist/state/session-validation.js +407 -0
- package/dist/state/session-validation.js.map +1 -0
- package/dist/state/session.d.ts +23 -3
- package/dist/state/session.d.ts.map +1 -1
- package/dist/state/session.js +41 -6
- package/dist/state/session.js.map +1 -1
- package/dist/state/working-directory-validation.d.ts +52 -0
- package/dist/state/working-directory-validation.d.ts.map +1 -0
- package/dist/state/working-directory-validation.js +81 -0
- package/dist/state/working-directory-validation.js.map +1 -0
- package/package.json +7 -2
|
@@ -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;
|
|
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"}
|
package/dist/state/session.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
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": "
|
|
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.
|
|
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"
|