ai-devkit 0.8.1 → 0.10.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 (57) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +2 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/agent.d.ts +3 -0
  5. package/dist/commands/agent.d.ts.map +1 -0
  6. package/dist/commands/agent.js +143 -0
  7. package/dist/commands/agent.js.map +1 -0
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +26 -26
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/memory.d.ts.map +1 -1
  12. package/dist/commands/memory.js +6 -9
  13. package/dist/commands/memory.js.map +1 -1
  14. package/dist/commands/phase.js +7 -7
  15. package/dist/commands/phase.js.map +1 -1
  16. package/dist/commands/setup.js +16 -16
  17. package/dist/commands/setup.js.map +1 -1
  18. package/dist/commands/skill.d.ts.map +1 -1
  19. package/dist/commands/skill.js +30 -19
  20. package/dist/commands/skill.js.map +1 -1
  21. package/dist/lib/AgentManager.d.ts +104 -0
  22. package/dist/lib/AgentManager.d.ts.map +1 -0
  23. package/dist/lib/AgentManager.js +185 -0
  24. package/dist/lib/AgentManager.js.map +1 -0
  25. package/dist/lib/SkillManager.d.ts +31 -0
  26. package/dist/lib/SkillManager.d.ts.map +1 -1
  27. package/dist/lib/SkillManager.js +158 -27
  28. package/dist/lib/SkillManager.js.map +1 -1
  29. package/dist/lib/TerminalFocusManager.d.ts +22 -0
  30. package/dist/lib/TerminalFocusManager.d.ts.map +1 -0
  31. package/dist/lib/TerminalFocusManager.js +195 -0
  32. package/dist/lib/TerminalFocusManager.js.map +1 -0
  33. package/dist/lib/adapters/AgentAdapter.d.ts +92 -0
  34. package/dist/lib/adapters/AgentAdapter.d.ts.map +1 -0
  35. package/dist/lib/adapters/AgentAdapter.js +29 -0
  36. package/dist/lib/adapters/AgentAdapter.js.map +1 -0
  37. package/dist/lib/adapters/ClaudeCodeAdapter.d.ts +66 -0
  38. package/dist/lib/adapters/ClaudeCodeAdapter.d.ts.map +1 -0
  39. package/dist/lib/adapters/ClaudeCodeAdapter.js +306 -0
  40. package/dist/lib/adapters/ClaudeCodeAdapter.js.map +1 -0
  41. package/dist/util/file.d.ts +52 -0
  42. package/dist/util/file.d.ts.map +1 -0
  43. package/dist/util/file.js +135 -0
  44. package/dist/util/file.js.map +1 -0
  45. package/dist/util/git.d.ts +12 -0
  46. package/dist/util/git.d.ts.map +1 -1
  47. package/dist/util/git.js +28 -0
  48. package/dist/util/git.js.map +1 -1
  49. package/dist/util/process.d.ts +61 -0
  50. package/dist/util/process.d.ts.map +1 -0
  51. package/dist/util/process.js +166 -0
  52. package/dist/util/process.js.map +1 -0
  53. package/dist/util/terminal-ui.d.ts +122 -0
  54. package/dist/util/terminal-ui.d.ts.map +1 -0
  55. package/dist/util/terminal-ui.js +177 -0
  56. package/dist/util/terminal-ui.js.map +1 -0
  57. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/AgentAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzE;;GAEG;AACH,oBAAY,WAAW;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,CAK3D,CAAC;AAEF;;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,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IAEtB,0DAA0D;IAC1D,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;IAEjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;CAC7B;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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Agent Adapter Interface
