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><textarea></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