Uname:Linux antigravity-cli 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64

Base Dir : /var/www/moonbloom

User : wp-moonbloom


403WebShell
403Webshell
Server IP : 85.155.190.233  /  Your IP : 216.73.216.103
Web Server : nginx/1.24.0
System : Linux antigravity-cli 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User : wp-moonbloom ( 1001)
PHP Version : 8.3.6
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /lib/node_modules/@google/gemini-cli/bundle/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /lib/node_modules/@google/gemini-cli/bundle/devtoolsService-I65SE4OX.js
const require = (await import('node:module')).createRequire(import.meta.url); const __chunk_filename = (await import('node:url')).fileURLToPath(import.meta.url); const __chunk_dirname = (await import('node:path')).dirname(__chunk_filename);
import "./chunk-U6X4OPT5.js";
import {
  CoreEvent,
  coreEvents,
  debugLogger
} from "./chunk-UJ26GAE5.js";
import {
  wrapper_default
} from "./chunk-664ZODQF.js";
import "./chunk-RJTRUG2J.js";
import "./chunk-IUUIT4SU.js";
import "./chunk-34MYV7JD.js";

// packages/cli/src/utils/activityLogger.ts
import http from "node:http";
import https from "node:https";
import zlib from "node:zlib";
import fs from "node:fs";
import path from "node:path";
import { EventEmitter } from "node:events";
var ACTIVITY_ID_HEADER = "x-activity-request-id";
var MAX_BUFFER_SIZE = 100;
function isHeaderRecord(h) {
  return !Array.isArray(h);
}
function isRequestOptions(value) {
  return typeof value === "object" && value !== null && !(value instanceof URL) && !Array.isArray(value);
}
function isIncomingMessageCallback(value) {
  return typeof value === "function";
}
function callHttpRequest(originalFn, args) {
  if (args.length === 0) {
    return originalFn({});
  }
  if (args.length === 1) {
    const first = args[0];
    if (typeof first === "string" || first instanceof URL) {
      return originalFn(first);
    }
    if (isRequestOptions(first)) {
      return originalFn(first);
    }
    return originalFn({});
  }
  if (args.length === 2) {
    const first = args[0];
    const second = args[1];
    if (typeof first === "string" || first instanceof URL) {
      if (isIncomingMessageCallback(second)) {
        return originalFn(first, second);
      }
      if (isRequestOptions(second)) {
        return originalFn(first, second);
      }
    }
    if (isRequestOptions(first) && isIncomingMessageCallback(second)) {
      return originalFn(first, second);
    }
  }
  if (args.length === 3) {
    const first = args[0];
    const second = args[1];
    const third = args[2];
    if ((typeof first === "string" || first instanceof URL) && isRequestOptions(second) && isIncomingMessageCallback(third)) {
      return originalFn(first, second, third);
    }
  }
  return originalFn({});
}
var ActivityLogger = class _ActivityLogger extends EventEmitter {
  static instance;
  isInterceptionEnabled = false;
  requestStartTimes = /* @__PURE__ */ new Map();
  networkLoggingEnabled = false;
  networkBufferMap = /* @__PURE__ */ new Map();
  networkBufferIds = [];
  consoleBuffer = [];
  bufferLimit = 10;
  static getInstance() {
    if (!_ActivityLogger.instance) {
      _ActivityLogger.instance = new _ActivityLogger();
    }
    return _ActivityLogger.instance;
  }
  enableNetworkLogging() {
    this.networkLoggingEnabled = true;
    this.emit("network-logging-enabled");
  }
  disableNetworkLogging() {
    this.networkLoggingEnabled = false;
  }
  isNetworkLoggingEnabled() {
    return this.networkLoggingEnabled;
  }
  /**
   * Atomically returns and clears all buffered logs.
   * Prevents data loss from events emitted between get and clear.
   */
  drainBufferedLogs() {
    const network = [];
    for (const id of this.networkBufferIds) {
      const events = this.networkBufferMap.get(id);
      if (events) network.push(...events);
    }
    const console = [...this.consoleBuffer];
    this.networkBufferMap.clear();
    this.networkBufferIds = [];
    this.consoleBuffer = [];
    return { network, console };
  }
  getBufferedLogs() {
    const network = [];
    for (const id of this.networkBufferIds) {
      const events = this.networkBufferMap.get(id);
      if (events) network.push(...events);
    }
    return {
      network,
      console: [...this.consoleBuffer]
    };
  }
  clearBufferedLogs() {
    this.networkBufferMap.clear();
    this.networkBufferIds = [];
    this.consoleBuffer = [];
  }
  stringifyHeaders(headers) {
    const result = {};
    if (!headers) return result;
    if (headers instanceof Headers) {
      headers.forEach((v, k) => {
        result[k.toLowerCase()] = v;
      });
    } else if (typeof headers === "object" && headers !== null) {
      for (const [key, val] of Object.entries(headers)) {
        result[key.toLowerCase()] = Array.isArray(val) ? val.join(", ") : String(val);
      }
    }
    return result;
  }
  sanitizeNetworkLog(log) {
    if (!log || typeof log !== "object") return log;
    const sanitized = { ...log };
    if ("headers" in sanitized && sanitized.headers) {
      const headers = { ...sanitized.headers };
      for (const key of Object.keys(headers)) {
        if (["authorization", "cookie", "x-goog-api-key"].includes(
          key.toLowerCase()
        )) {
          headers[key] = "[REDACTED]";
        }
      }
      sanitized.headers = headers;
    }
    if ("response" in sanitized && sanitized.response?.headers) {
      const resHeaders = { ...sanitized.response.headers };
      for (const key of Object.keys(resHeaders)) {
        if (["set-cookie"].includes(key.toLowerCase())) {
          resHeaders[key] = "[REDACTED]";
        }
      }
      sanitized.response = { ...sanitized.response, headers: resHeaders };
    }
    return sanitized;
  }
  /** @internal Emit a network event — public for testing only. */
  emitNetworkEvent(payload) {
    this.safeEmitNetwork(payload);
  }
  safeEmitNetwork(payload) {
    const sanitized = this.sanitizeNetworkLog(payload);
    const id = sanitized.id;
    if (!this.networkBufferMap.has(id)) {
      this.networkBufferIds.push(id);
      this.networkBufferMap.set(id, []);
      if (this.networkBufferIds.length > this.bufferLimit) {
        const evictId = this.networkBufferIds.shift();
        this.networkBufferMap.delete(evictId);
      }
    }
    this.networkBufferMap.get(id).push(sanitized);
    this.emit("network", sanitized);
  }
  enable() {
    if (this.isInterceptionEnabled) return;
    this.isInterceptionEnabled = true;
    this.patchGlobalFetch();
    this.patchNodeHttp();
  }
  patchGlobalFetch() {
    if (!global.fetch) return;
    const originalFetch = global.fetch;
    global.fetch = async (input, init) => {
      const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
      if (url.includes("127.0.0.1") || url.includes("localhost"))
        return originalFetch(input, init);
      const id = Math.random().toString(36).substring(7);
      const inputMethod = typeof input === "object" && "method" in input ? input.method : void 0;
      const inputHeaders = typeof input === "object" && "headers" in input ? input.headers : void 0;
      const method = (init?.method ?? inputMethod ?? "GET").toUpperCase();
      const headers = new Headers(init?.headers ?? inputHeaders ?? {});
      headers.set(ACTIVITY_ID_HEADER, id);
      const newInit = {
        ...init,
        method,
        headers
      };
      let reqBody = "";
      const body = newInit.body;
      if (body) {
        if (typeof body === "string") reqBody = body;
        else if (body instanceof URLSearchParams) reqBody = body.toString();
      }
      this.requestStartTimes.set(id, Date.now());
      this.safeEmitNetwork({
        id,
        timestamp: Date.now(),
        method,
        url,
        headers: this.stringifyHeaders(newInit.headers),
        body: reqBody,
        pending: true
      });
      try {
        const response = await originalFetch(input, newInit);
        const clonedRes = response.clone();
        if (clonedRes.body) {
          const reader = clonedRes.body.getReader();
          const decoder = new TextDecoder();
          const chunks = [];
          let chunkIndex = 0;
          const readStream = async () => {
            try {
              while (true) {
                const { done, value } = await reader.read();
                if (done) break;
                const chunkData = decoder.decode(value, { stream: true });
                chunks.push(chunkData);
                this.safeEmitNetwork({
                  id,
                  pending: true,
                  chunk: {
                    index: chunkIndex++,
                    data: chunkData,
                    timestamp: Date.now()
                  }
                });
              }
              const startTime = this.requestStartTimes.get(id);
              const durationMs = startTime ? Date.now() - startTime : 0;
              this.requestStartTimes.delete(id);
              this.safeEmitNetwork({
                id,
                pending: false,
                response: {
                  status: response.status,
                  headers: this.stringifyHeaders(response.headers),
                  body: chunks.join(""),
                  durationMs
                }
              });
            } catch (err) {
              const message = err instanceof Error ? err.message : String(err);
              this.safeEmitNetwork({
                id,
                pending: false,
                error: `Failed to read response body: ${message}`
              });
            }
          };
          void readStream();
        } else {
          clonedRes.text().then((text) => {
            const startTime = this.requestStartTimes.get(id);
            const durationMs = startTime ? Date.now() - startTime : 0;
            this.requestStartTimes.delete(id);
            this.safeEmitNetwork({
              id,
              pending: false,
              response: {
                status: response.status,
                headers: this.stringifyHeaders(response.headers),
                body: text,
                durationMs
              }
            });
          }).catch((err) => {
            const message = err instanceof Error ? err.message : String(err);
            this.safeEmitNetwork({
              id,
              pending: false,
              error: `Failed to read response body: ${message}`
            });
          });
        }
        return response;
      } catch (err) {
        this.requestStartTimes.delete(id);
        const message = err instanceof Error ? err.message : String(err);
        this.safeEmitNetwork({ id, pending: false, error: message });
        throw err;
      }
    };
  }
  patchNodeHttp() {
    const self = this;
    const originalRequest = http.request;
    const originalHttpsRequest = https.request;
    const wrapRequest = (originalFn, args, protocol) => {
      const firstArg = args[0];
      let options;
      if (typeof firstArg === "string") {
        options = firstArg;
      } else if (firstArg instanceof URL) {
        options = firstArg;
      } else if (firstArg && typeof firstArg === "object") {
        options = isRequestOptions(firstArg) ? firstArg : {};
      } else {
        options = {};
      }
      let url = "";
      if (typeof options === "string") {
        url = options;
      } else if (options instanceof URL) {
        url = options.href;
      } else {
        const href = "href" in options && typeof options.href === "string" ? options.href : "";
        url = href || `${protocol}//${options.hostname || options.host || "localhost"}${options.path || "/"}`;
      }
      if (url.includes("127.0.0.1") || url.includes("localhost")) {
        return callHttpRequest(originalFn, args);
      }
      const rawHeaders = typeof options === "object" && options !== null && !(options instanceof URL) ? options.headers : void 0;
      let headers = {};
      if (rawHeaders && isHeaderRecord(rawHeaders)) {
        headers = rawHeaders;
      }
      if (headers[ACTIVITY_ID_HEADER]) {
        delete headers[ACTIVITY_ID_HEADER];
        return callHttpRequest(originalFn, args);
      }
      const id = Math.random().toString(36).substring(7);
      this.requestStartTimes.set(id, Date.now());
      const req = callHttpRequest(originalFn, args);
      const requestChunks = [];
      const oldWrite = req.write;
      const oldEnd = req.end;
      req.write = function(chunk, ...etc) {
        if (chunk) {
          const arg0 = etc[0];
          const encoding = typeof arg0 === "string" && Buffer.isEncoding(arg0) ? arg0 : void 0;
          requestChunks.push(
            Buffer.isBuffer(chunk) ? chunk : typeof chunk === "string" ? Buffer.from(chunk, encoding) : Buffer.from(
              chunk instanceof Uint8Array ? chunk : String(chunk)
            )
          );
        }
        return oldWrite.apply(this, [chunk, ...etc]);
      };
      req.end = function(chunkOrCb, ...etc) {
        const chunk = typeof chunkOrCb === "function" ? void 0 : chunkOrCb;
        if (chunk) {
          const arg0 = etc[0];
          const encoding = typeof arg0 === "string" && Buffer.isEncoding(arg0) ? arg0 : void 0;
          requestChunks.push(
            Buffer.isBuffer(chunk) ? chunk : typeof chunk === "string" ? Buffer.from(chunk, encoding) : Buffer.from(
              chunk instanceof Uint8Array ? chunk : String(chunk)
            )
          );
        }
        const body = Buffer.concat(requestChunks).toString("utf8");
        self.safeEmitNetwork({
          id,
          timestamp: Date.now(),
          method: req.method || "GET",
          url,
          headers: self.stringifyHeaders(req.getHeaders()),
          body,
          pending: true
        });
        return oldEnd.apply(this, [chunkOrCb, ...etc]);
      };
      req.on("response", (res) => {
        const responseChunks = [];
        let chunkIndex = 0;
        res.on("data", (chunk) => {
          const chunkBuffer = Buffer.from(chunk);
          responseChunks.push(chunkBuffer);
          self.safeEmitNetwork({
            id,
            pending: true,
            chunk: {
              index: chunkIndex++,
              data: chunkBuffer.toString("utf8"),
              timestamp: Date.now()
            }
          });
        });
        res.on("end", () => {
          const buffer = Buffer.concat(responseChunks);
          const encoding = res.headers["content-encoding"];
          const processBuffer = (finalBuffer) => {
            const resBody = finalBuffer.toString("utf8");
            const startTime = self.requestStartTimes.get(id);
            const durationMs = startTime ? Date.now() - startTime : 0;
            self.requestStartTimes.delete(id);
            self.safeEmitNetwork({
              id,
              pending: false,
              response: {
                status: res.statusCode || 0,
                headers: self.stringifyHeaders(res.headers),
                body: resBody,
                durationMs
              }
            });
          };
          if (encoding === "gzip") {
            zlib.gunzip(buffer, (err, decompressed) => {
              processBuffer(err ? buffer : decompressed);
            });
          } else if (encoding === "deflate") {
            zlib.inflate(buffer, (err, decompressed) => {
              processBuffer(err ? buffer : decompressed);
            });
          } else {
            processBuffer(buffer);
          }
        });
      });
      req.on("error", (err) => {
        self.requestStartTimes.delete(id);
        const message = err.message;
        self.safeEmitNetwork({
          id,
          pending: false,
          error: message
        });
      });
      return req;
    };
    Object.defineProperty(http, "request", {
      value: (url, options, callback) => {
        const args = callback !== void 0 ? [url, options, callback] : options !== void 0 ? [url, options] : [url];
        return wrapRequest(originalRequest, args, "http:");
      },
      writable: true,
      configurable: true
    });
    Object.defineProperty(https, "request", {
      value: (url, options, callback) => {
        const args = callback !== void 0 ? [url, options, callback] : options !== void 0 ? [url, options] : [url];
        return wrapRequest(
          originalHttpsRequest,
          args,
          "https:"
        );
      },
      writable: true,
      configurable: true
    });
  }
  logConsole(payload) {
    const enriched = { ...payload, timestamp: Date.now() };
    this.consoleBuffer.push(enriched);
    if (this.consoleBuffer.length > this.bufferLimit) {
      this.consoleBuffer.shift();
    }
    this.emit("console", enriched);
  }
};
function setupFileLogging(capture, config, customPath) {
  const logFile = customPath || (config.storage ? path.join(
    config.storage.getProjectTempLogsDir(),
    `session-${config.getSessionId()}.jsonl`
  ) : null);
  if (!logFile) return;
  const logsDir = path.dirname(logFile);
  if (!fs.existsSync(logsDir)) {
    fs.mkdirSync(logsDir, { recursive: true });
  }
  const writeToLog = (type, payload) => {
    try {
      const entry = JSON.stringify({
        type,
        payload,
        sessionId: config.getSessionId(),
        timestamp: Date.now()
      }) + "\n";
      fs.promises.appendFile(logFile, entry).catch((err) => {
        debugLogger.error("Failed to write to activity log:", err);
      });
    } catch (err) {
      debugLogger.error("Failed to prepare activity log entry:", err);
    }
  };
  capture.on("console", (payload) => writeToLog("console", payload));
  capture.on("network", (payload) => writeToLog("network", payload));
}
function setupNetworkLogging(capture, host, port, config, onReconnectFailed) {
  const transportBuffer = [];
  let ws = null;
  let reconnectTimer = null;
  let sessionId = null;
  let pingInterval = null;
  let reconnectAttempts = 0;
  const MAX_RECONNECT_ATTEMPTS = 2;
  const connect = () => {
    try {
      ws = new wrapper_default(`ws://${host}:${port}/ws`);
      ws.on("open", () => {
        debugLogger.debug(`WebSocket connected to ${host}:${port}`);
        reconnectAttempts = 0;
        sendMessage({
          type: "register",
          sessionId: config.getSessionId(),
          timestamp: Date.now()
        });
      });
      ws.on("message", (data) => {
        try {
          const parsed = JSON.parse(data.toString());
          if (typeof parsed === "object" && parsed !== null && "type" in parsed && typeof parsed.type === "string") {
            handleServerMessage({
              type: parsed.type,
              sessionId: "sessionId" in parsed && typeof parsed.sessionId === "string" ? parsed.sessionId : void 0
            });
          }
        } catch (err) {
          debugLogger.debug("Invalid WebSocket message:", err);
        }
      });
      ws.on("close", () => {
        debugLogger.debug(`WebSocket disconnected from ${host}:${port}`);
        cleanup();
        scheduleReconnect();
      });
      ws.on("error", (err) => {
        debugLogger.debug(`WebSocket error:`, err);
      });
    } catch (err) {
      debugLogger.debug(`Failed to connect WebSocket:`, err);
      scheduleReconnect();
    }
  };
  const handleServerMessage = (message) => {
    switch (message.type) {
      case "registered":
        sessionId = message.sessionId || null;
        debugLogger.debug(`WebSocket session registered: ${sessionId}`);
        if (pingInterval) clearInterval(pingInterval);
        pingInterval = setInterval(() => {
          sendMessage({ type: "pong", timestamp: Date.now() });
        }, 15e3);
        flushBuffer();
        break;
      case "trigger-debugger": {
        import("node:inspector").then((inspector) => {
          inspector.open();
          debugLogger.log(
            "Node debugger attached. Open chrome://inspect in Chrome to start debugging."
          );
          return import("./events-XB7DADIJ.js");
        }).then(({ appEvents, AppEvent, TransientMessageType }) => {
          appEvents.emit(AppEvent.TransientMessage, {
            message: "Debugger attached from DevTools.",
            type: TransientMessageType.Hint
          });
        }).catch(
          (err) => debugLogger.debug("Failed to trigger debugger:", err)
        );
        break;
      }
      case "ping":
        sendMessage({ type: "pong", timestamp: Date.now() });
        break;
      default:
        break;
    }
  };
  const sendMessage = (message) => {
    if (ws && ws.readyState === wrapper_default.OPEN) {
      ws.send(JSON.stringify(message));
    }
  };
  const sendToNetwork = (type, payload) => {
    const message = {
      type,
      payload,
      sessionId: sessionId || config.getSessionId(),
      timestamp: Date.now()
    };
    if (!ws || ws.readyState !== wrapper_default.OPEN || !capture.isNetworkLoggingEnabled()) {
      transportBuffer.push(message);
      if (transportBuffer.length > MAX_BUFFER_SIZE) transportBuffer.shift();
      return;
    }
    sendMessage(message);
  };
  const flushBuffer = () => {
    if (!ws || ws.readyState !== wrapper_default.OPEN || !capture.isNetworkLoggingEnabled()) {
      return;
    }
    const { network, console: consoleLogs } = capture.drainBufferedLogs();
    const allInitialLogs = [
      ...network.map((l) => ({
        type: "network",
        payload: l,
        timestamp: "timestamp" in l && l.timestamp ? l.timestamp : Date.now()
      })),
      ...consoleLogs.map((l) => ({
        type: "console",
        payload: l,
        timestamp: l.timestamp
      }))
    ].sort((a, b) => a.timestamp - b.timestamp);
    debugLogger.debug(
      `Flushing ${allInitialLogs.length} initial buffered logs and ${transportBuffer.length} transport buffered logs...`
    );
    for (const log of allInitialLogs) {
      sendMessage({
        type: log.type,
        payload: log.payload,
        sessionId: sessionId || config.getSessionId(),
        timestamp: Date.now()
      });
    }
    while (transportBuffer.length > 0) {
      const message = transportBuffer.shift();
      sendMessage(message);
    }
  };
  const cleanup = () => {
    if (pingInterval) {
      clearInterval(pingInterval);
      pingInterval = null;
    }
    ws = null;
  };
  const scheduleReconnect = () => {
    if (reconnectTimer) return;
    reconnectAttempts++;
    if (reconnectAttempts > MAX_RECONNECT_ATTEMPTS && onReconnectFailed) {
      debugLogger.debug(
        `WebSocket reconnect failed after ${MAX_RECONNECT_ATTEMPTS} attempts, promoting to server...`
      );
      onReconnectFailed();
      return;
    }
    reconnectTimer = setTimeout(() => {
      reconnectTimer = null;
      debugLogger.debug("Reconnecting WebSocket...");
      connect();
    }, 1e3);
  };
  connect();
  capture.on("console", (payload) => sendToNetwork("console", payload));
  capture.on("network", (payload) => sendToNetwork("network", payload));
  capture.on("network-logging-enabled", () => {
    debugLogger.debug("Network logging enabled, flushing buffer...");
    flushBuffer();
  });
  process.on("exit", () => {
    if (reconnectTimer) clearTimeout(reconnectTimer);
    if (ws) ws.close();
    cleanup();
  });
}
var bridgeAttached = false;
function bridgeCoreEvents(capture) {
  if (bridgeAttached) return;
  bridgeAttached = true;
  coreEvents.on(CoreEvent.ConsoleLog, (payload) => {
    capture.logConsole(payload);
  });
}
function initActivityLogger(config, options) {
  const capture = ActivityLogger.getInstance();
  capture.enable();
  if (options.mode === "network") {
    setupNetworkLogging(
      capture,
      options.host,
      options.port,
      config,
      options.onReconnectFailed
    );
    capture.enableNetworkLogging();
  } else if (options.mode === "file") {
    setupFileLogging(capture, config, options.filePath);
  }
  bridgeCoreEvents(capture);
}
function addNetworkTransport(config, host, port, onReconnectFailed) {
  const capture = ActivityLogger.getInstance();
  setupNetworkLogging(capture, host, port, config, onReconnectFailed);
}

