@probelabs/visor 0.1.100 → 0.1.102

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.
Files changed (79) hide show
  1. package/dist/debug-visualizer/debug-span-exporter.d.ts +5 -3
  2. package/dist/debug-visualizer/debug-span-exporter.d.ts.map +1 -1
  3. package/dist/generated/config-schema.d.ts +11 -0
  4. package/dist/generated/config-schema.d.ts.map +1 -1
  5. package/dist/generated/config-schema.json +11 -0
  6. package/dist/index.js +48587 -193583
  7. package/dist/sdk/{check-execution-engine-F3662LY7.mjs → check-execution-engine-6QJXYYON.mjs} +3 -3
  8. package/dist/sdk/{chunk-FVS5CJ5S.mjs → chunk-33QVZ2D4.mjs} +117 -4
  9. package/dist/sdk/chunk-33QVZ2D4.mjs.map +1 -0
  10. package/dist/sdk/{chunk-X2JKUOE5.mjs → chunk-O4RP4BRH.mjs} +144 -146
  11. package/dist/sdk/chunk-O4RP4BRH.mjs.map +1 -0
  12. package/dist/sdk/{mermaid-telemetry-FBF6D35S.mjs → mermaid-telemetry-YCTIG76M.mjs} +2 -2
  13. package/dist/sdk/sdk.d.mts +4 -0
  14. package/dist/sdk/sdk.d.ts +4 -0
  15. package/dist/sdk/sdk.js +282 -154
  16. package/dist/sdk/sdk.js.map +1 -1
  17. package/dist/sdk/sdk.mjs +13 -2
  18. package/dist/sdk/sdk.mjs.map +1 -1
  19. package/dist/telemetry/file-span-exporter.d.ts +4 -3
  20. package/dist/telemetry/file-span-exporter.d.ts.map +1 -1
  21. package/dist/telemetry/lazy-otel.d.ts +48 -0
  22. package/dist/telemetry/lazy-otel.d.ts.map +1 -0
  23. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  24. package/dist/telemetry/state-capture.d.ts +1 -1
  25. package/dist/telemetry/state-capture.d.ts.map +1 -1
  26. package/dist/telemetry/trace-helpers.d.ts +2 -2
  27. package/dist/telemetry/trace-helpers.d.ts.map +1 -1
  28. package/dist/telemetry/trace-report-exporter.d.ts +4 -3
  29. package/dist/telemetry/trace-report-exporter.d.ts.map +1 -1
  30. package/dist/types/config.d.ts +4 -0
  31. package/dist/types/config.d.ts.map +1 -1
  32. package/package.json +15 -13
  33. package/dist/136.index.js +0 -82
  34. package/dist/146.index.js +0 -82
  35. package/dist/159.index.js +0 -38
  36. package/dist/160.index.js +0 -82
  37. package/dist/179.index.js +0 -48
  38. package/dist/191.index.js +0 -82
  39. package/dist/201.index.js +0 -82
  40. package/dist/262.index.js +0 -48
  41. package/dist/273.index.js +0 -48
  42. package/dist/34.index.js +0 -81
  43. package/dist/384.index.js +0 -38
  44. package/dist/405.index.js +0 -48
  45. package/dist/42.index.js +0 -38
  46. package/dist/437.index.js +0 -82
  47. package/dist/441.index.js +0 -81
  48. package/dist/448.index.js +0 -48
  49. package/dist/450.index.js +0 -82
  50. package/dist/491.index.js +0 -81
  51. package/dist/558.index.js +0 -82
  52. package/dist/69.index.js +0 -38
  53. package/dist/715.index.js +0 -38
  54. package/dist/737.index.js +0 -82
  55. package/dist/760.index.js +0 -81
  56. package/dist/834.index.js +0 -48
  57. package/dist/886.index.js +0 -81
  58. package/dist/917.index.js +0 -82
  59. package/dist/940.index.js +0 -38
  60. package/dist/955.index.js +0 -82
  61. package/dist/989.index.js +0 -81
  62. package/dist/996.index.js +0 -82
  63. package/dist/proto/channelz.proto +0 -564
  64. package/dist/proto/protoc-gen-validate/LICENSE +0 -202
  65. package/dist/proto/protoc-gen-validate/validate/validate.proto +0 -797
  66. package/dist/proto/xds/LICENSE +0 -201
  67. package/dist/proto/xds/xds/data/orca/v3/orca_load_report.proto +0 -58
  68. package/dist/proto/xds/xds/service/orca/v3/orca.proto +0 -36
  69. package/dist/protoc-gen-validate/LICENSE +0 -202
  70. package/dist/protoc-gen-validate/validate/validate.proto +0 -797
  71. package/dist/sdk/chunk-FVS5CJ5S.mjs.map +0 -1
  72. package/dist/sdk/chunk-X2JKUOE5.mjs.map +0 -1
  73. package/dist/xds/LICENSE +0 -201
  74. package/dist/xds/xds/data/orca/v3/orca_load_report.proto +0 -58
  75. package/dist/xds/xds/service/orca/v3/orca.proto +0 -36
  76. /package/dist/output/traces/{run-2025-10-22T10-40-34-055Z.ndjson → run-2025-10-22T13-28-22-633Z.ndjson} +0 -0
  77. /package/dist/sdk/{check-execution-engine-F3662LY7.mjs.map → check-execution-engine-6QJXYYON.mjs.map} +0 -0
  78. /package/dist/sdk/{mermaid-telemetry-FBF6D35S.mjs.map → mermaid-telemetry-YCTIG76M.mjs.map} +0 -0
  79. /package/dist/traces/{run-2025-10-22T10-40-34-055Z.ndjson → run-2025-10-22T13-28-22-633Z.ndjson} +0 -0
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  CheckExecutionEngine
3
- } from "./chunk-X2JKUOE5.mjs";
3
+ } from "./chunk-O4RP4BRH.mjs";
4
4
  import "./chunk-TUTOLSFV.mjs";
