mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-04-29 10:26:23 +02:00
- 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
221 lines
7.8 KiB
Markdown
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
|
|
|