@probelabs/visor 0.1.106 → 0.1.107
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/README.md +65 -2
- package/action.yml +1 -1
- package/defaults/code-refiner.yaml +114 -0
- package/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/defaults/override.yaml +52 -0
- package/defaults/task-refinement.yaml +620 -0
- package/defaults/visor.tests.yaml +674 -0
- package/defaults/visor.yaml +482 -0
- package/dist/663.index.js +2 -3
- package/dist/80.index.js +2 -3
- package/dist/action-cli-bridge.d.ts +11 -82
- package/dist/action-cli-bridge.d.ts.map +1 -1
- package/dist/ai-review-service.d.ts +15 -0
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/check-execution-engine.d.ts +19 -331
- package/dist/check-execution-engine.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/cron-scheduler.d.ts +3 -3
- package/dist/cron-scheduler.d.ts.map +1 -1
- package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
- package/dist/defaults/code-refiner.yaml +114 -0
- package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/dist/defaults/override.yaml +52 -0
- package/dist/defaults/task-refinement.yaml +620 -0
- package/dist/defaults/visor.tests.yaml +674 -0
- package/dist/defaults/visor.yaml +482 -0
- package/dist/docs/DEPLOYMENT.md +118 -0
- package/dist/docs/GITHUB_CHECKS.md +280 -0
- package/dist/docs/NPM_USAGE.md +208 -0
- package/dist/docs/action-reference.md +19 -0
- package/dist/docs/advanced-ai.md +178 -0
- package/dist/docs/ai-configuration.md +468 -0
- package/dist/docs/author-permissions.md +610 -0
- package/dist/docs/ci-cli-mode.md +34 -0
- package/dist/docs/claude-code.md +74 -0
- package/dist/docs/command-provider.md +559 -0
- package/dist/docs/commands.md +8 -0
- package/dist/docs/configuration.md +303 -0
- package/dist/docs/custom-tools.md +424 -0
- package/dist/docs/dashboards/README.md +23 -0
- package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
- package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
- package/dist/docs/debug-visualizer-progress.md +572 -0
- package/dist/docs/debug-visualizer-rfc.md +691 -0
- package/dist/docs/debug-visualizer.md +114 -0
- package/dist/docs/debugging.md +636 -0
- package/dist/docs/default-output-schema.md +28 -0
- package/dist/docs/dependencies.md +369 -0
- package/dist/docs/dev-playbook.md +9 -0
- package/dist/docs/engine-state-machine-plan.md +333 -0
- package/dist/docs/event-driven-github-integration-rfc.md +743 -0
- package/dist/docs/event-triggers.md +292 -0
- package/dist/docs/execution-statistics-rfc.md +290 -0
- package/dist/docs/fact-validator-gap-analysis.md +178 -0
- package/dist/docs/fact-validator-implementation-plan.md +1235 -0
- package/dist/docs/fail-if.md +95 -0
- package/dist/docs/failure-conditions-implementation.md +271 -0
- package/dist/docs/failure-conditions-schema.md +173 -0
- package/dist/docs/failure-routing-rfc.md +193 -0
- package/dist/docs/failure-routing.md +507 -0
- package/dist/docs/foreach-dependency-propagation.md +473 -0
- package/dist/docs/github-ops.md +89 -0
- package/dist/docs/goto-forward-run-plan.md +113 -0
- package/dist/docs/guides/criticality-modes.md +332 -0
- package/dist/docs/guides/fault-management-and-contracts.md +738 -0
- package/dist/docs/guides/workflow-style-guide.md +224 -0
- package/dist/docs/http.md +299 -0
- package/dist/docs/human-input-provider.md +372 -0
- package/dist/docs/limits.md +64 -0
- package/dist/docs/liquid-templates.md +347 -0
- package/dist/docs/loop-routing-refactor.md +89 -0
- package/dist/docs/mcp-provider.md +557 -0
- package/dist/docs/mcp.md +124 -0
- package/dist/docs/memory.md +903 -0
- package/dist/docs/observability.md +12 -0
- package/dist/docs/output-formats.md +20 -0
- package/dist/docs/output-formatting.md +29 -0
- package/dist/docs/output-history.md +383 -0
- package/dist/docs/performance.md +6 -0
- package/dist/docs/pluggable.md +124 -0
- package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
- package/dist/docs/recipes.md +21 -0
- package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
- package/dist/docs/schema-next-pr.md +10 -0
- package/dist/docs/schema-templates.md +68 -0
- package/dist/docs/script.md +34 -0
- package/dist/docs/sdk.md +222 -0
- package/dist/docs/security.md +7 -0
- package/dist/docs/suppressions.md +89 -0
- package/dist/docs/tag-filtering.md +258 -0
- package/dist/docs/telemetry-setup.md +119 -0
- package/dist/docs/telemetry-tracing-rfc.md +275 -0
- package/dist/docs/test-framework-rfc.md +680 -0
- package/dist/docs/testing/assertions.md +85 -0
- package/dist/docs/testing/ci.md +44 -0
- package/dist/docs/testing/cli.md +41 -0
- package/dist/docs/testing/cookbook.md +172 -0
- package/dist/docs/testing/dsl-reference.md +199 -0
- package/dist/docs/testing/fixtures-and-mocks.md +91 -0
- package/dist/docs/testing/flows.md +92 -0
- package/dist/docs/testing/getting-started.md +93 -0
- package/dist/docs/testing/troubleshooting.md +55 -0
- package/dist/docs/timeouts.md +50 -0
- package/dist/docs/troubleshooting.md +7 -0
- package/dist/docs/visor-sdk-rfc.md +186 -0
- package/dist/docs/workflows.md +569 -0
- package/dist/engine/on-finish/orchestrator.d.ts +19 -0
- package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
- package/dist/engine/on-finish/utils.d.ts +44 -0
- package/dist/engine/on-finish/utils.d.ts.map +1 -0
- package/dist/event-bus/event-bus.d.ts +13 -0
- package/dist/event-bus/event-bus.d.ts.map +1 -0
- package/dist/event-bus/types.d.ts +57 -0
- package/dist/event-bus/types.d.ts.map +1 -0
- package/dist/examples/.claude/agents/code-reviewer.md +69 -0
- package/dist/examples/.mcp.json +34 -0
- package/dist/examples/CALCULATOR-SDK.md +364 -0
- package/dist/examples/README.md +384 -0
- package/dist/examples/ai-retry-fallback-config.yaml +180 -0
- package/dist/examples/ai-with-bash.yaml +126 -0
- package/dist/examples/ai-with-mcp.yaml +82 -0
- package/dist/examples/basic-human-input.yaml +15 -0
- package/dist/examples/bedrock-config.yaml +77 -0
- package/dist/examples/calculator-config.yaml +133 -0
- package/dist/examples/calculator-json-output-guide.md +311 -0
- package/dist/examples/calculator-sdk-automated.ts +340 -0
- package/dist/examples/calculator-sdk-example.ts +275 -0
- package/dist/examples/calculator-sdk-json.ts +331 -0
- package/dist/examples/calculator-sdk-real.ts +374 -0
- package/dist/examples/calculator-sdk-test.ts +148 -0
- package/dist/examples/claude-code-config.yaml +191 -0
- package/dist/examples/cron-webhook-config.yaml +215 -0
- package/dist/examples/custom-template.liquid +57 -0
- package/dist/examples/custom-tools-example.yaml +281 -0
- package/dist/examples/enhanced-config.yaml +165 -0
- package/dist/examples/environments/visor.base.yaml +92 -0
- package/dist/examples/environments/visor.dev.yaml +33 -0
- package/dist/examples/environments/visor.prod.yaml +95 -0
- package/dist/examples/environments/visor.staging.yaml +46 -0
- package/dist/examples/fact-validator.yaml +361 -0
- package/dist/examples/fail-if-simple.yaml +90 -0
- package/dist/examples/failure-conditions-advanced.yaml +136 -0
- package/dist/examples/failure-conditions-basic.yaml +48 -0
- package/dist/examples/failure-conditions-github-style.yaml +119 -0
- package/dist/examples/failure-conditions-migration.yaml +74 -0
- package/dist/examples/for-loop-example.yaml +176 -0
- package/dist/examples/forEach-example.yaml +120 -0
- package/dist/examples/github-workflow-with-tags.yml +163 -0
- package/dist/examples/http-integration-config.yaml +240 -0
- package/dist/examples/https-server-config.yaml +209 -0
- package/dist/examples/human-input-example.yaml +63 -0
- package/dist/examples/if-conditions.yaml +173 -0
- package/dist/examples/jira-simple-example.yaml +56 -0
- package/dist/examples/jira-single-issue-workflow.yaml +166 -0
- package/dist/examples/jira-workflow-mcp.yaml +182 -0
- package/dist/examples/mcp/analyzer.py +119 -0
- package/dist/examples/mcp-provider-example.yaml +301 -0
- package/dist/examples/memory-counter.yaml +99 -0
- package/dist/examples/memory-error-collection.yaml +104 -0
- package/dist/examples/memory-exec-js.yaml +247 -0
- package/dist/examples/memory-namespace-isolation.yaml +184 -0
- package/dist/examples/memory-retry-counter.yaml +65 -0
- package/dist/examples/memory-state-machine.yaml +170 -0
- package/dist/examples/outputs-raw-basic.yaml +26 -0
- package/dist/examples/project-with-tools.yaml +174 -0
- package/dist/examples/prompts/architecture-analysis.liquid +116 -0
- package/dist/examples/prompts/security-comprehensive.liquid +107 -0
- package/dist/examples/quick-start-tags.yaml +53 -0
- package/dist/examples/routing-basic.yaml +35 -0
- package/dist/examples/routing-dynamic-js.yaml +46 -0
- package/dist/examples/routing-foreach.yaml +34 -0
- package/dist/examples/routing-goto-event.yaml +34 -0
- package/dist/examples/routing-on-success.yaml +25 -0
- package/dist/examples/run-calculator-demo.sh +71 -0
- package/dist/examples/sdk-basic.mjs +10 -0
- package/dist/examples/sdk-cjs.cjs +10 -0
- package/dist/examples/sdk-comprehensive.mjs +175 -0
- package/dist/examples/sdk-manual-config.mjs +65 -0
- package/dist/examples/sdk-typescript.js +81 -0
- package/dist/examples/sdk-typescript.ts +92 -0
- package/dist/examples/session-reuse-config.yaml +151 -0
- package/dist/examples/templates/security-report.liquid +137 -0
- package/dist/examples/tools-library.yaml +281 -0
- package/dist/examples/transform-example.yaml +199 -0
- package/dist/examples/visor-with-tags.yaml +198 -0
- package/dist/examples/webhook-pipeline-config.yaml +218 -0
- package/dist/examples/workflows/calculator-workflow.yaml +163 -0
- package/dist/examples/workflows/code-quality.yaml +222 -0
- package/dist/examples/workflows/quick-pr-check.yaml +90 -0
- package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
- package/dist/failure-condition-evaluator.d.ts +1 -0
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/frontends/github-frontend.d.ts +38 -0
- package/dist/frontends/github-frontend.d.ts.map +1 -0
- package/dist/frontends/host.d.ts +43 -0
- package/dist/frontends/host.d.ts.map +1 -0
- package/dist/frontends/ndjson-sink.d.ts +12 -0
- package/dist/frontends/ndjson-sink.d.ts.map +1 -0
- package/dist/generated/config-schema.d.ts +564 -22
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +612 -24
- package/dist/github-check-service.d.ts +4 -6
- package/dist/github-check-service.d.ts.map +1 -1
- package/dist/github-comments.d.ts +0 -4
- package/dist/github-comments.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70335 -62514
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/memory-store.d.ts +6 -0
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/output/assistant-json/template.liquid +0 -0
- package/dist/output/traces/run-2025-11-21T11-50-46-505Z.ndjson +138 -0
- package/dist/output/traces/run-2025-11-21T11-51-33-674Z.ndjson +839 -0
- package/dist/output-formatters.d.ts +1 -1
- package/dist/output-formatters.d.ts.map +1 -1
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/check-provider-registry.d.ts +6 -0
- package/dist/providers/check-provider-registry.d.ts.map +1 -1
- package/dist/providers/check-provider.interface.d.ts +34 -1
- package/dist/providers/check-provider.interface.d.ts.map +1 -1
- package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts +61 -0
- package/dist/providers/custom-tool-executor.d.ts.map +1 -0
- package/dist/providers/github-ops-provider.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts +1 -4
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/human-input-check-provider.d.ts +3 -0
- package/dist/providers/human-input-check-provider.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/log-check-provider.d.ts +2 -5
- package/dist/providers/log-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts +9 -3
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/memory-check-provider.d.ts +2 -8
- package/dist/providers/memory-check-provider.d.ts.map +1 -1
- package/dist/providers/script-check-provider.d.ts +25 -0
- package/dist/providers/script-check-provider.d.ts.map +1 -0
- package/dist/providers/workflow-check-provider.d.ts +56 -0
- package/dist/providers/workflow-check-provider.d.ts.map +1 -0
- package/dist/reviewer.d.ts +2 -1
- package/dist/reviewer.d.ts.map +1 -1
- package/dist/sdk/chunk-37ZSCMFC.mjs +482 -0
- package/dist/sdk/chunk-37ZSCMFC.mjs.map +1 -0
- package/dist/sdk/chunk-6Y4YTKCF.mjs +197 -0
- package/dist/sdk/chunk-6Y4YTKCF.mjs.map +1 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
- package/dist/sdk/chunk-IEO6CFLG.mjs +1215 -0
- package/dist/sdk/chunk-IEO6CFLG.mjs.map +1 -0
- package/dist/sdk/chunk-JEHPDJIF.mjs +223 -0
- package/dist/sdk/chunk-JEHPDJIF.mjs.map +1 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
- package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-OOZITMRU.mjs} +1 -1
- package/dist/sdk/chunk-OOZITMRU.mjs.map +1 -0
- package/dist/sdk/chunk-OWUVOILT.mjs +557 -0
- package/dist/sdk/chunk-OWUVOILT.mjs.map +1 -0
- package/dist/sdk/chunk-OZJ263FM.mjs +986 -0
- package/dist/sdk/chunk-OZJ263FM.mjs.map +1 -0
- package/dist/sdk/chunk-PTL3K3PN.mjs +3128 -0
- package/dist/sdk/chunk-PTL3K3PN.mjs.map +1 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
- package/dist/sdk/chunk-VMPLF6FT.mjs +127 -0
- package/dist/sdk/chunk-VMPLF6FT.mjs.map +1 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
- package/dist/sdk/config-M4ZNO6NU.mjs +14 -0
- package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
- package/dist/sdk/failure-condition-evaluator-NBO5YRXW.mjs +16 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
- package/dist/sdk/github-frontend-4AWRJT7D.mjs +1242 -0
- package/dist/sdk/github-frontend-4AWRJT7D.mjs.map +1 -0
- package/dist/sdk/host-7GBC3S7L.mjs +49 -0
- package/dist/sdk/host-7GBC3S7L.mjs.map +1 -0
- package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-C7EG3YKH.mjs} +7 -2
- package/dist/sdk/memory-store-GJACZC2A.mjs +11 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
- package/dist/sdk/renderer-schema-6RF26VUS.mjs +50 -0
- package/dist/sdk/renderer-schema-6RF26VUS.mjs.map +1 -0
- package/dist/sdk/routing-RP56JTV2.mjs +23 -0
- package/dist/sdk/routing-RP56JTV2.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +326 -21
- package/dist/sdk/sdk.d.ts +326 -21
- package/dist/sdk/sdk.js +21403 -16366
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +13510 -2096
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/session-registry-N5FFYFTM.mjs +10 -0
- package/dist/sdk/session-registry-N5FFYFTM.mjs.map +1 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
- package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-WP4X46IF.mjs} +2 -2
- package/dist/sdk/tracer-init-WP4X46IF.mjs.map +1 -0
- package/dist/sdk/workflow-registry-2YIIXQCK.mjs +11 -0
- package/dist/sdk/workflow-registry-2YIIXQCK.mjs.map +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/snapshot-store.d.ts +59 -0
- package/dist/snapshot-store.d.ts.map +1 -0
- package/dist/state-machine/context/build-engine-context.d.ts +9 -0
- package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
- package/dist/state-machine/execution/summary.d.ts +8 -0
- package/dist/state-machine/execution/summary.d.ts.map +1 -0
- package/dist/state-machine/runner.d.ts +73 -0
- package/dist/state-machine/runner.d.ts.map +1 -0
- package/dist/state-machine/states/check-running.d.ts +14 -0
- package/dist/state-machine/states/check-running.d.ts.map +1 -0
- package/dist/state-machine/states/completed.d.ts +12 -0
- package/dist/state-machine/states/completed.d.ts.map +1 -0
- package/dist/state-machine/states/error.d.ts +11 -0
- package/dist/state-machine/states/error.d.ts.map +1 -0
- package/dist/state-machine/states/init.d.ts +11 -0
- package/dist/state-machine/states/init.d.ts.map +1 -0
- package/dist/state-machine/states/level-dispatch.d.ts +17 -0
- package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
- package/dist/state-machine/states/plan-ready.d.ts +12 -0
- package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
- package/dist/state-machine/states/routing.d.ts +52 -0
- package/dist/state-machine/states/routing.d.ts.map +1 -0
- package/dist/state-machine/states/wave-planning.d.ts +14 -0
- package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
- package/dist/state-machine/workflow-projection.d.ts +47 -0
- package/dist/state-machine/workflow-projection.d.ts.map +1 -0
- package/dist/state-machine-execution-engine.d.ts +147 -0
- package/dist/state-machine-execution-engine.d.ts.map +1 -0
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/test-runner/assertions.d.ts +59 -0
- package/dist/test-runner/assertions.d.ts.map +1 -0
- package/dist/test-runner/core/environment.d.ts +8 -0
- package/dist/test-runner/core/environment.d.ts.map +1 -0
- package/dist/test-runner/core/fixture.d.ts +3 -0
- package/dist/test-runner/core/fixture.d.ts.map +1 -0
- package/dist/test-runner/core/flow-stage.d.ts +32 -0
- package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
- package/dist/test-runner/core/mocks.d.ts +8 -0
- package/dist/test-runner/core/mocks.d.ts.map +1 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
- package/dist/test-runner/evaluators.d.ts +12 -0
- package/dist/test-runner/evaluators.d.ts.map +1 -0
- package/dist/test-runner/fixture-loader.d.ts +30 -0
- package/dist/test-runner/fixture-loader.d.ts.map +1 -0
- package/dist/test-runner/index.d.ts +120 -0
- package/dist/test-runner/index.d.ts.map +1 -0
- package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
- package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
- package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
- package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
- package/dist/test-runner/utils/selectors.d.ts +2 -0
- package/dist/test-runner/utils/selectors.d.ts.map +1 -0
- package/dist/test-runner/validator.d.ts +8 -0
- package/dist/test-runner/validator.d.ts.map +1 -0
- package/dist/traces/run-2025-11-21T11-50-46-505Z.ndjson +138 -0
- package/dist/traces/run-2025-11-21T11-51-33-674Z.ndjson +839 -0
- package/dist/types/cli.d.ts +4 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +278 -5
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts +172 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/types/execution.d.ts +73 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/github.d.ts +51 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/workflow.d.ts +237 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/utils/command-executor.d.ts +43 -0
- package/dist/utils/command-executor.d.ts.map +1 -0
- package/dist/utils/comment-metadata.d.ts +21 -0
- package/dist/utils/comment-metadata.d.ts.map +1 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-merger.d.ts.map +1 -1
- package/dist/utils/env-exposure.d.ts +3 -0
- package/dist/utils/env-exposure.d.ts.map +1 -0
- package/dist/utils/file-exclusion.d.ts.map +1 -1
- package/dist/utils/interactive-prompt.d.ts +1 -1
- package/dist/utils/interactive-prompt.d.ts.map +1 -1
- package/dist/utils/sandbox.d.ts.map +1 -1
- package/dist/utils/script-memory-ops.d.ts +21 -0
- package/dist/utils/script-memory-ops.d.ts.map +1 -0
- package/dist/utils/template-context.d.ts +7 -0
- package/dist/utils/template-context.d.ts.map +1 -0
- package/dist/webhook-server.d.ts +3 -3
- package/dist/webhook-server.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts +81 -0
- package/dist/workflow-executor.d.ts.map +1 -0
- package/dist/workflow-registry.d.ts +79 -0
- package/dist/workflow-registry.d.ts.map +1 -0
- package/package.json +10 -5
- package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
- package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
- package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
- package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
- package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
- package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
- package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
- package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
- package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
- package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
- package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
- package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
- package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
- package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
- package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
- package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
- package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
- package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
- package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
- package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → config-M4ZNO6NU.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → failure-condition-evaluator-NBO5YRXW.mjs.map} +0 -0
- /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → liquid-extensions-C7EG3YKH.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → memory-store-GJACZC2A.mjs.map} +0 -0
- /package/dist/sdk/{tracer-init-WC75N5NW.mjs.map → metrics-7PP3EJUH.mjs.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/tracer-init.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Safely initialize a tracer for ProbeAgent with proper path sanitization\n * Uses SimpleTelemetry for lightweight tracing\n * This prevents path traversal vulnerabilities by sanitizing the checkName\n */\ntype ProbeModule =\n | {\n SimpleTelemetry?: new (opts: {\n enableFile: boolean;\n filePath: string;\n enableConsole?: boolean;\n }) => unknown;\n SimpleAppTracer?: new (telemetry: unknown, sessionId: string) => unknown;\n }\n | undefined;\n\nexport async function initializeTracer(\n sessionId: string,\n checkName?: string\n): Promise<{ tracer: unknown; telemetryConfig: unknown; filePath: string } | null> {\n try {\n // Load Probe lib in a way that works in both ESM and CJS bundles\n let ProbeLib: ProbeModule;\n try {\n ProbeLib = (await import('@probelabs/probe')) as ProbeModule;\n } catch {\n try {\n // Fallback to CJS require if available\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n ProbeLib = require('@probelabs/probe') as ProbeModule;\n } catch {\n ProbeLib = {} as unknown as ProbeModule;\n }\n }\n\n // Use SimpleTelemetry (probe no longer exports full OpenTelemetry classes)\n const SimpleTelemetry = ProbeLib?.SimpleTelemetry;\n const SimpleAppTracer = ProbeLib?.SimpleAppTracer;\n if (SimpleTelemetry && SimpleAppTracer) {\n // SECURITY: Sanitize checkName to prevent path traversal attacks\n const sanitizedCheckName = checkName ? path.basename(checkName) : 'check';\n\n // Create trace file path in debug-artifacts directory\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const traceDir = process.env.GITHUB_WORKSPACE\n ? path.join(process.env.GITHUB_WORKSPACE, 'debug-artifacts')\n : path.join(process.cwd(), 'debug-artifacts');\n\n // Create traces directory if it doesn't exist\n if (!fs.existsSync(traceDir)) {\n fs.mkdirSync(traceDir, { recursive: true });\n }\n\n // SECURITY: Use path.join to safely construct the path\n const traceFilePath = path.join(traceDir, `trace-${sanitizedCheckName}-${timestamp}.jsonl`);\n\n // SECURITY: Verify the resolved path is within the intended directory\n const resolvedTracePath = path.resolve(traceFilePath);\n const resolvedTraceDir = path.resolve(traceDir);\n if (!resolvedTracePath.startsWith(resolvedTraceDir)) {\n console.error(\n `⚠️ Security: Attempted path traversal detected. Check name: ${checkName}, resolved path: ${resolvedTracePath}`\n );\n return null;\n }\n\n // Initialize simple telemetry\n const telemetry = new SimpleTelemetry({\n enableFile: true,\n filePath: traceFilePath,\n enableConsole: false,\n });\n\n const tracer = new SimpleAppTracer(telemetry, sessionId);\n\n console.error(`📊 Simple tracing enabled, will save to: ${traceFilePath}`);\n\n // If in GitHub Actions, log the path for artifact upload\n if (process.env.GITHUB_ACTIONS) {\n console.log(`::notice title=AI Trace::Trace will be saved to ${traceFilePath}`);\n console.log(`::set-output name=trace-path::${traceFilePath}`);\n }\n\n // Return with SimpleTelemetry\n return {\n tracer,\n telemetryConfig: telemetry,\n filePath: traceFilePath,\n };\n }\n\n console.error('⚠️ Telemetry classes not available in ProbeAgent, skipping tracing');\n return null;\n } catch (error) {\n console.error('⚠️ Warning: Failed to initialize tracing:', error);\n return null;\n }\n}\n"],"mappings":";;;;;;AAAA,YAAY,UAAU;AACtB,YAAY,QAAQ;AAkBpB,eAAsB,iBACpB,WACA,WACiF;AACjF,MAAI;AAEF,QAAI;AACJ,QAAI;AACF,iBAAY,MAAM,OAAO,kBAAkB;AAAA,IAC7C,QAAQ;AACN,UAAI;AAGF,mBAAW,UAAQ,kBAAkB;AAAA,MACvC,QAAQ;AACN,mBAAW,CAAC;AAAA,MACd;AAAA,IACF;AAGA,UAAM,kBAAkB,UAAU;AAClC,UAAM,kBAAkB,UAAU;AAClC,QAAI,mBAAmB,iBAAiB;AAEtC,YAAM,qBAAqB,YAAiB,cAAS,SAAS,IAAI;AAGlE,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,YAAM,WAAW,QAAQ,IAAI,mBACpB,UAAK,QAAQ,IAAI,kBAAkB,iBAAiB,IACpD,UAAK,QAAQ,IAAI,GAAG,iBAAiB;AAG9C,UAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,QAAG,aAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MAC5C;AAGA,YAAM,gBAAqB,UAAK,UAAU,SAAS,kBAAkB,IAAI,SAAS,QAAQ;AAG1F,YAAM,oBAAyB,aAAQ,aAAa;AACpD,YAAM,mBAAwB,aAAQ,QAAQ;AAC9C,UAAI,CAAC,kBAAkB,WAAW,gBAAgB,GAAG;AACnD,gBAAQ;AAAA,UACN,yEAA+D,SAAS,oBAAoB,iBAAiB;AAAA,QAC/G;AACA,eAAO;AAAA,MACT;AAGA,YAAM,YAAY,IAAI,gBAAgB;AAAA,QACpC,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,SAAS,IAAI,gBAAgB,WAAW,SAAS;AAEvD,cAAQ,MAAM,mDAA4C,aAAa,EAAE;AAGzE,UAAI,QAAQ,IAAI,gBAAgB;AAC9B,gBAAQ,IAAI,mDAAmD,aAAa,EAAE;AAC9E,gBAAQ,IAAI,iCAAiC,aAAa,EAAE;AAAA,MAC9D;AAGA,aAAO;AAAA,QACL;AAAA,QACA,iBAAiB;AAAA,QACjB,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,YAAQ,MAAM,8EAAoE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,uDAA6C,KAAK;AAChE,WAAO;AAAA,EACT;AACF;AApGA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
// src/utils/config-merger.ts
|
|
2
|
-
var ConfigMerger = class {
|
|
3
|
-
/**
|
|
4
|
-
* Merge two configurations with child overriding parent
|
|
5
|
-
* @param parent - Base configuration
|
|
6
|
-
* @param child - Configuration to merge on top
|
|
7
|
-
* @returns Merged configuration
|
|
8
|
-
*/
|
|
9
|
-
merge(parent, child) {
|
|
10
|
-
const result = this.deepCopy(parent);
|
|
11
|
-
if (child.version !== void 0) result.version = child.version;
|
|
12
|
-
if (child.ai_model !== void 0) result.ai_model = child.ai_model;
|
|
13
|
-
if (child.ai_provider !== void 0) result.ai_provider = child.ai_provider;
|
|
14
|
-
if (child.max_parallelism !== void 0) result.max_parallelism = child.max_parallelism;
|
|
15
|
-
if (child.fail_fast !== void 0) result.fail_fast = child.fail_fast;
|
|
16
|
-
if (child.fail_if !== void 0) result.fail_if = child.fail_if;
|
|
17
|
-
if (child.failure_conditions !== void 0)
|
|
18
|
-
result.failure_conditions = child.failure_conditions;
|
|
19
|
-
if (child.env) {
|
|
20
|
-
result.env = this.mergeObjects(parent.env || {}, child.env);
|
|
21
|
-
}
|
|
22
|
-
if (child.output) {
|
|
23
|
-
result.output = this.mergeOutputConfig(parent.output, child.output);
|
|
24
|
-
}
|
|
25
|
-
if (child.checks) {
|
|
26
|
-
result.checks = this.mergeChecks(parent.checks || {}, child.checks);
|
|
27
|
-
}
|
|
28
|
-
return result;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Deep copy an object
|
|
32
|
-
*/
|
|
33
|
-
deepCopy(obj) {
|
|
34
|
-
if (obj === null || obj === void 0) {
|
|
35
|
-
return obj;
|
|
36
|
-
}
|
|
37
|
-
if (obj instanceof Date) {
|
|
38
|
-
return new Date(obj.getTime());
|
|
39
|
-
}
|
|
40
|
-
if (obj instanceof Array) {
|
|
41
|
-
const copy = [];
|
|
42
|
-
for (const item of obj) {
|
|
43
|
-
copy.push(this.deepCopy(item));
|
|
44
|
-
}
|
|
45
|
-
return copy;
|
|
46
|
-
}
|
|
47
|
-
if (obj instanceof Object) {
|
|
48
|
-
const copy = {};
|
|
49
|
-
for (const key in obj) {
|
|
50
|
-
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
51
|
-
copy[key] = this.deepCopy(obj[key]);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return copy;
|
|
55
|
-
}
|
|
56
|
-
return obj;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Merge two objects (child overrides parent)
|
|
60
|
-
*/
|
|
61
|
-
mergeObjects(parent, child) {
|
|
62
|
-
const result = { ...parent };
|
|
63
|
-
for (const key in child) {
|
|
64
|
-
if (Object.prototype.hasOwnProperty.call(child, key)) {
|
|
65
|
-
const parentValue = parent[key];
|
|
66
|
-
const childValue = child[key];
|
|
67
|
-
if (childValue === null || childValue === void 0) {
|
|
68
|
-
delete result[key];
|
|
69
|
-
} else if (typeof parentValue === "object" && typeof childValue === "object" && !Array.isArray(parentValue) && !Array.isArray(childValue) && parentValue !== null && childValue !== null) {
|
|
70
|
-
result[key] = this.mergeObjects(
|
|
71
|
-
parentValue,
|
|
72
|
-
childValue
|
|
73
|
-
);
|
|
74
|
-
} else {
|
|
75
|
-
result[key] = this.deepCopy(childValue);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Merge output configurations
|
|
83
|
-
*/
|
|
84
|
-
mergeOutputConfig(parent, child) {
|
|
85
|
-
if (!child) return parent;
|
|
86
|
-
if (!parent) return child;
|
|
87
|
-
const result = this.deepCopy(parent);
|
|
88
|
-
if (child.pr_comment) {
|
|
89
|
-
result.pr_comment = this.mergeObjects(
|
|
90
|
-
parent.pr_comment || {},
|
|
91
|
-
child.pr_comment
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (child.file_comment !== void 0) {
|
|
95
|
-
if (child.file_comment === null) {
|
|
96
|
-
delete result.file_comment;
|
|
97
|
-
} else {
|
|
98
|
-
result.file_comment = this.mergeObjects(
|
|
99
|
-
parent.file_comment || {},
|
|
100
|
-
child.file_comment
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (child.github_checks !== void 0) {
|
|
105
|
-
if (child.github_checks === null) {
|
|
106
|
-
delete result.github_checks;
|
|
107
|
-
} else {
|
|
108
|
-
result.github_checks = this.mergeObjects(
|
|
109
|
-
parent.github_checks || {},
|
|
110
|
-
child.github_checks
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Merge check configurations with special handling
|
|
118
|
-
*/
|
|
119
|
-
mergeChecks(parent, child) {
|
|
120
|
-
const result = {};
|
|
121
|
-
for (const [checkName, checkConfig] of Object.entries(parent)) {
|
|
122
|
-
result[checkName] = this.deepCopy(checkConfig);
|
|
123
|
-
}
|
|
124
|
-
for (const [checkName, childConfig] of Object.entries(child)) {
|
|
125
|
-
const parentConfig = parent[checkName];
|
|
126
|
-
if (!parentConfig) {
|
|
127
|
-
const copiedConfig = this.deepCopy(childConfig);
|
|
128
|
-
if (!copiedConfig.type) {
|
|
129
|
-
copiedConfig.type = "ai";
|
|
130
|
-
}
|
|
131
|
-
if (!copiedConfig.on) {
|
|
132
|
-
copiedConfig.on = ["manual"];
|
|
133
|
-
}
|
|
134
|
-
if (copiedConfig.appendPrompt !== void 0) {
|
|
135
|
-
if (!copiedConfig.prompt) {
|
|
136
|
-
copiedConfig.prompt = copiedConfig.appendPrompt;
|
|
137
|
-
} else {
|
|
138
|
-
copiedConfig.prompt = copiedConfig.prompt + "\n\n" + copiedConfig.appendPrompt;
|
|
139
|
-
}
|
|
140
|
-
delete copiedConfig.appendPrompt;
|
|
141
|
-
}
|
|
142
|
-
result[checkName] = copiedConfig;
|
|
143
|
-
} else {
|
|
144
|
-
result[checkName] = this.mergeCheckConfig(parentConfig, childConfig);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Merge individual check configurations
|
|
151
|
-
*/
|
|
152
|
-
mergeCheckConfig(parent, child) {
|
|
153
|
-
const result = this.deepCopy(parent);
|
|
154
|
-
if (child.type !== void 0) result.type = child.type;
|
|
155
|
-
if (!result.type) {
|
|
156
|
-
result.type = "ai";
|
|
157
|
-
}
|
|
158
|
-
if (child.prompt !== void 0) result.prompt = child.prompt;
|
|
159
|
-
if (child.appendPrompt !== void 0) {
|
|
160
|
-
if (result.prompt) {
|
|
161
|
-
result.prompt = result.prompt + "\n\n" + child.appendPrompt;
|
|
162
|
-
} else {
|
|
163
|
-
result.prompt = child.appendPrompt;
|
|
164
|
-
}
|
|
165
|
-
delete result.appendPrompt;
|
|
166
|
-
}
|
|
167
|
-
if (child.exec !== void 0) result.exec = child.exec;
|
|
168
|
-
if (child.stdin !== void 0) result.stdin = child.stdin;
|
|
169
|
-
if (child.url !== void 0) result.url = child.url;
|
|
170
|
-
if (child.focus !== void 0) result.focus = child.focus;
|
|
171
|
-
if (child.command !== void 0) result.command = child.command;
|
|
172
|
-
if (child.ai_model !== void 0) result.ai_model = child.ai_model;
|
|
173
|
-
if (child.ai_provider !== void 0) result.ai_provider = child.ai_provider;
|
|
174
|
-
if (child.group !== void 0) result.group = child.group;
|
|
175
|
-
if (child.schema !== void 0) result.schema = child.schema;
|
|
176
|
-
if (child.if !== void 0) result.if = child.if;
|
|
177
|
-
if (child.reuse_ai_session !== void 0) result.reuse_ai_session = child.reuse_ai_session;
|
|
178
|
-
if (child.fail_if !== void 0) result.fail_if = child.fail_if;
|
|
179
|
-
if (child.failure_conditions !== void 0)
|
|
180
|
-
result.failure_conditions = child.failure_conditions;
|
|
181
|
-
if (child.on !== void 0) {
|
|
182
|
-
if (Array.isArray(child.on) && child.on.length === 0) {
|
|
183
|
-
result.on = [];
|
|
184
|
-
} else {
|
|
185
|
-
result.on = [...child.on];
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (!result.on) {
|
|
189
|
-
result.on = ["manual"];
|
|
190
|
-
}
|
|
191
|
-
if (child.triggers !== void 0) {
|
|
192
|
-
result.triggers = child.triggers ? [...child.triggers] : void 0;
|
|
193
|
-
}
|
|
194
|
-
if (child.depends_on !== void 0) {
|
|
195
|
-
result.depends_on = child.depends_on ? [...child.depends_on] : void 0;
|
|
196
|
-
}
|
|
197
|
-
if (child.env) {
|
|
198
|
-
result.env = this.mergeObjects(
|
|
199
|
-
parent.env || {},
|
|
200
|
-
child.env
|
|
201
|
-
);
|
|
202
|
-
}
|
|
203
|
-
if (child.ai) {
|
|
204
|
-
result.ai = this.mergeObjects(
|
|
205
|
-
parent.ai || {},
|
|
206
|
-
child.ai
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
if (child.template) {
|
|
210
|
-
result.template = this.mergeObjects(
|
|
211
|
-
parent.template || {},
|
|
212
|
-
child.template
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
return result;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Check if a check is disabled (has empty 'on' array)
|
|
219
|
-
*/
|
|
220
|
-
isCheckDisabled(check) {
|
|
221
|
-
return Array.isArray(check.on) && check.on.length === 0;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Remove disabled checks from the configuration
|
|
225
|
-
*/
|
|
226
|
-
removeDisabledChecks(config) {
|
|
227
|
-
if (!config.checks) return config;
|
|
228
|
-
const result = this.deepCopy(config);
|
|
229
|
-
const enabledChecks = {};
|
|
230
|
-
for (const [checkName, checkConfig] of Object.entries(result.checks)) {
|
|
231
|
-
if (!this.isCheckDisabled(checkConfig)) {
|
|
232
|
-
enabledChecks[checkName] = checkConfig;
|
|
233
|
-
} else {
|
|
234
|
-
console.log(`\u2139\uFE0F Check '${checkName}' is disabled (empty 'on' array)`);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
result.checks = enabledChecks;
|
|
238
|
-
return result;
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
export {
|
|
243
|
-
ConfigMerger
|
|
244
|
-
};
|
|
245
|
-
//# sourceMappingURL=chunk-U5D2LY66.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/config-merger.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { VisorConfig, CheckConfig } from '../types/config';\n\n/**\n * Utility class for merging Visor configurations with proper override semantics\n */\nexport class ConfigMerger {\n /**\n * Merge two configurations with child overriding parent\n * @param parent - Base configuration\n * @param child - Configuration to merge on top\n * @returns Merged configuration\n */\n public merge(parent: Partial<VisorConfig>, child: Partial<VisorConfig>): Partial<VisorConfig> {\n // Start with a deep copy of parent\n const result: Partial<VisorConfig> = this.deepCopy(parent);\n\n // Merge simple properties (child overrides parent)\n if (child.version !== undefined) result.version = child.version;\n if (child.ai_model !== undefined) result.ai_model = child.ai_model;\n if (child.ai_provider !== undefined) result.ai_provider = child.ai_provider;\n if (child.max_parallelism !== undefined) result.max_parallelism = child.max_parallelism;\n if (child.fail_fast !== undefined) result.fail_fast = child.fail_fast;\n if (child.fail_if !== undefined) result.fail_if = child.fail_if;\n if (child.failure_conditions !== undefined)\n result.failure_conditions = child.failure_conditions;\n\n // Merge environment variables (deep merge)\n if (child.env) {\n result.env = this.mergeObjects(parent.env || {}, child.env);\n }\n\n // Merge output configuration (deep merge)\n if (child.output) {\n result.output = this.mergeOutputConfig(parent.output, child.output);\n }\n\n // Merge checks (special handling)\n if (child.checks) {\n result.checks = this.mergeChecks(parent.checks || {}, child.checks);\n }\n\n // Note: extends should not be in the final merged config\n // It's only used during the loading process\n\n return result;\n }\n\n /**\n * Deep copy an object\n */\n private deepCopy<T>(obj: T): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n if (obj instanceof Array) {\n const copy: unknown[] = [];\n for (const item of obj) {\n copy.push(this.deepCopy(item));\n }\n return copy as unknown as T;\n }\n if (obj instanceof Object) {\n const copy = {} as Record<string, unknown>;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n copy[key] = this.deepCopy((obj as any)[key]);\n }\n }\n return copy as T;\n }\n return obj;\n }\n\n /**\n * Merge two objects (child overrides parent)\n */\n private mergeObjects<T extends Record<string, any>>(parent: T, child: T): T {\n const result: any = { ...parent };\n\n for (const key in child) {\n if (Object.prototype.hasOwnProperty.call(child, key)) {\n const parentValue = parent[key];\n const childValue = child[key];\n\n if (childValue === null || childValue === undefined) {\n // null/undefined in child removes the key\n delete result[key];\n } else if (\n typeof parentValue === 'object' &&\n typeof childValue === 'object' &&\n !Array.isArray(parentValue) &&\n !Array.isArray(childValue) &&\n parentValue !== null &&\n childValue !== null\n ) {\n // Deep merge objects\n result[key] = this.mergeObjects(\n parentValue as Record<string, any>,\n childValue as Record<string, any>\n );\n } else {\n // Child overrides parent (including arrays)\n result[key] = this.deepCopy(childValue);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Merge output configurations\n */\n private mergeOutputConfig(\n parent?: Partial<VisorConfig>['output'],\n child?: Partial<VisorConfig>['output']\n ): Partial<VisorConfig>['output'] {\n if (!child) return parent;\n if (!parent) return child;\n\n const result: any = this.deepCopy(parent);\n\n // Merge pr_comment\n if (child.pr_comment) {\n result.pr_comment = this.mergeObjects(\n (parent.pr_comment || {}) as Record<string, any>,\n child.pr_comment as Record<string, any>\n ) as any;\n }\n\n // Merge file_comment\n if (child.file_comment !== undefined) {\n if (child.file_comment === null) {\n delete result.file_comment;\n } else {\n result.file_comment = this.mergeObjects(\n (parent.file_comment || {}) as Record<string, any>,\n child.file_comment as Record<string, any>\n ) as any;\n }\n }\n\n // Merge github_checks\n if (child.github_checks !== undefined) {\n if (child.github_checks === null) {\n delete result.github_checks;\n } else {\n result.github_checks = this.mergeObjects(\n (parent.github_checks || {}) as Record<string, any>,\n child.github_checks as Record<string, any>\n ) as any;\n }\n }\n\n return result;\n }\n\n /**\n * Merge check configurations with special handling\n */\n private mergeChecks(\n parent: Record<string, CheckConfig>,\n child: Record<string, CheckConfig>\n ): Record<string, CheckConfig> {\n const result: Record<string, CheckConfig> = {};\n\n // Start with all parent checks\n for (const [checkName, checkConfig] of Object.entries(parent)) {\n result[checkName] = this.deepCopy(checkConfig);\n }\n\n // Process child checks\n for (const [checkName, childConfig] of Object.entries(child)) {\n const parentConfig = parent[checkName];\n\n if (!parentConfig) {\n // New check - need to process appendPrompt even without parent\n const copiedConfig = this.deepCopy(childConfig);\n\n // Default to 'ai' type if not specified\n if (!copiedConfig.type) {\n copiedConfig.type = 'ai';\n }\n\n // Default 'on' to ['manual'] if not specified\n if (!copiedConfig.on) {\n copiedConfig.on = ['manual'];\n }\n\n // Handle appendPrompt for new checks (convert to prompt)\n if (copiedConfig.appendPrompt !== undefined) {\n // If there's no parent, appendPrompt becomes the prompt\n if (!copiedConfig.prompt) {\n copiedConfig.prompt = copiedConfig.appendPrompt;\n } else {\n // If both prompt and appendPrompt exist in child, append them\n copiedConfig.prompt = copiedConfig.prompt + '\\n\\n' + copiedConfig.appendPrompt;\n }\n // Remove appendPrompt from final config\n delete copiedConfig.appendPrompt;\n }\n\n result[checkName] = copiedConfig;\n } else {\n // Merge existing check\n result[checkName] = this.mergeCheckConfig(parentConfig, childConfig);\n }\n }\n\n return result;\n }\n\n /**\n * Merge individual check configurations\n */\n private mergeCheckConfig(parent: CheckConfig, child: CheckConfig): CheckConfig {\n const result: CheckConfig = this.deepCopy(parent);\n\n // Simple properties (child overrides parent)\n if (child.type !== undefined) result.type = child.type;\n\n // Default to 'ai' type if not specified in either parent or child\n if (!result.type) {\n result.type = 'ai';\n }\n if (child.prompt !== undefined) result.prompt = child.prompt;\n\n // Handle appendPrompt - append to existing prompt\n if (child.appendPrompt !== undefined) {\n if (result.prompt) {\n // Append with a newline separator if parent has a prompt\n result.prompt = result.prompt + '\\n\\n' + child.appendPrompt;\n } else {\n // If no parent prompt, appendPrompt becomes the prompt\n result.prompt = child.appendPrompt;\n }\n // Don't carry forward appendPrompt to avoid re-appending\n delete result.appendPrompt;\n }\n\n if (child.exec !== undefined) result.exec = child.exec;\n if (child.stdin !== undefined) result.stdin = child.stdin;\n if (child.url !== undefined) result.url = child.url;\n if (child.focus !== undefined) result.focus = child.focus;\n if (child.command !== undefined) result.command = child.command;\n if (child.ai_model !== undefined) result.ai_model = child.ai_model;\n if (child.ai_provider !== undefined) result.ai_provider = child.ai_provider;\n if (child.group !== undefined) result.group = child.group;\n if (child.schema !== undefined) result.schema = child.schema;\n if (child.if !== undefined) result.if = child.if;\n if (child.reuse_ai_session !== undefined) result.reuse_ai_session = child.reuse_ai_session;\n if (child.fail_if !== undefined) result.fail_if = child.fail_if;\n if (child.failure_conditions !== undefined)\n result.failure_conditions = child.failure_conditions;\n\n // Special handling for 'on' array\n if (child.on !== undefined) {\n if (Array.isArray(child.on) && child.on.length === 0) {\n // Empty array disables the check\n result.on = [];\n } else {\n // Replace parent's on array\n result.on = [...child.on];\n }\n }\n\n // Default 'on' to ['manual'] if still not specified\n if (!result.on) {\n result.on = ['manual'];\n }\n\n // Arrays that get replaced (not concatenated)\n if (child.triggers !== undefined) {\n result.triggers = child.triggers ? [...child.triggers] : undefined;\n }\n if (child.depends_on !== undefined) {\n result.depends_on = child.depends_on ? [...child.depends_on] : undefined;\n }\n\n // Deep merge objects\n if (child.env) {\n result.env = this.mergeObjects(\n (parent.env || {}) as Record<string, any>,\n child.env as Record<string, any>\n );\n }\n if (child.ai) {\n result.ai = this.mergeObjects(\n (parent.ai || {}) as Record<string, any>,\n child.ai as Record<string, any>\n );\n }\n if (child.template) {\n result.template = this.mergeObjects(\n (parent.template || {}) as Record<string, any>,\n child.template as Record<string, any>\n );\n }\n\n return result;\n }\n\n /**\n * Check if a check is disabled (has empty 'on' array)\n */\n public isCheckDisabled(check: CheckConfig): boolean {\n return Array.isArray(check.on) && check.on.length === 0;\n }\n\n /**\n * Remove disabled checks from the configuration\n */\n public removeDisabledChecks(config: Partial<VisorConfig>): Partial<VisorConfig> {\n if (!config.checks) return config;\n\n const result = this.deepCopy(config);\n const enabledChecks: Record<string, CheckConfig> = {};\n\n for (const [checkName, checkConfig] of Object.entries(result.checks!)) {\n if (!this.isCheckDisabled(checkConfig)) {\n enabledChecks[checkName] = checkConfig;\n } else {\n console.log(`ℹ️ Check '${checkName}' is disabled (empty 'on' array)`);\n }\n }\n\n result.checks = enabledChecks;\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__esm,
|
|
3
|
-
__export,
|
|
4
|
-
__require,
|
|
5
|
-
__toCommonJS
|
|
6
|
-
} from "./chunk-WMJKH4XE.mjs";
|
|
7
|
-
|
|
8
|
-
// src/telemetry/fallback-ndjson.ts
|
|
9
|
-
var fallback_ndjson_exports = {};
|
|
10
|
-
__export(fallback_ndjson_exports, {
|
|
11
|
-
emitNdjsonFallback: () => emitNdjsonFallback,
|
|
12
|
-
emitNdjsonSpanWithEvents: () => emitNdjsonSpanWithEvents,
|
|
13
|
-
flushNdjson: () => flushNdjson
|
|
14
|
-
});
|
|
15
|
-
import * as fs from "fs";
|
|
16
|
-
import * as path from "path";
|
|
17
|
-
function resolveTargetPath(outDir) {
|
|
18
|
-
if (process.env.VISOR_FALLBACK_TRACE_FILE) {
|
|
19
|
-
CURRENT_FILE = process.env.VISOR_FALLBACK_TRACE_FILE;
|
|
20
|
-
return CURRENT_FILE;
|
|
21
|
-
}
|
|
22
|
-
if (CURRENT_FILE) return CURRENT_FILE;
|
|
23
|
-
const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
24
|
-
CURRENT_FILE = path.join(outDir, `${ts}.ndjson`);
|
|
25
|
-
return CURRENT_FILE;
|
|
26
|
-
}
|
|
27
|
-
function isEnabled() {
|
|
28
|
-
if (process.env.VISOR_FALLBACK_TRACE_FILE) return true;
|
|
29
|
-
return process.env.VISOR_TELEMETRY_ENABLED === "true" && (process.env.VISOR_TELEMETRY_SINK || "file") === "file";
|
|
30
|
-
}
|
|
31
|
-
function appendAsync(outDir, line) {
|
|
32
|
-
writeChain = writeChain.then(async () => {
|
|
33
|
-
if (!dirReady) {
|
|
34
|
-
try {
|
|
35
|
-
await fs.promises.mkdir(outDir, { recursive: true });
|
|
36
|
-
} catch {
|
|
37
|
-
}
|
|
38
|
-
dirReady = true;
|
|
39
|
-
}
|
|
40
|
-
const target = resolveTargetPath(outDir);
|
|
41
|
-
await fs.promises.appendFile(target, line, "utf8");
|
|
42
|
-
}).catch(() => {
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
async function flushNdjson() {
|
|
46
|
-
try {
|
|
47
|
-
await writeChain;
|
|
48
|
-
} catch {
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function emitNdjsonFallback(name, attrs) {
|
|
52
|
-
try {
|
|
53
|
-
if (!isEnabled()) return;
|
|
54
|
-
const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
|
|
55
|
-
const line = JSON.stringify({ name, attributes: attrs }) + "\n";
|
|
56
|
-
appendAsync(outDir, line);
|
|
57
|
-
} catch {
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function emitNdjsonSpanWithEvents(name, attrs, events) {
|
|
61
|
-
try {
|
|
62
|
-
if (!isEnabled()) return;
|
|
63
|
-
const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
|
|
64
|
-
const line = JSON.stringify({ name, attributes: attrs, events }) + "\n";
|
|
65
|
-
appendAsync(outDir, line);
|
|
66
|
-
} catch {
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
var CURRENT_FILE, dirReady, writeChain;
|
|
70
|
-
var init_fallback_ndjson = __esm({
|
|
71
|
-
"src/telemetry/fallback-ndjson.ts"() {
|
|
72
|
-
"use strict";
|
|
73
|
-
CURRENT_FILE = null;
|
|
74
|
-
dirReady = false;
|
|
75
|
-
writeChain = Promise.resolve();
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// src/telemetry/lazy-otel.ts
|
|
80
|
-
var otelApi = null;
|
|
81
|
-
var otelApiAttempted = false;
|
|
82
|
-
var OTEL_API_MODULE = "@opentelemetry/api";
|
|
83
|
-
function getOtelApi() {
|
|
84
|
-
if (otelApiAttempted) return otelApi;
|
|
85
|
-
otelApiAttempted = true;
|
|
86
|
-
try {
|
|
87
|
-
otelApi = (function(name) {
|
|
88
|
-
return __require(name);
|
|
89
|
-
})(OTEL_API_MODULE);
|
|
90
|
-
} catch {
|
|
91
|
-
otelApi = null;
|
|
92
|
-
}
|
|
93
|
-
return otelApi;
|
|
94
|
-
}
|
|
95
|
-
var trace = {
|
|
96
|
-
getTracer(name, version) {
|
|
97
|
-
const api = getOtelApi();
|
|
98
|
-
if (!api) return createNoOpTracer();
|
|
99
|
-
return api.trace.getTracer(name, version);
|
|
100
|
-
},
|
|
101
|
-
getSpan(context2) {
|
|
102
|
-
const api = getOtelApi();
|
|
103
|
-
if (!api) return void 0;
|
|
104
|
-
return api.trace.getSpan(context2);
|
|
105
|
-
},
|
|
106
|
-
getActiveSpan() {
|
|
107
|
-
const api = getOtelApi();
|
|
108
|
-
if (!api) return void 0;
|
|
109
|
-
return api.trace.getActiveSpan();
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
var context = {
|
|
113
|
-
active() {
|
|
114
|
-
const api = getOtelApi();
|
|
115
|
-
if (!api) return {};
|
|
116
|
-
return api.context.active();
|
|
117
|
-
},
|
|
118
|
-
with(context2, fn, thisArg, ...args) {
|
|
119
|
-
const api = getOtelApi();
|
|
120
|
-
if (!api) return fn.call(thisArg, ...args);
|
|
121
|
-
return api.context.with(context2, fn, thisArg, ...args);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
var metrics = {
|
|
125
|
-
getMeter(name, version) {
|
|
126
|
-
const api = getOtelApi();
|
|
127
|
-
if (!api?.metrics) return createNoOpMeter();
|
|
128
|
-
return api.metrics.getMeter(name, version);
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
var SpanStatusCode = {
|
|
132
|
-
get UNSET() {
|
|
133
|
-
const api = getOtelApi();
|
|
134
|
-
return api?.SpanStatusCode?.UNSET ?? 0;
|
|
135
|
-
},
|
|
136
|
-
get OK() {
|
|
137
|
-
const api = getOtelApi();
|
|
138
|
-
return api?.SpanStatusCode?.OK ?? 1;
|
|
139
|
-
},
|
|
140
|
-
get ERROR() {
|
|
141
|
-
const api = getOtelApi();
|
|
142
|
-
return api?.SpanStatusCode?.ERROR ?? 2;
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
function createNoOpTracer() {
|
|
146
|
-
return {
|
|
147
|
-
startSpan: () => createNoOpSpan(),
|
|
148
|
-
// Support both OTel v1 and v2 overloads:
|
|
149
|
-
// - startActiveSpan(name, callback)
|
|
150
|
-
// - startActiveSpan(name, options, callback)
|
|
151
|
-
// - startActiveSpan(name, options, context, callback)
|
|
152
|
-
startActiveSpan: (name, arg2, arg3, arg4) => {
|
|
153
|
-
const span = createNoOpSpan();
|
|
154
|
-
let cb = void 0;
|
|
155
|
-
if (typeof arg2 === "function") cb = arg2;
|
|
156
|
-
else if (typeof arg3 === "function") cb = arg3;
|
|
157
|
-
else if (typeof arg4 === "function") cb = arg4;
|
|
158
|
-
if (typeof cb === "function") {
|
|
159
|
-
try {
|
|
160
|
-
return cb(span);
|
|
161
|
-
} catch {
|
|
162
|
-
return void 0;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return span;
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
function createNoOpSpan() {
|
|
170
|
-
return {
|
|
171
|
-
spanContext: () => ({ traceId: "", spanId: "", traceFlags: 0 }),
|
|
172
|
-
setAttribute: () => {
|
|
173
|
-
},
|
|
174
|
-
setAttributes: () => {
|
|
175
|
-
},
|
|
176
|
-
addEvent: () => {
|
|
177
|
-
},
|
|
178
|
-
setStatus: () => {
|
|
179
|
-
},
|
|
180
|
-
updateName: () => {
|
|
181
|
-
},
|
|
182
|
-
end: () => {
|
|
183
|
-
},
|
|
184
|
-
isRecording: () => false,
|
|
185
|
-
recordException: () => {
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
function createNoOpMeter() {
|
|
190
|
-
return {
|
|
191
|
-
createCounter: () => ({ add: () => {
|
|
192
|
-
} }),
|
|
193
|
-
createHistogram: () => ({ record: () => {
|
|
194
|
-
} }),
|
|
195
|
-
createUpDownCounter: () => ({ add: () => {
|
|
196
|
-
} }),
|
|
197
|
-
createObservableGauge: () => {
|
|
198
|
-
},
|
|
199
|
-
createObservableCounter: () => {
|
|
200
|
-
},
|
|
201
|
-
createObservableUpDownCounter: () => {
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// src/telemetry/trace-helpers.ts
|
|
207
|
-
function getTracer() {
|
|
208
|
-
return trace.getTracer("visor");
|
|
209
|
-
}
|
|
210
|
-
async function withActiveSpan(name, attrs, fn) {
|
|
211
|
-
const tracer = getTracer();
|
|
212
|
-
return await new Promise((resolve, reject) => {
|
|
213
|
-
const callback = async (span) => {
|
|
214
|
-
try {
|
|
215
|
-
const res = await fn(span);
|
|
216
|
-
resolve(res);
|
|
217
|
-
} catch (err) {
|
|
218
|
-
try {
|
|
219
|
-
if (err instanceof Error) span.recordException(err);
|
|
220
|
-
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
221
|
-
} catch {
|
|
222
|
-
}
|
|
223
|
-
reject(err);
|
|
224
|
-
} finally {
|
|
225
|
-
try {
|
|
226
|
-
span.end();
|
|
227
|
-
} catch {
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
const options = attrs ? { attributes: attrs } : {};
|
|
232
|
-
tracer.startActiveSpan(name, options, callback);
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
function addEvent(name, attrs) {
|
|
236
|
-
const span = trace.getSpan(context.active());
|
|
237
|
-
if (span) {
|
|
238
|
-
try {
|
|
239
|
-
span.addEvent(name, attrs);
|
|
240
|
-
} catch {
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
try {
|
|
244
|
-
const { emitNdjsonSpanWithEvents: emitNdjsonSpanWithEvents2 } = (init_fallback_ndjson(), __toCommonJS(fallback_ndjson_exports));
|
|
245
|
-
emitNdjsonSpanWithEvents2("visor.event", {}, [{ name, attrs }]);
|
|
246
|
-
if (name === "fail_if.triggered") {
|
|
247
|
-
emitNdjsonSpanWithEvents2("visor.event", {}, [
|
|
248
|
-
{ name: "fail_if.evaluated", attrs },
|
|
249
|
-
{ name: "fail_if.triggered", attrs }
|
|
250
|
-
]);
|
|
251
|
-
}
|
|
252
|
-
} catch {
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// src/telemetry/metrics.ts
|
|
257
|
-
var initialized = false;
|
|
258
|
-
var meter = metrics.getMeter("visor");
|
|
259
|
-
var TEST_ENABLED = process.env.VISOR_TEST_METRICS === "true";
|
|
260
|
-
var TEST_SNAPSHOT = { fail_if_triggered: 0 };
|
|
261
|
-
var checkDurationHist;
|
|
262
|
-
var providerDurationHist;
|
|
263
|
-
var foreachDurationHist;
|
|
264
|
-
var issuesCounter;
|
|
265
|
-
var activeChecks;
|
|
266
|
-
var failIfCounter;
|
|
267
|
-
var diagramBlocks;
|
|
268
|
-
function ensureInstruments() {
|
|
269
|
-
if (initialized) return;
|
|
270
|
-
try {
|
|
271
|
-
checkDurationHist = meter.createHistogram("visor.check.duration_ms", {
|
|
272
|
-
description: "Duration of a check execution in milliseconds",
|
|
273
|
-
unit: "ms"
|
|
274
|
-
});
|
|
275
|
-
providerDurationHist = meter.createHistogram("visor.provider.duration_ms", {
|
|
276
|
-
description: "Duration of provider execution in milliseconds",
|
|
277
|
-
unit: "ms"
|
|
278
|
-
});
|
|
279
|
-
foreachDurationHist = meter.createHistogram("visor.foreach.item.duration_ms", {
|
|
280
|
-
description: "Duration of a forEach item execution in milliseconds",
|
|
281
|
-
unit: "ms"
|
|
282
|
-
});
|
|
283
|
-
issuesCounter = meter.createCounter("visor.check.issues", {
|
|
284
|
-
description: "Number of issues produced by checks",
|
|
285
|
-
unit: "1"
|
|
286
|
-
});
|
|
287
|
-
activeChecks = meter.createUpDownCounter("visor.run.active_checks", {
|
|
288
|
-
description: "Number of checks actively running",
|
|
289
|
-
unit: "1"
|
|
290
|
-
});
|
|
291
|
-
failIfCounter = meter.createCounter("visor.fail_if.triggered", {
|
|
292
|
-
description: "Number of times fail_if condition triggered",
|
|
293
|
-
unit: "1"
|
|
294
|
-
});
|
|
295
|
-
diagramBlocks = meter.createCounter("visor.diagram.blocks", {
|
|
296
|
-
description: "Number of Mermaid diagram blocks emitted",
|
|
297
|
-
unit: "1"
|
|
298
|
-
});
|
|
299
|
-
initialized = true;
|
|
300
|
-
} catch {
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
function addFailIfTriggered(check, scope) {
|
|
304
|
-
ensureInstruments();
|
|
305
|
-
try {
|
|
306
|
-
failIfCounter?.add(1, { "visor.check.id": check, scope });
|
|
307
|
-
} catch {
|
|
308
|
-
}
|
|
309
|
-
if (TEST_ENABLED) TEST_SNAPSHOT.fail_if_triggered++;
|
|
310
|
-
}
|
|
311
|
-
function addDiagramBlock(origin) {
|
|
312
|
-
ensureInstruments();
|
|
313
|
-
try {
|
|
314
|
-
diagramBlocks?.add(1, { origin });
|
|
315
|
-
} catch {
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
export {
|
|
320
|
-
trace,
|
|
321
|
-
context,
|
|
322
|
-
emitNdjsonFallback,
|
|
323
|
-
emitNdjsonSpanWithEvents,
|
|
324
|
-
fallback_ndjson_exports,
|
|
325
|
-
init_fallback_ndjson,
|
|
326
|
-
withActiveSpan,
|
|
327
|
-
addEvent,
|
|
328
|
-
addFailIfTriggered,
|
|
329
|
-
addDiagramBlock
|
|
330
|
-
};
|
|
331
|
-
//# sourceMappingURL=chunk-U7X54EMV.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/fallback-ndjson.ts","../../src/telemetry/lazy-otel.ts","../../src/telemetry/trace-helpers.ts","../../src/telemetry/metrics.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\n\nlet CURRENT_FILE: string | null = null;\nlet dirReady = false;\nlet writeChain: Promise<void> = Promise.resolve();\nfunction resolveTargetPath(outDir: string): string {\n if (process.env.VISOR_FALLBACK_TRACE_FILE) {\n CURRENT_FILE = process.env.VISOR_FALLBACK_TRACE_FILE;\n return CURRENT_FILE;\n }\n if (CURRENT_FILE) return CURRENT_FILE;\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n CURRENT_FILE = path.join(outDir, `${ts}.ndjson`);\n return CURRENT_FILE;\n}\n\nfunction isEnabled(): boolean {\n // Enable when CLI set a fallback file (serverless mode), or when explicit file sink is enabled\n if (process.env.VISOR_FALLBACK_TRACE_FILE) return true;\n return (\n process.env.VISOR_TELEMETRY_ENABLED === 'true' &&\n (process.env.VISOR_TELEMETRY_SINK || 'file') === 'file'\n );\n}\n\nfunction appendAsync(outDir: string, line: string): void {\n writeChain = writeChain\n .then(async () => {\n if (!dirReady) {\n try {\n await fs.promises.mkdir(outDir, { recursive: true });\n } catch {}\n dirReady = true;\n }\n const target = resolveTargetPath(outDir);\n await fs.promises.appendFile(target, line, 'utf8');\n })\n .catch(() => {});\n}\n\nexport async function flushNdjson(): Promise<void> {\n try {\n await writeChain;\n } catch {}\n}\n\nexport function emitNdjsonFallback(name: string, attrs: Record<string, unknown>): void {\n try {\n if (!isEnabled()) return;\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n const line = JSON.stringify({ name, attributes: attrs }) + '\\n';\n appendAsync(outDir, line);\n } catch {\n // ignore\n }\n}\n\nexport function emitNdjsonSpanWithEvents(\n name: string,\n attrs: Record<string, unknown>,\n events: Array<{ name: string; attrs?: Record<string, unknown> }>\n): void {\n try {\n if (!isEnabled()) return;\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n const line = JSON.stringify({ name, attributes: attrs, events }) + '\\n';\n appendAsync(outDir, line);\n } catch {\n // ignore\n }\n}\n","/**\n * Lazy-loading wrapper for OpenTelemetry API.\n * Returns no-op implementations if OpenTelemetry is not installed.\n * Uses hardcoded module name for security - no dynamic module loading.\n */\n\nlet otelApi: any = null;\nlet otelApiAttempted = false;\n\n// Hardcoded allowed module name to prevent module loading attacks\nconst OTEL_API_MODULE = '@opentelemetry/api';\n\nfunction getOtelApi() {\n if (otelApiAttempted) return otelApi;\n otelApiAttempted = true;\n\n try {\n // Security: Only load the specific @opentelemetry/api module\n // Use dynamic require to prevent bundlers from including this module\n\n otelApi = (function (name: string) {\n return require(name);\n })(OTEL_API_MODULE);\n } catch {\n // OpenTelemetry not installed - provide no-op implementations\n otelApi = null;\n }\n\n return otelApi;\n}\n\n// Export lazy-loaded trace API\nexport const trace = {\n getTracer(name: string, version?: string) {\n const api = getOtelApi();\n if (!api) return createNoOpTracer();\n return api.trace.getTracer(name, version);\n },\n getSpan(context: any) {\n const api = getOtelApi();\n if (!api) return undefined;\n return api.trace.getSpan(context);\n },\n getActiveSpan() {\n const api = getOtelApi();\n if (!api) return undefined;\n return api.trace.getActiveSpan();\n },\n};\n\n// Export lazy-loaded context API\nexport const context = {\n active() {\n const api = getOtelApi();\n if (!api) return {};\n return api.context.active();\n },\n with(context: any, fn: Function, thisArg?: any, ...args: any[]) {\n const api = getOtelApi();\n if (!api) return fn.call(thisArg, ...args);\n return api.context.with(context, fn, thisArg, ...args);\n },\n};\n\n// Export lazy-loaded metrics API\nexport const metrics = {\n getMeter(name: string, version?: string) {\n const api = getOtelApi();\n if (!api?.metrics) return createNoOpMeter();\n return api.metrics.getMeter(name, version);\n },\n};\n\n// Export types and enums\nexport const SpanStatusCode = {\n get UNSET() {\n const api = getOtelApi();\n return api?.SpanStatusCode?.UNSET ?? 0;\n },\n get OK() {\n const api = getOtelApi();\n return api?.SpanStatusCode?.OK ?? 1;\n },\n get ERROR() {\n const api = getOtelApi();\n return api?.SpanStatusCode?.ERROR ?? 2;\n },\n};\n\nexport const SpanKind = {\n get INTERNAL() {\n const api = getOtelApi();\n return api?.SpanKind?.INTERNAL ?? 0;\n },\n get SERVER() {\n const api = getOtelApi();\n return api?.SpanKind?.SERVER ?? 1;\n },\n get CLIENT() {\n const api = getOtelApi();\n return api?.SpanKind?.CLIENT ?? 2;\n },\n get PRODUCER() {\n const api = getOtelApi();\n return api?.SpanKind?.PRODUCER ?? 3;\n },\n get CONSUMER() {\n const api = getOtelApi();\n return api?.SpanKind?.CONSUMER ?? 4;\n },\n};\n\n// Export diag API\nexport const diag = {\n setLogger(logger: any, level?: any) {\n const api = getOtelApi();\n if (!api) return;\n return api.diag.setLogger(logger, level);\n },\n};\n\n// Lazy-loaded DiagConsoleLogger and DiagLogLevel for consistency\nexport const DiagConsoleLogger = {\n get() {\n const api = getOtelApi();\n return api?.DiagConsoleLogger;\n },\n};\n\nexport const DiagLogLevel = {\n get NONE() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.NONE ?? 0;\n },\n get ERROR() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.ERROR ?? 30;\n },\n get WARN() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.WARN ?? 50;\n },\n get INFO() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.INFO ?? 60;\n },\n get DEBUG() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.DEBUG ?? 70;\n },\n get VERBOSE() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.VERBOSE ?? 80;\n },\n get ALL() {\n const api = getOtelApi();\n return api?.DiagLogLevel?.ALL ?? 9999;\n },\n};\n\n// Type exports for TypeScript\nexport type Span = any;\nexport type Attributes = Record<string, any>;\nexport type HrTime = [number, number];\n\n// No-op implementations\nfunction createNoOpTracer() {\n return {\n startSpan: () => createNoOpSpan(),\n // Support both OTel v1 and v2 overloads:\n // - startActiveSpan(name, callback)\n // - startActiveSpan(name, options, callback)\n // - startActiveSpan(name, options, context, callback)\n startActiveSpan: (name: string, arg2?: any, arg3?: any, arg4?: any) => {\n const span = createNoOpSpan();\n let cb: any = undefined;\n if (typeof arg2 === 'function') cb = arg2;\n else if (typeof arg3 === 'function') cb = arg3;\n else if (typeof arg4 === 'function') cb = arg4;\n if (typeof cb === 'function') {\n try {\n return cb(span);\n } catch {\n // swallow errors in no-op implementation\n return undefined;\n }\n }\n // No callback supplied: return a no-op span like the real API would\n return span;\n },\n };\n}\n\nfunction createNoOpSpan() {\n return {\n spanContext: () => ({ traceId: '', spanId: '', traceFlags: 0 }),\n setAttribute: () => {},\n setAttributes: () => {},\n addEvent: () => {},\n setStatus: () => {},\n updateName: () => {},\n end: () => {},\n isRecording: () => false,\n recordException: () => {},\n };\n}\n\nfunction createNoOpMeter() {\n return {\n createCounter: () => ({ add: () => {} }),\n createHistogram: () => ({ record: () => {} }),\n createUpDownCounter: () => ({ add: () => {} }),\n createObservableGauge: () => {},\n createObservableCounter: () => {},\n createObservableUpDownCounter: () => {},\n };\n}\n","import { context as otContext, Span, SpanStatusCode, trace, Attributes } from './lazy-otel';\n\nexport function getTracer() {\n return trace.getTracer('visor');\n}\n\nexport async function withActiveSpan<T>(\n name: string,\n attrs: Record<string, unknown> | undefined,\n fn: (span: Span) => Promise<T>\n): Promise<T> {\n const tracer = getTracer();\n // Preserve parent context via tracer API; avoid logging parent IDs to stdout\n // Avoid noisy stdout logs that break JSON consumers\n return await new Promise<T>((resolve, reject) => {\n const callback = async (span: Span) => {\n // console.debug(`[trace] Span callback invoked for: [trace_id=${ctx.traceId} span_id=${ctx.spanId}] ${name} span: true`);\n try {\n const res = await fn(span);\n // console.debug('[trace] Span execution completed for:', name);\n resolve(res);\n } catch (err) {\n // console.debug('[trace] Span execution errored for:', name, err);\n try {\n if (err instanceof Error) span.recordException(err);\n span.setStatus({ code: SpanStatusCode.ERROR });\n } catch {}\n reject(err);\n } finally {\n try {\n // console.debug('[trace] Ending span:', name);\n span.end();\n } catch {}\n }\n };\n // startActiveSpan should use the current active context to set parent automatically\n const options = attrs ? { attributes: attrs as Attributes } : {};\n tracer.startActiveSpan(name, options, callback);\n });\n}\n\nexport function addEvent(name: string, attrs?: Record<string, unknown>): void {\n const span = trace.getSpan(otContext.active());\n if (span) {\n try {\n span.addEvent(name, attrs as Attributes);\n } catch {\n // ignore\n }\n }\n // Fallback NDJSON emission for serverless/file sink when SDK may be inactive\n try {\n const { emitNdjsonSpanWithEvents } = require('./fallback-ndjson');\n emitNdjsonSpanWithEvents('visor.event', {}, [{ name, attrs }]);\n if (name === 'fail_if.triggered') {\n emitNdjsonSpanWithEvents('visor.event', {}, [\n { name: 'fail_if.evaluated', attrs },\n { name: 'fail_if.triggered', attrs },\n ]);\n }\n } catch {}\n}\n\nexport function setSpanAttributes(attrs: Record<string, unknown>): void {\n const span = trace.getSpan(otContext.active());\n if (!span) return;\n try {\n for (const [k, v] of Object.entries(attrs)) span.setAttribute(k, v as never);\n } catch {\n // ignore\n }\n}\n\nexport function setSpanError(err: unknown): void {\n const span = trace.getSpan(otContext.active());\n if (!span) return;\n try {\n if (err instanceof Error) span.recordException(err);\n span.setStatus({ code: SpanStatusCode.ERROR });\n } catch {\n // ignore\n }\n}\n\n// Internal helper for tests: write a minimal run marker to NDJSON when using file sink\nlet __ndjsonPath: string | null = null;\nexport function __getOrCreateNdjsonPath(): string | null {\n try {\n // If sink is explicitly set to non-file, skip. If unset, still allow when a trace dir/file is configured.\n if (process.env.VISOR_TELEMETRY_SINK && process.env.VISOR_TELEMETRY_SINK !== 'file')\n return null;\n const path = require('path');\n const fs = require('fs');\n // Prefer explicit fallback file path if set by the CLI\n if (process.env.VISOR_FALLBACK_TRACE_FILE) {\n __ndjsonPath = process.env.VISOR_FALLBACK_TRACE_FILE;\n const dir = path.dirname(__ndjsonPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return __ndjsonPath;\n }\n const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), 'output', 'traces');\n if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, { recursive: true });\n if (!__ndjsonPath) {\n const ts = new Date().toISOString().replace(/[:.]/g, '-');\n __ndjsonPath = path.join(outDir, `${ts}.ndjson`);\n }\n return __ndjsonPath;\n } catch {\n return null;\n }\n}\nexport function _appendRunMarker(): void {\n try {\n const fs = require('fs');\n const p = __getOrCreateNdjsonPath();\n if (!p) return;\n const line = { name: 'visor.run', attributes: { started: true } };\n fs.appendFileSync(p, JSON.stringify(line) + '\\n', 'utf8');\n } catch {}\n}\n","import { metrics } from './lazy-otel';\n\nlet initialized = false;\nconst meter = metrics.getMeter('visor');\n\n// Test helpers (enabled with VISOR_TEST_METRICS=true)\nconst TEST_ENABLED = process.env.VISOR_TEST_METRICS === 'true';\nconst TEST_SNAPSHOT: { [k: string]: number } = { fail_if_triggered: 0 };\n\n// Instruments (lazily created when first used)\nlet checkDurationHist: ReturnType<typeof meter.createHistogram> | undefined;\nlet providerDurationHist: ReturnType<typeof meter.createHistogram> | undefined;\nlet foreachDurationHist: ReturnType<typeof meter.createHistogram> | undefined;\nlet issuesCounter: ReturnType<typeof meter.createCounter> | undefined;\nlet activeChecks: ReturnType<typeof meter.createUpDownCounter> | undefined;\nlet failIfCounter: ReturnType<typeof meter.createCounter> | undefined;\nlet diagramBlocks: ReturnType<typeof meter.createCounter> | undefined;\n\nfunction ensureInstruments() {\n if (initialized) return;\n try {\n checkDurationHist = meter.createHistogram('visor.check.duration_ms', {\n description: 'Duration of a check execution in milliseconds',\n unit: 'ms',\n });\n providerDurationHist = meter.createHistogram('visor.provider.duration_ms', {\n description: 'Duration of provider execution in milliseconds',\n unit: 'ms',\n });\n foreachDurationHist = meter.createHistogram('visor.foreach.item.duration_ms', {\n description: 'Duration of a forEach item execution in milliseconds',\n unit: 'ms',\n });\n issuesCounter = meter.createCounter('visor.check.issues', {\n description: 'Number of issues produced by checks',\n unit: '1',\n });\n activeChecks = meter.createUpDownCounter('visor.run.active_checks', {\n description: 'Number of checks actively running',\n unit: '1',\n });\n failIfCounter = meter.createCounter('visor.fail_if.triggered', {\n description: 'Number of times fail_if condition triggered',\n unit: '1',\n });\n diagramBlocks = meter.createCounter('visor.diagram.blocks', {\n description: 'Number of Mermaid diagram blocks emitted',\n unit: '1',\n });\n initialized = true;\n } catch {\n // Metrics may be unavailable if SDK not initialized; ignore gracefully\n }\n}\n\nexport function recordCheckDuration(check: string, durationMs: number, group?: string) {\n ensureInstruments();\n try {\n checkDurationHist?.record(durationMs, {\n 'visor.check.id': check,\n 'visor.check.group': group || 'default',\n });\n } catch {}\n}\n\nexport function recordProviderDuration(check: string, providerType: string, durationMs: number) {\n ensureInstruments();\n try {\n providerDurationHist?.record(durationMs, {\n 'visor.check.id': check,\n 'visor.provider.type': providerType,\n });\n } catch {}\n}\n\nexport function recordForEachDuration(\n check: string,\n index: number,\n total: number,\n durationMs: number\n) {\n ensureInstruments();\n try {\n foreachDurationHist?.record(durationMs, {\n 'visor.check.id': check,\n 'visor.foreach.index': index,\n 'visor.foreach.total': total,\n });\n } catch {}\n}\n\nexport function addIssues(check: string, severity: string, count = 1) {\n ensureInstruments();\n try {\n issuesCounter?.add(count, {\n 'visor.check.id': check,\n severity,\n });\n } catch {}\n}\n\nexport function incActiveCheck(check: string) {\n ensureInstruments();\n try {\n activeChecks?.add(1, { 'visor.check.id': check });\n } catch {}\n}\n\nexport function decActiveCheck(check: string) {\n ensureInstruments();\n try {\n activeChecks?.add(-1, { 'visor.check.id': check });\n } catch {}\n}\n\nexport function addFailIfTriggered(check: string, scope: 'global' | 'check') {\n ensureInstruments();\n try {\n failIfCounter?.add(1, { 'visor.check.id': check, scope });\n } catch {}\n if (TEST_ENABLED) TEST_SNAPSHOT.fail_if_triggered++;\n}\n\nexport function addDiagramBlock(origin: 'content' | 'issue') {\n ensureInstruments();\n try {\n diagramBlocks?.add(1, { origin });\n } catch {}\n}\n\nexport function getTestMetricsSnapshot() {\n return { ...TEST_SNAPSHOT };\n}\n\nexport function resetTestMetricsSnapshot() {\n Object.keys(TEST_SNAPSHOT).forEach(k => (TEST_SNAPSHOT[k] = 0));\n}\n"],"mappings":"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","names":["context","emitNdjsonSpanWithEvents"]}
|