@probelabs/visor 0.1.177-ee → 0.1.178

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 (123) 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 +407 -1910
  15. package/dist/output/traces/run-2026-03-11T06-33-05-398Z.ndjson +138 -0
  16. package/dist/output/traces/run-2026-03-11T06-33-47-884Z.ndjson +2296 -0
  17. package/dist/providers/api-tool-executor.d.ts +2 -0
  18. package/dist/providers/api-tool-executor.d.ts.map +1 -1
  19. package/dist/providers/http-client-provider.d.ts.map +1 -1
  20. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  21. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  22. package/dist/sdk/{a2a-frontend-BPWLYLCG.mjs → a2a-frontend-U3PTNCLR.mjs} +2 -2
  23. package/dist/sdk/{a2a-frontend-FUJRKHJB.mjs → a2a-frontend-WYBMBBYG.mjs} +2 -2
  24. package/dist/sdk/{check-provider-registry-G64PWDCZ.mjs → check-provider-registry-3DZOXYIA.mjs} +6 -6
  25. package/dist/sdk/{check-provider-registry-HW4QPPSA.mjs → check-provider-registry-T5J3H2N7.mjs} +6 -6
  26. package/dist/sdk/check-provider-registry-ZX76MY2L.mjs +30 -0
  27. package/dist/sdk/{chunk-OPI632LK.mjs → chunk-4ECMTCOM.mjs} +2 -2
  28. package/dist/sdk/{chunk-65SHRIQF.mjs → chunk-6YGCACBF.mjs} +2 -2
  29. package/dist/sdk/{chunk-65SHRIQF.mjs.map → chunk-6YGCACBF.mjs.map} +1 -1
  30. package/dist/sdk/{chunk-IYXOLUDJ.mjs → chunk-AK64Y6Y2.mjs} +222 -37
  31. package/dist/sdk/chunk-AK64Y6Y2.mjs.map +1 -0
  32. package/dist/sdk/chunk-ANEKFNAS.mjs +45424 -0
  33. package/dist/sdk/chunk-ANEKFNAS.mjs.map +1 -0
  34. package/dist/sdk/{chunk-Y6PVSFCS.mjs → chunk-B7XHSG3L.mjs} +237 -47
  35. package/dist/sdk/chunk-B7XHSG3L.mjs.map +1 -0
  36. package/dist/sdk/{chunk-MM3TGVQ4.mjs → chunk-BMXVAJ2M.mjs} +52 -7
  37. package/dist/sdk/chunk-BMXVAJ2M.mjs.map +1 -0
  38. package/dist/sdk/{chunk-EFNNJIMY.mjs → chunk-CDRKH5HH.mjs} +2 -2
  39. package/dist/sdk/{chunk-OHOBWVPP.mjs → chunk-ENSZDV3O.mjs} +3 -3
  40. package/dist/sdk/{chunk-GVTWESYN.mjs → chunk-KG6PM4OL.mjs} +3 -3
  41. package/dist/sdk/chunk-KG6PM4OL.mjs.map +1 -0
  42. package/dist/sdk/{chunk-WJIV7MKY.mjs → chunk-WZS4ARZB.mjs} +3 -3
  43. package/dist/sdk/{config-OOUMTCEA.mjs → config-DFOF7LP4.mjs} +2 -2
  44. package/dist/sdk/{failure-condition-evaluator-HL33X7MH.mjs → failure-condition-evaluator-MMPKQGUA.mjs} +3 -3
  45. package/dist/sdk/{failure-condition-evaluator-DL6H57NX.mjs → failure-condition-evaluator-P3MS5DRL.mjs} +3 -3
  46. package/dist/sdk/{github-frontend-F2YCPK6H.mjs → github-frontend-7RLEBJWG.mjs} +11 -3
  47. package/dist/sdk/github-frontend-7RLEBJWG.mjs.map +1 -0
  48. package/dist/sdk/{github-frontend-U2U42CKV.mjs → github-frontend-QTKOYB56.mjs} +11 -3
  49. package/dist/sdk/github-frontend-QTKOYB56.mjs.map +1 -0
  50. package/dist/sdk/{host-HFOJQIOF.mjs → host-I2TBBKD5.mjs} +3 -3
  51. package/dist/sdk/{host-6TBS44ER.mjs → host-SE3MQHWG.mjs} +4 -4
  52. package/dist/sdk/{routing-GF2CF3JT.mjs → routing-2X6QF5IW.mjs} +4 -4
  53. package/dist/sdk/{routing-SFP4D6O3.mjs → routing-QHXBQS6X.mjs} +4 -4
  54. package/dist/sdk/{schedule-tool-45NAALKS.mjs → schedule-tool-MKT5FZ6J.mjs} +6 -6
  55. package/dist/sdk/{schedule-tool-7O7SWSJ4.mjs → schedule-tool-R6JJIDZ6.mjs} +6 -6
  56. package/dist/sdk/schedule-tool-W4SQ334O.mjs +36 -0
  57. package/dist/sdk/{schedule-tool-handler-6MPP5DXK.mjs → schedule-tool-handler-AOMZV3Q3.mjs} +6 -6
  58. package/dist/sdk/{schedule-tool-handler-KYDXJ2ZL.mjs → schedule-tool-handler-MPJFLH4J.mjs} +6 -6
  59. package/dist/sdk/schedule-tool-handler-WY7WCFE5.mjs +40 -0
  60. package/dist/sdk/sdk.d.mts +21 -0
  61. package/dist/sdk/sdk.d.ts +21 -0
  62. package/dist/sdk/sdk.js +545 -1681
  63. package/dist/sdk/sdk.js.map +1 -1
  64. package/dist/sdk/sdk.mjs +5 -5
  65. package/dist/sdk/{trace-helpers-FKM2MEDW.mjs → trace-helpers-4ADQ4GB3.mjs} +2 -2
  66. package/dist/sdk/{trace-helpers-L3EOYW5P.mjs → trace-helpers-K47ZVJSU.mjs} +2 -2
  67. package/dist/sdk/trace-helpers-K47ZVJSU.mjs.map +1 -0
  68. package/dist/sdk/{workflow-check-provider-JIXZJNV5.mjs → workflow-check-provider-A3YH2UZJ.mjs} +6 -6
  69. package/dist/sdk/workflow-check-provider-A3YH2UZJ.mjs.map +1 -0
  70. package/dist/sdk/{workflow-check-provider-OA33MESM.mjs → workflow-check-provider-WHZP7BDF.mjs} +6 -6
  71. package/dist/sdk/workflow-check-provider-WHZP7BDF.mjs.map +1 -0
  72. package/dist/sdk/workflow-check-provider-WZN3B2S2.mjs +30 -0
  73. package/dist/sdk/workflow-check-provider-WZN3B2S2.mjs.map +1 -0
  74. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
  75. package/dist/test-runner/conversation-sugar.d.ts +3 -0
  76. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  77. package/dist/test-runner/validator.d.ts.map +1 -1
  78. package/dist/traces/run-2026-03-11T06-33-05-398Z.ndjson +138 -0
  79. package/dist/traces/run-2026-03-11T06-33-47-884Z.ndjson +2296 -0
  80. package/dist/types/config.d.ts +21 -0
  81. package/dist/types/config.d.ts.map +1 -1
  82. package/dist/utils/rate-limiter.d.ts +61 -0
  83. package/dist/utils/rate-limiter.d.ts.map +1 -0
  84. package/package.json +2 -2
  85. package/dist/sdk/chunk-GVTWESYN.mjs.map +0 -1
  86. package/dist/sdk/chunk-IYXOLUDJ.mjs.map +0 -1
  87. package/dist/sdk/chunk-MM3TGVQ4.mjs.map +0 -1
  88. package/dist/sdk/chunk-Y6PVSFCS.mjs.map +0 -1
  89. package/dist/sdk/github-frontend-F2YCPK6H.mjs.map +0 -1
  90. package/dist/sdk/github-frontend-U2U42CKV.mjs.map +0 -1
  91. package/dist/sdk/knex-store-QCEW4I4R.mjs +0 -527
  92. package/dist/sdk/knex-store-QCEW4I4R.mjs.map +0 -1
  93. package/dist/sdk/loader-Q7K76ZIY.mjs +0 -89
  94. package/dist/sdk/loader-Q7K76ZIY.mjs.map +0 -1
  95. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs +0 -655
  96. package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs.map +0 -1
  97. package/dist/sdk/slack-frontend-6SXPTQDI.mjs +0 -895
  98. package/dist/sdk/slack-frontend-6SXPTQDI.mjs.map +0 -1
  99. package/dist/sdk/validator-XTZJZZJH.mjs +0 -134
  100. package/dist/sdk/validator-XTZJZZJH.mjs.map +0 -1
  101. /package/dist/sdk/{a2a-frontend-BPWLYLCG.mjs.map → a2a-frontend-U3PTNCLR.mjs.map} +0 -0
  102. /package/dist/sdk/{a2a-frontend-FUJRKHJB.mjs.map → a2a-frontend-WYBMBBYG.mjs.map} +0 -0
  103. /package/dist/sdk/{check-provider-registry-G64PWDCZ.mjs.map → check-provider-registry-3DZOXYIA.mjs.map} +0 -0
  104. /package/dist/sdk/{check-provider-registry-HW4QPPSA.mjs.map → check-provider-registry-T5J3H2N7.mjs.map} +0 -0
  105. /package/dist/sdk/{config-OOUMTCEA.mjs.map → check-provider-registry-ZX76MY2L.mjs.map} +0 -0
  106. /package/dist/sdk/{chunk-EFNNJIMY.mjs.map → chunk-4ECMTCOM.mjs.map} +0 -0
  107. /package/dist/sdk/{chunk-OPI632LK.mjs.map → chunk-CDRKH5HH.mjs.map} +0 -0
  108. /package/dist/sdk/{chunk-OHOBWVPP.mjs.map → chunk-ENSZDV3O.mjs.map} +0 -0
  109. /package/dist/sdk/{chunk-WJIV7MKY.mjs.map → chunk-WZS4ARZB.mjs.map} +0 -0
  110. /package/dist/sdk/{failure-condition-evaluator-DL6H57NX.mjs.map → config-DFOF7LP4.mjs.map} +0 -0
  111. /package/dist/sdk/{failure-condition-evaluator-HL33X7MH.mjs.map → failure-condition-evaluator-MMPKQGUA.mjs.map} +0 -0
  112. /package/dist/sdk/{routing-GF2CF3JT.mjs.map → failure-condition-evaluator-P3MS5DRL.mjs.map} +0 -0
  113. /package/dist/sdk/{host-6TBS44ER.mjs.map → host-I2TBBKD5.mjs.map} +0 -0
  114. /package/dist/sdk/{host-HFOJQIOF.mjs.map → host-SE3MQHWG.mjs.map} +0 -0
  115. /package/dist/sdk/{routing-SFP4D6O3.mjs.map → routing-2X6QF5IW.mjs.map} +0 -0
  116. /package/dist/sdk/{schedule-tool-45NAALKS.mjs.map → routing-QHXBQS6X.mjs.map} +0 -0
  117. /package/dist/sdk/{schedule-tool-7O7SWSJ4.mjs.map → schedule-tool-MKT5FZ6J.mjs.map} +0 -0
  118. /package/dist/sdk/{schedule-tool-handler-6MPP5DXK.mjs.map → schedule-tool-R6JJIDZ6.mjs.map} +0 -0
  119. /package/dist/sdk/{schedule-tool-handler-KYDXJ2ZL.mjs.map → schedule-tool-W4SQ334O.mjs.map} +0 -0
  120. /package/dist/sdk/{trace-helpers-FKM2MEDW.mjs.map → schedule-tool-handler-AOMZV3Q3.mjs.map} +0 -0
  121. /package/dist/sdk/{trace-helpers-L3EOYW5P.mjs.map → schedule-tool-handler-MPJFLH4J.mjs.map} +0 -0
  122. /package/dist/sdk/{workflow-check-provider-JIXZJNV5.mjs.map → schedule-tool-handler-WY7WCFE5.mjs.map} +0 -0
  123. /package/dist/sdk/{workflow-check-provider-OA33MESM.mjs.map → trace-helpers-4ADQ4GB3.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-OHOBWVPP.mjs";
55
+ } from "./chunk-WZS4ARZB.mjs";
56
56
  import {
57
57
  FailureConditionEvaluator,
58
58
  init_failure_condition_evaluator
59
- } from "./chunk-OPI632LK.mjs";
59
+ } from "./chunk-CDRKH5HH.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-GVTWESYN.mjs";
70
+ } from "./chunk-KG6PM4OL.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 = 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-JIXZJNV5.mjs");
4207
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-WHZP7BDF.mjs");
4046
4208
  const provider = new WorkflowCheckProvider2();
