@cloudcli-ai/cloudcli 1.29.1 → 1.29.3

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 (113) hide show
  1. package/dist/assets/{index-ByHZ8-LL.css → index-D-9h5kNf.css} +1 -1
  2. package/dist/assets/{index-BOWaxSnV.js → index-y8yqvoLv.js} +229 -229
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/claude-sdk.js +694 -0
  5. package/dist-server/server/claude-sdk.js.map +1 -0
  6. package/dist-server/server/cli.js +642 -0
  7. package/dist-server/server/cli.js.map +1 -0
  8. package/dist-server/server/constants/config.js +6 -0
  9. package/dist-server/server/constants/config.js.map +1 -0
  10. package/dist-server/server/cursor-cli.js +271 -0
  11. package/dist-server/server/cursor-cli.js.map +1 -0
  12. package/dist-server/server/database/db.js +535 -0
  13. package/dist-server/server/database/db.js.map +1 -0
  14. package/dist-server/server/database/schema.js +97 -0
  15. package/dist-server/server/database/schema.js.map +1 -0
  16. package/dist-server/server/gemini-cli.js +394 -0
  17. package/dist-server/server/gemini-cli.js.map +1 -0
  18. package/dist-server/server/gemini-response-handler.js +72 -0
  19. package/dist-server/server/gemini-response-handler.js.map +1 -0
  20. package/dist-server/server/index.js +2244 -0
  21. package/dist-server/server/index.js.map +1 -0
  22. package/dist-server/server/load-env.js +32 -0
  23. package/dist-server/server/load-env.js.map +1 -0
  24. package/dist-server/server/middleware/auth.js +111 -0
  25. package/dist-server/server/middleware/auth.js.map +1 -0
  26. package/dist-server/server/openai-codex.js +367 -0
  27. package/dist-server/server/openai-codex.js.map +1 -0
  28. package/dist-server/server/projects.js +2331 -0
  29. package/dist-server/server/projects.js.map +1 -0
  30. package/dist-server/server/providers/claude/adapter.js +266 -0
  31. package/dist-server/server/providers/claude/adapter.js.map +1 -0
  32. package/dist-server/server/providers/codex/adapter.js +232 -0
  33. package/dist-server/server/providers/codex/adapter.js.map +1 -0
  34. package/dist-server/server/providers/cursor/adapter.js +347 -0
  35. package/dist-server/server/providers/cursor/adapter.js.map +1 -0
  36. package/dist-server/server/providers/gemini/adapter.js +174 -0
  37. package/dist-server/server/providers/gemini/adapter.js.map +1 -0
  38. package/dist-server/server/providers/registry.js +39 -0
  39. package/dist-server/server/providers/registry.js.map +1 -0
  40. package/dist-server/server/providers/types.js +106 -0
  41. package/dist-server/server/providers/types.js.map +1 -0
  42. package/dist-server/server/providers/utils.js +28 -0
  43. package/dist-server/server/providers/utils.js.map +1 -0
  44. package/dist-server/server/routes/agent.js +1147 -0
  45. package/dist-server/server/routes/agent.js.map +1 -0
  46. package/dist-server/server/routes/auth.js +117 -0
  47. package/dist-server/server/routes/auth.js.map +1 -0
  48. package/dist-server/server/routes/cli-auth.js +406 -0
  49. package/dist-server/server/routes/cli-auth.js.map +1 -0
  50. package/dist-server/server/routes/codex.js +294 -0
  51. package/dist-server/server/routes/codex.js.map +1 -0
  52. package/dist-server/server/routes/commands.js +531 -0
  53. package/dist-server/server/routes/commands.js.map +1 -0
  54. package/dist-server/server/routes/cursor.js +545 -0
  55. package/dist-server/server/routes/cursor.js.map +1 -0
  56. package/dist-server/server/routes/gemini.js +21 -0
  57. package/dist-server/server/routes/gemini.js.map +1 -0
  58. package/dist-server/server/routes/git.js +1259 -0
  59. package/dist-server/server/routes/git.js.map +1 -0
  60. package/dist-server/server/routes/mcp-utils.js +46 -0
  61. package/dist-server/server/routes/mcp-utils.js.map +1 -0
  62. package/dist-server/server/routes/mcp.js +480 -0
  63. package/dist-server/server/routes/mcp.js.map +1 -0
  64. package/dist-server/server/routes/messages.js +56 -0
  65. package/dist-server/server/routes/messages.js.map +1 -0
  66. package/dist-server/server/routes/plugins.js +266 -0
  67. package/dist-server/server/routes/plugins.js.map +1 -0
  68. package/dist-server/server/routes/projects.js +505 -0
  69. package/dist-server/server/routes/projects.js.map +1 -0
  70. package/dist-server/server/routes/settings.js +249 -0
  71. package/dist-server/server/routes/settings.js.map +1 -0
  72. package/dist-server/server/routes/taskmaster.js +1832 -0
  73. package/dist-server/server/routes/taskmaster.js.map +1 -0
  74. package/dist-server/server/routes/user.js +115 -0
  75. package/dist-server/server/routes/user.js.map +1 -0
  76. package/dist-server/server/services/notification-orchestrator.js +177 -0
  77. package/dist-server/server/services/notification-orchestrator.js.map +1 -0
  78. package/dist-server/server/services/vapid-keys.js +26 -0
  79. package/dist-server/server/services/vapid-keys.js.map +1 -0
  80. package/dist-server/server/sessionManager.js +194 -0
  81. package/dist-server/server/sessionManager.js.map +1 -0
  82. package/dist-server/server/utils/commandParser.js +255 -0
  83. package/dist-server/server/utils/commandParser.js.map +1 -0
  84. package/dist-server/server/utils/frontmatter.js +16 -0
  85. package/dist-server/server/utils/frontmatter.js.map +1 -0
  86. package/dist-server/server/utils/gitConfig.js +36 -0
  87. package/dist-server/server/utils/gitConfig.js.map +1 -0
  88. package/dist-server/server/utils/mcp-detector.js +183 -0
  89. package/dist-server/server/utils/mcp-detector.js.map +1 -0
  90. package/dist-server/server/utils/plugin-loader.js +413 -0
  91. package/dist-server/server/utils/plugin-loader.js.map +1 -0
  92. package/dist-server/server/utils/plugin-process-manager.js +163 -0
  93. package/dist-server/server/utils/plugin-process-manager.js.map +1 -0
  94. package/dist-server/server/utils/runtime-paths.js +30 -0
  95. package/dist-server/server/utils/runtime-paths.js.map +1 -0
  96. package/dist-server/server/utils/taskmaster-websocket.js +118 -0
  97. package/dist-server/server/utils/taskmaster-websocket.js.map +1 -0
  98. package/dist-server/shared/modelConstants.js +87 -0
  99. package/dist-server/shared/modelConstants.js.map +1 -0
  100. package/dist-server/shared/networkHosts.js +20 -0
  101. package/dist-server/shared/networkHosts.js.map +1 -0
  102. package/package.json +21 -10
  103. package/server/cli.js +35 -33
  104. package/server/database/db.js +24 -61
  105. package/server/database/schema.js +102 -0
  106. package/server/index.js +12 -12
  107. package/server/load-env.js +11 -6
  108. package/server/routes/commands.js +6 -4
  109. package/server/routes/cursor.js +0 -218
  110. package/server/tsconfig.json +33 -0
  111. package/server/utils/runtime-paths.js +37 -0
  112. package/shared/modelConstants.js +4 -2
  113. package/server/database/init.sql +0 -99
