vibehub-cli 1.0.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/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +125 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/capture-prompts.d.ts +3 -0
- package/dist/commands/capture-prompts.d.ts.map +1 -0
- package/dist/commands/capture-prompts.js +137 -0
- package/dist/commands/capture-prompts.js.map +1 -0
- package/dist/commands/commit.d.ts +3 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +132 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +113 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +182 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +99 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +142 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +179 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +134 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +79 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai-capture.d.ts +21 -0
- package/dist/lib/ai-capture.d.ts.map +1 -0
- package/dist/lib/ai-capture.js +242 -0
- package/dist/lib/ai-capture.js.map +1 -0
- package/dist/lib/cloud-service.d.ts +26 -0
- package/dist/lib/cloud-service.d.ts.map +1 -0
- package/dist/lib/cloud-service.js +200 -0
- package/dist/lib/cloud-service.js.map +1 -0
- package/dist/lib/cursor-conversation-capture.d.ts +10 -0
- package/dist/lib/cursor-conversation-capture.d.ts.map +1 -0
- package/dist/lib/cursor-conversation-capture.js +117 -0
- package/dist/lib/cursor-conversation-capture.js.map +1 -0
- package/dist/lib/prompt-capture-manager.d.ts +33 -0
- package/dist/lib/prompt-capture-manager.d.ts.map +1 -0
- package/dist/lib/prompt-capture-manager.js +178 -0
- package/dist/lib/prompt-capture-manager.js.map +1 -0
- package/dist/lib/vibehub-manager.d.ts +172 -0
- package/dist/lib/vibehub-manager.d.ts.map +1 -0
- package/dist/lib/vibehub-manager.js +855 -0
- package/dist/lib/vibehub-manager.js.map +1 -0
- package/dist/src/commands/set.d.ts +3 -0
- package/dist/src/commands/set.d.ts.map +1 -0
- package/dist/src/commands/set.js +125 -0
- package/dist/src/commands/set.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { VibeHubManager } from './vibehub-manager.js';
|
|
5
|
+
import { CursorConversationCapture } from './cursor-conversation-capture.js';
|
|
6
|
+
export class AICapture {
|
|
7
|
+
constructor(cwd) {
|
|
8
|
+
this.cwd = cwd;
|
|
9
|
+
this.cursorCapture = new CursorConversationCapture();
|
|
10
|
+
}
|
|
11
|
+
async captureRecentConversation() {
|
|
12
|
+
try {
|
|
13
|
+
// Try Cursor conversation capture first
|
|
14
|
+
const cursorCapture = new CursorConversationCapture();
|
|
15
|
+
const cursorConversation = await cursorCapture.captureRecentConversation();
|
|
16
|
+
if (cursorConversation) {
|
|
17
|
+
return {
|
|
18
|
+
prompt: cursorConversation.prompt,
|
|
19
|
+
timestamp: cursorConversation.timestamp
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Fallback to reading from Cursor logs/cache
|
|
23
|
+
const conversation = await this.getConversationFromCursor();
|
|
24
|
+
if (conversation) {
|
|
25
|
+
return {
|
|
26
|
+
prompt: conversation.prompt,
|
|
27
|
+
timestamp: Date.now()
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error capturing AI conversation:', error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async getConversationFromCursor() {
|
|
38
|
+
try {
|
|
39
|
+
const cursorPaths = this.getCursorDataPaths();
|
|
40
|
+
for (const cursorPath of cursorPaths) {
|
|
41
|
+
if (await fs.pathExists(cursorPath)) {
|
|
42
|
+
const conversation = await this.readFromCursorPath(cursorPath);
|
|
43
|
+
if (conversation) {
|
|
44
|
+
return conversation;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error('Error reading from Cursor paths:', error);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getCursorDataPaths() {
|
|
56
|
+
const platform = os.platform();
|
|
57
|
+
const homeDir = os.homedir();
|
|
58
|
+
if (platform === 'darwin') {
|
|
59
|
+
return [
|
|
60
|
+
path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage'),
|
|
61
|
+
path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'logs'),
|
|
62
|
+
path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'workspaceStorage')
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
else if (platform === 'win32') {
|
|
66
|
+
return [
|
|
67
|
+
path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'globalStorage'),
|
|
68
|
+
path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'logs'),
|
|
69
|
+
path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'workspaceStorage')
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return [
|
|
74
|
+
path.join(homeDir, '.config', 'Cursor', 'User', 'globalStorage'),
|
|
75
|
+
path.join(homeDir, '.config', 'Cursor', 'logs'),
|
|
76
|
+
path.join(homeDir, '.config', 'Cursor', 'User', 'workspaceStorage')
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async readFromCursorPath(cursorPath) {
|
|
81
|
+
try {
|
|
82
|
+
const files = await fs.readdir(cursorPath);
|
|
83
|
+
// Look for recent conversation files
|
|
84
|
+
const conversationFiles = files
|
|
85
|
+
.filter(file => file.includes('conversation') || file.includes('chat') || file.includes('ai'))
|
|
86
|
+
.sort()
|
|
87
|
+
.reverse(); // Most recent first
|
|
88
|
+
for (const file of conversationFiles.slice(0, 5)) { // Check last 5 files
|
|
89
|
+
const filePath = path.join(cursorPath, file);
|
|
90
|
+
const stats = await fs.stat(filePath);
|
|
91
|
+
// Only check files modified in the last hour
|
|
92
|
+
if (Date.now() - stats.mtime.getTime() < 60 * 60 * 1000) {
|
|
93
|
+
const conversation = await this.parseConversationFile(filePath);
|
|
94
|
+
if (conversation) {
|
|
95
|
+
return conversation;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('Error reading from Cursor path:', error);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async parseConversationFile(filePath) {
|
|
107
|
+
try {
|
|
108
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
109
|
+
// Try to parse as JSON first
|
|
110
|
+
try {
|
|
111
|
+
const jsonData = JSON.parse(content);
|
|
112
|
+
return this.extractConversationFromJson(jsonData);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// If not JSON, try to extract from log format
|
|
116
|
+
return this.extractConversationFromLog(content);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('Error parsing conversation file:', error);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
extractConversationFromJson(data) {
|
|
125
|
+
try {
|
|
126
|
+
// Look for conversation data in various formats
|
|
127
|
+
const conversation = data.conversation || data.chat || data.messages || data.prompts;
|
|
128
|
+
if (Array.isArray(conversation) && conversation.length > 0) {
|
|
129
|
+
const lastMessage = conversation[conversation.length - 1];
|
|
130
|
+
if (lastMessage.prompt || lastMessage.text || lastMessage.message) {
|
|
131
|
+
return {
|
|
132
|
+
prompt: lastMessage.prompt || lastMessage.text || lastMessage.message,
|
|
133
|
+
timestamp: Date.now()
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Try direct properties
|
|
138
|
+
if (data.prompt || data.text || data.message) {
|
|
139
|
+
return {
|
|
140
|
+
prompt: data.prompt || data.text || data.message,
|
|
141
|
+
timestamp: Date.now()
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('Error extracting conversation from JSON:', error);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
extractConversationFromLog(content) {
|
|
152
|
+
try {
|
|
153
|
+
const lines = content.split('\n').reverse(); // Start from the end
|
|
154
|
+
for (const line of lines) {
|
|
155
|
+
if (line.includes('prompt') || line.includes('user') || line.includes('ask')) {
|
|
156
|
+
// Extract the prompt from the line
|
|
157
|
+
const match = line.match(/(?:prompt|user|ask)[:\s]+(.+)/i);
|
|
158
|
+
if (match && match[1].trim().length > 10) {
|
|
159
|
+
return {
|
|
160
|
+
prompt: match[1].trim(),
|
|
161
|
+
timestamp: Date.now()
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('Error extracting conversation from log:', error);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
extractMultiLineConversation(content) {
|
|
174
|
+
const lines = content.split('\n');
|
|
175
|
+
let prompt = '';
|
|
176
|
+
let response = '';
|
|
177
|
+
let inPrompt = false;
|
|
178
|
+
let inResponse = false;
|
|
179
|
+
for (const line of lines) {
|
|
180
|
+
const trimmed = line.trim();
|
|
181
|
+
if (trimmed.includes('User:') || trimmed.includes('user:') || trimmed.includes('prompt:')) {
|
|
182
|
+
inPrompt = true;
|
|
183
|
+
inResponse = false;
|
|
184
|
+
prompt = trimmed.replace(/^(User|user|prompt):\s*/i, '');
|
|
185
|
+
}
|
|
186
|
+
else if (trimmed.includes('Assistant:') || trimmed.includes('assistant:') || trimmed.includes('response:')) {
|
|
187
|
+
inPrompt = false;
|
|
188
|
+
inResponse = true;
|
|
189
|
+
response = trimmed.replace(/^(Assistant|assistant|response):\s*/i, '');
|
|
190
|
+
}
|
|
191
|
+
else if (inPrompt && trimmed) {
|
|
192
|
+
prompt += ' ' + trimmed;
|
|
193
|
+
}
|
|
194
|
+
else if (inResponse && trimmed) {
|
|
195
|
+
response += ' ' + trimmed;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return { prompt: prompt.trim(), response: response.trim() };
|
|
199
|
+
}
|
|
200
|
+
extractFilesFromMessages(messages) {
|
|
201
|
+
const files = [];
|
|
202
|
+
for (const message of messages) {
|
|
203
|
+
if (message.files && Array.isArray(message.files)) {
|
|
204
|
+
files.push(...message.files);
|
|
205
|
+
}
|
|
206
|
+
if (message.content && typeof message.content === 'string') {
|
|
207
|
+
const fileMatches = message.content.match(/`([^`]+\.(js|ts|jsx|tsx|py|java|cpp|c|h|html|css|json|md|txt))`/g);
|
|
208
|
+
if (fileMatches) {
|
|
209
|
+
files.push(...fileMatches.map((f) => f.replace(/`/g, '')));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return [...new Set(files)]; // Remove duplicates
|
|
214
|
+
}
|
|
215
|
+
async createManualSession() {
|
|
216
|
+
try {
|
|
217
|
+
const vibehubManager = new VibeHubManager(this.cwd);
|
|
218
|
+
// This would need to be implemented with user input
|
|
219
|
+
// For now, return null to indicate manual input is needed
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
console.error('Error creating manual session:', error);
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async getRecentSession() {
|
|
228
|
+
try {
|
|
229
|
+
const vibehubManager = new VibeHubManager(this.cwd);
|
|
230
|
+
const sessions = await vibehubManager.getAllSessions();
|
|
231
|
+
if (sessions.length > 0) {
|
|
232
|
+
return sessions[sessions.length - 1].id;
|
|
233
|
+
}
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
console.error('Error getting recent session:', error);
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=ai-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-capture.js","sourceRoot":"","sources":["../../src/lib/ai-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VibeHubCommit, VibeHubSession, SyncResponse } from './vibehub-manager.js';
|
|
2
|
+
export interface CloudConfig {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CloudService {
|
|
7
|
+
private api;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: CloudConfig);
|
|
10
|
+
setToken(token: string): void;
|
|
11
|
+
push(projectId: string, commits: VibeHubCommit[], sessions: VibeHubSession[], force?: boolean): Promise<SyncResponse>;
|
|
12
|
+
pull(projectId: string, lastSync?: string, force?: boolean): Promise<SyncResponse>;
|
|
13
|
+
getSyncStatus(projectId: string): Promise<any>;
|
|
14
|
+
getCommits(projectId: string, limit?: number, offset?: number, branch?: string): Promise<any[]>;
|
|
15
|
+
getSessions(projectId: string, limit?: number, offset?: number): Promise<any[]>;
|
|
16
|
+
createProject(name: string, description?: string, settings?: any): Promise<any>;
|
|
17
|
+
getProjects(limit?: number, offset?: number): Promise<any[]>;
|
|
18
|
+
getProject(projectId: string): Promise<any>;
|
|
19
|
+
updateProject(projectId: string, updates: any): Promise<any>;
|
|
20
|
+
deleteProject(projectId: string): Promise<void>;
|
|
21
|
+
addCollaborator(projectId: string, email: string, role: 'Admin' | 'Editor' | 'Viewer'): Promise<void>;
|
|
22
|
+
removeCollaborator(projectId: string, collaboratorId: string): Promise<void>;
|
|
23
|
+
testConnection(): Promise<boolean>;
|
|
24
|
+
verifyProject(projectId: string): Promise<boolean>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cloud-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-service.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAA4B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7G,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,WAAW;IA8B/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBnH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAehF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU9C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAgBtF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAetE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAe/E,WAAW,CAAC,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAenD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU3C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAU5D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAWlC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQzD"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
export class CloudService {
|
|
3
|
+
constructor(config) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.api = axios.create({
|
|
6
|
+
baseURL: config.apiUrl,
|
|
7
|
+
timeout: 30000,
|
|
8
|
+
headers: {
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
|
+
...(config.token && { Authorization: `Bearer ${config.token}` })
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
// Add response interceptor for error handling
|
|
14
|
+
this.api.interceptors.response.use((response) => response, (error) => {
|
|
15
|
+
if (error.response?.status === 401) {
|
|
16
|
+
throw new Error('Authentication failed. Please login again.');
|
|
17
|
+
}
|
|
18
|
+
if (error.response?.status === 403) {
|
|
19
|
+
throw new Error('Access denied. You don\'t have permission to perform this action.');
|
|
20
|
+
}
|
|
21
|
+
if (error.response?.status === 404) {
|
|
22
|
+
throw new Error('Resource not found.');
|
|
23
|
+
}
|
|
24
|
+
throw new Error(error.response?.data?.error || error.message || 'Network error');
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Set authentication token
|
|
28
|
+
setToken(token) {
|
|
29
|
+
this.config.token = token;
|
|
30
|
+
this.api.defaults.headers.Authorization = `Bearer ${token}`;
|
|
31
|
+
}
|
|
32
|
+
// Push commits and sessions to cloud
|
|
33
|
+
async push(projectId, commits, sessions, force = false) {
|
|
34
|
+
try {
|
|
35
|
+
const response = await this.api.post('/api/sync/push', {
|
|
36
|
+
projectId,
|
|
37
|
+
commits,
|
|
38
|
+
sessions,
|
|
39
|
+
force
|
|
40
|
+
});
|
|
41
|
+
return response.data.data;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw new Error(`Failed to push to cloud: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Pull commits and sessions from cloud
|
|
48
|
+
async pull(projectId, lastSync, force = false) {
|
|
49
|
+
try {
|
|
50
|
+
const response = await this.api.post('/api/sync/pull', {
|
|
51
|
+
projectId,
|
|
52
|
+
lastSync,
|
|
53
|
+
force
|
|
54
|
+
});
|
|
55
|
+
return response.data.data;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`Failed to pull from cloud: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Get sync status
|
|
62
|
+
async getSyncStatus(projectId) {
|
|
63
|
+
try {
|
|
64
|
+
const response = await this.api.get(`/api/sync/status/${projectId}`);
|
|
65
|
+
return response.data.data;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`Failed to get sync status: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Get project commits
|
|
72
|
+
async getCommits(projectId, limit = 50, offset = 0, branch) {
|
|
73
|
+
try {
|
|
74
|
+
const params = new URLSearchParams({
|
|
75
|
+
limit: limit.toString(),
|
|
76
|
+
offset: offset.toString(),
|
|
77
|
+
...(branch && { branch })
|
|
78
|
+
});
|
|
79
|
+
const response = await this.api.get(`/api/sync/commits/${projectId}?${params}`);
|
|
80
|
+
return response.data.data;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new Error(`Failed to get commits: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Get project sessions
|
|
87
|
+
async getSessions(projectId, limit = 50, offset = 0) {
|
|
88
|
+
try {
|
|
89
|
+
const params = new URLSearchParams({
|
|
90
|
+
limit: limit.toString(),
|
|
91
|
+
offset: offset.toString()
|
|
92
|
+
});
|
|
93
|
+
const response = await this.api.get(`/api/sync/sessions/${projectId}?${params}`);
|
|
94
|
+
return response.data.data;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
throw new Error(`Failed to get sessions: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Create project in cloud
|
|
101
|
+
async createProject(name, description, settings) {
|
|
102
|
+
try {
|
|
103
|
+
const response = await this.api.post('/api/projects', {
|
|
104
|
+
name,
|
|
105
|
+
description,
|
|
106
|
+
settings
|
|
107
|
+
});
|
|
108
|
+
return response.data.data;
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new Error(`Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Get user's projects
|
|
115
|
+
async getProjects(limit = 20, offset = 0) {
|
|
116
|
+
try {
|
|
117
|
+
const params = new URLSearchParams({
|
|
118
|
+
limit: limit.toString(),
|
|
119
|
+
offset: offset.toString()
|
|
120
|
+
});
|
|
121
|
+
const response = await this.api.get(`/api/projects?${params}`);
|
|
122
|
+
return response.data.data;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new Error(`Failed to get projects: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Get project by ID
|
|
129
|
+
async getProject(projectId) {
|
|
130
|
+
try {
|
|
131
|
+
const response = await this.api.get(`/api/projects/${projectId}`);
|
|
132
|
+
return response.data.data;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new Error(`Failed to get project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Update project
|
|
139
|
+
async updateProject(projectId, updates) {
|
|
140
|
+
try {
|
|
141
|
+
const response = await this.api.put(`/api/projects/${projectId}`, updates);
|
|
142
|
+
return response.data.data;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new Error(`Failed to update project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Delete project
|
|
149
|
+
async deleteProject(projectId) {
|
|
150
|
+
try {
|
|
151
|
+
await this.api.delete(`/api/projects/${projectId}`);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error(`Failed to delete project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Add collaborator
|
|
158
|
+
async addCollaborator(projectId, email, role) {
|
|
159
|
+
try {
|
|
160
|
+
await this.api.post(`/api/projects/${projectId}/collaborators`, {
|
|
161
|
+
email,
|
|
162
|
+
role
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw new Error(`Failed to add collaborator: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Remove collaborator
|
|
170
|
+
async removeCollaborator(projectId, collaboratorId) {
|
|
171
|
+
try {
|
|
172
|
+
await this.api.delete(`/api/projects/${projectId}/collaborators/${collaboratorId}`);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw new Error(`Failed to remove collaborator: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Test connection
|
|
179
|
+
async testConnection() {
|
|
180
|
+
try {
|
|
181
|
+
// Try the health endpoint at the root level
|
|
182
|
+
const response = await this.api.get('/health');
|
|
183
|
+
return response.data.success === true;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Verify project exists in cloud
|
|
190
|
+
async verifyProject(projectId) {
|
|
191
|
+
try {
|
|
192
|
+
const response = await this.api.get(`/api/projects/${projectId}`);
|
|
193
|
+
return response.data.success === true;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=cloud-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-service.js","sourceRoot":"","sources":["../../src/lib/cloud-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CursorConversation {
|
|
2
|
+
prompt: string;
|
|
3
|
+
timestamp: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class CursorConversationCapture {
|
|
6
|
+
private getCursorDataPath;
|
|
7
|
+
captureRecentConversation(): Promise<CursorConversation | null>;
|
|
8
|
+
private parseCursorDatabase;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=cursor-conversation-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-conversation-capture.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-conversation-capture.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,iBAAiB;IAanB,yBAAyB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;YA0EvD,mBAAmB;CA0ClC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
export class CursorConversationCapture {
|
|
5
|
+
getCursorDataPath() {
|
|
6
|
+
const platform = os.platform();
|
|
7
|
+
const homeDir = os.homedir();
|
|
8
|
+
if (platform === 'darwin') {
|
|
9
|
+
return path.join(homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'workspaceStorage');
|
|
10
|
+
}
|
|
11
|
+
else if (platform === 'win32') {
|
|
12
|
+
return path.join(homeDir, 'AppData', 'Roaming', 'Cursor', 'User', 'workspaceStorage');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return path.join(homeDir, '.config', 'Cursor', 'User', 'workspaceStorage');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async captureRecentConversation() {
|
|
19
|
+
try {
|
|
20
|
+
console.log('🤖 Capturing recent Cursor conversation...');
|
|
21
|
+
const cursorPath = this.getCursorDataPath();
|
|
22
|
+
console.log('Cursor path:', cursorPath);
|
|
23
|
+
if (!await fs.pathExists(cursorPath)) {
|
|
24
|
+
console.log('❌ Cursor path does not exist');
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Find the database with the most recent conversation data
|
|
28
|
+
const workspaces = await fs.readdir(cursorPath);
|
|
29
|
+
console.log('Found workspaces:', workspaces.length);
|
|
30
|
+
let bestConversation = null;
|
|
31
|
+
let latestTime = 0;
|
|
32
|
+
for (const workspace of workspaces) {
|
|
33
|
+
// First, check for active state.vscdb files (current conversations)
|
|
34
|
+
const activeDbPath = path.join(cursorPath, workspace, 'state.vscdb');
|
|
35
|
+
const backupDbPath = path.join(cursorPath, workspace, 'state.vscdb.backup');
|
|
36
|
+
console.log(`Checking workspace: ${workspace}`);
|
|
37
|
+
// Try active database first
|
|
38
|
+
if (await fs.pathExists(activeDbPath)) {
|
|
39
|
+
console.log(`✅ Found active database: ${activeDbPath}`);
|
|
40
|
+
const stats = await fs.stat(activeDbPath);
|
|
41
|
+
console.log(`Active database modified: ${stats.mtime.toISOString()}`);
|
|
42
|
+
// Try to parse this active database
|
|
43
|
+
const conversation = await this.parseCursorDatabase(activeDbPath);
|
|
44
|
+
if (conversation && conversation.timestamp > latestTime) {
|
|
45
|
+
latestTime = conversation.timestamp;
|
|
46
|
+
bestConversation = conversation;
|
|
47
|
+
console.log(`✅ Found better conversation in active database: ${workspace}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(`❌ No active database found: ${activeDbPath}`);
|
|
52
|
+
// Fall back to backup database if no active one exists
|
|
53
|
+
if (await fs.pathExists(backupDbPath)) {
|
|
54
|
+
console.log(`📦 Found backup database: ${backupDbPath}`);
|
|
55
|
+
const stats = await fs.stat(backupDbPath);
|
|
56
|
+
console.log(`Backup database modified: ${stats.mtime.toISOString()}`);
|
|
57
|
+
// Try to parse this backup database
|
|
58
|
+
const conversation = await this.parseCursorDatabase(backupDbPath);
|
|
59
|
+
if (conversation && conversation.timestamp > latestTime) {
|
|
60
|
+
latestTime = conversation.timestamp;
|
|
61
|
+
bestConversation = conversation;
|
|
62
|
+
console.log(`✅ Found better conversation in backup database: ${workspace}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(`❌ No backup database found: ${backupDbPath}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!bestConversation) {
|
|
71
|
+
console.log('❌ No recent conversation found in any database');
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
console.log('Using conversation from database with timestamp:', new Date(bestConversation.timestamp).toISOString());
|
|
75
|
+
return bestConversation;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('Error capturing Cursor conversation:', error);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async parseCursorDatabase(dbPath) {
|
|
83
|
+
try {
|
|
84
|
+
const Database = (await import('better-sqlite3')).default;
|
|
85
|
+
const db = new Database(dbPath);
|
|
86
|
+
// Get the most recent prompt
|
|
87
|
+
const promptsResult = db.prepare("SELECT value FROM ItemTable WHERE key = 'aiService.prompts'").get();
|
|
88
|
+
if (!promptsResult) {
|
|
89
|
+
console.log('❌ No prompts found in database');
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const prompts = JSON.parse(promptsResult.value);
|
|
93
|
+
console.log('Found prompts:', prompts.length);
|
|
94
|
+
if (prompts.length === 0) {
|
|
95
|
+
console.log('❌ No prompts in array');
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Get the MOST RECENT prompt (last in the array)
|
|
99
|
+
const latestPrompt = prompts[prompts.length - 1];
|
|
100
|
+
if (!latestPrompt || !latestPrompt.text) {
|
|
101
|
+
console.log('❌ Latest prompt is invalid:', latestPrompt);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
console.log('✅ Captured prompt:', latestPrompt.text.substring(0, 100) + '...');
|
|
105
|
+
console.log('Prompt timestamp:', new Date(latestPrompt.unixMs || Date.now()).toISOString());
|
|
106
|
+
return {
|
|
107
|
+
prompt: latestPrompt.text,
|
|
108
|
+
timestamp: latestPrompt.unixMs || Date.now()
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error('Error parsing Cursor database:', error);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=cursor-conversation-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-conversation-capture.js","sourceRoot":"","sources":["../../src/lib/cursor-conversation-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpB,MAAM,OAAO,yBAAyB;IAC5B,iBAAiB;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAE7B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACpG,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAExC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,2DAA2D;YAC3D,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAEpD,IAAI,gBAAgB,GAA8B,IAAI,CAAC;YACvD,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,oEAAoE;gBACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;gBACrE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;gBAE5E,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,EAAE,CAAC,CAAC;gBAEhD,4BAA4B;gBAC5B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAC;oBACxD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;oBAEtE,oCAAoC;oBACpC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;oBAClE,IAAI,YAAY,IAAI,YAAY,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;wBACxD,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC;wBACpC,gBAAgB,GAAG,YAAY,CAAC;wBAChC,OAAO,CAAC,GAAG,CAAC,mDAAmD,SAAS,EAAE,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;oBAE3D,uDAAuD;oBACvD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBACtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;wBACzD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC1C,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;wBAEtE,oCAAoC;wBACpC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;wBAClE,IAAI,YAAY,IAAI,YAAY,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;4BACxD,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC;4BACpC,gBAAgB,GAAG,YAAY,CAAC;4BAChC,OAAO,CAAC,GAAG,CAAC,mDAAmD,SAAS,EAAE,CAAC,CAAC;wBAC9E,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACpH,OAAO,gBAAgB,CAAC;QAE1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAc;QAC9C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEhC,6BAA6B;YAC7B,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,EAAS,CAAC;YAE7G,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAE9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,iDAAiD;YACjD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEjD,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAE5F,OAAO;gBACL,MAAM,EAAE,YAAY,CAAC,IAAI;gBACzB,SAAS,EAAE,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;aAC7C,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|