@probelabs/visor 0.1.80 → 0.1.81

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.
@@ -20,7 +20,9 @@ var init_session_registry = __esm({
20
20
  SessionRegistry = class _SessionRegistry {
21
21
  static instance;
22
22
  sessions = /* @__PURE__ */ new Map();
23
+ exitHandlerRegistered = false;
23
24
  constructor() {
25
+ this.registerExitHandlers();
24
26
  }
25
27
  /**
26
28
  * Get the singleton instance of SessionRegistry
@@ -54,7 +56,15 @@ var init_session_registry = __esm({
54
56
  unregisterSession(sessionId) {
55
57
  if (this.sessions.has(sessionId)) {
56
58
  console.error(`\u{1F5D1}\uFE0F Unregistering AI session: ${sessionId}`);
59
+ const agent = this.sessions.get(sessionId);
57
60
  this.sessions.delete(sessionId);
61
+ if (agent && typeof agent.cleanup === "function") {
62
+ try {
63
+ agent.cleanup();
64
+ } catch (error) {
65
+ console.error(`\u26A0\uFE0F Warning: Failed to cleanup ProbeAgent: ${error}`);
66
+ }
67
+ }
58
68
  }
59
69
  }
60
70
  /**
@@ -62,6 +72,14 @@ var init_session_registry = __esm({
62
72
  */
63
73
  clearAllSessions() {
64
74
  console.error(`\u{1F9F9} Clearing all AI sessions (${this.sessions.size} sessions)`);
75
+ for (const [, agent] of this.sessions.entries()) {
76
+ if (agent && typeof agent.cleanup === "function") {
77
+ try {
78
+ agent.cleanup();
79
+ } catch {
80
+ }
81
+ }
82
+ }
65
83
  this.sessions.clear();
66
84
  }
67
85
  /**
@@ -76,6 +94,44 @@ var init_session_registry = __esm({
76
94
  hasSession(sessionId) {
77
95
  return this.sessions.has(sessionId);
78
96
  }
97
+ /**
98
+ * Register process exit handlers to cleanup sessions on exit
99
+ */
100
+ registerExitHandlers() {
101
+ if (this.exitHandlerRegistered) {
102
+ return;
103
+ }
104
+ const cleanupAndExit = (signal) => {
105
+ if (this.sessions.size > 0) {
106
+ console.error(`
107
+ \u{1F9F9} [${signal}] Cleaning up ${this.sessions.size} active AI sessions...`);
108
+ this.clearAllSessions();
109
+ }
110
+ };
111
+ process.on("exit", () => {
112
+ if (this.sessions.size > 0) {
113
+ console.error(`\u{1F9F9} [exit] Cleaning up ${this.sessions.size} active AI sessions...`);
114
+ for (const [, agent] of this.sessions.entries()) {
115
+ if (agent && typeof agent.cleanup === "function") {
116
+ try {
117
+ agent.cleanup();
118
+ } catch {
119
+ }
120
+ }
121
+ }
122
+ this.sessions.clear();
123
+ }
124
+ });
125
+ process.on("SIGINT", () => {
126
+ cleanupAndExit("SIGINT");
127
+ process.exit(0);
128
+ });
129
+ process.on("SIGTERM", () => {
130
+ cleanupAndExit("SIGTERM");
131
+ process.exit(0);
132
+ });
133
+ this.exitHandlerRegistered = true;
134
+ }
79
135
  };
80
136
  }
81
137
  });
