@ai-devkit/agent-manager 0.4.0 → 0.6.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 (50) hide show
  1. package/dist/adapters/AgentAdapter.d.ts +21 -2
  2. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +44 -35
  4. package/dist/adapters/ClaudeCodeAdapter.d.ts.map +1 -1
  5. package/dist/adapters/ClaudeCodeAdapter.js +230 -298
  6. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  7. package/dist/adapters/CodexAdapter.d.ts +41 -31
  8. package/dist/adapters/CodexAdapter.d.ts.map +1 -1
  9. package/dist/adapters/CodexAdapter.js +198 -278
  10. package/dist/adapters/CodexAdapter.js.map +1 -1
  11. package/dist/index.d.ts +2 -4
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -10
  14. package/dist/index.js.map +1 -1
  15. package/dist/utils/index.d.ts +6 -3
  16. package/dist/utils/index.d.ts.map +1 -1
  17. package/dist/utils/index.js +12 -11
  18. package/dist/utils/index.js.map +1 -1
  19. package/dist/utils/matching.d.ts +39 -0
  20. package/dist/utils/matching.d.ts.map +1 -0
  21. package/dist/utils/matching.js +107 -0
  22. package/dist/utils/matching.js.map +1 -0
  23. package/dist/utils/process.d.ts +25 -40
  24. package/dist/utils/process.d.ts.map +1 -1
  25. package/dist/utils/process.js +151 -105
  26. package/dist/utils/process.js.map +1 -1
  27. package/dist/utils/session.d.ts +30 -0
  28. package/dist/utils/session.d.ts.map +1 -0
  29. package/dist/utils/session.js +101 -0
  30. package/dist/utils/session.js.map +1 -0
  31. package/package.json +1 -1
  32. package/src/__tests__/AgentManager.test.ts +5 -27
  33. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +754 -830
  34. package/src/__tests__/adapters/CodexAdapter.test.ts +581 -273
  35. package/src/__tests__/utils/matching.test.ts +199 -0
  36. package/src/__tests__/utils/process.test.ts +202 -0
  37. package/src/__tests__/utils/session.test.ts +117 -0
  38. package/src/adapters/AgentAdapter.ts +23 -4
  39. package/src/adapters/ClaudeCodeAdapter.ts +285 -437
  40. package/src/adapters/CodexAdapter.ts +202 -400
  41. package/src/index.ts +2 -4
  42. package/src/utils/index.ts +6 -3
  43. package/src/utils/matching.ts +96 -0
  44. package/src/utils/process.ts +133 -119
  45. package/src/utils/session.ts +92 -0
  46. package/dist/utils/file.d.ts +0 -52
  47. package/dist/utils/file.d.ts.map +0 -1
  48. package/dist/utils/file.js +0 -135
  49. package/dist/utils/file.js.map +0 -1
  50. package/src/utils/file.ts +0 -100
@@ -35,10 +35,10 @@ export interface AgentInfo {
35
35
  projectPath: string;
36
36
  /** Session UUID */
37
37
  sessionId: string;
38
- /** Human-readable session name (e.g., "merry-wobbling-starlight"), may be undefined for new sessions */
39
- slug?: string;
40
38
  /** Timestamp of last activity */
41
39
  lastActive: Date;
40
+ /** Path to the session JSONL file on disk */
41
+ sessionFilePath?: string;
42
42
  }
43
43
  /**
44
44
  * Information about a running process
@@ -52,6 +52,16 @@ export interface ProcessInfo {
52
52
  cwd: string;
53
53
  /** Terminal TTY (e.g., "ttys030") */
54
54
  tty: string;
55
+ /** Process start time, populated by enrichProcesses */
56
+ startTime?: Date;
57
+ }
58
+ /**
59
+ * A single message in a conversation
60
+ */
61
+ export interface ConversationMessage {
62
+ role: 'user' | 'assistant' | 'system';
63
+ content: string;
64
+ timestamp?: string;
55
65
  }
56
66
  /**
57
67
  * Agent Adapter Interface
@@ -72,5 +82,14 @@ export interface AgentAdapter {
72
82
  * @returns True if this adapter can handle the process
73
83
  */
74
84
  canHandle(processInfo: ProcessInfo): boolean;
85
+ /**
86
+ * Read the full conversation from a session file
87
+ * @param sessionFilePath Path to the session JSONL file
88
+ * @param options.verbose Include tool call/result details
89
+ * @returns Array of conversation messages
90
+ */
91
+ getConversation(sessionFilePath: string, options?: {
92
+ verbose?: boolean;
93
+ }): ConversationMessage[];
75
94
  }
76
95
  //# sourceMappingURL=AgentAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpE;;GAEG;AACH,oBAAY,WAAW;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,IAAI,EAAE,SAAS,CAAC;IAEhB,qBAAqB;IACrB,MAAM,EAAE,WAAW,CAAC;IAEpB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAElB,wGAAwG;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,iCAAiC;IACjC,UAAU,EAAE,IAAI,CAAC;CAEpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CAChD"}