5
5
  import "./chunk-B5QBV2QJ.mjs";
6
- import "./chunk-FVS5CJ5S.mjs";
6
+ import "./chunk-33QVZ2D4.mjs";
7
7
  import "./chunk-WMJKH4XE.mjs";
8
8
  export {
9
9
  CheckExecutionEngine
10
10
  };
11
- //# sourceMappingURL=check-execution-engine-F3662LY7.mjs.map
11
+ //# sourceMappingURL=check-execution-engine-6QJXYYON.mjs.map
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  __esm,
3
3
  __export,
4
+ __require,
4
5
  __toCommonJS
5
6
  } from "./chunk-WMJKH4XE.mjs";
6
7
 
@@ -75,8 +76,119 @@ var init_fallback_ndjson = __esm({
75
76
  }
76
77
  });
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
+ startActiveSpan: (name, fn) => {
149
+ if (typeof fn === "function") return fn(createNoOpSpan());
150
+ return createNoOpSpan();
151
+ }
152
+ };
153
+ }
154
+ function createNoOpSpan() {
155
+ return {
156
+ spanContext: () => ({ traceId: "", spanId: "", traceFlags: 0 }),
157
+ setAttribute: () => {
158
+ },
159
+ setAttributes: () => {
160
+ },
161
+ addEvent: () => {
162
+ },
163
+ setStatus: () => {
164
+ },
165
+ updateName: () => {
166
+ },
167
+ end: () => {
168
+ },
169
+ isRecording: () => false,
170
+ recordException: () => {
171
+ }
172
+ };
173
+ }
174
+ function createNoOpMeter() {
175
+ return {
176
+ createCounter: () => ({ add: () => {
177
+ } }),
178
+ createHistogram: () => ({ record: () => {
179
+ } }),
180
+ createUpDownCounter: () => ({ add: () => {
181
+ } }),
182
+ createObservableGauge: () => {
183
+ },
184
+ createObservableCounter: () => {
185
+ },
186
+ createObservableUpDownCounter: () => {
187
+ }
188
+ };
189
+ }
190
+
78
191
  // src/telemetry/trace-helpers.ts
79
- import { context as otContext, SpanStatusCode, trace } from "@opentelemetry/api";
80
192
  function getTracer() {
81
193
  return trace.getTracer("visor");
82
194
  }
@@ -106,7 +218,7 @@ async function withActiveSpan(name, attrs, fn) {
106
218
  });
107
219
  }
108
220
  function addEvent(name, attrs) {
109
- const span = trace.getSpan(otContext.active());
221
+ const span = trace.getSpan(context.active());
110
222
  if (span) {
111
223
  try {
112
224
  span.addEvent(name, attrs);
@@ -127,7 +239,6 @@ function addEvent(name, attrs) {
127
239
  }
128
240
 
129
241
  // src/telemetry/metrics.ts
130
- import { metrics } from "@opentelemetry/api";
131
242
  var initialized = false;
132
243
  var meter = metrics.getMeter("visor");
133
244
  var TEST_ENABLED = process.env.VISOR_TEST_METRICS === "true";
@@ -191,6 +302,8 @@ function addDiagramBlock(origin) {
191
302
  }
192
303
 
193
304
  export {
305
+ trace,
306
+ context,
194
307
  emitNdjsonFallback,
195
308
  emitNdjsonSpanWithEvents,
196
309
  fallback_ndjson_exports,
@@ -200,4 +313,4 @@ export {
200
313
  addFailIfTriggered,
201
314
  addDiagramBlock
202
315
  };
203
- //# sourceMappingURL=chunk-FVS5CJ5S.mjs.map
316
+ //# sourceMappingURL=chunk-33QVZ2D4.mjs.map
@@ -0,0 +1 @@
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 startActiveSpan: (name: string, fn: any) => {\n if (typeof fn === 'function') return fn(createNoOpSpan());\n return createNoOpSpan();\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"]}