Add optional prompt to ImageToVideoInput and clean up the class
<!-- Please search existing work items before filing to avoid duplicates. --> ## Description The <code>image_to_video</code> operation type cannot carry a text prompt. <code>ImageToVideoInput</code> exposes only the source. <ul> <li>Classic image-to-video models (Stable Video Diffusion) animate a still image with no prompt — the image-only contract is fine for them.</li> <li>Modern prompt-guided models (CogVideoX-I2V, LTX-Video, Kling, Runway Gen-3) require a prompt to direct the motion. There is currently no way for a caller or provider to pass one.</li> </ul> This is inconsistent with <code>ImageToImageInput</code>, which already has <code>getPrompt()</code>/<code>setPrompt()</code>. Also, the operation types show a lot of audio-to-audio input copied texts. ## Tasks <ul> <li>Added an optional <code>prompt</code> to <code>ImageToVideoInput</code>, mirroring <code>ImageToImageInput</code>: a nullable <code>$prompt</code> property defaulting to <code>NULL</code>, with <code>getPrompt(): ?string</code> and <code>setPrompt(?string): void</code>.</li> <li>Included the prompt in <code>toArray()</code>.</li> <li><strong>Backward compatible:</strong> the constructor signature is unchanged (<code>__construct(ImageFile $file)</code>), so existing callers — <code>ai_integration_eca</code>'s <code>ImageToVideo</code> action and the existing unit test — keep working, and image-only models are unaffected (prompt stays <code>NULL</code>).</li> <li>Extended <code>ImageToVideoInputTest</code> with a <code>testPrompt()</code> case covering the NULL default, set/get, the <code>toArray()</code> value, and unsetting back to NULL.</li> </ul> ## Acceptance criteria <!-- Define what "done" looks like. Each criterion should be independently verifiable. Example: - Site builders can configure X via the UI without writing code. - Existing behavior is unchanged when the new setting is left at its default. --> ## Testing instructions *(added by implementor before review)* <ol> <li>Construct the input and set a prompt:<br><code>$input = new ImageToVideoInput($imageFile); $input->setPrompt('a cat playing the piano');</code></li> <li>Confirm <code>$input->getPrompt()</code> returns the prompt and <code>$input->toArray()['prompt']</code> matches.</li> <li>Confirm existing image-only flows still work: <code>(new ImageToVideoInput($imageFile))->getPrompt()</code> returns <code>NULL</code>.</li> </ol> ## Related issues *(optional)* <!-- Link issues this task relates to, blocks, or is blocked by using GitLab quick actions: /relate #<issue> — mark as related (bidirectional) /blocks #<issue> — mark that this task blocks another issue /blocked_by #<issue> — mark that this task is blocked by another issue /assign me — claim this task if you are starting work on it --> <!-- If this issue description was significantly AI-generated (entire sections, not autocomplete), please note it in a comment below. See https://www.drupal.org/docs/develop/issues/issue-procedures-and-etiquette/policy-on-the-use-of-ai-when-contributing-to-drupal --> <!-- Component — uncomment the line(s) that apply (remove the surrounding comment markers):--> <!-- /label ~"aiCoreModule" --> <!-- /label ~"aiAgent" --> <!-- /label ~"aiApiExplorer" --> <!-- /label ~"aiAssistantsApi" --> <!-- /label ~"aiAutomators" --> <!-- /label ~"aiChatbot" --> <!-- /label ~"aiCkeditor" --> <!-- /label ~"aiContentSuggestions" --> <!-- /label ~"aiEca" --> <!-- /label ~"aiExternalModeration" --> <!-- /label ~"aiLogging" --> <!-- /label ~"aiObservability" --> <!-- /label ~"aiSearch" --> <!-- /label ~"aiTest" --> <!-- /label ~"aiTranslate" -->
task