Saltar a contenido

Plan de Remediacion: Optimizacion del Workspace

Fecha: 2026-02-01 Estado: COMPLETADO Prioridad: Alta


Resumen Ejecutivo

Tras una revision exhaustiva de la documentacion y el codigo fuente, se identificaron tres problemas criticos que afectaban la optimizacion del workspace. TODOS HAN SIDO RESUELTOS:

Problema Causa Raiz Estado
Resumen de historial no funciona HistoryManagerService no se usa en DevSessionService RESUELTO
Caja de texto memorias muy pequena Falta Lines o AutoGrow en MudTextField RESUELTO
ContextOptimizer no existe Documentacion desactualizada - nunca se implemento RESUELTO

Cambios Realizados (2026-02-01)

  1. DevSessionService.cs: Ahora usa IHistoryManagerService.GetOptimizedHistoryAsync()
  2. MemoriesPanel.razor: TextField con Lines="4" AutoGrow="true" MaxLines="10"
  3. WORKSPACE_COMPLETE_ROADMAP.md: Documentacion actualizada

Problema 1: Resumen Automatico de Historial NO Funciona

Diagnostico

Archivo afectado: Shared/Shared.Admin/Services/DevSessionService.cs Lineas: 392-395

// CODIGO ACTUAL - NO USA HistoryManagerService
var history = session.Messages
    .Where(m => m.Role == "user" || m.Role == "assistant")
    .Select(m => new ChatMessage(m.Role, m.Content))
    .ToList();

El problema: El servicio IHistoryManagerService existe y esta completamente implementado en HistoryManagerService.cs, pero NUNCA se inyecta ni se usa en DevSessionService.

Evidencia: - HistoryManagerService tiene el metodo GetOptimizedHistoryAsync() que: 1. Verifica si el historial excede MaxHistoryMessages (default: 20) 2. Genera un resumen automatico de mensajes antiguos usando Claude Haiku 3. Retorna resumen + mensajes recientes - DevSessionService construye el historial directamente desde session.Messages sin limitar

Solucion Propuesta

Modificar DevSessionService.cs:

  1. Inyectar IHistoryManagerService en el constructor:

    private readonly IHistoryManagerService _historyService;
    
    public DevSessionService(
        // ... otros servicios
        IHistoryManagerService historyService)
    {
        // ...
        _historyService = historyService;
    }
    

  2. Reemplazar lineas 392-395 por:

    // 3. Obtener historial optimizado (con resumen si excede limite)
    var optimizedHistory = await _historyService.GetOptimizedHistoryAsync(sessionId);
    
    // Construir historial para el proveedor de IA
    var history = new List<ChatMessage>();
    
    // Si hay resumen, agregarlo como contexto del sistema
    if (!string.IsNullOrEmpty(optimizedHistory.Summary))
    {
        history.Add(new ChatMessage("user", $"[Resumen de conversacion anterior]\n{optimizedHistory.Summary}"));
        history.Add(new ChatMessage("assistant", "Entendido, tengo el contexto de la conversacion anterior."));
    }
    
    // Agregar mensajes recientes
    history.AddRange(optimizedHistory.RecentMessages
        .Where(m => m.Role == "user" || m.Role == "assistant")
        .Select(m => new ChatMessage(m.Role, m.Content)));
    
    _logger.LogInformation(
        "Session {SessionId}: History optimized - Total={Total}, Summarized={Summarized}, Recent={Recent}, Tokens={Tokens}",
        sessionId, optimizedHistory.TotalMessageCount, optimizedHistory.SummarizedMessageCount,
        optimizedHistory.RecentMessages.Count, optimizedHistory.EstimatedTokens);
    

  3. Registrar el servicio en Program.cs (si no esta):

    builder.Services.AddScoped<IHistoryManagerService, HistoryManagerService>();
    

