refactor(config): Standardize env var access and config getters
This commit focuses on standardizing configuration and API key access patterns across key modules as part of subtask 61.34. Key changes include: - Refactored `ai-services.js` to remove global AI clients and use `resolveEnvVariable` for API key checks. Client instantiation now relies on `getAnthropicClient`/`getPerplexityClient` accepting a session object. - Refactored `task-manager.js` (`analyzeTaskComplexity` function) to use the unified `generateTextService` from `ai-services-unified.js`, removing direct AI client calls. - Replaced direct `process.env` access for model parameters and other configurations (`PERPLEXITY_MODEL`, `CONFIG.*`) in `task-manager.js` with calls to the appropriate getters from `config-manager.js` (e.g., `getResearchModelId(session)`, `getMainMaxTokens(session)`). - Ensured `utils.js` (`resolveEnvVariable`) correctly handles potentially undefined session objects. - Updated function signatures where necessary to propagate the `session` object for correct context-aware configuration/key retrieval. This moves towards the goal of using `ai-client-factory.js` and `ai-services-unified.js` as the standard pattern for AI interactions and centralizing configuration management through `config-manager.js`.
This commit is contained in:
57
scripts/modules/task-manager/find-next-task.js
Normal file
57
scripts/modules/task-manager/find-next-task.js
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* Find the next pending task based on dependencies
|
||||
* @param {Object[]} tasks - The array of tasks
|
||||
* @returns {Object|null} The next task to work on or null if no eligible tasks
|
||||
*/
|
||||
function findNextTask(tasks) {
|
||||
// Get all completed task IDs
|
||||
const completedTaskIds = new Set(
|
||||
tasks
|
||||
.filter((t) => t.status === 'done' || t.status === 'completed')
|
||||
.map((t) => t.id)
|
||||
);
|
||||
|
||||
// Filter for pending tasks whose dependencies are all satisfied
|
||||
const eligibleTasks = tasks.filter(
|
||||
(task) =>
|
||||
(task.status === 'pending' || task.status === 'in-progress') &&
|
||||
task.dependencies && // Make sure dependencies array exists
|
||||
task.dependencies.every((depId) => completedTaskIds.has(depId))
|
||||
);
|
||||
|
||||
if (eligibleTasks.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Sort eligible tasks by:
|
||||
// 1. Priority (high > medium > low)
|
||||
// 2. Dependencies count (fewer dependencies first)
|
||||
// 3. ID (lower ID first)
|
||||
const priorityValues = { high: 3, medium: 2, low: 1 };
|
||||
|
||||
const nextTask = eligibleTasks.sort((a, b) => {
|
||||
// Sort by priority first
|
||||
const priorityA = priorityValues[a.priority || 'medium'] || 2;
|
||||
const priorityB = priorityValues[b.priority || 'medium'] || 2;
|
||||
|
||||
if (priorityB !== priorityA) {
|
||||
return priorityB - priorityA; // Higher priority first
|
||||
}
|
||||
|
||||
// If priority is the same, sort by dependency count
|
||||
if (
|
||||
a.dependencies &&
|
||||
b.dependencies &&
|
||||
a.dependencies.length !== b.dependencies.length
|
||||
) {
|
||||
return a.dependencies.length - b.dependencies.length; // Fewer dependencies first
|
||||
}
|
||||
|
||||
// If dependency count is the same, sort by ID
|
||||
return a.id - b.id; // Lower ID first
|
||||
})[0]; // Return the first (highest priority) task
|
||||
|
||||
return nextTask;
|
||||
}
|
||||
|
||||
export default findNextTask;
|
||||
Reference in New Issue
Block a user