4047
4209
  const checkConfig = {
4048
4210
  type: "workflow",
@@ -8921,11 +9083,12 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
8921
9083
  };
8922
9084
  {
8923
9085
  const assumeExpr = checkConfig?.assume;
8924
- if (assumeExpr) {
9086
+ if (assumeExpr !== void 0 && assumeExpr !== null) {
8925
9087
  let ok = true;
8926
9088
  try {
8927
9089
  const evaluator = new FailureConditionEvaluator();
8928
- 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));
8929
9092
  const conversation = context2.executionContext?.conversation || providerConfig?.eventContext?.conversation;
8930
9093
  for (const ex of exprs) {
8931
9094
  const res = await evaluator.evaluateIfCondition(checkId, ex, {
@@ -9366,7 +9529,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9366
9529
  }
9367
9530
  }
9368
9531
  try {
9369
- const { evaluateTransitions } = await import("./routing-SFP4D6O3.mjs");
9532
+ const { evaluateTransitions } = await import("./routing-QHXBQS6X.mjs");
9370
9533
  const transTarget = await evaluateTransitions(
9371
9534
  onFinish.transitions,
9372
9535
  forEachParent,
@@ -9426,7 +9589,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9426
9589
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9427
9590
  );
9428
9591
  }
9429
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-SFP4D6O3.mjs");
9592
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-QHXBQS6X.mjs");
9430
9593
  if (context2.debug) {
9431
9594
  logger.info(
9432
9595
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -9993,11 +10156,12 @@ async function executeSingleCheck2(checkId, context2, state, emitEvent, transiti
9993
10156
  };
9994
10157
  {
9995
10158
  const assumeExpr = checkConfig2?.assume;
9996
- if (assumeExpr) {
10159
+ if (assumeExpr !== void 0 && assumeExpr !== null) {
9997
10160
  let ok = true;
9998
10161
  try {
9999
10162
  const evaluator = new FailureConditionEvaluator();
10000
- 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));
10001
10165
  const conversation = context2.executionContext?.conversation || providerConfig?.eventContext?.conversation;
10002
10166
  for (const ex of exprs) {
10003
10167
  const res = await evaluator.evaluateIfCondition(checkId, ex, {
@@ -13177,7 +13341,8 @@ function buildEngineContextForRun(workingDirectory, config, prInfo, debug, maxPa
13177
13341
  sharedConcurrencyLimiter = {
13178
13342
  async acquire(parentSessionId, _dbg, queueTimeout) {
13179
13343
  const sid = parentSessionId || sessionId;
13180
- return fairLimiter.acquire(sid, _dbg, queueTimeout);
13344
+ const effectiveQueueTimeout = queueTimeout ?? 0;
13345
+ return fairLimiter.acquire(sid, _dbg, effectiveQueueTimeout);
13181
13346
  },
13182
13347
  release(parentSessionId, _dbg) {
13183
13348
  const sid = parentSessionId || sessionId;
@@ -13410,7 +13575,7 @@ var init_state_machine_execution_engine = __esm({
13410
13575
  try {
13411
13576
  const map = options?.webhookContext?.webhookData;
13412
13577
  if (map) {
13413
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-G64PWDCZ.mjs");
13578
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-3DZOXYIA.mjs");
13414
13579
  const reg = CheckProviderRegistry2.getInstance();
13415
13580
  const p = reg.getProvider("http_input");
13416
13581
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13523,7 +13688,7 @@ var init_state_machine_execution_engine = __esm({
13523
13688
  logger.info("[StateMachine] Using state machine engine");
13524
13689
  }
13525
13690
  if (!config) {
13526
- const { ConfigManager } = await import("./config-OOUMTCEA.mjs");
13691
+ const { ConfigManager } = await import("./config-DFOF7LP4.mjs");
13527
13692
  const configManager = new ConfigManager();
13528
13693
  config = await configManager.getDefaultConfig();
13529
13694
  logger.debug("[StateMachine] Using default configuration (no config provided)");
@@ -13533,7 +13698,7 @@ var init_state_machine_execution_engine = __esm({
13533
13698
  tag_filter: tagFilter
13534
13699
  } : config;
13535
13700
  try {
13536
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-G64PWDCZ.mjs");
13701
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-3DZOXYIA.mjs");
13537
13702
  const registry = CheckProviderRegistry2.getInstance();
13538
13703
  registry.setCustomTools(configWithTagFilter.tools || {});
13539
13704
  } catch (error) {
@@ -13574,7 +13739,7 @@ var init_state_machine_execution_engine = __esm({
13574
13739
  logger.debug(
13575
13740
  `[PolicyEngine] Loading enterprise policy engine (engine=${configWithTagFilter.policy.engine})`
13576
13741
  );
13577
- const { loadEnterprisePolicyEngine } = await import("./loader-Q7K76ZIY.mjs");
13742
+ const { loadEnterprisePolicyEngine } = await import("./enterprise/loader");
13578
13743
  context2.policyEngine = await loadEnterprisePolicyEngine(configWithTagFilter.policy);
13579
13744
  logger.debug(
13580
13745
  `[PolicyEngine] Initialized: ${context2.policyEngine?.constructor?.name || "unknown"}`
@@ -13597,7 +13762,7 @@ var init_state_machine_execution_engine = __esm({
13597
13762
  try {
13598
13763
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13599
13764
  if (webhookData instanceof Map) {
13600
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-KYDXJ2ZL.mjs");
13765
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-MPJFLH4J.mjs");
13601
13766
  const slackCtx = extractSlackContext2(webhookData);
13602
13767
  if (slackCtx) {
13603
13768
  const payload = Array.from(webhookData.values())[0];
@@ -13626,7 +13791,7 @@ var init_state_machine_execution_engine = __esm({
13626
13791
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13627
13792
  try {
13628
13793
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13629
- const { FrontendsHost } = await import("./host-HFOJQIOF.mjs");
13794
+ const { FrontendsHost } = await import("./host-SE3MQHWG.mjs");
13630
13795
  const bus = new EventBus();
13631
13796
  context2.eventBus = bus;
13632
13797
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13978,9 +14143,9 @@ var init_state_machine_execution_engine = __esm({
13978
14143
  * @returns Array of failure condition evaluation results
13979
14144
  */
13980
14145
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13981
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-HL33X7MH.mjs");
14146
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-MMPKQGUA.mjs");
13982
14147
  const evaluator = new FailureConditionEvaluator2();
13983
- const { addEvent: addEvent3 } = await import("./trace-helpers-L3EOYW5P.mjs");
14148
+ const { addEvent: addEvent3 } = await import("./trace-helpers-4ADQ4GB3.mjs");
13984
14149
  const { addFailIfTriggered } = await import("./metrics-JTOG2HNO.mjs");
13985
14150
  const checkConfig = config.checks?.[checkName];
13986
14151
  if (!checkConfig) {
@@ -16146,6 +16311,7 @@ var init_mcp_custom_sse_server = __esm({
16146
16311
  init_schedule_tool();
16147
16312
  init_schedule_tool_handler();
16148
16313
  init_env_resolver();
16314
+ init_rate_limiter();
16149
16315
  CustomToolsSSEServer = class _CustomToolsSSEServer {
16150
16316
  server = null;
16151
16317
  port = 0;
@@ -16902,7 +17068,8 @@ var init_mcp_custom_sse_server = __esm({
16902
17068
  resolvedHeaders["Content-Type"] = "application/json";
16903
17069
  }
16904
17070
  }
16905
- const response = await fetch(url, requestOptions);
17071
+ const rateLimitConfig = tool.rate_limit;
17072
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
16906
17073
  clearTimeout(timeoutId);
16907
17074
  if (!response.ok) {
16908
17075
  let errorBody = "";
@@ -19547,6 +19714,7 @@ var init_http_client_provider = __esm({
19547
19714
  init_template_context();
19548
19715
  init_oauth2_token_cache();
19549
19716
  init_logger();
19717
+ init_rate_limiter();
19550
19718
  HttpClientProvider = class extends CheckProvider {
19551
19719
  liquid;
19552
19720
  sandbox;
@@ -19701,6 +19869,7 @@ var init_http_client_provider = __esm({
19701
19869
  `[http_client] Body: ${requestBody.substring(0, 500)}${requestBody.length > 500 ? "..." : ""}`
19702
19870
  );
19703
19871
  }
19872
+ const rateLimitConfig = config.rate_limit;
19704
19873
  if (resolvedOutputFile) {
19705
19874
  const fileResult = await this.downloadToFile(
19706
19875
  renderedUrl,
@@ -19708,11 +19877,19 @@ var init_http_client_provider = __esm({
19708
19877
  resolvedHeaders,
19709
19878
  requestBody,
19710
19879
  timeout,
19711
- resolvedOutputFile
19880
+ resolvedOutputFile,
19881
+ rateLimitConfig
19712
19882
  );
19713
19883
  return fileResult;
19714
19884
  }
19715
- 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
+ );
19716
19893
  let processedData = data;
19717
19894
  if (transform) {
19718
19895
  try {
@@ -19795,7 +19972,7 @@ var init_http_client_provider = __esm({
19795
19972
  };
19796
19973
  }
19797
19974
  }
19798
- async fetchData(url, method, headers, body, timeout = 3e4) {
19975
+ async fetchData(url, method, headers, body, timeout = 3e4, rateLimitConfig) {
19799
19976
  if (typeof fetch === "undefined") {
19800
19977
  throw new Error("HTTP client provider requires Node.js 18+ or node-fetch package");
19801
19978
  }
@@ -19818,7 +19995,7 @@ var init_http_client_provider = __esm({
19818
19995
  };
19819
19996
  }
19820
19997
  }
19821
- const response = await fetch(url, requestOptions);
19998
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
19822
19999
  clearTimeout(timeoutId);
19823
20000
  logger.verbose(`[http_client] Response: ${response.status} ${response.statusText}`);
19824
20001
  if (!response.ok) {
@@ -19850,7 +20027,7 @@ var init_http_client_provider = __esm({
19850
20027
  throw error;
19851
20028
  }
19852
20029
  }
19853
- async downloadToFile(url, method, headers, body, timeout, outputFile) {
20030
+ async downloadToFile(url, method, headers, body, timeout, outputFile, rateLimitConfig) {
19854
20031
  if (typeof fetch === "undefined") {
19855
20032
  throw new Error("HTTP client provider requires Node.js 18+ or node-fetch package");
19856
20033
  }
@@ -19871,7 +20048,7 @@ var init_http_client_provider = __esm({
19871
20048
  };
19872
20049
  }
19873
20050
  }
19874
- const response = await fetch(url, requestOptions);
20051
+ const response = await rateLimitedFetch(url, requestOptions, rateLimitConfig);
19875
20052
  clearTimeout(timeoutId);
19876
20053
  if (!response.ok) {
19877
20054
  return {
@@ -41619,8 +41796,8 @@ function buildBuiltinGlobals(opts) {
41619
41796
  const asyncFunctionNames = /* @__PURE__ */ new Set();
41620
41797
  const scheduleFn = async (args = {}) => {
41621
41798
  try {
41622
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-7O7SWSJ4.mjs");
41623
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-KYDXJ2ZL.mjs");
41799
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-MKT5FZ6J.mjs");
41800
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-MPJFLH4J.mjs");
41624
41801
  const parentCtx = opts.sessionInfo?._parentContext;
41625
41802
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
41626
41803
  const visorCfg = parentCtx?.config;
@@ -44827,6 +45004,14 @@ var init_workflow_check_provider = __esm({
44827
45004
  inputs,
44828
45005
  config.checkName || workflow.id
44829
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
+ }
44830
45015
  const parentMemoryCfg = parentContext?.memory && parentContext.memory.getConfig && parentContext.memory.getConfig() || parentContext?.config?.memory;
44831
45016
  const childJournal = new ExecutionJournal2();
44832
45017
  const childMemory = MemoryStore2.createIsolated(parentMemoryCfg);
@@ -45236,4 +45421,4 @@ undici/lib/fetch/body.js:
45236
45421
  undici/lib/websocket/frame.js:
45237
45422
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
45238
45423
  */
45239
- //# sourceMappingURL=chunk-IYXOLUDJ.mjs.map
45424
+ //# sourceMappingURL=chunk-AK64Y6Y2.mjs.map