@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,134 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Esquema de tipos de span para telemetría de agentes.
|
|
5
|
+
*
|
|
6
|
+
* Portado desde openai-agents-python / src/agents/tracing/span_data.py
|
|
7
|
+
* Licencia origen: MIT. Traducción a JS: SWL (español es-MX).
|
|
8
|
+
*
|
|
9
|
+
* Proporciona la taxonomía de 13 tipos de span usados en el sistema de
|
|
10
|
+
* trazas OTLP-lite de swl-ses, garantizando consistencia entre el hook
|
|
11
|
+
* telemetria-agentes.js y los exportadores que consumen .planning/traces/.
|
|
12
|
+
*
|
|
13
|
+
* @module scripts/lib/span-schema
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Constantes
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Tipos de span válidos en el sistema de trazas.
|
|
22
|
+
* Congelado para prevenir mutaciones accidentales en tiempo de ejecución.
|
|
23
|
+
*
|
|
24
|
+
* Correspondencia con openai-agents-python:
|
|
25
|
+
* - agent → AgentSpanData
|
|
26
|
+
* - function → FunctionSpanData
|
|
27
|
+
* - generation → GenerationSpanData
|
|
28
|
+
* - handoff → HandoffSpanData
|
|
29
|
+
* - guardrail → GuardrailSpanData
|
|
30
|
+
* - turn → TurnSpanData
|
|
31
|
+
* - task → TaskSpanData
|
|
32
|
+
* - mcp_list_tools → MCPListToolsSpanData
|
|
33
|
+
* - response → ResponseSpanData
|
|
34
|
+
* - speech → SpeechSpanData
|
|
35
|
+
* - transcription → TranscriptionSpanData
|
|
36
|
+
* - speech_group → SpeechGroupSpanData
|
|
37
|
+
* - custom → CustomSpanData
|
|
38
|
+
*
|
|
39
|
+
* @type {Readonly<{[key: string]: string}>}
|
|
40
|
+
*/
|
|
41
|
+
const SPAN_TYPES = Object.freeze({
|
|
42
|
+
/** Invocación de un agente SWL (subagente orquestado). */
|
|
43
|
+
AGENT: 'agent',
|
|
44
|
+
/** Invocación de una herramienta/función por el agente. */
|
|
45
|
+
FUNCTION: 'function',
|
|
46
|
+
/** Llamada de generación al modelo LLM. */
|
|
47
|
+
GENERATION: 'generation',
|
|
48
|
+
/** Traspaso de control entre agentes (handoff). */
|
|
49
|
+
HANDOFF: 'handoff',
|
|
50
|
+
/** Activación de un guardrail de validación de input/output. */
|
|
51
|
+
GUARDRAIL: 'guardrail',
|
|
52
|
+
/** Un turno del loop del agente. */
|
|
53
|
+
TURN: 'turn',
|
|
54
|
+
/** Una ejecución completa de alto nivel (task runner run). */
|
|
55
|
+
TASK: 'task',
|
|
56
|
+
/** Listado de herramientas disponibles en un servidor MCP. */
|
|
57
|
+
MCP_LIST_TOOLS: 'mcp_list_tools',
|
|
58
|
+
/** Span de respuesta del modelo (responses API). */
|
|
59
|
+
RESPONSE: 'response',
|
|
60
|
+
/** Síntesis de voz (TTS). */
|
|
61
|
+
SPEECH: 'speech',
|
|
62
|
+
/** Transcripción de voz a texto (STT). */
|
|
63
|
+
TRANSCRIPTION: 'transcription',
|
|
64
|
+
/** Agrupación de spans de voz relacionados. */
|
|
65
|
+
SPEECH_GROUP: 'speech_group',
|
|
66
|
+
/** Span personalizado para eventos sin categoría definida. */
|
|
67
|
+
CUSTOM: 'custom',
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Conjunto de valores válidos (para validación O(1)).
|
|
72
|
+
* @type {Set<string>}
|
|
73
|
+
*/
|
|
74
|
+
const _TIPOS_VALIDOS = new Set(Object.values(SPAN_TYPES));
|
|
75
|
+
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Funciones exportadas
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Verifica si un string es un tipo de span válido en la taxonomía.
|
|
82
|
+
*
|
|
83
|
+
* @param {string} tipo - Valor a verificar.
|
|
84
|
+
* @returns {boolean} true si es un tipo de span reconocido.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* esTipoSpanValido('agent') // → true
|
|
88
|
+
* esTipoSpanValido('unknown') // → false
|
|
89
|
+
*/
|
|
90
|
+
function esTipoSpanValido(tipo) {
|
|
91
|
+
return _TIPOS_VALIDOS.has(tipo);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Construye un objeto de span estandarizado con los campos requeridos.
|
|
96
|
+
* Valida el tipo antes de construir — lanza TypeError si el tipo no es válido.
|
|
97
|
+
*
|
|
98
|
+
* @param {object} opciones - Parámetros del span.
|
|
99
|
+
* @param {string} opciones.tipo - Tipo de span (debe estar en SPAN_TYPES).
|
|
100
|
+
* @param {string} opciones.nombre - Nombre descriptivo del span (ej. "agent:revisor-swl").
|
|
101
|
+
* @param {object} [opciones.datos] - Payload específico del tipo de span.
|
|
102
|
+
* @param {string} [opciones.timestamp] - ISO timestamp de inicio (por defecto: ahora).
|
|
103
|
+
* @param {string} [opciones.traceId] - ID de traza padre (opcional).
|
|
104
|
+
* @param {string} [opciones.parentSpanId] - ID del span padre (opcional).
|
|
105
|
+
* @returns {{ tipo: string, nombre: string, datos: object, timestamp: string, traceId: string|null, parentSpanId: string|null }}
|
|
106
|
+
*
|
|
107
|
+
* @throws {TypeError} Si el tipo no es un valor válido de SPAN_TYPES.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* construirSpan({ tipo: 'agent', nombre: 'agent:planificador-swl' })
|
|
111
|
+
* // → { tipo: 'agent', nombre: 'agent:planificador-swl', datos: {}, timestamp: '...', traceId: null, parentSpanId: null }
|
|
112
|
+
*/
|
|
113
|
+
function construirSpan({ tipo, nombre, datos = {}, timestamp, traceId = null, parentSpanId = null }) {
|
|
114
|
+
if (!esTipoSpanValido(tipo)) {
|
|
115
|
+
throw new TypeError(
|
|
116
|
+
`Tipo de span inválido: "${tipo}". Tipos válidos: ${[..._TIPOS_VALIDOS].join(', ')}`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
tipo,
|
|
122
|
+
nombre: String(nombre || ''),
|
|
123
|
+
datos: datos && typeof datos === 'object' ? { ...datos } : {},
|
|
124
|
+
timestamp: timestamp || new Date().toISOString(),
|
|
125
|
+
traceId: traceId || null,
|
|
126
|
+
parentSpanId: parentSpanId || null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Exports
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
module.exports = { SPAN_TYPES, esTipoSpanValido, construirSpan };
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tool-cost-analyzer.js
|
|
5
|
+
*
|
|
6
|
+
* Consulta ~/.claude/usage.db (SQLite generado por claude-usage) y devuelve
|
|
7
|
+
* métricas de costo por tool_name. Útil para identificar qué herramientas SWL
|
|
8
|
+
* consumen más tokens en sesiones reales.
|
|
9
|
+
*
|
|
10
|
+
* Uso programático:
|
|
11
|
+
* const analyzer = require('./tool-cost-analyzer');
|
|
12
|
+
* const metricas = await analyzer.obtenerMetricasPorHerramienta({ dias: 30 });
|
|
13
|
+
*
|
|
14
|
+
* Requiere: better-sqlite3 o sqlite3. Usa execFile('python') como fallback.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const { execFile } = require('child_process');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const os = require('os');
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
|
|
22
|
+
const DB_PATH = path.join(os.homedir(), '.claude', 'usage.db');
|
|
23
|
+
|
|
24
|
+
// Precios estimados por 1M tokens (USD) — actualizados a 2026-04-17
|
|
25
|
+
const PRECIOS = {
|
|
26
|
+
'claude-opus-4-7': { input: 15.00, output: 75.00, cache_read: 1.50, cache_creation: 18.75 },
|
|
27
|
+
'claude-opus-4-6': { input: 15.00, output: 75.00, cache_read: 1.50, cache_creation: 18.75 },
|
|
28
|
+
'claude-sonnet-4-6': { input: 3.00, output: 15.00, cache_read: 0.30, cache_creation: 3.75 },
|
|
29
|
+
'claude-haiku-4-5': { input: 0.80, output: 4.00, cache_read: 0.08, cache_creation: 1.00 },
|
|
30
|
+
};
|
|
31
|
+
const PRECIO_DEFAULT = { input: 3.00, output: 15.00, cache_read: 0.30, cache_creation: 3.75 };
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Calcula el costo estimado a partir de tokens y modelo.
|
|
35
|
+
*/
|
|
36
|
+
function calcularCosto(tokens, modelo) {
|
|
37
|
+
const precios = PRECIOS[modelo] || PRECIO_DEFAULT;
|
|
38
|
+
return (
|
|
39
|
+
((tokens.input || 0) * precios.input / 1_000_000) +
|
|
40
|
+
((tokens.output || 0) * precios.output / 1_000_000) +
|
|
41
|
+
((tokens.cache_read || 0) * precios.cache_read / 1_000_000) +
|
|
42
|
+
((tokens.cache_creation || 0) * precios.cache_creation / 1_000_000)
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Ejecuta una consulta SQLite usando Python como fallback (zero npm deps).
|
|
48
|
+
* @param {string} sql
|
|
49
|
+
* @returns {Promise<Array>}
|
|
50
|
+
*/
|
|
51
|
+
function consultarSQLite(sql) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
if (!fs.existsSync(DB_PATH)) {
|
|
54
|
+
return resolve([]);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const pythonCmd = process.platform === 'win32' ? 'python' : 'python3';
|
|
58
|
+
const script = `
|
|
59
|
+
import sqlite3, json, sys
|
|
60
|
+
conn = sqlite3.connect(r'${DB_PATH.replace(/\\/g, '\\\\')}')
|
|
61
|
+
conn.row_factory = sqlite3.Row
|
|
62
|
+
rows = conn.execute(${JSON.stringify(sql)}).fetchall()
|
|
63
|
+
print(json.dumps([dict(r) for r in rows]))
|
|
64
|
+
`;
|
|
65
|
+
execFile(pythonCmd, ['-c', script], { timeout: 15_000 }, (err, stdout) => {
|
|
66
|
+
if (err) return reject(err);
|
|
67
|
+
try {
|
|
68
|
+
resolve(JSON.parse(stdout.trim() || '[]'));
|
|
69
|
+
} catch (e) {
|
|
70
|
+
reject(e);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Obtiene métricas agregadas por tool_name para los últimos N días.
|
|
78
|
+
*
|
|
79
|
+
* @param {object} opciones
|
|
80
|
+
* @param {number} [opciones.dias=30] — Rango de días a consultar
|
|
81
|
+
* @param {number} [opciones.topN=20] — Número de herramientas a retornar
|
|
82
|
+
* @returns {Promise<Array<{tool_name, llamadas, input_tokens, output_tokens, costo_usd}>>}
|
|
83
|
+
*/
|
|
84
|
+
async function obtenerMetricasPorHerramienta({ dias = 30, topN = 20 } = {}) {
|
|
85
|
+
const fechaDesde = new Date(Date.now() - dias * 86_400_000).toISOString();
|
|
86
|
+
|
|
87
|
+
const sql = `
|
|
88
|
+
SELECT
|
|
89
|
+
COALESCE(tool_name, '(sin herramienta)') AS tool_name,
|
|
90
|
+
COUNT(*) AS llamadas,
|
|
91
|
+
SUM(input_tokens) AS input_tokens,
|
|
92
|
+
SUM(output_tokens) AS output_tokens,
|
|
93
|
+
SUM(cache_read_tokens) AS cache_read,
|
|
94
|
+
SUM(cache_creation_tokens) AS cache_creation,
|
|
95
|
+
MAX(model) AS modelo
|
|
96
|
+
FROM turns
|
|
97
|
+
WHERE timestamp >= '${fechaDesde}'
|
|
98
|
+
GROUP BY tool_name
|
|
99
|
+
ORDER BY input_tokens + output_tokens DESC
|
|
100
|
+
LIMIT ${topN}
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
const filas = await consultarSQLite(sql);
|
|
104
|
+
|
|
105
|
+
return filas.map(f => ({
|
|
106
|
+
tool_name: f.tool_name,
|
|
107
|
+
llamadas: f.llamadas,
|
|
108
|
+
input_tokens: f.input_tokens || 0,
|
|
109
|
+
output_tokens: f.output_tokens || 0,
|
|
110
|
+
costo_usd: calcularCosto({
|
|
111
|
+
input: f.input_tokens,
|
|
112
|
+
output: f.output_tokens,
|
|
113
|
+
cache_read: f.cache_read,
|
|
114
|
+
cache_creation: f.cache_creation,
|
|
115
|
+
}, f.modelo),
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Obtiene resumen global de sesiones (total tokens, costo, sesiones) para N días.
|
|
121
|
+
*
|
|
122
|
+
* @param {object} opciones
|
|
123
|
+
* @param {number} [opciones.dias=30]
|
|
124
|
+
* @returns {Promise<{sesiones, turns, input_tokens, output_tokens, costo_usd}>}
|
|
125
|
+
*/
|
|
126
|
+
async function obtenerResumenGlobal({ dias = 30 } = {}) {
|
|
127
|
+
const fechaDesde = new Date(Date.now() - dias * 86_400_000).toISOString();
|
|
128
|
+
|
|
129
|
+
const sql = `
|
|
130
|
+
SELECT
|
|
131
|
+
COUNT(DISTINCT session_id) AS sesiones,
|
|
132
|
+
COUNT(*) AS turns,
|
|
133
|
+
SUM(input_tokens) AS input_tokens,
|
|
134
|
+
SUM(output_tokens) AS output_tokens,
|
|
135
|
+
SUM(cache_read_tokens) AS cache_read,
|
|
136
|
+
SUM(cache_creation_tokens) AS cache_creation
|
|
137
|
+
FROM turns
|
|
138
|
+
WHERE timestamp >= '${fechaDesde}'
|
|
139
|
+
`;
|
|
140
|
+
|
|
141
|
+
const [f] = await consultarSQLite(sql);
|
|
142
|
+
if (!f) return { sesiones: 0, turns: 0, input_tokens: 0, output_tokens: 0, costo_usd: 0 };
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
sesiones: f.sesiones || 0,
|
|
146
|
+
turns: f.turns || 0,
|
|
147
|
+
input_tokens: f.input_tokens || 0,
|
|
148
|
+
output_tokens: f.output_tokens || 0,
|
|
149
|
+
costo_usd: calcularCosto({
|
|
150
|
+
input: f.input_tokens,
|
|
151
|
+
output: f.output_tokens,
|
|
152
|
+
cache_read: f.cache_read,
|
|
153
|
+
cache_creation: f.cache_creation,
|
|
154
|
+
}, 'claude-sonnet-4-6'),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Obtiene métricas por nombre de agente SWL (columna agent_name).
|
|
160
|
+
* Solo disponible si la DB fue escaneada con scanner.py v5.3.3+.
|
|
161
|
+
*
|
|
162
|
+
* @param {object} opciones
|
|
163
|
+
* @param {number} [opciones.dias=30]
|
|
164
|
+
* @param {number} [opciones.topN=15]
|
|
165
|
+
* @returns {Promise<Array<{agent_name, llamadas, input_tokens, output_tokens, costo_usd}>>}
|
|
166
|
+
*/
|
|
167
|
+
async function obtenerMetricasPorAgente({ dias = 30, topN = 15 } = {}) {
|
|
168
|
+
const fechaDesde = new Date(Date.now() - dias * 86_400_000).toISOString();
|
|
169
|
+
|
|
170
|
+
const sql = `
|
|
171
|
+
SELECT
|
|
172
|
+
agent_name,
|
|
173
|
+
COUNT(*) AS llamadas,
|
|
174
|
+
SUM(input_tokens) AS input_tokens,
|
|
175
|
+
SUM(output_tokens) AS output_tokens,
|
|
176
|
+
SUM(cache_read_tokens) AS cache_read,
|
|
177
|
+
SUM(cache_creation_tokens) AS cache_creation,
|
|
178
|
+
MAX(model) AS modelo
|
|
179
|
+
FROM turns
|
|
180
|
+
WHERE agent_name IS NOT NULL
|
|
181
|
+
AND timestamp >= '${fechaDesde}'
|
|
182
|
+
GROUP BY agent_name
|
|
183
|
+
ORDER BY input_tokens + output_tokens DESC
|
|
184
|
+
LIMIT ${topN}
|
|
185
|
+
`;
|
|
186
|
+
|
|
187
|
+
const filas = await consultarSQLite(sql);
|
|
188
|
+
|
|
189
|
+
return filas.map(f => ({
|
|
190
|
+
agent_name: f.agent_name,
|
|
191
|
+
llamadas: f.llamadas,
|
|
192
|
+
input_tokens: f.input_tokens || 0,
|
|
193
|
+
output_tokens: f.output_tokens || 0,
|
|
194
|
+
costo_usd: calcularCosto({
|
|
195
|
+
input: f.input_tokens,
|
|
196
|
+
output: f.output_tokens,
|
|
197
|
+
cache_read: f.cache_read,
|
|
198
|
+
cache_creation: f.cache_creation,
|
|
199
|
+
}, f.modelo),
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Obtiene métricas por nombre de skill SWL (columna skill_name).
|
|
205
|
+
* Solo disponible si la DB fue escaneada con scanner.py v5.3.3+.
|
|
206
|
+
*
|
|
207
|
+
* @param {object} opciones
|
|
208
|
+
* @param {number} [opciones.dias=30]
|
|
209
|
+
* @param {number} [opciones.topN=15]
|
|
210
|
+
* @returns {Promise<Array<{skill_name, llamadas, input_tokens, output_tokens, costo_usd}>>}
|
|
211
|
+
*/
|
|
212
|
+
async function obtenerMetricasPorSkill({ dias = 30, topN = 15 } = {}) {
|
|
213
|
+
const fechaDesde = new Date(Date.now() - dias * 86_400_000).toISOString();
|
|
214
|
+
|
|
215
|
+
const sql = `
|
|
216
|
+
SELECT
|
|
217
|
+
skill_name,
|
|
218
|
+
COUNT(*) AS llamadas,
|
|
219
|
+
SUM(input_tokens) AS input_tokens,
|
|
220
|
+
SUM(output_tokens) AS output_tokens,
|
|
221
|
+
SUM(cache_read_tokens) AS cache_read,
|
|
222
|
+
SUM(cache_creation_tokens) AS cache_creation,
|
|
223
|
+
MAX(model) AS modelo
|
|
224
|
+
FROM turns
|
|
225
|
+
WHERE skill_name IS NOT NULL
|
|
226
|
+
AND timestamp >= '${fechaDesde}'
|
|
227
|
+
GROUP BY skill_name
|
|
228
|
+
ORDER BY input_tokens + output_tokens DESC
|
|
229
|
+
LIMIT ${topN}
|
|
230
|
+
`;
|
|
231
|
+
|
|
232
|
+
const filas = await consultarSQLite(sql);
|
|
233
|
+
|
|
234
|
+
return filas.map(f => ({
|
|
235
|
+
skill_name: f.skill_name,
|
|
236
|
+
llamadas: f.llamadas,
|
|
237
|
+
input_tokens: f.input_tokens || 0,
|
|
238
|
+
output_tokens: f.output_tokens || 0,
|
|
239
|
+
costo_usd: calcularCosto({
|
|
240
|
+
input: f.input_tokens,
|
|
241
|
+
output: f.output_tokens,
|
|
242
|
+
cache_read: f.cache_read,
|
|
243
|
+
cache_creation: f.cache_creation,
|
|
244
|
+
}, f.modelo),
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
module.exports = {
|
|
249
|
+
obtenerMetricasPorHerramienta,
|
|
250
|
+
obtenerMetricasPorAgente,
|
|
251
|
+
obtenerMetricasPorSkill,
|
|
252
|
+
obtenerResumenGlobal,
|
|
253
|
+
calcularCosto,
|
|
254
|
+
DB_PATH,
|
|
255
|
+
};
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Interfaz formal TracingProcessor para el sistema de trazabilidad SWL.
|
|
5
|
+
*
|
|
6
|
+
* Portado y adaptado desde:
|
|
7
|
+
* openai-agents-python/src/agents/tracing/processor_interface.py
|
|
8
|
+
* Patrón: Open/Closed — múltiples exportadores sin modificar el núcleo.
|
|
9
|
+
* Zero-deps. Solo módulos nativos de Node.js.
|
|
10
|
+
*
|
|
11
|
+
* Clases exportadas:
|
|
12
|
+
* - TracingProcessor — interfaz abstracta para procesadores de trazas
|
|
13
|
+
* - TracingExporter — interfaz abstracta para exportadores de spans
|
|
14
|
+
* - MultiProcessor — implementación Composite que propaga a N procesadores
|
|
15
|
+
*
|
|
16
|
+
* @module scripts/lib/tracing-processor-interface
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// TracingProcessor — interfaz base
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Interfaz abstracta para procesadores de trazas y spans del sistema SWL.
|
|
25
|
+
*
|
|
26
|
+
* Todos los exportadores de trazas (OTLP local, Langfuse, Jaeger, consola)
|
|
27
|
+
* deben extender esta clase e implementar sus seis métodos.
|
|
28
|
+
*
|
|
29
|
+
* Contrato:
|
|
30
|
+
* - Los métodos deben retornar rápido; no bloquear el flujo del agente.
|
|
31
|
+
* - Los errores internos deben capturarse; nunca propagarse al caller.
|
|
32
|
+
* - Todos los métodos son síncronos por defecto; las subclases pueden
|
|
33
|
+
* usar callbacks o colas internas para operaciones asíncronas.
|
|
34
|
+
*
|
|
35
|
+
* @abstract
|
|
36
|
+
*/
|
|
37
|
+
class TracingProcessor {
|
|
38
|
+
/**
|
|
39
|
+
* Invocado cuando inicia una nueva traza (flujo de alto nivel).
|
|
40
|
+
*
|
|
41
|
+
* @param {object} traza - Objeto de traza con al menos { traceId, nombre, inicio }.
|
|
42
|
+
* @returns {void}
|
|
43
|
+
* @abstract
|
|
44
|
+
*/
|
|
45
|
+
onTraceStart(traza) { // eslint-disable-line no-unused-vars
|
|
46
|
+
throw new Error(
|
|
47
|
+
`${this.constructor.name} debe implementar onTraceStart(traza).`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Invocado cuando finaliza una traza. Momento idóneo para exportar
|
|
53
|
+
* la traza completa con todos sus spans asociados.
|
|
54
|
+
*
|
|
55
|
+
* @param {object} traza - Objeto de traza completa con spans.
|
|
56
|
+
* @returns {void}
|
|
57
|
+
* @abstract
|
|
58
|
+
*/
|
|
59
|
+
onTraceEnd(traza) { // eslint-disable-line no-unused-vars
|
|
60
|
+
throw new Error(
|
|
61
|
+
`${this.constructor.name} debe implementar onTraceEnd(traza).`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Invocado cuando inicia un span (operación individual dentro de una traza).
|
|
67
|
+
*
|
|
68
|
+
* @param {object} span - Objeto de span con al menos { spanId, traceId, nombre, inicio }.
|
|
69
|
+
* @returns {void}
|
|
70
|
+
* @abstract
|
|
71
|
+
*/
|
|
72
|
+
onSpanStart(span) { // eslint-disable-line no-unused-vars
|
|
73
|
+
throw new Error(
|
|
74
|
+
`${this.constructor.name} debe implementar onSpanStart(span).`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Invocado cuando finaliza un span, con todos sus datos finales disponibles.
|
|
80
|
+
* Es el punto principal de exportación en la mayoría de procesadores.
|
|
81
|
+
*
|
|
82
|
+
* @param {object} span - Objeto de span completo con { spanId, traceId, nombre,
|
|
83
|
+
* inicio, fin, duracionMs, estado, atributos }.
|
|
84
|
+
* @returns {void}
|
|
85
|
+
* @abstract
|
|
86
|
+
*/
|
|
87
|
+
onSpanEnd(span) { // eslint-disable-line no-unused-vars
|
|
88
|
+
throw new Error(
|
|
89
|
+
`${this.constructor.name} debe implementar onSpanEnd(span).`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Cierra el procesador de forma limpia. Debe vaciar buffers pendientes,
|
|
95
|
+
* cerrar archivos abiertos y liberar recursos antes de retornar.
|
|
96
|
+
*
|
|
97
|
+
* @returns {void}
|
|
98
|
+
* @abstract
|
|
99
|
+
*/
|
|
100
|
+
shutdown() {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`${this.constructor.name} debe implementar shutdown().`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Fuerza el volcado inmediato de cualquier buffer o cola interna.
|
|
108
|
+
* Útil antes de un shutdown o cuando se necesita garantía de persistencia.
|
|
109
|
+
*
|
|
110
|
+
* @returns {void}
|
|
111
|
+
* @abstract
|
|
112
|
+
*/
|
|
113
|
+
forceFlush() {
|
|
114
|
+
throw new Error(
|
|
115
|
+
`${this.constructor.name} debe implementar forceFlush().`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Utilidades estáticas
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Verifica que una instancia implementa todos los métodos requeridos
|
|
125
|
+
* de la interfaz TracingProcessor.
|
|
126
|
+
*
|
|
127
|
+
* @param {any} instancia - Objeto a verificar.
|
|
128
|
+
* @returns {boolean} true si todos los métodos están implementados.
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* TracingProcessor.esProcesadorValido(new MiProcesador()) // → true
|
|
132
|
+
* TracingProcessor.esProcesadorValido({}) // → false
|
|
133
|
+
*/
|
|
134
|
+
static esProcesadorValido(instancia) {
|
|
135
|
+
if (!instancia || typeof instancia !== 'object') return false;
|
|
136
|
+
const metodosRequeridos = [
|
|
137
|
+
'onTraceStart', 'onTraceEnd',
|
|
138
|
+
'onSpanStart', 'onSpanEnd',
|
|
139
|
+
'shutdown', 'forceFlush',
|
|
140
|
+
];
|
|
141
|
+
return metodosRequeridos.every(
|
|
142
|
+
metodo => typeof instancia[metodo] === 'function'
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// TracingExporter — interfaz para exportadores de ítems
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Interfaz abstracta para exportadores de spans y trazas.
|
|
153
|
+
*
|
|
154
|
+
* Un exportador recibe un array de ítems (spans o trazas) ya finalizados
|
|
155
|
+
* y los envía a un destino: archivo, endpoint HTTP, consola, etc.
|
|
156
|
+
*
|
|
157
|
+
* A diferencia de TracingProcessor (que reacciona a eventos del ciclo de vida),
|
|
158
|
+
* TracingExporter opera en modo batch sobre ítems ya completos.
|
|
159
|
+
*
|
|
160
|
+
* @abstract
|
|
161
|
+
*/
|
|
162
|
+
class TracingExporter {
|
|
163
|
+
/**
|
|
164
|
+
* Exporta un array de spans o trazas a un destino externo.
|
|
165
|
+
*
|
|
166
|
+
* El método debe ser tolerante a fallos: si un ítem falla, el resto
|
|
167
|
+
* deben exportarse igualmente. Los errores no recuperables deben
|
|
168
|
+
* registrarse internamente, nunca propagarse al caller.
|
|
169
|
+
*
|
|
170
|
+
* @param {object[]} items - Array de spans o trazas a exportar.
|
|
171
|
+
* @returns {void}
|
|
172
|
+
* @abstract
|
|
173
|
+
*/
|
|
174
|
+
export(items) { // eslint-disable-line no-unused-vars
|
|
175
|
+
throw new Error(
|
|
176
|
+
`${this.constructor.name} debe implementar export(items).`
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// MultiProcessor — patrón Composite
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Procesador compuesto que propaga todos los eventos de ciclo de vida
|
|
187
|
+
* a una lista de procesadores hijos (patrón Composite).
|
|
188
|
+
*
|
|
189
|
+
* Características:
|
|
190
|
+
* - Aislamiento de errores: si un hijo lanza, los demás reciben el evento.
|
|
191
|
+
* - Composición dinámica: se pueden agregar/quitar procesadores en tiempo
|
|
192
|
+
* de ejecución con addProcessor / removeProcessor.
|
|
193
|
+
* - Compatible con TracingProcessor.esProcesadorValido().
|
|
194
|
+
*
|
|
195
|
+
* @extends TracingProcessor
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* const multi = new MultiProcessor([
|
|
199
|
+
* new OtlpLocalProcessor(cwd),
|
|
200
|
+
* new ConsoleSpanExporter(),
|
|
201
|
+
* ]);
|
|
202
|
+
* multi.onSpanEnd(span); // propaga a ambos
|
|
203
|
+
*/
|
|
204
|
+
class MultiProcessor extends TracingProcessor {
|
|
205
|
+
/**
|
|
206
|
+
* @param {TracingProcessor[]} [procesadores] - Lista inicial de procesadores hijos.
|
|
207
|
+
*/
|
|
208
|
+
constructor(procesadores = []) {
|
|
209
|
+
super();
|
|
210
|
+
/** @type {TracingProcessor[]} */
|
|
211
|
+
this._procesadores = [...procesadores];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Agrega un procesador hijo a la lista.
|
|
216
|
+
*
|
|
217
|
+
* @param {TracingProcessor} procesador - Instancia que implementa TracingProcessor.
|
|
218
|
+
* @throws {TypeError} Si el argumento no implementa la interfaz completa.
|
|
219
|
+
*/
|
|
220
|
+
addProcessor(procesador) {
|
|
221
|
+
if (!TracingProcessor.esProcesadorValido(procesador)) {
|
|
222
|
+
throw new TypeError(
|
|
223
|
+
'addProcessor: el argumento debe implementar la interfaz TracingProcessor completa.'
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
this._procesadores.push(procesador);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Elimina un procesador hijo de la lista (por referencia de objeto).
|
|
231
|
+
*
|
|
232
|
+
* @param {TracingProcessor} procesador - Instancia a eliminar.
|
|
233
|
+
*/
|
|
234
|
+
removeProcessor(procesador) {
|
|
235
|
+
this._procesadores = this._procesadores.filter(p => p !== procesador);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Propaga un evento a todos los hijos con aislamiento de errores.
|
|
240
|
+
*
|
|
241
|
+
* @private
|
|
242
|
+
* @param {string} metodo - Nombre del método a invocar.
|
|
243
|
+
* @param {any} arg - Argumento a pasar al método.
|
|
244
|
+
*/
|
|
245
|
+
_propagar(metodo, arg) {
|
|
246
|
+
for (const p of this._procesadores) {
|
|
247
|
+
try {
|
|
248
|
+
p[metodo](arg);
|
|
249
|
+
} catch (_) {
|
|
250
|
+
// Aislamiento: si un hijo falla, los demás deben seguir recibiendo
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** @override */
|
|
256
|
+
onTraceStart(traza) { this._propagar('onTraceStart', traza); }
|
|
257
|
+
|
|
258
|
+
/** @override */
|
|
259
|
+
onTraceEnd(traza) { this._propagar('onTraceEnd', traza); }
|
|
260
|
+
|
|
261
|
+
/** @override */
|
|
262
|
+
onSpanStart(span) { this._propagar('onSpanStart', span); }
|
|
263
|
+
|
|
264
|
+
/** @override */
|
|
265
|
+
onSpanEnd(span) { this._propagar('onSpanEnd', span); }
|
|
266
|
+
|
|
267
|
+
/** @override */
|
|
268
|
+
shutdown() {
|
|
269
|
+
for (const p of this._procesadores) {
|
|
270
|
+
try { p.shutdown(); } catch (_) {}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** @override */
|
|
275
|
+
forceFlush() {
|
|
276
|
+
for (const p of this._procesadores) {
|
|
277
|
+
try { p.forceFlush(); } catch (_) {}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
// Exports
|
|
284
|
+
// ---------------------------------------------------------------------------
|
|
285
|
+
|
|
286
|
+
module.exports = { TracingProcessor, TracingExporter, MultiProcessor };
|