{"_id":"@data_engine_labs/data_engine_sdk","_rev":"5-0298fbaddd5b20e5f30e477c92d050ad","name":"@data_engine_labs/data_engine_sdk","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@data_engine_labs/data_engine_sdk","version":"0.1.0","keywords":["playwright","testing","test-metrics","reporter","ci"],"license":"MIT","_id":"@data_engine_labs/data_engine_sdk@0.1.0","maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"dist":{"shasum":"861e2338e707c4d0172200c38811822d2308cc7b","tarball":"https://registry.npmjs.org/@data_engine_labs/data_engine_sdk/-/data_engine_sdk-0.1.0.tgz","fileCount":16,"integrity":"sha512-PnbZe5tT7vuXkjAq3lbY/wwFvHOdzMQ9e0eKIveodcVGQHFLHhBW2Jhv1x1KNp5L5NBB/ZxkKnpjL2++qvXX2A==","signatures":[{"sig":"MEUCIQC9G4318pngFL5DkVm3/ZGN9cn8Lwz+XUz9jJUbo7V9DwIgY2GUeDOTekwbDo5sbM7PNHfh77C8jfM1X4E0oZB5V3w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156001},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./playwright":{"types":"./dist/playwright/reporter.d.ts","import":"./dist/playwright/reporter.js","require":"./dist/playwright/reporter.cjs"}},"gitHead":"76863790f455202805d0e234dea800dcda77c8ae","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jonathanlopez360","email":"toribioj818@gmail.com"},"repository":{"url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git","type":"git"},"_npmVersion":"11.13.0","description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","directories":{},"sideEffects":false,"_nodeVersion":"26.1.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.3.0","ts-jest":"^29.2.5","typescript":"^5.7.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.60.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"peerDependenciesMeta":{"@playwright/test":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/data_engine_sdk_0.1.0_1783437215628_0.0642907996207458","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@data_engine_labs/data_engine_sdk","version":"0.2.0","keywords":["playwright","testing","test-metrics","reporter","ci"],"license":"MIT","_id":"@data_engine_labs/data_engine_sdk@0.2.0","maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"dist":{"shasum":"db15eeb875d728a089a6f4c0d94b5a5b0978474b","tarball":"https://registry.npmjs.org/@data_engine_labs/data_engine_sdk/-/data_engine_sdk-0.2.0.tgz","fileCount":16,"integrity":"sha512-ulYtRHAt36VmUynZIZElNK8p8yiLft43VL2Br1oZzBjWnIcqFULl6ZoZXm7dGyW39+HkDjg+z/uL+tJZd1CXww==","signatures":[{"sig":"MEUCIFFjOJV/0vBqfWzVStpzIW6iFP6mnFoRrzq1JIN14RykAiEAxzVfnLv8tSV2haw7Ug01ONeek18UjlyLDl8QW2eg+ks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202962},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./playwright":{"types":"./dist/playwright/reporter.d.ts","import":"./dist/playwright/reporter.js","require":"./dist/playwright/reporter.cjs"}},"gitHead":"debb25ee149449e62e3d77a148bb563c577a7e75","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jonathanlopez360","email":"toribioj818@gmail.com"},"repository":{"url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git","type":"git"},"_npmVersion":"11.13.0","description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","directories":{},"sideEffects":false,"_nodeVersion":"26.1.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.3.0","ts-jest":"^29.2.5","typescript":"^5.7.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.60.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"peerDependenciesMeta":{"@playwright/test":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/data_engine_sdk_0.2.0_1784060650696_0.7812323019053804","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@data_engine_labs/data_engine_sdk","version":"0.2.1","keywords":["playwright","testing","test-metrics","reporter","ci"],"license":"MIT","_id":"@data_engine_labs/data_engine_sdk@0.2.1","maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"dist":{"shasum":"5ac51d2efb7c82a5d20d35cb253268c19e04a1ec","tarball":"https://registry.npmjs.org/@data_engine_labs/data_engine_sdk/-/data_engine_sdk-0.2.1.tgz","fileCount":16,"integrity":"sha512-3+a7AAbI7PPGcnjWW4AgbeWRs9mN75Cy8gAB7zw+RP5+JHAgvZZofU90HZw/yVS0hl39jNsPINP8tcCAwIxKmg==","signatures":[{"sig":"MEQCIG2hc/wHuIgUXcgN22lPVbRI/SNrhcq2grgxXZ2SqM0IAiAi1eLun52ymMQD08Nzh8YRTXST/waEFkxNS/p+fGgQ/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301671},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./playwright":{"types":"./dist/playwright/reporter.d.ts","import":"./dist/playwright/reporter.js","require":"./dist/playwright/reporter.cjs"}},"gitHead":"b2141764132cc37d491f5ec8e4ef0e5598c7a103","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jonathanlopez360","email":"toribioj818@gmail.com"},"repository":{"url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git","type":"git"},"_npmVersion":"11.13.0","description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","directories":{},"sideEffects":false,"_nodeVersion":"26.1.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.3.0","ts-jest":"^29.2.5","typescript":"^5.7.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@playwright/test":"^1.60.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"peerDependenciesMeta":{"@playwright/test":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/data_engine_sdk_0.2.1_1785440632158_0.9925076585282351","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@data_engine_labs/data_engine_sdk","version":"0.3.0","keywords":["playwright","webdriverio","wdio-reporter","testing","test-metrics","reporter","ci"],"license":"MIT","_id":"@data_engine_labs/data_engine_sdk@0.3.0","maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"dist":{"shasum":"4e29954b4936f4a8eca51a2673e6657b21ae00ac","tarball":"https://registry.npmjs.org/@data_engine_labs/data_engine_sdk/-/data_engine_sdk-0.3.0.tgz","fileCount":22,"integrity":"sha512-9Gu+eDuHFVH9iIeF91P3zg48HLZSYN1slg9TWyZcNIn7CPjW1UuZxlCc78+PfcOYWW8GRC/+Fi2/PgZNSUqirg==","signatures":[{"sig":"MEUCIHI+e4zdERE6hHpks5V+VUsCUYM7Vq2I/MfZ9SFUFba6AiEA4SaMTbQtOtJZTNtIreLVTkkSn4+Vb9CguhhnmOMZZ2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425737},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./playwright":{"types":"./dist/playwright/reporter.d.ts","import":"./dist/playwright/reporter.js","require":"./dist/playwright/reporter.cjs"},"./webdriverio":{"types":"./dist/webdriverio/reporter.d.ts","import":"./dist/webdriverio/reporter.js","require":"./dist/webdriverio/reporter.cjs"}},"gitHead":"95a0bfa0ad1589c78d6e3a2d28c0b8a3c4f20691","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"_npmUser":{"name":"jonathanlopez360","email":"toribioj818@gmail.com"},"repository":{"url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git","type":"git"},"_npmVersion":"11.17.0","description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.3.0","ts-jest":"^29.2.5","typescript":"^5.7.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@wdio/reporter":"^9.31.2","@playwright/test":"^1.60.0"},"peerDependencies":{"@wdio/reporter":">=8.0.0 <10.0.0","@playwright/test":">=1.40.0"},"peerDependenciesMeta":{"@wdio/reporter":{"optional":true},"@playwright/test":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/data_engine_sdk_0.3.0_1787612369464_0.40105046436670544","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@data_engine_labs/data_engine_sdk","version":"0.3.1","description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","license":"MIT","keywords":["playwright","webdriverio","wdio-reporter","testing","test-metrics","reporter","ci"],"repository":{"type":"git","url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git"},"homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"type":"module","sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./playwright":{"types":"./dist/playwright/reporter.d.ts","import":"./dist/playwright/reporter.js","require":"./dist/playwright/reporter.cjs"},"./webdriverio":{"types":"./dist/webdriverio/reporter.d.ts","import":"./dist/webdriverio/reporter.js","require":"./dist/webdriverio/reporter.cjs"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"jest","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"peerDependencies":{"@playwright/test":">=1.40.0","@wdio/reporter":">=8.0.0 <10.0.0"},"peerDependenciesMeta":{"@playwright/test":{"optional":true},"@wdio/reporter":{"optional":true}},"devDependencies":{"@playwright/test":"^1.60.0","@types/jest":"^30.0.0","@types/node":"^20.0.0","@wdio/reporter":"^9.31.2","jest":"^30.2.0","ts-jest":"^29.2.5","tsup":"^8.3.0","typescript":"^5.7.0"},"engines":{"node":">=18"},"gitHead":"b59936578ee23a4452335b3f703bc0b969fb7816","_id":"@data_engine_labs/data_engine_sdk@0.3.1","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-Hsj1ScPtBiTNxbaaJgcwanM7Zds5hieQQwJu9/5lAW8K4JynPWn2/VdIX0u3Ab0KdgVL+SvAgt8yKE01cuogiA==","shasum":"d4a86f8b46ce2960684653d8506bbd572effaf37","tarball":"https://registry.npmjs.org/@data_engine_labs/data_engine_sdk/-/data_engine_sdk-0.3.1.tgz","fileCount":22,"unpackedSize":446347,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICkUbR8ldV6vkvRuvinCDsBMBB4q3eWpyYwzuX48jkprAiBr2UVVUzQlgSaJ9kZJVCHKFT08Mitm41Y35RfJld2MLQ=="}]},"_npmUser":{"name":"jonathanlopez360","email":"toribioj818@gmail.com"},"directories":{},"maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/data_engine_sdk_0.3.1_1787613414186_0.8359644884213473"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T15:13:35.484Z","modified":"2026-08-24T23:16:54.515Z","0.1.0":"2026-07-07T15:13:35.781Z","0.2.0":"2026-07-14T20:24:10.845Z","0.2.1":"2026-07-30T19:43:52.312Z","0.3.0":"2026-08-24T22:59:29.625Z","0.3.1":"2026-08-24T23:16:54.333Z"},"bugs":{"url":"https://github.com/TestMetric-AI/data_engine_sdk/issues"},"license":"MIT","homepage":"https://github.com/TestMetric-AI/data_engine_sdk#readme","keywords":["playwright","webdriverio","wdio-reporter","testing","test-metrics","reporter","ci"],"repository":{"type":"git","url":"git+https://github.com/TestMetric-AI/data_engine_sdk.git"},"description":"SDK JS/TS para capturar metricas de tests (Playwright y otros) y enviarlas al portal Data Engine.","maintainers":[{"name":"jonathanlopez360","email":"toribioj818@gmail.com"}],"readme":"# @data_engine_labs/data_engine_sdk\n\nSDK JS/TS para capturar metricas de tests y enviarlas al portal **Data Engine**. Incluye reporters para **Playwright** y **WebdriverIO**, mas una API manual para casos avanzados.\n\n## Instalacion\n\nEl paquete se publica en el **npm publico** (`registry.npmjs.org`). No requiere token ni `.npmrc`.\n\n```bash\npnpm add -D @data_engine_labs/data_engine_sdk\n# o\nnpm i -D @data_engine_labs/data_engine_sdk\n```\n\n## Uso con Playwright (recomendado)\n\nAnade el reporter a tu `playwright.config.ts`:\n\n```ts\nimport { defineConfig } from \"@playwright/test\";\n\nexport default defineConfig({\n    reporter: [\n        [\"list\"],\n        [\"@data_engine_labs/data_engine_sdk/playwright\"],\n    ],\n});\n```\n\nConfigura via variables de entorno (tipico en CI):\n\n```bash\nexport DATA_ENGINE_API_KEY=\"dek_....\"\nexport DATA_ENGINE_BASE_URL=\"https://portal.example.com\"\nexport DATA_ENGINE_ENVIRONMENT=\"staging\"\n```\n\nEl reporter detecta el contexto del pipeline (branch, commit, URL del run, quien lo dispar) automaticamente en GitHub Actions, Azure Pipelines y GitLab CI.\n\n## Uso con WebdriverIO\n\n### 1. Instala las dependencias\n\nEl reporter es compatible con WebdriverIO 8 y 9. En un proyecto WDIO existente, instala el SDK y declara `@wdio/reporter` para satisfacer el peer dependency:\n\n```bash\npnpm add -D @data_engine_labs/data_engine_sdk @wdio/reporter\n# o\nnpm i -D @data_engine_labs/data_engine_sdk @wdio/reporter\n```\n\nRequiere Node.js 18 o superior.\n\n### 2. Configura las credenciales\n\nDefine estas variables en el entorno local o, preferiblemente, como secretos del pipeline:\n\n```bash\nexport DATA_ENGINE_API_KEY=\"dek_....\"\nexport DATA_ENGINE_BASE_URL=\"https://portal.example.com\"\nexport DATA_ENGINE_ENVIRONMENT=\"staging\"\n```\n\nLas tres son obligatorias. Si falta alguna, el reporter se desactiva, muestra qué configuración falta y deja que los tests continúen.\n\n### 3. Registra el reporter\n\nAgrega el reporter a `wdio.conf.ts`. Puede convivir con `spec`, `dot` u otros reporters:\n\n```ts\nimport DataEngineReporter from \"@data_engine_labs/data_engine_sdk/webdriverio\";\n\nexport const config = {\n    // ...\n    reporters: [\n        \"spec\",\n        [DataEngineReporter, {}],\n    ],\n\n    // WDIO esperara el envio al portal antes de cerrar el proceso.\n    // 70 s cubre los timeouts y backoffs del cliente en el peor caso.\n    reporterSyncTimeout: 70_000,\n};\n```\n\nTambien puedes pasar la configuracion directamente. Esto es util para valores no sensibles; evita guardar la API key en el repositorio:\n\n```ts\n[DataEngineReporter, {\n    environment: \"staging\",\n    branch: \"release/1.4\",\n    strict: true,\n}]\n```\n\nOpciones aceptadas:\n\n| Opcion | Tipo | Equivalente en entorno |\n| --- | --- | --- |\n| `apiKey` | `string` | `DATA_ENGINE_API_KEY` |\n| `baseUrl` | `string` | `DATA_ENGINE_BASE_URL` |\n| `environment` | `string` | `DATA_ENGINE_ENVIRONMENT` |\n| `branch` | `string` | `DATA_ENGINE_BRANCH` |\n| `commitSha` | `string` | `DATA_ENGINE_COMMIT_SHA` |\n| `triggeredBy` | `string` | `DATA_ENGINE_TRIGGERED_BY` |\n| `pipelineRunUrl` | `string` | `DATA_ENGINE_PIPELINE_RUN_URL` |\n| `strict` | `boolean` | `DATA_ENGINE_STRICT` |\n| `disabled` | `boolean` | `DATA_ENGINE_DISABLE` |\n\n### 4. Ejecuta los tests\n\n```bash\nnpx wdio run ./wdio.conf.ts\n```\n\nPara inspeccionar el payload enviado durante la integracion:\n\n```bash\nDATA_ENGINE_LOG_LEVEL=debug npx wdio run ./wdio.conf.ts\n```\n\n### Que captura el reporter\n\nEl reporter funciona con los adaptadores Mocha, Jasmine y Cucumber de WDIO y captura:\n\n- nombre y suite del test;\n- estado `PASSED`, `FAILED`, `SKIPPED` o `FLAKY`;\n- duracion, numero de retries y mensaje de error;\n- branch, commit, usuario y URL del pipeline cuando el entorno CI los proporciona.\n\nWDIO emite una corrida por runner o worker; el reporter envia los resultados asociados cuando ese runner termina. Los intentos con el mismo identificador se consolidan y prevalece el resultado final. Si un test falla y luego pasa, se reporta como `FLAKY`.\n\nEl envio es fail-open por defecto: un fallo del portal se registra, pero no cambia el resultado de los tests. Usa `DATA_ENGINE_STRICT=true` o `strict: true` para hacer fallar el job si el portal no acepta la corrida.\n\n## Variables de entorno\n\n| Variable | Requerida | Uso |\n| --- | --- | --- |\n| `DATA_ENGINE_API_KEY` | si | API key `dek_...` del proyecto |\n| `DATA_ENGINE_BASE_URL` | si | URL base del portal |\n| `DATA_ENGINE_ENVIRONMENT` | si | Nombre del ambiente (staging, prod, ...) |\n| `DATA_ENGINE_BRANCH` | no | Override manual de branch |\n| `DATA_ENGINE_COMMIT_SHA` | no | Override manual de commit |\n| `DATA_ENGINE_TRIGGERED_BY` | no | Override manual de trigger |\n| `DATA_ENGINE_PIPELINE_RUN_URL` | no | Override manual de URL |\n| `DATA_ENGINE_STRICT` | no | `\"true\"` para fallar el job si el submit falla |\n| `DATA_ENGINE_DISABLE` | no | `\"true\"` para desactivar el reporter |\n| `DATA_ENGINE_LOG_LEVEL` | no | `silent` \\| `error` \\| `warn` (default) \\| `info` \\| `debug` |\n\n**Precedencia por campo:** opcion del reporter > env var > detector CI > undefined.\n\n## Uso manual (API programatica)\n\nPara frameworks no soportados nativamente, o para reportar corridas ad-hoc:\n\n```ts\nimport { createClient, detectPipeline } from \"@data_engine_labs/data_engine_sdk\";\nimport { randomUUID } from \"node:crypto\";\n\nconst client = createClient({\n    apiKey: process.env.DATA_ENGINE_API_KEY!,\n    baseUrl: process.env.DATA_ENGINE_BASE_URL!,\n});\n\nconst pipeline = detectPipeline();\n\nawait client.submitRun({\n    runId: randomUUID(),\n    framework: \"PLAYWRIGHT\",\n    environment: \"staging\",\n    branch: pipeline.branch ?? \"main\",\n    commitSha: pipeline.commitSha,\n    triggeredBy: pipeline.triggeredBy,\n    pipelineRunUrl: pipeline.pipelineRunUrl,\n    startedAt: new Date(Date.now() - 60_000).toISOString(),\n    finishedAt: new Date().toISOString(),\n    results: [\n        { name: \"sample test\", suite: \"example.spec.ts\", status: \"PASSED\", durationMs: 100, retries: 0, tags: [] },\n    ],\n});\n```\n\n## Semantica de FLAKY\n\nUn test que fallo y despues paso en un retry se reporta con `status: \"FLAKY\"` a nivel individual, pero cuenta como **PASSED** en el rollup de la corrida (`overallStatus`, `passed`). Esto permite trazabilidad de tests inestables sin marcar toda la corrida como fallida.\n\n## Fail-open por defecto\n\nSi el submit al portal falla (red, 500, timeout), la SDK loguea el diagnostico en `stderr` pero **no rompe** el CI job. Setea `DATA_ENGINE_STRICT=true` para invertir este comportamiento.\n\n## Diagnostico de fallos (`DATA_ENGINE_LOG_LEVEL`)\n\nTodas las lineas van prefijadas con `[data-engine]`. Los niveles son acumulativos:\n\n| Nivel | Que emite | Stream |\n| --- | --- | --- |\n| `silent` | nada | — |\n| `error` | el bloque de fallo del submit y el give-up final del cliente | `stderr` |\n| `warn` (default) | + un aviso por cada intento fallido y por cada key de config faltante | `stderr` |\n| `info` | + resumen del payload (`runId` + cantidad de resultados) | `stdout` |\n| `debug` | + `POST <url>` por intento y el body del payload (redactado) | `stdout` |\n\nLa API key nunca se imprime: los valores de `apiKey` y las cabeceras `authorization: Bearer ...` salen enmascarados como `[redacted]` en todos los niveles, incluido `debug`.\n\n### Como leer un fallo de submit\n\n```\n[data-engine] submit failed for run 6f1b2c3d-...-9a\n  endpoint:    POST https://portal.example.com/api/v1/test-runs\n  framework:   PLAYWRIGHT\n  environment: staging\n  results:     42\n  attempts:    1\n  status:      400\n  message:     Datos invalidos.\n  errors:      2\n    - row -1 | branch | Requerido.\n    - row 0 | status | Valor no permitido.\n  response:    {\"message\":\"Datos invalidos.\", ...}\n```\n\n- `attempts` — cuantos intentos se hicieron (el cliente reintenta solo en 5xx: 4 intentos con backoff 200/600/1800 ms). `unknown` si el error no viene del cliente HTTP.\n- `status` + `message` — lo que respondio el portal. `errors[]` lista **cada** campo rechazado, no solo el primero.\n- Un timeout se reporta como `error: DataEngineTimeoutError: request timed out after 15000ms` (distinto de un error de red/DNS, que muestra su propio nombre).\n- Si falta configuracion, `onBegin` avisa por cada key y donde buscarla:\n\n```\n[data-engine] reporter disabled — incomplete config (1 missing)\n[data-engine] missing environment — set the reporter option \"environment\" or the env var DATA_ENGINE_ENVIRONMENT\n```\n\nPara ver el detalle completo de una corrida usa `DATA_ENGINE_LOG_LEVEL=debug` al ejecutar Playwright o WebdriverIO.\n\n## Idempotencia\n\nCada corrida se envia con un `runId` unico (UUID). Si el mismo `runId` se reenvia (por ejemplo por un reintento de CI), el endpoint responde `200` con el run original en lugar de crear un duplicado. Los reintentos automaticos son seguros.\n","readmeFilename":"README.md"}