4
+ *
5
+ * Defines the contract for detecting and managing different types of AI agents.
6
+ * Each adapter is responsible for detecting agents of a specific type (e.g., Claude Code).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.STATUS_CONFIG = exports.AgentStatus = void 0;
10
+ /**
11
+ * Current status of an agent
12
+ */
13
+ var AgentStatus;
14
+ (function (AgentStatus) {
15
+ AgentStatus["RUNNING"] = "running";
16
+ AgentStatus["WAITING"] = "waiting";
17
+ AgentStatus["IDLE"] = "idle";
18
+ AgentStatus["UNKNOWN"] = "unknown";
19
+ })(AgentStatus || (exports.AgentStatus = AgentStatus = {}));
20
+ /**
21
+ * Status configuration map
22
+ */
23
+ exports.STATUS_CONFIG = {
24
+ [AgentStatus.RUNNING]: { emoji: '🟢', label: 'running', color: 'green' },
25
+ [AgentStatus.WAITING]: { emoji: '🟡', label: 'waiting', color: 'yellow' },
26
+ [AgentStatus.IDLE]: { emoji: '⚪', label: 'idle', color: 'dim' },
27
+ [AgentStatus.UNKNOWN]: { emoji: '❓', label: 'unknown', color: 'gray' },
28
+ };
29
+ //# sourceMappingURL=AgentAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentAdapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/AgentAdapter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAOH;;GAEG;AACH,IAAY,WAKX;AALD,WAAY,WAAW;IACnB,kCAAmB,CAAA;IACnB,kCAAmB,CAAA;IACnB,4BAAa,CAAA;IACb,kCAAmB,CAAA;AACvB,CAAC,EALW,WAAW,2BAAX,WAAW,QAKtB;AAWD;;GAEG;AACU,QAAA,aAAa,GAAsC;IAC5D,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;IACxE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACzE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;IAC/D,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;CACzE,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Claude Code Adapter
3
+ *
4
+ * Detects running Claude Code agents by reading session files
5
+ * from ~/.claude/ directory and correlating with running processes.
6
+ */
7
+ import type { AgentAdapter, AgentInfo, ProcessInfo } from './AgentAdapter';
8
+ /**
9
+ * Claude Code Adapter
10
+ *
11
+ * Detects Claude Code agents by:
12
+ * 1. Finding running claude processes
13
+ * 2. Reading session files from ~/.claude/projects/
14
+ * 3. Matching sessions to processes via CWD
15
+ * 4. Extracting status from session JSONL
16
+ * 5. Extracting summary from history.jsonl
17
+ */
18
+ export declare class ClaudeCodeAdapter implements AgentAdapter {
19
+ readonly type: "Claude Code";
20
+ /** Threshold in minutes before considering a session idle */
21
+ private static readonly IDLE_THRESHOLD_MINUTES;
22
+ private claudeDir;
23
+ private projectsDir;
24
+ private historyPath;
25
+ constructor();
26
+ /**
27
+ * Check if this adapter can handle a given process
28
+ */
29
+ canHandle(processInfo: ProcessInfo): boolean;
30
+ /**
31
+ * Detect running Claude Code agents
32
+ */
33
+ detectAgents(): Promise<AgentInfo[]>;
34
+ /**
35
+ * Read all Claude Code sessions
36
+ */
37
+ private readSessions;
38
+ /**
39
+ * Read a session JSONL file
40
+ * Only reads last 100 lines for performance with large files
41
+ */
42
+ private readSessionLog;
43
+ /**
44
+ * Read history.jsonl for user prompts
45
+ * Only reads last 100 lines for performance
46
+ */
47
+ private readHistory;
48
+ /**
49
+ * Determine agent status from session entry
50
+ */
51
+ private determineStatus;
52
+ /**
53
+ * Generate unique agent name
54
+ * Uses project basename, appends slug if multiple sessions for same project
55
+ */
56
+ private generateAgentName;
57
+ /**
58
+ * Truncate summary to ~40 characters
59
+ */
60
+ private truncateSummary;
61
+ /**
62
+ * Get relative time display (e.g., "2m ago", "just now")
63
+ */
64
+ private getRelativeTime;
65
+ }
66
+ //# sourceMappingURL=ClaudeCodeAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/lib/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8C3E;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IAEvC,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAEnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAS5B;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA+E1C;;OAEG;IACH,OAAO,CAAC,YAAY;IAyDpB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqCvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,eAAe;CAc1B"}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ /**
3
+ * Claude Code Adapter
4
+ *
5
+ * Detects running Claude Code agents by reading session files
6
+ * from ~/.claude/ directory and correlating with running processes.
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.ClaudeCodeAdapter = void 0;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const AgentAdapter_1 = require("./AgentAdapter");
46
+ const process_1 = require("../../util/process");
47
+ const file_1 = require("../../util/file");
48
+ /**
49
+ * Claude Code Adapter
50
+ *
51
+ * Detects Claude Code agents by:
52
+ * 1. Finding running claude processes
53
+ * 2. Reading session files from ~/.claude/projects/
54
+ * 3. Matching sessions to processes via CWD
55
+ * 4. Extracting status from session JSONL
56
+ * 5. Extracting summary from history.jsonl
57
+ */
58
+ class ClaudeCodeAdapter {
59
+ constructor() {
60
+ this.type = 'Claude Code';
61
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
62
+ this.claudeDir = path.join(homeDir, '.claude');
63
+ this.projectsDir = path.join(this.claudeDir, 'projects');
64
+ this.historyPath = path.join(this.claudeDir, 'history.jsonl');
65
+ }
66
+ /**
67
+ * Check if this adapter can handle a given process
68
+ */
69
+ canHandle(processInfo) {
70
+ return processInfo.command.toLowerCase().includes('claude');
71
+ }
72
+ /**
73
+ * Detect running Claude Code agents
74
+ */
75
+ async detectAgents() {
76
+ // 1. Find running claude processes
77
+ const claudeProcesses = (0, process_1.listProcesses)({ namePattern: 'claude' });
78
+ if (claudeProcesses.length === 0) {
79
+ return [];
80
+ }
81
+ // 2. Read all sessions
82
+ const sessions = this.readSessions();
83
+ // 3. Read history for summaries
84
+ const history = this.readHistory();
85
+ // 4. Group processes by CWD
86
+ const processesByCwd = new Map();
87
+ for (const p of claudeProcesses) {
88
+ const list = processesByCwd.get(p.cwd) || [];
89
+ list.push(p);
90
+ processesByCwd.set(p.cwd, list);
91
+ }
92
+ // 5. Match sessions to processes
93
+ const agents = [];
94
+ for (const [cwd, processes] of processesByCwd) {
95
+ // Find sessions for this project path
96
+ const projectSessions = sessions.filter(s => s.projectPath === cwd);
97
+ if (projectSessions.length === 0) {
98
+ continue;
99
+ }
100
+ // Sort sessions by last active time (newest first)
101
+ projectSessions.sort((a, b) => {
102
+ const timeA = a.lastActive?.getTime() || 0;
103
+ const timeB = b.lastActive?.getTime() || 0;
104
+ return timeB - timeA;
105
+ });
106
+ // Map processes to the most recent sessions
107
+ // If there are 2 processes, we take the 2 most recent sessions
108
+ const activeSessions = projectSessions.slice(0, processes.length);
109
+ for (let i = 0; i < activeSessions.length; i++) {
110
+ const session = activeSessions[i];
111
+ const process = processes[i]; // Assign process to session (arbitrary 1-to-1 mapping)
112
+ const historyEntry = [...history].reverse().find(h => h.sessionId === session.sessionId);
113
+ const summary = historyEntry?.display || 'Session started';
114
+ const status = this.determineStatus(session);
115
+ const agentName = this.generateAgentName(session, agents); // Pass currently built agents for collision checks
116
+ // Get status display config
117
+ const statusConfig = AgentAdapter_1.STATUS_CONFIG[status] || AgentAdapter_1.STATUS_CONFIG[AgentAdapter_1.AgentStatus.UNKNOWN];
118
+ const statusDisplay = `${statusConfig.emoji} ${statusConfig.label}`;
119
+ const lastActiveDisplay = this.getRelativeTime(session.lastActive || new Date());
120
+ agents.push({
121
+ name: agentName,
122
+ type: this.type,
123
+ status,
124
+ statusDisplay,
125
+ summary: this.truncateSummary(summary),
126
+ pid: process.pid,
127
+ projectPath: session.projectPath,
128
+ sessionId: session.sessionId,
129
+ slug: session.slug,
130
+ lastActive: session.lastActive || new Date(),
131
+ lastActiveDisplay,
132
+ });
133
+ }
134
+ }
135
+ return agents;
136
+ }
137
+ /**
138
+ * Read all Claude Code sessions
139
+ */
140
+ readSessions() {
141
+ if (!fs.existsSync(this.projectsDir)) {
142
+ return [];
143
+ }
144
+ const sessions = [];
145
+ const projectDirs = fs.readdirSync(this.projectsDir);
146
+ for (const dirName of projectDirs) {
147
+ if (dirName.startsWith('.')) {
148
+ continue;
149
+ }
150
+ const projectDir = path.join(this.projectsDir, dirName);
151
+ if (!fs.statSync(projectDir).isDirectory()) {
152
+ continue;
153
+ }
154
+ // Read sessions-index.json to get original project path
155
+ const indexPath = path.join(projectDir, 'sessions-index.json');
156
+ if (!fs.existsSync(indexPath)) {
157
+ continue;
158
+ }
159
+ const sessionsIndex = (0, file_1.readJson)(indexPath);
160
+ if (!sessionsIndex) {
161
+ console.error(`Failed to parse ${indexPath}`);
162
+ continue;
163
+ }
164
+ const sessionFiles = fs.readdirSync(projectDir).filter(f => f.endsWith('.jsonl'));
165
+ for (const sessionFile of sessionFiles) {
166
+ const sessionId = sessionFile.replace('.jsonl', '');
167
+ const sessionLogPath = path.join(projectDir, sessionFile);
168
+ try {
169
+ const sessionData = this.readSessionLog(sessionLogPath);
170
+ sessions.push({
171
+ sessionId,
172
+ projectPath: sessionsIndex.originalPath,
173
+ slug: sessionData.slug,
174
+ sessionLogPath,
175
+ lastEntry: sessionData.lastEntry,
176
+ lastActive: sessionData.lastActive,
177
+ });
178
+ }
179
+ catch (error) {
180
+ console.error(`Failed to read session ${sessionId}:`, error);
181
+ continue;
182
+ }
183
+ }
184
+ }
185
+ return sessions;
186
+ }
187
+ /**
188
+ * Read a session JSONL file
189
+ * Only reads last 100 lines for performance with large files
190
+ */
191
+ readSessionLog(logPath) {
192
+ const lines = (0, file_1.readLastLines)(logPath, 100);
193
+ let slug;
194
+ let lastEntry;
195
+ let lastActive;
196
+ for (const line of lines) {
197
+ try {
198
+ const entry = JSON.parse(line);
199
+ if (entry.slug && !slug) {
200
+ slug = entry.slug;
201
+ }
202
+ lastEntry = entry;
203
+ if (entry.timestamp) {
204
+ lastActive = new Date(entry.timestamp);
205
+ }
206
+ }
207
+ catch (error) {
208
+ continue;
209
+ }
210
+ }
211
+ return { slug, lastEntry, lastActive };
212
+ }
213
+ /**
214
+ * Read history.jsonl for user prompts
215
+ * Only reads last 100 lines for performance
216
+ */
217
+ readHistory() {
218
+ return (0, file_1.readJsonLines)(this.historyPath, 100);
219
+ }
220
+ /**
221
+ * Determine agent status from session entry
222
+ */
223
+ determineStatus(session) {
224
+ if (!session.lastEntry) {
225
+ return AgentAdapter_1.AgentStatus.UNKNOWN;
226
+ }
227
+ const entryType = session.lastEntry.type;
228
+ const lastActive = session.lastActive || new Date(0);
229
+ const ageMinutes = (Date.now() - lastActive.getTime()) / 1000 / 60;
230
+ if (ageMinutes > ClaudeCodeAdapter.IDLE_THRESHOLD_MINUTES) {
231
+ return AgentAdapter_1.AgentStatus.IDLE;
232
+ }
233
+ if (entryType === 'user') {
234
+ // Check if user interrupted manually - this puts agent back in waiting state
235
+ const content = session.lastEntry?.message?.content;
236
+ if (Array.isArray(content)) {
237
+ const isInterrupted = content.some((c) => (c.type === 'text' && c.text?.includes('[Request interrupted')) ||
238
+ (c.type === 'tool_result' && c.content?.includes('[Request interrupted')));
239
+ if (isInterrupted)
240
+ return AgentAdapter_1.AgentStatus.WAITING;
241
+ }
242
+ return AgentAdapter_1.AgentStatus.RUNNING;
243
+ }
244
+ if (entryType === 'progress' || entryType === 'thinking') {
245
+ return AgentAdapter_1.AgentStatus.RUNNING;
246
+ }
247
+ else if (entryType === 'assistant') {
248
+ return AgentAdapter_1.AgentStatus.WAITING;
249
+ }
250
+ else if (entryType === 'system') {
251
+ return AgentAdapter_1.AgentStatus.IDLE;
252
+ }
253
+ return AgentAdapter_1.AgentStatus.UNKNOWN;
254
+ }
255
+ /**
256
+ * Generate unique agent name
257
+ * Uses project basename, appends slug if multiple sessions for same project
258
+ */
259
+ generateAgentName(session, existingAgents) {
260
+ const projectName = path.basename(session.projectPath);
261
+ const sameProjectAgents = existingAgents.filter(a => a.projectPath === session.projectPath);
262
+ if (sameProjectAgents.length === 0) {
263
+ return projectName;
264
+ }
265
+ // Multiple sessions for same project, append slug
266
+ if (session.slug) {
267
+ // Use first word of slug for brevity (with safety check for format)
268
+ const slugPart = session.slug.includes('-')
269
+ ? session.slug.split('-')[0]
270
+ : session.slug.slice(0, 8);
271
+ return `${projectName} (${slugPart})`;
272
+ }
273
+ // No slug available, use session ID prefix
274
+ return `${projectName} (${session.sessionId.slice(0, 8)})`;
275
+ }
276
+ /**
277
+ * Truncate summary to ~40 characters
278
+ */
279
+ truncateSummary(summary, maxLength = 40) {
280
+ if (summary.length <= maxLength) {
281
+ return summary;
282
+ }
283
+ return summary.slice(0, maxLength - 3) + '...';
284
+ }
285
+ /**
286
+ * Get relative time display (e.g., "2m ago", "just now")
287
+ */
288
+ getRelativeTime(date) {
289
+ const now = new Date();
290
+ const diffMs = now.getTime() - date.getTime();
291
+ const diffMins = Math.floor(diffMs / 60000);
292
+ if (diffMins < 1)
293
+ return 'just now';
294
+ if (diffMins < 60)
295
+ return `${diffMins}m ago`;
296
+ const diffHours = Math.floor(diffMins / 60);
297
+ if (diffHours < 24)
298
+ return `${diffHours}h ago`;
299
+ const diffDays = Math.floor(diffHours / 24);
300
+ return `${diffDays}d ago`;
301
+ }
302
+ }
303
+ exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
304
+ /** Threshold in minutes before considering a session idle */
305
+ ClaudeCodeAdapter.IDLE_THRESHOLD_MINUTES = 5;
306
+ //# sourceMappingURL=ClaudeCodeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodeAdapter.js","sourceRoot":"","sources":["../../../src/lib/adapters/ClaudeCodeAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * File Utilities
3
+ *
4
+ * Helper functions for reading files efficiently
5
+ */
6
+ /**
7
+ * Read last N lines from a file efficiently
8
+ *
9
+ * @param filePath Path to the file
10
+ * @param lineCount Number of lines to read from the end (default: 100)
11
+ * @returns Array of lines
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const lastLines = readLastLines('/path/to/log.txt', 50);
16
+ * ```
17
+ */
18
+ export declare function readLastLines(filePath: string, lineCount?: number): string[];
19
+ /**
20
+ * Read a JSONL (JSON Lines) file and parse each line
21
+ *
22
+ * @param filePath Path to the JSONL file
23
+ * @param maxLines Maximum number of lines to read from end (default: 1000)
24
+ * @returns Array of parsed objects
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const entries = readJsonLines<MyType>('/path/to/data.jsonl');
29
+ * const recent = readJsonLines<MyType>('/path/to/data.jsonl', 100);
30
+ * ```
31
+ */
32
+ export declare function readJsonLines<T = any>(filePath: string, maxLines?: number): T[];
33
+ /**
34
+ * Check if a file exists
35
+ *
36
+ * @param filePath Path to check
37
+ * @returns True if file exists
38
+ */
39
+ export declare function fileExists(filePath: string): boolean;
40
+ /**
41
+ * Read a JSON file safely
42
+ *
43
+ * @param filePath Path to JSON file
44
+ * @returns Parsed JSON object or null if error
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const config = readJson<ConfigType>('/path/to/config.json');
49
+ * ```
50
+ */
51
+ export declare function readJson<T = any>(filePath: string): T | null;
52
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,EAAE,CAejF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,GAAG,CAAC,EAAE,CAUrF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAY5D"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * File Utilities
4
+ *
5
+ * Helper functions for reading files efficiently
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.readLastLines = readLastLines;
42
+ exports.readJsonLines = readJsonLines;
43
+ exports.fileExists = fileExists;
44
+ exports.readJson = readJson;
45
+ const fs = __importStar(require("fs"));
46
+ /**
47
+ * Read last N lines from a file efficiently
48
+ *
49
+ * @param filePath Path to the file
50
+ * @param lineCount Number of lines to read from the end (default: 100)
51
+ * @returns Array of lines
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const lastLines = readLastLines('/path/to/log.txt', 50);
56
+ * ```
57
+ */
58
+ function readLastLines(filePath, lineCount = 100) {
59
+ if (!fs.existsSync(filePath)) {
60
+ return [];
61
+ }
62
+ try {
63
+ const content = fs.readFileSync(filePath, 'utf-8');
64
+ const allLines = content.trim().split('\n');
65
+ // Return last N lines (or all if file has fewer lines)
66
+ return allLines.slice(-lineCount);
67
+ }
68
+ catch (error) {
69
+ console.error(`Failed to read ${filePath}:`, error);
70
+ return [];
71
+ }
72
+ }
73
+ /**
74
+ * Read a JSONL (JSON Lines) file and parse each line
75
+ *
76
+ * @param filePath Path to the JSONL file
77
+ * @param maxLines Maximum number of lines to read from end (default: 1000)
78
+ * @returns Array of parsed objects
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const entries = readJsonLines<MyType>('/path/to/data.jsonl');
83
+ * const recent = readJsonLines<MyType>('/path/to/data.jsonl', 100);
84
+ * ```
85
+ */
86
+ function readJsonLines(filePath, maxLines = 1000) {
87
+ const lines = readLastLines(filePath, maxLines);
88
+ return lines.map(line => {
89
+ try {
90
+ return JSON.parse(line);
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }).filter((entry) => entry !== null);
96
+ }
97
+ /**
98
+ * Check if a file exists
99
+ *
100
+ * @param filePath Path to check
101
+ * @returns True if file exists
102
+ */
103
+ function fileExists(filePath) {
104
+ try {
105
+ return fs.existsSync(filePath);
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Read a JSON file safely
113
+ *
114
+ * @param filePath Path to JSON file
115
+ * @returns Parsed JSON object or null if error
116
+ *
117
+ * @example
118
+ * ```typescript
119
+ * const config = readJson<ConfigType>('/path/to/config.json');
120
+ * ```
121
+ */
122
+ function readJson(filePath) {
123
+ if (!fs.existsSync(filePath)) {
124
+ return null;
125
+ }
126
+ try {
127
+ const content = fs.readFileSync(filePath, 'utf-8');
128
+ return JSON.parse(content);
129
+ }
130
+ catch (error) {
131
+ console.error(`Failed to parse JSON from ${filePath}:`, error);
132
+ return null;
133
+ }
134
+ }
135
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBH,sCAeC;AAeD,sCAUC;AAQD,gCAMC;AAaD,4BAYC;AA7FD,uCAAyB;AAEzB;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAAC,QAAgB,EAAE,YAAoB,GAAG;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5C,uDAAuD;QACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,aAAa,CAAU,QAAgB,EAAE,WAAmB,IAAI;IAC5E,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACpB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAc,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACvC,IAAI,CAAC;QACD,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,QAAQ,CAAU,QAAgB;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -12,4 +12,16 @@ export declare function ensureGitInstalled(): Promise<void>;
12
12
  * @throws Error if clone fails or times out
13
13
  */
14
14
  export declare function cloneRepository(targetDir: string, repoName: string, gitUrl: string): Promise<string>;
15
+ /**
16
+ * Checks if a directory is a git repository
17
+ * @param dirPath - Absolute path to directory
18
+ * @returns true if .git directory exists
19
+ */
20
+ export declare function isGitRepository(dirPath: string): Promise<boolean>;
21
+ /**
22
+ * Pulls latest changes for a git repository
23
+ * @param repoPath - Absolute path to git repository
24
+ * @throws Error if git pull fails
25
+ */
26
+ export declare function pullRepository(repoPath: string): Promise<void>;
15
27
  //# sourceMappingURL=git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/util/git.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQxD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB1G"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/util/git.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQxD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB1G;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGvE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpE"}