Impacto Esperado

  • Reduccion de tokens: ~50% en sesiones con >20 mensajes
  • Mejor contexto: El resumen mantiene informacion clave sin enviar todo el historial
  • Costos reducidos: Menos tokens = menor costo por request

Problema 2: Caja de Texto de Memorias Muy Pequena

Diagnostico

Archivo afectado: Orchestrator/src/Orchestrator.Admin/Components/Pages/Workspace/MemoriesPanel.razor Lineas: 51-59

@* CODIGO ACTUAL - TextField de una sola linea *@
<MudTextField @bind-Value="_newMemoryContent"
              Placeholder="Anadir una preferencia..."
              Variant="Variant.Outlined"
              Margin="Margin.Dense"
              Adornment="Adornment.End"
              AdornmentIcon="@Icons.Material.Filled.Add"
              OnAdornmentClick="AddMemory"
              Immediate="true"
              OnKeyDown="OnKeyDown" />

El problema: El MudTextField no tiene configuracion para multiples lineas, resultando en una caja de texto muy pequena que no permite escribir memorias largas.

Solucion Propuesta

Modificar el componente para usar un textarea multilinea:

<MudTextField @bind-Value="_newMemoryContent"
              Placeholder="Anadir una preferencia... (ej: Prefiero codigo sin comentarios)"
              Variant="Variant.Outlined"
              Margin="Margin.Dense"
              Lines="3"
              AutoGrow="true"
              MaxLines="5"
              Immediate="true"
              OnKeyDown="OnKeyDown"
              Class="memory-input" />

@* Boton separado para mejor UX *@
<MudIconButton Icon="@Icons.Material.Filled.Add"
               Color="Color.Primary"
               OnClick="AddMemory"
               Disabled="@string.IsNullOrWhiteSpace(_newMemoryContent)" />

Y actualizar el CSS:

.add-memory-section {
    display: flex;
    gap: 8px;
    align-items: flex-end;  /* Cambiar de flex-start a flex-end */
}

.add-memory-section .memory-input {
    flex: 1;
    min-height: 80px;
}

.add-memory-section .mud-select {
    width: 150px;
    align-self: flex-start;
}

Impacto Esperado

  • Mejor UX: Los usuarios pueden escribir memorias descriptivas
  • Visibilidad: El texto es visible mientras se escribe
  • Funcionalidad: Soporte para Enter (nueva linea) y Ctrl+Enter (enviar)

Problema 3: ContextOptimizer NO Existe - RESUELTO

Diagnostico

Archivo afectado: docs/features/WORKSPACE_COMPLETE_ROADMAP.md Linea: 454

# ANTES (incorrecto):
| Tokens por request | -50% | Implementado con ContextOptimizer |

# DESPUES (corregido):
| Tokens por request | -50% | Implementado con IHistoryManagerService.GetOptimizedHistoryAsync() |

El problema original: La documentacion indicaba que existia un ContextOptimizer que reducia tokens en 50%, pero: 1. No existia ninguna clase ContextOptimizer en el codebase 2. No habia implementacion de optimizacion de contexto 3. La reduccion de tokens dependia del HistoryManagerService que no se usaba (Problema 1)

RESOLUCION (2026-02-01): - Documentacion actualizada para reflejar IHistoryManagerService.GetOptimizedHistoryAsync() - Problema 1 resuelto: DevSessionService ahora usa IHistoryManagerService

Solucion Propuesta

Opcion A (Recomendada): Corregir la documentacion y usar HistoryManagerService

  1. Actualizar WORKSPACE_COMPLETE_ROADMAP.md:

    | Tokens por request | -50% | Implementado con HistoryManagerService (requiere integracion) |
    

  2. La integracion del HistoryManagerService (Problema 1) proporcionara la optimizacion de tokens esperada.

Opcion B (Futura): Crear un ContextOptimizer real

Si se desea una optimizacion mas avanzada:

public interface IContextOptimizer
{
    Task<OptimizedContext> OptimizeAsync(
        DevSession session,
        string currentMessage,
        int maxTokens = 100000);
}

