@probelabs/visor 0.1.174 → 0.1.175

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 (84) hide show
  1. package/README.md +3 -2
  2. package/dist/cli-main.d.ts.map +1 -1
  3. package/dist/docs/guides/tdd-assistant-workflows.md +519 -0
  4. package/dist/docs/testing/dsl-reference.md +93 -0
  5. package/dist/examples/lifecycle-hooks.tests.yaml +62 -0
  6. package/dist/generated/config-schema.d.ts +28 -7
  7. package/dist/generated/config-schema.d.ts.map +1 -1
  8. package/dist/generated/config-schema.json +31 -7
  9. package/dist/index.js +331 -26
  10. package/dist/output/traces/{run-2026-03-09T15-44-30-340Z.ndjson → run-2026-03-09T18-49-07-663Z.ndjson} +84 -84
  11. package/dist/output/traces/{run-2026-03-09T15-45-10-778Z.ndjson → run-2026-03-09T18-49-46-345Z.ndjson} +1917 -1901
  12. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  13. package/dist/providers/mcp-custom-sse-server.d.ts +4 -0
  14. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  15. package/dist/sdk/{a2a-frontend-5L6H7ZVF.mjs → a2a-frontend-ORLAU5GK.mjs} +2 -2
  16. package/dist/sdk/{check-provider-registry-UPQNHHFF.mjs → check-provider-registry-7JPPJHVM.mjs} +3 -3
  17. package/dist/sdk/{check-provider-registry-YVQI4IOR.mjs → check-provider-registry-O36CQEGD.mjs} +3 -3
  18. package/dist/sdk/{check-provider-registry-UM762L7S.mjs → check-provider-registry-QCDV3SI6.mjs} +6 -6
  19. package/dist/sdk/{chunk-ZI3SEHWA.mjs → chunk-4FGX4SA6.mjs} +2 -2
  20. package/dist/sdk/{chunk-ZI3SEHWA.mjs.map → chunk-4FGX4SA6.mjs.map} +1 -1
  21. package/dist/sdk/{chunk-2PL2YH3B.mjs → chunk-FZPCP444.mjs} +153 -14
  22. package/dist/sdk/chunk-FZPCP444.mjs.map +1 -0
  23. package/dist/sdk/{chunk-UTBSBJFV.mjs → chunk-HNK5ZJ2L.mjs} +2 -2
  24. package/dist/sdk/{chunk-W4KCJM6J.mjs → chunk-MLXGCLZJ.mjs} +29 -8
  25. package/dist/sdk/chunk-MLXGCLZJ.mjs.map +1 -0
  26. package/dist/sdk/{chunk-YEARBXYT.mjs → chunk-QAO73GUX.mjs} +3 -3
  27. package/dist/sdk/{chunk-I6GKXMQ5.mjs → chunk-TAK5HLAR.mjs} +153 -14
  28. package/dist/sdk/chunk-TAK5HLAR.mjs.map +1 -0
  29. package/dist/sdk/{chunk-EP7PQ4IX.mjs → chunk-YVVOG7RP.mjs} +161 -22
  30. package/dist/sdk/chunk-YVVOG7RP.mjs.map +1 -0
  31. package/dist/sdk/{config-BVL3KFMB.mjs → config-4JMBJKWS.mjs} +2 -2
  32. package/dist/sdk/{failure-condition-evaluator-4O6BTC4Q.mjs → failure-condition-evaluator-RM5JJS4Q.mjs} +3 -3
  33. package/dist/sdk/{github-frontend-UXL73NKB.mjs → github-frontend-O5IAWXL5.mjs} +3 -3
  34. package/dist/sdk/{host-KJTXX76P.mjs → host-WTJBWO4T.mjs} +3 -3
  35. package/dist/sdk/{routing-AWYB2YX3.mjs → routing-AWOHU2WP.mjs} +4 -4
  36. package/dist/sdk/{schedule-tool-UMDRCNO5.mjs → schedule-tool-DF5WUVYV.mjs} +3 -3
  37. package/dist/sdk/{schedule-tool-SGCYDSHL.mjs → schedule-tool-L5G2BRIG.mjs} +6 -6
  38. package/dist/sdk/{schedule-tool-IEY2CFLU.mjs → schedule-tool-XVSYLH4Z.mjs} +3 -3
  39. package/dist/sdk/{schedule-tool-handler-5EPTHBLS.mjs → schedule-tool-handler-CFMFHDUL.mjs} +3 -3
  40. package/dist/sdk/{schedule-tool-handler-HMEGLYJF.mjs → schedule-tool-handler-JGWA4N3C.mjs} +3 -3
  41. package/dist/sdk/{schedule-tool-handler-5QVUZ5EZ.mjs → schedule-tool-handler-UJ4RFTW2.mjs} +6 -6
  42. package/dist/sdk/sdk.d.mts +9 -1
  43. package/dist/sdk/sdk.d.ts +9 -1
  44. package/dist/sdk/sdk.js +173 -13
  45. package/dist/sdk/sdk.js.map +1 -1
  46. package/dist/sdk/sdk.mjs +5 -5
  47. package/dist/sdk/{trace-helpers-6TEWG7RK.mjs → trace-helpers-4ERTVCZG.mjs} +2 -2
  48. package/dist/sdk/{workflow-check-provider-VJ7VIMCQ.mjs → workflow-check-provider-ETM452BO.mjs} +3 -3
  49. package/dist/sdk/{workflow-check-provider-7VNIO6L5.mjs → workflow-check-provider-I3XLJP6V.mjs} +6 -6
  50. package/dist/sdk/{workflow-check-provider-EWMZEEES.mjs → workflow-check-provider-Z6U7FZAF.mjs} +3 -3
  51. package/dist/test-runner/conversation-sugar.d.ts.map +1 -1
  52. package/dist/test-runner/index.d.ts +19 -0
  53. package/dist/test-runner/index.d.ts.map +1 -1
  54. package/dist/test-runner/validator.d.ts.map +1 -1
  55. package/dist/traces/{run-2026-03-09T15-44-30-340Z.ndjson → run-2026-03-09T18-49-07-663Z.ndjson} +84 -84
  56. package/dist/traces/{run-2026-03-09T15-45-10-778Z.ndjson → run-2026-03-09T18-49-46-345Z.ndjson} +1917 -1901
  57. package/dist/types/config.d.ts +9 -1
  58. package/dist/types/config.d.ts.map +1 -1
  59. package/package.json +1 -1
  60. package/dist/sdk/chunk-2PL2YH3B.mjs.map +0 -1
  61. package/dist/sdk/chunk-EP7PQ4IX.mjs.map +0 -1
  62. package/dist/sdk/chunk-I6GKXMQ5.mjs.map +0 -1
  63. package/dist/sdk/chunk-W4KCJM6J.mjs.map +0 -1
  64. /package/dist/sdk/{a2a-frontend-5L6H7ZVF.mjs.map → a2a-frontend-ORLAU5GK.mjs.map} +0 -0
  65. /package/dist/sdk/{check-provider-registry-UM762L7S.mjs.map → check-provider-registry-7JPPJHVM.mjs.map} +0 -0
  66. /package/dist/sdk/{check-provider-registry-UPQNHHFF.mjs.map → check-provider-registry-O36CQEGD.mjs.map} +0 -0
  67. /package/dist/sdk/{check-provider-registry-YVQI4IOR.mjs.map → check-provider-registry-QCDV3SI6.mjs.map} +0 -0
  68. /package/dist/sdk/{chunk-UTBSBJFV.mjs.map → chunk-HNK5ZJ2L.mjs.map} +0 -0
  69. /package/dist/sdk/{chunk-YEARBXYT.mjs.map → chunk-QAO73GUX.mjs.map} +0 -0
  70. /package/dist/sdk/{config-BVL3KFMB.mjs.map → config-4JMBJKWS.mjs.map} +0 -0
  71. /package/dist/sdk/{failure-condition-evaluator-4O6BTC4Q.mjs.map → failure-condition-evaluator-RM5JJS4Q.mjs.map} +0 -0
  72. /package/dist/sdk/{github-frontend-UXL73NKB.mjs.map → github-frontend-O5IAWXL5.mjs.map} +0 -0
  73. /package/dist/sdk/{host-KJTXX76P.mjs.map → host-WTJBWO4T.mjs.map} +0 -0
  74. /package/dist/sdk/{routing-AWYB2YX3.mjs.map → routing-AWOHU2WP.mjs.map} +0 -0
  75. /package/dist/sdk/{schedule-tool-IEY2CFLU.mjs.map → schedule-tool-DF5WUVYV.mjs.map} +0 -0
  76. /package/dist/sdk/{schedule-tool-SGCYDSHL.mjs.map → schedule-tool-L5G2BRIG.mjs.map} +0 -0
  77. /package/dist/sdk/{schedule-tool-UMDRCNO5.mjs.map → schedule-tool-XVSYLH4Z.mjs.map} +0 -0
  78. /package/dist/sdk/{schedule-tool-handler-5EPTHBLS.mjs.map → schedule-tool-handler-CFMFHDUL.mjs.map} +0 -0
  79. /package/dist/sdk/{schedule-tool-handler-5QVUZ5EZ.mjs.map → schedule-tool-handler-JGWA4N3C.mjs.map} +0 -0
  80. /package/dist/sdk/{schedule-tool-handler-HMEGLYJF.mjs.map → schedule-tool-handler-UJ4RFTW2.mjs.map} +0 -0
  81. /package/dist/sdk/{trace-helpers-6TEWG7RK.mjs.map → trace-helpers-4ERTVCZG.mjs.map} +0 -0
  82. /package/dist/sdk/{workflow-check-provider-7VNIO6L5.mjs.map → workflow-check-provider-ETM452BO.mjs.map} +0 -0
  83. /package/dist/sdk/{workflow-check-provider-EWMZEEES.mjs.map → workflow-check-provider-I3XLJP6V.mjs.map} +0 -0
  84. /package/dist/sdk/{workflow-check-provider-VJ7VIMCQ.mjs.map → workflow-check-provider-Z6U7FZAF.mjs.map} +0 -0
