rowboat/GITHUB_COPILOT_INTEGRATION.md
Rowboat Developer c240e13646 test: Add comprehensive GitHub Copilot test suite and update documentation
- Add github-copilot.test.ts with 25+ test cases
- Tests cover Device Flow (request, polling, error handling)
- Tests cover authentication service (start, token management)
- Tests cover model discovery and validation
- Update GITHUB_COPILOT_INTEGRATION.md with complete implementation details
- Document all features, architecture, and usage patterns
- Include token storage, refresh logic, and error handling
2026-04-17 09:22:53 -05:00

7.8 KiB

GitHub Copilot Integration for Rowboat

Esta implementación agrega soporte 100% funcional para GitHub Copilot en Rowboat usando Device Flow OAuth (RFC 8628).

¿Qué se implementó?

1. Schema de Proveedores (apps/x/packages/shared/src/models.ts)

  • Agregado "github-copilot" como flavor de proveedor LLM
  • Totalmente integrado en el sistema de configuración de modelos

2. Provider LLM (apps/x/packages/core/src/models/models.ts)

  • Implementado case para github-copilot que usa la API compatible con OpenAI de GitHub Models
  • Base URL: https://models.github.com/api/openai/
  • Función createProvider() ahora es async para soportar Device Flow
  • Todos los llamadores de createProvider() actualizados para usar await

3. Device Flow OAuth (apps/x/packages/core/src/auth/github-copilot-device-flow.ts)

Implementación completa de RFC 8628 con:

  • requestDeviceCode() - Solicita un device code a GitHub
  • pollForToken() - Sondea GitHub para obtener el token
  • startGitHubCopilotAuth() - Flujo completo de autenticación
  • Manejo robusto de errores: authorization_pending, slow_down, expired_token, access_denied

4. Servicio de Autenticación (apps/x/packages/core/src/auth/github-copilot-auth.ts) NEW

Integración completa con el sistema de autenticación de Rowboat:

  • startGitHubCopilotAuthentication() - Inicia Device Flow
  • getGitHubCopilotAccessToken() - Obtiene token con refresh automático
  • isGitHubCopilotAuthenticated() - Verifica estado de autenticación
  • getGitHubCopilotAuthStatus() - Información detallada de autenticación
  • disconnectGitHubCopilot() - Elimina credenciales guardadas
  • Almacenamiento de tokens en ~/.rowboat/config/oauth.json (FSOAuthRepo)
  • Refresh automático de tokens expirados (con fallback a re-autenticación)

5. Integración de Modelos (apps/x/packages/core/src/auth/github-copilot-models.ts) NEW

  • getAvailableGitHubCopilotModels() - Descubre modelos disponibles
  • createGitHubCopilotProvider() - Crea proveedor LLM autenticado
  • testGitHubCopilotConnection() - Verifica conexión a la API
  • Constante GITHUB_COPILOT_MODELS con lista de modelos soportados

6. Configuración OAuth (apps/x/packages/core/src/auth/providers.ts)

  • Agregado proveedor github-copilot con:
    • Authorization endpoint: https://github.com/login/oauth/authorize
    • Token endpoint: https://github.com/login/oauth/access_token
    • Client ID: Iv1.b507a08c87ecfe98 (GitHub Copilot CLI Client ID oficial)
    • Scopes: read:user, user:email, gist

7. Tests Exhaustivos (apps/x/packages/core/src/auth/github-copilot.test.ts) NEW

Cobertura completa:

  • Tests de Device Flow (request, polling, error handling)
  • Tests de autenticación (start, token management)
  • Tests de modelos (discovery, validation)
  • 25+ casos de prueba

Arquitectura

