@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
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readJson = exports.fileExists = exports.readJsonLines = exports.readLastLines = exports.getProcessInfo = exports.isProcessRunning = exports.getProcessTty = exports.getProcessCwd = exports.listProcesses = exports.TtyWriter = exports.TerminalType = exports.TerminalFocusManager = exports.AgentStatus = exports.CodexAdapter = exports.ClaudeCodeAdapter = exports.AgentManager = void 0;
3
+ exports.getProcessTty = exports.TtyWriter = exports.TerminalType = exports.TerminalFocusManager = exports.AgentStatus = exports.CodexAdapter = exports.ClaudeCodeAdapter = exports.AgentManager = void 0;
4
4
  var AgentManager_1 = require("./AgentManager");
5
5
  Object.defineProperty(exports, "AgentManager", { enumerable: true, get: function () { return AgentManager_1.AgentManager; } });
6
6
  var ClaudeCodeAdapter_1 = require("./adapters/ClaudeCodeAdapter");
@@ -15,14 +15,5 @@ Object.defineProperty(exports, "TerminalType", { enumerable: true, get: function
15
15
  var TtyWriter_1 = require("./terminal/TtyWriter");
16
16
  Object.defineProperty(exports, "TtyWriter", { enumerable: true, get: function () { return TtyWriter_1.TtyWriter; } });
17
17
  var process_1 = require("./utils/process");
18
- Object.defineProperty(exports, "listProcesses", { enumerable: true, get: function () { return process_1.listProcesses; } });
19
- Object.defineProperty(exports, "getProcessCwd", { enumerable: true, get: function () { return process_1.getProcessCwd; } });
20
18
  Object.defineProperty(exports, "getProcessTty", { enumerable: true, get: function () { return process_1.getProcessTty; } });
21
- Object.defineProperty(exports, "isProcessRunning", { enumerable: true, get: function () { return process_1.isProcessRunning; } });
22
- Object.defineProperty(exports, "getProcessInfo", { enumerable: true, get: function () { return process_1.getProcessInfo; } });
23
- var file_1 = require("./utils/file");
24
- Object.defineProperty(exports, "readLastLines", { enumerable: true, get: function () { return file_1.readLastLines; } });
25
- Object.defineProperty(exports, "readJsonLines", { enumerable: true, get: function () { return file_1.readJsonLines; } });
26
- Object.defineProperty(exports, "fileExists", { enumerable: true, get: function () { return file_1.fileExists; } });
27
- Object.defineProperty(exports, "readJson", { enumerable: true, get: function () { return file_1.readJson; } });
28
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,kEAAiE;AAAxD,sHAAA,iBAAiB,OAAA;AAC1B,wDAAuD;AAA9C,4GAAA,YAAY,OAAA;AACrB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAGpB,wEAAqF;AAA5E,4HAAA,oBAAoB,OAAA;AAAE,oHAAA,YAAY,OAAA;AAE3C,kDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAElB,2CAAgH;AAAvG,wGAAA,aAAa,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AAEtF,qCAAkF;AAAzE,qGAAA,aAAa,OAAA;AAAE,qGAAA,aAAa,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,gGAAA,QAAQ,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AAErB,kEAAiE;AAAxD,sHAAA,iBAAiB,OAAA;AAC1B,wDAAuD;AAA9C,4GAAA,YAAY,OAAA;AACrB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAGpB,wEAAqF;AAA5E,4HAAA,oBAAoB,OAAA;AAAE,oHAAA,YAAY,OAAA;AAE3C,kDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAElB,2CAAgD;AAAvC,wGAAA,aAAa,OAAA"}
@@ -1,4 +1,7 @@
1
- export { listProcesses, getProcessCwd, getProcessTty, isProcessRunning, getProcessInfo } from './process';
2
- export type { ListProcessesOptions } from './process';
3
- export { readLastLines, readJsonLines, fileExists, readJson } from './file';
1
+ export { listAgentProcesses, batchGetProcessCwds, batchGetProcessStartTimes, enrichProcesses } from './process';
2
+ export { getProcessTty } from './process';
3
+ export { batchGetSessionFileBirthtimes } from './session';
4
+ export type { SessionFile } from './session';
5
+ export { matchProcessesToSessions, generateAgentName } from './matching';
6
+ export type { MatchResult } from './matching';
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1G,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -1,15 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.readJson = exports.fileExists = exports.readJsonLines = exports.readLastLines = exports.getProcessInfo = exports.isProcessRunning = exports.getProcessTty = exports.getProcessCwd = exports.listProcesses = void 0;
3
+ exports.generateAgentName = exports.matchProcessesToSessions = exports.batchGetSessionFileBirthtimes = exports.getProcessTty = exports.enrichProcesses = exports.batchGetProcessStartTimes = exports.batchGetProcessCwds = exports.listAgentProcesses = void 0;
4
4
  var process_1 = require("./process");
5
- Object.defineProperty(exports, "listProcesses", { enumerable: true, get: function () { return process_1.listProcesses; } });
6
- Object.defineProperty(exports, "getProcessCwd", { enumerable: true, get: function () { return process_1.getProcessCwd; } });
7
- Object.defineProperty(exports, "getProcessTty", { enumerable: true, get: function () { return process_1.getProcessTty; } });
8
- Object.defineProperty(exports, "isProcessRunning", { enumerable: true, get: function () { return process_1.isProcessRunning; } });
9
- Object.defineProperty(exports, "getProcessInfo", { enumerable: true, get: function () { return process_1.getProcessInfo; } });
10
- var file_1 = require("./file");
11
- Object.defineProperty(exports, "readLastLines", { enumerable: true, get: function () { return file_1.readLastLines; } });
12
- Object.defineProperty(exports, "readJsonLines", { enumerable: true, get: function () { return file_1.readJsonLines; } });
13
- Object.defineProperty(exports, "fileExists", { enumerable: true, get: function () { return file_1.fileExists; } });
14
- Object.defineProperty(exports, "readJson", { enumerable: true, get: function () { return file_1.readJson; } });
5
+ Object.defineProperty(exports, "listAgentProcesses", { enumerable: true, get: function () { return process_1.listAgentProcesses; } });
6
+ Object.defineProperty(exports, "batchGetProcessCwds", { enumerable: true, get: function () { return process_1.batchGetProcessCwds; } });
7
+ Object.defineProperty(exports, "batchGetProcessStartTimes", { enumerable: true, get: function () { return process_1.batchGetProcessStartTimes; } });
8
+ Object.defineProperty(exports, "enrichProcesses", { enumerable: true, get: function () { return process_1.enrichProcesses; } });
9
+ var process_2 = require("./process");
10
+ Object.defineProperty(exports, "getProcessTty", { enumerable: true, get: function () { return process_2.getProcessTty; } });
11
+ var session_1 = require("./session");
12
+ Object.defineProperty(exports, "batchGetSessionFileBirthtimes", { enumerable: true, get: function () { return session_1.batchGetSessionFileBirthtimes; } });
13
+ var matching_1 = require("./matching");
14
+ Object.defineProperty(exports, "matchProcessesToSessions", { enumerable: true, get: function () { return matching_1.matchProcessesToSessions; } });
15
+ Object.defineProperty(exports, "generateAgentName", { enumerable: true, get: function () { return matching_1.generateAgentName; } });
15
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,qCAA0G;AAAjG,wGAAA,aAAa,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,wGAAA,aAAa,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AAEtF,+BAA4E;AAAnE,qGAAA,aAAa,OAAA;AAAE,qGAAA,aAAa,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,gGAAA,QAAQ,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,qCAAgH;AAAvG,6GAAA,kBAAkB,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,oHAAA,yBAAyB,OAAA;AAAE,0GAAA,eAAe,OAAA;AAC5F,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,qCAA0D;AAAjD,wHAAA,6BAA6B,OAAA;AAEtC,uCAAyE;AAAhE,oHAAA,wBAAwB,OAAA;AAAE,6GAAA,iBAAiB,OAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Session Matching Utilities
3
+ *
4
+ * Shared 1:1 greedy matching algorithm that pairs running processes with session files
5
+ * based on CWD and birth-time proximity to process start time.
6
+ */
7
+ import type { ProcessInfo } from '../adapters/AgentAdapter';
8
+ import type { SessionFile } from './session';
9
+ /**
10
+ * Result of matching a process to a session file.
11
+ */
12
+ export interface MatchResult {
13
+ /** The matched process */
14
+ process: ProcessInfo;
15
+ /** The matched session file */
16
+ session: SessionFile;
17
+ /** Absolute time delta in ms between process start and session birth time */
18
+ deltaMs: number;
19
+ }
20
+ /**
21
+ * Match processes to session files using 1:1 greedy assignment.
22
+ *
23
+ * Algorithm:
24
+ * 1. Exclude processes without startTime (they become process-only fallback).
25
+ * 2. Build candidate pairs where process.cwd === session.resolvedCwd
26
+ * and |process.startTime - session.birthtimeMs| <= 3 minutes.
27
+ * 3. Sort candidates by deltaMs ascending (best matches first).
28
+ * 4. Greedily assign: once a process or session is matched, skip it.
29
+ *
30
+ * Adapters must set session.resolvedCwd before calling this function.
31
+ */
32
+ export declare function matchProcessesToSessions(processes: ProcessInfo[], sessions: SessionFile[]): MatchResult[];
33
+ /**
34
+ * Generate a deterministic agent name from CWD and PID.
35
+ *
36
+ * Format: "folder-name-pid" (lowercase kebab-case)
37
+ */
38
+ export declare function generateAgentName(cwd: string, pid: number): string;
39
+ //# sourceMappingURL=matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/utils/matching.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,0BAA0B;IAC1B,OAAO,EAAE,WAAW,CAAC;IAErB,+BAA+B;IAC/B,OAAO,EAAE,WAAW,CAAC;IAErB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACpC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,WAAW,EAAE,GACxB,WAAW,EAAE,CAsCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlE"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Session Matching Utilities
4
+ *
5
+ * Shared 1:1 greedy matching algorithm that pairs running processes with session files
6
+ * based on CWD and birth-time proximity to process start time.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.matchProcessesToSessions = matchProcessesToSessions;
43
+ exports.generateAgentName = generateAgentName;
44
+ const path = __importStar(require("path"));
45
+ /** Maximum allowed delta between process start time and session file birth time. */
46
+ const TOLERANCE_MS = 3 * 60 * 1000; // 3 minutes
47
+ /**
48
+ * Match processes to session files using 1:1 greedy assignment.
49
+ *
50
+ * Algorithm:
51
+ * 1. Exclude processes without startTime (they become process-only fallback).
52
+ * 2. Build candidate pairs where process.cwd === session.resolvedCwd
53
+ * and |process.startTime - session.birthtimeMs| <= 3 minutes.
54
+ * 3. Sort candidates by deltaMs ascending (best matches first).
55
+ * 4. Greedily assign: once a process or session is matched, skip it.
56
+ *
57
+ * Adapters must set session.resolvedCwd before calling this function.
58
+ */
59
+ function matchProcessesToSessions(processes, sessions) {
60
+ // Build all candidate pairs
61
+ const candidates = [];
62
+ for (const proc of processes) {
63
+ if (!proc.startTime || !proc.cwd)
64
+ continue;
65
+ const processStartMs = proc.startTime.getTime();
66
+ for (const session of sessions) {
67
+ if (!session.resolvedCwd)
68
+ continue;
69
+ if (proc.cwd !== session.resolvedCwd)
70
+ continue;
71
+ const deltaMs = Math.abs(processStartMs - session.birthtimeMs);
72
+ if (deltaMs > TOLERANCE_MS)
73
+ continue;
74
+ candidates.push({ process: proc, session, deltaMs });
75
+ }
76
+ }
77
+ // Sort by smallest delta first
78
+ candidates.sort((a, b) => a.deltaMs - b.deltaMs);
79
+ // Greedy 1:1 assignment
80
+ const matchedPids = new Set();
81
+ const matchedSessionIds = new Set();
82
+ const results = [];
83
+ for (const candidate of candidates) {
84
+ if (matchedPids.has(candidate.process.pid))
85
+ continue;
86
+ if (matchedSessionIds.has(candidate.session.sessionId))
87
+ continue;
88
+ matchedPids.add(candidate.process.pid);
89
+ matchedSessionIds.add(candidate.session.sessionId);
90
+ results.push(candidate);
91
+ }
92
+ return results;
93
+ }
94
+ /**
95
+ * Generate a deterministic agent name from CWD and PID.
96
+ *
97
+ * Format: "folder-name-pid" (lowercase kebab-case)
98
+ */
99
+ function generateAgentName(cwd, pid) {
100
+ const folderName = path.basename(cwd) || 'unknown';
101
+ const kebab = folderName
102
+ .toLowerCase()
103
+ .replace(/[^a-z0-9]+/g, '-')
104
+ .replace(/^-+|-+$/g, '');
105
+ return `${kebab || 'unknown'}-${pid}`;
106
+ }
107
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/utils/matching.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCH,4DAyCC;AAOD,8CAOC;AAxFD,2CAA6B;AAI7B,oFAAoF;AACpF,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAgBhD;;;;;;;;;;;GAWG;AACH,SAAgB,wBAAwB,CACpC,SAAwB,EACxB,QAAuB;IAEvB,4BAA4B;IAC5B,MAAM,UAAU,GAA2E,EAAE,CAAC;IAE9F,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,SAAS;QAE3C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,SAAS;YACnC,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,WAAW;gBAAE,SAAS;YAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAC/D,IAAI,OAAO,GAAG,YAAY;gBAAE,SAAS;YAErC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IAEjD,wBAAwB;IACxB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QACrD,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;YAAE,SAAS;QAEjE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAW,EAAE,GAAW;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,GAAG,KAAK,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC"}
@@ -1,61 +1,46 @@
1
1
  /**
2
2
  * Process Detection Utilities
3
3
  *
4
- * Utilities for detecting and inspecting running processes on the system.
5
- * Primarily focused on macOS/Unix-like systems using the `ps` command.
4
+ * Shared shell command wrappers for detecting and inspecting running processes.
5
+ * All execSync calls for process data live here — adapters must not call execSync directly.
6
6
  */
7
7
  import type { ProcessInfo } from '../adapters/AgentAdapter';
8
8
  /**
9
- * Options for listing processes
10
- */
11
- export interface ListProcessesOptions {
12
- /** Filter processes by name pattern (case-insensitive) */
13
- namePattern?: string;
14
- /** Include only processes matching these PIDs */
15
- pids?: number[];
16
- }
17
- /**
18
- * List running processes on the system
9
+ * List running processes matching an agent executable name.
19
10
  *
20
- * @param options Filtering options
21
- * @returns Array of process information
11
+ * Uses `ps aux | grep <pattern>` at shell level for performance, then post-filters
12
+ * by checking that the executable basename matches exactly (avoids matching
13
+ * `claude-helper`, `vscode-claude-extension`, or the grep process itself).
22
14
  *
23
- * @example
24
- * ```typescript
25
- * // List all Claude Code processes
26
- * const processes = listProcesses({ namePattern: 'claude' });
27
- *
28
- * // Get specific process info
29
- * const process = listProcesses({ pids: [12345] });
30
- * ```
15
+ * Returned ProcessInfo has pid, command, tty populated.
16
+ * cwd and startTime are NOT populated — call enrichProcesses() to fill them.
31
17
  */
32
- export declare function listProcesses(options?: ListProcessesOptions): ProcessInfo[];
18
+ export declare function listAgentProcesses(namePattern: string): ProcessInfo[];
33
19
  /**
34
- * Get the current working directory for a specific process
20
+ * Batch-get current working directories for multiple PIDs.
35
21
  *
36
- * @param pid Process ID
37
- * @returns Working directory path, or empty string if unavailable
22
+ * Single `lsof -a -d cwd -Fn -p PID1,PID2,...` call.
23
+ * Returns partial results if lsof fails for one PID, others still return.
38
24
  */
39
- export declare function getProcessCwd(pid: number): string;
25
+ export declare function batchGetProcessCwds(pids: number[]): Map<number, string>;
40
26
  /**
41
- * Get the TTY device for a specific process
27
+ * Batch-get process start times for multiple PIDs.
42
28
  *
43
- * @param pid Process ID
44
- * @returns TTY device name (e.g., "ttys030"), or "?" if unavailable
29
+ * Single `ps -o pid=,lstart= -p PID1,PID2,...` call.
30
+ * Uses lstart format which gives full timestamp (e.g., "Thu Feb 5 16:00:57 2026").
31
+ * Returns partial results.
45
32
  */
46
- export declare function getProcessTty(pid: number): string;
33
+ export declare function batchGetProcessStartTimes(pids: number[]): Map<number, Date>;
47
34
  /**
48
- * Check if a process with the given PID is running
35
+ * Enrich ProcessInfo array with cwd and startTime.
49
36
  *
50
- * @param pid Process ID
51
- * @returns True if process is running
37
+ * Calls batchGetProcessCwds and batchGetProcessStartTimes in batched shell calls,
38
+ * then populates each ProcessInfo in-place. Returns partial results —
39
+ * if a PID fails, that process keeps empty cwd / undefined startTime.
52
40
  */
53
- export declare function isProcessRunning(pid: number): boolean;
41
+ export declare function enrichProcesses(processes: ProcessInfo[]): ProcessInfo[];
54
42
  /**
55
- * Get detailed information for a specific process
56
- *
57
- * @param pid Process ID
58
- * @returns Process information, or null if process not found
43
+ * Get the TTY device for a specific process
59
44
  */
60
- export declare function getProcessInfo(pid: number): ProcessInfo | null;
45
+ export declare function getProcessTty(pid: number): string;
61
46
  //# sourceMappingURL=process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,EAAE,CA2D/E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgCjD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYjD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASrD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAG9D"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAkDrE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCvE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAkC3E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAavE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWjD"}