@@ -43,7 +43,7 @@ import {
43
43
  import {
44
44
  config_exports,
45
45
  init_config
46
- } from "./chunk-W4KCJM6J.mjs";
46
+ } from "./chunk-MLXGCLZJ.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-YEARBXYT.mjs";
55
+ } from "./chunk-QAO73GUX.mjs";
56
56
  import {
57
57
  FailureConditionEvaluator,
58
58
  init_failure_condition_evaluator
59
- } from "./chunk-UTBSBJFV.mjs";
59
+ } from "./chunk-HNK5ZJ2L.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-ZI3SEHWA.mjs";
70
+ } from "./chunk-4FGX4SA6.mjs";
71
71
  import {
72
72
  generateHumanId,
73
73
  init_human_id
@@ -4006,7 +4006,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
4006
4006
  ...args,
4007
4007
  ...argsOverrides
4008
4008
  };
4009
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-7VNIO6L5.mjs");
4009
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-I3XLJP6V.mjs");
4010
4010
  const provider = new WorkflowCheckProvider2();
4011
4011
  const checkConfig = {
4012
4012
  type: "workflow",
@@ -9327,7 +9327,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9327
9327
  }
9328
9328
  }
9329
9329
  try {
9330
- const { evaluateTransitions } = await import("./routing-AWYB2YX3.mjs");
9330
+ const { evaluateTransitions } = await import("./routing-AWOHU2WP.mjs");
9331
9331
  const transTarget = await evaluateTransitions(
9332
9332
  onFinish.transitions,
9333
9333
  forEachParent,
@@ -9387,7 +9387,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9387
9387
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9388
9388
  );
9389
9389
  }
