@probelabs/visor 0.1.96 → 0.1.98

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 (88) hide show
  1. package/README.md +20 -19
  2. package/defaults/.visor.yaml +3 -2
  3. package/dist/{168.index.js → 136.index.js} +5 -5
  4. package/dist/{272.index.js → 146.index.js} +5 -5
  5. package/dist/{13.index.js → 160.index.js} +5 -5
  6. package/dist/{421.index.js → 179.index.js} +3 -3
  7. package/dist/{85.index.js → 191.index.js} +5 -5
  8. package/dist/{544.index.js → 384.index.js} +3 -3
  9. package/dist/{861.index.js → 405.index.js} +3 -3
  10. package/dist/{320.index.js → 42.index.js} +3 -3
  11. package/dist/448.index.js +48 -0
  12. package/dist/{878.index.js → 491.index.js} +5 -5
  13. package/dist/663.index.js +321 -0
  14. package/dist/69.index.js +38 -0
  15. package/dist/{54.index.js → 760.index.js} +5 -5
  16. package/dist/80.index.js +263 -0
  17. package/dist/886.index.js +81 -0
  18. package/dist/917.index.js +82 -0
  19. package/dist/955.index.js +82 -0
  20. package/dist/ai-review-service.d.ts +2 -3
  21. package/dist/ai-review-service.d.ts.map +1 -1
  22. package/dist/check-execution-engine.d.ts.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/config.d.ts +5 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/defaults/.visor.yaml +3 -2
  27. package/dist/generated/config-schema.d.ts +24 -3
  28. package/dist/generated/config-schema.d.ts.map +1 -1
  29. package/dist/generated/config-schema.json +28 -3
  30. package/dist/index.js +198171 -161819
  31. package/dist/proto/protoc-gen-validate/LICENSE +202 -0
  32. package/dist/proto/protoc-gen-validate/validate/validate.proto +797 -0
  33. package/dist/proto/xds/LICENSE +201 -0
  34. package/dist/proto/xds/xds/data/orca/v3/orca_load_report.proto +58 -0
  35. package/dist/proto/xds/xds/service/orca/v3/orca.proto +36 -0
  36. package/dist/protoc-gen-validate/LICENSE +202 -0
  37. package/dist/protoc-gen-validate/validate/validate.proto +797 -0
  38. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  39. package/dist/providers/index.d.ts +1 -0
  40. package/dist/providers/index.d.ts.map +1 -1
  41. package/dist/providers/mcp-check-provider.d.ts +102 -0
  42. package/dist/providers/mcp-check-provider.d.ts.map +1 -0
  43. package/dist/sdk/check-execution-engine-W5FLIWZL.mjs +11 -0
  44. package/dist/sdk/chunk-IG3BFIIN.mjs +174 -0
  45. package/dist/sdk/chunk-IG3BFIIN.mjs.map +1 -0
  46. package/dist/sdk/{chunk-Q4S5A5TO.mjs → chunk-POYXI3MQ.mjs} +610 -21
  47. package/dist/sdk/chunk-POYXI3MQ.mjs.map +1 -0
  48. package/dist/sdk/chunk-YXOWIDEF.mjs +60 -0
  49. package/dist/sdk/chunk-YXOWIDEF.mjs.map +1 -0
  50. package/dist/sdk/{mermaid-telemetry-LZGDD35I.mjs → mermaid-telemetry-4DUEYCLE.mjs} +2 -2
  51. package/dist/sdk/sdk.d.mts +16 -3
  52. package/dist/sdk/sdk.d.ts +16 -3
  53. package/dist/sdk/sdk.js +994 -1513
  54. package/dist/sdk/sdk.js.map +1 -1
  55. package/dist/sdk/sdk.mjs +70 -13
  56. package/dist/sdk/sdk.mjs.map +1 -1
  57. package/dist/sdk/{tracer-init-O7RLXMJ3.mjs → tracer-init-RJGAIOBP.mjs} +2 -2
  58. package/dist/session-registry.d.ts +2 -3
  59. package/dist/session-registry.d.ts.map +1 -1
  60. package/dist/traces/run-2025-10-19T19-05-29-328Z.ndjson +40 -0
  61. package/dist/traces/run-2025-10-19T19-05-42-253Z.ndjson +40 -0
  62. package/dist/traces/run-2025-10-19T19-05-42-805Z.ndjson +40 -0
  63. package/dist/traces/run-2025-10-19T19-05-43-323Z.ndjson +40 -0
  64. package/dist/traces/run-2025-10-19T19-05-43-841Z.ndjson +12 -0
  65. package/dist/types/config.d.ts +16 -3
  66. package/dist/types/config.d.ts.map +1 -1
  67. package/dist/utils/config-loader.d.ts +5 -0
  68. package/dist/utils/config-loader.d.ts.map +1 -1
  69. package/dist/utils/tracer-init.d.ts +3 -4
  70. package/dist/utils/tracer-init.d.ts.map +1 -1
  71. package/dist/xds/LICENSE +201 -0
  72. package/dist/xds/xds/data/orca/v3/orca_load_report.proto +58 -0
  73. package/dist/xds/xds/service/orca/v3/orca.proto +36 -0
  74. package/package.json +15 -8
  75. package/dist/sdk/check-execution-engine-NMPXJ7FQ.mjs +0 -11
  76. package/dist/sdk/chunk-KVHVCGY6.mjs +0 -103
  77. package/dist/sdk/chunk-KVHVCGY6.mjs.map +0 -1
  78. package/dist/sdk/chunk-Q4S5A5TO.mjs.map +0 -1
  79. package/dist/sdk/chunk-TWJKAYT6.mjs +0 -1124
  80. package/dist/sdk/chunk-TWJKAYT6.mjs.map +0 -1
  81. /package/dist/{traces/run-2025-10-18T20-24-27-886Z.ndjson → output/traces/run-2025-10-19T19-05-29-328Z.ndjson} +0 -0
  82. /package/dist/{traces/run-2025-10-18T20-24-38-817Z.ndjson → output/traces/run-2025-10-19T19-05-42-253Z.ndjson} +0 -0
  83. /package/dist/{traces/run-2025-10-18T20-24-39-361Z.ndjson → output/traces/run-2025-10-19T19-05-42-805Z.ndjson} +0 -0
  84. /package/dist/{traces/run-2025-10-18T20-24-39-852Z.ndjson → output/traces/run-2025-10-19T19-05-43-323Z.ndjson} +0 -0
  85. /package/dist/{traces/run-2025-10-18T20-24-40-335Z.ndjson → output/traces/run-2025-10-19T19-05-43-841Z.ndjson} +0 -0
  86. /package/dist/sdk/{check-execution-engine-NMPXJ7FQ.mjs.map → check-execution-engine-W5FLIWZL.mjs.map} +0 -0
  87. /package/dist/sdk/{mermaid-telemetry-LZGDD35I.mjs.map → mermaid-telemetry-4DUEYCLE.mjs.map} +0 -0
  88. /package/dist/sdk/{tracer-init-O7RLXMJ3.mjs.map → tracer-init-RJGAIOBP.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"check-provider-registry.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/check-provider-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAY3D;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAE/C,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAO3C;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwBhC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAYvC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIpD;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAU/C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACH,eAAe,IAAI,aAAa,EAAE;IAIlC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAapD;;OAEG;IACG,aAAa,IAAI,OAAO,CAC5B,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CACH;IAgBD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;CAG7B"}
