Spaces:
Runtime error
Runtime error
Commit History
-
chore: excluir imágenes PNG del repo (HF Spaces no soporta binarios)
Las capturas de pantalla se mantienen localmente en docs/assets/ pero no se suben al repo de HF Spaces. El README en HF mostrará enlaces rotos a las imágenes, pero la app funciona correctamente.7b1ce70 -
chore: configurar Git LFS para imágenes en docs/assets
HF Spaces rechaza archivos binarios en git. Se usa Git LFS para almacenar las capturas de pantalla del README.a917b63 -
docs(readme): añade link a demo en Hugging Face Spaces
Se añade el enlace a la demo en vivo: alexp97-agrovision.hf.space365d8ef -
docs(readme): añade capturas de pantalla y estado del proyecto
README.md actualizado con: descripción corta, tabla de módulos con estado (✅ implementado / en desarrollo), sección de estado actual detallando funcionalidades completas y pendientes (variables climáticas adicionales, índices satelitales EVI/SAVI/NDWI/LST, alertas, exportación). Se añaden 6 capturas en docs/assets/ y excepción en .gitignore para permitir PNGs en esa carpeta.96cec18
-
feat(fase-11-12): explorador de datos y visor de telemetría en UI
Fase 11: Pestaña Explorador de Datos con GET /api/data/{table} y POST /api/data/query (solo SELECT, máx 1000 filas). Fase 12: Endpoint GET /api/events/all para eventos persistidos, modal de telemetría con fallback a buffer en memoria, y status dinámico (verde/ámbar/rojo) según credenciales disponibles vía /api/credentials/status.50b8a66 -
feat(docker): configura env_file y APP_ENV para desarrollo local
docker-compose.yml ahora lee variables del .env del host (DATABASE_URL, DEV_*, SUPABASE_*) y establece APP_ENV=development para permitir fallback a claves DEV_*. Se añaden .ignore y docs/logs/ al .gitignore.eaee91f -
fix(docker): añade libgl1 para resolver error de OpenCV
Se añade libgl1 al Dockerfile para resolver el error 'libGL.so.1: cannot open shared object file' que ocurría al importar cv2 (opencv-python-headless) en el contenedor Debian.2a4927d -
feat: add data explorer tab, enforce BYOK in production, detect env
df71cfc -
fix: add libxcb1 for opencv-python-headless in Docker
07227e5 -
build: consolida y optimiza Dockerfile (1 solo, no-root, libs mínimas, sin cache de wheels) + compose/render
13f1a88 -
build: añade .dockerignore (build context mínimo para HF Spaces/Render, reemplaza .rscignore)
8b7380d -
docs: actualiza arquitectura/README/definición/ejecución a Astro+HF Spaces sin Shiny + §8 seguridad
7c1b14d -
feat(seguridad): rate limiting en /api + cabeceras de hardening (Fase 10)
7afd4d9 -
refactor: elimina Shiny (dashboard, run_ui, deps) y el deploy a shinyapps (Fase 10)
22026b0 -
docs(ejecucion): reescribe §5 para Hugging Face Spaces; reencuadra shinyapps/Posit Connect
93cfa27 -
feat(deploy): despliegue a Hugging Face Spaces (Dockerfile raíz + deploy_hf.ps1 + frontmatter)
32765f0 -
feat(deploy): deploy_prod lee SHINYAPPS_* del .env, soporta -New y fija --title
4eccaa5 -
fix(deploy): usa 'rsconnect deploy fastapi' (no 'deploy shiny') para el gateway FastAPI
26f1bf8 -
docs(ejecucion): refleja que el despliegue ya esta automatizado (build/deploy_prod)
7ffd03d -
docs: documenta telemetria (tabla events, EVENTS_PERSIST, endpoints)
ce1c422 -
feat(ui): instrumenta telemetria en la UI con track() y handler de errores (Fase 9)
a1bd836 -
feat(telemetria): endpoint /api/events, ring buffer y tabla events (Fase 9)
cf2d03b -
docs(ejecucion): referencia detallada de los scripts de scripts/
fba6f53 -
feat(ui): click en parcela vuela a su polígono + dibuja parcelas en el mapa
- /api/fields incluye geojson (ST_AsGeoJSON) por parcela. - Mapa de Creación de Parcelas dibuja los polígonos guardados (capa verde) y hace fitBounds al cargar; click en un item de la lista -> flyToBounds del polígono. - Verificado con Playwright (click en 'Lote NDVI' vuela a su polígono; 0 errores).d17e4f4 -
docs: elimina docs _mvp y _modelo_conteo_plantas (a pedido) + corrige enlaces
- Borra architecture_agrovision_mvp.md, architecture_modelo_conteo_plantas.md, description_proyecto_agrovision_mvp.md, description_proyecto_modelo_conteo_plantas.md. - Relativiza/quita los enlaces a esos archivos en README, description/architecture/db/ejecucion (el modelo de conteo vive en un repo separado).2cce711 -
build(deploy): pipeline Astro (build+inline) + deploy_prod rsconnect + .rscignore
- scripts/build.ps1: compila Astro -> scripts/inline_js.py (inline JS + rutas relativas, Regla de Oro) -> copia a backend/static. Reemplaza build_ui.ps1. - scripts/inline_js.py: post-proceso del build para sub-paths de ShinyApps. - scripts/deploy_prod.ps1: build + uv export requirements.txt + traduce .rscignore a --exclude + rsconnect deploy shiny . --entrypoint backend.main:app (-Name/-AppId parametrizables; app-id pendiente). - .rscignore: exclusiones del bundle; **excluye .env** (BYOK, sin secretos en prod). - dev.ps1: gateway (:8000) + Astro dev (:4321 hot-reload) en ventanas separadas. - pyproject: rsconnect-python (dev). .gitignore: requirements.txt (generado). - ejecucion.md §5: despliegue Agro-Stack documentado. - Verificado: build.ps1 e inline_js.py corren OK; rsconnect importable.f514b00 -
docs(ejecucion): UI = Astro servida por el gateway (limpia refs legacy a Shiny; build_ui)
79bbf00 -
fix(ui): sidebar responsive robusto + mapa (satélite/relieve) + parcela demo + botón .env
- Sidebar: estado por CSS propio (is-open móvil / is-collapsed desktop) porque Tailwind v4 usa la propiedad 'translate' y el transform inline no la cancelaba; plegar/reabrir en desktop, drawer + backdrop en móvil (backdrop md:hidden para no interceptar en desktop). - Mapa de parcelas: capas Satélite (Esri) / Normal (OSM) / Relieve (OpenTopoMap), centrado en Lomas de Lachay; botón 'Cargar parcela demo (Lomas de Lachay)'. - Credenciales: botón 'Revisar .env del servidor' + endpoint GET /api/credentials/status (solo presencia, sin valores) para usar las llaves del .env sin reescribirlas. - Verificado con Playwright (desktop plegado, móvil drawer, satélite, .env detectado).ef1afea -
feat(ui): UI Astro completa servida por el gateway (Fase 8 — vistas, responsive, plegable)
- index.astro: SPA hash-routing con los 6 módulos (look del mockup), responsive + sidebar/footer plegables; Leaflet+Leaflet-draw (parcelas), Chart.js (NDVI/clima), heatmap, chat, credenciales efímeras (X-User-* en memoria), API por fetch relativo. - main.py: monta StaticFiles(html=True) en / (tras /api y /shiny) -> sirve la UI Astro. - scripts/build_ui.ps1: pnpm build -> backend/static. backend/Dockerfile: etapa Node compila Astro y la copia. docker-compose: sin servicio ui; frontend/Dockerfile eliminado. - ejecucion.md: flujo de UI Astro (gateway en / · dev :4321 · Shiny legacy :8001). - Verificado en vivo con Playwright (capturas en .playwright-mcp/).26161c7
-
feat(ui): Shiny -> backend/dashboard.py (legacy) + scaffold Astro+Tailwind (Fase 8, SF8.1)
- Reubica la UI Shiny a backend/dashboard.py (montable en /shiny, legacy); frontend/ queda para Astro. Ajusta run_ui.ps1 y README al nuevo path. - Scaffold Astro 5 + Tailwind v4 (plugin @tailwindcss/vite, NO @astrojs/tailwind): package.json, astro.config.mjs (output static + inlineStylesheets 'always' = Regla de Oro + proxy /api y /shiny en dev), tsconfig, src/pages/index.astro, src/styles/global.css. - pnpm-workspace.yaml (allowBuilds) para que pnpm 11 corra esbuild/sharp; build verificado.68ec720 -
docs(fase8): plan/arquitectura/README para migración de UI a Astro (Agro-Stack)
- Plan y tareas: nueva Fase 8 (Astro+Tailwind SPA consumiendo /api; Leaflet-draw, Chart.js; responsive + sidebar/footer plegables; Regla de Oro de plan_replication). - Arquitectura: nota de frontend Astro + ADR (revisa 'Shiny sobre Astro'; Shiny -> legacy). - README: reescrito a plataforma (6 módulos, FastAPI + Supabase BYOK, UI migrando a Astro).8f7750d -
docs(ejecucion): troubleshooting WinError 10013 + receta para liberar puerto ocupado (§6.1)
92cbcc6 -
docs(ejecucion): comandos de arranque manual en una sola línea (copy-paste sin backticks)
2e2529a -
docs(ejecucion)+scripts: arranque manual con -u/PYTHONUNBUFFERED, --log-level y --reload-exclude por capa
- Option B del runbook y los launchers usan python -u + PYTHONUNBUFFERED=1 (logs en vivo), --log-level info y --reload-exclude para no reiniciar por dirs no-fuente. - Cada servicio excluye la capa del otro (backend ignora frontend/ y viceversa) + docs/tests/etc. - Verificado: el backend arranca con el comando completo (HTTP 200).e19dd51 -
docs(ejecucion): runbook de la plataforma (6 módulos, BYOK, migraciones, sanity 6 pestañas)
42098b2 -
feat(ui): plataforma Shiny de 6 módulos + soporte backend para la UI (Fase 6)
- frontend/app.py: 6 nav_panel (Resumen, Creación de Parcelas con ipyleaflet+DrawControl, Teledetección con Plotly NDVI 5 años/clima + heatmap, Conteo EN DESARROLLO, Asistente RAG, Credenciales efímeras). Consume el gateway con cabeceras X-User-* efímeras. - backend: repositories.get_field(+centroide)/get_field_geojson; /api/fields devuelve lon/lat; /api/ndvi/raster acepta field_id. - Deps UI: shinywidgets, ipyleaflet, plotly. - Verificado: backend y UI levantan en local (HTTP 200); ruff limpio; suite sin regresión.820f460 -
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 -
chore: organiza .env.example por secciones (LLM/RAG y APIs satelitales)
bece102 -
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 -
docs(arquitectura,db): plataforma de 6 módulos, monolito modular y NDVI 5 años
- Arquitectura: 6 módulos (nuevo Creación de Parcelas; Conteo en desarrollo), monolito modular api/+services/ microservices-ready, flujo parcelas->teledetección, NDVI 5 años + agregación mensual + backfill, heatmap /api/ndvi/raster, ADRs nuevos. - BD: backfill mensual idempotente, plant_counts y PGMQ creadas pero inactivas, clima on-demand, matriz de accesos con ParcelsService.99a7270 -
docs: guía de ejecución (runbook) del MVP
Añade docs/ejecucion.md siguiendo plantilla_ejecucion.md: requisitos, instalación con uv (con el workaround de OneDrive), ejecución local (script dev.ps1 y manual con python -m uvicorn), puertos, sanity check, modo mock opcional para demostrar el conteo, build/Docker opcional, despliegue futuro (ShinyApps.io/Render), troubleshooting y tests. El conteo se documenta como EN DESARROLLO (standby).3591232 -
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 -
chore: amplía .env.example con variables de despliegue y conexión
Documenta todas las variables para despliegues y conexiones futuras (ShinyApps.io, Render, Supabase BD/Storage/Colas, Hugging Face Hub) y las APIs BYOK, organizadas por sección y solo con placeholders vacíos (sin secretos). El .env real (local, con valores) queda fuera de git.bc68a96 -
chore(infra): contenedores, despliegue y scripts de arranque local
Añade Dockerfiles de backend y UI, docker-compose, render.yaml para el despliegue gratuito y los scripts PowerShell de arranque local sin Docker (run_backend, run_ui, dev) que usan 'python -m uvicorn' para evitar los shims .exe bloqueados por OneDrive. Incluye placeholders de models/ y sample_data/.c0f31a8 -
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 -
feat(frontend): UI Shiny con conteo en standby y credenciales efímeras
Implementa la interfaz Shiny for Python con dos pestañas: Conteo (aviso de standby y consumo del backend al activarse) y Credenciales (estado efímero en memoria de sesión, nunca persistido). Carga configuración desde .env.c84a1b5 -
feat(backend): API FastAPI de conteo con modo standby
Implementa el backend del MVP: configuración por entorno, esquemas Pydantic, dominio de detección, métricas, adaptador de inferencia agnóstico (YOLO26/RF-DETR vía ONNX) y endpoints /api/status y /api/count. El conteo arranca en standby (COUNTING_ENABLED=false) y responde 503 hasta publicar el modelo.53371fd