Files
ccdojox-crypto 9e2333c90c CursorPro 后台管理系统 v1.0
功能:
- 激活码管理 (Pro/Auto 两种类型)
- 账号池管理
- 设备绑定记录
- 使用日志
- 搜索/筛选功能
- 禁用/启用功能 (支持退款参考)
- 全局设置 (换号间隔、额度消耗等)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 20:54:44 +08:00

180 lines
6.2 KiB
JavaScript

'use strict';
// ============================================
// CursorPro Extension - 反混淆版本
// ============================================
const vscode = require('vscode');
const { CursorProProvider } = require('./webview/provider');
const fs = require('fs');
const path = require('path');
let usageStatusBarItem;
// 创建输出通道
const outputChannel = vscode.window.createOutputChannel('CursorPro');
exports.outputChannel = outputChannel;
/**
* 日志输出函数
*/
function log(message) {
const timestamp = new Date().toLocaleTimeString();
outputChannel.appendLine(`[${timestamp}] ${message}`);
console.log(`[CursorPro] ${message}`);
}
exports.log = log;
/**
* 清理 Service Worker 缓存
*/
function cleanServiceWorkerCache() {
try {
const platform = process.platform;
const cachePaths = [];
if (platform === 'win32') {
const appData = process.env.APPDATA || '';
const localAppData = process.env.LOCALAPPDATA || '';
cachePaths.push(
path.join(appData, 'Cursor', 'Cache'),
path.join(localAppData, 'Cursor', 'Cache'),
path.join(appData, 'Cursor', 'GPUCache'),
path.join(localAppData, 'Cursor', 'GPUCache')
);
} else if (platform === 'darwin') {
const home = process.env.HOME || '';
cachePaths.push(
path.join(home, 'Library', 'Application Support', 'Cursor', 'Cache'),
path.join(home, 'Library', 'Application Support', 'Cursor', 'GPUCache')
);
} else {
const home = process.env.HOME || '';
cachePaths.push(
path.join(home, '.config', 'Cursor', 'Cache'),
path.join(home, '.config', 'Cursor', 'Service Worker')
);
}
for (const cachePath of cachePaths) {
if (!fs.existsSync(cachePath)) continue;
const cachesDir = path.join(cachePath, 'Caches');
if (fs.existsSync(cachesDir)) {
try {
const files = fs.readdirSync(cachesDir);
for (const file of files) {
try { fs.unlinkSync(path.join(cachesDir, file)); } catch (e) {}
}
console.log('[CursorPro] Caches 已清理:', cachesDir);
} catch (e) {}
}
const cacheStorageDir = path.join(cachePath, 'CacheStorage');
if (fs.existsSync(cacheStorageDir)) {
try {
deleteFolderRecursive(cacheStorageDir);
console.log('[CursorPro] CacheStorage 已清理:', cacheStorageDir);
} catch (e) {}
}
const databaseDir = path.join(cachePath, 'Database');
if (fs.existsSync(databaseDir)) {
try {
deleteFolderRecursive(databaseDir);
console.log('[CursorPro] Database 已清理:', databaseDir);
} catch (e) {}
}
}
} catch (error) {
console.log('[CursorPro] 清理缓存出错:', error);
}
}
function deleteFolderRecursive(folderPath) {
if (fs.existsSync(folderPath)) {
fs.readdirSync(folderPath).forEach((file) => {
const curPath = path.join(folderPath, file);
if (fs.lstatSync(curPath).isDirectory()) {
deleteFolderRecursive(curPath);
} else {
try { fs.unlinkSync(curPath); } catch (e) {}
}
});
try { fs.rmdirSync(folderPath); } catch (e) {}
}
}
/**
* 扩展激活入口
*/
function activate(context) {
cleanServiceWorkerCache();
const provider = new CursorProProvider(context.extensionUri, context);
context.subscriptions.push(
vscode.window.registerWebviewViewProvider('cursorpro.sidebar', provider)
);
usageStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
usageStatusBarItem.text = '$(dashboard) CursorPro';
usageStatusBarItem.tooltip = 'CursorPro 使用情况';
usageStatusBarItem.command = 'cursorpro.showUsage';
usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
const hasKey = context.globalState.get('cursorpro.key');
if (hasKey) usageStatusBarItem.show();
context.subscriptions.push(usageStatusBarItem);
context.subscriptions.setKeysForSync(['cursorpro.key']);
context.subscriptions.push(
vscode.commands.registerCommand('cursorpro.showUsage', () => {
vscode.commands.executeCommand('cursorpro.sidebar.focus');
})
);
}
exports.activate = activate;
function deactivate() {
console.log('[CursorPro] 扩展已停用');
}
exports.deactivate = deactivate;
function showStatusBar() {
if (usageStatusBarItem) usageStatusBarItem.show();
}
exports.showStatusBar = showStatusBar;
function hideStatusBar() {
if (usageStatusBarItem) usageStatusBarItem.hide();
}
exports.hideStatusBar = hideStatusBar;
function updateUsageStatusBar(requestCount, usageAmount) {
if (usageStatusBarItem) {
const count = requestCount;
const amount = typeof usageAmount === 'number'
? usageAmount
: parseFloat(usageAmount.toString().replace('$', '')) || 0;
const displayAmount = typeof usageAmount === 'number'
? '$' + usageAmount.toFixed(2)
: usageAmount;
usageStatusBarItem.text = `$(dashboard) ${count} | ${displayAmount}`;
usageStatusBarItem.tooltip = `请求次数: ${count}\n已用额度: ${displayAmount}\n点击查看详情`;
if (amount >= 10) {
usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
usageStatusBarItem.color = undefined;
} else if (amount >= 5) {
usageStatusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
usageStatusBarItem.color = undefined;
} else {
usageStatusBarItem.backgroundColor = undefined;
usageStatusBarItem.color = 'statusBarItem.warningBackground';
}
}
}
exports.updateUsageStatusBar = updateUsageStatusBar;