Spaces:
Running
Running
Commit History
Today
-
fix(deploy): copiar supabase/migrations en Dockerfile y deshabilitar cache de statements para pgbouncer
fab4746 -
fix(byok): inyectar Depends(get_user_keys) en endpoints y aislar credenciales en produccion
c601882 -
Merge branch 'docs/supabase-env-step-by-step': Guía paso a paso clic por clic de Supabase y credenciales en .env.example y docs/ejecucion.md
cab9e93 -
docs(env): documentar paso a paso clic por clic credenciales de Supabase y servicios externos
- Detalla en .env.example y docs/ejecucion.md la creación de proyecto Supabase (Paso 0) y navegación clic por clic para SUPABASE_URL (Project Settings -> Data API), SUPABASE_ANON_KEY (API Keys -> anon public), SUPABASE_SERVICE_ROLE_KEY (service_role -> Reveal), DATABASE_URL (Connect -> Connection String -> URI -> Session/Transaction pooler -> reset password) y SUPABASE_STORAGE_BUCKET (Storage -> drone-images). - Enriquecer pasos guiados para Hugging Face (HF_SPACE_ID, HF_TOKEN), Groq (DEV_GROQ_API_KEY) y Copernicus CDSE (DEV_COPERNICUS_CLIENT_ID/SECRET) con ejemplos realistas y seguros. - Añadir 5 nuevas pruebas unitarias en tests/unit/test_env_example.py validando las rutas de navegación exactas. Co-Authored-By: Antigravity <antigravity@google.com>894a316 -
Merge branch 'feat/f10-ui-credentials-byok': Fase 10 UI de credenciales guiada y auto-conexión BD BYOK
11783a3 -
Merge branch 'feat/f9-byok-dynamic-db': Fase 9 conexión BYOK dinámica a Supabase y auto-migración backend
3dc1966 -
docs(plan): marcar Fase 9 completada en plan maestro, tablero y suite unitaria
c599537 -
feat(ui): credenciales guiadas por credencial con DATABASE_URL y auto-conexión BYOK
Fase 10: CredentialsModal.astro y AjustesPerfil.astro incluyen el campo Supabase Database URI (DATABASE_URL — Direct / Transaction o Session Pooler) con ids #cred-db-url y #cfg-db-url, más bloques <details> clic por clic con ejemplos de formato para Supabase (Connect -> Connection String -> URI -> Session pooler 5432 / Transaction pooler 6543), Copernicus CDSE y Groq, alineados con .env.example de la Fase 8. En app.js: creds.dbUrl se envía como X-User-Database-Url en authHeaders(), updateStatus() consulta ./api/credentials/status con authHeaders(), y al guardar credenciales o ajustes la función compartida connectUserDatabase() invoca POST /api/credentials/connect-db notificando si se inicializó el esquema PostGIS o cuántas parcelas existentes se detectaron, recargando loadParcels() y el perfil; logout() limpia ambos campos. Se añade test dedicado en tests/e2e/test_ui_smoke.py que verifica campos, guías y flujo en el bundle compilado. Verificado: cd frontend && pnpm run check (0 errores…5a160ef -
f9: implementar conexion BYOK dinamica supabase y auto-migracion de esquema backend
- backend/db/session.py: cacheo por DSN de AsyncEngine y async_sessionmaker, ensure_schema_initialized(dsn) - backend/api/deps.py: soporte X-User-Database-Url en UserKeys.database_url, fallback a DATABASE_URL solo si no es placeholder, get_db usa DSN y lanza 503 si no hay - backend/api/credentials.py: POST /api/credentials/connect-db y GET /api/credentials/status actualizado para headers X-User-* - backend/services/parcels.py: pass keys.database_url a get_sessionmaker en run_indices_backfill - tests/unit/test_byok_db_session.py: pruebas unitarias de resolucion de DSN, cache de ensure_schema y endpoint connect-db - docs: marcar Fase 9 como completadac56e3e8 -
Merge branch 'feat/f8-env-example-guide': Fase 8 plantilla .env.example guiada paso a paso
d5ebfe6 -
feat(docs): rediseñar .env.example con guías paso a paso y ejemplos de formato
Documenta para cada variable de .env.example los pasos exactos de navegación en consola oficial (Supabase Connect/Poolers, Copernicus CDSE, Groq, HF), añade ejemplos realistas y seguros, sincroniza docs/ejecucion.md, añade 15 pruebas unitarias en tests/unit/test_env_example.py y actualiza el estado de la Fase 8 a completada en plan maestro y tareas. Co-Authored-By: Antigravity <antigravity@google.com>2ce5ba7 -
feat: F10 UI credentials guided BYOK connection flow
- Add DATABASE_URL field in CredentialsModal.astro (#cred-db-url) and AjustesPerfil.astro (#cfg-db-url) with step-by-step <details> blocks for Supabase (Connect→Connection String→Transaction/Session Pooler), Copernicus and Groq - Update authHeaders() in app.js to send X-User-Database-Url - Add POST /api/credentials/connect-db on save with schema init notification and loadParcels() reload - Update updateStatus() to include authHeaders() when calling ./api/credentials/status - Update tests/e2e/test_ui_smoke.py with #cred-db-url and #cfg-db-url checks - Clean build: pnpm run check && ./scripts/build.sh pass189ebbe -
feat(deploy): implementar script bash de despliegue a hugging face spaces
Añade scripts/deploy_hf.sh con permisos de ejecución (+x), validación de HF_TOKEN, normalización de HF_SPACE_ID, modo --dry-run, --force y limpieza garantizada de frontmatter temporal mediante trap EXIT. Actualiza .dockerignore y docs/ejecucion.md con la documentación para entornos POSIX, y añade suite exhaustiva de 14 pruebas unitarias en tests/unit/test_deploy_script.py. Co-Authored-By: Antigravity <antigravity@google.com>837415c
Yesterday
-
merge: fase 6 ui de seleccion y expansion de variables satelitales
959b61e -
merge: fase 5 api y backfill selectivo e incremental de indices
534bf3e -
test(e2e): validar controles de variables satelitales en el build
Se reemplaza el skip global por pruebas estáticas que verifican el HTML compilado de backend/static/index.html y se mantienen las pruebas Playwright pendientes con skip explícito. Se validan los controles de selección y expansión de variables satelitales y la suite queda lista para ejecutarse tras ./scripts/build.sh. Co-Authored-By: DeepSeek <noreply@deepseek.com>8b16cad -
test(api): cubrir alta selectiva y expansión incremental de índices
Se añade la suite unitaria y de simulación de usuario de la Fase 5: validación de FieldIn/FieldUpdate, backfill multivariable con eventos de telemetría, tolerancia a repositorios previos a Fase 4, y flujos HTTP de creación con subconjunto de índices, listado/detalle con calculated_indices, PATCH que solo agenda los índices nuevos y reproceso selectivo vía /api/vegetation/reprocess. Co-Authored-By: DeepSeek <noreply@deepseek.com>c20c3bd -
test(repo): cubre persistencia y consulta de índices por parcela
Añade diez pruebas unitarias con sesión mockeada: idempotencia y constraint de la migración 0002, alta con índices personalizados, default ndvi, lecturas con selected_indices, ampliación vía update_field_attributes, get_calculated_indices y el flujo completo de simulación de usuario con detección del índice pendiente. Co-Authored-By: DeepSeek <noreply@deepseek.com>fc472a7
9 days ago
-
merge: fase 2 esquema ddl y migraciones versionadas
e404865 -
feat(db): agregar migración inicial PostGIS idempotente
Se crea 0001_initial_schema.sql con PostGIS, las siete tablas del modelo (fields, vegetation_indices, weather_data, user_profiles, plant_counts, chat_messages y events), constraints, índices GIST/JSONB/FK y RLS condicional para Supabase y PostgreSQL local. El migrador normaliza DSN de SQLAlchemy, omite *.down.sql y falla si no hay migraciones. Se agregan tests unitarios y de integración; la migración se validó dos veces contra PostGIS 16 y el aislamiento RLS se comprobó con dos usuarios. Co-Authored-By: DeepSeek <noreply@deepseek.com>c521d70 -
test(profiles): aísla los tests de perfiles de DATABASE_URL
Se reemplazó el mock local por una fixture autouse que sobrescribe get_db con una sesión AsyncMock(spec=AsyncSession), de modo que los tests de validación de /api/profiles no intenten crear el motor de base de datos ni fallen con KeyError cuando DATABASE_URL no está definida. Co-Authored-By: DeepSeek <noreply@deepseek.com>6029391
-
feat(chat): añade contexto de chat por parcela y sincroniza tareas
Se integró el parámetro 'field_id' en la base de datos (chat_messages) y APIs para acotar el historial y las respuestas del asistente agéntico según la parcela activa. Además, se reestructuró 'docs/task/tareas.md' documentando las fases 13, 14 y 15 como finalizadas y se corrigieron advertencias de longitud de línea (Ruff) en todo el backend.3aee0ae -
feat(weather): migrar consulta de open-meteo de on-demand a persistencia horaria en base de datos
784f348
-
feat(db): elimina tabla ndvi_timeseries (legacy)
Migración 0006 DROP TABLE ndvi_timeseries y sus políticas RLS. Elimina la tabla del ALLOWED_TABLES en data.py, remueve funciones deprecated (upsert_ndvi_points, get_ndvi_series) de repositories.py, actualiza frontend ER diagram y tests de integración.29437e9 -
style(ndvi): migra ndvi_timeseries legacy a vegetation_indices
Elimina fallback de ndvi_timeseries en get_index_series(). Marca upsert_ndvi_points() y get_ndvi_series() como DEPRECATED. _describe_trend() usa mean_value en vez de mean_ndvi. Tests actualizados a upsert_index_points/get_index_series. data.py añade vegetation_indices a ALLOWED_TABLES. check constraint de 0004 incluye 'ndvi'. Nueva migración 0005 copia datos legacy.f841950 -
feat(weather): agrega humedad relativa y viento máximo a series climáticas
Amplía Open-Meteo con wind_speed_10m_max (daily) y relative_humidity_2m (hourly). aggregate_weather_monthly ahora acepta bloque horario y produce humidity_mean y wind_max. open_meteo() descarga ambos bloques. Tests actualizados.9fab384 -
feat(teledeteccion): añade índices espectrales EVI, SAVI, NDWI, NDRE (Fase 13)
Nuevos 4 índices sobre Sentinel-2: core/indices.py (funciones puras), remote_sensing.py (evalscripts genéricos + index_series_monthly/index_heatmap_png), api/vegetation.py (router parametrizado), migración 0004_indices.sql, repositorios upsert/get, selector UI con rangos dinámicos, y 14 tests unitarios.8f8389b -
style: aplica formato ruff a archivos del backend
Correcciones automáticas de ruff format en 7 archivos: data.py, deps.py, geometry.py, ndvi.py, agent.py, test_db.py, test_teledeteccion.py. Sin cambios de lógica.bbe2c25
-
feat(seguridad): rate limiting en /api + cabeceras de hardening (Fase 10)
7afd4d9 -
feat(telemetria): endpoint /api/events, ring buffer y tabla events (Fase 9)
cf2d03b
-
feat(agent): asistente RAG con function calling + memoria (Fase 5)
- backend/services/tools.py: 3 herramientas tipadas (tendencia NDVI, contexto climático, densidad [en desarrollo]) + TOOLS_SCHEMA + dispatch. - backend/services/agent.py: orquestación Groq/Llama 3 (OpenAI-compatible vía httpx), bucle de tool-calling y memoria en chat_messages. - backend/api/chat.py: POST /api/chat (no-streaming; SSE diferido). - repositories.get_field_by_name (con centroide para el clima). - Tests: unit (schema, _describe_trend) + integración en vivo (Groq llama la herramienta NDVI end-to-end). 58 passed, ruff limpio.9837673 -
feat(api): gateway + parcelas + teledetección NDVI/clima (Fase 3)
- backend/api/deps.py: proxy efímero BYOK (X-User-* con fallback DEV_*) + get_db. - backend/services/remote_sensing.py: NDVI vía Sentinel Hub en CDSE (Statistical API serie mensual 5 años + Process API heatmap PNG); OAuth client_credentials. - backend/services/weather.py: Open-Meteo (sin llave) + agregación mensual. - backend/services/parcels.py: CRUD + backfill NDVI de 5 años en background. - backend/api/{fields,ndvi,weather}.py: /api/fields (CRUD), /api/ndvi (+/raster), /api/weather. - main.py monta los routers nuevos; repositories.delete_field por id. - Tests: unitarios (parse stats, agregación clima, deps) + integración en vivo (NDVI real + cadena parcela->NDVI->persistencia). 52 passed, ruff limpio. - Desviación: se usa Sentinel Hub (CDSE) en vez de pystac-client+rioxarray.c9bb7d3 -
feat(db): persistencia Supabase BYOK - migraciones PostGIS/RLS + repos async (Fase 2)
- supabase/migrations/0001_init.sql (PostGIS+pgmq, 4 tablas, índices GIST/GIN) y 0002_rls.sql (RLS por usuario, efectiva con Supabase Auth). - backend/db: session.py (engine async, Session pooler), migrate.py (aplicador), repositories.py (CRUD parcelas, upsert/lectura NDVI idempotente, memoria chat; SQLAlchemy Core text() + PostGIS por robustez con asyncpg). - Deps: sqlalchemy, asyncpg, geoalchemy2, shapely, python-dateutil. - Tests integración contra Supabase real (tests/integration/test_db.py): 4 verdes. - BYOK monousuario: user_id sin FK a auth.users; conteo/PGMQ creados pero inactivos.8d80da2 -
feat(core): esquemas de dominio y motores puros NDVI/GSD/densidad (Fase 1)
- backend/core/schemas.py: FieldIn (valida polígono cerrado 4326), FieldOut, NDVIPoint, WeatherPoint, ChatMessage. - backend/core/ndvi.py: ndvi(), zonal_stats(), aggregate_monthly() (1 punto/mes). - backend/core/geometry.py: gsd_cm_per_px(), density_per_ha(), geodesic_area_m2(). - Tests unitarios (TDD): test_domain_schemas, test_ndvi, test_geometry (verde, ruff limpio).603f109 -
feat: ortomosaico de arándano simulado y mock por detección de blobs
Añade scripts/make_sample_orthomosaic.py que genera un ortomosaico de arándano de prueba (hileras de arbustos verdes con huecos de siembra y malezas amarillas, determinista por semilla). Mejora MockInferenceAdapter para detectar los arbustos por color (blobs HSV) cuando la imagen los contiene, de modo que las cajas caen sobre ellos y el conteo coincide con el real; en otras imágenes mantiene el fallback aleatorio. Incluye pruebas del generador y de la coherencia con el mock. Verificado en vivo: sobre la imagen generada (112 arbustos, 5 malezas) el conteo es exacto. La imagen PNG no se versiona (se regenera).1cec427 -
feat: modo mock para validar el flujo de conteo sin modelo real
Añade MockInferenceAdapter y la fábrica create_adapter seleccionable con MODEL_BACKEND=mock|onnx. Con COUNTING_ENABLED=true y MODEL_BACKEND=mock, /api/count devuelve detecciones falsas plausibles (deterministas por imagen) para validar el flujo completo (carga → conteo → métricas → overlay → UI) sin el modelo real; la UI muestra el aviso '(datos de prueba / mock)'. Incluye pruebas unitarias e integración del modo mock y documenta MODEL_BACKEND en .env.example.c136a98 -
test: pruebas unitarias e integración del MVP
Añade pruebas de configuración, esquemas y métricas (unitarias) y de la API con TestClient (status y conteo en standby devuelve 503), más un esqueleto E2E con Playwright omitido por defecto.15d6ad0