@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/sdk/sdk.js CHANGED
@@ -704,7 +704,7 @@ var require_package = __commonJS({
704
704
  "package.json"(exports2, module2) {
705
705
  module2.exports = {
706
706
  name: "@probelabs/visor",
707
- version: "0.1.173",
707
+ version: "0.1.174",
708
708
  main: "dist/index.js",
709
709
  bin: {
710
710
  visor: "./dist/index.js"
@@ -823,7 +823,7 @@ var require_package = __commonJS({
823
823
  "@opentelemetry/sdk-node": "^0.203.0",
824
824
  "@opentelemetry/sdk-trace-base": "^1.30.1",
825
825
  "@opentelemetry/semantic-conventions": "^1.30.1",
826
- "@probelabs/probe": "^0.6.0-rc290",
826
+ "@probelabs/probe": "^0.6.0-rc291",
827
827
  "@types/commander": "^2.12.0",
828
828
  "@types/uuid": "^10.0.0",
829
829
  acorn: "^8.16.0",
@@ -939,50 +939,53 @@ __export(metrics_exports, {
939
939
  resetRunAiCalls: () => resetRunAiCalls,
940
940
  resetTestMetricsSnapshot: () => resetTestMetricsSnapshot
941
941
  });
942
+ function getMeter() {
943
+ return metrics.getMeter("visor");
944
+ }
942
945
  function ensureInstruments() {
943
946
  if (initialized) return;
944
947
  try {
945
- checkDurationHist = meter.createHistogram("visor.check.duration_ms", {
948
+ checkDurationHist = getMeter().createHistogram("visor.check.duration_ms", {
946
949
  description: "Duration of a check execution in milliseconds",
947
950
  unit: "ms"
948
951
  });
949
- providerDurationHist = meter.createHistogram("visor.provider.duration_ms", {
952
+ providerDurationHist = getMeter().createHistogram("visor.provider.duration_ms", {
950
953
  description: "Duration of provider execution in milliseconds",
951
954
  unit: "ms"
952
955
  });
953
- foreachDurationHist = meter.createHistogram("visor.foreach.item.duration_ms", {
956
+ foreachDurationHist = getMeter().createHistogram("visor.foreach.item.duration_ms", {
954
957
  description: "Duration of a forEach item execution in milliseconds",
955
958
  unit: "ms"
956
959
  });
957
- issuesCounter = meter.createCounter("visor.check.issues", {
960
+ issuesCounter = getMeter().createCounter("visor.check.issues", {
958
961
  description: "Number of issues produced by checks",
959
962
  unit: "1"
960
963
  });
961
- activeChecks = meter.createUpDownCounter("visor.run.active_checks", {
964
+ activeChecks = getMeter().createUpDownCounter("visor.run.active_checks", {
962
965
  description: "Number of checks actively running",
963
966
  unit: "1"
964
967
  });
965
- failIfCounter = meter.createCounter("visor.fail_if.triggered", {
968
+ failIfCounter = getMeter().createCounter("visor.fail_if.triggered", {
966
969
  description: "Number of times fail_if condition triggered",
967
970
  unit: "1"
968
971
  });
969
- diagramBlocks = meter.createCounter("visor.diagram.blocks", {
972
+ diagramBlocks = getMeter().createCounter("visor.diagram.blocks", {
970
973
  description: "Number of Mermaid diagram blocks emitted",
971
974
  unit: "1"
972
975
  });
973
- runCounter = meter.createCounter("visor.run.total", {
976
+ runCounter = getMeter().createCounter("visor.run.total", {
974
977
  description: "Total number of visor runs (workflow executions)",
975
978
  unit: "1"
976
979
  });
977
- runDurationHist = meter.createHistogram("visor.run.duration_ms", {
980
+ runDurationHist = getMeter().createHistogram("visor.run.duration_ms", {
978
981
  description: "Duration of a complete visor run in milliseconds",
979
982
  unit: "ms"
980
983
  });
981
- aiCallCounter = meter.createCounter("visor.ai_call.total", {
984
+ aiCallCounter = getMeter().createCounter("visor.ai_call.total", {
982
985
  description: "Total number of AI provider calls",
983
986
  unit: "1"
984
987
  });
985
- runAiCallsHist = meter.createHistogram("visor.run.ai_calls", {
988
+ runAiCallsHist = getMeter().createHistogram("visor.run.ai_calls", {
986
989
  description: "Number of AI calls per visor run",
987
990
  unit: "1"
988
991
  });
@@ -1119,13 +1122,12 @@ function getTestMetricsSnapshot() {
1119
1122
  function resetTestMetricsSnapshot() {
1120
1123
  Object.keys(TEST_SNAPSHOT).forEach((k) => TEST_SNAPSHOT[k] = 0);
1121
1124
  }
1122
- var initialized, meter, TEST_ENABLED, TEST_SNAPSHOT, checkDurationHist, providerDurationHist, foreachDurationHist, issuesCounter, activeChecks, failIfCounter, diagramBlocks, runCounter, runDurationHist, aiCallCounter, runAiCallsHist, _currentRunAiCalls;
1125
+ var initialized, TEST_ENABLED, TEST_SNAPSHOT, checkDurationHist, providerDurationHist, foreachDurationHist, issuesCounter, activeChecks, failIfCounter, diagramBlocks, runCounter, runDurationHist, aiCallCounter, runAiCallsHist, _currentRunAiCalls;
1123
1126
  var init_metrics = __esm({
1124
1127
  "src/telemetry/metrics.ts"() {
1125
1128
  "use strict";
1126
1129
  init_lazy_otel();
1127
1130
  initialized = false;
1128
- meter = metrics.getMeter("visor");
1129
1131
  TEST_ENABLED = process.env.VISOR_TEST_METRICS === "true";
1130
1132
  TEST_SNAPSHOT = { fail_if_triggered: 0 };
1131
1133
  _currentRunAiCalls = 0;
@@ -12669,6 +12671,22 @@ var init_config_schema = __esm({
12669
12671
  $ref: "#/definitions/SlackConfig",
12670
12672
  description: "Slack configuration"
12671
12673
  },
12674
+ telegram: {
12675
+ $ref: "#/definitions/TelegramConfig",
12676
+ description: "Telegram bot configuration"
12677
+ },
12678
+ email: {
12679
+ $ref: "#/definitions/EmailConfig",
12680
+ description: "Email integration configuration"
12681
+ },
12682
+ whatsapp: {
12683
+ $ref: "#/definitions/WhatsAppConfig",
12684
+ description: "WhatsApp bot configuration"
12685
+ },
12686
+ teams: {
12687
+ $ref: "#/definitions/TeamsConfig",
12688
+ description: "Microsoft Teams bot configuration"
12689
+ },
12672
12690
  scheduler: {
12673
12691
  $ref: "#/definitions/SchedulerConfig",
12674
12692
  description: "Scheduler configuration for scheduled workflow execution"
@@ -13442,7 +13460,7 @@ var init_config_schema = __esm({
13442
13460
  description: "Arguments/inputs for the workflow"
13443
13461
  },
13444
13462
  overrides: {
13445
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E",
13463
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E",
13446
13464
  description: "Override specific step configurations in the workflow"
13447
13465
  },
13448
13466
  output_mapping: {
@@ -13458,7 +13476,7 @@ var init_config_schema = __esm({
13458
13476
  description: "Config file path - alternative to workflow ID (loads a Visor config file as workflow)"
13459
13477
  },
13460
13478
  workflow_overrides: {
13461
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E",
13479
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E",
13462
13480
  description: "Alias for overrides - workflow step overrides (backward compatibility)"
13463
13481
  },
13464
13482
  ref: {
@@ -13642,7 +13660,11 @@ var init_config_schema = __esm({
13642
13660
  "manual",
13643
13661
  "schedule",
13644
13662
  "webhook_received",
13645
- "slack_message"
13663
+ "slack_message",
13664
+ "telegram_message",
13665
+ "email_message",
13666
+ "whatsapp_message",
13667
+ "teams_message"
13646
13668
  ],
13647
13669
  description: "Valid event triggers for checks"
13648
13670
  },
@@ -14156,7 +14178,7 @@ var init_config_schema = __esm({
14156
14178
  description: "Custom output name (defaults to workflow name)"
14157
14179
  },
14158
14180
  overrides: {
14159
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E%3E",
14181
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E%3E",
14160
14182
  description: "Step overrides"
14161
14183
  },
14162
14184
  output_mapping: {
@@ -14171,13 +14193,13 @@ var init_config_schema = __esm({
14171
14193
  "^x-": {}
14172
14194
  }
14173
14195
  },
14174
- "Record<string,Partial<interface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400>>": {
14196
+ "Record<string,Partial<interface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833>>": {
14175
14197
  type: "object",
14176
14198
  additionalProperties: {
14177
- $ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400%3E"
14199
+ $ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833%3E"
14178
14200
  }
14179
14201
  },
14180
- "Partial<interface-src_types_config.ts-13844-28438-src_types_config.ts-0-56400>": {
14202
+ "Partial<interface-src_types_config.ts-14017-28611-src_types_config.ts-0-56833>": {
14181
14203
  type: "object",
14182
14204
  additionalProperties: false
14183
14205
  },
@@ -15036,6 +15058,260 @@ var init_config_schema = __esm({
15036
15058
  "^x-": {}
15037
15059
  }
15038
15060
  },
15061
+ TelegramConfig: {
15062
+ type: "object",
15063
+ properties: {
15064
+ bot_token: {
15065
+ type: "string",
15066
+ description: "Bot token from"
15067
+ },
15068
+ polling_timeout: {
15069
+ type: "number",
15070
+ description: "Polling timeout in seconds for getUpdates (default: 30)"
15071
+ },
15072
+ chat_allowlist: {
15073
+ type: "array",
15074
+ items: {
15075
+ type: ["string", "number"]
15076
+ },
15077
+ description: "Chat/group allowlist - numeric chat IDs that the bot responds in"
15078
+ },
15079
+ require_mention: {
15080
+ type: "boolean",
15081
+ description: "In groups, only respond when"
15082
+ },
15083
+ workflow: {
15084
+ type: "string",
15085
+ description: "Workflow to run when a message is received"
15086
+ }
15087
+ },
15088
+ additionalProperties: false,
15089
+ patternProperties: {
15090
+ "^x-": {}
15091
+ }
15092
+ },
15093
+ EmailConfig: {
15094
+ type: "object",
15095
+ properties: {
15096
+ receive: {
15097
+ type: "object",
15098
+ properties: {
15099
+ type: {
15100
+ type: "string",
15101
+ enum: ["imap", "resend"],
15102
+ description: "Backend type: 'imap' (universal) or 'resend' (managed webhook)"
15103
+ },
15104
+ host: {
15105
+ type: "string",
15106
+ description: "IMAP server hostname"
15107
+ },
15108
+ port: {
15109
+ type: "number",
15110
+ description: "IMAP server port (default: 993)"
15111
+ },
15112
+ auth: {
15113
+ type: "object",
15114
+ properties: {
15115
+ user: {
15116
+ type: "string"
15117
+ },
15118
+ pass: {
15119
+ type: "string"
15120
+ }
15121
+ },
15122
+ additionalProperties: false,
15123
+ description: "IMAP auth credentials",
15124
+ patternProperties: {
15125
+ "^x-": {}
15126
+ }
15127
+ },
15128
+ secure: {
15129
+ type: "boolean",
15130
+ description: "Use TLS (default: true)"
15131
+ },
15132
+ poll_interval: {
15133
+ type: "number",
15134
+ description: "Polling interval in seconds when IDLE not available (default: 30)"
15135
+ },
15136
+ folder: {
15137
+ type: "string",
15138
+ description: "IMAP folder to monitor (default: 'INBOX')"
15139
+ },
15140
+ mark_read: {
15141
+ type: "boolean",
15142
+ description: "Mark processed messages as read (default: true)"
15143
+ },
15144
+ api_key: {
15145
+ type: "string",
15146
+ description: "Resend API key (for type: 'resend')"
15147
+ },
15148
+ webhook_secret: {
15149
+ type: "string",
15150
+ description: "Resend webhook secret for signature verification"
15151
+ }
15152
+ },
15153
+ additionalProperties: false,
15154
+ description: "Receive backend configuration",
15155
+ patternProperties: {
15156
+ "^x-": {}
15157
+ }
15158
+ },
15159
+ send: {
15160
+ type: "object",
15161
+ properties: {
15162
+ type: {
15163
+ type: "string",
15164
+ enum: ["smtp", "resend"],
15165
+ description: "Backend type: 'smtp' (universal) or 'resend' (managed API)"
15166
+ },
15167
+ host: {
15168
+ type: "string",
15169
+ description: "SMTP server hostname"
15170
+ },
15171
+ port: {
15172
+ type: "number",
15173
+ description: "SMTP server port (default: 587)"
15174
+ },
15175
+ auth: {
15176
+ type: "object",
15177
+ properties: {
15178
+ user: {
15179
+ type: "string"
15180
+ },
15181
+ pass: {
15182
+ type: "string"
15183
+ }
15184
+ },
15185
+ additionalProperties: false,
15186
+ description: "SMTP auth credentials",
15187
+ patternProperties: {
15188
+ "^x-": {}
15189
+ }
15190
+ },
15191
+ secure: {
15192
+ type: "boolean",
15193
+ description: "Use TLS (default: true)"
15194
+ },
15195
+ from: {
15196
+ type: "string",
15197
+ description: 'Default sender address (e.g., "Bot <bot@example.com>")'
15198
+ },
15199
+ api_key: {
15200
+ type: "string",
15201
+ description: "Resend API key (for type: 'resend')"
15202
+ }
15203
+ },
15204
+ additionalProperties: false,
15205
+ description: "Send backend configuration",
15206
+ patternProperties: {
15207
+ "^x-": {}
15208
+ }
15209
+ },
15210
+ allowlist: {
15211
+ type: "array",
15212
+ items: {
15213
+ type: "string"
15214
+ },
15215
+ description: "Only process emails from these senders"
15216
+ },
15217
+ workflow: {
15218
+ type: "string",
15219
+ description: "Workflow to run when an email is received"
15220
+ }
15221
+ },
15222
+ additionalProperties: false,
15223
+ patternProperties: {
15224
+ "^x-": {}
15225
+ }
15226
+ },
15227
+ WhatsAppConfig: {
15228
+ type: "object",
15229
+ properties: {
15230
+ access_token: {
15231
+ type: "string",
15232
+ description: "WhatsApp Cloud API access token (or WHATSAPP_ACCESS_TOKEN env var)"
15233
+ },
15234
+ phone_number_id: {
15235
+ type: "string",
15236
+ description: "Phone Number ID from Meta Business Suite (or WHATSAPP_PHONE_NUMBER_ID env var)"
15237
+ },
15238
+ app_secret: {
15239
+ type: "string",
15240
+ description: "Meta App Secret for webhook signature verification (or WHATSAPP_APP_SECRET env var)"
15241
+ },
15242
+ verify_token: {
15243
+ type: "string",
15244
+ description: "Verify token for webhook subscription challenge (or WHATSAPP_VERIFY_TOKEN env var)"
15245
+ },
15246
+ api_version: {
15247
+ type: "string",
15248
+ description: "Graph API version (default: 'v21.0')"
15249
+ },
15250
+ port: {
15251
+ type: "number",
15252
+ description: "Port for webhook HTTP server (default: 8443)"
15253
+ },
15254
+ host: {
15255
+ type: "string",
15256
+ description: "Host for webhook HTTP server (default: '0.0.0.0')"
15257
+ },
15258
+ phone_allowlist: {
15259
+ type: "array",
15260
+ items: {
15261
+ type: "string"
15262
+ },
15263
+ description: "Phone number allowlist \u2014 only respond to these numbers"
15264
+ },
15265
+ workflow: {
15266
+ type: "string",
15267
+ description: "Workflow to run when a message is received"
15268
+ }
15269
+ },
15270
+ additionalProperties: false,
15271
+ patternProperties: {
15272
+ "^x-": {}
15273
+ }
15274
+ },
15275
+ TeamsConfig: {
15276
+ type: "object",
15277
+ properties: {
15278
+ app_id: {
15279
+ type: "string",
15280
+ description: "Azure AD App (client) ID (or TEAMS_APP_ID env var)"
15281
+ },
15282
+ app_password: {
15283
+ type: "string",
15284
+ description: "Azure AD App client secret (or TEAMS_APP_PASSWORD env var)"
15285
+ },
15286
+ tenant_id: {
15287
+ type: "string",
15288
+ description: "Azure AD Tenant ID for single-tenant apps (or TEAMS_TENANT_ID env var)"
15289
+ },
15290
+ port: {
15291
+ type: "number",
15292
+ description: "Port for webhook HTTP server (default: 3978)"
15293
+ },
15294
+ host: {
15295
+ type: "string",
15296
+ description: "Host for webhook HTTP server (default: '0.0.0.0')"
15297
+ },
15298
+ user_allowlist: {
15299
+ type: "array",
15300
+ items: {
15301
+ type: "string"
15302
+ },
15303
+ description: "User ID allowlist \u2014 only respond to these AAD user IDs"
15304
+ },
15305
+ workflow: {
15306
+ type: "string",
15307
+ description: "Workflow to run when a message is received"
15308
+ }
15309
+ },
15310
+ additionalProperties: false,
15311
+ patternProperties: {
15312
+ "^x-": {}
15313
+ }
15314
+ },
15039
15315
  SchedulerConfig: {
15040
15316
  type: "object",
15041
15317
  properties: {