Refactor Codex Lens config handling and CLI tools status checks

- Updated Codex Lens config handler to extract embeddings data from the new response structure, including coverage percentage and total files with embeddings.
- Enhanced CLI tools status function to handle different tool types (builtin, cli-wrapper, api-endpoint) with improved logic for checking availability based on configuration.
- Removed obsolete test files and directories that are no longer needed.
This commit is contained in:
catlog22
2026-01-12 22:49:30 +08:00
parent 5259bf48b2
commit 908a745f95
6 changed files with 75 additions and 1861 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -170,9 +170,13 @@ export async function handleCodexLensConfigRoutes(ctx: RouteContext): Promise<bo
const indexedFiles = projectData.total_files || 0; // All indexed files have FTS
// Get embeddings data from index status
const filesWithEmbeddings = embeddingsData?.files_with_embeddings || 0;
// The response structure is: { total_indexes, indexes_with_embeddings, total_chunks, indexes: [{coverage_percent, total_files, ...}] }
const indexesWithEmbeddings = embeddingsData?.indexes_with_embeddings || 0;
const totalChunks = embeddingsData?.total_chunks || 0;
const vectorPercent = embeddingsData?.coverage_percent || 0;
// coverage_percent is in the indexes array - get the first one (for single project query)
const indexEntry = embeddingsData?.indexes?.[0];
const vectorPercent = indexEntry?.coverage_percent || 0;
const filesWithEmbeddings = indexEntry?.total_files || 0;
// FTS percentage (all indexed files have FTS, so it's always 100% if indexed)
const ftsPercent = totalFiles > 0 ? 100 : 0;

View File

@@ -1184,21 +1184,42 @@ export {
/**
* Get status of all CLI tools
* Dynamically reads tools from config file
* Handles different tool types:
* - builtin: Check system PATH availability
* - cli-wrapper: Check CLI Settings configuration exists
* - api-endpoint: Check LiteLLM endpoint configuration exists
*/
export async function getCliToolsStatus(): Promise<Record<string, ToolAvailability>> {
// Default built-in tools
const builtInTools = ['gemini', 'qwen', 'codex', 'claude', 'opencode'];
// Try to get tools from config
let tools = builtInTools;
// Try to get tools from config with their types
interface ToolInfo {
name: string;
type?: 'builtin' | 'cli-wrapper' | 'api-endpoint';
enabled?: boolean;
id?: string; // For api-endpoint type
}
let toolsInfo: ToolInfo[] = builtInTools.map(name => ({ name, type: 'builtin' }));
try {
// Dynamic import to avoid circular dependencies
const { loadClaudeCliTools } = await import('./claude-cli-tools.js');
const config = loadClaudeCliTools(configBaseDir);
if (config.tools && typeof config.tools === 'object') {
// Merge built-in tools with config tools to ensure all are checked
const configTools = Object.keys(config.tools);
tools = [...new Set([...builtInTools, ...configTools])];
// Build complete tool info list from config
const configToolsInfo: ToolInfo[] = Object.entries(config.tools).map(([name, toolConfig]) => ({
name,
type: toolConfig.type || 'builtin',
enabled: toolConfig.enabled !== false,
id: toolConfig.id
}));
// Merge: config tools take precedence over built-in defaults
const toolsMap = new Map<string, ToolInfo>();
toolsInfo.forEach(t => toolsMap.set(t.name, t));
configToolsInfo.forEach(t => toolsMap.set(t.name, t));
toolsInfo = Array.from(toolsMap.values());
}
} catch (e) {
// Fallback to built-in tools if config load fails
@@ -1207,8 +1228,49 @@ export async function getCliToolsStatus(): Promise<Record<string, ToolAvailabili
const results: Record<string, ToolAvailability> = {};
await Promise.all(tools.map(async (tool) => {
results[tool] = await checkToolAvailability(tool);
await Promise.all(toolsInfo.map(async (toolInfo) => {
const { name, type, enabled, id } = toolInfo;
// Check availability based on tool type
if (type === 'cli-wrapper') {
// For cli-wrapper: check if CLI Settings configuration exists
try {
const { findEndpoint } = await import('../config/cli-settings-manager.js');
const endpoint = findEndpoint(name);
if (endpoint && endpoint.enabled) {
results[name] = {
available: true,
path: `cli-settings:${endpoint.id}` // Virtual path indicating CLI Settings source
};
} else {
results[name] = { available: false, path: null };
}
} catch (e) {
debugLog('cli-executor', `Failed to check cli-wrapper ${name}: ${(e as Error).message}`);
results[name] = { available: false, path: null };
}
} else if (type === 'api-endpoint') {
// For api-endpoint: check if LiteLLM endpoint configuration exists
try {
const { findEndpointById } = await import('../config/litellm-api-config-manager.js');
const endpointId = id || name;
const endpoint = findEndpointById(configBaseDir, endpointId);
if (endpoint && enabled !== false) {
results[name] = {
available: true,
path: `litellm:${endpointId}` // Virtual path indicating LiteLLM source
};
} else {
results[name] = { available: false, path: null };
}
} catch (e) {
debugLog('cli-executor', `Failed to check api-endpoint ${name}: ${(e as Error).message}`);
results[name] = { available: false, path: null };
}
} else {
// For builtin: check system PATH availability
results[name] = await checkToolAvailability(name);
}
}));
return results;

View File

@@ -1,2 +0,0 @@
import '../ccw/tests/integration/cli-executor/setup.test.ts';

View File

@@ -1 +0,0 @@
# Test README\n\nThis is a test file for vector indexing.

View File

@@ -1 +0,0 @@
// Test file for embedding generation\nfunction testEmbedding() {\n console.log('Hello world');\n}\n\nexport default testEmbedding;