@probelabs/visor 0.1.132 → 0.1.137

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 (133) hide show
  1. package/dist/config/config-reloader.d.ts +1 -0
  2. package/dist/config/config-reloader.d.ts.map +1 -1
  3. package/dist/config/config-watcher.d.ts +1 -0
  4. package/dist/config/config-watcher.d.ts.map +1 -1
  5. package/dist/config.d.ts +4 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/docs/ai-custom-tools-usage.md +37 -0
  8. package/dist/docs/ai-custom-tools.md +43 -1
  9. package/dist/docs/custom-tools.md +70 -1
  10. package/dist/docs/script.md +542 -27
  11. package/dist/docs/testing/cookbook.md +47 -0
  12. package/dist/examples/README.md +4 -0
  13. package/dist/examples/api-tools-ai-example.yaml +63 -0
  14. package/dist/examples/api-tools-inline-overlay-example.yaml +126 -0
  15. package/dist/examples/api-tools-library.yaml +18 -0
  16. package/dist/examples/api-tools-mcp-example.yaml +55 -0
  17. package/dist/examples/openapi/profiles-overlay-rename.yaml +3 -0
  18. package/dist/examples/openapi/users-api.json +91 -0
  19. package/dist/examples/openapi/users-overlay-rename.yaml +3 -0
  20. package/dist/generated/config-schema.d.ts +223 -74
  21. package/dist/generated/config-schema.d.ts.map +1 -1
  22. package/dist/generated/config-schema.json +251 -79
  23. package/dist/index.js +45128 -25001
  24. package/dist/output/traces/{run-2026-02-18T11-06-48-673Z.ndjson → run-2026-02-23T08-59-32-321Z.ndjson} +84 -84
  25. package/dist/{traces/run-2026-02-18T11-07-37-310Z.ndjson → output/traces/run-2026-02-23T09-00-20-148Z.ndjson} +1148 -1063
  26. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  27. package/dist/providers/api-tool-executor.d.ts +43 -0
  28. package/dist/providers/api-tool-executor.d.ts.map +1 -0
  29. package/dist/providers/command-check-provider.d.ts.map +1 -1
  30. package/dist/providers/custom-tool-executor.d.ts +21 -0
  31. package/dist/providers/custom-tool-executor.d.ts.map +1 -1
  32. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  33. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  34. package/dist/providers/script-check-provider.d.ts +18 -2
  35. package/dist/providers/script-check-provider.d.ts.map +1 -1
  36. package/dist/sdk/{check-provider-registry-7TCA3NSG.mjs → check-provider-registry-BCGP62RY.mjs} +9 -8
  37. package/dist/sdk/{check-provider-registry-RRUZHGJI.mjs → check-provider-registry-SA2WHPLO.mjs} +9 -8
  38. package/dist/sdk/{check-provider-registry-4WLTLPMU.mjs → check-provider-registry-SCL4KP55.mjs} +9 -8
  39. package/dist/sdk/{chunk-LMJNI6RM.mjs → chunk-ALB3N4ZQ.mjs} +12 -5
  40. package/dist/sdk/{chunk-LMJNI6RM.mjs.map → chunk-ALB3N4ZQ.mjs.map} +1 -1
  41. package/dist/sdk/{chunk-27RV5RR2.mjs → chunk-BRD36I43.mjs} +3 -3
  42. package/dist/sdk/{chunk-5VY5QJTY.mjs → chunk-DFKP7LY6.mjs} +1896 -1762
  43. package/dist/sdk/chunk-DFKP7LY6.mjs.map +1 -0
  44. package/dist/sdk/{chunk-UBDHAGYY.mjs → chunk-E2N3U5HU.mjs} +5 -5
  45. package/dist/sdk/{chunk-XGI47XIH.mjs → chunk-F4K5WFSM.mjs} +1896 -1762
  46. package/dist/sdk/chunk-F4K5WFSM.mjs.map +1 -0
  47. package/dist/sdk/{chunk-BOGVSF57.mjs → chunk-J6F5K5EG.mjs} +1896 -1762
  48. package/dist/sdk/chunk-J6F5K5EG.mjs.map +1 -0
  49. package/dist/sdk/{chunk-U3BLLEW3.mjs → chunk-KPRFDKQX.mjs} +329 -80
  50. package/dist/sdk/chunk-KPRFDKQX.mjs.map +1 -0
  51. package/dist/sdk/{chunk-VF6XIUE4.mjs → chunk-LW3INISN.mjs} +32 -1
  52. package/dist/sdk/{chunk-VF6XIUE4.mjs.map → chunk-LW3INISN.mjs.map} +1 -1
  53. package/dist/sdk/{chunk-VG7FWDC2.mjs → chunk-QUEWQWDX.mjs} +11 -4
  54. package/dist/sdk/{chunk-VG7FWDC2.mjs.map → chunk-QUEWQWDX.mjs.map} +1 -1
  55. package/dist/sdk/{chunk-BGBXLPLL.mjs → chunk-UMFEBYCN.mjs} +5 -5
  56. package/dist/sdk/chunk-XKCER23W.mjs +1490 -0
  57. package/dist/sdk/chunk-XKCER23W.mjs.map +1 -0
  58. package/dist/sdk/{chunk-FAKITJ3J.mjs → chunk-YTAGJZHN.mjs} +3 -3
  59. package/dist/sdk/{chunk-XJQKTK6V.mjs → chunk-ZUEQNCKB.mjs} +2 -2
  60. package/dist/sdk/{config-FMIIATKX.mjs → config-3UIU4TMP.mjs} +3 -3
  61. package/dist/sdk/{failure-condition-evaluator-PNONVBXD.mjs → failure-condition-evaluator-3B3G5NYW.mjs} +4 -4
  62. package/dist/sdk/{failure-condition-evaluator-MUUAK7MN.mjs → failure-condition-evaluator-B5JJFYKU.mjs} +4 -4
  63. package/dist/sdk/{github-frontend-DWF6BLZH.mjs → github-frontend-VAWVSCNX.mjs} +4 -4
  64. package/dist/sdk/{github-frontend-WR4S3NG5.mjs → github-frontend-ZOVXPPHQ.mjs} +4 -4
  65. package/dist/sdk/{host-S3LSWESP.mjs → host-LOQWBHWT.mjs} +2 -2
  66. package/dist/sdk/{host-U7V54J2H.mjs → host-TEQ7HKKH.mjs} +2 -2
  67. package/dist/sdk/{liquid-extensions-YDIIH33Q.mjs → liquid-extensions-PLBOMRLI.mjs} +3 -3
  68. package/dist/sdk/{routing-MVDVJDYJ.mjs → routing-HR6N43RQ.mjs} +6 -6
  69. package/dist/sdk/{routing-F4FOWVKF.mjs → routing-SEQYM4N6.mjs} +6 -6
  70. package/dist/sdk/schedule-tool-2COUUTF7.mjs +18 -0
  71. package/dist/sdk/{schedule-tool-handler-FRN3KKRM.mjs → schedule-tool-handler-5BDMLHS5.mjs} +9 -8
  72. package/dist/sdk/{schedule-tool-handler-VFES42DD.mjs → schedule-tool-handler-OXGTPLST.mjs} +9 -8
  73. package/dist/sdk/{schedule-tool-handler-7DNEGDZC.mjs → schedule-tool-handler-Y2UABBXN.mjs} +9 -8
  74. package/dist/sdk/sdk.d.mts +55 -2
  75. package/dist/sdk/sdk.d.ts +55 -2
  76. package/dist/sdk/sdk.js +2367 -482
  77. package/dist/sdk/sdk.js.map +1 -1
  78. package/dist/sdk/sdk.mjs +8 -7
  79. package/dist/sdk/sdk.mjs.map +1 -1
  80. package/dist/sdk/{trace-helpers-RDPXIN4S.mjs → trace-helpers-FAAGLXBI.mjs} +2 -2
  81. package/dist/sdk/{trace-helpers-KSPGA24B.mjs → trace-helpers-IGMH7ZPP.mjs} +2 -2
  82. package/dist/sdk/{workflow-check-provider-BMVJ6X7N.mjs → workflow-check-provider-7SR7ZWSV.mjs} +9 -8
  83. package/dist/sdk/{workflow-check-provider-CPGIRZMH.mjs → workflow-check-provider-L2ZUOMJR.mjs} +9 -8
  84. package/dist/sdk/{workflow-check-provider-4NFWH6YO.mjs → workflow-check-provider-WLA7LO56.mjs} +9 -8
  85. package/dist/sdk/workflow-check-provider-WLA7LO56.mjs.map +1 -0
  86. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  87. package/dist/state-machine-execution-engine.d.ts.map +1 -1
  88. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -1
  89. package/dist/test-runner/index.d.ts.map +1 -1
  90. package/dist/test-runner/validator.d.ts.map +1 -1
  91. package/dist/traces/{run-2026-02-18T11-06-48-673Z.ndjson → run-2026-02-23T08-59-32-321Z.ndjson} +84 -84
  92. package/dist/{output/traces/run-2026-02-18T11-07-37-310Z.ndjson → traces/run-2026-02-23T09-00-20-148Z.ndjson} +1148 -1063
  93. package/dist/types/config.d.ts +55 -2
  94. package/dist/types/config.d.ts.map +1 -1
  95. package/dist/utils/config-loader.d.ts +5 -0
  96. package/dist/utils/config-loader.d.ts.map +1 -1
  97. package/dist/utils/sandbox.d.ts +8 -0
  98. package/dist/utils/sandbox.d.ts.map +1 -1
  99. package/dist/utils/script-tool-environment.d.ts +90 -0
  100. package/dist/utils/script-tool-environment.d.ts.map +1 -0
  101. package/dist/utils/tool-resolver.d.ts +18 -0
  102. package/dist/utils/tool-resolver.d.ts.map +1 -0
  103. package/package.json +11 -4
  104. package/dist/sdk/chunk-5VY5QJTY.mjs.map +0 -1
  105. package/dist/sdk/chunk-BOGVSF57.mjs.map +0 -1
  106. package/dist/sdk/chunk-U3BLLEW3.mjs.map +0 -1
  107. package/dist/sdk/chunk-XGI47XIH.mjs.map +0 -1
  108. /package/dist/sdk/{check-provider-registry-4WLTLPMU.mjs.map → check-provider-registry-BCGP62RY.mjs.map} +0 -0
  109. /package/dist/sdk/{check-provider-registry-7TCA3NSG.mjs.map → check-provider-registry-SA2WHPLO.mjs.map} +0 -0
  110. /package/dist/sdk/{check-provider-registry-RRUZHGJI.mjs.map → check-provider-registry-SCL4KP55.mjs.map} +0 -0
  111. /package/dist/sdk/{chunk-27RV5RR2.mjs.map → chunk-BRD36I43.mjs.map} +0 -0
  112. /package/dist/sdk/{chunk-BGBXLPLL.mjs.map → chunk-E2N3U5HU.mjs.map} +0 -0
  113. /package/dist/sdk/{chunk-UBDHAGYY.mjs.map → chunk-UMFEBYCN.mjs.map} +0 -0
  114. /package/dist/sdk/{chunk-FAKITJ3J.mjs.map → chunk-YTAGJZHN.mjs.map} +0 -0
  115. /package/dist/sdk/{chunk-XJQKTK6V.mjs.map → chunk-ZUEQNCKB.mjs.map} +0 -0
  116. /package/dist/sdk/{config-FMIIATKX.mjs.map → config-3UIU4TMP.mjs.map} +0 -0
  117. /package/dist/sdk/{failure-condition-evaluator-MUUAK7MN.mjs.map → failure-condition-evaluator-3B3G5NYW.mjs.map} +0 -0
  118. /package/dist/sdk/{failure-condition-evaluator-PNONVBXD.mjs.map → failure-condition-evaluator-B5JJFYKU.mjs.map} +0 -0
  119. /package/dist/sdk/{github-frontend-DWF6BLZH.mjs.map → github-frontend-VAWVSCNX.mjs.map} +0 -0
  120. /package/dist/sdk/{github-frontend-WR4S3NG5.mjs.map → github-frontend-ZOVXPPHQ.mjs.map} +0 -0
  121. /package/dist/sdk/{host-S3LSWESP.mjs.map → host-LOQWBHWT.mjs.map} +0 -0
  122. /package/dist/sdk/{host-U7V54J2H.mjs.map → host-TEQ7HKKH.mjs.map} +0 -0
  123. /package/dist/sdk/{liquid-extensions-YDIIH33Q.mjs.map → liquid-extensions-PLBOMRLI.mjs.map} +0 -0
  124. /package/dist/sdk/{routing-F4FOWVKF.mjs.map → routing-HR6N43RQ.mjs.map} +0 -0
  125. /package/dist/sdk/{routing-MVDVJDYJ.mjs.map → routing-SEQYM4N6.mjs.map} +0 -0
  126. /package/dist/sdk/{schedule-tool-handler-7DNEGDZC.mjs.map → schedule-tool-2COUUTF7.mjs.map} +0 -0
  127. /package/dist/sdk/{schedule-tool-handler-FRN3KKRM.mjs.map → schedule-tool-handler-5BDMLHS5.mjs.map} +0 -0
  128. /package/dist/sdk/{schedule-tool-handler-VFES42DD.mjs.map → schedule-tool-handler-OXGTPLST.mjs.map} +0 -0
  129. /package/dist/sdk/{trace-helpers-KSPGA24B.mjs.map → schedule-tool-handler-Y2UABBXN.mjs.map} +0 -0
  130. /package/dist/sdk/{trace-helpers-RDPXIN4S.mjs.map → trace-helpers-FAAGLXBI.mjs.map} +0 -0
  131. /package/dist/sdk/{workflow-check-provider-4NFWH6YO.mjs.map → trace-helpers-IGMH7ZPP.mjs.map} +0 -0
  132. /package/dist/sdk/{workflow-check-provider-BMVJ6X7N.mjs.map → workflow-check-provider-7SR7ZWSV.mjs.map} +0 -0
  133. /package/dist/sdk/{workflow-check-provider-CPGIRZMH.mjs.map → workflow-check-provider-L2ZUOMJR.mjs.map} +0 -0
