@saulwade/swl-ses 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +238 -0
- package/README.md +560 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/.evolved.json +9 -0
- package/agentes/accesibilidad-wcag-swl.md +692 -0
- package/agentes/arquitecto-swl.md +238 -0
- package/agentes/auto-evolucion-swl.md +854 -0
- package/agentes/backend-api-swl.md +470 -0
- package/agentes/backend-csharp-swl.md +418 -0
- package/agentes/backend-go-swl.md +388 -0
- package/agentes/backend-java-swl.md +279 -0
- package/agentes/backend-node-swl.md +477 -0
- package/agentes/backend-python-swl.md +608 -0
- package/agentes/backend-rust-swl.md +362 -0
- package/agentes/backend-workers-swl.md +480 -0
- package/agentes/cloud-infra-swl.md +485 -0
- package/agentes/consolidador-swl.md +539 -0
- package/agentes/datos-swl.md +584 -0
- package/agentes/depurador-swl.md +349 -0
- package/agentes/devops-ci-swl.md +374 -0
- package/agentes/disenador-ui-swl.md +558 -0
- package/agentes/documentador-swl.md +343 -0
- package/agentes/evals/arquitecto-swl.evals.json +56 -0
- package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
- package/agentes/evals/implementador-swl.evals.json +56 -0
- package/agentes/evals/orquestador-swl.evals.json +60 -0
- package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
- package/agentes/evals/red-team-swl.evals.json +59 -0
- package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
- package/agentes/frontend-angular-swl.md +627 -0
- package/agentes/frontend-css-swl.md +720 -0
- package/agentes/frontend-react-swl.md +696 -0
- package/agentes/frontend-swl.md +500 -0
- package/agentes/frontend-tailwind-swl.md +830 -0
- package/agentes/implementador-swl.md +328 -0
- package/agentes/investigador-swl.md +430 -0
- package/agentes/investigador-ux-swl.md +500 -0
- package/agentes/llm-apps-swl.md +276 -0
- package/agentes/migrador-swl.md +417 -0
- package/agentes/mobile-android-swl.md +509 -0
- package/agentes/mobile-cross-swl.md +539 -0
- package/agentes/mobile-ios-swl.md +500 -0
- package/agentes/mobile-testing-swl.md +300 -0
- package/agentes/notificador-swl.md +916 -0
- package/agentes/observabilidad-swl.md +436 -0
- package/agentes/orquestador-swl.md +884 -0
- package/agentes/pagos-swl.md +283 -0
- package/agentes/perfilador-usuario-swl.md +306 -0
- package/agentes/planificador-swl.md +402 -0
- package/agentes/producto-prd-swl.md +587 -0
- package/agentes/red-team-swl.md +216 -0
- package/agentes/release-manager-swl.md +568 -0
- package/agentes/rendimiento-swl.md +714 -0
- package/agentes/resolutor-build-swl.md +243 -0
- package/agentes/revisor-angular-swl.md +276 -0
- package/agentes/revisor-codigo-swl.md +348 -0
- package/agentes/revisor-csharp-swl.md +262 -0
- package/agentes/revisor-go-swl.md +257 -0
- package/agentes/revisor-java-swl.md +255 -0
- package/agentes/revisor-kotlin-swl.md +271 -0
- package/agentes/revisor-nextjs-swl.md +279 -0
- package/agentes/revisor-php-swl.md +269 -0
- package/agentes/revisor-react-swl.md +276 -0
- package/agentes/revisor-rust-swl.md +344 -0
- package/agentes/revisor-seguridad-swl.md +390 -0
- package/agentes/revisor-swift-swl.md +266 -0
- package/agentes/revisor-typescript-swl.md +344 -0
- package/agentes/sre-swl.md +265 -0
- package/agentes/tdd-qa-swl.md +354 -0
- package/agentes/ux-disenador-swl.md +501 -0
- package/bin/lib/bot-comandos.js +1030 -0
- package/bin/lib/bot-discovery.js +182 -0
- package/bin/lib/bot-git.js +142 -0
- package/bin/swl-ses.js +325 -0
- package/bin/swl-telegram-bot.js +442 -0
- package/bin/swl-telegram-bot.plist +21 -0
- package/bin/swl-telegram-bot.service +14 -0
- package/comandos/swl/.evolved.json +23 -0
- package/comandos/swl/actualizar.md +174 -0
- package/comandos/swl/adoptar-proyecto.md +207 -0
- package/comandos/swl/aprender.md +701 -0
- package/comandos/swl/auditar-deps.md +134 -0
- package/comandos/swl/autoresearch.md +170 -0
- package/comandos/swl/ayuda.md +224 -0
- package/comandos/swl/brainstorm.md +50 -0
- package/comandos/swl/checkpoint.md +330 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/configurar-ci.md +227 -0
- package/comandos/swl/contexto.md +112 -0
- package/comandos/swl/contribuir.md +233 -0
- package/comandos/swl/crear-skill.md +292 -0
- package/comandos/swl/cron.md +196 -0
- package/comandos/swl/dashboard.md +146 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +135 -0
- package/comandos/swl/evaluar-skill.md +487 -0
- package/comandos/swl/evolucion-estado.md +142 -0
- package/comandos/swl/evolucionar.md +259 -0
- package/comandos/swl/exportar-vault.md +189 -0
- package/comandos/swl/gateway.md +158 -0
- package/comandos/swl/inbox.md +116 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/instintos.md +86 -0
- package/comandos/swl/mapear-codebase.md +312 -0
- package/comandos/swl/mcp-status.md +175 -0
- package/comandos/swl/metricas.md +270 -0
- package/comandos/swl/modelo.md +102 -0
- package/comandos/swl/notificaciones.md +396 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/plugins.md +256 -0
- package/comandos/swl/reflect-skills.md +125 -0
- package/comandos/swl/release.md +217 -0
- package/comandos/swl/revisar-impacto.md +206 -0
- package/comandos/swl/revisar.md +330 -0
- package/comandos/swl/salud.md +363 -0
- package/comandos/swl/sesiones.md +200 -0
- package/comandos/swl/skill-search.md +113 -0
- package/comandos/swl/verificar.md +585 -0
- package/comandos/swl/wiki.md +620 -0
- package/contextos/dev.md +32 -0
- package/contextos/research.md +30 -0
- package/contextos/review.md +31 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
- package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
- package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
- package/habilidades/agent-browser/SKILL.md +218 -0
- package/habilidades/agentes-como-servicio/SKILL.md +218 -0
- package/habilidades/ai-runtime-security/SKILL.md +273 -0
- package/habilidades/angular-avanzado/SKILL.md +164 -0
- package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
- package/habilidades/angular-moderno/SKILL.md +186 -0
- package/habilidades/angular-moderno/evals/evals.json +45 -0
- package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
- package/habilidades/api-rest-diseno/SKILL.md +191 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
- package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
- package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
- package/habilidades/async-python/SKILL.md +149 -0
- package/habilidades/async-python/evals/evals.json +47 -0
- package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
- package/habilidades/auth-patrones/.evolved.json +9 -0
- package/habilidades/auth-patrones/SKILL.md +413 -0
- package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
- package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
- package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
- package/habilidades/autoresearch/SKILL.md +268 -0
- package/habilidades/autoresearch/evals/evals.json +41 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/azure-cloud/SKILL.md +308 -0
- package/habilidades/azure-cloud/recursos/aks.md +327 -0
- package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -0
- package/habilidades/brainstorming/SKILL.md +295 -0
- package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
- package/habilidades/build-errors-cpp/SKILL.md +270 -0
- package/habilidades/build-errors-csharp/SKILL.md +265 -0
- package/habilidades/build-errors-go/SKILL.md +306 -0
- package/habilidades/build-errors-java/SKILL.md +278 -0
- package/habilidades/build-errors-kotlin/SKILL.md +303 -0
- package/habilidades/build-errors-nextjs/SKILL.md +312 -0
- package/habilidades/build-errors-php/SKILL.md +270 -0
- package/habilidades/build-errors-python/SKILL.md +292 -0
- package/habilidades/build-errors-rust/SKILL.md +284 -0
- package/habilidades/build-errors-swift/SKILL.md +272 -0
- package/habilidades/build-errors-typescript/SKILL.md +369 -0
- package/habilidades/checklist-calidad/SKILL.md +271 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +285 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
- package/habilidades/cloud-aws/SKILL.md +142 -0
- package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
- package/habilidades/compactacion-contexto/SKILL.md +247 -0
- package/habilidades/contenedores-docker/SKILL.md +137 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
- package/habilidades/context-builder/SKILL.md +170 -0
- package/habilidades/control-profundidad/SKILL.md +128 -0
- package/habilidades/csharp-experto/SKILL.md +322 -0
- package/habilidades/csharp-patrones/SKILL.md +316 -0
- package/habilidades/csharp-testing/SKILL.md +286 -0
- package/habilidades/css-moderno/SKILL.md +166 -0
- package/habilidades/css-moderno/evals/evals.json +43 -0
- package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
- package/habilidades/datos-etl/SKILL.md +129 -0
- package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
- package/habilidades/dbml-experto/SKILL.md +339 -0
- package/habilidades/dbml-experto/evals/evals.json +56 -0
- package/habilidades/dependencias-auditoria/SKILL.md +320 -0
- package/habilidades/deprecacion-migracion/SKILL.md +169 -0
- package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
- package/habilidades/design-tokens/SKILL.md +158 -0
- package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
- package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
- package/habilidades/discutir-fase/SKILL.md +188 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
- package/habilidades/diseno-responsivo/SKILL.md +186 -0
- package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
- package/habilidades/django-experto/SKILL.md +205 -0
- package/habilidades/django-experto/recursos/async-django.md +390 -0
- package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
- package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
- package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
- package/habilidades/django-experto/recursos/testing-django.md +415 -0
- package/habilidades/doc-sync/SKILL.md +280 -0
- package/habilidades/drift-detection/SKILL.md +179 -0
- package/habilidades/ejecutar-fase/SKILL.md +468 -0
- package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
- package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
- package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/evaluacion-agentes/SKILL.md +314 -0
- package/habilidades/event-driven/SKILL.md +153 -0
- package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
- package/habilidades/extraccion-documentos/SKILL.md +221 -0
- package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
- package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
- package/habilidades/fastapi-experto/SKILL.md +221 -0
- package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
- package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
- package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
- package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
- package/habilidades/filament-admin/SKILL.md +290 -0
- package/habilidades/frontend-avanzado/SKILL.md +257 -0
- package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
- package/habilidades/gcp-cloud/SKILL.md +260 -0
- package/habilidades/gcp-cloud/recursos/gke.md +234 -0
- package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
- package/habilidades/generacion-mermaid/SKILL.md +229 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
- package/habilidades/go-experto/SKILL.md +305 -0
- package/habilidades/go-patrones/SKILL.md +299 -0
- package/habilidades/go-testing/SKILL.md +291 -0
- package/habilidades/graphql-experto/SKILL.md +323 -0
- package/habilidades/guardrail-semantico/SKILL.md +282 -0
- package/habilidades/harness-claude-code/SKILL.md +299 -0
- package/habilidades/iam-secretos/SKILL.md +265 -0
- package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
- package/habilidades/infra-github-actions/SKILL.md +166 -0
- package/habilidades/instalar-sistema/.evolved.json +9 -0
- package/habilidades/instalar-sistema/SKILL.md +221 -0
- package/habilidades/java-experto/SKILL.md +290 -0
- package/habilidades/java-patrones/SKILL.md +275 -0
- package/habilidades/java-testing/SKILL.md +288 -0
- package/habilidades/kotlin-compose/SKILL.md +278 -0
- package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
- package/habilidades/kotlin-experto/SKILL.md +318 -0
- package/habilidades/kotlin-testing/SKILL.md +267 -0
- package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
- package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
- package/habilidades/langchain-langraph/SKILL.md +386 -0
- package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
- package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
- package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
- package/habilidades/legacy-code-rescue/SKILL.md +267 -0
- package/habilidades/likec4-experto/SKILL.md +412 -0
- package/habilidades/likec4-experto/evals/evals.json +69 -0
- package/habilidades/manejo-errores/.evolved.json +9 -0
- package/habilidades/manejo-errores/SKILL.md +407 -0
- package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
- package/habilidades/mapear-codebase/SKILL.md +275 -0
- package/habilidades/memoria-busqueda/SKILL.md +194 -0
- package/habilidades/memoria-busqueda/evals/evals.json +44 -0
- package/habilidades/meta-skills-estandar/SKILL.md +298 -0
- package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
- package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
- package/habilidades/microservicios/SKILL.md +155 -0
- package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
- package/habilidades/mobile-flutter/SKILL.md +199 -0
- package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
- package/habilidades/mobile-react-native/SKILL.md +176 -0
- package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
- package/habilidades/mongodb-experto/SKILL.md +302 -0
- package/habilidades/monitoring-alertas/SKILL.md +201 -0
- package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
- package/habilidades/nestjs-experto/SKILL.md +307 -0
- package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
- package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
- package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
- package/habilidades/nextjs-experto/SKILL.md +335 -0
- package/habilidades/nextjs-patrones/SKILL.md +303 -0
- package/habilidades/nextjs-testing/SKILL.md +331 -0
- package/habilidades/node-experto/.evolved.json +9 -0
- package/habilidades/node-experto/SKILL.md +266 -0
- package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
- package/habilidades/nuevo-proyecto/SKILL.md +204 -0
- package/habilidades/orquestacion-async/SKILL.md +303 -0
- package/habilidades/paid-media-tracking/SKILL.md +269 -0
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
- package/habilidades/patrones-python/SKILL.md +228 -0
- package/habilidades/patrones-python/evals/evals.json +56 -0
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
- package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
- package/habilidades/perfil-usuario/SKILL.md +200 -0
- package/habilidades/perfil-usuario/evals/evals.json +55 -0
- package/habilidades/performance-baseline/SKILL.md +297 -0
- package/habilidades/php-experto/SKILL.md +291 -0
- package/habilidades/php-patrones/SKILL.md +306 -0
- package/habilidades/php-testing/SKILL.md +280 -0
- package/habilidades/planear-fase/SKILL.md +269 -0
- package/habilidades/postgresql-experto/SKILL.md +151 -0
- package/habilidades/postgresql-experto/evals/evals.json +53 -0
- package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
- package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
- package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
- package/habilidades/privacy-memoria/SKILL.md +141 -0
- package/habilidades/privacy-memoria/evals/evals.json +43 -0
- package/habilidades/prompt-engineering/SKILL.md +518 -0
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
- package/habilidades/rag-arquitectura/SKILL.md +338 -0
- package/habilidades/rails-experto/SKILL.md +237 -0
- package/habilidades/rails-experto/recursos/active-record.md +260 -0
- package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
- package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
- package/habilidades/react-experto/SKILL.md +209 -0
- package/habilidades/react-experto/evals/evals.json +55 -0
- package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
- package/habilidades/react-optimizacion/SKILL.md +174 -0
- package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
- package/habilidades/redis-experto/SKILL.md +305 -0
- package/habilidades/release-semver/.evolved.json +9 -0
- package/habilidades/release-semver/SKILL.md +248 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/rust-experto/SKILL.md +400 -0
- package/habilidades/rust-patrones/SKILL.md +296 -0
- package/habilidades/rust-testing/SKILL.md +311 -0
- package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
- package/habilidades/sql-optimizacion/SKILL.md +200 -0
- package/habilidades/sql-optimizacion/evals/evals.json +54 -0
- package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
- package/habilidades/sre-patrones/SKILL.md +333 -0
- package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
- package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
- package/habilidades/stripe-pagos/SKILL.md +550 -0
- package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
- package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
- package/habilidades/structured-outputs/SKILL.md +343 -0
- package/habilidades/swift-experto/SKILL.md +320 -0
- package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
- package/habilidades/swift-patrones/SKILL.md +313 -0
- package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
- package/habilidades/swift-testing/SKILL.md +254 -0
- package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
- package/habilidades/swl-dashboard/SKILL.md +370 -0
- package/habilidades/swl-markitdown/SKILL.md +285 -0
- package/habilidades/swl-markitdown/evals/evals.json +52 -0
- package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
- package/habilidades/tailwind-experto/SKILL.md +240 -0
- package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
- package/habilidades/tdd-workflow/SKILL.md +293 -0
- package/habilidades/terraform-experto/SKILL.md +321 -0
- package/habilidades/testing-python/SKILL.md +340 -0
- package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
- package/habilidades/threat-model-lite/SKILL.md +246 -0
- package/habilidades/tracing-processor/SKILL.md +212 -0
- package/habilidades/tracking-measurement/SKILL.md +239 -0
- package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
- package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
- package/habilidades/typescript-avanzado/SKILL.md +144 -0
- package/habilidades/typescript-avanzado/evals/evals.json +55 -0
- package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
- package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
- package/habilidades/ux-diseno/SKILL.md +116 -0
- package/habilidades/ux-diseno/evals/evals.json +43 -0
- package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificacion-evidencia/SKILL.md +160 -0
- package/habilidades/verificar-trabajo/SKILL.md +303 -0
- package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
- package/habilidades/wiki-conocimiento/SKILL.md +276 -0
- package/habilidades/wireframes-flujos/SKILL.md +212 -0
- package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
- package/habilidades/workflow-claude-code/SKILL.md +260 -0
- package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
- package/hooks/_run-hook.sh +57 -0
- package/hooks/actualizar-perfil-usuario.js +364 -0
- package/hooks/agente-lifecycle.js +71 -0
- package/hooks/aiisms-detector.js +173 -0
- package/hooks/audit-trail.js +204 -0
- package/hooks/auto-background.js +97 -0
- package/hooks/auto-consolidacion.js +178 -0
- package/hooks/auto-evolucion.js +666 -0
- package/hooks/auto-restaurar-settings.js +360 -0
- package/hooks/calidad-pre-commit.js +929 -0
- package/hooks/calidad-typescript.js +511 -0
- package/hooks/captura-feedback-usuario.js +148 -0
- package/hooks/check-update.js +211 -0
- package/hooks/clasificador-mensajes.js +271 -0
- package/hooks/degradacion-instintos.js +272 -0
- package/hooks/escaneo-secretos.js +389 -0
- package/hooks/extraccion-aprendizajes.js +763 -0
- package/hooks/grafo-contexto.js +129 -0
- package/hooks/graph-update.js +67 -0
- package/hooks/guardrail-modelo.js +247 -0
- package/hooks/inbox-aviso.js +75 -0
- package/hooks/inyeccion-contexto.js +246 -0
- package/hooks/lib/abort-registry.js +214 -0
- package/hooks/lib/agent-backend.js +210 -0
- package/hooks/lib/agent-comms.js +263 -0
- package/hooks/lib/agent-issue-codes.js +284 -0
- package/hooks/lib/agent-matcher.js +189 -0
- package/hooks/lib/async-hook-registry.js +252 -0
- package/hooks/lib/atomic-write.js +130 -0
- package/hooks/lib/auto-consolidator.js +335 -0
- package/hooks/lib/canary-skills.js +187 -0
- package/hooks/lib/consolidation-lock.js +291 -0
- package/hooks/lib/context-builder.js +430 -0
- package/hooks/lib/context-compressor.js +657 -0
- package/hooks/lib/convergence-detector.js +105 -0
- package/hooks/lib/delegation-tracker.js +198 -0
- package/hooks/lib/detectar-package-manager.js +423 -0
- package/hooks/lib/edit-accumulator.js +171 -0
- package/hooks/lib/error-classifier.js +308 -0
- package/hooks/lib/event-bus.js +112 -0
- package/hooks/lib/evolution-tracker.js +442 -0
- package/hooks/lib/execution-state.js +316 -0
- package/hooks/lib/fingerprint-id.js +135 -0
- package/hooks/lib/gateway-notify.js +116 -0
- package/hooks/lib/graph-security.js +75 -0
- package/hooks/lib/guardrail-metrics.js +202 -0
- package/hooks/lib/hook-circuit-breaker.js +206 -0
- package/hooks/lib/loop-detector.js +267 -0
- package/hooks/lib/mcp-health.js +184 -0
- package/hooks/lib/mcp-pool.js +436 -0
- package/hooks/lib/memory-search.js +506 -0
- package/hooks/lib/merkle-audit.js +96 -0
- package/hooks/lib/model-router.js +222 -0
- package/hooks/lib/normalize-error.js +324 -0
- package/hooks/lib/normalize-input.js +65 -0
- package/hooks/lib/nudge-tracker.js +306 -0
- package/hooks/lib/otlp-exporter.js +365 -0
- package/hooks/lib/performance-marks.js +239 -0
- package/hooks/lib/privacy-filter.js +128 -0
- package/hooks/lib/prompt-injection-scanner.js +209 -0
- package/hooks/lib/provenance-tracker.js +183 -0
- package/hooks/lib/rate-limit-tracker.js +253 -0
- package/hooks/lib/reflect-classifier.js +164 -0
- package/hooks/lib/resource-quota.js +122 -0
- package/hooks/lib/retry-jitter.js +165 -0
- package/hooks/lib/risk-engine.js +368 -0
- package/hooks/lib/run-log.js +408 -0
- package/hooks/lib/session-fts.js +379 -0
- package/hooks/lib/session-store.js +293 -0
- package/hooks/lib/singleton-guard.js +159 -0
- package/hooks/lib/skill-auditor.js +588 -0
- package/hooks/lib/sync-status.js +228 -0
- package/hooks/lib/taint-tracker.js +107 -0
- package/hooks/lib/task-service.js +295 -0
- package/hooks/lib/tech-skills-map.js +146 -0
- package/hooks/lib/telegram-cliente.js +159 -0
- package/hooks/lib/telegram-config.js +170 -0
- package/hooks/lib/token-budget.js +156 -0
- package/hooks/lib/token-estimator.js +420 -0
- package/hooks/lib/toon-compressor.js +245 -0
- package/hooks/lib/usage-model.js +183 -0
- package/hooks/lib/variable-resolver.js +230 -0
- package/hooks/linea-estado.js +324 -0
- package/hooks/metricas-evolucion.js +209 -0
- package/hooks/monitor-contexto.js +325 -0
- package/hooks/notificacion-sesion-stop.js +198 -0
- package/hooks/notificacion-telegram-notification.js +4 -0
- package/hooks/notificacion-telegram-subagent.js +4 -0
- package/hooks/notificacion-telegram.js +267 -0
- package/hooks/preservar-estado-pre-compact.js +150 -0
- package/hooks/proteccion-rutas.js +366 -0
- package/hooks/registro-turnos.js +209 -0
- package/hooks/resumen-sesion.js +249 -0
- package/hooks/risk-scoring.js +323 -0
- package/hooks/rotar-audit-auto.js +122 -0
- package/hooks/sugerir-regenerar-inventario.js +170 -0
- package/hooks/telemetria-agentes.js +167 -0
- package/hooks/tracking-costos.js +688 -0
- package/instintos/global.yaml +8 -0
- package/instintos/perfil-usuario.yaml +53 -0
- package/instintos/prompt-appendices.yaml +57 -0
- package/instintos/proyecto.yaml +372 -0
- package/manifiestos/gateway-config.json +77 -0
- package/manifiestos/handoff-context.json +223 -0
- package/manifiestos/hook-profiles.json +44 -0
- package/manifiestos/hooks-config.json +360 -0
- package/manifiestos/modulos.json +1173 -0
- package/manifiestos/perfiles.json +404 -0
- package/package.json +86 -0
- package/plantillas/ESTADO.md +109 -0
- package/plantillas/HOJA-RUTA.md +143 -0
- package/plantillas/PROYECTO.md +122 -0
- package/plantillas/REQUISITOS.md +132 -0
- package/plantillas/auditor-veto-template.md +105 -0
- package/plantillas/github-workflows/README.md +47 -0
- package/plantillas/github-workflows/release-please.yml +44 -0
- package/plantillas/github-workflows/swl-ci.yml +107 -0
- package/plantillas/github-workflows/swl-security.yml +51 -0
- package/plantillas/mcp-mineru.json +13 -0
- package/plantillas/research/ARQUITECTURA.md +220 -0
- package/plantillas/research/FUNCIONALIDADES.md +175 -0
- package/plantillas/research/RESUMEN.md +165 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/TRAMPAS.md +299 -0
- package/plantillas/skill-evals-template.json +44 -0
- package/plugin.json +343 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +352 -0
- package/reglas/brevedad-output.md +124 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +201 -0
- package/reglas/git-workflow.md +245 -0
- package/reglas/gobernanza.md +271 -0
- package/reglas/harness-claude-code.md +213 -0
- package/reglas/hooks.md +186 -0
- package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
- package/reglas/lenguajes/csharp/hooks.md +281 -0
- package/reglas/lenguajes/csharp/patrones.md +226 -0
- package/reglas/lenguajes/csharp/seguridad.md +258 -0
- package/reglas/lenguajes/csharp/testing.md +176 -0
- package/reglas/lenguajes/go/estilo-codigo.md +195 -0
- package/reglas/lenguajes/go/hooks.md +249 -0
- package/reglas/lenguajes/go/patrones.md +249 -0
- package/reglas/lenguajes/go/seguridad.md +225 -0
- package/reglas/lenguajes/go/testing.md +272 -0
- package/reglas/lenguajes/java/estilo-codigo.md +217 -0
- package/reglas/lenguajes/java/hooks.md +251 -0
- package/reglas/lenguajes/java/patrones.md +226 -0
- package/reglas/lenguajes/java/seguridad.md +233 -0
- package/reglas/lenguajes/java/testing.md +238 -0
- package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
- package/reglas/lenguajes/kotlin/hooks.md +245 -0
- package/reglas/lenguajes/kotlin/patrones.md +201 -0
- package/reglas/lenguajes/kotlin/seguridad.md +202 -0
- package/reglas/lenguajes/kotlin/testing.md +236 -0
- package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
- package/reglas/lenguajes/nextjs/hooks.md +186 -0
- package/reglas/lenguajes/nextjs/patrones.md +225 -0
- package/reglas/lenguajes/nextjs/seguridad.md +216 -0
- package/reglas/lenguajes/nextjs/testing.md +193 -0
- package/reglas/lenguajes/php/estilo-codigo.md +228 -0
- package/reglas/lenguajes/php/hooks.md +165 -0
- package/reglas/lenguajes/php/patrones.md +233 -0
- package/reglas/lenguajes/php/seguridad.md +186 -0
- package/reglas/lenguajes/php/testing.md +205 -0
- package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
- package/reglas/lenguajes/rust/hooks.md +240 -0
- package/reglas/lenguajes/rust/patrones.md +250 -0
- package/reglas/lenguajes/rust/seguridad.md +221 -0
- package/reglas/lenguajes/rust/testing.md +194 -0
- package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
- package/reglas/lenguajes/swift/hooks.md +257 -0
- package/reglas/lenguajes/swift/patrones.md +235 -0
- package/reglas/lenguajes/swift/seguridad.md +248 -0
- package/reglas/lenguajes/swift/testing.md +242 -0
- package/reglas/markitdown.md +60 -0
- package/reglas/memoria-consolidada.md +209 -0
- package/reglas/patrones.md +225 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad-agentes.md +351 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +373 -0
- package/reglas/testing.md +193 -0
- package/schemas/agent-contract.json +176 -0
- package/schemas/agent-frontmatter.schema.json +149 -0
- package/schemas/agent-message.schema.json +53 -0
- package/schemas/agent-output-implementacion.schema.json +85 -0
- package/schemas/agent-output-planificacion.schema.json +113 -0
- package/schemas/agent-output-review.schema.json +78 -0
- package/schemas/diary-entry.schema.json +80 -0
- package/schemas/hook-profiles.schema.json +39 -0
- package/schemas/hooks-config.schema.json +74 -0
- package/schemas/instinct.schema.json +115 -0
- package/schemas/modulos.schema.json +29 -0
- package/schemas/perfiles.schema.json +28 -0
- package/schemas/plugin.schema.json +64 -0
- package/schemas/skill-evals.schema.json +95 -0
- package/schemas/skill-frontmatter.schema.json +170 -0
- package/scripts/actualizar.js +145 -0
- package/scripts/audit-skills.sh +78 -0
- package/scripts/auditar-agentes-gaps.js +149 -0
- package/scripts/auditar-cobertura-frameworks.js +241 -0
- package/scripts/auditar-skills-gaps.js +206 -0
- package/scripts/bootstrap-instintos.js +259 -0
- package/scripts/check-update.js +109 -0
- package/scripts/comandos/agents.js +105 -0
- package/scripts/comandos/info.js +108 -0
- package/scripts/comandos/install-asistido.js +186 -0
- package/scripts/comandos/skills.js +211 -0
- package/scripts/configurar-branch-protection.js +418 -0
- package/scripts/daemon-swl.py +388 -0
- package/scripts/desinstalar.js +130 -0
- package/scripts/doctor.js +559 -0
- package/scripts/field-report.js +199 -0
- package/scripts/generar-inventario.js +317 -0
- package/scripts/inbox-tmux-inject.js +161 -0
- package/scripts/inferir-herramientas-permitidas.js +586 -0
- package/scripts/inicializar.js +133 -0
- package/scripts/instalador.js +1031 -0
- package/scripts/instalar-git-hook.js +122 -0
- package/scripts/lib/agp-frontmatter.js +222 -0
- package/scripts/lib/append-con-marcadores.js +199 -0
- package/scripts/lib/artefactos-python.js +43 -0
- package/scripts/lib/audit-query.js +221 -0
- package/scripts/lib/autostart-linux.js +347 -0
- package/scripts/lib/autostart-macos.js +360 -0
- package/scripts/lib/autostart-windows.js +307 -0
- package/scripts/lib/budget-enforcer.js +252 -0
- package/scripts/lib/claude-sessions.js +285 -0
- package/scripts/lib/configurar-ci.js +380 -0
- package/scripts/lib/console-span-exporter.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -0
- package/scripts/lib/dashboard-widgets.js +290 -0
- package/scripts/lib/detectar-runtime.js +279 -0
- package/scripts/lib/detectar-stack.js +187 -0
- package/scripts/lib/diary-entry.js +234 -0
- package/scripts/lib/drift-detector.js +545 -0
- package/scripts/lib/estado.js +124 -0
- package/scripts/lib/gestor-componentes.js +243 -0
- package/scripts/lib/gitignore-manifest.js +305 -0
- package/scripts/lib/graph-analyze.py +556 -0
- package/scripts/lib/graph-builder.py +485 -0
- package/scripts/lib/graph-cluster.py +259 -0
- package/scripts/lib/health-row.js +168 -0
- package/scripts/lib/hooks-settings.js +789 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/mc-client.js +137 -0
- package/scripts/lib/notificaciones-telegram.js +1107 -0
- package/scripts/lib/npm-version.js +261 -0
- package/scripts/lib/paquetes-conocidos.js +50 -0
- package/scripts/lib/preservar-usuario.js +586 -0
- package/scripts/lib/prompt-builder.js +264 -0
- package/scripts/lib/resolver-externo.js +332 -0
- package/scripts/lib/schedule-parser.js +305 -0
- package/scripts/lib/scoring-instintos.js +240 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/lib/selector-interactivo.js +152 -0
- package/scripts/lib/semantic-search.js +242 -0
- package/scripts/lib/skill-discovery.js +234 -0
- package/scripts/lib/skill-metrics.js +246 -0
- package/scripts/lib/skill-normalizer.js +112 -0
- package/scripts/lib/skills-hub.js +340 -0
- package/scripts/lib/span-schema.js +134 -0
- package/scripts/lib/tool-cost-analyzer.js +255 -0
- package/scripts/lib/tracing-processor-interface.js +286 -0
- package/scripts/lib/transformadores/base.js +80 -0
- package/scripts/lib/transformadores/claude.js +124 -0
- package/scripts/lib/transformadores/codex.js +115 -0
- package/scripts/lib/transformadores/copilot.js +106 -0
- package/scripts/lib/transformadores/gemini.js +74 -0
- package/scripts/lib/transformadores/index.js +35 -0
- package/scripts/lib/transformadores/opencode.js +75 -0
- package/scripts/lib/ui.js +259 -0
- package/scripts/limpiar-artefactos-python.js +131 -0
- package/scripts/mcp-orchestrator.py +386 -0
- package/scripts/mcp-pool-manager.py +352 -0
- package/scripts/mcp-telemetry.py +378 -0
- package/scripts/poblar-evolvable.js +226 -0
- package/scripts/publicar.js +287 -0
- package/scripts/reflect-skills.js +403 -0
- package/scripts/rotar-audit-logs.js +185 -0
- package/scripts/run-skill-evals.js +242 -0
- package/scripts/smoke-test.js +374 -0
- package/scripts/token-analysis.py +471 -0
- package/scripts/validar-manifest.js +195 -0
- package/scripts/validar-memoria.js +321 -0
- package/scripts/validar-tests-aislamiento.js +184 -0
- package/scripts/validar-tokens-test.js +208 -0
- package/scripts/validar.js +147 -0
- package/scripts/validate-markdown.py +339 -0
- package/scripts/validate-skills.py +385 -0
- package/scripts/vendor/claude-usage/README.md +116 -0
- package/scripts/vendor/claude-usage/cli.py +334 -0
- package/scripts/vendor/claude-usage/dashboard.py +795 -0
- package/scripts/vendor/claude-usage/scanner.py +467 -0
- package/scripts/vendor/markitdown/cli.py +194 -0
- package/scripts/verificar-evolucion.js +289 -0
- package/scripts/verificar-release.js +494 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook: monitor-contexto.js
|
|
6
|
+
* Tipo: PostToolUse
|
|
7
|
+
*
|
|
8
|
+
* Lee el archivo bridge generado por linea-estado.js y emite advertencias
|
|
9
|
+
* cuando el contexto estimado supera umbrales críticos:
|
|
10
|
+
*
|
|
11
|
+
* ≤ 35% restante (uso ≥ 65%): WARNING — evitar trabajo complejo
|
|
12
|
+
* ≤ 25% restante (uso ≥ 75%): CRITICAL — detenerse, guardar estado, compactar
|
|
13
|
+
*
|
|
14
|
+
* Debounce: solo emite aviso cada N_DEBOUNCE invocaciones de herramienta.
|
|
15
|
+
* La escalación de severidad (pasar de WARNING a CRITICAL) bypasea el debounce.
|
|
16
|
+
*
|
|
17
|
+
* El hook nunca bloquea (siempre exit 0); sólo emite mensajes en stdout
|
|
18
|
+
* como texto enriquecido que Claude Code puede mostrar al usuario.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const path = require('path');
|
|
23
|
+
const os = require('os');
|
|
24
|
+
|
|
25
|
+
const { phase1_PruneToolResults, shouldCompress } = require('./lib/context-compressor');
|
|
26
|
+
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Constantes de configuración
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
/** Porcentaje de USO a partir del cual se emite WARNING. */
|
|
32
|
+
const UMBRAL_WARNING = 65;
|
|
33
|
+
|
|
34
|
+
/** Porcentaje de USO a partir del cual se emite CRITICAL. */
|
|
35
|
+
const UMBRAL_CRITICAL = 75;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Número de invocaciones de herramienta entre avisos consecutivos del mismo nivel.
|
|
39
|
+
* La escalación de severidad siempre bypasea este valor.
|
|
40
|
+
*/
|
|
41
|
+
const N_DEBOUNCE = 5;
|
|
42
|
+
|
|
43
|
+
/** Cada N invocaciones, sugerir compactacion si estamos en punto natural. */
|
|
44
|
+
const N_COMPACTACION_PROACTIVA = 40;
|
|
45
|
+
|
|
46
|
+
/** Umbral de uso para activar compactacion proactiva (antes del warning). */
|
|
47
|
+
const UMBRAL_COMPACTACION_PROACTIVA = 50;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Ruta del archivo de estado interno de este monitor.
|
|
51
|
+
* Almacena cuándo se emitió el último aviso y con qué severidad.
|
|
52
|
+
*/
|
|
53
|
+
function rutaEstadoMonitor(sessionId) {
|
|
54
|
+
return path.join(os.tmpdir(), `swl-monitor-${sessionId}.json`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Tipos de severidad
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
const SEVERIDAD = {
|
|
61
|
+
NINGUNA: 0,
|
|
62
|
+
WARNING: 1,
|
|
63
|
+
CRITICAL: 2,
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Utilidades
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Lee el archivo bridge de linea-estado.js.
|
|
72
|
+
* @param {string} sessionId
|
|
73
|
+
* @returns {object|null} Payload del bridge o null si no existe/falla.
|
|
74
|
+
*/
|
|
75
|
+
function leerBridge(sessionId) {
|
|
76
|
+
const bridgePath = path.join(os.tmpdir(), `swl-ctx-${sessionId}.json`);
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
|
|
79
|
+
} catch (_) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Lee el estado interno previo del monitor.
|
|
86
|
+
* @param {string} estadoPath
|
|
87
|
+
* @returns {{ ultimaInvocacion: number, ultimaSeveridad: number }}
|
|
88
|
+
*/
|
|
89
|
+
function leerEstadoMonitor(estadoPath) {
|
|
90
|
+
try {
|
|
91
|
+
const datos = JSON.parse(fs.readFileSync(estadoPath, 'utf8'));
|
|
92
|
+
return {
|
|
93
|
+
ultimaInvocacion: datos.ultimaInvocacion ?? 0,
|
|
94
|
+
ultimaSeveridad: datos.ultimaSeveridad ?? SEVERIDAD.NINGUNA,
|
|
95
|
+
compresionEmitida: datos.compresionEmitida ?? false,
|
|
96
|
+
};
|
|
97
|
+
} catch (_) {
|
|
98
|
+
return { ultimaInvocacion: 0, ultimaSeveridad: SEVERIDAD.NINGUNA, compresionEmitida: false };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Persiste el estado del monitor.
|
|
104
|
+
* @param {string} estadoPath
|
|
105
|
+
* @param {object} estado
|
|
106
|
+
*/
|
|
107
|
+
function guardarEstadoMonitor(estadoPath, estado) {
|
|
108
|
+
try {
|
|
109
|
+
fs.writeFileSync(estadoPath, JSON.stringify(estado, null, 2), 'utf8');
|
|
110
|
+
} catch (_) {
|
|
111
|
+
// Ignorar errores de escritura — no bloquear el flujo
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Determina la severidad actual en función del porcentaje de uso.
|
|
117
|
+
* @param {number} porcentajeUso - Porcentaje de contexto consumido (0-100).
|
|
118
|
+
* @returns {number} Valor de SEVERIDAD.*
|
|
119
|
+
*/
|
|
120
|
+
function calcularSeveridad(porcentajeUso) {
|
|
121
|
+
if (porcentajeUso >= UMBRAL_CRITICAL) return SEVERIDAD.CRITICAL;
|
|
122
|
+
if (porcentajeUso >= UMBRAL_WARNING) return SEVERIDAD.WARNING;
|
|
123
|
+
return SEVERIDAD.NINGUNA;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Detecta si la ultima operacion es un punto natural para compactar.
|
|
128
|
+
* Puntos naturales:
|
|
129
|
+
* - Despues de un git commit exitoso
|
|
130
|
+
* - Despues de correr tests exitosamente
|
|
131
|
+
* - Cuando tool_name es "Agent" (fin de subagente)
|
|
132
|
+
* @param {object} data - Payload del hook
|
|
133
|
+
* @returns {boolean}
|
|
134
|
+
*/
|
|
135
|
+
function esPuntoNatural(data) {
|
|
136
|
+
const toolName = String(data.tool_name || '');
|
|
137
|
+
const toolInput = data.tool_input || {};
|
|
138
|
+
const comando = String(toolInput.command || '');
|
|
139
|
+
|
|
140
|
+
// Despues de un commit exitoso
|
|
141
|
+
if (toolName === 'Bash' && /\bgit\s+commit\b/.test(comando)) return true;
|
|
142
|
+
|
|
143
|
+
// Despues de correr tests
|
|
144
|
+
if (toolName === 'Bash' && /\b(pytest|jest|vitest|go test|cargo test|dotnet test|phpunit|npm test)\b/.test(comando)) return true;
|
|
145
|
+
|
|
146
|
+
// Fin de un subagente
|
|
147
|
+
if (toolName === 'Agent') return true;
|
|
148
|
+
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Genera el mensaje de sugerencia de compactacion proactiva.
|
|
154
|
+
* @param {number} porcentajeUso
|
|
155
|
+
* @param {number} invocaciones
|
|
156
|
+
* @returns {string}
|
|
157
|
+
*/
|
|
158
|
+
function generarMensajeCompactacion(porcentajeUso, invocaciones) {
|
|
159
|
+
return [
|
|
160
|
+
'',
|
|
161
|
+
'--- SUGERENCIA DE COMPACTACION ---',
|
|
162
|
+
` Contexto: ${porcentajeUso}% usado | ${invocaciones} tool calls en sesion`,
|
|
163
|
+
' Punto natural de pausa detectado.',
|
|
164
|
+
' Considera ejecutar /compact o /swl:compactar para liberar contexto',
|
|
165
|
+
' antes de continuar con tareas complejas.',
|
|
166
|
+
'',
|
|
167
|
+
].join('\n');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Genera el mensaje de advertencia según severidad.
|
|
172
|
+
* El mensaje se emite en stdout para que Claude Code lo procese
|
|
173
|
+
* como feedback informativo dentro de la conversación.
|
|
174
|
+
*
|
|
175
|
+
* @param {number} severidad
|
|
176
|
+
* @param {number} porcentajeUso
|
|
177
|
+
* @param {number} porcentajeRestante
|
|
178
|
+
* @returns {string}
|
|
179
|
+
*/
|
|
180
|
+
function generarMensaje(severidad, porcentajeUso, porcentajeRestante) {
|
|
181
|
+
const barra = '█'.repeat(Math.round(porcentajeUso / 10)) +
|
|
182
|
+
'░'.repeat(10 - Math.round(porcentajeUso / 10));
|
|
183
|
+
|
|
184
|
+
if (severidad === SEVERIDAD.CRITICAL) {
|
|
185
|
+
return [
|
|
186
|
+
'',
|
|
187
|
+
'╔══════════════════════════════════════════════════════╗',
|
|
188
|
+
'║ CONTEXTO CRÍTICO — ACCIÓN REQUERIDA ║',
|
|
189
|
+
'╚══════════════════════════════════════════════════════╝',
|
|
190
|
+
` Contexto usado: ${barra} ${porcentajeUso}% (${porcentajeRestante}% restante)`,
|
|
191
|
+
'',
|
|
192
|
+
' Acciones recomendadas:',
|
|
193
|
+
' 1. Guarda el estado actual con un commit atómico.',
|
|
194
|
+
' 2. Ejecuta /compact o solicita compactación del contexto.',
|
|
195
|
+
' 3. Divide la tarea en partes más pequeñas.',
|
|
196
|
+
' 4. No inicies trabajo complejo hasta compactar.',
|
|
197
|
+
'',
|
|
198
|
+
].join('\n');
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (severidad === SEVERIDAD.WARNING) {
|
|
202
|
+
return [
|
|
203
|
+
'',
|
|
204
|
+
'⚠ ADVERTENCIA DE CONTEXTO',
|
|
205
|
+
` Contexto usado: ${barra} ${porcentajeUso}% (${porcentajeRestante}% restante)`,
|
|
206
|
+
' Evitar tareas complejas. Considera compactar pronto.',
|
|
207
|
+
'',
|
|
208
|
+
].join('\n');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Entrypoint principal
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
|
|
218
|
+
let inputRaw = '';
|
|
219
|
+
|
|
220
|
+
process.stdin.on('data', chunk => {
|
|
221
|
+
inputRaw += chunk;
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
process.stdin.on('end', () => {
|
|
225
|
+
try {
|
|
226
|
+
const data = JSON.parse(inputRaw);
|
|
227
|
+
|
|
228
|
+
const sessionId = String(data.session_id || 'default');
|
|
229
|
+
const estadoPath = rutaEstadoMonitor(sessionId);
|
|
230
|
+
|
|
231
|
+
// Leer el bridge de linea-estado
|
|
232
|
+
const bridge = leerBridge(sessionId);
|
|
233
|
+
if (!bridge) {
|
|
234
|
+
// Sin bridge no hay datos — salir silenciosamente
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const porcentajeUso = bridge.porcentaje ?? 0;
|
|
239
|
+
const invocacionesActual = bridge.invocaciones ?? 0;
|
|
240
|
+
const porcentajeRestante = 100 - porcentajeUso;
|
|
241
|
+
const severidadActual = calcularSeveridad(porcentajeUso);
|
|
242
|
+
|
|
243
|
+
// Leer estado previo del monitor (necesario tanto para WARNING/CRITICAL como para proactiva)
|
|
244
|
+
const estadoPrevio = leerEstadoMonitor(estadoPath);
|
|
245
|
+
const { ultimaInvocacion, ultimaSeveridad } = estadoPrevio;
|
|
246
|
+
|
|
247
|
+
// Resetear flag de compresión si el contexto bajó (post-compactación real)
|
|
248
|
+
if (severidadActual < SEVERIDAD.CRITICAL && estadoPrevio.compresionEmitida) {
|
|
249
|
+
guardarEstadoMonitor(estadoPath, {
|
|
250
|
+
...estadoPrevio,
|
|
251
|
+
compresionEmitida: false,
|
|
252
|
+
timestamp: new Date().toISOString(),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (severidadActual !== SEVERIDAD.NINGUNA) {
|
|
257
|
+
// Determinar si debemos emitir aviso:
|
|
258
|
+
// a) Escalación de severidad → siempre emitir (bypasea debounce)
|
|
259
|
+
// b) Mismo nivel → solo si han pasado N_DEBOUNCE invocaciones
|
|
260
|
+
const esEscalacion = severidadActual > ultimaSeveridad;
|
|
261
|
+
const invocacionesDesdeUltimoAviso = invocacionesActual - ultimaInvocacion;
|
|
262
|
+
const debounceExpirado = invocacionesDesdeUltimoAviso >= N_DEBOUNCE;
|
|
263
|
+
|
|
264
|
+
const debeEmitir = esEscalacion || debounceExpirado;
|
|
265
|
+
|
|
266
|
+
if (debeEmitir) {
|
|
267
|
+
const mensaje = generarMensaje(severidadActual, porcentajeUso, porcentajeRestante);
|
|
268
|
+
if (mensaje) {
|
|
269
|
+
// Emitir advertencia como systemMessage (stderr causa hook error)
|
|
270
|
+
process.stdout.write(JSON.stringify({ systemMessage: mensaje }));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Actualizar estado del monitor
|
|
274
|
+
guardarEstadoMonitor(estadoPath, {
|
|
275
|
+
ultimaInvocacion: invocacionesActual,
|
|
276
|
+
ultimaSeveridad: severidadActual,
|
|
277
|
+
compresionEmitida: estadoPrevio.compresionEmitida || false,
|
|
278
|
+
timestamp: new Date().toISOString(),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// --- Compresión automática Fase 1 (sin LLM) al llegar a CRITICAL ---
|
|
284
|
+
// Solo emitir UNA VEZ por sesión para evitar spam de banners
|
|
285
|
+
if (severidadActual === SEVERIDAD.CRITICAL && shouldCompress(porcentajeUso)) {
|
|
286
|
+
const yaEmitioBanner = estadoPrevio.compresionEmitida === true;
|
|
287
|
+
if (!yaEmitioBanner) {
|
|
288
|
+
try {
|
|
289
|
+
const mensajeCompresion = [
|
|
290
|
+
'',
|
|
291
|
+
'--- COMPRESION AUTOMATICA (Fases 1+1b) ---',
|
|
292
|
+
` Contexto: ${porcentajeUso}% usado`,
|
|
293
|
+
' Fase 1: tool results antiguos podados por posición.',
|
|
294
|
+
' Fase 1b: resultados de Read/Bash/Grep/Glob > 15 turnos comprimidos por TTL.',
|
|
295
|
+
' Para compresión avanzada (Fases 2-4), ejecuta /swl:compactar',
|
|
296
|
+
' o pide: "comprime el contexto preservando las decisiones clave".',
|
|
297
|
+
'',
|
|
298
|
+
].join('\n');
|
|
299
|
+
process.stdout.write(JSON.stringify({ systemMessage: mensajeCompresion }));
|
|
300
|
+
// Marcar como emitido para no repetir
|
|
301
|
+
guardarEstadoMonitor(estadoPath, {
|
|
302
|
+
...estadoPrevio,
|
|
303
|
+
ultimaInvocacion: invocacionesActual,
|
|
304
|
+
ultimaSeveridad: severidadActual,
|
|
305
|
+
compresionEmitida: true,
|
|
306
|
+
timestamp: new Date().toISOString(),
|
|
307
|
+
});
|
|
308
|
+
} catch (_) {}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// --- Compactacion proactiva: sugerir en punto natural antes de alcanzar WARNING ---
|
|
313
|
+
if (severidadActual === SEVERIDAD.NINGUNA &&
|
|
314
|
+
porcentajeUso >= UMBRAL_COMPACTACION_PROACTIVA &&
|
|
315
|
+
invocacionesActual % N_COMPACTACION_PROACTIVA === 0 &&
|
|
316
|
+
esPuntoNatural(data)) {
|
|
317
|
+
const mensajeCompactacion = generarMensajeCompactacion(porcentajeUso, invocacionesActual);
|
|
318
|
+
process.stdout.write(JSON.stringify({ systemMessage: mensajeCompactacion }));
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
} catch (err) {
|
|
322
|
+
// El hook nunca bloquea por errores internos
|
|
323
|
+
// No escribir a stderr — Claude Code lo reporta como hook error
|
|
324
|
+
}
|
|
325
|
+
});
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook: notificacion-sesion-stop.js
|
|
6
|
+
* Tipo: Stop
|
|
7
|
+
*
|
|
8
|
+
* Al terminar una sesión (o turno largo), envía una notificación al gateway
|
|
9
|
+
* multi-plataforma con contexto útil: duración, tool calls, costo, últimos
|
|
10
|
+
* archivos modificados y el último tramo de output.
|
|
11
|
+
*
|
|
12
|
+
* Inspirado en Claude-Code-Remote (smtp.js líneas 292-340) — trae al aviso
|
|
13
|
+
* el contexto de qué hizo Claude en el turno, no solo "sesión terminada".
|
|
14
|
+
*
|
|
15
|
+
* Se activa solo si:
|
|
16
|
+
* - gateway está habilitado en manifiestos/gateway-config.json
|
|
17
|
+
* - notifications.onSessionComplete no es false
|
|
18
|
+
* - la sesión tuvo al menos UMBRAL_TOOL_CALLS tool calls (evita ruido en turnos triviales)
|
|
19
|
+
*
|
|
20
|
+
* Opt-in adicional por variable de entorno:
|
|
21
|
+
* SWL_NOTIFICAR_STOP=0 → desactiva completamente el hook
|
|
22
|
+
*
|
|
23
|
+
* Zero-deps. Nunca bloquea: exit 0 siempre.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
const path = require('path');
|
|
28
|
+
const os = require('os');
|
|
29
|
+
|
|
30
|
+
const { notificarGateway, gatewayHabilitado } = require('./lib/gateway-notify');
|
|
31
|
+
|
|
32
|
+
// Umbral mínimo de tool calls para emitir notificación.
|
|
33
|
+
// Debajo de esto, la sesión se considera trivial (consulta puntual).
|
|
34
|
+
const UMBRAL_TOOL_CALLS = 10;
|
|
35
|
+
|
|
36
|
+
// Longitud máxima del tramo de transcripción a incluir en la notificación.
|
|
37
|
+
const MAX_TRANSCRIPT_CHARS = 800;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Lee el estado del bridge de tracking-costos.
|
|
41
|
+
*/
|
|
42
|
+
function leerBridge(sessionId) {
|
|
43
|
+
const bridgePath = path.join(os.tmpdir(), `swl-costs-${sessionId}.json`);
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
|
|
46
|
+
} catch (_) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Lee el último tramo del transcript de la sesión.
|
|
53
|
+
* El payload del hook Stop incluye transcript_path apuntando al JSONL.
|
|
54
|
+
*/
|
|
55
|
+
function leerUltimoTramoTranscript(transcriptPath, maxChars) {
|
|
56
|
+
if (!transcriptPath || !fs.existsSync(transcriptPath)) return '';
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const raw = fs.readFileSync(transcriptPath, 'utf8');
|
|
60
|
+
const lineas = raw.trim().split(/\r?\n/);
|
|
61
|
+
// Tomar las últimas líneas y extraer texto de mensajes assistant
|
|
62
|
+
const ultimasLineas = lineas.slice(-30);
|
|
63
|
+
const textos = [];
|
|
64
|
+
for (const linea of ultimasLineas) {
|
|
65
|
+
try {
|
|
66
|
+
const evento = JSON.parse(linea);
|
|
67
|
+
const msg = evento.message || evento;
|
|
68
|
+
const role = msg.role || msg.type;
|
|
69
|
+
const content = msg.content;
|
|
70
|
+
if (role !== 'assistant' && role !== 'user') continue;
|
|
71
|
+
if (typeof content === 'string') {
|
|
72
|
+
textos.push(content);
|
|
73
|
+
} else if (Array.isArray(content)) {
|
|
74
|
+
for (const block of content) {
|
|
75
|
+
if (block && block.type === 'text' && block.text) {
|
|
76
|
+
textos.push(block.text);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} catch (_) { /* línea corrupta, ignorar */ }
|
|
81
|
+
}
|
|
82
|
+
const unido = textos.join('\n').trim();
|
|
83
|
+
if (unido.length <= maxChars) return unido;
|
|
84
|
+
return '…' + unido.slice(-maxChars);
|
|
85
|
+
} catch (_) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Lista archivos modificados recientemente (últimos 10 min) en el cwd.
|
|
92
|
+
*/
|
|
93
|
+
function archivosRecientes(maxItems = 5) {
|
|
94
|
+
try {
|
|
95
|
+
const { execSync } = require('child_process');
|
|
96
|
+
const out = execSync('git status --porcelain', {
|
|
97
|
+
cwd: process.cwd(),
|
|
98
|
+
encoding: 'utf8',
|
|
99
|
+
timeout: 5000,
|
|
100
|
+
});
|
|
101
|
+
const lineas = out.trim().split(/\r?\n/).filter(l => l.trim());
|
|
102
|
+
return lineas.slice(0, maxItems).map(l => l.trim());
|
|
103
|
+
} catch (_) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Formatea número con separador de miles.
|
|
110
|
+
*/
|
|
111
|
+
function fmt(n) {
|
|
112
|
+
try { return Number(n).toLocaleString('es-MX'); } catch (_) { return String(n); }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Construye el mensaje de notificación.
|
|
117
|
+
*/
|
|
118
|
+
function construirMensaje(estado, transcriptPath) {
|
|
119
|
+
const tool = estado?.toolCalls || 0;
|
|
120
|
+
const tokens = estado?.tokensTotal || 0;
|
|
121
|
+
const costo = estado?.costoTotal || 0;
|
|
122
|
+
const modelo = estado?.modeloPredominante || 'unknown';
|
|
123
|
+
|
|
124
|
+
const c = estado?.componentesSWL || {};
|
|
125
|
+
const agentes = (c.agentes || []).length;
|
|
126
|
+
const skills = (c.skills || []).length;
|
|
127
|
+
const comandos = (c.comandos || []).length;
|
|
128
|
+
|
|
129
|
+
const archivos = archivosRecientes(5);
|
|
130
|
+
const tramo = leerUltimoTramoTranscript(transcriptPath, MAX_TRANSCRIPT_CHARS);
|
|
131
|
+
|
|
132
|
+
const lineas = [];
|
|
133
|
+
lineas.push('✅ *Sesión SWL terminada*');
|
|
134
|
+
lineas.push(`Modelo: \`${modelo}\` | Llamadas: ${fmt(tool)} | Tokens: ~${fmt(tokens)} | Costo: ~$${Number(costo).toFixed(2)} USD`);
|
|
135
|
+
|
|
136
|
+
if (agentes + skills + comandos > 0) {
|
|
137
|
+
lineas.push(`SWL: ${agentes} agentes, ${skills} skills, ${comandos} comandos`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (archivos.length > 0) {
|
|
141
|
+
lineas.push('');
|
|
142
|
+
lineas.push('*Archivos modificados:*');
|
|
143
|
+
lineas.push('```');
|
|
144
|
+
for (const a of archivos) lineas.push(a);
|
|
145
|
+
lineas.push('```');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (tramo) {
|
|
149
|
+
lineas.push('');
|
|
150
|
+
lineas.push('*Último tramo:*');
|
|
151
|
+
lineas.push('```');
|
|
152
|
+
lineas.push(tramo);
|
|
153
|
+
lineas.push('```');
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return lineas.join('\n');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Entrypoint
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
|
|
163
|
+
let inputRaw = '';
|
|
164
|
+
|
|
165
|
+
process.stdin.on('data', chunk => { inputRaw += chunk; });
|
|
166
|
+
|
|
167
|
+
process.stdin.on('end', () => {
|
|
168
|
+
try {
|
|
169
|
+
if (process.env.SWL_NOTIFICAR_STOP === '0') return;
|
|
170
|
+
if (!gatewayHabilitado()) return;
|
|
171
|
+
|
|
172
|
+
const data = JSON.parse(inputRaw);
|
|
173
|
+
const sessionId = String(data.session_id || 'default');
|
|
174
|
+
const transcriptPath = data.transcript_path || null;
|
|
175
|
+
|
|
176
|
+
const estado = leerBridge(sessionId);
|
|
177
|
+
const toolCalls = estado?.toolCalls || 0;
|
|
178
|
+
if (toolCalls < UMBRAL_TOOL_CALLS) return;
|
|
179
|
+
|
|
180
|
+
const texto = construirMensaje(estado, transcriptPath);
|
|
181
|
+
|
|
182
|
+
notificarGateway({
|
|
183
|
+
tipo: 'session-stop',
|
|
184
|
+
titulo: 'Sesión SWL terminada',
|
|
185
|
+
texto,
|
|
186
|
+
to: 'all',
|
|
187
|
+
payload: {
|
|
188
|
+
sessionId,
|
|
189
|
+
toolCalls,
|
|
190
|
+
tokensTotal: estado?.tokensTotal || 0,
|
|
191
|
+
costoTotal: estado?.costoTotal || 0,
|
|
192
|
+
modelo: estado?.modeloPredominante || 'unknown',
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
} catch (_) {
|
|
196
|
+
// Nunca bloquear
|
|
197
|
+
}
|
|
198
|
+
});
|