mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-04-29 02:24:02 +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
7.8 KiB
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-copilotque 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 usarawait
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 GitHubpollForToken()- Sondea GitHub para obtener el tokenstartGitHubCopilotAuth()- 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 FlowgetGitHubCopilotAccessToken()- Obtiene token con refresh automáticoisGitHubCopilotAuthenticated()- Verifica estado de autenticacióngetGitHubCopilotAuthStatus()- Información detallada de autenticacióndisconnectGitHubCopilot()- 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 disponiblescreateGitHubCopilotProvider()- Crea proveedor LLM autenticadotestGitHubCopilotConnection()- Verifica conexión a la API- Constante
GITHUB_COPILOT_MODELScon lista de modelos soportados
6. Configuración OAuth (apps/x/packages/core/src/auth/providers.ts)
- Agregado proveedor
github-copilotcon:- 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
- Authorization endpoint:
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 Turbogpt-4- GPT-4gpt-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:
- UI de onboarding - Integrar en el wizard de configuración de Rowboat
- Dynamic model discovery - Consultar la API de GitHub para obtener modelos disponibles
- Token rotation - Implementar rotación automática si GitHub lo soporta
- Rate limiting - Implementar manejo de rate limits
- 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 implementation7ce50690- Complete authentication integration and async refactor