replan method

Future<ExecutionDAG> replan(
  1. ExecutionDAG dag,
  2. AgentContext context, {
  3. required String reason,
})

Re-plans dag because of reason.

Preserves succeeded tasks and only re-generates pending/failed ones.

Implementation

Future<ExecutionDAG> replan(
  ExecutionDAG dag,
  AgentContext context, {
  required String reason,
}) async {
  _logger.info('Re-planning: "$reason"');

  final goal = context.goal;
  final newDag = ExecutionDAG(goal.id);

  // Keep succeeded tasks
  for (final t in dag.succeeded) {
    newDag.add(t);
  }

  // Re-generate the rest
  final newTasks = _llm != null
      ? await _planWithLLM(goal, context, previousResults: dag.succeeded)
      : _planRuleBased(goal);

  // Avoid re-adding already-succeeded tasks (same description)
  final doneDescs =
      dag.succeeded.map((t) => t.description.toLowerCase()).toSet();

  for (final t in newTasks) {
    if (!doneDescs.contains(t.description.toLowerCase())) {
      newDag.add(t);
    }
  }

  _logger.info(
      'Re-plan complete: ${newDag.size} task(s) '
      '(${newDag.succeeded.length} carried over)');
  return newDag;
}