@@ -14,6 +14,7 @@ export declare class ConfigReloader {
14
14
  private snapshotStore;
15
15
  private onSwap;
16
16
  private onError?;
17
+ private lastConfigHash;
17
18
  constructor(options: ConfigReloaderOptions);
18
19
  /**
19
20
  * Attempt to reload the config file.
@@ -1 +1 @@
1
- {"version":3,"file":"config-reloader.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-reloader.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,OAAO,CAAC,CAAuB;gBAE3B,OAAO,EAAE,qBAAqB;IAQ1C;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CA4BjC"}
1
+ {"version":3,"file":"config-reloader.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-reloader.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,OAAO,CAAC,CAAuB;IACvC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,qBAAqB;IAQ1C;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAkCjC"}
@@ -12,6 +12,7 @@ export declare class ConfigWatcher {
12
12
  private watchers;
13
13
  private debounceTimer;
14
14
  private signalHandler;
15
+ private lastProcessedMtimes;
15
16
  constructor(configPath: string, reloader: ConfigReloader, debounceMs?: number);
16
17
  start(): void;
17
18
  stop(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-watcher.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAwE1F;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAA6B;gBAEtC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM;IAM7E,KAAK,IAAI,IAAI;IAyBb,IAAI,IAAI,IAAI;IAqBZ;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,eAAe;IAWvB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAYnB"}
1
+ {"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-watcher.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAwE1F;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,mBAAmB,CAA6B;gBAE5C,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM;IAM7E,KAAK,IAAI,IAAI;IAyBb,IAAI,IAAI,IAAI;IAqBZ;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,SAAS;IAyCjB,OAAO,CAAC,eAAe;IAqCvB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAYnB"}
package/dist/config.d.ts CHANGED
@@ -13,6 +13,10 @@ export declare class ConfigManager {
13
13
  private validEventTriggers;
14
14
  private validOutputFormats;
15
15
  private validGroupByOptions;
16
+ /**
17
+ * Annotate tools with the originating config directory for relative asset resolution.
18
+ */
19
+ private annotateToolBaseDirs;
16
20
  /**
17
21
  * Load configuration from a file
18
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EAGX,YAAY,EAIZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAS9C,CAAC;AAEX;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAgBrB;IACF,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,kBAAkB,CAAgE;IAC1F,OAAO,CAAC,mBAAmB,CAA2D;IAEtF;;OAEG;IACU,UAAU,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;IAqHvB;;;OAGG;IACU,oBAAoB,CAC/B,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,EACzB,OAAO,GAAE,iBAAiB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,OAAO,CAAC,WAAW,CAAC;IAkDvB;;OAEG;IACU,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CrF;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAgBrD;;OAEG;IACI,wBAAwB,IAAI,WAAW,GAAG,IAAI;IA0FrD;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;;OAGG;YACW,uBAAuB;IAkFrC;;OAEG;YACW,aAAa;IA6B3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,YAAY;IAqB9F;;OAEG;IACU,0BAA0B,IAAI,OAAO,CAAC;QACjD,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,oBAAoB,EAAE,oBAAoB,CAAC;KAC5C,CAAC;IA2BF;;;;OAIG;IACI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,UAAQ,GAAG,IAAI;IA+SzE;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoH7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8T3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmM5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0DhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAiG7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6DzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6EhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA6B1B"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EAGX,YAAY,EAIZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,YAAY,EAS9C,CAAC;AAEX;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAgBrB;IACF,OAAO,CAAC,kBAAkB,CAA6C;IACvE,OAAO,CAAC,kBAAkB,CAAgE;IAC1F,OAAO,CAAC,mBAAmB,CAA2D;IAEtF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACU,UAAU,CACrB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;IAwHvB;;;OAGG;IACU,oBAAoB,CAC/B,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,EACzB,OAAO,GAAE,iBAAiB,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,OAAO,CAAC,WAAW,CAAC;IAoDvB;;OAEG;IACU,iBAAiB,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CrF;;OAEG;YACW,qBAAqB;IAiBnC;;OAEG;IACU,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC;IAgBrD;;OAEG;IACI,wBAAwB,IAAI,WAAW,GAAG,IAAI;IA0FrD;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;;OAGG;YACW,uBAAuB;IAkFrC;;OAEG;YACW,aAAa;IA6B3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,GAAG,YAAY;IAqB9F;;OAEG;IACU,0BAA0B,IAAI,OAAO,CAAC;QACjD,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,oBAAoB,EAAE,oBAAoB,CAAC;KAC5C,CAAC;IA2BF;;;;OAIG;IACI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,UAAQ,GAAG,IAAI;IA4VzE;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoH7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8T3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAmM5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA0DhC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAqG7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6DzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6EhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA6B1B"}
@@ -55,6 +55,43 @@ When you use either `ai_custom_tools` or `tools: [...]` within an MCP server con
55
55
 
56
56
  ## Examples
57
57
 
58
+ ### Example 0: OpenAPI API Bundle Tool
59
+
60
+ ```yaml
61
+ tools:
62
+ users-api:
63
+ type: api
64
+ name: users-api
65
+ spec: ./openapi/users.yaml
66
+ headers:
67
+ Authorization: "Bearer ${USERS_API_BEARER_TOKEN}"
68
+ X-Tenant-Id: "${USERS_API_TENANT_ID}"
69
+ overlays:
70
+ - ./openapi/users-overlay.yaml
71
+ - actions:
72
+ - target: "$.paths['/users/{id}'].get.operationId"
73
+ update: getUserFromInlineOverlay
74
+ whitelist: [get*]
75
+ targetUrl: https://api.example.com
76
+
77
+ steps:
78
+ api-assistant:
79
+ type: ai
80
+ prompt: Use users API tools to answer requests.
81
+ ai_custom_tools: [users-api]
82
+ ```
83
+
84
+ `users-api` is a reusable tool bundle; each OpenAPI operation becomes an MCP tool exposed to AI.
85
+ `spec` and `overlays` support both inline objects and file/URL references.
86
+ `headers` also supports environment-variable interpolation (for example `Authorization: "Bearer ${USERS_API_BEARER_TOKEN}"`).
87
+
88
+ Repository examples:
89
+
90
+ - `examples/api-tools-library.yaml`
91
+ - `examples/api-tools-ai-example.yaml` (embedded tests)
92
+ - `examples/api-tools-mcp-example.yaml` (embedded tests)
93
+ - `examples/api-tools-inline-overlay-example.yaml` (embedded tests)
94
+
58
95
  ### Example 1: Security Scanning
59
96
 
60
97
  ```yaml
@@ -2,7 +2,12 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- This feature allows AI checks to use custom shell-based tools defined in your Visor configuration. Custom tools are automatically exposed to AI via ephemeral SSE (Server-Sent Events) MCP (Model Context Protocol) servers that start on-demand and clean up automatically.
5
+ This feature allows AI checks to use custom tools defined in your Visor configuration:
6
+
7
+ - shell/command tools (`exec`)
8
+ - OpenAPI-backed API tool bundles (`type: api`)
9
+
10
+ Custom tools are automatically exposed to AI via ephemeral SSE (Server-Sent Events) MCP (Model Context Protocol) servers that start on-demand and clean up automatically.
6
11
 
7
12
  ## Key Benefits
8
13
 
@@ -120,6 +125,43 @@ steps:
120
125
 
121
126
  ### Basic Example
122
127
 
128
+ ### API Bundle Example (`type: api`)
129
+
130
+ ```yaml
131
+ tools:
132
+ users-api:
133
+ type: api
134
+ name: users-api
135
+ spec: ./openapi/users.yaml
136
+ headers:
137
+ Authorization: "Bearer ${USERS_API_BEARER_TOKEN}"
138
+ X-Tenant-Id: "${USERS_API_TENANT_ID}"
139
+ overlays:
140
+ - ./openapi/users-overlay.yaml
141
+ - actions:
142
+ - target: "$.paths['/users/{id}'].get.operationId"
143
+ update: getUserFromInlineOverlay
144
+ whitelist: [getUser*, GET:/users/*]
145
+ targetUrl: https://api.example.com
146
+
147
+ steps:
148
+ assistant:
149
+ type: ai
150
+ prompt: Use the users API tools to answer user questions.
151
+ ai_custom_tools: [users-api]
152
+ ```
153
+
154
+ Each OpenAPI operation with an `operationId` is exposed as an MCP tool for the AI check.
155
+ `spec` and `overlays` can both be loaded from file/URL or provided inline as YAML objects.
156
+ Custom `headers` are supported, and header values can use env interpolation (for example `${USERS_API_BEARER_TOKEN}`).
157
+
158
+ See runnable examples:
159
+
160
+ - `examples/api-tools-library.yaml`
161
+ - `examples/api-tools-ai-example.yaml` (embedded tests)
162
+ - `examples/api-tools-mcp-example.yaml` (embedded tests)
163
+ - `examples/api-tools-inline-overlay-example.yaml` (embedded tests)
164
+
123
165
  ### Advanced Example with Multiple Tools
124
166
 
125
167
  ```yaml
@@ -297,6 +297,75 @@ tools:
297
297
  {% endcase %}
298
298
  ```
299
299
 
300
+ ### 5. OpenAPI Tool Bundle (`type: api`)
301
+
302
+ You can expose an OpenAPI spec as MCP tools by defining a single reusable API bundle.
303
+ Both `spec` and `overlays` support file/URL and inline object forms:
304
+
305
+ ```yaml
306
+ tools:
307
+ petstore-api:
308
+ type: api
309
+ name: petstore-api
310
+ description: Petstore API as MCP tools
311
+ spec: ./petstore-openapi.yaml
312
+ overlays:
313
+ - ./petstore-overlay.yaml
314
+ whitelist:
315
+ - "get*"
316
+ - "POST:/pets*"
317
+ targetUrl: https://petstore.example.com
318
+ headers:
319
+ X-Api-Version: "2026-01"
320
+ Authorization: "Bearer ${PETSTORE_BEARER_TOKEN}"
321
+ X-Tenant-Id: "${PETSTORE_TENANT_ID}"
322
+ apiKey: "${{ env.PETSTORE_API_KEY }}"
323
+
324
+ profiles-api:
325
+ type: api
326
+ name: profiles-api
327
+ spec:
328
+ openapi: "3.0.0"
329
+ info: { title: Profiles API, version: "1.0.0" }
330
+ servers: [{ url: "https://api.example.com" }]
331
+ paths:
332
+ /profiles/{id}:
333
+ get:
334
+ operationId: getProfile
335
+ parameters:
336
+ - name: id
337
+ in: path
338
+ required: true
339
+ schema: { type: string }
340
+ responses:
341
+ "200":
342
+ description: OK
343
+ overlays:
344
+ - ./profiles-overlay.yaml
345
+ - actions:
346
+ - target: "$.paths['/profiles/{id}'].get.operationId"
347
+ update: getProfileFromInlineOverlay
348
+ ```
349
+
350
+ Behavior:
351
+
352
+ - Each OpenAPI operation with an `operationId` is exposed as an MCP tool.
353
+ - Tool names/descriptions come from OpenAPI and support `x-mcp` overrides.
354
+ - Inputs include path/query/header parameters and `requestBody`.
355
+ - Security schemes from OpenAPI are applied at call time using `apiKey` / `securityCredentials`.
356
+ - `whitelist`/`blacklist` supports glob patterns for `operationId` and `METHOD:/path`.
357
+ - Overlay behavior matches `api-to-mcp`: action-based overlays (`actions[].target/update/remove`) plus deep-merge overlays when `actions` is omitted.
358
+ - `headers` values can reference environment variables (for example, `${PETSTORE_BEARER_TOKEN}` or `${{ env.PETSTORE_BEARER_TOKEN }}`).
359
+
360
+ This works with `ai_custom_tools`, `ai_mcp_servers.<name>.tools`, and `transport: custom` MCP execution.
361
+
362
+ Runnable examples in this repo:
363
+
364
+ - `examples/api-tools-library.yaml` (reusable API bundle in a separate file)
365
+ - `examples/api-tools-mcp-example.yaml` (includes embedded tests)
366
+ - `examples/api-tools-ai-example.yaml` (includes embedded tests)
367
+ - `examples/api-tools-inline-overlay-example.yaml` (includes embedded tests)
368
+
300
369
  ## Tool Libraries and Extends
301
370
 
302
371
  ### Creating a Tool Library
@@ -452,4 +521,4 @@ For JavaScript transform issues:
452
521
  1. Ensure valid JavaScript syntax
453
522
  2. Always return a value
454
523
  3. Handle undefined/null cases
455
- 4. Use try-catch for error handling
524
+ 4. Use try-catch for error handling