# Prompt log — 24h 2026-07-15 ======================================================================== ## [1] summariseModule:ai:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI (Artificial Intelligence) (machine name: ai) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhinav Jha (ajabhinavjha30), Abhishek Dhariwal (adaptative), Ahmad Khader (Ahmad-Khader) [3], Ann Mary Sruthy (annmarysruthy), Artem Dmitriiev (a.dmitriiev), Avinash jha (avinash.jha) [1], Bharat Kelotra (bharatkelotra), Billy Davies (billy.davies), codebymikey, Joshua Fernandes (joshua1234511), Levente Besenyei (LeventeB) [1], Marcus Johansson (Marcus_Johansson) [2], Prabhavathi Vanipenta (prabha1997) [1], Ricardo Castañeda (cadence96), Ryan Szrama (rszrama), Shubham Prakash (shubham.prakash) [1], Thomas Werthmüller (weri) [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

AI (Artificial Intelligence)

then use

,

,

    /
  • , and as needed. Output only the HTML fragment with no surrounding , , or
    tags. After the project summary prose, add a single subsection titled "

    How can I help on this project?

    " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Create an HTML to Markdown API and service](https://git.drupalcode.org/project/ai/-/work_items/3574246) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1747 [Use service for html to markdown convertion + markdownify integration](https://git.drupalcode.org/project/ai/-/merge_requests/1747) | State: opened | Author: Artem Dmitriiev (a.dmitriiev), 1445 diff lines Description: >>> [!note] Migrated issue Reported by: [mxr576](https://www.drupal.org/user/315522) >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation League\HTMLToMarkdown\HtmlConverter is initiated 3 times with 3 different configurations in current code, when #3574004: Generate a markdown version of (formatted) text field values gets solved that becomes the 4th one. https://git.drupalcode.org/search… ### [Integrate ChatProcessor plugin system into AI Chatbot DeepChat block](https://git.drupalcode.org/project/ai/-/work_items/3585077) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, aiChatbot, category::feature Description: >>> [!note] Migrated issue Reported by: [ahmad khader](https://www.drupal.org/user/3727855) Related to !1497 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation Integrate the ChatProcessor plugin system (added in #3492940) into the AI Chatbot module's DeepChat block. This allows site builders to select which ChatProcessor plugin handles chat interactions, decoupling the chatbot UI from … ### [Add YAML support to the MDX editor code blocks](https://git.drupalcode.org/project/ai/-/work_items/3586585) State: opened | Updated: 2026-07-16 | Author: AKHIL BABU (AkhilBabu) | Assigned: Ann Mary Sruthy (annmarysruthy) | Labels: aiAgent, category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1823 [feat: #3586585 Add YAML support to the MDX editor code blocks](https://git.drupalcode.org/project/ai/-/merge_requests/1823) | State: opened | Author: Ann Mary Sruthy (annmarysruthy), 197 diff lines Description: ## Problem/Motivation The MDX editor currently does not support YAML code blocks. The system prompts of the Canvas AI agents contain YAML, so the MDX editor cannot render those blocks properly. We need YAML supported as a code-block language in the MDX editor. ## Steps to reproduce 1. Using `ai_agents` `^1.3`, create an AI agent. 2. In the instructions field, insert a code block. 3. Try to set the code block language to YAML. 4. YAML is not available in the language list. ### [Create plugins for interacting with multimedia in AI](https://git.drupalcode.org/project/ai/-/work_items/3463843) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Needs manual testing, ai::inside Description: > [!note] Migrated issue > > > > > > Reported by: [kevinquillen](https://www.drupal.org/user/317279) > > Related to !1431 !761 ### Problem/Motivation Now that [#3462674: Create a generic AI plugin layer for CKEditor](https://www.drupal.org/project/ai/issues/3462674 "Status: Closed (fixed)") is pending a merge, one of the final OOTB AI plugins for CKEditor is generating an image from providers and saving the result back to the media library in Drupal. This would be a core piece of CKEditor plugin functionality. This is true for text to speech or audio providers as well. This is more of an … ### [ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models](https://git.drupalcode.org/project/ai/-/work_items/3586425) State: opened | Updated: 2026-07-16 | Author: josecarlosmedero | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::bug Description: **Problem / Motivation** `AiRequest.php` calls `setStreamedOutput(TRUE)` for all providers. The PHP client `gemini-api-php` sends a malformed request body when calling `streamGenerateContent` against Gemini 2.x models, resulting in `400 Bad Request`. The non-streaming endpoint `generateContent` works correctly with the same payload. The error in logs: `Error invoking model response: Client error: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent resulted in a 400 Bad Request response` Confirmed: the identical payload sent to `generateConten… ### [Autosave node interfers with AI Chatbot](https://git.drupalcode.org/project/ai/-/work_items/3505569) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: AI Initiative Sprint, aiChatbot, category::bug, priority Description: >>> [!note] Migrated issue Reported by: [the_g_bomb](https://www.drupal.org/user/492012) >>> Problem/Motivation If you are creating or editing a node and you choose to get the AI chatbot to help, requests can be interrupted if the node refreshes after an autosave. Steps to reproduce Install Drupal CMS Enable AI Recipe Choose to create an article Start typing your content Open the AI chatbot Start to ask it to add a field to the content type If you are unlucky enough time it so you submit your request just before the autosave is about to trigger, your request vanishes when the node refresh… ### [Chatbot closes itself when adding a modal](https://git.drupalcode.org/project/ai/-/work_items/3499451) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1815 [Issue #3499451: Restore toolbar chatbot state idempotently so a dialog re-attach cannot close it](https://git.drupalcode.org/project/ai/-/merge_requests/1815) | State: opened | Author: Abhishek Dhariwal (adaptative), 46 diff lines Description: >>> [!note] Migrated issue Reported by: [heyyo](https://www.drupal.org/user/474388) Related to !1277 >>> Problem/Motivation ChatBot closes itself, and impossible to reopen-it, without refreshing the page Steps to reproduce 1. Create new content with CKEditor, for example basic page 2. Open ChatBot 3. Add Media into Ckeditor, we can see ChatBot closes 4. Include the Media 5. It's impossible to reopen the ChatBot > Related issue: [Issue #3505569](https://www.drupal.org/node/3505569) ### [Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration](https://git.drupalcode.org/project/ai/-/work_items/3586570) State: opened | Updated: 2026-07-15 | Author: Ricardo Castañeda (cadence96) | Assigned: unassigned | Labels: Has Testing Steps, aiCkeditor, category::bug, priority::normal Description: ## Summary When `ai_ckeditor` is uninstalled, it does not remove its toolbar button from existing CKEditor 5 editor configurations (`editor.editor.*`). If the **AI Balloon Menu** has been added to a text format toolbar, the configuration still references the removed plugin after uninstall. As a result, the text format configuration page can no longer build the toolbar correctly. ## Steps to reproduce 1. Install `ai_ckeditor`. 2. Go to **Configuration → Content authoring → Text formats and editors**. 3. Edit a CKEditor 5 text format (for example **Full HTML**). 4. Add the **AI Balloon Menu*… ### [Ecosystem: Badge for AI Initiative-supported modules](https://git.drupalcode.org/project/ai/-/work_items/3586601) State: opened | Updated: 2026-07-15 | Author: Rob Loach (robloach) | Assigned: unassigned | Labels: category::feature, priority::minor, state::accepted Description: Follow-up to: #3586482+s On https://project.pages.drupalcode.org/ai_dashboard/ , we list a bunch of modules that are part of the AI Ecosystem. We should have a badge for modules that are AI-Initiative supported. ### Suggested Implementation 1. Get the list of AI Initiative modules 2. Add a badge to the right of the project name when rendering 3. Add filter to only show official projects ### [Support Automator Chain trigger with Field Widget Actions](https://git.drupalcode.org/project/ai/-/work_items/3586602) State: opened | Updated: 2026-07-15 | Author: Zsolt Gere (gerezs) | Assigned: Ahmad Khalil (ahmad-khalil-imagex) | Labels: 2026Sprint14, aiAutomators, category::feature, fieldWidgetActions Description: Feature suggest: In practice, we bumped into a situation where a workflow couldn't be done in a single Automator flow because of context window limit and in general it couldn't work as a single prompt and we didn't want to have multiple fields for a multiturn workflow so we figured to create the workflow of Automator Chain. We wanted to include this as an action on the edit page without page reload but FWA ddidn't allow to use Automator Chain. I asked a coding agent to prototype this and you can see this FWA form allows to select Aotmator Chain type option when adding a New Action, Next it al… ### [Make AI API Explorer have chat history](https://git.drupalcode.org/project/ai/-/work_items/3528949) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: AKHIL BABU (AkhilBabu) | Labels: Has Testing Steps, aiApiExplorer, category::task, priority Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1049 >>> Problem/Motivation This is dependent on #3528948: Add chat_history form element. When the chat history form field is available, we should add it to the Chat explorer in AI API Explorer and remove our custom solutions there. Proposed resolution Remove the current way of loading text and images. Add the chat_history form field instead System message should stay as it is. > Related issue: [Issue #3528948](https://www.drupal.org/node/3528948) ### [AI Balloon Menu throws uncaught TypeError on selection change when user lacks 'use ai ckeditor' permission, breaking media insertion](https://git.drupalcode.org/project/ai/-/work_items/3586588) State: opened | Updated: 2026-07-15 | Author: Leandro Luvigne (lluvigne) | Assigned: Leandro Luvigne (lluvigne) | Labels: aiCkeditor, category::bug, state::needsWork Description: ## Summary The AI Balloon Menu (`ai_balloon_menu`) plugin does not check the `hasAccess` flag from the shared `ai_ckeditor_ai` config object, unlike the AI Assistant toolbar plugin (`aickeditor`) which correctly checks it. For users without the `use ai ckeditor` permission, this causes an uncaught `TypeError` on any non-collapsed selection change, which most commonly manifests as media insertion silently failing (the Media Library "Insert selected" AJAX request is aborted client-side). ## Steps to reproduce 1. Fresh Drupal core (Standard profile) + `composer require drupal/ai`, enable `ai` an… ### [Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names](https://git.drupalcode.org/project/ai/-/work_items/3586542) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: Has Testing Steps, aiAutomators, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1737 [Issue #3586542: Fix documentation staleness — automator-type ID drift,...](https://git.drupalcode.org/project/ai/-/merge_requests/1737) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 340 diff lines Description: ## Description A staleness audit of the module documentation under `docs/` (all pages untouched for 6+ months) found a number of pages that have drifted from the current code. Each finding below was verified against source — not just flagged by commit date — so these are confirmed mismatches, not merely old pages. The bulk of the breakage is **filename/ID drift** in the `ai_automators` automator-type pages: the doc filename no longer matches the plugin's `#[AiAutomatorType(id: ...)]`, usually because the code gained a `_field` / `_long` suffix, an id rename, or a typo. No automator plugins w… ### [Visual regression baselines need regenerating after the MDXEditor dark theme fixes](https://git.drupalcode.org/project/ai/-/work_items/3586600) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::task, priority::normal, state::accepted Description: ## Problem/Motivation The visual regression tests now fail. The rendered output of the MDXEditor changed when the Gin dark theme rendering was fixed in #3582474 (and the related Tool Explorer dark theme fix #3582473), so the committed baseline screenshots no longer match the current, correct output. These are expected diffs — the UI legitimately changed — not a regression. The stored baselines are simply stale. ## Proposed resolution Regenerate the visual regression baselines against the current MDXEditor rendering (light and dark theme) and commit the new reference images, so the suite pa… ### [Document the AI module ecosystem: a categorized list of related modules with links and summaries](https://git.drupalcode.org/project/ai/-/work_items/3586482) State: closed | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Description: ## Description The AI module has grown a large ecosystem of companion projects on drupal.org — providers, vector database (VDB) providers, agents, recipes, tools, automators, and full distributions/CMS profiles. Today there is no single, curated page in the AI module's documentation that tells a site builder or developer **what exists, where to find it, and what each project does.** Discovering these modules currently means searching drupal.org by hand or relying on word of mouth. A maintained ecosystem index would make the AI module dramatically easier to adopt: people could see at a glance… ### [Add a Moderation Guardrail plugin (configurable moderation provider/model as a guardrail)](https://git.drupalcode.org/project/ai/-/work_items/3586531) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, aiCoreModule Description: ## Goal Add a single configurable **Moderation Guardrail** plugin to the **Guardrails** system, so any moderation provider/model can be used as a guardrail. This makes "each moderation provider becomes a possible guardrail" achievable through configuration of one plugin, and is the foundation for folding external moderation into Guardrails. This issue covers **only creating the plugin**. The migration of existing `ai.external_moderation` configuration onto guardrail sets, and the deprecation of the old moderation runner, are handled separately in **#3586528** (which is blocked by this issue)… ### [Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy](https://git.drupalcode.org/project/ai/-/work_items/3586573) State: closed | Updated: 2026-07-15 | Author: Thomas Werthmüller (weri) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1733 [fix: #3586573 Tone of voice CKEditor Plugin does not use the translated...](https://git.drupalcode.org/project/ai/-/merge_requests/1733) | State: merged 2026-07-15 | Author: Thomas Werthmüller (weri), 38 diff lines Description: ## Summary When I create a taxonomy for the tone of voice and allow to translate the terms, in the UI of the CKEditor always the default language is displayed and also the description of this term is used for prompting and not the translated version. ## Environment - Drupal version: 11 - Module version: 1.4.3 ### Screenshots ![CleanShot_2026-06-26_at_16.30.17](https://git.drupalcode.org/-/project/106525/uploads/0df4b3af6167109ba085e44a575e6a88/CleanShot_2026-06-26_at_16.30.17.png){width="725" height="600"} ### [Graceful error handling when an AI Provider is not setup correctly](https://git.drupalcode.org/project/ai/-/work_items/3549312) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, aiCoreModule, category::bug, priority::normal Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !923 >>> Problem/Motivation On the search server setup page, the whole page goes WSOD if one of the providers is not setup correctly and doesn't handle errors correctly. An example of this is the Gemini provider, when no key is setup. We should not make it impossible to save any other type of Search API server, just because one provider is not setup correctly. Steps to reproduce (required for bugs, but not feature requests) Install the Gemini Provider. Install the Search API and Sear… ### [Scope global guardrails by request provider id, model and/or tags (conditional global guardrail sets)](https://git.drupalcode.org/project/ai/-/work_items/3586529) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::feature, priority::normal, state::accepted Description: ## Summary Allow guardrail sets — and their registration as **global guardrails** — to be **conditionally scoped by request provider id, model id and/or tags**, instead of always applying to every AI request. Today `ai.settings:global_guardrails` are attached unconditionally by `GlobalGuardrailsEventSubscriber` to every `PreGenerateResponseEvent`. ## Problem Global guardrails are all-or-nothing: every set listed in `ai.settings:global_guardrails` runs on every request, regardless of which provider is being called, which model is being requested, or what tags the request carries. This block… ### [[Meta] AI 1.5.0 release: feature and task candidates](https://git.drupalcode.org/project/ai/-/work_items/3586593) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: No Estimation Available, category::meta, priority::normal, v1.5.x-dev Description: Candidates for the 1.5.0 release. ### [The Toolbar Chatbot runs the fold out animation on page reload](https://git.drupalcode.org/project/ai/-/work_items/3568246) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Needs UX review, ai::inside Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1428 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation The chatbot was greatly improved with #3554510: Sync Design of Toolbar Chatbot with Canvas AI Chatbot, but one issue is that if you have a local storage to remember the position, when its open on page load it runs the open up… ### [Tool Explorer does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/work_items/3582473) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1446 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Tool Explorer does not render correctly with Gin dark theme Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation Follow up from https://git.drupalcode.org/project/ai_agents/-/work_items/3559183. The Tool Explorer UI only looks correct when using the Claro admin theme or Gin in light mode. When using Gin with the dark theme enabled, the Tool Explorer has styling issues that make it diffi… ### [MDX Editor does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/work_items/3582474) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, Has Testing Steps, ai::inside, aiCoreModule Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1445 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: MDX Editor does not render correctly with Gin dark theme Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation Follow up from https://git.drupalcode.org/project/ai_agents/-/work_items/3559183. The MDX Editor UI only looks correct when using the Claro admin theme or Gin in light mode. When using Gin with the dark theme enabled, the MDX Editor has styling issues that make it difficult to u… ### ["AI Guardrails" or "AI Moderation Guardrails"?](https://git.drupalcode.org/project/ai/-/work_items/3586471) State: closed | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: What it the proper name for this functionality? In the AI menu, it is listed as "AI Moderation Guardrails", but on configuration pages, it is just "AI Guardrails" - it should be consistent, IMHO. Also - and this is probably a separate issue - but why do all the AI menu items use title case (first letter of each word capitalized) while the rest of Drupal is pretty much standardized on sentence case (only the first letter of the first word is capitalized)? See https://www.drupal.org/docs/develop/user-interface-standards/interface-text#interface-text-title-link-heading -mike ### [Match "Global Guardrails" config page title with "Global AI Guardrails" menu item](https://git.drupalcode.org/project/ai/-/work_items/3586476) State: closed | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: 2026Sprint14, AI Innovation, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1644 [Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item](https://git.drupalcode.org/project/ai/-/merge_requests/1644) | State: merged 2026-07-15 | Author: Avinash jha (avinash.jha), 26 diff lines Description: I like consistency - luckily, it is also good UX. The menu link is "Global AI Guardrails" while the page title is just "Global Guardrails". Let's pick one. -mike ### [Create Provider Documentation Page for OpenAI](https://git.drupalcode.org/project/ai/-/work_items/3533040) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, category::task, documentation, priority::normal Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) >>> Problem/Motivation Currently there is no information about providers on https://project.pages.drupalcode.org/ai, except for https://project.pages.drupalcode.org/ai/1.1.x/providers/matris/ This makes it hard to know what to choose, why and how to set it up. We need detailed pages for each provider that we manage, or that is known to the community, so there is one place to look for information about what to use and where to use it. This task is for createing the OpenAI details documentation pag… ### [Validation of unexisting fields on paragraphs actions](https://git.drupalcode.org/project/ai/-/work_items/3571033) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: Eric Homanchuk (erichomanchuk) | Labels: Has Testing Steps, aiContentSuggestions, category::bug, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1822 [[#3526390] feat: Improve the AI Search recursive retrieval of a specific quantity of results](https://git.drupalcode.org/project/ai/-/merge_requests/1822) | State: opened | Author: Bharat Kelotra (bharatkelotra), 42173 diff lines Description: >>> [!note] Migrated issue Reported by: [aaron gil martinez](https://www.drupal.org/user/3605526) Related to !1150 >>> Problem/Motivation When a node form uses Paragraphs, the AI Content Suggestions “Select the field(s) you wish to send to the LLM” list does not update after Paragraphs AJAX actions (collapse/edit/add). This makes it possible to select stale/hidden paragraph fields or miss newly added ones or even display errors because of validation on non-existing fields in the list. Steps to reproduce (required for bugs, but not feature requests) Enable ai_content_suggestio… ### [Type error and infinite AJAX request loop when the Agent is unable to resolve a request job](https://git.drupalcode.org/project/ai/-/work_items/3547470) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, aiAssistantsApi, category::task, needs backport to 1.1.x Description: >>> [!note] Migrated issue Reported by: [codebymikey](https://www.drupal.org/user/3573206) Related to !1021 !894 >>> Problem/Motivation When the AI agent is unable to solve a job, the following exception is thrown: <?phpTypeError: Drupal\ai\OperationType\Chat\ChatMessage::__construct(): Argument #2 ($text) must be of type string, null given, called in /app/application/web/modules/contrib/ai/modules/ai_assistant_api/src/Service/AgentRunner.php on line 85 inDrupal\ai\OperationType\Chat\ChatMessage->__construct() (line 61 of /app/application/web/modules/contrib/ai/src/OperationType/Ch… ### [Add league/commonmark as real dependency not a suggestion](https://git.drupalcode.org/project/ai/-/work_items/3586595) State: opened | Updated: 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Assigned: unassigned | Labels: Novice, category::task, priority::normal, state::accepted Description: ## Description league/commonmark is used at least in ai_chatbot module for converting markdown back to HTML. It was always an optional dependency, but there are a lot of support tickets as users do not see the message about possibility to install this package and benefit from it. Recently, ai_search also created a [feature](https://git.drupalcode.org/project/ai_search/-/work_items/3584018) that relies on this library. More and more markdown parsing is used, so it is nice to have it already in codebase always. ## Tasks * [ ] Add league/commonmark as dependency in composer.json * [ ] Remove… ### [Support the `ai_json_schema` element inside off-canvas dialogs](https://git.drupalcode.org/project/ai/-/work_items/3586536) State: closed | Updated: 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1680 [Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs](https://git.drupalcode.org/project/ai/-/merge_requests/1680) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 142 diff lines Description: # Title Support the `ai_json_schema` element inside off-canvas dialogs (correct rendering + value sync) ## Description The `ai_json_schema` form element (`Drupal\ai\Element\AiJsonSchema`) is documented for use "in any Drupal form", but it does not work when rendered inside Drupal's **off-canvas dialog** — which is how the `bpmn_io` modeller shows configuration forms. Upstream the element is only used on full-page forms (e.g. AI API Explorer), where it works; off-canvas has never been exercised, so this is not a regression — it is making the element robust in a context new consumers need. T… ### [Add rich-text image description support to AI Automators](https://git.drupalcode.org/project/ai/-/work_items/3586478) State: closed | Updated: 2026-07-15 | Author: Levente Besenyei (LeventeB) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1628 [Issue #3586478: "Add rich-text image description support to AI Automators"](https://git.drupalcode.org/project/ai/-/merge_requests/1628) | State: merged 2026-07-15 | Author: Levente Besenyei (LeventeB), 2726 diff lines Description: ## Summary Add optional rich-text image description support to AI Automators for AI-based formatted text fields, including metadata storage for generated image descriptions. Related/source issue: https://git.drupalcode.org/project/ai_initiative/-/work_items/3585695 ## Problem AI Automators can use formatted text as input, but images embedded in that text are currently ignored unless they are already available through a separate image/media field. This makes automations less accurate for content that depends on visual context (for example: summaries, quality checks, and editorial pre-screen… ### [Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation](https://git.drupalcode.org/project/ai/-/work_items/3584951) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, aiCoreModule Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1553 [Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream...](https://git.drupalcode.org/project/ai/-/merge_requests/1553) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 552 diff lines Description: >>> [!note] Migrated issue Reported by: [abhisekmazumdar](https://www.drupal.org/user/3557964) >>> [Tracker] **Update Summary:** SensitiveContentStream plugin added; kernel tests pass; pipeline green on 1.x **Short Description:** Add a concrete streaming guardrail plugin that suppresses marked content mid-stream **Check-in Date:** 06/04/2026 *Metadata is used by the [AI Tracker](https://www.drupalstarforge.ai/). Docs and additional fields [here](https://www.drupalstarforge.ai/ai-dashboard/docs).* [/Tracker] ## Problem/Motivation #3582179 introduced `StreamableGuardrailInterface` — a guar… ### [Suggest Tags automator should work with Tagify](https://git.drupalcode.org/project/ai/-/work_items/3536912) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: #drupalpune-sprint, aiAutomators, category::feature, priority Description: >>> [!note] Migrated issue Reported by: [mandclu](https://www.drupal.org/user/52136) >>> Problem/Motivation The new field widget actions are great! In many ways these recreate the experience that drew me into developing for the Augmentor AI module. One thing I do miss is a simple way to choose which generated tags to choose. Augmentor achieves this with an interim widget, showing the suggested tags as tiles that when clicked add the suggestion into the tags field. I think we could achieve something similar if we could have a field widget action that worked with the Tagify widget. It would … ### [Add Summarization operation type support to the echoai test provider](https://git.drupalcode.org/project/ai/-/work_items/3586537) State: closed | Updated: 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1681 [Issue #3586537 Add Summarization operation type support to the echoai test provider](https://git.drupalcode.org/project/ai/-/merge_requests/1681) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 47 diff lines Description: ## Description The echoai mock provider (`Drupal\ai_test\Plugin\AiProvider\EchoProvider`, in the `ai_test` submodule) implements several operation types so that downstream modules can kernel-test their integrations against a deterministic provider. It does not yet implement the **Summarization** operation type. ## Acceptance criteria * `echoai__ai` reports support for the `summarize` operation type and is selectable for it. * Calling `summarize()` with text `Foo` returns a `SummarizationOutput` whose normalized value is `Summary of: Foo`. * Consumers (e.g. the `ai_integration_eca` Summariz… ### [Add non-required visual regression tests for the four built UI elements](https://git.drupalcode.org/project/ai/-/work_items/3586461) State: closed | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::task, frontend, priority::normal Description: --- AI TRACKER METADATA --- Update Summary: Add non-required visual regression tests for the four built UI elements Check-in Date: MM/DD/YYYY (US format) [When we should see progress/get an update] Due Date: MM/DD/YYYY (US format) [When the issue should be fully completed] Blocked by: [#XXXXXX] (New issues on new lines) Additional Collaborators: AI Tracker found here: https://www.drupalstarforge.ai/ --- END METADATA --- ### Problem/Motivation We ship four compiled front-end bundles, built by the `js_build` CI job: | # | Element | Source | Build output | |---|---------|--------|-------------… ### [Batch embeddings for improved indexing performance](https://git.drupalcode.org/project/ai/-/work_items/3568648) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [paulsheldrake](https://www.drupal.org/user/1350686) Related to !1126 >>> [Tracker] Update Summary: Increase embeddings performance Short Description: Support batching for embeddings so multile chunks can be converted and inserted at a time instead of doing each chunk sequentially. Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation Indexing is slow for vector DBs Proposed resolution Add batching so more chunks can be process in one go. This MR updates the underlying classes t… ### [Do not assume action definitions have a type when deriving action plugin functions](https://git.drupalcode.org/project/ai/-/work_items/3586589) State: closed | Updated: 2026-07-15 | Author: Ryan Szrama (rszrama) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1799 [fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions](https://git.drupalcode.org/project/ai/-/merge_requests/1799) | State: merged 2026-07-15 | Author: Ryan Szrama (rszrama), 15 diff lines Description: ## Summary I received a deprecation notice related to `str_contains()` when testing chat generation at `/admin/config/ai/explorers/chat_generator`. This is because the `ActionPluginDeriver` assumes the action definitions it's deriving functions for have a type, even though the `Action` attribute designates the `type` property as optional. Pathauto does _not_ use a `type` for its one action plugin, so the deriver attempts to get an entity type definition for `NULL`. ``` #[Action( id: 'pathauto_update_alias', label: new TranslatableMarkup('Update URL alias of an entity'), )] ``` ## Steps … ### [Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &)](https://git.drupalcode.org/project/ai/-/work_items/3586553) State: opened | Updated: 2026-07-15 | Author: Nicholas Stees (NicholasS) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1819 [Issue#3586553:...](https://git.drupalcode.org/project/ai/-/merge_requests/1819) | State: opened | Author: Bharat Kelotra (bharatkelotra), 235 diff lines Description: ## Summary When an AI Automator targets a taxonomy/entity-reference field, valid LLM responses are silently discarded if the term name contains a character that the model returns HTML-encoded (e.g. an ampersand returned as `&` instead of `&`). The value passes generation but is stripped in `verifyValue()` because the comparison against the real term names is an exact string match, so the field is never filled. ## Steps to reproduce 1. Create a taxonomy vocabulary with a term whose name contains an ampersand, e.g. `Kids, Youth & Family`. 2. Add an entity reference (taxonomy) field to … ### [ai_translate: ContentTranslationControllerOverride::overview() fatals when the parent controller returns a Response](https://git.drupalcode.org/project/ai/-/work_items/3586597) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::minor, state::accepted Description: ### Problem/Motivation `ContentTranslationControllerOverride::overview()` is typed to return `array` and unconditionally passes the parent controller's result to `alterForm()`. Other modules that override the content-translation overview route may return a `Response` from their parent controller (we hit this with a module redirecting the overview to its own translation app). `alterForm()` then fatals on a non-array. ### Proposed resolution Honor a `Response` as-is and only alter render arrays: ```diff - public function overview(RouteMatchInterface $route_match, $entity_type_id = NULL): ar… ### [ai_translate: option to translate all fields of an entity in a single LLM call instead of one call per field](https://git.drupalcode.org/project/ai/-/work_items/3586598) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Description: ### Problem/Motivation `ai_translate` currently translates field by field, one LLM request per text field. For entities with many fields/paragraphs this multiplies cost and latency, and loses cross-field context that would improve translation consistency (terminology, tone). ### Proposed resolution Add an (opt-in) mode that serializes all translatable text of the entity into one structured prompt, performs a single LLM call, and maps the response back to the fields. We run this in production as a composer patch against 1.4.x and see large latency/cost reductions on paragraph-heavy nodes. R… ### [Reject caller-supplied execution identity fields at /api/deepchat boundary](https://git.drupalcode.org/project/ai/-/work_items/3574662) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, aiChatbot, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1812 [Issue #3574662: Add boundaries and test](https://git.drupalcode.org/project/ai/-/merge_requests/1812) | State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson), 384 diff lines Description: >>> [!note] Migrated issue Reported by: [scott falconer](https://www.drupal.org/user/52557) Related to !1227 >>> Problem/Motivation As part of https://www.drupal.org/project/ai/issues/3573899 (Execution Principal / execution envelope), outside-in API boundaries must not accept caller-supplied execution identity fields. The /api/deepchat endpoint currently processes request payloads without explicitly rejecting reserved identity fields. This allows caller-supplied fields like executor_uid / initiator_uid to pass the boundary and only fail later on unrelated validation (for example invali… --- MERGE REQUESTS (24h) --- ### [Issue#3586446:CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler fixes](https://git.drupalcode.org/project/ai/-/merge_requests/1824) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586446-CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler | 207 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [#3585077: Integrate chatprocessor plugin](https://git.drupalcode.org/project/ai/-/merge_requests/1497) State: opened | Author: Ahmad Khader (Ahmad-Khader) | Branch: 3585077-integrate-chatprocessor-plugin | 1642 diff lines Description: Closes #3585077 ### [fix(ai_ckeditor): remove stale toolbar items on uninstall and warn on confirm page](https://git.drupalcode.org/project/ai/-/merge_requests/1731) State: opened | Author: Ricardo Castañeda (cadence96) | Branch: 3586570-uninstalling-ai-ckeditor-leaves-stale-toolbar-items-in-editoreditor-configuration | 188 diff lines Description: ## Description Fixes an issue where uninstalling `ai_ckeditor` left stale toolbar references in existing `editor.editor.*` configuration entities, causing CKEditor 5 text format configuration pages to break. Two changes in `ai_ckeditor.install`: - **`hook_module_preuninstall()`**: Before the module is removed, iterates over all `editor.editor.*` configs and strips the `aickeditor` and `ai_balloon_menu` toolbar items, as well as the `ai_ckeditor_ai` plugin configuration block. - **`hook_form_FORM_ID_alter()` for `system_modules_uninstall_confirm_form`**: Reads the pending modules from the ex… ### [Issue #3586468: "Add interactive refinement capability to Field Widget Actions Automation"](https://git.drupalcode.org/project/ai/-/merge_requests/1629) State: opened | Author: Ahmad Khader (Ahmad-Khader) | Branch: 3586468-interactive-refineme | 4057 diff lines Description: ## Description ## Testing instructions 1. Create an AI Automator Setup for content_type → entity → field_content with rule llm_text_long , point the base field to the title, and add a prompt something like "You must write a short blog paragraph about: {{ context }}. Return ONLY the paragraph text, nothing else." 2. Enable the Field Widget Action with refinement Go to /admin/structure/types/manage/blog/form-display Click the gear on field_content, under Field Widget Actions enable "Automator Text Suggestion" Pick the automator, check "Enable Refinement", save 3. Edit an entity Click the… ### [Fix the MDX Editor for Gin dark theme](https://git.drupalcode.org/project/ai/-/merge_requests/1616) State: merged 2026-07-15 | Author: Prabhavathi Vanipenta (prabha1997) | Branch: 3582474-mdx-editor-gin-dark | 80 diff lines Description: ## Description ## Testing instructions ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or they are exp… ### [Issue #3582473: Tool Explorer does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/merge_requests/1446) State: merged 2026-07-15 | Author: Shubham Prakash (shubham.prakash) | Branch: 3582473-tool-explorer-does | 160 diff lines Description: (cherry picked from commit 20c8ac18d15a25ffd0db807b6e427e8b41d34cf7) Closes #3582473 ### [Resolve #3586599: "Tests are failing for phpstan"](https://git.drupalcode.org/project/ai/-/merge_requests/1821) State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Branch: phpstan-cherry-pick-1-3 | 324 diff lines Description: Fixing phpstan #3586599 ### [Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency](https://git.drupalcode.org/project/ai/-/merge_requests/1638) State: merged 2026-07-15 | Author: Avinash jha (avinash.jha) | Branch: 3586471-ai-guardrails-or-ai-moderation-guardrails | 26 diff lines ### [Issue #3533040:Create Provider Documentation Page for OpenAI](https://git.drupalcode.org/project/ai/-/merge_requests/1530) State: closed | Author: Avinash jha (avinash.jha) | Branch: 3533040-create-provider-documentation | 76 diff lines Description: Closes #3533040 ### [Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is...](https://git.drupalcode.org/project/ai/-/merge_requests/1021) State: closed | Author: Billy Davies (billy.davies) | Branch: 3547470-handle-unsolvable-jobs-1.2.x | 65 diff lines Description: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job By: codebymikey Closes #3547470 ### [Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job](https://git.drupalcode.org/project/ai/-/merge_requests/894) State: closed | Author: codebymikey | Branch: 3547470-handle-unsolvable-jobs | 64 diff lines Description: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job By: codebymikey Closes #3547470 ### [Issue #3586478: "Add rich-text image description support to AI Automators"](https://git.drupalcode.org/project/ai/-/merge_requests/1679) State: merged 2026-07-15 | Author: Levente Besenyei (LeventeB) | Branch: 3586478-issue-branch-2x | 2531 diff lines Description: ## Description Ports the resolution of #3586478 from the 1.x line to the 2.x branch. This introduces rich-text image awareness to AI Automators so supported text-based automators can discover embedded images, generate AI image descriptions, include those descriptions in prompt context, and optionally store image metadata for auditability. For AI content pre-moderation, this enables the moderation automator to evaluate visual content from Article body fields in addition to text content. If embedded images cannot be fully processed (for example, configured image limit exceeded, unreachable/in… ### [Issue#3585328:...](https://git.drupalcode.org/project/ai/-/merge_requests/1820) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3585328-Undefined-Array-Key-type-Warnings-Break-AJAX-AbstractModelFormBase-UpdateModelForm | 104 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Resolve "Add non-required visual regression tests for the four built UI elements"](https://git.drupalcode.org/project/ai/-/merge_requests/1608) State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3586461-add-non-required-vis | 719 diff lines Description: ## ### [Issue#3586558:Preserve-HTML-In-Streamed-Output fixes.](https://git.drupalcode.org/project/ai/-/merge_requests/1818) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586558-Preserve-HTML-In-Streamed-Output | 468 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Issue#3586491:add-a-during-generate-streaming-section-to-the-guardrail-set-for...](https://git.drupalcode.org/project/ai/-/merge_requests/1816) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586491-add-a-during-generate-streaming-section-to-the-guardrail-set-form-and-let-guardrails-declare-their-supported-modes | 1451 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Cherry pick 99419a07](https://git.drupalcode.org/project/ai/-/merge_requests/1817) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-32c3e8bc | 479 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Cherry pick 99419a07](https://git.drupalcode.org/project/ai/-/merge_requests/1814) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-99419a07-2.x | 479 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Issue #3499451: Fixed chatbot not reopening after CKEditor/media modal closes.](https://git.drupalcode.org/project/ai/-/merge_requests/1277) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3499451-chatbot-closes-itself | 94310 diff lines Description: Closes #3499451 --- COMMITS (24h) --- - [e0ff7fa3](https://git.drupalcode.org/project/ai/-/commit/e0ff7fa3334ce06ba8bd11e79fa58be50f4c1ed6) fix: #3586573 Tone of voice CKEditor Plugin does not use the translated... — Thomas Werthmüller (2026-07-15T15:26:37.000+00:00) - [d7625983](https://git.drupalcode.org/project/ai/-/commit/d7625983e7de5e299c949d63e2baf5ef300fa616) Fix the MDX Editor for Gin dark theme — Prabhavathi Vanipenta (2026-07-15T14:58:48.000+00:00) - [babfb3b6](https://git.drupalcode.org/project/ai/-/commit/babfb3b650ea9cea99f3514663c3cfe7a9395c8e) Issue #3582473: Tool Explorer does not render correctly with Gin dark theme — Shubham Prakash (2026-07-15T14:51:56.000+00:00) - [74168323](https://git.drupalcode.org/project/ai/-/commit/74168323c0bc4b5ab98f494380af0eae6a69be8d) Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item — Avinash jha (2026-07-15T14:51:02.000+00:00) - [eeb34183](https://git.drupalcode.org/project/ai/-/commit/eeb34183101bb0e5b60703b993c61f79fa93fb8d) Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency — Avinash Kumar Jha (2026-06-04T14:05:25.000+05:30) - [784c4fbf](https://git.drupalcode.org/project/ai/-/commit/784c4fbf6194e6a6332dfa16cb1b6071cab866c6) Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs — Ahmad Khader (2026-07-15T13:32:06.000+00:00) - [b4fa57d5](https://git.drupalcode.org/project/ai/-/commit/b4fa57d5893177f87dfce7210e9d89aa407fbafc) Issue #3586478: "Add rich-text image description support to AI Automators" — Levente Besenyei (2026-07-15T13:10:37.000+00:00) - [78a69753](https://git.drupalcode.org/project/ai/-/commit/78a697537f3804499539efe9f86a06033e9d8b2e) Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream... — Ahmad Khader (2026-07-15T13:04:58.000+00:00) - [301aa988](https://git.drupalcode.org/project/ai/-/commit/301aa988932aadc30f0ab15d706093eeba6d1fed) Issue #3586537 Add Summarization operation type support to the echoai test provider — Ahmad Khader (2026-07-15T12:56:55.000+00:00) - [58ab9447](https://git.drupalcode.org/project/ai/-/commit/58ab9447463b77e49e1a64ebab28c22ec2b47434) Resolve "Add non-required visual regression tests for the four built UI elements" — Marcus Johansson (2026-07-15T12:38:41.000+00:00) - [fe7d765f](https://git.drupalcode.org/project/ai/-/commit/fe7d765fc2c8492cf59148f2a9c35d9953318870) fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions — rszrama (2026-07-10T14:04:59.000-04:00) - [5a28eae1](https://git.drupalcode.org/project/ai/-/commit/5a28eae198550d68b40379465334bd6c0548e944) Issue #3574662: Add boundaries and test — Marcus Johansson (2026-07-15T10:42:53.000+00:00) ======================================================================== ## [2] summariseModule:ai_provider_amazeeio:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: amazee.ai Private AI Provider (machine name: ai_provider_amazeeio) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

    amazee.ai Private AI Provider

    then use

    ,

    ,

      /
    • , and as needed. Output only the HTML fragment with no surrounding , , or
      tags. After the project summary prose, add a single subsection titled "

      How can I help on this project?

      " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [array_flip(): Can only flip string and integer values in config_ignore_ignored_alter()](https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586231) State: closed | Updated: 2026-07-15 | Author: Ron Raney (rraney) | Assigned: unassigned | Labels: category::bug, priority::normal, state::needsReview, v1.3.x-dev Description: ## Issue When running `drush cim`, `drush cex`, or `drush config:status`, the following PHP warning appears (twice): Warning: array_flip(): Can only flip string and integer values, entry skipped in Drupal\Core\Entity\EntityStorageBase->loadMultiple() (line 278 of /core/lib/Drupal/Core/Entity/EntityStorageBase.php) ## Root Cause In `ai_provider_amazeeio.module`, the `ai_provider_amazeeio_config_ignore_ignored_alter()` hook calls `Key::load()` with values from config without validating they are non-empty strings first: - Line 157: `Key::load($settings->get('api_key'))` - Line 161: `Key::load($… ### [Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity)](https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586236) State: closed | Updated: 2026-07-15 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: Drupal CMS, category::bug, code, priority::normal Description: ## Problem / Motivation **Trial account provisioning is optional; its failure must be a fallback, not an install-breaker.** Applying any recipe that installs **amazee.ai Private AI Provider** (e.g. Drupal CMS AI, or a Varbase AI recipe via `varbase_ai_base`) hard-fails when amazee.ai's trial endpoint is at capacity, rate-limited, or unreachable: ``` Client error: `POST https://api.amazee.ai/auth/generate-trial-access` resulted in a `429 Too Many Requests` response: {"detail":"Trial capacity reached. Please contact sales to continue."} [error] Failed to run drush recipe ...: exit status 173… --- MERGE REQUESTS (24h) --- ### [fix(#3575454) add vectordb to docs](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/73) State: merged 2026-07-15 | Author: Dan Lemon (dan2k3k4) | Branch: fix-3575454-add-vectordb-to-docs | 104 diff lines ### [Automated Project Update Bot fixes](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/75) State: merged 2026-07-15 | Author: project update bot (Project-Update-Bot) | Branch: project-update-bot-only | 289 diff lines Description: Relates to #3586232. This merge request was automatically created by the Project Update Bot. It contains the changes from run 12-848511. ### [Draft: chore: add bulk chunking](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/63) State: opened | Author: Dan Lemon (dan2k3k4) | Branch: bulk-chunk | 237 diff lines Description: Reworked for **2.0.x**: batches VDB inserts during indexing. `PostgresProvider::indexItems()` previously issued one `INSERT` per chunk. It now builds one row per chunk and inserts them all in a single query via a new `insertMultipleIntoCollection()` on both the provider and `PostgresPgvectorClient`. ### Notes for review - Built on top of 2.0.x's existing embedding API (`getChunks()` / `getEmbedding()` / `Embedding` value object) — the embedding-adaptation part of the original 1.3.x MR is already present on 2.0.x, so this MR contains **only** the batch-insert optimization. - Keeps 2.0.x's **p… ### [fix: #3586236 Do not abort recipe apply when amazee.ai trial provisioning fails](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/78) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3586236-recipe-apply-aborts-when-amazeeai-trial-account-provisioning-fails-eg-http-429-trial-capacity | 13 diff lines Description: **Fallback, not a requirement**: provisioning a free anonymous amazee.ai trial account is an optional convenience step during a Drupal CMS AI / Varbase AI recipe install. amazee.ai being at trial capacity (HTTP 429), rate-limited, returning a malformed payload, or simply unreachable (network/DNS/timeout) must never abort the recipe apply. This MR makes that failure a graceful fallback instead of an install-breaker. Fixes #3586236. `EnsureAmazeeAiAccess::apply()` used to catch `TrialAccountProvisioningException` and rethrow it as a `ConfigActionException`, aborting the whole recipe apply. Now… ### [chore: general improvements, switch to zensical docs](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/79) State: merged 2026-07-15 | Author: Dan Lemon (dan2k3k4) | Branch: improvements | 927 diff lines ### [chore: run rector set to php 8.0](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/51) State: closed | Author: Dan Lemon (dan2k3k4) | Branch: rector-fixes | 586 diff lines --- COMMITS (24h) --- (none) ======================================================================== ## [3] stripNameAttribution:ai_provider_amazeeio ======================================================================== You are correcting a project digest section. The prose wrongly attributes work to specific people. Rewrite only the sentences that name any of these people so they describe the work in the passive voice without naming anyone: project update bot Rules: - Do not name any of those people anywhere except a trailing "Contributors:" line. - Keep the trailing "Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah)" line exactly as-is (add it if missing). - Leave every other sentence, HTML tag, link, and citation exactly as-is. - Output the full corrected fragment and nothing else. --- SECTION ---

      amazee.ai Private AI Provider

      Several bug fixes and infrastructure improvements landed over the past 24 hours. Two critical bugs were resolved and closed: array_flip(): Can only flip string and integer values in config_ignore_ignored_alter(), which caused PHP warnings during Drush configuration management operations when Key::load() received empty values, and Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity), where trial endpoint capacity limits or network failures would abort recipe installations. The latter fix converts provisioning exceptions into graceful fallbacks rather than install-breakers.

      Three merge requests were integrated: fix(#3575454) add vectordb to docs, Automated Project Update Bot fixes addressing issue #3586232, and chore: general improvements, switch to zensical docs, a substantial 927-line refactor migrating documentation infrastructure. Draft work continues on Draft: chore: add bulk chunking, which optimizes VDB batch inserts via a new insertMultipleIntoCollection() method in PostgresProvider and PostgresPgvectorClient.

      How can I help on this project?

      Review the draft bulk chunking MR targeting 2.0.x, focusing on the insertMultipleIntoCollection() API and PostgresProvider::indexItems() batching logic. Test the batch-insert optimization with large VDB indexing workloads to validate performance gains and confirm no regressions in chunking behavior.

      Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah) ======================================================================== ## [4] summariseModule:gemini_provider:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Gemini Provider (machine name: gemini_provider) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

      Gemini Provider

      then use

      ,

      ,

        /
      • , and as needed. Output only the HTML fragment with no surrounding , , or
        tags. After the project summary prose, add a single subsection titled "

        How can I help on this project?

        " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add support for batch embeddings](https://git.drupalcode.org/project/gemini_provider/-/work_items/3589183) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: "state::needsReview" It was decided on the naming. I have updated MR and also adjusted CI to load the needed branch of AI Core, 2026Sprint14, AI Initiative Sprint, ai::inside Description: >>> [!note] Migrated issue Reported by: [a.dmitriiev](https://www.drupal.org/user/3235287) Related to !37 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Check-in Date: MM/DD/YYYY Additional Collaborators: Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation As a follow up to this issue https://git.drupalcode.org/project/ai/-/work_items/3568648 it would be nice to add support of batch embeddings as Gemini models can do that. Proposed resolution Use method batchEmbedContents from Gemini client when EmbeddingsInput conta… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [5] summariseModule:ai_agents:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Agents (machine name: ai_agents) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khalil (ahmad-khalil-imagex), AKHIL BABU (AkhilBabu), Bharat Kelotra (bharatkelotra), Marcus Johansson (Marcus_Johansson), Nicolae Procopan (thebumikgmail.com), Prabhavathi Vanipenta (prabha1997)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

        AI Agents

        then use

        ,

        ,

          /
        • , and as needed. Output only the HTML fragment with no surrounding , , or
          tags. After the project summary prose, add a single subsection titled "

          How can I help on this project?

          " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Let an agent use a role when running a tool](https://git.drupalcode.org/project/ai_agents/-/work_items/3518167) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Anikó Viola (violaniko) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !87 >>> Problem/Motivation Currently the modus operandi is that the permissions checks that happens in tools, happens on the session that is running it. In AI Agents Explorer or the AI Assistants API, this means the user that triggers the query. There are however cases where agents should be completely autonomous or where they are triggered in queues/cron jobs, where there is no sessions attached. In those cases it should be possible for the person that sets up the agent to be able to… ### [Make it possible to restrict the order of tools during agent executions](https://git.drupalcode.org/project/ai_agents/-/work_items/3560681) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Abhishek Dhariwal (adaptative) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [shashikanth171](https://www.drupal.org/user/3516867) Related to !252 >>> Problem/Motivation AI Agent can sometimes execute tools in an order that doesn't make any sense. We can avoid this by improving the prompt template, making it more verbose with trial and error. Need to somehow allow configuration of each tool, to set which tool should be run prior to it. We can also expand it by including conditions like should be executed 1. only once, 2. first, 3. last etc. Depending on the tool and use case, configuring the agent with such restrictions will… ### [Add limits on how often a tool can run](https://git.drupalcode.org/project/ai_agents/-/work_items/3547995) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !224 >>> Problem/Motivation Right now we have to tell the system prompt how often it is allowed to use a specific tool. But there should also be a determenistic way, where if the tool gets stuck in a loop or searches to no awail in a RAG database for instance, we need to be able to programatically say how many times a tool can run. Proposed resolution Add a form value of how many times a tool can run. Add a form for setting the error message when this happens. If the tool has run tha… ### [Add a per-tool setting to restrict a tool from being called more than once per response](https://git.drupalcode.org/project/ai_agents/-/work_items/3586051) State: opened | Updated: 2026-07-16 | Author: AKHIL BABU (AkhilBabu) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: ## Summary Add a per-tool agent setting — "Restrict model from calling this tool more than once in a response." When enabled for a tool, if a single model response contains more than one call to that tool, execute none of the response's tool calls and return a configurable error message so the agent retries on the next step. Tools without the setting are unaffected and may still be called multiple times. ## Why A step-wise, externally-driven agent needs certain tools to run at most once per step, so each call can build on the previous call's result. Canvas's client-side orchestration loop r… ### [[Meta] Road to 1.4.0 release](https://git.drupalcode.org/project/ai_agents/-/work_items/3586017) State: opened | Updated: 2026-07-16 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::plan, group::ai-initiative, state::accepted Description: ### Description We are releasing 1.3.0 any minute now and should already start planning for 1.4.0 release. It will be able to be dependent on AI 1.4.0. The following related issues are issues that are high priority for this. ### ### [Array to string conversion in Token::doReplace() when a dynamical token value is an array (applyTokens)](https://git.drupalcode.org/project/ai_agents/-/work_items/3586043) State: opened | Updated: 2026-07-15 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: automation::error, state::needsWork Description: ### Problem On every AI Agent run, a PHP warning is logged (and shown as a status message inside the Drupal Canvas AI editor): ``` Warning: Array to string conversion in Drupal\Core\Utility\Token->doReplace() (line 283 of core/lib/Drupal/Core/Utility/Token.php). ``` ### Backtrace (abridged) ``` Token.php(283): str_replace() Token.php(214): Drupal\Core\Utility\Token->doReplace() token_or/src/Token.php(27): ...->replacePlain() eca/.../TokenDecoratorTrait.php(444): ... ai_agents/src/PluginBase/AiAgentEntityWrapper.php(1323): ...->replacePlain() ai_agents/src/PluginBase/AiAgentEntityWrapper.ph… ### [AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, so the status storage cannot be swapped](https://git.drupalcode.org/project/ai_agents/-/work_items/3586054) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !304 [Type-hint AiAgentStatusStorageInterface instead of PrivateTempStatusStorage in AgentStatusSubscriber.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/304) | State: opened | Author: Prabhavathi Vanipenta (prabha1997), 31 diff lines Description: ## Problem `AgentStatusSubscriber::__construct()` type-hints the concrete class: ```php public function __construct( protected PrivateTempStatusStorage $statusStorage, ... ``` `AiAgentStatusPollerService` correctly type-hints `AiAgentStatusStorageInterface`. Because the subscriber demands the concrete class, an alternative `AiAgentStatusStorageInterface` implementation (for example a persistent storage that archives agent runs) cannot be decorated or swapped in — the container throws: ``` TypeError: AgentStatusSubscriber::__construct(): Argument #1 ($statusStorage) must be of type Pri… ### [feat: Forward tool image output to next loop iteration for vision models](https://git.drupalcode.org/project/ai_agents/-/work_items/3586018) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::feature, group::ai-initiative, priority::normal, state::accepted Description: ## Problem / motivation When an AI agent loops (calls tools, gets results, then calls the model again with those results), tool outputs that contain images are not automatically picked up and passed back to the model on the next loop iteration. Today, this is possible *if* a tool author knows exactly how to format its output so it lands in the next request as a vision-model image input. That is undocumented surface area, easy to get wrong, and out of reach for site builders configuring agents from the UI. A general solution would let any tool emit images (screenshots, generated charts, file… ### [Add possibility for an agent to store and read instructions from a file](https://git.drupalcode.org/project/ai_agents/-/work_items/3572361) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::closed Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !233 >>> Problem/Motivation One problem is that the orchestration agent has to pass a lot of context to the sub-agents, even if the information is available in the initial question from the user. This should add the initial request, and this will be available as a token for each of the subagents. That way an orchestraion agent can just send the specifics it needs and not create so much tokens or lose any specific context. Proposed resolution When a parent agent comes in, add the inst… ### [Create implementation of ShortTermMemory](https://git.drupalcode.org/project/ai_agents/-/work_items/3546411) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !183 >>> Problem/Motivation Short term memory is now available here: #3528730: Create ShortTermMemoryPlugin We should add an integration with it. Proposed resolution Add a parameter to the agent config to save the short term memory config. Add a subform integration for saving the configuration, while editing the AI Agent. Assume no ShortTermMemory by default. Trigger ShortTermMemory after the request event. ### [feat: Per-tool approval mode (pre-approved / approve-once / always) with loop pause-resume](https://git.drupalcode.org/project/ai_agents/-/work_items/3586020) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::feature, group::ai-initiative, priority::normal, state::accepted Description: ## Problem / motivation Agents currently invoke tools without a built-in approval gate. For destructive or sensitive tools (writing content, sending email, calling external APIs, running shell commands, etc.) this is risky — the agent can act before a human has a chance to review. Tools like [Claude Code](https://docs.claude.com/en/docs/claude-code) and [OpenAI Codex CLI](https://github.com/openai/codex) solve this by gating each tool call (in their case, each shell command) behind a per-tool approval policy. The user can mark a tool as always-allowed, approve-once-per-session, or always-pro… ### [Fix streaming](https://git.drupalcode.org/project/ai_agents/-/work_items/3577520) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::bug, code, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !290 [Issue #ai_agents-3577520: Streaming fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/290) | State: opened | Author: Bharat Kelotra (bharatkelotra), 280 diff lines Description: >>> [!note] Migrated issue Reported by: [d0t15t](https://www.drupal.org/user/132353) Related to !243 >>> Problem/Motivation Streaming in the ai_chatbot does not work. Steps to reproduce Create an AI assistant and attach an agent to it. Enable streaming on the assistant's chatbot block. Submit a message — the response is not streamed; it waits for the full completion before rendering. Proposed resolution Add $streaming and $streamingIterator properties to AiAgentEntityWrapper. Pass setStreamedOutput($this->streaming) to the ChatInput before the provider call in determineSolvabi… ### [Use streamed chat for agents](https://git.drupalcode.org/project/ai_agents/-/work_items/3538174) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::task, code, priority::normal, state::needsReview Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !165 >>> Problem/Motivation We are making streamed chat possible in #3528549: Allow tool calling in streamed chat. This should make it possible to use it with agents. Steps to reproduce Proposed resolution Implement a solution based on #3528549: Allow tool calling in streamed chat Remaining tasks User interface changes API changes Data model changes ### [Default information tools | Interactive section disappears after adding tool](https://git.drupalcode.org/project/ai_agents/-/work_items/3586049) State: opened | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::needsReview Description: I'm using AI Agents 1.3.2. When adding or editing an agent, the "Interactive" section of the "Default information tools" area disappears after a tool is added to the "Tools" section. Steps to reproduce: 1. Click to create a new agent (/admin/config/ai/tools-automation/agents/add/form) 2. Scroll to the "Advanced" section, note how the "Interactive" option of Default information tools is available: 3. Scroll back up to the "Tools" section. Add any tool. 4. Scroll back down and see that the "Interactive section" has disappeared: The exact same steps can be used with an existing agent wit… ### [PHPUnit CI job fails (exit code 1) for every test class despite all assertions passing](https://git.drupalcode.org/project/ai_agents/-/work_items/3586053) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: unassigned | Labels: category::bug, priority::normal, state::rtbc Description: ## Problem The `phpunit` CI job fails on merge requests even though every individual test **passes all its assertions**. Observed on [!300](https://git.drupalcode.org/project/ai_agents/-/merge_requests/300), pipeline https://git.drupalcode.org/project/ai_agents/-/pipelines/888950, job https://git.drupalcode.org/project/ai_agents/-/jobs/10938828. The `run-tests.sh` summary shows every single test class in the module — not just ones touched by the MR — finishing with all tests passed but a non-zero subprocess exit code: ``` 3.173s Drupal\Tests\ai_agents\Functional\AiAgentsMenuLinkTest … ### [Add test coverage for externally-driven execution (setLooped(FALSE))](https://git.drupalcode.org/project/ai_agents/-/work_items/3586052) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: AKHIL BABU (AkhilBabu) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !300 [Issues/3586052: Add tests for setlooped.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/300) | State: opened | Author: AKHIL BABU (AkhilBabu), 1312 diff lines Description: ## Summary Add kernel-test coverage for `setLooped(FALSE)` — the mode where the agent parks its tool call and returns after one decision, leaving the caller to drive the next step. The behavior exists and is relied upon, but is untested. ## Why `setLooped(FALSE)` lets a caller run an agent one decision at a time instead of looping to completion inside one request. Canvas's client-side orchestration loop depends entirely on this. Because it is undocumented and uncovered, an unrelated change could silently break every externally-driven consumer. Locking it with tests protects the contract. -… ### ["Use Artifact storage" checkbox not necessary?](https://git.drupalcode.org/project/ai_agents/-/work_items/3586046) State: opened | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: category::support, priority::normal, state::needsReview Description: I've recently noticed that tools in my agents are using artifact storage even when I don't have the "use artifact storage" enabled in the tool configuration. For example, I am using the "Load entity by ID" tool - without "Use artifact storage" enabled. After running the agent, looking in the log, I see: > Tool Plugin executed successfully: Successfully loaded node entity with ID 108 > An artifact has been created for the returned loaded_entity output. To use this entity for subsequent tool input arguments, pass the artifact string '{{entity:node:108:en}}' for entity inputs. > The artifact e… --- MERGE REQUESTS (24h) --- ### [Issue #3547995: Add deterministic tool usage limits.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/224) State: opened | Author: Nicolae Procopan (thebumikgmail.com) | Branch: 3547995-clean | 466 diff lines Description: Closes #3547995 ### [feat: #3586051 Add a per-tool setting to restrict a tool from being called...](https://git.drupalcode.org/project/ai_agents/-/merge_requests/299) State: opened | Author: Ahmad Khalil (ahmad-khalil-imagex) | Branch: 3586051-add-a-per-tool-setting-to-restrict-a-tool-from-being-called-more-than-once-per-response | 720 diff lines Description: feat: #3586051 Add a per-tool setting to restrict a tool from being called more than once per response # What this MR does Implements the per-tool "Restrict to one call per response" setting proposed in this issue. **Why:** Some tools must run at most once per LLM response because each call depends on the previous call's result. The motivating case is Canvas's client-side orchestration, where `place_components` places one component per step and later placements reference the UUID returned by the previous call — two calls in one response can never be valid. Other tools (e.g. `edit_components… ### [Draft: Resolve #3572361 "Add possibility for"](https://git.drupalcode.org/project/ai_agents/-/merge_requests/233) State: closed | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3572361-add-possibility-for | 166 diff lines Description: Closes #3572361 ### [Draft: Resolve #3538174 "Use streamed chat"](https://git.drupalcode.org/project/ai_agents/-/merge_requests/165) State: opened | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3538174-use-streamed-chat | 258 diff lines Description: Closes #3538174 --- COMMITS (24h) --- (none) ======================================================================== ## [6] summariseModule:canvas:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal Canvas (machine name: canvas) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Ben Mullins (bnjmnm), Bálint Kléri (balintbrews) [3], Christian López Espínola (penyaskito), Feliksas Mazeikis (f.mazeikis), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Narendra Singh Rathore (NarendraR), Nodar Davituri (Davituri), Ravi Maniyar (ravi.maniyar.123), Ted Bowman (tedbow), utkarsh_33 (Utkarsh_33), Wim Leers (wimleers), wotnak [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

          Drupal Canvas

          then use

          ,

          ,

            /
          • , and as needed. Output only the HTML fragment with no surrounding , , or
            tags. After the project summary prose, add a single subsection titled "

            How can I help on this project?

            " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Canvas AI: UI/Functional update. Lock the canvas during a build and add a long-running AI-tasks UI element to the chat](https://git.drupalcode.org/project/canvas/-/work_items/3591724) State: opened | Updated: 2026-07-16 | Author: Aidan Foster (aidanfoster) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside Description: **Source:** Drupal AI UX Weekly Meeting, June 22, 2026. @Marcus_Johansson reviewed and gave an update on the prototype Drupal Canvas AI brand @AkhilBabu based on the experimental prototype that creates components one-at-a-time on this experimental branch https://github.com/akhilbabu-qed-42/c2026/tree/canvas-ai-poc The approach looks very promising from early testing but we need to update the UI to accommodate the changes. ## **Problem / Motivation** Canvas AI now builds a page component by component. While it is building, interacting with the canvas (adding or removing components) breaks t… ### [useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop](https://git.drupalcode.org/project/canvas/-/work_items/3591832) State: opened | Updated: 2026-07-16 | Author: Narendra Singh Rathore (NarendraR) | Assigned: Narendra Singh Rathore (NarendraR) | Labels: 1.x-dev, category::bug, pageBuilder, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1377 [3591832: useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop](https://git.drupalcode.org/project/canvas/-/merge_requests/1377) | State: opened | Author: Narendra Singh Rathore (NarendraR), 328 diff lines Description: **Summary** When a code component renders a section with a Tailwind arbitrary-value vh class (e.g. `h-[60vh]`) containing an absolutely-positioned background image, the Canvas editor preview iframe grows unboundedly instead of being capped at the correct viewport-relative height. **Steps to reproduce** 1. Create a code component with this structure: ``` const sizeClass = { default: 'h-[60vh]', short: 'h-[40vh]' }; export default function VhImageHero({ size = 'default' }) { const heightClass = sizeClass[size] || sizeClass.default; return ( ); } ``` 2… ### [Tailwind CSS added by code components overrides theme level CSS](https://git.drupalcode.org/project/canvas/-/work_items/3591831) State: opened | Updated: 2026-07-16 | Author: Brynn Briedis (gumnut) | Assigned: unassigned | Labels: Description: ## Overview I have run into an issue with tailwind styling overriding theme level CSS. Once a user adds a code component it adds the tailwind styling to the canvas page. In my specific case it is overriding my base styles in my _base_ css layer. I have tried moving my CSS onto different layers in my defined layer setup but there are conflicts so they kind of merge together with the layers defined by canvas. Below is my layer setup compared to the canvas one in the declaration order. | Mine | Canvas (tailwind) | | ---------- | ----------------- | | reset | theme | | b… ### [Dependency Dashboard](https://git.drupalcode.org/project/canvas/-/work_items/3591657) State: opened | Updated: 2026-07-16 | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Assigned: unassigned | Labels: projectManagement Description: This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. ## Repository Problems Renovate tried to run on this repository, but found these problems. - ⚠️ WARN: Failed to set branch status - ⚠️ WARN: Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN - ⚠️ WARN: No tool releases found. - ⚠️ WARN: No github.com token has been configured. Skipping release notes retrieval ## Deprecations / Replacements > ⚠️ **Warning** > The foll… ### [Multi-bundle content-entity-reference picks fail to coalesce into a branch expression](https://git.drupalcode.org/project/canvas/-/work_items/3591829) State: opened | Updated: 2026-07-16 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: blocker, category::task, dataModel, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1376 [Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields](https://git.drupalcode.org/project/canvas/-/merge_requests/1376) | State: opened | Author: Christian López Espínola (penyaskito), 382 diff lines Description: ### Overview A code component developer using a `content-entity-reference` prop cannot pick fields from more than one bundle of a multi-target-bundle reference field when any bundle contributes more than one field. Selecting such fields and saving fails validation with: > Multiple expressions on the same field 'entity:node:…' must be coalesced into a single FieldObjectPropsExpression. The per-bundle picks are meant to combine into a single stored expression at save time, but the coalescer leaves them un-combined, so the same-field validation constraint rejects them. A single field per bundl… ### [Restore browser-based component sync for Canvas Headless](https://git.drupalcode.org/project/canvas/-/work_items/3591830) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: unassigned | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1375 [fix(Headless): #3591830 Restore browser-based component sync for Canvas Headless](https://git.drupalcode.org/project/canvas/-/merge_requests/1375) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 859 diff lines Description: !1373 broke things. Canvas must fetch component metadata in the editor browser so local frontends are reachable. Restore CORS/OPTIONS support across Next, Astro, Nuxt, and TanStack Start while retaining assertion redemption and origin validation. Dev servers should also fail fast when `CANVAS_SITE_URL` is missing. All four examples must sync and render a nested component tree in Canvas. ### [Allow fields to be added to the page entity type](https://git.drupalcode.org/project/canvas/-/work_items/3568228) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::task, page, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [catch](https://www.drupal.org/user/35733) >>> Overview Discussed in this slack thread: https://drupal.slack.com/archives/C072JMEPUS1/p1768606306603599 It's a very common use case to add field UI fields to entities for non-content purposes. A use case already in the canvas issue queue is https://git.drupalcode.org/project/canvas/-/work_items/3544662 where the metatags field has been added as a base field (and therefore not removable), but instead could be omitted and added by sites that needed. Other cases are things like 'hide from search results' o… ### [Support multi-target-bundle references in code component content-entity-reference props](https://git.drupalcode.org/project/canvas/-/work_items/3591656) State: opened | Updated: 2026-07-15 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: category::feature, internalHttpApi, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1369 [Draft: Resolve #3591656: Support multi-target-bundle references in content-entity-reference props](https://git.drupalcode.org/project/canvas/-/merge_requests/1369) | State: opened | Author: Christian López Espínola (penyaskito), 1452 diff lines Description: Overview Code components can declare content-entity-reference props whose entity field expressions descend through an entity reference field. When that field targets a single bundle, JsComponent::buildReferencePayload() resolves the nested per-entity payload. When the reference field targets multiple bundles, the coalesced expression carries a ReferencedBundleSpecificBranches target — one branch per bundle, because each bundle can expose different fields. buildReferencePayload() cannot yet resolve that case: it does not select a branch based on the runtime entity's bundle. Multi-target-bund… ### [Add support for rendering Canvas component trees in the headless SDK](https://git.drupalcode.org/project/canvas/-/work_items/3591823) State: closed | Updated: 2026-07-15 | Author: wotnak | Assigned: wotnak | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1371 [feat(Headless): #3591823 Add support for rendering Canvas component trees in the headless SDK](https://git.drupalcode.org/project/canvas/-/merge_requests/1371) | State: merged 2026-07-15 | Author: wotnak, 4099 diff lines Description: The headless SDK can fetch structured Custom Elements output from Drupal, but applications cannot render that output without implementing their own tree traversal, component resolution, prop and slot handling, and component registry integration. ### Proposed resolution Add a content type independent `CanvasComponentTree` renderer for all framework specific adapters. Generate component implementation registries from discovered local components and update them automatically during development. Update the example applications to demonstrate the rendering flow. ### [Boolean props auto-enable when another prop is changed in the Canvas form](https://git.drupalcode.org/project/canvas/-/work_items/3591716) State: opened | Updated: 2026-07-15 | Author: Alamgir Hossain (alamgir.hossain.cse) | Assigned: unassigned | Labels: Description: ## Summary In Canvas, when editing a component that has boolean props (e.g. `card-program`), changing any non-boolean prop causes all boolean props to appear enabled (toggle switches flip to ON) even though the user never toggled them. ## Root causes Two bugs were identified: ### 1. `|| []` coerces boolean `false` to `[]` in `layoutModelSlice.ts` In `_addNewComponentToLayout` → `buildInitialData()`, when building the initial model for a newly dropped component: ```typescript // BEFORE (buggy): initialData.resolved[propName] = prop.default_values?.resolved || []; // For boolean false: fal… ### [Incorrect folder assignment for newly created code components](https://git.drupalcode.org/project/canvas/-/work_items/3591828) State: opened | Updated: 2026-07-15 | Author: Vipin Mittal (vipin.mittal18) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1374 [#3591828 Refetch folder list after newly exposing a code component](https://git.drupalcode.org/project/canvas/-/merge_requests/1374) | State: opened | Author: Ben Mullins (bnjmnm), 66 diff lines Description: **Problem** When creating a new Code Component and selecting a destination folder, the component is not saved in the selected folder. Instead, it is placed in a different folder within the Canvas Library. This prevents users from organizing code components correctly and leads to inconsistent folder categorization. **Acceptance Criteria** - A newly created Code Component is saved in the folder selected by the user. - The component is displayed in the selected folder immediately after creation. - No component is placed into an incorrect folder during the creation process. - The selected folde… ### [Add configuration UI for headless frontends](https://git.drupalcode.org/project/canvas/-/work_items/3591822) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: Bálint Kléri (balintbrews) | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1368 [feat(Headless): #3591822 Add configuration UI for headless frontends](https://git.drupalcode.org/project/canvas/-/merge_requests/1368) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 5297 diff lines Description: Canvas Headless currently allows configuring a single frontend URL with no UI. Expand it to allow multiple frontend URLs, and provide a UI inside Canvas that also shows setup steps. ### [Simplify headless app environment configuration](https://git.drupalcode.org/project/canvas/-/work_items/3591826) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: Bálint Kléri (balintbrews) | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1373 [chore(Headless): #3591826 Simplify headless app environment configuration](https://git.drupalcode.org/project/canvas/-/merge_requests/1373) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 2365 diff lines Description: ## Problem Headless SDK examples use environment variables that are inconsistent or unnecessarily manual: - `DRUPAL_BASE_URL` differs from the `CANVAS_SITE_URL` name used by the CLI and Workbench. - `DRAFT_ALLOWED_FRAME_ANCESTORS` duplicates the Canvas editor origin already present in signed draft-session data and can drift from the actual site configuration. ## Proposed resolution - Rename `DRUPAL_BASE_URL` to `CANVAS_SITE_URL` across SDK packages, examples, and documentation. - Remove `DRAFT_ALLOWED_FRAME_ANCESTORS`. - Keep CSP protection, but derive the exact Canvas editor origin from t… ### [Canvas AI: Add the place_components AI tool (+ kernel test)](https://git.drupalcode.org/project/canvas/-/work_items/3591811) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: Juan Correa (jucs7) | Labels: 2026Sprint14, AI Initiative Sprint, ai, ai::inside Description: ## Summary Add a new AI tool `canvas_ai:place_components` (class `PlaceComponents`) to `canvas_ai`, ported from the POC (MR !1214). It places components into the current layout at a given region/slot target and returns the assigned UUIDs plus the predicted layout tree. It lands **inert** — no agent lists it yet — so it changes nothing until a later issue wires it to the dev agent. Add a kernel test adapted from the existing `set_component_structure` test. ## Why (this sprint) `place_components` is the core mutation tool of the client-side hop loop: the agent places one section per turn and … ### [Radio button props loose value when another prop value is changed in the component](https://git.drupalcode.org/project/canvas/-/work_items/3591827) State: opened | Updated: 2026-07-15 | Author: Joery Lemmens (flyke) | Assigned: unassigned | Labels: Description: To test, first change a sdc component's widget from dropdown to radio buttons: - export your config: `drush cex -y` - Locate the config file of your component, like: `config/sync/canvas.component.sdc.sdc_components.card.yml` - Change `field_widget: options_select` into: `field_widget: options_buttons` - import the updated config: `drush cim -y` Now you have a component with radio buttons widget instead of a dropdown. If you set a value for the radio buttons prop and save and close the canvas ui, and then you edit the page and your component again and change a different prop of your component… ### [Undefined array key in getClientSideInfo() transforms when a prop's shape no longer exists in component metadata](https://git.drupalcode.org/project/canvas/-/work_items/3591824) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: Description: ### Problem/Motivation In `JsonSchemaPropsComponentSourceBase` (client-side info / transforms building), prop shapes are looked up by expression without an existence check: ```php $prop_shape = $prop_shapes[(string) $component_prop_expression]; ``` When a component's stored prop field definitions reference a prop whose shape no longer exists in the current component metadata (e.g. after an SDC's schema changed and removed/renamed a prop while content still carries the old prop), this triggers an undefined array key and a TypeError downstream, taking down the whole editor/render for that com… --- MERGE REQUESTS (24h) --- ### [fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish](https://git.drupalcode.org/project/canvas/-/merge_requests/1363) State: opened | Author: Nodar Davituri (Davituri) | Branch: 3591820-sync-before-validate-publish | 394 diff lines Description: Closes #3591820 ## What this MR does `ApiAutoSaveController::post()` validated the entity before `content_translation`'s presave field synchronizer ran. Because the auto-save snapshot applied in `applyAutoSaveTranslationSnapshots()` only carries the edited (default) translation, a change to a non-translatable ("symmetric") component input — an image `width`/`loading`, a section `padding_bottom`, a `heading`'s `element`, etc. — left non-default translations stale at validation time, and `ComponentTreeSymmetricalTranslationConstraint` rejected the publish with a 422. `applyAutoSaveTranslation… ### [feat(Conflict detection): #3591723 "Add 'Conflict detected' toast message"](https://git.drupalcode.org/project/canvas/-/merge_requests/1295) State: opened | Author: Ravi Maniyar (ravi.maniyar.123) | Branch: 3591715-use-notifications-to-inform-users-about-the-detected-conflicts | 1268 diff lines Description: Adds conflict toast messages for detected conflicts. * Shows a toast when pending auto-saves contain conflict items. * Keeps this separate from **`/canvas/api/v0/notifications`**. * Stores conflict detection error state in localStorage to avoid repeated toast spam. * Shows the toast message again if the conflict detection error content changes. * Adds the conflict item to Activity Center and badge count. * “Resolve conflicts” opens the Review Changes conflict UI without page reload. * Uses existing color/spacing tokens for the toast styling. ## Testing instructions *  Trigger a conflict whe… ### [feat(Conflict detection): #3591591 Expand conflict resolution UI with...](https://git.drupalcode.org/project/canvas/-/merge_requests/1317) State: opened | Author: Ravi Maniyar (ravi.maniyar.123) | Branch: 3591752-add-side-by-side-review-flow-for-selected-page-changes | 5858 diff lines Description: \[Description of changes\] Adds a side-by-side review flow for selected non-conflicted Page changes before publishing. **Changes include:** - Added a Review Changes route/view for selected pending Page changes. - Reused the shared page version comparison UI for visual/text comparison. - Allows selecting either the published version or the autosave/new version. - Selecting the published version discards the pending autosave change. - Selecting the new version keeps it selected and publishes it from the action button. - Added the all-files-reviewed state with publish/close actions. - Kept con… ### [Draft: issue #3588894 follow-up to address feedback](https://git.drupalcode.org/project/canvas/-/merge_requests/1128) State: opened | Author: Ted Bowman (tedbow) | Branch: 3588894-follow-up | 372 diff lines Description: [Description of changes] addressing @wimleers feedback on https://git.drupalcode.org/project/canvas/-/merge_requests/1073 which is already merge ## AI Disclosure AI was used for the fixes Closes #3588894 ### [chore(deps): update dependency cspell to v10](https://git.drupalcode.org/project/canvas/-/merge_requests/1273) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/major-cspell-monorepo | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cspell](https://cspell.org/) ([source](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell)) | [`^9.2.0` → `^10.0.0`](https://renovatebot.com/diffs/npm/cspell/9.7.0/10.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/cspell/10.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/cspell/9.7.0/10.0.1?slim=true) | > :exclamation: **I… ### [chore(deps): update dependency @eslint/compat to v2](https://git.drupalcode.org/project/canvas/-/merge_requests/1306) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/eslint-compat-2.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@eslint/compat](https://github.com/eslint/rewrite/tree/main/packages/compat#readme) ([source](https://github.com/eslint/rewrite/tree/HEAD/packages/compat)) | [`^1.3.1` → `^2.0.0`](https://renovatebot.com/diffs/npm/@eslint%2fcompat/1.4.1/2.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@eslint%2fcompat/2.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confide… ### [chore(deps): update dependency @chromatic-com/storybook to v5](https://git.drupalcode.org/project/canvas/-/merge_requests/1305) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/chromatic-com-storybook-5.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | [`^3.2.2` → `^5.0.0`](https://renovatebot.com/diffs/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@chromatic-com%2fstorybook/5.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1?slim=true) | >… ### [fix(deps): update npm minor and patch](https://git.drupalcode.org/project/canvas/-/merge_requests/1238) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/npm-minor-and-patch | 77 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm) | [`4.11.1` → `4.12.1`](https://renovatebot.com/diffs/npm/@axe-core%2fplaywright/4.11.1/4.12.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@axe-core%2fplaywright/4.12.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@axe-core%2fplaywright/4.11.1/4.12.1?slim=true) | | [@babel/parser](… ### [chore(deps): update mysql docker tag to v8.4](https://git.drupalcode.org/project/canvas/-/merge_requests/1272) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/mysql-8.x | 13 diff lines Description: This MR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | mysql | service-image | minor | `8.0` → `8.4` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - "before 6am on Monday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this MR, c… ### [Draft: Add exposed slots: per-entity editable areas in content templates](https://git.drupalcode.org/project/canvas/-/merge_requests/1359) State: opened | Author: Lauri Timmanee (lauriii) | Branch: 3591817-add-exposed-slots-per-entity-editable-areas-in-content-templates | 11843 diff lines Description: Spec driven development with AI was used to develop the MR. Closes #3591817 ### [Resolve #3591803: AutoSaveManager::saveEntity() silently clears unresolved conflicts for Page entities"](https://git.drupalcode.org/project/canvas/-/merge_requests/1354) State: opened | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591803-silent-conflict-resolution-in-save-entity | 234 diff lines Description: ## Description saveEntity() always recomputed original_hash from the current stored entity hash. When a conflict was active (the stored entity had been externally updated after the auto-save item was created), this advanced original_hash to match the current stored hash, making getUnresolvedConflictForEntity() find no mismatch on the next call. The fix checks, for Page entities only, whether getUnresolvedConflictForEntity() detects an active conflict before persisting original_hash. If a conflict is active, the value already stored in the auto-save item is preserved instead. ## Testing ins… ### [Draft: #3591667: `dr canvas:doctor` — 🚧](https://git.drupalcode.org/project/canvas/-/merge_requests/1358) State: opened | Author: Wim Leers (wimleers) | Branch: 3591667-dr-canvas-validate | 4007 diff lines Description: See issue. AI-Generated: Yes. > [!note] > > :information_source: This is a huge MR. It also has MANY commits. The intent: be the opinionated expert human-in-the-loop, but let AI write all code. Writing a comprehensive spec up front for this was impractical. The starting point was https://git.drupalcode.org/project/canvas/-/work_items/3591667's description in its state on July 10. > > As of July 15, 13:09, the functionality goals are achieved (according to @wimleers), so now it's time to scrutinize the architecture, then the code: > > > :checkered_flag: It now basically works the way I'd expe… ### [Resolve #3591785: Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/merge_requests/1356) State: opened | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591785-strengthen-autosave-normalization | 906 diff lines Description: ## Summary This branch consolidates the typed-data normalization logic that `AutoSaveManager` and `ComponentSourceBase` previously duplicated into a single method, `TypedDataHelper::castRawPhpTypes()`. ## What changed and why `AutoSaveManager::normalizeEntity()` (hash source) and `ComponentSourceBase::castRawTypedConfigToPhpTypes()` (component-shape normalization) each contained their own primitive-casting and traversal logic. These are merged into `TypedDataHelper::castRawPhpTypes()`, which already existed for the config typed-data path but was not wired into `toStorableArray()`. During c… ### [Issue #3573022: Block config imports that delete an in-use component (data loss / WSOD)](https://git.drupalcode.org/project/canvas/-/merge_requests/1360) State: opened | Author: Christian López Espínola (penyaskito) | Branch: 3573022-prevent-config-import-component-used | 389 diff lines Description: Closes #3573022 ## What this MR does Adds a `ConfigEvents::IMPORT_VALIDATE` subscriber (`ComponentConfigImportValidator`) that blocks a configuration import which would delete a Canvas `Component` config entity — or backing config a retained `Component` depends on (e.g. a `js_component`) — while that component is still used by content (a published revision or an auto-save draft). Core's `ConfigImporter` deletes config entities via the low-level `Config::delete()`, bypassing `ConfigEntityBase::preDelete()` and therefore `Component::onDependencyRemoval()` (which would switch the component to … ### [#3591798: "Changes from MR 1347 with test fix"](https://git.drupalcode.org/project/canvas/-/merge_requests/1370) State: opened | Author: Kunal Sachdev (kunal.sachdev) | Branch: 3591798-changes-from-mr1347-with-test-fix | 201 diff lines Description: ## Testing instructions **Test Case 1: Canvas Page Preview - Reload** 1. Setup: - Navigate to a Canvas page that has translations (if it exists, or create one). - Ensure at least one non-default language has a translation (e.g., French). 2. Steps: - [ ] Open the Canvas page in editor. - [ ] Click the language select dropdown. - [ ] Verify the non-default language (for which translation is available) shows: - A checkmark icon next to the language name - A 3 dots menu button - [ ] Click the French language option. - [ ] Verify the translated content renders in the preview. - [ ] Reload the page.… ### [#3591821: Default page title remains intact when switching different language previews](https://git.drupalcode.org/project/canvas/-/merge_requests/1364) State: opened | Author: utkarsh_33 (Utkarsh_33) | Branch: 3591821-page-title-changes | 130 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591821 ### [Draft: Resolve "Canvas topbar's fixed width is causing the icons to overlap on zooming"](https://git.drupalcode.org/project/canvas/-/merge_requests/1372) State: opened | Author: utkarsh_33 (Utkarsh_33) | Branch: 3591794-canvas-topbars-fixed-width-is-causing-the-icons-to-overlap-on-zooming-follow-up | 92 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591794 --- COMMITS (24h) --- - [3919ab50](https://git.drupalcode.org/project/canvas/-/commit/3919ab50b208c370172f6ecbbb98c02dbeb5b55f) Commit message: — Bálint Kléri (2026-07-15T18:07:18.000+00:00) - [3d2fe4c4](https://git.drupalcode.org/project/canvas/-/commit/3d2fe4c47ae3832468eee55b53d785a978fe970c) feat(Headless): #3591823 Add support for rendering Canvas component trees in the Headless SDK — wotnak (2026-07-15T14:50:00.000+00:00) - [099f1b13](https://git.drupalcode.org/project/canvas/-/commit/099f1b1313b01fd0a789b5d8715bcecde49de6c2) feat(Headless): #3591822 Add configuration UI for headless frontends — Bálint Kléri (2026-07-15T13:45:48.000+00:00) - [1b40b5e4](https://git.drupalcode.org/project/canvas/-/commit/1b40b5e46db1f0737c00494fdd86a1c9a935941f) chore(Headless): #3591826 Simplify headless app environment configuration — Bálint Kléri (2026-07-15T13:17:18.000+00:00) ======================================================================== ## [7] summariseModule:ai_context:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Context Control Center (CCC) (machine name: ai_context) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khalil (ahmad-khalil-imagex), Kristen Pol (kepol), Pravesh Poonia (Pravesh_Poonia)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

            Context Control Center (CCC)

            then use

            ,

            ,

              /
            • , and as needed. Output only the HTML fragment with no surrounding , , or
              tags. After the project summary prose, add a single subsection titled "

              How can I help on this project?

              " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Usage record page leaks context item content and grants links without access checks](https://git.drupalcode.org/project/ai_context/-/work_items/3586311) State: opened | Updated: 2026-07-16 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint13, 2026Sprint14, ai::inside, blocker::beta Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !208 [Issue #3586311: Harden usage record and listing access checks.](https://git.drupalcode.org/project/ai_context/-/merge_requests/208) | State: opened | Author: Pravesh Poonia (Pravesh_Poonia), 701 diff lines Description: ## Problem Follow-up to: #3586294 Parent: #3586310 `AiContextUsageRecordController` renders the full current content of the referenced context item via the entity view builder with no `access('view')` check. The route only requires `view ai context usage`, so a user with that permission alone can read the content of items they cannot view — notably items unpublished since the usage was recorded (viewing those requires `view any unpublished ai context item` or ownership). The same page also exposes affordances without matching access: - The context item label is disclosed via `toLink()` in… ### [Allow agents to opt-out of context auto-injection](https://git.drupalcode.org/project/ai_context/-/work_items/3586308) State: opened | Updated: 2026-07-16 | Author: Kristen Pol (kepol) | Assigned: Tamas Balog (tbalog) | Labels: 2026Sprint14, ai::inside, category::feature, needs ux review Description: ## Problem/motivation Follow-up to: #3586268+s Some agents may want to use tools to pull in context as needed rather than have CCC auto-inject context (push). ## Solution Add an option for agents to opt-out of all CCC context injection. For now, let's add it as a toggle that defaults to enabled and is right above the Scope Subscriptions fieldset (outside of the fieldset). **Label:** Allow context injection **Description:** If enabled, context will be ranked based on scope subscriptions and other criteria. The ranked context will be injected into the agent's system prompt based on the c… ### [[Discuss] Context scope subscription approach](https://git.drupalcode.org/project/ai_context/-/work_items/3586320) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol), Aidan Foster (aidanfoster), Emma Horrell (emma-horrell) | Labels: 2026Sprint13, 2026Sprint14, ai::inside, blocker::stable Description: ## Problem/motivation Context scope subscriptions have been confusing for beta users, and scope plugins have different shapes that convolute the idea of subscriptions. We will be reachitecting scope plugins in: - #3586243+s - #3586281+s - #3586273+s so we should decide if "subscriptions" are the right mental model. ## Solution Analyze and update or create follow-up issues as needed. ### [Gather CCC contribution stats for code and non-code contributions for release notes](https://git.drupalcode.org/project/ai_context/-/work_items/3586222) State: closed | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint13, AI Context Management, AI Initiative Sprint, AI Innovation Description: ## Problem/motivation The current tools for generating release notes are inadequate as they only focus on code commits. They also require the issue number to be in the commit message. I want to gather the stats for all contributors for a release including non-code contributions which there are many. ## Solution The result for release notes should be something like: ``` New Features * #12345678 (with link) * #12345678 (with link) * ... Bug Fixes * #12345678 (with link) * #12345678 (with link) * ... Other Contributions * Plan = [number] * Task = [number] * Support = [number] Contributor… ### [Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs](https://git.drupalcode.org/project/ai_context/-/work_items/3586324) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint14, ai::inside, blocker::stable, category::bug Description: ## Problem Follow-up to: #3586323+s Several ai_context tests assert hardcoded admin URL paths instead of deriving expected paths from Drupal routes. This is the same failure class as [#3586323]: production code builds links with `Url::fromRoute()`, but tests break when an upstream module changes a route path. The agent edit form assertion was fixed separately in #3586323. This issue tracks the remaining brittle path assertions, grouped by risk. ### Pattern Brittle: ```php $this->assertSession()->linkByHrefExists('/admin/config/ai/agents/debug?agent_id=' . $agent_id); ``` Preferred: ``… ### [Allow subcontext scope to override parent scope](https://git.drupalcode.org/project/ai_context/-/work_items/3586218) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: Rob Loach (robloach) | Labels: 2026Sprint10, 2026Sprint11, 2026Sprint12, 2026Sprint13 Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !159 [Issue #3586218: Allow subcontext scope to override parent scope.](https://git.drupalcode.org/project/ai_context/-/merge_requests/159) | State: opened | Author: Kristen Pol (kepol), 4369 diff lines Description: ## Problem/motivation Follow-up to: #3576092 ## Solution From the other issue: Discussion with Emma+Aidan at UX sync: - Toggle (true/false) is defaulted to "Same as parent" (true) right above Global and then hide all of them - Description: "Disable to customize scope." Here's a [plan from cursor](https://www.drupal.org/files/issues/2026-04-21/subcontext_scope_inheritance_51216439.plan_.md) that can be updated to reflect ^ ## Tasks - [x] Add code - [x] Review code - [ ] Manually test code ## AI usage - [ ] AI assisted issue - [ ] AI assisted code - [x] AI generated code --- MERGE REQUESTS (24h) --- ### [Issue #3586324: Replace hardcoded admin path assertions in tests with...](https://git.drupalcode.org/project/ai_context/-/merge_requests/217) State: opened | Author: Ahmad Khalil (ahmad-khalil-imagex) | Branch: 3586324-replace-brittle-hardcoded-admin-path-assertions-in-functional-and-kernel-tests-with-route-derived-urls | 2087 diff lines Description: # Route-path test hardening ## Problem Production code in `ai_context` builds every admin link with `Url::fromRoute()`, but many tests asserted hardcoded URL strings (e.g. `'/admin/config/ai/agents/debug?agent_id=' . $agent_id`). When an upstream module moves a route — as `ai_agents` did in 1.3.2 by relocating agent URLs under `/admin/config/ai/tools-automation/` — those tests fail even though `ai_context` behaves correctly, producing false negatives in CI on dependency updates unrelated to `ai_context` changes. #3586323 fixed one such assertion; this MR addresses the rest, plus the optional… --- COMMITS (24h) --- (none) ======================================================================== ## [8] summariseModule:ai_search:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Search (machine name: ai_search) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhisek Mazumdar (abhisekmazumdar), Artem Dmitriiev (a.dmitriiev)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

              AI Search

              then use

              ,

              ,

                /
              • , and as needed. Output only the HTML fragment with no surrounding , , or
                tags. After the project summary prose, add a single subsection titled "

                How can I help on this project?

                " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Batch embeddings for improved indexing performance](https://git.drupalcode.org/project/ai_search/-/work_items/3584024) State: opened | Updated: 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: This is a placeholder for AI Core issue https://git.drupalcode.org/project/ai/-/work_items/3568648 . The development of ai_search submodule is deprecated, so this issue is for porting functionality from parent issue. ### [RagTool::execute() should expose structured per-result data and check entity access](https://git.drupalcode.org/project/ai_search/-/work_items/3584031) State: opened | Updated: 2026-07-15 | Author: Abhisek Mazumdar (abhisekmazumdar) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !65 [Issue #3584031: RagTool::execute() should expose structured per-result data](https://git.drupalcode.org/project/ai_search/-/merge_requests/65) | State: opened | Author: Abhisek Mazumdar (abhisekmazumdar), 146 diff lines Description: ## Problem/Motivation `RagTool::execute()` (`src/Plugin/AiFunctionCall/RagTool.php`) only ever hands the LLM a single flattened text string built from the search results. None of the per-result data survives the call: not which entity a chunk came from, not its score, not the raw chunk text. `getStructuredOutput()` returns `results` from `$this->results`, but `execute()` builds its output into a local `$end_results` array and never assigns anything to `$this->results`. It is always `[]`. This blocks consumers who want the *retrieved sources themselves*, not just the LLM's answer, from deleg… --- MERGE REQUESTS (24h) --- ### [Cherry pick 7a76c143](https://git.drupalcode.org/project/ai_search/-/merge_requests/64) State: opened | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-7a76c143 | 783 diff lines ### [#3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred]](https://git.drupalcode.org/project/ai_search/-/merge_requests/60) State: opened | Author: Artem Dmitriiev (a.dmitriiev) | Branch: 3584018-heading-embedding-strategy-commonmark | 1074 diff lines Description: Closes #3584018 ### [Resolve "Batch embeddings for improved indexing performance"](https://git.drupalcode.org/project/ai_search/-/merge_requests/53) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: 3584024-batch-embeddings-for-improved-indexing-performance | 711 diff lines Description: Closes #3584024 --- COMMITS (24h) --- (none) ======================================================================== ## [9] summariseModule:field_widget_actions:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Field Widget Actions (machine name: field_widget_actions) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Artem Dmitriiev (a.dmitriiev)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                Field Widget Actions

                then use

                ,

                ,

                  /
                • , and as needed. Output only the HTML fragment with no surrounding , , or
                  tags. After the project summary prose, add a single subsection titled "

                  How can I help on this project?

                  " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Generate UUIDs for list-style widget-action settings applied via config actions](https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578823) State: opened | Updated: 2026-07-16 | Author: Daniel Bosen (daniel.bosen) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !27 [Generate missing uuids for field widget action settings](https://git.drupalcode.org/project/field_widget_actions/-/merge_requests/27) | State: opened | Author: Artem Dmitriiev (a.dmitriiev), 503 diff lines Description: The setupFieldWidgetAction config action requires every field widget action to be declared in the recipe with a hard-coded UUID as its array key. Because those UUIDs were static, you can not add multiple suggestion buttons to a single edit form: the actions collide on their keys, so every button ends up writing its AI content suggestion into the same field instead of each button targeting its own field. Let the recipe declare actions as a plain list and have the plugin generate a unique UUID per item at apply time — exactly as the UI does when actions are added interactively — so each button … ### [Support Automator Chain trigger with Field Widget Actions](https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578819) State: closed | Updated: 2026-07-15 | Author: Zsolt Gere (gerezs) | Assigned: unassigned | Labels: Description: Feature suggest: In practice, we bumped into a situation where a workflow couldn't be done in a single Automator flow because of context window limit and in general it couldn't work as a single prompt and we didn't want to have multiple fields for a multiturn workflow so we figured to create the workflow of Automator Chain. We wanted to include this as an action on the edit page without page reload but FWA ddidn't allow to use Automator Chain. I asked a coding agent to prototype this and you can see this FWA form allows to select Aotmator Chain type option when adding a New Action, Next it al… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [10] summariseModule:ai_translate:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI translate (machine name: ai_translate) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: arne michiels (aren33k)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                  AI translate

                  then use

                  ,

                  ,

                    /
                  • , and as needed. Output only the HTML fragment with no surrounding , , or
                    tags. After the project summary prose, add a single subsection titled "

                    How can I help on this project?

                    " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows](https://git.drupalcode.org/project/ai_translate/-/work_items/3585533) State: opened | Updated: 2026-07-15 | Author: arne michiels (aren33k) | Assigned: arne michiels (aren33k) | Labels: category::bug, state::needsWork Description: Problem/Motivation When ai_translate is used together with layout_builder_at for asymmetric Layout Builder translations, translated inline blocks are cloned correctly, but inline_block_usage rows are not created for the cloned translated blocks. This leaves the translated inline blocks in an incomplete state and later causes access dependency failures, for example when opening Media Library on a media field inside the translated inline block. Steps to reproduce 1. Enable `ai_translate` / `layout_builder_at` / Layout Builder on a translatable content type 2. Create a node using Layout Builder… --- MERGE REQUESTS (24h) --- ### [3585533: fix inline block usage](https://git.drupalcode.org/project/ai_translate/-/merge_requests/31) State: opened | Author: arne michiels (aren33k) | Branch: 3585533-ai-translation-of-asymmetric-layout-builder-inline-blocks-does-not-create-inline-block-usage-rows | 206 diff lines Description: Closes #3585533 --- COMMITS (24h) --- (none) ======================================================================== ## [11] generateTldr:developer ======================================================================== You are an editor distilling a Drupal AI project newsletter into its most important highlights. You are writing for a technical developer audience. Be specific — name modules, merged features, and critical bugs. Read all the module summaries below. Separate the highlights into two categories: - SHIPPED: things that were merged, fixed, released, or completed during this period. - ONGOING: things that are actively in progress, under review, or blocked. Be specific — name the module, what happened, and why it matters. Do not use emoticons or mdashes. Do not include any text outside the two sections. When you mention a specific issue or merge request, add an inline citation using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations immediately after the relevant phrase, before any punctuation. Format as two HTML sections. Use exactly this structure (all
                  • elements must be inside the
                      , never outside it):

                      Shipped

                      1. Title here — One sentence explanation [1].
                      2. Another title — One sentence explanation.

                      Ongoing

                      1. Title here — One sentence explanation [2].
                      Up to 5 items per section. Do not output any text, tags, or characters outside these two sections. Output only the HTML fragment, no surrounding tags. --- REFERENCE LIST --- [1] Create an HTML to Markdown API and service (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574246 [2] Integrate ChatProcessor plugin system into AI Chatbot DeepChat block (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3585077 [3] Add YAML support to the MDX editor code blocks (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586585 [4] Create plugins for interacting with multimedia in AI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3463843 [5] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [6] Autosave node interfers with AI Chatbot (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3505569 [7] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [8] Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586570 [9] Ecosystem: Badge for AI Initiative-supported modules (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586601 [10] Support Automator Chain trigger with Field Widget Actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586602 [11] Make AI API Explorer have chat history (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3528949 [12] AI Balloon Menu throws uncaught TypeError on selection change when user lacks 'use ai ckeditor' permission, breaking media insertion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586588 [13] Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586542 [14] Visual regression baselines need regenerating after the MDXEditor dark theme fixes (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586600 [15] Document the AI module ecosystem: a categorized list of related modules with links and summaries (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586482 [16] Add a Moderation Guardrail plugin (configurable moderation provider/model as a guardrail) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586531 [17] Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586573 [18] Graceful error handling when an AI Provider is not setup correctly (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3549312 [19] Scope global guardrails by request provider id, model and/or tags (conditional global guardrail sets) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586529 [20] [Meta] AI 1.5.0 release: feature and task candidates (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586593 [21] The Toolbar Chatbot runs the fold out animation on page reload (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568246 [22] Tool Explorer does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582473 [23] MDX Editor does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582474 [24] "AI Guardrails" or "AI Moderation Guardrails"? (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586471 [25] Match "Global Guardrails" config page title with "Global AI Guardrails" menu item (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586476 [26] Create Provider Documentation Page for OpenAI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3533040 [27] Validation of unexisting fields on paragraphs actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3571033 [28] Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3547470 [29] Add league/commonmark as real dependency not a suggestion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586595 [30] Support the `ai_json_schema` element inside off-canvas dialogs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586536 [31] Add rich-text image description support to AI Automators (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586478 [32] Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3584951 [33] Suggest Tags automator should work with Tagify (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3536912 [34] Add Summarization operation type support to the echoai test provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586537 [35] Add non-required visual regression tests for the four built UI elements (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586461 [36] Batch embeddings for improved indexing performance (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568648 [37] Do not assume action definitions have a type when deriving action plugin functions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586589 [38] Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586553 [39] ai_translate: ContentTranslationControllerOverride::overview() fatals when the parent controller returns a Response (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586597 [40] ai_translate: option to translate all fields of an entity in a single LLM call instead of one call per field (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586598 [41] Reject caller-supplied execution identity fields at /api/deepchat boundary (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574662 [42] Issue#3586446:CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler fixes (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1824 [43] feat: #3586585 Add YAML support to the MDX editor code blocks (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1823 [44] #3585077: Integrate chatprocessor plugin (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1497 [45] [#3526390] feat: Improve the AI Search recursive retrieval of a specific quantity of results (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1822 [46] fix(ai_ckeditor): remove stale toolbar items on uninstall and warn on confirm page (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1731 [47] Issue #3586468: "Add interactive refinement capability to Field Widget Actions Automation" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1629 [48] Use service for html to markdown convertion + markdownify integration (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1747 [49] Issue #3586542: Fix documentation staleness — automator-type ID drift,... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1737 [50] fix: #3586573 Tone of voice CKEditor Plugin does not use the translated... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1733 [51] Fix the MDX Editor for Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1616 [52] Issue #3582473: Tool Explorer does not render correctly with Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1446 [53] Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1644 [54] Resolve #3586599: "Tests are failing for phpstan" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1821 [55] Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1638 [56] Issue #3533040:Create Provider Documentation Page for OpenAI (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1530 [57] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1021 [58] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/894 [59] Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1680 [60] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1628 [61] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1679 [62] Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1553 [63] Issue #3586537 Add Summarization operation type support to the echoai test provider (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1681 [64] Issue#3585328:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1820 [65] Resolve "Add non-required visual regression tests for the four built UI elements" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1608 [66] fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1799 [67] Issue#3586558:Preserve-HTML-In-Streamed-Output fixes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1818 [68] Issue#3586553:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1819 [69] Issue #3574662: Add boundaries and test (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1812 [70] Issue#3586491:add-a-during-generate-streaming-section-to-the-guardrail-set-for... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1816 [71] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1817 [72] Issue #3499451: Restore toolbar chatbot state idempotently so a dialog re-attach cannot close it (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1815 [73] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1814 [74] Issue #3499451: Fixed chatbot not reopening after CKEditor/media modal closes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1277 [75] array_flip(): Can only flip string and integer values in config_ignore_ignored_alter() (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586231 [76] Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity) (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586236 [77] fix(#3575454) add vectordb to docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/73 [78] Automated Project Update Bot fixes (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/75 [79] Draft: chore: add bulk chunking (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/63 [80] fix: #3586236 Do not abort recipe apply when amazee.ai trial provisioning fails (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/78 [81] chore: general improvements, switch to zensical docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/79 [82] chore: run rector set to php 8.0 (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/51 [83] Add support for batch embeddings (gemini_provider, Issue) — https://git.drupalcode.org/project/gemini_provider/-/work_items/3589183 [84] Let an agent use a role when running a tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3518167 [85] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [86] Add limits on how often a tool can run (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3547995 [87] Add a per-tool setting to restrict a tool from being called more than once per response (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586051 [88] [Meta] Road to 1.4.0 release (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586017 [89] Array to string conversion in Token::doReplace() when a dynamical token value is an array (applyTokens) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586043 [90] AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, so the status storage cannot be swapped (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586054 [91] feat: Forward tool image output to next loop iteration for vision models (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586018 [92] Add possibility for an agent to store and read instructions from a file (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3572361 [93] Create implementation of ShortTermMemory (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3546411 [94] feat: Per-tool approval mode (pre-approved / approve-once / always) with loop pause-resume (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586020 [95] Fix streaming (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577520 [96] Use streamed chat for agents (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3538174 [97] Default information tools | Interactive section disappears after adding tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586049 [98] PHPUnit CI job fails (exit code 1) for every test class despite all assertions passing (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586053 [99] Add test coverage for externally-driven execution (setLooped(FALSE)) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586052 [100] "Use Artifact storage" checkbox not necessary? (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586046 [101] Issue #3547995: Add deterministic tool usage limits. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/224 [102] feat: #3586051 Add a per-tool setting to restrict a tool from being called... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/299 [103] Draft: Resolve #3572361 "Add possibility for" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/233 [104] Issue #ai_agents-3577520: Streaming fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/290 [105] Type-hint AiAgentStatusStorageInterface instead of PrivateTempStatusStorage in AgentStatusSubscriber. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/304 [106] Draft: Resolve #3538174 "Use streamed chat" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/165 [107] Issues/3586052: Add tests for setlooped. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/300 [108] Canvas AI: UI/Functional update. Lock the canvas during a build and add a long-running AI-tasks UI element to the chat (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591724 [109] useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591832 [110] Tailwind CSS added by code components overrides theme level CSS (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591831 [111] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [112] Multi-bundle content-entity-reference picks fail to coalesce into a branch expression (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591829 [113] Restore browser-based component sync for Canvas Headless (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591830 [114] Allow fields to be added to the page entity type (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3568228 [115] Support multi-target-bundle references in code component content-entity-reference props (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591656 [116] Add support for rendering Canvas component trees in the headless SDK (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591823 [117] Boolean props auto-enable when another prop is changed in the Canvas form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591716 [118] Incorrect folder assignment for newly created code components (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591828 [119] Add configuration UI for headless frontends (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591822 [120] Simplify headless app environment configuration (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591826 [121] Canvas AI: Add the place_components AI tool (+ kernel test) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591811 [122] Radio button props loose value when another prop value is changed in the component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591827 [123] Undefined array key in getClientSideInfo() transforms when a prop's shape no longer exists in component metadata (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591824 [124] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [125] feat(Conflict detection): #3591723 "Add 'Conflict detected' toast message" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1295 [126] feat(Conflict detection): #3591591 Expand conflict resolution UI with... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1317 [127] 3591832: useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1377 [128] Draft: issue #3588894 follow-up to address feedback (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1128 [129] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [130] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [131] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [132] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [133] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [134] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [135] Draft: Add exposed slots: per-entity editable areas in content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1359 [136] Resolve #3591803: AutoSaveManager::saveEntity() silently clears unresolved conflicts for Page entities" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1354 [137] Draft: Resolve #3591656: Support multi-target-bundle references in content-entity-reference props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1369 [138] fix(Headless): #3591830 Restore browser-based component sync for Canvas Headless (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1375 [139] Draft: #3591667: `dr canvas:doctor` — 🚧 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1358 [140] feat(Headless): #3591823 Add support for rendering Canvas component trees in the headless SDK (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1371 [141] Resolve #3591785: Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [142] #3591828 Refetch folder list after newly exposing a code component (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1374 [143] feat(Headless): #3591822 Add configuration UI for headless frontends (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1368 [144] chore(Headless): #3591826 Simplify headless app environment configuration (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1373 [145] Issue #3573022: Block config imports that delete an in-use component (data loss / WSOD) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1360 [146] #3591798: "Changes from MR 1347 with test fix" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1370 [147] #3591821: Default page title remains intact when switching different language previews (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1364 [148] Draft: Resolve "Canvas topbar's fixed width is causing the icons to overlap on zooming" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1372 [149] Usage record page leaks context item content and grants links without access checks (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586311 [150] Allow agents to opt-out of context auto-injection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586308 [151] [Discuss] Context scope subscription approach (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586320 [152] Gather CCC contribution stats for code and non-code contributions for release notes (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586222 [153] Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586324 [154] Allow subcontext scope to override parent scope (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586218 [155] Issue #3586311: Harden usage record and listing access checks. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/208 [156] Issue #3586324: Replace hardcoded admin path assertions in tests with... (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/217 [157] Issue #3586218: Allow subcontext scope to override parent scope. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/159 [158] Batch embeddings for improved indexing performance (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584024 [159] RagTool::execute() should expose structured per-result data and check entity access (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584031 [160] Cherry pick 7a76c143 (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/64 [161] Issue #3584031: RagTool::execute() should expose structured per-result data (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/65 [162] #3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred] (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/60 [163] Resolve "Batch embeddings for improved indexing performance" (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/53 [164] Generate UUIDs for list-style widget-action settings applied via config actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578823 [165] Support Automator Chain trigger with Field Widget Actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578819 [166] Generate missing uuids for field widget action settings (field_widget_actions, MR) — https://git.drupalcode.org/project/field_widget_actions/-/merge_requests/27 [167] AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585533 [168] 3585533: fix inline block usage (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/31 --- MODULE SUMMARIES ---

                      AI (Artificial Intelligence)

                      The 24-hour window saw significant progress on UI rendering, guardrails, and API boundaries. Several bug fixes and enhancements were merged, and new feature work continued in open merge requests.

                      The MDX Editor does not render correctly with Gin dark theme and Tool Explorer does not render correctly with Gin dark theme were both resolved, restoring proper styling when the Gin admin theme is used in dark mode. The Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy was fixed so that translated taxonomy terms now correctly display and prompt in the editor. Match "Global Guardrails" config page title with "Global AI Guardrails" menu item and "AI Guardrails" or "AI Moderation Guardrails"? aligned naming for consistency across the interface.

                      The Add rich-text image description support to AI Automators feature was merged, enabling automators to process embedded images in formatted text fields and optionally store generated image descriptions as metadata. Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation was merged, providing a concrete streaming guardrail plugin and tests for mid-stream content evaluation. The Support the `ai_json_schema` element inside off-canvas dialogs change was merged, making the JSON schema form element work reliably in off-canvas contexts. The Add Summarization operation type support to the echoai test provider was merged, allowing kernel tests against the mock provider. Add non-required visual regression tests for the four built UI elements landed, introducing Playwright-based visual regression coverage for the frontend bundles. The Reject caller-supplied execution identity fields at /api/deepchat boundary was merged, hardening the chatbot API endpoint by rejecting fields like executor_uid from external payloads. A type-safety issue in Do not assume action definitions have a type when deriving action plugin functions was resolved. The The Toolbar Chatbot runs the fold out animation on page reload and Type error and infinite AJAX request loop when the Agent is unable to resolve a request job were both closed.

                      Several feature requests remain in progress. The Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration has an open MR (!1731) adding an uninstall hook to clean up stale configuration. The Chatbot closes itself when adding a modal has MR !1815 open, restoring toolbar chatbot state idempotently. The Create an HTML to Markdown API and service has MR !1747 open, introducing a service for HTML-to-markdown conversion. Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names has MR !1737 open with documentation corrections. Add YAML support to the MDX editor code blocks has MR !1823 open. The Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &) has MR !1819 open, addressing entity-decoding mismatches. Add interactive refinement capability to Field Widget Actions Automation has MR !1629 open.

                      The Visual regression baselines need regenerating after the MDXEditor dark theme fixes was opened following the dark-theme corrections; the stored baselines are now stale and need to be regenerated against the corrected UI.

                      How can I help on this project?

                      Review MR !1731 for the ai_ckeditor uninstall hook. Review MR !1815 for the toolbar chatbot state idempotency fix. Pick up the unassigned Visual regression baselines need regenerating after the MDXEditor dark theme fixes to regenerate and commit the updated baseline screenshots.

                      Contributors: Abhinav Jha (ajabhinavjha30), Abhishek Dhariwal (adaptative), Ahmad Khader (Ahmad-Khader) [3], Ann Mary Sruthy (annmarysruthy), Artem Dmitriiev (a.dmitriiev), Avinash jha (avinash.jha) [1], Bharat Kelotra (bharatkelotra), Billy Davies (billy.davies), codebymikey, Joshua Fernandes (joshua1234511), Levente Besenyei (LeventeB) [1], Marcus Johansson (Marcus_Johansson) [2], Prabhavathi Vanipenta (prabha1997) [1], Ricardo Castañeda (cadence96), Ryan Szrama (rszrama), Shubham Prakash (shubham.prakash) [1], Thomas Werthmüller (weri) [1]

                      ---

                      amazee.ai Private AI Provider

                      Several bug fixes and infrastructure improvements landed over the past 24 hours. Two critical bugs were resolved and closed: array_flip(): Can only flip string and integer values in config_ignore_ignored_alter(), which caused PHP warnings during Drush configuration management operations when Key::load() received empty values, and Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity), where trial endpoint capacity limits or network failures would abort recipe installations. The latter fix converts provisioning exceptions into graceful fallbacks rather than install-breakers.

                      Three merge requests were integrated: fix(#3575454) add vectordb to docs, Automated Project Update Bot fixes addressing issue #3586232, and chore: general improvements, switch to zensical docs, a substantial 927-line refactor migrating documentation infrastructure. Draft work continues on Draft: chore: add bulk chunking, which optimizes VDB batch inserts via a new insertMultipleIntoCollection() method in PostgresProvider and PostgresPgvectorClient.

                      How can I help on this project?

                      Review the draft bulk chunking MR targeting 2.0.x, focusing on the insertMultipleIntoCollection() API and PostgresProvider::indexItems() batching logic. Test the batch-insert optimization with large VDB indexing workloads to validate performance gains and confirm no regressions in chunking behavior.

                      Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah) ---

                      Gemini Provider

                      Activity this period focused on finalizing the batch embeddings implementation. Work on Add support for batch embeddings progressed with naming conventions finalized and the merge request updated accordingly. The continuous integration configuration was adjusted to load the required AI Core branch (2026Sprint14) for testing. This feature will enable the Gemini provider to leverage the batchEmbedContents method from the Gemini client when processing multiple embeddings requests, improving efficiency for bulk operations. The issue remains in needs review state with an open merge request.

                      How can I help on this project?

                      • Review the open merge request for batch embeddings support, testing the batchEmbedContents integration against the AI Core 2026Sprint14 branch.
                      • Check the module's issue queue for unassigned bugs or feature requests that need implementation work.
                      ---

                      AI Agents

                      Activity over the past 24 hours focused on feature proposals and bug identification ahead of the 1.4.0 release cycle. Several issues related to tool execution control were updated, including work on deterministic tool usage limits and a new per-tool setting to restrict tools from being called more than once per response, both of which have open merge requests under review.

                      Two bugs surfaced: AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, blocking custom storage implementations, and an array-to-string conversion warning in Token::doReplace() triggered during applyTokens. A UI issue was reported where the "Interactive" section disappears after adding a tool to an agent.

                      Test infrastructure issues emerged: PHPUnit CI jobs fail with exit code 1 despite all assertions passing. An MR adding test coverage for externally-driven execution (setLooped(FALSE)) remains open. The agent instruction file storage feature was closed.

                      How can I help on this project?

                      Review MR !304 to fix the AgentStatusSubscriber type-hint blocking custom storage. Review MR !290 for streaming fixes or MR !299 for per-tool call restrictions. Investigate and patch the PHPUnit exit-code issue blocking CI.

                      Contributors: Ahmad Khalil (ahmad-khalil-imagex), AKHIL BABU (AkhilBabu), Bharat Kelotra (bharatkelotra), Marcus Johansson (Marcus_Johansson), Nicolae Procopan (thebumikgmail.com), Prabhavathi Vanipenta (prabha1997)

                      ---

                      Drupal Canvas

                      Significant headless SDK improvements were merged this period. Add support for rendering Canvas component trees in the headless SDK landed via MR !1371, introducing a content-type-independent CanvasComponentTree renderer across all framework adapters, plus auto-generated component registries for Next, Astro, Nuxt, and TanStack Start. Add configuration UI for headless frontends was also merged (MR !1368), expanding headless configuration from a single URL to multiple frontends with an admin UI showing setup steps. Environment variable naming was unified in Simplify headless app environment configuration (MR !1373), replacing DRUPAL_BASE_URL with CANVAS_SITE_URL and removing the now-redundant DRAFT_ALLOWED_FRAME_ANCESTORS. A subsequent fix via Restore browser-based component sync for Canvas Headless (MR !1375) restored CORS and OPTIONS support broken by the environment changes, ensuring local frontends remain reachable during editor sessions.

                      Several data model and API issues remain in progress. Multi-bundle content-entity-reference picks fail to coalesce into a branch expression (MR !1376) addresses validation failures when content-entity-reference props target multiple bundles. useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (MR !1377) tackles an iframe sizing bug affecting Tailwind arbitrary vh classes. A fix for Incorrect folder assignment for newly created code components is under review in MR !1374.

                      Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Ben Mullins (bnjmnm), Bálint Kléri (balintbrews) [3], Christian López Espínola (penyaskito), Feliksas Mazeikis (f.mazeikis), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Narendra Singh Rathore (NarendraR), Nodar Davituri (Davituri), Ravi Maniyar (ravi.maniyar.123), Ted Bowman (tedbow), utkarsh_33 (Utkarsh_33), Wim Leers (wimleers), wotnak [1]

                      How can I help on this project?

                      Review MR !1377 for useSyncIframeHeightToContent iframe growth or MR !1376 for multi-bundle reference coalescing. Test MR !1374 for folder assignment to confirm components save to selected folders. Help reproduce or diagnose Tailwind CSS conflicts with theme-level styles.

                      ---

                      Context Control Center (CCC)

                      A merge request addressing Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs was opened. The work refactors test assertions that currently use hardcoded admin URL strings to instead derive paths from Drupal routes using Url::fromRoute(). This prevents false test failures when upstream modules relocate route paths, as occurred when ai_agents moved agent URLs under /admin/config/ai/tools-automation/ in version 1.3.2.

                      Progress continues on several initiatives. The Usage record page leaks context item content and grants links without access checks blocker remains open with an MR that hardens access checks in AiContextUsageRecordController, addressing a security concern where users with only view ai context usage permission could read unpublished context item content without proper authorization. Work also advanced on Allow subcontext scope to override parent scope, which adds a toggle to customize scope inheritance with a default "Same as parent" behavior.

                      The Gather CCC contribution stats for code and non-code contributions for release notes issue was closed, completing the effort to track both code commits and non-code contributions for release documentation.

                      How can I help on this project?

                      Review and test MR !208 for Usage record page access hardening, verifying that AiContextUsageRecordController properly enforces permissions. Review MR !217 for route-derived test assertions to validate the refactored test patterns.

                      Contributors: Ahmad Khalil (ahmad-khalil-imagex), Kristen Pol (kepol), Pravesh Poonia (Pravesh_Poonia)

                      ---

                      AI Search

                      A batch embeddings feature was merged to improve indexing performance, addressing Batch embeddings for improved indexing performance. This ports functionality from the deprecated ai_search submodule. The merge included 711 lines of changes to support batching operations during the embedding and indexing workflow.

                      Work continues on two open merge requests: #3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred] (1074 lines) introduces a new embedding strategy using CommonMark to split content on heading boundaries, and Cherry pick 7a76c143 (783 lines) is also under review.

                      An open issue tracking RagTool::execute() should expose structured per-result data and check entity access has an associated merge request (!65) awaiting review. The problem involves RagTool::execute() in src/Plugin/AiFunctionCall/RagTool.php flattening search results into a single string, losing per-result metadata like entity references and scores. The getStructuredOutput() method currently returns empty results because execute() never populates $this->results.

                      How can I help on this project?

                      Review MR !65 to validate the RagTool structured output changes and entity access checks. Test MR !60 with various Markdown documents to verify heading-based splitting behavior and fallback logic.

                      Contributors: Abhisek Mazumdar (abhisekmazumdar), Artem Dmitriiev (a.dmitriiev) ---

                      Field Widget Actions

                      The module saw active development on configuration action improvements this period. Generate UUIDs for list-style widget-action settings applied via config actions received a 503-line merge request (MR !27) addressing a limitation where recipe-based configuration required hard-coded UUIDs for each field widget action. This caused collisions when multiple suggestion buttons were added to a single form, resulting in all buttons targeting the same field. The proposed solution generates unique UUIDs at apply time, mirroring the interactive UI behavior.

                      Meanwhile, Support Automator Chain trigger with Field Widget Actions was closed after adding support for Automator Chain workflows. This feature enables multi-turn AI workflows on edit pages without page reloads, addressing context window limitations that prevented complex workflows from running as single prompts.

                      How can I help on this project?

                      Review the open MR !27 to validate UUID generation logic and test for collision scenarios. Test the newly added Automator Chain support with multi-turn workflows to ensure proper integration.

                      Contributors: Artem Dmitriiev (a.dmitriiev)

                      ---

                      AI translate

                      A merge request has been opened to address AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows. The issue affects sites using ai_translate with layout_builder_at for asymmetric Layout Builder translations. When inline blocks are cloned during translation, the module correctly duplicates the blocks but fails to create corresponding inline_block_usage database rows. This leaves translated blocks in an incomplete state, causing access dependency failures when interacting with fields like Media Library inside the translated inline blocks.

                      The fix inline block usage merge request proposes a solution spanning 206 lines of changes. The fix is currently in needs work status and awaiting review.

                      How can I help on this project?

                      Review the fix inline block usage merge request to help validate the approach for handling inline_block_usage rows. Test the patch with layout_builder_at and asymmetric translations to verify inline blocks behave correctly after translation.

                      Contributors: arne michiels (aren33k)

                      ======================================================================== ## [12] factcheck:tldr:developer ======================================================================== Layer-1 corrections: 1 Judge flags: 0 ======================================================================== ## [13] summariseModule:ai:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI (Artificial Intelligence) (machine name: ai) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhinav Jha (ajabhinavjha30), Abhishek Dhariwal (adaptative), Ahmad Khader (Ahmad-Khader) [3], Ann Mary Sruthy (annmarysruthy), Artem Dmitriiev (a.dmitriiev), Avinash jha (avinash.jha) [1], Bharat Kelotra (bharatkelotra), Billy Davies (billy.davies), codebymikey, Joshua Fernandes (joshua1234511), Levente Besenyei (LeventeB) [1], Marcus Johansson (Marcus_Johansson) [2], Prabhavathi Vanipenta (prabha1997) [1], Ricardo Castañeda (cadence96), Ryan Szrama (rszrama), Shubham Prakash (shubham.prakash) [1], Thomas Werthmüller (weri) [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                      AI (Artificial Intelligence)

                      then use

                      ,

                      ,

                        /
                      • , and as needed. Output only the HTML fragment with no surrounding , , or
                        tags. After the project summary prose, add a single subsection titled "

                        How can I help on this project?

                        " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Create an HTML to Markdown API and service](https://git.drupalcode.org/project/ai/-/work_items/3574246) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1747 [Use service for html to markdown convertion + markdownify integration](https://git.drupalcode.org/project/ai/-/merge_requests/1747) | State: opened | Author: Artem Dmitriiev (a.dmitriiev), 1445 diff lines Description: >>> [!note] Migrated issue Reported by: [mxr576](https://www.drupal.org/user/315522) >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation League\HTMLToMarkdown\HtmlConverter is initiated 3 times with 3 different configurations in current code, when #3574004: Generate a markdown version of (formatted) text field values gets solved that becomes the 4th one. https://git.drupalcode.org/search… ### [Integrate ChatProcessor plugin system into AI Chatbot DeepChat block](https://git.drupalcode.org/project/ai/-/work_items/3585077) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, aiChatbot, category::feature Description: >>> [!note] Migrated issue Reported by: [ahmad khader](https://www.drupal.org/user/3727855) Related to !1497 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation Integrate the ChatProcessor plugin system (added in #3492940) into the AI Chatbot module's DeepChat block. This allows site builders to select which ChatProcessor plugin handles chat interactions, decoupling the chatbot UI from … ### [Add YAML support to the MDX editor code blocks](https://git.drupalcode.org/project/ai/-/work_items/3586585) State: opened | Updated: 2026-07-16 | Author: AKHIL BABU (AkhilBabu) | Assigned: Ann Mary Sruthy (annmarysruthy) | Labels: aiAgent, category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1823 [feat: #3586585 Add YAML support to the MDX editor code blocks](https://git.drupalcode.org/project/ai/-/merge_requests/1823) | State: opened | Author: Ann Mary Sruthy (annmarysruthy), 197 diff lines Description: ## Problem/Motivation The MDX editor currently does not support YAML code blocks. The system prompts of the Canvas AI agents contain YAML, so the MDX editor cannot render those blocks properly. We need YAML supported as a code-block language in the MDX editor. ## Steps to reproduce 1. Using `ai_agents` `^1.3`, create an AI agent. 2. In the instructions field, insert a code block. 3. Try to set the code block language to YAML. 4. YAML is not available in the language list. ### [Create plugins for interacting with multimedia in AI](https://git.drupalcode.org/project/ai/-/work_items/3463843) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Needs manual testing, ai::inside Description: > [!note] Migrated issue > > > > > > Reported by: [kevinquillen](https://www.drupal.org/user/317279) > > Related to !1431 !761 ### Problem/Motivation Now that [#3462674: Create a generic AI plugin layer for CKEditor](https://www.drupal.org/project/ai/issues/3462674 "Status: Closed (fixed)") is pending a merge, one of the final OOTB AI plugins for CKEditor is generating an image from providers and saving the result back to the media library in Drupal. This would be a core piece of CKEditor plugin functionality. This is true for text to speech or audio providers as well. This is more of an … ### [ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models](https://git.drupalcode.org/project/ai/-/work_items/3586425) State: opened | Updated: 2026-07-16 | Author: josecarlosmedero | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::bug Description: **Problem / Motivation** `AiRequest.php` calls `setStreamedOutput(TRUE)` for all providers. The PHP client `gemini-api-php` sends a malformed request body when calling `streamGenerateContent` against Gemini 2.x models, resulting in `400 Bad Request`. The non-streaming endpoint `generateContent` works correctly with the same payload. The error in logs: `Error invoking model response: Client error: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent resulted in a 400 Bad Request response` Confirmed: the identical payload sent to `generateConten… ### [Autosave node interfers with AI Chatbot](https://git.drupalcode.org/project/ai/-/work_items/3505569) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: AI Initiative Sprint, aiChatbot, category::bug, priority Description: >>> [!note] Migrated issue Reported by: [the_g_bomb](https://www.drupal.org/user/492012) >>> Problem/Motivation If you are creating or editing a node and you choose to get the AI chatbot to help, requests can be interrupted if the node refreshes after an autosave. Steps to reproduce Install Drupal CMS Enable AI Recipe Choose to create an article Start typing your content Open the AI chatbot Start to ask it to add a field to the content type If you are unlucky enough time it so you submit your request just before the autosave is about to trigger, your request vanishes when the node refresh… ### [Chatbot closes itself when adding a modal](https://git.drupalcode.org/project/ai/-/work_items/3499451) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Ahmad Khader (Ahmad-Khader) | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1815 [Issue #3499451: Restore toolbar chatbot state idempotently so a dialog re-attach cannot close it](https://git.drupalcode.org/project/ai/-/merge_requests/1815) | State: opened | Author: Abhishek Dhariwal (adaptative), 46 diff lines Description: >>> [!note] Migrated issue Reported by: [heyyo](https://www.drupal.org/user/474388) Related to !1277 >>> Problem/Motivation ChatBot closes itself, and impossible to reopen-it, without refreshing the page Steps to reproduce 1. Create new content with CKEditor, for example basic page 2. Open ChatBot 3. Add Media into Ckeditor, we can see ChatBot closes 4. Include the Media 5. It's impossible to reopen the ChatBot > Related issue: [Issue #3505569](https://www.drupal.org/node/3505569) ### [Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration](https://git.drupalcode.org/project/ai/-/work_items/3586570) State: opened | Updated: 2026-07-15 | Author: Ricardo Castañeda (cadence96) | Assigned: unassigned | Labels: Has Testing Steps, aiCkeditor, category::bug, priority::normal Description: ## Summary When `ai_ckeditor` is uninstalled, it does not remove its toolbar button from existing CKEditor 5 editor configurations (`editor.editor.*`). If the **AI Balloon Menu** has been added to a text format toolbar, the configuration still references the removed plugin after uninstall. As a result, the text format configuration page can no longer build the toolbar correctly. ## Steps to reproduce 1. Install `ai_ckeditor`. 2. Go to **Configuration → Content authoring → Text formats and editors**. 3. Edit a CKEditor 5 text format (for example **Full HTML**). 4. Add the **AI Balloon Menu*… ### [Ecosystem: Badge for AI Initiative-supported modules](https://git.drupalcode.org/project/ai/-/work_items/3586601) State: opened | Updated: 2026-07-15 | Author: Rob Loach (robloach) | Assigned: unassigned | Labels: category::feature, priority::minor, state::accepted Description: Follow-up to: #3586482+s On https://project.pages.drupalcode.org/ai_dashboard/ , we list a bunch of modules that are part of the AI Ecosystem. We should have a badge for modules that are AI-Initiative supported. ### Suggested Implementation 1. Get the list of AI Initiative modules 2. Add a badge to the right of the project name when rendering 3. Add filter to only show official projects ### [Support Automator Chain trigger with Field Widget Actions](https://git.drupalcode.org/project/ai/-/work_items/3586602) State: opened | Updated: 2026-07-15 | Author: Zsolt Gere (gerezs) | Assigned: Ahmad Khalil (ahmad-khalil-imagex) | Labels: 2026Sprint14, aiAutomators, category::feature, fieldWidgetActions Description: Feature suggest: In practice, we bumped into a situation where a workflow couldn't be done in a single Automator flow because of context window limit and in general it couldn't work as a single prompt and we didn't want to have multiple fields for a multiturn workflow so we figured to create the workflow of Automator Chain. We wanted to include this as an action on the edit page without page reload but FWA ddidn't allow to use Automator Chain. I asked a coding agent to prototype this and you can see this FWA form allows to select Aotmator Chain type option when adding a New Action, Next it al… ### [Make AI API Explorer have chat history](https://git.drupalcode.org/project/ai/-/work_items/3528949) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: AKHIL BABU (AkhilBabu) | Labels: Has Testing Steps, aiApiExplorer, category::task, priority Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1049 >>> Problem/Motivation This is dependent on #3528948: Add chat_history form element. When the chat history form field is available, we should add it to the Chat explorer in AI API Explorer and remove our custom solutions there. Proposed resolution Remove the current way of loading text and images. Add the chat_history form field instead System message should stay as it is. > Related issue: [Issue #3528948](https://www.drupal.org/node/3528948) ### [AI Balloon Menu throws uncaught TypeError on selection change when user lacks 'use ai ckeditor' permission, breaking media insertion](https://git.drupalcode.org/project/ai/-/work_items/3586588) State: opened | Updated: 2026-07-15 | Author: Leandro Luvigne (lluvigne) | Assigned: Leandro Luvigne (lluvigne) | Labels: aiCkeditor, category::bug, state::needsWork Description: ## Summary The AI Balloon Menu (`ai_balloon_menu`) plugin does not check the `hasAccess` flag from the shared `ai_ckeditor_ai` config object, unlike the AI Assistant toolbar plugin (`aickeditor`) which correctly checks it. For users without the `use ai ckeditor` permission, this causes an uncaught `TypeError` on any non-collapsed selection change, which most commonly manifests as media insertion silently failing (the Media Library "Insert selected" AJAX request is aborted client-side). ## Steps to reproduce 1. Fresh Drupal core (Standard profile) + `composer require drupal/ai`, enable `ai` an… ### [Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names](https://git.drupalcode.org/project/ai/-/work_items/3586542) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: Has Testing Steps, aiAutomators, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1737 [Issue #3586542: Fix documentation staleness — automator-type ID drift,...](https://git.drupalcode.org/project/ai/-/merge_requests/1737) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 340 diff lines Description: ## Description A staleness audit of the module documentation under `docs/` (all pages untouched for 6+ months) found a number of pages that have drifted from the current code. Each finding below was verified against source — not just flagged by commit date — so these are confirmed mismatches, not merely old pages. The bulk of the breakage is **filename/ID drift** in the `ai_automators` automator-type pages: the doc filename no longer matches the plugin's `#[AiAutomatorType(id: ...)]`, usually because the code gained a `_field` / `_long` suffix, an id rename, or a typo. No automator plugins w… ### [Visual regression baselines need regenerating after the MDXEditor dark theme fixes](https://git.drupalcode.org/project/ai/-/work_items/3586600) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::task, priority::normal, state::accepted Description: ## Problem/Motivation The visual regression tests now fail. The rendered output of the MDXEditor changed when the Gin dark theme rendering was fixed in #3582474 (and the related Tool Explorer dark theme fix #3582473), so the committed baseline screenshots no longer match the current, correct output. These are expected diffs — the UI legitimately changed — not a regression. The stored baselines are simply stale. ## Proposed resolution Regenerate the visual regression baselines against the current MDXEditor rendering (light and dark theme) and commit the new reference images, so the suite pa… ### [Document the AI module ecosystem: a categorized list of related modules with links and summaries](https://git.drupalcode.org/project/ai/-/work_items/3586482) State: closed | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Description: ## Description The AI module has grown a large ecosystem of companion projects on drupal.org — providers, vector database (VDB) providers, agents, recipes, tools, automators, and full distributions/CMS profiles. Today there is no single, curated page in the AI module's documentation that tells a site builder or developer **what exists, where to find it, and what each project does.** Discovering these modules currently means searching drupal.org by hand or relying on word of mouth. A maintained ecosystem index would make the AI module dramatically easier to adopt: people could see at a glance… ### [Add a Moderation Guardrail plugin (configurable moderation provider/model as a guardrail)](https://git.drupalcode.org/project/ai/-/work_items/3586531) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, aiCoreModule Description: ## Goal Add a single configurable **Moderation Guardrail** plugin to the **Guardrails** system, so any moderation provider/model can be used as a guardrail. This makes "each moderation provider becomes a possible guardrail" achievable through configuration of one plugin, and is the foundation for folding external moderation into Guardrails. This issue covers **only creating the plugin**. The migration of existing `ai.external_moderation` configuration onto guardrail sets, and the deprecation of the old moderation runner, are handled separately in **#3586528** (which is blocked by this issue)… ### [Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy](https://git.drupalcode.org/project/ai/-/work_items/3586573) State: closed | Updated: 2026-07-15 | Author: Thomas Werthmüller (weri) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1733 [fix: #3586573 Tone of voice CKEditor Plugin does not use the translated...](https://git.drupalcode.org/project/ai/-/merge_requests/1733) | State: merged 2026-07-15 | Author: Thomas Werthmüller (weri), 38 diff lines Description: ## Summary When I create a taxonomy for the tone of voice and allow to translate the terms, in the UI of the CKEditor always the default language is displayed and also the description of this term is used for prompting and not the translated version. ## Environment - Drupal version: 11 - Module version: 1.4.3 ### Screenshots ![CleanShot_2026-06-26_at_16.30.17](https://git.drupalcode.org/-/project/106525/uploads/0df4b3af6167109ba085e44a575e6a88/CleanShot_2026-06-26_at_16.30.17.png){width="725" height="600"} ### [Graceful error handling when an AI Provider is not setup correctly](https://git.drupalcode.org/project/ai/-/work_items/3549312) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, aiCoreModule, category::bug, priority::normal Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !923 >>> Problem/Motivation On the search server setup page, the whole page goes WSOD if one of the providers is not setup correctly and doesn't handle errors correctly. An example of this is the Gemini provider, when no key is setup. We should not make it impossible to save any other type of Search API server, just because one provider is not setup correctly. Steps to reproduce (required for bugs, but not feature requests) Install the Gemini Provider. Install the Search API and Sear… ### [Scope global guardrails by request provider id, model and/or tags (conditional global guardrail sets)](https://git.drupalcode.org/project/ai/-/work_items/3586529) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::feature, priority::normal, state::accepted Description: ## Summary Allow guardrail sets — and their registration as **global guardrails** — to be **conditionally scoped by request provider id, model id and/or tags**, instead of always applying to every AI request. Today `ai.settings:global_guardrails` are attached unconditionally by `GlobalGuardrailsEventSubscriber` to every `PreGenerateResponseEvent`. ## Problem Global guardrails are all-or-nothing: every set listed in `ai.settings:global_guardrails` runs on every request, regardless of which provider is being called, which model is being requested, or what tags the request carries. This block… ### [[Meta] AI 1.5.0 release: feature and task candidates](https://git.drupalcode.org/project/ai/-/work_items/3586593) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: No Estimation Available, category::meta, priority::normal, v1.5.x-dev Description: Candidates for the 1.5.0 release. ### [The Toolbar Chatbot runs the fold out animation on page reload](https://git.drupalcode.org/project/ai/-/work_items/3568246) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Needs UX review, ai::inside Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1428 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: [One-line issue summary for stakeholders] Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation The chatbot was greatly improved with #3554510: Sync Design of Toolbar Chatbot with Canvas AI Chatbot, but one issue is that if you have a local storage to remember the position, when its open on page load it runs the open up… ### [Tool Explorer does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/work_items/3582473) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1446 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Tool Explorer does not render correctly with Gin dark theme Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation Follow up from https://git.drupalcode.org/project/ai_agents/-/work_items/3559183. The Tool Explorer UI only looks correct when using the Claro admin theme or Gin in light mode. When using Gin with the dark theme enabled, the Tool Explorer has styling issues that make it diffi… ### [MDX Editor does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/work_items/3582474) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, Has Testing Steps, ai::inside, aiCoreModule Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1445 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: MDX Editor does not render correctly with Gin dark theme Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation Follow up from https://git.drupalcode.org/project/ai_agents/-/work_items/3559183. The MDX Editor UI only looks correct when using the Claro admin theme or Gin in light mode. When using Gin with the dark theme enabled, the MDX Editor has styling issues that make it difficult to u… ### ["AI Guardrails" or "AI Moderation Guardrails"?](https://git.drupalcode.org/project/ai/-/work_items/3586471) State: closed | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: What it the proper name for this functionality? In the AI menu, it is listed as "AI Moderation Guardrails", but on configuration pages, it is just "AI Guardrails" - it should be consistent, IMHO. Also - and this is probably a separate issue - but why do all the AI menu items use title case (first letter of each word capitalized) while the rest of Drupal is pretty much standardized on sentence case (only the first letter of the first word is capitalized)? See https://www.drupal.org/docs/develop/user-interface-standards/interface-text#interface-text-title-link-heading -mike ### [Match "Global Guardrails" config page title with "Global AI Guardrails" menu item](https://git.drupalcode.org/project/ai/-/work_items/3586476) State: closed | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: 2026Sprint14, AI Innovation, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1644 [Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item](https://git.drupalcode.org/project/ai/-/merge_requests/1644) | State: merged 2026-07-15 | Author: Avinash jha (avinash.jha), 26 diff lines Description: I like consistency - luckily, it is also good UX. The menu link is "Global AI Guardrails" while the page title is just "Global Guardrails". Let's pick one. -mike ### [Create Provider Documentation Page for OpenAI](https://git.drupalcode.org/project/ai/-/work_items/3533040) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, category::task, documentation, priority::normal Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) >>> Problem/Motivation Currently there is no information about providers on https://project.pages.drupalcode.org/ai, except for https://project.pages.drupalcode.org/ai/1.1.x/providers/matris/ This makes it hard to know what to choose, why and how to set it up. We need detailed pages for each provider that we manage, or that is known to the community, so there is one place to look for information about what to use and where to use it. This task is for createing the OpenAI details documentation pag… ### [Validation of unexisting fields on paragraphs actions](https://git.drupalcode.org/project/ai/-/work_items/3571033) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: Eric Homanchuk (erichomanchuk) | Labels: Has Testing Steps, aiContentSuggestions, category::bug, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1822 [[#3526390] feat: Improve the AI Search recursive retrieval of a specific quantity of results](https://git.drupalcode.org/project/ai/-/merge_requests/1822) | State: opened | Author: Bharat Kelotra (bharatkelotra), 42173 diff lines Description: >>> [!note] Migrated issue Reported by: [aaron gil martinez](https://www.drupal.org/user/3605526) Related to !1150 >>> Problem/Motivation When a node form uses Paragraphs, the AI Content Suggestions “Select the field(s) you wish to send to the LLM” list does not update after Paragraphs AJAX actions (collapse/edit/add). This makes it possible to select stale/hidden paragraph fields or miss newly added ones or even display errors because of validation on non-existing fields in the list. Steps to reproduce (required for bugs, but not feature requests) Enable ai_content_suggestio… ### [Type error and infinite AJAX request loop when the Agent is unable to resolve a request job](https://git.drupalcode.org/project/ai/-/work_items/3547470) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: Has Testing Steps, aiAssistantsApi, category::task, needs backport to 1.1.x Description: >>> [!note] Migrated issue Reported by: [codebymikey](https://www.drupal.org/user/3573206) Related to !1021 !894 >>> Problem/Motivation When the AI agent is unable to solve a job, the following exception is thrown: <?phpTypeError: Drupal\ai\OperationType\Chat\ChatMessage::__construct(): Argument #2 ($text) must be of type string, null given, called in /app/application/web/modules/contrib/ai/modules/ai_assistant_api/src/Service/AgentRunner.php on line 85 inDrupal\ai\OperationType\Chat\ChatMessage->__construct() (line 61 of /app/application/web/modules/contrib/ai/src/OperationType/Ch… ### [Add league/commonmark as real dependency not a suggestion](https://git.drupalcode.org/project/ai/-/work_items/3586595) State: opened | Updated: 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Assigned: unassigned | Labels: Novice, category::task, priority::normal, state::accepted Description: ## Description league/commonmark is used at least in ai_chatbot module for converting markdown back to HTML. It was always an optional dependency, but there are a lot of support tickets as users do not see the message about possibility to install this package and benefit from it. Recently, ai_search also created a [feature](https://git.drupalcode.org/project/ai_search/-/work_items/3584018) that relies on this library. More and more markdown parsing is used, so it is nice to have it already in codebase always. ## Tasks * [ ] Add league/commonmark as dependency in composer.json * [ ] Remove… ### [Support the `ai_json_schema` element inside off-canvas dialogs](https://git.drupalcode.org/project/ai/-/work_items/3586536) State: closed | Updated: 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1680 [Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs](https://git.drupalcode.org/project/ai/-/merge_requests/1680) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 142 diff lines Description: # Title Support the `ai_json_schema` element inside off-canvas dialogs (correct rendering + value sync) ## Description The `ai_json_schema` form element (`Drupal\ai\Element\AiJsonSchema`) is documented for use "in any Drupal form", but it does not work when rendered inside Drupal's **off-canvas dialog** — which is how the `bpmn_io` modeller shows configuration forms. Upstream the element is only used on full-page forms (e.g. AI API Explorer), where it works; off-canvas has never been exercised, so this is not a regression — it is making the element robust in a context new consumers need. T… ### [Add rich-text image description support to AI Automators](https://git.drupalcode.org/project/ai/-/work_items/3586478) State: closed | Updated: 2026-07-15 | Author: Levente Besenyei (LeventeB) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1628 [Issue #3586478: "Add rich-text image description support to AI Automators"](https://git.drupalcode.org/project/ai/-/merge_requests/1628) | State: merged 2026-07-15 | Author: Levente Besenyei (LeventeB), 2726 diff lines Description: ## Summary Add optional rich-text image description support to AI Automators for AI-based formatted text fields, including metadata storage for generated image descriptions. Related/source issue: https://git.drupalcode.org/project/ai_initiative/-/work_items/3585695 ## Problem AI Automators can use formatted text as input, but images embedded in that text are currently ignored unless they are already available through a separate image/media field. This makes automations less accurate for content that depends on visual context (for example: summaries, quality checks, and editorial pre-screen… ### [Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation](https://git.drupalcode.org/project/ai/-/work_items/3584951) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, aiCoreModule Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1553 [Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream...](https://git.drupalcode.org/project/ai/-/merge_requests/1553) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 552 diff lines Description: >>> [!note] Migrated issue Reported by: [abhisekmazumdar](https://www.drupal.org/user/3557964) >>> [Tracker] **Update Summary:** SensitiveContentStream plugin added; kernel tests pass; pipeline green on 1.x **Short Description:** Add a concrete streaming guardrail plugin that suppresses marked content mid-stream **Check-in Date:** 06/04/2026 *Metadata is used by the [AI Tracker](https://www.drupalstarforge.ai/). Docs and additional fields [here](https://www.drupalstarforge.ai/ai-dashboard/docs).* [/Tracker] ## Problem/Motivation #3582179 introduced `StreamableGuardrailInterface` — a guar… ### [Suggest Tags automator should work with Tagify](https://git.drupalcode.org/project/ai/-/work_items/3536912) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: #drupalpune-sprint, aiAutomators, category::feature, priority Description: >>> [!note] Migrated issue Reported by: [mandclu](https://www.drupal.org/user/52136) >>> Problem/Motivation The new field widget actions are great! In many ways these recreate the experience that drew me into developing for the Augmentor AI module. One thing I do miss is a simple way to choose which generated tags to choose. Augmentor achieves this with an interim widget, showing the suggested tags as tiles that when clicked add the suggestion into the tags field. I think we could achieve something similar if we could have a field widget action that worked with the Tagify widget. It would … ### [Add Summarization operation type support to the echoai test provider](https://git.drupalcode.org/project/ai/-/work_items/3586537) State: closed | Updated: 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1681 [Issue #3586537 Add Summarization operation type support to the echoai test provider](https://git.drupalcode.org/project/ai/-/merge_requests/1681) | State: merged 2026-07-15 | Author: Ahmad Khader (Ahmad-Khader), 47 diff lines Description: ## Description The echoai mock provider (`Drupal\ai_test\Plugin\AiProvider\EchoProvider`, in the `ai_test` submodule) implements several operation types so that downstream modules can kernel-test their integrations against a deterministic provider. It does not yet implement the **Summarization** operation type. ## Acceptance criteria * `echoai__ai` reports support for the `summarize` operation type and is selectable for it. * Calling `summarize()` with text `Foo` returns a `SummarizationOutput` whose normalized value is `Summary of: Foo`. * Consumers (e.g. the `ai_integration_eca` Summariz… ### [Add non-required visual regression tests for the four built UI elements](https://git.drupalcode.org/project/ai/-/work_items/3586461) State: closed | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: aiCoreModule, category::task, frontend, priority::normal Description: --- AI TRACKER METADATA --- Update Summary: Add non-required visual regression tests for the four built UI elements Check-in Date: MM/DD/YYYY (US format) [When we should see progress/get an update] Due Date: MM/DD/YYYY (US format) [When the issue should be fully completed] Blocked by: [#XXXXXX] (New issues on new lines) Additional Collaborators: AI Tracker found here: https://www.drupalstarforge.ai/ --- END METADATA --- ### Problem/Motivation We ship four compiled front-end bundles, built by the `js_build` CI job: | # | Element | Source | Build output | |---|---------|--------|-------------… ### [Batch embeddings for improved indexing performance](https://git.drupalcode.org/project/ai/-/work_items/3568648) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [paulsheldrake](https://www.drupal.org/user/1350686) Related to !1126 >>> [Tracker] Update Summary: Increase embeddings performance Short Description: Support batching for embeddings so multile chunks can be converted and inserted at a time instead of doing each chunk sequentially. Check-in Date: MM/DD/YYYY Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation Indexing is slow for vector DBs Proposed resolution Add batching so more chunks can be process in one go. This MR updates the underlying classes t… ### [Do not assume action definitions have a type when deriving action plugin functions](https://git.drupalcode.org/project/ai/-/work_items/3586589) State: closed | Updated: 2026-07-15 | Author: Ryan Szrama (rszrama) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1799 [fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions](https://git.drupalcode.org/project/ai/-/merge_requests/1799) | State: merged 2026-07-15 | Author: Ryan Szrama (rszrama), 15 diff lines Description: ## Summary I received a deprecation notice related to `str_contains()` when testing chat generation at `/admin/config/ai/explorers/chat_generator`. This is because the `ActionPluginDeriver` assumes the action definitions it's deriving functions for have a type, even though the `Action` attribute designates the `type` property as optional. Pathauto does _not_ use a `type` for its one action plugin, so the deriver attempts to get an entity type definition for `NULL`. ``` #[Action( id: 'pathauto_update_alias', label: new TranslatableMarkup('Update URL alias of an entity'), )] ``` ## Steps … ### [Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &)](https://git.drupalcode.org/project/ai/-/work_items/3586553) State: opened | Updated: 2026-07-15 | Author: Nicholas Stees (NicholasS) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1819 [Issue#3586553:...](https://git.drupalcode.org/project/ai/-/merge_requests/1819) | State: opened | Author: Bharat Kelotra (bharatkelotra), 235 diff lines Description: ## Summary When an AI Automator targets a taxonomy/entity-reference field, valid LLM responses are silently discarded if the term name contains a character that the model returns HTML-encoded (e.g. an ampersand returned as `&` instead of `&`). The value passes generation but is stripped in `verifyValue()` because the comparison against the real term names is an exact string match, so the field is never filled. ## Steps to reproduce 1. Create a taxonomy vocabulary with a term whose name contains an ampersand, e.g. `Kids, Youth & Family`. 2. Add an entity reference (taxonomy) field to … ### [ai_translate: ContentTranslationControllerOverride::overview() fatals when the parent controller returns a Response](https://git.drupalcode.org/project/ai/-/work_items/3586597) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::minor, state::accepted Description: ### Problem/Motivation `ContentTranslationControllerOverride::overview()` is typed to return `array` and unconditionally passes the parent controller's result to `alterForm()`. Other modules that override the content-translation overview route may return a `Response` from their parent controller (we hit this with a module redirecting the overview to its own translation app). `alterForm()` then fatals on a non-array. ### Proposed resolution Honor a `Response` as-is and only alter render arrays: ```diff - public function overview(RouteMatchInterface $route_match, $entity_type_id = NULL): ar… ### [ai_translate: option to translate all fields of an entity in a single LLM call instead of one call per field](https://git.drupalcode.org/project/ai/-/work_items/3586598) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Description: ### Problem/Motivation `ai_translate` currently translates field by field, one LLM request per text field. For entities with many fields/paragraphs this multiplies cost and latency, and loses cross-field context that would improve translation consistency (terminology, tone). ### Proposed resolution Add an (opt-in) mode that serializes all translatable text of the entity into one structured prompt, performs a single LLM call, and maps the response back to the fields. We run this in production as a composer patch against 1.4.x and see large latency/cost reductions on paragraph-heavy nodes. R… ### [Reject caller-supplied execution identity fields at /api/deepchat boundary](https://git.drupalcode.org/project/ai/-/work_items/3574662) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: AI Initiative Sprint, AI Innovation, aiChatbot, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1812 [Issue #3574662: Add boundaries and test](https://git.drupalcode.org/project/ai/-/merge_requests/1812) | State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson), 384 diff lines Description: >>> [!note] Migrated issue Reported by: [scott falconer](https://www.drupal.org/user/52557) Related to !1227 >>> Problem/Motivation As part of https://www.drupal.org/project/ai/issues/3573899 (Execution Principal / execution envelope), outside-in API boundaries must not accept caller-supplied execution identity fields. The /api/deepchat endpoint currently processes request payloads without explicitly rejecting reserved identity fields. This allows caller-supplied fields like executor_uid / initiator_uid to pass the boundary and only fail later on unrelated validation (for example invali… --- MERGE REQUESTS (24h) --- ### [Issue#3586446:CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler fixes](https://git.drupalcode.org/project/ai/-/merge_requests/1824) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586446-CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler | 207 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [#3585077: Integrate chatprocessor plugin](https://git.drupalcode.org/project/ai/-/merge_requests/1497) State: opened | Author: Ahmad Khader (Ahmad-Khader) | Branch: 3585077-integrate-chatprocessor-plugin | 1642 diff lines Description: Closes #3585077 ### [fix(ai_ckeditor): remove stale toolbar items on uninstall and warn on confirm page](https://git.drupalcode.org/project/ai/-/merge_requests/1731) State: opened | Author: Ricardo Castañeda (cadence96) | Branch: 3586570-uninstalling-ai-ckeditor-leaves-stale-toolbar-items-in-editoreditor-configuration | 188 diff lines Description: ## Description Fixes an issue where uninstalling `ai_ckeditor` left stale toolbar references in existing `editor.editor.*` configuration entities, causing CKEditor 5 text format configuration pages to break. Two changes in `ai_ckeditor.install`: - **`hook_module_preuninstall()`**: Before the module is removed, iterates over all `editor.editor.*` configs and strips the `aickeditor` and `ai_balloon_menu` toolbar items, as well as the `ai_ckeditor_ai` plugin configuration block. - **`hook_form_FORM_ID_alter()` for `system_modules_uninstall_confirm_form`**: Reads the pending modules from the ex… ### [Issue #3586468: "Add interactive refinement capability to Field Widget Actions Automation"](https://git.drupalcode.org/project/ai/-/merge_requests/1629) State: opened | Author: Ahmad Khader (Ahmad-Khader) | Branch: 3586468-interactive-refineme | 4057 diff lines Description: ## Description ## Testing instructions 1. Create an AI Automator Setup for content_type → entity → field_content with rule llm_text_long , point the base field to the title, and add a prompt something like "You must write a short blog paragraph about: {{ context }}. Return ONLY the paragraph text, nothing else." 2. Enable the Field Widget Action with refinement Go to /admin/structure/types/manage/blog/form-display Click the gear on field_content, under Field Widget Actions enable "Automator Text Suggestion" Pick the automator, check "Enable Refinement", save 3. Edit an entity Click the… ### [Fix the MDX Editor for Gin dark theme](https://git.drupalcode.org/project/ai/-/merge_requests/1616) State: merged 2026-07-15 | Author: Prabhavathi Vanipenta (prabha1997) | Branch: 3582474-mdx-editor-gin-dark | 80 diff lines Description: ## Description ## Testing instructions ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or they are exp… ### [Issue #3582473: Tool Explorer does not render correctly with Gin dark theme](https://git.drupalcode.org/project/ai/-/merge_requests/1446) State: merged 2026-07-15 | Author: Shubham Prakash (shubham.prakash) | Branch: 3582473-tool-explorer-does | 160 diff lines Description: (cherry picked from commit 20c8ac18d15a25ffd0db807b6e427e8b41d34cf7) Closes #3582473 ### [Resolve #3586599: "Tests are failing for phpstan"](https://git.drupalcode.org/project/ai/-/merge_requests/1821) State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Branch: phpstan-cherry-pick-1-3 | 324 diff lines Description: Fixing phpstan #3586599 ### [Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency](https://git.drupalcode.org/project/ai/-/merge_requests/1638) State: merged 2026-07-15 | Author: Avinash jha (avinash.jha) | Branch: 3586471-ai-guardrails-or-ai-moderation-guardrails | 26 diff lines ### [Issue #3533040:Create Provider Documentation Page for OpenAI](https://git.drupalcode.org/project/ai/-/merge_requests/1530) State: closed | Author: Avinash jha (avinash.jha) | Branch: 3533040-create-provider-documentation | 76 diff lines Description: Closes #3533040 ### [Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is...](https://git.drupalcode.org/project/ai/-/merge_requests/1021) State: closed | Author: Billy Davies (billy.davies) | Branch: 3547470-handle-unsolvable-jobs-1.2.x | 65 diff lines Description: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job By: codebymikey Closes #3547470 ### [Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job](https://git.drupalcode.org/project/ai/-/merge_requests/894) State: closed | Author: codebymikey | Branch: 3547470-handle-unsolvable-jobs | 64 diff lines Description: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job By: codebymikey Closes #3547470 ### [Issue #3586478: "Add rich-text image description support to AI Automators"](https://git.drupalcode.org/project/ai/-/merge_requests/1679) State: merged 2026-07-15 | Author: Levente Besenyei (LeventeB) | Branch: 3586478-issue-branch-2x | 2531 diff lines Description: ## Description Ports the resolution of #3586478 from the 1.x line to the 2.x branch. This introduces rich-text image awareness to AI Automators so supported text-based automators can discover embedded images, generate AI image descriptions, include those descriptions in prompt context, and optionally store image metadata for auditability. For AI content pre-moderation, this enables the moderation automator to evaluate visual content from Article body fields in addition to text content. If embedded images cannot be fully processed (for example, configured image limit exceeded, unreachable/in… ### [Issue#3585328:...](https://git.drupalcode.org/project/ai/-/merge_requests/1820) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3585328-Undefined-Array-Key-type-Warnings-Break-AJAX-AbstractModelFormBase-UpdateModelForm | 104 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Resolve "Add non-required visual regression tests for the four built UI elements"](https://git.drupalcode.org/project/ai/-/merge_requests/1608) State: merged 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3586461-add-non-required-vis | 719 diff lines Description: ## ### [Issue#3586558:Preserve-HTML-In-Streamed-Output fixes.](https://git.drupalcode.org/project/ai/-/merge_requests/1818) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586558-Preserve-HTML-In-Streamed-Output | 468 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Issue#3586491:add-a-during-generate-streaming-section-to-the-guardrail-set-for...](https://git.drupalcode.org/project/ai/-/merge_requests/1816) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586491-add-a-during-generate-streaming-section-to-the-guardrail-set-form-and-let-guardrails-declare-their-supported-modes | 1451 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Cherry pick 99419a07](https://git.drupalcode.org/project/ai/-/merge_requests/1817) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-32c3e8bc | 479 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Cherry pick 99419a07](https://git.drupalcode.org/project/ai/-/merge_requests/1814) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-99419a07-2.x | 479 diff lines Description: ## Description ## Testing instructions 1. 2. ## Checklist - [ ] I have linked the related issue in the MR title or description - [ ] I have performed a self-review of my own code - [ ] I have added or updated tests, or explained in the description why this change is not covered by tests - [ ] I have updated documentation for any new or changed functionality - [ ] I have written testing instructions and verified them locally - [ ] I have noted any required post-merge steps (config imports, cache rebuilds, manual changes) - [ ] This MR contains no breaking API or hook changes, or the… ### [Issue #3499451: Fixed chatbot not reopening after CKEditor/media modal closes.](https://git.drupalcode.org/project/ai/-/merge_requests/1277) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3499451-chatbot-closes-itself | 94310 diff lines Description: Closes #3499451 --- COMMITS (24h) --- - [e0ff7fa3](https://git.drupalcode.org/project/ai/-/commit/e0ff7fa3334ce06ba8bd11e79fa58be50f4c1ed6) fix: #3586573 Tone of voice CKEditor Plugin does not use the translated... — Thomas Werthmüller (2026-07-15T15:26:37.000+00:00) - [d7625983](https://git.drupalcode.org/project/ai/-/commit/d7625983e7de5e299c949d63e2baf5ef300fa616) Fix the MDX Editor for Gin dark theme — Prabhavathi Vanipenta (2026-07-15T14:58:48.000+00:00) - [babfb3b6](https://git.drupalcode.org/project/ai/-/commit/babfb3b650ea9cea99f3514663c3cfe7a9395c8e) Issue #3582473: Tool Explorer does not render correctly with Gin dark theme — Shubham Prakash (2026-07-15T14:51:56.000+00:00) - [74168323](https://git.drupalcode.org/project/ai/-/commit/74168323c0bc4b5ab98f494380af0eae6a69be8d) Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item — Avinash jha (2026-07-15T14:51:02.000+00:00) - [eeb34183](https://git.drupalcode.org/project/ai/-/commit/eeb34183101bb0e5b60703b993c61f79fa93fb8d) Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency — Avinash Kumar Jha (2026-06-04T14:05:25.000+05:30) - [784c4fbf](https://git.drupalcode.org/project/ai/-/commit/784c4fbf6194e6a6332dfa16cb1b6071cab866c6) Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs — Ahmad Khader (2026-07-15T13:32:06.000+00:00) - [b4fa57d5](https://git.drupalcode.org/project/ai/-/commit/b4fa57d5893177f87dfce7210e9d89aa407fbafc) Issue #3586478: "Add rich-text image description support to AI Automators" — Levente Besenyei (2026-07-15T13:10:37.000+00:00) - [78a69753](https://git.drupalcode.org/project/ai/-/commit/78a697537f3804499539efe9f86a06033e9d8b2e) Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream... — Ahmad Khader (2026-07-15T13:04:58.000+00:00) - [301aa988](https://git.drupalcode.org/project/ai/-/commit/301aa988932aadc30f0ab15d706093eeba6d1fed) Issue #3586537 Add Summarization operation type support to the echoai test provider — Ahmad Khader (2026-07-15T12:56:55.000+00:00) - [58ab9447](https://git.drupalcode.org/project/ai/-/commit/58ab9447463b77e49e1a64ebab28c22ec2b47434) Resolve "Add non-required visual regression tests for the four built UI elements" — Marcus Johansson (2026-07-15T12:38:41.000+00:00) - [fe7d765f](https://git.drupalcode.org/project/ai/-/commit/fe7d765fc2c8492cf59148f2a9c35d9953318870) fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions — rszrama (2026-07-10T14:04:59.000-04:00) - [5a28eae1](https://git.drupalcode.org/project/ai/-/commit/5a28eae198550d68b40379465334bd6c0548e944) Issue #3574662: Add boundaries and test — Marcus Johansson (2026-07-15T10:42:53.000+00:00) ======================================================================== ## [14] summariseModule:ai_provider_amazeeio:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: amazee.ai Private AI Provider (machine name: ai_provider_amazeeio) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                        amazee.ai Private AI Provider

                        then use

                        ,

                        ,

                          /
                        • , and as needed. Output only the HTML fragment with no surrounding , , or
                          tags. After the project summary prose, add a single subsection titled "

                          How can I help on this project?

                          " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [array_flip(): Can only flip string and integer values in config_ignore_ignored_alter()](https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586231) State: closed | Updated: 2026-07-15 | Author: Ron Raney (rraney) | Assigned: unassigned | Labels: category::bug, priority::normal, state::needsReview, v1.3.x-dev Description: ## Issue When running `drush cim`, `drush cex`, or `drush config:status`, the following PHP warning appears (twice): Warning: array_flip(): Can only flip string and integer values, entry skipped in Drupal\Core\Entity\EntityStorageBase->loadMultiple() (line 278 of /core/lib/Drupal/Core/Entity/EntityStorageBase.php) ## Root Cause In `ai_provider_amazeeio.module`, the `ai_provider_amazeeio_config_ignore_ignored_alter()` hook calls `Key::load()` with values from config without validating they are non-empty strings first: - Line 157: `Key::load($settings->get('api_key'))` - Line 161: `Key::load($… ### [Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity)](https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586236) State: closed | Updated: 2026-07-15 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: Drupal CMS, category::bug, code, priority::normal Description: ## Problem / Motivation **Trial account provisioning is optional; its failure must be a fallback, not an install-breaker.** Applying any recipe that installs **amazee.ai Private AI Provider** (e.g. Drupal CMS AI, or a Varbase AI recipe via `varbase_ai_base`) hard-fails when amazee.ai's trial endpoint is at capacity, rate-limited, or unreachable: ``` Client error: `POST https://api.amazee.ai/auth/generate-trial-access` resulted in a `429 Too Many Requests` response: {"detail":"Trial capacity reached. Please contact sales to continue."} [error] Failed to run drush recipe ...: exit status 173… --- MERGE REQUESTS (24h) --- ### [fix(#3575454) add vectordb to docs](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/73) State: merged 2026-07-15 | Author: Dan Lemon (dan2k3k4) | Branch: fix-3575454-add-vectordb-to-docs | 104 diff lines ### [Automated Project Update Bot fixes](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/75) State: merged 2026-07-15 | Author: project update bot (Project-Update-Bot) | Branch: project-update-bot-only | 289 diff lines Description: Relates to #3586232. This merge request was automatically created by the Project Update Bot. It contains the changes from run 12-848511. ### [Draft: chore: add bulk chunking](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/63) State: opened | Author: Dan Lemon (dan2k3k4) | Branch: bulk-chunk | 237 diff lines Description: Reworked for **2.0.x**: batches VDB inserts during indexing. `PostgresProvider::indexItems()` previously issued one `INSERT` per chunk. It now builds one row per chunk and inserts them all in a single query via a new `insertMultipleIntoCollection()` on both the provider and `PostgresPgvectorClient`. ### Notes for review - Built on top of 2.0.x's existing embedding API (`getChunks()` / `getEmbedding()` / `Embedding` value object) — the embedding-adaptation part of the original 1.3.x MR is already present on 2.0.x, so this MR contains **only** the batch-insert optimization. - Keeps 2.0.x's **p… ### [fix: #3586236 Do not abort recipe apply when amazee.ai trial provisioning fails](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/78) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3586236-recipe-apply-aborts-when-amazeeai-trial-account-provisioning-fails-eg-http-429-trial-capacity | 13 diff lines Description: **Fallback, not a requirement**: provisioning a free anonymous amazee.ai trial account is an optional convenience step during a Drupal CMS AI / Varbase AI recipe install. amazee.ai being at trial capacity (HTTP 429), rate-limited, returning a malformed payload, or simply unreachable (network/DNS/timeout) must never abort the recipe apply. This MR makes that failure a graceful fallback instead of an install-breaker. Fixes #3586236. `EnsureAmazeeAiAccess::apply()` used to catch `TrialAccountProvisioningException` and rethrow it as a `ConfigActionException`, aborting the whole recipe apply. Now… ### [chore: general improvements, switch to zensical docs](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/79) State: merged 2026-07-15 | Author: Dan Lemon (dan2k3k4) | Branch: improvements | 927 diff lines ### [chore: run rector set to php 8.0](https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/51) State: closed | Author: Dan Lemon (dan2k3k4) | Branch: rector-fixes | 586 diff lines --- COMMITS (24h) --- (none) ======================================================================== ## [15] summariseModule:gemini_provider:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Gemini Provider (machine name: gemini_provider) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

                          Gemini Provider

                          then use

                          ,

                          ,

                            /
                          • , and as needed. Output only the HTML fragment with no surrounding , , or
                            tags. After the project summary prose, add a single subsection titled "

                            How can I help on this project?

                            " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add support for batch embeddings](https://git.drupalcode.org/project/gemini_provider/-/work_items/3589183) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: "state::needsReview" It was decided on the naming. I have updated MR and also adjusted CI to load the needed branch of AI Core, 2026Sprint14, AI Initiative Sprint, ai::inside Description: >>> [!note] Migrated issue Reported by: [a.dmitriiev](https://www.drupal.org/user/3235287) Related to !37 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Check-in Date: MM/DD/YYYY Additional Collaborators: Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation As a follow up to this issue https://git.drupalcode.org/project/ai/-/work_items/3568648 it would be nice to add support of batch embeddings as Gemini models can do that. Proposed resolution Use method batchEmbedContents from Gemini client when EmbeddingsInput conta… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [16] summariseModule:ai_agents:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Agents (machine name: ai_agents) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khalil (ahmad-khalil-imagex), AKHIL BABU (AkhilBabu), Bharat Kelotra (bharatkelotra), Marcus Johansson (Marcus_Johansson), Nicolae Procopan (thebumikgmail.com), Prabhavathi Vanipenta (prabha1997)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                            AI Agents

                            then use

                            ,

                            ,

                              /
                            • , and as needed. Output only the HTML fragment with no surrounding , , or
                              tags. After the project summary prose, add a single subsection titled "

                              How can I help on this project?

                              " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Let an agent use a role when running a tool](https://git.drupalcode.org/project/ai_agents/-/work_items/3518167) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Anikó Viola (violaniko) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !87 >>> Problem/Motivation Currently the modus operandi is that the permissions checks that happens in tools, happens on the session that is running it. In AI Agents Explorer or the AI Assistants API, this means the user that triggers the query. There are however cases where agents should be completely autonomous or where they are triggered in queues/cron jobs, where there is no sessions attached. In those cases it should be possible for the person that sets up the agent to be able to… ### [Make it possible to restrict the order of tools during agent executions](https://git.drupalcode.org/project/ai_agents/-/work_items/3560681) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: Abhishek Dhariwal (adaptative) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [shashikanth171](https://www.drupal.org/user/3516867) Related to !252 >>> Problem/Motivation AI Agent can sometimes execute tools in an order that doesn't make any sense. We can avoid this by improving the prompt template, making it more verbose with trial and error. Need to somehow allow configuration of each tool, to set which tool should be run prior to it. We can also expand it by including conditions like should be executed 1. only once, 2. first, 3. last etc. Depending on the tool and use case, configuring the agent with such restrictions will… ### [Add limits on how often a tool can run](https://git.drupalcode.org/project/ai_agents/-/work_items/3547995) State: opened | Updated: 2026-07-16 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !224 >>> Problem/Motivation Right now we have to tell the system prompt how often it is allowed to use a specific tool. But there should also be a determenistic way, where if the tool gets stuck in a loop or searches to no awail in a RAG database for instance, we need to be able to programatically say how many times a tool can run. Proposed resolution Add a form value of how many times a tool can run. Add a form for setting the error message when this happens. If the tool has run tha… ### [Add a per-tool setting to restrict a tool from being called more than once per response](https://git.drupalcode.org/project/ai_agents/-/work_items/3586051) State: opened | Updated: 2026-07-16 | Author: AKHIL BABU (AkhilBabu) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: ## Summary Add a per-tool agent setting — "Restrict model from calling this tool more than once in a response." When enabled for a tool, if a single model response contains more than one call to that tool, execute none of the response's tool calls and return a configurable error message so the agent retries on the next step. Tools without the setting are unaffected and may still be called multiple times. ## Why A step-wise, externally-driven agent needs certain tools to run at most once per step, so each call can build on the previous call's result. Canvas's client-side orchestration loop r… ### [[Meta] Road to 1.4.0 release](https://git.drupalcode.org/project/ai_agents/-/work_items/3586017) State: opened | Updated: 2026-07-16 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::plan, group::ai-initiative, state::accepted Description: ### Description We are releasing 1.3.0 any minute now and should already start planning for 1.4.0 release. It will be able to be dependent on AI 1.4.0. The following related issues are issues that are high priority for this. ### ### [Array to string conversion in Token::doReplace() when a dynamical token value is an array (applyTokens)](https://git.drupalcode.org/project/ai_agents/-/work_items/3586043) State: opened | Updated: 2026-07-15 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: automation::error, state::needsWork Description: ### Problem On every AI Agent run, a PHP warning is logged (and shown as a status message inside the Drupal Canvas AI editor): ``` Warning: Array to string conversion in Drupal\Core\Utility\Token->doReplace() (line 283 of core/lib/Drupal/Core/Utility/Token.php). ``` ### Backtrace (abridged) ``` Token.php(283): str_replace() Token.php(214): Drupal\Core\Utility\Token->doReplace() token_or/src/Token.php(27): ...->replacePlain() eca/.../TokenDecoratorTrait.php(444): ... ai_agents/src/PluginBase/AiAgentEntityWrapper.php(1323): ...->replacePlain() ai_agents/src/PluginBase/AiAgentEntityWrapper.ph… ### [AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, so the status storage cannot be swapped](https://git.drupalcode.org/project/ai_agents/-/work_items/3586054) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !304 [Type-hint AiAgentStatusStorageInterface instead of PrivateTempStatusStorage in AgentStatusSubscriber.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/304) | State: opened | Author: Prabhavathi Vanipenta (prabha1997), 31 diff lines Description: ## Problem `AgentStatusSubscriber::__construct()` type-hints the concrete class: ```php public function __construct( protected PrivateTempStatusStorage $statusStorage, ... ``` `AiAgentStatusPollerService` correctly type-hints `AiAgentStatusStorageInterface`. Because the subscriber demands the concrete class, an alternative `AiAgentStatusStorageInterface` implementation (for example a persistent storage that archives agent runs) cannot be decorated or swapped in — the container throws: ``` TypeError: AgentStatusSubscriber::__construct(): Argument #1 ($statusStorage) must be of type Pri… ### [feat: Forward tool image output to next loop iteration for vision models](https://git.drupalcode.org/project/ai_agents/-/work_items/3586018) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::feature, group::ai-initiative, priority::normal, state::accepted Description: ## Problem / motivation When an AI agent loops (calls tools, gets results, then calls the model again with those results), tool outputs that contain images are not automatically picked up and passed back to the model on the next loop iteration. Today, this is possible *if* a tool author knows exactly how to format its output so it lands in the next request as a vision-model image input. That is undocumented surface area, easy to get wrong, and out of reach for site builders configuring agents from the UI. A general solution would let any tool emit images (screenshots, generated charts, file… ### [Add possibility for an agent to store and read instructions from a file](https://git.drupalcode.org/project/ai_agents/-/work_items/3572361) State: closed | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::closed Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !233 >>> Problem/Motivation One problem is that the orchestration agent has to pass a lot of context to the sub-agents, even if the information is available in the initial question from the user. This should add the initial request, and this will be available as a token for each of the subagents. That way an orchestraion agent can just send the specifics it needs and not create so much tokens or lose any specific context. Proposed resolution When a parent agent comes in, add the inst… ### [Create implementation of ShortTermMemory](https://git.drupalcode.org/project/ai_agents/-/work_items/3546411) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !183 >>> Problem/Motivation Short term memory is now available here: #3528730: Create ShortTermMemoryPlugin We should add an integration with it. Proposed resolution Add a parameter to the agent config to save the short term memory config. Add a subform integration for saving the configuration, while editing the AI Agent. Assume no ShortTermMemory by default. Trigger ShortTermMemory after the request event. ### [feat: Per-tool approval mode (pre-approved / approve-once / always) with loop pause-resume](https://git.drupalcode.org/project/ai_agents/-/work_items/3586020) State: opened | Updated: 2026-07-15 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: category::feature, group::ai-initiative, priority::normal, state::accepted Description: ## Problem / motivation Agents currently invoke tools without a built-in approval gate. For destructive or sensitive tools (writing content, sending email, calling external APIs, running shell commands, etc.) this is risky — the agent can act before a human has a chance to review. Tools like [Claude Code](https://docs.claude.com/en/docs/claude-code) and [OpenAI Codex CLI](https://github.com/openai/codex) solve this by gating each tool call (in their case, each shell command) behind a per-tool approval policy. The user can mark a tool as always-allowed, approve-once-per-session, or always-pro… ### [Fix streaming](https://git.drupalcode.org/project/ai_agents/-/work_items/3577520) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::bug, code, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !290 [Issue #ai_agents-3577520: Streaming fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/290) | State: opened | Author: Bharat Kelotra (bharatkelotra), 280 diff lines Description: >>> [!note] Migrated issue Reported by: [d0t15t](https://www.drupal.org/user/132353) Related to !243 >>> Problem/Motivation Streaming in the ai_chatbot does not work. Steps to reproduce Create an AI assistant and attach an agent to it. Enable streaming on the assistant's chatbot block. Submit a message — the response is not streamed; it waits for the full completion before rendering. Proposed resolution Add $streaming and $streamingIterator properties to AiAgentEntityWrapper. Pass setStreamedOutput($this->streaming) to the ChatInput before the provider call in determineSolvabi… ### [Use streamed chat for agents](https://git.drupalcode.org/project/ai_agents/-/work_items/3538174) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::task, code, priority::normal, state::needsReview Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !165 >>> Problem/Motivation We are making streamed chat possible in #3528549: Allow tool calling in streamed chat. This should make it possible to use it with agents. Steps to reproduce Proposed resolution Implement a solution based on #3528549: Allow tool calling in streamed chat Remaining tasks User interface changes API changes Data model changes ### [Default information tools | Interactive section disappears after adding tool](https://git.drupalcode.org/project/ai_agents/-/work_items/3586049) State: opened | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::needsReview Description: I'm using AI Agents 1.3.2. When adding or editing an agent, the "Interactive" section of the "Default information tools" area disappears after a tool is added to the "Tools" section. Steps to reproduce: 1. Click to create a new agent (/admin/config/ai/tools-automation/agents/add/form) 2. Scroll to the "Advanced" section, note how the "Interactive" option of Default information tools is available: 3. Scroll back up to the "Tools" section. Add any tool. 4. Scroll back down and see that the "Interactive section" has disappeared: The exact same steps can be used with an existing agent wit… ### [PHPUnit CI job fails (exit code 1) for every test class despite all assertions passing](https://git.drupalcode.org/project/ai_agents/-/work_items/3586053) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: unassigned | Labels: category::bug, priority::normal, state::rtbc Description: ## Problem The `phpunit` CI job fails on merge requests even though every individual test **passes all its assertions**. Observed on [!300](https://git.drupalcode.org/project/ai_agents/-/merge_requests/300), pipeline https://git.drupalcode.org/project/ai_agents/-/pipelines/888950, job https://git.drupalcode.org/project/ai_agents/-/jobs/10938828. The `run-tests.sh` summary shows every single test class in the module — not just ones touched by the MR — finishing with all tests passed but a non-zero subprocess exit code: ``` 3.173s Drupal\Tests\ai_agents\Functional\AiAgentsMenuLinkTest … ### [Add test coverage for externally-driven execution (setLooped(FALSE))](https://git.drupalcode.org/project/ai_agents/-/work_items/3586052) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: AKHIL BABU (AkhilBabu) | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !300 [Issues/3586052: Add tests for setlooped.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/300) | State: opened | Author: AKHIL BABU (AkhilBabu), 1312 diff lines Description: ## Summary Add kernel-test coverage for `setLooped(FALSE)` — the mode where the agent parks its tool call and returns after one decision, leaving the caller to drive the next step. The behavior exists and is relied upon, but is untested. ## Why `setLooped(FALSE)` lets a caller run an agent one decision at a time instead of looping to completion inside one request. Canvas's client-side orchestration loop depends entirely on this. Because it is undocumented and uncovered, an unrelated change could silently break every externally-driven consumer. Locking it with tests protects the contract. -… ### ["Use Artifact storage" checkbox not necessary?](https://git.drupalcode.org/project/ai_agents/-/work_items/3586046) State: opened | Updated: 2026-07-15 | Author: Michael Anello (ultimike) | Assigned: unassigned | Labels: category::support, priority::normal, state::needsReview Description: I've recently noticed that tools in my agents are using artifact storage even when I don't have the "use artifact storage" enabled in the tool configuration. For example, I am using the "Load entity by ID" tool - without "Use artifact storage" enabled. After running the agent, looking in the log, I see: > Tool Plugin executed successfully: Successfully loaded node entity with ID 108 > An artifact has been created for the returned loaded_entity output. To use this entity for subsequent tool input arguments, pass the artifact string '{{entity:node:108:en}}' for entity inputs. > The artifact e… --- MERGE REQUESTS (24h) --- ### [Issue #3547995: Add deterministic tool usage limits.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/224) State: opened | Author: Nicolae Procopan (thebumikgmail.com) | Branch: 3547995-clean | 466 diff lines Description: Closes #3547995 ### [feat: #3586051 Add a per-tool setting to restrict a tool from being called...](https://git.drupalcode.org/project/ai_agents/-/merge_requests/299) State: opened | Author: Ahmad Khalil (ahmad-khalil-imagex) | Branch: 3586051-add-a-per-tool-setting-to-restrict-a-tool-from-being-called-more-than-once-per-response | 720 diff lines Description: feat: #3586051 Add a per-tool setting to restrict a tool from being called more than once per response # What this MR does Implements the per-tool "Restrict to one call per response" setting proposed in this issue. **Why:** Some tools must run at most once per LLM response because each call depends on the previous call's result. The motivating case is Canvas's client-side orchestration, where `place_components` places one component per step and later placements reference the UUID returned by the previous call — two calls in one response can never be valid. Other tools (e.g. `edit_components… ### [Draft: Resolve #3572361 "Add possibility for"](https://git.drupalcode.org/project/ai_agents/-/merge_requests/233) State: closed | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3572361-add-possibility-for | 166 diff lines Description: Closes #3572361 ### [Draft: Resolve #3538174 "Use streamed chat"](https://git.drupalcode.org/project/ai_agents/-/merge_requests/165) State: opened | Author: Marcus Johansson (Marcus_Johansson) | Branch: 3538174-use-streamed-chat | 258 diff lines Description: Closes #3538174 --- COMMITS (24h) --- (none) ======================================================================== ## [17] summariseModule:canvas:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal Canvas (machine name: canvas) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Ben Mullins (bnjmnm), Bálint Kléri (balintbrews) [3], Christian López Espínola (penyaskito), Feliksas Mazeikis (f.mazeikis), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Narendra Singh Rathore (NarendraR), Nodar Davituri (Davituri), Ravi Maniyar (ravi.maniyar.123), Ted Bowman (tedbow), utkarsh_33 (Utkarsh_33), Wim Leers (wimleers), wotnak [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                              Drupal Canvas

                              then use

                              ,

                              ,

                                /
                              • , and as needed. Output only the HTML fragment with no surrounding , , or
                                tags. After the project summary prose, add a single subsection titled "

                                How can I help on this project?

                                " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Canvas AI: UI/Functional update. Lock the canvas during a build and add a long-running AI-tasks UI element to the chat](https://git.drupalcode.org/project/canvas/-/work_items/3591724) State: opened | Updated: 2026-07-16 | Author: Aidan Foster (aidanfoster) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside Description: **Source:** Drupal AI UX Weekly Meeting, June 22, 2026. @Marcus_Johansson reviewed and gave an update on the prototype Drupal Canvas AI brand @AkhilBabu based on the experimental prototype that creates components one-at-a-time on this experimental branch https://github.com/akhilbabu-qed-42/c2026/tree/canvas-ai-poc The approach looks very promising from early testing but we need to update the UI to accommodate the changes. ## **Problem / Motivation** Canvas AI now builds a page component by component. While it is building, interacting with the canvas (adding or removing components) breaks t… ### [useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop](https://git.drupalcode.org/project/canvas/-/work_items/3591832) State: opened | Updated: 2026-07-16 | Author: Narendra Singh Rathore (NarendraR) | Assigned: Narendra Singh Rathore (NarendraR) | Labels: 1.x-dev, category::bug, pageBuilder, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1377 [3591832: useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop](https://git.drupalcode.org/project/canvas/-/merge_requests/1377) | State: opened | Author: Narendra Singh Rathore (NarendraR), 328 diff lines Description: **Summary** When a code component renders a section with a Tailwind arbitrary-value vh class (e.g. `h-[60vh]`) containing an absolutely-positioned background image, the Canvas editor preview iframe grows unboundedly instead of being capped at the correct viewport-relative height. **Steps to reproduce** 1. Create a code component with this structure: ``` const sizeClass = { default: 'h-[60vh]', short: 'h-[40vh]' }; export default function VhImageHero({ size = 'default' }) { const heightClass = sizeClass[size] || sizeClass.default; return ( ); } ``` 2… ### [Tailwind CSS added by code components overrides theme level CSS](https://git.drupalcode.org/project/canvas/-/work_items/3591831) State: opened | Updated: 2026-07-16 | Author: Brynn Briedis (gumnut) | Assigned: unassigned | Labels: Description: ## Overview I have run into an issue with tailwind styling overriding theme level CSS. Once a user adds a code component it adds the tailwind styling to the canvas page. In my specific case it is overriding my base styles in my _base_ css layer. I have tried moving my CSS onto different layers in my defined layer setup but there are conflicts so they kind of merge together with the layers defined by canvas. Below is my layer setup compared to the canvas one in the declaration order. | Mine | Canvas (tailwind) | | ---------- | ----------------- | | reset | theme | | b… ### [Dependency Dashboard](https://git.drupalcode.org/project/canvas/-/work_items/3591657) State: opened | Updated: 2026-07-16 | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Assigned: unassigned | Labels: projectManagement Description: This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. ## Repository Problems Renovate tried to run on this repository, but found these problems. - ⚠️ WARN: Failed to set branch status - ⚠️ WARN: Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN - ⚠️ WARN: No tool releases found. - ⚠️ WARN: No github.com token has been configured. Skipping release notes retrieval ## Deprecations / Replacements > ⚠️ **Warning** > The foll… ### [Multi-bundle content-entity-reference picks fail to coalesce into a branch expression](https://git.drupalcode.org/project/canvas/-/work_items/3591829) State: opened | Updated: 2026-07-16 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: blocker, category::task, dataModel, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1376 [Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields](https://git.drupalcode.org/project/canvas/-/merge_requests/1376) | State: opened | Author: Christian López Espínola (penyaskito), 382 diff lines Description: ### Overview A code component developer using a `content-entity-reference` prop cannot pick fields from more than one bundle of a multi-target-bundle reference field when any bundle contributes more than one field. Selecting such fields and saving fails validation with: > Multiple expressions on the same field 'entity:node:…' must be coalesced into a single FieldObjectPropsExpression. The per-bundle picks are meant to combine into a single stored expression at save time, but the coalescer leaves them un-combined, so the same-field validation constraint rejects them. A single field per bundl… ### [Restore browser-based component sync for Canvas Headless](https://git.drupalcode.org/project/canvas/-/work_items/3591830) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: unassigned | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1375 [fix(Headless): #3591830 Restore browser-based component sync for Canvas Headless](https://git.drupalcode.org/project/canvas/-/merge_requests/1375) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 859 diff lines Description: !1373 broke things. Canvas must fetch component metadata in the editor browser so local frontends are reachable. Restore CORS/OPTIONS support across Next, Astro, Nuxt, and TanStack Start while retaining assertion redemption and origin validation. Dev servers should also fail fast when `CANVAS_SITE_URL` is missing. All four examples must sync and render a nested component tree in Canvas. ### [Allow fields to be added to the page entity type](https://git.drupalcode.org/project/canvas/-/work_items/3568228) State: opened | Updated: 2026-07-15 | Author: drupalbot | Assigned: unassigned | Labels: category::task, page, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [catch](https://www.drupal.org/user/35733) >>> Overview Discussed in this slack thread: https://drupal.slack.com/archives/C072JMEPUS1/p1768606306603599 It's a very common use case to add field UI fields to entities for non-content purposes. A use case already in the canvas issue queue is https://git.drupalcode.org/project/canvas/-/work_items/3544662 where the metatags field has been added as a base field (and therefore not removable), but instead could be omitted and added by sites that needed. Other cases are things like 'hide from search results' o… ### [Support multi-target-bundle references in code component content-entity-reference props](https://git.drupalcode.org/project/canvas/-/work_items/3591656) State: opened | Updated: 2026-07-15 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: category::feature, internalHttpApi, priority::normal, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1369 [Draft: Resolve #3591656: Support multi-target-bundle references in content-entity-reference props](https://git.drupalcode.org/project/canvas/-/merge_requests/1369) | State: opened | Author: Christian López Espínola (penyaskito), 1452 diff lines Description: Overview Code components can declare content-entity-reference props whose entity field expressions descend through an entity reference field. When that field targets a single bundle, JsComponent::buildReferencePayload() resolves the nested per-entity payload. When the reference field targets multiple bundles, the coalesced expression carries a ReferencedBundleSpecificBranches target — one branch per bundle, because each bundle can expose different fields. buildReferencePayload() cannot yet resolve that case: it does not select a branch based on the runtime entity's bundle. Multi-target-bund… ### [Add support for rendering Canvas component trees in the headless SDK](https://git.drupalcode.org/project/canvas/-/work_items/3591823) State: closed | Updated: 2026-07-15 | Author: wotnak | Assigned: wotnak | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1371 [feat(Headless): #3591823 Add support for rendering Canvas component trees in the headless SDK](https://git.drupalcode.org/project/canvas/-/merge_requests/1371) | State: merged 2026-07-15 | Author: wotnak, 4099 diff lines Description: The headless SDK can fetch structured Custom Elements output from Drupal, but applications cannot render that output without implementing their own tree traversal, component resolution, prop and slot handling, and component registry integration. ### Proposed resolution Add a content type independent `CanvasComponentTree` renderer for all framework specific adapters. Generate component implementation registries from discovered local components and update them automatically during development. Update the example applications to demonstrate the rendering flow. ### [Boolean props auto-enable when another prop is changed in the Canvas form](https://git.drupalcode.org/project/canvas/-/work_items/3591716) State: opened | Updated: 2026-07-15 | Author: Alamgir Hossain (alamgir.hossain.cse) | Assigned: unassigned | Labels: Description: ## Summary In Canvas, when editing a component that has boolean props (e.g. `card-program`), changing any non-boolean prop causes all boolean props to appear enabled (toggle switches flip to ON) even though the user never toggled them. ## Root causes Two bugs were identified: ### 1. `|| []` coerces boolean `false` to `[]` in `layoutModelSlice.ts` In `_addNewComponentToLayout` → `buildInitialData()`, when building the initial model for a newly dropped component: ```typescript // BEFORE (buggy): initialData.resolved[propName] = prop.default_values?.resolved || []; // For boolean false: fal… ### [Incorrect folder assignment for newly created code components](https://git.drupalcode.org/project/canvas/-/work_items/3591828) State: opened | Updated: 2026-07-15 | Author: Vipin Mittal (vipin.mittal18) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1374 [#3591828 Refetch folder list after newly exposing a code component](https://git.drupalcode.org/project/canvas/-/merge_requests/1374) | State: opened | Author: Ben Mullins (bnjmnm), 66 diff lines Description: **Problem** When creating a new Code Component and selecting a destination folder, the component is not saved in the selected folder. Instead, it is placed in a different folder within the Canvas Library. This prevents users from organizing code components correctly and leads to inconsistent folder categorization. **Acceptance Criteria** - A newly created Code Component is saved in the folder selected by the user. - The component is displayed in the selected folder immediately after creation. - No component is placed into an incorrect folder during the creation process. - The selected folde… ### [Add configuration UI for headless frontends](https://git.drupalcode.org/project/canvas/-/work_items/3591822) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: Bálint Kléri (balintbrews) | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1368 [feat(Headless): #3591822 Add configuration UI for headless frontends](https://git.drupalcode.org/project/canvas/-/merge_requests/1368) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 5297 diff lines Description: Canvas Headless currently allows configuring a single frontend URL with no UI. Expand it to allow multiple frontend URLs, and provide a UI inside Canvas that also shows setup steps. ### [Simplify headless app environment configuration](https://git.drupalcode.org/project/canvas/-/work_items/3591826) State: closed | Updated: 2026-07-15 | Author: Bálint Kléri (balintbrews) | Assigned: Bálint Kléri (balintbrews) | Labels: headless Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1373 [chore(Headless): #3591826 Simplify headless app environment configuration](https://git.drupalcode.org/project/canvas/-/merge_requests/1373) | State: merged 2026-07-15 | Author: Bálint Kléri (balintbrews), 2365 diff lines Description: ## Problem Headless SDK examples use environment variables that are inconsistent or unnecessarily manual: - `DRUPAL_BASE_URL` differs from the `CANVAS_SITE_URL` name used by the CLI and Workbench. - `DRAFT_ALLOWED_FRAME_ANCESTORS` duplicates the Canvas editor origin already present in signed draft-session data and can drift from the actual site configuration. ## Proposed resolution - Rename `DRUPAL_BASE_URL` to `CANVAS_SITE_URL` across SDK packages, examples, and documentation. - Remove `DRAFT_ALLOWED_FRAME_ANCESTORS`. - Keep CSP protection, but derive the exact Canvas editor origin from t… ### [Canvas AI: Add the place_components AI tool (+ kernel test)](https://git.drupalcode.org/project/canvas/-/work_items/3591811) State: opened | Updated: 2026-07-15 | Author: AKHIL BABU (AkhilBabu) | Assigned: Juan Correa (jucs7) | Labels: 2026Sprint14, AI Initiative Sprint, ai, ai::inside Description: ## Summary Add a new AI tool `canvas_ai:place_components` (class `PlaceComponents`) to `canvas_ai`, ported from the POC (MR !1214). It places components into the current layout at a given region/slot target and returns the assigned UUIDs plus the predicted layout tree. It lands **inert** — no agent lists it yet — so it changes nothing until a later issue wires it to the dev agent. Add a kernel test adapted from the existing `set_component_structure` test. ## Why (this sprint) `place_components` is the core mutation tool of the client-side hop loop: the agent places one section per turn and … ### [Radio button props loose value when another prop value is changed in the component](https://git.drupalcode.org/project/canvas/-/work_items/3591827) State: opened | Updated: 2026-07-15 | Author: Joery Lemmens (flyke) | Assigned: unassigned | Labels: Description: To test, first change a sdc component's widget from dropdown to radio buttons: - export your config: `drush cex -y` - Locate the config file of your component, like: `config/sync/canvas.component.sdc.sdc_components.card.yml` - Change `field_widget: options_select` into: `field_widget: options_buttons` - import the updated config: `drush cim -y` Now you have a component with radio buttons widget instead of a dropdown. If you set a value for the radio buttons prop and save and close the canvas ui, and then you edit the page and your component again and change a different prop of your component… ### [Undefined array key in getClientSideInfo() transforms when a prop's shape no longer exists in component metadata](https://git.drupalcode.org/project/canvas/-/work_items/3591824) State: opened | Updated: 2026-07-15 | Author: Julien (julien) | Assigned: unassigned | Labels: Description: ### Problem/Motivation In `JsonSchemaPropsComponentSourceBase` (client-side info / transforms building), prop shapes are looked up by expression without an existence check: ```php $prop_shape = $prop_shapes[(string) $component_prop_expression]; ``` When a component's stored prop field definitions reference a prop whose shape no longer exists in the current component metadata (e.g. after an SDC's schema changed and removed/renamed a prop while content still carries the old prop), this triggers an undefined array key and a TypeError downstream, taking down the whole editor/render for that com… --- MERGE REQUESTS (24h) --- ### [fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish](https://git.drupalcode.org/project/canvas/-/merge_requests/1363) State: opened | Author: Nodar Davituri (Davituri) | Branch: 3591820-sync-before-validate-publish | 394 diff lines Description: Closes #3591820 ## What this MR does `ApiAutoSaveController::post()` validated the entity before `content_translation`'s presave field synchronizer ran. Because the auto-save snapshot applied in `applyAutoSaveTranslationSnapshots()` only carries the edited (default) translation, a change to a non-translatable ("symmetric") component input — an image `width`/`loading`, a section `padding_bottom`, a `heading`'s `element`, etc. — left non-default translations stale at validation time, and `ComponentTreeSymmetricalTranslationConstraint` rejected the publish with a 422. `applyAutoSaveTranslation… ### [feat(Conflict detection): #3591723 "Add 'Conflict detected' toast message"](https://git.drupalcode.org/project/canvas/-/merge_requests/1295) State: opened | Author: Ravi Maniyar (ravi.maniyar.123) | Branch: 3591715-use-notifications-to-inform-users-about-the-detected-conflicts | 1268 diff lines Description: Adds conflict toast messages for detected conflicts. * Shows a toast when pending auto-saves contain conflict items. * Keeps this separate from **`/canvas/api/v0/notifications`**. * Stores conflict detection error state in localStorage to avoid repeated toast spam. * Shows the toast message again if the conflict detection error content changes. * Adds the conflict item to Activity Center and badge count. * “Resolve conflicts” opens the Review Changes conflict UI without page reload. * Uses existing color/spacing tokens for the toast styling. ## Testing instructions *  Trigger a conflict whe… ### [feat(Conflict detection): #3591591 Expand conflict resolution UI with...](https://git.drupalcode.org/project/canvas/-/merge_requests/1317) State: opened | Author: Ravi Maniyar (ravi.maniyar.123) | Branch: 3591752-add-side-by-side-review-flow-for-selected-page-changes | 5858 diff lines Description: \[Description of changes\] Adds a side-by-side review flow for selected non-conflicted Page changes before publishing. **Changes include:** - Added a Review Changes route/view for selected pending Page changes. - Reused the shared page version comparison UI for visual/text comparison. - Allows selecting either the published version or the autosave/new version. - Selecting the published version discards the pending autosave change. - Selecting the new version keeps it selected and publishes it from the action button. - Added the all-files-reviewed state with publish/close actions. - Kept con… ### [Draft: issue #3588894 follow-up to address feedback](https://git.drupalcode.org/project/canvas/-/merge_requests/1128) State: opened | Author: Ted Bowman (tedbow) | Branch: 3588894-follow-up | 372 diff lines Description: [Description of changes] addressing @wimleers feedback on https://git.drupalcode.org/project/canvas/-/merge_requests/1073 which is already merge ## AI Disclosure AI was used for the fixes Closes #3588894 ### [chore(deps): update dependency cspell to v10](https://git.drupalcode.org/project/canvas/-/merge_requests/1273) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/major-cspell-monorepo | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cspell](https://cspell.org/) ([source](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell)) | [`^9.2.0` → `^10.0.0`](https://renovatebot.com/diffs/npm/cspell/9.7.0/10.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/cspell/10.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/cspell/9.7.0/10.0.1?slim=true) | > :exclamation: **I… ### [chore(deps): update dependency @eslint/compat to v2](https://git.drupalcode.org/project/canvas/-/merge_requests/1306) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/eslint-compat-2.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@eslint/compat](https://github.com/eslint/rewrite/tree/main/packages/compat#readme) ([source](https://github.com/eslint/rewrite/tree/HEAD/packages/compat)) | [`^1.3.1` → `^2.0.0`](https://renovatebot.com/diffs/npm/@eslint%2fcompat/1.4.1/2.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@eslint%2fcompat/2.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confide… ### [chore(deps): update dependency @chromatic-com/storybook to v5](https://git.drupalcode.org/project/canvas/-/merge_requests/1305) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/chromatic-com-storybook-5.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | [`^3.2.2` → `^5.0.0`](https://renovatebot.com/diffs/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@chromatic-com%2fstorybook/5.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1?slim=true) | >… ### [fix(deps): update npm minor and patch](https://git.drupalcode.org/project/canvas/-/merge_requests/1238) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/npm-minor-and-patch | 77 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm) | [`4.11.1` → `4.12.1`](https://renovatebot.com/diffs/npm/@axe-core%2fplaywright/4.11.1/4.12.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@axe-core%2fplaywright/4.12.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@axe-core%2fplaywright/4.11.1/4.12.1?slim=true) | | [@babel/parser](… ### [chore(deps): update mysql docker tag to v8.4](https://git.drupalcode.org/project/canvas/-/merge_requests/1272) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/mysql-8.x | 13 diff lines Description: This MR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | mysql | service-image | minor | `8.0` → `8.4` | --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - "before 6am on Monday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this MR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this MR, c… ### [Draft: Add exposed slots: per-entity editable areas in content templates](https://git.drupalcode.org/project/canvas/-/merge_requests/1359) State: opened | Author: Lauri Timmanee (lauriii) | Branch: 3591817-add-exposed-slots-per-entity-editable-areas-in-content-templates | 11843 diff lines Description: Spec driven development with AI was used to develop the MR. Closes #3591817 ### [Resolve #3591803: AutoSaveManager::saveEntity() silently clears unresolved conflicts for Page entities"](https://git.drupalcode.org/project/canvas/-/merge_requests/1354) State: opened | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591803-silent-conflict-resolution-in-save-entity | 234 diff lines Description: ## Description saveEntity() always recomputed original_hash from the current stored entity hash. When a conflict was active (the stored entity had been externally updated after the auto-save item was created), this advanced original_hash to match the current stored hash, making getUnresolvedConflictForEntity() find no mismatch on the next call. The fix checks, for Page entities only, whether getUnresolvedConflictForEntity() detects an active conflict before persisting original_hash. If a conflict is active, the value already stored in the auto-save item is preserved instead. ## Testing ins… ### [Draft: #3591667: `dr canvas:doctor` — 🚧](https://git.drupalcode.org/project/canvas/-/merge_requests/1358) State: opened | Author: Wim Leers (wimleers) | Branch: 3591667-dr-canvas-validate | 4007 diff lines Description: See issue. AI-Generated: Yes. > [!note] > > :information_source: This is a huge MR. It also has MANY commits. The intent: be the opinionated expert human-in-the-loop, but let AI write all code. Writing a comprehensive spec up front for this was impractical. The starting point was https://git.drupalcode.org/project/canvas/-/work_items/3591667's description in its state on July 10. > > As of July 15, 13:09, the functionality goals are achieved (according to @wimleers), so now it's time to scrutinize the architecture, then the code: > > > :checkered_flag: It now basically works the way I'd expe… ### [Resolve #3591785: Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/merge_requests/1356) State: opened | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591785-strengthen-autosave-normalization | 906 diff lines Description: ## Summary This branch consolidates the typed-data normalization logic that `AutoSaveManager` and `ComponentSourceBase` previously duplicated into a single method, `TypedDataHelper::castRawPhpTypes()`. ## What changed and why `AutoSaveManager::normalizeEntity()` (hash source) and `ComponentSourceBase::castRawTypedConfigToPhpTypes()` (component-shape normalization) each contained their own primitive-casting and traversal logic. These are merged into `TypedDataHelper::castRawPhpTypes()`, which already existed for the config typed-data path but was not wired into `toStorableArray()`. During c… ### [Issue #3573022: Block config imports that delete an in-use component (data loss / WSOD)](https://git.drupalcode.org/project/canvas/-/merge_requests/1360) State: opened | Author: Christian López Espínola (penyaskito) | Branch: 3573022-prevent-config-import-component-used | 389 diff lines Description: Closes #3573022 ## What this MR does Adds a `ConfigEvents::IMPORT_VALIDATE` subscriber (`ComponentConfigImportValidator`) that blocks a configuration import which would delete a Canvas `Component` config entity — or backing config a retained `Component` depends on (e.g. a `js_component`) — while that component is still used by content (a published revision or an auto-save draft). Core's `ConfigImporter` deletes config entities via the low-level `Config::delete()`, bypassing `ConfigEntityBase::preDelete()` and therefore `Component::onDependencyRemoval()` (which would switch the component to … ### [#3591798: "Changes from MR 1347 with test fix"](https://git.drupalcode.org/project/canvas/-/merge_requests/1370) State: opened | Author: Kunal Sachdev (kunal.sachdev) | Branch: 3591798-changes-from-mr1347-with-test-fix | 201 diff lines Description: ## Testing instructions **Test Case 1: Canvas Page Preview - Reload** 1. Setup: - Navigate to a Canvas page that has translations (if it exists, or create one). - Ensure at least one non-default language has a translation (e.g., French). 2. Steps: - [ ] Open the Canvas page in editor. - [ ] Click the language select dropdown. - [ ] Verify the non-default language (for which translation is available) shows: - A checkmark icon next to the language name - A 3 dots menu button - [ ] Click the French language option. - [ ] Verify the translated content renders in the preview. - [ ] Reload the page.… ### [#3591821: Default page title remains intact when switching different language previews](https://git.drupalcode.org/project/canvas/-/merge_requests/1364) State: opened | Author: utkarsh_33 (Utkarsh_33) | Branch: 3591821-page-title-changes | 130 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591821 ### [Draft: Resolve "Canvas topbar's fixed width is causing the icons to overlap on zooming"](https://git.drupalcode.org/project/canvas/-/merge_requests/1372) State: opened | Author: utkarsh_33 (Utkarsh_33) | Branch: 3591794-canvas-topbars-fixed-width-is-causing-the-icons-to-overlap-on-zooming-follow-up | 92 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591794 --- COMMITS (24h) --- - [3919ab50](https://git.drupalcode.org/project/canvas/-/commit/3919ab50b208c370172f6ecbbb98c02dbeb5b55f) Commit message: — Bálint Kléri (2026-07-15T18:07:18.000+00:00) - [3d2fe4c4](https://git.drupalcode.org/project/canvas/-/commit/3d2fe4c47ae3832468eee55b53d785a978fe970c) feat(Headless): #3591823 Add support for rendering Canvas component trees in the Headless SDK — wotnak (2026-07-15T14:50:00.000+00:00) - [099f1b13](https://git.drupalcode.org/project/canvas/-/commit/099f1b1313b01fd0a789b5d8715bcecde49de6c2) feat(Headless): #3591822 Add configuration UI for headless frontends — Bálint Kléri (2026-07-15T13:45:48.000+00:00) - [1b40b5e4](https://git.drupalcode.org/project/canvas/-/commit/1b40b5e46db1f0737c00494fdd86a1c9a935941f) chore(Headless): #3591826 Simplify headless app environment configuration — Bálint Kléri (2026-07-15T13:17:18.000+00:00) ======================================================================== ## [18] summariseModule:ai_context:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Context Control Center (CCC) (machine name: ai_context) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khalil (ahmad-khalil-imagex), Kristen Pol (kepol), Pravesh Poonia (Pravesh_Poonia)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                Context Control Center (CCC)

                                then use

                                ,

                                ,

                                  /
                                • , and as needed. Output only the HTML fragment with no surrounding , , or
                                  tags. After the project summary prose, add a single subsection titled "

                                  How can I help on this project?

                                  " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Usage record page leaks context item content and grants links without access checks](https://git.drupalcode.org/project/ai_context/-/work_items/3586311) State: opened | Updated: 2026-07-16 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint13, 2026Sprint14, ai::inside, blocker::beta Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !208 [Issue #3586311: Harden usage record and listing access checks.](https://git.drupalcode.org/project/ai_context/-/merge_requests/208) | State: opened | Author: Pravesh Poonia (Pravesh_Poonia), 701 diff lines Description: ## Problem Follow-up to: #3586294 Parent: #3586310 `AiContextUsageRecordController` renders the full current content of the referenced context item via the entity view builder with no `access('view')` check. The route only requires `view ai context usage`, so a user with that permission alone can read the content of items they cannot view — notably items unpublished since the usage was recorded (viewing those requires `view any unpublished ai context item` or ownership). The same page also exposes affordances without matching access: - The context item label is disclosed via `toLink()` in… ### [Allow agents to opt-out of context auto-injection](https://git.drupalcode.org/project/ai_context/-/work_items/3586308) State: opened | Updated: 2026-07-16 | Author: Kristen Pol (kepol) | Assigned: Tamas Balog (tbalog) | Labels: 2026Sprint14, ai::inside, category::feature, needs ux review Description: ## Problem/motivation Follow-up to: #3586268+s Some agents may want to use tools to pull in context as needed rather than have CCC auto-inject context (push). ## Solution Add an option for agents to opt-out of all CCC context injection. For now, let's add it as a toggle that defaults to enabled and is right above the Scope Subscriptions fieldset (outside of the fieldset). **Label:** Allow context injection **Description:** If enabled, context will be ranked based on scope subscriptions and other criteria. The ranked context will be injected into the agent's system prompt based on the c… ### [[Discuss] Context scope subscription approach](https://git.drupalcode.org/project/ai_context/-/work_items/3586320) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol), Aidan Foster (aidanfoster), Emma Horrell (emma-horrell) | Labels: 2026Sprint13, 2026Sprint14, ai::inside, blocker::stable Description: ## Problem/motivation Context scope subscriptions have been confusing for beta users, and scope plugins have different shapes that convolute the idea of subscriptions. We will be reachitecting scope plugins in: - #3586243+s - #3586281+s - #3586273+s so we should decide if "subscriptions" are the right mental model. ## Solution Analyze and update or create follow-up issues as needed. ### [Gather CCC contribution stats for code and non-code contributions for release notes](https://git.drupalcode.org/project/ai_context/-/work_items/3586222) State: closed | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint13, AI Context Management, AI Initiative Sprint, AI Innovation Description: ## Problem/motivation The current tools for generating release notes are inadequate as they only focus on code commits. They also require the issue number to be in the commit message. I want to gather the stats for all contributors for a release including non-code contributions which there are many. ## Solution The result for release notes should be something like: ``` New Features * #12345678 (with link) * #12345678 (with link) * ... Bug Fixes * #12345678 (with link) * #12345678 (with link) * ... Other Contributions * Plan = [number] * Task = [number] * Support = [number] Contributor… ### [Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs](https://git.drupalcode.org/project/ai_context/-/work_items/3586324) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint14, ai::inside, blocker::stable, category::bug Description: ## Problem Follow-up to: #3586323+s Several ai_context tests assert hardcoded admin URL paths instead of deriving expected paths from Drupal routes. This is the same failure class as [#3586323]: production code builds links with `Url::fromRoute()`, but tests break when an upstream module changes a route path. The agent edit form assertion was fixed separately in #3586323. This issue tracks the remaining brittle path assertions, grouped by risk. ### Pattern Brittle: ```php $this->assertSession()->linkByHrefExists('/admin/config/ai/agents/debug?agent_id=' . $agent_id); ``` Preferred: ``… ### [Allow subcontext scope to override parent scope](https://git.drupalcode.org/project/ai_context/-/work_items/3586218) State: opened | Updated: 2026-07-15 | Author: Kristen Pol (kepol) | Assigned: Rob Loach (robloach) | Labels: 2026Sprint10, 2026Sprint11, 2026Sprint12, 2026Sprint13 Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !159 [Issue #3586218: Allow subcontext scope to override parent scope.](https://git.drupalcode.org/project/ai_context/-/merge_requests/159) | State: opened | Author: Kristen Pol (kepol), 4369 diff lines Description: ## Problem/motivation Follow-up to: #3576092 ## Solution From the other issue: Discussion with Emma+Aidan at UX sync: - Toggle (true/false) is defaulted to "Same as parent" (true) right above Global and then hide all of them - Description: "Disable to customize scope." Here's a [plan from cursor](https://www.drupal.org/files/issues/2026-04-21/subcontext_scope_inheritance_51216439.plan_.md) that can be updated to reflect ^ ## Tasks - [x] Add code - [x] Review code - [ ] Manually test code ## AI usage - [ ] AI assisted issue - [ ] AI assisted code - [x] AI generated code --- MERGE REQUESTS (24h) --- ### [Issue #3586324: Replace hardcoded admin path assertions in tests with...](https://git.drupalcode.org/project/ai_context/-/merge_requests/217) State: opened | Author: Ahmad Khalil (ahmad-khalil-imagex) | Branch: 3586324-replace-brittle-hardcoded-admin-path-assertions-in-functional-and-kernel-tests-with-route-derived-urls | 2087 diff lines Description: # Route-path test hardening ## Problem Production code in `ai_context` builds every admin link with `Url::fromRoute()`, but many tests asserted hardcoded URL strings (e.g. `'/admin/config/ai/agents/debug?agent_id=' . $agent_id`). When an upstream module moves a route — as `ai_agents` did in 1.3.2 by relocating agent URLs under `/admin/config/ai/tools-automation/` — those tests fail even though `ai_context` behaves correctly, producing false negatives in CI on dependency updates unrelated to `ai_context` changes. #3586323 fixed one such assertion; this MR addresses the rest, plus the optional… --- COMMITS (24h) --- (none) ======================================================================== ## [19] summariseModule:ai_search:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Search (machine name: ai_search) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhisek Mazumdar (abhisekmazumdar), Artem Dmitriiev (a.dmitriiev)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                  AI Search

                                  then use

                                  ,

                                  ,

                                    /
                                  • , and as needed. Output only the HTML fragment with no surrounding , , or
                                    tags. After the project summary prose, add a single subsection titled "

                                    How can I help on this project?

                                    " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Batch embeddings for improved indexing performance](https://git.drupalcode.org/project/ai_search/-/work_items/3584024) State: opened | Updated: 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Description: This is a placeholder for AI Core issue https://git.drupalcode.org/project/ai/-/work_items/3568648 . The development of ai_search submodule is deprecated, so this issue is for porting functionality from parent issue. ### [RagTool::execute() should expose structured per-result data and check entity access](https://git.drupalcode.org/project/ai_search/-/work_items/3584031) State: opened | Updated: 2026-07-15 | Author: Abhisek Mazumdar (abhisekmazumdar) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !65 [Issue #3584031: RagTool::execute() should expose structured per-result data](https://git.drupalcode.org/project/ai_search/-/merge_requests/65) | State: opened | Author: Abhisek Mazumdar (abhisekmazumdar), 146 diff lines Description: ## Problem/Motivation `RagTool::execute()` (`src/Plugin/AiFunctionCall/RagTool.php`) only ever hands the LLM a single flattened text string built from the search results. None of the per-result data survives the call: not which entity a chunk came from, not its score, not the raw chunk text. `getStructuredOutput()` returns `results` from `$this->results`, but `execute()` builds its output into a local `$end_results` array and never assigns anything to `$this->results`. It is always `[]`. This blocks consumers who want the *retrieved sources themselves*, not just the LLM's answer, from deleg… --- MERGE REQUESTS (24h) --- ### [Cherry pick 7a76c143](https://git.drupalcode.org/project/ai_search/-/merge_requests/64) State: opened | Author: Artem Dmitriiev (a.dmitriiev) | Branch: cherry-pick-7a76c143 | 783 diff lines ### [#3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred]](https://git.drupalcode.org/project/ai_search/-/merge_requests/60) State: opened | Author: Artem Dmitriiev (a.dmitriiev) | Branch: 3584018-heading-embedding-strategy-commonmark | 1074 diff lines Description: Closes #3584018 ### [Resolve "Batch embeddings for improved indexing performance"](https://git.drupalcode.org/project/ai_search/-/merge_requests/53) State: merged 2026-07-15 | Author: Artem Dmitriiev (a.dmitriiev) | Branch: 3584024-batch-embeddings-for-improved-indexing-performance | 711 diff lines Description: Closes #3584024 --- COMMITS (24h) --- (none) ======================================================================== ## [20] summariseModule:field_widget_actions:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Field Widget Actions (machine name: field_widget_actions) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Artem Dmitriiev (a.dmitriiev)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                    Field Widget Actions

                                    then use

                                    ,

                                    ,

                                      /
                                    • , and as needed. Output only the HTML fragment with no surrounding , , or
                                      tags. After the project summary prose, add a single subsection titled "

                                      How can I help on this project?

                                      " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Generate UUIDs for list-style widget-action settings applied via config actions](https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578823) State: opened | Updated: 2026-07-16 | Author: Daniel Bosen (daniel.bosen) | Assigned: unassigned | Labels: 2026Sprint14, AI Initiative Sprint, ai::inside, category::feature Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !27 [Generate missing uuids for field widget action settings](https://git.drupalcode.org/project/field_widget_actions/-/merge_requests/27) | State: opened | Author: Artem Dmitriiev (a.dmitriiev), 503 diff lines Description: The setupFieldWidgetAction config action requires every field widget action to be declared in the recipe with a hard-coded UUID as its array key. Because those UUIDs were static, you can not add multiple suggestion buttons to a single edit form: the actions collide on their keys, so every button ends up writing its AI content suggestion into the same field instead of each button targeting its own field. Let the recipe declare actions as a plain list and have the plugin generate a unique UUID per item at apply time — exactly as the UI does when actions are added interactively — so each button … ### [Support Automator Chain trigger with Field Widget Actions](https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578819) State: closed | Updated: 2026-07-15 | Author: Zsolt Gere (gerezs) | Assigned: unassigned | Labels: Description: Feature suggest: In practice, we bumped into a situation where a workflow couldn't be done in a single Automator flow because of context window limit and in general it couldn't work as a single prompt and we didn't want to have multiple fields for a multiturn workflow so we figured to create the workflow of Automator Chain. We wanted to include this as an action on the edit page without page reload but FWA ddidn't allow to use Automator Chain. I asked a coding agent to prototype this and you can see this FWA form allows to select Aotmator Chain type option when adding a New Action, Next it al… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [21] summariseModule:ai_translate:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI translate (machine name: ai_translate) Reporting period: last 24h (2026-07-15T10:08:48+00:00 to 2026-07-16T10:08:48+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: arne michiels (aren33k)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                      AI translate

                                      then use

                                      ,

                                      ,

                                        /
                                      • , and as needed. Output only the HTML fragment with no surrounding , , or
                                        tags. After the project summary prose, add a single subsection titled "

                                        How can I help on this project?

                                        " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows](https://git.drupalcode.org/project/ai_translate/-/work_items/3585533) State: opened | Updated: 2026-07-15 | Author: arne michiels (aren33k) | Assigned: arne michiels (aren33k) | Labels: category::bug, state::needsWork Description: Problem/Motivation When ai_translate is used together with layout_builder_at for asymmetric Layout Builder translations, translated inline blocks are cloned correctly, but inline_block_usage rows are not created for the cloned translated blocks. This leaves the translated inline blocks in an incomplete state and later causes access dependency failures, for example when opening Media Library on a media field inside the translated inline block. Steps to reproduce 1. Enable `ai_translate` / `layout_builder_at` / Layout Builder on a translatable content type 2. Create a node using Layout Builder… --- MERGE REQUESTS (24h) --- ### [3585533: fix inline block usage](https://git.drupalcode.org/project/ai_translate/-/merge_requests/31) State: opened | Author: arne michiels (aren33k) | Branch: 3585533-ai-translation-of-asymmetric-layout-builder-inline-blocks-does-not-create-inline-block-usage-rows | 206 diff lines Description: Closes #3585533 --- COMMITS (24h) --- (none) ======================================================================== ## [22] generateTldr:executive ======================================================================== You are an editor distilling a Drupal AI project newsletter into its most important highlights. You are writing for a non-technical executive audience. Focus on business impact, strategic progress, and delivery milestones. Avoid all technical jargon. Read all the module summaries below. Separate the highlights into two categories: - SHIPPED: things that were merged, fixed, released, or completed during this period. - ONGOING: things that are actively in progress, under review, or blocked. Be specific — name the module, what happened, and why it matters. Do not use emoticons or mdashes. Do not include any text outside the two sections. When you mention a specific issue or merge request, add an inline citation using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations immediately after the relevant phrase, before any punctuation. Format as two HTML sections. Use exactly this structure (all
                                      • elements must be inside the
                                          , never outside it):

                                          Shipped

                                          1. Title here — One sentence explanation [1].
                                          2. Another title — One sentence explanation.

                                          Ongoing

                                          1. Title here — One sentence explanation [2].
                                          Up to 5 items per section. Do not output any text, tags, or characters outside these two sections. Output only the HTML fragment, no surrounding tags. --- REFERENCE LIST --- [1] Create an HTML to Markdown API and service (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574246 [2] Integrate ChatProcessor plugin system into AI Chatbot DeepChat block (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3585077 [3] Add YAML support to the MDX editor code blocks (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586585 [4] Create plugins for interacting with multimedia in AI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3463843 [5] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [6] Autosave node interfers with AI Chatbot (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3505569 [7] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [8] Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586570 [9] Ecosystem: Badge for AI Initiative-supported modules (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586601 [10] Support Automator Chain trigger with Field Widget Actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586602 [11] Make AI API Explorer have chat history (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3528949 [12] AI Balloon Menu throws uncaught TypeError on selection change when user lacks 'use ai ckeditor' permission, breaking media insertion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586588 [13] Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586542 [14] Visual regression baselines need regenerating after the MDXEditor dark theme fixes (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586600 [15] Document the AI module ecosystem: a categorized list of related modules with links and summaries (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586482 [16] Add a Moderation Guardrail plugin (configurable moderation provider/model as a guardrail) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586531 [17] Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586573 [18] Graceful error handling when an AI Provider is not setup correctly (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3549312 [19] Scope global guardrails by request provider id, model and/or tags (conditional global guardrail sets) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586529 [20] [Meta] AI 1.5.0 release: feature and task candidates (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586593 [21] The Toolbar Chatbot runs the fold out animation on page reload (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568246 [22] Tool Explorer does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582473 [23] MDX Editor does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582474 [24] "AI Guardrails" or "AI Moderation Guardrails"? (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586471 [25] Match "Global Guardrails" config page title with "Global AI Guardrails" menu item (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586476 [26] Create Provider Documentation Page for OpenAI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3533040 [27] Validation of unexisting fields on paragraphs actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3571033 [28] Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3547470 [29] Add league/commonmark as real dependency not a suggestion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586595 [30] Support the `ai_json_schema` element inside off-canvas dialogs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586536 [31] Add rich-text image description support to AI Automators (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586478 [32] Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3584951 [33] Suggest Tags automator should work with Tagify (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3536912 [34] Add Summarization operation type support to the echoai test provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586537 [35] Add non-required visual regression tests for the four built UI elements (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586461 [36] Batch embeddings for improved indexing performance (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568648 [37] Do not assume action definitions have a type when deriving action plugin functions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586589 [38] Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586553 [39] ai_translate: ContentTranslationControllerOverride::overview() fatals when the parent controller returns a Response (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586597 [40] ai_translate: option to translate all fields of an entity in a single LLM call instead of one call per field (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586598 [41] Reject caller-supplied execution identity fields at /api/deepchat boundary (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574662 [42] Issue#3586446:CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler fixes (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1824 [43] feat: #3586585 Add YAML support to the MDX editor code blocks (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1823 [44] #3585077: Integrate chatprocessor plugin (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1497 [45] [#3526390] feat: Improve the AI Search recursive retrieval of a specific quantity of results (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1822 [46] fix(ai_ckeditor): remove stale toolbar items on uninstall and warn on confirm page (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1731 [47] Issue #3586468: "Add interactive refinement capability to Field Widget Actions Automation" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1629 [48] Use service for html to markdown convertion + markdownify integration (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1747 [49] Issue #3586542: Fix documentation staleness — automator-type ID drift,... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1737 [50] fix: #3586573 Tone of voice CKEditor Plugin does not use the translated... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1733 [51] Fix the MDX Editor for Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1616 [52] Issue #3582473: Tool Explorer does not render correctly with Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1446 [53] Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1644 [54] Resolve #3586599: "Tests are failing for phpstan" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1821 [55] Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1638 [56] Issue #3533040:Create Provider Documentation Page for OpenAI (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1530 [57] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1021 [58] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/894 [59] Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1680 [60] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1628 [61] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1679 [62] Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1553 [63] Issue #3586537 Add Summarization operation type support to the echoai test provider (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1681 [64] Issue#3585328:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1820 [65] Resolve "Add non-required visual regression tests for the four built UI elements" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1608 [66] fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1799 [67] Issue#3586558:Preserve-HTML-In-Streamed-Output fixes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1818 [68] Issue#3586553:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1819 [69] Issue #3574662: Add boundaries and test (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1812 [70] Issue#3586491:add-a-during-generate-streaming-section-to-the-guardrail-set-for... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1816 [71] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1817 [72] Issue #3499451: Restore toolbar chatbot state idempotently so a dialog re-attach cannot close it (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1815 [73] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1814 [74] Issue #3499451: Fixed chatbot not reopening after CKEditor/media modal closes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1277 [75] array_flip(): Can only flip string and integer values in config_ignore_ignored_alter() (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586231 [76] Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity) (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586236 [77] fix(#3575454) add vectordb to docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/73 [78] Automated Project Update Bot fixes (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/75 [79] Draft: chore: add bulk chunking (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/63 [80] fix: #3586236 Do not abort recipe apply when amazee.ai trial provisioning fails (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/78 [81] chore: general improvements, switch to zensical docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/79 [82] chore: run rector set to php 8.0 (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/51 [83] Add support for batch embeddings (gemini_provider, Issue) — https://git.drupalcode.org/project/gemini_provider/-/work_items/3589183 [84] Let an agent use a role when running a tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3518167 [85] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [86] Add limits on how often a tool can run (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3547995 [87] Add a per-tool setting to restrict a tool from being called more than once per response (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586051 [88] [Meta] Road to 1.4.0 release (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586017 [89] Array to string conversion in Token::doReplace() when a dynamical token value is an array (applyTokens) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586043 [90] AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, so the status storage cannot be swapped (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586054 [91] feat: Forward tool image output to next loop iteration for vision models (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586018 [92] Add possibility for an agent to store and read instructions from a file (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3572361 [93] Create implementation of ShortTermMemory (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3546411 [94] feat: Per-tool approval mode (pre-approved / approve-once / always) with loop pause-resume (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586020 [95] Fix streaming (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577520 [96] Use streamed chat for agents (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3538174 [97] Default information tools | Interactive section disappears after adding tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586049 [98] PHPUnit CI job fails (exit code 1) for every test class despite all assertions passing (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586053 [99] Add test coverage for externally-driven execution (setLooped(FALSE)) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586052 [100] "Use Artifact storage" checkbox not necessary? (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586046 [101] Issue #3547995: Add deterministic tool usage limits. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/224 [102] feat: #3586051 Add a per-tool setting to restrict a tool from being called... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/299 [103] Draft: Resolve #3572361 "Add possibility for" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/233 [104] Issue #ai_agents-3577520: Streaming fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/290 [105] Type-hint AiAgentStatusStorageInterface instead of PrivateTempStatusStorage in AgentStatusSubscriber. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/304 [106] Draft: Resolve #3538174 "Use streamed chat" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/165 [107] Issues/3586052: Add tests for setlooped. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/300 [108] Canvas AI: UI/Functional update. Lock the canvas during a build and add a long-running AI-tasks UI element to the chat (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591724 [109] useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591832 [110] Tailwind CSS added by code components overrides theme level CSS (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591831 [111] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [112] Multi-bundle content-entity-reference picks fail to coalesce into a branch expression (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591829 [113] Restore browser-based component sync for Canvas Headless (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591830 [114] Allow fields to be added to the page entity type (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3568228 [115] Support multi-target-bundle references in code component content-entity-reference props (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591656 [116] Add support for rendering Canvas component trees in the headless SDK (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591823 [117] Boolean props auto-enable when another prop is changed in the Canvas form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591716 [118] Incorrect folder assignment for newly created code components (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591828 [119] Add configuration UI for headless frontends (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591822 [120] Simplify headless app environment configuration (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591826 [121] Canvas AI: Add the place_components AI tool (+ kernel test) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591811 [122] Radio button props loose value when another prop value is changed in the component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591827 [123] Undefined array key in getClientSideInfo() transforms when a prop's shape no longer exists in component metadata (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591824 [124] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [125] feat(Conflict detection): #3591723 "Add 'Conflict detected' toast message" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1295 [126] feat(Conflict detection): #3591591 Expand conflict resolution UI with... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1317 [127] 3591832: useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1377 [128] Draft: issue #3588894 follow-up to address feedback (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1128 [129] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [130] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [131] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [132] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [133] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [134] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [135] Draft: Add exposed slots: per-entity editable areas in content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1359 [136] Resolve #3591803: AutoSaveManager::saveEntity() silently clears unresolved conflicts for Page entities" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1354 [137] Draft: Resolve #3591656: Support multi-target-bundle references in content-entity-reference props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1369 [138] fix(Headless): #3591830 Restore browser-based component sync for Canvas Headless (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1375 [139] Draft: #3591667: `dr canvas:doctor` — 🚧 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1358 [140] feat(Headless): #3591823 Add support for rendering Canvas component trees in the headless SDK (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1371 [141] Resolve #3591785: Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [142] #3591828 Refetch folder list after newly exposing a code component (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1374 [143] feat(Headless): #3591822 Add configuration UI for headless frontends (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1368 [144] chore(Headless): #3591826 Simplify headless app environment configuration (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1373 [145] Issue #3573022: Block config imports that delete an in-use component (data loss / WSOD) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1360 [146] #3591798: "Changes from MR 1347 with test fix" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1370 [147] #3591821: Default page title remains intact when switching different language previews (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1364 [148] Draft: Resolve "Canvas topbar's fixed width is causing the icons to overlap on zooming" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1372 [149] Usage record page leaks context item content and grants links without access checks (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586311 [150] Allow agents to opt-out of context auto-injection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586308 [151] [Discuss] Context scope subscription approach (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586320 [152] Gather CCC contribution stats for code and non-code contributions for release notes (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586222 [153] Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586324 [154] Allow subcontext scope to override parent scope (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586218 [155] Issue #3586311: Harden usage record and listing access checks. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/208 [156] Issue #3586324: Replace hardcoded admin path assertions in tests with... (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/217 [157] Issue #3586218: Allow subcontext scope to override parent scope. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/159 [158] Batch embeddings for improved indexing performance (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584024 [159] RagTool::execute() should expose structured per-result data and check entity access (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584031 [160] Cherry pick 7a76c143 (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/64 [161] Issue #3584031: RagTool::execute() should expose structured per-result data (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/65 [162] #3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred] (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/60 [163] Resolve "Batch embeddings for improved indexing performance" (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/53 [164] Generate UUIDs for list-style widget-action settings applied via config actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578823 [165] Support Automator Chain trigger with Field Widget Actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578819 [166] Generate missing uuids for field widget action settings (field_widget_actions, MR) — https://git.drupalcode.org/project/field_widget_actions/-/merge_requests/27 [167] AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585533 [168] 3585533: fix inline block usage (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/31 --- MODULE SUMMARIES ---

                                          AI (Artificial Intelligence)

                                          The AI module made significant progress on user experience, integration robustness, and content-moderation capabilities over the past 24 hours. Several fixes improving cross-theme compatibility and internationalization were merged, alongside enhancements to streaming guardrails and automation workflows.

                                          Key delivery included improved rich-text content handling: automators can now detect and process images embedded in formatted text fields, generating AI descriptions that feed into moderation or summarization workflows. This enables content pre-screening that evaluates both text and visual context. Support for dark-theme rendering in the Gin admin interface was completed for both the MDX editor and Tool Explorer, ensuring consistent appearance across theming choices. A localization issue affecting the tone-of-voice taxonomy selector in CKEditor was resolved, so multilingual sites now correctly use translated term labels and descriptions in prompts.

                                          On the guardrails front, a new streaming guardrail plugin and supporting kernel tests were merged, demonstrating mid-stream content evaluation during generation. The API boundary for the chatbot endpoint was hardened to reject caller-supplied execution identity fields, closing a potential authorization gap. Work continued on taxonomy automators (handling HTML-encoded entities), streaming output preservation, and chatbot behavior when modal dialogs trigger page refreshes.

                                          Documentation expanded with an ecosystem index and OpenAI provider setup guide. Several uninstall and permission-handling bugs were addressed, and visual regression baselines were added for the module's four compiled UI elements.

                                          How can I help on this project?

                                          • Prioritize resourcing for the chatbot modal-interaction issue, which affects editor workflows and has an open merge request awaiting review and final testing.
                                          • Commission a cross-provider streaming compatibility audit to confirm the Gemini 2.x streaming fix generalizes to other vendors and avoid further 400-error reports.

                                          Contributors: Abhinav Jha (ajabhinavjha30), Abhishek Dhariwal (adaptative), Ahmad Khader (Ahmad-Khader) [3], Ann Mary Sruthy (annmarysruthy), Artem Dmitriiev (a.dmitriiev), Avinash jha (avinash.jha) [1], Bharat Kelotra (bharatkelotra), Billy Davies (billy.davies), codebymikey, Joshua Fernandes (joshua1234511), Levente Besenyei (LeventeB) [1], Marcus Johansson (Marcus_Johansson) [2], Prabhavathi Vanipenta (prabha1997) [1], Ricardo Castañeda (cadence96), Ryan Szrama (rszrama), Shubham Prakash (shubham.prakash) [1], Thomas Werthmüller (weri) [1]

                                          ---

                                          amazee.ai Private AI Provider

                                          This module integrates private AI capabilities into Drupal, including support for vector databases and trial account provisioning. Over the past 24 hours, the team merged several improvements focused on installation reliability and documentation quality.

                                          Two critical installation bugs were resolved. The first addressed a configuration import error that prevented administrators from managing site configuration via command-line tools. The second fixed a problem where the entire installation would fail if the trial account provisioning service was temporarily unavailable or at capacity. This change ensures that sites can be installed even when the external trial service is unreachable, treating free trial setup as optional rather than mandatory.

                                          Documentation has been migrated to a new system and expanded to cover vector database capabilities. Automated quality improvements were also merged. One optimization for bulk vector database operations remains in draft review; when completed, it will improve indexing performance for sites processing large volumes of content.

                                          How can I help on this project?

                                          • Prioritize testing of the installation improvements in realistic deployment scenarios to confirm trial provisioning failures are handled gracefully across different network conditions.
                                          • Approve allocation of review capacity to finalize the bulk indexing optimization currently in draft.

                                          Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah)

                                          ---

                                          Gemini Provider

                                          The Gemini Provider module enables integration with Google's Gemini AI models within Drupal environments. Over the past 24 hours, activity focused on expanding the module's capabilities to support more efficient content processing.

                                          Work continued on Add support for batch embeddings, which would allow the system to process multiple pieces of content simultaneously rather than one at a time. This capability is important for improving performance when analyzing or categorizing large volumes of content. The work is in review, with progress being made on naming conventions and testing infrastructure to ensure compatibility with related systems.

                                          No code was merged or committed during this period, indicating the project is in a refinement phase. This is typical activity for a module in development, with focus on ensuring quality before integration.

                                          How can I help on this project?

                                          • Allocate reviewer capacity to evaluate the batch embeddings work currently awaiting review, which could accelerate delivery of performance improvements.
                                          • Clarify priority and timeline expectations for the batch processing feature to help the team sequence remaining development work.
                                          ---

                                          AI Agents

                                          Development continued on key features needed to make agents safer and more controllable in production settings. Work progressed on several mechanisms to govern how tools are invoked: limiting how many times a tool can run during a session, restricting tools from being called more than once in a single response, and controlling the order in which tools execute. These capabilities are important for preventing agents from looping indefinitely or acting in ways that don't align with business logic.

                                          One feature was merged that allows agents to store and read instructions from a file, making it easier to share context between parent and child agents without consuming excessive tokens or losing detail. A minor type-hinting issue that prevented administrators from swapping the agent status storage implementation was also resolved.

                                          Several quality-of-life improvements are in review, including a fix for streaming responses in chatbots and a solution to a UI bug where the "Interactive" option disappeared after adding a tool. A test suite for externally-driven agent execution (used by Canvas) has been added to prevent accidental breaking changes to that mode.

                                          Planning is underway for the 1.4.0 release, with several feature proposals opened for review, including per-tool approval workflows and the ability to forward images from tool output to vision models in the next loop iteration.

                                          How can I help on this project?

                                          • Confirm priorities for the 1.4.0 release roadmap to focus contributor effort on features that unlock the most business value.
                                          • Provide a test environment or budget for QA support to validate streaming, tool approval, and external orchestration workflows before stable release.

                                          Contributors: Ahmad Khalil (ahmad-khalil-imagex), AKHIL BABU (AkhilBabu), Bharat Kelotra (bharatkelotra), Marcus Johansson (Marcus_Johansson), Nicolae Procopan (thebumikgmail.com), Prabhavathi Vanipenta (prabha1997)

                                          ---

                                          Drupal Canvas

                                          The past 24 hours saw concentrated progress on the headless capabilities of Canvas, which allow organizations to use Canvas as a content and layout engine while rendering pages through separate frontend frameworks like Next.js, Astro, or Nuxt.

                                          Three related improvements to the headless experience were completed and merged. First, a new rendering system was added to the headless SDK, enabling applications to automatically traverse and display Canvas component trees without custom integration code. Second, a configuration interface was introduced in Canvas to manage multiple frontend URLs and provide setup guidance to developers. Third, environment variable requirements for headless applications were simplified and standardized, reducing manual configuration steps and preventing drift between settings.

                                          However, one of these changes temporarily broke the synchronization mechanism that allows Canvas to communicate with locally running frontend development servers. This was quickly identified and corrected with a restoration of browser-based component sync, ensuring all four supported frameworks can properly connect to the Canvas editor.

                                          Work continues on several functional areas. Two significant bugs affecting component properties are under investigation: boolean toggles that unexpectedly activate when other properties change, and radio button selections that reset during edits. A fix is in progress for a visual issue where sections using viewport-relative heights cause the preview iframe to grow incorrectly. Additionally, work is advancing on supporting content references that can point to multiple content types with different field structures.

                                          How can I help on this project?

                                          • Review and approve the headless configuration interface to ensure it meets the needs of teams planning to adopt headless architectures.
                                          • Prioritize investigation of the component property bugs affecting boolean and radio inputs, as these impact daily editorial workflows.

                                          Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Ben Mullins (bnjmnm), Bálint Kléri (balintbrews) [3], Christian López Espínola (penyaskito), Feliksas Mazeikis (f.mazeikis), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Narendra Singh Rathore (NarendraR), Nodar Davituri (Davituri), Ravi Maniyar (ravi.maniyar.123), Ted Bowman (tedbow), utkarsh_33 (Utkarsh_33), Wim Leers (wimleers), wotnak [1]

                                          ---

                                          Context Control Center (CCC)

                                          Development activity this period centered on hardening the module's security and test resilience ahead of a stable release. Work is underway to address an access control issue where usage record pages could potentially expose content from unpublished context items to users without proper view permissions. A draft solution has been prepared covering both the content leak and link generation concerns.

                                          A significant piece of technical debt is being resolved through updates to the test suite. Multiple tests were found to use hardcoded URL paths that break when upstream modules reorganize their routing structure, even though the module itself continues to work correctly. This caused false failures in automated testing. A fix covering the remaining brittle path assertions has been drafted and is under review.

                                          Planning discussions continued around the scope subscription model, which has proven confusing for early users. This represents a core user experience challenge as the module approaches a stable release. Separately, a feature is being designed to let AI agents opt out of automatic context injection in favor of tool-based retrieval, and work on subcontext scope inheritance remains in progress.

                                          The release notes contribution tracking task was completed, improving recognition of non-code contributions to the project.

                                          How can I help on this project?

                                          • Prioritize user experience review resources for the scope subscription redesign, which is blocking the stable release and affects core usability.
                                          • Consider allocating dedicated security review capacity to validate and merge the access control hardening work currently in draft.

                                          Contributors: Ahmad Khalil (ahmad-khalil-imagex), Kristen Pol (kepol), Pravesh Poonia (Pravesh_Poonia)

                                          ---

                                          AI Search

                                          The AI Search module made focused progress on performance and data architecture during this period. A substantial batch embeddings enhancement was merged to improve indexing performance, allowing content to be processed more efficiently at scale. This directly addresses one of the key bottlenecks when deploying AI-powered search across large content repositories.

                                          Work continued on a new Markdown-based embedding strategy that intelligently splits content at headings, with two competing implementation approaches now under review. Additionally, development began on exposing structured search result data and enforcing entity-level permissions—a critical requirement for ensuring users only see content they're authorised to access when AI generates answers from indexed material. This security and transparency work has an active merge request in progress.

                                          The module remains in active development with normal iteration across features and architecture improvements.

                                          How can I help on this project?

                                          • Provide guidance on which Markdown splitting approach better serves your content strategy, as two competing implementations are awaiting decision.
                                          • Clarify access control requirements to ensure the security work aligns with organisational policy on content visibility.

                                          Contributors: Abhisek Mazumdar (abhisekmazumdar), Artem Dmitriiev (a.dmitriiev)

                                          ---

                                          Field Widget Actions

                                          Field Widget Actions enables users to trigger automated workflows directly from content editing forms. During this period, work focused on improving how the module can be configured through automated setup tools and supporting more complex AI-driven workflows.

                                          A new merge request was opened to address a configuration limitation: when setting up multiple suggestion buttons on a single form using automated deployment tools, all buttons were inadvertently targeting the same field due to identifier conflicts. The Generate UUIDs for list-style widget-action settings applied via config actions work will allow each button to receive a unique identifier automatically, matching the behaviour users already experience when configuring buttons manually through the interface.

                                          Separately, Support Automator Chain trigger with Field Widget Actions was closed. This expands the module's workflow capabilities to support multi-step AI processes, useful when tasks exceed single-prompt complexity or token limits and require sequential operations without reloading the page.

                                          How can I help on this project?

                                          Review and approve the open merge request addressing configuration automation. Consider whether additional testing resources are needed to validate multi-button deployments across environments before the work is finalized.

                                          Contributors: Artem Dmitriiev (a.dmitriiev)

                                          ---

                                          AI translate

                                          The AI translate project saw focused work on resolving an issue affecting users who combine AI-powered translation with complex page layouts. A bug was identified and addressed where translated content blocks were not being fully configured in the system, leaving them in an incomplete state that prevented users from accessing certain features like media libraries within those blocks.

                                          A fix for this inline block issue has been prepared and is under review. Once merged, this will ensure that AI-translated page layouts function correctly and users can work with all content features as expected. This work removes a blocker for organizations using AI translation alongside advanced page building capabilities.

                                          How can I help on this project?

                                          • Ensure the pending fix receives timely review and testing resources to accelerate its release to users.
                                          • Consider funding additional quality assurance work to identify similar integration issues before they affect production users.

                                          Contributors: arne michiels (aren33k)

                                          ======================================================================== ## [23] factcheck:tldr:executive ======================================================================== Layer-1 corrections: 0 Judge flags: 0 ======================================================================== ## [24] generate2026Capabilities ======================================================================== You are an editor writing a strategic section for a non-technical executive audience. The Drupal AI initiative has 8 planned capabilities for 2026. Your task is to read the module activity summaries below and explain how today's progress moves each capability forward — or note where there was no relevant progress today. Be concise and direct. Focus on what matters to a business leader: is progress happening, what is the next milestone, and are there any risks? When you describe progress on a capability, add inline citations using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations at the end of the relevant sentence, before the closing punctuation. Output an HTML fragment using exactly this structure:

                                          2026 Capabilities Progress

                                          1. Capability name — One or two sentences on how today's activity relates to this goal, or "No direct progress today" if nothing relevant occurred.
                                          Use only the 8 capabilities listed below, in the same order. Do not add, remove, or rename them. Do not output any text outside the

                                          and
                                            tags. --- 2026 CAPABILITIES --- 1. Page generation — Describe what you need and get a usable page, built from your actual design system components 2. Context management — A central place to define brand voice, style guides, audience profiles, and governance rules that AI can use 3. Background agents — AI that works without being prompted, responding to triggers and schedules while respecting editorial workflows 4. Design system integration — AI that builds with your components and can propose new ones when needed 5. Content creation and discovery — Smarter search, AI-powered optimization, and content drafting assistance 6. Advanced governance — Batch approvals, branch-based versioning, and comprehensive audit trails for AI changes 7. Intelligent website improvements — AI that learns from performance data, proposes concrete changes, and gets smarter over time through editorial review 8. Multi-channel campaigns — Create content for websites, social, email, and automation platforms from a single campaign goal --- REFERENCE LIST --- [1] Create an HTML to Markdown API and service (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574246 [2] Integrate ChatProcessor plugin system into AI Chatbot DeepChat block (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3585077 [3] Add YAML support to the MDX editor code blocks (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586585 [4] Create plugins for interacting with multimedia in AI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3463843 [5] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [6] Autosave node interfers with AI Chatbot (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3505569 [7] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [8] Uninstalling ai_ckeditor leaves stale toolbar items in editor.editor.* configuration (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586570 [9] Ecosystem: Badge for AI Initiative-supported modules (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586601 [10] Support Automator Chain trigger with Field Widget Actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586602 [11] Make AI API Explorer have chat history (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3528949 [12] AI Balloon Menu throws uncaught TypeError on selection change when user lacks 'use ai ckeditor' permission, breaking media insertion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586588 [13] Documentation staleness audit: automator-type ID drift, ai_eca/ai_validations deprecation notices, streaming API method names (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586542 [14] Visual regression baselines need regenerating after the MDXEditor dark theme fixes (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586600 [15] Document the AI module ecosystem: a categorized list of related modules with links and summaries (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586482 [16] Add a Moderation Guardrail plugin (configurable moderation provider/model as a guardrail) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586531 [17] Tone of voice CKEditor Plugin does not use the translated version of the linked taxonomy (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586573 [18] Graceful error handling when an AI Provider is not setup correctly (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3549312 [19] Scope global guardrails by request provider id, model and/or tags (conditional global guardrail sets) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586529 [20] [Meta] AI 1.5.0 release: feature and task candidates (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586593 [21] The Toolbar Chatbot runs the fold out animation on page reload (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568246 [22] Tool Explorer does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582473 [23] MDX Editor does not render correctly with Gin dark theme (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582474 [24] "AI Guardrails" or "AI Moderation Guardrails"? (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586471 [25] Match "Global Guardrails" config page title with "Global AI Guardrails" menu item (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586476 [26] Create Provider Documentation Page for OpenAI (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3533040 [27] Validation of unexisting fields on paragraphs actions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3571033 [28] Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3547470 [29] Add league/commonmark as real dependency not a suggestion (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586595 [30] Support the `ai_json_schema` element inside off-canvas dialogs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586536 [31] Add rich-text image description support to AI Automators (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586478 [32] Add SensitiveContentStream guardrail and kernel test for StreamableGuardrailInterface mid-stream buffering and evaluation (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3584951 [33] Suggest Tags automator should work with Tagify (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3536912 [34] Add Summarization operation type support to the echoai test provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586537 [35] Add non-required visual regression tests for the four built UI elements (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586461 [36] Batch embeddings for improved indexing performance (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3568648 [37] Do not assume action definitions have a type when deriving action plugin functions (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586589 [38] Taxonomy automator clears valid term values when the LLM returns HTML-encoded entities (e.g. &) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586553 [39] ai_translate: ContentTranslationControllerOverride::overview() fatals when the parent controller returns a Response (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586597 [40] ai_translate: option to translate all fields of an entity in a single LLM call instead of one call per field (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586598 [41] Reject caller-supplied execution identity fields at /api/deepchat boundary (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3574662 [42] Issue#3586446:CKEditor-AI-Streaming-Fails-For-OpenAI-When-Guzzle-Uses-StreamHandler fixes (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1824 [43] feat: #3586585 Add YAML support to the MDX editor code blocks (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1823 [44] #3585077: Integrate chatprocessor plugin (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1497 [45] [#3526390] feat: Improve the AI Search recursive retrieval of a specific quantity of results (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1822 [46] fix(ai_ckeditor): remove stale toolbar items on uninstall and warn on confirm page (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1731 [47] Issue #3586468: "Add interactive refinement capability to Field Widget Actions Automation" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1629 [48] Use service for html to markdown convertion + markdownify integration (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1747 [49] Issue #3586542: Fix documentation staleness — automator-type ID drift,... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1737 [50] fix: #3586573 Tone of voice CKEditor Plugin does not use the translated... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1733 [51] Fix the MDX Editor for Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1616 [52] Issue #3582473: Tool Explorer does not render correctly with Gin dark theme (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1446 [53] Resolve #3586476 Match Global Guardrails config page title with Global AI Guardrails menu item (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1644 [54] Resolve #3586599: "Tests are failing for phpstan" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1821 [55] Issue #3586471: Align naming of AI Guardrails in menu links and UX documentation for consistency (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1638 [56] Issue #3533040:Create Provider Documentation Page for OpenAI (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1530 [57] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1021 [58] Draft: [#3547470] fix: Type error and infinite AJAX request loop when the Agent is unable to resolve a request job (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/894 [59] Issue #3586536 Support the `ai_json_schema` element inside off-canvas dialogs (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1680 [60] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1628 [61] Issue #3586478: "Add rich-text image description support to AI Automators" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1679 [62] Issue #3584951: Add kernel test for StreamableGuardrailInterface mid-stream... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1553 [63] Issue #3586537 Add Summarization operation type support to the echoai test provider (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1681 [64] Issue#3585328:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1820 [65] Resolve "Add non-required visual regression tests for the four built UI elements" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1608 [66] fix: #3586589 Do not assume action definitions have a type when deriving action plugin functions (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1799 [67] Issue#3586558:Preserve-HTML-In-Streamed-Output fixes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1818 [68] Issue#3586553:... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1819 [69] Issue #3574662: Add boundaries and test (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1812 [70] Issue#3586491:add-a-during-generate-streaming-section-to-the-guardrail-set-for... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1816 [71] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1817 [72] Issue #3499451: Restore toolbar chatbot state idempotently so a dialog re-attach cannot close it (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1815 [73] Cherry pick 99419a07 (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1814 [74] Issue #3499451: Fixed chatbot not reopening after CKEditor/media modal closes. (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1277 [75] array_flip(): Can only flip string and integer values in config_ignore_ignored_alter() (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586231 [76] Recipe apply aborts when amazee.ai trial account provisioning fails (e.g. HTTP 429 trial capacity) (ai_provider_amazeeio, Issue) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/work_items/3586236 [77] fix(#3575454) add vectordb to docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/73 [78] Automated Project Update Bot fixes (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/75 [79] Draft: chore: add bulk chunking (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/63 [80] fix: #3586236 Do not abort recipe apply when amazee.ai trial provisioning fails (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/78 [81] chore: general improvements, switch to zensical docs (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/79 [82] chore: run rector set to php 8.0 (ai_provider_amazeeio, MR) — https://git.drupalcode.org/project/ai_provider_amazeeio/-/merge_requests/51 [83] Add support for batch embeddings (gemini_provider, Issue) — https://git.drupalcode.org/project/gemini_provider/-/work_items/3589183 [84] Let an agent use a role when running a tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3518167 [85] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [86] Add limits on how often a tool can run (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3547995 [87] Add a per-tool setting to restrict a tool from being called more than once per response (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586051 [88] [Meta] Road to 1.4.0 release (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586017 [89] Array to string conversion in Token::doReplace() when a dynamical token value is an array (applyTokens) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586043 [90] AgentStatusSubscriber type-hints PrivateTempStatusStorage instead of AiAgentStatusStorageInterface, so the status storage cannot be swapped (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586054 [91] feat: Forward tool image output to next loop iteration for vision models (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586018 [92] Add possibility for an agent to store and read instructions from a file (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3572361 [93] Create implementation of ShortTermMemory (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3546411 [94] feat: Per-tool approval mode (pre-approved / approve-once / always) with loop pause-resume (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586020 [95] Fix streaming (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577520 [96] Use streamed chat for agents (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3538174 [97] Default information tools | Interactive section disappears after adding tool (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586049 [98] PHPUnit CI job fails (exit code 1) for every test class despite all assertions passing (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586053 [99] Add test coverage for externally-driven execution (setLooped(FALSE)) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586052 [100] "Use Artifact storage" checkbox not necessary? (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586046 [101] Issue #3547995: Add deterministic tool usage limits. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/224 [102] feat: #3586051 Add a per-tool setting to restrict a tool from being called... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/299 [103] Draft: Resolve #3572361 "Add possibility for" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/233 [104] Issue #ai_agents-3577520: Streaming fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/290 [105] Type-hint AiAgentStatusStorageInterface instead of PrivateTempStatusStorage in AgentStatusSubscriber. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/304 [106] Draft: Resolve #3538174 "Use streamed chat" (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/165 [107] Issues/3586052: Add tests for setlooped. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/300 [108] Canvas AI: UI/Functional update. Lock the canvas during a build and add a long-running AI-tasks UI element to the chat (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591724 [109] useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591832 [110] Tailwind CSS added by code components overrides theme level CSS (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591831 [111] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [112] Multi-bundle content-entity-reference picks fail to coalesce into a branch expression (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591829 [113] Restore browser-based component sync for Canvas Headless (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591830 [114] Allow fields to be added to the page entity type (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3568228 [115] Support multi-target-bundle references in code component content-entity-reference props (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591656 [116] Add support for rendering Canvas component trees in the headless SDK (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591823 [117] Boolean props auto-enable when another prop is changed in the Canvas form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591716 [118] Incorrect folder assignment for newly created code components (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591828 [119] Add configuration UI for headless frontends (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591822 [120] Simplify headless app environment configuration (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591826 [121] Canvas AI: Add the place_components AI tool (+ kernel test) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591811 [122] Radio button props loose value when another prop value is changed in the component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591827 [123] Undefined array key in getClientSideInfo() transforms when a prop's shape no longer exists in component metadata (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591824 [124] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [125] feat(Conflict detection): #3591723 "Add 'Conflict detected' toast message" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1295 [126] feat(Conflict detection): #3591591 Expand conflict resolution UI with... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1317 [127] 3591832: useSyncIframeHeightToContent: vh-height sections with background images cause unbounded iframe growth via feedback loop (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1377 [128] Draft: issue #3588894 follow-up to address feedback (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1128 [129] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [130] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [131] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [132] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [133] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [134] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [135] Draft: Add exposed slots: per-entity editable areas in content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1359 [136] Resolve #3591803: AutoSaveManager::saveEntity() silently clears unresolved conflicts for Page entities" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1354 [137] Draft: Resolve #3591656: Support multi-target-bundle references in content-entity-reference props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1369 [138] fix(Headless): #3591830 Restore browser-based component sync for Canvas Headless (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1375 [139] Draft: #3591667: `dr canvas:doctor` — 🚧 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1358 [140] feat(Headless): #3591823 Add support for rendering Canvas component trees in the headless SDK (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1371 [141] Resolve #3591785: Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [142] #3591828 Refetch folder list after newly exposing a code component (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1374 [143] feat(Headless): #3591822 Add configuration UI for headless frontends (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1368 [144] chore(Headless): #3591826 Simplify headless app environment configuration (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1373 [145] Issue #3573022: Block config imports that delete an in-use component (data loss / WSOD) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1360 [146] #3591798: "Changes from MR 1347 with test fix" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1370 [147] #3591821: Default page title remains intact when switching different language previews (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1364 [148] Draft: Resolve "Canvas topbar's fixed width is causing the icons to overlap on zooming" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1372 [149] Usage record page leaks context item content and grants links without access checks (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586311 [150] Allow agents to opt-out of context auto-injection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586308 [151] [Discuss] Context scope subscription approach (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586320 [152] Gather CCC contribution stats for code and non-code contributions for release notes (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586222 [153] Replace brittle hardcoded admin path assertions in functional and kernel tests with route-derived URLs (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586324 [154] Allow subcontext scope to override parent scope (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586218 [155] Issue #3586311: Harden usage record and listing access checks. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/208 [156] Issue #3586324: Replace hardcoded admin path assertions in tests with... (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/217 [157] Issue #3586218: Allow subcontext scope to override parent scope. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/159 [158] Batch embeddings for improved indexing performance (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584024 [159] RagTool::execute() should expose structured per-result data and check entity access (ai_search, Issue) — https://git.drupalcode.org/project/ai_search/-/work_items/3584031 [160] Cherry pick 7a76c143 (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/64 [161] Issue #3584031: RagTool::execute() should expose structured per-result data (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/65 [162] #3584018: Markdown version of Embedding Strategy that splits on headings with fallback [Preferred] (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/60 [163] Resolve "Batch embeddings for improved indexing performance" (ai_search, MR) — https://git.drupalcode.org/project/ai_search/-/merge_requests/53 [164] Generate UUIDs for list-style widget-action settings applied via config actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578823 [165] Support Automator Chain trigger with Field Widget Actions (field_widget_actions, Issue) — https://git.drupalcode.org/project/field_widget_actions/-/work_items/3578819 [166] Generate missing uuids for field widget action settings (field_widget_actions, MR) — https://git.drupalcode.org/project/field_widget_actions/-/merge_requests/27 [167] AI translation of asymmetric Layout Builder inline blocks does not create inline_block_usage rows (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585533 [168] 3585533: fix inline block usage (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/31 --- TODAY'S MODULE SUMMARIES ---

                                            AI (Artificial Intelligence)

                                            The AI module made significant progress on user experience, integration robustness, and content-moderation capabilities over the past 24 hours. Several fixes improving cross-theme compatibility and internationalization were merged, alongside enhancements to streaming guardrails and automation workflows.

                                            Key delivery included improved rich-text content handling: automators can now detect and process images embedded in formatted text fields, generating AI descriptions that feed into moderation or summarization workflows. This enables content pre-screening that evaluates both text and visual context. Support for dark-theme rendering in the Gin admin interface was completed for both the MDX editor and Tool Explorer, ensuring consistent appearance across theming choices. A localization issue affecting the tone-of-voice taxonomy selector in CKEditor was resolved, so multilingual sites now correctly use translated term labels and descriptions in prompts.

                                            On the guardrails front, a new streaming guardrail plugin and supporting kernel tests were merged, demonstrating mid-stream content evaluation during generation. The API boundary for the chatbot endpoint was hardened to reject caller-supplied execution identity fields, closing a potential authorization gap. Work continued on taxonomy automators (handling HTML-encoded entities), streaming output preservation, and chatbot behavior when modal dialogs trigger page refreshes.

                                            Documentation expanded with an ecosystem index and OpenAI provider setup guide. Several uninstall and permission-handling bugs were addressed, and visual regression baselines were added for the module's four compiled UI elements.

                                            How can I help on this project?

                                            • Prioritize resourcing for the chatbot modal-interaction issue, which affects editor workflows and has an open merge request awaiting review and final testing.
                                            • Commission a cross-provider streaming compatibility audit to confirm the Gemini 2.x streaming fix generalizes to other vendors and avoid further 400-error reports.

                                            Contributors: Abhinav Jha (ajabhinavjha30), Abhishek Dhariwal (adaptative), Ahmad Khader (Ahmad-Khader) [3], Ann Mary Sruthy (annmarysruthy), Artem Dmitriiev (a.dmitriiev), Avinash jha (avinash.jha) [1], Bharat Kelotra (bharatkelotra), Billy Davies (billy.davies), codebymikey, Joshua Fernandes (joshua1234511), Levente Besenyei (LeventeB) [1], Marcus Johansson (Marcus_Johansson) [2], Prabhavathi Vanipenta (prabha1997) [1], Ricardo Castañeda (cadence96), Ryan Szrama (rszrama), Shubham Prakash (shubham.prakash) [1], Thomas Werthmüller (weri) [1]

                                            ---

                                            amazee.ai Private AI Provider

                                            This module integrates private AI capabilities into Drupal, including support for vector databases and trial account provisioning. Over the past 24 hours, the team merged several improvements focused on installation reliability and documentation quality.

                                            Two critical installation bugs were resolved. The first addressed a configuration import error that prevented administrators from managing site configuration via command-line tools. The second fixed a problem where the entire installation would fail if the trial account provisioning service was temporarily unavailable or at capacity. This change ensures that sites can be installed even when the external trial service is unreachable, treating free trial setup as optional rather than mandatory.

                                            Documentation has been migrated to a new system and expanded to cover vector database capabilities. Automated quality improvements were also merged. One optimization for bulk vector database operations remains in draft review; when completed, it will improve indexing performance for sites processing large volumes of content.

                                            How can I help on this project?

                                            • Prioritize testing of the installation improvements in realistic deployment scenarios to confirm trial provisioning failures are handled gracefully across different network conditions.
                                            • Approve allocation of review capacity to finalize the bulk indexing optimization currently in draft.

                                            Contributors: Dan Lemon (dan2k3k4), project update bot (Project-Update-Bot), Rajab Natshah (RajabNatshah)

                                            ---

                                            Gemini Provider

                                            The Gemini Provider module enables integration with Google's Gemini AI models within Drupal environments. Over the past 24 hours, activity focused on expanding the module's capabilities to support more efficient content processing.

                                            Work continued on Add support for batch embeddings, which would allow the system to process multiple pieces of content simultaneously rather than one at a time. This capability is important for improving performance when analyzing or categorizing large volumes of content. The work is in review, with progress being made on naming conventions and testing infrastructure to ensure compatibility with related systems.

                                            No code was merged or committed during this period, indicating the project is in a refinement phase. This is typical activity for a module in development, with focus on ensuring quality before integration.

                                            How can I help on this project?

                                            • Allocate reviewer capacity to evaluate the batch embeddings work currently awaiting review, which could accelerate delivery of performance improvements.
                                            • Clarify priority and timeline expectations for the batch processing feature to help the team sequence remaining development work.
                                            ---

                                            AI Agents

                                            Development continued on key features needed to make agents safer and more controllable in production settings. Work progressed on several mechanisms to govern how tools are invoked: limiting how many times a tool can run during a session, restricting tools from being called more than once in a single response, and controlling the order in which tools execute. These capabilities are important for preventing agents from looping indefinitely or acting in ways that don't align with business logic.

                                            One feature was merged that allows agents to store and read instructions from a file, making it easier to share context between parent and child agents without consuming excessive tokens or losing detail. A minor type-hinting issue that prevented administrators from swapping the agent status storage implementation was also resolved.

                                            Several quality-of-life improvements are in review, including a fix for streaming responses in chatbots and a solution to a UI bug where the "Interactive" option disappeared after adding a tool. A test suite for externally-driven agent execution (used by Canvas) has been added to prevent accidental breaking changes to that mode.

                                            Planning is underway for the 1.4.0 release, with several feature proposals opened for review, including per-tool approval workflows and the ability to forward images from tool output to vision models in the next loop iteration.

                                            How can I help on this project?

                                            • Confirm priorities for the 1.4.0 release roadmap to focus contributor effort on features that unlock the most business value.
                                            • Provide a test environment or budget for QA support to validate streaming, tool approval, and external orchestration workflows before stable release.

                                            Contributors: Ahmad Khalil (ahmad-khalil-imagex), AKHIL BABU (AkhilBabu), Bharat Kelotra (bharatkelotra), Marcus Johansson (Marcus_Johansson), Nicolae Procopan (thebumikgmail.com), Prabhavathi Vanipenta (prabha1997)

                                            ---

                                            Drupal Canvas

                                            The past 24 hours saw concentrated progress on the headless capabilities of Canvas, which allow organizations to use Canvas as a content and layout engine while rendering pages through separate frontend frameworks like Next.js, Astro, or Nuxt.

                                            Three related improvements to the headless experience were completed and merged. First, a new rendering system was added to the headless SDK, enabling applications to automatically traverse and display Canvas component trees without custom integration code. Second, a configuration interface was introduced in Canvas to manage multiple frontend URLs and provide setup guidance to developers. Third, environment variable requirements for headless applications were simplified and standardized, reducing manual configuration steps and preventing drift between settings.

                                            However, one of these changes temporarily broke the synchronization mechanism that allows Canvas to communicate with locally running frontend development servers. This was quickly identified and corrected with a restoration of browser-based component sync, ensuring all four supported frameworks can properly connect to the Canvas editor.

                                            Work continues on several functional areas. Two significant bugs affecting component properties are under investigation: boolean toggles that unexpectedly activate when other properties change, and radio button selections that reset during edits. A fix is in progress for a visual issue where sections using viewport-relative heights cause the preview iframe to grow incorrectly. Additionally, work is advancing on supporting content references that can point to multiple content types with different field structures.

                                            How can I help on this project?

                                            • Review and approve the headless configuration interface to ensure it meets the needs of teams planning to adopt headless architectures.
                                            • Prioritize investigation of the component property bugs affecting boolean and radio inputs, as these impact daily editorial workflows.

                                            Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Ben Mullins (bnjmnm), Bálint Kléri (balintbrews) [3], Christian López Espínola (penyaskito), Feliksas Mazeikis (f.mazeikis), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Narendra Singh Rathore (NarendraR), Nodar Davituri (Davituri), Ravi Maniyar (ravi.maniyar.123), Ted Bowman (tedbow), utkarsh_33 (Utkarsh_33), Wim Leers (wimleers), wotnak [1]

                                            ---

                                            Context Control Center (CCC)

                                            Development activity this period centered on hardening the module's security and test resilience ahead of a stable release. Work is underway to address an access control issue where usage record pages could potentially expose content from unpublished context items to users without proper view permissions. A draft solution has been prepared covering both the content leak and link generation concerns.

                                            A significant piece of technical debt is being resolved through updates to the test suite. Multiple tests were found to use hardcoded URL paths that break when upstream modules reorganize their routing structure, even though the module itself continues to work correctly. This caused false failures in automated testing. A fix covering the remaining brittle path assertions has been drafted and is under review.

                                            Planning discussions continued around the scope subscription model, which has proven confusing for early users. This represents a core user experience challenge as the module approaches a stable release. Separately, a feature is being designed to let AI agents opt out of automatic context injection in favor of tool-based retrieval, and work on subcontext scope inheritance remains in progress.

                                            The release notes contribution tracking task was completed, improving recognition of non-code contributions to the project.

                                            How can I help on this project?

                                            • Prioritize user experience review resources for the scope subscription redesign, which is blocking the stable release and affects core usability.
                                            • Consider allocating dedicated security review capacity to validate and merge the access control hardening work currently in draft.

                                            Contributors: Ahmad Khalil (ahmad-khalil-imagex), Kristen Pol (kepol), Pravesh Poonia (Pravesh_Poonia)

                                            ---

                                            AI Search

                                            The AI Search module made focused progress on performance and data architecture during this period. A substantial batch embeddings enhancement was merged to improve indexing performance, allowing content to be processed more efficiently at scale. This directly addresses one of the key bottlenecks when deploying AI-powered search across large content repositories.

                                            Work continued on a new Markdown-based embedding strategy that intelligently splits content at headings, with two competing implementation approaches now under review. Additionally, development began on exposing structured search result data and enforcing entity-level permissions—a critical requirement for ensuring users only see content they're authorised to access when AI generates answers from indexed material. This security and transparency work has an active merge request in progress.

                                            The module remains in active development with normal iteration across features and architecture improvements.

                                            How can I help on this project?

                                            • Provide guidance on which Markdown splitting approach better serves your content strategy, as two competing implementations are awaiting decision.
                                            • Clarify access control requirements to ensure the security work aligns with organisational policy on content visibility.

                                            Contributors: Abhisek Mazumdar (abhisekmazumdar), Artem Dmitriiev (a.dmitriiev)

                                            ---

                                            Field Widget Actions

                                            Field Widget Actions enables users to trigger automated workflows directly from content editing forms. During this period, work focused on improving how the module can be configured through automated setup tools and supporting more complex AI-driven workflows.

                                            A new merge request was opened to address a configuration limitation: when setting up multiple suggestion buttons on a single form using automated deployment tools, all buttons were inadvertently targeting the same field due to identifier conflicts. The Generate UUIDs for list-style widget-action settings applied via config actions work will allow each button to receive a unique identifier automatically, matching the behaviour users already experience when configuring buttons manually through the interface.

                                            Separately, Support Automator Chain trigger with Field Widget Actions was closed. This expands the module's workflow capabilities to support multi-step AI processes, useful when tasks exceed single-prompt complexity or token limits and require sequential operations without reloading the page.

                                            How can I help on this project?

                                            Review and approve the open merge request addressing configuration automation. Consider whether additional testing resources are needed to validate multi-button deployments across environments before the work is finalized.

                                            Contributors: Artem Dmitriiev (a.dmitriiev)

                                            ---

                                            AI translate

                                            The AI translate project saw focused work on resolving an issue affecting users who combine AI-powered translation with complex page layouts. A bug was identified and addressed where translated content blocks were not being fully configured in the system, leaving them in an incomplete state that prevented users from accessing certain features like media libraries within those blocks.

                                            A fix for this inline block issue has been prepared and is under review. Once merged, this will ensure that AI-translated page layouts function correctly and users can work with all content features as expected. This work removes a blocker for organizations using AI translation alongside advanced page building capabilities.

                                            How can I help on this project?

                                            • Ensure the pending fix receives timely review and testing resources to accelerate its release to users.
                                            • Consider funding additional quality assurance work to identify similar integration issues before they affect production users.

                                            Contributors: arne michiels (aren33k)

                                            ======================================================================== ## [25] factcheck:capabilities:executive ======================================================================== Layer-1 corrections: 0 Judge flags: 4