1
+ {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpE;;GAEG;AACH,oBAAY,WAAW;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,IAAI,EAAE,SAAS,CAAC;IAEhB,qBAAqB;IACrB,MAAM,EAAE,WAAW,CAAC;IAEpB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IAEpB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAElB,iCAAiC;IACjC,UAAU,EAAE,IAAI,CAAC;IAEjB,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IAEZ,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IAEZ,uDAAuD;IACvD,SAAS,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAErC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;IAE7C;;;;;OAKG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE,CAAC;CACpG"}
@@ -1,23 +1,18 @@
1
- import type { AgentAdapter, AgentInfo, ProcessInfo } from './AgentAdapter';
1
+ import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage } from './AgentAdapter';
2
2
  /**
3
3
  * Claude Code Adapter
4
4
  *
5
5
  * Detects Claude Code agents by:
6
- * 1. Finding running claude processes
7
- * 2. Getting process start times for accurate session matching
8
- * 3. Reading bounded session files from ~/.claude/projects/
9
- * 4. Matching sessions to processes via CWD then start time ranking
6
+ * 1. Finding running claude processes via shared listAgentProcesses()
7
+ * 2. Enriching with CWD and start times via shared enrichProcesses()
8
+ * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json
9
+ * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
10
10
  * 5. Extracting summary from last user message in session JSONL
11
11
  */
12
12
  export declare class ClaudeCodeAdapter implements AgentAdapter {
13
13
  readonly type: "claude";
14
- /** Limit session parsing per run to keep list latency bounded. */
15
- private static readonly MIN_SESSION_SCAN;
16
- private static readonly MAX_SESSION_SCAN;
17
- private static readonly SESSION_SCAN_MULTIPLIER;
18
- /** Matching tolerance between process start time and session start time. */
19
- private static readonly PROCESS_SESSION_TIME_TOLERANCE_MS;
20
14
  private projectsDir;
15
+ private sessionsDir;
21
16
  constructor();
22
17
  /**
23
18
  * Check if this adapter can handle a given process
@@ -28,24 +23,34 @@ export declare class ClaudeCodeAdapter implements AgentAdapter {
28
23
  * Detect running Claude Code agents
29
24
  */
30
25
  detectAgents(): Promise<AgentInfo[]>;
31
- private listClaudeProcesses;
32
- private calculateSessionScanLimit;
33
- private assignSessionsForMode;
34
- private mapSessionToAgent;
35
- private mapProcessOnlyAgent;
36
- private selectBestSession;
37
- private filterCandidateSessions;
38
- private rankCandidatesByStartTime;
39
- private getProcessStartTimes;
40
- private parseElapsedSeconds;
41
26
  /**
42
- * Read Claude Code sessions with bounded scanning
27
+ * Discover session files for the given processes.
28
+ *
29
+ * For each unique process CWD, encodes it to derive the expected
30
+ * ~/.claude/projects/<encoded>/ directory, then gets session file birthtimes
31
+ * via a single batched stat call across all directories.
32
+ */
33
+ private discoverSessions;
34
+ /**
35
+ * Attempt to match each process to its session via ~/.claude/sessions/<pid>.json.
36
+ *
37
+ * Returns:
38
+ * direct — processes matched authoritatively via PID file
39
+ * fallback — processes with no valid PID file (sent to legacy matching)
40
+ *
41
+ * Per-process fallback triggers on: file absent, malformed JSON,
42
+ * stale startedAt (>60 s from proc.startTime), or missing JSONL.
43
43
  */
44
- private readSessions;
44
+ private tryPidFileMatching;
45
45
  /**
46
- * Find session files bounded by mtime, sorted most-recent first
46
+ * Derive the Claude Code project directory for a given CWD.
47
+ *
48
+ * Claude Code encodes paths by replacing '/' with '-':
49
+ * /Users/foo/bar → ~/.claude/projects/-Users-foo-bar/
47
50
  */
48
- private findSessionFiles;
51
+ private getProjectDir;
52
+ private mapSessionToAgent;
53
+ private mapProcessOnlyAgent;
49
54
  /**
50
55
  * Parse a single session file into ClaudeSession
51
56
  */
@@ -54,15 +59,6 @@ export declare class ClaudeCodeAdapter implements AgentAdapter {
54
59
  * Determine agent status from session state
55
60
  */
56
61
  private determineStatus;
57
- /**
58
- * Generate unique agent name
59
- * Uses project basename, appends slug if multiple sessions for same project
60
- */
61
- private generateAgentName;
62
- /** Check if two paths are equal, or one is a parent/child of the other. */
63
- private pathRelated;
64
- private pathEquals;
65
- private isChildPath;
66
62
  /**
67
63
  * Extract meaningful text from a user message content.
68
64
  * Handles string and array formats, skill command expansion, and noise filtering.
@@ -81,6 +77,19 @@ export declare class ClaudeCodeAdapter implements AgentAdapter {
81
77
  * These should not overwrite lastEntryType used for status determination.
82
78
  */
83
79
  private isMetadataEntryType;
84
- private normalizePath;
80
+ /**
81
+ * Read the full conversation from a Claude Code session JSONL file.
82
+ *
83
+ * Default mode returns only text content from user/assistant/system messages.
84
+ * Verbose mode also includes tool_use and tool_result blocks.
85
+ */
86
+ getConversation(sessionFilePath: string, options?: {
87
+ verbose?: boolean;
88
+ }): ConversationMessage[];
89
+ /**
90
+ * Extract displayable content from a message content field.
91
+ */
92
+ private extractConversationContent;
93
+ private truncateToolResult;
85
94
  }
86
95
  //# sourceMappingURL=ClaudeCodeAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8C3E;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAK;IACpD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAiB;IAE1E,OAAO,CAAC,WAAW,CAAS;;IAO5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAkD1C,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,iBAAiB;IA6CzB,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,yBAAyB;IAgCjC,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4ExB;;OAEG;IACH,OAAO,CAAC,WAAW;IAyGnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB,2EAA2E;IAC3E,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IAUnB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,aAAa;CAOxB"}
1
+ {"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA8DhG;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAQ5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAwD1C;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAkD1B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAmGnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAiDhG;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAkClC,OAAO,CAAC,kBAAkB;CAM7B"}