9390
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-AWYB2YX3.mjs");
9390
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-AWOHU2WP.mjs");
9391
9391
  if (context2.debug) {
9392
9392
  logger.info(
9393
9393
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -13348,7 +13348,7 @@ var init_state_machine_execution_engine = __esm({
13348
13348
  try {
13349
13349
  const map = options?.webhookContext?.webhookData;
13350
13350
  if (map) {
13351
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-UM762L7S.mjs");
13351
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-QCDV3SI6.mjs");
13352
13352
  const reg = CheckProviderRegistry2.getInstance();
13353
13353
  const p = reg.getProvider("http_input");
13354
13354
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13461,7 +13461,7 @@ var init_state_machine_execution_engine = __esm({
13461
13461
  logger.info("[StateMachine] Using state machine engine");
13462
13462
  }
13463
13463
  if (!config) {
13464
- const { ConfigManager } = await import("./config-BVL3KFMB.mjs");
13464
+ const { ConfigManager } = await import("./config-4JMBJKWS.mjs");
13465
13465
  const configManager = new ConfigManager();
13466
13466
  config = await configManager.getDefaultConfig();
13467
13467
  logger.debug("[StateMachine] Using default configuration (no config provided)");
@@ -13471,7 +13471,7 @@ var init_state_machine_execution_engine = __esm({
13471
13471
  tag_filter: tagFilter
13472
13472
  } : config;
13473
13473
  try {
13474
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-UM762L7S.mjs");
13474
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-QCDV3SI6.mjs");
13475
13475
  const registry = CheckProviderRegistry2.getInstance();
13476
13476
  registry.setCustomTools(configWithTagFilter.tools || {});
13477
13477
  } catch (error) {
@@ -13535,7 +13535,7 @@ var init_state_machine_execution_engine = __esm({
13535
13535
  try {
13536
13536
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13537
13537
  if (webhookData instanceof Map) {
13538
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-5QVUZ5EZ.mjs");
13538
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-UJ4RFTW2.mjs");
13539
13539
  const slackCtx = extractSlackContext2(webhookData);
13540
13540
  if (slackCtx) {
13541
13541
  const payload = Array.from(webhookData.values())[0];
@@ -13564,7 +13564,7 @@ var init_state_machine_execution_engine = __esm({
13564
13564
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13565
13565
  try {
13566
13566
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13567
- const { FrontendsHost } = await import("./host-KJTXX76P.mjs");
13567
+ const { FrontendsHost } = await import("./host-WTJBWO4T.mjs");
13568
13568
  const bus = new EventBus();
13569
13569
  context2.eventBus = bus;
13570
13570
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13916,9 +13916,9 @@ var init_state_machine_execution_engine = __esm({
13916
13916
  * @returns Array of failure condition evaluation results
13917
13917
  */
13918
13918
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13919
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-4O6BTC4Q.mjs");
13919
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-RM5JJS4Q.mjs");
13920
13920
  const evaluator = new FailureConditionEvaluator2();
13921
- const { addEvent: addEvent3 } = await import("./trace-helpers-6TEWG7RK.mjs");
13921
+ const { addEvent: addEvent3 } = await import("./trace-helpers-4ERTVCZG.mjs");
13922
13922
  const { addFailIfTriggered } = await import("./metrics-JTOG2HNO.mjs");
13923
13923
  const checkConfig = config.checks?.[checkName];
13924
13924
  if (!checkConfig) {
@@ -16069,6 +16069,9 @@ var init_schedule_tool_handler = __esm({
16069
16069
  // src/providers/mcp-custom-sse-server.ts
16070
16070
  import http from "http";
16071
16071
  import { EventEmitter } from "events";
16072
+ function isHttpClientTool(tool) {
16073
+ return Boolean(tool && tool.type === "http_client" && (tool.base_url || tool.url));
16074
+ }
16072
16075
  var CustomToolsSSEServer;
16073
16076
  var init_mcp_custom_sse_server = __esm({
16074
16077
  "src/providers/mcp-custom-sse-server.ts"() {
@@ -16080,6 +16083,7 @@ var init_mcp_custom_sse_server = __esm({
16080
16083
  init_workflow_registry();
16081
16084
  init_schedule_tool();
16082
16085
  init_schedule_tool_handler();
16086
+ init_env_resolver();
16083
16087
  CustomToolsSSEServer = class _CustomToolsSSEServer {
16084
16088
  server = null;
16085
16089
  port = 0;
@@ -16113,10 +16117,12 @@ var init_mcp_custom_sse_server = __esm({
16113
16117
  }
16114
16118
  }
16115
16119
  for (const [name, tool] of this.tools.entries()) {
16116
- if (!isWorkflowTool(tool)) {
16117
- toolsRecord[name] = tool;
16120
+ if (isWorkflowTool(tool) || isHttpClientTool(tool)) {
16121
+ if (isWorkflowTool(tool)) {
16122
+ workflowToolNames.push(name);
16123
+ }
16118
16124
  } else {
16119
- workflowToolNames.push(name);
16125
+ toolsRecord[name] = tool;
16120
16126
  }
16121
16127
  }
16122
16128
  if (workflowToolNames.length > 0 && !workflowContext) {
@@ -16596,7 +16602,12 @@ var init_mcp_custom_sse_server = __esm({
16596
16602
  description: tool.description || `Execute ${tool.name}`,
16597
16603
  inputSchema: normalizeInputSchema(tool.inputSchema)
16598
16604
  }));
16599
- const allTools = [...regularTools, ...workflowTools];
16605
+ const httpClientTools = Array.from(this.tools.values()).filter(isHttpClientTool).map((tool) => ({
16606
+ name: tool.name,
16607
+ description: tool.description || `Call ${tool.name} HTTP API`,
16608
+ inputSchema: normalizeInputSchema(tool.inputSchema)
16609
+ }));
16610
+ const allTools = [...regularTools, ...workflowTools, ...httpClientTools];
16600
16611
  if (this.debug) {
16601
16612
  logger.debug(
16602
16613
  `[CustomToolsSSEServer:${this.sessionId}] Listing ${allTools.length} tools: ${allTools.map((t) => t.name).join(", ")}`
@@ -16720,6 +16731,8 @@ var init_mcp_custom_sse_server = __esm({
16720
16731
  this.workflowContext,
16721
16732
  workflowTool.__argsOverrides
16722
16733
  );
16734
+ } else if (tool && isHttpClientTool(tool)) {
16735
+ result = await this.executeHttpClientTool(tool, args);
16723
16736
  } else {
16724
16737
  result = await this.toolExecutor.execute(toolName, args);
16725
16738
  }
@@ -16783,6 +16796,83 @@ var init_mcp_custom_sse_server = __esm({
16783
16796
  }
16784
16797
  }
16785
16798
  }
16799
+ /**
16800
+ * Execute an http_client tool — proxy REST API calls through the configured base URL.
16801
+ */
16802
+ async executeHttpClientTool(tool, args) {
16803
+ const baseUrl = (tool.base_url || tool.url).replace(/\/+$/, "");
16804
+ const apiPath = args.path || "";
16805
+ const method = (args.method || "GET").toUpperCase();
16806
+ const queryParams = args.query || {};
16807
+ const body = args.body;
16808
+ const toolHeaders = tool.headers || {};
16809
+ const timeout = tool.timeout || 3e4;
16810
+ let url = apiPath.startsWith("http") ? apiPath : `${baseUrl}/${apiPath.replace(/^\/+/, "")}`;
16811
+ if (Object.keys(queryParams).length > 0) {
16812
+ const qs = new URLSearchParams(queryParams).toString();
16813
+ url += `${url.includes("?") ? "&" : "?"}${qs}`;
16814
+ }
16815
+ const resolvedHeaders = {};
16816
+ for (const [key, value] of Object.entries(toolHeaders)) {
16817
+ resolvedHeaders[key] = String(EnvironmentResolver.resolveValue(value));
16818
+ }
16819
+ if (tool.auth) {
16820
+ const authType = tool.auth.type;
16821
+ if (authType === "bearer" && tool.auth.token) {
16822
+ const token = String(EnvironmentResolver.resolveValue(tool.auth.token));
16823
+ resolvedHeaders["Authorization"] = `Bearer ${token}`;
16824
+ }
16825
+ }
16826
+ if (this.debug) {
16827
+ logger.debug(`[CustomToolsSSEServer:${this.sessionId}] HTTP client: ${method} ${url}`);
16828
+ }
16829
+ const controller = new AbortController();
16830
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
16831
+ try {
16832
+ const requestOptions = {
16833
+ method,
16834
+ headers: resolvedHeaders,
16835
+ signal: controller.signal
16836
+ };
16837
+ if (method !== "GET" && body) {
16838
+ requestOptions.body = typeof body === "string" ? body : JSON.stringify(body);
16839
+ if (!resolvedHeaders["Content-Type"] && !resolvedHeaders["content-type"]) {
16840
+ resolvedHeaders["Content-Type"] = "application/json";
16841
+ }
16842
+ }
16843
+ const response = await fetch(url, requestOptions);
16844
+ clearTimeout(timeoutId);
16845
+ if (!response.ok) {
16846
+ let errorBody = "";
16847
+ try {
16848
+ errorBody = await response.text();
16849
+ } catch {
16850
+ }
16851
+ throw new Error(
16852
+ `HTTP ${response.status}: ${response.statusText}${errorBody ? ` - ${errorBody.substring(0, 500)}` : ""}`
16853
+ );
16854
+ }
16855
+ const contentType = response.headers.get("content-type");
16856
+ if (contentType && contentType.includes("application/json")) {
16857
+ return await response.json();
16858
+ }
16859
+ const text = await response.text();
16860
+ if (text.trim().startsWith("{") || text.trim().startsWith("[")) {
16861
+ try {
16862
+ return JSON.parse(text);
16863
+ } catch {
16864
+ return text;
16865
+ }
16866
+ }
16867
+ return text;
16868
+ } catch (error) {
16869
+ clearTimeout(timeoutId);
16870
+ if (error instanceof Error && error.name === "AbortError") {
16871
+ throw new Error(`HTTP client request timed out after ${timeout}ms`);
16872
+ }
16873
+ throw error;
16874
+ }
16875
+ }
16786
16876
  /**
16787
16877
  * Convert a type: 'workflow' tool definition into a WorkflowToolDefinition marker.
16788
16878
  *
@@ -17866,6 +17956,7 @@ ${preview}`);
17866
17956
  }
17867
17957
  const workflowEntriesFromMcp = [];
17868
17958
  const toolEntriesFromMcp = [];
17959
+ const httpClientEntriesFromMcp = [];
17869
17960
  const mcpEntriesToRemove = [];
17870
17961
  for (const [serverName, serverConfig] of Object.entries(mcpServers)) {
17871
17962
  const cfg = serverConfig;
@@ -17879,6 +17970,12 @@ ${preview}`);
17879
17970
  logger.debug(
17880
17971
  `[AICheckProvider] Extracted workflow tool '${serverName}' (workflow=${cfg.workflow}) from ai_mcp_servers`
17881
17972
  );
17973
+ } else if (cfg.type === "http_client" && (cfg.base_url || cfg.url)) {
17974
+ httpClientEntriesFromMcp.push({ name: serverName, config: cfg });
17975
+ mcpEntriesToRemove.push(serverName);
17976
+ logger.debug(
17977
+ `[AICheckProvider] Extracted http_client tool '${serverName}' (base_url=${cfg.base_url || cfg.url}) from ai_mcp_servers`
17978
+ );
17882
17979
  } else if (cfg.tool && typeof cfg.tool === "string") {
17883
17980
  toolEntriesFromMcp.push(cfg.tool);
17884
17981
  mcpEntriesToRemove.push(serverName);
@@ -17931,7 +18028,7 @@ ${preview}`);
17931
18028
  logger.debug(`[AICheckProvider] Schedule tool requested (${contextInfo})`);
17932
18029
  }
17933
18030
  const scheduleToolEnabled = scheduleToolRequested || config.ai?.enable_scheduler === true && !config.ai?.disableTools;
17934
- if ((customToolsToLoad.length > 0 || scheduleToolEnabled) && (customToolsServerName || scheduleToolEnabled) && !config.ai?.disableTools) {
18031
+ if ((customToolsToLoad.length > 0 || scheduleToolEnabled || httpClientEntriesFromMcp.length > 0) && (customToolsServerName || scheduleToolEnabled || httpClientEntriesFromMcp.length > 0) && !config.ai?.disableTools) {
17935
18032
  if (!customToolsServerName) {
17936
18033
  customToolsServerName = "__tools__";
17937
18034
  }
@@ -17963,6 +18060,48 @@ ${preview}`);
17963
18060
  customTools.set(scheduleTool.name, scheduleTool);
17964
18061
  logger.debug(`[AICheckProvider] Added built-in schedule tool`);
17965
18062
  }
18063
+ for (const entry of httpClientEntriesFromMcp) {
18064
+ const httpTool = {
18065
+ name: entry.name,
18066
+ type: "http_client",
18067
+ description: entry.config.description || `Call ${entry.name} HTTP API (base: ${entry.config.base_url || entry.config.url})`,
18068
+ base_url: entry.config.base_url || entry.config.url,
18069
+ auth: entry.config.auth,
18070
+ headers: entry.config.headers,
18071
+ timeout: entry.config.timeout || 3e4,
18072
+ inputSchema: {
18073
+ type: "object",
18074
+ properties: {
18075
+ path: {
18076
+ type: "string",
18077
+ description: "API path (e.g. /jobs, /candidates/{id})"
18078
+ },
18079
+ method: {
18080
+ type: "string",
18081
+ description: "HTTP method (default: GET)",
18082
+ enum: ["GET", "POST", "PUT", "PATCH", "DELETE"]
18083
+ },
18084
+ query: {
18085
+ type: "object",
18086
+ description: "Query string parameters",
18087
+ additionalProperties: { type: "string" }
18088
+ },
18089
+ body: {
18090
+ type: "object",
18091
+ description: "Request body for POST/PUT/PATCH"
18092
+ }
18093
+ },
18094
+ required: ["path"]
18095
+ }
18096
+ };
18097
+ customTools.set(entry.name, httpTool);
18098
+ logger.debug(
18099
+ `[AICheckProvider] Added http_client tool '${entry.name}' (base_url=${httpTool.base_url})`
18100
+ );
18101
+ }
18102
+ if (httpClientEntriesFromMcp.length > 0 && !customToolsServerName) {
18103
+ customToolsServerName = "__tools__";
18104
+ }
17966
18105
  if (customTools.size > 0) {
17967
18106
  const sessionId = config.checkName || `ai-check-${Date.now()}`;
17968
18107
  const debug = aiConfig.debug || process.env.VISOR_DEBUG === "true";
@@ -41415,8 +41554,8 @@ function buildBuiltinGlobals(opts) {
41415
41554
  const asyncFunctionNames = /* @__PURE__ */ new Set();
41416
41555
  const scheduleFn = async (args = {}) => {
41417
41556
  try {
41418
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-SGCYDSHL.mjs");
41419
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-5QVUZ5EZ.mjs");
41557
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-L5G2BRIG.mjs");
41558
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-UJ4RFTW2.mjs");
41420
41559
  const parentCtx = opts.sessionInfo?._parentContext;
41421
41560
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
41422
41561
  const visorCfg = parentCtx?.config;
@@ -45013,4 +45152,4 @@ undici/lib/fetch/body.js:
45013
45152
  undici/lib/websocket/frame.js:
45014
45153
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
45015
45154
  */
45016
- //# sourceMappingURL=chunk-EP7PQ4IX.mjs.map
45155
+ //# sourceMappingURL=chunk-YVVOG7RP.mjs.map