1
+ {"version":3,"file":"check-provider-registry.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/check-provider-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAa3D;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAE/C,OAAO;IAKP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAO3C;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAmChC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAYvC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIpD;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAU/C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,qBAAqB,IAAI,MAAM,EAAE;IAIjC;;OAEG;IACH,eAAe,IAAI,aAAa,EAAE;IAIlC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAapD;;OAEG;IACG,aAAa,IAAI,OAAO,CAC5B,KAAK,CAAC;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC,CACH;IAgBD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;CAG7B"}
@@ -11,5 +11,6 @@ export { HttpClientProvider } from './http-client-provider';
11
11
  export { NoopCheckProvider } from './noop-check-provider';
12
12
  export { LogCheckProvider } from './log-check-provider';
13
13
  export { ClaudeCodeCheckProvider } from './claude-code-check-provider';
14
+ export { McpCheckProvider } from './mcp-check-provider';
14
15
  export { VisorMcpTools, McpServerManager, DEFAULT_MCP_TOOLS_CONFIG } from './mcp-tools';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { CheckProvider, CheckProviderConfig } from './check-provider.interface';
2
+ import { PRInfo } from '../pr-analyzer';
3
+ import { ReviewSummary } from '../reviewer';
4
+ /**
5
+ * MCP Check Provider Configuration
6
+ */
7
+ export interface McpCheckConfig extends CheckProviderConfig {
8
+ /** Transport type: stdio (default), sse (legacy), or http (streamable HTTP) */
9
+ transport?: 'stdio' | 'sse' | 'http';
10
+ /** Command to execute (for stdio transport) */
11
+ command?: string;
12
+ /** Command arguments (for stdio transport) */
13
+ args?: string[];
14
+ /** Environment variables (for stdio transport) */
15
+ env?: Record<string, string>;
16
+ /** Working directory (for stdio transport) */
17
+ workingDirectory?: string;
18
+ /** URL for SSE/HTTP transport */
19
+ url?: string;
20
+ /** HTTP headers (for SSE/HTTP transport) */
21
+ headers?: Record<string, string>;
22
+ /** Session ID for HTTP transport (optional, server may generate one) */
23
+ sessionId?: string;
24
+ /** MCP method/tool to call */
25
+ method: string;
26
+ /** Arguments to pass to the MCP method (supports Liquid templates) */
27
+ methodArgs?: Record<string, unknown>;
28
+ /** Transform template for method arguments (Liquid) */
29
+ argsTransform?: string;
30
+ /** Transform template for output (Liquid) */
31
+ transform?: string;
32
+ /** Transform using JavaScript expressions */
33
+ transform_js?: string;
34
+ /** Timeout in seconds */
35
+ timeout?: number;
36
+ }
37
+ /**
38
+ * Check provider that calls MCP tools directly
39
+ * Supports stdio, SSE (legacy), and Streamable HTTP transports
40
+ */
41
+ export declare class McpCheckProvider extends CheckProvider {
42
+ private liquid;
43
+ private sandbox?;
44
+ constructor();
45
+ /**
46
+ * Create a secure sandbox for JavaScript execution
47
+ * - Uses Sandbox.SAFE_GLOBALS which excludes: Function, eval, require, process, etc.
48
+ * - Only allows explicitly whitelisted prototype methods
49
+ * - No access to filesystem, network, or system resources
50
+ */
51
+ private createSecureSandbox;
52
+ getName(): string;
53
+ getDescription(): string;
54
+ validateConfig(config: unknown): Promise<boolean>;
55
+ execute(prInfo: PRInfo, config: CheckProviderConfig, dependencyResults?: Map<string, ReviewSummary>): Promise<ReviewSummary>;
56
+ /**
57
+ * Execute an MCP method using the configured transport
58
+ */
59
+ private executeMcpMethod;
60
+ /**
61
+ * Generic method to execute MCP method with any transport
62
+ */
63
+ private executeWithTransport;
64
+ /**
65
+ * Execute MCP method using stdio transport
66
+ */
67
+ private executeStdioMethod;
68
+ /**
69
+ * Execute MCP method using SSE transport
70
+ */
71
+ private executeSseMethod;
72
+ /**
73
+ * Execute MCP method using Streamable HTTP transport
74
+ */
75
+ private executeHttpMethod;
76
+ /**
77
+ * Build output context from dependency results
78
+ */
79
+ private buildOutputContext;
80
+ /**
81
+ * Get safe environment variables
82
+ */
83
+ private getSafeEnvironmentVariables;
84
+ /**
85
+ * Extract issues from MCP output
86
+ */
87
+ private extractIssuesFromOutput;
88
+ /**
89
+ * Normalize an array of issues
90
+ */
91
+ private normalizeIssueArray;
92
+ /**
93
+ * Normalize a single issue
94
+ */
95
+ private normalizeIssue;
96
+ private toTrimmedString;
97
+ private toNumber;
98
+ getSupportedConfigKeys(): string[];
99
+ isAvailable(): Promise<boolean>;
100
+ getRequirements(): string[];
101
+ }
102
+ //# sourceMappingURL=mcp-check-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/mcp-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAUzD;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACrC,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAU;;IAW1B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAuE3B,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAC7C,OAAO,CAAC,aAAa,CAAC;IAmJzB;;OAEG;YACW,gBAAgB;IAkB9B;;OAEG;YACW,oBAAoB;IA8ElC;;OAEG;YACW,kBAAkB;IAqBhC;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAcnC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuD/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAyDtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,QAAQ;IAWhB,sBAAsB,IAAI,MAAM,EAAE;IAwB5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC,eAAe,IAAI,MAAM,EAAE;CAG5B"}
@@ -0,0 +1,11 @@
1
+ import {
2
+ CheckExecutionEngine
3
+ } from "./chunk-POYXI3MQ.mjs";
4
+ import "./chunk-YXOWIDEF.mjs";
5
+ import "./chunk-I3GQJIR7.mjs";
6
+ import "./chunk-IG3BFIIN.mjs";
7
+ import "./chunk-WMJKH4XE.mjs";
8
+ export {
9
+ CheckExecutionEngine
10
+ };
11
+ //# sourceMappingURL=check-execution-engine-W5FLIWZL.mjs.map
@@ -0,0 +1,174 @@
1
+ import {
2
+ __esm,
3
+ __export,
4
+ __toCommonJS
5
+ } from "./chunk-WMJKH4XE.mjs";
6
+
7
+ // src/telemetry/fallback-ndjson.ts
8
+ var fallback_ndjson_exports = {};
9
+ __export(fallback_ndjson_exports, {
10
+ emitNdjsonFallback: () => emitNdjsonFallback,
11
+ emitNdjsonSpanWithEvents: () => emitNdjsonSpanWithEvents,
12
+ flushNdjson: () => flushNdjson
13
+ });
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ function resolveTargetPath(outDir) {
17
+ if (process.env.VISOR_FALLBACK_TRACE_FILE) {
18
+ CURRENT_FILE = process.env.VISOR_FALLBACK_TRACE_FILE;
19
+ return CURRENT_FILE;
20
+ }
21
+ if (CURRENT_FILE) return CURRENT_FILE;
22
+ const ts = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
23
+ CURRENT_FILE = path.join(outDir, `${ts}.ndjson`);
24
+ return CURRENT_FILE;
25
+ }
26
+ function isEnabled() {
27
+ if (process.env.VISOR_FALLBACK_TRACE_FILE) return true;
28
+ return process.env.VISOR_TELEMETRY_ENABLED === "true" && (process.env.VISOR_TELEMETRY_SINK || "file") === "file";
29
+ }
30
+ function appendAsync(outDir, line) {
31
+ writeChain = writeChain.then(async () => {
32
+ if (!dirReady) {
33
+ try {
34
+ await fs.promises.mkdir(outDir, { recursive: true });
35
+ } catch {
36
+ }
37
+ dirReady = true;
38
+ }
39
+ const target = resolveTargetPath(outDir);
40
+ await fs.promises.appendFile(target, line, "utf8");
41
+ }).catch(() => {
42
+ });
43
+ }
44
+ async function flushNdjson() {
45
+ try {
46
+ await writeChain;
47
+ } catch {
48
+ }
49
+ }
50
+ function emitNdjsonFallback(name, attrs) {
51
+ try {
52
+ if (!isEnabled()) return;
53
+ const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
54
+ const line = JSON.stringify({ name, attributes: attrs }) + "\n";
55
+ appendAsync(outDir, line);
56
+ } catch {
57
+ }
58
+ }
59
+ function emitNdjsonSpanWithEvents(name, attrs, events) {
60
+ try {
61
+ if (!isEnabled()) return;
62
+ const outDir = process.env.VISOR_TRACE_DIR || path.join(process.cwd(), "output", "traces");
63
+ const line = JSON.stringify({ name, attributes: attrs, events }) + "\n";
64
+ appendAsync(outDir, line);
65
+ } catch {
66
+ }
67
+ }
68
+ var CURRENT_FILE, dirReady, writeChain;
69
+ var init_fallback_ndjson = __esm({
70
+ "src/telemetry/fallback-ndjson.ts"() {
71
+ "use strict";
72
+ CURRENT_FILE = null;
73
+ dirReady = false;
74
+ writeChain = Promise.resolve();
75
+ }
76
+ });
77
+
78
+ // src/telemetry/trace-helpers.ts
79
+ import { context as otContext, SpanStatusCode, trace } from "@opentelemetry/api";
80
+ function addEvent(name, attrs) {
81
+ const span = trace.getSpan(otContext.active());
82
+ if (span) {
83
+ try {
84
+ span.addEvent(name, attrs);
85
+ } catch {
86
+ }
87
+ }
88
+ try {
89
+ const { emitNdjsonSpanWithEvents: emitNdjsonSpanWithEvents2 } = (init_fallback_ndjson(), __toCommonJS(fallback_ndjson_exports));
90
+ emitNdjsonSpanWithEvents2("visor.event", {}, [{ name, attrs }]);
91
+ if (name === "fail_if.triggered") {
92
+ emitNdjsonSpanWithEvents2("visor.event", {}, [
93
+ { name: "fail_if.evaluated", attrs },
94
+ { name: "fail_if.triggered", attrs }
95
+ ]);
96
+ }
97
+ } catch {
98
+ }
99
+ }
100
+
101
+ // src/telemetry/metrics.ts
102
+ import { metrics } from "@opentelemetry/api";
103
+ var initialized = false;
104
+ var meter = metrics.getMeter("visor");
105
+ var TEST_ENABLED = process.env.VISOR_TEST_METRICS === "true";
106
+ var TEST_SNAPSHOT = { fail_if_triggered: 0 };
107
+ var checkDurationHist;
108
+ var providerDurationHist;
109
+ var foreachDurationHist;
110
+ var issuesCounter;
111
+ var activeChecks;
112
+ var failIfCounter;
113
+ var diagramBlocks;
114
+ function ensureInstruments() {
115
+ if (initialized) return;
116
+ try {
117
+ checkDurationHist = meter.createHistogram("visor.check.duration_ms", {
118
+ description: "Duration of a check execution in milliseconds",
119
+ unit: "ms"
120
+ });
121
+ providerDurationHist = meter.createHistogram("visor.provider.duration_ms", {
122
+ description: "Duration of provider execution in milliseconds",
123
+ unit: "ms"
124
+ });
125
+ foreachDurationHist = meter.createHistogram("visor.foreach.item.duration_ms", {
126
+ description: "Duration of a forEach item execution in milliseconds",
127
+ unit: "ms"
128
+ });
129
+ issuesCounter = meter.createCounter("visor.check.issues", {
130
+ description: "Number of issues produced by checks",
131
+ unit: "1"
132
+ });
133
+ activeChecks = meter.createUpDownCounter("visor.run.active_checks", {
134
+ description: "Number of checks actively running",
135
+ unit: "1"
136
+ });
137
+ failIfCounter = meter.createCounter("visor.fail_if.triggered", {
138
+ description: "Number of times fail_if condition triggered",
139
+ unit: "1"
140
+ });
141
+ diagramBlocks = meter.createCounter("visor.diagram.blocks", {
142
+ description: "Number of Mermaid diagram blocks emitted",
143
+ unit: "1"
144
+ });
145
+ initialized = true;
146
+ } catch {
147
+ }
148
+ }
149
+ function addFailIfTriggered(check, scope) {
150
+ ensureInstruments();
151
+ try {
152
+ failIfCounter?.add(1, { "visor.check.id": check, scope });
153
+ } catch {
154
+ }
155
+ if (TEST_ENABLED) TEST_SNAPSHOT.fail_if_triggered++;
156
+ }
157
+ function addDiagramBlock(origin) {
158
+ ensureInstruments();
159
+ try {
160
+ diagramBlocks?.add(1, { origin });
161
+ } catch {
162
+ }
163
+ }
164
+
165
+ export {
166
+ emitNdjsonFallback,
167
+ emitNdjsonSpanWithEvents,
168
+ fallback_ndjson_exports,
169
+ init_fallback_ndjson,
170
+ addEvent,
171
+ addFailIfTriggered,
172
+ addDiagramBlock
173
+ };
174
+ //# sourceMappingURL=chunk-IG3BFIIN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/telemetry/fallback-ndjson.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","import { context as otContext, Span, SpanStatusCode, trace, Attributes } from '@opentelemetry/api';\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 return await new Promise<T>((resolve, reject) => {\n const callback = async (span: Span) => {\n try {\n const res = await fn(span);\n resolve(res);\n } catch (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 span.end();\n } catch {}\n }\n };\n if (attrs) {\n tracer.startActiveSpan(name, { attributes: attrs as Attributes }, callback);\n } else {\n tracer.startActiveSpan(name, callback as (span: Span) => void);\n }\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 (process.env.VISOR_TELEMETRY_SINK !== 'file') 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 '@opentelemetry/api';\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":["emitNdjsonSpanWithEvents"]}