@probelabs/visor 0.1.174 → 0.1.175

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 (84) hide show
  1. package/README.md +3 -2
  2. package/dist/cli-main.d.ts.map +1 -1
  3. package/dist/docs/guides/tdd-assistant-workflows.md +519 -0
  4. package/dist/docs/testing/dsl-reference.md +93 -0
  5. package/dist/examples/lifecycle-hooks.tests.yaml +62 -0
  6. package/dist/generated/config-schema.d.ts +28 -7
  7. package/dist/generated/config-schema.d.ts.map +1 -1
  8. package/dist/generated/config-schema.json +31 -7
  9. package/dist/index.js +331 -26
  10. package/dist/output/traces/{run-2026-03-09T15-44-30-340Z.ndjson → run-2026-03-09T18-49-07-663Z.ndjson} +84 -84
  11. package/dist/output/traces/{run-2026-03-09T15-45-10-778Z.ndjson → run-2026-03-09T18-49-46-345Z.ndjson} +1917 -1901
  12. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  13. package/dist/providers/mcp-custom-sse-server.d.ts +4 -0
  14. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  15. package/dist/sdk/{a2a-frontend-5L6H7ZVF.mjs → a2a-frontend-ORLAU5GK.mjs} +2 -2
  16. package/dist/sdk/{check-provider-registry-UPQNHHFF.mjs → check-provider-registry-7JPPJHVM.mjs} +3 -3
  17. package/dist/sdk/{check-provider-registry-YVQI4IOR.mjs → check-provider-registry-O36CQEGD.mjs} +3 -3
  18. package/dist/sdk/{check-provider-registry-UM762L7S.mjs → check-provider-registry-QCDV3SI6.mjs} +6 -6
  19. package/dist/sdk/{chunk-ZI3SEHWA.mjs → chunk-4FGX4SA6.mjs} +2 -2
  20. package/dist/sdk/{chunk-ZI3SEHWA.mjs.map → chunk-4FGX4SA6.mjs.map} +1 -1
  21. package/dist/sdk/{chunk-2PL2YH3B.mjs → chunk-FZPCP444.mjs} +153 -14
  22. package/dist/sdk/chunk-FZPCP444.mjs.map +1 -0
  23. package/dist/sdk/{chunk-UTBSBJFV.mjs → chunk-HNK5ZJ2L.mjs} +2 -2
  24. package/dist/sdk/{chunk-W4KCJM6J.mjs → chunk-MLXGCLZJ.mjs} +29 -8
  25. package/dist/sdk/chunk-MLXGCLZJ.mjs.map +1 -0
  26. package/dist/sdk/{chunk-YEARBXYT.mjs → chunk-QAO73GUX.mjs} +3 -3
  27. package/dist/sdk/{chunk-I6GKXMQ5.mjs → chunk-TAK5HLAR.mjs} +153 -14
  28. package/dist/sdk/chunk-TAK5HLAR.mjs.map +1 -0
  29. package/dist/sdk/{chunk-EP7PQ4IX.mjs → chunk-YVVOG7RP.mjs} +161 -22
  30. package/dist/sdk/chunk-YVVOG7RP.mjs.map +1 -0
  31. package/dist/sdk/{config-BVL3KFMB.mjs → config-4JMBJKWS.mjs} +2 -2
  32. package/dist/sdk/{failure-condition-evaluator-4O6BTC4Q.mjs → failure-condition-evaluator-RM5JJS4Q.mjs} +3 -3
  33. package/dist/sdk/{github-frontend-UXL73NKB.mjs → github-frontend-O5IAWXL5.mjs} +3 -3
  34. package/dist/sdk/{host-KJTXX76P.mjs → host-WTJBWO4T.mjs} +3 -3
  35. package/dist/sdk/{routing-AWYB2YX3.mjs → routing-AWOHU2WP.mjs} +4 -4
  36. package/dist/sdk/{schedule-tool-UMDRCNO5.mjs → schedule-tool-DF5WUVYV.mjs} +3 -3
  37. package/dist/sdk/{schedule-tool-SGCYDSHL.mjs → schedule-tool-L5G2BRIG.mjs} +6 -6
  38. package/dist/sdk/{schedule-tool-IEY2CFLU.mjs → schedule-tool-XVSYLH4Z.mjs} +3 -3
  39. package/dist/sdk/{schedule-tool-handler-5EPTHBLS.mjs → schedule-tool-handler-CFMFHDUL.mjs} +3 -3
  40. package/dist/sdk/{schedule-tool-handler-HMEGLYJF.mjs → schedule-tool-handler-JGWA4N3C.mjs} +3 -3
  41. package/dist/sdk/{schedule-tool-handler-5QVUZ5EZ.mjs → schedule-tool-handler-UJ4RFTW2.mjs} +6 -6
  42. package/dist/sdk/sdk.d.mts +9 -1
  43. package/dist/sdk/sdk.d.ts +9 -1
  44. package/dist/sdk/sdk.js +173 -13
  45. package/dist/sdk/sdk.js.map +1 -1
  46. package/dist/sdk/sdk.mjs +5 -5
  47. package/dist/sdk/{trace-helpers-6TEWG7RK.mjs → trace-helpers-4ERTVCZG.mjs} +2 -2
  48. package/dist/sdk/{workflow-check-provider-VJ7VIMCQ.mjs → workflow-check-provider-ETM452BO.mjs} +3 -3
  49. package/dist/sdk/{workflow-check-provider-7VNIO6L5.mjs → workflow-check-provider-I3XLJP6V.mjs} +6 -6
  50. package/dist/sdk/{workflow-check-provider-EWMZEEES.mjs → workflow-check-provider-Z6U7FZAF.mjs} +3 -3
  51. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  52. package/dist/test-runner/index.d.ts +19 -0
  53. package/dist/test-runner/index.d.ts.map +1 -1
  54. package/dist/test-runner/validator.d.ts.map +1 -1
  55. package/dist/traces/{run-2026-03-09T15-44-30-340Z.ndjson → run-2026-03-09T18-49-07-663Z.ndjson} +84 -84
  56. package/dist/traces/{run-2026-03-09T15-45-10-778Z.ndjson → run-2026-03-09T18-49-46-345Z.ndjson} +1917 -1901
  57. package/dist/types/config.d.ts +9 -1
  58. package/dist/types/config.d.ts.map +1 -1
  59. package/package.json +1 -1
  60. package/dist/sdk/chunk-2PL2YH3B.mjs.map +0 -1
  61. package/dist/sdk/chunk-EP7PQ4IX.mjs.map +0 -1
  62. package/dist/sdk/chunk-I6GKXMQ5.mjs.map +0 -1
  63. package/dist/sdk/chunk-W4KCJM6J.mjs.map +0 -1
  64. /package/dist/sdk/{a2a-frontend-5L6H7ZVF.mjs.map → a2a-frontend-ORLAU5GK.mjs.map} +0 -0
  65. /package/dist/sdk/{check-provider-registry-UM762L7S.mjs.map → check-provider-registry-7JPPJHVM.mjs.map} +0 -0
  66. /package/dist/sdk/{check-provider-registry-UPQNHHFF.mjs.map → check-provider-registry-O36CQEGD.mjs.map} +0 -0
  67. /package/dist/sdk/{check-provider-registry-YVQI4IOR.mjs.map → check-provider-registry-QCDV3SI6.mjs.map} +0 -0
  68. /package/dist/sdk/{chunk-UTBSBJFV.mjs.map → chunk-HNK5ZJ2L.mjs.map} +0 -0
  69. /package/dist/sdk/{chunk-YEARBXYT.mjs.map → chunk-QAO73GUX.mjs.map} +0 -0
  70. /package/dist/sdk/{config-BVL3KFMB.mjs.map → config-4JMBJKWS.mjs.map} +0 -0
  71. /package/dist/sdk/{failure-condition-evaluator-4O6BTC4Q.mjs.map → failure-condition-evaluator-RM5JJS4Q.mjs.map} +0 -0
  72. /package/dist/sdk/{github-frontend-UXL73NKB.mjs.map → github-frontend-O5IAWXL5.mjs.map} +0 -0
  73. /package/dist/sdk/{host-KJTXX76P.mjs.map → host-WTJBWO4T.mjs.map} +0 -0
  74. /package/dist/sdk/{routing-AWYB2YX3.mjs.map → routing-AWOHU2WP.mjs.map} +0 -0
  75. /package/dist/sdk/{schedule-tool-IEY2CFLU.mjs.map → schedule-tool-DF5WUVYV.mjs.map} +0 -0
  76. /package/dist/sdk/{schedule-tool-SGCYDSHL.mjs.map → schedule-tool-L5G2BRIG.mjs.map} +0 -0
  77. /package/dist/sdk/{schedule-tool-UMDRCNO5.mjs.map → schedule-tool-XVSYLH4Z.mjs.map} +0 -0
  78. /package/dist/sdk/{schedule-tool-handler-5EPTHBLS.mjs.map → schedule-tool-handler-CFMFHDUL.mjs.map} +0 -0
  79. /package/dist/sdk/{schedule-tool-handler-5QVUZ5EZ.mjs.map → schedule-tool-handler-JGWA4N3C.mjs.map} +0 -0
  80. /package/dist/sdk/{schedule-tool-handler-HMEGLYJF.mjs.map → schedule-tool-handler-UJ4RFTW2.mjs.map} +0 -0
  81. /package/dist/sdk/{trace-helpers-6TEWG7RK.mjs.map → trace-helpers-4ERTVCZG.mjs.map} +0 -0
  82. /package/dist/sdk/{workflow-check-provider-7VNIO6L5.mjs.map → workflow-check-provider-ETM452BO.mjs.map} +0 -0
  83. /package/dist/sdk/{workflow-check-provider-EWMZEEES.mjs.map → workflow-check-provider-I3XLJP6V.mjs.map} +0 -0
  84. /package/dist/sdk/{workflow-check-provider-VJ7VIMCQ.mjs.map → workflow-check-provider-Z6U7FZAF.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-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;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAgCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;IAukC/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsE7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA2G5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuBpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAWhG,sBAAsB,IAAI,MAAM,EAAE;IA4C5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
1
+ {"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-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;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAgCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;IAkoC/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsE7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA2G5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuBpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAWhG,sBAAsB,IAAI,MAAM,EAAE;IA4C5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
@@ -93,6 +93,10 @@ export declare class CustomToolsSSEServer implements CustomMCPServer {
93
93
  * Handle tools/call MCP request
94
94
  */
95
95
  private handleToolCall;
96
+ /**
97
+ * Execute an http_client tool — proxy REST API calls through the configured base URL.
98
+ */
99
+ private executeHttpClientTool;
96
100
  /**
97
101
  * Convert a type: 'workflow' tool definition into a WorkflowToolDefinition marker.
98
102
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-custom-sse-server.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/mcp-custom-sse-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAKvD,OAAO,EAKL,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AA+FlC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,IAAI,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAS;gBAGpD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,OAAe,EACtB,eAAe,CAAC,EAAE,mBAAmB;IAqDvC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAqD9B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoFlF;;OAEG;IACH,MAAM,IAAI,MAAM;IAOhB;;OAEG;YACW,aAAa;IAuC3B;;;OAGG;YACW,mBAAmB;IA4DjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2C3B;;OAEG;YACW,aAAa;IAyE3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;YACW,gBAAgB;IAkE9B;;OAEG;YACW,eAAe;IA0D7B;;OAEG;YACW,cAAc;IA6N5B;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAwFjC,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAmB1B"}
1
+ {"version":3,"file":"mcp-custom-sse-server.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/mcp-custom-sse-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAKvD,OAAO,EAKL,mBAAmB,EAEpB,MAAM,0BAA0B,CAAC;AAuGlC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,IAAI,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,eAAe,CAAC,CAAsB;IAC9C,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAS;gBAGpD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACxC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,OAAe,EACtB,eAAe,CAAC,EAAE,mBAAmB;IAuDvC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAqD9B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgCtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoFlF;;OAEG;IACH,MAAM,IAAI,MAAM;IAOhB;;OAEG;YACW,aAAa;IAuC3B;;;OAGG;YACW,mBAAmB;IA4DjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2C3B;;OAEG;YACW,aAAa;IAyE3B;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;YACW,gBAAgB;IAkE9B;;OAEG;YACW,eAAe;IAiE7B;;OAEG;YACW,cAAc;IAgO5B;;OAEG;YACW,qBAAqB;IA8FnC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAwFjC,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAmB1B"}
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  init_trace_helpers,
14
14
  withActiveSpan
15
- } from "./chunk-ZI3SEHWA.mjs";
15
+ } from "./chunk-4FGX4SA6.mjs";
16
16
  import "./chunk-6VVXKXTI.mjs";
17
17
  import "./chunk-34QX63WK.mjs";
18
18
  import {
@@ -1655,4 +1655,4 @@ export {
1655
1655
  messageToWorkflowInput,
1656
1656
  resultToArtifacts
1657
1657
  };
1658
- //# sourceMappingURL=a2a-frontend-5L6H7ZVF.mjs.map
1658
+ //# sourceMappingURL=a2a-frontend-ORLAU5GK.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CheckProviderRegistry,
3
3
  init_check_provider_registry
4
- } from "./chunk-2PL2YH3B.mjs";
4
+ } from "./chunk-TAK5HLAR.mjs";
5
5
  import "./chunk-YSOIR46P.mjs";
6
6
  import "./chunk-PDQTEBOJ.mjs";
7
7
  import "./chunk-7VTZDC2X.mjs";
@@ -9,7 +9,7 @@ import "./chunk-B7BVQM5K.mjs";
9
9
  import "./chunk-XXAEN5KU.mjs";
10
10
  import "./chunk-RHKPFJLG.mjs";
11
11
  import "./chunk-UBTZE3FO.mjs";
12
- import "./chunk-W4KCJM6J.mjs";
12
+ import "./chunk-MLXGCLZJ.mjs";
13
13
  import "./chunk-KWTCTEFT.mjs";
14
14
  import "./chunk-WJIV7MKY.mjs";
15
15
  import "./chunk-EFNNJIMY.mjs";
@@ -27,4 +27,4 @@ init_check_provider_registry();
27
27
  export {
28
28
  CheckProviderRegistry
29
29
  };
30
- //# sourceMappingURL=check-provider-registry-UPQNHHFF.mjs.map
30
+ //# sourceMappingURL=check-provider-registry-7JPPJHVM.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CheckProviderRegistry,
3
3
  init_check_provider_registry
4
- } from "./chunk-I6GKXMQ5.mjs";
4
+ } from "./chunk-FZPCP444.mjs";
5
5
  import "./chunk-YSOIR46P.mjs";
6
6
  import "./chunk-PDQTEBOJ.mjs";
7
7
  import "./chunk-7VTZDC2X.mjs";
@@ -9,7 +9,7 @@ import "./chunk-B7BVQM5K.mjs";
9
9
  import "./chunk-XXAEN5KU.mjs";
10
10
  import "./chunk-RHKPFJLG.mjs";
11
11
  import "./chunk-UBTZE3FO.mjs";
12
- import "./chunk-W4KCJM6J.mjs";
12
+ import "./chunk-MLXGCLZJ.mjs";
13
13
  import "./chunk-KWTCTEFT.mjs";
14
14
  import "./chunk-WJIV7MKY.mjs";
15
15
  import "./chunk-EFNNJIMY.mjs";
@@ -27,4 +27,4 @@ init_check_provider_registry();
27
27
  export {
28
28
  CheckProviderRegistry
29
29
  };
30
- //# sourceMappingURL=check-provider-registry-YVQI4IOR.mjs.map
30
+ //# sourceMappingURL=check-provider-registry-O36CQEGD.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CheckProviderRegistry,
3
3
  init_check_provider_registry
4
- } from "./chunk-EP7PQ4IX.mjs";
4
+ } from "./chunk-YVVOG7RP.mjs";
5
5
  import "./chunk-YSOIR46P.mjs";
6
6
  import "./chunk-PDQTEBOJ.mjs";
7
7
  import "./chunk-7VTZDC2X.mjs";
@@ -9,11 +9,11 @@ import "./chunk-B7BVQM5K.mjs";
9
9
  import "./chunk-XXAEN5KU.mjs";
10
10
  import "./chunk-RHKPFJLG.mjs";
11
11
  import "./chunk-UBTZE3FO.mjs";
12
- import "./chunk-W4KCJM6J.mjs";
12
+ import "./chunk-MLXGCLZJ.mjs";
13
13
  import "./chunk-KWTCTEFT.mjs";
14
- import "./chunk-YEARBXYT.mjs";
15
- import "./chunk-UTBSBJFV.mjs";
16
- import "./chunk-ZI3SEHWA.mjs";
14
+ import "./chunk-QAO73GUX.mjs";
15
+ import "./chunk-HNK5ZJ2L.mjs";
16
+ import "./chunk-4FGX4SA6.mjs";
17
17
  import "./chunk-6VVXKXTI.mjs";
18
18
  import "./chunk-34QX63WK.mjs";
19
19
  import "./chunk-PQWZ6NFL.mjs";
@@ -27,4 +27,4 @@ init_check_provider_registry();
27
27
  export {
28
28
  CheckProviderRegistry
29
29
  };
30
- //# sourceMappingURL=check-provider-registry-UM762L7S.mjs.map
30
+ //# sourceMappingURL=check-provider-registry-QCDV3SI6.mjs.map
@@ -96,7 +96,7 @@ var require_package = __commonJS({
96
96
  "package.json"(exports, module) {
97
97
  module.exports = {
98
98
  name: "@probelabs/visor",
99
- version: "0.1.174",
99
+ version: "0.1.175",
100
100
  main: "dist/index.js",
101
101
  bin: {
102
102
  visor: "./dist/index.js"
@@ -513,4 +513,4 @@ export {
513
513
  trace_helpers_exports,
514
514
  init_trace_helpers
515
515
  };
516
- //# sourceMappingURL=chunk-ZI3SEHWA.mjs.map
516
+ //# sourceMappingURL=chunk-4FGX4SA6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/telemetry/fallback-ndjson.ts","../../package.json","../../src/telemetry/trace-helpers.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 \"name\": \"@probelabs/visor\",\n \"version\": \"0.1.174\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"visor\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\"\n },\n \"./sdk\": {\n \"types\": \"./dist/sdk/sdk.d.ts\",\n \"import\": \"./dist/sdk/sdk.mjs\",\n \"require\": \"./dist/sdk/sdk.js\"\n },\n \"./cli\": {\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist/\",\n \"defaults/\",\n \"action.yml\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"scripts\": {\n \"build:cli\": \"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo '#!/usr/bin/env node' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js\",\n \"build:sdk\": \"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk\",\n \"build\": \"./scripts/build-oss.sh\",\n \"build:ee\": \"npm run build:cli && npm run build:sdk\",\n \"test\": \"jest && npm run test:yaml\",\n \"test:unit\": \"jest\",\n \"prepublishOnly\": \"npm run build\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"test:ee\": \"jest --testPathPatterns='tests/ee' --testPathIgnorePatterns='/node_modules/' --no-coverage\",\n \"test:manual:bash\": \"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts\",\n \"lint\": \"eslint src tests --ext .ts\",\n \"lint:fix\": \"eslint src tests --ext .ts --fix\",\n \"format\": \"prettier --write src tests\",\n \"format:check\": \"prettier --check src tests\",\n \"clean\": \"\",\n \"clean:traces\": \"node scripts/clean-traces.js\",\n \"prebuild\": \"npm run clean && node scripts/generate-config-schema.js\",\n \"pretest\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"pretest:unit\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"test:with-build\": \"npm run build:cli && jest\",\n \"test:yaml\": \"node dist/index.js test --progress compact\",\n \"test:yaml:parallel\": \"node dist/index.js test --progress compact --max-parallel 4\",\n \"prepare\": \"husky\",\n \"pre-commit\": \"lint-staged\",\n \"deploy:site\": \"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true\",\n \"deploy:worker\": \"npx wrangler deploy\",\n \"deploy\": \"npm run deploy:site && npm run deploy:worker\",\n \"publish:ee\": \"./scripts/publish-ee.sh\",\n \"release\": \"./scripts/release.sh\",\n \"release:patch\": \"./scripts/release.sh patch\",\n \"release:minor\": \"./scripts/release.sh minor\",\n \"release:major\": \"./scripts/release.sh major\",\n \"release:prerelease\": \"./scripts/release.sh prerelease\",\n \"docs:validate\": \"node scripts/validate-readme-links.js\",\n \"workshop:setup\": \"npm install -D reveal-md@6.1.2\",\n \"workshop:serve\": \"cd workshop && reveal-md slides.md -w\",\n \"workshop:export\": \"reveal-md workshop/slides.md --static workshop/build\",\n \"workshop:pdf\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter\",\n \"workshop:pdf:ci\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\\"--no-sandbox --disable-dev-shm-usage\\\"\",\n \"workshop:pdf:a4\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4\",\n \"workshop:build\": \"npm run workshop:export && npm run workshop:pdf\",\n \"simulate:issue\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug\",\n \"simulate:comment\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug\"\n },\n \"keywords\": [\n \"code-review\",\n \"ai\",\n \"github-action\",\n \"cli\",\n \"pr-review\",\n \"visor\"\n ],\n \"author\": \"Probe Labs\",\n \"license\": \"MIT\",\n \"description\": \"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/probelabs/visor.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/probelabs/visor/issues\"\n },\n \"homepage\": \"https://github.com/probelabs/visor#readme\",\n \"dependencies\": {\n \"@actions/core\": \"^1.11.1\",\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@grammyjs/runner\": \"^2.0.3\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@nyariv/sandboxjs\": \"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108\",\n \"@octokit/action\": \"^8.0.2\",\n \"@octokit/auth-app\": \"^8.1.0\",\n \"@octokit/core\": \"^7.0.3\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/instrumentation\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-logs\": \"^0.203.0\",\n \"@opentelemetry/sdk-metrics\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.30.1\",\n \"@probelabs/probe\": \"^0.6.0-rc291\",\n \"@types/commander\": \"^2.12.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"acorn\": \"^8.16.0\",\n \"acorn-walk\": \"^8.3.5\",\n \"ajv\": \"^8.17.1\",\n \"ajv-formats\": \"^3.0.1\",\n \"better-sqlite3\": \"^11.0.0\",\n \"blessed\": \"^0.1.81\",\n \"botbuilder\": \"^4.23.3\",\n \"botframework-connector\": \"^4.23.3\",\n \"cli-table3\": \"^0.6.5\",\n \"commander\": \"^14.0.0\",\n \"deepmerge\": \"^4.3.1\",\n \"dotenv\": \"^17.2.3\",\n \"grammy\": \"^1.41.1\",\n \"ignore\": \"^7.0.5\",\n \"imapflow\": \"^1.2.12\",\n \"js-yaml\": \"^4.1.0\",\n \"jsonpath-plus\": \"^10.4.0\",\n \"liquidjs\": \"^10.21.1\",\n \"mailparser\": \"^3.9.3\",\n \"minimatch\": \"^10.2.2\",\n \"node-cron\": \"^3.0.3\",\n \"nodemailer\": \"^8.0.1\",\n \"open\": \"^9.1.0\",\n \"resend\": \"^6.9.3\",\n \"simple-git\": \"^3.28.0\",\n \"uuid\": \"^11.1.0\",\n \"ws\": \"^8.18.3\"\n },\n \"optionalDependencies\": {\n \"@anthropic/claude-code-sdk\": \"npm:null@*\",\n \"@open-policy-agent/opa-wasm\": \"^1.10.0\",\n \"knex\": \"^3.1.0\",\n \"mysql2\": \"^3.11.0\",\n \"pg\": \"^8.13.0\",\n \"tedious\": \"^19.0.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.34.0\",\n \"@kie/act-js\": \"^2.6.2\",\n \"@kie/mock-github\": \"^2.0.1\",\n \"@swc/core\": \"^1.13.2\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/better-sqlite3\": \"^7.6.0\",\n \"@types/blessed\": \"^0.1.27\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/mailparser\": \"^3.4.6\",\n \"@types/node\": \"^24.3.0\",\n \"@types/node-cron\": \"^3.0.11\",\n \"@types/nodemailer\": \"^7.0.11\",\n \"@types/ws\": \"^8.18.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.42.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@vercel/ncc\": \"^0.38.4\",\n \"eslint\": \"^9.34.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.1.3\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"reveal-md\": \"^6.1.2\",\n \"ts-json-schema-generator\": \"^1.5.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.2\",\n \"wrangler\": \"^3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic/claude-code-sdk\": {\n \"optional\": true\n }\n },\n \"directories\": {\n \"test\": \"tests\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"tests/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n }\n}\n","import { context as otContext, Span, SpanStatusCode, trace, Attributes } from './lazy-otel';\nimport { getInstanceId } from '../utils/instance-id';\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/**\n * Return standard visor.* resource attributes for the root `visor.run` span.\n * Reads version from package.json / env and git commit short SHA from env.\n */\nexport function getVisorRunAttributes(): Record<string, string> {\n const attrs: Record<string, string> = {};\n try {\n attrs['visor.version'] =\n process.env.VISOR_VERSION || (require('../../package.json')?.version ?? 'dev');\n } catch {\n attrs['visor.version'] = 'dev';\n }\n const commitShort = process.env.VISOR_COMMIT_SHORT || '';\n const commitFull = process.env.VISOR_COMMIT_SHA || process.env.VISOR_COMMIT || '';\n if (commitShort) {\n attrs['visor.commit'] = commitShort;\n }\n if (commitFull) {\n attrs['visor.commit.sha'] = commitFull;\n }\n attrs['visor.instance_id'] = getInstanceId();\n return attrs;\n}\n\n/**\n * Wraps a visor.run span with automatic run metrics (counter + duration histogram).\n * Use this instead of raw `withActiveSpan('visor.run', ...)` to get metrics for free.\n */\nexport async function withVisorRun<T>(\n attrs: Record<string, unknown>,\n runMeta: {\n source?: string;\n userId?: string;\n userName?: string;\n workflowId?: string;\n },\n fn: (span: Span) => Promise<T>\n): Promise<T> {\n const {\n recordRunStart,\n recordRunDuration,\n resetRunAiCalls,\n recordRunAiCalls,\n getRunAiCalls,\n } = require('./metrics');\n const instanceId = getInstanceId();\n recordRunStart({\n source: runMeta.source,\n userId: runMeta.userId,\n userName: runMeta.userName,\n workflowId: runMeta.workflowId,\n instanceId,\n });\n resetRunAiCalls();\n const startMs = Date.now();\n let success = true;\n try {\n return await withActiveSpan('visor.run', attrs, async span => {\n try {\n return await fn(span);\n } finally {\n // Record AI call count as span attribute for trace visibility\n try {\n span.setAttribute('visor.run.ai_calls', getRunAiCalls());\n span.setAttribute('visor.run.duration_ms', Date.now() - startMs);\n } catch {}\n }\n });\n } catch (err) {\n success = false;\n throw err;\n } finally {\n recordRunAiCalls({\n source: runMeta.source,\n workflowId: runMeta.workflowId,\n });\n recordRunDuration(Date.now() - startMs, {\n source: runMeta.source,\n userId: runMeta.userId,\n workflowId: runMeta.workflowId,\n success,\n });\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"],"mappings":"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","names":["emitNdjsonSpanWithEvents","path","fs"]}
1
+ {"version":3,"sources":["../../src/telemetry/fallback-ndjson.ts","../../package.json","../../src/telemetry/trace-helpers.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 \"name\": \"@probelabs/visor\",\n \"version\": \"0.1.175\",\n \"main\": \"dist/index.js\",\n \"bin\": {\n \"visor\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\"\n },\n \"./sdk\": {\n \"types\": \"./dist/sdk/sdk.d.ts\",\n \"import\": \"./dist/sdk/sdk.mjs\",\n \"require\": \"./dist/sdk/sdk.js\"\n },\n \"./cli\": {\n \"require\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist/\",\n \"defaults/\",\n \"action.yml\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"scripts\": {\n \"build:cli\": \"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo '#!/usr/bin/env node' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js\",\n \"build:sdk\": \"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk\",\n \"build\": \"./scripts/build-oss.sh\",\n \"build:ee\": \"npm run build:cli && npm run build:sdk\",\n \"test\": \"jest && npm run test:yaml\",\n \"test:unit\": \"jest\",\n \"prepublishOnly\": \"npm run build\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"test:ee\": \"jest --testPathPatterns='tests/ee' --testPathIgnorePatterns='/node_modules/' --no-coverage\",\n \"test:manual:bash\": \"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts\",\n \"lint\": \"eslint src tests --ext .ts\",\n \"lint:fix\": \"eslint src tests --ext .ts --fix\",\n \"format\": \"prettier --write src tests\",\n \"format:check\": \"prettier --check src tests\",\n \"clean\": \"\",\n \"clean:traces\": \"node scripts/clean-traces.js\",\n \"prebuild\": \"npm run clean && node scripts/generate-config-schema.js\",\n \"pretest\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"pretest:unit\": \"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli\",\n \"test:with-build\": \"npm run build:cli && jest\",\n \"test:yaml\": \"node dist/index.js test --progress compact\",\n \"test:yaml:parallel\": \"node dist/index.js test --progress compact --max-parallel 4\",\n \"prepare\": \"husky\",\n \"pre-commit\": \"lint-staged\",\n \"deploy:site\": \"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true\",\n \"deploy:worker\": \"npx wrangler deploy\",\n \"deploy\": \"npm run deploy:site && npm run deploy:worker\",\n \"publish:ee\": \"./scripts/publish-ee.sh\",\n \"release\": \"./scripts/release.sh\",\n \"release:patch\": \"./scripts/release.sh patch\",\n \"release:minor\": \"./scripts/release.sh minor\",\n \"release:major\": \"./scripts/release.sh major\",\n \"release:prerelease\": \"./scripts/release.sh prerelease\",\n \"docs:validate\": \"node scripts/validate-readme-links.js\",\n \"workshop:setup\": \"npm install -D reveal-md@6.1.2\",\n \"workshop:serve\": \"cd workshop && reveal-md slides.md -w\",\n \"workshop:export\": \"reveal-md workshop/slides.md --static workshop/build\",\n \"workshop:pdf\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter\",\n \"workshop:pdf:ci\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\\"--no-sandbox --disable-dev-shm-usage\\\"\",\n \"workshop:pdf:a4\": \"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4\",\n \"workshop:build\": \"npm run workshop:export && npm run workshop:pdf\",\n \"simulate:issue\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug\",\n \"simulate:comment\": \"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug\"\n },\n \"keywords\": [\n \"code-review\",\n \"ai\",\n \"github-action\",\n \"cli\",\n \"pr-review\",\n \"visor\"\n ],\n \"author\": \"Probe Labs\",\n \"license\": \"MIT\",\n \"description\": \"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/probelabs/visor.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/probelabs/visor/issues\"\n },\n \"homepage\": \"https://github.com/probelabs/visor#readme\",\n \"dependencies\": {\n \"@actions/core\": \"^1.11.1\",\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@grammyjs/runner\": \"^2.0.3\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@nyariv/sandboxjs\": \"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108\",\n \"@octokit/action\": \"^8.0.2\",\n \"@octokit/auth-app\": \"^8.1.0\",\n \"@octokit/core\": \"^7.0.3\",\n \"@octokit/rest\": \"^22.0.0\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/api-logs\": \"^0.203.0\",\n \"@opentelemetry/core\": \"^1.30.1\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-metrics-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-grpc\": \"^0.203.0\",\n \"@opentelemetry/exporter-trace-otlp-http\": \"^0.203.0\",\n \"@opentelemetry/instrumentation\": \"^0.203.0\",\n \"@opentelemetry/resources\": \"^1.30.1\",\n \"@opentelemetry/sdk-logs\": \"^0.203.0\",\n \"@opentelemetry/sdk-metrics\": \"^1.30.1\",\n \"@opentelemetry/sdk-node\": \"^0.203.0\",\n \"@opentelemetry/sdk-trace-base\": \"^1.30.1\",\n \"@opentelemetry/semantic-conventions\": \"^1.30.1\",\n \"@probelabs/probe\": \"^0.6.0-rc291\",\n \"@types/commander\": \"^2.12.0\",\n \"@types/uuid\": \"^10.0.0\",\n \"acorn\": \"^8.16.0\",\n \"acorn-walk\": \"^8.3.5\",\n \"ajv\": \"^8.17.1\",\n \"ajv-formats\": \"^3.0.1\",\n \"better-sqlite3\": \"^11.0.0\",\n \"blessed\": \"^0.1.81\",\n \"botbuilder\": \"^4.23.3\",\n \"botframework-connector\": \"^4.23.3\",\n \"cli-table3\": \"^0.6.5\",\n \"commander\": \"^14.0.0\",\n \"deepmerge\": \"^4.3.1\",\n \"dotenv\": \"^17.2.3\",\n \"grammy\": \"^1.41.1\",\n \"ignore\": \"^7.0.5\",\n \"imapflow\": \"^1.2.12\",\n \"js-yaml\": \"^4.1.0\",\n \"jsonpath-plus\": \"^10.4.0\",\n \"liquidjs\": \"^10.21.1\",\n \"mailparser\": \"^3.9.3\",\n \"minimatch\": \"^10.2.2\",\n \"node-cron\": \"^3.0.3\",\n \"nodemailer\": \"^8.0.1\",\n \"open\": \"^9.1.0\",\n \"resend\": \"^6.9.3\",\n \"simple-git\": \"^3.28.0\",\n \"uuid\": \"^11.1.0\",\n \"ws\": \"^8.18.3\"\n },\n \"optionalDependencies\": {\n \"@anthropic/claude-code-sdk\": \"npm:null@*\",\n \"@open-policy-agent/opa-wasm\": \"^1.10.0\",\n \"knex\": \"^3.1.0\",\n \"mysql2\": \"^3.11.0\",\n \"pg\": \"^8.13.0\",\n \"tedious\": \"^19.0.0\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.34.0\",\n \"@kie/act-js\": \"^2.6.2\",\n \"@kie/mock-github\": \"^2.0.1\",\n \"@swc/core\": \"^1.13.2\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/better-sqlite3\": \"^7.6.0\",\n \"@types/blessed\": \"^0.1.27\",\n \"@types/jest\": \"^30.0.0\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/mailparser\": \"^3.4.6\",\n \"@types/node\": \"^24.3.0\",\n \"@types/node-cron\": \"^3.0.11\",\n \"@types/nodemailer\": \"^7.0.11\",\n \"@types/ws\": \"^8.18.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.42.0\",\n \"@typescript-eslint/parser\": \"^8.42.0\",\n \"@vercel/ncc\": \"^0.38.4\",\n \"eslint\": \"^9.34.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.4\",\n \"husky\": \"^9.1.7\",\n \"jest\": \"^30.1.3\",\n \"lint-staged\": \"^16.1.6\",\n \"prettier\": \"^3.6.2\",\n \"reveal-md\": \"^6.1.2\",\n \"ts-json-schema-generator\": \"^1.5.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.9.2\",\n \"wrangler\": \"^3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic/claude-code-sdk\": {\n \"optional\": true\n }\n },\n \"directories\": {\n \"test\": \"tests\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"tests/**/*.{ts,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"*.{json,md,yml,yaml}\": [\n \"prettier --write\"\n ]\n }\n}\n","import { context as otContext, Span, SpanStatusCode, trace, Attributes } from './lazy-otel';\nimport { getInstanceId } from '../utils/instance-id';\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/**\n * Return standard visor.* resource attributes for the root `visor.run` span.\n * Reads version from package.json / env and git commit short SHA from env.\n */\nexport function getVisorRunAttributes(): Record<string, string> {\n const attrs: Record<string, string> = {};\n try {\n attrs['visor.version'] =\n process.env.VISOR_VERSION || (require('../../package.json')?.version ?? 'dev');\n } catch {\n attrs['visor.version'] = 'dev';\n }\n const commitShort = process.env.VISOR_COMMIT_SHORT || '';\n const commitFull = process.env.VISOR_COMMIT_SHA || process.env.VISOR_COMMIT || '';\n if (commitShort) {\n attrs['visor.commit'] = commitShort;\n }\n if (commitFull) {\n attrs['visor.commit.sha'] = commitFull;\n }\n attrs['visor.instance_id'] = getInstanceId();\n return attrs;\n}\n\n/**\n * Wraps a visor.run span with automatic run metrics (counter + duration histogram).\n * Use this instead of raw `withActiveSpan('visor.run', ...)` to get metrics for free.\n */\nexport async function withVisorRun<T>(\n attrs: Record<string, unknown>,\n runMeta: {\n source?: string;\n userId?: string;\n userName?: string;\n workflowId?: string;\n },\n fn: (span: Span) => Promise<T>\n): Promise<T> {\n const {\n recordRunStart,\n recordRunDuration,\n resetRunAiCalls,\n recordRunAiCalls,\n getRunAiCalls,\n } = require('./metrics');\n const instanceId = getInstanceId();\n recordRunStart({\n source: runMeta.source,\n userId: runMeta.userId,\n userName: runMeta.userName,\n workflowId: runMeta.workflowId,\n instanceId,\n });\n resetRunAiCalls();\n const startMs = Date.now();\n let success = true;\n try {\n return await withActiveSpan('visor.run', attrs, async span => {\n try {\n return await fn(span);\n } finally {\n // Record AI call count as span attribute for trace visibility\n try {\n span.setAttribute('visor.run.ai_calls', getRunAiCalls());\n span.setAttribute('visor.run.duration_ms', Date.now() - startMs);\n } catch {}\n }\n });\n } catch (err) {\n success = false;\n throw err;\n } finally {\n recordRunAiCalls({\n source: runMeta.source,\n workflowId: runMeta.workflowId,\n });\n recordRunDuration(Date.now() - startMs, {\n source: runMeta.source,\n userId: runMeta.userId,\n workflowId: runMeta.workflowId,\n success,\n });\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"],"mappings":"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","names":["emitNdjsonSpanWithEvents","path","fs"]}
@@ -43,7 +43,7 @@ import {
43
43
  import {
44
44
  config_exports,
45
45
  init_config
46
- } from "./chunk-W4KCJM6J.mjs";
46
+ } from "./chunk-MLXGCLZJ.mjs";
47
47
  import {
48
48
  ExecutionJournal,
49
49
  checkLoopBudget,
@@ -4006,7 +4006,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
4006
4006
  ...args,
4007
4007
  ...argsOverrides
4008
4008
  };
4009
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-EWMZEEES.mjs");
4009
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-ETM452BO.mjs");
4010
4010
  const provider = new WorkflowCheckProvider2();
4011
4011
  const checkConfig = {
4012
4012
  type: "workflow",
@@ -13348,7 +13348,7 @@ var init_state_machine_execution_engine = __esm({
13348
13348
  try {
13349
13349
  const map = options?.webhookContext?.webhookData;
13350
13350
  if (map) {
13351
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-UPQNHHFF.mjs");
13351
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-O36CQEGD.mjs");
13352
13352
  const reg = CheckProviderRegistry2.getInstance();
13353
13353
  const p = reg.getProvider("http_input");
13354
13354
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13461,7 +13461,7 @@ var init_state_machine_execution_engine = __esm({
13461
13461
  logger.info("[StateMachine] Using state machine engine");
13462
13462
  }
13463
13463
  if (!config) {
13464
- const { ConfigManager } = await import("./config-BVL3KFMB.mjs");
13464
+ const { ConfigManager } = await import("./config-4JMBJKWS.mjs");
13465
13465
  const configManager = new ConfigManager();
13466
13466
  config = await configManager.getDefaultConfig();
13467
13467
  logger.debug("[StateMachine] Using default configuration (no config provided)");
@@ -13471,7 +13471,7 @@ var init_state_machine_execution_engine = __esm({
13471
13471
  tag_filter: tagFilter
13472
13472
  } : config;
13473
13473
  try {
13474
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-UPQNHHFF.mjs");
13474
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-O36CQEGD.mjs");
13475
13475
  const registry = CheckProviderRegistry2.getInstance();
13476
13476
  registry.setCustomTools(configWithTagFilter.tools || {});
13477
13477
  } catch (error) {
@@ -13535,7 +13535,7 @@ var init_state_machine_execution_engine = __esm({
13535
13535
  try {
13536
13536
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13537
13537
  if (webhookData instanceof Map) {
13538
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-5EPTHBLS.mjs");
13538
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-CFMFHDUL.mjs");
13539
13539
  const slackCtx = extractSlackContext2(webhookData);
13540
13540
  if (slackCtx) {
13541
13541
  const payload = Array.from(webhookData.values())[0];
@@ -16069,6 +16069,9 @@ var init_schedule_tool_handler = __esm({
16069
16069
  // src/providers/mcp-custom-sse-server.ts
16070
16070
  import http from "http";
16071
16071
  import { EventEmitter } from "events";
16072
+ function isHttpClientTool(tool) {
16073
+ return Boolean(tool && tool.type === "http_client" && (tool.base_url || tool.url));
16074
+ }
16072
16075
  var CustomToolsSSEServer;
16073
16076
  var init_mcp_custom_sse_server = __esm({
16074
16077
  "src/providers/mcp-custom-sse-server.ts"() {
@@ -16080,6 +16083,7 @@ var init_mcp_custom_sse_server = __esm({
16080
16083
  init_workflow_registry();
16081
16084
  init_schedule_tool();
16082
16085
  init_schedule_tool_handler();
16086
+ init_env_resolver();
16083
16087
  CustomToolsSSEServer = class _CustomToolsSSEServer {
16084
16088
  server = null;
16085
16089
  port = 0;
@@ -16113,10 +16117,12 @@ var init_mcp_custom_sse_server = __esm({
16113
16117
  }
16114
16118
  }
16115
16119
  for (const [name, tool] of this.tools.entries()) {
16116
- if (!isWorkflowTool(tool)) {
16117
- toolsRecord[name] = tool;
16120
+ if (isWorkflowTool(tool) || isHttpClientTool(tool)) {
16121
+ if (isWorkflowTool(tool)) {
16122
+ workflowToolNames.push(name);
16123
+ }
16118
16124
  } else {
16119
- workflowToolNames.push(name);
16125
+ toolsRecord[name] = tool;
16120
16126
  }
16121
16127
  }
16122
16128
  if (workflowToolNames.length > 0 && !workflowContext) {
@@ -16596,7 +16602,12 @@ var init_mcp_custom_sse_server = __esm({
16596
16602
  description: tool.description || `Execute ${tool.name}`,
16597
16603
  inputSchema: normalizeInputSchema(tool.inputSchema)
16598
16604
  }));
16599
- const allTools = [...regularTools, ...workflowTools];
16605
+ const httpClientTools = Array.from(this.tools.values()).filter(isHttpClientTool).map((tool) => ({
16606
+ name: tool.name,
16607
+ description: tool.description || `Call ${tool.name} HTTP API`,
16608
+ inputSchema: normalizeInputSchema(tool.inputSchema)
16609
+ }));
16610
+ const allTools = [...regularTools, ...workflowTools, ...httpClientTools];
16600
16611
  if (this.debug) {
16601
16612
  logger.debug(
16602
16613
  `[CustomToolsSSEServer:${this.sessionId}] Listing ${allTools.length} tools: ${allTools.map((t) => t.name).join(", ")}`
@@ -16720,6 +16731,8 @@ var init_mcp_custom_sse_server = __esm({
16720
16731
  this.workflowContext,
16721
16732
  workflowTool.__argsOverrides
16722
16733
  );
16734
+ } else if (tool && isHttpClientTool(tool)) {
16735
+ result = await this.executeHttpClientTool(tool, args);
16723
16736
  } else {
16724
16737
  result = await this.toolExecutor.execute(toolName, args);
16725
16738
  }
@@ -16783,6 +16796,83 @@ var init_mcp_custom_sse_server = __esm({
16783
16796
  }
16784
16797
  }
16785
16798
  }
16799
+ /**
16800
+ * Execute an http_client tool — proxy REST API calls through the configured base URL.
16801
+ */
16802
+ async executeHttpClientTool(tool, args) {
16803
+ const baseUrl = (tool.base_url || tool.url).replace(/\/+$/, "");
16804
+ const apiPath = args.path || "";
16805
+ const method = (args.method || "GET").toUpperCase();
16806
+ const queryParams = args.query || {};
16807
+ const body = args.body;
16808
+ const toolHeaders = tool.headers || {};
16809
+ const timeout = tool.timeout || 3e4;
16810
+ let url = apiPath.startsWith("http") ? apiPath : `${baseUrl}/${apiPath.replace(/^\/+/, "")}`;
16811
+ if (Object.keys(queryParams).length > 0) {
16812
+ const qs = new URLSearchParams(queryParams).toString();
16813
+ url += `${url.includes("?") ? "&" : "?"}${qs}`;
16814
+ }
16815
+ const resolvedHeaders = {};
16816
+ for (const [key, value] of Object.entries(toolHeaders)) {
16817
+ resolvedHeaders[key] = String(EnvironmentResolver.resolveValue(value));
16818
+ }
16819
+ if (tool.auth) {
16820
+ const authType = tool.auth.type;
16821
+ if (authType === "bearer" && tool.auth.token) {
16822
+ const token = String(EnvironmentResolver.resolveValue(tool.auth.token));
16823
+ resolvedHeaders["Authorization"] = `Bearer ${token}`;
16824
+ }
16825
+ }
16826
+ if (this.debug) {
16827
+ logger.debug(`[CustomToolsSSEServer:${this.sessionId}] HTTP client: ${method} ${url}`);
16828
+ }
16829
+ const controller = new AbortController();
16830
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
16831
+ try {
16832
+ const requestOptions = {
16833
+ method,
16834
+ headers: resolvedHeaders,
16835
+ signal: controller.signal
16836
+ };
16837
+ if (method !== "GET" && body) {
16838
+ requestOptions.body = typeof body === "string" ? body : JSON.stringify(body);
16839
+ if (!resolvedHeaders["Content-Type"] && !resolvedHeaders["content-type"]) {
16840
+ resolvedHeaders["Content-Type"] = "application/json";
16841
+ }
16842
+ }
16843
+ const response = await fetch(url, requestOptions);
16844
+ clearTimeout(timeoutId);
16845
+ if (!response.ok) {
16846
+ let errorBody = "";
16847
+ try {
16848
+ errorBody = await response.text();
16849
+ } catch {
16850
+ }
16851
+ throw new Error(
16852
+ `HTTP ${response.status}: ${response.statusText}${errorBody ? ` - ${errorBody.substring(0, 500)}` : ""}`
16853
+ );
16854
+ }
16855
+ const contentType = response.headers.get("content-type");
16856
+ if (contentType && contentType.includes("application/json")) {
16857
+ return await response.json();
16858
+ }
16859
+ const text = await response.text();
16860
+ if (text.trim().startsWith("{") || text.trim().startsWith("[")) {
16861
+ try {
16862
+ return JSON.parse(text);
16863
+ } catch {
16864
+ return text;
16865
+ }
16866
+ }
16867
+ return text;
16868
+ } catch (error) {
16869
+ clearTimeout(timeoutId);
16870
+ if (error instanceof Error && error.name === "AbortError") {
16871
+ throw new Error(`HTTP client request timed out after ${timeout}ms`);
16872
+ }
16873
+ throw error;
16874
+ }
16875
+ }
16786
16876
  /**
16787
16877
  * Convert a type: 'workflow' tool definition into a WorkflowToolDefinition marker.
16788
16878
  *
@@ -17866,6 +17956,7 @@ ${preview}`);
17866
17956
  }
17867
17957
  const workflowEntriesFromMcp = [];
17868
17958
  const toolEntriesFromMcp = [];
17959
+ const httpClientEntriesFromMcp = [];
17869
17960
  const mcpEntriesToRemove = [];
17870
17961
  for (const [serverName, serverConfig] of Object.entries(mcpServers)) {
17871
17962
  const cfg = serverConfig;
@@ -17879,6 +17970,12 @@ ${preview}`);
17879
17970
  logger.debug(
17880
17971
  `[AICheckProvider] Extracted workflow tool '${serverName}' (workflow=${cfg.workflow}) from ai_mcp_servers`
17881
17972
  );
17973
+ } else if (cfg.type === "http_client" && (cfg.base_url || cfg.url)) {
17974
+ httpClientEntriesFromMcp.push({ name: serverName, config: cfg });
17975
+ mcpEntriesToRemove.push(serverName);
17976
+ logger.debug(
17977
+ `[AICheckProvider] Extracted http_client tool '${serverName}' (base_url=${cfg.base_url || cfg.url}) from ai_mcp_servers`
17978
+ );
17882
17979
  } else if (cfg.tool && typeof cfg.tool === "string") {
17883
17980
  toolEntriesFromMcp.push(cfg.tool);
17884
17981
  mcpEntriesToRemove.push(serverName);
@@ -17931,7 +18028,7 @@ ${preview}`);
17931
18028
  logger.debug(`[AICheckProvider] Schedule tool requested (${contextInfo})`);
17932
18029
  }
17933
18030
  const scheduleToolEnabled = scheduleToolRequested || config.ai?.enable_scheduler === true && !config.ai?.disableTools;
17934
- if ((customToolsToLoad.length > 0 || scheduleToolEnabled) && (customToolsServerName || scheduleToolEnabled) && !config.ai?.disableTools) {
18031
+ if ((customToolsToLoad.length > 0 || scheduleToolEnabled || httpClientEntriesFromMcp.length > 0) && (customToolsServerName || scheduleToolEnabled || httpClientEntriesFromMcp.length > 0) && !config.ai?.disableTools) {
17935
18032
  if (!customToolsServerName) {
17936
18033
  customToolsServerName = "__tools__";
17937
18034
  }
@@ -17963,6 +18060,48 @@ ${preview}`);
17963
18060
  customTools.set(scheduleTool.name, scheduleTool);
17964
18061
  logger.debug(`[AICheckProvider] Added built-in schedule tool`);
17965
18062
  }
18063
+ for (const entry of httpClientEntriesFromMcp) {
18064
+ const httpTool = {
18065
+ name: entry.name,
18066
+ type: "http_client",
18067
+ description: entry.config.description || `Call ${entry.name} HTTP API (base: ${entry.config.base_url || entry.config.url})`,
18068
+ base_url: entry.config.base_url || entry.config.url,
18069
+ auth: entry.config.auth,
18070
+ headers: entry.config.headers,
18071
+ timeout: entry.config.timeout || 3e4,
18072
+ inputSchema: {
18073
+ type: "object",
18074
+ properties: {
18075
+ path: {
18076
+ type: "string",
18077
+ description: "API path (e.g. /jobs, /candidates/{id})"
18078
+ },
18079
+ method: {
18080
+ type: "string",
18081
+ description: "HTTP method (default: GET)",
18082
+ enum: ["GET", "POST", "PUT", "PATCH", "DELETE"]
18083
+ },
18084
+ query: {
18085
+ type: "object",
18086
+ description: "Query string parameters",
18087
+ additionalProperties: { type: "string" }
18088
+ },
18089
+ body: {
18090
+ type: "object",
18091
+ description: "Request body for POST/PUT/PATCH"
18092
+ }
18093
+ },
18094
+ required: ["path"]
18095
+ }
18096
+ };
18097
+ customTools.set(entry.name, httpTool);
18098
+ logger.debug(
18099
+ `[AICheckProvider] Added http_client tool '${entry.name}' (base_url=${httpTool.base_url})`
18100
+ );
18101
+ }
18102
+ if (httpClientEntriesFromMcp.length > 0 && !customToolsServerName) {
18103
+ customToolsServerName = "__tools__";
18104
+ }
17966
18105
  if (customTools.size > 0) {
17967
18106
  const sessionId = config.checkName || `ai-check-${Date.now()}`;
17968
18107
  const debug = aiConfig.debug || process.env.VISOR_DEBUG === "true";
@@ -41415,8 +41554,8 @@ function buildBuiltinGlobals(opts) {
41415
41554
  const asyncFunctionNames = /* @__PURE__ */ new Set();
41416
41555
  const scheduleFn = async (args = {}) => {
41417
41556
  try {
41418
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-UMDRCNO5.mjs");
41419
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-5EPTHBLS.mjs");
41557
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-XVSYLH4Z.mjs");
41558
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-CFMFHDUL.mjs");
41420
41559
  const parentCtx = opts.sessionInfo?._parentContext;
41421
41560
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
41422
41561
  const visorCfg = parentCtx?.config;
@@ -45013,4 +45152,4 @@ undici/lib/fetch/body.js:
45013
45152
  undici/lib/websocket/frame.js:
45014
45153
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
45015
45154
  */
45016
- //# sourceMappingURL=chunk-2PL2YH3B.mjs.map
45155
+ //# sourceMappingURL=chunk-FZPCP444.mjs.map