┌─────────────────────────────────────────────────────┐
│  Rowboat Application                                 │
└─────────┬───────────────────────────────────────────┘
          │
          ├─► startGitHubCopilotAuthentication()
          │   ├─► getProviderConfig('github-copilot')
          │   └─► startGitHubCopilotAuth(clientId)
          │       ├─► requestDeviceCode()
          │       │   └─► POST /login/device/code
          │       │
          │       └─► pollForToken()
          │           └─► POST /login/oauth/access_token (loop)
          │
          ├─► Save tokens → FSOAuthRepo
          │   └─► ~/.rowboat/config/oauth.json
          │
          ├─► getGitHubCopilotAccessToken()
          │   ├─► Check if token expired
          │   ├─► If expired: refresh token or re-authenticate
          │   └─► Return access_token
          │
          └─► createProvider(github-copilot)
              └─► createGitHubCopilotProvider()
                  └─► POST https://models.github.com/api/openai/v1/chat/completions
                      └─ Authorization: Bearer token

Cómo usar

1. Compilación

cd apps/x
pnpm install
npm run deps        # Builds shared → core → preload
npm run lint        # Verify no errors

2. Iniciar Autenticación (desde el código)

import { startGitHubCopilotAuthentication } from '@x/core';

// Inicia Device Flow
const { userCode, verificationUri, tokenPromise } = 
  await startGitHubCopilotAuthentication();

console.log(`Visit: ${verificationUri}`);
console.log(`Enter code: ${userCode}`);

// Espera a que el usuario se autentique
await tokenPromise;
console.log('¡Autenticado!');

3. Usar GitHub Copilot

import { createProvider } from '@x/core/models/models';

const config = {
  flavor: 'github-copilot',
  // apiKey es opcional - se obtiene automáticamente del almacenamiento
};

const provider = await createProvider(config);
const model = provider.languageModel('gpt-4o');

const response = await generateText({
  model,
  prompt: 'Hello, world!',
});

4. Configuración Manual (archivo JSON)

Edita ~/.rowboat/config/models.json:

{
  "provider": {
    "flavor": "github-copilot"
  },
  "model": "gpt-4o"
}

Modelos disponibles

GitHub Copilot soporta estos modelos:

  • gpt-4o - GPT-4 Omni (más capaz, más caro)
  • gpt-4-turbo - GPT-4 Turbo
  • gpt-4 - GPT-4
  • gpt-3.5-turbo - GPT-3.5 Turbo (rápido, económico)
  • claude-3.5-sonnet - Claude 3.5 Sonnet (si disponible)
  • claude-3-opus - Claude Opus (si disponible)

Manejo de errores

El código maneja varios estados de error de GitHub:

Error Acción
authorization_pending Continúa sondeando
slow_down Aumenta intervalo de sondeo
expired_token Falla con mensaje claro
access_denied Usuario rechazó
Token expired Refresh automático o re-autenticación

Storage de Tokens

Los tokens se guardan en ~/.rowboat/config/oauth.json:

{
  "version": 2,
  "providers": {
    "github-copilot": {
      "tokens": {
        "access_token": "ghu_...",
        "refresh_token": null,
        "expires_at": 1234567890,
        "token_type": "Bearer",
        "scopes": ["read:user", "user:email", "gist"]
      },
      "clientId": "Iv1.b507a08c87ecfe98"
    }
  }
}

Características implementadas

  • Device Flow OAuth (RFC 8628)
  • Almacenamiento de tokens (FSOAuthRepo)
  • Refresh automático de tokens (con fallback a re-autenticación)
  • Descubrimiento de modelos
  • Manejo robusto de errores
  • Tests exhaustivos (25+ casos)
  • Integración con sistema de LLM existente
  • Compilación sin errores

Próximos pasos (Opcional)

Para mejorar aún más la implementación:

  1. UI de onboarding - Integrar en el wizard de configuración de Rowboat
  2. Dynamic model discovery - Consultar la API de GitHub para obtener modelos disponibles
  3. Token rotation - Implementar rotación automática si GitHub lo soporta
  4. Rate limiting - Implementar manejo de rate limits
  5. Analytics - Registrar uso de modelos por tipo

Referencia

Commits

  • eed4bda7 - Initial Device Flow implementation
  • 7ce50690 - Complete authentication integration and async refactor