Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Fetch any URL via Chrome CDP and convert the rendered page to clean markdown with YouTube transcript support.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/lib/adapters/x/login.ts
1import type { AdapterContext, AdapterLoginInfo, AdapterProcessResult } from "../types";23interface XLoginSnapshot {4currentUrl: string;5hasAccountMenu: boolean;6hasLoginInputs: boolean;7bodyText: string;8}910export async function detectXLogin(context: AdapterContext): Promise<AdapterLoginInfo> {11const snapshot = await context.browser.evaluate<XLoginSnapshot>(`12(() => {13const bodyText = (document.body?.innerText ?? "").slice(0, 2500);14return {15currentUrl: window.location.href,16hasAccountMenu: Boolean(17document.querySelector(18'[data-testid="SideNav_AccountSwitcher_Button"], [data-testid="AppTabBar_Profile_Link"], [aria-label="Account menu"]'19)20),21hasLoginInputs: Boolean(22document.querySelector(23'input[name="text"], input[name="password"], input[autocomplete="username"], input[autocomplete="current-password"]'24)25),26bodyText,27};28})()29`).catch(async () => ({30currentUrl: await context.browser.getURL().catch(() => context.input.url.toString()),31hasAccountMenu: false,32hasLoginInputs: false,33bodyText: "",34}));3536if (37/\/i\/flow\/login|\/login/i.test(snapshot.currentUrl) ||38snapshot.hasLoginInputs ||39/sign in to x|join x today|登录 x|注册 x|登录到 x/i.test(snapshot.bodyText)40) {41return {42provider: "x",43state: "logged_out",44required: true,45reason: "X login page detected",46};47}4849if (snapshot.hasAccountMenu) {50return {51provider: "x",52state: "logged_in",53};54}5556return {57provider: "x",58state: "unknown",59};60}6162export function buildNeedsLoginResult(login: AdapterLoginInfo): AdapterProcessResult {63return {64status: "needs_interaction",65login: {66...login,67provider: "x",68state: login.state === "logged_in" ? "unknown" : login.state,69required: true,70},71interaction: {72type: "wait_for_interaction",73kind: "login",74provider: "x",75reason: login.reason,76prompt: "Please sign in to X in the opened Chrome window. Extraction will continue automatically once login is detected.",77requiresVisibleBrowser: true,78},79};80}81