// packages/cli/src/utils/devtoolsService.ts
var DEFAULT_DEVTOOLS_PORT = 25417;
var DEFAULT_DEVTOOLS_HOST = "127.0.0.1";
var MAX_PROMOTION_ATTEMPTS = 3;
var promotionAttempts = 0;
var serverStartPromise = null;
var connectedUrl = null;
function probeDevTools(host, port) {
  return new Promise((resolve) => {
    const ws = new wrapper_default(`ws://${host}:${port}/ws`);
    const timer = setTimeout(() => {
      ws.close();
      resolve(false);
    }, 500);
    ws.on("open", () => {
      clearTimeout(timer);
      ws.close();
      resolve(true);
    });
    ws.on("error", () => {
      clearTimeout(timer);
      ws.close();
      resolve(false);
    });
  });
}
async function startOrJoinDevTools(defaultHost, defaultPort) {
  const mod = await import("@google/gemini-cli-devtools");
  const devtools = mod.DevTools.getInstance();
  const url = await devtools.start();
  const actualPort = devtools.getPort();
  if (actualPort === defaultPort) {
    debugLogger.log(`DevTools available at: ${url}`);
    return { host: defaultHost, port: actualPort };
  }
  const winnerAlive = await probeDevTools(defaultHost, defaultPort);
  if (winnerAlive) {
    await devtools.stop();
    debugLogger.log(
      `DevTools (existing) at: http://${defaultHost}:${defaultPort}`
    );
    return { host: defaultHost, port: defaultPort };
  }
  debugLogger.log(`DevTools available at: ${url}`);
  return { host: defaultHost, port: actualPort };
}
async function handlePromotion(config) {
  promotionAttempts++;
  if (promotionAttempts > MAX_PROMOTION_ATTEMPTS) {
    debugLogger.debug(
      `Giving up on DevTools promotion after ${MAX_PROMOTION_ATTEMPTS} attempts`
    );
    return;
  }
  try {
    const result = await startOrJoinDevTools(
      DEFAULT_DEVTOOLS_HOST,
      DEFAULT_DEVTOOLS_PORT
    );
    addNetworkTransport(
      config,
      result.host,
      result.port,
      () => handlePromotion(config)
    );
  } catch (err) {
    debugLogger.debug("Failed to promote to DevTools server:", err);
  }
}
function setupInitialActivityLogger(config) {
  const target = process.env["GEMINI_CLI_ACTIVITY_LOG_TARGET"];
  if (target) {
    if (!config.storage) return;
    initActivityLogger(config, { mode: "file", filePath: target });
  } else {
    initActivityLogger(config, { mode: "buffer" });
  }
}
function startDevToolsServer(config) {
  if (connectedUrl) return Promise.resolve(connectedUrl);
  if (serverStartPromise) return serverStartPromise;
  serverStartPromise = startDevToolsServerImpl(config).catch((err) => {
    serverStartPromise = null;
    throw err;
  });
  return serverStartPromise;
}
async function startDevToolsServerImpl(config) {
  const onReconnectFailed = () => handlePromotion(config);
  const existing = await probeDevTools(
    DEFAULT_DEVTOOLS_HOST,
    DEFAULT_DEVTOOLS_PORT
  );
  let host = DEFAULT_DEVTOOLS_HOST;
  let port = DEFAULT_DEVTOOLS_PORT;
  if (existing) {
    debugLogger.log(
      `DevTools (existing) at: http://${DEFAULT_DEVTOOLS_HOST}:${DEFAULT_DEVTOOLS_PORT}`
    );
  } else {
    try {
      const result = await startOrJoinDevTools(
        DEFAULT_DEVTOOLS_HOST,
        DEFAULT_DEVTOOLS_PORT
      );
      host = result.host;
      port = result.port;
    } catch (err) {
      debugLogger.debug("Failed to start DevTools:", err);
      throw err;
    }
  }
  addNetworkTransport(config, host, port, onReconnectFailed);
  const capture = ActivityLogger.getInstance();
  capture.enableNetworkLogging();
  const url = `http://localhost:${port}`;
  connectedUrl = url;
  return url;
}
async function toggleDevToolsPanel(config, isOpen, toggle, setOpen) {
  if (isOpen) {
    toggle();
    return;
  }
  try {
    const { openBrowserSecurely, shouldLaunchBrowser } = await import("./dist-BDJKFMK4.js");
    const url = await startDevToolsServer(config);
    if (shouldLaunchBrowser()) {
      try {
        await openBrowserSecurely(url);
        return;
      } catch (e) {
        debugLogger.warn("Failed to open browser securely:", e);
      }
    }
    setOpen();
  } catch (e) {
    setOpen();
    debugLogger.error("Failed to start DevTools server:", e);
  }
}
function resetForTesting() {
  promotionAttempts = 0;
  serverStartPromise = null;
  connectedUrl = null;
}
export {
  resetForTesting,
  setupInitialActivityLogger,
  startDevToolsServer,
  toggleDevToolsPanel
};
/**
 * @license
 * Copyright 2025 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

Youez - 2016 - github.com/yon3zu
LinuXploit