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

221 lines
7.8 KiB
Markdown

# 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**
```bash
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)
```typescript
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**
```typescript
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`:
```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`:
```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
- RFC 8628: Device Authorization Grant - https://tools.ietf.org/html/rfc8628
- GitHub Device Flow Docs - https://docs.github.com/en/developers/apps/building-oauth-apps/authorizing-oauth-apps#device-flow
- GitHub Models API - https://docs.github.com/en/github/copilot/github-copilot-in-the-cli/about-github-copilot-in-the-cli
- OpenAI SDK Compatibility - https://platform.openai.com/docs/guides/model-overview
## Commits
- `eed4bda7` - Initial Device Flow implementation
- `7ce50690` - Complete authentication integration and async refactor