@probelabs/visor 0.1.177 → 0.1.178-ee

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 (139) hide show
  1. package/defaults/code-talk.yaml +10 -5
  2. package/dist/defaults/code-talk.yaml +10 -5
  3. package/dist/docs/ai-custom-tools.md +49 -0
  4. package/dist/docs/http.md +23 -0
  5. package/dist/docs/testing/cookbook.md +48 -0
  6. package/dist/docs/testing/dsl-reference.md +4 -2
  7. package/dist/docs/testing/flows.md +33 -1
  8. package/dist/examples/http-integration-config.yaml +16 -0
  9. package/dist/generated/config-schema.d.ts +51 -6
  10. package/dist/generated/config-schema.d.ts.map +1 -1
  11. package/dist/generated/config-schema.json +61 -6
  12. package/dist/github-comments.d.ts +5 -1
  13. package/dist/github-comments.d.ts.map +1 -1
  14. package/dist/index.js +2224 -93
  15. package/dist/providers/api-tool-executor.d.ts +2 -0
  16. package/dist/providers/api-tool-executor.d.ts.map +1 -1
  17. package/dist/providers/http-client-provider.d.ts.map +1 -1
  18. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  19. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  20. package/dist/sdk/{a2a-frontend-FUJRKHJB.mjs → a2a-frontend-U3PTNCLR.mjs} +2 -2
  21. package/dist/sdk/{check-provider-registry-HW4QPPSA.mjs → check-provider-registry-SRASECAR.mjs} +6 -6
  22. package/dist/sdk/{check-provider-registry-OY2EESIO.mjs → check-provider-registry-ZX76MY2L.mjs} +6 -6
  23. package/dist/sdk/{chunk-OPI632LK.mjs → chunk-4ECMTCOM.mjs} +2 -2
  24. package/dist/sdk/{chunk-GVTWESYN.mjs → chunk-6YGCACBF.mjs} +2 -2
  25. package/dist/sdk/{chunk-65SHRIQF.mjs.map → chunk-6YGCACBF.mjs.map} +1 -1
  26. package/dist/sdk/{chunk-Y6PVSFCS.mjs → chunk-B7XHSG3L.mjs} +237 -47
  27. package/dist/sdk/chunk-B7XHSG3L.mjs.map +1 -0
  28. package/dist/sdk/{chunk-MM3TGVQ4.mjs → chunk-BMXVAJ2M.mjs} +52 -7
  29. package/dist/sdk/chunk-BMXVAJ2M.mjs.map +1 -0
  30. package/dist/sdk/{chunk-OHOBWVPP.mjs → chunk-ENSZDV3O.mjs} +3 -3
  31. package/dist/sdk/{chunk-2LCF5H5K.mjs → chunk-MGY5JAN2.mjs} +222 -37
  32. package/dist/sdk/chunk-MGY5JAN2.mjs.map +1 -0
  33. package/dist/sdk/{config-OOUMTCEA.mjs → config-DFOF7LP4.mjs} +2 -2
  34. package/dist/sdk/{failure-condition-evaluator-DL6H57NX.mjs → failure-condition-evaluator-P3MS5DRL.mjs} +3 -3
  35. package/dist/sdk/{github-frontend-FP6WKNZR.mjs → github-frontend-QTKOYB56.mjs} +11 -3
  36. package/dist/sdk/github-frontend-QTKOYB56.mjs.map +1 -0
  37. package/dist/sdk/{host-6SBCE4VK.mjs → host-I2TBBKD5.mjs} +3 -3
  38. package/dist/sdk/{host-NYUSWEE4.mjs → host-THORKOEL.mjs} +3 -3
  39. package/dist/sdk/knex-store-QCEW4I4R.mjs +527 -0
  40. package/dist/sdk/knex-store-QCEW4I4R.mjs.map +1 -0
  41. package/dist/sdk/loader-Q7K76ZIY.mjs +89 -0
  42. package/dist/sdk/loader-Q7K76ZIY.mjs.map +1 -0
  43. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs +655 -0
  44. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs.map +1 -0
  45. package/dist/sdk/{routing-PFFCQJV2.mjs → routing-2X6QF5IW.mjs} +4 -4
  46. package/dist/sdk/{schedule-tool-DN2DSXIX.mjs → schedule-tool-M6Y4YTXR.mjs} +6 -6
  47. package/dist/sdk/{schedule-tool-KVZN5LP6.mjs → schedule-tool-R6JJIDZ6.mjs} +6 -6
  48. package/dist/sdk/{schedule-tool-handler-57JBEICD.mjs → schedule-tool-handler-AOMZV3Q3.mjs} +6 -6
  49. package/dist/sdk/{schedule-tool-handler-6MPP5DXK.mjs → schedule-tool-handler-JYCVH377.mjs} +6 -6
  50. package/dist/sdk/sdk.d.mts +21 -0
  51. package/dist/sdk/sdk.d.ts +21 -0
  52. package/dist/sdk/sdk.js +1919 -307
  53. package/dist/sdk/sdk.js.map +1 -1
  54. package/dist/sdk/sdk.mjs +5 -5
  55. package/dist/sdk/{trace-helpers-L3EOYW5P.mjs → trace-helpers-K47ZVJSU.mjs} +2 -2
  56. package/dist/sdk/validator-XTZJZZJH.mjs +134 -0
  57. package/dist/sdk/validator-XTZJZZJH.mjs.map +1 -0
  58. package/dist/sdk/{workflow-check-provider-OA33MESM.mjs → workflow-check-provider-A3YH2UZJ.mjs} +6 -6
  59. package/dist/sdk/{workflow-check-provider-U3UIYLU7.mjs → workflow-check-provider-EMFC7A5K.mjs} +6 -6
  60. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
  61. package/dist/test-runner/conversation-sugar.d.ts +3 -0
  62. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  63. package/dist/test-runner/validator.d.ts.map +1 -1
  64. package/dist/types/config.d.ts +21 -0
  65. package/dist/types/config.d.ts.map +1 -1
  66. package/dist/utils/rate-limiter.d.ts +61 -0
  67. package/dist/utils/rate-limiter.d.ts.map +1 -0
  68. package/package.json +2 -2
  69. package/dist/output/traces/run-2026-03-10T16-21-38-082Z.ndjson +0 -138
  70. package/dist/output/traces/run-2026-03-10T16-22-15-059Z.ndjson +0 -2296
  71. package/dist/sdk/a2a-frontend-BPWLYLCG.mjs +0 -1658
  72. package/dist/sdk/a2a-frontend-FUJRKHJB.mjs.map +0 -1
  73. package/dist/sdk/a2a-frontend-HBUSNE3K.mjs +0 -1658
  74. package/dist/sdk/a2a-frontend-HBUSNE3K.mjs.map +0 -1
  75. package/dist/sdk/check-provider-registry-TRHN5ZBY.mjs +0 -30
  76. package/dist/sdk/chunk-2LCF5H5K.mjs.map +0 -1
  77. package/dist/sdk/chunk-65SHRIQF.mjs +0 -516
  78. package/dist/sdk/chunk-ADQVGGKA.mjs +0 -1502
  79. package/dist/sdk/chunk-BWC5R2UB.mjs +0 -739
  80. package/dist/sdk/chunk-EFNNJIMY.mjs +0 -739
  81. package/dist/sdk/chunk-EFNNJIMY.mjs.map +0 -1
  82. package/dist/sdk/chunk-FNBSDOQM.mjs +0 -516
  83. package/dist/sdk/chunk-FNBSDOQM.mjs.map +0 -1
  84. package/dist/sdk/chunk-GVTWESYN.mjs.map +0 -1
  85. package/dist/sdk/chunk-MM3TGVQ4.mjs.map +0 -1
  86. package/dist/sdk/chunk-OHOBWVPP.mjs.map +0 -1
  87. package/dist/sdk/chunk-OPI632LK.mjs.map +0 -1
  88. package/dist/sdk/chunk-WJIV7MKY.mjs +0 -1502
  89. package/dist/sdk/chunk-WJIV7MKY.mjs.map +0 -1
  90. package/dist/sdk/chunk-XLDVWRKQ.mjs +0 -45239
  91. package/dist/sdk/chunk-XLDVWRKQ.mjs.map +0 -1
  92. package/dist/sdk/chunk-Y6PVSFCS.mjs.map +0 -1
  93. package/dist/sdk/failure-condition-evaluator-63BECZYF.mjs +0 -18
  94. package/dist/sdk/failure-condition-evaluator-HL33X7MH.mjs +0 -18
  95. package/dist/sdk/github-frontend-F2YCPK6H.mjs +0 -1386
  96. package/dist/sdk/github-frontend-F2YCPK6H.mjs.map +0 -1
  97. package/dist/sdk/github-frontend-FP6WKNZR.mjs.map +0 -1
  98. package/dist/sdk/github-frontend-U2U42CKV.mjs +0 -1386
  99. package/dist/sdk/github-frontend-U2U42CKV.mjs.map +0 -1
  100. package/dist/sdk/host-6TBS44ER.mjs +0 -87
  101. package/dist/sdk/host-NYUSWEE4.mjs.map +0 -1
  102. package/dist/sdk/routing-GF2CF3JT.mjs +0 -26
  103. package/dist/sdk/routing-SFP4D6O3.mjs +0 -26
  104. package/dist/sdk/schedule-tool-45NAALKS.mjs +0 -36
  105. package/dist/sdk/schedule-tool-KVZN5LP6.mjs.map +0 -1
  106. package/dist/sdk/schedule-tool-handler-57JBEICD.mjs.map +0 -1
  107. package/dist/sdk/schedule-tool-handler-6MPP5DXK.mjs.map +0 -1
  108. package/dist/sdk/schedule-tool-handler-GEXHYH3X.mjs +0 -40
  109. package/dist/sdk/schedule-tool-handler-GEXHYH3X.mjs.map +0 -1
  110. package/dist/sdk/slack-frontend-6SXPTQDI.mjs +0 -895
  111. package/dist/sdk/slack-frontend-6SXPTQDI.mjs.map +0 -1
  112. package/dist/sdk/trace-helpers-FKM2MEDW.mjs +0 -29
  113. package/dist/sdk/trace-helpers-FKM2MEDW.mjs.map +0 -1
  114. package/dist/sdk/trace-helpers-L3EOYW5P.mjs.map +0 -1
  115. package/dist/sdk/trace-helpers-MYH2GPXF.mjs +0 -29
  116. package/dist/sdk/trace-helpers-MYH2GPXF.mjs.map +0 -1
  117. package/dist/sdk/workflow-check-provider-JNEFAECH.mjs +0 -30
  118. package/dist/sdk/workflow-check-provider-JNEFAECH.mjs.map +0 -1
  119. package/dist/sdk/workflow-check-provider-OA33MESM.mjs.map +0 -1
  120. package/dist/sdk/workflow-check-provider-U3UIYLU7.mjs.map +0 -1
  121. package/dist/traces/run-2026-03-10T16-21-38-082Z.ndjson +0 -138
  122. package/dist/traces/run-2026-03-10T16-22-15-059Z.ndjson +0 -2296
  123. /package/dist/sdk/{a2a-frontend-BPWLYLCG.mjs.map → a2a-frontend-U3PTNCLR.mjs.map} +0 -0
  124. /package/dist/sdk/{check-provider-registry-HW4QPPSA.mjs.map → check-provider-registry-SRASECAR.mjs.map} +0 -0
  125. /package/dist/sdk/{check-provider-registry-OY2EESIO.mjs.map → check-provider-registry-ZX76MY2L.mjs.map} +0 -0
  126. /package/dist/sdk/{chunk-BWC5R2UB.mjs.map → chunk-4ECMTCOM.mjs.map} +0 -0
  127. /package/dist/sdk/{chunk-ADQVGGKA.mjs.map → chunk-ENSZDV3O.mjs.map} +0 -0
  128. /package/dist/sdk/{check-provider-registry-TRHN5ZBY.mjs.map → config-DFOF7LP4.mjs.map} +0 -0
  129. /package/dist/sdk/{config-OOUMTCEA.mjs.map → failure-condition-evaluator-P3MS5DRL.mjs.map} +0 -0
  130. /package/dist/sdk/{host-6SBCE4VK.mjs.map → host-I2TBBKD5.mjs.map} +0 -0
  131. /package/dist/sdk/{host-6TBS44ER.mjs.map → host-THORKOEL.mjs.map} +0 -0
  132. /package/dist/sdk/{failure-condition-evaluator-63BECZYF.mjs.map → routing-2X6QF5IW.mjs.map} +0 -0
  133. /package/dist/sdk/{failure-condition-evaluator-DL6H57NX.mjs.map → schedule-tool-M6Y4YTXR.mjs.map} +0 -0
  134. /package/dist/sdk/{failure-condition-evaluator-HL33X7MH.mjs.map → schedule-tool-R6JJIDZ6.mjs.map} +0 -0
  135. /package/dist/sdk/{routing-GF2CF3JT.mjs.map → schedule-tool-handler-AOMZV3Q3.mjs.map} +0 -0
  136. /package/dist/sdk/{routing-PFFCQJV2.mjs.map → schedule-tool-handler-JYCVH377.mjs.map} +0 -0
  137. /package/dist/sdk/{routing-SFP4D6O3.mjs.map → trace-helpers-K47ZVJSU.mjs.map} +0 -0
  138. /package/dist/sdk/{schedule-tool-45NAALKS.mjs.map → workflow-check-provider-A3YH2UZJ.mjs.map} +0 -0
  139. /package/dist/sdk/{schedule-tool-DN2DSXIX.mjs.map → workflow-check-provider-EMFC7A5K.mjs.map} +0 -0
