@herdctl/core 5.6.0 → 5.7.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 (54) hide show
  1. package/dist/config/__tests__/merge.test.js +1 -1
  2. package/dist/config/__tests__/merge.test.js.map +1 -1
  3. package/dist/config/schema.d.ts +10 -2
  4. package/dist/config/schema.d.ts.map +1 -1
  5. package/dist/config/schema.js +6 -2
  6. package/dist/config/schema.js.map +1 -1
  7. package/dist/scheduler/schedule-runner.d.ts.map +1 -1
  8. package/dist/scheduler/schedule-runner.js +6 -5
  9. package/dist/scheduler/schedule-runner.js.map +1 -1
  10. package/dist/state/__tests__/jsonl-parser.test.d.ts +5 -0
  11. package/dist/state/__tests__/jsonl-parser.test.d.ts.map +1 -0
  12. package/dist/state/__tests__/jsonl-parser.test.js +332 -0
  13. package/dist/state/__tests__/jsonl-parser.test.js.map +1 -0
  14. package/dist/state/__tests__/session-attribution.test.d.ts +2 -0
  15. package/dist/state/__tests__/session-attribution.test.d.ts.map +1 -0
  16. package/dist/state/__tests__/session-attribution.test.js +567 -0
  17. package/dist/state/__tests__/session-attribution.test.js.map +1 -0
  18. package/dist/state/__tests__/session-discovery.test.d.ts +2 -0
  19. package/dist/state/__tests__/session-discovery.test.d.ts.map +1 -0
  20. package/dist/state/__tests__/session-discovery.test.js +953 -0
  21. package/dist/state/__tests__/session-discovery.test.js.map +1 -0
  22. package/dist/state/__tests__/session-metadata.test.d.ts +2 -0
  23. package/dist/state/__tests__/session-metadata.test.d.ts.map +1 -0
  24. package/dist/state/__tests__/session-metadata.test.js +474 -0
  25. package/dist/state/__tests__/session-metadata.test.js.map +1 -0
  26. package/dist/state/__tests__/tool-parsing.test.d.ts +5 -0
  27. package/dist/state/__tests__/tool-parsing.test.d.ts.map +1 -0
  28. package/dist/state/__tests__/tool-parsing.test.js +315 -0
  29. package/dist/state/__tests__/tool-parsing.test.js.map +1 -0
  30. package/dist/state/index.d.ts +5 -0
  31. package/dist/state/index.d.ts.map +1 -1
  32. package/dist/state/index.js +10 -0
  33. package/dist/state/index.js.map +1 -1
  34. package/dist/state/jsonl-parser.d.ts +126 -0
  35. package/dist/state/jsonl-parser.d.ts.map +1 -0
  36. package/dist/state/jsonl-parser.js +482 -0
  37. package/dist/state/jsonl-parser.js.map +1 -0
  38. package/dist/state/session-attribution.d.ts +35 -0
  39. package/dist/state/session-attribution.d.ts.map +1 -0
  40. package/dist/state/session-attribution.js +179 -0
  41. package/dist/state/session-attribution.js.map +1 -0
  42. package/dist/state/session-discovery.d.ts +198 -0
  43. package/dist/state/session-discovery.d.ts.map +1 -0
  44. package/dist/state/session-discovery.js +555 -0
  45. package/dist/state/session-discovery.js.map +1 -0
  46. package/dist/state/session-metadata.d.ts +240 -0
  47. package/dist/state/session-metadata.d.ts.map +1 -0
  48. package/dist/state/session-metadata.js +377 -0
  49. package/dist/state/session-metadata.js.map +1 -0
  50. package/dist/state/tool-parsing.d.ts +88 -0
  51. package/dist/state/tool-parsing.d.ts.map +1 -0
  52. package/dist/state/tool-parsing.js +199 -0
  53. package/dist/state/tool-parsing.js.map +1 -0
  54. package/package.json +1 -1
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Session attribution module
3
+ *
4
+ * Determines the origin of a Claude Code session (web, discord, slack, schedule, or native CLI)
5
+ * by cross-referencing HerdCTL's job metadata and platform session YAML files.
6
+ */
7
+ import fs from "node:fs/promises";
8
+ import path from "node:path";
9
+ import yaml from "yaml";
10
+ import { z } from "zod";
11
+ import { createLogger } from "../utils/logger.js";
12
+ import { listJobs } from "./job-metadata.js";
13
+ // =============================================================================
14
+ // Schemas
15
+ // =============================================================================
16
+ const PlatformSessionSchema = z.object({
17
+ version: z.union([z.literal(1), z.literal(2), z.literal(3)]),
18
+ agentName: z.string(),
19
+ channels: z.record(z.string(), z.object({
20
+ sessionId: z.string(),
21
+ lastMessageAt: z.string(),
22
+ })),
23
+ });
24
+ // =============================================================================
25
+ // Logger
26
+ // =============================================================================
27
+ const logger = createLogger("SessionAttribution");
28
+ // =============================================================================
29
+ // Helper Functions
30
+ // =============================================================================
31
+ /**
32
+ * Convert a trigger type to a session origin
33
+ */
34
+ function triggerTypeToOrigin(triggerType) {
35
+ switch (triggerType) {
36
+ case "web":
37
+ return "web";
38
+ case "discord":
39
+ return "discord";
40
+ case "slack":
41
+ return "slack";
42
+ case "schedule":
43
+ return "schedule";
44
+ // manual, webhook, chat, fork — all treated as native CLI usage
45
+ default:
46
+ return "native";
47
+ }
48
+ }
49
+ /**
50
+ * Build the job index from job metadata files
51
+ */
52
+ async function buildJobIndex(jobsDir) {
53
+ const index = new Map();
54
+ const result = await listJobs(jobsDir, {}, { logger });
55
+ for (const job of result.jobs) {
56
+ if (job.session_id) {
57
+ index.set(job.session_id, {
58
+ agent: job.agent,
59
+ triggerType: job.trigger_type,
60
+ });
61
+ }
62
+ }
63
+ return index;
64
+ }
65
+ /**
66
+ * Build the platform index from platform session YAML files
67
+ */
68
+ async function buildPlatformIndex(stateDir) {
69
+ const index = new Map();
70
+ const platforms = ["discord", "slack", "web"];
71
+ for (const platform of platforms) {
72
+ const sessionDir = path.join(stateDir, `${platform}-sessions`);
73
+ let fileNames;
74
+ try {
75
+ fileNames = await fs.readdir(sessionDir);
76
+ }
77
+ catch (error) {
78
+ if (error.code === "ENOENT") {
79
+ logger.debug(`Session directory does not exist: ${sessionDir}`);
80
+ continue;
81
+ }
82
+ throw error;
83
+ }
84
+ const yamlFiles = fileNames.filter((name) => name.endsWith(".yaml"));
85
+ for (const fileName of yamlFiles) {
86
+ const filePath = path.join(sessionDir, fileName);
87
+ try {
88
+ const content = await fs.readFile(filePath, "utf-8");
89
+ const parsed = yaml.parse(content);
90
+ const validated = PlatformSessionSchema.safeParse(parsed);
91
+ if (!validated.success) {
92
+ logger.warn(`Malformed platform session file: ${filePath}: ${validated.error.message}`);
93
+ continue;
94
+ }
95
+ const session = validated.data;
96
+ for (const channel of Object.values(session.channels)) {
97
+ index.set(channel.sessionId, {
98
+ platform,
99
+ agentName: session.agentName,
100
+ });
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (error instanceof yaml.YAMLParseError) {
105
+ logger.warn(`Failed to parse YAML file: ${filePath}: ${error.message}`);
106
+ continue;
107
+ }
108
+ throw error;
109
+ }
110
+ }
111
+ }
112
+ return index;
113
+ }
114
+ // =============================================================================
115
+ // Public API
116
+ // =============================================================================
117
+ /**
118
+ * Build an attribution index from job metadata and platform YAML files
119
+ *
120
+ * @param stateDir - Path to the .herdctl state directory
121
+ * @returns An AttributionIndex for looking up session origins
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * const index = await buildAttributionIndex('/path/to/.herdctl');
126
+ * const attribution = index.getAttribute('session-123');
127
+ * console.log(attribution.origin); // 'discord'
128
+ * ```
129
+ */
130
+ export async function buildAttributionIndex(stateDir) {
131
+ const jobsDir = path.join(stateDir, "jobs");
132
+ const [jobIndex, platformIndex] = await Promise.all([
133
+ buildJobIndex(jobsDir),
134
+ buildPlatformIndex(stateDir),
135
+ ]);
136
+ const getAttribute = (sessionId) => {
137
+ // Check job index first
138
+ const jobEntry = jobIndex.get(sessionId);
139
+ if (jobEntry) {
140
+ return {
141
+ origin: triggerTypeToOrigin(jobEntry.triggerType),
142
+ agentName: jobEntry.agent,
143
+ triggerType: jobEntry.triggerType,
144
+ };
145
+ }
146
+ // Check platform index
147
+ const platformEntry = platformIndex.get(sessionId);
148
+ if (platformEntry) {
149
+ return {
150
+ origin: platformEntry.platform,
151
+ agentName: platformEntry.agentName,
152
+ triggerType: undefined,
153
+ };
154
+ }
155
+ // Default to native
156
+ return {
157
+ origin: "native",
158
+ agentName: undefined,
159
+ triggerType: undefined,
160
+ };
161
+ };
162
+ const getAttributes = (sessionIds) => {
163
+ const result = new Map();
164
+ for (const sessionId of sessionIds) {
165
+ result.set(sessionId, getAttribute(sessionId));
166
+ }
167
+ return result;
168
+ };
169
+ // Calculate unique session IDs across both indexes
170
+ const allSessionIds = new Set([...jobIndex.keys(), ...platformIndex.keys()]);
171
+ return {
172
+ getAttribute,
173
+ getAttributes,
174
+ get size() {
175
+ return allSessionIds.size;
176
+ },
177
+ };
178
+ }
179
+ //# sourceMappingURL=session-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-attribution.js","sourceRoot":"","sources":["../../src/state/session-attribution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Session Discovery Service
3
+ *
4
+ * Orchestrates session enumeration by tying together JSONL parsing,
5
+ * session attribution, and CLI session path utilities. Provides cached
6
+ * discovery of Claude Code sessions from the filesystem.
7
+ */
8
+ import { type ChatMessage, type SessionMetadata, type SessionUsage } from "./jsonl-parser.js";
9
+ import { type SessionOrigin } from "./session-attribution.js";
10
+ /**
11
+ * A discovered session with attribution and metadata
12
+ */
13
+ export interface DiscoveredSession {
14
+ sessionId: string;
15
+ workingDirectory: string;
16
+ mtime: string;
17
+ origin: SessionOrigin;
18
+ agentName: string | undefined;
19
+ resumable: boolean;
20
+ customName: string | undefined;
21
+ /** Auto-generated session name (extracted from JSONL summary field) */
22
+ autoName: string | undefined;
23
+ preview: string | undefined;
24
+ }
25
+ /**
26
+ * A group of sessions by working directory
27
+ */
28
+ export interface DirectoryGroup {
29
+ workingDirectory: string;
30
+ encodedPath: string;
31
+ agentName: string | undefined;
32
+ sessionCount: number;
33
+ sessions: DiscoveredSession[];
34
+ }
35
+ /**
36
+ * Options for creating a SessionDiscoveryService
37
+ */
38
+ export interface SessionDiscoveryOptions {
39
+ /** Path to ~/.claude directory. Default: path.join(os.homedir(), ".claude") */
40
+ claudeHomePath?: string;
41
+ /** Path to the .herdctl/ state directory */
42
+ stateDir: string;
43
+ /** Cache TTL in milliseconds. Default: 30_000 (30 seconds) */
44
+ cacheTtlMs?: number;
45
+ }
46
+ /**
47
+ * Service for discovering and enumerating Claude Code sessions.
48
+ *
49
+ * Provides cached access to session files, with attribution from job metadata
50
+ * and platform session files, plus custom names from the session metadata store.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * const discovery = new SessionDiscoveryService({
55
+ * stateDir: '/path/to/.herdctl',
56
+ * });
57
+ *
58
+ * // Get sessions for a specific agent
59
+ * const sessions = await discovery.getAgentSessions('my-agent', '/path/to/workspace', false);
60
+ *
61
+ * // Get all sessions grouped by directory
62
+ * const groups = await discovery.getAllSessions([
63
+ * { name: 'agent-1', workingDirectory: '/path/to/project', dockerEnabled: false }
64
+ * ]);
65
+ * ```
66
+ */
67
+ export declare class SessionDiscoveryService {
68
+ private readonly claudeHomePath;
69
+ private readonly stateDir;
70
+ private readonly cacheTtlMs;
71
+ private attributionIndex;
72
+ private attributionFetchedAt;
73
+ private directoryCache;
74
+ private metadataCache;
75
+ private readonly sessionMetadataStore;
76
+ /**
77
+ * Create a new SessionDiscoveryService
78
+ *
79
+ * @param options - Configuration options
80
+ */
81
+ constructor(options: SessionDiscoveryOptions);
82
+ /**
83
+ * Check if the attribution index cache is valid
84
+ */
85
+ private isAttributionCacheValid;
86
+ /**
87
+ * Check if a directory cache entry is valid
88
+ */
89
+ private isDirectoryCacheValid;
90
+ /**
91
+ * Get or refresh the attribution index
92
+ */
93
+ private getAttributionIndex;
94
+ /**
95
+ * List session files in a directory with their modification times
96
+ */
97
+ private listSessionFiles;
98
+ /**
99
+ * Resolve the auto-generated name for a session.
100
+ *
101
+ * Checks if the cached autoName is still valid (based on file mtime).
102
+ * If not, extracts a new name from the JSONL summary field.
103
+ *
104
+ * @param agentName - The agent's qualified name (use "adhoc" for unattributed sessions)
105
+ * @param sessionId - The session ID
106
+ * @param fileMtime - ISO 8601 timestamp of the session file's modification time
107
+ * @param workingDirectory - The session's working directory
108
+ * @returns Object with autoName and whether an update is needed
109
+ */
110
+ private resolveAutoName;
111
+ /**
112
+ * Resolve the preview (first user message text) for a session, using cache when valid.
113
+ *
114
+ * @param agentName - The agent's qualified name (or "adhoc" for unattributed)
115
+ * @param sessionId - The session ID
116
+ * @param fileMtime - ISO 8601 timestamp of the session file's modification time
117
+ * @param workingDirectory - The session's working directory
118
+ * @returns Object with preview and whether an update is needed
119
+ */
120
+ private resolvePreview;
121
+ /**
122
+ * Get sessions for a specific agent.
123
+ *
124
+ * Returns sessions from the agent's working directory, attributed and
125
+ * enriched with custom names from the metadata store.
126
+ *
127
+ * @param agentName - The agent's qualified name
128
+ * @param workingDirectory - The agent's working directory
129
+ * @param dockerEnabled - Whether Docker is enabled for the agent (affects resumability)
130
+ * @param options - Optional settings (limit for top-N optimization)
131
+ * @returns Array of discovered sessions sorted by mtime descending
132
+ */
133
+ getAgentSessions(agentName: string, workingDirectory: string, dockerEnabled: boolean, options?: {
134
+ limit?: number;
135
+ }): Promise<DiscoveredSession[]>;
136
+ /**
137
+ * Get all sessions grouped by working directory.
138
+ *
139
+ * Scans the Claude projects directory and groups sessions by their
140
+ * working directories. Filters out temp directories and enriches
141
+ * sessions with attribution and custom names.
142
+ *
143
+ * When a limit is provided, only the most recent `limit` sessions
144
+ * (by mtime) are enriched with names, avoiding expensive JSONL parsing
145
+ * for sessions that won't be returned.
146
+ *
147
+ * @param agents - Array of known agents for matching sessions
148
+ * @param options - Optional settings (limit for top-N optimization)
149
+ * @returns Array of directory groups sorted by most recent session
150
+ */
151
+ getAllSessions(agents: Array<{
152
+ name: string;
153
+ workingDirectory: string;
154
+ dockerEnabled: boolean;
155
+ }>, options?: {
156
+ limit?: number;
157
+ }): Promise<DirectoryGroup[]>;
158
+ /**
159
+ * Get parsed chat messages from a session.
160
+ *
161
+ * Delegates to the JSONL parser.
162
+ *
163
+ * @param workingDirectory - The session's working directory
164
+ * @param sessionId - The session ID
165
+ * @returns Array of chat messages
166
+ */
167
+ getSessionMessages(workingDirectory: string, sessionId: string): Promise<ChatMessage[]>;
168
+ /**
169
+ * Get metadata for a session.
170
+ *
171
+ * Caches the result for efficiency when called repeatedly.
172
+ *
173
+ * @param workingDirectory - The session's working directory
174
+ * @param sessionId - The session ID
175
+ * @returns Session metadata
176
+ */
177
+ getSessionMetadata(workingDirectory: string, sessionId: string): Promise<SessionMetadata>;
178
+ /**
179
+ * Get usage data for a session.
180
+ *
181
+ * Delegates to the JSONL parser.
182
+ *
183
+ * @param workingDirectory - The session's working directory
184
+ * @param sessionId - The session ID
185
+ * @returns Session usage data
186
+ */
187
+ getSessionUsage(workingDirectory: string, sessionId: string): Promise<SessionUsage>;
188
+ /**
189
+ * Invalidate cached data.
190
+ *
191
+ * If a working directory is provided, only that directory's cache entry
192
+ * is cleared. Otherwise, all caches are cleared.
193
+ *
194
+ * @param workingDirectory - Optional working directory to clear cache for
195
+ */
196
+ invalidateCache(workingDirectory?: string): void;
197
+ }
198
+ //# sourceMappingURL=session-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-discovery.d.ts","sourceRoot":"","sources":["../../src/state/session-discovery.ts"],"names":[],"mappings":"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"}