Migrate the ECA agent to the Tools + ReAct architecture (create-only)
### Problem/Motivation
The ECA agent in the `agents` submodule (`Drupal\ai_integration_eca_agents\Plugin\AiAgent\Eca`) is still built on the **legacy `AiAgentBase` architecture**: a PHP plugin with the `#[AiAgent]` attribute that hand-rolls its own control flow and calls three YAML sub-prompts through `runSubAgent()`:
- `prompts/eca/determineTask.yml` — triage step that classifies the request as `create` / `edit` / `info` / `fail`.
- `prompts/eca/buildModel.yml` — builds the ECA model JSON (create or edit).
- `prompts/eca/answerQuestion.yml` — answers questions about existing models / components.
`runSubAgent()` is **deprecated** in ai_agents (removed when ai_agents drops the old sub-agent flow — see [ai_agents#3546513](https://git.drupalcode.org/project/ai_agents/-/work_items/3546513)). The current ai_agents releases (the module already requires `drupal/ai_agents: ^1.2`) replace that hand-rolled flow with:
- **`AiFunctionCall` tool plugins** — base `Drupal\ai\Base\FunctionCallBase` + the `#[FunctionCall]` attribute, living in `src/Plugin/AiFunctionCall/`, with parameters declared via `context_definitions`; and
- **config-entity agents** (`ai_agents.ai_agent.*.yml`) executed by the **ReAct loop** in `AiAgentEntityWrapper`, which lets the LLM pick and call tools itself, governed by `max_loops`, `default_information_tools`, `tool_settings` and `tool_usage_limits`.
We should bring the ECA agent onto this architecture so it keeps working past the `runSubAgent()` removal and benefits from the shared ReAct runner, tool permissioning and structured-output handling.
### Proposed resolution
Re-implement the ECA agent as a **config-entity agent plus a set of `AiFunctionCall` tools**, replicating the existing workflows **1-to-1**. Scope this first pass to **creating** ECA models only — **editing existing models is explicitly out of scope** for now (the `edit` branch of the old `determineTask` / `buildModel` is not ported yet).
With the ReAct loop the hand-written triage disappears: the agent's `system_prompt` plus the tool set drive which tools get called, so `determineTask` is no longer a separate step. `answerQuestion` becomes "the agent reads the information tools and answers within the loop", and the create path of `buildModel` becomes a single action tool.
**Tools to add** (`modules/agents/src/Plugin/AiFunctionCall/`), wrapping the existing services so behaviour stays identical:
1. **List models** — summary of existing ECA models. Wraps `DataProvider::getModels()`. (information tool, suitable for `default_information_tools`)
2. **List components** — available events / conditions / actions. Wraps `DataProvider::getComponents()`. (information tool)
3. **Get component details** — details for specific component IDs. Wraps `DataProvider::getComponents($ids)`.
4. **Get model JSON Schema** — the ECA model schema the LLM must follow. Wraps `EcaModelDefinition` + the `Eca` schema serialized through the `schema_json:json` serializer.
5. **Create ECA model** — the action tool. Takes the generated model JSON and calls `EcaRepository::build($modelData, TRUE)` to persist a **new** model. It must **not** accept an existing model id, enforcing create-only.
**Agent config entity** (`modules/agents/config/install/ai_agents.ai_agent.eca.yml`):
- `system_prompt` carrying over the guidance from `determineTask.yml` / `buildModel.yml` (the "you are a Drupal developer building ECA config" framing, the component-id rules, schema adherence, "do not invent IDs").
- `tools`: the five tools above.
- `default_information_tools`: pre-load the model + component summaries, mirroring how the old agent always fed `getModels()` / `getComponents()` into its prompts.
- `max_loops`, `tool_settings` (e.g. `return_directly` on the create tool), and `tool_usage_limits` to forbid editing an existing model.
### Remaining tasks
- Add the five `AiFunctionCall` tool plugins wrapping `DataProvider`, `EcaRepository`, and `EcaModelDefinition` / schema serialization.
- Add the `ai_agents.ai_agent.eca` config entity with the system prompt and tool list.
- Port the prompt text from the three YAML files into the system prompt / tool descriptions.
- Decide the fate of the old `Eca` plugin and `prompts/eca/*.yml` — keep temporarily for BC, or remove.
- Port / extend the kernel tests (the `ModelMapper`, `EcaRepository` and schema tests still apply; add coverage for the create tool and the agent run).
- Update `docs/modules/agents/`.
### Out of scope (follow-up issues)
- **Editing** existing ECA models (port the `edit` path plus an "update model" tool).
- Deleting models.
### User interface changes
The agent stays reachable the same way (the Ask-AI form / the `TriggerAgent` action). Behaviour is 1-to-1 for creation; the "edit an existing model" path is temporarily unavailable until the follow-up.
### API changes
- New `AiFunctionCall` plugins and a new `ai_agent` config entity.
- The legacy `#[AiAgent]`-based `Eca` plugin and its `runSubAgent` prompts are superseded; removal timing aligns with ai_agents dropping `runSubAgent`.
issue