@@ -43,7 +43,7 @@ import {
43
43
  import {
44
44
  config_exports,
45
45
  init_config
46
- } from "./chunk-MM3TGVQ4.mjs";
46
+ } from "./chunk-BMXVAJ2M.mjs";
47
47
  import {
48
48
  ExecutionJournal,
49
49
  checkLoopBudget,
@@ -52,11 +52,11 @@ import {
52
52
  init_routing,
53
53
  init_snapshot_store,
54
54
  snapshot_store_exports
55
- } from "./chunk-WJIV7MKY.mjs";
55
+ } from "./chunk-ENSZDV3O.mjs";
56
56
  import {
57
57
  FailureConditionEvaluator,
58
58
  init_failure_condition_evaluator
59
- } from "./chunk-EFNNJIMY.mjs";
59
+ } from "./chunk-4ECMTCOM.mjs";
60
60
  import {
61
61
  addEvent,
62
62
  emitNdjsonFallback,
@@ -67,7 +67,7 @@ import {
67
67
  setSpanAttributes,
68
68
  trace_helpers_exports,
69
69
  withActiveSpan
70
- } from "./chunk-65SHRIQF.mjs";
70
+ } from "./chunk-6YGCACBF.mjs";
71
71
  import {
72
72
  generateHumanId,
73
73
  init_human_id
@@ -2891,6 +2891,162 @@ var init_state_capture = __esm({
2891
2891
  }
2892
2892
  });
