@probelabs/visor 0.1.173 → 0.1.174

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 (97) hide show
  1. package/dist/docs/dashboards/README.md +73 -26
  2. package/dist/docs/dashboards/grafana-visor-overview.json +435 -15
  3. package/dist/docs/telemetry-reference.md +387 -0
  4. package/dist/docs/telemetry-setup.md +2 -0
  5. package/dist/generated/config-schema.d.ts +277 -7
  6. package/dist/generated/config-schema.d.ts.map +1 -1
  7. package/dist/generated/config-schema.json +3803 -0
  8. package/dist/index.js +364 -30
  9. package/dist/output/traces/{run-2026-03-09T15-21-25-122Z.ndjson → run-2026-03-09T15-44-30-340Z.ndjson} +84 -84
  10. package/dist/output/traces/{run-2026-03-09T15-22-05-255Z.ndjson → run-2026-03-09T15-45-10-778Z.ndjson} +1852 -1852
  11. package/dist/sdk/{a2a-frontend-VHOQ45CR.mjs → a2a-frontend-5L6H7ZVF.mjs} +3 -3
  12. package/dist/sdk/{a2a-frontend-7CYN3X7M.mjs → a2a-frontend-FUJRKHJB.mjs} +3 -3
  13. package/dist/sdk/{check-provider-registry-65GO3SCO.mjs → check-provider-registry-UM762L7S.mjs} +7 -7
  14. package/dist/sdk/{check-provider-registry-75O5XJMA.mjs → check-provider-registry-UPQNHHFF.mjs} +7 -7
  15. package/dist/sdk/{check-provider-registry-DBTS7OXY.mjs → check-provider-registry-YVQI4IOR.mjs} +7 -7
  16. package/dist/sdk/{chunk-Y5MEQW2W.mjs → chunk-2PL2YH3B.mjs} +19 -19
  17. package/dist/sdk/{chunk-4TV2CVVI.mjs → chunk-34QX63WK.mjs} +16 -14
  18. package/dist/sdk/chunk-34QX63WK.mjs.map +1 -0
  19. package/dist/sdk/{chunk-2HXOGRAS.mjs → chunk-65SHRIQF.mjs} +3 -3
  20. package/dist/sdk/{chunk-2HXOGRAS.mjs.map → chunk-65SHRIQF.mjs.map} +1 -1
  21. package/dist/sdk/{chunk-VVHALCWV.mjs → chunk-EFNNJIMY.mjs} +3 -3
  22. package/dist/sdk/{chunk-7CWJNSL2.mjs → chunk-EP7PQ4IX.mjs} +19 -19
  23. package/dist/sdk/{chunk-AV6KML52.mjs → chunk-I6GKXMQ5.mjs} +19 -19
  24. package/dist/sdk/{chunk-VK7FUBBU.mjs → chunk-UTBSBJFV.mjs} +3 -3
  25. package/dist/sdk/{chunk-HZEXCJGA.mjs → chunk-W4KCJM6J.mjs} +282 -8
  26. package/dist/sdk/chunk-W4KCJM6J.mjs.map +1 -0
  27. package/dist/sdk/{chunk-GVPMO6QD.mjs → chunk-WJIV7MKY.mjs} +3 -3
  28. package/dist/sdk/{chunk-WYFQQ445.mjs → chunk-YEARBXYT.mjs} +3 -3
  29. package/dist/sdk/{chunk-LTHHE6Z5.mjs → chunk-ZI3SEHWA.mjs} +4 -4
  30. package/dist/sdk/{chunk-LTHHE6Z5.mjs.map → chunk-ZI3SEHWA.mjs.map} +1 -1
  31. package/dist/sdk/{config-UXRHADSE.mjs → config-BVL3KFMB.mjs} +2 -2
  32. package/dist/sdk/{failure-condition-evaluator-Q4KNMX6F.mjs → failure-condition-evaluator-4O6BTC4Q.mjs} +4 -4
  33. package/dist/sdk/{failure-condition-evaluator-SNR5XLGN.mjs → failure-condition-evaluator-DL6H57NX.mjs} +4 -4
  34. package/dist/sdk/{github-frontend-56UQTA47.mjs → github-frontend-F2YCPK6H.mjs} +4 -4
  35. package/dist/sdk/{github-frontend-OOP26667.mjs → github-frontend-UXL73NKB.mjs} +4 -4
  36. package/dist/sdk/{host-QRGXXRDA.mjs → host-6TBS44ER.mjs} +3 -3
  37. package/dist/sdk/{host-VYPJ2UGQ.mjs → host-KJTXX76P.mjs} +3 -3
  38. package/dist/sdk/{metrics-FU2G5SZ2.mjs → metrics-JTOG2HNO.mjs} +2 -2
  39. package/dist/sdk/{routing-DBQHPP2O.mjs → routing-AWYB2YX3.mjs} +5 -5
  40. package/dist/sdk/{routing-ZAUCS3HJ.mjs → routing-GF2CF3JT.mjs} +5 -5
  41. package/dist/sdk/{schedule-tool-MHICRNCI.mjs → schedule-tool-IEY2CFLU.mjs} +7 -7
  42. package/dist/sdk/{schedule-tool-VRLX54J5.mjs → schedule-tool-SGCYDSHL.mjs} +7 -7
  43. package/dist/sdk/{schedule-tool-2FIVKPVJ.mjs → schedule-tool-UMDRCNO5.mjs} +7 -7
  44. package/dist/sdk/{schedule-tool-handler-3ES4WON7.mjs → schedule-tool-handler-5EPTHBLS.mjs} +7 -7
  45. package/dist/sdk/{schedule-tool-handler-FQGAWC5N.mjs → schedule-tool-handler-5QVUZ5EZ.mjs} +7 -7
  46. package/dist/sdk/{schedule-tool-handler-KYUHU4JR.mjs → schedule-tool-handler-HMEGLYJF.mjs} +7 -7
  47. package/dist/sdk/sdk.d.mts +137 -133
  48. package/dist/sdk/sdk.d.ts +137 -133
  49. package/dist/sdk/sdk.js +298 -22
  50. package/dist/sdk/sdk.js.map +1 -1
  51. package/dist/sdk/sdk.mjs +6 -6
  52. package/dist/sdk/{trace-helpers-UKMYHQIK.mjs → trace-helpers-6TEWG7RK.mjs} +3 -3
  53. package/dist/sdk/{trace-helpers-ZFDJ55SH.mjs → trace-helpers-FKM2MEDW.mjs} +3 -3
  54. package/dist/sdk/{workflow-check-provider-F5DTEX6E.mjs → workflow-check-provider-7VNIO6L5.mjs} +7 -7
  55. package/dist/sdk/{workflow-check-provider-VEOVTCVU.mjs → workflow-check-provider-EWMZEEES.mjs} +7 -7
  56. package/dist/sdk/{workflow-check-provider-5KQTXKWS.mjs → workflow-check-provider-VJ7VIMCQ.mjs} +7 -7
  57. package/dist/telemetry/metrics.d.ts.map +1 -1
  58. package/dist/traces/{run-2026-03-09T15-21-25-122Z.ndjson → run-2026-03-09T15-44-30-340Z.ndjson} +84 -84
  59. package/dist/traces/{run-2026-03-09T15-22-05-255Z.ndjson → run-2026-03-09T15-45-10-778Z.ndjson} +1852 -1852
  60. package/dist/types/config.d.ts +5 -4
  61. package/dist/types/config.d.ts.map +1 -1
  62. package/package.json +2 -2
  63. package/dist/sdk/chunk-4TV2CVVI.mjs.map +0 -1
  64. package/dist/sdk/chunk-HZEXCJGA.mjs.map +0 -1
  65. /package/dist/sdk/{a2a-frontend-7CYN3X7M.mjs.map → a2a-frontend-5L6H7ZVF.mjs.map} +0 -0
  66. /package/dist/sdk/{a2a-frontend-VHOQ45CR.mjs.map → a2a-frontend-FUJRKHJB.mjs.map} +0 -0
  67. /package/dist/sdk/{check-provider-registry-65GO3SCO.mjs.map → check-provider-registry-UM762L7S.mjs.map} +0 -0
  68. /package/dist/sdk/{check-provider-registry-75O5XJMA.mjs.map → check-provider-registry-UPQNHHFF.mjs.map} +0 -0
  69. /package/dist/sdk/{check-provider-registry-DBTS7OXY.mjs.map → check-provider-registry-YVQI4IOR.mjs.map} +0 -0
  70. /package/dist/sdk/{chunk-Y5MEQW2W.mjs.map → chunk-2PL2YH3B.mjs.map} +0 -0
  71. /package/dist/sdk/{chunk-VK7FUBBU.mjs.map → chunk-EFNNJIMY.mjs.map} +0 -0
  72. /package/dist/sdk/{chunk-7CWJNSL2.mjs.map → chunk-EP7PQ4IX.mjs.map} +0 -0
  73. /package/dist/sdk/{chunk-AV6KML52.mjs.map → chunk-I6GKXMQ5.mjs.map} +0 -0
  74. /package/dist/sdk/{chunk-VVHALCWV.mjs.map → chunk-UTBSBJFV.mjs.map} +0 -0
  75. /package/dist/sdk/{chunk-GVPMO6QD.mjs.map → chunk-WJIV7MKY.mjs.map} +0 -0
  76. /package/dist/sdk/{chunk-WYFQQ445.mjs.map → chunk-YEARBXYT.mjs.map} +0 -0
  77. /package/dist/sdk/{config-UXRHADSE.mjs.map → config-BVL3KFMB.mjs.map} +0 -0
  78. /package/dist/sdk/{failure-condition-evaluator-Q4KNMX6F.mjs.map → failure-condition-evaluator-4O6BTC4Q.mjs.map} +0 -0
  79. /package/dist/sdk/{failure-condition-evaluator-SNR5XLGN.mjs.map → failure-condition-evaluator-DL6H57NX.mjs.map} +0 -0
  80. /package/dist/sdk/{github-frontend-56UQTA47.mjs.map → github-frontend-F2YCPK6H.mjs.map} +0 -0
  81. /package/dist/sdk/{github-frontend-OOP26667.mjs.map → github-frontend-UXL73NKB.mjs.map} +0 -0
  82. /package/dist/sdk/{host-QRGXXRDA.mjs.map → host-6TBS44ER.mjs.map} +0 -0
  83. /package/dist/sdk/{host-VYPJ2UGQ.mjs.map → host-KJTXX76P.mjs.map} +0 -0
  84. /package/dist/sdk/{metrics-FU2G5SZ2.mjs.map → metrics-JTOG2HNO.mjs.map} +0 -0
  85. /package/dist/sdk/{routing-DBQHPP2O.mjs.map → routing-AWYB2YX3.mjs.map} +0 -0
  86. /package/dist/sdk/{routing-ZAUCS3HJ.mjs.map → routing-GF2CF3JT.mjs.map} +0 -0
  87. /package/dist/sdk/{schedule-tool-2FIVKPVJ.mjs.map → schedule-tool-IEY2CFLU.mjs.map} +0 -0
  88. /package/dist/sdk/{schedule-tool-MHICRNCI.mjs.map → schedule-tool-SGCYDSHL.mjs.map} +0 -0
  89. /package/dist/sdk/{schedule-tool-VRLX54J5.mjs.map → schedule-tool-UMDRCNO5.mjs.map} +0 -0
  90. /package/dist/sdk/{schedule-tool-handler-3ES4WON7.mjs.map → schedule-tool-handler-5EPTHBLS.mjs.map} +0 -0
  91. /package/dist/sdk/{schedule-tool-handler-FQGAWC5N.mjs.map → schedule-tool-handler-5QVUZ5EZ.mjs.map} +0 -0
  92. /package/dist/sdk/{schedule-tool-handler-KYUHU4JR.mjs.map → schedule-tool-handler-HMEGLYJF.mjs.map} +0 -0
  93. /package/dist/sdk/{trace-helpers-UKMYHQIK.mjs.map → trace-helpers-6TEWG7RK.mjs.map} +0 -0
  94. /package/dist/sdk/{trace-helpers-ZFDJ55SH.mjs.map → trace-helpers-FKM2MEDW.mjs.map} +0 -0
  95. /package/dist/sdk/{workflow-check-provider-5KQTXKWS.mjs.map → workflow-check-provider-7VNIO6L5.mjs.map} +0 -0
  96. /package/dist/sdk/{workflow-check-provider-F5DTEX6E.mjs.map → workflow-check-provider-EWMZEEES.mjs.map} +0 -0
  97. /package/dist/sdk/{workflow-check-provider-VEOVTCVU.mjs.map → workflow-check-provider-VJ7VIMCQ.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- process.env.VISOR_VERSION = '0.1.173';
3
- process.env.PROBE_VERSION = '0.6.0-rc290';
4
- process.env.VISOR_COMMIT_SHA = 'f90bea6e5af9d8ccb75f03ee9ab69a258e061329';
5
- process.env.VISOR_COMMIT_SHORT = 'f90bea6e';
2
+ process.env.VISOR_VERSION = '0.1.174';
3
+ process.env.PROBE_VERSION = '0.6.0-rc291';
4
+ process.env.VISOR_COMMIT_SHA = 'e8809d0dd7ef9584a6c687826df911bbc12d7fbd';
5
+ process.env.VISOR_COMMIT_SHORT = 'e8809d0d';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -314274,6 +314274,22 @@ exports.configSchema = {
314274
314274
  $ref: '#/definitions/SlackConfig',
314275
314275
  description: 'Slack configuration',
314276
314276
  },
314277
+ telegram: {
314278
+ $ref: '#/definitions/TelegramConfig',
314279
+ description: 'Telegram bot configuration',
314280
+ },
314281
+ email: {
314282
+ $ref: '#/definitions/EmailConfig',
314283
+ description: 'Email integration configuration',
314284
+ },
314285
+ whatsapp: {
314286
+ $ref: '#/definitions/WhatsAppConfig',
314287
+ description: 'WhatsApp bot configuration',
314288
+ },
314289
+ teams: {
314290
+ $ref: '#/definitions/TeamsConfig',
314291
+ description: 'Microsoft Teams bot configuration',
314292
+ },
314277
314293
  scheduler: {
314278
314294
  $ref: '#/definitions/SchedulerConfig',
314279
314295
  description: 'Scheduler configuration for scheduled workflow execution',
@@ -315047,7 +315063,7 @@ exports.configSchema = {
315047
315063
  description: 'Arguments/inputs for the workflow',
315048
315064
  },
315049
315065
  overrides: {
315050
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E',
315066
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E',
315051
315067
  description: 'Override specific step configurations in the workflow',
315052
315068
  },
315053
315069
  output_mapping: {
@@ -315063,7 +315079,7 @@ exports.configSchema = {
315063
315079
  description: 'Config file path - alternative to workflow ID (loads a Visor config file as workflow)',
315064
315080
  },
315065
315081
  workflow_overrides: {
315066
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E',
315082
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E',
315067
315083
  description: 'Alias for overrides - workflow step overrides (backward compatibility)',
315068
315084
  },
315069
315085
  ref: {
@@ -315248,6 +315264,10 @@ exports.configSchema = {
315248
315264
  'schedule',
315249
315265
  'webhook_received',
315250
315266
  'slack_message',
315267
+ 'telegram_message',
315268
+ 'email_message',
315269
+ 'whatsapp_message',
315270
+ 'teams_message',
315251
315271
  ],
315252
315272
  description: 'Valid event triggers for checks',
315253
315273
  },
@@ -315761,7 +315781,7 @@ exports.configSchema = {
315761
315781
  description: 'Custom output name (defaults to workflow name)',
315762
315782
  },
315763
315783
  overrides: {
315764
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E',
315784
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E',
315765
315785
  description: 'Step overrides',
315766
315786
  },
315767
315787
  output_mapping: {
@@ -315776,13 +315796,13 @@ exports.configSchema = {
315776
315796
  '^x-': {},
315777
315797
  },
315778
315798
  },
315779
- 'Record<string,Partial<interface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400>>': {
315799
+ 'Record<string,Partial<interface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833>>': {
315780
315800
  type: 'object',
315781
315801
  additionalProperties: {
315782
- $ref: '#/definitions/Partial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E',
315802
+ $ref: '#/definitions/Partial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E',
315783
315803
  },
315784
315804
  },
315785
- 'Partial<interface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400>': {
315805
+ 'Partial<interface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833>': {
315786
315806
  type: 'object',
315787
315807
  additionalProperties: false,
315788
315808
  },
@@ -316641,6 +316661,260 @@ exports.configSchema = {
316641
316661
  '^x-': {},
316642
316662
  },
316643
316663
  },
316664
+ TelegramConfig: {
316665
+ type: 'object',
316666
+ properties: {
316667
+ bot_token: {
316668
+ type: 'string',
316669
+ description: 'Bot token from',
316670
+ },
316671
+ polling_timeout: {
316672
+ type: 'number',
316673
+ description: 'Polling timeout in seconds for getUpdates (default: 30)',
316674
+ },
316675
+ chat_allowlist: {
316676
+ type: 'array',
316677
+ items: {
316678
+ type: ['string', 'number'],
316679
+ },
316680
+ description: 'Chat/group allowlist - numeric chat IDs that the bot responds in',
316681
+ },
316682
+ require_mention: {
316683
+ type: 'boolean',
316684
+ description: 'In groups, only respond when',
316685
+ },
316686
+ workflow: {
316687
+ type: 'string',
316688
+ description: 'Workflow to run when a message is received',
316689
+ },
316690
+ },
316691
+ additionalProperties: false,
316692
+ patternProperties: {
316693
+ '^x-': {},
316694
+ },
316695
+ },
316696
+ EmailConfig: {
316697
+ type: 'object',
316698
+ properties: {
316699
+ receive: {
316700
+ type: 'object',
316701
+ properties: {
316702
+ type: {
316703
+ type: 'string',
316704
+ enum: ['imap', 'resend'],
316705
+ description: "Backend type: 'imap' (universal) or 'resend' (managed webhook)",
316706
+ },
316707
+ host: {
316708
+ type: 'string',
316709
+ description: 'IMAP server hostname',
316710
+ },
316711
+ port: {
316712
+ type: 'number',
316713
+ description: 'IMAP server port (default: 993)',
316714
+ },
316715
+ auth: {
316716
+ type: 'object',
316717
+ properties: {
316718
+ user: {
316719
+ type: 'string',
316720
+ },
316721
+ pass: {
316722
+ type: 'string',
316723
+ },
316724
+ },
316725
+ additionalProperties: false,
316726
+ description: 'IMAP auth credentials',
316727
+ patternProperties: {
316728
+ '^x-': {},
316729
+ },
316730
+ },
316731
+ secure: {
316732
+ type: 'boolean',
316733
+ description: 'Use TLS (default: true)',
316734
+ },
316735
+ poll_interval: {
316736
+ type: 'number',
316737
+ description: 'Polling interval in seconds when IDLE not available (default: 30)',
316738
+ },
316739
+ folder: {
316740
+ type: 'string',
316741
+ description: "IMAP folder to monitor (default: 'INBOX')",
316742
+ },
316743
+ mark_read: {
316744
+ type: 'boolean',
316745
+ description: 'Mark processed messages as read (default: true)',
316746
+ },
316747
+ api_key: {
316748
+ type: 'string',
316749
+ description: "Resend API key (for type: 'resend')",
316750
+ },
316751
+ webhook_secret: {
316752
+ type: 'string',
316753
+ description: 'Resend webhook secret for signature verification',
316754
+ },
316755
+ },
316756
+ additionalProperties: false,
316757
+ description: 'Receive backend configuration',
316758
+ patternProperties: {
316759
+ '^x-': {},
316760
+ },
316761
+ },
316762
+ send: {
316763
+ type: 'object',
316764
+ properties: {
316765
+ type: {
316766
+ type: 'string',
316767
+ enum: ['smtp', 'resend'],
316768
+ description: "Backend type: 'smtp' (universal) or 'resend' (managed API)",
316769
+ },
316770
+ host: {
316771
+ type: 'string',
316772
+ description: 'SMTP server hostname',
316773
+ },
316774
+ port: {
316775
+ type: 'number',
316776
+ description: 'SMTP server port (default: 587)',
316777
+ },
316778
+ auth: {
316779
+ type: 'object',
316780
+ properties: {
316781
+ user: {
316782
+ type: 'string',
316783
+ },
316784
+ pass: {
316785
+ type: 'string',
316786
+ },
316787
+ },
316788
+ additionalProperties: false,
316789
+ description: 'SMTP auth credentials',
316790
+ patternProperties: {
316791
+ '^x-': {},
316792
+ },
316793
+ },
316794
+ secure: {
316795
+ type: 'boolean',
316796
+ description: 'Use TLS (default: true)',
316797
+ },
316798
+ from: {
316799
+ type: 'string',
316800
+ description: 'Default sender address (e.g., "Bot <bot@example.com>")',
316801
+ },
316802
+ api_key: {
316803
+ type: 'string',
316804
+ description: "Resend API key (for type: 'resend')",
316805
+ },
316806
+ },
316807
+ additionalProperties: false,
316808
+ description: 'Send backend configuration',
316809
+ patternProperties: {
316810
+ '^x-': {},
316811
+ },
316812
+ },
316813
+ allowlist: {
316814
+ type: 'array',
316815
+ items: {
316816
+ type: 'string',
316817
+ },
316818
+ description: 'Only process emails from these senders',
316819
+ },
316820
+ workflow: {
316821
+ type: 'string',
316822
+ description: 'Workflow to run when an email is received',
316823
+ },
316824
+ },
316825
+ additionalProperties: false,
316826
+ patternProperties: {
316827
+ '^x-': {},
316828
+ },
316829
+ },
316830
+ WhatsAppConfig: {
316831
+ type: 'object',
316832
+ properties: {
316833
+ access_token: {
316834
+ type: 'string',
316835
+ description: 'WhatsApp Cloud API access token (or WHATSAPP_ACCESS_TOKEN env var)',
316836
+ },
316837
+ phone_number_id: {
316838
+ type: 'string',
316839
+ description: 'Phone Number ID from Meta Business Suite (or WHATSAPP_PHONE_NUMBER_ID env var)',
316840
+ },
316841
+ app_secret: {
316842
+ type: 'string',
316843
+ description: 'Meta App Secret for webhook signature verification (or WHATSAPP_APP_SECRET env var)',
316844
+ },
316845
+ verify_token: {
316846
+ type: 'string',
316847
+ description: 'Verify token for webhook subscription challenge (or WHATSAPP_VERIFY_TOKEN env var)',
316848
+ },
316849
+ api_version: {
316850
+ type: 'string',
316851
+ description: "Graph API version (default: 'v21.0')",
316852
+ },
316853
+ port: {
316854
+ type: 'number',
316855
+ description: 'Port for webhook HTTP server (default: 8443)',
316856
+ },
316857
+ host: {
316858
+ type: 'string',
316859
+ description: "Host for webhook HTTP server (default: '0.0.0.0')",
316860
+ },
316861
+ phone_allowlist: {
316862
+ type: 'array',
316863
+ items: {
316864
+ type: 'string',
316865
+ },
316866
+ description: 'Phone number allowlist — only respond to these numbers',
316867
+ },
316868
+ workflow: {
316869
+ type: 'string',
316870
+ description: 'Workflow to run when a message is received',
316871
+ },
316872
+ },
316873
+ additionalProperties: false,
316874
+ patternProperties: {
316875
+ '^x-': {},
316876
+ },
316877
+ },
316878
+ TeamsConfig: {
316879
+ type: 'object',
316880
+ properties: {
316881
+ app_id: {
316882
+ type: 'string',
316883
+ description: 'Azure AD App (client) ID (or TEAMS_APP_ID env var)',
316884
+ },
316885
+ app_password: {
316886
+ type: 'string',
316887
+ description: 'Azure AD App client secret (or TEAMS_APP_PASSWORD env var)',
316888
+ },
316889
+ tenant_id: {
316890
+ type: 'string',
316891
+ description: 'Azure AD Tenant ID for single-tenant apps (or TEAMS_TENANT_ID env var)',
316892
+ },
316893
+ port: {
316894
+ type: 'number',
316895
+ description: 'Port for webhook HTTP server (default: 3978)',
316896
+ },
316897
+ host: {
316898
+ type: 'string',
316899
+ description: "Host for webhook HTTP server (default: '0.0.0.0')",
316900
+ },
316901
+ user_allowlist: {
316902
+ type: 'array',
316903
+ items: {
316904
+ type: 'string',
316905
+ },
316906
+ description: 'User ID allowlist — only respond to these AAD user IDs',
316907
+ },
316908
+ workflow: {
316909
+ type: 'string',
316910
+ description: 'Workflow to run when a message is received',
316911
+ },
316912
+ },
316913
+ additionalProperties: false,
316914
+ patternProperties: {
316915
+ '^x-': {},
316916
+ },
316917
+ },
316644
316918
  SchedulerConfig: {
316645
316919
  type: 'object',
316646
316920
  properties: {
@@ -357681,7 +357955,12 @@ exports.getTestMetricsSnapshot = getTestMetricsSnapshot;
357681
357955
  exports.resetTestMetricsSnapshot = resetTestMetricsSnapshot;
357682
357956
  const lazy_otel_1 = __nccwpck_require__(21084);
357683
357957
  let initialized = false;
357684
- const meter = lazy_otel_1.metrics.getMeter('visor');
357958
+ // Lazy meter: acquired inside ensureInstruments() so that the MeterProvider
357959
+ // registered by NodeSDK (in initTelemetry) is available. Acquiring at
357960
+ // module-load time would return a no-op meter because the SDK hasn't started.
357961
+ function getMeter() {
357962
+ return lazy_otel_1.metrics.getMeter('visor');
357963
+ }
357685
357964
  // Test helpers (enabled with VISOR_TEST_METRICS=true)
357686
357965
  const TEST_ENABLED = process.env.VISOR_TEST_METRICS === 'true';
357687
357966
  const TEST_SNAPSHOT = { fail_if_triggered: 0 };
@@ -357701,47 +357980,47 @@ function ensureInstruments() {
357701
357980
  if (initialized)
357702
357981
  return;
357703
357982
  try {
357704
- checkDurationHist = meter.createHistogram('visor.check.duration_ms', {
357983
+ checkDurationHist = getMeter().createHistogram('visor.check.duration_ms', {
357705
357984
  description: 'Duration of a check execution in milliseconds',
357706
357985
  unit: 'ms',
357707
357986
  });
357708
- providerDurationHist = meter.createHistogram('visor.provider.duration_ms', {
357987
+ providerDurationHist = getMeter().createHistogram('visor.provider.duration_ms', {
357709
357988
  description: 'Duration of provider execution in milliseconds',
357710
357989
  unit: 'ms',
357711
357990
  });
357712
- foreachDurationHist = meter.createHistogram('visor.foreach.item.duration_ms', {
357991
+ foreachDurationHist = getMeter().createHistogram('visor.foreach.item.duration_ms', {
357713
357992
  description: 'Duration of a forEach item execution in milliseconds',
357714
357993
  unit: 'ms',
357715
357994
  });
357716
- issuesCounter = meter.createCounter('visor.check.issues', {
357995
+ issuesCounter = getMeter().createCounter('visor.check.issues', {
357717
357996
  description: 'Number of issues produced by checks',
357718
357997
  unit: '1',
357719
357998
  });
357720
- activeChecks = meter.createUpDownCounter('visor.run.active_checks', {
357999
+ activeChecks = getMeter().createUpDownCounter('visor.run.active_checks', {
357721
358000
  description: 'Number of checks actively running',
357722
358001
  unit: '1',
357723
358002
  });
357724
- failIfCounter = meter.createCounter('visor.fail_if.triggered', {
358003
+ failIfCounter = getMeter().createCounter('visor.fail_if.triggered', {
357725
358004
  description: 'Number of times fail_if condition triggered',
357726
358005
  unit: '1',
357727
358006
  });
357728
- diagramBlocks = meter.createCounter('visor.diagram.blocks', {
358007
+ diagramBlocks = getMeter().createCounter('visor.diagram.blocks', {
357729
358008
  description: 'Number of Mermaid diagram blocks emitted',
357730
358009
  unit: '1',
357731
358010
  });
357732
- runCounter = meter.createCounter('visor.run.total', {
358011
+ runCounter = getMeter().createCounter('visor.run.total', {
357733
358012
  description: 'Total number of visor runs (workflow executions)',
357734
358013
  unit: '1',
357735
358014
  });
357736
- runDurationHist = meter.createHistogram('visor.run.duration_ms', {
358015
+ runDurationHist = getMeter().createHistogram('visor.run.duration_ms', {
357737
358016
  description: 'Duration of a complete visor run in milliseconds',
357738
358017
  unit: 'ms',
357739
358018
  });
357740
- aiCallCounter = meter.createCounter('visor.ai_call.total', {
358019
+ aiCallCounter = getMeter().createCounter('visor.ai_call.total', {
357741
358020
  description: 'Total number of AI provider calls',
357742
358021
  unit: '1',
357743
358022
  });
357744
- runAiCallsHist = meter.createHistogram('visor.run.ai_calls', {
358023
+ runAiCallsHist = getMeter().createHistogram('visor.run.ai_calls', {
357745
358024
  description: 'Number of AI calls per visor run',
357746
358025
  unit: '1',
357747
358026
  });
@@ -448808,13 +449087,13 @@ function categorizeError(error40) {
448808
449087
  if (lowerMessage.includes("path does not exist") || lowerMessage.includes("no such file or directory") || errorCode === "enoent") {
448809
449088
  return new PathError(message, {
448810
449089
  originalError: error40,
448811
- suggestion: "The specified path does not exist. Please verify the path or use a different directory."
449090
+ suggestion: "The specified path does not exist. Use the listFiles tool to check the correct directory structure, then retry with a valid path."
448812
449091
  });
448813
449092
  }
448814
449093
  if (lowerMessage.includes("not a directory") || errorCode === "enotdir") {
448815
449094
  return new PathError(message, {
448816
449095
  originalError: error40,
448817
- suggestion: "The path is not a directory. Please provide a valid directory path."
449096
+ suggestion: "The path is not a directory. Use the listFiles tool to find the correct directory, then retry."
448818
449097
  });
448819
449098
  }
448820
449099
  if (lowerMessage.includes("permission denied") || errorCode === "eacces") {
@@ -449070,7 +449349,7 @@ async function validateCwdPath(inputPath, defaultPath = process.cwd()) {
449070
449349
  }
449071
449350
  if (error40.code === "ENOENT") {
449072
449351
  throw new PathError(`Path does not exist: ${normalizedPath}`, {
449073
- suggestion: "The specified path does not exist. Please verify the path is correct or use a different directory.",
449352
+ suggestion: "The specified path does not exist. Use the listFiles tool to check the correct directory structure, then retry with a valid path.",
449074
449353
  details: { path: normalizedPath }
449075
449354
  });
449076
449355
  }
@@ -530061,6 +530340,9 @@ var require_utils2 = __commonJS({
530061
530340
  sandboxGlobal
530062
530341
  };
530063
530342
  context.prototypeWhitelist.set(Object.getPrototypeOf([][Symbol.iterator]()), /* @__PURE__ */ new Set());
530343
+ context.prototypeWhitelist.set(Object.getPrototypeOf(""[Symbol.iterator]()), /* @__PURE__ */ new Set());
530344
+ context.prototypeWhitelist.set(Object.getPrototypeOf((/* @__PURE__ */ new Set())[Symbol.iterator]()), /* @__PURE__ */ new Set());
530345
+ context.prototypeWhitelist.set(Object.getPrototypeOf((/* @__PURE__ */ new Map())[Symbol.iterator]()), /* @__PURE__ */ new Set());
530064
530346
  return context;
530065
530347
  }
530066
530348
  function createExecContext(sandbox, executionTree, evalContext) {
@@ -531199,6 +531481,18 @@ var require_executor = __commonJS({
531199
531481
  a = void 0;
531200
531482
  }
531201
531483
  }
531484
+ if (op === 29 && !a) {
531485
+ done(void 0, a);
531486
+ return;
531487
+ }
531488
+ if (op === 30 && a) {
531489
+ done(void 0, a);
531490
+ return;
531491
+ }
531492
+ if (op === 85 && a !== null && a !== void 0) {
531493
+ done(void 0, a);
531494
+ return;
531495
+ }
531202
531496
  let bobj;
531203
531497
  try {
531204
531498
  let ad;
@@ -531261,6 +531555,18 @@ var require_executor = __commonJS({
531261
531555
  a = void 0;
531262
531556
  }
531263
531557
  }
531558
+ if (op === 29 && !a) {
531559
+ done(void 0, a);
531560
+ return;
531561
+ }
531562
+ if (op === 30 && a) {
531563
+ done(void 0, a);
531564
+ return;
531565
+ }
531566
+ if (op === 85 && a !== null && a !== void 0) {
531567
+ done(void 0, a);
531568
+ return;
531569
+ }
531264
531570
  let bobj;
531265
531571
  try {
531266
531572
  bobj = syncDone((d) => execSync(ticks, tree[2], scope, context, d, inLoopOrSwitch)).result;
@@ -544899,7 +545205,7 @@ var init_ProbeAgent = __esm({
544899
545205
  if (limiter && result.textStream) {
544900
545206
  const originalStream = result.textStream;
544901
545207
  const debug = this.debug;
544902
- result.textStream = (async function* () {
545208
+ const wrappedStream = (async function* () {
544903
545209
  try {
544904
545210
  for await (const chunk of originalStream) {
544905
545211
  yield chunk;
@@ -544912,6 +545218,13 @@ var init_ProbeAgent = __esm({
544912
545218
  }
544913
545219
  }
544914
545220
  })();
545221
+ return new Proxy(result, {
545222
+ get(target, prop) {
545223
+ if (prop === "textStream") return wrappedStream;
545224
+ const value = target[prop];
545225
+ return typeof value === "function" ? value.bind(target) : value;
545226
+ }
545227
+ });
544915
545228
  } else if (limiter) {
544916
545229
  limiter.release(null);
544917
545230
  }
@@ -546565,6 +546878,21 @@ You are working with a workspace. Available paths: ${workspaceDesc}
546565
546878
  }
546566
546879
  }
546567
546880
  }
546881
+ if (steps.length >= 3) {
546882
+ const last3 = steps.slice(-3);
546883
+ const allErrors = last3.every(
546884
+ (s) => s.toolResults?.length > 0 && s.toolResults.every((tr) => {
546885
+ const r = typeof tr.result === "string" ? tr.result : "";
546886
+ return r.includes("<error ") || r.includes("does not exist");
546887
+ })
546888
+ );
546889
+ if (allErrors) {
546890
+ if (this.debug) {
546891
+ console.log(`[DEBUG] prepareStep: 3 consecutive tool errors, forcing toolChoice=none`);
546892
+ }
546893
+ return { toolChoice: "none" };
546894
+ }
546895
+ }
546568
546896
  const lastStep = steps[steps.length - 1];
546569
546897
  const modelJustStopped = lastStep?.finishReason === "stop" && (!lastStep?.toolCalls || lastStep.toolCalls.length === 0);
546570
546898
  if (modelJustStopped) {
@@ -546593,7 +546921,8 @@ Here is the result to review:
546593
546921
  ${resultToReview}
546594
546922
  </result>
546595
546923
 
546596
- Double-check your response based on the criteria above. If everything looks good, respond with your previous answer exactly as-is. If something needs to be fixed or is missing, do it now, then respond with the COMPLETE updated answer (everything you did in total, not just the fix).`;
546924
+ IMPORTANT: First review ALL completed work in the conversation above before taking any action.
546925
+ Double-check your response based on the criteria above. If everything looks good, respond with your previous answer exactly as-is. If your text has inaccuracies, fix the text. Only call a tool if you find a genuinely MISSING action \u2014 NEVER redo work that was already completed successfully. Respond with the COMPLETE corrected answer.`;
546597
546926
  return {
546598
546927
  userMessage: completionPromptMessage,
546599
546928
  toolChoice: "none"
@@ -546752,7 +547081,8 @@ Here is the result to review:
546752
547081
  ${finalResult}
546753
547082
  </result>
546754
547083
 
546755
- Double-check your response based on the criteria above. If everything looks good, respond with your previous answer exactly as-is. If something needs to be fixed or is missing, do it now, then respond with the COMPLETE updated answer (everything you did in total, not just the fix).`;
547084
+ IMPORTANT: First review ALL completed work in the conversation above before taking any action.
547085
+ Double-check your response based on the criteria above. If everything looks good, respond with your previous answer exactly as-is. If your text has inaccuracies, fix the text. Only call a tool if you find a genuinely MISSING action \u2014 NEVER redo work that was already completed successfully. Respond with the COMPLETE corrected answer.`;
546756
547086
  currentMessages.push({ role: "user", content: completionPromptMessage });
546757
547087
  const completionStreamOptions = {
546758
547088
  model: this.provider ? this.provider(this.model) : this.model,
@@ -548778,7 +549108,11 @@ var init_vercel = __esm({
548778
549108
  return result;
548779
549109
  } catch (error40) {
548780
549110
  console.error("Error executing search command:", error40);
548781
- return formatErrorForAI(error40);
549111
+ const formatted = formatErrorForAI(error40);
549112
+ if (error40.category === "path_error" || error40.message?.includes("does not exist")) {
549113
+ return formatted + "\n\nThe path does not exist. Use the listFiles tool to verify the correct directory structure before retrying. If the workspace itself is gone, output your final answer with whatever information you have.";
549114
+ }
549115
+ return formatted;
548782
549116
  }
548783
549117
  }
548784
549118
  try {
@@ -608036,7 +608370,7 @@ module.exports = /*#__PURE__*/JSON.parse('["aaa","aarp","abb","abbott","abbvie",
608036
608370
  /***/ ((module) => {
608037
608371
 
608038
608372
  "use strict";
608039
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.173","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"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","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","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\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-logs":"^0.203.0","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc290","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","botbuilder":"^4.23.3","botframework-connector":"^4.23.3","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","grammy":"^1.41.1","ignore":"^7.0.5","imapflow":"^1.2.12","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","mailparser":"^3.9.3","minimatch":"^10.2.2","node-cron":"^3.0.3","nodemailer":"^8.0.1","open":"^9.1.0","resend":"^6.9.3","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/mailparser":"^3.4.6","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/nodemailer":"^7.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
608373
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.174","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"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","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","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\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-logs":"^0.203.0","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc291","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","botbuilder":"^4.23.3","botframework-connector":"^4.23.3","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","grammy":"^1.41.1","ignore":"^7.0.5","imapflow":"^1.2.12","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","mailparser":"^3.9.3","minimatch":"^10.2.2","node-cron":"^3.0.3","nodemailer":"^8.0.1","open":"^9.1.0","resend":"^6.9.3","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/mailparser":"^3.4.6","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/nodemailer":"^7.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
608040
608374
 
608041
608375
  /***/ })
608042
608376