mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-11 02:33:51 +08:00
feat: 添加 ccw-litellm 安装和卸载后的缓存失效处理,确保数据更新
This commit is contained in:
@@ -415,6 +415,11 @@ function handleNotification(data) {
|
|||||||
'CodexLens'
|
'CodexLens'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Invalidate CodexLens page cache to ensure fresh data on next visit
|
||||||
|
if (typeof window.invalidateCodexLensCache === 'function') {
|
||||||
|
window.invalidateCodexLensCache();
|
||||||
|
console.log('[CodexLens] Cache invalidated after installation');
|
||||||
|
}
|
||||||
// Refresh CLI status if active
|
// Refresh CLI status if active
|
||||||
if (typeof loadCodexLensStatus === 'function') {
|
if (typeof loadCodexLensStatus === 'function') {
|
||||||
loadCodexLensStatus().then(() => {
|
loadCodexLensStatus().then(() => {
|
||||||
@@ -438,6 +443,11 @@ function handleNotification(data) {
|
|||||||
'CodexLens'
|
'CodexLens'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Invalidate CodexLens page cache to ensure fresh data on next visit
|
||||||
|
if (typeof window.invalidateCodexLensCache === 'function') {
|
||||||
|
window.invalidateCodexLensCache();
|
||||||
|
console.log('[CodexLens] Cache invalidated after uninstallation');
|
||||||
|
}
|
||||||
// Refresh CLI status if active
|
// Refresh CLI status if active
|
||||||
if (typeof loadCodexLensStatus === 'function') {
|
if (typeof loadCodexLensStatus === 'function') {
|
||||||
loadCodexLensStatus().then(() => {
|
loadCodexLensStatus().then(() => {
|
||||||
@@ -531,6 +541,48 @@ function handleNotification(data) {
|
|||||||
console.log('[CodexLens] Index complete:', payload.result?.files_indexed, 'files indexed');
|
console.log('[CodexLens] Index complete:', payload.result?.files_indexed, 'files indexed');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'CCW_LITELLM_INSTALLED':
|
||||||
|
// Handle ccw-litellm installation completion
|
||||||
|
if (typeof addGlobalNotification === 'function') {
|
||||||
|
addGlobalNotification(
|
||||||
|
'success',
|
||||||
|
`ccw-litellm installed successfully`,
|
||||||
|
{
|
||||||
|
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
||||||
|
},
|
||||||
|
'LiteLLM'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Invalidate ccw-litellm status cache
|
||||||
|
if (typeof window.checkCcwLitellmStatus === 'function') {
|
||||||
|
window.checkCcwLitellmStatus(true);
|
||||||
|
}
|
||||||
|
console.log('[ccw-litellm] Installation completed:', payload);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'CCW_LITELLM_UNINSTALLED':
|
||||||
|
// Handle ccw-litellm uninstallation completion
|
||||||
|
if (typeof addGlobalNotification === 'function') {
|
||||||
|
addGlobalNotification(
|
||||||
|
'success',
|
||||||
|
`ccw-litellm uninstalled successfully`,
|
||||||
|
{
|
||||||
|
'Time': new Date(payload.timestamp).toLocaleTimeString()
|
||||||
|
},
|
||||||
|
'LiteLLM'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Invalidate ccw-litellm status cache and refresh UI
|
||||||
|
if (typeof window.checkCcwLitellmStatus === 'function') {
|
||||||
|
window.checkCcwLitellmStatus(true).then(function() {
|
||||||
|
if (typeof window.renderCcwLitellmStatusCard === 'function') {
|
||||||
|
window.renderCcwLitellmStatusCard();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
console.log('[ccw-litellm] Uninstallation completed:', payload);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.log('[WS] Unknown notification type:', type);
|
console.log('[WS] Unknown notification type:', type);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,32 +329,70 @@ async function ensureLiteLLMEmbedderReady(): Promise<BootstrapResult> {
|
|||||||
return { success: true };
|
return { success: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('[CodexLens] Installing ccw-litellm for LiteLLM embedding backend...');
|
||||||
|
|
||||||
|
// Find local ccw-litellm package path
|
||||||
|
const possiblePaths = [
|
||||||
|
join(process.cwd(), 'ccw-litellm'),
|
||||||
|
join(__dirname, '..', '..', '..', 'ccw-litellm'), // ccw/src/tools -> project root
|
||||||
|
join(homedir(), 'ccw-litellm'),
|
||||||
|
];
|
||||||
|
|
||||||
|
let localPath: string | null = null;
|
||||||
|
for (const p of possiblePaths) {
|
||||||
|
if (existsSync(join(p, 'pyproject.toml'))) {
|
||||||
|
localPath = p;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Priority: Use UV if available (faster, better dependency resolution)
|
||||||
|
if (await isUvAvailable()) {
|
||||||
|
console.log('[CodexLens] Using UV for ccw-litellm installation...');
|
||||||
|
try {
|
||||||
|
const uv = createCodexLensUvManager();
|
||||||
|
|
||||||
|
// Ensure venv exists
|
||||||
|
if (!uv.isVenvValid()) {
|
||||||
|
const venvResult = await uv.createVenv();
|
||||||
|
if (!venvResult.success) {
|
||||||
|
console.log('[CodexLens] UV venv creation failed, falling back to pip:', venvResult.error);
|
||||||
|
// Fall through to pip fallback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uv.isVenvValid()) {
|
||||||
|
let uvResult;
|
||||||
|
if (localPath) {
|
||||||
|
console.log(`[CodexLens] Installing ccw-litellm from local path with UV: ${localPath}`);
|
||||||
|
uvResult = await uv.installFromProject(localPath);
|
||||||
|
} else {
|
||||||
|
console.log('[CodexLens] Installing ccw-litellm from PyPI with UV...');
|
||||||
|
uvResult = await uv.install(['ccw-litellm']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uvResult.success) {
|
||||||
|
return { success: true };
|
||||||
|
}
|
||||||
|
console.log('[CodexLens] UV install failed, falling back to pip:', uvResult.error);
|
||||||
|
}
|
||||||
|
} catch (uvErr) {
|
||||||
|
console.log('[CodexLens] UV error, falling back to pip:', (uvErr as Error).message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: Use pip for installation
|
||||||
const pipPath =
|
const pipPath =
|
||||||
process.platform === 'win32'
|
process.platform === 'win32'
|
||||||
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
? join(CODEXLENS_VENV, 'Scripts', 'pip.exe')
|
||||||
: join(CODEXLENS_VENV, 'bin', 'pip');
|
: join(CODEXLENS_VENV, 'bin', 'pip');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
console.log('[CodexLens] Installing ccw-litellm for LiteLLM embedding backend...');
|
if (localPath) {
|
||||||
|
console.log(`[CodexLens] Installing ccw-litellm from local path with pip: ${localPath}`);
|
||||||
const possiblePaths = [
|
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
||||||
join(process.cwd(), 'ccw-litellm'),
|
} else {
|
||||||
join(__dirname, '..', '..', '..', 'ccw-litellm'), // ccw/src/tools -> project root
|
console.log('[CodexLens] Installing ccw-litellm from PyPI with pip...');
|
||||||
join(homedir(), 'ccw-litellm'),
|
|
||||||
];
|
|
||||||
|
|
||||||
let installed = false;
|
|
||||||
for (const localPath of possiblePaths) {
|
|
||||||
if (existsSync(join(localPath, 'pyproject.toml'))) {
|
|
||||||
console.log(`[CodexLens] Installing ccw-litellm from local path: ${localPath}`);
|
|
||||||
execSync(`"${pipPath}" install -e "${localPath}"`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
|
||||||
installed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!installed) {
|
|
||||||
console.log('[CodexLens] Installing ccw-litellm from PyPI...');
|
|
||||||
execSync(`"${pipPath}" install ccw-litellm`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
execSync(`"${pipPath}" install ccw-litellm`, { stdio: 'inherit', timeout: EXEC_TIMEOUTS.PACKAGE_INSTALL });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user