2893
2893
 
2894
+ // src/utils/rate-limiter.ts
2895
+ function windowToMs(per) {
2896
+ switch (per) {
2897
+ case "second":
2898
+ return 1e3;
2899
+ case "minute":
2900
+ return 6e4;
2901
+ case "hour":
2902
+ return 36e5;
2903
+ }
2904
+ }
2905
+ function resolveRateLimitKey(config, fallbackUrl) {
2906
+ if (config.key) {
2907
+ return config.key;
2908
+ }
2909
+ if (fallbackUrl) {
2910
+ try {
2911
+ const url = new URL(fallbackUrl);
2912
+ return url.origin;
2913
+ } catch {
2914
+ return fallbackUrl;
2915
+ }
2916
+ }
2917
+ return "__default__";
2918
+ }
2919
+ async function rateLimitedFetch(url, options, rateLimitConfig) {
2920
+ if (!rateLimitConfig) {
2921
+ return fetch(url, options);
2922
+ }
2923
+ const key = resolveRateLimitKey(rateLimitConfig, url);
2924
+ const registry = RateLimiterRegistry.getInstance();
2925
+ const bucket = registry.getOrCreate(key, rateLimitConfig);
2926
+ const maxRetries = rateLimitConfig.max_retries ?? 3;
2927
+ const backoff = rateLimitConfig.backoff ?? "exponential";
2928
+ const initialDelay = rateLimitConfig.initial_delay_ms ?? 1e3;
2929
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
2930
+ await bucket.acquire();
2931
+ const response = await fetch(url, options);
2932
+ if (response.status !== 429) {
2933
+ return response;
2934
+ }
2935
+ if (attempt === maxRetries) {
2936
+ logger.warn(`[rate-limiter] Exhausted ${maxRetries} retries for ${url} (bucket: ${key})`);
2937
+ return response;
2938
+ }
2939
+ let delayMs;
2940
+ const retryAfter = response.headers.get("retry-after");
2941
+ if (retryAfter) {
2942
+ const parsed = Number(retryAfter);
2943
+ if (!isNaN(parsed)) {
2944
+ delayMs = parsed * 1e3;
2945
+ } else {
2946
+ const date = new Date(retryAfter).getTime();
2947
+ delayMs = Math.max(0, date - Date.now());
2948
+ }
2949
+ } else {
2950
+ delayMs = backoff === "exponential" ? initialDelay * Math.pow(2, attempt) : initialDelay;
2951
+ }
2952
+ logger.verbose(
2953
+ `[rate-limiter] 429 on ${url} (bucket: ${key}), retry ${attempt + 1}/${maxRetries} in ${delayMs}ms`
2954
+ );
2955
+ await new Promise((resolve9) => setTimeout(resolve9, delayMs));
2956
+ }
2957
+ return fetch(url, options);
2958
+ }
2959
+ var TokenBucket, REGISTRY_KEY, RateLimiterRegistry;
2960
+ var init_rate_limiter = __esm({
2961
+ "src/utils/rate-limiter.ts"() {
2962
+ "use strict";
2963
+ init_logger();
2964
+ TokenBucket = class {
2965
+ tokens;
2966
+ capacity;
2967
+ refillRate;
2968
+ // tokens per ms
2969
+ lastRefill;
2970
+ waitQueue = [];
2971
+ constructor(capacity, windowMs) {
2972
+ this.capacity = capacity;
2973
+ this.tokens = capacity;
2974
+ this.refillRate = capacity / windowMs;
2975
+ this.lastRefill = Date.now();
2976
+ }
2977
+ refill() {
2978
+ const now = Date.now();
2979
+ const elapsed = now - this.lastRefill;
2980
+ const newTokens = elapsed * this.refillRate;
2981
+ this.tokens = Math.min(this.capacity, this.tokens + newTokens);
2982
+ this.lastRefill = now;
2983
+ }
2984
+ /**
2985
+ * Non-blocking: try to consume one token.
2986
+ */
2987
+ tryConsume() {
2988
+ this.refill();
2989
+ if (this.tokens >= 1) {
2990
+ this.tokens -= 1;
2991
+ return true;
2992
+ }
2993
+ return false;
2994
+ }
2995
+ /**
2996
+ * Blocking: wait until a token is available, then consume it.
2997
+ * Requests are served FIFO.
2998
+ */
2999
+ async acquire() {
3000
+ if (this.tryConsume()) {
3001
+ return;
3002
+ }
3003
+ const waitMs = Math.ceil((1 - this.tokens) / this.refillRate);
3004
+ return new Promise((resolve9) => {
3005
+ const entry = { resolve: resolve9 };
3006
+ this.waitQueue.push(entry);
3007
+ setTimeout(() => {
3008
+ const idx = this.waitQueue.indexOf(entry);
3009
+ if (idx >= 0) {
3010
+ this.waitQueue.splice(idx, 1);
3011
+ }
3012
+ this.refill();
3013
+ if (this.tokens >= 1) {
3014
+ this.tokens -= 1;
3015
+ }
3016
+ resolve9();
3017
+ }, waitMs);
3018
+ });
3019
+ }
3020
+ };
3021
+ REGISTRY_KEY = /* @__PURE__ */ Symbol.for("visor.rateLimiterRegistry");
3022
+ RateLimiterRegistry = class _RateLimiterRegistry {
3023
+ buckets = /* @__PURE__ */ new Map();
3024
+ static getInstance() {
3025
+ const g = globalThis;
3026
+ if (!g[REGISTRY_KEY]) {
3027
+ g[REGISTRY_KEY] = new _RateLimiterRegistry();
3028
+ }
3029
+ return g[REGISTRY_KEY];
3030
+ }
3031
+ getOrCreate(key, config) {
3032
+ let bucket = this.buckets.get(key);
3033
+ if (!bucket) {
3034
+ const windowMs = windowToMs(config.per);
3035
+ bucket = new TokenBucket(config.requests, windowMs);
3036
+ this.buckets.set(key, bucket);
3037
+ logger.verbose(
3038
+ `[rate-limiter] Created bucket "${key}": ${config.requests} req/${config.per}`
3039
+ );
3040
+ }
3041
+ return bucket;
3042
+ }
3043
+ cleanup() {
3044
+ this.buckets.clear();
3045
+ }
3046
+ };
3047
+ }
3048
+ });
3049
+
2894
3050
  // src/providers/api-tool-executor.ts