@@ -1493,7 +1549,7 @@ var PRReviewer = class {
1493
1549
  async reviewPR(owner, repo, prNumber, prInfo, options = {}) {
1494
1550
  const { debug = false, config, checks } = options;
1495
1551
  if (config && checks && checks.length > 0) {
1496
- const { CheckExecutionEngine: CheckExecutionEngine2 } = await import("./check-execution-engine-2EQWRXWI.mjs");
1552
+ const { CheckExecutionEngine: CheckExecutionEngine2 } = await import("./check-execution-engine-47OZJFUV.mjs");
1497
1553
  const engine = new CheckExecutionEngine2();
1498
1554
  const { results } = await engine.executeGroupedChecks(
1499
1555
  prInfo,
@@ -2141,17 +2197,6 @@ var IssueFilter = class {
2141
2197
  // src/providers/ai-check-provider.ts
2142
2198
  import fs3 from "fs/promises";
2143
2199
  import path3 from "path";
2144
-
2145
- // src/providers/claude-code-types.ts
2146
- async function safeImport(moduleName) {
2147
- try {
2148
- return await import(moduleName);
2149
- } catch {
2150
- return null;
2151
- }
2152
- }
2153
-
2154
- // src/providers/ai-check-provider.ts
2155
2200
  var AICheckProvider = class extends CheckProvider {
2156
2201
  aiReviewService;
2157
2202
  liquidEngine;
@@ -2429,54 +2474,6 @@ var AICheckProvider = class extends CheckProvider {
2429
2474
  );
2430
2475
  }
2431
2476
  }
2432
- /**
2433
- * Setup MCP tools based on AI configuration
2434
- */
2435
- async setupMcpTools(aiConfig) {
2436
- const tools = [];
2437
- if (aiConfig.mcpServers) {
2438
- try {
2439
- const mcpModule = await safeImport("@modelcontextprotocol/sdk");
2440
- if (!mcpModule) {
2441
- console.warn("@modelcontextprotocol/sdk package not found. MCP servers disabled.");
2442
- return tools;
2443
- }
2444
- const createSdkMcpServer = mcpModule.createSdkMcpServer || mcpModule.default?.createSdkMcpServer;
2445
- if (typeof createSdkMcpServer === "function") {
2446
- for (const [serverName, serverConfig] of Object.entries(aiConfig.mcpServers)) {
2447
- try {
2448
- const server = await createSdkMcpServer({
2449
- name: serverName,
2450
- command: serverConfig.command,
2451
- args: serverConfig.args || [],
2452
- env: { ...process.env, ...serverConfig.env }
2453
- });
2454
- const serverTools = await server.listTools();
2455
- tools.push(
2456
- ...serverTools.map((tool) => ({
2457
- name: tool.name,
2458
- server: serverName
2459
- }))
2460
- );
2461
- } catch (serverError) {
2462
- console.warn(
2463
- `Failed to setup MCP server ${serverName}: ${serverError instanceof Error ? serverError.message : "Unknown error"}`
2464
- );
2465
- }
2466
- }
2467
- } else {
2468
- console.warn(
2469
- "createSdkMcpServer function not found in @modelcontextprotocol/sdk. MCP servers disabled."
2470
- );
2471
- }
2472
- } catch (error) {
2473
- console.warn(
2474
- `Failed to import MCP SDK: ${error instanceof Error ? error.message : "Unknown error"}. MCP servers disabled.`
2475
- );
2476
- }
2477
- }
2478
- return tools;
2479
- }
2480
2477
  async execute(prInfo, config, _dependencyResults, sessionInfo) {
2481
2478
  if (config.env) {
2482
2479
  const result = EnvironmentResolver.withTemporaryEnv(config.env, () => {
@@ -2533,11 +2530,9 @@ var AICheckProvider = class extends CheckProvider {
2533
2530
  }
2534
2531
  if (Object.keys(mcpServers).length > 0) {
2535
2532
  aiConfig.mcpServers = mcpServers;
2536
- const mcpConfig = { mcpServers };
2537
- const mcpTools = await this.setupMcpTools(mcpConfig);
2538
2533
  if (aiConfig.debug) {
2539
2534
  console.error(
2540
- `\u{1F527} Debug: AI check MCP configured with ${Object.keys(mcpServers).length} servers; discovered ${mcpTools.length} tools`
2535
+ `\u{1F527} Debug: AI check MCP configured with ${Object.keys(mcpServers).length} servers`
2541
2536
  );
2542
2537
  }
2543
2538
  }
@@ -3367,6 +3362,17 @@ var LogCheckProvider = class extends CheckProvider {
3367
3362
  // src/providers/claude-code-check-provider.ts
3368
3363
  import fs4 from "fs/promises";
3369
3364
  import path4 from "path";
3365
+
3366
+ // src/providers/claude-code-types.ts
3367
+ async function safeImport(moduleName) {
3368
+ try {
3369
+ return await import(moduleName);
3370
+ } catch {
3371
+ return null;
3372
+ }
3373
+ }
3374
+
3375
+ // src/providers/claude-code-check-provider.ts
3370
3376
  function isClaudeCodeConstructor(value) {
3371
3377
  return typeof value === "function";
3372
3378
  }
@@ -3468,59 +3474,6 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
3468
3474
  );
3469
3475
  }
3470
3476
  }
3471
- /**
3472
- * Setup MCP tools based on configuration
3473
- */
3474
- async setupMcpTools(config) {
3475
- const tools = [];
3476
- if (config.allowedTools) {
3477
- for (const toolName of config.allowedTools) {
3478
- tools.push({ name: toolName });
3479
- }
3480
- }
3481
- if (config.mcpServers) {
3482
- try {
3483
- const mcpModule = await safeImport("@modelcontextprotocol/sdk");
3484
- if (!mcpModule) {
3485
- console.warn("@modelcontextprotocol/sdk package not found. MCP servers disabled.");
3486
- return tools;
3487
- }
3488
- const createSdkMcpServer = mcpModule.createSdkMcpServer || mcpModule.default?.createSdkMcpServer;
3489
- if (typeof createSdkMcpServer === "function") {
3490
- for (const [serverName, serverConfig] of Object.entries(config.mcpServers)) {
3491
- try {
3492
- const server = await createSdkMcpServer({
3493
- name: serverName,
3494
- command: serverConfig.command,
3495
- args: serverConfig.args || [],
3496
- env: { ...process.env, ...serverConfig.env }
3497
- });
3498
- const serverTools = await server.listTools();
3499
- tools.push(
3500
- ...serverTools.map((tool) => ({
3501
- name: tool.name,
3502
- server: serverName
3503
- }))
3504
- );
3505
- } catch (serverError) {
3506
- console.warn(
3507
- `Failed to setup MCP server ${serverName}: ${serverError instanceof Error ? serverError.message : "Unknown error"}`
3508
- );
3509
- }
3510
- }
3511
- } else {
3512
- console.warn(
3513
- "createSdkMcpServer function not found in @modelcontextprotocol/sdk. MCP servers disabled."
3514
- );
3515
- }
3516
- } catch (error) {
3517
- console.warn(
3518
- `Failed to import MCP SDK: ${error instanceof Error ? error.message : "Unknown error"}. MCP servers disabled.`
3519
- );
3520
- }
3521
- }
3522
- return tools;
3523
- }
3524
3477
  /**
3525
3478
  * Group files by their file extension for template context
3526
3479
  */
@@ -3751,14 +3704,18 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
3751
3704
  const startTime = Date.now();
3752
3705
  try {
3753
3706
  const client = await this.initializeClaudeCodeClient();
3754
- const tools = await this.setupMcpTools(claudeCodeConfig);
3755
3707
  const query = {
3756
3708
  query: processedPrompt,
3757
- tools: tools.length > 0 ? tools : void 0,
3758
3709
  maxTurns: claudeCodeConfig.maxTurns || 5,
3759
3710
  systemPrompt: claudeCodeConfig.systemPrompt,
3760
3711
  subagent: claudeCodeConfig.subagent
3761
3712
  };
3713
+ if (claudeCodeConfig.allowedTools && claudeCodeConfig.allowedTools.length > 0) {
3714
+ query.tools = claudeCodeConfig.allowedTools.map((name) => ({ name }));
3715
+ }
3716
+ if (claudeCodeConfig.mcpServers && Object.keys(claudeCodeConfig.mcpServers).length > 0) {
3717
+ query.mcpServers = claudeCodeConfig.mcpServers;
3718
+ }
3762
3719
  let response;
3763
3720
  if (sessionInfo?.reuseSession && sessionInfo.parentSessionId) {
3764
3721
  response = await client.query({
@@ -3786,8 +3743,7 @@ var ClaudeCodeCheckProvider = class extends CheckProvider {
3786
3743
  // Claude Code specific debug info
3787
3744
  sessionId: response.session_id,
3788
3745
  turnCount: response.turn_count,
3789
- usage: response.usage,
3790
- toolsUsed: tools.map((t) => t.name)
3746
+ usage: response.usage
3791
3747
  };
3792
3748
  const suppressionEnabled = config.suppressionEnabled !== false;
3793
3749
  const issueFilter = new IssueFilter(suppressionEnabled);
@@ -7493,14 +7449,6 @@ ${expr}
7493
7449
  }
7494
7450
  }
7495
7451
  }
7496
- const executionStatistics = this.buildExecutionStatistics();
7497
- if (logFn === console.log) {
7498
- this.logExecutionSummary(executionStatistics);
7499
- }
7500
- if (shouldStopExecution) {
7501
- logger.info("");
7502
- logger.warn(`\u26A0\uFE0F Execution stopped early due to fail-fast`);
7503
- }
7504
7452
  if (debug) {
7505
7453
  if (shouldStopExecution) {
7506
7454
  log2(
@@ -7521,6 +7469,14 @@ ${expr}
7521
7469
  }
7522
7470
  }
7523
7471
  }
7472
+ const executionStatistics = this.buildExecutionStatistics();
7473
+ if (logFn === console.log) {
7474
+ this.logExecutionSummary(executionStatistics);
7475
+ }
7476
+ if (shouldStopExecution) {
7477
+ logger.info("");
7478
+ logger.warn(`\u26A0\uFE0F Execution stopped early due to fail-fast`);
7479
+ }
7524
7480
  return this.aggregateDependencyAwareResults(
7525
7481
  results,
7526
7482
  dependencyGraph,
@@ -8677,4 +8633,4 @@ export {
8677
8633
  logger,
8678
8634
  CheckExecutionEngine
8679
8635
  };
8680
- //# sourceMappingURL=chunk-GNA5GPF7.mjs.map
8636
+ //# sourceMappingURL=chunk-V5PUTL5N.mjs.map