{"record":{"id":"6aeeed9bf0a5aa06","repo":"jackwener/OpenCLI","slug":"midjourney-manual-video-composer-did-not-expose-th","errorCode":null,"errorMessage":"Midjourney manual video composer did not expose the End Frame picker","messagePattern":"Midjourney manual video composer did not expose the End Frame picker","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/midjourney/utils.js","lineNumber":1159,"sourceCode":"}\n\nasync function openEndFramePicker(page) {\n  const marked = unwrapEvaluateResult(await page.evaluate(() => {\n    document.querySelectorAll('[data-opencli-end-frame-picker]').forEach((node) => {\n      node.removeAttribute('data-opencli-end-frame-picker');\n    });\n    const label = [...document.querySelectorAll('div')]\n      .find((node) => node.children.length === 0 && node.textContent?.trim() === 'End Frame');\n    let target = label;\n    for (let depth = 0; depth < 7 && target; depth += 1, target = target.parentElement) {\n      if (String(target.className).includes('cursor-pointer')) {\n        target.setAttribute('data-opencli-end-frame-picker', '1');\n        return true;\n      }\n    }\n    return false;\n  }));\n  if (!marked) throw new CommandExecutionError('Midjourney manual video composer did not expose the End Frame picker');\n  await page.click('[data-opencli-end-frame-picker=\"1\"]');\n  await page.wait({ selector: 'input[type=\"file\"][accept*=\"image\"]', timeout: 10 });\n}\n\nexport async function uploadReferencesToSlot(page, localPaths, slot) {\n  if (!localPaths.length) return [];\n  if (slot === 'end') await openEndFramePicker(page);\n  const selected = await uploadReferenceLibrary(page, localPaths);\n\n  // Uploading while the persistent composer retained a video state can leave\n  // the library open beside Start/End Frame slots. Reassert image mode before\n  // assigning image-generation references; End Frame intentionally stays in\n  // the manual video composer.\n  if (slot !== 'end') {\n    await ensureImageComposer(page);\n    await openImagePanel(page);\n  }\n","sourceCodeStart":1141,"sourceCodeEnd":1177,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/midjourney/utils.js#L1141-L1177","documentation":"Thrown when the End Frame picker in the manual video composer cannot be found/marked by the in-page evaluate. If no candidate element matching the End Frame picker criteria exists, marked stays false and this CommandExecutionError is raised.","triggerScenarios":"Calling openEndFramePicker when the manual video composer is not open, the End Frame control is behind a collapsed panel, or Midjourney changed the composer markup.","commonSituations":"Working on a non-video prompt (End Frame only exists for video); UI A/B changes removed/renamed the picker; the composer scrolled such that the control is unmounted; user not in the manual composer mode.","solutions":["Confirm the prompt is a video generation and the manual video composer is open.","Expand/scroll all composer panels before opening the End Frame picker.","Update the picker-matching heuristics in the evaluate to match current DOM.","Reload the page and re-enter the composer."],"exampleFix":"// before\nif (!marked) throw new CommandExecutionError('Midjourney manual video composer did not expose the End Frame picker');\n// after\nif (!marked) {\n  await openImagePanel(page);\n  await page.wait(1);\n  throw new CommandExecutionError('Midjourney manual video composer did not expose the End Frame picker');\n}","handlingStrategy":"validation","validationCode":"const composerOpen = await page.evaluate(() => !!document.querySelector('[class*=\"composer\"], [data-testid*=\"composer\"]'));\nif (!composerOpen) throw new Error('Manual video composer is not open');","typeGuard":null,"tryCatchPattern":"try {\n  await openEndFramePicker(page);\n} catch (err) {\n  if (String(err.message).includes('End Frame picker')) {\n    await page.reload();\n    await openEndFramePicker(page);\n  } else throw err;\n}","preventionTips":["Only use End Frame for video prompts","Expand all composer panels first","Update selectors after Midjourney UI changes","Verify the picker exists before clicking"],"tags":["midjourney","ui","video","dom"],"backgroundTag":"ui-control-not-found","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}