@openbuilder/cli 0.50.29 → 0.50.30

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.
package/dist/index.js CHANGED
@@ -5450,6 +5450,8 @@ var BuildWebSocketServer = class {
5450
5450
  // Instance ID for debugging singleton issues
5451
5451
  instanceId = Math.random().toString(36).substring(7);
5452
5452
  initialized = false;
5453
+ // Callback for runner status changes (set by app layer)
5454
+ onRunnerStatusChangeCallback = null;
5453
5455
  constructor() {
5454
5456
  buildLogger$2.websocket.serverCreated(this.instanceId);
5455
5457
  }
@@ -5616,6 +5618,7 @@ var BuildWebSocketServer = class {
5616
5618
  remaining: queueResult.remaining
5617
5619
  });
5618
5620
  }
5621
+ this.notifyRunnerConnected(runnerId);
5619
5622
  ws.on("pong", () => {
5620
5623
  const conn = this.runnerConnections.get(runnerId);
5621
5624
  if (conn) {
@@ -5754,7 +5757,22 @@ var BuildWebSocketServer = class {
5754
5757
  */
5755
5758
  isRunnerConnected(runnerId) {
5756
5759
  const conn = this.runnerConnections.get(runnerId);
5757
- return conn !== void 0 && conn.socket.readyState === WebSocket.OPEN;
5760
+ const isConnected = conn !== void 0 && conn.socket.readyState === WebSocket.OPEN;
5761
+ console.log(`[isRunnerConnected] Checking runner '${runnerId}':`, {
5762
+ hasConnection: conn !== void 0,
5763
+ socketState: conn?.socket.readyState,
5764
+ isOpen: conn?.socket.readyState === WebSocket.OPEN,
5765
+ result: isConnected,
5766
+ allRunners: Array.from(this.runnerConnections.keys())
5767
+ });
5768
+ return isConnected;
5769
+ }
5770
+ /**
5771
+ * Register a callback to be notified when runner status changes
5772
+ * This allows the app layer to emit project events when runners connect/disconnect
5773
+ */
5774
+ onRunnerStatusChange(callback) {
5775
+ this.onRunnerStatusChangeCallback = callback;
5758
5776
  }
5759
5777
  /**
5760
5778
  * Get runner metrics
@@ -5824,6 +5842,13 @@ var BuildWebSocketServer = class {
5824
5842
  level: "info",
5825
5843
  data: { runnerId, processCount: projectIds.length }
5826
5844
  });
5845
+ if (this.onRunnerStatusChangeCallback) {
5846
+ try {
5847
+ this.onRunnerStatusChangeCallback(runnerId, false, projectIds);
5848
+ } catch (callbackError) {
5849
+ buildLogger$2.websocket.error("Runner status change callback failed", callbackError, { runnerId });
5850
+ }
5851
+ }
5827
5852
  } catch (error) {
5828
5853
  buildLogger$2.websocket.error("Failed to cleanup runner processes", error, { runnerId });
5829
5854
  captureException(error, {
@@ -5832,6 +5857,25 @@ var BuildWebSocketServer = class {
5832
5857
  });
5833
5858
  }
5834
5859
  }
5860
+ /**
5861
+ * Notify app layer when a runner connects so projects can update their UI
5862
+ */
5863
+ async notifyRunnerConnected(runnerId) {
5864
+ if (!this.onRunnerStatusChangeCallback) return;
5865
+ try {
5866
+ const projectsWithRunner = await db.select({ id: projects.id }).from(projects).where(eq(projects.runnerId, runnerId));
5867
+ if (projectsWithRunner.length > 0) {
5868
+ const projectIds = projectsWithRunner.map((p) => p.id);
5869
+ buildLogger$2.log("info", "websocket", `Runner ${runnerId} connected - notifying ${projectIds.length} projects`, {
5870
+ runnerId,
5871
+ projectIds
5872
+ });
5873
+ this.onRunnerStatusChangeCallback(runnerId, true, projectIds);
5874
+ }
5875
+ } catch (error) {
5876
+ buildLogger$2.websocket.error("Failed to notify runner connected", error, { runnerId });
5877
+ }
5878
+ }
5835
5879
  /**
5836
5880
  * Handle messages from client (heartbeat, resubscribe, HMR, etc.)
5837
5881
  */