{"record":{"id":"c7aed395fe1f008b","repo":"jackwener/OpenCLI","slug":"chatgpt-project-requires-a-logged-in-chatgpt-sessi","errorCode":null,"errorMessage":"ChatGPT project requires a logged-in ChatGPT session.","messagePattern":"ChatGPT project requires a logged-in ChatGPT session\\.","errorType":"exception","errorClass":"AuthRequiredError","httpStatus":null,"severity":"error","filePath":"clis/chatgpt/utils.js","lineNumber":2943,"sourceCode":"    '[data-testid*=\"project-files\"] input[type=\"file\"]',\n    '[data-testid*=\"project\"] input[type=\"file\"]',\n];\n\n/**\n * Navigate to a ChatGPT project page.\n */\nexport async function navigateToProject(page, projectId) {\n    const id = parseChatGPTProjectId(projectId);\n    await page.goto(`${CHATGPT_URL}/g/g-p-${id}`, { settleMs: 2000 });\n    try {\n        await page.wait({ selector: COMPOSER_WAIT_SELECTOR, timeout: 10 });\n    } catch {\n        // Composer may not mount if project requires login; downstream ensureChatGPTLogin handles it.\n    }\n    const state = await getPageState(page);\n    if (projectIdFromUrl(state.url) === id) return id;\n    if (state.hasLoginGate || !state.isLoggedIn) {\n        throw new AuthRequiredError(CHATGPT_DOMAIN, 'ChatGPT project requires a logged-in ChatGPT session.');\n    }\n    throw new CommandExecutionError(\n        `ChatGPT did not open the requested project ${id}.`,\n        `Current URL: ${state.url || '(unknown)'}`,\n    );\n}\n\n/**\n * Open the Project knowledge files dialog by clicking the \"Add files\" button\n * in the project header area (NOT the chat composer's plus button).\n * Returns true if the dialog appeared.\n */\nexport async function openProjectKnowledgeDialog(page) {\n    const rawOpenResult = unwrapEvaluateResult(await page.evaluate(`\n        (() => {\n            const labels = ${JSON.stringify(PROJECT_ADD_FILES_LABELS)};\n            const isVisible = (el) => {\n                if (!(el instanceof HTMLElement)) return false;","sourceCodeStart":2925,"sourceCodeEnd":2961,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/chatgpt/utils.js#L2925-L2961","documentation":"AuthRequiredError thrown while opening a ChatGPT project: the page state shows a login gate or a logged-out session, so the library cannot proceed and demands a logged-in session for the target ChatGPT domain.","triggerScenarios":"openChatGPTProject/verify flow called getPageState after loading the project, and state.hasLoginGate is true or state.isLoggedIn is false — the browser session has no valid ChatGPT auth cookies.","commonSituations":"Session expired between runs; running headless with a fresh profile that was never logged in; cookies cleared or ChatGPT logged the device out; project features requiring a plan the anonymous session lacks.","solutions":["Run the library's login flow (ensureChatGPTLogin) or log into ChatGPT in the automation browser profile, then retry","Persist a logged-in profile/storage state so sessions survive restarts","Check that the correct domain/profile is used (CHATGPT_DOMAIN) and cookies are not isolated per context","Re-check plan/entitlements if login succeeds but projects remain gated"],"exampleFix":"// before\nawait openChatGPTProject(page, projectId);\n// after\nawait ensureChatGPTLogin(page, CHATGPT_DOMAIN);\nawait openChatGPTProject(page, projectId);","handlingStrategy":"try-catch","validationCode":"const state = await getPageState(page);\nif (state.hasLoginGate || !state.isLoggedIn) {\n  await ensureChatGPTLogin(page, CHATGPT_DOMAIN);\n}","typeGuard":"function isLoggedIn(state) { return !!state && state.isLoggedIn === true && !state.hasLoginGate; }","tryCatchPattern":"try {\n  await openChatGPTProject(page, projectId);\n} catch (e) {\n  if (e instanceof AuthRequiredError) {\n    await ensureChatGPTLogin(page, CHATGPT_DOMAIN);\n    await openChatGPTProject(page, projectId);\n  } else throw e;\n}","preventionTips":["Persist a logged-in browser profile/storage state across runs","Call ensureChatGPTLogin at workflow start instead of per-operation","Monitor session expiry and refresh cookies proactively in long-running jobs"],"tags":["auth","chatgpt","login-required","session"],"backgroundTag":"auth-required","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}