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.
- package/README.md +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +143 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +6 -9
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/phase.js +7 -7
- package/dist/commands/phase.js.map +1 -1
- package/dist/commands/setup.js +16 -16
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +30 -19
- package/dist/commands/skill.js.map +1 -1
- package/dist/lib/AgentManager.d.ts +104 -0
- package/dist/lib/AgentManager.d.ts.map +1 -0
- package/dist/lib/AgentManager.js +185 -0
- package/dist/lib/AgentManager.js.map +1 -0
- package/dist/lib/SkillManager.d.ts +31 -0
- package/dist/lib/SkillManager.d.ts.map +1 -1
- package/dist/lib/SkillManager.js +158 -27
- package/dist/lib/SkillManager.js.map +1 -1
- package/dist/lib/TerminalFocusManager.d.ts +22 -0
- package/dist/lib/TerminalFocusManager.d.ts.map +1 -0
- package/dist/lib/TerminalFocusManager.js +195 -0
- package/dist/lib/TerminalFocusManager.js.map +1 -0
- package/dist/lib/adapters/AgentAdapter.d.ts +92 -0
- package/dist/lib/adapters/AgentAdapter.d.ts.map +1 -0
- package/dist/lib/adapters/AgentAdapter.js +29 -0
- package/dist/lib/adapters/AgentAdapter.js.map +1 -0
- package/dist/lib/adapters/ClaudeCodeAdapter.d.ts +66 -0
- package/dist/lib/adapters/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/lib/adapters/ClaudeCodeAdapter.js +306 -0
- package/dist/lib/adapters/ClaudeCodeAdapter.js.map +1 -0
- package/dist/util/file.d.ts +52 -0
- package/dist/util/file.d.ts.map +1 -0
- package/dist/util/file.js +135 -0
- package/dist/util/file.js.map +1 -0
- package/dist/util/git.d.ts +12 -0
- package/dist/util/git.d.ts.map +1 -1
- package/dist/util/git.js +28 -0
- package/dist/util/git.js.map +1 -1
- package/dist/util/process.d.ts +61 -0
- package/dist/util/process.d.ts.map +1 -0
- package/dist/util/process.js +166 -0
- package/dist/util/process.js.map +1 -0
- package/dist/util/terminal-ui.d.ts +122 -0
- package/dist/util/terminal-ui.d.ts.map +1 -0
- package/dist/util/terminal-ui.js +177 -0
- package/dist/util/terminal-ui.js.map +1 -0
- 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"}
|
package/dist/util/git.d.ts
CHANGED
|
@@ -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
|
package/dist/util/git.d.ts.map
CHANGED
|
@@ -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"}
|