public class ContextOptimizer : IContextOptimizer
{
    // Estrategias:
    // 1. Resumir historial (via HistoryManagerService)
    // 2. Comprimir system prompt eliminando ejemplos redundantes
    // 3. Filtrar memorias no relevantes al mensaje actual
    // 4. Limitar context files a los mas relevantes
}

Impacto Esperado

  • Documentacion precisa: Refleja el estado real del sistema
  • Expectativas claras: Los usuarios saben que funcionalidades existen

Plan de Implementacion

Fase 1: Correccion Critica (Inmediata)

Tarea Archivo Estimacion
Integrar HistoryManagerService en DevSessionService DevSessionService.cs 30 min
Registrar servicio en DI Program.cs 5 min
Verificar que AutoSummarizeHistory=true por defecto DevSession.cs 5 min

Fase 2: Mejora de UX (Corto plazo)

Tarea Archivo Estimacion
Ampliar caja de texto de memorias MemoriesPanel.razor 15 min
Ajustar CSS del panel MemoriesPanel.razor 10 min
Agregar Ctrl+Enter para enviar MemoriesPanel.razor 10 min

Fase 3: Documentacion (Corto plazo)

Tarea Archivo Estimacion
Actualizar WORKSPACE_COMPLETE_ROADMAP.md docs/features/ 15 min
Actualizar AUDITORIA-IMPLEMENTACION-WORKSPACE.md docs/features/ 15 min

Verificacion

Tests para Problema 1 (Historial)

[Fact]
public async Task SendMessage_WithManyMessages_ShouldUseOptimizedHistory()
{
    // Arrange: Sesion con 25 mensajes (excede MaxHistoryMessages=20)
    var session = CreateSessionWithMessages(25);

    // Act
    await _service.SendMessageStreamAsync(session.Id, request, ct);

    // Assert: Verificar que se llamo a GetOptimizedHistoryAsync
    _historyServiceMock.Verify(h => h.GetOptimizedHistoryAsync(session.Id), Times.Once);
}

[Fact]
public async Task OptimizedHistory_ShouldIncludeSummary_WhenExceedsLimit()
{
    // Arrange
    var session = CreateSessionWithMessages(25);
    session.MaxHistoryMessages = 10;

    // Act
    var result = await _historyService.GetOptimizedHistoryAsync(session.Id);

    // Assert
    Assert.True(result.WasTruncated);
    Assert.NotNull(result.Summary);
    Assert.Equal(10, result.RecentMessages.Count);
}

Tests Manuales para Problema 2 (Memorias)

  1. Abrir Workspace > Panel de Memorias
  2. La caja de texto debe mostrar 3 lineas minimo
  3. Debe permitir escribir texto largo sin truncar
  4. Enter debe crear nueva linea
  5. Ctrl+Enter debe enviar la memoria

Archivos a Modificar

Archivo Tipo de Cambio
Shared/Shared.Admin/Services/DevSessionService.cs Inyectar y usar IHistoryManagerService
Orchestrator/src/Orchestrator.Api/Program.cs Registrar IHistoryManagerService (si falta)
Orchestrator/src/Orchestrator.Admin/Components/Pages/Workspace/MemoriesPanel.razor Multiline TextField
docs/features/WORKSPACE_COMPLETE_ROADMAP.md Corregir documentacion
docs/features/AUDITORIA-IMPLEMENTACION-WORKSPACE.md Actualizar estado

Conclusion

Los tres problemas identificados tienen soluciones claras y de bajo riesgo:

  1. Historial: El codigo ya existe, solo falta conectarlo
  2. Memorias: Cambio de UI simple con MudBlazor
  3. Documentacion: Alinear docs con realidad del codigo

La implementacion de estas correcciones deberia resolver el alto consumo de tokens reportado y mejorar significativamente la experiencia de usuario en el Workspace.