2895
3051
  import fs2 from "fs/promises";
2896
3052
  import path3 from "path";
@@ -3126,7 +3282,8 @@ function getApiToolConfig(tool) {
3126
3282
  apiKey: tool.apiKey ?? tool.api_key,
3127
3283
  securitySchemeName: tool.securitySchemeName ?? tool.security_scheme_name,
3128
3284
  securityCredentials: tool.securityCredentials || tool.security_credentials || {},
3129
- requestTimeoutMs: tool.requestTimeoutMs ?? tool.request_timeout_ms ?? tool.timeout ?? 3e4
3285
+ requestTimeoutMs: tool.requestTimeoutMs ?? tool.request_timeout_ms ?? tool.timeout ?? 3e4,
3286
+ rateLimitConfig: tool.rate_limit
3130
3287
  };
3131
3288
  }
3132
3289
  function buildOutputSchema(operation) {
@@ -3558,12 +3715,16 @@ async function executeMappedApiTool(mappedTool, args) {
3558
3715
  const controller = new AbortController();
3559
3716
  const timeout = setTimeout(() => controller.abort(), apiToolConfig.requestTimeoutMs);
3560
3717
  try {
3561
- const response = await fetch(endpoint.toString(), {
3562
- method,
3563
- headers,
3564
- body: requestBodyValue === void 0 ? void 0 : headers["Content-Type"]?.includes("application/json") ? JSON.stringify(requestBodyValue) : String(requestBodyValue),
3565
- signal: controller.signal
3566
- });
3718
+ const response = await rateLimitedFetch(
3719
+ endpoint.toString(),
3720
+ {
3721
+ method,
3722
+ headers,
3723
+ body: requestBodyValue === void 0 ? void 0 : headers["Content-Type"]?.includes("application/json") ? JSON.stringify(requestBodyValue) : String(requestBodyValue),
3724
+ signal: controller.signal
3725
+ },
3726
+ apiToolConfig.rateLimitConfig
3727
+ );
3567
3728
  const raw = await response.text();
3568
3729
  let body = raw;
3569
3730
  const contentType = response.headers.get("content-type") || "";
@@ -3600,6 +3761,7 @@ var init_api_tool_executor = __esm({
3600
3761
  "src/providers/api-tool-executor.ts"() {
3601
3762
  "use strict";
3602
3763
  init_logger();
3764
+ init_rate_limiter();
3603
3765
  HTTP_METHODS = /* @__PURE__ */ new Set(["get", "put", "post", "delete", "options", "head", "patch", "trace"]);
3604
3766
  ApiToolRegistry = class {
3605
3767
  bundleCache = /* @__PURE__ */ new Map();
@@ -4042,7 +4204,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
4042
4204
  ...args,
4043
4205
  ...argsOverrides
4044
4206
  };
4045
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-OA33MESM.mjs");
4207
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-A3YH2UZJ.mjs");
4046
4208
  const provider = new WorkflowCheckProvider2();
4047
4209
  const checkConfig = {
4048
4210
  type: "workflow",
@@ -6919,7 +7081,7 @@ async function executeCheckWithForEachItems(checkId, forEachParent, forEachItems
6919
7081
  workflowInputs,
6920
7082
  ai: {
6921
7083
  ...checkConfig.ai || {},
6922
- timeout: checkConfig.ai?.timeout || 18e5,
7084
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
6923
7085
  debug: !!context2.debug
6924
7086
  }
6925
7087
  };
@@ -7006,7 +7168,7 @@ async function executeCheckWithForEachItems(checkId, forEachParent, forEachItems
7006
7168
  context2,
7007
7169
  prInfo,
7008
7170
  dependencyResults,
7009
- checkConfig.ai?.timeout || 18e5,
7171
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
7010
7172
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
7011
7173
  );
7012
7174
  try {
@@ -7422,7 +7584,7 @@ async function executeInvocation(item, context2, scope, prInfo, dependencyResult
7422
7584
  __outputHistory: outputHistory,
7423
7585
  ai: {
7424
7586
  ...stepConfig.ai || {},
7425
- timeout: stepConfig.ai?.timeout || 18e5,
7587
+ timeout: stepConfig.timeout || stepConfig.ai?.timeout || 18e5,
7426
7588
  debug: !!context2.debug
7427
7589
  }
7428
7590
  };
@@ -7946,7 +8108,7 @@ async function executeSingleCheck(checkId, context2, state, emitEvent, transitio
7946
8108
  workflowInputs,
7947
8109
  ai: {
7948
8110
  ...checkConfig.ai || {},
7949
- timeout: checkConfig.ai?.timeout || 18e5,
8111
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
7950
8112
  debug: !!context2.debug
7951
8113
  }
7952
8114
  };
@@ -8047,7 +8209,7 @@ async function executeSingleCheck(checkId, context2, state, emitEvent, transitio
8047
8209
  context2,
8048
8210
  prInfo,
8049
8211
  dependencyResults,
8050
- checkConfig.ai?.timeout || 18e5,
8212
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8051
8213
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
8052
8214
  );
8053
8215
  try {
@@ -8776,7 +8938,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8776
8938
  workflowInputs,
8777
8939
  ai: {
8778
8940
  ...checkConfig.ai || {},
8779
- timeout: checkConfig.ai?.timeout || 18e5,
8941
+ timeout: checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8780
8942
  debug: !!context2.debug
8781
8943
  }
8782
8944
  };
@@ -8811,7 +8973,10 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8811
8973
  `[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`
8812
8974
  );
8813
8975
  }
8814
- const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : { telegram: { event: event || {}, conversation: telegramConv }, webhook: payload };
8976
+ const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : {
8977
+ telegram: { event: event || {}, conversation: telegramConv },
8978
+ webhook: payload
8979
+ };
8815
8980
  providerConfig.eventContext = {
8816
8981
  ...providerConfig.eventContext,
8817
8982
  ...transportCtx,
@@ -8918,11 +9083,12 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8918
9083
  };
8919
9084
  {
8920
9085
  const assumeExpr = checkConfig?.assume;
8921
- if (assumeExpr) {
9086
+ if (assumeExpr !== void 0 && assumeExpr !== null) {
8922
9087
  let ok = true;
8923
9088
  try {
8924
9089
  const evaluator = new FailureConditionEvaluator();
8925
- const exprs = Array.isArray(assumeExpr) ? assumeExpr : [assumeExpr];
9090
+ const rawExprs = Array.isArray(assumeExpr) ? assumeExpr : [assumeExpr];
9091
+ const exprs = rawExprs.map((e) => typeof e === "string" ? e : String(e));
8926
9092
  const conversation = context2.executionContext?.conversation || providerConfig?.eventContext?.conversation;
8927
9093
  for (const ex of exprs) {
8928
9094
  const res = await evaluator.evaluateIfCondition(checkId, ex, {
@@ -8975,7 +9141,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8975
9141
  context2,
8976
9142
  prInfo,
8977
9143
  dependencyResults,
8978
- checkConfig.ai?.timeout || 18e5,
9144
+ checkConfig.timeout || checkConfig.ai?.timeout || 18e5,
8979
9145
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
8980
9146
  );
8981
9147
  try {
@@ -9363,7 +9529,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9363
9529
  }
9364
9530
  }
9365
9531
  try {
9366
- const { evaluateTransitions } = await import("./routing-GF2CF3JT.mjs");
9532
+ const { evaluateTransitions } = await import("./routing-2X6QF5IW.mjs");
9367
9533
  const transTarget = await evaluateTransitions(
9368
9534
  onFinish.transitions,
9369
9535
  forEachParent,
@@ -9423,7 +9589,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9423
9589
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9424
9590
  );
9425
9591
  }
9426
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-GF2CF3JT.mjs");
9592
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-2X6QF5IW.mjs");
9427
9593
  if (context2.debug) {
9428
9594
  logger.info(
9429
9595
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -9904,7 +10070,7 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9904
10070
  workflowInputs,
9905
10071
  ai: {
9906
10072
  ...checkConfig2.ai || {},
9907
- timeout: checkConfig2.ai?.timeout || 18e5,
10073
+ timeout: checkConfig2.timeout || checkConfig2.ai?.timeout || 18e5,
9908
10074
  debug: !!context2.debug
9909
10075
  }
9910
10076
  };
@@ -9935,7 +10101,9 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9935
10101
  const event = payload?.event;
9936
10102
  const messageCount = Array.isArray(conv?.messages) ? conv.messages.length : 0;
9937
10103
  if (context2.debug) {
9938
- logger.info(`[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`);
10104
+ logger.info(
10105
+ `[LevelDispatch] Conversation extracted (${conv?.transport || "unknown"}): ${messageCount} messages`
10106
+ );
9939
10107
  }
9940
10108
  const transportCtx = slackConv ? { slack: { event: event || {}, conversation: slackConv } } : { telegram: { event: event || {}, conversation: telegramConv }, webhook: payload };
9941
10109
  providerConfig.eventContext = {
@@ -9988,11 +10156,12 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9988
10156
  };
9989
10157
  {
9990
10158
  const assumeExpr = checkConfig2?.assume;
9991
- if (assumeExpr) {
10159
+ if (assumeExpr !== void 0 && assumeExpr !== null) {
9992
10160
  let ok = true;
9993
10161
  try {
9994
10162
  const evaluator = new FailureConditionEvaluator();
9995
- const exprs = Array.isArray(assumeExpr) ? assumeExpr : [assumeExpr];
10163
+ const rawExprs = Array.isArray(assumeExpr) ? assumeExpr : [assumeExpr];
10164
+ const exprs = rawExprs.map((e) => typeof e === "string" ? e : String(e));
9996
10165
  const conversation = context2.executionContext?.conversation || providerConfig?.eventContext?.conversation;
9997
10166
  for (const ex of exprs) {
9998
10167
  const res = await evaluator.evaluateIfCondition(checkId, ex, {
@@ -10073,7 +10242,7 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
10073
10242
  context2,
10074
10243
  prInfo,
10075
10244
  dependencyResults,
10076
- checkConfig2.ai?.timeout || 18e5,
10245
+ checkConfig2.timeout || checkConfig2.ai?.timeout || 18e5,
10077
10246
  () => provider.execute(prInfo, providerConfig, dependencyResults, executionContext)
10078
10247
  );
10079
10248
  try {
@@ -13172,7 +13341,8 @@ function buildEngineContextForRun(workingDirectory, config, prInfo, debug, maxPa
13172
13341
  sharedConcurrencyLimiter = {
13173
13342
  async acquire(parentSessionId, _dbg, queueTimeout) {
13174
13343
  const sid = parentSessionId || sessionId;
13175
- return fairLimiter.acquire(sid, _dbg, queueTimeout);
13344
+ const effectiveQueueTimeout = queueTimeout ?? 0;
13345
+ return fairLimiter.acquire(sid, _dbg, effectiveQueueTimeout);
13176
13346
  },
13177
13347
  release(parentSessionId, _dbg) {
13178
13348
  const sid = parentSessionId || sessionId;
@@ -13405,7 +13575,7 @@ var init_state_machine_execution_engine = __esm({
13405
13575
  try {
13406
13576
  const map = options?.webhookContext?.webhookData;
13407
13577
  if (map) {
13408
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-HW4QPPSA.mjs");
13578
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZX76MY2L.mjs");
13409
13579
  const reg = CheckProviderRegistry2.getInstance();
13410
13580
  const p = reg.getProvider("http_input");
13411
13581
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13518,7 +13688,7 @@ var init_state_machine_execution_engine = __esm({
13518
13688
  logger.info("[StateMachine] Using state machine engine");
13519
13689
  }
13520
13690
  if (!config) {
13521
- const { ConfigManager } = await import("./config-OOUMTCEA.mjs");
13691
+ const { ConfigManager } = await import("./config-DFOF7LP4.mjs");
13522
13692
  const configManager = new ConfigManager();
13523
13693
  config = await configManager.getDefaultConfig();
13524
13694
  logger.debug("[StateMachine] Using default configuration (no config provided)");
@@ -13528,7 +13698,7 @@ var init_state_machine_execution_engine = __esm({
13528
13698
  tag_filter: tagFilter
13529
13699
  } : config;
13530
13700
  try {
13531
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-HW4QPPSA.mjs");
13701
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZX76MY2L.mjs");
13532
13702
  const registry = CheckProviderRegistry2.getInstance();
13533
13703
  registry.setCustomTools(configWithTagFilter.tools || {});
13534
13704
  } catch (error) {
@@ -13592,7 +13762,7 @@ var init_state_machine_execution_engine = __esm({
13592
13762
  try {
13593
13763
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13594
13764
  if (webhookData instanceof Map) {
13595
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-6MPP5DXK.mjs");
13765
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-AOMZV3Q3.mjs");
13596
13766
  const slackCtx = extractSlackContext2(webhookData);
13597
13767
  if (slackCtx) {
13598
13768
  const payload = Array.from(webhookData.values())[0];
@@ -13621,7 +13791,7 @@ var init_state_machine_execution_engine = __esm({
13621
13791
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13622
13792
  try {
13623
13793
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13624
- const { FrontendsHost } = await import("./host-6TBS44ER.mjs");
13794
+ const { FrontendsHost } = await import("./host-I2TBBKD5.mjs");
13625
13795
  const bus = new EventBus();
13626
13796
  context2.eventBus = bus;
13627
13797
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13973,9 +14143,9 @@ var init_state_machine_execution_engine = __esm({
13973
14143
  * @returns Array of failure condition evaluation results
13974
14144
  */
13975
14145
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13976
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-DL6H57NX.mjs");
14146
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-P3MS5DRL.mjs");
13977
14147
  const evaluator = new FailureConditionEvaluator2();
13978
- const { addEvent: addEvent3 } = await import("./trace-helpers-FKM2MEDW.mjs");
14148
+ const { addEvent: addEvent3 } = await import("./trace-helpers-K47ZVJSU.mjs");
13979
14149
  const { addFailIfTriggered } = await import("./metrics-JTOG2HNO.mjs");
13980
14150
  const checkConfig = config.checks?.[checkName];
13981
14151
  if (!checkConfig) {
@@ -16141,6 +16311,7 @@ var init_mcp_custom_sse_server = __esm({
16141
16311
  init_schedule_tool();
16142
16312
  init_schedule_tool_handler();
16143
16313
  init_env_resolver();
16314
+ init_rate_limiter();
16144
16315
  CustomToolsSSEServer = class _CustomToolsSSEServer {
16145
16316
  server = null;
16146
16317
  port = 0;
@@ -16897,7 +17068,8 @@ var init_mcp_custom_sse_server = __esm({
16897
17068
  resolvedHeaders["Content-Type"] = "application/json";
16898
17069
  }
16899
17070
  }
16900
- const response = await fetch(url, requestOptions);
17071
+ const rateLimitConfig = tool.rate_limit;
17072
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
16901
17073
  clearTimeout(timeoutId);
16902
17074
  if (!response.ok) {
16903
17075
  let errorBody = "";
@@ -19542,6 +19714,7 @@ var init_http_client_provider = __esm({
19542
19714
  init_template_context();
19543
19715
  init_oauth2_token_cache();
19544
19716
  init_logger();
19717
+ init_rate_limiter();
19545
19718
  HttpClientProvider = class extends CheckProvider {
19546
19719
  liquid;
19547
19720
  sandbox;
@@ -19696,6 +19869,7 @@ var init_http_client_provider = __esm({
19696
19869
  `[http_client] Body: ${requestBody.substring(0, 500)}${requestBody.length > 500 ? "..." : ""}`
19697
19870
  );
19698
19871
  }
19872
+ const rateLimitConfig = config.rate_limit;
19699
19873
  if (resolvedOutputFile) {
19700
19874
  const fileResult = await this.downloadToFile(
19701
19875
  renderedUrl,
@@ -19703,11 +19877,19 @@ var init_http_client_provider = __esm({
19703
19877
  resolvedHeaders,
19704
19878
  requestBody,
19705
19879
  timeout,
19706
- resolvedOutputFile
19880
+ resolvedOutputFile,
19881
+ rateLimitConfig
19707
19882
  );
19708
19883
  return fileResult;
19709
19884
  }
19710
- const data = await this.fetchData(renderedUrl, method, resolvedHeaders, requestBody, timeout);
19885
+ const data = await this.fetchData(
19886
+ renderedUrl,
19887
+ method,
19888
+ resolvedHeaders,
19889
+ requestBody,
19890
+ timeout,
19891
+ rateLimitConfig
19892
+ );
19711
19893
  let processedData = data;
19712
19894
  if (transform) {
19713
19895
  try {
@@ -19790,7 +19972,7 @@ var init_http_client_provider = __esm({
19790
19972
  };
19791
19973
  }
19792
19974
  }
19793
- async fetchData(url, method, headers, body, timeout = 3e4) {
19975
+ async fetchData(url, method, headers, body, timeout = 3e4, rateLimitConfig) {
19794
19976
  if (typeof fetch === "undefined") {
19795
19977
  throw new Error("HTTP client provider requires Node.js 18+ or node-fetch package");
19796
19978
  }
@@ -19813,7 +19995,7 @@ var init_http_client_provider = __esm({
19813
19995
  };
19814
19996
  }
19815
19997
  }
19816
- const response = await fetch(url, requestOptions);
19998
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
19817
19999
  clearTimeout(timeoutId);
19818
20000
  logger.verbose(`[http_client] Response: ${response.status} ${response.statusText}`);
19819
20001
  if (!response.ok) {
@@ -19845,7 +20027,7 @@ var init_http_client_provider = __esm({
19845
20027
  throw error;
19846
20028
  }
19847
20029
  }
19848
- async downloadToFile(url, method, headers, body, timeout, outputFile) {
20030
+ async downloadToFile(url, method, headers, body, timeout, outputFile, rateLimitConfig) {
19849
20031
  if (typeof fetch === "undefined") {
19850
20032
  throw new Error("HTTP client provider requires Node.js 18+ or node-fetch package");
19851
20033
  }
@@ -19866,7 +20048,7 @@ var init_http_client_provider = __esm({
19866
20048
  };
19867
20049
  }
19868
20050
  }
19869
- const response = await fetch(url, requestOptions);
20051
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
19870
20052
  clearTimeout(timeoutId);
19871
20053
  if (!response.ok) {
19872
20054
  return {
@@ -41614,8 +41796,8 @@ function buildBuiltinGlobals(opts) {
41614
41796
  const asyncFunctionNames = /* @__PURE__ */ new Set();
41615
41797
  const scheduleFn = async (args = {}) => {
41616
41798
  try {
41617
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-45NAALKS.mjs");
41618
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-6MPP5DXK.mjs");
41799
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-R6JJIDZ6.mjs");
41800
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-AOMZV3Q3.mjs");
41619
41801
  const parentCtx = opts.sessionInfo?._parentContext;
41620
41802
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
41621
41803
  const visorCfg = parentCtx?.config;
@@ -44822,6 +45004,14 @@ var init_workflow_check_provider = __esm({
44822
45004
  inputs,
44823
45005
  config.checkName || workflow.id
44824
45006
  );
45007
+ const parentTimeout = config.timeout || config.ai?.timeout;
45008
+ if (parentTimeout && workflowConfig.checks) {
45009
+ for (const stepCfg of Object.values(workflowConfig.checks)) {
45010
+ if (!stepCfg.timeout && !stepCfg.ai?.timeout) {
45011
+ stepCfg.timeout = parentTimeout;
45012
+ }
45013
+ }
45014
+ }
44825
45015
  const parentMemoryCfg = parentContext?.memory && parentContext.memory.getConfig && parentContext.memory.getConfig() || parentContext?.config?.memory;
44826
45016
  const childJournal = new ExecutionJournal2();
44827
45017
  const childMemory = MemoryStore2.createIsolated(parentMemoryCfg);
@@ -45231,4 +45421,4 @@ undici/lib/fetch/body.js:
45231
45421
  undici/lib/websocket/frame.js:
45232
45422
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
45233
45423
  */
45234
- //# sourceMappingURL=chunk-Y6PVSFCS.mjs.map
45424
+ //# sourceMappingURL=chunk-B7XHSG3L.mjs.map