{"record":{"id":"2d36c936c525cb27","repo":"jackwener/OpenCLI","slug":"label-returned-malformed-extraction-payload","errorCode":null,"errorMessage":"${label} returned malformed extraction payload","messagePattern":"(.+?) returned malformed extraction payload","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/chatgpt/utils.js","lineNumber":209,"sourceCode":"// weibo (#1568).\n//\n// `unwrapEvaluateResult` is a defensive ternary: it unwraps when the payload\n// looks like an envelope, otherwise passes the value through unchanged so\n// older bridge versions and primitive return values still work.\n// ─────────────────────────────────────────────────────────────────────────────\nexport function unwrapEvaluateResult(payload) {\n    if (payload && !Array.isArray(payload) && typeof payload === 'object' && 'session' in payload && 'data' in payload) {\n        return payload.data;\n    }\n    return payload;\n}\n\nexport function requireArrayEvaluateResult(payload, label) {\n    if (!Array.isArray(payload)) {\n        if (payload && typeof payload === 'object' && 'error' in payload) {\n            throw new CommandExecutionError(`${label}: ${String(payload.error)}`);\n        }\n        throw new CommandExecutionError(`${label} returned malformed extraction payload`);\n    }\n    return payload;\n}\n\nexport function requireObjectEvaluateResult(payload, label) {\n    if (!payload || Array.isArray(payload) || typeof payload !== 'object') {\n        throw new CommandExecutionError(`${label} returned malformed extraction payload`);\n    }\n    return payload;\n}\n\nexport function requireBooleanEvaluateResult(payload, label) {\n    if (typeof payload !== 'boolean') {\n        throw new CommandExecutionError(`${label} returned malformed extraction payload`);\n    }\n    return payload;\n}\n","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/chatgpt/utils.js#L191-L227","documentation":"The fallback branch of requireArrayEvaluateResult: when a page.evaluate payload is not an array AND does not carry an {error} envelope, a CommandExecutionError with '<label> returned malformed extraction payload' is thrown. It signals the injected script's contract was violated by the page context.","triggerScenarios":"page.evaluate returns null/undefined (script returned nothing), a scalar, or an object without an 'error' key where an array of items was expected.","commonSituations":"Navigating mid-extraction so the evaluate context is destroyed or returns undefined, ChatGPT DOM changes, or running against a non-chatgpt page/blank tab.","solutions":["Ensure the browser is on a fully loaded chatgpt.com page before running extraction commands","Retry — transient navigation/render races commonly return undefined","Log the actual payload (enable debug output) to see what shape came back","Update opencli if ChatGPT's markup changed"],"exampleFix":"// before\nconst urls = await getChatGPTImageAssets(page); // page still loading -> undefined\n// after\nawait page.waitForFunction(() => document.querySelectorAll('img').length > 0);\nconst urls = await getChatGPTImageAssets(page);","handlingStrategy":"retry","validationCode":null,"typeGuard":"function isArrayEvaluatePayload(p) { return Array.isArray(p); }","tryCatchPattern":"try { items = await getChatGPTImageAssets(page); } catch (e) { if (e instanceof CommandExecutionError && e.message.includes('malformed')) { await page.waitForTimeout(2000); items = await getChatGPTImageAssets(page); } else throw e; }","preventionTips":["Avoid navigating while extraction runs","Wait for load/networkidle before extracting","Log payloads in debug mode to spot undefined returns","Confirm you are not on a blank tab"],"tags":["browser-automation","page-evaluate","extraction"],"backgroundTag":"malformed-extraction-payload","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}