Improve property limit widgets with proper enum/boolean support and fix FixedValue type mismatch
<p>[Tracker]<br> <strong>Update Summary: </strong>[One-line status update for stakeholders]<br> <strong>Short Description: </strong>Added a new <code>PropertyLimitWidgetHelper</code> class with shared enum/boolean detection, widget building, value extraction, and type casting logic. Refactored <code>ToolsExplorer</code> to use it.<br> <strong>Check-in Date: </strong>MM/DD/YYYY<br> [/Tracker]</p><h3 id="summary-problem-motivation">Problem/Motivation</h3> <ul> <li>The Tools Explorer rendered a plain <code>&lt;textarea&gt;</code> for every property's "Values" field, even for properties with known enum constraints or boolean type — users had to type valid option strings manually.</li> <li>Enum detection + widget building was duplicated across <code>ToolsExplorer</code>, and other modules like <code>AI Agents</code> with minor variations.</li> <li>Most of consumers classes are <code>final</code>, making them impossible to unit test via mocking.</li> <li>Boolean properties with "Force value" caused validation error "The value must be 1" — form widgets return string <code>"1"</code> but <code>BooleanData</code> stores native <code>TRUE</code>, so the <code>FixedValue</code> constraint comparison <code>TRUE !== "1"</code> always failed.</li> <li>When the property field was left empty but a forced value was configured, the forced value was never applied to the function call context.</li> </ul> <h4 id="summary-steps-reproduce">Steps to reproduce</h4> <ol> <li>Go to <code>/admin/config/ai/explorers/tools_explorer</code>.</li> <li>Select a tool that has a Boolean property.</li> <li>Under Limits, set the action to "Force value" and enter <code>1</code> (or select True).</li> <li>Leave the property input field empty (relying on the forced value).</li> <li>Submit the form.</li> <li><strong>Expected:</strong> The tool executes with <code>[BOOLEAN_FIELD] = TRUE</code>.</li> <li><strong>Actual:</strong> Validation error: "Input [BOOLEAN_FIELD]: The value must be 1" — because <code>BooleanData</code> stores <code>TRUE</code> (boolean) but the <code>FixedValue</code> constraint compares against <code>"1"</code> (string). Additionally, the forced value is never applied when the property field is left empty.</li> </ol> <h3 id="summary-proposed-resolution">Proposed resolution</h3> Extracted shared enum/boolean detection, widget building, and value extraction logic into a new <code>PropertyLimitWidgetHelper</code> class. Refactored all three consumers to use it. <h3 id="summary-ai-usage">AI usage (if applicable)</h3> <p>[x] AI Assisted Issue<br> This issue was generated with AI assistance, but was reviewed and refined by the creator.</p> <p>[ ] AI Assisted Code<br> [x] AI Generated Code<br> [ ] Vibe Coded</p> <p>- <strong>This issue was created with the help of AI</strong></p>
task