@@ -0,0 +1,545 @@
1
+ import express from 'express';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import sqlite3 from 'sqlite3';
6
+ import { open } from 'sqlite';
7
+ import crypto from 'crypto';
8
+ import { CURSOR_MODELS } from '../../shared/modelConstants.js';
9
+ import { applyCustomSessionNames } from '../database/db.js';
10
+ const router = express.Router();
11
+ // GET /api/cursor/config - Read Cursor CLI configuration
12
+ router.get('/config', async (req, res) => {
13
+ try {
14
+ const configPath = path.join(os.homedir(), '.cursor', 'cli-config.json');
15
+ try {
16
+ const configContent = await fs.readFile(configPath, 'utf8');
17
+ const config = JSON.parse(configContent);
18
+ res.json({
19
+ success: true,
20
+ config: config,
21
+ path: configPath
22
+ });
23
+ }
24
+ catch (error) {
25
+ // Config doesn't exist or is invalid
26
+ console.log('Cursor config not found or invalid:', error.message);
27
+ // Return default config
28
+ res.json({
29
+ success: true,
30
+ config: {
31
+ version: 1,
32
+ model: {
33
+ modelId: CURSOR_MODELS.DEFAULT,
34
+ displayName: "GPT-5"
35
+ },
36
+ permissions: {
37
+ allow: [],
38
+ deny: []
39
+ }
40
+ },
41
+ isDefault: true
42
+ });
43
+ }
44
+ }
45
+ catch (error) {
46
+ console.error('Error reading Cursor config:', error);
47
+ res.status(500).json({
48
+ error: 'Failed to read Cursor configuration',
49
+ details: error.message
50
+ });
51
+ }
52
+ });
53
+ // POST /api/cursor/config - Update Cursor CLI configuration
54
+ router.post('/config', async (req, res) => {
55
+ try {
56
+ const { permissions, model } = req.body;
57
+ const configPath = path.join(os.homedir(), '.cursor', 'cli-config.json');
58
+ // Read existing config or create default
59
+ let config = {
60
+ version: 1,
61
+ editor: {
62
+ vimMode: false
63
+ },
64
+ hasChangedDefaultModel: false,
65
+ privacyCache: {
66
+ ghostMode: false,
67
+ privacyMode: 3,
68
+ updatedAt: Date.now()
69
+ }
70
+ };
71
+ try {
72
+ const existing = await fs.readFile(configPath, 'utf8');
73
+ config = JSON.parse(existing);
74
+ }
75
+ catch (error) {
76
+ // Config doesn't exist, use defaults
77
+ console.log('Creating new Cursor config');
78
+ }
79
+ // Update permissions if provided
80
+ if (permissions) {
81
+ config.permissions = {
82
+ allow: permissions.allow || [],
83
+ deny: permissions.deny || []
84
+ };
85
+ }
86
+ // Update model if provided
87
+ if (model) {
88
+ config.model = model;
89
+ config.hasChangedDefaultModel = true;
90
+ }
91
+ // Ensure directory exists
92
+ const configDir = path.dirname(configPath);
93
+ await fs.mkdir(configDir, { recursive: true });
94
+ // Write updated config
95
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
96
+ res.json({
97
+ success: true,
98
+ config: config,
99
+ message: 'Cursor configuration updated successfully'
100
+ });
101
+ }
102
+ catch (error) {
103
+ console.error('Error updating Cursor config:', error);
104
+ res.status(500).json({
105
+ error: 'Failed to update Cursor configuration',
106
+ details: error.message
107
+ });
108
+ }
109
+ });
110
+ // GET /api/cursor/mcp - Read Cursor MCP servers configuration
111
+ router.get('/mcp', async (req, res) => {
112
+ try {
113
+ const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
114
+ try {
115
+ const mcpContent = await fs.readFile(mcpPath, 'utf8');
116
+ const mcpConfig = JSON.parse(mcpContent);
117
+ // Convert to UI-friendly format
118
+ const servers = [];
119
+ if (mcpConfig.mcpServers && typeof mcpConfig.mcpServers === 'object') {
120
+ for (const [name, config] of Object.entries(mcpConfig.mcpServers)) {
121
+ const server = {
122
+ id: name,
123
+ name: name,
124
+ type: 'stdio',
125
+ scope: 'cursor',
126
+ config: {},
127
+ raw: config
128
+ };
129
+ // Determine transport type and extract config
130
+ if (config.command) {
131
+ server.type = 'stdio';
132
+ server.config.command = config.command;
133
+ server.config.args = config.args || [];
134
+ server.config.env = config.env || {};
135
+ }
136
+ else if (config.url) {
137
+ server.type = config.transport || 'http';
138
+ server.config.url = config.url;
139
+ server.config.headers = config.headers || {};
140
+ }
141
+ servers.push(server);
142
+ }
143
+ }
144
+ res.json({
145
+ success: true,
146
+ servers: servers,
147
+ path: mcpPath
148
+ });
149
+ }
150
+ catch (error) {
151
+ // MCP config doesn't exist
152
+ console.log('Cursor MCP config not found:', error.message);
153
+ res.json({
154
+ success: true,
155
+ servers: [],
156
+ isDefault: true
157
+ });
158
+ }
159
+ }
160
+ catch (error) {
161
+ console.error('Error reading Cursor MCP config:', error);
162
+ res.status(500).json({
163
+ error: 'Failed to read Cursor MCP configuration',
164
+ details: error.message
165
+ });
166
+ }
167
+ });
168
+ // POST /api/cursor/mcp/add - Add MCP server to Cursor configuration
169
+ router.post('/mcp/add', async (req, res) => {
170
+ try {
171
+ const { name, type = 'stdio', command, args = [], url, headers = {}, env = {} } = req.body;
172
+ const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
173
+ console.log(`➕ Adding MCP server to Cursor config: ${name}`);
174
+ // Read existing config or create new
175
+ let mcpConfig = { mcpServers: {} };
176
+ try {
177
+ const existing = await fs.readFile(mcpPath, 'utf8');
178
+ mcpConfig = JSON.parse(existing);
179
+ if (!mcpConfig.mcpServers) {
180
+ mcpConfig.mcpServers = {};
181
+ }
182
+ }
183
+ catch (error) {
184
+ console.log('Creating new Cursor MCP config');
185
+ }
186
+ // Build server config based on type
187
+ let serverConfig = {};
188
+ if (type === 'stdio') {
189
+ serverConfig = {
190
+ command: command,
191
+ args: args,
192
+ env: env
193
+ };
194
+ }
195
+ else if (type === 'http' || type === 'sse') {
196
+ serverConfig = {
197
+ url: url,
198
+ transport: type,
199
+ headers: headers
200
+ };
201
+ }
202
+ // Add server to config
203
+ mcpConfig.mcpServers[name] = serverConfig;
204
+ // Ensure directory exists
205
+ const mcpDir = path.dirname(mcpPath);
206
+ await fs.mkdir(mcpDir, { recursive: true });
207
+ // Write updated config
208
+ await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
209
+ res.json({
210
+ success: true,
211
+ message: `MCP server "${name}" added to Cursor configuration`,
212
+ config: mcpConfig
213
+ });
214
+ }
215
+ catch (error) {
216
+ console.error('Error adding MCP server to Cursor:', error);
217
+ res.status(500).json({
218
+ error: 'Failed to add MCP server',
219
+ details: error.message
220
+ });
221
+ }
222
+ });
223
+ // DELETE /api/cursor/mcp/:name - Remove MCP server from Cursor configuration
224
+ router.delete('/mcp/:name', async (req, res) => {
225
+ try {
226
+ const { name } = req.params;
227
+ const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
228
+ console.log(`🗑️ Removing MCP server from Cursor config: ${name}`);
229
+ // Read existing config
230
+ let mcpConfig = { mcpServers: {} };
231
+ try {
232
+ const existing = await fs.readFile(mcpPath, 'utf8');
233
+ mcpConfig = JSON.parse(existing);
234
+ }
235
+ catch (error) {
236
+ return res.status(404).json({
237
+ error: 'Cursor MCP configuration not found'
238
+ });
239
+ }
240
+ // Check if server exists
241
+ if (!mcpConfig.mcpServers || !mcpConfig.mcpServers[name]) {
242
+ return res.status(404).json({
243
+ error: `MCP server "${name}" not found in Cursor configuration`
244
+ });
245
+ }
246
+ // Remove server from config
247
+ delete mcpConfig.mcpServers[name];
248
+ // Write updated config
249
+ await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
250
+ res.json({
251
+ success: true,
252
+ message: `MCP server "${name}" removed from Cursor configuration`,
253
+ config: mcpConfig
254
+ });
255
+ }
256
+ catch (error) {
257
+ console.error('Error removing MCP server from Cursor:', error);
258
+ res.status(500).json({
259
+ error: 'Failed to remove MCP server',
260
+ details: error.message
261
+ });
262
+ }
263
+ });
264
+ // POST /api/cursor/mcp/add-json - Add MCP server using JSON format
265
+ router.post('/mcp/add-json', async (req, res) => {
266
+ try {
267
+ const { name, jsonConfig } = req.body;
268
+ const mcpPath = path.join(os.homedir(), '.cursor', 'mcp.json');
269
+ console.log(`➕ Adding MCP server to Cursor config via JSON: ${name}`);
270
+ // Validate and parse JSON config
271
+ let parsedConfig;
272
+ try {
273
+ parsedConfig = typeof jsonConfig === 'string' ? JSON.parse(jsonConfig) : jsonConfig;
274
+ }
275
+ catch (parseError) {
276
+ return res.status(400).json({
277
+ error: 'Invalid JSON configuration',
278
+ details: parseError.message
279
+ });
280
+ }
281
+ // Read existing config or create new
282
+ let mcpConfig = { mcpServers: {} };
283
+ try {
284
+ const existing = await fs.readFile(mcpPath, 'utf8');
285
+ mcpConfig = JSON.parse(existing);
286
+ if (!mcpConfig.mcpServers) {
287
+ mcpConfig.mcpServers = {};
288
+ }
289
+ }
290
+ catch (error) {
291
+ console.log('Creating new Cursor MCP config');
292
+ }
293
+ // Add server to config
294
+ mcpConfig.mcpServers[name] = parsedConfig;
295
+ // Ensure directory exists
296
+ const mcpDir = path.dirname(mcpPath);
297
+ await fs.mkdir(mcpDir, { recursive: true });
298
+ // Write updated config
299
+ await fs.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));
300
+ res.json({
301
+ success: true,
302
+ message: `MCP server "${name}" added to Cursor configuration via JSON`,
303
+ config: mcpConfig
304
+ });
305
+ }
306
+ catch (error) {
307
+ console.error('Error adding MCP server to Cursor via JSON:', error);
308
+ res.status(500).json({
309
+ error: 'Failed to add MCP server',
310
+ details: error.message
311
+ });
312
+ }
313
+ });
314
+ // GET /api/cursor/sessions - Get Cursor sessions from SQLite database
315
+ router.get('/sessions', async (req, res) => {
316
+ try {
317
+ const { projectPath } = req.query;
318
+ // Calculate cwdID hash for the project path (Cursor uses MD5 hash)
319
+ const cwdId = crypto.createHash('md5').update(projectPath || process.cwd()).digest('hex');
320
+ const cursorChatsPath = path.join(os.homedir(), '.cursor', 'chats', cwdId);
321
+ // Check if the directory exists
322
+ try {
323
+ await fs.access(cursorChatsPath);
324
+ }
325
+ catch (error) {
326
+ // No sessions for this project
327
+ return res.json({
328
+ success: true,
329
+ sessions: [],
330
+ cwdId: cwdId,
331
+ path: cursorChatsPath
332
+ });
333
+ }
334
+ // List all session directories
335
+ const sessionDirs = await fs.readdir(cursorChatsPath);
336
+ const sessions = [];
337
+ for (const sessionId of sessionDirs) {
338
+ const sessionPath = path.join(cursorChatsPath, sessionId);
339
+ const storeDbPath = path.join(sessionPath, 'store.db');
340
+ let dbStatMtimeMs = null;
341
+ try {
342
+ // Check if store.db exists
343
+ await fs.access(storeDbPath);
344
+ // Capture store.db mtime as a reliable fallback timestamp (last activity)
345
+ try {
346
+ const stat = await fs.stat(storeDbPath);
347
+ dbStatMtimeMs = stat.mtimeMs;
348
+ }
349
+ catch (_) { }
350
+ // Open SQLite database
351
+ const db = await open({
352
+ filename: storeDbPath,
353
+ driver: sqlite3.Database,
354
+ mode: sqlite3.OPEN_READONLY
355
+ });
356
+ // Get metadata from meta table
357
+ const metaRows = await db.all(`
358
+ SELECT key, value FROM meta
359
+ `);
360
+ let sessionData = {
361
+ id: sessionId,
362
+ name: 'Untitled Session',
363
+ createdAt: null,
364
+ mode: null,
365
+ projectPath: projectPath,
366
+ lastMessage: null,
367
+ messageCount: 0
368
+ };
369
+ // Parse meta table entries
370
+ for (const row of metaRows) {
371
+ if (row.value) {
372
+ try {
373
+ // Try to decode as hex-encoded JSON
374
+ const hexMatch = row.value.toString().match(/^[0-9a-fA-F]+$/);
375
+ if (hexMatch) {
376
+ const jsonStr = Buffer.from(row.value, 'hex').toString('utf8');
377
+ const data = JSON.parse(jsonStr);
378
+ if (row.key === 'agent') {
379
+ sessionData.name = data.name || sessionData.name;
380
+ // Normalize createdAt to ISO string in milliseconds
381
+ let createdAt = data.createdAt;
382
+ if (typeof createdAt === 'number') {
383
+ if (createdAt < 1e12) {
384
+ createdAt = createdAt * 1000; // seconds -> ms
385
+ }
386
+ sessionData.createdAt = new Date(createdAt).toISOString();
387
+ }
388
+ else if (typeof createdAt === 'string') {
389
+ const n = Number(createdAt);
390
+ if (!Number.isNaN(n)) {
391
+ const ms = n < 1e12 ? n * 1000 : n;
392
+ sessionData.createdAt = new Date(ms).toISOString();
393
+ }
394
+ else {
395
+ // Assume it's already an ISO/date string
396
+ const d = new Date(createdAt);
397
+ sessionData.createdAt = isNaN(d.getTime()) ? null : d.toISOString();
398
+ }
399
+ }
400
+ else {
401
+ sessionData.createdAt = sessionData.createdAt || null;
402
+ }
403
+ sessionData.mode = data.mode;
404
+ sessionData.agentId = data.agentId;
405
+ sessionData.latestRootBlobId = data.latestRootBlobId;
406
+ }
407
+ }
408
+ else {
409
+ // If not hex, use raw value for simple keys
410
+ if (row.key === 'name') {
411
+ sessionData.name = row.value.toString();
412
+ }
413
+ }
414
+ }
415
+ catch (e) {
416
+ console.log(`Could not parse meta value for key ${row.key}:`, e.message);
417
+ }
418
+ }
419
+ }
420
+ // Get message count from JSON blobs only (actual messages, not DAG structure)
421
+ try {
422
+ const blobCount = await db.get(`
423
+ SELECT COUNT(*) as count
424
+ FROM blobs
425
+ WHERE substr(data, 1, 1) = X'7B'
426
+ `);
427
+ sessionData.messageCount = blobCount.count;
428
+ // Get the most recent JSON blob for preview (actual message, not DAG structure)
429
+ const lastBlob = await db.get(`
430
+ SELECT data FROM blobs
431
+ WHERE substr(data, 1, 1) = X'7B'
432
+ ORDER BY rowid DESC
433
+ LIMIT 1
434
+ `);
435
+ if (lastBlob && lastBlob.data) {
436
+ try {
437
+ // Try to extract readable preview from blob (may contain binary with embedded JSON)
438
+ const raw = lastBlob.data.toString('utf8');
439
+ let preview = '';
440
+ // Attempt direct JSON parse
441
+ try {
442
+ const parsed = JSON.parse(raw);
443
+ if (parsed?.content) {
444
+ if (Array.isArray(parsed.content)) {
445
+ const firstText = parsed.content.find(p => p?.type === 'text' && p.text)?.text || '';
446
+ preview = firstText;
447
+ }
448
+ else if (typeof parsed.content === 'string') {
449
+ preview = parsed.content;
450
+ }
451
+ }
452
+ }
453
+ catch (_) { }
454
+ if (!preview) {
455
+ // Strip non-printable and try to find JSON chunk
456
+ const cleaned = raw.replace(/[^\x09\x0A\x0D\x20-\x7E]/g, '');
457
+ const s = cleaned;
458
+ const start = s.indexOf('{');
459
+ const end = s.lastIndexOf('}');
460
+ if (start !== -1 && end > start) {
461
+ const jsonStr = s.slice(start, end + 1);
462
+ try {
463
+ const parsed = JSON.parse(jsonStr);
464
+ if (parsed?.content) {
465
+ if (Array.isArray(parsed.content)) {
466
+ const firstText = parsed.content.find(p => p?.type === 'text' && p.text)?.text || '';
467
+ preview = firstText;
468
+ }
469
+ else if (typeof parsed.content === 'string') {
470
+ preview = parsed.content;
471
+ }
472
+ }
473
+ }
474
+ catch (_) {
475
+ preview = s;
476
+ }
477
+ }
478
+ else {
479
+ preview = s;
480
+ }
481
+ }
482
+ if (preview && preview.length > 0) {
483
+ sessionData.lastMessage = preview.substring(0, 100) + (preview.length > 100 ? '...' : '');
484
+ }
485
+ }
486
+ catch (e) {
487
+ console.log('Could not parse blob data:', e.message);
488
+ }
489
+ }
490
+ }
491
+ catch (e) {
492
+ console.log('Could not read blobs:', e.message);
493
+ }
494
+ await db.close();
495
+ // Finalize createdAt: use parsed meta value when valid, else fall back to store.db mtime
496
+ if (!sessionData.createdAt) {
497
+ if (dbStatMtimeMs && Number.isFinite(dbStatMtimeMs)) {
498
+ sessionData.createdAt = new Date(dbStatMtimeMs).toISOString();
499
+ }
500
+ }
501
+ sessions.push(sessionData);
502
+ }
503
+ catch (error) {
504
+ console.log(`Could not read session ${sessionId}:`, error.message);
505
+ }
506
+ }
507
+ // Fallback: ensure createdAt is a valid ISO string (use session directory mtime as last resort)
508
+ for (const s of sessions) {
509
+ if (!s.createdAt) {
510
+ try {
511
+ const sessionDir = path.join(cursorChatsPath, s.id);
512
+ const st = await fs.stat(sessionDir);
513
+ s.createdAt = new Date(st.mtimeMs).toISOString();
514
+ }
515
+ catch {
516
+ s.createdAt = new Date().toISOString();
517
+ }
518
+ }
519
+ }
520
+ // Sort sessions by creation date (newest first)
521
+ sessions.sort((a, b) => {
522
+ if (!a.createdAt)
523
+ return 1;
524
+ if (!b.createdAt)
525
+ return -1;
526
+ return new Date(b.createdAt) - new Date(a.createdAt);
527
+ });
528
+ applyCustomSessionNames(sessions, 'cursor');
529
+ res.json({
530
+ success: true,
531
+ sessions: sessions,
532
+ cwdId: cwdId,
533
+ path: cursorChatsPath
534
+ });
535
+ }
536
+ catch (error) {
537
+ console.error('Error reading Cursor sessions:', error);
538
+ res.status(500).json({
539
+ error: 'Failed to read Cursor sessions',
540
+ details: error.message
541
+ });
542
+ }
543
+ });
544
+ export default router;
545
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../server/routes/cursor.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import express from 'express';
2
+ import sessionManager from '../sessionManager.js';
3
+ import { sessionNamesDb } from '../database/db.js';
4
+ const router = express.Router();
5
+ router.delete('/sessions/:sessionId', async (req, res) => {
6
+ try {
7
+ const { sessionId } = req.params;
8
+ if (!sessionId || typeof sessionId !== 'string' || !/^[a-zA-Z0-9_.-]{1,100}$/.test(sessionId)) {
9
+ return res.status(400).json({ success: false, error: 'Invalid session ID format' });
10
+ }
11
+ await sessionManager.deleteSession(sessionId);
12
+ sessionNamesDb.deleteName(sessionId, 'gemini');
13
+ res.json({ success: true });
14
+ }
15
+ catch (error) {
16
+ console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
17
+ res.status(500).json({ success: false, error: error.message });
18
+ }
19
+ });
20
+ export default router;
21
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../server/routes/gemini.js"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,cAAc,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrD,IAAI,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAEjC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5F,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9C,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}